Skip to content

Commit dcac930

Browse files
author
Marc Zyngier
committed
Merge remote-tracking branch 'arm64/for-next/smccc-conduit-cleanup' into kvm-arm64/stolen-time
2 parents 4f5cafb + e6ea465 commit dcac930

File tree

8 files changed

+57
-60
lines changed

8 files changed

+57
-60
lines changed

arch/arm/mm/proc-v7-bugs.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// SPDX-License-Identifier: GPL-2.0
22
#include <linux/arm-smccc.h>
33
#include <linux/kernel.h>
4-
#include <linux/psci.h>
54
#include <linux/smp.h>
65

76
#include <asm/cp15.h>
@@ -75,11 +74,8 @@ static void cpu_v7_spectre_init(void)
7574
case ARM_CPU_PART_CORTEX_A72: {
7675
struct arm_smccc_res res;
7776

78-
if (psci_ops.smccc_version == SMCCC_VERSION_1_0)
79-
break;
80-
81-
switch (psci_ops.conduit) {
82-
case PSCI_CONDUIT_HVC:
77+
switch (arm_smccc_1_1_get_conduit()) {
78+
case SMCCC_CONDUIT_HVC:
8379
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
8480
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
8581
if ((int)res.a0 != 0)
@@ -90,7 +86,7 @@ static void cpu_v7_spectre_init(void)
9086
spectre_v2_method = "hypervisor";
9187
break;
9288

93-
case PSCI_CONDUIT_SMC:
89+
case SMCCC_CONDUIT_SMC:
9490
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
9591
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
9692
if ((int)res.a0 != 0)

arch/arm64/kernel/cpu_errata.c

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
*/
77

88
#include <linux/arm-smccc.h>
9-
#include <linux/psci.h>
109
#include <linux/types.h>
1110
#include <linux/cpu.h>
1211
#include <asm/cpu.h>
@@ -166,9 +165,7 @@ static void install_bp_hardening_cb(bp_hardening_cb_t fn,
166165
}
167166
#endif /* CONFIG_KVM_INDIRECT_VECTORS */
168167

169-
#include <uapi/linux/psci.h>
170168
#include <linux/arm-smccc.h>
171-
#include <linux/psci.h>
172169

173170
static void call_smc_arch_workaround_1(void)
174171
{
@@ -212,11 +209,8 @@ static int detect_harden_bp_fw(void)
212209
struct arm_smccc_res res;
213210
u32 midr = read_cpuid_id();
214211

215-
if (psci_ops.smccc_version == SMCCC_VERSION_1_0)
216-
return -1;
217-
218-
switch (psci_ops.conduit) {
219-
case PSCI_CONDUIT_HVC:
212+
switch (arm_smccc_1_1_get_conduit()) {
213+
case SMCCC_CONDUIT_HVC:
220214
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
221215
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
222216
switch ((int)res.a0) {
@@ -234,7 +228,7 @@ static int detect_harden_bp_fw(void)
234228
}
235229
break;
236230

237-
case PSCI_CONDUIT_SMC:
231+
case SMCCC_CONDUIT_SMC:
238232
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
239233
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
240234
switch ((int)res.a0) {
@@ -308,11 +302,11 @@ void __init arm64_update_smccc_conduit(struct alt_instr *alt,
308302

309303
BUG_ON(nr_inst != 1);
310304

311-
switch (psci_ops.conduit) {
312-
case PSCI_CONDUIT_HVC:
305+
switch (arm_smccc_1_1_get_conduit()) {
306+
case SMCCC_CONDUIT_HVC:
313307
insn = aarch64_insn_get_hvc_value();
314308
break;
315-
case PSCI_CONDUIT_SMC:
309+
case SMCCC_CONDUIT_SMC:
316310
insn = aarch64_insn_get_smc_value();
317311
break;
318312
default:
@@ -351,12 +345,12 @@ void arm64_set_ssbd_mitigation(bool state)
351345
return;
352346
}
353347

354-
switch (psci_ops.conduit) {
355-
case PSCI_CONDUIT_HVC:
348+
switch (arm_smccc_1_1_get_conduit()) {
349+
case SMCCC_CONDUIT_HVC:
356350
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_WORKAROUND_2, state, NULL);
357351
break;
358352

359-
case PSCI_CONDUIT_SMC:
353+
case SMCCC_CONDUIT_SMC:
360354
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_WORKAROUND_2, state, NULL);
361355
break;
362356

@@ -390,20 +384,13 @@ static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry,
390384
goto out_printmsg;
391385
}
392386

393-
if (psci_ops.smccc_version == SMCCC_VERSION_1_0) {
394-
ssbd_state = ARM64_SSBD_UNKNOWN;
395-
if (!this_cpu_safe)
396-
__ssb_safe = false;
397-
return false;
398-
}
399-
400-
switch (psci_ops.conduit) {
401-
case PSCI_CONDUIT_HVC:
387+
switch (arm_smccc_1_1_get_conduit()) {
388+
case SMCCC_CONDUIT_HVC:
402389
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
403390
ARM_SMCCC_ARCH_WORKAROUND_2, &res);
404391
break;
405392

406-
case PSCI_CONDUIT_SMC:
393+
case SMCCC_CONDUIT_SMC:
407394
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
408395
ARM_SMCCC_ARCH_WORKAROUND_2, &res);
409396
break;

arch/arm64/kernel/sdei.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Copyright (C) 2017 Arm Ltd.
33
#define pr_fmt(fmt) "sdei: " fmt
44

5+
#include <linux/arm-smccc.h>
56
#include <linux/arm_sdei.h>
67
#include <linux/hardirq.h>
78
#include <linux/irqflags.h>
@@ -161,7 +162,7 @@ unsigned long sdei_arch_get_entry_point(int conduit)
161162
return 0;
162163
}
163164

164-
sdei_exit_mode = (conduit == CONDUIT_HVC) ? SDEI_EXIT_HVC : SDEI_EXIT_SMC;
165+
sdei_exit_mode = (conduit == SMCCC_CONDUIT_HVC) ? SDEI_EXIT_HVC : SDEI_EXIT_SMC;
165166

166167
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
167168
if (arm64_kernel_unmapped_at_el0()) {

drivers/firmware/arm_sdei.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -967,29 +967,29 @@ static int sdei_get_conduit(struct platform_device *pdev)
967967
if (np) {
968968
if (of_property_read_string(np, "method", &method)) {
969969
pr_warn("missing \"method\" property\n");
970-
return CONDUIT_INVALID;
970+
return SMCCC_CONDUIT_NONE;
971971
}
972972

973973
if (!strcmp("hvc", method)) {
974974
sdei_firmware_call = &sdei_smccc_hvc;
975-
return CONDUIT_HVC;
975+
return SMCCC_CONDUIT_HVC;
976976
} else if (!strcmp("smc", method)) {
977977
sdei_firmware_call = &sdei_smccc_smc;
978-
return CONDUIT_SMC;
978+
return SMCCC_CONDUIT_SMC;
979979
}
980980

981981
pr_warn("invalid \"method\" property: %s\n", method);
982982
} else if (IS_ENABLED(CONFIG_ACPI) && !acpi_disabled) {
983983
if (acpi_psci_use_hvc()) {
984984
sdei_firmware_call = &sdei_smccc_hvc;
985-
return CONDUIT_HVC;
985+
return SMCCC_CONDUIT_HVC;
986986
} else {
987987
sdei_firmware_call = &sdei_smccc_smc;
988-
return CONDUIT_SMC;
988+
return SMCCC_CONDUIT_SMC;
989989
}
990990
}
991991

992-
return CONDUIT_INVALID;
992+
return SMCCC_CONDUIT_NONE;
993993
}
994994

995995
static int sdei_probe(struct platform_device *pdev)

drivers/firmware/psci/psci.c

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,18 @@ bool psci_tos_resident_on(int cpu)
5353
}
5454

5555
struct psci_operations psci_ops = {
56-
.conduit = PSCI_CONDUIT_NONE,
56+
.conduit = SMCCC_CONDUIT_NONE,
5757
.smccc_version = SMCCC_VERSION_1_0,
5858
};
5959

60+
enum arm_smccc_conduit arm_smccc_1_1_get_conduit(void)
61+
{
62+
if (psci_ops.smccc_version < SMCCC_VERSION_1_1)
63+
return SMCCC_CONDUIT_NONE;
64+
65+
return psci_ops.conduit;
66+
}
67+
6068
typedef unsigned long (psci_fn)(unsigned long, unsigned long,
6169
unsigned long, unsigned long);
6270
static psci_fn *invoke_psci_fn;
@@ -212,13 +220,13 @@ static unsigned long psci_migrate_info_up_cpu(void)
212220
0, 0, 0);
213221
}
214222

215-
static void set_conduit(enum psci_conduit conduit)
223+
static void set_conduit(enum arm_smccc_conduit conduit)
216224
{
217225
switch (conduit) {
218-
case PSCI_CONDUIT_HVC:
226+
case SMCCC_CONDUIT_HVC:
219227
invoke_psci_fn = __invoke_psci_fn_hvc;
220228
break;
221-
case PSCI_CONDUIT_SMC:
229+
case SMCCC_CONDUIT_SMC:
222230
invoke_psci_fn = __invoke_psci_fn_smc;
223231
break;
224232
default:
@@ -240,9 +248,9 @@ static int get_set_conduit_method(struct device_node *np)
240248
}
241249

242250
if (!strcmp("hvc", method)) {
243-
set_conduit(PSCI_CONDUIT_HVC);
251+
set_conduit(SMCCC_CONDUIT_HVC);
244252
} else if (!strcmp("smc", method)) {
245-
set_conduit(PSCI_CONDUIT_SMC);
253+
set_conduit(SMCCC_CONDUIT_SMC);
246254
} else {
247255
pr_warn("invalid \"method\" property: %s\n", method);
248256
return -EINVAL;
@@ -583,9 +591,9 @@ int __init psci_acpi_init(void)
583591
pr_info("probing for conduit method from ACPI.\n");
584592

585593
if (acpi_psci_use_hvc())
586-
set_conduit(PSCI_CONDUIT_HVC);
594+
set_conduit(SMCCC_CONDUIT_HVC);
587595
else
588-
set_conduit(PSCI_CONDUIT_SMC);
596+
set_conduit(SMCCC_CONDUIT_SMC);
589597

590598
return psci_probe();
591599
}

include/linux/arm-smccc.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,22 @@
8080

8181
#include <linux/linkage.h>
8282
#include <linux/types.h>
83+
84+
enum arm_smccc_conduit {
85+
SMCCC_CONDUIT_NONE,
86+
SMCCC_CONDUIT_SMC,
87+
SMCCC_CONDUIT_HVC,
88+
};
89+
90+
/**
91+
* arm_smccc_1_1_get_conduit()
92+
*
93+
* Returns the conduit to be used for SMCCCv1.1 or later.
94+
*
95+
* When SMCCCv1.1 is not present, returns SMCCC_CONDUIT_NONE.
96+
*/
97+
enum arm_smccc_conduit arm_smccc_1_1_get_conduit(void);
98+
8399
/**
84100
* struct arm_smccc_res - Result from SMC/HVC call
85101
* @a0-a3 result values from registers 0 to 3

include/linux/arm_sdei.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,6 @@
55

66
#include <uapi/linux/arm_sdei.h>
77

8-
enum sdei_conduit_types {
9-
CONDUIT_INVALID = 0,
10-
CONDUIT_SMC,
11-
CONDUIT_HVC,
12-
};
13-
148
#include <acpi/ghes.h>
159

1610
#ifdef CONFIG_ARM_SDE_INTERFACE

include/linux/psci.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#ifndef __LINUX_PSCI_H
88
#define __LINUX_PSCI_H
99

10+
#include <linux/arm-smccc.h>
1011
#include <linux/init.h>
1112
#include <linux/types.h>
1213

@@ -18,12 +19,6 @@ bool psci_tos_resident_on(int cpu);
1819
int psci_cpu_suspend_enter(u32 state);
1920
bool psci_power_state_is_valid(u32 state);
2021

21-
enum psci_conduit {
22-
PSCI_CONDUIT_NONE,
23-
PSCI_CONDUIT_SMC,
24-
PSCI_CONDUIT_HVC,
25-
};
26-
2722
enum smccc_version {
2823
SMCCC_VERSION_1_0,
2924
SMCCC_VERSION_1_1,
@@ -38,7 +33,7 @@ struct psci_operations {
3833
int (*affinity_info)(unsigned long target_affinity,
3934
unsigned long lowest_affinity_level);
4035
int (*migrate_info_type)(void);
41-
enum psci_conduit conduit;
36+
enum arm_smccc_conduit conduit;
4237
enum smccc_version smccc_version;
4338
};
4439

0 commit comments

Comments
 (0)