-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'tegra-for-3.14-trusted-foundations' of git://git.kernel.or…
…g/pub/scm/linux/kernel/git/tegra/linux into next/drivers From Stephen Warren: ARM: tegra: Trusted Foundations firmware support Add support for the Trusted Foundations secure-mode firmware, as found on NVIDIA SHIELD. This allows Linux to run in non-secure mode on this board; all previous Tegra support has assumed the kernel is running in secure mode. (The base TF support has been discussed back and forth a lot; for now the most logical place for it seems to be under arch/arm, so we're adding it here. We can move it out to a common location in the future if needed). * tag 'tegra-for-3.14-trusted-foundations' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux: ARM: tegra: support Trusted Foundations by default ARM: tegra: set CPU reset handler using firmware ARM: tegra: split setting of CPU reset handler ARM: tegra: add support for Trusted Foundations of: add Trusted Foundations bindings documentation of: add vendor prefix for Trusted Logic Mobility ARM: add basic support for Trusted Foundations Signed-off-by: Olof Johansson <olof@lixom.net>
- Loading branch information
Showing
13 changed files
with
239 additions
and
11 deletions.
There are no files selected for viewing
20 changes: 20 additions & 0 deletions
20
Documentation/devicetree/bindings/arm/firmware/tlm,trusted-foundations.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
Trusted Foundations | ||
------------------- | ||
|
||
Boards that use the Trusted Foundations secure monitor can signal its | ||
presence by declaring a node compatible with "tlm,trusted-foundations" | ||
under the /firmware/ node | ||
|
||
Required properties: | ||
- compatible: "tlm,trusted-foundations" | ||
- tlm,version-major: major version number of Trusted Foundations firmware | ||
- tlm,version-minor: minor version number of Trusted Foundations firmware | ||
|
||
Example: | ||
firmware { | ||
trusted-foundations { | ||
compatible = "tlm,trusted-foundations"; | ||
tlm,version-major = <2>; | ||
tlm,version-minor = <8>; | ||
}; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
/* | ||
* 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 arg1, u32 arg2) | ||
{ | ||
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" (arg1), "r" (arg2) | ||
: "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, "tlm,trusted-foundations"); | ||
if (!node) | ||
return; | ||
|
||
err = of_property_read_u32(node, "tlm,version-major", | ||
&pdata.version_major); | ||
if (err != 0) | ||
panic("Trusted Foundation: missing version-major property\n"); | ||
err = of_property_read_u32(node, "tlm,version-minor", | ||
&pdata.version_minor); | ||
if (err != 0) | ||
panic("Trusted Foundation: missing version-minor property\n"); | ||
register_trusted_foundations(&pdata); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
* 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> | ||
#include <linux/printk.h> | ||
#include <linux/bug.h> | ||
#include <linux/of.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 */ | ||
|
||
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters