Skip to content

Commit 5ca243c

Browse files
committed
Merge tag 'hwmon-for-v6.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging
Pull hwmon fixes from Guenter Roeck: - coretemp: Various fixes, and increase number of supported CPU cores - aspeed-pwm-tacho: Add missing mutex protection * tag 'hwmon-for-v6.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging: hwmon: (coretemp) Enlarge per package core count limit hwmon: (coretemp) Fix bogus core_id to attr name mapping hwmon: (coretemp) Fix out-of-bounds memory access hwmon: (aspeed-pwm-tacho) mutex for tach reading
2 parents eb747bc + 34cf8c6 commit 5ca243c

File tree

2 files changed

+29
-20
lines changed

2 files changed

+29
-20
lines changed

drivers/hwmon/aspeed-pwm-tacho.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@ struct aspeed_pwm_tacho_data {
195195
u8 fan_tach_ch_source[MAX_ASPEED_FAN_TACH_CHANNELS];
196196
struct aspeed_cooling_device *cdev[8];
197197
const struct attribute_group *groups[3];
198+
/* protects access to shared ASPEED_PTCR_RESULT */
199+
struct mutex tach_lock;
198200
};
199201

200202
enum type { TYPEM, TYPEN, TYPEO };
@@ -529,6 +531,8 @@ static int aspeed_get_fan_tach_ch_rpm(struct aspeed_pwm_tacho_data *priv,
529531
u8 fan_tach_ch_source, type, mode, both;
530532
int ret;
531533

534+
mutex_lock(&priv->tach_lock);
535+
532536
regmap_write(priv->regmap, ASPEED_PTCR_TRIGGER, 0);
533537
regmap_write(priv->regmap, ASPEED_PTCR_TRIGGER, 0x1 << fan_tach_ch);
534538

@@ -546,6 +550,8 @@ static int aspeed_get_fan_tach_ch_rpm(struct aspeed_pwm_tacho_data *priv,
546550
ASPEED_RPM_STATUS_SLEEP_USEC,
547551
usec);
548552

553+
mutex_unlock(&priv->tach_lock);
554+
549555
/* return -ETIMEDOUT if we didn't get an answer. */
550556
if (ret)
551557
return ret;
@@ -915,6 +921,7 @@ static int aspeed_pwm_tacho_probe(struct platform_device *pdev)
915921
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
916922
if (!priv)
917923
return -ENOMEM;
924+
mutex_init(&priv->tach_lock);
918925
priv->regmap = devm_regmap_init(dev, NULL, (__force void *)regs,
919926
&aspeed_pwm_tacho_regmap_config);
920927
if (IS_ERR(priv->regmap))

drivers/hwmon/coretemp.c

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius");
4141

4242
#define PKG_SYSFS_ATTR_NO 1 /* Sysfs attribute for package temp */
4343
#define BASE_SYSFS_ATTR_NO 2 /* Sysfs Base attr no for coretemp */
44-
#define NUM_REAL_CORES 128 /* Number of Real cores per cpu */
44+
#define NUM_REAL_CORES 512 /* Number of Real cores per cpu */
4545
#define CORETEMP_NAME_LENGTH 28 /* String Length of attrs */
4646
#define MAX_CORE_ATTRS 4 /* Maximum no of basic attrs */
4747
#define TOTAL_ATTRS (MAX_CORE_ATTRS + 1)
@@ -419,7 +419,7 @@ static ssize_t show_temp(struct device *dev,
419419
}
420420

421421
static int create_core_attrs(struct temp_data *tdata, struct device *dev,
422-
int attr_no)
422+
int index)
423423
{
424424
int i;
425425
static ssize_t (*const rd_ptr[TOTAL_ATTRS]) (struct device *dev,
@@ -431,13 +431,20 @@ static int create_core_attrs(struct temp_data *tdata, struct device *dev,
431431
};
432432

433433
for (i = 0; i < tdata->attr_size; i++) {
434+
/*
435+
* We map the attr number to core id of the CPU
436+
* The attr number is always core id + 2
437+
* The Pkgtemp will always show up as temp1_*, if available
438+
*/
439+
int attr_no = tdata->is_pkg_data ? 1 : tdata->cpu_core_id + 2;
440+
434441
snprintf(tdata->attr_name[i], CORETEMP_NAME_LENGTH,
435442
"temp%d_%s", attr_no, suffixes[i]);
436443
sysfs_attr_init(&tdata->sd_attrs[i].dev_attr.attr);
437444
tdata->sd_attrs[i].dev_attr.attr.name = tdata->attr_name[i];
438445
tdata->sd_attrs[i].dev_attr.attr.mode = 0444;
439446
tdata->sd_attrs[i].dev_attr.show = rd_ptr[i];
440-
tdata->sd_attrs[i].index = attr_no;
447+
tdata->sd_attrs[i].index = index;
441448
tdata->attrs[i] = &tdata->sd_attrs[i].dev_attr.attr;
442449
}
443450
tdata->attr_group.attrs = tdata->attrs;
@@ -495,30 +502,25 @@ static int create_core_data(struct platform_device *pdev, unsigned int cpu,
495502
struct platform_data *pdata = platform_get_drvdata(pdev);
496503
struct cpuinfo_x86 *c = &cpu_data(cpu);
497504
u32 eax, edx;
498-
int err, index, attr_no;
505+
int err, index;
499506

500507
if (!housekeeping_cpu(cpu, HK_TYPE_MISC))
501508
return 0;
502509

503510
/*
504-
* Find attr number for sysfs:
505-
* We map the attr number to core id of the CPU
506-
* The attr number is always core id + 2
507-
* The Pkgtemp will always show up as temp1_*, if available
511+
* Get the index of tdata in pdata->core_data[]
512+
* tdata for package: pdata->core_data[1]
513+
* tdata for core: pdata->core_data[2] .. pdata->core_data[NUM_REAL_CORES + 1]
508514
*/
509515
if (pkg_flag) {
510-
attr_no = PKG_SYSFS_ATTR_NO;
516+
index = PKG_SYSFS_ATTR_NO;
511517
} else {
512-
index = ida_alloc(&pdata->ida, GFP_KERNEL);
518+
index = ida_alloc_max(&pdata->ida, NUM_REAL_CORES - 1, GFP_KERNEL);
513519
if (index < 0)
514520
return index;
515-
pdata->cpu_map[index] = topology_core_id(cpu);
516-
attr_no = index + BASE_SYSFS_ATTR_NO;
517-
}
518521

519-
if (attr_no > MAX_CORE_DATA - 1) {
520-
err = -ERANGE;
521-
goto ida_free;
522+
pdata->cpu_map[index] = topology_core_id(cpu);
523+
index += BASE_SYSFS_ATTR_NO;
522524
}
523525

524526
tdata = init_temp_data(cpu, pkg_flag);
@@ -544,20 +546,20 @@ static int create_core_data(struct platform_device *pdev, unsigned int cpu,
544546
if (get_ttarget(tdata, &pdev->dev) >= 0)
545547
tdata->attr_size++;
546548

547-
pdata->core_data[attr_no] = tdata;
549+
pdata->core_data[index] = tdata;
548550

549551
/* Create sysfs interfaces */
550-
err = create_core_attrs(tdata, pdata->hwmon_dev, attr_no);
552+
err = create_core_attrs(tdata, pdata->hwmon_dev, index);
551553
if (err)
552554
goto exit_free;
553555

554556
return 0;
555557
exit_free:
556-
pdata->core_data[attr_no] = NULL;
558+
pdata->core_data[index] = NULL;
557559
kfree(tdata);
558560
ida_free:
559561
if (!pkg_flag)
560-
ida_free(&pdata->ida, index);
562+
ida_free(&pdata->ida, index - BASE_SYSFS_ATTR_NO);
561563
return err;
562564
}
563565

0 commit comments

Comments
 (0)