History

firmware: smccc: Refactor SMCCC specific bits into separate file

In order to add newer SMCCC v1.1+ functionality and to avoid cluttering PSCI firmware driver with SMCCC bits, let us move the SMCCC specific details under drivers/firmware/smccc/smccc.c We can also drop conduit and smccc_version from psci_operations structure as SMCCC was the sole user and now it maintains those. No functionality change in this patch though.

Sudeep Holla committed 6 years ago

Commit f2ae9701 parent ad5a57d6 files · +45 −18Browse files

Unified · Split

6 files
  1. MAINTAINERS +9 −0
  2. drivers/firmware/Makefile +2 −1
  3. drivers/firmware/psci/psci.c +5 −15
  4. drivers/firmware/smccc/Makefile +3 −0
  5. drivers/firmware/smccc/smccc.c +26 −0
  6. include/linux/psci.h +0 −2
MAINTAINERS+9−0
@@ -15474,6 +15474,15 @@ M: Nicolas Pitre <nico@fluxnic.net> · 15473 unmodified lines
15474S: Odd Fixes15474S: Odd Fixes
15475F: drivers/net/ethernet/smsc/smc91x.*15475F: drivers/net/ethernet/smsc/smc91x.*
15476 15476
15477SECURE MONITOR CALL(SMC) CALLING CONVENTION (SMCCC)
15478M: Mark Rutland <mark.rutland@arm.com>
15479M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
15480M: Sudeep Holla <sudeep.holla@arm.com>
15481L: linux-arm-kernel@lists.infradead.org
15482S: Maintained
15483F: drivers/firmware/smccc/
15484F: include/linux/arm-smccc.h
15485
15477SMIA AND SMIA++ IMAGE SENSOR DRIVER15486SMIA AND SMIA++ IMAGE SENSOR DRIVER
15478M: Sakari Ailus <sakari.ailus@linux.intel.com>15487M: Sakari Ailus <sakari.ailus@linux.intel.com>
15479L: linux-media@vger.kernel.org15488L: linux-media@vger.kernel.org
drivers/firmware/Makefile+2−1
@@ -23,12 +23,13 @@ obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o · 22 unmodified lines
23obj-$(CONFIG_TURRIS_MOX_RWTM) += turris-mox-rwtm.o23obj-$(CONFIG_TURRIS_MOX_RWTM) += turris-mox-rwtm.o
24 24
25obj-$(CONFIG_ARM_SCMI_PROTOCOL) += arm_scmi/25obj-$(CONFIG_ARM_SCMI_PROTOCOL) += arm_scmi/
26obj-y += psci/
27obj-y += broadcom/26obj-y += broadcom/
28obj-y += meson/27obj-y += meson/
29obj-$(CONFIG_GOOGLE_FIRMWARE) += google/28obj-$(CONFIG_GOOGLE_FIRMWARE) += google/
30obj-$(CONFIG_EFI) += efi/29obj-$(CONFIG_EFI) += efi/
31obj-$(CONFIG_UEFI_CPER) += efi/30obj-$(CONFIG_UEFI_CPER) += efi/
32obj-y += imx/31obj-y += imx/
32obj-y += psci/
33obj-y += smccc/
33obj-y += tegra/34obj-y += tegra/
34obj-y += xilinx/35obj-y += xilinx/
drivers/firmware/psci/psci.c+5−15
@@ -46,25 +46,14 @@ · 45 unmodified lines
46 * require cooperation with a Trusted OS driver.46 * require cooperation with a Trusted OS driver.
47 */47 */
48static int resident_cpu = -1;48static int resident_cpu = -1;
49struct psci_operations psci_ops;
50static enum arm_smccc_conduit psci_conduit = SMCCC_CONDUIT_NONE;
49 51
50bool psci_tos_resident_on(int cpu)52bool psci_tos_resident_on(int cpu)
51{53{
52 return cpu == resident_cpu;54 return cpu == resident_cpu;
53}55}
54 56
55struct psci_operations psci_ops = {
56 .conduit = SMCCC_CONDUIT_NONE,
57 .smccc_version = ARM_SMCCC_VERSION_1_0,
58};
59
60enum arm_smccc_conduit arm_smccc_1_1_get_conduit(void)
61{
62 if (psci_ops.smccc_version < ARM_SMCCC_VERSION_1_1)
63 return SMCCC_CONDUIT_NONE;
64
65 return psci_ops.conduit;
66}
67
68typedef unsigned long (psci_fn)(unsigned long, unsigned long,57typedef unsigned long (psci_fn)(unsigned long, unsigned long,
69 unsigned long, unsigned long);58 unsigned long, unsigned long);
70static psci_fn *invoke_psci_fn;59static psci_fn *invoke_psci_fn;
@@ -90,6 +79,7 @@ static u32 psci_function_id[PSCI_FN_MAX]; · 19 unmodified lines
90 79
91static u32 psci_cpu_suspend_feature;80static u32 psci_cpu_suspend_feature;
92static bool psci_system_reset2_supported;81static bool psci_system_reset2_supported;
82void __init arm_smccc_version_init(u32 version, enum arm_smccc_conduit conduit);
93 83
94static inline bool psci_has_ext_power_state(void)84static inline bool psci_has_ext_power_state(void)
95{85{
@@ -242,7 +232,7 @@ static void set_conduit(enum arm_smccc_conduit conduit) · 146 unmodified lines
242 WARN(1, "Unexpected PSCI conduit %d\n", conduit);232 WARN(1, "Unexpected PSCI conduit %d\n", conduit);
243 }233 }
244 234
245 psci_ops.conduit = conduit;235 psci_conduit = conduit;
246}236}
247 237
248static int get_set_conduit_method(struct device_node *np)238static int get_set_conduit_method(struct device_node *np)
@@ -412,7 +402,7 @@ static void __init psci_init_smccc(void) · 163 unmodified lines
412 u32 ret;402 u32 ret;
413 ret = invoke_psci_fn(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0);403 ret = invoke_psci_fn(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0);
414 if (ret >= ARM_SMCCC_VERSION_1_1) {404 if (ret >= ARM_SMCCC_VERSION_1_1) {
415 psci_ops.smccc_version = ret;405 arm_smccc_version_init(ret, psci_conduit);
416 ver = ret;406 ver = ret;
417 }407 }
418 }408 }
drivers/firmware/smccc/Makefile+3−0
@@ -0,0 +1,3 @@
1# SPDX-License-Identifier: GPL-2.0
2#
3obj-$(CONFIG_HAVE_ARM_SMCCC_DISCOVERY) += smccc.o
drivers/firmware/smccc/smccc.c+26−0
@@ -0,0 +1,26 @@
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2020 Arm Limited
4 */
5
6#define pr_fmt(fmt) "smccc: " fmt
7
8#include <linux/init.h>
9#include <linux/arm-smccc.h>
10
11static u32 smccc_version = ARM_SMCCC_VERSION_1_0;
12static enum arm_smccc_conduit smccc_conduit = SMCCC_CONDUIT_NONE;
13
14void __init arm_smccc_version_init(u32 version, enum arm_smccc_conduit conduit)
15{
16 smccc_version = version;
17 smccc_conduit = conduit;
18}
19
20enum arm_smccc_conduit arm_smccc_1_1_get_conduit(void)
21{
22 if (smccc_version < ARM_SMCCC_VERSION_1_1)
23 return SMCCC_CONDUIT_NONE;
24
25 return smccc_conduit;
26}
include/linux/psci.h+0−2
@@ -30,8 +30,6 @@ struct psci_operations { · 29 unmodified lines
30 int (*affinity_info)(unsigned long target_affinity,30 int (*affinity_info)(unsigned long target_affinity,
31 unsigned long lowest_affinity_level);31 unsigned long lowest_affinity_level);
32 int (*migrate_info_type)(void);32 int (*migrate_info_type)(void);
33 enum arm_smccc_conduit conduit;
34 u32 smccc_version;
35};33};
36 34
37extern struct psci_operations psci_ops;35extern struct psci_operations psci_ops;