2022年8月12日 03:21,Florian Fainelli <f.fainelli@xxxxxxxxx <mailto:f.fainelli@xxxxxxxxx>> 写道:
On 8/11/2022 3:12 AM, Jiaxun Yang wrote:
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@xxxxxxxxxxx <mailto:jiaxun.yang@xxxxxxxxxxx>>
---
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-cpu b/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 2022
typo: August
Thanks, good catch :-)
+Contact:Linux MIPS Kernel Mailing list <linux-mips@xxxxxxxxxxxxxxx <mailto:linux-mips@xxxxxxxxxxxxxxx>>
+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_v1
diff --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.