Re: [PATCH v2] MIPS: Expose prid and globalnumber to sysfs
From: Florian Fainelli <f.fainelli@gmail.com>
Date: 2022-08-12 16:43:34
Also in:
linux-mips, lkml
On 8/12/22 03:29, Jiaxun Yang wrote:
quoted
2022年8月12日 03:21,Florian Fainelli <f.fainelli@gmail.com <mailto:f.fainelli@gmail.com>> 写道: On 8/11/2022 3:12 AM, Jiaxun Yang wrote:quoted
Some application would like to know precise model and rev of processor to do errata workaround or optimization. Expose them in sysfs as: /sys/devices/system/cpu/cpuX/regs/identification/prid /sys/devices/system/cpu/cpuX/regs/identification/globalnumber Reusing AArch64 CPU registers directory. Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com <mailto:jiaxun.yang@flygoat.com>> --- v2: Drop static qualifier for kobj (gregkh) --- .../ABI/testing/sysfs-devices-system-cpu | 11 +++ arch/mips/kernel/topology.c | 96 +++++++++++++++++++ 2 files changed, 107 insertions(+)diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpub/Documentation/ABI/testing/sysfs-devices-system-cpu index 5bf61881f012..adf855e7bb9b 100644--- a/Documentation/ABI/testing/sysfs-devices-system-cpu +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu@@ -512,6 +512,17 @@ Description:information about CPUs heterogeneity.cpu_capacity: capacity of cpuX. +What:/sys/devices/system/cpu/cpuX/regs/ +/sys/devices/system/cpu/cpuX/regs/identification/ +/sys/devices/system/cpu/cpuX/regs/identification/prid +/sys/devices/system/cpu/cpuX/regs/identification/globalnumber +Date:Augest 2022typo: AugustThanks, good catch :-)quoted
quoted
+Contact:Linux MIPS Kernel Mailing list <linux-mips@vger.kernel.org <mailto:linux-mips@vger.kernel.org>> +Description:MIPS CPU registers + +'identification' directory exposes the Processor ID and Global Number +registers for identifying model and revision of the CPU. + What:/sys/devices/system/cpu/vulnerabilities /sys/devices/system/cpu/vulnerabilities/meltdown /sys/devices/system/cpu/vulnerabilities/spectre_v1diff --git a/arch/mips/kernel/topology.c b/arch/mips/kernel/topology.c index 9429d85a4703..0e3730f3c00f 100644 --- a/arch/mips/kernel/topology.c +++ b/arch/mips/kernel/topology.c@@ -5,6 +5,8 @@#include <linux/node.h> #include <linux/nodemask.h> #include <linux/percpu.h> +#include <linux/seq_file.h> +#include <linux/smp.h> static DEFINE_PER_CPU(struct cpu, cpu_devices); @@ -26,3 +28,97 @@ static int __init topology_init(void) } subsys_initcall(topology_init); + +static struct kobj_type cpuregs_kobj_type = { +.sysfs_ops = &kobj_sysfs_ops, +}; + +struct cpureg { +struct kobject kobj; +struct cpuinfo_mips *info; +}; +DEFINE_PER_CPU(struct cpureg, cpuregs); + +#define kobj_to_cpureg(kobj)container_of(kobj, struct cpureg, kobj) +#define CPUREGS_ATTR_RO(_name, _field)\ +static ssize_t _name##_show(struct kobject *kobj,\ +struct kobj_attribute *attr, char *buf)\ +{\ +struct cpuinfo_mips *info = kobj_to_cpureg(kobj)->info;\ +\ +return sprintf(buf, "0x%08x\n", info->_field);\Would not you be able to simplify this greatly with just: struct cpuinfo_mips *info = current_cpu_data;Because some fields in PRID and globalnumber are not consistent between cores so it needs to be per CPU.
Yes my bad, I was thinking that you could simplify things by always getting the registers of the CPU you are running on, but you need to create those attributes for each CPU in the system and ensure that they do resolve to the actual cpuinfo_mips of said CPU, such that when you do: cat /sys/device/system/cpu/cpu*/regs/prid we do return the actual information of that CPU number, not the one from the CPU we are on. Thanks! -- Florian