Lines Matching refs:hwmon

6 #include <linux/hwmon.h>
7 #include <linux/hwmon-sysfs.h>
19 * SF_* - scale factors for particular quantities according to hwmon spec.
47 struct i915_hwmon *hwmon;
71 struct i915_hwmon *hwmon = ddat->hwmon;
75 mutex_lock(&hwmon->hwmon_lock);
80 mutex_unlock(&hwmon->hwmon_lock);
119 * the hwmon API. Using x86_64 128 bit arithmetic (see mul_u64_u32_shr()),
121 * hwmon->scl_shift_energy of 14 bits we have 57 (63 - 20 + 14) bits before
128 struct i915_hwmon *hwmon = ddat->hwmon;
135 rgaddr = hwmon->rg.energy_status_tile;
137 rgaddr = hwmon->rg.energy_status_all;
139 mutex_lock(&hwmon->hwmon_lock);
151 hwmon->scl_shift_energy);
152 mutex_unlock(&hwmon->hwmon_lock);
160 struct i915_hwmon *hwmon = ddat->hwmon;
166 r = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit);
179 /* val in hwmon interface units (millisec) */
180 out = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w);
191 struct i915_hwmon *hwmon = ddat->hwmon;
203 * The hwmon->scl_shift_time default of 0xa results in a max tau of 256 seconds
208 * val must be < max in hwmon interface units. The steps below are
215 max_win = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w);
221 val = DIV_ROUND_CLOSEST_ULL((u64)val << hwmon->scl_shift_time, SF_TIME);
235 hwm_locked_with_pm_intel_uncore_rmw(ddat, hwmon->rg.pkg_rapl_limit,
254 struct i915_hwmon *hwmon = ddat->hwmon;
257 return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? attr->mode : 0;
318 struct i915_hwmon *hwmon = ddat->hwmon;
325 reg_value = intel_uncore_read(ddat->uncore, hwmon->rg.gt_perf_status);
338 struct i915_hwmon *hwmon = ddat->hwmon;
343 return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? 0664 : 0;
345 return i915_mmio_reg_valid(hwmon->rg.pkg_power_sku) ? 0444 : 0;
365 struct i915_hwmon *hwmon = ddat->hwmon;
371 r = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit);
378 hwmon->rg.pkg_rapl_limit,
380 hwmon->scl_shift_power,
384 r = intel_uncore_read64(ddat->uncore, hwmon->rg.pkg_power_sku);
386 min = mul_u64_u32_shr(min, SF_POWER, hwmon->scl_shift_power);
388 max = mul_u64_u32_shr(max, SF_POWER, hwmon->scl_shift_power);
399 struct i915_hwmon *hwmon = ddat->hwmon;
407 mutex_lock(&hwmon->hwmon_lock);
411 if (!hwmon->ddat.reset_in_progress)
419 mutex_unlock(&hwmon->hwmon_lock);
431 intel_uncore_rmw(ddat->uncore, hwmon->rg.pkg_rapl_limit,
433 nval = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit);
441 nval = DIV_ROUND_CLOSEST_ULL((u64)val << hwmon->scl_shift_power, SF_POWER);
444 intel_uncore_rmw(ddat->uncore, hwmon->rg.pkg_rapl_limit,
449 mutex_unlock(&hwmon->hwmon_lock);
456 struct i915_hwmon *hwmon = ddat->hwmon;
465 hwmon->rg.pkg_power_sku,
467 hwmon->scl_shift_power,
502 struct i915_hwmon *hwmon = i915->hwmon;
505 if (!hwmon || !i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit))
508 mutex_lock(&hwmon->hwmon_lock);
510 hwmon->ddat.reset_in_progress = true;
511 r = intel_uncore_rmw(hwmon->ddat.uncore, hwmon->rg.pkg_rapl_limit,
515 mutex_unlock(&hwmon->hwmon_lock);
520 struct i915_hwmon *hwmon = i915->hwmon;
522 if (!hwmon || !i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit))
525 mutex_lock(&hwmon->hwmon_lock);
527 intel_uncore_rmw(hwmon->ddat.uncore, hwmon->rg.pkg_rapl_limit,
529 hwmon->ddat.reset_in_progress = false;
530 wake_up_all(&hwmon->ddat.waitq);
532 mutex_unlock(&hwmon->hwmon_lock);
538 struct i915_hwmon *hwmon = ddat->hwmon;
544 rgaddr = hwmon->rg.energy_status_tile;
546 rgaddr = hwmon->rg.energy_status_all;
723 struct i915_hwmon *hwmon = i915->hwmon;
725 struct hwm_drvdata *ddat = &hwmon->ddat;
733 hwmon->rg.gt_perf_status = GEN12_RPSTAT1;
736 hwmon->rg.pkg_power_sku_unit = PCU_PACKAGE_POWER_SKU_UNIT;
737 hwmon->rg.pkg_power_sku = PCU_PACKAGE_POWER_SKU;
738 hwmon->rg.pkg_rapl_limit = PCU_PACKAGE_RAPL_LIMIT;
739 hwmon->rg.energy_status_all = PCU_PACKAGE_ENERGY_STATUS;
740 hwmon->rg.energy_status_tile = INVALID_MMIO_REG;
742 hwmon->rg.pkg_power_sku_unit = GT0_PACKAGE_POWER_SKU_UNIT;
743 hwmon->rg.pkg_power_sku = INVALID_MMIO_REG;
744 hwmon->rg.pkg_rapl_limit = GT0_PACKAGE_RAPL_LIMIT;
745 hwmon->rg.energy_status_all = GT0_PLATFORM_ENERGY_STATUS;
746 hwmon->rg.energy_status_tile = GT0_PACKAGE_ENERGY_STATUS;
748 hwmon->rg.pkg_power_sku_unit = INVALID_MMIO_REG;
749 hwmon->rg.pkg_power_sku = INVALID_MMIO_REG;
750 hwmon->rg.pkg_rapl_limit = INVALID_MMIO_REG;
751 hwmon->rg.energy_status_all = INVALID_MMIO_REG;
752 hwmon->rg.energy_status_tile = INVALID_MMIO_REG;
757 * The contents of register hwmon->rg.pkg_power_sku_unit do not change,
760 if (i915_mmio_reg_valid(hwmon->rg.pkg_power_sku_unit))
762 hwmon->rg.pkg_power_sku_unit);
765 hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit);
766 hwmon->scl_shift_energy = REG_FIELD_GET(PKG_ENERGY_UNIT, val_sku_unit);
767 hwmon->scl_shift_time = REG_FIELD_GET(PKG_TIME_UNIT, val_sku_unit);
773 if (i915_mmio_reg_valid(hwmon->rg.energy_status_all))
775 if (i915_mmio_reg_valid(hwmon->rg.energy_status_tile)) {
777 hwm_energy(&hwmon->ddat_gt[i], &energy);
784 struct i915_hwmon *hwmon;
791 /* hwmon is available only for dGfx */
795 hwmon = devm_kzalloc(dev, sizeof(*hwmon), GFP_KERNEL);
796 if (!hwmon)
799 i915->hwmon = hwmon;
800 mutex_init(&hwmon->hwmon_lock);
801 ddat = &hwmon->ddat;
803 ddat->hwmon = hwmon;
810 ddat_gt = hwmon->ddat_gt + i;
812 ddat_gt->hwmon = hwmon;
820 /* hwmon_dev points to device hwmon<i> */
826 i915->hwmon = NULL;
833 ddat_gt = hwmon->ddat_gt + i;
852 fetch_and_zero(&i915->hwmon);