Lines Matching +full:core +full:- +full:pcs

1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (c) 2018-2021 Intel Corporation
11 #include <linux/peci-cpu.h>
64 struct peci_sensor_data core[CORE_NUMS_MAX]; member
90 u32 pcs; in update_temp_target() local
93 if (!peci_sensor_need_update(&priv->temp.target.state)) in update_temp_target()
96 ret = peci_pcs_read(priv->peci_dev, PECI_PCS_TEMP_TARGET, 0, &pcs); in update_temp_target()
100 priv->temp.target.tjmax = in update_temp_target()
101 FIELD_GET(TEMP_TARGET_REF_TEMP_MASK, pcs) * MILLIDEGREE_PER_DEGREE; in update_temp_target()
103 tcontrol_margin = FIELD_GET(TEMP_TARGET_FAN_TEMP_MASK, pcs); in update_temp_target()
105 priv->temp.target.tcontrol = priv->temp.target.tjmax - tcontrol_margin; in update_temp_target()
107 tthrottle_offset = FIELD_GET(TEMP_TARGET_TJ_OFFSET_MASK, pcs) * MILLIDEGREE_PER_DEGREE; in update_temp_target()
108 priv->temp.target.tthrottle = priv->temp.target.tjmax - tthrottle_offset; in update_temp_target()
110 peci_sensor_mark_updated(&priv->temp.target.state); in update_temp_target()
119 mutex_lock(&priv->temp.target.state.lock); in get_temp_target()
127 *val = priv->temp.target.tcontrol; in get_temp_target()
130 *val = priv->temp.target.tthrottle; in get_temp_target()
133 *val = priv->temp.target.tjmax; in get_temp_target()
136 *val = priv->temp.target.tjmax - priv->temp.target.tcontrol; in get_temp_target()
139 ret = -EOPNOTSUPP; in get_temp_target()
143 mutex_unlock(&priv->temp.target.state.lock); in get_temp_target()
153 * 0x8003-0x81ff: Reserved
162 * (16 bits: 10-bit signed magnitude, 6-bit fraction).
171 * point format (16 bits: 8-bit signed magnitude, 8-bit fraction).
184 mutex_lock(&priv->temp.die.state.lock); in get_die_temp()
185 if (!peci_sensor_need_update(&priv->temp.die.state)) in get_die_temp()
188 ret = peci_temp_read(priv->peci_dev, &temp); in get_die_temp()
193 ret = -EIO; in get_die_temp()
201 priv->temp.die.value = (s32)tjmax + dts_ten_dot_six_to_millidegree(temp); in get_die_temp()
203 peci_sensor_mark_updated(&priv->temp.die.state); in get_die_temp()
206 *val = priv->temp.die.value; in get_die_temp()
208 mutex_unlock(&priv->temp.die.state.lock); in get_die_temp()
217 u32 pcs; in get_dts() local
219 mutex_lock(&priv->temp.dts.state.lock); in get_dts()
220 if (!peci_sensor_need_update(&priv->temp.dts.state)) in get_dts()
223 ret = peci_pcs_read(priv->peci_dev, PECI_PCS_THERMAL_MARGIN, 0, &pcs); in get_dts()
227 thermal_margin = FIELD_GET(DTS_MARGIN_MASK, pcs); in get_dts()
229 ret = -EIO; in get_dts()
238 priv->temp.dts.value = in get_dts()
239 (s32)tcontrol - priv->gen_info->thermal_margin_to_millidegree(thermal_margin); in get_dts()
241 peci_sensor_mark_updated(&priv->temp.dts.state); in get_dts()
244 *val = priv->temp.dts.value; in get_dts()
246 mutex_unlock(&priv->temp.dts.state.lock); in get_dts()
255 u32 pcs; in get_core_temp() local
257 mutex_lock(&priv->temp.core[core_index].state.lock); in get_core_temp()
258 if (!peci_sensor_need_update(&priv->temp.core[core_index].state)) in get_core_temp()
261 ret = peci_pcs_read(priv->peci_dev, PECI_PCS_MODULE_TEMP, core_index, &pcs); in get_core_temp()
265 core_dts_margin = FIELD_GET(PCS_MODULE_TEMP_MASK, pcs); in get_core_temp()
267 ret = -EIO; in get_core_temp()
276 priv->temp.core[core_index].value = in get_core_temp()
279 peci_sensor_mark_updated(&priv->temp.core[core_index].state); in get_core_temp()
282 *val = priv->temp.core[core_index].value; in get_core_temp()
284 mutex_unlock(&priv->temp.core[core_index].state.lock); in get_core_temp()
294 return -EOPNOTSUPP; in cputemp_read_string()
297 cputemp_label[channel] : priv->coretemp_label[channel - channel_core]; in cputemp_read_string()
321 return get_core_temp(priv, channel - channel_core, val); in cputemp_read()
331 return -EOPNOTSUPP; in cputemp_read()
348 if (test_bit(channel - channel_core, priv->core_mask)) in cputemp_is_visible()
356 struct peci_device *peci_dev = priv->peci_dev; in init_core_mask()
357 struct resolved_cores_reg *reg = priv->gen_info->reg; in init_core_mask()
363 switch (peci_dev->info.x86_vfm) { in init_core_mask()
367 ret = peci_ep_pci_local_read(peci_dev, 0, reg->bus, reg->dev, in init_core_mask()
368 reg->func, reg->offset + 4, &data); in init_core_mask()
374 ret = peci_ep_pci_local_read(peci_dev, 0, reg->bus, reg->dev, in init_core_mask()
375 reg->func, reg->offset, &data); in init_core_mask()
383 ret = peci_pci_local_read(peci_dev, reg->bus, reg->dev, in init_core_mask()
384 reg->func, reg->offset, &data); in init_core_mask()
394 return -EIO; in init_core_mask()
396 bitmap_from_u64(priv->core_mask, core_mask); in init_core_mask()
403 unsigned long core_max = find_last_bit(priv->core_mask, CORE_NUMS_MAX); in create_temp_label()
406 priv->coretemp_label = devm_kzalloc(priv->dev, (core_max + 1) * sizeof(char *), GFP_KERNEL); in create_temp_label()
407 if (!priv->coretemp_label) in create_temp_label()
408 return -ENOMEM; in create_temp_label()
410 for_each_set_bit(i, priv->core_mask, CORE_NUMS_MAX) { in create_temp_label()
411 priv->coretemp_label[i] = devm_kasprintf(priv->dev, GFP_KERNEL, "Core %d", i); in create_temp_label()
412 if (!priv->coretemp_label[i]) in create_temp_label()
413 return -ENOMEM; in create_temp_label()
422 * Failure to resolve cores is non-critical, we're still able to in check_resolved_cores()
430 bitmap_zero(priv->core_mask, CORE_NUMS_MAX); in check_resolved_cores()
437 mutex_init(&priv->temp.target.state.lock); in sensor_init()
438 mutex_init(&priv->temp.die.state.lock); in sensor_init()
439 mutex_init(&priv->temp.dts.state.lock); in sensor_init()
441 for_each_set_bit(i, priv->core_mask, CORE_NUMS_MAX) in sensor_init()
442 mutex_init(&priv->temp.core[i].state.lock); in sensor_init()
465 /* Core temperature - for all core channels */
466 [channel_core ... CPUTEMP_CHANNEL_NUMS - 1] =
479 struct device *dev = &adev->dev; in peci_cputemp_probe()
480 struct peci_device *peci_dev = to_peci_device(dev->parent); in peci_cputemp_probe()
486 return -ENOMEM; in peci_cputemp_probe()
488 priv->name = devm_kasprintf(dev, GFP_KERNEL, "peci_cputemp.cpu%d", in peci_cputemp_probe()
489 peci_dev->info.socket_id); in peci_cputemp_probe()
490 if (!priv->name) in peci_cputemp_probe()
491 return -ENOMEM; in peci_cputemp_probe()
493 priv->dev = dev; in peci_cputemp_probe()
494 priv->peci_dev = peci_dev; in peci_cputemp_probe()
495 priv->gen_info = (const struct cpu_info *)id->driver_data; in peci_cputemp_probe()
502 if (peci_dev->info.peci_revision < priv->gen_info->min_peci_revision) in peci_cputemp_probe()
503 dev_warn(priv->dev, in peci_cputemp_probe()
505 peci_dev->info.peci_revision); in peci_cputemp_probe()
511 hwmon_dev = devm_hwmon_device_register_with_info(priv->dev, priv->name, in peci_cputemp_probe()