diff options
author | Andy Gross <andy.gross@linaro.org> | 2017-04-04 15:32:31 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-04-12 06:41:21 -0400 |
commit | 007f0a2f2c0fcfa9ecef016c0910aebd0b784fdd (patch) | |
tree | 9b5ec2f51c3f7b6c3ecdd587da358d77de6d2bac /arch/arm | |
parent | 703f48a1c302f66e686535355092116ebaeccaad (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.c | 4 | ||||
-rw-r--r-- | arch/arm/kernel/smccc-call.S | 14 |
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 |
181 | EXPORT_SYMBOL(arm_smccc_smc); | 181 | EXPORT_SYMBOL(__arm_smccc_smc); |
182 | EXPORT_SYMBOL(arm_smccc_hvc); | 182 | EXPORT_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 | */ |
51 | ENTRY(arm_smccc_smc) | 52 | ENTRY(__arm_smccc_smc) |
52 | SMCCC SMCCC_SMC | 53 | SMCCC SMCCC_SMC |
53 | ENDPROC(arm_smccc_smc) | 54 | ENDPROC(__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 | */ |
60 | ENTRY(arm_smccc_hvc) | 62 | ENTRY(__arm_smccc_hvc) |
61 | SMCCC SMCCC_HVC | 63 | SMCCC SMCCC_HVC |
62 | ENDPROC(arm_smccc_hvc) | 64 | ENDPROC(__arm_smccc_hvc) |