* [PATCH v7 0/5] ARM: support for Trusted Foundations secure monito @ 2013-10-04 16:37 Alexandre Courbot 2013-10-04 16:37 ` [PATCH v7 1/5] ARM: add basic support for Trusted Foundations Alexandre Courbot ` (4 more replies) 0 siblings, 5 replies; 18+ messages in thread From: Alexandre Courbot @ 2013-10-04 16:37 UTC (permalink / raw) To: Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Olof Johansson, Arnd Bergmann, Kevin Hilman Cc: gnurou, devicetree, linux-kernel, Alexandre Courbot, linux-tegra, linux-arm-kernel Hopefully final version of this patchset. If I'm not mistaken the last thing that prevents Stephen from merging it is Russel's Ack. Russel, could you check it? Trusted Foundations is an ARM secure monitor that is used by many Tegra-based retail devices (like SHIELD). Adding support to it allows these devices to boot on a purely upstream kernel. Public documentation about Trusted Foundations is scarce, but over the various versions of this patch it has been established that it does not follow the ARM SMC convention and also has no connection whatsoever with PSCI. As such, it requires an implementation of its own and the firmware interface introduced by Tomasz provides an adequate framework for it. Changes since v6: - Improved and simplified header conditionals when TF support is compiled in or not as advised by Stephen. Alexandre Courbot (5): ARM: add basic support for Trusted Foundations ARM: tegra: add support for Trusted Foundations ARM: tegra: split setting of CPU reset handler ARM: tegra: set CPU reset handler with firmware op ARM: tegra: support Trusted Foundations by default .../arm/firmware/tl,trusted-foundations.txt | 17 +++++ Documentation/devicetree/bindings/arm/tegra.txt | 5 ++ .../devicetree/bindings/vendor-prefixes.txt | 1 + arch/arm/Kconfig | 2 + arch/arm/Makefile | 1 + arch/arm/configs/tegra_defconfig | 1 + arch/arm/firmware/Kconfig | 28 ++++++++ arch/arm/firmware/Makefile | 1 + arch/arm/firmware/trusted_foundations.c | 77 ++++++++++++++++++++++ arch/arm/include/asm/trusted_foundations.h | 64 ++++++++++++++++++ arch/arm/mach-tegra/Kconfig | 1 + arch/arm/mach-tegra/common.c | 2 + arch/arm/mach-tegra/reset.c | 40 +++++++---- 13 files changed, 229 insertions(+), 11 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt create mode 100644 arch/arm/firmware/Kconfig create mode 100644 arch/arm/firmware/Makefile create mode 100644 arch/arm/firmware/trusted_foundations.c create mode 100644 arch/arm/include/asm/trusted_foundations.h -- 1.8.4 ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 1/5] ARM: add basic support for Trusted Foundations 2013-10-04 16:37 [PATCH v7 0/5] ARM: support for Trusted Foundations secure monito Alexandre Courbot @ 2013-10-04 16:37 ` Alexandre Courbot 2013-10-08 8:17 ` Michal Simek [not found] ` <1380904635-18113-2-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> 2013-10-04 16:37 ` [PATCH v7 2/5] ARM: tegra: add " Alexandre Courbot ` (3 subsequent siblings) 4 siblings, 2 replies; 18+ messages in thread From: Alexandre Courbot @ 2013-10-04 16:37 UTC (permalink / raw) To: Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Olof Johansson, Arnd Bergmann, Kevin Hilman Cc: gnurou, devicetree, linux-kernel, linux-tegra, linux-arm-kernel, Alexandre Courbot Trusted Foundations is a TrustZone-based secure monitor for ARM that can be invoked using the same SMC-based API on all supported platforms. This patch adds initial basic support for Trusted Foundations using the ARM firmware API. Current features are limited to the ability to boot secondary processors. Note: The API followed by Trusted Foundations does *not* follow the SMC calling conventions. It has nothing to do with PSCI neither and is only relevant to devices that use Trusted Foundations (like most Tegra-based retail devices). Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Tomasz Figa <t.figa@samsung.com> Reviewed-by: Stephen Warren <swarren@nvidia.com> --- .../arm/firmware/tl,trusted-foundations.txt | 17 +++++ .../devicetree/bindings/vendor-prefixes.txt | 1 + arch/arm/Kconfig | 2 + arch/arm/Makefile | 1 + arch/arm/firmware/Kconfig | 28 ++++++++ arch/arm/firmware/Makefile | 1 + arch/arm/firmware/trusted_foundations.c | 77 ++++++++++++++++++++++ arch/arm/include/asm/trusted_foundations.h | 64 ++++++++++++++++++ 8 files changed, 191 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt create mode 100644 arch/arm/firmware/Kconfig create mode 100644 arch/arm/firmware/Makefile create mode 100644 arch/arm/firmware/trusted_foundations.c create mode 100644 arch/arm/include/asm/trusted_foundations.h diff --git a/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt new file mode 100644 index 0000000..3954bbd --- /dev/null +++ b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt @@ -0,0 +1,17 @@ +Trusted Foundations + +Boards that use the Trusted Foundations secure monitor can signal its +presence by declaring a node compatible with "tl,trusted-foundations" +under the root node. + +Required properties: +- compatible : "tl,trusted-foundations" +- version-major : major version number of Trusted Foundations firmware +- version-minor: minor version number of Trusted Foundations firmware + +Example: + firmware { + compatible = "tl,trusted-foundations"; + version-major = <2>; + version-minor = <8>; + }; diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt index 2956800..a374eaa 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.txt +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt @@ -66,6 +66,7 @@ ste ST-Ericsson stericsson ST-Ericsson toumaz Toumaz ti Texas Instruments +tl Trusted Logic toshiba Toshiba Corporation v3 V3 Semiconductor via VIA Technologies, Inc. diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 1ad6fb6..bf14cec 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1076,6 +1076,8 @@ config ARM_TIMER_SP804 select CLKSRC_MMIO select CLKSRC_OF if OF +source "arch/arm/firmware/Kconfig" + source arch/arm/mm/Kconfig config ARM_NR_BANKS diff --git a/arch/arm/Makefile b/arch/arm/Makefile index a37a50f..f26712c 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -268,6 +268,7 @@ core-$(CONFIG_KVM_ARM_HOST) += arch/arm/kvm/ core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ core-y += arch/arm/net/ core-y += arch/arm/crypto/ +core-y += arch/arm/firmware/ core-y += $(machdirs) $(platdirs) drivers-$(CONFIG_OPROFILE) += arch/arm/oprofile/ diff --git a/arch/arm/firmware/Kconfig b/arch/arm/firmware/Kconfig new file mode 100644 index 0000000..bb00ccf --- /dev/null +++ b/arch/arm/firmware/Kconfig @@ -0,0 +1,28 @@ +config ARCH_SUPPORTS_FIRMWARE + bool + +config ARCH_SUPPORTS_TRUSTED_FOUNDATIONS + bool + select ARCH_SUPPORTS_FIRMWARE + +menu "Firmware options" + depends on ARCH_SUPPORTS_FIRMWARE + +config TRUSTED_FOUNDATIONS + bool "Trusted Foundations secure monitor support" + depends on ARCH_SUPPORTS_TRUSTED_FOUNDATIONS + help + Some devices (including most Tegra-based consumer devices on the + market) are booted with the Trusted Foundations secure monitor + active, requiring some core operations to be performed by the secure + monitor instead of the kernel. + + This option allows the kernel to invoke the secure monitor whenever + required on devices using Trusted Foundations. See + arch/arm/include/asm/trusted_foundations.h or the + tl,trusted-foundations device tree binding documentation for details + on how to use it. + + Say n if you don't know what this is about. + +endmenu diff --git a/arch/arm/firmware/Makefile b/arch/arm/firmware/Makefile new file mode 100644 index 0000000..a71f165 --- /dev/null +++ b/arch/arm/firmware/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o diff --git a/arch/arm/firmware/trusted_foundations.c b/arch/arm/firmware/trusted_foundations.c new file mode 100644 index 0000000..c93c5e0 --- /dev/null +++ b/arch/arm/firmware/trusted_foundations.c @@ -0,0 +1,77 @@ +/* + * Trusted Foundations support for ARM CPUs + * + * Copyright (c) 2013, NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/of.h> +#include <asm/firmware.h> +#include <asm/trusted_foundations.h> + +#define TF_SET_CPU_BOOT_ADDR_SMC 0xfffff200 + +static void __naked tf_generic_smc(u32 type, u32 subtype, u32 arg) +{ + asm volatile( + ".arch_extension sec\n\t" + "stmfd sp!, {r4 - r11, lr}\n\t" + __asmeq("%0", "r0") + __asmeq("%1", "r1") + __asmeq("%2", "r2") + "mov r3, #0\n\t" + "mov r4, #0\n\t" + "smc #0\n\t" + "ldmfd sp!, {r4 - r11, pc}" + : + : "r" (type), "r" (subtype), "r" (arg) + : "memory"); +} + +static int tf_set_cpu_boot_addr(int cpu, unsigned long boot_addr) +{ + tf_generic_smc(TF_SET_CPU_BOOT_ADDR_SMC, boot_addr, 0); + + return 0; +} + +static const struct firmware_ops trusted_foundations_ops = { + .set_cpu_boot_addr = tf_set_cpu_boot_addr, +}; + +void register_trusted_foundations(struct trusted_foundations_platform_data *pd) +{ + /* we are not using version information for now since currently + * supported SMCs are compatible with all TF releases */ + register_firmware_ops(&trusted_foundations_ops); +} + +void of_register_trusted_foundations(void) +{ + struct device_node *node; + struct trusted_foundations_platform_data pdata; + int err; + + node = of_find_compatible_node(NULL, NULL, "tl,trusted-foundations"); + if (!node) + return; + + err = of_property_read_u32(node, "version-major", &pdata.version_major); + if (err != 0) + panic("Trusted Foundation: missing version-major property\n"); + err = of_property_read_u32(node, "version-minor", &pdata.version_minor); + if (err != 0) + panic("Trusted Foundation: missing version-minor property\n"); + register_trusted_foundations(&pdata); +} diff --git a/arch/arm/include/asm/trusted_foundations.h b/arch/arm/include/asm/trusted_foundations.h new file mode 100644 index 0000000..749edbf --- /dev/null +++ b/arch/arm/include/asm/trusted_foundations.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2013, NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +/* + * Support for the Trusted Foundations secure monitor. + * + * Trusted Foundation comes active on some ARM consumer devices (most + * Tegra-based devices sold on the market are concerned). Such devices can only + * perform some basic operations, like setting the CPU reset vector, through + * SMC calls to the secure monitor. The calls are completely specific to + * Trusted Foundations, and do *not* follow the SMC calling convention or the + * PSCI standard. + */ + +#ifndef __ASM_ARM_TRUSTED_FOUNDATIONS_H +#define __ASM_ARM_TRUSTED_FOUNDATIONS_H + +#include <linux/kconfig.h> + +struct trusted_foundations_platform_data { + unsigned int version_major; + unsigned int version_minor; +}; + +#if IS_ENABLED(CONFIG_TRUSTED_FOUNDATIONS) + +void register_trusted_foundations(struct trusted_foundations_platform_data *pd); +void of_register_trusted_foundations(void); + +#else /* CONFIG_TRUSTED_FOUNDATIONS */ + +#include <linux/printk.h> +#include <linux/of.h> +#include <asm/bug.h> + +static inline void register_trusted_foundations( + struct trusted_foundations_platform_data *pd) +{ + /* If we try to register TF, this means the system needs it to continue. + * Its absence if thus a fatal error. */ + panic("No support for Trusted Foundations, stopping...\n"); +} + +static inline void of_register_trusted_foundations(void) +{ + /* If we find the target should enable TF but does not support it, + * fail as the system won't be able to do much anyway */ + if (of_find_compatible_node(NULL, NULL, "tl,trusted-foundations")) + register_trusted_foundations(NULL); +} +#endif /* CONFIG_TRUSTED_FOUNDATIONS */ + +#endif -- 1.8.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations 2013-10-04 16:37 ` [PATCH v7 1/5] ARM: add basic support for Trusted Foundations Alexandre Courbot @ 2013-10-08 8:17 ` Michal Simek [not found] ` <5253BF8E.4050802-pSz03upnqPeHXe+LvDLADg@public.gmane.org> [not found] ` <1380904635-18113-2-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> 1 sibling, 1 reply; 18+ messages in thread From: Michal Simek @ 2013-10-08 8:17 UTC (permalink / raw) To: Alexandre Courbot Cc: Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Olof Johansson, Arnd Bergmann, Kevin Hilman, gnurou, devicetree, linux-kernel, linux-tegra, linux-arm-kernel, Grant Likely, Rob Herring [-- Attachment #1: Type: text/plain, Size: 3398 bytes --] Hi, On 10/04/2013 06:37 PM, Alexandre Courbot wrote: > Trusted Foundations is a TrustZone-based secure monitor for ARM that > can be invoked using the same SMC-based API on all supported > platforms. This patch adds initial basic support for Trusted > Foundations using the ARM firmware API. Current features are limited > to the ability to boot secondary processors. > > Note: The API followed by Trusted Foundations does *not* follow the SMC > calling conventions. It has nothing to do with PSCI neither and is only > relevant to devices that use Trusted Foundations (like most Tegra-based > retail devices). > > Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> > Reviewed-by: Tomasz Figa <t.figa@samsung.com> > Reviewed-by: Stephen Warren <swarren@nvidia.com> > --- > .../arm/firmware/tl,trusted-foundations.txt | 17 +++++ > .../devicetree/bindings/vendor-prefixes.txt | 1 + > arch/arm/Kconfig | 2 + > arch/arm/Makefile | 1 + > arch/arm/firmware/Kconfig | 28 ++++++++ > arch/arm/firmware/Makefile | 1 + > arch/arm/firmware/trusted_foundations.c | 77 ++++++++++++++++++++++ > arch/arm/include/asm/trusted_foundations.h | 64 ++++++++++++++++++ > 8 files changed, 191 insertions(+) > create mode 100644 Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt > create mode 100644 arch/arm/firmware/Kconfig > create mode 100644 arch/arm/firmware/Makefile > create mode 100644 arch/arm/firmware/trusted_foundations.c > create mode 100644 arch/arm/include/asm/trusted_foundations.h > > diff --git a/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt > new file mode 100644 > index 0000000..3954bbd > --- /dev/null > +++ b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt > @@ -0,0 +1,17 @@ > +Trusted Foundations > + > +Boards that use the Trusted Foundations secure monitor can signal its > +presence by declaring a node compatible with "tl,trusted-foundations" > +under the root node. > + > +Required properties: > +- compatible : "tl,trusted-foundations" > +- version-major : major version number of Trusted Foundations firmware > +- version-minor: minor version number of Trusted Foundations firmware > + > +Example: > + firmware { > + compatible = "tl,trusted-foundations"; > + version-major = <2>; > + version-minor = <8>; > + }; This is just another example how to add sw description to dts. I have briefly looked at tegra20.dtsi and there are IPs like timer, intc, etc which are in the DTS without any bus. Add this firmware node to the root is just +1 case to this mess but IMHO will be good to have specific DT part which will be used for this sw setting which are coming to DTS all the time. Grant, Rob: Where is the proper location for these type of description? Thanks, Michal -- Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91 w: www.monstr.eu p: +42-0-721842854 Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/ Maintainer of Linux kernel - Xilinx Zynq ARM architecture Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 263 bytes --] ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <5253BF8E.4050802-pSz03upnqPeHXe+LvDLADg@public.gmane.org>]
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations [not found] ` <5253BF8E.4050802-pSz03upnqPeHXe+LvDLADg@public.gmane.org> @ 2013-10-09 23:45 ` Olof Johansson [not found] ` <CAOesGMjtHBft71nJUEc7K+2UA_LiWBOVWpbYvJDOnF=NLepLLw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 18+ messages in thread From: Olof Johansson @ 2013-10-09 23:45 UTC (permalink / raw) To: Michal Simek Cc: Alexandre Courbot, Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Arnd Bergmann, Kevin Hilman, Alexandre Courbot, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Grant Likely, Rob Herring On Tue, Oct 8, 2013 at 1:17 AM, Michal Simek <monstr-pSz03upnqPeHXe+LvDLADg@public.gmane.org> wrote: > Hi, > > On 10/04/2013 06:37 PM, Alexandre Courbot wrote: >> Trusted Foundations is a TrustZone-based secure monitor for ARM that >> can be invoked using the same SMC-based API on all supported >> platforms. This patch adds initial basic support for Trusted >> Foundations using the ARM firmware API. Current features are limited >> to the ability to boot secondary processors. >> >> Note: The API followed by Trusted Foundations does *not* follow the SMC >> calling conventions. It has nothing to do with PSCI neither and is only >> relevant to devices that use Trusted Foundations (like most Tegra-based >> retail devices). >> >> Signed-off-by: Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> >> Reviewed-by: Tomasz Figa <t.figa-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> >> Reviewed-by: Stephen Warren <swarren-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> >> --- >> .../arm/firmware/tl,trusted-foundations.txt | 17 +++++ >> .../devicetree/bindings/vendor-prefixes.txt | 1 + >> arch/arm/Kconfig | 2 + >> arch/arm/Makefile | 1 + >> arch/arm/firmware/Kconfig | 28 ++++++++ >> arch/arm/firmware/Makefile | 1 + >> arch/arm/firmware/trusted_foundations.c | 77 ++++++++++++++++++++++ >> arch/arm/include/asm/trusted_foundations.h | 64 ++++++++++++++++++ >> 8 files changed, 191 insertions(+) >> create mode 100644 Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt >> create mode 100644 arch/arm/firmware/Kconfig >> create mode 100644 arch/arm/firmware/Makefile >> create mode 100644 arch/arm/firmware/trusted_foundations.c >> create mode 100644 arch/arm/include/asm/trusted_foundations.h >> >> diff --git a/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt >> new file mode 100644 >> index 0000000..3954bbd >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt >> @@ -0,0 +1,17 @@ >> +Trusted Foundations >> + >> +Boards that use the Trusted Foundations secure monitor can signal its >> +presence by declaring a node compatible with "tl,trusted-foundations" >> +under the root node. >> + >> +Required properties: >> +- compatible : "tl,trusted-foundations" >> +- version-major : major version number of Trusted Foundations firmware >> +- version-minor: minor version number of Trusted Foundations firmware >> + >> +Example: >> + firmware { >> + compatible = "tl,trusted-foundations"; >> + version-major = <2>; >> + version-minor = <8>; >> + }; > > This is just another example how to add sw description to dts. > I have briefly looked at tegra20.dtsi and there are IPs like timer, intc, etc > which are in the DTS without any bus. > > Add this firmware node to the root is just +1 case to this mess > but IMHO will be good to have specific DT part which will be used for > this sw setting which are coming to DTS all the time. > > Grant, Rob: Where is the proper location for these type of description? Usually we've been using the /firmware hierarchy for these kind of things. Chrome OS uses /firmware/chromeos for some of the information passing from FW to the OS. You might want a separate node under /firmware for this, since this is "just" the secure runtime portion of things, there might be need to add things for/from the bootloader too. -Olof -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <CAOesGMjtHBft71nJUEc7K+2UA_LiWBOVWpbYvJDOnF=NLepLLw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations [not found] ` <CAOesGMjtHBft71nJUEc7K+2UA_LiWBOVWpbYvJDOnF=NLepLLw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2013-10-10 5:18 ` Michal Simek 0 siblings, 0 replies; 18+ messages in thread From: Michal Simek @ 2013-10-10 5:18 UTC (permalink / raw) To: Olof Johansson Cc: Alexandre Courbot, Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Arnd Bergmann, Kevin Hilman, Alexandre Courbot, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Grant Likely, Rob Herring [-- Attachment #1: Type: text/plain, Size: 4265 bytes --] On 10/10/2013 01:45 AM, Olof Johansson wrote: > On Tue, Oct 8, 2013 at 1:17 AM, Michal Simek <monstr-pSz03upnqPeHXe+LvDLADg@public.gmane.org> wrote: >> Hi, >> >> On 10/04/2013 06:37 PM, Alexandre Courbot wrote: >>> Trusted Foundations is a TrustZone-based secure monitor for ARM that >>> can be invoked using the same SMC-based API on all supported >>> platforms. This patch adds initial basic support for Trusted >>> Foundations using the ARM firmware API. Current features are limited >>> to the ability to boot secondary processors. >>> >>> Note: The API followed by Trusted Foundations does *not* follow the SMC >>> calling conventions. It has nothing to do with PSCI neither and is only >>> relevant to devices that use Trusted Foundations (like most Tegra-based >>> retail devices). >>> >>> Signed-off-by: Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> >>> Reviewed-by: Tomasz Figa <t.figa-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> >>> Reviewed-by: Stephen Warren <swarren-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> >>> --- >>> .../arm/firmware/tl,trusted-foundations.txt | 17 +++++ >>> .../devicetree/bindings/vendor-prefixes.txt | 1 + >>> arch/arm/Kconfig | 2 + >>> arch/arm/Makefile | 1 + >>> arch/arm/firmware/Kconfig | 28 ++++++++ >>> arch/arm/firmware/Makefile | 1 + >>> arch/arm/firmware/trusted_foundations.c | 77 ++++++++++++++++++++++ >>> arch/arm/include/asm/trusted_foundations.h | 64 ++++++++++++++++++ >>> 8 files changed, 191 insertions(+) >>> create mode 100644 Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt >>> create mode 100644 arch/arm/firmware/Kconfig >>> create mode 100644 arch/arm/firmware/Makefile >>> create mode 100644 arch/arm/firmware/trusted_foundations.c >>> create mode 100644 arch/arm/include/asm/trusted_foundations.h >>> >>> diff --git a/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt >>> new file mode 100644 >>> index 0000000..3954bbd >>> --- /dev/null >>> +++ b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt >>> @@ -0,0 +1,17 @@ >>> +Trusted Foundations >>> + >>> +Boards that use the Trusted Foundations secure monitor can signal its >>> +presence by declaring a node compatible with "tl,trusted-foundations" >>> +under the root node. >>> + >>> +Required properties: >>> +- compatible : "tl,trusted-foundations" >>> +- version-major : major version number of Trusted Foundations firmware >>> +- version-minor: minor version number of Trusted Foundations firmware >>> + >>> +Example: >>> + firmware { >>> + compatible = "tl,trusted-foundations"; >>> + version-major = <2>; >>> + version-minor = <8>; >>> + }; >> >> This is just another example how to add sw description to dts. >> I have briefly looked at tegra20.dtsi and there are IPs like timer, intc, etc >> which are in the DTS without any bus. >> >> Add this firmware node to the root is just +1 case to this mess >> but IMHO will be good to have specific DT part which will be used for >> this sw setting which are coming to DTS all the time. >> >> Grant, Rob: Where is the proper location for these type of description? > > Usually we've been using the /firmware hierarchy for these kind of things. > > Chrome OS uses /firmware/chromeos for some of the information passing > from FW to the OS. > > You might want a separate node under /firmware for this, since this is > "just" the secure runtime portion of things, there might be need to > add things for/from the bootloader too. Is this documented somewhere? I mean that firmware node should be used for this. Thanks, Michal -- Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91 w: www.monstr.eu p: +42-0-721842854 Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/ Maintainer of Linux kernel - Xilinx Zynq ARM architecture Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 263 bytes --] ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <1380904635-18113-2-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations [not found] ` <1380904635-18113-2-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> @ 2013-10-07 18:16 ` Kevin Hilman 2013-10-07 19:28 ` Stephen Warren 2013-10-09 23:47 ` Olof Johansson 2 siblings, 0 replies; 18+ messages in thread From: Kevin Hilman @ 2013-10-07 18:16 UTC (permalink / raw) To: Alexandre Courbot Cc: Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Olof Johansson, Arnd Bergmann, gnurou-Re5JQEeQqe8AvxtiuMwx3w, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> writes: > Trusted Foundations is a TrustZone-based secure monitor for ARM that > can be invoked using the same SMC-based API on all supported > platforms. This patch adds initial basic support for Trusted > Foundations using the ARM firmware API. Current features are limited > to the ability to boot secondary processors. > > Note: The API followed by Trusted Foundations does *not* follow the SMC > calling conventions. It has nothing to do with PSCI neither and is only > relevant to devices that use Trusted Foundations (like most Tegra-based > retail devices). > > Signed-off-by: Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> > Reviewed-by: Tomasz Figa <t.figa-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > Reviewed-by: Stephen Warren <swarren-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> [...] > +void register_trusted_foundations(struct trusted_foundations_platform_data *pd) > +{ > + /* we are not using version information for now since currently > + * supported SMCs are compatible with all TF releases */ nit: multi-line comment style... [...] > +static inline void register_trusted_foundations( > + struct trusted_foundations_platform_data *pd) > +{ > + /* If we try to register TF, this means the system needs it to continue. > + * Its absence if thus a fatal error. */ ...and here... > + panic("No support for Trusted Foundations, stopping...\n"); > +} > + > +static inline void of_register_trusted_foundations(void) > +{ > + /* If we find the target should enable TF but does not support it, > + * fail as the system won't be able to do much anyway */ ...and here. > + if (of_find_compatible_node(NULL, NULL, "tl,trusted-foundations")) > + register_trusted_foundations(NULL); > +} > +#endif /* CONFIG_TRUSTED_FOUNDATIONS */ > + > +#endif Kevin ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations [not found] ` <1380904635-18113-2-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> 2013-10-07 18:16 ` Kevin Hilman @ 2013-10-07 19:28 ` Stephen Warren 2013-10-09 23:47 ` Olof Johansson 2 siblings, 0 replies; 18+ messages in thread From: Stephen Warren @ 2013-10-07 19:28 UTC (permalink / raw) To: Alexandre Courbot, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell Cc: Russell King, Tomasz Figa, Dave Martin, Olof Johansson, Arnd Bergmann, Kevin Hilman, gnurou-Re5JQEeQqe8AvxtiuMwx3w, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On 10/04/2013 10:37 AM, Alexandre Courbot wrote: > Trusted Foundations is a TrustZone-based secure monitor for ARM that > can be invoked using the same SMC-based API on all supported > platforms. This patch adds initial basic support for Trusted > Foundations using the ARM firmware API. Current features are limited > to the ability to boot secondary processors. > > Note: The API followed by Trusted Foundations does *not* follow the SMC > calling conventions. It has nothing to do with PSCI neither and is only > relevant to devices that use Trusted Foundations (like most Tegra-based > retail devices). Hmmm. This patch didn't get sent to the DT maintainers. I'm CC'ing them all in this reply, and hence quoting the two relevant files in full. I'm looking for an ack to take this patch through the Tegra tree. I'm also looking for an ack from perhaps Russell on the code changes in the patch. > diff --git a/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt > new file mode 100644 > index 0000000..3954bbd > --- /dev/null > +++ b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt > @@ -0,0 +1,17 @@ > +Trusted Foundations > + > +Boards that use the Trusted Foundations secure monitor can signal its > +presence by declaring a node compatible with "tl,trusted-foundations" > +under the root node. > + > +Required properties: > +- compatible : "tl,trusted-foundations" > +- version-major : major version number of Trusted Foundations firmware > +- version-minor: minor version number of Trusted Foundations firmware > + > +Example: > + firmware { > + compatible = "tl,trusted-foundations"; > + version-major = <2>; > + version-minor = <8>; > + }; > diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt > index 2956800..a374eaa 100644 > --- a/Documentation/devicetree/bindings/vendor-prefixes.txt > +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt > @@ -66,6 +66,7 @@ ste ST-Ericsson > stericsson ST-Ericsson > toumaz Toumaz > ti Texas Instruments > +tl Trusted Logic > toshiba Toshiba Corporation > v3 V3 Semiconductor > via VIA Technologies, Inc. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations [not found] ` <1380904635-18113-2-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> 2013-10-07 18:16 ` Kevin Hilman 2013-10-07 19:28 ` Stephen Warren @ 2013-10-09 23:47 ` Olof Johansson [not found] ` <CAOesGMj74Pui1V5O7zxEipM5Hg6nboVTUCFuMY0c0aUh=wuu3Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2 siblings, 1 reply; 18+ messages in thread From: Olof Johansson @ 2013-10-09 23:47 UTC (permalink / raw) To: Alexandre Courbot Cc: Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Arnd Bergmann, Kevin Hilman, Alexandre Courbot, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org On Fri, Oct 4, 2013 at 9:37 AM, Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> wrote: > Trusted Foundations is a TrustZone-based secure monitor for ARM that > can be invoked using the same SMC-based API on all supported > platforms. This patch adds initial basic support for Trusted > Foundations using the ARM firmware API. Current features are limited > to the ability to boot secondary processors. > > Note: The API followed by Trusted Foundations does *not* follow the SMC > calling conventions. It has nothing to do with PSCI neither and is only > relevant to devices that use Trusted Foundations (like most Tegra-based > retail devices). > > Signed-off-by: Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> > Reviewed-by: Tomasz Figa <t.figa-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > Reviewed-by: Stephen Warren <swarren-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> > --- > .../arm/firmware/tl,trusted-foundations.txt | 17 +++++ > .../devicetree/bindings/vendor-prefixes.txt | 1 + > arch/arm/Kconfig | 2 + > arch/arm/Makefile | 1 + > arch/arm/firmware/Kconfig | 28 ++++++++ > arch/arm/firmware/Makefile | 1 + > arch/arm/firmware/trusted_foundations.c | 77 ++++++++++++++++++++++ > arch/arm/include/asm/trusted_foundations.h | 64 ++++++++++++++++++ > 8 files changed, 191 insertions(+) > create mode 100644 Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt > create mode 100644 arch/arm/firmware/Kconfig > create mode 100644 arch/arm/firmware/Makefile > create mode 100644 arch/arm/firmware/trusted_foundations.c > create mode 100644 arch/arm/include/asm/trusted_foundations.h > > diff --git a/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt > new file mode 100644 > index 0000000..3954bbd > --- /dev/null > +++ b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt > @@ -0,0 +1,17 @@ > +Trusted Foundations > + > +Boards that use the Trusted Foundations secure monitor can signal its > +presence by declaring a node compatible with "tl,trusted-foundations" > +under the root node. > + > +Required properties: > +- compatible : "tl,trusted-foundations" > +- version-major : major version number of Trusted Foundations firmware > +- version-minor: minor version number of Trusted Foundations firmware > + > +Example: > + firmware { > + compatible = "tl,trusted-foundations"; > + version-major = <2>; > + version-minor = <8>; > + }; > diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt > index 2956800..a374eaa 100644 > --- a/Documentation/devicetree/bindings/vendor-prefixes.txt > +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt > @@ -66,6 +66,7 @@ ste ST-Ericsson > stericsson ST-Ericsson > toumaz Toumaz > ti Texas Instruments > +tl Trusted Logic > toshiba Toshiba Corporation > v3 V3 Semiconductor > via VIA Technologies, Inc. > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index 1ad6fb6..bf14cec 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -1076,6 +1076,8 @@ config ARM_TIMER_SP804 > select CLKSRC_MMIO > select CLKSRC_OF if OF > > +source "arch/arm/firmware/Kconfig" > + > source arch/arm/mm/Kconfig > > config ARM_NR_BANKS > diff --git a/arch/arm/Makefile b/arch/arm/Makefile > index a37a50f..f26712c 100644 > --- a/arch/arm/Makefile > +++ b/arch/arm/Makefile > @@ -268,6 +268,7 @@ core-$(CONFIG_KVM_ARM_HOST) += arch/arm/kvm/ > core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ > core-y += arch/arm/net/ > core-y += arch/arm/crypto/ > +core-y += arch/arm/firmware/ > core-y += $(machdirs) $(platdirs) > > drivers-$(CONFIG_OPROFILE) += arch/arm/oprofile/ > diff --git a/arch/arm/firmware/Kconfig b/arch/arm/firmware/Kconfig > new file mode 100644 > index 0000000..bb00ccf > --- /dev/null > +++ b/arch/arm/firmware/Kconfig > @@ -0,0 +1,28 @@ > +config ARCH_SUPPORTS_FIRMWARE > + bool > + > +config ARCH_SUPPORTS_TRUSTED_FOUNDATIONS > + bool > + select ARCH_SUPPORTS_FIRMWARE > + > +menu "Firmware options" > + depends on ARCH_SUPPORTS_FIRMWARE > + > +config TRUSTED_FOUNDATIONS > + bool "Trusted Foundations secure monitor support" > + depends on ARCH_SUPPORTS_TRUSTED_FOUNDATIONS > + help > + Some devices (including most Tegra-based consumer devices on the > + market) are booted with the Trusted Foundations secure monitor > + active, requiring some core operations to be performed by the secure > + monitor instead of the kernel. > + > + This option allows the kernel to invoke the secure monitor whenever > + required on devices using Trusted Foundations. See > + arch/arm/include/asm/trusted_foundations.h or the > + tl,trusted-foundations device tree binding documentation for details > + on how to use it. > + > + Say n if you don't know what this is about. > + > +endmenu > diff --git a/arch/arm/firmware/Makefile b/arch/arm/firmware/Makefile > new file mode 100644 > index 0000000..a71f165 > --- /dev/null > +++ b/arch/arm/firmware/Makefile > @@ -0,0 +1 @@ > +obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o > diff --git a/arch/arm/firmware/trusted_foundations.c b/arch/arm/firmware/trusted_foundations.c > new file mode 100644 > index 0000000..c93c5e0 > --- /dev/null > +++ b/arch/arm/firmware/trusted_foundations.c > @@ -0,0 +1,77 @@ > +/* > + * Trusted Foundations support for ARM CPUs > + * > + * Copyright (c) 2013, NVIDIA Corporation. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + */ > + > +#include <linux/kernel.h> > +#include <linux/init.h> > +#include <linux/of.h> > +#include <asm/firmware.h> > +#include <asm/trusted_foundations.h> > + > +#define TF_SET_CPU_BOOT_ADDR_SMC 0xfffff200 > + > +static void __naked tf_generic_smc(u32 type, u32 subtype, u32 arg) > +{ > + asm volatile( > + ".arch_extension sec\n\t" > + "stmfd sp!, {r4 - r11, lr}\n\t" > + __asmeq("%0", "r0") > + __asmeq("%1", "r1") > + __asmeq("%2", "r2") > + "mov r3, #0\n\t" > + "mov r4, #0\n\t" > + "smc #0\n\t" > + "ldmfd sp!, {r4 - r11, pc}" > + : > + : "r" (type), "r" (subtype), "r" (arg) > + : "memory"); > +} > + > +static int tf_set_cpu_boot_addr(int cpu, unsigned long boot_addr) > +{ > + tf_generic_smc(TF_SET_CPU_BOOT_ADDR_SMC, boot_addr, 0); > + > + return 0; > +} > + > +static const struct firmware_ops trusted_foundations_ops = { > + .set_cpu_boot_addr = tf_set_cpu_boot_addr, > +}; > + > +void register_trusted_foundations(struct trusted_foundations_platform_data *pd) > +{ > + /* we are not using version information for now since currently > + * supported SMCs are compatible with all TF releases */ > + register_firmware_ops(&trusted_foundations_ops); > +} > + > +void of_register_trusted_foundations(void) > +{ > + struct device_node *node; > + struct trusted_foundations_platform_data pdata; > + int err; > + > + node = of_find_compatible_node(NULL, NULL, "tl,trusted-foundations"); > + if (!node) > + return; > + > + err = of_property_read_u32(node, "version-major", &pdata.version_major); > + if (err != 0) > + panic("Trusted Foundation: missing version-major property\n"); > + err = of_property_read_u32(node, "version-minor", &pdata.version_minor); > + if (err != 0) > + panic("Trusted Foundation: missing version-minor property\n"); > + register_trusted_foundations(&pdata); > +} > diff --git a/arch/arm/include/asm/trusted_foundations.h b/arch/arm/include/asm/trusted_foundations.h > new file mode 100644 > index 0000000..749edbf > --- /dev/null > +++ b/arch/arm/include/asm/trusted_foundations.h > @@ -0,0 +1,64 @@ > +/* > + * Copyright (c) 2013, NVIDIA Corporation. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + */ > + > +/* > + * Support for the Trusted Foundations secure monitor. > + * > + * Trusted Foundation comes active on some ARM consumer devices (most > + * Tegra-based devices sold on the market are concerned). Such devices can only > + * perform some basic operations, like setting the CPU reset vector, through > + * SMC calls to the secure monitor. The calls are completely specific to > + * Trusted Foundations, and do *not* follow the SMC calling convention or the > + * PSCI standard. > + */ > + > +#ifndef __ASM_ARM_TRUSTED_FOUNDATIONS_H > +#define __ASM_ARM_TRUSTED_FOUNDATIONS_H > + > +#include <linux/kconfig.h> > + > +struct trusted_foundations_platform_data { > + unsigned int version_major; > + unsigned int version_minor; > +}; > + > +#if IS_ENABLED(CONFIG_TRUSTED_FOUNDATIONS) > + > +void register_trusted_foundations(struct trusted_foundations_platform_data *pd); > +void of_register_trusted_foundations(void); > + > +#else /* CONFIG_TRUSTED_FOUNDATIONS */ > + > +#include <linux/printk.h> > +#include <linux/of.h> > +#include <asm/bug.h> > + > +static inline void register_trusted_foundations( > + struct trusted_foundations_platform_data *pd) > +{ > + /* If we try to register TF, this means the system needs it to continue. > + * Its absence if thus a fatal error. */ > + panic("No support for Trusted Foundations, stopping...\n"); > +} > + > +static inline void of_register_trusted_foundations(void) > +{ > + /* If we find the target should enable TF but does not support it, > + * fail as the system won't be able to do much anyway */ > + if (of_find_compatible_node(NULL, NULL, "tl,trusted-foundations")) > + register_trusted_foundations(NULL); > +} > +#endif /* CONFIG_TRUSTED_FOUNDATIONS */ The latter function can just be shortcut unto a local panic too. But do we really need to panic here? It's a PITA to debug since it'll be a very early panic. I'd rather have the system log errors in dmesg but continue booting with one cpu. (That can be done incrementally on top of this, and doesn't need to hold up this patch series). -Olof ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <CAOesGMj74Pui1V5O7zxEipM5Hg6nboVTUCFuMY0c0aUh=wuu3Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations [not found] ` <CAOesGMj74Pui1V5O7zxEipM5Hg6nboVTUCFuMY0c0aUh=wuu3Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2013-10-10 20:58 ` Alexandre Courbot 2013-10-10 21:14 ` Kevin Hilman [not found] ` <CAAVeFuLvHdUuDurqA_=tvxJonNP+RekotM_MuysQrJD0PUgcSQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 2 replies; 18+ messages in thread From: Alexandre Courbot @ 2013-10-10 20:58 UTC (permalink / raw) To: Olof Johansson Cc: Alexandre Courbot, Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Arnd Bergmann, Kevin Hilman, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org On Wed, Oct 9, 2013 at 4:47 PM, Olof Johansson <olof-nZhT3qVonbNeoWH0uzbU5w@public.gmane.org> wrote: > On Fri, Oct 4, 2013 at 9:37 AM, Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> wrote: >> Trusted Foundations is a TrustZone-based secure monitor for ARM that >> can be invoked using the same SMC-based API on all supported >> platforms. This patch adds initial basic support for Trusted >> Foundations using the ARM firmware API. Current features are limited >> to the ability to boot secondary processors. >> >> Note: The API followed by Trusted Foundations does *not* follow the SMC >> calling conventions. It has nothing to do with PSCI neither and is only >> relevant to devices that use Trusted Foundations (like most Tegra-based >> retail devices). >> >> Signed-off-by: Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> >> Reviewed-by: Tomasz Figa <t.figa-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> >> Reviewed-by: Stephen Warren <swarren-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> >> --- >> .../arm/firmware/tl,trusted-foundations.txt | 17 +++++ >> .../devicetree/bindings/vendor-prefixes.txt | 1 + >> arch/arm/Kconfig | 2 + >> arch/arm/Makefile | 1 + >> arch/arm/firmware/Kconfig | 28 ++++++++ >> arch/arm/firmware/Makefile | 1 + >> arch/arm/firmware/trusted_foundations.c | 77 ++++++++++++++++++++++ >> arch/arm/include/asm/trusted_foundations.h | 64 ++++++++++++++++++ >> 8 files changed, 191 insertions(+) >> create mode 100644 Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt >> create mode 100644 arch/arm/firmware/Kconfig >> create mode 100644 arch/arm/firmware/Makefile >> create mode 100644 arch/arm/firmware/trusted_foundations.c >> create mode 100644 arch/arm/include/asm/trusted_foundations.h >> >> diff --git a/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt >> new file mode 100644 >> index 0000000..3954bbd >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/arm/firmware/tl,trusted-foundations.txt >> @@ -0,0 +1,17 @@ >> +Trusted Foundations >> + >> +Boards that use the Trusted Foundations secure monitor can signal its >> +presence by declaring a node compatible with "tl,trusted-foundations" >> +under the root node. >> + >> +Required properties: >> +- compatible : "tl,trusted-foundations" >> +- version-major : major version number of Trusted Foundations firmware >> +- version-minor: minor version number of Trusted Foundations firmware >> + >> +Example: >> + firmware { >> + compatible = "tl,trusted-foundations"; >> + version-major = <2>; >> + version-minor = <8>; >> + }; >> diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt >> index 2956800..a374eaa 100644 >> --- a/Documentation/devicetree/bindings/vendor-prefixes.txt >> +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt >> @@ -66,6 +66,7 @@ ste ST-Ericsson >> stericsson ST-Ericsson >> toumaz Toumaz >> ti Texas Instruments >> +tl Trusted Logic >> toshiba Toshiba Corporation >> v3 V3 Semiconductor >> via VIA Technologies, Inc. >> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig >> index 1ad6fb6..bf14cec 100644 >> --- a/arch/arm/Kconfig >> +++ b/arch/arm/Kconfig >> @@ -1076,6 +1076,8 @@ config ARM_TIMER_SP804 >> select CLKSRC_MMIO >> select CLKSRC_OF if OF >> >> +source "arch/arm/firmware/Kconfig" >> + >> source arch/arm/mm/Kconfig >> >> config ARM_NR_BANKS >> diff --git a/arch/arm/Makefile b/arch/arm/Makefile >> index a37a50f..f26712c 100644 >> --- a/arch/arm/Makefile >> +++ b/arch/arm/Makefile >> @@ -268,6 +268,7 @@ core-$(CONFIG_KVM_ARM_HOST) += arch/arm/kvm/ >> core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ >> core-y += arch/arm/net/ >> core-y += arch/arm/crypto/ >> +core-y += arch/arm/firmware/ >> core-y += $(machdirs) $(platdirs) >> >> drivers-$(CONFIG_OPROFILE) += arch/arm/oprofile/ >> diff --git a/arch/arm/firmware/Kconfig b/arch/arm/firmware/Kconfig >> new file mode 100644 >> index 0000000..bb00ccf >> --- /dev/null >> +++ b/arch/arm/firmware/Kconfig >> @@ -0,0 +1,28 @@ >> +config ARCH_SUPPORTS_FIRMWARE >> + bool >> + >> +config ARCH_SUPPORTS_TRUSTED_FOUNDATIONS >> + bool >> + select ARCH_SUPPORTS_FIRMWARE >> + >> +menu "Firmware options" >> + depends on ARCH_SUPPORTS_FIRMWARE >> + >> +config TRUSTED_FOUNDATIONS >> + bool "Trusted Foundations secure monitor support" >> + depends on ARCH_SUPPORTS_TRUSTED_FOUNDATIONS >> + help >> + Some devices (including most Tegra-based consumer devices on the >> + market) are booted with the Trusted Foundations secure monitor >> + active, requiring some core operations to be performed by the secure >> + monitor instead of the kernel. >> + >> + This option allows the kernel to invoke the secure monitor whenever >> + required on devices using Trusted Foundations. See >> + arch/arm/include/asm/trusted_foundations.h or the >> + tl,trusted-foundations device tree binding documentation for details >> + on how to use it. >> + >> + Say n if you don't know what this is about. >> + >> +endmenu >> diff --git a/arch/arm/firmware/Makefile b/arch/arm/firmware/Makefile >> new file mode 100644 >> index 0000000..a71f165 >> --- /dev/null >> +++ b/arch/arm/firmware/Makefile >> @@ -0,0 +1 @@ >> +obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o >> diff --git a/arch/arm/firmware/trusted_foundations.c b/arch/arm/firmware/trusted_foundations.c >> new file mode 100644 >> index 0000000..c93c5e0 >> --- /dev/null >> +++ b/arch/arm/firmware/trusted_foundations.c >> @@ -0,0 +1,77 @@ >> +/* >> + * Trusted Foundations support for ARM CPUs >> + * >> + * Copyright (c) 2013, NVIDIA Corporation. >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License as published by >> + * the Free Software Foundation; either version 2 of the License, or >> + * (at your option) any later version. >> + * >> + * This program is distributed in the hope that it will be useful, but WITHOUT >> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or >> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for >> + * more details. >> + */ >> + >> +#include <linux/kernel.h> >> +#include <linux/init.h> >> +#include <linux/of.h> >> +#include <asm/firmware.h> >> +#include <asm/trusted_foundations.h> >> + >> +#define TF_SET_CPU_BOOT_ADDR_SMC 0xfffff200 >> + >> +static void __naked tf_generic_smc(u32 type, u32 subtype, u32 arg) >> +{ >> + asm volatile( >> + ".arch_extension sec\n\t" >> + "stmfd sp!, {r4 - r11, lr}\n\t" >> + __asmeq("%0", "r0") >> + __asmeq("%1", "r1") >> + __asmeq("%2", "r2") >> + "mov r3, #0\n\t" >> + "mov r4, #0\n\t" >> + "smc #0\n\t" >> + "ldmfd sp!, {r4 - r11, pc}" >> + : >> + : "r" (type), "r" (subtype), "r" (arg) >> + : "memory"); >> +} >> + >> +static int tf_set_cpu_boot_addr(int cpu, unsigned long boot_addr) >> +{ >> + tf_generic_smc(TF_SET_CPU_BOOT_ADDR_SMC, boot_addr, 0); >> + >> + return 0; >> +} >> + >> +static const struct firmware_ops trusted_foundations_ops = { >> + .set_cpu_boot_addr = tf_set_cpu_boot_addr, >> +}; >> + >> +void register_trusted_foundations(struct trusted_foundations_platform_data *pd) >> +{ >> + /* we are not using version information for now since currently >> + * supported SMCs are compatible with all TF releases */ >> + register_firmware_ops(&trusted_foundations_ops); >> +} >> + >> +void of_register_trusted_foundations(void) >> +{ >> + struct device_node *node; >> + struct trusted_foundations_platform_data pdata; >> + int err; >> + >> + node = of_find_compatible_node(NULL, NULL, "tl,trusted-foundations"); >> + if (!node) >> + return; >> + >> + err = of_property_read_u32(node, "version-major", &pdata.version_major); >> + if (err != 0) >> + panic("Trusted Foundation: missing version-major property\n"); >> + err = of_property_read_u32(node, "version-minor", &pdata.version_minor); >> + if (err != 0) >> + panic("Trusted Foundation: missing version-minor property\n"); >> + register_trusted_foundations(&pdata); >> +} >> diff --git a/arch/arm/include/asm/trusted_foundations.h b/arch/arm/include/asm/trusted_foundations.h >> new file mode 100644 >> index 0000000..749edbf >> --- /dev/null >> +++ b/arch/arm/include/asm/trusted_foundations.h >> @@ -0,0 +1,64 @@ >> +/* >> + * Copyright (c) 2013, NVIDIA Corporation. >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License as published by >> + * the Free Software Foundation; either version 2 of the License, or >> + * (at your option) any later version. >> + * >> + * This program is distributed in the hope that it will be useful, but WITHOUT >> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or >> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for >> + * more details. >> + */ >> + >> +/* >> + * Support for the Trusted Foundations secure monitor. >> + * >> + * Trusted Foundation comes active on some ARM consumer devices (most >> + * Tegra-based devices sold on the market are concerned). Such devices can only >> + * perform some basic operations, like setting the CPU reset vector, through >> + * SMC calls to the secure monitor. The calls are completely specific to >> + * Trusted Foundations, and do *not* follow the SMC calling convention or the >> + * PSCI standard. >> + */ >> + >> +#ifndef __ASM_ARM_TRUSTED_FOUNDATIONS_H >> +#define __ASM_ARM_TRUSTED_FOUNDATIONS_H >> + >> +#include <linux/kconfig.h> >> + >> +struct trusted_foundations_platform_data { >> + unsigned int version_major; >> + unsigned int version_minor; >> +}; >> + >> +#if IS_ENABLED(CONFIG_TRUSTED_FOUNDATIONS) >> + >> +void register_trusted_foundations(struct trusted_foundations_platform_data *pd); >> +void of_register_trusted_foundations(void); >> + >> +#else /* CONFIG_TRUSTED_FOUNDATIONS */ >> + >> +#include <linux/printk.h> >> +#include <linux/of.h> >> +#include <asm/bug.h> >> + >> +static inline void register_trusted_foundations( >> + struct trusted_foundations_platform_data *pd) >> +{ >> + /* If we try to register TF, this means the system needs it to continue. >> + * Its absence if thus a fatal error. */ >> + panic("No support for Trusted Foundations, stopping...\n"); >> +} >> + >> +static inline void of_register_trusted_foundations(void) >> +{ >> + /* If we find the target should enable TF but does not support it, >> + * fail as the system won't be able to do much anyway */ >> + if (of_find_compatible_node(NULL, NULL, "tl,trusted-foundations")) >> + register_trusted_foundations(NULL); >> +} >> +#endif /* CONFIG_TRUSTED_FOUNDATIONS */ > > The latter function can just be shortcut unto a local panic too. > > But do we really need to panic here? It's a PITA to debug since it'll > be a very early panic. I'd rather have the system log errors in dmesg > but continue booting with one cpu. Actually the first version of this series continued on one CPU if TF support was missing (as secondary CPUs would simply fail to boot), but IIRC Stephen advocated for the current behavior (panic) instead. I agree such an early panic is hard to debug, especially considering that most devices using TF (Tegra retail devices) do not even feature a serial port. On the other hand, if we continue booting in these conditions the system freezes as soon as cpuidle kicks in, so we won't be going very far anyway. However the console is up when it happens. Maybe if there is a way to disable the kernel features TF is supposed to manage (SMP & cpuidle at the moment) when registration fails, the system could continue more gracefully (even if on one leg) and warn the user about this condition. Stephen, can I have your thoughts on this? ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations 2013-10-10 20:58 ` Alexandre Courbot @ 2013-10-10 21:14 ` Kevin Hilman [not found] ` <CAAVeFuLvHdUuDurqA_=tvxJonNP+RekotM_MuysQrJD0PUgcSQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 1 sibling, 0 replies; 18+ messages in thread From: Kevin Hilman @ 2013-10-10 21:14 UTC (permalink / raw) To: Alexandre Courbot Cc: Olof Johansson, Alexandre Courbot, Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Arnd Bergmann, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org, linux-arm-kernel@lists.infradead.org Alexandre Courbot <gnurou@gmail.com> writes: > On Wed, Oct 9, 2013 at 4:47 PM, Olof Johansson <olof@lixom.net> wrote: >> On Fri, Oct 4, 2013 at 9:37 AM, Alexandre Courbot <acourbot@nvidia.com> wrote: [...] >>> +static inline void register_trusted_foundations( >>> + struct trusted_foundations_platform_data *pd) >>> +{ >>> + /* If we try to register TF, this means the system needs it to continue. >>> + * Its absence if thus a fatal error. */ >>> + panic("No support for Trusted Foundations, stopping...\n"); >>> +} >>> + >>> +static inline void of_register_trusted_foundations(void) >>> +{ >>> + /* If we find the target should enable TF but does not support it, >>> + * fail as the system won't be able to do much anyway */ >>> + if (of_find_compatible_node(NULL, NULL, "tl,trusted-foundations")) >>> + register_trusted_foundations(NULL); >>> +} >>> +#endif /* CONFIG_TRUSTED_FOUNDATIONS */ >> >> The latter function can just be shortcut unto a local panic too. >> >> But do we really need to panic here? It's a PITA to debug since it'll >> be a very early panic. I'd rather have the system log errors in dmesg >> but continue booting with one cpu. > > Actually the first version of this series continued on one CPU if TF > support was missing (as secondary CPUs would simply fail to boot), but > IIRC Stephen advocated for the current behavior (panic) instead. I > agree such an early panic is hard to debug, especially considering > that most devices using TF (Tegra retail devices) do not even feature > a serial port. > > On the other hand, if we continue booting in these conditions the > system freezes as soon as cpuidle kicks in, so we won't be going very > far anyway. However the console is up when it happens. cpu_idle_poll_ctrl(true) should solve that problem. Kevin > Maybe if there is a way to disable the kernel features TF is supposed > to manage (SMP & cpuidle at the moment) when registration fails, the > system could continue more gracefully (even if on one leg) and warn > the user about this condition. Stephen, can I have your thoughts on > this? ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <CAAVeFuLvHdUuDurqA_=tvxJonNP+RekotM_MuysQrJD0PUgcSQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations [not found] ` <CAAVeFuLvHdUuDurqA_=tvxJonNP+RekotM_MuysQrJD0PUgcSQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2013-10-10 22:22 ` Stephen Warren [not found] ` <5257288E.6000704-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org> 0 siblings, 1 reply; 18+ messages in thread From: Stephen Warren @ 2013-10-10 22:22 UTC (permalink / raw) To: Alexandre Courbot, Olof Johansson Cc: Alexandre Courbot, Russell King, Tomasz Figa, Dave Martin, Arnd Bergmann, Kevin Hilman, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org On 10/10/2013 02:58 PM, Alexandre Courbot wrote: > On Wed, Oct 9, 2013 at 4:47 PM, Olof Johansson <olof-nZhT3qVonbNeoWH0uzbU5w@public.gmane.org> wrote: >> On Fri, Oct 4, 2013 at 9:37 AM, Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> wrote: ... >> But do we really need to panic here? It's a PITA to debug since it'll >> be a very early panic. I'd rather have the system log errors in dmesg >> but continue booting with one cpu. > > Actually the first version of this series continued on one CPU if TF > support was missing (as secondary CPUs would simply fail to boot), but > IIRC Stephen advocated for the current behavior (panic) instead. I > agree such an early panic is hard to debug, especially considering > that most devices using TF (Tegra retail devices) do not even feature > a serial port. > > On the other hand, if we continue booting in these conditions the > system freezes as soon as cpuidle kicks in, so we won't be going very > far anyway. However the console is up when it happens. > > Maybe if there is a way to disable the kernel features TF is supposed > to manage (SMP & cpuidle at the moment) when registration fails, the > system could continue more gracefully (even if on one leg) and warn > the user about this condition. Stephen, can I have your thoughts on > this? If we can disable the features that rely on TF/secure-mode when support is missing, then doing that rather than panic is fine. We do something similar for PCIe on Tegra20, where LP2 cpuidle state must be disabled or PCIe interrupts won't work. I would be inclined to merge the patch as-is right now, since it's only enabling a new feature that won't see any regressions due to this panic, and then add the disable-other-features with a separate patch/series later. Does that seem reasonable? ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <5257288E.6000704-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>]
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations [not found] ` <5257288E.6000704-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org> @ 2013-10-10 22:25 ` Olof Johansson 2013-10-10 22:28 ` Alexandre Courbot 1 sibling, 0 replies; 18+ messages in thread From: Olof Johansson @ 2013-10-10 22:25 UTC (permalink / raw) To: Stephen Warren Cc: Alexandre Courbot, Alexandre Courbot, Russell King, Tomasz Figa, Dave Martin, Arnd Bergmann, Kevin Hilman, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org On Thu, Oct 10, 2013 at 3:22 PM, Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org> wrote: > On 10/10/2013 02:58 PM, Alexandre Courbot wrote: >> On Wed, Oct 9, 2013 at 4:47 PM, Olof Johansson <olof-nZhT3qVonbNeoWH0uzbU5w@public.gmane.org> wrote: >>> On Fri, Oct 4, 2013 at 9:37 AM, Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> wrote: > ... >>> But do we really need to panic here? It's a PITA to debug since it'll >>> be a very early panic. I'd rather have the system log errors in dmesg >>> but continue booting with one cpu. >> >> Actually the first version of this series continued on one CPU if TF >> support was missing (as secondary CPUs would simply fail to boot), but >> IIRC Stephen advocated for the current behavior (panic) instead. I >> agree such an early panic is hard to debug, especially considering >> that most devices using TF (Tegra retail devices) do not even feature >> a serial port. >> >> On the other hand, if we continue booting in these conditions the >> system freezes as soon as cpuidle kicks in, so we won't be going very >> far anyway. However the console is up when it happens. >> >> Maybe if there is a way to disable the kernel features TF is supposed >> to manage (SMP & cpuidle at the moment) when registration fails, the >> system could continue more gracefully (even if on one leg) and warn >> the user about this condition. Stephen, can I have your thoughts on >> this? > > If we can disable the features that rely on TF/secure-mode when support > is missing, then doing that rather than panic is fine. We do something > similar for PCIe on Tegra20, where LP2 cpuidle state must be disabled or > PCIe interrupts won't work. > > I would be inclined to merge the patch as-is right now, since it's only > enabling a new feature that won't see any regressions due to this panic, > and then add the disable-other-features with a separate patch/series > later. Does that seem reasonable? Yes, I tried to make that clear with my initial feedback: I think it would be good to get away from the panic, but we can merge with it now and fix it with later patches. -Olof ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v7 1/5] ARM: add basic support for Trusted Foundations [not found] ` <5257288E.6000704-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org> 2013-10-10 22:25 ` Olof Johansson @ 2013-10-10 22:28 ` Alexandre Courbot 1 sibling, 0 replies; 18+ messages in thread From: Alexandre Courbot @ 2013-10-10 22:28 UTC (permalink / raw) To: Stephen Warren Cc: Olof Johansson, Alexandre Courbot, Russell King, Tomasz Figa, Dave Martin, Arnd Bergmann, Kevin Hilman, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org On Thu, Oct 10, 2013 at 3:22 PM, Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org> wrote: > On 10/10/2013 02:58 PM, Alexandre Courbot wrote: >> On Wed, Oct 9, 2013 at 4:47 PM, Olof Johansson <olof-nZhT3qVonbNeoWH0uzbU5w@public.gmane.org> wrote: >>> On Fri, Oct 4, 2013 at 9:37 AM, Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> wrote: > ... >>> But do we really need to panic here? It's a PITA to debug since it'll >>> be a very early panic. I'd rather have the system log errors in dmesg >>> but continue booting with one cpu. >> >> Actually the first version of this series continued on one CPU if TF >> support was missing (as secondary CPUs would simply fail to boot), but >> IIRC Stephen advocated for the current behavior (panic) instead. I >> agree such an early panic is hard to debug, especially considering >> that most devices using TF (Tegra retail devices) do not even feature >> a serial port. >> >> On the other hand, if we continue booting in these conditions the >> system freezes as soon as cpuidle kicks in, so we won't be going very >> far anyway. However the console is up when it happens. >> >> Maybe if there is a way to disable the kernel features TF is supposed >> to manage (SMP & cpuidle at the moment) when registration fails, the >> system could continue more gracefully (even if on one leg) and warn >> the user about this condition. Stephen, can I have your thoughts on >> this? > > If we can disable the features that rely on TF/secure-mode when support > is missing, then doing that rather than panic is fine. We do something > similar for PCIe on Tegra20, where LP2 cpuidle state must be disabled or > PCIe interrupts won't work. > > I would be inclined to merge the patch as-is right now, since it's only > enabling a new feature that won't see any regressions due to this panic, > and then add the disable-other-features with a separate patch/series > later. Does that seem reasonable? According to Olof we should also be moving the DT node under /firmware, so I guess another revision is in order to at least get this part right. 3.12 also added a powered-down cpuidle state for Tegra which freezes the system if TF is enabled as the firmware driver does not support idle yet, but this can be fixed later. -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 2/5] ARM: tegra: add support for Trusted Foundations 2013-10-04 16:37 [PATCH v7 0/5] ARM: support for Trusted Foundations secure monito Alexandre Courbot 2013-10-04 16:37 ` [PATCH v7 1/5] ARM: add basic support for Trusted Foundations Alexandre Courbot @ 2013-10-04 16:37 ` Alexandre Courbot [not found] ` <1380904635-18113-1-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> ` (2 subsequent siblings) 4 siblings, 0 replies; 18+ messages in thread From: Alexandre Courbot @ 2013-10-04 16:37 UTC (permalink / raw) To: Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Olof Johansson, Arnd Bergmann, Kevin Hilman Cc: gnurou, devicetree, linux-kernel, Alexandre Courbot, linux-tegra, linux-arm-kernel Register the firmware operations for Trusted Foundations if the device tree indicates it is active on the device. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Tomasz Figa <t.figa@samsung.com> Reviewed-by: Stephen Warren <swarren@nvidia.com> --- Documentation/devicetree/bindings/arm/tegra.txt | 5 +++++ arch/arm/mach-tegra/Kconfig | 1 + arch/arm/mach-tegra/common.c | 2 ++ 3 files changed, 8 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/tegra.txt b/Documentation/devicetree/bindings/arm/tegra.txt index ed9c853..8e51884 100644 --- a/Documentation/devicetree/bindings/arm/tegra.txt +++ b/Documentation/devicetree/bindings/arm/tegra.txt @@ -32,3 +32,8 @@ board-specific compatible values: nvidia,whistler toradex,colibri_t20-512 toradex,iris + +Trusted Foundations +------------------------------------------- +Tegra supports the Trusted Foundation secure monitor. See the +"tl,trusted-foundations" binding's documentation for more details. diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 67a76f2..4e51278 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -2,6 +2,7 @@ config ARCH_TEGRA bool "NVIDIA Tegra" if ARCH_MULTI_V7 select ARCH_HAS_CPUFREQ select ARCH_REQUIRE_GPIOLIB + select ARCH_SUPPORTS_TRUSTED_FOUNDATIONS select ARM_GIC select CLKDEV_LOOKUP select CLKSRC_MMIO diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 94a119a..b405e45 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c @@ -27,6 +27,7 @@ #include <linux/clk-provider.h> #include <asm/hardware/cache-l2x0.h> +#include <asm/trusted_foundations.h> #include "board.h" #include "common.h" @@ -99,6 +100,7 @@ static void __init tegra_init_cache(void) void __init tegra_init_early(void) { + of_register_trusted_foundations(); tegra_cpu_reset_handler_init(); tegra_apb_io_init(); tegra_init_fuse(); -- 1.8.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
[parent not found: <1380904635-18113-1-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>]
* [PATCH v7 3/5] ARM: tegra: split setting of CPU reset handler [not found] ` <1380904635-18113-1-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> @ 2013-10-04 16:37 ` Alexandre Courbot 2013-10-06 18:11 ` [PATCH v7 0/5] ARM: support for Trusted Foundations secure monito Alex Courbot 1 sibling, 0 replies; 18+ messages in thread From: Alexandre Courbot @ 2013-10-04 16:37 UTC (permalink / raw) To: Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Olof Johansson, Arnd Bergmann, Kevin Hilman Cc: gnurou-Re5JQEeQqe8AvxtiuMwx3w, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Alexandre Courbot Not all Tegra devices can set the CPU reset handler in the same way. In particular, devices using a TrustZone secure monitor cannot set the reset handler directly and need to do it through a firmware operation. This patch separates the act of setting the reset handler from its preparation, so the former can be implemented in a different way. Signed-off-by: Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> Reviewed-by: Tomasz Figa <t.figa-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Reviewed-by: Stephen Warren <swarren-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> --- arch/arm/mach-tegra/reset.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/arch/arm/mach-tegra/reset.c b/arch/arm/mach-tegra/reset.c index fd0bbf8..e282395 100644 --- a/arch/arm/mach-tegra/reset.c +++ b/arch/arm/mach-tegra/reset.c @@ -33,26 +33,18 @@ static bool is_enabled; -static void __init tegra_cpu_reset_handler_enable(void) +static void __init tegra_cpu_reset_handler_set(const u32 reset_address) { - void __iomem *iram_base = IO_ADDRESS(TEGRA_IRAM_RESET_BASE); void __iomem *evp_cpu_reset = IO_ADDRESS(TEGRA_EXCEPTION_VECTORS_BASE + 0x100); void __iomem *sb_ctrl = IO_ADDRESS(TEGRA_SB_BASE); u32 reg; - BUG_ON(is_enabled); - BUG_ON(tegra_cpu_reset_handler_size > TEGRA_IRAM_RESET_HANDLER_SIZE); - - memcpy(iram_base, (void *)__tegra_cpu_reset_handler_start, - tegra_cpu_reset_handler_size); - /* * NOTE: This must be the one and only write to the EVP CPU reset * vector in the entire system. */ - writel(TEGRA_IRAM_RESET_BASE + tegra_cpu_reset_handler_offset, - evp_cpu_reset); + writel(reset_address, evp_cpu_reset); wmb(); reg = readl(evp_cpu_reset); @@ -66,6 +58,21 @@ static void __init tegra_cpu_reset_handler_enable(void) writel(reg, sb_ctrl); wmb(); } +} + +static void __init tegra_cpu_reset_handler_enable(void) +{ + void __iomem *iram_base = IO_ADDRESS(TEGRA_IRAM_RESET_BASE); + const u32 reset_address = TEGRA_IRAM_RESET_BASE + + tegra_cpu_reset_handler_offset; + + BUG_ON(is_enabled); + BUG_ON(tegra_cpu_reset_handler_size > TEGRA_IRAM_RESET_HANDLER_SIZE); + + memcpy(iram_base, (void *)__tegra_cpu_reset_handler_start, + tegra_cpu_reset_handler_size); + + tegra_cpu_reset_handler_set(reset_address); is_enabled = true; } -- 1.8.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v7 0/5] ARM: support for Trusted Foundations secure monito [not found] ` <1380904635-18113-1-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> 2013-10-04 16:37 ` [PATCH v7 3/5] ARM: tegra: split setting of CPU reset handler Alexandre Courbot @ 2013-10-06 18:11 ` Alex Courbot 1 sibling, 0 replies; 18+ messages in thread From: Alex Courbot @ 2013-10-06 18:11 UTC (permalink / raw) To: Alexandre Courbot, Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Olof Johansson, Arnd Bergmann, Kevin Hilman Cc: gnurou-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org On 10/04/2013 09:37 AM, Alexandre Courbot wrote: > Hopefully final version of this patchset. If I'm not mistaken the last thing > that prevents Stephen from merging it is Russel's Ack. Russel, could you check > it? Oops. s/Russel/Russell/g, with apologies for the continuous misspelling. m(__)m Alex. -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 4/5] ARM: tegra: set CPU reset handler with firmware op 2013-10-04 16:37 [PATCH v7 0/5] ARM: support for Trusted Foundations secure monito Alexandre Courbot ` (2 preceding siblings ...) [not found] ` <1380904635-18113-1-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> @ 2013-10-04 16:37 ` Alexandre Courbot 2013-10-04 16:37 ` [PATCH v7 5/5] ARM: tegra: support Trusted Foundations by default Alexandre Courbot 4 siblings, 0 replies; 18+ messages in thread From: Alexandre Courbot @ 2013-10-04 16:37 UTC (permalink / raw) To: Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Olof Johansson, Arnd Bergmann, Kevin Hilman Cc: gnurou, devicetree, linux-kernel, linux-tegra, linux-arm-kernel, Alexandre Courbot Use a firmware operation to set the CPU reset handler and only resort to doing it ourselves if there is none defined. This supports the booting of secondary CPUs on devices using a TrustZone secure monitor. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Tomasz Figa <t.figa@samsung.com> Reviewed-by: Stephen Warren <swarren@nvidia.com> --- arch/arm/mach-tegra/reset.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-tegra/reset.c b/arch/arm/mach-tegra/reset.c index e282395..368af0a 100644 --- a/arch/arm/mach-tegra/reset.c +++ b/arch/arm/mach-tegra/reset.c @@ -21,6 +21,7 @@ #include <asm/cacheflush.h> #include <asm/hardware/cache-l2x0.h> +#include <asm/firmware.h> #include "iomap.h" #include "irammap.h" @@ -65,6 +66,7 @@ static void __init tegra_cpu_reset_handler_enable(void) void __iomem *iram_base = IO_ADDRESS(TEGRA_IRAM_RESET_BASE); const u32 reset_address = TEGRA_IRAM_RESET_BASE + tegra_cpu_reset_handler_offset; + int err; BUG_ON(is_enabled); BUG_ON(tegra_cpu_reset_handler_size > TEGRA_IRAM_RESET_HANDLER_SIZE); @@ -72,9 +74,18 @@ static void __init tegra_cpu_reset_handler_enable(void) memcpy(iram_base, (void *)__tegra_cpu_reset_handler_start, tegra_cpu_reset_handler_size); - tegra_cpu_reset_handler_set(reset_address); - - is_enabled = true; + err = call_firmware_op(set_cpu_boot_addr, 0, reset_address); + switch (err) { + case -ENOSYS: + tegra_cpu_reset_handler_set(reset_address); + /* pass-through */ + case 0: + is_enabled = true; + break; + default: + pr_crit("Cannot set CPU reset handler: %d\n", err); + BUG(); + } } void __init tegra_cpu_reset_handler_init(void) -- 1.8.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v7 5/5] ARM: tegra: support Trusted Foundations by default 2013-10-04 16:37 [PATCH v7 0/5] ARM: support for Trusted Foundations secure monito Alexandre Courbot ` (3 preceding siblings ...) 2013-10-04 16:37 ` [PATCH v7 4/5] ARM: tegra: set CPU reset handler with firmware op Alexandre Courbot @ 2013-10-04 16:37 ` Alexandre Courbot 4 siblings, 0 replies; 18+ messages in thread From: Alexandre Courbot @ 2013-10-04 16:37 UTC (permalink / raw) To: Russell King, Stephen Warren, Tomasz Figa, Dave Martin, Olof Johansson, Arnd Bergmann, Kevin Hilman Cc: gnurou, devicetree, linux-kernel, linux-tegra, linux-arm-kernel, Alexandre Courbot Support for Trusted Foundations is light and allows the kernel to run on a wider range of devices, so enable it by default. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Tomasz Figa <t.figa@samsung.com> Reviewed-by: Stephen Warren <swarren@nvidia.com> --- arch/arm/configs/tegra_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/configs/tegra_defconfig b/arch/arm/configs/tegra_defconfig index ea042e8..dddb97b 100644 --- a/arch/arm/configs/tegra_defconfig +++ b/arch/arm/configs/tegra_defconfig @@ -32,6 +32,7 @@ CONFIG_PCI=y CONFIG_PCI_MSI=y CONFIG_PCI_TEGRA=y CONFIG_PCIEPORTBUS=y +CONFIG_TRUSTED_FOUNDATIONS=y CONFIG_SMP=y CONFIG_PREEMPT=y CONFIG_AEABI=y -- 1.8.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
end of thread, other threads:[~2013-10-10 22:28 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-10-04 16:37 [PATCH v7 0/5] ARM: support for Trusted Foundations secure monito Alexandre Courbot 2013-10-04 16:37 ` [PATCH v7 1/5] ARM: add basic support for Trusted Foundations Alexandre Courbot 2013-10-08 8:17 ` Michal Simek [not found] ` <5253BF8E.4050802-pSz03upnqPeHXe+LvDLADg@public.gmane.org> 2013-10-09 23:45 ` Olof Johansson [not found] ` <CAOesGMjtHBft71nJUEc7K+2UA_LiWBOVWpbYvJDOnF=NLepLLw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2013-10-10 5:18 ` Michal Simek [not found] ` <1380904635-18113-2-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> 2013-10-07 18:16 ` Kevin Hilman 2013-10-07 19:28 ` Stephen Warren 2013-10-09 23:47 ` Olof Johansson [not found] ` <CAOesGMj74Pui1V5O7zxEipM5Hg6nboVTUCFuMY0c0aUh=wuu3Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2013-10-10 20:58 ` Alexandre Courbot 2013-10-10 21:14 ` Kevin Hilman [not found] ` <CAAVeFuLvHdUuDurqA_=tvxJonNP+RekotM_MuysQrJD0PUgcSQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2013-10-10 22:22 ` Stephen Warren [not found] ` <5257288E.6000704-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org> 2013-10-10 22:25 ` Olof Johansson 2013-10-10 22:28 ` Alexandre Courbot 2013-10-04 16:37 ` [PATCH v7 2/5] ARM: tegra: add " Alexandre Courbot [not found] ` <1380904635-18113-1-git-send-email-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> 2013-10-04 16:37 ` [PATCH v7 3/5] ARM: tegra: split setting of CPU reset handler Alexandre Courbot 2013-10-06 18:11 ` [PATCH v7 0/5] ARM: support for Trusted Foundations secure monito Alex Courbot 2013-10-04 16:37 ` [PATCH v7 4/5] ARM: tegra: set CPU reset handler with firmware op Alexandre Courbot 2013-10-04 16:37 ` [PATCH v7 5/5] ARM: tegra: support Trusted Foundations by default Alexandre Courbot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).