ARM: Add interface for registering and calling firmware-specific operations

Some boards are running with secure firmware running in TrustZone secure
world, which changes the way some things have to be initialized.

This patch adds an interface for platforms to specify available firmware
operations and call them.

A wrapper macro, call_firmware_op(), checks if the operation is provided
and calls it if so, otherwise returns -ENOSYS to allow fallback to
legacy operation..

By default no operations are provided.

Example of use:

In code using firmware ops:

	__raw_writel(virt_to_phys(exynos4_secondary_startup),
					CPU1_BOOT_REG);

	/* Call Exynos specific smc call */
	if (call_firmware_op(cpu_boot, cpu) == -ENOSYS)
			cpu_boot_legacy(...); /* Try legacy way */

				gic_raise_softirq(cpumask_of(cpu), 1);

				In board-/platform-specific code:

					static int platformX_do_idle(void)
		{
					/* tell platformX firmware to enter idle */
				        return 0;
							}

	static int platformX_cpu_boot(int i)
		{
					/* tell platformX firmware to boot CPU i */
					return 0;
						}

	static const struct firmware_ops platformX_firmware_ops = {
				.do_idle	= exynos_do_idle,
						.cpu_boot	= exynos_cpu_boot,
								/* other operations not available on platformX */
							};

	static void __init board_init_early(void)
		{
				        register_firmware_ops(&platformX_firmware_ops);
							}

Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
Signed-off-by: Tomasz Figa <t.figa at samsung.com>
Signed-off-by: Hakjoo Kim <ruppi.kim@hardkernel.com>
ARM: EXYNOS: Add support for secure monitor calls

Some boards use secure monitor calls to communicate with secure
firmware.

This patch adds exynos_smc function which uses smc assembly instruction
to do secure monitor calls.

Signed-off-by: Mauro Ribeiro <git@mdrjr.net>
ARM: EXYNOS: Add support for Exynos secure firmware

Some Exynos-based boards contain secure firmware and must use firmware
operations to set up some hardware.

This patch adds firmware operations for Exynos secure firmware and a way
for board code and device tree to specify that they must be used.

Example of use:

In board code:

	...MACHINE_START(...)
			/* ... */
			.init_early	= exynos_firmware_init,
			/* ... */
	MACHINE_END

In device tree:

	/ {
			/* ... */

			firmware at 0203F000 {
				compatible = "samsung,secure-firmware";
				reg = <0x0203F000 0x1000>;
			};

			/* ... */
	};

Signed-off-by: Mauro Ribeiro <git@mdrjr.net>
ARM: EXYNOS: Add IO mapping for non-secure SYSRAM

On TrustZone-enabled boards the non-secure SYSRAM is used for secondary
CPU bring-up, so add a mapping for it.

Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
Signed-off-by: Tomasz Figa <t.figa at samsung.com>
Signed-off-by: Mauro Ribeiro <git@mdrjr.net>
ARM: EXYNOS: Add secure firmware support to secondary CPU bring-up

Boards using secure firmware must use different CPU boot registers and
call secure firmware to boot the CPU.

Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
Signed-off-by: Tomasz Figa <t.figa at samsung.com>