cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

common.c (29203B)


      1// SPDX-License-Identifier: GPL-2.0+
      2// Copyright IBM Corp 2019
      3
      4#include <linux/device.h>
      5#include <linux/export.h>
      6#include <linux/hwmon.h>
      7#include <linux/hwmon-sysfs.h>
      8#include <linux/jiffies.h>
      9#include <linux/kernel.h>
     10#include <linux/math64.h>
     11#include <linux/module.h>
     12#include <linux/mutex.h>
     13#include <linux/sysfs.h>
     14#include <asm/unaligned.h>
     15
     16#include "common.h"
     17
     18#define EXTN_FLAG_SENSOR_ID		BIT(7)
     19
     20#define OCC_ERROR_COUNT_THRESHOLD	2	/* required by OCC spec */
     21
     22#define OCC_STATE_SAFE			4
     23#define OCC_SAFE_TIMEOUT		msecs_to_jiffies(60000) /* 1 min */
     24
     25#define OCC_UPDATE_FREQUENCY		msecs_to_jiffies(1000)
     26
     27#define OCC_TEMP_SENSOR_FAULT		0xFF
     28
     29#define OCC_FRU_TYPE_VRM		3
     30
     31/* OCC sensor type and version definitions */
     32
     33struct temp_sensor_1 {
     34	u16 sensor_id;
     35	u16 value;
     36} __packed;
     37
     38struct temp_sensor_2 {
     39	u32 sensor_id;
     40	u8 fru_type;
     41	u8 value;
     42} __packed;
     43
     44struct temp_sensor_10 {
     45	u32 sensor_id;
     46	u8 fru_type;
     47	u8 value;
     48	u8 throttle;
     49	u8 reserved;
     50} __packed;
     51
     52struct freq_sensor_1 {
     53	u16 sensor_id;
     54	u16 value;
     55} __packed;
     56
     57struct freq_sensor_2 {
     58	u32 sensor_id;
     59	u16 value;
     60} __packed;
     61
     62struct power_sensor_1 {
     63	u16 sensor_id;
     64	u32 update_tag;
     65	u32 accumulator;
     66	u16 value;
     67} __packed;
     68
     69struct power_sensor_2 {
     70	u32 sensor_id;
     71	u8 function_id;
     72	u8 apss_channel;
     73	u16 reserved;
     74	u32 update_tag;
     75	u64 accumulator;
     76	u16 value;
     77} __packed;
     78
     79struct power_sensor_data {
     80	u16 value;
     81	u32 update_tag;
     82	u64 accumulator;
     83} __packed;
     84
     85struct power_sensor_data_and_time {
     86	u16 update_time;
     87	u16 value;
     88	u32 update_tag;
     89	u64 accumulator;
     90} __packed;
     91
     92struct power_sensor_a0 {
     93	u32 sensor_id;
     94	struct power_sensor_data_and_time system;
     95	u32 reserved;
     96	struct power_sensor_data_and_time proc;
     97	struct power_sensor_data vdd;
     98	struct power_sensor_data vdn;
     99} __packed;
    100
    101struct caps_sensor_2 {
    102	u16 cap;
    103	u16 system_power;
    104	u16 n_cap;
    105	u16 max;
    106	u16 min;
    107	u16 user;
    108	u8 user_source;
    109} __packed;
    110
    111struct caps_sensor_3 {
    112	u16 cap;
    113	u16 system_power;
    114	u16 n_cap;
    115	u16 max;
    116	u16 hard_min;
    117	u16 soft_min;
    118	u16 user;
    119	u8 user_source;
    120} __packed;
    121
    122struct extended_sensor {
    123	union {
    124		u8 name[4];
    125		u32 sensor_id;
    126	};
    127	u8 flags;
    128	u8 reserved;
    129	u8 data[6];
    130} __packed;
    131
    132static int occ_poll(struct occ *occ)
    133{
    134	int rc;
    135	u8 cmd[7];
    136	struct occ_poll_response_header *header;
    137
    138	/* big endian */
    139	cmd[0] = 0;			/* sequence number */
    140	cmd[1] = 0;			/* cmd type */
    141	cmd[2] = 0;			/* data length msb */
    142	cmd[3] = 1;			/* data length lsb */
    143	cmd[4] = occ->poll_cmd_data;	/* data */
    144	cmd[5] = 0;			/* checksum msb */
    145	cmd[6] = 0;			/* checksum lsb */
    146
    147	/* mutex should already be locked if necessary */
    148	rc = occ->send_cmd(occ, cmd, sizeof(cmd), &occ->resp, sizeof(occ->resp));
    149	if (rc) {
    150		occ->last_error = rc;
    151		if (occ->error_count++ > OCC_ERROR_COUNT_THRESHOLD)
    152			occ->error = rc;
    153
    154		goto done;
    155	}
    156
    157	/* clear error since communication was successful */
    158	occ->error_count = 0;
    159	occ->last_error = 0;
    160	occ->error = 0;
    161
    162	/* check for safe state */
    163	header = (struct occ_poll_response_header *)occ->resp.data;
    164	if (header->occ_state == OCC_STATE_SAFE) {
    165		if (occ->last_safe) {
    166			if (time_after(jiffies,
    167				       occ->last_safe + OCC_SAFE_TIMEOUT))
    168				occ->error = -EHOSTDOWN;
    169		} else {
    170			occ->last_safe = jiffies;
    171		}
    172	} else {
    173		occ->last_safe = 0;
    174	}
    175
    176done:
    177	occ_sysfs_poll_done(occ);
    178	return rc;
    179}
    180
    181static int occ_set_user_power_cap(struct occ *occ, u16 user_power_cap)
    182{
    183	int rc;
    184	u8 cmd[8];
    185	u8 resp[8];
    186	__be16 user_power_cap_be = cpu_to_be16(user_power_cap);
    187
    188	cmd[0] = 0;	/* sequence number */
    189	cmd[1] = 0x22;	/* cmd type */
    190	cmd[2] = 0;	/* data length msb */
    191	cmd[3] = 2;	/* data length lsb */
    192
    193	memcpy(&cmd[4], &user_power_cap_be, 2);
    194
    195	cmd[6] = 0;	/* checksum msb */
    196	cmd[7] = 0;	/* checksum lsb */
    197
    198	rc = mutex_lock_interruptible(&occ->lock);
    199	if (rc)
    200		return rc;
    201
    202	rc = occ->send_cmd(occ, cmd, sizeof(cmd), resp, sizeof(resp));
    203
    204	mutex_unlock(&occ->lock);
    205
    206	return rc;
    207}
    208
    209int occ_update_response(struct occ *occ)
    210{
    211	int rc = mutex_lock_interruptible(&occ->lock);
    212
    213	if (rc)
    214		return rc;
    215
    216	/* limit the maximum rate of polling the OCC */
    217	if (time_after(jiffies, occ->next_update)) {
    218		rc = occ_poll(occ);
    219		occ->next_update = jiffies + OCC_UPDATE_FREQUENCY;
    220	} else {
    221		rc = occ->last_error;
    222	}
    223
    224	mutex_unlock(&occ->lock);
    225	return rc;
    226}
    227
    228static ssize_t occ_show_temp_1(struct device *dev,
    229			       struct device_attribute *attr, char *buf)
    230{
    231	int rc;
    232	u32 val = 0;
    233	struct temp_sensor_1 *temp;
    234	struct occ *occ = dev_get_drvdata(dev);
    235	struct occ_sensors *sensors = &occ->sensors;
    236	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    237
    238	rc = occ_update_response(occ);
    239	if (rc)
    240		return rc;
    241
    242	temp = ((struct temp_sensor_1 *)sensors->temp.data) + sattr->index;
    243
    244	switch (sattr->nr) {
    245	case 0:
    246		val = get_unaligned_be16(&temp->sensor_id);
    247		break;
    248	case 1:
    249		/*
    250		 * If a sensor reading has expired and couldn't be refreshed,
    251		 * OCC returns 0xFFFF for that sensor.
    252		 */
    253		if (temp->value == 0xFFFF)
    254			return -EREMOTEIO;
    255		val = get_unaligned_be16(&temp->value) * 1000;
    256		break;
    257	default:
    258		return -EINVAL;
    259	}
    260
    261	return sysfs_emit(buf, "%u\n", val);
    262}
    263
    264static ssize_t occ_show_temp_2(struct device *dev,
    265			       struct device_attribute *attr, char *buf)
    266{
    267	int rc;
    268	u32 val = 0;
    269	struct temp_sensor_2 *temp;
    270	struct occ *occ = dev_get_drvdata(dev);
    271	struct occ_sensors *sensors = &occ->sensors;
    272	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    273
    274	rc = occ_update_response(occ);
    275	if (rc)
    276		return rc;
    277
    278	temp = ((struct temp_sensor_2 *)sensors->temp.data) + sattr->index;
    279
    280	switch (sattr->nr) {
    281	case 0:
    282		val = get_unaligned_be32(&temp->sensor_id);
    283		break;
    284	case 1:
    285		val = temp->value;
    286		if (val == OCC_TEMP_SENSOR_FAULT)
    287			return -EREMOTEIO;
    288
    289		/*
    290		 * VRM doesn't return temperature, only alarm bit. This
    291		 * attribute maps to tempX_alarm instead of tempX_input for
    292		 * VRM
    293		 */
    294		if (temp->fru_type != OCC_FRU_TYPE_VRM) {
    295			/* sensor not ready */
    296			if (val == 0)
    297				return -EAGAIN;
    298
    299			val *= 1000;
    300		}
    301		break;
    302	case 2:
    303		val = temp->fru_type;
    304		break;
    305	case 3:
    306		val = temp->value == OCC_TEMP_SENSOR_FAULT;
    307		break;
    308	default:
    309		return -EINVAL;
    310	}
    311
    312	return sysfs_emit(buf, "%u\n", val);
    313}
    314
    315static ssize_t occ_show_temp_10(struct device *dev,
    316				struct device_attribute *attr, char *buf)
    317{
    318	int rc;
    319	u32 val = 0;
    320	struct temp_sensor_10 *temp;
    321	struct occ *occ = dev_get_drvdata(dev);
    322	struct occ_sensors *sensors = &occ->sensors;
    323	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    324
    325	rc = occ_update_response(occ);
    326	if (rc)
    327		return rc;
    328
    329	temp = ((struct temp_sensor_10 *)sensors->temp.data) + sattr->index;
    330
    331	switch (sattr->nr) {
    332	case 0:
    333		val = get_unaligned_be32(&temp->sensor_id);
    334		break;
    335	case 1:
    336		val = temp->value;
    337		if (val == OCC_TEMP_SENSOR_FAULT)
    338			return -EREMOTEIO;
    339
    340		/* sensor not ready */
    341		if (val == 0)
    342			return -EAGAIN;
    343
    344		val *= 1000;
    345		break;
    346	case 2:
    347		val = temp->fru_type;
    348		break;
    349	case 3:
    350		val = temp->value == OCC_TEMP_SENSOR_FAULT;
    351		break;
    352	case 4:
    353		val = temp->throttle * 1000;
    354		break;
    355	default:
    356		return -EINVAL;
    357	}
    358
    359	return sysfs_emit(buf, "%u\n", val);
    360}
    361
    362static ssize_t occ_show_freq_1(struct device *dev,
    363			       struct device_attribute *attr, char *buf)
    364{
    365	int rc;
    366	u16 val = 0;
    367	struct freq_sensor_1 *freq;
    368	struct occ *occ = dev_get_drvdata(dev);
    369	struct occ_sensors *sensors = &occ->sensors;
    370	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    371
    372	rc = occ_update_response(occ);
    373	if (rc)
    374		return rc;
    375
    376	freq = ((struct freq_sensor_1 *)sensors->freq.data) + sattr->index;
    377
    378	switch (sattr->nr) {
    379	case 0:
    380		val = get_unaligned_be16(&freq->sensor_id);
    381		break;
    382	case 1:
    383		val = get_unaligned_be16(&freq->value);
    384		break;
    385	default:
    386		return -EINVAL;
    387	}
    388
    389	return sysfs_emit(buf, "%u\n", val);
    390}
    391
    392static ssize_t occ_show_freq_2(struct device *dev,
    393			       struct device_attribute *attr, char *buf)
    394{
    395	int rc;
    396	u32 val = 0;
    397	struct freq_sensor_2 *freq;
    398	struct occ *occ = dev_get_drvdata(dev);
    399	struct occ_sensors *sensors = &occ->sensors;
    400	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    401
    402	rc = occ_update_response(occ);
    403	if (rc)
    404		return rc;
    405
    406	freq = ((struct freq_sensor_2 *)sensors->freq.data) + sattr->index;
    407
    408	switch (sattr->nr) {
    409	case 0:
    410		val = get_unaligned_be32(&freq->sensor_id);
    411		break;
    412	case 1:
    413		val = get_unaligned_be16(&freq->value);
    414		break;
    415	default:
    416		return -EINVAL;
    417	}
    418
    419	return sysfs_emit(buf, "%u\n", val);
    420}
    421
    422static ssize_t occ_show_power_1(struct device *dev,
    423				struct device_attribute *attr, char *buf)
    424{
    425	int rc;
    426	u64 val = 0;
    427	struct power_sensor_1 *power;
    428	struct occ *occ = dev_get_drvdata(dev);
    429	struct occ_sensors *sensors = &occ->sensors;
    430	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    431
    432	rc = occ_update_response(occ);
    433	if (rc)
    434		return rc;
    435
    436	power = ((struct power_sensor_1 *)sensors->power.data) + sattr->index;
    437
    438	switch (sattr->nr) {
    439	case 0:
    440		val = get_unaligned_be16(&power->sensor_id);
    441		break;
    442	case 1:
    443		val = get_unaligned_be32(&power->accumulator) /
    444			get_unaligned_be32(&power->update_tag);
    445		val *= 1000000ULL;
    446		break;
    447	case 2:
    448		val = (u64)get_unaligned_be32(&power->update_tag) *
    449			   occ->powr_sample_time_us;
    450		break;
    451	case 3:
    452		val = get_unaligned_be16(&power->value) * 1000000ULL;
    453		break;
    454	default:
    455		return -EINVAL;
    456	}
    457
    458	return sysfs_emit(buf, "%llu\n", val);
    459}
    460
    461static u64 occ_get_powr_avg(u64 *accum, u32 *samples)
    462{
    463	u64 divisor = get_unaligned_be32(samples);
    464
    465	return (divisor == 0) ? 0 :
    466		div64_u64(get_unaligned_be64(accum) * 1000000ULL, divisor);
    467}
    468
    469static ssize_t occ_show_power_2(struct device *dev,
    470				struct device_attribute *attr, char *buf)
    471{
    472	int rc;
    473	u64 val = 0;
    474	struct power_sensor_2 *power;
    475	struct occ *occ = dev_get_drvdata(dev);
    476	struct occ_sensors *sensors = &occ->sensors;
    477	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    478
    479	rc = occ_update_response(occ);
    480	if (rc)
    481		return rc;
    482
    483	power = ((struct power_sensor_2 *)sensors->power.data) + sattr->index;
    484
    485	switch (sattr->nr) {
    486	case 0:
    487		return sysfs_emit(buf, "%u_%u_%u\n",
    488				  get_unaligned_be32(&power->sensor_id),
    489				  power->function_id, power->apss_channel);
    490	case 1:
    491		val = occ_get_powr_avg(&power->accumulator,
    492				       &power->update_tag);
    493		break;
    494	case 2:
    495		val = (u64)get_unaligned_be32(&power->update_tag) *
    496			   occ->powr_sample_time_us;
    497		break;
    498	case 3:
    499		val = get_unaligned_be16(&power->value) * 1000000ULL;
    500		break;
    501	default:
    502		return -EINVAL;
    503	}
    504
    505	return sysfs_emit(buf, "%llu\n", val);
    506}
    507
    508static ssize_t occ_show_power_a0(struct device *dev,
    509				 struct device_attribute *attr, char *buf)
    510{
    511	int rc;
    512	u64 val = 0;
    513	struct power_sensor_a0 *power;
    514	struct occ *occ = dev_get_drvdata(dev);
    515	struct occ_sensors *sensors = &occ->sensors;
    516	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    517
    518	rc = occ_update_response(occ);
    519	if (rc)
    520		return rc;
    521
    522	power = ((struct power_sensor_a0 *)sensors->power.data) + sattr->index;
    523
    524	switch (sattr->nr) {
    525	case 0:
    526		return sysfs_emit(buf, "%u_system\n",
    527				  get_unaligned_be32(&power->sensor_id));
    528	case 1:
    529		val = occ_get_powr_avg(&power->system.accumulator,
    530				       &power->system.update_tag);
    531		break;
    532	case 2:
    533		val = (u64)get_unaligned_be32(&power->system.update_tag) *
    534			   occ->powr_sample_time_us;
    535		break;
    536	case 3:
    537		val = get_unaligned_be16(&power->system.value) * 1000000ULL;
    538		break;
    539	case 4:
    540		return sysfs_emit(buf, "%u_proc\n",
    541				  get_unaligned_be32(&power->sensor_id));
    542	case 5:
    543		val = occ_get_powr_avg(&power->proc.accumulator,
    544				       &power->proc.update_tag);
    545		break;
    546	case 6:
    547		val = (u64)get_unaligned_be32(&power->proc.update_tag) *
    548			   occ->powr_sample_time_us;
    549		break;
    550	case 7:
    551		val = get_unaligned_be16(&power->proc.value) * 1000000ULL;
    552		break;
    553	case 8:
    554		return sysfs_emit(buf, "%u_vdd\n",
    555				  get_unaligned_be32(&power->sensor_id));
    556	case 9:
    557		val = occ_get_powr_avg(&power->vdd.accumulator,
    558				       &power->vdd.update_tag);
    559		break;
    560	case 10:
    561		val = (u64)get_unaligned_be32(&power->vdd.update_tag) *
    562			   occ->powr_sample_time_us;
    563		break;
    564	case 11:
    565		val = get_unaligned_be16(&power->vdd.value) * 1000000ULL;
    566		break;
    567	case 12:
    568		return sysfs_emit(buf, "%u_vdn\n",
    569				  get_unaligned_be32(&power->sensor_id));
    570	case 13:
    571		val = occ_get_powr_avg(&power->vdn.accumulator,
    572				       &power->vdn.update_tag);
    573		break;
    574	case 14:
    575		val = (u64)get_unaligned_be32(&power->vdn.update_tag) *
    576			   occ->powr_sample_time_us;
    577		break;
    578	case 15:
    579		val = get_unaligned_be16(&power->vdn.value) * 1000000ULL;
    580		break;
    581	default:
    582		return -EINVAL;
    583	}
    584
    585	return sysfs_emit(buf, "%llu\n", val);
    586}
    587
    588static ssize_t occ_show_caps_1_2(struct device *dev,
    589				 struct device_attribute *attr, char *buf)
    590{
    591	int rc;
    592	u64 val = 0;
    593	struct caps_sensor_2 *caps;
    594	struct occ *occ = dev_get_drvdata(dev);
    595	struct occ_sensors *sensors = &occ->sensors;
    596	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    597
    598	rc = occ_update_response(occ);
    599	if (rc)
    600		return rc;
    601
    602	caps = ((struct caps_sensor_2 *)sensors->caps.data) + sattr->index;
    603
    604	switch (sattr->nr) {
    605	case 0:
    606		return sysfs_emit(buf, "system\n");
    607	case 1:
    608		val = get_unaligned_be16(&caps->cap) * 1000000ULL;
    609		break;
    610	case 2:
    611		val = get_unaligned_be16(&caps->system_power) * 1000000ULL;
    612		break;
    613	case 3:
    614		val = get_unaligned_be16(&caps->n_cap) * 1000000ULL;
    615		break;
    616	case 4:
    617		val = get_unaligned_be16(&caps->max) * 1000000ULL;
    618		break;
    619	case 5:
    620		val = get_unaligned_be16(&caps->min) * 1000000ULL;
    621		break;
    622	case 6:
    623		val = get_unaligned_be16(&caps->user) * 1000000ULL;
    624		break;
    625	case 7:
    626		if (occ->sensors.caps.version == 1)
    627			return -EINVAL;
    628
    629		val = caps->user_source;
    630		break;
    631	default:
    632		return -EINVAL;
    633	}
    634
    635	return sysfs_emit(buf, "%llu\n", val);
    636}
    637
    638static ssize_t occ_show_caps_3(struct device *dev,
    639			       struct device_attribute *attr, char *buf)
    640{
    641	int rc;
    642	u64 val = 0;
    643	struct caps_sensor_3 *caps;
    644	struct occ *occ = dev_get_drvdata(dev);
    645	struct occ_sensors *sensors = &occ->sensors;
    646	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    647
    648	rc = occ_update_response(occ);
    649	if (rc)
    650		return rc;
    651
    652	caps = ((struct caps_sensor_3 *)sensors->caps.data) + sattr->index;
    653
    654	switch (sattr->nr) {
    655	case 0:
    656		return sysfs_emit(buf, "system\n");
    657	case 1:
    658		val = get_unaligned_be16(&caps->cap) * 1000000ULL;
    659		break;
    660	case 2:
    661		val = get_unaligned_be16(&caps->system_power) * 1000000ULL;
    662		break;
    663	case 3:
    664		val = get_unaligned_be16(&caps->n_cap) * 1000000ULL;
    665		break;
    666	case 4:
    667		val = get_unaligned_be16(&caps->max) * 1000000ULL;
    668		break;
    669	case 5:
    670		val = get_unaligned_be16(&caps->hard_min) * 1000000ULL;
    671		break;
    672	case 6:
    673		val = get_unaligned_be16(&caps->user) * 1000000ULL;
    674		break;
    675	case 7:
    676		val = caps->user_source;
    677		break;
    678	case 8:
    679		val = get_unaligned_be16(&caps->soft_min) * 1000000ULL;
    680		break;
    681	default:
    682		return -EINVAL;
    683	}
    684
    685	return sysfs_emit(buf, "%llu\n", val);
    686}
    687
    688static ssize_t occ_store_caps_user(struct device *dev,
    689				   struct device_attribute *attr,
    690				   const char *buf, size_t count)
    691{
    692	int rc;
    693	u16 user_power_cap;
    694	unsigned long long value;
    695	struct occ *occ = dev_get_drvdata(dev);
    696
    697	rc = kstrtoull(buf, 0, &value);
    698	if (rc)
    699		return rc;
    700
    701	user_power_cap = div64_u64(value, 1000000ULL); /* microwatt to watt */
    702
    703	rc = occ_set_user_power_cap(occ, user_power_cap);
    704	if (rc)
    705		return rc;
    706
    707	return count;
    708}
    709
    710static ssize_t occ_show_extended(struct device *dev,
    711				 struct device_attribute *attr, char *buf)
    712{
    713	int rc;
    714	struct extended_sensor *extn;
    715	struct occ *occ = dev_get_drvdata(dev);
    716	struct occ_sensors *sensors = &occ->sensors;
    717	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
    718
    719	rc = occ_update_response(occ);
    720	if (rc)
    721		return rc;
    722
    723	extn = ((struct extended_sensor *)sensors->extended.data) +
    724		sattr->index;
    725
    726	switch (sattr->nr) {
    727	case 0:
    728		if (extn->flags & EXTN_FLAG_SENSOR_ID) {
    729			rc = sysfs_emit(buf, "%u",
    730					get_unaligned_be32(&extn->sensor_id));
    731		} else {
    732			rc = sysfs_emit(buf, "%02x%02x%02x%02x\n",
    733					extn->name[0], extn->name[1],
    734					extn->name[2], extn->name[3]);
    735		}
    736		break;
    737	case 1:
    738		rc = sysfs_emit(buf, "%02x\n", extn->flags);
    739		break;
    740	case 2:
    741		rc = sysfs_emit(buf, "%02x%02x%02x%02x%02x%02x\n",
    742				extn->data[0], extn->data[1], extn->data[2],
    743				extn->data[3], extn->data[4], extn->data[5]);
    744		break;
    745	default:
    746		return -EINVAL;
    747	}
    748
    749	return rc;
    750}
    751
    752/*
    753 * Some helper macros to make it easier to define an occ_attribute. Since these
    754 * are dynamically allocated, we shouldn't use the existing kernel macros which
    755 * stringify the name argument.
    756 */
    757#define ATTR_OCC(_name, _mode, _show, _store) {				\
    758	.attr	= {							\
    759		.name = _name,						\
    760		.mode = VERIFY_OCTAL_PERMISSIONS(_mode),		\
    761	},								\
    762	.show	= _show,						\
    763	.store	= _store,						\
    764}
    765
    766#define SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index) {	\
    767	.dev_attr	= ATTR_OCC(_name, _mode, _show, _store),	\
    768	.index		= _index,					\
    769	.nr		= _nr,						\
    770}
    771
    772#define OCC_INIT_ATTR(_name, _mode, _show, _store, _nr, _index)		\
    773	((struct sensor_device_attribute_2)				\
    774		SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index))
    775
    776/*
    777 * Allocate and instatiate sensor_device_attribute_2s. It's most efficient to
    778 * use our own instead of the built-in hwmon attribute types.
    779 */
    780static int occ_setup_sensor_attrs(struct occ *occ)
    781{
    782	unsigned int i, s, num_attrs = 0;
    783	struct device *dev = occ->bus_dev;
    784	struct occ_sensors *sensors = &occ->sensors;
    785	struct occ_attribute *attr;
    786	struct temp_sensor_2 *temp;
    787	ssize_t (*show_temp)(struct device *, struct device_attribute *,
    788			     char *) = occ_show_temp_1;
    789	ssize_t (*show_freq)(struct device *, struct device_attribute *,
    790			     char *) = occ_show_freq_1;
    791	ssize_t (*show_power)(struct device *, struct device_attribute *,
    792			      char *) = occ_show_power_1;
    793	ssize_t (*show_caps)(struct device *, struct device_attribute *,
    794			     char *) = occ_show_caps_1_2;
    795
    796	switch (sensors->temp.version) {
    797	case 1:
    798		num_attrs += (sensors->temp.num_sensors * 2);
    799		break;
    800	case 2:
    801		num_attrs += (sensors->temp.num_sensors * 4);
    802		show_temp = occ_show_temp_2;
    803		break;
    804	case 0x10:
    805		num_attrs += (sensors->temp.num_sensors * 5);
    806		show_temp = occ_show_temp_10;
    807		break;
    808	default:
    809		sensors->temp.num_sensors = 0;
    810	}
    811
    812	switch (sensors->freq.version) {
    813	case 2:
    814		show_freq = occ_show_freq_2;
    815		fallthrough;
    816	case 1:
    817		num_attrs += (sensors->freq.num_sensors * 2);
    818		break;
    819	default:
    820		sensors->freq.num_sensors = 0;
    821	}
    822
    823	switch (sensors->power.version) {
    824	case 2:
    825		show_power = occ_show_power_2;
    826		fallthrough;
    827	case 1:
    828		num_attrs += (sensors->power.num_sensors * 4);
    829		break;
    830	case 0xA0:
    831		num_attrs += (sensors->power.num_sensors * 16);
    832		show_power = occ_show_power_a0;
    833		break;
    834	default:
    835		sensors->power.num_sensors = 0;
    836	}
    837
    838	switch (sensors->caps.version) {
    839	case 1:
    840		num_attrs += (sensors->caps.num_sensors * 7);
    841		break;
    842	case 2:
    843		num_attrs += (sensors->caps.num_sensors * 8);
    844		break;
    845	case 3:
    846		show_caps = occ_show_caps_3;
    847		num_attrs += (sensors->caps.num_sensors * 9);
    848		break;
    849	default:
    850		sensors->caps.num_sensors = 0;
    851	}
    852
    853	switch (sensors->extended.version) {
    854	case 1:
    855		num_attrs += (sensors->extended.num_sensors * 3);
    856		break;
    857	default:
    858		sensors->extended.num_sensors = 0;
    859	}
    860
    861	occ->attrs = devm_kzalloc(dev, sizeof(*occ->attrs) * num_attrs,
    862				  GFP_KERNEL);
    863	if (!occ->attrs)
    864		return -ENOMEM;
    865
    866	/* null-terminated list */
    867	occ->group.attrs = devm_kzalloc(dev, sizeof(*occ->group.attrs) *
    868					num_attrs + 1, GFP_KERNEL);
    869	if (!occ->group.attrs)
    870		return -ENOMEM;
    871
    872	attr = occ->attrs;
    873
    874	for (i = 0; i < sensors->temp.num_sensors; ++i) {
    875		s = i + 1;
    876		temp = ((struct temp_sensor_2 *)sensors->temp.data) + i;
    877
    878		snprintf(attr->name, sizeof(attr->name), "temp%d_label", s);
    879		attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL,
    880					     0, i);
    881		attr++;
    882
    883		if (sensors->temp.version == 2 &&
    884		    temp->fru_type == OCC_FRU_TYPE_VRM) {
    885			snprintf(attr->name, sizeof(attr->name),
    886				 "temp%d_alarm", s);
    887		} else {
    888			snprintf(attr->name, sizeof(attr->name),
    889				 "temp%d_input", s);
    890		}
    891
    892		attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL,
    893					     1, i);
    894		attr++;
    895
    896		if (sensors->temp.version > 1) {
    897			snprintf(attr->name, sizeof(attr->name),
    898				 "temp%d_fru_type", s);
    899			attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
    900						     show_temp, NULL, 2, i);
    901			attr++;
    902
    903			snprintf(attr->name, sizeof(attr->name),
    904				 "temp%d_fault", s);
    905			attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
    906						     show_temp, NULL, 3, i);
    907			attr++;
    908
    909			if (sensors->temp.version == 0x10) {
    910				snprintf(attr->name, sizeof(attr->name),
    911					 "temp%d_max", s);
    912				attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
    913							     show_temp, NULL,
    914							     4, i);
    915				attr++;
    916			}
    917		}
    918	}
    919
    920	for (i = 0; i < sensors->freq.num_sensors; ++i) {
    921		s = i + 1;
    922
    923		snprintf(attr->name, sizeof(attr->name), "freq%d_label", s);
    924		attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL,
    925					     0, i);
    926		attr++;
    927
    928		snprintf(attr->name, sizeof(attr->name), "freq%d_input", s);
    929		attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL,
    930					     1, i);
    931		attr++;
    932	}
    933
    934	if (sensors->power.version == 0xA0) {
    935		/*
    936		 * Special case for many-attribute power sensor. Split it into
    937		 * a sensor number per power type, emulating several sensors.
    938		 */
    939		for (i = 0; i < sensors->power.num_sensors; ++i) {
    940			unsigned int j;
    941			unsigned int nr = 0;
    942
    943			s = (i * 4) + 1;
    944
    945			for (j = 0; j < 4; ++j) {
    946				snprintf(attr->name, sizeof(attr->name),
    947					 "power%d_label", s);
    948				attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
    949							     show_power, NULL,
    950							     nr++, i);
    951				attr++;
    952
    953				snprintf(attr->name, sizeof(attr->name),
    954					 "power%d_average", s);
    955				attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
    956							     show_power, NULL,
    957							     nr++, i);
    958				attr++;
    959
    960				snprintf(attr->name, sizeof(attr->name),
    961					 "power%d_average_interval", s);
    962				attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
    963							     show_power, NULL,
    964							     nr++, i);
    965				attr++;
    966
    967				snprintf(attr->name, sizeof(attr->name),
    968					 "power%d_input", s);
    969				attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
    970							     show_power, NULL,
    971							     nr++, i);
    972				attr++;
    973
    974				s++;
    975			}
    976		}
    977
    978		s = (sensors->power.num_sensors * 4) + 1;
    979	} else {
    980		for (i = 0; i < sensors->power.num_sensors; ++i) {
    981			s = i + 1;
    982
    983			snprintf(attr->name, sizeof(attr->name),
    984				 "power%d_label", s);
    985			attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
    986						     show_power, NULL, 0, i);
    987			attr++;
    988
    989			snprintf(attr->name, sizeof(attr->name),
    990				 "power%d_average", s);
    991			attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
    992						     show_power, NULL, 1, i);
    993			attr++;
    994
    995			snprintf(attr->name, sizeof(attr->name),
    996				 "power%d_average_interval", s);
    997			attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
    998						     show_power, NULL, 2, i);
    999			attr++;
   1000
   1001			snprintf(attr->name, sizeof(attr->name),
   1002				 "power%d_input", s);
   1003			attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
   1004						     show_power, NULL, 3, i);
   1005			attr++;
   1006		}
   1007
   1008		s = sensors->power.num_sensors + 1;
   1009	}
   1010
   1011	if (sensors->caps.num_sensors >= 1) {
   1012		snprintf(attr->name, sizeof(attr->name), "power%d_label", s);
   1013		attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
   1014					     0, 0);
   1015		attr++;
   1016
   1017		snprintf(attr->name, sizeof(attr->name), "power%d_cap", s);
   1018		attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
   1019					     1, 0);
   1020		attr++;
   1021
   1022		snprintf(attr->name, sizeof(attr->name), "power%d_input", s);
   1023		attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
   1024					     2, 0);
   1025		attr++;
   1026
   1027		snprintf(attr->name, sizeof(attr->name),
   1028			 "power%d_cap_not_redundant", s);
   1029		attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
   1030					     3, 0);
   1031		attr++;
   1032
   1033		snprintf(attr->name, sizeof(attr->name), "power%d_cap_max", s);
   1034		attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
   1035					     4, 0);
   1036		attr++;
   1037
   1038		snprintf(attr->name, sizeof(attr->name), "power%d_cap_min", s);
   1039		attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL,
   1040					     5, 0);
   1041		attr++;
   1042
   1043		snprintf(attr->name, sizeof(attr->name), "power%d_cap_user",
   1044			 s);
   1045		attr->sensor = OCC_INIT_ATTR(attr->name, 0644, show_caps,
   1046					     occ_store_caps_user, 6, 0);
   1047		attr++;
   1048
   1049		if (sensors->caps.version > 1) {
   1050			snprintf(attr->name, sizeof(attr->name),
   1051				 "power%d_cap_user_source", s);
   1052			attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
   1053						     show_caps, NULL, 7, 0);
   1054			attr++;
   1055
   1056			if (sensors->caps.version > 2) {
   1057				snprintf(attr->name, sizeof(attr->name),
   1058					 "power%d_cap_min_soft", s);
   1059				attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
   1060							     show_caps, NULL,
   1061							     8, 0);
   1062				attr++;
   1063			}
   1064		}
   1065	}
   1066
   1067	for (i = 0; i < sensors->extended.num_sensors; ++i) {
   1068		s = i + 1;
   1069
   1070		snprintf(attr->name, sizeof(attr->name), "extn%d_label", s);
   1071		attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
   1072					     occ_show_extended, NULL, 0, i);
   1073		attr++;
   1074
   1075		snprintf(attr->name, sizeof(attr->name), "extn%d_flags", s);
   1076		attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
   1077					     occ_show_extended, NULL, 1, i);
   1078		attr++;
   1079
   1080		snprintf(attr->name, sizeof(attr->name), "extn%d_input", s);
   1081		attr->sensor = OCC_INIT_ATTR(attr->name, 0444,
   1082					     occ_show_extended, NULL, 2, i);
   1083		attr++;
   1084	}
   1085
   1086	/* put the sensors in the group */
   1087	for (i = 0; i < num_attrs; ++i) {
   1088		sysfs_attr_init(&occ->attrs[i].sensor.dev_attr.attr);
   1089		occ->group.attrs[i] = &occ->attrs[i].sensor.dev_attr.attr;
   1090	}
   1091
   1092	return 0;
   1093}
   1094
   1095/* only need to do this once at startup, as OCC won't change sensors on us */
   1096static void occ_parse_poll_response(struct occ *occ)
   1097{
   1098	unsigned int i, old_offset, offset = 0, size = 0;
   1099	struct occ_sensor *sensor;
   1100	struct occ_sensors *sensors = &occ->sensors;
   1101	struct occ_response *resp = &occ->resp;
   1102	struct occ_poll_response *poll =
   1103		(struct occ_poll_response *)&resp->data[0];
   1104	struct occ_poll_response_header *header = &poll->header;
   1105	struct occ_sensor_data_block *block = &poll->block;
   1106
   1107	dev_info(occ->bus_dev, "OCC found, code level: %.16s\n",
   1108		 header->occ_code_level);
   1109
   1110	for (i = 0; i < header->num_sensor_data_blocks; ++i) {
   1111		block = (struct occ_sensor_data_block *)((u8 *)block + offset);
   1112		old_offset = offset;
   1113		offset = (block->header.num_sensors *
   1114			  block->header.sensor_length) + sizeof(block->header);
   1115		size += offset;
   1116
   1117		/* validate all the length/size fields */
   1118		if ((size + sizeof(*header)) >= OCC_RESP_DATA_BYTES) {
   1119			dev_warn(occ->bus_dev, "exceeded response buffer\n");
   1120			return;
   1121		}
   1122
   1123		dev_dbg(occ->bus_dev, " %04x..%04x: %.4s (%d sensors)\n",
   1124			old_offset, offset - 1, block->header.eye_catcher,
   1125			block->header.num_sensors);
   1126
   1127		/* match sensor block type */
   1128		if (strncmp(block->header.eye_catcher, "TEMP", 4) == 0)
   1129			sensor = &sensors->temp;
   1130		else if (strncmp(block->header.eye_catcher, "FREQ", 4) == 0)
   1131			sensor = &sensors->freq;
   1132		else if (strncmp(block->header.eye_catcher, "POWR", 4) == 0)
   1133			sensor = &sensors->power;
   1134		else if (strncmp(block->header.eye_catcher, "CAPS", 4) == 0)
   1135			sensor = &sensors->caps;
   1136		else if (strncmp(block->header.eye_catcher, "EXTN", 4) == 0)
   1137			sensor = &sensors->extended;
   1138		else {
   1139			dev_warn(occ->bus_dev, "sensor not supported %.4s\n",
   1140				 block->header.eye_catcher);
   1141			continue;
   1142		}
   1143
   1144		sensor->num_sensors = block->header.num_sensors;
   1145		sensor->version = block->header.sensor_format;
   1146		sensor->data = &block->data;
   1147	}
   1148
   1149	dev_dbg(occ->bus_dev, "Max resp size: %u+%zd=%zd\n", size,
   1150		sizeof(*header), size + sizeof(*header));
   1151}
   1152
   1153int occ_active(struct occ *occ, bool active)
   1154{
   1155	int rc = mutex_lock_interruptible(&occ->lock);
   1156
   1157	if (rc)
   1158		return rc;
   1159
   1160	if (active) {
   1161		if (occ->active) {
   1162			rc = -EALREADY;
   1163			goto unlock;
   1164		}
   1165
   1166		occ->error_count = 0;
   1167		occ->last_safe = 0;
   1168
   1169		rc = occ_poll(occ);
   1170		if (rc < 0) {
   1171			dev_err(occ->bus_dev,
   1172				"failed to get OCC poll response=%02x: %d\n",
   1173				occ->resp.return_status, rc);
   1174			goto unlock;
   1175		}
   1176
   1177		occ->active = true;
   1178		occ->next_update = jiffies + OCC_UPDATE_FREQUENCY;
   1179		occ_parse_poll_response(occ);
   1180
   1181		rc = occ_setup_sensor_attrs(occ);
   1182		if (rc) {
   1183			dev_err(occ->bus_dev,
   1184				"failed to setup sensor attrs: %d\n", rc);
   1185			goto unlock;
   1186		}
   1187
   1188		occ->hwmon = hwmon_device_register_with_groups(occ->bus_dev,
   1189							       "occ", occ,
   1190							       occ->groups);
   1191		if (IS_ERR(occ->hwmon)) {
   1192			rc = PTR_ERR(occ->hwmon);
   1193			occ->hwmon = NULL;
   1194			dev_err(occ->bus_dev,
   1195				"failed to register hwmon device: %d\n", rc);
   1196			goto unlock;
   1197		}
   1198	} else {
   1199		if (!occ->active) {
   1200			rc = -EALREADY;
   1201			goto unlock;
   1202		}
   1203
   1204		if (occ->hwmon)
   1205			hwmon_device_unregister(occ->hwmon);
   1206		occ->active = false;
   1207		occ->hwmon = NULL;
   1208	}
   1209
   1210unlock:
   1211	mutex_unlock(&occ->lock);
   1212	return rc;
   1213}
   1214
   1215int occ_setup(struct occ *occ)
   1216{
   1217	int rc;
   1218
   1219	mutex_init(&occ->lock);
   1220	occ->groups[0] = &occ->group;
   1221
   1222	rc = occ_setup_sysfs(occ);
   1223	if (rc)
   1224		dev_err(occ->bus_dev, "failed to setup sysfs: %d\n", rc);
   1225
   1226	return rc;
   1227}
   1228EXPORT_SYMBOL_GPL(occ_setup);
   1229
   1230void occ_shutdown(struct occ *occ)
   1231{
   1232	mutex_lock(&occ->lock);
   1233
   1234	occ_shutdown_sysfs(occ);
   1235
   1236	if (occ->hwmon)
   1237		hwmon_device_unregister(occ->hwmon);
   1238	occ->hwmon = NULL;
   1239
   1240	mutex_unlock(&occ->lock);
   1241}
   1242EXPORT_SYMBOL_GPL(occ_shutdown);
   1243
   1244MODULE_AUTHOR("Eddie James <eajames@linux.ibm.com>");
   1245MODULE_DESCRIPTION("Common OCC hwmon code");
   1246MODULE_LICENSE("GPL");