mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 00:22:00 +02:00
Arm SMCCC update for v6.15
Just a single update introducing the support for the optional SOC_ID name string from the Arm SMCCC v1.6 specification. If the SOC_ID name string is implemented, the machine field of the SoC Device Attributes will reflect it. The original intent of SOC_ID was to provide a JEP-106 code for the SiP and the SoC revision to uniquely identify the SoC. However, there has been a request to add this optional name so that SoC firmware can directly provide the SoC name to the OS. This change avoids the need for frequent updates to various tools that would otherwise require maintaining hardcoded model/machine name tables for new SoCs. -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEunHlEgbzHrJD3ZPhAEG6vDF+4pgFAmfG1J8ACgkQAEG6vDF+ 4phrQg//St4RPwFt1WngjQ2ioZzyiBXO3/eh3nnMiW+5fNvVuq2azldTsdLW3lO5 kqP2ONiTu+LI7a2OXJzbLVTVwyoPg/iTgkqvGPuBiZeVHE1+WCY2lWbySQaKULfJ ViCwRmBF2Pmu7AsC7aBGqbRy1njBESFkybOfT8MAPt5/kvJX7n1V09uHnHNQwB2f f0g5UcamsPLyZQN9j8kyNJNsz/pVKTFG+ooKvnLGDeU82pNygn7Q+7ho79ICDGz4 //9bAgA73xQ685jxWCGgeXDdvexW6HS7F5zyDW1FDPAq4ABLzZY/QpWyaGKF8AcE /BQR0Awzmd4v7jDh1tl0TfZ82jCdUu2wE++SdyK227IIZR/8n7xDOaBpRjWXUCJI seD4NL/obMEMSkikgRWBy10mumqjGYFlxsWy7IHh/9y+zU3y1w2Ed3nE2n/5Ekrx XNa0x9YjfkCwwc8MYacCfXR8n6UHBFRlSQ5oOH3Ai725eTAR4pIojCOFQrQlm6Vf 5ZmqSbPYy7WgC6Rzon/YRAc/0L4qKNkfkazQFQ0xHJ9asnRLrkxh2o2OC3bwyuru 82BNHsGg1Gn3FcvLmNnsbrHo+GsPqbeezciLtLw7rurJir6I24kyl6SLjHDBgCSL I7un2GYwOXca9WhLpkTRxudgZ0ZxEWFRjJnXS3b7H/okwZ1050w= =/iKV -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEiK/NIGsWEZVxh/FrYKtH/8kJUicFAmfJynoACgkQYKtH/8kJ UidLdg//Uv+QN8hSCah0apoWl+oNPmiFb/1vRptR/Jt++uVKQ7MIR4oFbjR5szOw 3mJeCftsdSLB4XYzZlnx2f/PmsQjffs6CkFdzLDveF8aKk1rmhra+9ZDwz8oPbP/ drLVPcc6UMtDfZigYau/8cr70lhGSI5z4S0SHW1wgoroTIFJhl4QluQjmb5Ruryt ARNDjoGM+PjyW6QZQgAk2oQVObZB5gYU18jQRm/R3Pj7lhJt6+lG1wF+ZK6ksbYB 3WhzzgQ4BOfXXV3NL+bhb4Ut7TFmyWzT/aeZpYbkIn+sBcu/9CTf2L7MYcRC3t7q 8zS6sl1oGRc4t/zQxqupwKwrCE2oV4UcILhChCKfOJ1oBa9AYLWVe6ZdU+853izt kRt8NkA8N74dmebbg4B8MOkSjCBc3WjyjXpXlyQsxM+BPsDmTf8JDVsAe9D803X6 4RRK9qxo+GfjWe3mlqL5y3t0D82XSyzOTZ8GaXr+8YYsxoMjrZWOu6G2nZtj0NtY 6vmKCo8NeRDCqW68xkyA/qfA51TvWM6dE1ybeGWh8+vUMhc5FdzhgX0LPE14rAdC uNY5X0SXVGbRSSdrUwwv87KnbUl2XcjwKTPbOPmWxnek/vfgvq4pLaNMituVVGGc aaLvcISDu5UmYGwxDcXouhD7T44aCz6w17W2R38kJUmlTlC+YDo= =tny0 -----END PGP SIGNATURE----- Merge tag 'smccc-update-6.15' of https://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux into soc/drivers Arm SMCCC update for v6.15 Just a single update introducing the support for the optional SOC_ID name string from the Arm SMCCC v1.6 specification. If the SOC_ID name string is implemented, the machine field of the SoC Device Attributes will reflect it. The original intent of SOC_ID was to provide a JEP-106 code for the SiP and the SoC revision to uniquely identify the SoC. However, there has been a request to add this optional name so that SoC firmware can directly provide the SoC name to the OS. This change avoids the need for frequent updates to various tools that would otherwise require maintaining hardcoded model/machine name tables for new SoCs. * tag 'smccc-update-6.15' of https://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux: firmware: smccc: Support optional Arm SMCCC SOC_ID name Link: https://lore.kernel.org/r/20250304105845.432813-1-sudeep.holla@arm.com Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
283a4f225f
|
|
@ -32,6 +32,85 @@
|
|||
static struct soc_device *soc_dev;
|
||||
static struct soc_device_attribute *soc_dev_attr;
|
||||
|
||||
#ifdef CONFIG_ARM64
|
||||
|
||||
static char __ro_after_init smccc_soc_id_name[136] = "";
|
||||
|
||||
static inline void str_fragment_from_reg(char *dst, unsigned long reg)
|
||||
{
|
||||
dst[0] = (reg >> 0) & 0xff;
|
||||
dst[1] = (reg >> 8) & 0xff;
|
||||
dst[2] = (reg >> 16) & 0xff;
|
||||
dst[3] = (reg >> 24) & 0xff;
|
||||
dst[4] = (reg >> 32) & 0xff;
|
||||
dst[5] = (reg >> 40) & 0xff;
|
||||
dst[6] = (reg >> 48) & 0xff;
|
||||
dst[7] = (reg >> 56) & 0xff;
|
||||
}
|
||||
|
||||
static char __init *smccc_soc_name_init(void)
|
||||
{
|
||||
struct arm_smccc_1_2_regs args;
|
||||
struct arm_smccc_1_2_regs res;
|
||||
size_t len;
|
||||
|
||||
/*
|
||||
* Issue Number 1.6 of the Arm SMC Calling Convention
|
||||
* specification introduces an optional "name" string
|
||||
* to the ARM_SMCCC_ARCH_SOC_ID function. Fetch it if
|
||||
* available.
|
||||
*/
|
||||
args.a0 = ARM_SMCCC_ARCH_SOC_ID;
|
||||
args.a1 = 2; /* SOC_ID name */
|
||||
arm_smccc_1_2_invoke(&args, &res);
|
||||
|
||||
if ((u32)res.a0 == 0) {
|
||||
/*
|
||||
* Copy res.a1..res.a17 to the smccc_soc_id_name string
|
||||
* 8 bytes at a time. As per Issue 1.6 of the Arm SMC
|
||||
* Calling Convention, the string will be NUL terminated
|
||||
* and padded, from the end of the string to the end of the
|
||||
* 136 byte buffer, with NULs.
|
||||
*/
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 0, res.a1);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 1, res.a2);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 2, res.a3);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 3, res.a4);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 4, res.a5);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 5, res.a6);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 6, res.a7);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 7, res.a8);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 8, res.a9);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 9, res.a10);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 10, res.a11);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 11, res.a12);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 12, res.a13);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 13, res.a14);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 14, res.a15);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 15, res.a16);
|
||||
str_fragment_from_reg(smccc_soc_id_name + 8 * 16, res.a17);
|
||||
|
||||
len = strnlen(smccc_soc_id_name, sizeof(smccc_soc_id_name));
|
||||
if (len) {
|
||||
if (len == sizeof(smccc_soc_id_name))
|
||||
pr_warn(FW_BUG "Ignoring improperly formatted name\n");
|
||||
else
|
||||
return smccc_soc_id_name;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static char __init *smccc_soc_name_init(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int __init smccc_soc_init(void)
|
||||
{
|
||||
int soc_id_rev, soc_id_version;
|
||||
|
|
@ -72,6 +151,7 @@ static int __init smccc_soc_init(void)
|
|||
soc_dev_attr->soc_id = soc_id_str;
|
||||
soc_dev_attr->revision = soc_id_rev_str;
|
||||
soc_dev_attr->family = soc_id_jep106_id_str;
|
||||
soc_dev_attr->machine = smccc_soc_name_init();
|
||||
|
||||
soc_dev = soc_device_register(soc_dev_attr);
|
||||
if (IS_ERR(soc_dev)) {
|
||||
|
|
|
|||
|
|
@ -639,5 +639,45 @@ asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1,
|
|||
method; \
|
||||
})
|
||||
|
||||
#ifdef CONFIG_ARM64
|
||||
|
||||
#define __fail_smccc_1_2(___res) \
|
||||
do { \
|
||||
if (___res) \
|
||||
___res->a0 = SMCCC_RET_NOT_SUPPORTED; \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* arm_smccc_1_2_invoke() - make an SMCCC v1.2 compliant call
|
||||
*
|
||||
* @args: SMC args are in the a0..a17 fields of the arm_smcc_1_2_regs structure
|
||||
* @res: result values from registers 0 to 17
|
||||
*
|
||||
* This macro will make either an HVC call or an SMC call depending on the
|
||||
* current SMCCC conduit. If no valid conduit is available then -1
|
||||
* (SMCCC_RET_NOT_SUPPORTED) is returned in @res.a0 (if supplied).
|
||||
*
|
||||
* The return value also provides the conduit that was used.
|
||||
*/
|
||||
#define arm_smccc_1_2_invoke(args, res) ({ \
|
||||
struct arm_smccc_1_2_regs *__args = args; \
|
||||
struct arm_smccc_1_2_regs *__res = res; \
|
||||
int method = arm_smccc_1_1_get_conduit(); \
|
||||
switch (method) { \
|
||||
case SMCCC_CONDUIT_HVC: \
|
||||
arm_smccc_1_2_hvc(__args, __res); \
|
||||
break; \
|
||||
case SMCCC_CONDUIT_SMC: \
|
||||
arm_smccc_1_2_smc(__args, __res); \
|
||||
break; \
|
||||
default: \
|
||||
__fail_smccc_1_2(__res); \
|
||||
method = SMCCC_CONDUIT_NONE; \
|
||||
break; \
|
||||
} \
|
||||
method; \
|
||||
})
|
||||
#endif /*CONFIG_ARM64*/
|
||||
|
||||
#endif /*__ASSEMBLY__*/
|
||||
#endif /*__LINUX_ARM_SMCCC_H*/
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user