thermal/x86_pkg_temp_thermal: Cosmetic: Rename internal variables to zones from packages
Syntax update only -- no logical or functional change. In response to the new multi-die/package changes, update variable names to use the more generic thermal "zone" terminology, instead of "package", as the zones can refer to either packages or die. Signed-off-by: Len Brown <len.brown@intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Ingo Molnar <mingo@kernel.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Zhang Rui <rui.zhang@intel.com> Link: https://lkml.kernel.org/r/b65494a76be13481dc3a809c75debb2574c34eda.1557769318.git.len.brown@intel.com
This commit is contained in:
parent
cb63ba0f67
commit
b2ce1c883d
|
@ -55,7 +55,7 @@ MODULE_PARM_DESC(notify_delay_ms,
|
||||||
*/
|
*/
|
||||||
#define MAX_NUMBER_OF_TRIPS 2
|
#define MAX_NUMBER_OF_TRIPS 2
|
||||||
|
|
||||||
struct pkg_device {
|
struct zone_device {
|
||||||
int cpu;
|
int cpu;
|
||||||
bool work_scheduled;
|
bool work_scheduled;
|
||||||
u32 tj_max;
|
u32 tj_max;
|
||||||
|
@ -70,10 +70,10 @@ static struct thermal_zone_params pkg_temp_tz_params = {
|
||||||
.no_hwmon = true,
|
.no_hwmon = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Keep track of how many package pointers we allocated in init() */
|
/* Keep track of how many zone pointers we allocated in init() */
|
||||||
static int max_packages __read_mostly;
|
static int max_id __read_mostly;
|
||||||
/* Array of package pointers */
|
/* Array of zone pointers */
|
||||||
static struct pkg_device **packages;
|
static struct zone_device **zones;
|
||||||
/* Serializes interrupt notification, work and hotplug */
|
/* Serializes interrupt notification, work and hotplug */
|
||||||
static DEFINE_SPINLOCK(pkg_temp_lock);
|
static DEFINE_SPINLOCK(pkg_temp_lock);
|
||||||
/* Protects zone operation in the work function against hotplug removal */
|
/* Protects zone operation in the work function against hotplug removal */
|
||||||
|
@ -120,12 +120,12 @@ err_out:
|
||||||
*
|
*
|
||||||
* - Other callsites: Must hold pkg_temp_lock
|
* - Other callsites: Must hold pkg_temp_lock
|
||||||
*/
|
*/
|
||||||
static struct pkg_device *pkg_temp_thermal_get_dev(unsigned int cpu)
|
static struct zone_device *pkg_temp_thermal_get_dev(unsigned int cpu)
|
||||||
{
|
{
|
||||||
int pkgid = topology_logical_die_id(cpu);
|
int id = topology_logical_die_id(cpu);
|
||||||
|
|
||||||
if (pkgid >= 0 && pkgid < max_packages)
|
if (id >= 0 && id < max_id)
|
||||||
return packages[pkgid];
|
return zones[id];
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,12 +150,13 @@ static int get_tj_max(int cpu, u32 *tj_max)
|
||||||
|
|
||||||
static int sys_get_curr_temp(struct thermal_zone_device *tzd, int *temp)
|
static int sys_get_curr_temp(struct thermal_zone_device *tzd, int *temp)
|
||||||
{
|
{
|
||||||
struct pkg_device *pkgdev = tzd->devdata;
|
struct zone_device *zonedev = tzd->devdata;
|
||||||
u32 eax, edx;
|
u32 eax, edx;
|
||||||
|
|
||||||
rdmsr_on_cpu(pkgdev->cpu, MSR_IA32_PACKAGE_THERM_STATUS, &eax, &edx);
|
rdmsr_on_cpu(zonedev->cpu, MSR_IA32_PACKAGE_THERM_STATUS,
|
||||||
|
&eax, &edx);
|
||||||
if (eax & 0x80000000) {
|
if (eax & 0x80000000) {
|
||||||
*temp = pkgdev->tj_max - ((eax >> 16) & 0x7f) * 1000;
|
*temp = zonedev->tj_max - ((eax >> 16) & 0x7f) * 1000;
|
||||||
pr_debug("sys_get_curr_temp %d\n", *temp);
|
pr_debug("sys_get_curr_temp %d\n", *temp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -165,7 +166,7 @@ static int sys_get_curr_temp(struct thermal_zone_device *tzd, int *temp)
|
||||||
static int sys_get_trip_temp(struct thermal_zone_device *tzd,
|
static int sys_get_trip_temp(struct thermal_zone_device *tzd,
|
||||||
int trip, int *temp)
|
int trip, int *temp)
|
||||||
{
|
{
|
||||||
struct pkg_device *pkgdev = tzd->devdata;
|
struct zone_device *zonedev = tzd->devdata;
|
||||||
unsigned long thres_reg_value;
|
unsigned long thres_reg_value;
|
||||||
u32 mask, shift, eax, edx;
|
u32 mask, shift, eax, edx;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -181,14 +182,14 @@ static int sys_get_trip_temp(struct thermal_zone_device *tzd,
|
||||||
shift = THERM_SHIFT_THRESHOLD0;
|
shift = THERM_SHIFT_THRESHOLD0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = rdmsr_on_cpu(pkgdev->cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT,
|
ret = rdmsr_on_cpu(zonedev->cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT,
|
||||||
&eax, &edx);
|
&eax, &edx);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
thres_reg_value = (eax & mask) >> shift;
|
thres_reg_value = (eax & mask) >> shift;
|
||||||
if (thres_reg_value)
|
if (thres_reg_value)
|
||||||
*temp = pkgdev->tj_max - thres_reg_value * 1000;
|
*temp = zonedev->tj_max - thres_reg_value * 1000;
|
||||||
else
|
else
|
||||||
*temp = 0;
|
*temp = 0;
|
||||||
pr_debug("sys_get_trip_temp %d\n", *temp);
|
pr_debug("sys_get_trip_temp %d\n", *temp);
|
||||||
|
@ -199,14 +200,14 @@ static int sys_get_trip_temp(struct thermal_zone_device *tzd,
|
||||||
static int
|
static int
|
||||||
sys_set_trip_temp(struct thermal_zone_device *tzd, int trip, int temp)
|
sys_set_trip_temp(struct thermal_zone_device *tzd, int trip, int temp)
|
||||||
{
|
{
|
||||||
struct pkg_device *pkgdev = tzd->devdata;
|
struct zone_device *zonedev = tzd->devdata;
|
||||||
u32 l, h, mask, shift, intr;
|
u32 l, h, mask, shift, intr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (trip >= MAX_NUMBER_OF_TRIPS || temp >= pkgdev->tj_max)
|
if (trip >= MAX_NUMBER_OF_TRIPS || temp >= zonedev->tj_max)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
ret = rdmsr_on_cpu(pkgdev->cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT,
|
ret = rdmsr_on_cpu(zonedev->cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT,
|
||||||
&l, &h);
|
&l, &h);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -228,11 +229,12 @@ sys_set_trip_temp(struct thermal_zone_device *tzd, int trip, int temp)
|
||||||
if (!temp) {
|
if (!temp) {
|
||||||
l &= ~intr;
|
l &= ~intr;
|
||||||
} else {
|
} else {
|
||||||
l |= (pkgdev->tj_max - temp)/1000 << shift;
|
l |= (zonedev->tj_max - temp)/1000 << shift;
|
||||||
l |= intr;
|
l |= intr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return wrmsr_on_cpu(pkgdev->cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT, l, h);
|
return wrmsr_on_cpu(zonedev->cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT,
|
||||||
|
l, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sys_get_trip_type(struct thermal_zone_device *thermal, int trip,
|
static int sys_get_trip_type(struct thermal_zone_device *thermal, int trip,
|
||||||
|
@ -287,26 +289,26 @@ static void pkg_temp_thermal_threshold_work_fn(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct thermal_zone_device *tzone = NULL;
|
struct thermal_zone_device *tzone = NULL;
|
||||||
int cpu = smp_processor_id();
|
int cpu = smp_processor_id();
|
||||||
struct pkg_device *pkgdev;
|
struct zone_device *zonedev;
|
||||||
u64 msr_val, wr_val;
|
u64 msr_val, wr_val;
|
||||||
|
|
||||||
mutex_lock(&thermal_zone_mutex);
|
mutex_lock(&thermal_zone_mutex);
|
||||||
spin_lock_irq(&pkg_temp_lock);
|
spin_lock_irq(&pkg_temp_lock);
|
||||||
++pkg_work_cnt;
|
++pkg_work_cnt;
|
||||||
|
|
||||||
pkgdev = pkg_temp_thermal_get_dev(cpu);
|
zonedev = pkg_temp_thermal_get_dev(cpu);
|
||||||
if (!pkgdev) {
|
if (!zonedev) {
|
||||||
spin_unlock_irq(&pkg_temp_lock);
|
spin_unlock_irq(&pkg_temp_lock);
|
||||||
mutex_unlock(&thermal_zone_mutex);
|
mutex_unlock(&thermal_zone_mutex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pkgdev->work_scheduled = false;
|
zonedev->work_scheduled = false;
|
||||||
|
|
||||||
rdmsrl(MSR_IA32_PACKAGE_THERM_STATUS, msr_val);
|
rdmsrl(MSR_IA32_PACKAGE_THERM_STATUS, msr_val);
|
||||||
wr_val = msr_val & ~(THERM_LOG_THRESHOLD0 | THERM_LOG_THRESHOLD1);
|
wr_val = msr_val & ~(THERM_LOG_THRESHOLD0 | THERM_LOG_THRESHOLD1);
|
||||||
if (wr_val != msr_val) {
|
if (wr_val != msr_val) {
|
||||||
wrmsrl(MSR_IA32_PACKAGE_THERM_STATUS, wr_val);
|
wrmsrl(MSR_IA32_PACKAGE_THERM_STATUS, wr_val);
|
||||||
tzone = pkgdev->tzone;
|
tzone = zonedev->tzone;
|
||||||
}
|
}
|
||||||
|
|
||||||
enable_pkg_thres_interrupt();
|
enable_pkg_thres_interrupt();
|
||||||
|
@ -332,7 +334,7 @@ static void pkg_thermal_schedule_work(int cpu, struct delayed_work *work)
|
||||||
static int pkg_thermal_notify(u64 msr_val)
|
static int pkg_thermal_notify(u64 msr_val)
|
||||||
{
|
{
|
||||||
int cpu = smp_processor_id();
|
int cpu = smp_processor_id();
|
||||||
struct pkg_device *pkgdev;
|
struct zone_device *zonedev;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&pkg_temp_lock, flags);
|
spin_lock_irqsave(&pkg_temp_lock, flags);
|
||||||
|
@ -341,10 +343,10 @@ static int pkg_thermal_notify(u64 msr_val)
|
||||||
disable_pkg_thres_interrupt();
|
disable_pkg_thres_interrupt();
|
||||||
|
|
||||||
/* Work is per package, so scheduling it once is enough. */
|
/* Work is per package, so scheduling it once is enough. */
|
||||||
pkgdev = pkg_temp_thermal_get_dev(cpu);
|
zonedev = pkg_temp_thermal_get_dev(cpu);
|
||||||
if (pkgdev && !pkgdev->work_scheduled) {
|
if (zonedev && !zonedev->work_scheduled) {
|
||||||
pkgdev->work_scheduled = true;
|
zonedev->work_scheduled = true;
|
||||||
pkg_thermal_schedule_work(pkgdev->cpu, &pkgdev->work);
|
pkg_thermal_schedule_work(zonedev->cpu, &zonedev->work);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(&pkg_temp_lock, flags);
|
spin_unlock_irqrestore(&pkg_temp_lock, flags);
|
||||||
|
@ -353,12 +355,12 @@ static int pkg_thermal_notify(u64 msr_val)
|
||||||
|
|
||||||
static int pkg_temp_thermal_device_add(unsigned int cpu)
|
static int pkg_temp_thermal_device_add(unsigned int cpu)
|
||||||
{
|
{
|
||||||
int pkgid = topology_logical_die_id(cpu);
|
int id = topology_logical_die_id(cpu);
|
||||||
u32 tj_max, eax, ebx, ecx, edx;
|
u32 tj_max, eax, ebx, ecx, edx;
|
||||||
struct pkg_device *pkgdev;
|
struct zone_device *zonedev;
|
||||||
int thres_count, err;
|
int thres_count, err;
|
||||||
|
|
||||||
if (pkgid >= max_packages)
|
if (id >= max_id)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
cpuid(6, &eax, &ebx, &ecx, &edx);
|
cpuid(6, &eax, &ebx, &ecx, &edx);
|
||||||
|
@ -372,51 +374,51 @@ static int pkg_temp_thermal_device_add(unsigned int cpu)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
pkgdev = kzalloc(sizeof(*pkgdev), GFP_KERNEL);
|
zonedev = kzalloc(sizeof(*zonedev), GFP_KERNEL);
|
||||||
if (!pkgdev)
|
if (!zonedev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
INIT_DELAYED_WORK(&pkgdev->work, pkg_temp_thermal_threshold_work_fn);
|
INIT_DELAYED_WORK(&zonedev->work, pkg_temp_thermal_threshold_work_fn);
|
||||||
pkgdev->cpu = cpu;
|
zonedev->cpu = cpu;
|
||||||
pkgdev->tj_max = tj_max;
|
zonedev->tj_max = tj_max;
|
||||||
pkgdev->tzone = thermal_zone_device_register("x86_pkg_temp",
|
zonedev->tzone = thermal_zone_device_register("x86_pkg_temp",
|
||||||
thres_count,
|
thres_count,
|
||||||
(thres_count == MAX_NUMBER_OF_TRIPS) ? 0x03 : 0x01,
|
(thres_count == MAX_NUMBER_OF_TRIPS) ? 0x03 : 0x01,
|
||||||
pkgdev, &tzone_ops, &pkg_temp_tz_params, 0, 0);
|
zonedev, &tzone_ops, &pkg_temp_tz_params, 0, 0);
|
||||||
if (IS_ERR(pkgdev->tzone)) {
|
if (IS_ERR(zonedev->tzone)) {
|
||||||
err = PTR_ERR(pkgdev->tzone);
|
err = PTR_ERR(zonedev->tzone);
|
||||||
kfree(pkgdev);
|
kfree(zonedev);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
/* Store MSR value for package thermal interrupt, to restore at exit */
|
/* Store MSR value for package thermal interrupt, to restore at exit */
|
||||||
rdmsr(MSR_IA32_PACKAGE_THERM_INTERRUPT, pkgdev->msr_pkg_therm_low,
|
rdmsr(MSR_IA32_PACKAGE_THERM_INTERRUPT, zonedev->msr_pkg_therm_low,
|
||||||
pkgdev->msr_pkg_therm_high);
|
zonedev->msr_pkg_therm_high);
|
||||||
|
|
||||||
cpumask_set_cpu(cpu, &pkgdev->cpumask);
|
cpumask_set_cpu(cpu, &zonedev->cpumask);
|
||||||
spin_lock_irq(&pkg_temp_lock);
|
spin_lock_irq(&pkg_temp_lock);
|
||||||
packages[pkgid] = pkgdev;
|
zones[id] = zonedev;
|
||||||
spin_unlock_irq(&pkg_temp_lock);
|
spin_unlock_irq(&pkg_temp_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pkg_thermal_cpu_offline(unsigned int cpu)
|
static int pkg_thermal_cpu_offline(unsigned int cpu)
|
||||||
{
|
{
|
||||||
struct pkg_device *pkgdev = pkg_temp_thermal_get_dev(cpu);
|
struct zone_device *zonedev = pkg_temp_thermal_get_dev(cpu);
|
||||||
bool lastcpu, was_target;
|
bool lastcpu, was_target;
|
||||||
int target;
|
int target;
|
||||||
|
|
||||||
if (!pkgdev)
|
if (!zonedev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
target = cpumask_any_but(&pkgdev->cpumask, cpu);
|
target = cpumask_any_but(&zonedev->cpumask, cpu);
|
||||||
cpumask_clear_cpu(cpu, &pkgdev->cpumask);
|
cpumask_clear_cpu(cpu, &zonedev->cpumask);
|
||||||
lastcpu = target >= nr_cpu_ids;
|
lastcpu = target >= nr_cpu_ids;
|
||||||
/*
|
/*
|
||||||
* Remove the sysfs files, if this is the last cpu in the package
|
* Remove the sysfs files, if this is the last cpu in the package
|
||||||
* before doing further cleanups.
|
* before doing further cleanups.
|
||||||
*/
|
*/
|
||||||
if (lastcpu) {
|
if (lastcpu) {
|
||||||
struct thermal_zone_device *tzone = pkgdev->tzone;
|
struct thermal_zone_device *tzone = zonedev->tzone;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We must protect against a work function calling
|
* We must protect against a work function calling
|
||||||
|
@ -425,7 +427,7 @@ static int pkg_thermal_cpu_offline(unsigned int cpu)
|
||||||
* won't try to call.
|
* won't try to call.
|
||||||
*/
|
*/
|
||||||
mutex_lock(&thermal_zone_mutex);
|
mutex_lock(&thermal_zone_mutex);
|
||||||
pkgdev->tzone = NULL;
|
zonedev->tzone = NULL;
|
||||||
mutex_unlock(&thermal_zone_mutex);
|
mutex_unlock(&thermal_zone_mutex);
|
||||||
|
|
||||||
thermal_zone_device_unregister(tzone);
|
thermal_zone_device_unregister(tzone);
|
||||||
|
@ -439,8 +441,8 @@ static int pkg_thermal_cpu_offline(unsigned int cpu)
|
||||||
* one. When we drop the lock, then the interrupt notify function
|
* one. When we drop the lock, then the interrupt notify function
|
||||||
* will see the new target.
|
* will see the new target.
|
||||||
*/
|
*/
|
||||||
was_target = pkgdev->cpu == cpu;
|
was_target = zonedev->cpu == cpu;
|
||||||
pkgdev->cpu = target;
|
zonedev->cpu = target;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If this is the last CPU in the package remove the package
|
* If this is the last CPU in the package remove the package
|
||||||
|
@ -449,23 +451,23 @@ static int pkg_thermal_cpu_offline(unsigned int cpu)
|
||||||
* worker will see the package anymore.
|
* worker will see the package anymore.
|
||||||
*/
|
*/
|
||||||
if (lastcpu) {
|
if (lastcpu) {
|
||||||
packages[topology_logical_die_id(cpu)] = NULL;
|
zones[topology_logical_die_id(cpu)] = NULL;
|
||||||
/* After this point nothing touches the MSR anymore. */
|
/* After this point nothing touches the MSR anymore. */
|
||||||
wrmsr(MSR_IA32_PACKAGE_THERM_INTERRUPT,
|
wrmsr(MSR_IA32_PACKAGE_THERM_INTERRUPT,
|
||||||
pkgdev->msr_pkg_therm_low, pkgdev->msr_pkg_therm_high);
|
zonedev->msr_pkg_therm_low, zonedev->msr_pkg_therm_high);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check whether there is work scheduled and whether the work is
|
* Check whether there is work scheduled and whether the work is
|
||||||
* targeted at the outgoing CPU.
|
* targeted at the outgoing CPU.
|
||||||
*/
|
*/
|
||||||
if (pkgdev->work_scheduled && was_target) {
|
if (zonedev->work_scheduled && was_target) {
|
||||||
/*
|
/*
|
||||||
* To cancel the work we need to drop the lock, otherwise
|
* To cancel the work we need to drop the lock, otherwise
|
||||||
* we might deadlock if the work needs to be flushed.
|
* we might deadlock if the work needs to be flushed.
|
||||||
*/
|
*/
|
||||||
spin_unlock_irq(&pkg_temp_lock);
|
spin_unlock_irq(&pkg_temp_lock);
|
||||||
cancel_delayed_work_sync(&pkgdev->work);
|
cancel_delayed_work_sync(&zonedev->work);
|
||||||
spin_lock_irq(&pkg_temp_lock);
|
spin_lock_irq(&pkg_temp_lock);
|
||||||
/*
|
/*
|
||||||
* If this is not the last cpu in the package and the work
|
* If this is not the last cpu in the package and the work
|
||||||
|
@ -473,21 +475,21 @@ static int pkg_thermal_cpu_offline(unsigned int cpu)
|
||||||
* need to reschedule the work, otherwise the interrupt
|
* need to reschedule the work, otherwise the interrupt
|
||||||
* stays disabled forever.
|
* stays disabled forever.
|
||||||
*/
|
*/
|
||||||
if (!lastcpu && pkgdev->work_scheduled)
|
if (!lastcpu && zonedev->work_scheduled)
|
||||||
pkg_thermal_schedule_work(target, &pkgdev->work);
|
pkg_thermal_schedule_work(target, &zonedev->work);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irq(&pkg_temp_lock);
|
spin_unlock_irq(&pkg_temp_lock);
|
||||||
|
|
||||||
/* Final cleanup if this is the last cpu */
|
/* Final cleanup if this is the last cpu */
|
||||||
if (lastcpu)
|
if (lastcpu)
|
||||||
kfree(pkgdev);
|
kfree(zonedev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pkg_thermal_cpu_online(unsigned int cpu)
|
static int pkg_thermal_cpu_online(unsigned int cpu)
|
||||||
{
|
{
|
||||||
struct pkg_device *pkgdev = pkg_temp_thermal_get_dev(cpu);
|
struct zone_device *zonedev = pkg_temp_thermal_get_dev(cpu);
|
||||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
||||||
|
|
||||||
/* Paranoia check */
|
/* Paranoia check */
|
||||||
|
@ -495,8 +497,8 @@ static int pkg_thermal_cpu_online(unsigned int cpu)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
/* If the package exists, nothing to do */
|
/* If the package exists, nothing to do */
|
||||||
if (pkgdev) {
|
if (zonedev) {
|
||||||
cpumask_set_cpu(cpu, &pkgdev->cpumask);
|
cpumask_set_cpu(cpu, &zonedev->cpumask);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return pkg_temp_thermal_device_add(cpu);
|
return pkg_temp_thermal_device_add(cpu);
|
||||||
|
@ -515,10 +517,10 @@ static int __init pkg_temp_thermal_init(void)
|
||||||
if (!x86_match_cpu(pkg_temp_thermal_ids))
|
if (!x86_match_cpu(pkg_temp_thermal_ids))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
max_packages = topology_max_packages() * topology_max_die_per_package();
|
max_id = topology_max_packages() * topology_max_die_per_package();
|
||||||
packages = kcalloc(max_packages, sizeof(struct pkg_device *),
|
zones = kcalloc(max_id, sizeof(struct zone_device *),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!packages)
|
if (!zones)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "thermal/x86_pkg:online",
|
ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "thermal/x86_pkg:online",
|
||||||
|
@ -537,7 +539,7 @@ static int __init pkg_temp_thermal_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
kfree(packages);
|
kfree(zones);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
module_init(pkg_temp_thermal_init)
|
module_init(pkg_temp_thermal_init)
|
||||||
|
@ -549,7 +551,7 @@ static void __exit pkg_temp_thermal_exit(void)
|
||||||
|
|
||||||
cpuhp_remove_state(pkg_thermal_hp_state);
|
cpuhp_remove_state(pkg_thermal_hp_state);
|
||||||
debugfs_remove_recursive(debugfs);
|
debugfs_remove_recursive(debugfs);
|
||||||
kfree(packages);
|
kfree(zones);
|
||||||
}
|
}
|
||||||
module_exit(pkg_temp_thermal_exit)
|
module_exit(pkg_temp_thermal_exit)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue