1/* 2 * Copyright (c) 2013, NVIDIA Corporation. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 */ 14 15/* 16 * Support for the Trusted Foundations secure monitor. 17 * 18 * Trusted Foundation comes active on some ARM consumer devices (most 19 * Tegra-based devices sold on the market are concerned). Such devices can only 20 * perform some basic operations, like setting the CPU reset vector, through 21 * SMC calls to the secure monitor. The calls are completely specific to 22 * Trusted Foundations, and do *not* follow the SMC calling convention or the 23 * PSCI standard. 24 */ 25 26#ifndef __ASM_ARM_TRUSTED_FOUNDATIONS_H 27#define __ASM_ARM_TRUSTED_FOUNDATIONS_H 28 29#include <linux/printk.h> 30#include <linux/bug.h> 31#include <linux/of.h> 32#include <linux/cpu.h> 33#include <linux/smp.h> 34 35struct trusted_foundations_platform_data { 36 unsigned int version_major; 37 unsigned int version_minor; 38}; 39 40#if IS_ENABLED(CONFIG_TRUSTED_FOUNDATIONS) 41 42void register_trusted_foundations(struct trusted_foundations_platform_data *pd); 43void of_register_trusted_foundations(void); 44 45#else /* CONFIG_TRUSTED_FOUNDATIONS */ 46 47static inline void register_trusted_foundations( 48 struct trusted_foundations_platform_data *pd) 49{ 50 /* 51 * If the system requires TF and we cannot provide it, continue booting 52 * but disable features that cannot be provided. 53 */ 54 pr_err("No support for Trusted Foundations, continuing in degraded mode.\n"); 55 pr_err("Secondary processors as well as CPU PM will be disabled.\n"); 56#if IS_ENABLED(CONFIG_SMP) 57 setup_max_cpus = 0; 58#endif 59 cpu_idle_poll_ctrl(true); 60} 61 62static inline void of_register_trusted_foundations(void) 63{ 64 /* 65 * If we find the target should enable TF but does not support it, 66 * fail as the system won't be able to do much anyway 67 */ 68 if (of_find_compatible_node(NULL, NULL, "tlm,trusted-foundations")) 69 register_trusted_foundations(NULL); 70} 71#endif /* CONFIG_TRUSTED_FOUNDATIONS */ 72 73#endif 74