Re: [PATCH 1/2] lscpu-arm: Allow externally sourced model name.
Paul Benoit <[email protected]> Fri, 7 Nov 2025 16:45:56 -0500
| Newsgroups | org.kernel.vger.util-linux |
|---|---|
| Message-ID | <[email protected]> |
On 7/11/2025 6:22 PM, Jeremy Linton wrote: > Hi, > > On 7/11/25 4:16 PM, Paul Benoit wrote: >> When there isn't an entry for the model name in the id_part table(s), >> attempt to get the machine name from /sys/bus/soc/devices/soc0/machine >> to use as the model name. This mechanism allows lscpu to use the >> model/machine name provided via the ARM SMC support code rather than via >> hard-coded lscpu tables. > > Since this is suppose to be synced with the DMI data, and is sourced > from the firmware would it make more sense to replace the BIOS name with > it? I was recently reminded that the SMC CC SOC_ID Name (/sys/bus/soc/devices/soc0/machine) and BIOS name could be from 2 different organizations, and may not always resemble each other. > > >> >> This code was tested by removing the "Ampere-1a" entry from the >> ampere-part table and verifying that lscpu displayed the correct machine >> name obtained via the ARM SMC interface to Trusted Firmware. The >> "Ampere-1a" entry will be permanently removed by a separate patch. >> >> Signed-off-by: Paul Benoit <[email protected]> >> --- >> sys-utils/lscpu-arm.c | 35 ++++++++++++++++++++++++++++++++--- >> sys-utils/lscpu.h | 1 + >> 2 files changed, 33 insertions(+), 3 deletions(-) >> >> diff --git a/sys-utils/lscpu-arm.c b/sys-utils/lscpu-arm.c >> index 8745599d4..a46106bcb 100644 >> --- a/sys-utils/lscpu-arm.c >> +++ b/sys-utils/lscpu-arm.c >> @@ -388,7 +388,10 @@ int is_arm(struct lscpu_cxt *cxt) >> static int arm_ids_decode(struct lscpu_cputype *ct) >> { >> int impl, part, j; >> + unsigned int i; >> const struct id_part *parts = NULL; >> + FILE *fd; >> + char machinename[BUFSIZ] = ""; >> impl = parse_implementer_id(ct); >> if (impl <= 0) >> @@ -406,11 +409,11 @@ static int arm_ids_decode(struct lscpu_cputype *ct) >> /* decode model */ >> if (!parts) >> - goto done; >> + goto try_machinename; >> part = parse_model_id(ct); >> if (part <= 0) >> - goto done; >> + goto try_machinename; >> for (j = 0; parts[j].id != -1; j++) { >> if (parts[j].id == part) { >> @@ -419,7 +422,33 @@ static int arm_ids_decode(struct lscpu_cputype *ct) >> break; >> } >> } >> -done: >> + >> +try_machinename: >> + >> + /* >> + * If the Model name was not found in the lscpu 'id_part' tables, >> see >> + * if there is a Machine name associated with the SOC. This name >> may >> + * have been set via either SOC specific support code, or obtained >> + * via an ARM SMC CC call into Trusted Firmware. >> + */ >> + if (!ct->modelname) { >> + fd = ul_path_fopen(NULL, "r", _PATH_SOC_MACHINENAME); >> + if (fd) { >> + if (!fgets(machinename, sizeof(machinename), fd)) >> + machinename[0] = '\0'; >> + fclose(fd); >> + >> + /* Replace newline with string terminator */ >> + for (i = 0; i < strlen(machinename); i++) { >> + if (machinename[i] == '\n') >> + machinename[i] = '\0'; >> + } >> + >> + if (strnlen(machinename, sizeof(machinename))) >> + ct->modelname = xstrdup(machinename); >> + } >> + } >> + >> return 0; >> } >> diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h >> index bd7b64cc5..581602f70 100644 >> --- a/sys-utils/lscpu.h >> +++ b/sys-utils/lscpu.h >> @@ -46,6 +46,7 @@ UL_DEBUG_DECLARE_MASK(lscpu); >> #define _PATH_SYS_NODE _PATH_SYS_SYSTEM "/node" >> #define _PATH_SYS_DMI "/sys/firmware/dmi/tables/DMI" >> #define _PATH_ACPI_PPTT "/sys/firmware/acpi/tables/PPTT" >> +#define _PATH_SOC_MACHINENAME "/sys/bus/soc/devices/soc0/machine" >> struct lscpu_cache { >> int id; /* unique identifier */ >