aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorAndy Gross <andy.gross@linaro.org>2017-04-04 15:32:31 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-04-12 06:41:21 -0400
commit007f0a2f2c0fcfa9ecef016c0910aebd0b784fdd (patch)
tree9b5ec2f51c3f7b6c3ecdd587da358d77de6d2bac /arch/arm
parent703f48a1c302f66e686535355092116ebaeccaad (diff)
arm: kernel: Add SMC structure parameter
[ Upstream commit 680a0873e193bae666439f4b5e32c758e68f114c ] This patch adds a quirk parameter to the arm_smccc_(smc/hvc) calls. The quirk structure allows for specialized SMC operations due to SoC specific requirements. The current arm_smccc_(smc/hvc) is renamed and macros are used instead to specify the standard arm_smccc_(smc/hvc) or the arm_smccc_(smc/hvc)_quirk function. This patch and partial implementation was suggested by Will Deacon. Signed-off-by: Andy Gross <andy.gross@linaro.org> Reviewed-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Sasha Levin <alexander.levin@verizon.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/kernel/armksyms.c4
-rw-r--r--arch/arm/kernel/smccc-call.S14
2 files changed, 10 insertions, 8 deletions
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c
index 7e45f69a0ddc..8e8d20cdbce7 100644
--- a/arch/arm/kernel/armksyms.c
+++ b/arch/arm/kernel/armksyms.c
@@ -178,6 +178,6 @@ EXPORT_SYMBOL(__pv_offset);
178#endif 178#endif
179 179
180#ifdef CONFIG_HAVE_ARM_SMCCC 180#ifdef CONFIG_HAVE_ARM_SMCCC
181EXPORT_SYMBOL(arm_smccc_smc); 181EXPORT_SYMBOL(__arm_smccc_smc);
182EXPORT_SYMBOL(arm_smccc_hvc); 182EXPORT_SYMBOL(__arm_smccc_hvc);
183#endif 183#endif
diff --git a/arch/arm/kernel/smccc-call.S b/arch/arm/kernel/smccc-call.S
index 2e48b674aab1..e5d43066b889 100644
--- a/arch/arm/kernel/smccc-call.S
+++ b/arch/arm/kernel/smccc-call.S
@@ -46,17 +46,19 @@ UNWIND( .fnend)
46/* 46/*
47 * void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2, 47 * void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
48 * unsigned long a3, unsigned long a4, unsigned long a5, 48 * unsigned long a3, unsigned long a4, unsigned long a5,
49 * unsigned long a6, unsigned long a7, struct arm_smccc_res *res) 49 * unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
50 * struct arm_smccc_quirk *quirk)
50 */ 51 */
51ENTRY(arm_smccc_smc) 52ENTRY(__arm_smccc_smc)
52 SMCCC SMCCC_SMC 53 SMCCC SMCCC_SMC
53ENDPROC(arm_smccc_smc) 54ENDPROC(__arm_smccc_smc)
54 55
55/* 56/*
56 * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2, 57 * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
57 * unsigned long a3, unsigned long a4, unsigned long a5, 58 * unsigned long a3, unsigned long a4, unsigned long a5,
58 * unsigned long a6, unsigned long a7, struct arm_smccc_res *res) 59 * unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
60 * struct arm_smccc_quirk *quirk)
59 */ 61 */
60ENTRY(arm_smccc_hvc) 62ENTRY(__arm_smccc_hvc)
61 SMCCC SMCCC_HVC 63 SMCCC SMCCC_HVC
62ENDPROC(arm_smccc_hvc) 64ENDPROC(__arm_smccc_hvc)