1f005ef32Sjsg // SPDX-License-Identifier: MIT
2f005ef32Sjsg /*
3f005ef32Sjsg * Copyright © 2022 Intel Corporation
4f005ef32Sjsg */
5f005ef32Sjsg
6f005ef32Sjsg #include <linux/hwmon.h>
7f005ef32Sjsg #include <linux/hwmon-sysfs.h>
8f005ef32Sjsg #include <linux/types.h>
9f005ef32Sjsg
10f005ef32Sjsg #include "i915_drv.h"
11f005ef32Sjsg #include "i915_hwmon.h"
12f005ef32Sjsg #include "i915_reg.h"
13f005ef32Sjsg #include "intel_mchbar_regs.h"
14f005ef32Sjsg #include "intel_pcode.h"
15f005ef32Sjsg #include "gt/intel_gt.h"
16f005ef32Sjsg #include "gt/intel_gt_regs.h"
17f005ef32Sjsg
18f005ef32Sjsg /*
19f005ef32Sjsg * SF_* - scale factors for particular quantities according to hwmon spec.
20f005ef32Sjsg * - voltage - millivolts
21f005ef32Sjsg * - power - microwatts
22f005ef32Sjsg * - curr - milliamperes
23f005ef32Sjsg * - energy - microjoules
24f005ef32Sjsg * - time - milliseconds
25f005ef32Sjsg */
26f005ef32Sjsg #define SF_VOLTAGE 1000
27f005ef32Sjsg #define SF_POWER 1000000
28f005ef32Sjsg #define SF_CURR 1000
29f005ef32Sjsg #define SF_ENERGY 1000000
30f005ef32Sjsg #define SF_TIME 1000
31f005ef32Sjsg
32f005ef32Sjsg struct hwm_reg {
33f005ef32Sjsg i915_reg_t gt_perf_status;
34f005ef32Sjsg i915_reg_t pkg_power_sku_unit;
35f005ef32Sjsg i915_reg_t pkg_power_sku;
36f005ef32Sjsg i915_reg_t pkg_rapl_limit;
37f005ef32Sjsg i915_reg_t energy_status_all;
38f005ef32Sjsg i915_reg_t energy_status_tile;
39f005ef32Sjsg };
40f005ef32Sjsg
41f005ef32Sjsg struct hwm_energy_info {
42f005ef32Sjsg u32 reg_val_prev;
43f005ef32Sjsg long accum_energy; /* Accumulated energy for energy1_input */
44f005ef32Sjsg };
45f005ef32Sjsg
46f005ef32Sjsg struct hwm_drvdata {
47f005ef32Sjsg struct i915_hwmon *hwmon;
48f005ef32Sjsg struct intel_uncore *uncore;
49f005ef32Sjsg struct device *hwmon_dev;
50f005ef32Sjsg struct hwm_energy_info ei; /* Energy info for energy1_input */
51f005ef32Sjsg char name[12];
52f005ef32Sjsg int gt_n;
53f005ef32Sjsg bool reset_in_progress;
54f005ef32Sjsg wait_queue_head_t waitq;
55f005ef32Sjsg };
56f005ef32Sjsg
57f005ef32Sjsg struct i915_hwmon {
58f005ef32Sjsg struct hwm_drvdata ddat;
59f005ef32Sjsg struct hwm_drvdata ddat_gt[I915_MAX_GT];
60f005ef32Sjsg struct rwlock hwmon_lock; /* counter overflow logic and rmw */
61f005ef32Sjsg struct hwm_reg rg;
62f005ef32Sjsg int scl_shift_power;
63f005ef32Sjsg int scl_shift_energy;
64f005ef32Sjsg int scl_shift_time;
65f005ef32Sjsg };
66f005ef32Sjsg
67f005ef32Sjsg static void
hwm_locked_with_pm_intel_uncore_rmw(struct hwm_drvdata * ddat,i915_reg_t reg,u32 clear,u32 set)68f005ef32Sjsg hwm_locked_with_pm_intel_uncore_rmw(struct hwm_drvdata *ddat,
69f005ef32Sjsg i915_reg_t reg, u32 clear, u32 set)
70f005ef32Sjsg {
71f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
72f005ef32Sjsg struct intel_uncore *uncore = ddat->uncore;
73f005ef32Sjsg intel_wakeref_t wakeref;
74f005ef32Sjsg
75f8ef3464Sjsg with_intel_runtime_pm(uncore->rpm, wakeref) {
76f005ef32Sjsg mutex_lock(&hwmon->hwmon_lock);
77f005ef32Sjsg
78f005ef32Sjsg intel_uncore_rmw(uncore, reg, clear, set);
79f005ef32Sjsg
80f005ef32Sjsg mutex_unlock(&hwmon->hwmon_lock);
81f005ef32Sjsg }
82f8ef3464Sjsg }
83f005ef32Sjsg
84f005ef32Sjsg /*
85f005ef32Sjsg * This function's return type of u64 allows for the case where the scaling
86f005ef32Sjsg * of the field taken from the 32-bit register value might cause a result to
87f005ef32Sjsg * exceed 32 bits.
88f005ef32Sjsg */
89f005ef32Sjsg static u64
hwm_field_read_and_scale(struct hwm_drvdata * ddat,i915_reg_t rgadr,u32 field_msk,int nshift,u32 scale_factor)90f005ef32Sjsg hwm_field_read_and_scale(struct hwm_drvdata *ddat, i915_reg_t rgadr,
91f005ef32Sjsg u32 field_msk, int nshift, u32 scale_factor)
92f005ef32Sjsg {
93f005ef32Sjsg struct intel_uncore *uncore = ddat->uncore;
94f005ef32Sjsg intel_wakeref_t wakeref;
95f005ef32Sjsg u32 reg_value;
96f005ef32Sjsg
97f005ef32Sjsg with_intel_runtime_pm(uncore->rpm, wakeref)
98f005ef32Sjsg reg_value = intel_uncore_read(uncore, rgadr);
99f005ef32Sjsg
100f005ef32Sjsg reg_value = REG_FIELD_GET(field_msk, reg_value);
101f005ef32Sjsg
102f005ef32Sjsg return mul_u64_u32_shr(reg_value, scale_factor, nshift);
103f005ef32Sjsg }
104f005ef32Sjsg
105f005ef32Sjsg /*
106f005ef32Sjsg * hwm_energy - Obtain energy value
107f005ef32Sjsg *
108f005ef32Sjsg * The underlying energy hardware register is 32-bits and is subject to
109f005ef32Sjsg * overflow. How long before overflow? For example, with an example
110f005ef32Sjsg * scaling bit shift of 14 bits (see register *PACKAGE_POWER_SKU_UNIT) and
111f005ef32Sjsg * a power draw of 1000 watts, the 32-bit counter will overflow in
112f005ef32Sjsg * approximately 4.36 minutes.
113f005ef32Sjsg *
114f005ef32Sjsg * Examples:
115f005ef32Sjsg * 1 watt: (2^32 >> 14) / 1 W / (60 * 60 * 24) secs/day -> 3 days
116f005ef32Sjsg * 1000 watts: (2^32 >> 14) / 1000 W / 60 secs/min -> 4.36 minutes
117f005ef32Sjsg *
118f005ef32Sjsg * The function significantly increases overflow duration (from 4.36
119f005ef32Sjsg * minutes) by accumulating the energy register into a 'long' as allowed by
120f005ef32Sjsg * the hwmon API. Using x86_64 128 bit arithmetic (see mul_u64_u32_shr()),
121f005ef32Sjsg * a 'long' of 63 bits, SF_ENERGY of 1e6 (~20 bits) and
122f005ef32Sjsg * hwmon->scl_shift_energy of 14 bits we have 57 (63 - 20 + 14) bits before
123f005ef32Sjsg * energy1_input overflows. This at 1000 W is an overflow duration of 278 years.
124f005ef32Sjsg */
125f005ef32Sjsg static void
hwm_energy(struct hwm_drvdata * ddat,long * energy)126f005ef32Sjsg hwm_energy(struct hwm_drvdata *ddat, long *energy)
127f005ef32Sjsg {
128f005ef32Sjsg struct intel_uncore *uncore = ddat->uncore;
129f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
130f005ef32Sjsg struct hwm_energy_info *ei = &ddat->ei;
131f005ef32Sjsg intel_wakeref_t wakeref;
132f005ef32Sjsg i915_reg_t rgaddr;
133f005ef32Sjsg u32 reg_val;
134f005ef32Sjsg
135f005ef32Sjsg if (ddat->gt_n >= 0)
136f005ef32Sjsg rgaddr = hwmon->rg.energy_status_tile;
137f005ef32Sjsg else
138f005ef32Sjsg rgaddr = hwmon->rg.energy_status_all;
139f005ef32Sjsg
140f8ef3464Sjsg with_intel_runtime_pm(uncore->rpm, wakeref) {
141f005ef32Sjsg mutex_lock(&hwmon->hwmon_lock);
142f005ef32Sjsg
143f005ef32Sjsg reg_val = intel_uncore_read(uncore, rgaddr);
144f005ef32Sjsg
145f005ef32Sjsg if (reg_val >= ei->reg_val_prev)
146f005ef32Sjsg ei->accum_energy += reg_val - ei->reg_val_prev;
147f005ef32Sjsg else
148f005ef32Sjsg ei->accum_energy += UINT_MAX - ei->reg_val_prev + reg_val;
149f005ef32Sjsg ei->reg_val_prev = reg_val;
150f005ef32Sjsg
151f005ef32Sjsg *energy = mul_u64_u32_shr(ei->accum_energy, SF_ENERGY,
152f005ef32Sjsg hwmon->scl_shift_energy);
153f005ef32Sjsg mutex_unlock(&hwmon->hwmon_lock);
154f005ef32Sjsg }
155f8ef3464Sjsg }
156f005ef32Sjsg
157f005ef32Sjsg static ssize_t
hwm_power1_max_interval_show(struct device * dev,struct device_attribute * attr,char * buf)158f005ef32Sjsg hwm_power1_max_interval_show(struct device *dev, struct device_attribute *attr,
159f005ef32Sjsg char *buf)
160f005ef32Sjsg {
161f005ef32Sjsg struct hwm_drvdata *ddat = dev_get_drvdata(dev);
162f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
163f005ef32Sjsg intel_wakeref_t wakeref;
164f005ef32Sjsg u32 r, x, y, x_w = 2; /* 2 bits */
165f005ef32Sjsg u64 tau4, out;
166f005ef32Sjsg
167f005ef32Sjsg with_intel_runtime_pm(ddat->uncore->rpm, wakeref)
168f005ef32Sjsg r = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit);
169f005ef32Sjsg
170f005ef32Sjsg x = REG_FIELD_GET(PKG_PWR_LIM_1_TIME_X, r);
171f005ef32Sjsg y = REG_FIELD_GET(PKG_PWR_LIM_1_TIME_Y, r);
172f005ef32Sjsg /*
173f005ef32Sjsg * tau = 1.x * power(2,y), x = bits(23:22), y = bits(21:17)
174f005ef32Sjsg * = (4 | x) << (y - 2)
175f005ef32Sjsg * where (y - 2) ensures a 1.x fixed point representation of 1.x
176f005ef32Sjsg * However because y can be < 2, we compute
177f005ef32Sjsg * tau4 = (4 | x) << y
178f005ef32Sjsg * but add 2 when doing the final right shift to account for units
179f005ef32Sjsg */
180f005ef32Sjsg tau4 = (u64)((1 << x_w) | x) << y;
181f005ef32Sjsg /* val in hwmon interface units (millisec) */
182f005ef32Sjsg out = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w);
183f005ef32Sjsg
184f005ef32Sjsg return sysfs_emit(buf, "%llu\n", out);
185f005ef32Sjsg }
186f005ef32Sjsg
187f005ef32Sjsg static ssize_t
hwm_power1_max_interval_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)188f005ef32Sjsg hwm_power1_max_interval_store(struct device *dev,
189f005ef32Sjsg struct device_attribute *attr,
190f005ef32Sjsg const char *buf, size_t count)
191f005ef32Sjsg {
192f005ef32Sjsg struct hwm_drvdata *ddat = dev_get_drvdata(dev);
193f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
194f005ef32Sjsg u32 x, y, rxy, x_w = 2; /* 2 bits */
195f005ef32Sjsg u64 tau4, r, max_win;
196f005ef32Sjsg unsigned long val;
197f005ef32Sjsg int ret;
198f005ef32Sjsg
199f005ef32Sjsg ret = kstrtoul(buf, 0, &val);
200f005ef32Sjsg if (ret)
201f005ef32Sjsg return ret;
202f005ef32Sjsg
203f005ef32Sjsg /*
204f005ef32Sjsg * Max HW supported tau in '1.x * power(2,y)' format, x = 0, y = 0x12
205f005ef32Sjsg * The hwmon->scl_shift_time default of 0xa results in a max tau of 256 seconds
206f005ef32Sjsg */
207f005ef32Sjsg #define PKG_MAX_WIN_DEFAULT 0x12ull
208f005ef32Sjsg
209f005ef32Sjsg /*
210f005ef32Sjsg * val must be < max in hwmon interface units. The steps below are
211f005ef32Sjsg * explained in i915_power1_max_interval_show()
212f005ef32Sjsg */
213f005ef32Sjsg r = FIELD_PREP(PKG_MAX_WIN, PKG_MAX_WIN_DEFAULT);
214f005ef32Sjsg x = REG_FIELD_GET(PKG_MAX_WIN_X, r);
215f005ef32Sjsg y = REG_FIELD_GET(PKG_MAX_WIN_Y, r);
216f005ef32Sjsg tau4 = (u64)((1 << x_w) | x) << y;
217f005ef32Sjsg max_win = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w);
218f005ef32Sjsg
219f005ef32Sjsg if (val > max_win)
220f005ef32Sjsg return -EINVAL;
221f005ef32Sjsg
222f005ef32Sjsg /* val in hw units */
223f005ef32Sjsg val = DIV_ROUND_CLOSEST_ULL((u64)val << hwmon->scl_shift_time, SF_TIME);
224f005ef32Sjsg /* Convert to 1.x * power(2,y) */
225f005ef32Sjsg if (!val) {
226f005ef32Sjsg /* Avoid ilog2(0) */
227f005ef32Sjsg y = 0;
228f005ef32Sjsg x = 0;
229f005ef32Sjsg } else {
230f005ef32Sjsg y = ilog2(val);
231f005ef32Sjsg /* x = (val - (1 << y)) >> (y - 2); */
232f005ef32Sjsg x = (val - (1ul << y)) << x_w >> y;
233f005ef32Sjsg }
234f005ef32Sjsg
235f005ef32Sjsg rxy = REG_FIELD_PREP(PKG_PWR_LIM_1_TIME_X, x) | REG_FIELD_PREP(PKG_PWR_LIM_1_TIME_Y, y);
236f005ef32Sjsg
237f005ef32Sjsg hwm_locked_with_pm_intel_uncore_rmw(ddat, hwmon->rg.pkg_rapl_limit,
238f005ef32Sjsg PKG_PWR_LIM_1_TIME, rxy);
239f005ef32Sjsg return count;
240f005ef32Sjsg }
241f005ef32Sjsg
242f005ef32Sjsg static SENSOR_DEVICE_ATTR(power1_max_interval, 0664,
243f005ef32Sjsg hwm_power1_max_interval_show,
244f005ef32Sjsg hwm_power1_max_interval_store, 0);
245f005ef32Sjsg
246f005ef32Sjsg static struct attribute *hwm_attributes[] = {
247f005ef32Sjsg &sensor_dev_attr_power1_max_interval.dev_attr.attr,
248f005ef32Sjsg NULL
249f005ef32Sjsg };
250f005ef32Sjsg
hwm_attributes_visible(struct kobject * kobj,struct attribute * attr,int index)251f005ef32Sjsg static umode_t hwm_attributes_visible(struct kobject *kobj,
252f005ef32Sjsg struct attribute *attr, int index)
253f005ef32Sjsg {
254f005ef32Sjsg struct device *dev = kobj_to_dev(kobj);
255f005ef32Sjsg struct hwm_drvdata *ddat = dev_get_drvdata(dev);
256f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
257f005ef32Sjsg
258f005ef32Sjsg if (attr == &sensor_dev_attr_power1_max_interval.dev_attr.attr)
259f005ef32Sjsg return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? attr->mode : 0;
260f005ef32Sjsg
261f005ef32Sjsg return 0;
262f005ef32Sjsg }
263f005ef32Sjsg
264f005ef32Sjsg static const struct attribute_group hwm_attrgroup = {
265f005ef32Sjsg .attrs = hwm_attributes,
266f005ef32Sjsg .is_visible = hwm_attributes_visible,
267f005ef32Sjsg };
268f005ef32Sjsg
269f005ef32Sjsg static const struct attribute_group *hwm_groups[] = {
270f005ef32Sjsg &hwm_attrgroup,
271f005ef32Sjsg NULL
272f005ef32Sjsg };
273f005ef32Sjsg
274f005ef32Sjsg static const struct hwmon_channel_info * const hwm_info[] = {
275f005ef32Sjsg HWMON_CHANNEL_INFO(in, HWMON_I_INPUT),
276f005ef32Sjsg HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX | HWMON_P_CRIT),
277f005ef32Sjsg HWMON_CHANNEL_INFO(energy, HWMON_E_INPUT),
278f005ef32Sjsg HWMON_CHANNEL_INFO(curr, HWMON_C_CRIT),
279f005ef32Sjsg NULL
280f005ef32Sjsg };
281f005ef32Sjsg
282f005ef32Sjsg static const struct hwmon_channel_info * const hwm_gt_info[] = {
283f005ef32Sjsg HWMON_CHANNEL_INFO(energy, HWMON_E_INPUT),
284f005ef32Sjsg NULL
285f005ef32Sjsg };
286f005ef32Sjsg
287f005ef32Sjsg /* I1 is exposed as power_crit or as curr_crit depending on bit 31 */
hwm_pcode_read_i1(struct drm_i915_private * i915,u32 * uval)288f005ef32Sjsg static int hwm_pcode_read_i1(struct drm_i915_private *i915, u32 *uval)
289f005ef32Sjsg {
290f005ef32Sjsg /* Avoid ILLEGAL_SUBCOMMAND "mailbox access failed" warning in snb_pcode_read */
291f005ef32Sjsg if (IS_DG1(i915) || IS_DG2(i915))
292f005ef32Sjsg return -ENXIO;
293f005ef32Sjsg
294f005ef32Sjsg return snb_pcode_read_p(&i915->uncore, PCODE_POWER_SETUP,
295f005ef32Sjsg POWER_SETUP_SUBCOMMAND_READ_I1, 0, uval);
296f005ef32Sjsg }
297f005ef32Sjsg
hwm_pcode_write_i1(struct drm_i915_private * i915,u32 uval)298f005ef32Sjsg static int hwm_pcode_write_i1(struct drm_i915_private *i915, u32 uval)
299f005ef32Sjsg {
300f005ef32Sjsg return snb_pcode_write_p(&i915->uncore, PCODE_POWER_SETUP,
301f005ef32Sjsg POWER_SETUP_SUBCOMMAND_WRITE_I1, 0, uval);
302f005ef32Sjsg }
303f005ef32Sjsg
304f005ef32Sjsg static umode_t
hwm_in_is_visible(const struct hwm_drvdata * ddat,u32 attr)305f005ef32Sjsg hwm_in_is_visible(const struct hwm_drvdata *ddat, u32 attr)
306f005ef32Sjsg {
307f005ef32Sjsg struct drm_i915_private *i915 = ddat->uncore->i915;
308f005ef32Sjsg
309f005ef32Sjsg switch (attr) {
310f005ef32Sjsg case hwmon_in_input:
311f005ef32Sjsg return IS_DG1(i915) || IS_DG2(i915) ? 0444 : 0;
312f005ef32Sjsg default:
313f005ef32Sjsg return 0;
314f005ef32Sjsg }
315f005ef32Sjsg }
316f005ef32Sjsg
317f005ef32Sjsg static int
hwm_in_read(struct hwm_drvdata * ddat,u32 attr,long * val)318f005ef32Sjsg hwm_in_read(struct hwm_drvdata *ddat, u32 attr, long *val)
319f005ef32Sjsg {
320f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
321f005ef32Sjsg intel_wakeref_t wakeref;
322f005ef32Sjsg u32 reg_value;
323f005ef32Sjsg
324f005ef32Sjsg switch (attr) {
325f005ef32Sjsg case hwmon_in_input:
326f005ef32Sjsg with_intel_runtime_pm(ddat->uncore->rpm, wakeref)
327f005ef32Sjsg reg_value = intel_uncore_read(ddat->uncore, hwmon->rg.gt_perf_status);
328f005ef32Sjsg /* HW register value in units of 2.5 millivolt */
329f005ef32Sjsg *val = DIV_ROUND_CLOSEST(REG_FIELD_GET(GEN12_VOLTAGE_MASK, reg_value) * 25, 10);
330f005ef32Sjsg return 0;
331f005ef32Sjsg default:
332f005ef32Sjsg return -EOPNOTSUPP;
333f005ef32Sjsg }
334f005ef32Sjsg }
335f005ef32Sjsg
336f005ef32Sjsg static umode_t
hwm_power_is_visible(const struct hwm_drvdata * ddat,u32 attr,int chan)337f005ef32Sjsg hwm_power_is_visible(const struct hwm_drvdata *ddat, u32 attr, int chan)
338f005ef32Sjsg {
339f005ef32Sjsg struct drm_i915_private *i915 = ddat->uncore->i915;
340f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
341f005ef32Sjsg u32 uval;
342f005ef32Sjsg
343f005ef32Sjsg switch (attr) {
344f005ef32Sjsg case hwmon_power_max:
345f005ef32Sjsg return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? 0664 : 0;
346f005ef32Sjsg case hwmon_power_rated_max:
347f005ef32Sjsg return i915_mmio_reg_valid(hwmon->rg.pkg_power_sku) ? 0444 : 0;
348f005ef32Sjsg case hwmon_power_crit:
349f005ef32Sjsg return (hwm_pcode_read_i1(i915, &uval) ||
350f005ef32Sjsg !(uval & POWER_SETUP_I1_WATTS)) ? 0 : 0644;
351f005ef32Sjsg default:
352f005ef32Sjsg return 0;
353f005ef32Sjsg }
354f005ef32Sjsg }
355f005ef32Sjsg
356f005ef32Sjsg #define PL1_DISABLE 0
357f005ef32Sjsg
358f005ef32Sjsg /*
359f005ef32Sjsg * HW allows arbitrary PL1 limits to be set but silently clamps these values to
360f005ef32Sjsg * "typical but not guaranteed" min/max values in rg.pkg_power_sku. Follow the
361f005ef32Sjsg * same pattern for sysfs, allow arbitrary PL1 limits to be set but display
362f005ef32Sjsg * clamped values when read. Write/read I1 also follows the same pattern.
363f005ef32Sjsg */
364f005ef32Sjsg static int
hwm_power_max_read(struct hwm_drvdata * ddat,long * val)365f005ef32Sjsg hwm_power_max_read(struct hwm_drvdata *ddat, long *val)
366f005ef32Sjsg {
367f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
368f005ef32Sjsg intel_wakeref_t wakeref;
369f005ef32Sjsg u64 r, min, max;
370f005ef32Sjsg
371f005ef32Sjsg /* Check if PL1 limit is disabled */
372f005ef32Sjsg with_intel_runtime_pm(ddat->uncore->rpm, wakeref)
373f005ef32Sjsg r = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit);
374f005ef32Sjsg if (!(r & PKG_PWR_LIM_1_EN)) {
375f005ef32Sjsg *val = PL1_DISABLE;
376f005ef32Sjsg return 0;
377f005ef32Sjsg }
378f005ef32Sjsg
379f005ef32Sjsg *val = hwm_field_read_and_scale(ddat,
380f005ef32Sjsg hwmon->rg.pkg_rapl_limit,
381f005ef32Sjsg PKG_PWR_LIM_1,
382f005ef32Sjsg hwmon->scl_shift_power,
383f005ef32Sjsg SF_POWER);
384f005ef32Sjsg
385f005ef32Sjsg with_intel_runtime_pm(ddat->uncore->rpm, wakeref)
386f005ef32Sjsg r = intel_uncore_read64(ddat->uncore, hwmon->rg.pkg_power_sku);
387f005ef32Sjsg min = REG_FIELD_GET(PKG_MIN_PWR, r);
388f005ef32Sjsg min = mul_u64_u32_shr(min, SF_POWER, hwmon->scl_shift_power);
389f005ef32Sjsg max = REG_FIELD_GET(PKG_MAX_PWR, r);
390f005ef32Sjsg max = mul_u64_u32_shr(max, SF_POWER, hwmon->scl_shift_power);
391f005ef32Sjsg
392f005ef32Sjsg if (min && max)
393f005ef32Sjsg *val = clamp_t(u64, *val, min, max);
394f005ef32Sjsg
395f005ef32Sjsg return 0;
396f005ef32Sjsg }
397f005ef32Sjsg
398f005ef32Sjsg static int
hwm_power_max_write(struct hwm_drvdata * ddat,long val)399f005ef32Sjsg hwm_power_max_write(struct hwm_drvdata *ddat, long val)
400f005ef32Sjsg {
401f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
402f005ef32Sjsg intel_wakeref_t wakeref;
403f005ef32Sjsg DEFINE_WAIT(wait);
404f005ef32Sjsg int ret = 0;
405f005ef32Sjsg u32 nval;
406f005ef32Sjsg
407f005ef32Sjsg /* Block waiting for GuC reset to complete when needed */
408f005ef32Sjsg for (;;) {
409f8ef3464Sjsg wakeref = intel_runtime_pm_get(ddat->uncore->rpm);
410f005ef32Sjsg mutex_lock(&hwmon->hwmon_lock);
411f005ef32Sjsg
412f005ef32Sjsg prepare_to_wait(&ddat->waitq, &wait, TASK_INTERRUPTIBLE);
413f005ef32Sjsg
414f005ef32Sjsg if (!hwmon->ddat.reset_in_progress)
415f005ef32Sjsg break;
416f005ef32Sjsg
417f005ef32Sjsg if (signal_pending(current)) {
418f005ef32Sjsg ret = -EINTR;
419f005ef32Sjsg break;
420f005ef32Sjsg }
421f005ef32Sjsg
422f005ef32Sjsg mutex_unlock(&hwmon->hwmon_lock);
423f8ef3464Sjsg intel_runtime_pm_put(ddat->uncore->rpm, wakeref);
424f005ef32Sjsg
425f005ef32Sjsg schedule();
426f005ef32Sjsg }
427f005ef32Sjsg finish_wait(&ddat->waitq, &wait);
428f005ef32Sjsg if (ret)
429f8ef3464Sjsg goto exit;
430f005ef32Sjsg
431f005ef32Sjsg /* Disable PL1 limit and verify, because the limit cannot be disabled on all platforms */
432f005ef32Sjsg if (val == PL1_DISABLE) {
433f005ef32Sjsg intel_uncore_rmw(ddat->uncore, hwmon->rg.pkg_rapl_limit,
434f005ef32Sjsg PKG_PWR_LIM_1_EN, 0);
435f005ef32Sjsg nval = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit);
436f005ef32Sjsg
437f005ef32Sjsg if (nval & PKG_PWR_LIM_1_EN)
438f005ef32Sjsg ret = -ENODEV;
439f005ef32Sjsg goto exit;
440f005ef32Sjsg }
441f005ef32Sjsg
442f005ef32Sjsg /* Computation in 64-bits to avoid overflow. Round to nearest. */
443f005ef32Sjsg nval = DIV_ROUND_CLOSEST_ULL((u64)val << hwmon->scl_shift_power, SF_POWER);
444f005ef32Sjsg nval = PKG_PWR_LIM_1_EN | REG_FIELD_PREP(PKG_PWR_LIM_1, nval);
445f005ef32Sjsg
446f005ef32Sjsg intel_uncore_rmw(ddat->uncore, hwmon->rg.pkg_rapl_limit,
447f005ef32Sjsg PKG_PWR_LIM_1_EN | PKG_PWR_LIM_1, nval);
448f005ef32Sjsg exit:
449f005ef32Sjsg mutex_unlock(&hwmon->hwmon_lock);
450f8ef3464Sjsg intel_runtime_pm_put(ddat->uncore->rpm, wakeref);
451f005ef32Sjsg return ret;
452f005ef32Sjsg }
453f005ef32Sjsg
454f005ef32Sjsg static int
hwm_power_read(struct hwm_drvdata * ddat,u32 attr,int chan,long * val)455f005ef32Sjsg hwm_power_read(struct hwm_drvdata *ddat, u32 attr, int chan, long *val)
456f005ef32Sjsg {
457f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
458f005ef32Sjsg int ret;
459f005ef32Sjsg u32 uval;
460f005ef32Sjsg
461f005ef32Sjsg switch (attr) {
462f005ef32Sjsg case hwmon_power_max:
463f005ef32Sjsg return hwm_power_max_read(ddat, val);
464f005ef32Sjsg case hwmon_power_rated_max:
465f005ef32Sjsg *val = hwm_field_read_and_scale(ddat,
466f005ef32Sjsg hwmon->rg.pkg_power_sku,
467f005ef32Sjsg PKG_PKG_TDP,
468f005ef32Sjsg hwmon->scl_shift_power,
469f005ef32Sjsg SF_POWER);
470f005ef32Sjsg return 0;
471f005ef32Sjsg case hwmon_power_crit:
472f005ef32Sjsg ret = hwm_pcode_read_i1(ddat->uncore->i915, &uval);
473f005ef32Sjsg if (ret)
474f005ef32Sjsg return ret;
475f005ef32Sjsg if (!(uval & POWER_SETUP_I1_WATTS))
476f005ef32Sjsg return -ENODEV;
477f005ef32Sjsg *val = mul_u64_u32_shr(REG_FIELD_GET(POWER_SETUP_I1_DATA_MASK, uval),
478f005ef32Sjsg SF_POWER, POWER_SETUP_I1_SHIFT);
479f005ef32Sjsg return 0;
480f005ef32Sjsg default:
481f005ef32Sjsg return -EOPNOTSUPP;
482f005ef32Sjsg }
483f005ef32Sjsg }
484f005ef32Sjsg
485f005ef32Sjsg static int
hwm_power_write(struct hwm_drvdata * ddat,u32 attr,int chan,long val)486f005ef32Sjsg hwm_power_write(struct hwm_drvdata *ddat, u32 attr, int chan, long val)
487f005ef32Sjsg {
488f005ef32Sjsg u32 uval;
489f005ef32Sjsg
490f005ef32Sjsg switch (attr) {
491f005ef32Sjsg case hwmon_power_max:
492f005ef32Sjsg return hwm_power_max_write(ddat, val);
493f005ef32Sjsg case hwmon_power_crit:
494f005ef32Sjsg uval = DIV_ROUND_CLOSEST_ULL(val << POWER_SETUP_I1_SHIFT, SF_POWER);
495f005ef32Sjsg return hwm_pcode_write_i1(ddat->uncore->i915, uval);
496f005ef32Sjsg default:
497f005ef32Sjsg return -EOPNOTSUPP;
498f005ef32Sjsg }
499f005ef32Sjsg }
500f005ef32Sjsg
i915_hwmon_power_max_disable(struct drm_i915_private * i915,bool * old)501f005ef32Sjsg void i915_hwmon_power_max_disable(struct drm_i915_private *i915, bool *old)
502f005ef32Sjsg {
503f005ef32Sjsg struct i915_hwmon *hwmon = i915->hwmon;
504f005ef32Sjsg u32 r;
505f005ef32Sjsg
506f005ef32Sjsg if (!hwmon || !i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit))
507f005ef32Sjsg return;
508f005ef32Sjsg
509f005ef32Sjsg mutex_lock(&hwmon->hwmon_lock);
510f005ef32Sjsg
511f005ef32Sjsg hwmon->ddat.reset_in_progress = true;
512f005ef32Sjsg r = intel_uncore_rmw(hwmon->ddat.uncore, hwmon->rg.pkg_rapl_limit,
513f005ef32Sjsg PKG_PWR_LIM_1_EN, 0);
514f005ef32Sjsg *old = !!(r & PKG_PWR_LIM_1_EN);
515f005ef32Sjsg
516f005ef32Sjsg mutex_unlock(&hwmon->hwmon_lock);
517f005ef32Sjsg }
518f005ef32Sjsg
i915_hwmon_power_max_restore(struct drm_i915_private * i915,bool old)519f005ef32Sjsg void i915_hwmon_power_max_restore(struct drm_i915_private *i915, bool old)
520f005ef32Sjsg {
521f005ef32Sjsg struct i915_hwmon *hwmon = i915->hwmon;
522f005ef32Sjsg
523f005ef32Sjsg if (!hwmon || !i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit))
524f005ef32Sjsg return;
525f005ef32Sjsg
526f005ef32Sjsg mutex_lock(&hwmon->hwmon_lock);
527f005ef32Sjsg
528f005ef32Sjsg intel_uncore_rmw(hwmon->ddat.uncore, hwmon->rg.pkg_rapl_limit,
529f005ef32Sjsg PKG_PWR_LIM_1_EN, old ? PKG_PWR_LIM_1_EN : 0);
530f005ef32Sjsg hwmon->ddat.reset_in_progress = false;
531f005ef32Sjsg wake_up_all(&hwmon->ddat.waitq);
532f005ef32Sjsg
533f005ef32Sjsg mutex_unlock(&hwmon->hwmon_lock);
534f005ef32Sjsg }
535f005ef32Sjsg
536f005ef32Sjsg static umode_t
hwm_energy_is_visible(const struct hwm_drvdata * ddat,u32 attr)537f005ef32Sjsg hwm_energy_is_visible(const struct hwm_drvdata *ddat, u32 attr)
538f005ef32Sjsg {
539f005ef32Sjsg struct i915_hwmon *hwmon = ddat->hwmon;
540f005ef32Sjsg i915_reg_t rgaddr;
541f005ef32Sjsg
542f005ef32Sjsg switch (attr) {
543f005ef32Sjsg case hwmon_energy_input:
544f005ef32Sjsg if (ddat->gt_n >= 0)
545f005ef32Sjsg rgaddr = hwmon->rg.energy_status_tile;
546f005ef32Sjsg else
547f005ef32Sjsg rgaddr = hwmon->rg.energy_status_all;
548f005ef32Sjsg return i915_mmio_reg_valid(rgaddr) ? 0444 : 0;
549f005ef32Sjsg default:
550f005ef32Sjsg return 0;
551f005ef32Sjsg }
552f005ef32Sjsg }
553f005ef32Sjsg
554f005ef32Sjsg static int
hwm_energy_read(struct hwm_drvdata * ddat,u32 attr,long * val)555f005ef32Sjsg hwm_energy_read(struct hwm_drvdata *ddat, u32 attr, long *val)
556f005ef32Sjsg {
557f005ef32Sjsg switch (attr) {
558f005ef32Sjsg case hwmon_energy_input:
559f005ef32Sjsg hwm_energy(ddat, val);
560f005ef32Sjsg return 0;
561f005ef32Sjsg default:
562f005ef32Sjsg return -EOPNOTSUPP;
563f005ef32Sjsg }
564f005ef32Sjsg }
565f005ef32Sjsg
566f005ef32Sjsg static umode_t
hwm_curr_is_visible(const struct hwm_drvdata * ddat,u32 attr)567f005ef32Sjsg hwm_curr_is_visible(const struct hwm_drvdata *ddat, u32 attr)
568f005ef32Sjsg {
569f005ef32Sjsg struct drm_i915_private *i915 = ddat->uncore->i915;
570f005ef32Sjsg u32 uval;
571f005ef32Sjsg
572f005ef32Sjsg switch (attr) {
573f005ef32Sjsg case hwmon_curr_crit:
574f005ef32Sjsg return (hwm_pcode_read_i1(i915, &uval) ||
575f005ef32Sjsg (uval & POWER_SETUP_I1_WATTS)) ? 0 : 0644;
576f005ef32Sjsg default:
577f005ef32Sjsg return 0;
578f005ef32Sjsg }
579f005ef32Sjsg }
580f005ef32Sjsg
581f005ef32Sjsg static int
hwm_curr_read(struct hwm_drvdata * ddat,u32 attr,long * val)582f005ef32Sjsg hwm_curr_read(struct hwm_drvdata *ddat, u32 attr, long *val)
583f005ef32Sjsg {
584f005ef32Sjsg int ret;
585f005ef32Sjsg u32 uval;
586f005ef32Sjsg
587f005ef32Sjsg switch (attr) {
588f005ef32Sjsg case hwmon_curr_crit:
589f005ef32Sjsg ret = hwm_pcode_read_i1(ddat->uncore->i915, &uval);
590f005ef32Sjsg if (ret)
591f005ef32Sjsg return ret;
592f005ef32Sjsg if (uval & POWER_SETUP_I1_WATTS)
593f005ef32Sjsg return -ENODEV;
594f005ef32Sjsg *val = mul_u64_u32_shr(REG_FIELD_GET(POWER_SETUP_I1_DATA_MASK, uval),
595f005ef32Sjsg SF_CURR, POWER_SETUP_I1_SHIFT);
596f005ef32Sjsg return 0;
597f005ef32Sjsg default:
598f005ef32Sjsg return -EOPNOTSUPP;
599f005ef32Sjsg }
600f005ef32Sjsg }
601f005ef32Sjsg
602f005ef32Sjsg static int
hwm_curr_write(struct hwm_drvdata * ddat,u32 attr,long val)603f005ef32Sjsg hwm_curr_write(struct hwm_drvdata *ddat, u32 attr, long val)
604f005ef32Sjsg {
605f005ef32Sjsg u32 uval;
606f005ef32Sjsg
607f005ef32Sjsg switch (attr) {
608f005ef32Sjsg case hwmon_curr_crit:
609f005ef32Sjsg uval = DIV_ROUND_CLOSEST_ULL(val << POWER_SETUP_I1_SHIFT, SF_CURR);
610f005ef32Sjsg return hwm_pcode_write_i1(ddat->uncore->i915, uval);
611f005ef32Sjsg default:
612f005ef32Sjsg return -EOPNOTSUPP;
613f005ef32Sjsg }
614f005ef32Sjsg }
615f005ef32Sjsg
616f005ef32Sjsg static umode_t
hwm_is_visible(const void * drvdata,enum hwmon_sensor_types type,u32 attr,int channel)617f005ef32Sjsg hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type,
618f005ef32Sjsg u32 attr, int channel)
619f005ef32Sjsg {
620f005ef32Sjsg struct hwm_drvdata *ddat = (struct hwm_drvdata *)drvdata;
621f005ef32Sjsg
622f005ef32Sjsg switch (type) {
623f005ef32Sjsg case hwmon_in:
624f005ef32Sjsg return hwm_in_is_visible(ddat, attr);
625f005ef32Sjsg case hwmon_power:
626f005ef32Sjsg return hwm_power_is_visible(ddat, attr, channel);
627f005ef32Sjsg case hwmon_energy:
628f005ef32Sjsg return hwm_energy_is_visible(ddat, attr);
629f005ef32Sjsg case hwmon_curr:
630f005ef32Sjsg return hwm_curr_is_visible(ddat, attr);
631f005ef32Sjsg default:
632f005ef32Sjsg return 0;
633f005ef32Sjsg }
634f005ef32Sjsg }
635f005ef32Sjsg
636f005ef32Sjsg static int
hwm_read(struct device * dev,enum hwmon_sensor_types type,u32 attr,int channel,long * val)637f005ef32Sjsg hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
638f005ef32Sjsg int channel, long *val)
639f005ef32Sjsg {
640f005ef32Sjsg struct hwm_drvdata *ddat = dev_get_drvdata(dev);
641f005ef32Sjsg
642f005ef32Sjsg switch (type) {
643f005ef32Sjsg case hwmon_in:
644f005ef32Sjsg return hwm_in_read(ddat, attr, val);
645f005ef32Sjsg case hwmon_power:
646f005ef32Sjsg return hwm_power_read(ddat, attr, channel, val);
647f005ef32Sjsg case hwmon_energy:
648f005ef32Sjsg return hwm_energy_read(ddat, attr, val);
649f005ef32Sjsg case hwmon_curr:
650f005ef32Sjsg return hwm_curr_read(ddat, attr, val);
651f005ef32Sjsg default:
652f005ef32Sjsg return -EOPNOTSUPP;
653f005ef32Sjsg }
654f005ef32Sjsg }
655f005ef32Sjsg
656f005ef32Sjsg static int
hwm_write(struct device * dev,enum hwmon_sensor_types type,u32 attr,int channel,long val)657f005ef32Sjsg hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
658f005ef32Sjsg int channel, long val)
659f005ef32Sjsg {
660f005ef32Sjsg struct hwm_drvdata *ddat = dev_get_drvdata(dev);
661f005ef32Sjsg
662f005ef32Sjsg switch (type) {
663f005ef32Sjsg case hwmon_power:
664f005ef32Sjsg return hwm_power_write(ddat, attr, channel, val);
665f005ef32Sjsg case hwmon_curr:
666f005ef32Sjsg return hwm_curr_write(ddat, attr, val);
667f005ef32Sjsg default:
668f005ef32Sjsg return -EOPNOTSUPP;
669f005ef32Sjsg }
670f005ef32Sjsg }
671f005ef32Sjsg
672f005ef32Sjsg static const struct hwmon_ops hwm_ops = {
673f005ef32Sjsg .is_visible = hwm_is_visible,
674f005ef32Sjsg .read = hwm_read,
675f005ef32Sjsg .write = hwm_write,
676f005ef32Sjsg };
677f005ef32Sjsg
678f005ef32Sjsg static const struct hwmon_chip_info hwm_chip_info = {
679f005ef32Sjsg .ops = &hwm_ops,
680f005ef32Sjsg .info = hwm_info,
681f005ef32Sjsg };
682f005ef32Sjsg
683f005ef32Sjsg static umode_t
hwm_gt_is_visible(const void * drvdata,enum hwmon_sensor_types type,u32 attr,int channel)684f005ef32Sjsg hwm_gt_is_visible(const void *drvdata, enum hwmon_sensor_types type,
685f005ef32Sjsg u32 attr, int channel)
686f005ef32Sjsg {
687f005ef32Sjsg struct hwm_drvdata *ddat = (struct hwm_drvdata *)drvdata;
688f005ef32Sjsg
689f005ef32Sjsg switch (type) {
690f005ef32Sjsg case hwmon_energy:
691f005ef32Sjsg return hwm_energy_is_visible(ddat, attr);
692f005ef32Sjsg default:
693f005ef32Sjsg return 0;
694f005ef32Sjsg }
695f005ef32Sjsg }
696f005ef32Sjsg
697f005ef32Sjsg static int
hwm_gt_read(struct device * dev,enum hwmon_sensor_types type,u32 attr,int channel,long * val)698f005ef32Sjsg hwm_gt_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
699f005ef32Sjsg int channel, long *val)
700f005ef32Sjsg {
701f005ef32Sjsg struct hwm_drvdata *ddat = dev_get_drvdata(dev);
702f005ef32Sjsg
703f005ef32Sjsg switch (type) {
704f005ef32Sjsg case hwmon_energy:
705f005ef32Sjsg return hwm_energy_read(ddat, attr, val);
706f005ef32Sjsg default:
707f005ef32Sjsg return -EOPNOTSUPP;
708f005ef32Sjsg }
709f005ef32Sjsg }
710f005ef32Sjsg
711f005ef32Sjsg static const struct hwmon_ops hwm_gt_ops = {
712f005ef32Sjsg .is_visible = hwm_gt_is_visible,
713f005ef32Sjsg .read = hwm_gt_read,
714f005ef32Sjsg };
715f005ef32Sjsg
716f005ef32Sjsg static const struct hwmon_chip_info hwm_gt_chip_info = {
717f005ef32Sjsg .ops = &hwm_gt_ops,
718f005ef32Sjsg .info = hwm_gt_info,
719f005ef32Sjsg };
720f005ef32Sjsg
721f005ef32Sjsg static void
hwm_get_preregistration_info(struct drm_i915_private * i915)722f005ef32Sjsg hwm_get_preregistration_info(struct drm_i915_private *i915)
723f005ef32Sjsg {
724f005ef32Sjsg struct i915_hwmon *hwmon = i915->hwmon;
725f005ef32Sjsg struct intel_uncore *uncore = &i915->uncore;
726f005ef32Sjsg struct hwm_drvdata *ddat = &hwmon->ddat;
727f005ef32Sjsg intel_wakeref_t wakeref;
728f005ef32Sjsg u32 val_sku_unit = 0;
729f005ef32Sjsg struct intel_gt *gt;
730f005ef32Sjsg long energy;
731f005ef32Sjsg int i;
732f005ef32Sjsg
733f005ef32Sjsg /* Available for all Gen12+/dGfx */
734f005ef32Sjsg hwmon->rg.gt_perf_status = GEN12_RPSTAT1;
735f005ef32Sjsg
736f005ef32Sjsg if (IS_DG1(i915) || IS_DG2(i915)) {
737f005ef32Sjsg hwmon->rg.pkg_power_sku_unit = PCU_PACKAGE_POWER_SKU_UNIT;
738f005ef32Sjsg hwmon->rg.pkg_power_sku = PCU_PACKAGE_POWER_SKU;
739f005ef32Sjsg hwmon->rg.pkg_rapl_limit = PCU_PACKAGE_RAPL_LIMIT;
740f005ef32Sjsg hwmon->rg.energy_status_all = PCU_PACKAGE_ENERGY_STATUS;
741f005ef32Sjsg hwmon->rg.energy_status_tile = INVALID_MMIO_REG;
742f005ef32Sjsg } else if (IS_XEHPSDV(i915)) {
743f005ef32Sjsg hwmon->rg.pkg_power_sku_unit = GT0_PACKAGE_POWER_SKU_UNIT;
744f005ef32Sjsg hwmon->rg.pkg_power_sku = INVALID_MMIO_REG;
745f005ef32Sjsg hwmon->rg.pkg_rapl_limit = GT0_PACKAGE_RAPL_LIMIT;
746f005ef32Sjsg hwmon->rg.energy_status_all = GT0_PLATFORM_ENERGY_STATUS;
747f005ef32Sjsg hwmon->rg.energy_status_tile = GT0_PACKAGE_ENERGY_STATUS;
748f005ef32Sjsg } else {
749f005ef32Sjsg hwmon->rg.pkg_power_sku_unit = INVALID_MMIO_REG;
750f005ef32Sjsg hwmon->rg.pkg_power_sku = INVALID_MMIO_REG;
751f005ef32Sjsg hwmon->rg.pkg_rapl_limit = INVALID_MMIO_REG;
752f005ef32Sjsg hwmon->rg.energy_status_all = INVALID_MMIO_REG;
753f005ef32Sjsg hwmon->rg.energy_status_tile = INVALID_MMIO_REG;
754f005ef32Sjsg }
755f005ef32Sjsg
756f005ef32Sjsg with_intel_runtime_pm(uncore->rpm, wakeref) {
757f005ef32Sjsg /*
758f005ef32Sjsg * The contents of register hwmon->rg.pkg_power_sku_unit do not change,
759f005ef32Sjsg * so read it once and store the shift values.
760f005ef32Sjsg */
761f005ef32Sjsg if (i915_mmio_reg_valid(hwmon->rg.pkg_power_sku_unit))
762f005ef32Sjsg val_sku_unit = intel_uncore_read(uncore,
763f005ef32Sjsg hwmon->rg.pkg_power_sku_unit);
764f005ef32Sjsg }
765f005ef32Sjsg
766f005ef32Sjsg hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit);
767f005ef32Sjsg hwmon->scl_shift_energy = REG_FIELD_GET(PKG_ENERGY_UNIT, val_sku_unit);
768f005ef32Sjsg hwmon->scl_shift_time = REG_FIELD_GET(PKG_TIME_UNIT, val_sku_unit);
769f005ef32Sjsg
770f005ef32Sjsg /*
771f005ef32Sjsg * Initialize 'struct hwm_energy_info', i.e. set fields to the
772f005ef32Sjsg * first value of the energy register read
773f005ef32Sjsg */
774f005ef32Sjsg if (i915_mmio_reg_valid(hwmon->rg.energy_status_all))
775f005ef32Sjsg hwm_energy(ddat, &energy);
776f005ef32Sjsg if (i915_mmio_reg_valid(hwmon->rg.energy_status_tile)) {
777f005ef32Sjsg for_each_gt(gt, i915, i)
778f005ef32Sjsg hwm_energy(&hwmon->ddat_gt[i], &energy);
779f005ef32Sjsg }
780f005ef32Sjsg }
781f005ef32Sjsg
i915_hwmon_register(struct drm_i915_private * i915)782f005ef32Sjsg void i915_hwmon_register(struct drm_i915_private *i915)
783f005ef32Sjsg {
784f005ef32Sjsg struct device *dev = i915->drm.dev;
785f005ef32Sjsg struct i915_hwmon *hwmon;
786f005ef32Sjsg struct device *hwmon_dev;
787f005ef32Sjsg struct hwm_drvdata *ddat;
788f005ef32Sjsg struct hwm_drvdata *ddat_gt;
789f005ef32Sjsg struct intel_gt *gt;
790f005ef32Sjsg int i;
791f005ef32Sjsg
792f005ef32Sjsg /* hwmon is available only for dGfx */
793f005ef32Sjsg if (!IS_DGFX(i915))
794f005ef32Sjsg return;
795f005ef32Sjsg
796*93befe74Sjsg hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL);
797f005ef32Sjsg if (!hwmon)
798f005ef32Sjsg return;
799f005ef32Sjsg
800f005ef32Sjsg i915->hwmon = hwmon;
801f005ef32Sjsg mutex_init(&hwmon->hwmon_lock);
802f005ef32Sjsg ddat = &hwmon->ddat;
803f005ef32Sjsg
804f005ef32Sjsg ddat->hwmon = hwmon;
805f005ef32Sjsg ddat->uncore = &i915->uncore;
806f005ef32Sjsg snprintf(ddat->name, sizeof(ddat->name), "i915");
807f005ef32Sjsg ddat->gt_n = -1;
808f005ef32Sjsg init_waitqueue_head(&ddat->waitq);
809f005ef32Sjsg
810f005ef32Sjsg for_each_gt(gt, i915, i) {
811f005ef32Sjsg ddat_gt = hwmon->ddat_gt + i;
812f005ef32Sjsg
813f005ef32Sjsg ddat_gt->hwmon = hwmon;
814f005ef32Sjsg ddat_gt->uncore = gt->uncore;
815f005ef32Sjsg snprintf(ddat_gt->name, sizeof(ddat_gt->name), "i915_gt%u", i);
816f005ef32Sjsg ddat_gt->gt_n = i;
817f005ef32Sjsg }
818f005ef32Sjsg
819f005ef32Sjsg hwm_get_preregistration_info(i915);
820f005ef32Sjsg
821f005ef32Sjsg /* hwmon_dev points to device hwmon<i> */
822*93befe74Sjsg hwmon_dev = hwmon_device_register_with_info(dev, ddat->name,
823f005ef32Sjsg ddat,
824f005ef32Sjsg &hwm_chip_info,
825f005ef32Sjsg hwm_groups);
826*93befe74Sjsg if (IS_ERR(hwmon_dev))
827*93befe74Sjsg goto err;
828f005ef32Sjsg
829f005ef32Sjsg ddat->hwmon_dev = hwmon_dev;
830f005ef32Sjsg
831f005ef32Sjsg for_each_gt(gt, i915, i) {
832f005ef32Sjsg ddat_gt = hwmon->ddat_gt + i;
833f005ef32Sjsg /*
834f005ef32Sjsg * Create per-gt directories only if a per-gt attribute is
835f005ef32Sjsg * visible. Currently this is only energy
836f005ef32Sjsg */
837f005ef32Sjsg if (!hwm_gt_is_visible(ddat_gt, hwmon_energy, hwmon_energy_input, 0))
838f005ef32Sjsg continue;
839f005ef32Sjsg
840*93befe74Sjsg hwmon_dev = hwmon_device_register_with_info(dev, ddat_gt->name,
841f005ef32Sjsg ddat_gt,
842f005ef32Sjsg &hwm_gt_chip_info,
843f005ef32Sjsg NULL);
844f005ef32Sjsg if (!IS_ERR(hwmon_dev))
845f005ef32Sjsg ddat_gt->hwmon_dev = hwmon_dev;
846f005ef32Sjsg }
847*93befe74Sjsg return;
848*93befe74Sjsg err:
849*93befe74Sjsg i915_hwmon_unregister(i915);
850f005ef32Sjsg }
851f005ef32Sjsg
i915_hwmon_unregister(struct drm_i915_private * i915)852f005ef32Sjsg void i915_hwmon_unregister(struct drm_i915_private *i915)
853f005ef32Sjsg {
854*93befe74Sjsg struct i915_hwmon *hwmon = i915->hwmon;
855*93befe74Sjsg struct intel_gt *gt;
856*93befe74Sjsg int i;
857*93befe74Sjsg
858*93befe74Sjsg if (!hwmon)
859*93befe74Sjsg return;
860*93befe74Sjsg
861*93befe74Sjsg for_each_gt(gt, i915, i)
862*93befe74Sjsg if (hwmon->ddat_gt[i].hwmon_dev)
863*93befe74Sjsg hwmon_device_unregister(hwmon->ddat_gt[i].hwmon_dev);
864*93befe74Sjsg
865*93befe74Sjsg if (hwmon->ddat.hwmon_dev)
866*93befe74Sjsg hwmon_device_unregister(hwmon->ddat.hwmon_dev);
867*93befe74Sjsg
868*93befe74Sjsg mutex_destroy(&hwmon->hwmon_lock);
869*93befe74Sjsg
870*93befe74Sjsg kfree(i915->hwmon);
871*93befe74Sjsg i915->hwmon = NULL;
872f005ef32Sjsg }
873