@@ -76,6 +76,8 @@ void unregister_cpu(struct cpu *cpu)
{
int logical_cpu = cpu->dev.id;
+ hms_initiator_unregister(&cpu->initiator);
+
unregister_cpu_under_node(logical_cpu, cpu_to_node(logical_cpu));
device_unregister(&cpu->dev);
@@ -392,6 +394,9 @@ int register_cpu(struct cpu *cpu, int num)
dev_pm_qos_expose_latency_limit(&cpu->dev,
PM_QOS_RESUME_LATENCY_NO_CONSTRAINT);
+ hms_initiator_register(&cpu->initiator, &cpu->dev,
+ cpu_to_node(num), 0);
+
return 0;
}
@@ -375,9 +375,19 @@ int register_cpu_under_node(unsigned int cpu, unsigned int nid)
if (ret)
return ret;
- return sysfs_create_link(&obj->kobj,
+ ret = sysfs_create_link(&obj->kobj,
&node_devices[nid]->dev.kobj,
kobject_name(&node_devices[nid]->dev.kobj));
+ if (ret)
+ return ret;
+
+ if (IS_ENABLED(CONFIG_HMS)) {
+ struct cpu *cpu = container_of(obj, struct cpu, dev);
+
+ hms_link_initiator(node_devices[nid]->link, cpu->initiator);
+ }
+
+ return 0;
}
int unregister_cpu_under_node(unsigned int cpu, unsigned int nid)
@@ -396,6 +406,12 @@ int unregister_cpu_under_node(unsigned int cpu, unsigned int nid)
sysfs_remove_link(&obj->kobj,
kobject_name(&node_devices[nid]->dev.kobj));
+ if (IS_ENABLED(CONFIG_HMS)) {
+ struct cpu *cpu = container_of(obj, struct cpu, dev);
+
+ hms_unlink_initiator(node_devices[nid]->link, cpu->initiator);
+ }
+
return 0;
}
@@ -14,6 +14,7 @@
#ifndef _LINUX_CPU_H_
#define _LINUX_CPU_H_
+#include <linux/hms.h>
#include <linux/node.h>
#include <linux/compiler.h>
#include <linux/cpumask.h>
@@ -27,6 +28,9 @@ struct cpu {
int node_id; /* The node which contains the CPU */
int hotpluggable; /* creates sysfs control file if hotpluggable */
struct device dev;
+#if defined(CONFIG_HMS)
+ struct hms_initiator *initiator;
+#endif
};
extern void boot_cpu_init(void);