* [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support
@ 2012-11-22 15:51 Tomasz Figa
2012-11-22 15:51 ` [PATCH v4 1/5] ARM: Add interface for registering and calling firmware-specific operations Tomasz Figa
` (5 more replies)
0 siblings, 6 replies; 12+ messages in thread
From: Tomasz Figa @ 2012-11-22 15:51 UTC (permalink / raw)
To: linux-arm-kernel
Some Exynos-based boards are running with secure firmware running in
TrustZone secure world, which changes the way some things have to be
initialized.
This series adds support for specifying firmware operations, implements
some firmware operations for Exynos secure firmware and adds a method of
enabling secure firmware operations on Exynos-based boards through board
file and device tree.
Depends on:
- ARM: EXYNOS: Add support for secondary CPU bring-up on Exynos4412
Changes since v3
( http://thread.gmane.org/gmane.linux.kernel.samsung-soc/13442 )
- Replaced cpu_boot_reg call with cpu_set_boot_addr
- Added interface documentation
- Separated from Exynos4x12 secondary CPU bring-up patch
Changes since v2
( http://thread.gmane.org/gmane.linux.kernel.samsung-soc/12848 )
- Made Exynos firmware binding require address
- Minor style fixes
Changes since v1
( http://thread.gmane.org/gmane.linux.kernel.samsung-soc/12583/focus=12820 )
- Changed return types of all operations to int
- Defined all operations to return 0 on success, -ENOSYS when not
implemented or appropriate error code on error
Tomasz Figa (5):
ARM: Add interface for registering and calling firmware-specific
operations
ARM: EXYNOS: Add support for secure monitor calls
ARM: EXYNOS: Add support for Exynos secure firmware
ARM: EXYNOS: Add IO mapping for non-secure SYSRAM.
ARM: EXYNOS: Add secure firmware support to secondary CPU bring-up
Documentation/arm/firmware.txt | 88 ++++++++++++++++++++++
.../devicetree/bindings/arm/samsung-boards.txt | 10 +++
arch/arm/common/Makefile | 2 +
arch/arm/common/firmware.c | 18 +++++
arch/arm/include/asm/firmware.h | 66 ++++++++++++++++
arch/arm/mach-exynos/Makefile | 6 ++
arch/arm/mach-exynos/common.c | 35 +++++++++
arch/arm/mach-exynos/common.h | 2 +
arch/arm/mach-exynos/exynos-smc.S | 22 ++++++
arch/arm/mach-exynos/firmware.c | 70 +++++++++++++++++
arch/arm/mach-exynos/include/mach/map.h | 3 +
arch/arm/mach-exynos/mach-exynos4-dt.c | 1 +
arch/arm/mach-exynos/platsmp.c | 32 ++++++--
arch/arm/mach-exynos/smc.h | 31 ++++++++
arch/arm/plat-samsung/include/plat/map-s5p.h | 1 +
15 files changed, 382 insertions(+), 5 deletions(-)
create mode 100644 Documentation/arm/firmware.txt
create mode 100644 arch/arm/common/firmware.c
create mode 100644 arch/arm/include/asm/firmware.h
create mode 100644 arch/arm/mach-exynos/exynos-smc.S
create mode 100644 arch/arm/mach-exynos/firmware.c
create mode 100644 arch/arm/mach-exynos/smc.h
--
1.8.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 1/5] ARM: Add interface for registering and calling firmware-specific operations
2012-11-22 15:51 [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Tomasz Figa
@ 2012-11-22 15:51 ` Tomasz Figa
2012-12-26 8:00 ` Barry Song
2012-11-22 15:51 ` [PATCH v4 2/5] ARM: EXYNOS: Add support for secure monitor calls Tomasz Figa
` (4 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Tomasz Figa @ 2012-11-22 15:51 UTC (permalink / raw)
To: linux-arm-kernel
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@samsung.com>
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
---
Documentation/arm/firmware.txt | 88 +++++++++++++++++++++++++++++++++++++++++
arch/arm/common/Makefile | 2 +
arch/arm/common/firmware.c | 18 +++++++++
arch/arm/include/asm/firmware.h | 66 +++++++++++++++++++++++++++++++
4 files changed, 174 insertions(+)
create mode 100644 Documentation/arm/firmware.txt
create mode 100644 arch/arm/common/firmware.c
create mode 100644 arch/arm/include/asm/firmware.h
diff --git a/Documentation/arm/firmware.txt b/Documentation/arm/firmware.txt
new file mode 100644
index 0000000..c2e468f
--- /dev/null
+++ b/Documentation/arm/firmware.txt
@@ -0,0 +1,88 @@
+Interface for registering and calling firmware-specific operations for ARM.
+----
+Written by Tomasz Figa <t.figa@samsung.com>
+
+Some boards are running with secure firmware running in TrustZone secure
+world, which changes the way some things have to be initialized. This makes
+a need to provide an interface for such platforms to specify available firmware
+operations and call them when needed.
+
+Firmware operations can be specified using struct firmware_ops
+
+ struct firmware_ops {
+ /*
+ * Enters CPU idle mode
+ */
+ int (*do_idle)(void);
+ /*
+ * Sets boot address of specified physical CPU
+ */
+ int (*set_cpu_boot_addr)(int cpu, unsigned long boot_addr);
+ /*
+ * Boots specified physical CPU
+ */
+ int (*cpu_boot)(int cpu);
+ /*
+ * Initializes L2 cache
+ */
+ int (*l2x0_init)(void);
+ };
+
+and then registered with register_firmware_ops function
+
+ void register_firmware_ops(const struct firmware_ops *ops)
+
+the ops pointer must be non-NULL.
+
+There is a default, empty set of operations provided, so there is no need to
+set anything if platform does not require firmware operations.
+
+To call a firmware operation, a helper macro is provided
+
+ #define call_firmware_op(op, ...) \
+ ((firmware_ops->op) ? firmware_ops->op(__VA_ARGS__) : (-ENOSYS))
+
+the macro checks if the operation is provided and calls it or otherwise returns
+-ENOSYS to signal that given operation is not available (for example, to allow
+fallback to legacy operation).
+
+Example of registering firmware operations:
+
+ /* board file */
+
+ 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 */
+ };
+
+ /* init_early callback of machine descriptor */
+ static void __init board_init_early(void)
+ {
+ register_firmware_ops(&platformX_firmware_ops);
+ }
+
+Example of using a firmware operation:
+
+ /* some platform code, e.g. SMP initialization */
+
+ __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);
diff --git a/arch/arm/common/Makefile b/arch/arm/common/Makefile
index e8a4e58..55d4182 100644
--- a/arch/arm/common/Makefile
+++ b/arch/arm/common/Makefile
@@ -2,6 +2,8 @@
# Makefile for the linux kernel.
#
+obj-y += firmware.o
+
obj-$(CONFIG_ARM_GIC) += gic.o
obj-$(CONFIG_ARM_VIC) += vic.o
obj-$(CONFIG_ICST) += icst.o
diff --git a/arch/arm/common/firmware.c b/arch/arm/common/firmware.c
new file mode 100644
index 0000000..27ddccb
--- /dev/null
+++ b/arch/arm/common/firmware.c
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics.
+ * Kyungmin Park <kyungmin.park@samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/suspend.h>
+
+#include <asm/firmware.h>
+
+static const struct firmware_ops default_firmware_ops;
+
+const struct firmware_ops *firmware_ops = &default_firmware_ops;
diff --git a/arch/arm/include/asm/firmware.h b/arch/arm/include/asm/firmware.h
new file mode 100644
index 0000000..1563130
--- /dev/null
+++ b/arch/arm/include/asm/firmware.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics.
+ * Kyungmin Park <kyungmin.park@samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARM_FIRMWARE_H
+#define __ASM_ARM_FIRMWARE_H
+
+#include <linux/bug.h>
+
+/*
+ * struct firmware_ops
+ *
+ * A structure to specify available firmware operations.
+ *
+ * A filled up structure can be registered with register_firmware_ops().
+ */
+struct firmware_ops {
+ /*
+ * Enters CPU idle mode
+ */
+ int (*do_idle)(void);
+ /*
+ * Sets boot address of specified physical CPU
+ */
+ int (*set_cpu_boot_addr)(int cpu, unsigned long boot_addr);
+ /*
+ * Boots specified physical CPU
+ */
+ int (*cpu_boot)(int cpu);
+ /*
+ * Initializes L2 cache
+ */
+ int (*l2x0_init)(void);
+};
+
+/* Global pointer for current firmware_ops structure, can't be NULL. */
+extern const struct firmware_ops *firmware_ops;
+
+/*
+ * call_firmware_op(op, ...)
+ *
+ * Checks if firmware operation is present and calls it,
+ * otherwise returns -ENOSYS
+ */
+#define call_firmware_op(op, ...) \
+ ((firmware_ops->op) ? firmware_ops->op(__VA_ARGS__) : (-ENOSYS))
+
+/*
+ * register_firmware_ops(ops)
+ *
+ * A function to register platform firmware_ops struct.
+ */
+static inline void register_firmware_ops(const struct firmware_ops *ops)
+{
+ BUG_ON(!ops);
+
+ firmware_ops = ops;
+}
+
+#endif
--
1.8.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 2/5] ARM: EXYNOS: Add support for secure monitor calls
2012-11-22 15:51 [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Tomasz Figa
2012-11-22 15:51 ` [PATCH v4 1/5] ARM: Add interface for registering and calling firmware-specific operations Tomasz Figa
@ 2012-11-22 15:51 ` Tomasz Figa
2012-11-22 15:51 ` [PATCH v4 3/5] ARM: EXYNOS: Add support for Exynos secure firmware Tomasz Figa
` (3 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: Tomasz Figa @ 2012-11-22 15:51 UTC (permalink / raw)
To: linux-arm-kernel
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: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
---
arch/arm/mach-exynos/Makefile | 5 +++++
arch/arm/mach-exynos/exynos-smc.S | 22 ++++++++++++++++++++++
arch/arm/mach-exynos/smc.h | 31 +++++++++++++++++++++++++++++++
3 files changed, 58 insertions(+)
create mode 100644 arch/arm/mach-exynos/exynos-smc.S
create mode 100644 arch/arm/mach-exynos/smc.h
diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile
index c12ed6a..a031012 100644
--- a/arch/arm/mach-exynos/Makefile
+++ b/arch/arm/mach-exynos/Makefile
@@ -30,6 +30,11 @@ obj-$(CONFIG_EXYNOS4_MCT) += mct.o
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
+obj-$(CONFIG_ARCH_EXYNOS) += exynos-smc.o
+
+plus_sec := $(call as-instr,.arch_extension sec,+sec)
+AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec)
+
# machine support
obj-$(CONFIG_MACH_SMDKC210) += mach-smdkv310.o
diff --git a/arch/arm/mach-exynos/exynos-smc.S b/arch/arm/mach-exynos/exynos-smc.S
new file mode 100644
index 0000000..2e27aa3
--- /dev/null
+++ b/arch/arm/mach-exynos/exynos-smc.S
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics.
+ *
+ * Copied from omap-smc.S Copyright (C) 2010 Texas Instruments, Inc.
+ *
+ * This program is free software,you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/linkage.h>
+
+/*
+ * Function signature: void exynos_smc(u32 cmd, u32 arg1, u32 arg2, u32 arg3)
+ */
+
+ENTRY(exynos_smc)
+ stmfd sp!, {r4-r11, lr}
+ dsb
+ smc #0
+ ldmfd sp!, {r4-r11, pc}
+ENDPROC(exynos_smc)
diff --git a/arch/arm/mach-exynos/smc.h b/arch/arm/mach-exynos/smc.h
new file mode 100644
index 0000000..e972390
--- /dev/null
+++ b/arch/arm/mach-exynos/smc.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2012 Samsung Electronics.
+ *
+ * EXYNOS - SMC Call
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_EXYNOS_SMC_H
+#define __ASM_ARCH_EXYNOS_SMC_H
+
+#define SMC_CMD_INIT (-1)
+#define SMC_CMD_INFO (-2)
+/* For Power Management */
+#define SMC_CMD_SLEEP (-3)
+#define SMC_CMD_CPU1BOOT (-4)
+#define SMC_CMD_CPU0AFTR (-5)
+/* For CP15 Access */
+#define SMC_CMD_C15RESUME (-11)
+/* For L2 Cache Access */
+#define SMC_CMD_L2X0CTRL (-21)
+#define SMC_CMD_L2X0SETUP1 (-22)
+#define SMC_CMD_L2X0SETUP2 (-23)
+#define SMC_CMD_L2X0INVALL (-24)
+#define SMC_CMD_L2X0DEBUG (-25)
+
+extern void exynos_smc(u32 cmd, u32 arg1, u32 arg2, u32 arg3);
+
+#endif
--
1.8.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 3/5] ARM: EXYNOS: Add support for Exynos secure firmware
2012-11-22 15:51 [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Tomasz Figa
2012-11-22 15:51 ` [PATCH v4 1/5] ARM: Add interface for registering and calling firmware-specific operations Tomasz Figa
2012-11-22 15:51 ` [PATCH v4 2/5] ARM: EXYNOS: Add support for secure monitor calls Tomasz Figa
@ 2012-11-22 15:51 ` Tomasz Figa
2012-12-26 8:17 ` Barry Song
2012-11-22 15:51 ` [PATCH v4 4/5] ARM: EXYNOS: Add IO mapping for non-secure SYSRAM Tomasz Figa
` (2 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Tomasz Figa @ 2012-11-22 15:51 UTC (permalink / raw)
To: linux-arm-kernel
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: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
---
.../devicetree/bindings/arm/samsung-boards.txt | 10 ++++
arch/arm/mach-exynos/Makefile | 1 +
arch/arm/mach-exynos/common.h | 2 +
arch/arm/mach-exynos/firmware.c | 70 ++++++++++++++++++++++
arch/arm/mach-exynos/mach-exynos4-dt.c | 1 +
5 files changed, 84 insertions(+)
create mode 100644 arch/arm/mach-exynos/firmware.c
diff --git a/Documentation/devicetree/bindings/arm/samsung-boards.txt b/Documentation/devicetree/bindings/arm/samsung-boards.txt
index 0bf68be..2168ed3 100644
--- a/Documentation/devicetree/bindings/arm/samsung-boards.txt
+++ b/Documentation/devicetree/bindings/arm/samsung-boards.txt
@@ -6,3 +6,13 @@ Required root node properties:
- compatible = should be one or more of the following.
(a) "samsung,smdkv310" - for Samsung's SMDKV310 eval board.
(b) "samsung,exynos4210" - for boards based on Exynos4210 SoC.
+
+Optional:
+ - firmware node, specifying presence and type of secure firmware:
+ - compatible: only "samsung,secure-firmware" is currently supported
+ - reg: address of non-secure SYSRAM used for communication with firmware
+
+ firmware at 0203F000 {
+ compatible = "samsung,secure-firmware";
+ reg = <0x0203F000 0x1000>;
+ };
diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile
index a031012..685e4a7 100644
--- a/arch/arm/mach-exynos/Makefile
+++ b/arch/arm/mach-exynos/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_EXYNOS4_MCT) += mct.o
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
obj-$(CONFIG_ARCH_EXYNOS) += exynos-smc.o
+obj-$(CONFIG_ARCH_EXYNOS) += firmware.o
plus_sec := $(call as-instr,.arch_extension sec,+sec)
AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec)
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h
index dac146d..5f1d393 100644
--- a/arch/arm/mach-exynos/common.h
+++ b/arch/arm/mach-exynos/common.h
@@ -22,6 +22,8 @@ void exynos4_restart(char mode, const char *cmd);
void exynos5_restart(char mode, const char *cmd);
void exynos_init_late(void);
+void exynos_firmware_init(void);
+
#ifdef CONFIG_PM_GENERIC_DOMAINS
int exynos_pm_late_initcall(void);
#else
diff --git a/arch/arm/mach-exynos/firmware.c b/arch/arm/mach-exynos/firmware.c
new file mode 100644
index 0000000..88e3eed
--- /dev/null
+++ b/arch/arm/mach-exynos/firmware.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics.
+ * Kyungmin Park <kyungmin.park@samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * This program is free software,you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/init.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+
+#include <asm/firmware.h>
+
+#include <mach/map.h>
+
+#include "smc.h"
+
+static int exynos_do_idle(void)
+{
+ exynos_smc(SMC_CMD_SLEEP, 0, 0, 0);
+ return 0;
+}
+
+static int exynos_cpu_boot(int cpu)
+{
+ exynos_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0);
+ return 0;
+}
+
+static int exynos_set_cpu_boot_addr(int cpu, unsigned long boot_addr)
+{
+ void __iomem *boot_reg = S5P_VA_SYSRAM_NS + 0x1c + 4*cpu;
+
+ __raw_writel(boot_addr, boot_reg);
+ return 0;
+}
+
+static const struct firmware_ops exynos_firmware_ops = {
+ .do_idle = exynos_do_idle,
+ .set_cpu_boot_addr = exynos_set_cpu_boot_addr,
+ .cpu_boot = exynos_cpu_boot,
+};
+
+void __init exynos_firmware_init(void)
+{
+ if (of_have_populated_dt()) {
+ struct device_node *nd;
+ const __be32 *addr;
+
+ nd = of_find_compatible_node(NULL, NULL,
+ "samsung,secure-firmware");
+ if (!nd)
+ return;
+
+ addr = of_get_address(nd, 0, NULL, NULL);
+ if (!addr) {
+ pr_err("%s: No address specified.\n", __func__);
+ return;
+ }
+ }
+
+ pr_info("Running under secure firmware.\n");
+
+ register_firmware_ops(&exynos_firmware_ops);
+}
diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c
index 8858068..3f967e5 100644
--- a/arch/arm/mach-exynos/mach-exynos4-dt.c
+++ b/arch/arm/mach-exynos/mach-exynos4-dt.c
@@ -107,6 +107,7 @@ DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)")
.init_irq = exynos4_init_irq,
.map_io = exynos4_dt_map_io,
.handle_irq = gic_handle_irq,
+ .init_early = exynos_firmware_init,
.init_machine = exynos4_dt_machine_init,
.init_late = exynos_init_late,
.timer = &exynos4_timer,
--
1.8.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 4/5] ARM: EXYNOS: Add IO mapping for non-secure SYSRAM.
2012-11-22 15:51 [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Tomasz Figa
` (2 preceding siblings ...)
2012-11-22 15:51 ` [PATCH v4 3/5] ARM: EXYNOS: Add support for Exynos secure firmware Tomasz Figa
@ 2012-11-22 15:51 ` Tomasz Figa
2012-11-22 15:51 ` [PATCH v4 5/5] ARM: EXYNOS: Add secure firmware support to secondary CPU bring-up Tomasz Figa
2012-11-24 2:21 ` [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Kukjin Kim
5 siblings, 0 replies; 12+ messages in thread
From: Tomasz Figa @ 2012-11-22 15:51 UTC (permalink / raw)
To: linux-arm-kernel
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@samsung.com>
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
---
arch/arm/mach-exynos/common.c | 35 ++++++++++++++++++++++++++++
arch/arm/mach-exynos/include/mach/map.h | 3 +++
arch/arm/plat-samsung/include/plat/map-s5p.h | 1 +
3 files changed, 39 insertions(+)
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c
index 95c0882..e984546 100644
--- a/arch/arm/mach-exynos/common.c
+++ b/arch/arm/mach-exynos/common.c
@@ -231,6 +231,33 @@ static struct map_desc exynos4_iodesc1[] __initdata = {
},
};
+static struct map_desc exynos4210_iodesc[] __initdata = {
+ {
+ .virtual = (unsigned long)S5P_VA_SYSRAM_NS,
+ .pfn = __phys_to_pfn(EXYNOS4210_PA_SYSRAM_NS),
+ .length = SZ_4K,
+ .type = MT_DEVICE,
+ },
+};
+
+static struct map_desc exynos4x12_iodesc[] __initdata = {
+ {
+ .virtual = (unsigned long)S5P_VA_SYSRAM_NS,
+ .pfn = __phys_to_pfn(EXYNOS4x12_PA_SYSRAM_NS),
+ .length = SZ_4K,
+ .type = MT_DEVICE,
+ },
+};
+
+static struct map_desc exynos5250_iodesc[] __initdata = {
+ {
+ .virtual = (unsigned long)S5P_VA_SYSRAM_NS,
+ .pfn = __phys_to_pfn(EXYNOS5250_PA_SYSRAM_NS),
+ .length = SZ_4K,
+ .type = MT_DEVICE,
+ },
+};
+
static struct map_desc exynos5_iodesc[] __initdata = {
{
.virtual = (unsigned long)S3C_VA_SYS,
@@ -354,6 +381,11 @@ static void __init exynos4_map_io(void)
else
iotable_init(exynos4_iodesc1, ARRAY_SIZE(exynos4_iodesc1));
+ if (soc_is_exynos4210())
+ iotable_init(exynos4210_iodesc, ARRAY_SIZE(exynos4210_iodesc));
+ if (soc_is_exynos4212() || soc_is_exynos4412())
+ iotable_init(exynos4x12_iodesc, ARRAY_SIZE(exynos4x12_iodesc));
+
/* initialize device information early */
exynos4_default_sdhci0();
exynos4_default_sdhci1();
@@ -386,6 +418,9 @@ static void __init exynos4_map_io(void)
static void __init exynos5_map_io(void)
{
iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
+
+ if (soc_is_exynos5250())
+ iotable_init(exynos5250_iodesc, ARRAY_SIZE(exynos5250_iodesc));
}
static void __init exynos4_init_clocks(int xtal)
diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h
index 1df6abb..b8ea67e 100644
--- a/arch/arm/mach-exynos/include/mach/map.h
+++ b/arch/arm/mach-exynos/include/mach/map.h
@@ -26,6 +26,9 @@
#define EXYNOS4_PA_SYSRAM0 0x02025000
#define EXYNOS4_PA_SYSRAM1 0x02020000
#define EXYNOS5_PA_SYSRAM 0x02020000
+#define EXYNOS4210_PA_SYSRAM_NS 0x0203F000
+#define EXYNOS4x12_PA_SYSRAM_NS 0x0204F000
+#define EXYNOS5250_PA_SYSRAM_NS 0x0204F000
#define EXYNOS4_PA_FIMC0 0x11800000
#define EXYNOS4_PA_FIMC1 0x11810000
diff --git a/arch/arm/plat-samsung/include/plat/map-s5p.h b/arch/arm/plat-samsung/include/plat/map-s5p.h
index c2d7bda..c186786 100644
--- a/arch/arm/plat-samsung/include/plat/map-s5p.h
+++ b/arch/arm/plat-samsung/include/plat/map-s5p.h
@@ -22,6 +22,7 @@
#define S5P_VA_GPIO3 S3C_ADDR(0x02280000)
#define S5P_VA_SYSRAM S3C_ADDR(0x02400000)
+#define S5P_VA_SYSRAM_NS S3C_ADDR(0x02410000)
#define S5P_VA_DMC0 S3C_ADDR(0x02440000)
#define S5P_VA_DMC1 S3C_ADDR(0x02480000)
#define S5P_VA_SROMC S3C_ADDR(0x024C0000)
--
1.8.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 5/5] ARM: EXYNOS: Add secure firmware support to secondary CPU bring-up
2012-11-22 15:51 [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Tomasz Figa
` (3 preceding siblings ...)
2012-11-22 15:51 ` [PATCH v4 4/5] ARM: EXYNOS: Add IO mapping for non-secure SYSRAM Tomasz Figa
@ 2012-11-22 15:51 ` Tomasz Figa
2012-11-24 2:21 ` [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Kukjin Kim
5 siblings, 0 replies; 12+ messages in thread
From: Tomasz Figa @ 2012-11-22 15:51 UTC (permalink / raw)
To: linux-arm-kernel
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@samsung.com>
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
---
arch/arm/mach-exynos/platsmp.c | 32 +++++++++++++++++++++++++++-----
1 file changed, 27 insertions(+), 5 deletions(-)
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c
index 4ca8ff1..7dc2f88 100644
--- a/arch/arm/mach-exynos/platsmp.c
+++ b/arch/arm/mach-exynos/platsmp.c
@@ -25,6 +25,7 @@
#include <asm/hardware/gic.h>
#include <asm/smp_plat.h>
#include <asm/smp_scu.h>
+#include <asm/firmware.h>
#include <mach/hardware.h>
#include <mach/regs-clock.h>
@@ -145,10 +146,21 @@ static int __cpuinit exynos_boot_secondary(unsigned int cpu, struct task_struct
timeout = jiffies + (1 * HZ);
while (time_before(jiffies, timeout)) {
+ unsigned long boot_addr;
+
smp_rmb();
- __raw_writel(virt_to_phys(exynos4_secondary_startup),
- cpu_boot_reg(phys_cpu));
+ boot_addr = virt_to_phys(exynos4_secondary_startup);
+
+ /*
+ * Try to set boot address using firmware first
+ * and fall back to boot register if it fails.
+ */
+ if (call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr))
+ __raw_writel(boot_addr, cpu_boot_reg(phys_cpu));
+
+ call_firmware_op(cpu_boot, phys_cpu);
+
gic_raise_softirq(cpumask_of(cpu), 0);
if (pen_release == -1)
@@ -206,10 +218,20 @@ static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)
* system-wide flags register. The boot monitor waits
* until it receives a soft interrupt, and then the
* secondary CPU branches to this address.
+ *
+ * Try using firmware operation first and fall back to
+ * boot register if it fails.
*/
- for (i = 1; i < max_cpus; ++i)
- __raw_writel(virt_to_phys(exynos4_secondary_startup),
- cpu_boot_reg(cpu_logical_map(i)));
+ for (i = 1; i < max_cpus; ++i) {
+ unsigned long phys_cpu;
+ unsigned long boot_addr;
+
+ phys_cpu = cpu_logical_map(i);
+ boot_addr = virt_to_phys(exynos4_secondary_startup);
+
+ if (call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr))
+ __raw_writel(boot_addr, cpu_boot_reg(phys_cpu));
+ }
}
struct smp_operations exynos_smp_ops __initdata = {
--
1.8.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support
2012-11-22 15:51 [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Tomasz Figa
` (4 preceding siblings ...)
2012-11-22 15:51 ` [PATCH v4 5/5] ARM: EXYNOS: Add secure firmware support to secondary CPU bring-up Tomasz Figa
@ 2012-11-24 2:21 ` Kukjin Kim
2012-11-28 15:44 ` Tomasz Figa
5 siblings, 1 reply; 12+ messages in thread
From: Kukjin Kim @ 2012-11-24 2:21 UTC (permalink / raw)
To: linux-arm-kernel
Tomasz Figa wrote:
>
> Some Exynos-based boards are running with secure firmware running in
> TrustZone secure world, which changes the way some things have to be
> initialized.
>
> This series adds support for specifying firmware operations, implements
> some firmware operations for Exynos secure firmware and adds a method of
> enabling secure firmware operations on Exynos-based boards through board
> file and device tree.
>
> Depends on:
> - ARM: EXYNOS: Add support for secondary CPU bring-up on Exynos4412
>
> Changes since v3
> ( http://thread.gmane.org/gmane.linux.kernel.samsung-soc/13442 )
> - Replaced cpu_boot_reg call with cpu_set_boot_addr
> - Added interface documentation
> - Separated from Exynos4x12 secondary CPU bring-up patch
>
> Changes since v2
> ( http://thread.gmane.org/gmane.linux.kernel.samsung-soc/12848 )
> - Made Exynos firmware binding require address
> - Minor style fixes
>
> Changes since v1
> ( http://thread.gmane.org/gmane.linux.kernel.samsung-
> soc/12583/focus=12820 )
> - Changed return types of all operations to int
> - Defined all operations to return 0 on success, -ENOSYS when not
> implemented or appropriate error code on error
>
> Tomasz Figa (5):
> ARM: Add interface for registering and calling firmware-specific
> operations
> ARM: EXYNOS: Add support for secure monitor calls
> ARM: EXYNOS: Add support for Exynos secure firmware
> ARM: EXYNOS: Add IO mapping for non-secure SYSRAM.
> ARM: EXYNOS: Add secure firmware support to secondary CPU bring-up
>
> Documentation/arm/firmware.txt | 88 ++++++++++++++++++++++
> .../devicetree/bindings/arm/samsung-boards.txt | 10 +++
> arch/arm/common/Makefile | 2 +
> arch/arm/common/firmware.c | 18 +++++
> arch/arm/include/asm/firmware.h | 66 ++++++++++++++++
> arch/arm/mach-exynos/Makefile | 6 ++
> arch/arm/mach-exynos/common.c | 35 +++++++++
> arch/arm/mach-exynos/common.h | 2 +
> arch/arm/mach-exynos/exynos-smc.S | 22 ++++++
> arch/arm/mach-exynos/firmware.c | 70 +++++++++++++++++
> arch/arm/mach-exynos/include/mach/map.h | 3 +
> arch/arm/mach-exynos/mach-exynos4-dt.c | 1 +
> arch/arm/mach-exynos/platsmp.c | 32 ++++++--
> arch/arm/mach-exynos/smc.h | 31 ++++++++
> arch/arm/plat-samsung/include/plat/map-s5p.h | 1 +
> 15 files changed, 382 insertions(+), 5 deletions(-)
> create mode 100644 Documentation/arm/firmware.txt
> create mode 100644 arch/arm/common/firmware.c
> create mode 100644 arch/arm/include/asm/firmware.h
> create mode 100644 arch/arm/mach-exynos/exynos-smc.S
> create mode 100644 arch/arm/mach-exynos/firmware.c
> create mode 100644 arch/arm/mach-exynos/smc.h
>
> --
> 1.8.0
Russell, I think, Tomasz addressed comments from you.
If you're ok on this, please ack so that I can pick this up in my tree for v3.8...
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <kgene.kim@samsung.com>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support
2012-11-24 2:21 ` [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Kukjin Kim
@ 2012-11-28 15:44 ` Tomasz Figa
2012-11-30 10:58 ` Kukjin Kim
0 siblings, 1 reply; 12+ messages in thread
From: Tomasz Figa @ 2012-11-28 15:44 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Saturday 24 of November 2012 11:21:03 Kukjin Kim wrote:
> Tomasz Figa wrote:
> > Some Exynos-based boards are running with secure firmware running in
> > TrustZone secure world, which changes the way some things have to be
> > initialized.
> >
> > This series adds support for specifying firmware operations,
> > implements
> > some firmware operations for Exynos secure firmware and adds a method
> > of enabling secure firmware operations on Exynos-based boards through
> > board file and device tree.
> >
> > Depends on:
> > - ARM: EXYNOS: Add support for secondary CPU bring-up on Exynos4412
> >
> > Changes since v3
> > ( http://thread.gmane.org/gmane.linux.kernel.samsung-soc/13442 )
> >
> > - Replaced cpu_boot_reg call with cpu_set_boot_addr
> > - Added interface documentation
> > - Separated from Exynos4x12 secondary CPU bring-up patch
> >
> > Changes since v2
> > ( http://thread.gmane.org/gmane.linux.kernel.samsung-soc/12848 )
> >
> > - Made Exynos firmware binding require address
> > - Minor style fixes
> >
> > Changes since v1
> > ( http://thread.gmane.org/gmane.linux.kernel.samsung-
> > soc/12583/focus=12820 )
> >
> > - Changed return types of all operations to int
> > - Defined all operations to return 0 on success, -ENOSYS when not
> >
> > implemented or appropriate error code on error
> >
> > Tomasz Figa (5):
> > ARM: Add interface for registering and calling firmware-specific
> >
> > operations
> >
> > ARM: EXYNOS: Add support for secure monitor calls
> > ARM: EXYNOS: Add support for Exynos secure firmware
> > ARM: EXYNOS: Add IO mapping for non-secure SYSRAM.
> > ARM: EXYNOS: Add secure firmware support to secondary CPU bring-up
> >
> > Documentation/arm/firmware.txt | 88
> > ++++++++++++++++++++++
> > .../devicetree/bindings/arm/samsung-boards.txt | 10 +++
> > arch/arm/common/Makefile | 2 +
> > arch/arm/common/firmware.c | 18 +++++
> > arch/arm/include/asm/firmware.h | 66
> > ++++++++++++++++ arch/arm/mach-exynos/Makefile
> > | 6 ++
> > arch/arm/mach-exynos/common.c | 35 +++++++++
> > arch/arm/mach-exynos/common.h | 2 +
> > arch/arm/mach-exynos/exynos-smc.S | 22 ++++++
> > arch/arm/mach-exynos/firmware.c | 70
> > +++++++++++++++++ arch/arm/mach-exynos/include/mach/map.h
> > | 3 +
> > arch/arm/mach-exynos/mach-exynos4-dt.c | 1 +
> > arch/arm/mach-exynos/platsmp.c | 32 ++++++--
> > arch/arm/mach-exynos/smc.h | 31 ++++++++
> > arch/arm/plat-samsung/include/plat/map-s5p.h | 1 +
> > 15 files changed, 382 insertions(+), 5 deletions(-)
> > create mode 100644 Documentation/arm/firmware.txt
> > create mode 100644 arch/arm/common/firmware.c
> > create mode 100644 arch/arm/include/asm/firmware.h
> > create mode 100644 arch/arm/mach-exynos/exynos-smc.S
> > create mode 100644 arch/arm/mach-exynos/firmware.c
> > create mode 100644 arch/arm/mach-exynos/smc.h
> >
> > --
> > 1.8.0
>
> Russell, I think, Tomasz addressed comments from you.
>
> If you're ok on this, please ack so that I can pick this up in my tree
> for v3.8...
Arnd, Olof, what do you think?
Best regards,
--
Tomasz Figa
Samsung Poland R&D Center
SW Solution Development, Linux Platform
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support
2012-11-28 15:44 ` Tomasz Figa
@ 2012-11-30 10:58 ` Kukjin Kim
0 siblings, 0 replies; 12+ messages in thread
From: Kukjin Kim @ 2012-11-30 10:58 UTC (permalink / raw)
To: linux-arm-kernel
Tomasz Figa wrote:
>
> Hi,
[...]
> > Russell, I think, Tomasz addressed comments from you.
> >
> > If you're ok on this, please ack so that I can pick this up in my tree
> > for v3.8...
I'm holding on this series...any opinions on this?
If there is no objection on this, let me try to send this out...
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <kgene.kim@samsung.com>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 1/5] ARM: Add interface for registering and calling firmware-specific operations
2012-11-22 15:51 ` [PATCH v4 1/5] ARM: Add interface for registering and calling firmware-specific operations Tomasz Figa
@ 2012-12-26 8:00 ` Barry Song
0 siblings, 0 replies; 12+ messages in thread
From: Barry Song @ 2012-12-26 8:00 UTC (permalink / raw)
To: linux-arm-kernel
2012/11/22, Tomasz Figa <t.figa@samsung.com>:
> 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 */
> };
i am thinking the firmware_ops should be namespaced, some hardware has
firmware, firmware_ops should not be using a global namespace here.
>
> static void __init board_init_early(void)
> {
> register_firmware_ops(&platformX_firmware_ops);
> }
>
-barry
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 3/5] ARM: EXYNOS: Add support for Exynos secure firmware
2012-11-22 15:51 ` [PATCH v4 3/5] ARM: EXYNOS: Add support for Exynos secure firmware Tomasz Figa
@ 2012-12-26 8:17 ` Barry Song
2012-12-26 8:53 ` Arnd Bergmann
0 siblings, 1 reply; 12+ messages in thread
From: Barry Song @ 2012-12-26 8:17 UTC (permalink / raw)
To: linux-arm-kernel
2012/11/22, Tomasz Figa <t.figa@samsung.com>:
> 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>;
> };
>
> /* ... */
> };
well. amazing, dts is used to describle hardware details, here the
firmware is just a software and reg is the memory the firmware will
use. is this something againest the dt rule?
but it is really simple.
>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> Signed-off-by: Tomasz Figa <t.figa@samsung.com>
> ---
> .../devicetree/bindings/arm/samsung-boards.txt | 10 ++++
> arch/arm/mach-exynos/Makefile | 1 +
> arch/arm/mach-exynos/common.h | 2 +
> arch/arm/mach-exynos/firmware.c | 70
> ++++++++++++++++++++++
> arch/arm/mach-exynos/mach-exynos4-dt.c | 1 +
> 5 files changed, 84 insertions(+)
> create mode 100644 arch/arm/mach-exynos/firmware.c
>
> diff --git a/Documentation/devicetree/bindings/arm/samsung-boards.txt
> b/Documentation/devicetree/bindings/arm/samsung-boards.txt
> index 0bf68be..2168ed3 100644
> --- a/Documentation/devicetree/bindings/arm/samsung-boards.txt
> +++ b/Documentation/devicetree/bindings/arm/samsung-boards.txt
> @@ -6,3 +6,13 @@ Required root node properties:
> - compatible = should be one or more of the following.
> (a) "samsung,smdkv310" - for Samsung's SMDKV310 eval board.
> (b) "samsung,exynos4210" - for boards based on Exynos4210 SoC.
> +
> +Optional:
> + - firmware node, specifying presence and type of secure firmware:
> + - compatible: only "samsung,secure-firmware" is currently
> supported
> + - reg: address of non-secure SYSRAM used for communication with
> firmware
> +
> + firmware at 0203F000 {
> + compatible = "samsung,secure-firmware";
> + reg = <0x0203F000 0x1000>;
> + };
> diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile
> index a031012..685e4a7 100644
> --- a/arch/arm/mach-exynos/Makefile
> +++ b/arch/arm/mach-exynos/Makefile
> @@ -31,6 +31,7 @@ obj-$(CONFIG_EXYNOS4_MCT) += mct.o
> obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
>
> obj-$(CONFIG_ARCH_EXYNOS) += exynos-smc.o
> +obj-$(CONFIG_ARCH_EXYNOS) += firmware.o
>
> plus_sec := $(call as-instr,.arch_extension sec,+sec)
> AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec)
> diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h
> index dac146d..5f1d393 100644
> --- a/arch/arm/mach-exynos/common.h
> +++ b/arch/arm/mach-exynos/common.h
> @@ -22,6 +22,8 @@ void exynos4_restart(char mode, const char *cmd);
> void exynos5_restart(char mode, const char *cmd);
> void exynos_init_late(void);
>
> +void exynos_firmware_init(void);
> +
> #ifdef CONFIG_PM_GENERIC_DOMAINS
> int exynos_pm_late_initcall(void);
> #else
> diff --git a/arch/arm/mach-exynos/firmware.c
> b/arch/arm/mach-exynos/firmware.c
> new file mode 100644
> index 0000000..88e3eed
> --- /dev/null
> +++ b/arch/arm/mach-exynos/firmware.c
> @@ -0,0 +1,70 @@
> +/*
> + * Copyright (C) 2012 Samsung Electronics.
> + * Kyungmin Park <kyungmin.park@samsung.com>
> + * Tomasz Figa <t.figa@samsung.com>
> + *
> + * This program is free software,you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/io.h>
> +#include <linux/init.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +
> +#include <asm/firmware.h>
> +
> +#include <mach/map.h>
> +
> +#include "smc.h"
> +
> +static int exynos_do_idle(void)
> +{
> + exynos_smc(SMC_CMD_SLEEP, 0, 0, 0);
> + return 0;
> +}
> +
> +static int exynos_cpu_boot(int cpu)
> +{
> + exynos_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0);
> + return 0;
> +}
> +
> +static int exynos_set_cpu_boot_addr(int cpu, unsigned long boot_addr)
> +{
> + void __iomem *boot_reg = S5P_VA_SYSRAM_NS + 0x1c + 4*cpu;
> +
> + __raw_writel(boot_addr, boot_reg);
> + return 0;
> +}
> +
> +static const struct firmware_ops exynos_firmware_ops = {
> + .do_idle = exynos_do_idle,
> + .set_cpu_boot_addr = exynos_set_cpu_boot_addr,
> + .cpu_boot = exynos_cpu_boot,
> +};
> +
> +void __init exynos_firmware_init(void)
> +{
> + if (of_have_populated_dt()) {
> + struct device_node *nd;
> + const __be32 *addr;
> +
> + nd = of_find_compatible_node(NULL, NULL,
> + "samsung,secure-firmware");
> + if (!nd)
> + return;
> +
> + addr = of_get_address(nd, 0, NULL, NULL);
> + if (!addr) {
> + pr_err("%s: No address specified.\n", __func__);
> + return;
> + }
> + }
> +
> + pr_info("Running under secure firmware.\n");
> +
> + register_firmware_ops(&exynos_firmware_ops);
> +}
except these smc calls when system boots, there must be some smc calls
in the runtime of linux. it seems the firmware_ops can cover those
callbacks of the communication between linux and firmware as well?
> diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c
> b/arch/arm/mach-exynos/mach-exynos4-dt.c
> index 8858068..3f967e5 100644
> --- a/arch/arm/mach-exynos/mach-exynos4-dt.c
> +++ b/arch/arm/mach-exynos/mach-exynos4-dt.c
> @@ -107,6 +107,7 @@ DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4
> (Flattened Device Tree)")
> .init_irq = exynos4_init_irq,
> .map_io = exynos4_dt_map_io,
> .handle_irq = gic_handle_irq,
> + .init_early = exynos_firmware_init,
> .init_machine = exynos4_dt_machine_init,
> .init_late = exynos_init_late,
> .timer = &exynos4_timer,
> --
> 1.8.0
-barry
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 3/5] ARM: EXYNOS: Add support for Exynos secure firmware
2012-12-26 8:17 ` Barry Song
@ 2012-12-26 8:53 ` Arnd Bergmann
0 siblings, 0 replies; 12+ messages in thread
From: Arnd Bergmann @ 2012-12-26 8:53 UTC (permalink / raw)
To: linux-arm-kernel
On Wednesday 26 December 2012, Barry Song wrote:
> > / {
> > /* ... */
> >
> > firmware at 0203F000 {
> > compatible = "samsung,secure-firmware";
> > reg = <0x0203F000 0x1000>;
> > };
> >
> > /* ... */
> > };
>
> well. amazing, dts is used to describle hardware details, here the
> firmware is just a software and reg is the memory the firmware will
> use. is this something againest the dt rule?
> but it is really simple.
We have for a long time had DT bindings to describe firmware, e.g.
on IBM Power systems, I think this is fine.
Arnd
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2012-12-26 8:53 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-22 15:51 [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Tomasz Figa
2012-11-22 15:51 ` [PATCH v4 1/5] ARM: Add interface for registering and calling firmware-specific operations Tomasz Figa
2012-12-26 8:00 ` Barry Song
2012-11-22 15:51 ` [PATCH v4 2/5] ARM: EXYNOS: Add support for secure monitor calls Tomasz Figa
2012-11-22 15:51 ` [PATCH v4 3/5] ARM: EXYNOS: Add support for Exynos secure firmware Tomasz Figa
2012-12-26 8:17 ` Barry Song
2012-12-26 8:53 ` Arnd Bergmann
2012-11-22 15:51 ` [PATCH v4 4/5] ARM: EXYNOS: Add IO mapping for non-secure SYSRAM Tomasz Figa
2012-11-22 15:51 ` [PATCH v4 5/5] ARM: EXYNOS: Add secure firmware support to secondary CPU bring-up Tomasz Figa
2012-11-24 2:21 ` [PATCH v4 0/5] ARM: EXYNOS: Add secure firmware support Kukjin Kim
2012-11-28 15:44 ` Tomasz Figa
2012-11-30 10:58 ` Kukjin Kim
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox