* [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support
@ 2022-09-27 5:50 Badal Nilawar
2022-09-27 5:50 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar
` (11 more replies)
0 siblings, 12 replies; 54+ messages in thread
From: Badal Nilawar @ 2022-09-27 5:50 UTC (permalink / raw)
To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel
This series adds the HWMON support for DGFX
Test-with: 20220919144408.251981-1-riana.tauro@intel.com
v2:
- Reorganized series. Created first patch as infrastructure patch
followed by feature patches. (Ashutosh)
- Fixed review comments (Jani)
- Fixed review comments (Ashutosh)
v3:
- Fixed review comments from Guenter
- Exposed energy inferface as standard hwmon interface (Ashutosh)
- For power interface added entries for critical power and maintained
standard interface for all the entries except
power1_max_interval
- Extended support for XEHPSDV (Ashutosh)
v4:
- Fixed review comment from Guenter
- Cleaned up unused code
v5:
- Fixed review comments (Jani)
v6:
- Fixed review comments (Ashutosh)
- Updated date and kernel version in documentation
v7:
- Fixed review comments (Anshuman)
- KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko)
v8: s/hwmon_device_register_with_info/
devm_hwmon_device_register_with_info/ (Ashutosh)
Ashutosh Dixit (2):
drm/i915/hwmon: Expose card reactive critical power
drm/i915/hwmon: Expose power1_max_interval
Dale B Stimson (4):
drm/i915/hwmon: Add HWMON infrastructure
drm/i915/hwmon: Power PL1 limit and TDP setting
drm/i915/hwmon: Show device level energy usage
drm/i915/hwmon: Extend power/energy for XEHPSDV
Riana Tauro (1):
drm/i915/hwmon: Add HWMON current voltage support
.../ABI/testing/sysfs-driver-intel-i915-hwmon | 75 ++
drivers/gpu/drm/i915/Makefile | 3 +
drivers/gpu/drm/i915/gt/intel_gt_regs.h | 8 +
drivers/gpu/drm/i915/i915_driver.c | 5 +
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/i915_hwmon.c | 736 ++++++++++++++++++
drivers/gpu/drm/i915/i915_hwmon.h | 20 +
drivers/gpu/drm/i915/i915_reg.h | 6 +
drivers/gpu/drm/i915/intel_mchbar_regs.h | 21 +
9 files changed, 876 insertions(+)
create mode 100644 Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h
--
2.25.1
^ permalink raw reply [flat|nested] 54+ messages in thread* [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar @ 2022-09-27 5:50 ` Badal Nilawar 2022-10-03 20:50 ` Andi Shyti 2022-09-27 5:50 ` [Intel-gfx] [PATCH 2/7] drm/i915/hwmon: Add HWMON current voltage support Badal Nilawar ` (10 subsequent siblings) 11 siblings, 1 reply; 54+ messages in thread From: Badal Nilawar @ 2022-09-27 5:50 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel From: Dale B Stimson <dale.b.stimson@intel.com> The i915 HWMON module will be used to expose voltage, power and energy values for dGfx. Here we set up i915 hwmon infrastructure including i915 hwmon registration, basic data structures and functions. v2: - Create HWMON infra patch (Ashutosh) - Fixed review comments (Jani) - Remove "select HWMON" from i915/Kconfig (Jani) v3: Use hwm_ prefix for static functions (Ashutosh) v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former doesn't work if hwmon is compiled as a module (Guenter) v5: Fixed review comments (Jani) v6: s/kzalloc/devm_kzalloc/ (Andi) v7: s/hwmon_device_register_with_info/ devm_hwmon_device_register_with_info/ (Ashutosh) Cc: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> --- drivers/gpu/drm/i915/Makefile | 3 + drivers/gpu/drm/i915/i915_driver.c | 5 ++ drivers/gpu/drm/i915/i915_drv.h | 2 + drivers/gpu/drm/i915/i915_hwmon.c | 122 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ 5 files changed, 152 insertions(+) create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index a26edcdadc21..66a6023e61a6 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -209,6 +209,9 @@ i915-y += gt/uc/intel_uc.o \ # graphics system controller (GSC) support i915-y += gt/intel_gsc.o +# graphics hardware monitoring (HWMON) support +i915-$(CONFIG_HWMON) += i915_hwmon.o + # modesetting core code i915-y += \ display/hsw_ips.o \ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index fb3826dabe8b..0aec1513ad71 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -81,6 +81,7 @@ #include "i915_drm_client.h" #include "i915_drv.h" #include "i915_getparam.h" +#include "i915_hwmon.h" #include "i915_ioc32.h" #include "i915_ioctl.h" #include "i915_irq.h" @@ -764,6 +765,8 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) for_each_gt(gt, dev_priv, i) intel_gt_driver_register(gt); + i915_hwmon_register(dev_priv); + intel_display_driver_register(dev_priv); intel_power_domains_enable(dev_priv); @@ -796,6 +799,8 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) for_each_gt(gt, dev_priv, i) intel_gt_driver_unregister(gt); + i915_hwmon_unregister(dev_priv); + i915_perf_unregister(dev_priv); i915_pmu_unregister(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 84a2f6b16f57..2447794ac58d 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -349,6 +349,8 @@ struct drm_i915_private { struct i915_perf perf; + struct i915_hwmon *hwmon; + /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ struct intel_gt gt0; diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c new file mode 100644 index 000000000000..231552fda374 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2022 Intel Corporation + */ + +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/types.h> + +#include "i915_drv.h" +#include "i915_hwmon.h" +#include "i915_reg.h" +#include "intel_mchbar_regs.h" + +struct hwm_reg { +}; + +struct hwm_drvdata { + struct i915_hwmon *hwmon; + struct intel_uncore *uncore; + struct device *hwmon_dev; + char name[12]; +}; + +struct i915_hwmon { + struct hwm_drvdata ddat; + struct mutex hwmon_lock; /* counter overflow logic and rmw */ + struct hwm_reg rg; +}; + +static const struct hwmon_channel_info *hwm_info[] = { + NULL +}; + +static umode_t +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + switch (type) { + default: + return 0; + } +} + +static int +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long *val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static int +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static const struct hwmon_ops hwm_ops = { + .is_visible = hwm_is_visible, + .read = hwm_read, + .write = hwm_write, +}; + +static const struct hwmon_chip_info hwm_chip_info = { + .ops = &hwm_ops, + .info = hwm_info, +}; + +static void +hwm_get_preregistration_info(struct drm_i915_private *i915) +{ +} + +void i915_hwmon_register(struct drm_i915_private *i915) +{ + struct device *dev = i915->drm.dev; + struct i915_hwmon *hwmon; + struct device *hwmon_dev; + struct hwm_drvdata *ddat; + + /* hwmon is available only for dGfx */ + if (!IS_DGFX(i915)) + return; + + hwmon = devm_kzalloc(dev, sizeof(*hwmon), GFP_KERNEL); + if (!hwmon) + return; + + i915->hwmon = hwmon; + mutex_init(&hwmon->hwmon_lock); + ddat = &hwmon->ddat; + + ddat->hwmon = hwmon; + ddat->uncore = &i915->uncore; + snprintf(ddat->name, sizeof(ddat->name), "i915"); + + hwm_get_preregistration_info(i915); + + /* hwmon_dev points to device hwmon<i> */ + hwmon_dev = devm_hwmon_device_register_with_info(dev, ddat->name, + ddat, + &hwm_chip_info, + NULL); + if (IS_ERR(hwmon_dev)) { + i915->hwmon = NULL; + return; + } + + ddat->hwmon_dev = hwmon_dev; +} + +void i915_hwmon_unregister(struct drm_i915_private *i915) +{ + fetch_and_zero(&i915->hwmon); +} diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h new file mode 100644 index 000000000000..7ca9cf2c34c9 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: MIT */ + +/* + * Copyright © 2022 Intel Corporation + */ + +#ifndef __I915_HWMON_H__ +#define __I915_HWMON_H__ + +struct drm_i915_private; + +#if IS_REACHABLE(CONFIG_HWMON) +void i915_hwmon_register(struct drm_i915_private *i915); +void i915_hwmon_unregister(struct drm_i915_private *i915); +#else +static inline void i915_hwmon_register(struct drm_i915_private *i915) { }; +static inline void i915_hwmon_unregister(struct drm_i915_private *i915) { }; +#endif + +#endif /* __I915_HWMON_H__ */ -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-27 5:50 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar @ 2022-10-03 20:50 ` Andi Shyti 0 siblings, 0 replies; 54+ messages in thread From: Andi Shyti @ 2022-10-03 20:50 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, intel-gfx, dri-devel Hi Badal, On Tue, Sep 27, 2022 at 11:20:14AM +0530, Badal Nilawar wrote: > From: Dale B Stimson <dale.b.stimson@intel.com> > > The i915 HWMON module will be used to expose voltage, power and energy > values for dGfx. Here we set up i915 hwmon infrastructure including i915 > hwmon registration, basic data structures and functions. > > v2: > - Create HWMON infra patch (Ashutosh) > - Fixed review comments (Jani) > - Remove "select HWMON" from i915/Kconfig (Jani) > v3: Use hwm_ prefix for static functions (Ashutosh) > v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former > doesn't work if hwmon is compiled as a module (Guenter) > v5: Fixed review comments (Jani) > v6: s/kzalloc/devm_kzalloc/ (Andi) > v7: s/hwmon_device_register_with_info/ > devm_hwmon_device_register_with_info/ (Ashutosh) > > Cc: Guenter Roeck <linux@roeck-us.net> > Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Signed-off-by: Riana Tauro <riana.tauro@intel.com> > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> > Acked-by: Guenter Roeck <linux@roeck-us.net> > Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com> Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 2/7] drm/i915/hwmon: Add HWMON current voltage support 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar 2022-09-27 5:50 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar @ 2022-09-27 5:50 ` Badal Nilawar 2022-10-03 20:56 ` Andi Shyti 2022-09-27 5:50 ` [Intel-gfx] [PATCH 3/7] drm/i915/hwmon: Power PL1 limit and TDP setting Badal Nilawar ` (9 subsequent siblings) 11 siblings, 1 reply; 54+ messages in thread From: Badal Nilawar @ 2022-09-27 5:50 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel From: Riana Tauro <riana.tauro@intel.com> Use i915 HWMON subsystem to display current input voltage. v2: - Updated date and kernel version in feature description - Fixed review comments (Ashutosh) v3: Use macro HWMON_CHANNEL_INFO to define hwmon channel (Guenter) v4: - Fixed review comments (Ashutosh) - Use hwm_ prefix for static functions (Ashutosh) v5: Added unit of voltage as millivolts (Ashutosh) v6: KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko) Cc: Guenter Roeck <linux@roeck-us.net> Cc: Anshuman Gupta <anshuman.gupta@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> --- .../ABI/testing/sysfs-driver-intel-i915-hwmon | 7 +++ drivers/gpu/drm/i915/gt/intel_gt_regs.h | 3 ++ drivers/gpu/drm/i915/i915_hwmon.c | 53 +++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon new file mode 100644 index 000000000000..cd9554c1a4f8 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon @@ -0,0 +1,7 @@ +What: /sys/devices/.../hwmon/hwmon<i>/in0_input +Date: February 2023 +KernelVersion: 6.2 +Contact: dri-devel@lists.freedesktop.org +Description: RO. Current Voltage in millivolt. + + Only supported for particular Intel i915 graphics platforms. diff --git a/drivers/gpu/drm/i915/gt/intel_gt_regs.h b/drivers/gpu/drm/i915/gt/intel_gt_regs.h index 7f79bbf97828..fcf5f9012852 100644 --- a/drivers/gpu/drm/i915/gt/intel_gt_regs.h +++ b/drivers/gpu/drm/i915/gt/intel_gt_regs.h @@ -1519,6 +1519,9 @@ #define VLV_RENDER_C0_COUNT _MMIO(0x138118) #define VLV_MEDIA_C0_COUNT _MMIO(0x13811c) +#define GEN12_RPSTAT1 _MMIO(0x1381b4) +#define GEN12_VOLTAGE_MASK REG_GENMASK(10, 0) + #define GEN11_GT_INTR_DW(x) _MMIO(0x190018 + ((x) * 4)) #define GEN11_CSME (31) #define GEN11_GUNIT (28) diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c index 231552fda374..9fcff6a884ee 100644 --- a/drivers/gpu/drm/i915/i915_hwmon.c +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -11,8 +11,16 @@ #include "i915_hwmon.h" #include "i915_reg.h" #include "intel_mchbar_regs.h" +#include "gt/intel_gt_regs.h" + +/* + * SF_* - scale factors for particular quantities according to hwmon spec. + * - voltage - millivolts + */ +#define SF_VOLTAGE 1000 struct hwm_reg { + i915_reg_t gt_perf_status; }; struct hwm_drvdata { @@ -29,14 +37,49 @@ struct i915_hwmon { }; static const struct hwmon_channel_info *hwm_info[] = { + HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), NULL }; +static umode_t +hwm_in_is_visible(const struct hwm_drvdata *ddat, u32 attr) +{ + switch (attr) { + case hwmon_in_input: + return i915_mmio_reg_valid(ddat->hwmon->rg.gt_perf_status) ? 0444 : 0; + default: + return 0; + } +} + +static int +hwm_in_read(struct hwm_drvdata *ddat, u32 attr, long *val) +{ + struct i915_hwmon *hwmon = ddat->hwmon; + intel_wakeref_t wakeref; + u32 reg_value; + + switch (attr) { + case hwmon_in_input: + with_intel_runtime_pm(ddat->uncore->rpm, wakeref) + reg_value = intel_uncore_read(ddat->uncore, hwmon->rg.gt_perf_status); + /* HW register value in units of 2.5 millivolt */ + *val = DIV_ROUND_CLOSEST(REG_FIELD_GET(GEN12_VOLTAGE_MASK, reg_value) * 25, 10); + return 0; + default: + return -EOPNOTSUPP; + } +} + static umode_t hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, int channel) { + struct hwm_drvdata *ddat = (struct hwm_drvdata *)drvdata; + switch (type) { + case hwmon_in: + return hwm_in_is_visible(ddat, attr); default: return 0; } @@ -46,7 +89,11 @@ static int hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long *val) { + struct hwm_drvdata *ddat = dev_get_drvdata(dev); + switch (type) { + case hwmon_in: + return hwm_in_read(ddat, attr, val); default: return -EOPNOTSUPP; } @@ -76,6 +123,12 @@ static const struct hwmon_chip_info hwm_chip_info = { static void hwm_get_preregistration_info(struct drm_i915_private *i915) { + struct i915_hwmon *hwmon = i915->hwmon; + + if (IS_DG1(i915) || IS_DG2(i915)) + hwmon->rg.gt_perf_status = GEN12_RPSTAT1; + else + hwmon->rg.gt_perf_status = INVALID_MMIO_REG; } void i915_hwmon_register(struct drm_i915_private *i915) -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 2/7] drm/i915/hwmon: Add HWMON current voltage support 2022-09-27 5:50 ` [Intel-gfx] [PATCH 2/7] drm/i915/hwmon: Add HWMON current voltage support Badal Nilawar @ 2022-10-03 20:56 ` Andi Shyti 2022-10-13 15:52 ` Dixit, Ashutosh 0 siblings, 1 reply; 54+ messages in thread From: Andi Shyti @ 2022-10-03 20:56 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, intel-gfx, dri-devel Hi Badal, [...] > static void > hwm_get_preregistration_info(struct drm_i915_private *i915) > { > + struct i915_hwmon *hwmon = i915->hwmon; > + > + if (IS_DG1(i915) || IS_DG2(i915)) why not GRAPHICS_VER(i915) >= 12 here? Andi > + hwmon->rg.gt_perf_status = GEN12_RPSTAT1; > + else > + hwmon->rg.gt_perf_status = INVALID_MMIO_REG; > } > > void i915_hwmon_register(struct drm_i915_private *i915) > -- > 2.25.1 ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 2/7] drm/i915/hwmon: Add HWMON current voltage support 2022-10-03 20:56 ` Andi Shyti @ 2022-10-13 15:52 ` Dixit, Ashutosh 0 siblings, 0 replies; 54+ messages in thread From: Dixit, Ashutosh @ 2022-10-13 15:52 UTC (permalink / raw) To: Andi Shyti; +Cc: linux-hwmon, intel-gfx, dri-devel On Mon, 03 Oct 2022 13:56:05 -0700, Andi Shyti wrote: Hi Andi, Badal is out for a bit so I am posting this version of the patches. > > Hi Badal, > > [...] > > > static void > > hwm_get_preregistration_info(struct drm_i915_private *i915) > > { > > + struct i915_hwmon *hwmon = i915->hwmon; > > + > > + if (IS_DG1(i915) || IS_DG2(i915)) > > why not GRAPHICS_VER(i915) >= 12 here? Thanks for catching this, because GEN12_RPSTAT1 is indeed available for all Gen12+. It was done this way because the voltage bits of GEN12_RPSTAT1 are only available for DG1/DG2. Anyway in v9 I have changed this to just: /* Available for all Gen12+/dGfx */ hwmon->rg.gt_perf_status = GEN12_RPSTAT1; That is because hwmon is only availbable for dGfx (there's a check in Patch 1). Also, because of this change the 'IS_DG1(i915) || IS_DG2(i915)' check has been moved to hwm_in_is_visible. Thanks. -- Ashutosh > > + hwmon->rg.gt_perf_status = GEN12_RPSTAT1; > > + else > > + hwmon->rg.gt_perf_status = INVALID_MMIO_REG; > > } > > > > void i915_hwmon_register(struct drm_i915_private *i915) > > -- > > 2.25.1 ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 3/7] drm/i915/hwmon: Power PL1 limit and TDP setting 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar 2022-09-27 5:50 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-09-27 5:50 ` [Intel-gfx] [PATCH 2/7] drm/i915/hwmon: Add HWMON current voltage support Badal Nilawar @ 2022-09-27 5:50 ` Badal Nilawar 2022-09-28 7:08 ` Gupta, Anshuman 2022-10-03 21:05 ` Andi Shyti 2022-09-27 5:50 ` [Intel-gfx] [PATCH 4/7] drm/i915/hwmon: Show device level energy usage Badal Nilawar ` (8 subsequent siblings) 11 siblings, 2 replies; 54+ messages in thread From: Badal Nilawar @ 2022-09-27 5:50 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel From: Dale B Stimson <dale.b.stimson@intel.com> Use i915 HWMON to display/modify dGfx power PL1 limit and TDP setting. v2: - Fix review comments (Ashutosh) - Do not restore power1_max upon module unload/load sequence because on production systems modules are always loaded and not unloaded/reloaded (Ashutosh) - Fix review comments (Jani) - Remove endianness conversion (Ashutosh) v3: Add power1_rated_max (Ashutosh) v4: - Use macro HWMON_CHANNEL_INFO to define power channel (Guenter) - Update the date and kernel version in Documentation (Badal) v5: Use hwm_ prefix for static functions (Ashutosh) v6: Fix review comments (Ashutosh) v7: - Define PCU_PACKAGE_POWER_SKU for DG1,DG2 and move PKG_PKG_TDP to intel_mchbar_regs.h (Anshuman) - KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko) Cc: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> --- .../ABI/testing/sysfs-driver-intel-i915-hwmon | 20 +++ drivers/gpu/drm/i915/i915_hwmon.c | 158 +++++++++++++++++- drivers/gpu/drm/i915/intel_mchbar_regs.h | 12 ++ 3 files changed, 188 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon index cd9554c1a4f8..16e697b1db3d 100644 --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon @@ -5,3 +5,23 @@ Contact: dri-devel@lists.freedesktop.org Description: RO. Current Voltage in millivolt. Only supported for particular Intel i915 graphics platforms. + +What: /sys/devices/.../hwmon/hwmon<i>/power1_max +Date: February 2023 +KernelVersion: 6.2 +Contact: dri-devel@lists.freedesktop.org +Description: RW. Card reactive sustained (PL1/Tau) power limit in microwatts. + + The power controller will throttle the operating frequency + if the power averaged over a window (typically seconds) + exceeds this limit. + + Only supported for particular Intel i915 graphics platforms. + +What: /sys/devices/.../hwmon/hwmon<i>/power1_rated_max +Date: February 2023 +KernelVersion: 6.2 +Contact: dri-devel@lists.freedesktop.org +Description: RO. Card default power limit (default TDP setting). + + Only supported for particular Intel i915 graphics platforms. diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c index 9fcff6a884ee..53d34a7a86f7 100644 --- a/drivers/gpu/drm/i915/i915_hwmon.c +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -16,11 +16,16 @@ /* * SF_* - scale factors for particular quantities according to hwmon spec. * - voltage - millivolts + * - power - microwatts */ #define SF_VOLTAGE 1000 +#define SF_POWER 1000000 struct hwm_reg { i915_reg_t gt_perf_status; + i915_reg_t pkg_power_sku_unit; + i915_reg_t pkg_power_sku; + i915_reg_t pkg_rapl_limit; }; struct hwm_drvdata { @@ -34,10 +39,68 @@ struct i915_hwmon { struct hwm_drvdata ddat; struct mutex hwmon_lock; /* counter overflow logic and rmw */ struct hwm_reg rg; + int scl_shift_power; }; +static void +hwm_locked_with_pm_intel_uncore_rmw(struct hwm_drvdata *ddat, + i915_reg_t reg, u32 clear, u32 set) +{ + struct i915_hwmon *hwmon = ddat->hwmon; + struct intel_uncore *uncore = ddat->uncore; + intel_wakeref_t wakeref; + + mutex_lock(&hwmon->hwmon_lock); + + with_intel_runtime_pm(uncore->rpm, wakeref) + intel_uncore_rmw(uncore, reg, clear, set); + + mutex_unlock(&hwmon->hwmon_lock); +} + +/* + * This function's return type of u64 allows for the case where the scaling + * of the field taken from the 32-bit register value might cause a result to + * exceed 32 bits. + */ +static u64 +hwm_field_read_and_scale(struct hwm_drvdata *ddat, i915_reg_t rgadr, + u32 field_msk, int nshift, u32 scale_factor) +{ + struct intel_uncore *uncore = ddat->uncore; + intel_wakeref_t wakeref; + u32 reg_value; + + with_intel_runtime_pm(uncore->rpm, wakeref) + reg_value = intel_uncore_read(uncore, rgadr); + + reg_value = REG_FIELD_GET(field_msk, reg_value); + + return mul_u64_u32_shr(reg_value, scale_factor, nshift); +} + +static void +hwm_field_scale_and_write(struct hwm_drvdata *ddat, i915_reg_t rgadr, + u32 field_msk, int nshift, + unsigned int scale_factor, long lval) +{ + u32 nval; + u32 bits_to_clear; + u32 bits_to_set; + + /* Computation in 64-bits to avoid overflow. Round to nearest. */ + nval = DIV_ROUND_CLOSEST_ULL((u64)lval << nshift, scale_factor); + + bits_to_clear = field_msk; + bits_to_set = FIELD_PREP(field_msk, nval); + + hwm_locked_with_pm_intel_uncore_rmw(ddat, rgadr, + bits_to_clear, bits_to_set); +} + static const struct hwmon_channel_info *hwm_info[] = { HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), + HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX), NULL }; @@ -71,6 +134,64 @@ hwm_in_read(struct hwm_drvdata *ddat, u32 attr, long *val) } } +static umode_t +hwm_power_is_visible(const struct hwm_drvdata *ddat, u32 attr, int chan) +{ + struct i915_hwmon *hwmon = ddat->hwmon; + + switch (attr) { + case hwmon_power_max: + return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? 0664 : 0; + case hwmon_power_rated_max: + return i915_mmio_reg_valid(hwmon->rg.pkg_power_sku) ? 0444 : 0; + default: + return 0; + } +} + +static int +hwm_power_read(struct hwm_drvdata *ddat, u32 attr, int chan, long *val) +{ + struct i915_hwmon *hwmon = ddat->hwmon; + + switch (attr) { + case hwmon_power_max: + *val = hwm_field_read_and_scale(ddat, + hwmon->rg.pkg_rapl_limit, + PKG_PWR_LIM_1, + hwmon->scl_shift_power, + SF_POWER); + return 0; + case hwmon_power_rated_max: + *val = hwm_field_read_and_scale(ddat, + hwmon->rg.pkg_power_sku, + PKG_PKG_TDP, + hwmon->scl_shift_power, + SF_POWER); + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int +hwm_power_write(struct hwm_drvdata *ddat, u32 attr, int chan, long val) +{ + struct i915_hwmon *hwmon = ddat->hwmon; + + switch (attr) { + case hwmon_power_max: + hwm_field_scale_and_write(ddat, + hwmon->rg.pkg_rapl_limit, + PKG_PWR_LIM_1, + hwmon->scl_shift_power, + SF_POWER, val); + return 0; + default: + return -EOPNOTSUPP; + } +} + static umode_t hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, int channel) @@ -80,6 +201,8 @@ hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, switch (type) { case hwmon_in: return hwm_in_is_visible(ddat, attr); + case hwmon_power: + return hwm_power_is_visible(ddat, attr, channel); default: return 0; } @@ -94,6 +217,8 @@ hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, switch (type) { case hwmon_in: return hwm_in_read(ddat, attr, val); + case hwmon_power: + return hwm_power_read(ddat, attr, channel, val); default: return -EOPNOTSUPP; } @@ -103,7 +228,11 @@ static int hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long val) { + struct hwm_drvdata *ddat = dev_get_drvdata(dev); + switch (type) { + case hwmon_power: + return hwm_power_write(ddat, attr, channel, val); default: return -EOPNOTSUPP; } @@ -124,11 +253,36 @@ static void hwm_get_preregistration_info(struct drm_i915_private *i915) { struct i915_hwmon *hwmon = i915->hwmon; + struct intel_uncore *uncore = &i915->uncore; + intel_wakeref_t wakeref; + u32 val_sku_unit; - if (IS_DG1(i915) || IS_DG2(i915)) + if (IS_DG1(i915) || IS_DG2(i915)) { hwmon->rg.gt_perf_status = GEN12_RPSTAT1; - else + hwmon->rg.pkg_power_sku_unit = PCU_PACKAGE_POWER_SKU_UNIT; + hwmon->rg.pkg_power_sku = PCU_PACKAGE_POWER_SKU; + hwmon->rg.pkg_rapl_limit = PCU_PACKAGE_RAPL_LIMIT; + } else { hwmon->rg.gt_perf_status = INVALID_MMIO_REG; + hwmon->rg.pkg_power_sku_unit = INVALID_MMIO_REG; + hwmon->rg.pkg_power_sku = INVALID_MMIO_REG; + hwmon->rg.pkg_rapl_limit = INVALID_MMIO_REG; + } + + with_intel_runtime_pm(uncore->rpm, wakeref) { + /* + * The contents of register hwmon->rg.pkg_power_sku_unit do not change, + * so read it once and store the shift values. + */ + if (i915_mmio_reg_valid(hwmon->rg.pkg_power_sku_unit)) { + val_sku_unit = intel_uncore_read(uncore, + hwmon->rg.pkg_power_sku_unit); + } else { + val_sku_unit = 0; + } + + hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); + } } void i915_hwmon_register(struct drm_i915_private *i915) diff --git a/drivers/gpu/drm/i915/intel_mchbar_regs.h b/drivers/gpu/drm/i915/intel_mchbar_regs.h index ffc702b79579..d7e2e4711792 100644 --- a/drivers/gpu/drm/i915/intel_mchbar_regs.h +++ b/drivers/gpu/drm/i915/intel_mchbar_regs.h @@ -189,6 +189,16 @@ #define DG1_QCLK_RATIO_MASK REG_GENMASK(9, 2) #define DG1_QCLK_REFERENCE REG_BIT(10) +/* + * *_PACKAGE_POWER_SKU - SKU power and timing parameters. + */ +#define PCU_PACKAGE_POWER_SKU _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5930) +#define PKG_PKG_TDP GENMASK_ULL(14, 0) + +#define PCU_PACKAGE_POWER_SKU_UNIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5938) +#define PKG_PWR_UNIT REG_GENMASK(3, 0) +#define PKG_TIME_UNIT REG_GENMASK(19, 16) + #define GEN6_GT_PERF_STATUS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5948) #define GEN6_RP_STATE_LIMITS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5994) #define GEN6_RP_STATE_CAP _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5998) @@ -198,6 +208,8 @@ #define GEN10_FREQ_INFO_REC _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5ef0) #define RPE_MASK REG_GENMASK(15, 8) +#define PCU_PACKAGE_RAPL_LIMIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x59a0) +#define PKG_PWR_LIM_1 REG_GENMASK(14, 0) /* snb MCH registers for priority tuning */ #define MCH_SSKPD _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5d10) -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 3/7] drm/i915/hwmon: Power PL1 limit and TDP setting 2022-09-27 5:50 ` [Intel-gfx] [PATCH 3/7] drm/i915/hwmon: Power PL1 limit and TDP setting Badal Nilawar @ 2022-09-28 7:08 ` Gupta, Anshuman 2022-10-03 21:05 ` Andi Shyti 1 sibling, 0 replies; 54+ messages in thread From: Gupta, Anshuman @ 2022-09-28 7:08 UTC (permalink / raw) To: Badal Nilawar, intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel On 9/27/2022 11:20 AM, Badal Nilawar wrote: > From: Dale B Stimson <dale.b.stimson@intel.com> > > Use i915 HWMON to display/modify dGfx power PL1 limit and TDP setting. > > v2: > - Fix review comments (Ashutosh) > - Do not restore power1_max upon module unload/load sequence > because on production systems modules are always loaded > and not unloaded/reloaded (Ashutosh) > - Fix review comments (Jani) > - Remove endianness conversion (Ashutosh) > v3: Add power1_rated_max (Ashutosh) > v4: > - Use macro HWMON_CHANNEL_INFO to define power channel (Guenter) > - Update the date and kernel version in Documentation (Badal) > v5: Use hwm_ prefix for static functions (Ashutosh) > v6: Fix review comments (Ashutosh) > v7: > - Define PCU_PACKAGE_POWER_SKU for DG1,DG2 and move > PKG_PKG_TDP to intel_mchbar_regs.h (Anshuman) > - KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko) > > Cc: Guenter Roeck <linux@roeck-us.net> > Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Signed-off-by: Riana Tauro <riana.tauro@intel.com> > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> > Acked-by: Guenter Roeck <linux@roeck-us.net> > Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> LGTM, Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> > --- > .../ABI/testing/sysfs-driver-intel-i915-hwmon | 20 +++ > drivers/gpu/drm/i915/i915_hwmon.c | 158 +++++++++++++++++- > drivers/gpu/drm/i915/intel_mchbar_regs.h | 12 ++ > 3 files changed, 188 insertions(+), 2 deletions(-) > > diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > index cd9554c1a4f8..16e697b1db3d 100644 > --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > @@ -5,3 +5,23 @@ Contact: dri-devel@lists.freedesktop.org > Description: RO. Current Voltage in millivolt. > > Only supported for particular Intel i915 graphics platforms. > + > +What: /sys/devices/.../hwmon/hwmon<i>/power1_max > +Date: February 2023 > +KernelVersion: 6.2 > +Contact: dri-devel@lists.freedesktop.org > +Description: RW. Card reactive sustained (PL1/Tau) power limit in microwatts. > + > + The power controller will throttle the operating frequency > + if the power averaged over a window (typically seconds) > + exceeds this limit. > + > + Only supported for particular Intel i915 graphics platforms. > + > +What: /sys/devices/.../hwmon/hwmon<i>/power1_rated_max > +Date: February 2023 > +KernelVersion: 6.2 > +Contact: dri-devel@lists.freedesktop.org > +Description: RO. Card default power limit (default TDP setting). > + > + Only supported for particular Intel i915 graphics platforms. > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > index 9fcff6a884ee..53d34a7a86f7 100644 > --- a/drivers/gpu/drm/i915/i915_hwmon.c > +++ b/drivers/gpu/drm/i915/i915_hwmon.c > @@ -16,11 +16,16 @@ > /* > * SF_* - scale factors for particular quantities according to hwmon spec. > * - voltage - millivolts > + * - power - microwatts > */ > #define SF_VOLTAGE 1000 > +#define SF_POWER 1000000 > > struct hwm_reg { > i915_reg_t gt_perf_status; > + i915_reg_t pkg_power_sku_unit; > + i915_reg_t pkg_power_sku; > + i915_reg_t pkg_rapl_limit; > }; > > struct hwm_drvdata { > @@ -34,10 +39,68 @@ struct i915_hwmon { > struct hwm_drvdata ddat; > struct mutex hwmon_lock; /* counter overflow logic and rmw */ > struct hwm_reg rg; > + int scl_shift_power; > }; > > +static void > +hwm_locked_with_pm_intel_uncore_rmw(struct hwm_drvdata *ddat, > + i915_reg_t reg, u32 clear, u32 set) > +{ > + struct i915_hwmon *hwmon = ddat->hwmon; > + struct intel_uncore *uncore = ddat->uncore; > + intel_wakeref_t wakeref; > + > + mutex_lock(&hwmon->hwmon_lock); > + > + with_intel_runtime_pm(uncore->rpm, wakeref) > + intel_uncore_rmw(uncore, reg, clear, set); > + > + mutex_unlock(&hwmon->hwmon_lock); > +} > + > +/* > + * This function's return type of u64 allows for the case where the scaling > + * of the field taken from the 32-bit register value might cause a result to > + * exceed 32 bits. > + */ > +static u64 > +hwm_field_read_and_scale(struct hwm_drvdata *ddat, i915_reg_t rgadr, > + u32 field_msk, int nshift, u32 scale_factor) > +{ > + struct intel_uncore *uncore = ddat->uncore; > + intel_wakeref_t wakeref; > + u32 reg_value; > + > + with_intel_runtime_pm(uncore->rpm, wakeref) > + reg_value = intel_uncore_read(uncore, rgadr); > + > + reg_value = REG_FIELD_GET(field_msk, reg_value); > + > + return mul_u64_u32_shr(reg_value, scale_factor, nshift); > +} > + > +static void > +hwm_field_scale_and_write(struct hwm_drvdata *ddat, i915_reg_t rgadr, > + u32 field_msk, int nshift, > + unsigned int scale_factor, long lval) > +{ > + u32 nval; > + u32 bits_to_clear; > + u32 bits_to_set; > + > + /* Computation in 64-bits to avoid overflow. Round to nearest. */ > + nval = DIV_ROUND_CLOSEST_ULL((u64)lval << nshift, scale_factor); > + > + bits_to_clear = field_msk; > + bits_to_set = FIELD_PREP(field_msk, nval); > + > + hwm_locked_with_pm_intel_uncore_rmw(ddat, rgadr, > + bits_to_clear, bits_to_set); > +} > + > static const struct hwmon_channel_info *hwm_info[] = { > HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), > + HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX), > NULL > }; > > @@ -71,6 +134,64 @@ hwm_in_read(struct hwm_drvdata *ddat, u32 attr, long *val) > } > } > > +static umode_t > +hwm_power_is_visible(const struct hwm_drvdata *ddat, u32 attr, int chan) > +{ > + struct i915_hwmon *hwmon = ddat->hwmon; > + > + switch (attr) { > + case hwmon_power_max: > + return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? 0664 : 0; > + case hwmon_power_rated_max: > + return i915_mmio_reg_valid(hwmon->rg.pkg_power_sku) ? 0444 : 0; > + default: > + return 0; > + } > +} > + > +static int > +hwm_power_read(struct hwm_drvdata *ddat, u32 attr, int chan, long *val) > +{ > + struct i915_hwmon *hwmon = ddat->hwmon; > + > + switch (attr) { > + case hwmon_power_max: > + *val = hwm_field_read_and_scale(ddat, > + hwmon->rg.pkg_rapl_limit, > + PKG_PWR_LIM_1, > + hwmon->scl_shift_power, > + SF_POWER); > + return 0; > + case hwmon_power_rated_max: > + *val = hwm_field_read_and_scale(ddat, > + hwmon->rg.pkg_power_sku, > + PKG_PKG_TDP, > + hwmon->scl_shift_power, > + SF_POWER); > + return 0; > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static int > +hwm_power_write(struct hwm_drvdata *ddat, u32 attr, int chan, long val) > +{ > + struct i915_hwmon *hwmon = ddat->hwmon; > + > + switch (attr) { > + case hwmon_power_max: > + hwm_field_scale_and_write(ddat, > + hwmon->rg.pkg_rapl_limit, > + PKG_PWR_LIM_1, > + hwmon->scl_shift_power, > + SF_POWER, val); > + return 0; > + default: > + return -EOPNOTSUPP; > + } > +} > + > static umode_t > hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > u32 attr, int channel) > @@ -80,6 +201,8 @@ hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > switch (type) { > case hwmon_in: > return hwm_in_is_visible(ddat, attr); > + case hwmon_power: > + return hwm_power_is_visible(ddat, attr, channel); > default: > return 0; > } > @@ -94,6 +217,8 @@ hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, > switch (type) { > case hwmon_in: > return hwm_in_read(ddat, attr, val); > + case hwmon_power: > + return hwm_power_read(ddat, attr, channel, val); > default: > return -EOPNOTSUPP; > } > @@ -103,7 +228,11 @@ static int > hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, > int channel, long val) > { > + struct hwm_drvdata *ddat = dev_get_drvdata(dev); > + > switch (type) { > + case hwmon_power: > + return hwm_power_write(ddat, attr, channel, val); > default: > return -EOPNOTSUPP; > } > @@ -124,11 +253,36 @@ static void > hwm_get_preregistration_info(struct drm_i915_private *i915) > { > struct i915_hwmon *hwmon = i915->hwmon; > + struct intel_uncore *uncore = &i915->uncore; > + intel_wakeref_t wakeref; > + u32 val_sku_unit; > > - if (IS_DG1(i915) || IS_DG2(i915)) > + if (IS_DG1(i915) || IS_DG2(i915)) { > hwmon->rg.gt_perf_status = GEN12_RPSTAT1; > - else > + hwmon->rg.pkg_power_sku_unit = PCU_PACKAGE_POWER_SKU_UNIT; > + hwmon->rg.pkg_power_sku = PCU_PACKAGE_POWER_SKU; > + hwmon->rg.pkg_rapl_limit = PCU_PACKAGE_RAPL_LIMIT; > + } else { > hwmon->rg.gt_perf_status = INVALID_MMIO_REG; > + hwmon->rg.pkg_power_sku_unit = INVALID_MMIO_REG; > + hwmon->rg.pkg_power_sku = INVALID_MMIO_REG; > + hwmon->rg.pkg_rapl_limit = INVALID_MMIO_REG; > + } > + > + with_intel_runtime_pm(uncore->rpm, wakeref) { > + /* > + * The contents of register hwmon->rg.pkg_power_sku_unit do not change, > + * so read it once and store the shift values. > + */ > + if (i915_mmio_reg_valid(hwmon->rg.pkg_power_sku_unit)) { > + val_sku_unit = intel_uncore_read(uncore, > + hwmon->rg.pkg_power_sku_unit); > + } else { > + val_sku_unit = 0; > + } > + > + hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); > + } > } > > void i915_hwmon_register(struct drm_i915_private *i915) > diff --git a/drivers/gpu/drm/i915/intel_mchbar_regs.h b/drivers/gpu/drm/i915/intel_mchbar_regs.h > index ffc702b79579..d7e2e4711792 100644 > --- a/drivers/gpu/drm/i915/intel_mchbar_regs.h > +++ b/drivers/gpu/drm/i915/intel_mchbar_regs.h > @@ -189,6 +189,16 @@ > #define DG1_QCLK_RATIO_MASK REG_GENMASK(9, 2) > #define DG1_QCLK_REFERENCE REG_BIT(10) > > +/* > + * *_PACKAGE_POWER_SKU - SKU power and timing parameters. > + */ > +#define PCU_PACKAGE_POWER_SKU _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5930) > +#define PKG_PKG_TDP GENMASK_ULL(14, 0) > + > +#define PCU_PACKAGE_POWER_SKU_UNIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5938) > +#define PKG_PWR_UNIT REG_GENMASK(3, 0) > +#define PKG_TIME_UNIT REG_GENMASK(19, 16) > + > #define GEN6_GT_PERF_STATUS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5948) > #define GEN6_RP_STATE_LIMITS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5994) > #define GEN6_RP_STATE_CAP _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5998) > @@ -198,6 +208,8 @@ > > #define GEN10_FREQ_INFO_REC _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5ef0) > #define RPE_MASK REG_GENMASK(15, 8) > +#define PCU_PACKAGE_RAPL_LIMIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x59a0) > +#define PKG_PWR_LIM_1 REG_GENMASK(14, 0) > > /* snb MCH registers for priority tuning */ > #define MCH_SSKPD _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5d10) ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 3/7] drm/i915/hwmon: Power PL1 limit and TDP setting 2022-09-27 5:50 ` [Intel-gfx] [PATCH 3/7] drm/i915/hwmon: Power PL1 limit and TDP setting Badal Nilawar 2022-09-28 7:08 ` Gupta, Anshuman @ 2022-10-03 21:05 ` Andi Shyti 2022-10-13 15:54 ` Dixit, Ashutosh 1 sibling, 1 reply; 54+ messages in thread From: Andi Shyti @ 2022-10-03 21:05 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, intel-gfx, dri-devel Hi Badal, [...] > hwm_get_preregistration_info(struct drm_i915_private *i915) > { > struct i915_hwmon *hwmon = i915->hwmon; > + struct intel_uncore *uncore = &i915->uncore; > + intel_wakeref_t wakeref; > + u32 val_sku_unit; > > - if (IS_DG1(i915) || IS_DG2(i915)) > + if (IS_DG1(i915) || IS_DG2(i915)) { > hwmon->rg.gt_perf_status = GEN12_RPSTAT1; > - else > + hwmon->rg.pkg_power_sku_unit = PCU_PACKAGE_POWER_SKU_UNIT; > + hwmon->rg.pkg_power_sku = PCU_PACKAGE_POWER_SKU; > + hwmon->rg.pkg_rapl_limit = PCU_PACKAGE_RAPL_LIMIT; > + } else { > hwmon->rg.gt_perf_status = INVALID_MMIO_REG; > + hwmon->rg.pkg_power_sku_unit = INVALID_MMIO_REG; > + hwmon->rg.pkg_power_sku = INVALID_MMIO_REG; > + hwmon->rg.pkg_rapl_limit = INVALID_MMIO_REG; > + } > + > + with_intel_runtime_pm(uncore->rpm, wakeref) { > + /* > + * The contents of register hwmon->rg.pkg_power_sku_unit do not change, > + * so read it once and store the shift values. > + */ > + if (i915_mmio_reg_valid(hwmon->rg.pkg_power_sku_unit)) { > + val_sku_unit = intel_uncore_read(uncore, > + hwmon->rg.pkg_power_sku_unit); > + } else { > + val_sku_unit = 0; > + } please remove the brackets here and, just a small nitpick: move val_sky_unit inside the "with_intel_runtime_pm()" and initialize it to '0', you will save the else statement. Other than that: Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com> Thanks, Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 3/7] drm/i915/hwmon: Power PL1 limit and TDP setting 2022-10-03 21:05 ` Andi Shyti @ 2022-10-13 15:54 ` Dixit, Ashutosh 0 siblings, 0 replies; 54+ messages in thread From: Dixit, Ashutosh @ 2022-10-13 15:54 UTC (permalink / raw) To: Andi Shyti; +Cc: linux-hwmon, intel-gfx, dri-devel On Mon, 03 Oct 2022 14:05:14 -0700, Andi Shyti wrote: > > Hi Badal, > > [...] > > > hwm_get_preregistration_info(struct drm_i915_private *i915) > > { > > struct i915_hwmon *hwmon = i915->hwmon; > > + struct intel_uncore *uncore = &i915->uncore; > > + intel_wakeref_t wakeref; > > + u32 val_sku_unit; > > > > - if (IS_DG1(i915) || IS_DG2(i915)) > > + if (IS_DG1(i915) || IS_DG2(i915)) { > > hwmon->rg.gt_perf_status = GEN12_RPSTAT1; > > - else > > + hwmon->rg.pkg_power_sku_unit = PCU_PACKAGE_POWER_SKU_UNIT; > > + hwmon->rg.pkg_power_sku = PCU_PACKAGE_POWER_SKU; > > + hwmon->rg.pkg_rapl_limit = PCU_PACKAGE_RAPL_LIMIT; > > + } else { > > hwmon->rg.gt_perf_status = INVALID_MMIO_REG; > > + hwmon->rg.pkg_power_sku_unit = INVALID_MMIO_REG; > > + hwmon->rg.pkg_power_sku = INVALID_MMIO_REG; > > + hwmon->rg.pkg_rapl_limit = INVALID_MMIO_REG; > > + } > > + > > + with_intel_runtime_pm(uncore->rpm, wakeref) { > > + /* > > + * The contents of register hwmon->rg.pkg_power_sku_unit do not change, > > + * so read it once and store the shift values. > > + */ > > + if (i915_mmio_reg_valid(hwmon->rg.pkg_power_sku_unit)) { > > + val_sku_unit = intel_uncore_read(uncore, > > + hwmon->rg.pkg_power_sku_unit); > > + } else { > > + val_sku_unit = 0; > > + } > > please remove the brackets here and, just a small nitpick: > > move val_sky_unit inside the "with_intel_runtime_pm()" and > initialize it to '0', you will save the else statement. Hi Andi, fixed in v9 of the series. > > Other than that: > > Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com> Thanks. -- Ashutosh ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 4/7] drm/i915/hwmon: Show device level energy usage 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar ` (2 preceding siblings ...) 2022-09-27 5:50 ` [Intel-gfx] [PATCH 3/7] drm/i915/hwmon: Power PL1 limit and TDP setting Badal Nilawar @ 2022-09-27 5:50 ` Badal Nilawar 2022-09-30 16:52 ` Rodrigo Vivi 2022-09-27 5:50 ` [Intel-gfx] [PATCH 5/7] drm/i915/hwmon: Expose card reactive critical power Badal Nilawar ` (7 subsequent siblings) 11 siblings, 1 reply; 54+ messages in thread From: Badal Nilawar @ 2022-09-27 5:50 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel From: Dale B Stimson <dale.b.stimson@intel.com> Use i915 HWMON to display device level energy input. v2: Updated the date and kernel version in feature description v3: - Cleaned up hwm_energy function and removed unused function i915_hwmon_energy_status_get (Ashutosh) v4: KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko) Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> --- .../ABI/testing/sysfs-driver-intel-i915-hwmon | 8 ++ drivers/gpu/drm/i915/i915_hwmon.c | 107 +++++++++++++++++- drivers/gpu/drm/i915/intel_mchbar_regs.h | 2 + 3 files changed, 115 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon index 16e697b1db3d..7525db243d74 100644 --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon @@ -25,3 +25,11 @@ Contact: dri-devel@lists.freedesktop.org Description: RO. Card default power limit (default TDP setting). Only supported for particular Intel i915 graphics platforms. + +What: /sys/devices/.../hwmon/hwmon<i>/energy1_input +Date: February 2023 +KernelVersion: 6.2 +Contact: dri-devel@lists.freedesktop.org +Description: RO. Energy input of device in microjoules. + + Only supported for particular Intel i915 graphics platforms. diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c index 53d34a7a86f7..9a49521b358a 100644 --- a/drivers/gpu/drm/i915/i915_hwmon.c +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -17,21 +17,30 @@ * SF_* - scale factors for particular quantities according to hwmon spec. * - voltage - millivolts * - power - microwatts + * - energy - microjoules */ #define SF_VOLTAGE 1000 #define SF_POWER 1000000 +#define SF_ENERGY 1000000 struct hwm_reg { i915_reg_t gt_perf_status; i915_reg_t pkg_power_sku_unit; i915_reg_t pkg_power_sku; i915_reg_t pkg_rapl_limit; + i915_reg_t energy_status_all; +}; + +struct hwm_energy_info { + u32 reg_val_prev; + long accum_energy; /* Accumulated energy for energy1_input */ }; struct hwm_drvdata { struct i915_hwmon *hwmon; struct intel_uncore *uncore; struct device *hwmon_dev; + struct hwm_energy_info ei; /* Energy info for energy1_input */ char name[12]; }; @@ -40,6 +49,7 @@ struct i915_hwmon { struct mutex hwmon_lock; /* counter overflow logic and rmw */ struct hwm_reg rg; int scl_shift_power; + int scl_shift_energy; }; static void @@ -98,9 +108,60 @@ hwm_field_scale_and_write(struct hwm_drvdata *ddat, i915_reg_t rgadr, bits_to_clear, bits_to_set); } +/* + * hwm_energy - Obtain energy value + * + * The underlying energy hardware register is 32-bits and is subject to + * overflow. How long before overflow? For example, with an example + * scaling bit shift of 14 bits (see register *PACKAGE_POWER_SKU_UNIT) and + * a power draw of 1000 watts, the 32-bit counter will overflow in + * approximately 4.36 minutes. + * + * Examples: + * 1 watt: (2^32 >> 14) / 1 W / (60 * 60 * 24) secs/day -> 3 days + * 1000 watts: (2^32 >> 14) / 1000 W / 60 secs/min -> 4.36 minutes + * + * The function significantly increases overflow duration (from 4.36 + * minutes) by accumulating the energy register into a 'long' as allowed by + * the hwmon API. Using x86_64 128 bit arithmetic (see mul_u64_u32_shr()), + * a 'long' of 63 bits, SF_ENERGY of 1e6 (~20 bits) and + * hwmon->scl_shift_energy of 14 bits we have 57 (63 - 20 + 14) bits before + * energy1_input overflows. This at 1000 W is an overflow duration of 278 years. + */ +static int +hwm_energy(struct hwm_drvdata *ddat, long *energy) +{ + struct intel_uncore *uncore = ddat->uncore; + struct i915_hwmon *hwmon = ddat->hwmon; + struct hwm_energy_info *ei = &ddat->ei; + intel_wakeref_t wakeref; + i915_reg_t rgaddr; + u32 reg_val; + + rgaddr = hwmon->rg.energy_status_all; + + mutex_lock(&hwmon->hwmon_lock); + + with_intel_runtime_pm(uncore->rpm, wakeref) + reg_val = intel_uncore_read(uncore, rgaddr); + + if (reg_val >= ei->reg_val_prev) + ei->accum_energy += reg_val - ei->reg_val_prev; + else + ei->accum_energy += UINT_MAX - ei->reg_val_prev + reg_val; + ei->reg_val_prev = reg_val; + + *energy = mul_u64_u32_shr(ei->accum_energy, SF_ENERGY, + hwmon->scl_shift_energy); + mutex_unlock(&hwmon->hwmon_lock); + + return 0; +} + static const struct hwmon_channel_info *hwm_info[] = { HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX), + HWMON_CHANNEL_INFO(energy, HWMON_E_INPUT), NULL }; @@ -192,6 +253,32 @@ hwm_power_write(struct hwm_drvdata *ddat, u32 attr, int chan, long val) } } +static umode_t +hwm_energy_is_visible(const struct hwm_drvdata *ddat, u32 attr) +{ + struct i915_hwmon *hwmon = ddat->hwmon; + i915_reg_t rgaddr; + + switch (attr) { + case hwmon_energy_input: + rgaddr = hwmon->rg.energy_status_all; + return i915_mmio_reg_valid(rgaddr) ? 0444 : 0; + default: + return 0; + } +} + +static int +hwm_energy_read(struct hwm_drvdata *ddat, u32 attr, long *val) +{ + switch (attr) { + case hwmon_energy_input: + return hwm_energy(ddat, val); + default: + return -EOPNOTSUPP; + } +} + static umode_t hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, int channel) @@ -203,6 +290,8 @@ hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, return hwm_in_is_visible(ddat, attr); case hwmon_power: return hwm_power_is_visible(ddat, attr, channel); + case hwmon_energy: + return hwm_energy_is_visible(ddat, attr); default: return 0; } @@ -219,6 +308,8 @@ hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, return hwm_in_read(ddat, attr, val); case hwmon_power: return hwm_power_read(ddat, attr, channel, val); + case hwmon_energy: + return hwm_energy_read(ddat, attr, val); default: return -EOPNOTSUPP; } @@ -254,19 +345,23 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) { struct i915_hwmon *hwmon = i915->hwmon; struct intel_uncore *uncore = &i915->uncore; + struct hwm_drvdata *ddat = &hwmon->ddat; intel_wakeref_t wakeref; u32 val_sku_unit; + long energy; if (IS_DG1(i915) || IS_DG2(i915)) { hwmon->rg.gt_perf_status = GEN12_RPSTAT1; hwmon->rg.pkg_power_sku_unit = PCU_PACKAGE_POWER_SKU_UNIT; hwmon->rg.pkg_power_sku = PCU_PACKAGE_POWER_SKU; hwmon->rg.pkg_rapl_limit = PCU_PACKAGE_RAPL_LIMIT; + hwmon->rg.energy_status_all = PCU_PACKAGE_ENERGY_STATUS; } else { hwmon->rg.gt_perf_status = INVALID_MMIO_REG; hwmon->rg.pkg_power_sku_unit = INVALID_MMIO_REG; hwmon->rg.pkg_power_sku = INVALID_MMIO_REG; hwmon->rg.pkg_rapl_limit = INVALID_MMIO_REG; + hwmon->rg.energy_status_all = INVALID_MMIO_REG; } with_intel_runtime_pm(uncore->rpm, wakeref) { @@ -280,9 +375,17 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) } else { val_sku_unit = 0; } - - hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); } + + hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); + hwmon->scl_shift_energy = REG_FIELD_GET(PKG_ENERGY_UNIT, val_sku_unit); + + /* + * Initialize 'struct hwm_energy_info', i.e. set fields to the + * first value of the energy register read + */ + if (i915_mmio_reg_valid(hwmon->rg.energy_status_all)) + hwm_energy(ddat, &energy); } void i915_hwmon_register(struct drm_i915_private *i915) diff --git a/drivers/gpu/drm/i915/intel_mchbar_regs.h b/drivers/gpu/drm/i915/intel_mchbar_regs.h index d7e2e4711792..bd42fb66e297 100644 --- a/drivers/gpu/drm/i915/intel_mchbar_regs.h +++ b/drivers/gpu/drm/i915/intel_mchbar_regs.h @@ -197,7 +197,9 @@ #define PCU_PACKAGE_POWER_SKU_UNIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5938) #define PKG_PWR_UNIT REG_GENMASK(3, 0) +#define PKG_ENERGY_UNIT REG_GENMASK(12, 8) #define PKG_TIME_UNIT REG_GENMASK(19, 16) +#define PCU_PACKAGE_ENERGY_STATUS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x593c) #define GEN6_GT_PERF_STATUS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5948) #define GEN6_RP_STATE_LIMITS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5994) -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 4/7] drm/i915/hwmon: Show device level energy usage 2022-09-27 5:50 ` [Intel-gfx] [PATCH 4/7] drm/i915/hwmon: Show device level energy usage Badal Nilawar @ 2022-09-30 16:52 ` Rodrigo Vivi 2022-10-03 21:13 ` Andi Shyti 2022-10-13 15:54 ` Dixit, Ashutosh 0 siblings, 2 replies; 54+ messages in thread From: Rodrigo Vivi @ 2022-09-30 16:52 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, andi.shyti, Jani Nikula, intel-gfx, dri-devel On Tue, Sep 27, 2022 at 11:20:17AM +0530, Badal Nilawar wrote: > From: Dale B Stimson <dale.b.stimson@intel.com> > > Use i915 HWMON to display device level energy input. > > v2: Updated the date and kernel version in feature description > v3: > - Cleaned up hwm_energy function and removed unused function > i915_hwmon_energy_status_get (Ashutosh) > v4: KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko) > > Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Signed-off-by: Riana Tauro <riana.tauro@intel.com> > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> > Acked-by: Guenter Roeck <linux@roeck-us.net> > Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> > --- > .../ABI/testing/sysfs-driver-intel-i915-hwmon | 8 ++ > drivers/gpu/drm/i915/i915_hwmon.c | 107 +++++++++++++++++- > drivers/gpu/drm/i915/intel_mchbar_regs.h | 2 + > 3 files changed, 115 insertions(+), 2 deletions(-) > > diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > index 16e697b1db3d..7525db243d74 100644 > --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > @@ -25,3 +25,11 @@ Contact: dri-devel@lists.freedesktop.org > Description: RO. Card default power limit (default TDP setting). > > Only supported for particular Intel i915 graphics platforms. > + > +What: /sys/devices/.../hwmon/hwmon<i>/energy1_input > +Date: February 2023 > +KernelVersion: 6.2 > +Contact: dri-devel@lists.freedesktop.org I'm sorry for being late on the review here, and I know that others already looked at the date and other details here in this doc. So I'm curious why we have decided for the dri-devel mailing list and not for the intel-gfx since intel-gfx is the only one we have listed for i915 dir in the MAINTAINERS file: L: intel-gfx@lists.freedesktop.org > +Description: RO. Energy input of device in microjoules. > + > + Only supported for particular Intel i915 graphics platforms. > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > index 53d34a7a86f7..9a49521b358a 100644 > --- a/drivers/gpu/drm/i915/i915_hwmon.c > +++ b/drivers/gpu/drm/i915/i915_hwmon.c > @@ -17,21 +17,30 @@ > * SF_* - scale factors for particular quantities according to hwmon spec. > * - voltage - millivolts > * - power - microwatts > + * - energy - microjoules > */ > #define SF_VOLTAGE 1000 > #define SF_POWER 1000000 > +#define SF_ENERGY 1000000 > > struct hwm_reg { > i915_reg_t gt_perf_status; > i915_reg_t pkg_power_sku_unit; > i915_reg_t pkg_power_sku; > i915_reg_t pkg_rapl_limit; > + i915_reg_t energy_status_all; > +}; > + > +struct hwm_energy_info { > + u32 reg_val_prev; > + long accum_energy; /* Accumulated energy for energy1_input */ > }; > > struct hwm_drvdata { > struct i915_hwmon *hwmon; > struct intel_uncore *uncore; > struct device *hwmon_dev; > + struct hwm_energy_info ei; /* Energy info for energy1_input */ > char name[12]; > }; > > @@ -40,6 +49,7 @@ struct i915_hwmon { > struct mutex hwmon_lock; /* counter overflow logic and rmw */ > struct hwm_reg rg; > int scl_shift_power; > + int scl_shift_energy; > }; > > static void > @@ -98,9 +108,60 @@ hwm_field_scale_and_write(struct hwm_drvdata *ddat, i915_reg_t rgadr, > bits_to_clear, bits_to_set); > } > > +/* > + * hwm_energy - Obtain energy value > + * > + * The underlying energy hardware register is 32-bits and is subject to > + * overflow. How long before overflow? For example, with an example > + * scaling bit shift of 14 bits (see register *PACKAGE_POWER_SKU_UNIT) and > + * a power draw of 1000 watts, the 32-bit counter will overflow in > + * approximately 4.36 minutes. > + * > + * Examples: > + * 1 watt: (2^32 >> 14) / 1 W / (60 * 60 * 24) secs/day -> 3 days > + * 1000 watts: (2^32 >> 14) / 1000 W / 60 secs/min -> 4.36 minutes > + * > + * The function significantly increases overflow duration (from 4.36 > + * minutes) by accumulating the energy register into a 'long' as allowed by > + * the hwmon API. Using x86_64 128 bit arithmetic (see mul_u64_u32_shr()), > + * a 'long' of 63 bits, SF_ENERGY of 1e6 (~20 bits) and > + * hwmon->scl_shift_energy of 14 bits we have 57 (63 - 20 + 14) bits before > + * energy1_input overflows. This at 1000 W is an overflow duration of 278 years. > + */ > +static int > +hwm_energy(struct hwm_drvdata *ddat, long *energy) > +{ > + struct intel_uncore *uncore = ddat->uncore; > + struct i915_hwmon *hwmon = ddat->hwmon; > + struct hwm_energy_info *ei = &ddat->ei; > + intel_wakeref_t wakeref; > + i915_reg_t rgaddr; > + u32 reg_val; > + > + rgaddr = hwmon->rg.energy_status_all; > + > + mutex_lock(&hwmon->hwmon_lock); > + > + with_intel_runtime_pm(uncore->rpm, wakeref) > + reg_val = intel_uncore_read(uncore, rgaddr); > + > + if (reg_val >= ei->reg_val_prev) > + ei->accum_energy += reg_val - ei->reg_val_prev; > + else > + ei->accum_energy += UINT_MAX - ei->reg_val_prev + reg_val; > + ei->reg_val_prev = reg_val; > + > + *energy = mul_u64_u32_shr(ei->accum_energy, SF_ENERGY, > + hwmon->scl_shift_energy); > + mutex_unlock(&hwmon->hwmon_lock); > + > + return 0; > +} > + > static const struct hwmon_channel_info *hwm_info[] = { > HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), > HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX), > + HWMON_CHANNEL_INFO(energy, HWMON_E_INPUT), > NULL > }; > > @@ -192,6 +253,32 @@ hwm_power_write(struct hwm_drvdata *ddat, u32 attr, int chan, long val) > } > } > > +static umode_t > +hwm_energy_is_visible(const struct hwm_drvdata *ddat, u32 attr) > +{ > + struct i915_hwmon *hwmon = ddat->hwmon; > + i915_reg_t rgaddr; > + > + switch (attr) { > + case hwmon_energy_input: > + rgaddr = hwmon->rg.energy_status_all; > + return i915_mmio_reg_valid(rgaddr) ? 0444 : 0; > + default: > + return 0; > + } > +} > + > +static int > +hwm_energy_read(struct hwm_drvdata *ddat, u32 attr, long *val) > +{ > + switch (attr) { > + case hwmon_energy_input: > + return hwm_energy(ddat, val); > + default: > + return -EOPNOTSUPP; > + } > +} > + > static umode_t > hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > u32 attr, int channel) > @@ -203,6 +290,8 @@ hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > return hwm_in_is_visible(ddat, attr); > case hwmon_power: > return hwm_power_is_visible(ddat, attr, channel); > + case hwmon_energy: > + return hwm_energy_is_visible(ddat, attr); > default: > return 0; > } > @@ -219,6 +308,8 @@ hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, > return hwm_in_read(ddat, attr, val); > case hwmon_power: > return hwm_power_read(ddat, attr, channel, val); > + case hwmon_energy: > + return hwm_energy_read(ddat, attr, val); > default: > return -EOPNOTSUPP; > } > @@ -254,19 +345,23 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) > { > struct i915_hwmon *hwmon = i915->hwmon; > struct intel_uncore *uncore = &i915->uncore; > + struct hwm_drvdata *ddat = &hwmon->ddat; > intel_wakeref_t wakeref; > u32 val_sku_unit; > + long energy; > > if (IS_DG1(i915) || IS_DG2(i915)) { > hwmon->rg.gt_perf_status = GEN12_RPSTAT1; > hwmon->rg.pkg_power_sku_unit = PCU_PACKAGE_POWER_SKU_UNIT; > hwmon->rg.pkg_power_sku = PCU_PACKAGE_POWER_SKU; > hwmon->rg.pkg_rapl_limit = PCU_PACKAGE_RAPL_LIMIT; > + hwmon->rg.energy_status_all = PCU_PACKAGE_ENERGY_STATUS; > } else { > hwmon->rg.gt_perf_status = INVALID_MMIO_REG; > hwmon->rg.pkg_power_sku_unit = INVALID_MMIO_REG; > hwmon->rg.pkg_power_sku = INVALID_MMIO_REG; > hwmon->rg.pkg_rapl_limit = INVALID_MMIO_REG; > + hwmon->rg.energy_status_all = INVALID_MMIO_REG; > } > > with_intel_runtime_pm(uncore->rpm, wakeref) { > @@ -280,9 +375,17 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) > } else { > val_sku_unit = 0; > } > - > - hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); > } > + > + hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); > + hwmon->scl_shift_energy = REG_FIELD_GET(PKG_ENERGY_UNIT, val_sku_unit); > + > + /* > + * Initialize 'struct hwm_energy_info', i.e. set fields to the > + * first value of the energy register read > + */ > + if (i915_mmio_reg_valid(hwmon->rg.energy_status_all)) > + hwm_energy(ddat, &energy); > } > > void i915_hwmon_register(struct drm_i915_private *i915) > diff --git a/drivers/gpu/drm/i915/intel_mchbar_regs.h b/drivers/gpu/drm/i915/intel_mchbar_regs.h > index d7e2e4711792..bd42fb66e297 100644 > --- a/drivers/gpu/drm/i915/intel_mchbar_regs.h > +++ b/drivers/gpu/drm/i915/intel_mchbar_regs.h > @@ -197,7 +197,9 @@ > > #define PCU_PACKAGE_POWER_SKU_UNIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5938) > #define PKG_PWR_UNIT REG_GENMASK(3, 0) > +#define PKG_ENERGY_UNIT REG_GENMASK(12, 8) > #define PKG_TIME_UNIT REG_GENMASK(19, 16) > +#define PCU_PACKAGE_ENERGY_STATUS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x593c) > > #define GEN6_GT_PERF_STATUS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5948) > #define GEN6_RP_STATE_LIMITS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5994) > -- > 2.25.1 > ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 4/7] drm/i915/hwmon: Show device level energy usage 2022-09-30 16:52 ` Rodrigo Vivi @ 2022-10-03 21:13 ` Andi Shyti 2022-10-13 15:54 ` Dixit, Ashutosh 2022-10-13 15:54 ` Dixit, Ashutosh 1 sibling, 1 reply; 54+ messages in thread From: Andi Shyti @ 2022-10-03 21:13 UTC (permalink / raw) To: Rodrigo Vivi; +Cc: linux-hwmon, Jani Nikula, intel-gfx, dri-devel Hi Badal, [...] > > diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > index 16e697b1db3d..7525db243d74 100644 > > --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > @@ -25,3 +25,11 @@ Contact: dri-devel@lists.freedesktop.org > > Description: RO. Card default power limit (default TDP setting). > > > > Only supported for particular Intel i915 graphics platforms. > > + > > +What: /sys/devices/.../hwmon/hwmon<i>/energy1_input > > +Date: February 2023 > > +KernelVersion: 6.2 > > +Contact: dri-devel@lists.freedesktop.org > > I'm sorry for being late on the review here, and I know that others > already looked at the date and other details here in this doc. > So I'm curious why we have decided for the dri-devel mailing list > and not for the intel-gfx since intel-gfx is the only one we have > listed for i915 dir in the MAINTAINERS file: > L: intel-gfx@lists.freedesktop.org same question here. > > +Description: RO. Energy input of device in microjoules. > > + > > + Only supported for particular Intel i915 graphics platforms. [...] > > +/* > > + * hwm_energy - Obtain energy value > > + * > > + * The underlying energy hardware register is 32-bits and is subject to > > + * overflow. How long before overflow? For example, with an example > > + * scaling bit shift of 14 bits (see register *PACKAGE_POWER_SKU_UNIT) and > > + * a power draw of 1000 watts, the 32-bit counter will overflow in > > + * approximately 4.36 minutes. > > + * > > + * Examples: > > + * 1 watt: (2^32 >> 14) / 1 W / (60 * 60 * 24) secs/day -> 3 days > > + * 1000 watts: (2^32 >> 14) / 1000 W / 60 secs/min -> 4.36 minutes > > + * > > + * The function significantly increases overflow duration (from 4.36 > > + * minutes) by accumulating the energy register into a 'long' as allowed by > > + * the hwmon API. Using x86_64 128 bit arithmetic (see mul_u64_u32_shr()), > > + * a 'long' of 63 bits, SF_ENERGY of 1e6 (~20 bits) and > > + * hwmon->scl_shift_energy of 14 bits we have 57 (63 - 20 + 14) bits before > > + * energy1_input overflows. This at 1000 W is an overflow duration of 278 years. > > + */ > > +static int > > +hwm_energy(struct hwm_drvdata *ddat, long *energy) This function can just be void. Andi > > +{ [...] ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 4/7] drm/i915/hwmon: Show device level energy usage 2022-10-03 21:13 ` Andi Shyti @ 2022-10-13 15:54 ` Dixit, Ashutosh 0 siblings, 0 replies; 54+ messages in thread From: Dixit, Ashutosh @ 2022-10-13 15:54 UTC (permalink / raw) To: Andi Shyti; +Cc: linux-hwmon, Jani Nikula, intel-gfx, dri-devel, Rodrigo Vivi On Mon, 03 Oct 2022 14:13:10 -0700, Andi Shyti wrote: > Hi Andi, > [...] > > > > diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > > index 16e697b1db3d..7525db243d74 100644 > > > --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > > +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > > @@ -25,3 +25,11 @@ Contact: dri-devel@lists.freedesktop.org > > > Description: RO. Card default power limit (default TDP setting). > > > > > > Only supported for particular Intel i915 graphics platforms. > > > + > > > +What: /sys/devices/.../hwmon/hwmon<i>/energy1_input > > > +Date: February 2023 > > > +KernelVersion: 6.2 > > > +Contact: dri-devel@lists.freedesktop.org > > > > I'm sorry for being late on the review here, and I know that others > > already looked at the date and other details here in this doc. > > So I'm curious why we have decided for the dri-devel mailing list > > and not for the intel-gfx since intel-gfx is the only one we have > > listed for i915 dir in the MAINTAINERS file: > > L: intel-gfx@lists.freedesktop.org > > same question here. These have all been changed to intel-gfx. > > > > +Description: RO. Energy input of device in microjoules. > > > + > > > + Only supported for particular Intel i915 graphics platforms. > > [...] > > > > +/* > > > + * hwm_energy - Obtain energy value > > > + * > > > + * The underlying energy hardware register is 32-bits and is subject to > > > + * overflow. How long before overflow? For example, with an example > > > + * scaling bit shift of 14 bits (see register *PACKAGE_POWER_SKU_UNIT) and > > > + * a power draw of 1000 watts, the 32-bit counter will overflow in > > > + * approximately 4.36 minutes. > > > + * > > > + * Examples: > > > + * 1 watt: (2^32 >> 14) / 1 W / (60 * 60 * 24) secs/day -> 3 days > > > + * 1000 watts: (2^32 >> 14) / 1000 W / 60 secs/min -> 4.36 minutes > > > + * > > > + * The function significantly increases overflow duration (from 4.36 > > > + * minutes) by accumulating the energy register into a 'long' as allowed by > > > + * the hwmon API. Using x86_64 128 bit arithmetic (see mul_u64_u32_shr()), > > > + * a 'long' of 63 bits, SF_ENERGY of 1e6 (~20 bits) and > > > + * hwmon->scl_shift_energy of 14 bits we have 57 (63 - 20 + 14) bits before > > > + * energy1_input overflows. This at 1000 W is an overflow duration of 278 years. > > > + */ > > > +static int > > > +hwm_energy(struct hwm_drvdata *ddat, long *energy) > > This function can just be void. Done. Thanks. -- Ashutosh ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 4/7] drm/i915/hwmon: Show device level energy usage 2022-09-30 16:52 ` Rodrigo Vivi 2022-10-03 21:13 ` Andi Shyti @ 2022-10-13 15:54 ` Dixit, Ashutosh 1 sibling, 0 replies; 54+ messages in thread From: Dixit, Ashutosh @ 2022-10-13 15:54 UTC (permalink / raw) To: Rodrigo Vivi; +Cc: linux-hwmon, andi.shyti, Jani Nikula, intel-gfx, dri-devel On Fri, 30 Sep 2022 09:52:28 -0700, Rodrigo Vivi wrote: > Hi Rodrigo, > On Tue, Sep 27, 2022 at 11:20:17AM +0530, Badal Nilawar wrote: > > From: Dale B Stimson <dale.b.stimson@intel.com> > > > > Use i915 HWMON to display device level energy input. > > > > v2: Updated the date and kernel version in feature description > > v3: > > - Cleaned up hwm_energy function and removed unused function > > i915_hwmon_energy_status_get (Ashutosh) > > v4: KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko) > > > > Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> > > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > > Signed-off-by: Riana Tauro <riana.tauro@intel.com> > > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> > > Acked-by: Guenter Roeck <linux@roeck-us.net> > > Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > > Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> > > --- > > .../ABI/testing/sysfs-driver-intel-i915-hwmon | 8 ++ > > drivers/gpu/drm/i915/i915_hwmon.c | 107 +++++++++++++++++- > > drivers/gpu/drm/i915/intel_mchbar_regs.h | 2 + > > 3 files changed, 115 insertions(+), 2 deletions(-) > > > > diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > index 16e697b1db3d..7525db243d74 100644 > > --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > @@ -25,3 +25,11 @@ Contact: dri-devel@lists.freedesktop.org > > Description: RO. Card default power limit (default TDP setting). > > > > Only supported for particular Intel i915 graphics platforms. > > + > > +What: /sys/devices/.../hwmon/hwmon<i>/energy1_input > > +Date: February 2023 > > +KernelVersion: 6.2 > > +Contact: dri-devel@lists.freedesktop.org > > I'm sorry for being late on the review here, and I know that others > already looked at the date and other details here in this doc. > So I'm curious why we have decided for the dri-devel mailing list > and not for the intel-gfx since intel-gfx is the only one we have > listed for i915 dir in the MAINTAINERS file: > L: intel-gfx@lists.freedesktop.org I have changed the contact to intel-gfx@lists.freedesktop.org in v9 for all patches. Thanks. -- Ashutosh ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 5/7] drm/i915/hwmon: Expose card reactive critical power 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar ` (3 preceding siblings ...) 2022-09-27 5:50 ` [Intel-gfx] [PATCH 4/7] drm/i915/hwmon: Show device level energy usage Badal Nilawar @ 2022-09-27 5:50 ` Badal Nilawar 2022-10-03 21:18 ` Andi Shyti 2022-09-27 5:50 ` [Intel-gfx] [PATCH 6/7] drm/i915/hwmon: Expose power1_max_interval Badal Nilawar ` (6 subsequent siblings) 11 siblings, 1 reply; 54+ messages in thread From: Badal Nilawar @ 2022-09-27 5:50 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel From: Ashutosh Dixit <ashutosh.dixit@intel.com> Expose the card reactive critical (I1) power. I1 is exposed as power1_crit in microwatts (typically for client products) or as curr1_crit in milliamperes (typically for server). v2: Add curr1_crit functionality (Ashutosh) v3: Use HWMON_CHANNEL_INFO to define power1_crit, curr1_crit (Badal) v4: Use hwm_ prefix for static functions (Ashutosh) v5: KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko) Cc: Sujaritha Sundaresan <sujaritha.sundaresan@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> --- .../ABI/testing/sysfs-driver-intel-i915-hwmon | 26 +++++ drivers/gpu/drm/i915/i915_hwmon.c | 95 ++++++++++++++++++- drivers/gpu/drm/i915/i915_reg.h | 6 ++ 3 files changed, 126 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon index 7525db243d74..f9d6d3b08bba 100644 --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon @@ -26,6 +26,32 @@ Description: RO. Card default power limit (default TDP setting). Only supported for particular Intel i915 graphics platforms. +What: /sys/devices/.../hwmon/hwmon<i>/power1_crit +Date: February 2023 +KernelVersion: 6.2 +Contact: dri-devel@lists.freedesktop.org +Description: RW. Card reactive critical (I1) power limit in microwatts. + + Card reactive critical (I1) power limit in microwatts is exposed + for client products. The power controller will throttle the + operating frequency if the power averaged over a window exceeds + this limit. + + Only supported for particular Intel i915 graphics platforms. + +What: /sys/devices/.../hwmon/hwmon<i>/curr1_crit +Date: February 2023 +KernelVersion: 6.2 +Contact: dri-devel@lists.freedesktop.org +Description: RW. Card reactive critical (I1) power limit in milliamperes. + + Card reactive critical (I1) power limit in milliamperes is + exposed for server products. The power controller will throttle + the operating frequency if the power averaged over a window + exceeds this limit. + + Only supported for particular Intel i915 graphics platforms. + What: /sys/devices/.../hwmon/hwmon<i>/energy1_input Date: February 2023 KernelVersion: 6.2 diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c index 9a49521b358a..2394fa789793 100644 --- a/drivers/gpu/drm/i915/i915_hwmon.c +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -11,16 +11,19 @@ #include "i915_hwmon.h" #include "i915_reg.h" #include "intel_mchbar_regs.h" +#include "intel_pcode.h" #include "gt/intel_gt_regs.h" /* * SF_* - scale factors for particular quantities according to hwmon spec. * - voltage - millivolts * - power - microwatts + * - curr - milliamperes * - energy - microjoules */ #define SF_VOLTAGE 1000 #define SF_POWER 1000000 +#define SF_CURR 1000 #define SF_ENERGY 1000000 struct hwm_reg { @@ -160,11 +163,25 @@ hwm_energy(struct hwm_drvdata *ddat, long *energy) static const struct hwmon_channel_info *hwm_info[] = { HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), - HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX), + HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX | HWMON_P_CRIT), HWMON_CHANNEL_INFO(energy, HWMON_E_INPUT), + HWMON_CHANNEL_INFO(curr, HWMON_C_CRIT), NULL }; +/* I1 is exposed as power_crit or as curr_crit depending on bit 31 */ +static int hwm_pcode_read_i1(struct drm_i915_private *i915, u32 *uval) +{ + return snb_pcode_read_p(&i915->uncore, PCODE_POWER_SETUP, + POWER_SETUP_SUBCOMMAND_READ_I1, 0, uval); +} + +static int hwm_pcode_write_i1(struct drm_i915_private *i915, u32 uval) +{ + return snb_pcode_write_p(&i915->uncore, PCODE_POWER_SETUP, + POWER_SETUP_SUBCOMMAND_WRITE_I1, 0, uval); +} + static umode_t hwm_in_is_visible(const struct hwm_drvdata *ddat, u32 attr) { @@ -198,13 +215,18 @@ hwm_in_read(struct hwm_drvdata *ddat, u32 attr, long *val) static umode_t hwm_power_is_visible(const struct hwm_drvdata *ddat, u32 attr, int chan) { + struct drm_i915_private *i915 = ddat->uncore->i915; struct i915_hwmon *hwmon = ddat->hwmon; + u32 uval; switch (attr) { case hwmon_power_max: return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? 0664 : 0; case hwmon_power_rated_max: return i915_mmio_reg_valid(hwmon->rg.pkg_power_sku) ? 0444 : 0; + case hwmon_power_crit: + return (hwm_pcode_read_i1(i915, &uval) || + !(uval & POWER_SETUP_I1_WATTS)) ? 0 : 0644; default: return 0; } @@ -214,6 +236,8 @@ static int hwm_power_read(struct hwm_drvdata *ddat, u32 attr, int chan, long *val) { struct i915_hwmon *hwmon = ddat->hwmon; + int ret; + u32 uval; switch (attr) { case hwmon_power_max: @@ -230,6 +254,15 @@ hwm_power_read(struct hwm_drvdata *ddat, u32 attr, int chan, long *val) hwmon->scl_shift_power, SF_POWER); return 0; + case hwmon_power_crit: + ret = hwm_pcode_read_i1(ddat->uncore->i915, &uval); + if (ret) + return ret; + if (!(uval & POWER_SETUP_I1_WATTS)) + return -ENODEV; + *val = mul_u64_u32_shr(REG_FIELD_GET(POWER_SETUP_I1_DATA_MASK, uval), + SF_POWER, POWER_SETUP_I1_SHIFT); + return 0; default: return -EOPNOTSUPP; } @@ -239,6 +272,7 @@ static int hwm_power_write(struct hwm_drvdata *ddat, u32 attr, int chan, long val) { struct i915_hwmon *hwmon = ddat->hwmon; + u32 uval; switch (attr) { case hwmon_power_max: @@ -248,6 +282,9 @@ hwm_power_write(struct hwm_drvdata *ddat, u32 attr, int chan, long val) hwmon->scl_shift_power, SF_POWER, val); return 0; + case hwmon_power_crit: + uval = DIV_ROUND_CLOSEST_ULL(val << POWER_SETUP_I1_SHIFT, SF_POWER); + return hwm_pcode_write_i1(ddat->uncore->i915, uval); default: return -EOPNOTSUPP; } @@ -279,6 +316,56 @@ hwm_energy_read(struct hwm_drvdata *ddat, u32 attr, long *val) } } +static umode_t +hwm_curr_is_visible(const struct hwm_drvdata *ddat, u32 attr) +{ + struct drm_i915_private *i915 = ddat->uncore->i915; + u32 uval; + + switch (attr) { + case hwmon_curr_crit: + return (hwm_pcode_read_i1(i915, &uval) || + (uval & POWER_SETUP_I1_WATTS)) ? 0 : 0644; + default: + return 0; + } +} + +static int +hwm_curr_read(struct hwm_drvdata *ddat, u32 attr, long *val) +{ + int ret; + u32 uval; + + switch (attr) { + case hwmon_curr_crit: + ret = hwm_pcode_read_i1(ddat->uncore->i915, &uval); + if (ret) + return ret; + if (uval & POWER_SETUP_I1_WATTS) + return -ENODEV; + *val = mul_u64_u32_shr(REG_FIELD_GET(POWER_SETUP_I1_DATA_MASK, uval), + SF_CURR, POWER_SETUP_I1_SHIFT); + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int +hwm_curr_write(struct hwm_drvdata *ddat, u32 attr, long val) +{ + u32 uval; + + switch (attr) { + case hwmon_curr_crit: + uval = DIV_ROUND_CLOSEST_ULL(val << POWER_SETUP_I1_SHIFT, SF_CURR); + return hwm_pcode_write_i1(ddat->uncore->i915, uval); + default: + return -EOPNOTSUPP; + } +} + static umode_t hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, int channel) @@ -292,6 +379,8 @@ hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, return hwm_power_is_visible(ddat, attr, channel); case hwmon_energy: return hwm_energy_is_visible(ddat, attr); + case hwmon_curr: + return hwm_curr_is_visible(ddat, attr); default: return 0; } @@ -310,6 +399,8 @@ hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, return hwm_power_read(ddat, attr, channel, val); case hwmon_energy: return hwm_energy_read(ddat, attr, val); + case hwmon_curr: + return hwm_curr_read(ddat, attr, val); default: return -EOPNOTSUPP; } @@ -324,6 +415,8 @@ hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, switch (type) { case hwmon_power: return hwm_power_write(ddat, attr, channel, val); + case hwmon_curr: + return hwm_curr_write(ddat, attr, val); default: return -EOPNOTSUPP; } diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 5003a5ffbc6a..ff3b352c51cd 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -6655,6 +6655,12 @@ #define DG1_PCODE_STATUS 0x7E #define DG1_UNCORE_GET_INIT_STATUS 0x0 #define DG1_UNCORE_INIT_STATUS_COMPLETE 0x1 +#define PCODE_POWER_SETUP 0x7C +#define POWER_SETUP_SUBCOMMAND_READ_I1 0x4 +#define POWER_SETUP_SUBCOMMAND_WRITE_I1 0x5 +#define POWER_SETUP_I1_WATTS REG_BIT(31) +#define POWER_SETUP_I1_SHIFT 6 /* 10.6 fixed point format */ +#define POWER_SETUP_I1_DATA_MASK REG_GENMASK(15, 0) #define GEN12_PCODE_READ_SAGV_BLOCK_TIME_US 0x23 #define XEHP_PCODE_FREQUENCY_CONFIG 0x6e /* xehpsdv, pvc */ /* XEHP_PCODE_FREQUENCY_CONFIG sub-commands (param1) */ -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 5/7] drm/i915/hwmon: Expose card reactive critical power 2022-09-27 5:50 ` [Intel-gfx] [PATCH 5/7] drm/i915/hwmon: Expose card reactive critical power Badal Nilawar @ 2022-10-03 21:18 ` Andi Shyti 0 siblings, 0 replies; 54+ messages in thread From: Andi Shyti @ 2022-10-03 21:18 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, intel-gfx, dri-devel, Rodrigo Vivi Hi Badal, [...] > diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > index 7525db243d74..f9d6d3b08bba 100644 > --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > @@ -26,6 +26,32 @@ Description: RO. Card default power limit (default TDP setting). > > Only supported for particular Intel i915 graphics platforms. > > +What: /sys/devices/.../hwmon/hwmon<i>/power1_crit > +Date: February 2023 > +KernelVersion: 6.2 > +Contact: dri-devel@lists.freedesktop.org > +Description: RW. Card reactive critical (I1) power limit in microwatts. > + > + Card reactive critical (I1) power limit in microwatts is exposed > + for client products. The power controller will throttle the > + operating frequency if the power averaged over a window exceeds > + this limit. > + > + Only supported for particular Intel i915 graphics platforms. > + > +What: /sys/devices/.../hwmon/hwmon<i>/curr1_crit > +Date: February 2023 > +KernelVersion: 6.2 > +Contact: dri-devel@lists.freedesktop.org same question here, why dri-devel and not intel-gfx? Andi > +Description: RW. Card reactive critical (I1) power limit in milliamperes. > + > + Card reactive critical (I1) power limit in milliamperes is > + exposed for server products. The power controller will throttle > + the operating frequency if the power averaged over a window > + exceeds this limit. > + > + Only supported for particular Intel i915 graphics platforms. > + > What: /sys/devices/.../hwmon/hwmon<i>/energy1_input > Date: February 2023 > KernelVersion: 6.2 ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 6/7] drm/i915/hwmon: Expose power1_max_interval 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar ` (4 preceding siblings ...) 2022-09-27 5:50 ` [Intel-gfx] [PATCH 5/7] drm/i915/hwmon: Expose card reactive critical power Badal Nilawar @ 2022-09-27 5:50 ` Badal Nilawar 2022-09-28 7:09 ` Gupta, Anshuman 2022-10-03 21:32 ` Andi Shyti 2022-09-27 5:50 ` [Intel-gfx] [PATCH 7/7] drm/i915/hwmon: Extend power/energy for XEHPSDV Badal Nilawar ` (5 subsequent siblings) 11 siblings, 2 replies; 54+ messages in thread From: Badal Nilawar @ 2022-09-27 5:50 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel From: Ashutosh Dixit <ashutosh.dixit@intel.com> Expose power1_max_interval, that is the tau corresponding to PL1, as a custom hwmon attribute. Some bit manipulation is needed because of the format of PKG_PWR_LIM_1_TIME in GT0_PACKAGE_RAPL_LIMIT register (1.x * power(2,y)). v2: Update date and kernel version in Documentation (Badal) v3: Cleaned up hwm_power1_max_interval_store() (Badal) v4: - Fixed review comments (Anshuman) - In hwm_power1_max_interval_store() get PKG_MAX_WIN from pkg_power_sku when it is valid (Ashutosh) - KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko) v5: On some of the DGFX setups it is seen that although pkg_power_sku is valid the field PKG_WIN_MAX is not populated. So it is decided to stick to default value of PKG_WIN_MAX (Ashutosh) Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> --- .../ABI/testing/sysfs-driver-intel-i915-hwmon | 9 ++ drivers/gpu/drm/i915/i915_hwmon.c | 115 +++++++++++++++++- drivers/gpu/drm/i915/intel_mchbar_regs.h | 7 ++ 3 files changed, 130 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon index f9d6d3b08bba..19b9fe3ef237 100644 --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon @@ -26,6 +26,15 @@ Description: RO. Card default power limit (default TDP setting). Only supported for particular Intel i915 graphics platforms. +What: /sys/devices/.../hwmon/hwmon<i>/power1_max_interval +Date: February 2023 +KernelVersion: 6.2 +Contact: dri-devel@lists.freedesktop.org +Description: RW. Sustained power limit interval (Tau in PL1/Tau) in + milliseconds over which sustained power is averaged. + + Only supported for particular Intel i915 graphics platforms. + What: /sys/devices/.../hwmon/hwmon<i>/power1_crit Date: February 2023 KernelVersion: 6.2 diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c index 2394fa789793..641143956c45 100644 --- a/drivers/gpu/drm/i915/i915_hwmon.c +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -20,11 +20,13 @@ * - power - microwatts * - curr - milliamperes * - energy - microjoules + * - time - milliseconds */ #define SF_VOLTAGE 1000 #define SF_POWER 1000000 #define SF_CURR 1000 #define SF_ENERGY 1000000 +#define SF_TIME 1000 struct hwm_reg { i915_reg_t gt_perf_status; @@ -53,6 +55,7 @@ struct i915_hwmon { struct hwm_reg rg; int scl_shift_power; int scl_shift_energy; + int scl_shift_time; }; static void @@ -161,6 +164,115 @@ hwm_energy(struct hwm_drvdata *ddat, long *energy) return 0; } +static ssize_t +hwm_power1_max_interval_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct hwm_drvdata *ddat = dev_get_drvdata(dev); + struct i915_hwmon *hwmon = ddat->hwmon; + intel_wakeref_t wakeref; + u32 r, x, y, x_w = 2; /* 2 bits */ + u64 tau4, out; + + with_intel_runtime_pm(ddat->uncore->rpm, wakeref) + r = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit); + + x = REG_FIELD_GET(PKG_PWR_LIM_1_TIME_X, r); + y = REG_FIELD_GET(PKG_PWR_LIM_1_TIME_Y, r); + /* + * tau = 1.x * power(2,y), x = bits(23:22), y = bits(21:17) + * = (4 | x) << (y - 2) + * where (y - 2) ensures a 1.x fixed point representation of 1.x + * However because y can be < 2, we compute + * tau4 = (4 | x) << y + * but add 2 when doing the final right shift to account for units + */ + tau4 = ((1 << x_w) | x) << y; + /* val in hwmon interface units (millisec) */ + out = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w); + + return sysfs_emit(buf, "%llu\n", out); +} + +static ssize_t +hwm_power1_max_interval_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct hwm_drvdata *ddat = dev_get_drvdata(dev); + struct i915_hwmon *hwmon = ddat->hwmon; + long val, max_win, ret; + u32 x, y, rxy, x_w = 2; /* 2 bits */ + u64 tau4, r; + +#define PKG_MAX_WIN_DEFAULT 0x12ull + + ret = kstrtoul(buf, 0, &val); + if (ret) + return ret; + + /* + * val must be < max in hwmon interface units. The steps below are + * explained in i915_power1_max_interval_show() + */ + r = FIELD_PREP(PKG_MAX_WIN, PKG_MAX_WIN_DEFAULT); + + x = REG_FIELD_GET(PKG_MAX_WIN_X, r); + y = REG_FIELD_GET(PKG_MAX_WIN_Y, r); + tau4 = ((1 << x_w) | x) << y; + max_win = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w); + + if (val > max_win) + return -EINVAL; + + /* val in hw units */ + val = DIV_ROUND_CLOSEST_ULL((u64)val << hwmon->scl_shift_time, SF_TIME); + /* Convert to 1.x * power(2,y) */ + if (!val) + return -EINVAL; + y = ilog2(val); + /* x = (val - (1 << y)) >> (y - 2); */ + x = (val - (1ul << y)) << x_w >> y; + + rxy = REG_FIELD_PREP(PKG_PWR_LIM_1_TIME_X, x) | REG_FIELD_PREP(PKG_PWR_LIM_1_TIME_Y, y); + + hwm_locked_with_pm_intel_uncore_rmw(ddat, hwmon->rg.pkg_rapl_limit, + PKG_PWR_LIM_1_TIME, rxy); + return count; +} + +static SENSOR_DEVICE_ATTR(power1_max_interval, 0664, + hwm_power1_max_interval_show, + hwm_power1_max_interval_store, 0); + +static struct attribute *hwm_attributes[] = { + &sensor_dev_attr_power1_max_interval.dev_attr.attr, + NULL +}; + +static umode_t hwm_attributes_visible(struct kobject *kobj, + struct attribute *attr, int index) +{ + struct device *dev = kobj_to_dev(kobj); + struct hwm_drvdata *ddat = dev_get_drvdata(dev); + struct i915_hwmon *hwmon = ddat->hwmon; + + if (attr == &sensor_dev_attr_power1_max_interval.dev_attr.attr) + return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? attr->mode : 0; + else + return 0; +} + +static const struct attribute_group hwm_attrgroup = { + .attrs = hwm_attributes, + .is_visible = hwm_attributes_visible, +}; + +static const struct attribute_group *hwm_groups[] = { + &hwm_attrgroup, + NULL +}; + static const struct hwmon_channel_info *hwm_info[] = { HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX | HWMON_P_CRIT), @@ -472,6 +584,7 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); hwmon->scl_shift_energy = REG_FIELD_GET(PKG_ENERGY_UNIT, val_sku_unit); + hwmon->scl_shift_time = REG_FIELD_GET(PKG_TIME_UNIT, val_sku_unit); /* * Initialize 'struct hwm_energy_info', i.e. set fields to the @@ -510,7 +623,7 @@ void i915_hwmon_register(struct drm_i915_private *i915) hwmon_dev = devm_hwmon_device_register_with_info(dev, ddat->name, ddat, &hwm_chip_info, - NULL); + hwm_groups); if (IS_ERR(hwmon_dev)) { i915->hwmon = NULL; return; diff --git a/drivers/gpu/drm/i915/intel_mchbar_regs.h b/drivers/gpu/drm/i915/intel_mchbar_regs.h index bd42fb66e297..64aa1e9be463 100644 --- a/drivers/gpu/drm/i915/intel_mchbar_regs.h +++ b/drivers/gpu/drm/i915/intel_mchbar_regs.h @@ -194,6 +194,9 @@ */ #define PCU_PACKAGE_POWER_SKU _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5930) #define PKG_PKG_TDP GENMASK_ULL(14, 0) +#define PKG_MAX_WIN GENMASK_ULL(54, 48) +#define PKG_MAX_WIN_X GENMASK_ULL(54, 53) +#define PKG_MAX_WIN_Y GENMASK_ULL(52, 48) #define PCU_PACKAGE_POWER_SKU_UNIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5938) #define PKG_PWR_UNIT REG_GENMASK(3, 0) @@ -212,6 +215,10 @@ #define RPE_MASK REG_GENMASK(15, 8) #define PCU_PACKAGE_RAPL_LIMIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x59a0) #define PKG_PWR_LIM_1 REG_GENMASK(14, 0) +#define PKG_PWR_LIM_1_EN REG_BIT(15) +#define PKG_PWR_LIM_1_TIME REG_GENMASK(23, 17) +#define PKG_PWR_LIM_1_TIME_X REG_GENMASK(23, 22) +#define PKG_PWR_LIM_1_TIME_Y REG_GENMASK(21, 17) /* snb MCH registers for priority tuning */ #define MCH_SSKPD _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5d10) -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 6/7] drm/i915/hwmon: Expose power1_max_interval 2022-09-27 5:50 ` [Intel-gfx] [PATCH 6/7] drm/i915/hwmon: Expose power1_max_interval Badal Nilawar @ 2022-09-28 7:09 ` Gupta, Anshuman 2022-10-03 21:32 ` Andi Shyti 1 sibling, 0 replies; 54+ messages in thread From: Gupta, Anshuman @ 2022-09-28 7:09 UTC (permalink / raw) To: Badal Nilawar, intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel On 9/27/2022 11:20 AM, Badal Nilawar wrote: > From: Ashutosh Dixit <ashutosh.dixit@intel.com> > > Expose power1_max_interval, that is the tau corresponding to PL1, as a > custom hwmon attribute. Some bit manipulation is needed because of the > format of PKG_PWR_LIM_1_TIME in > GT0_PACKAGE_RAPL_LIMIT register (1.x * power(2,y)). > > v2: Update date and kernel version in Documentation (Badal) > v3: Cleaned up hwm_power1_max_interval_store() (Badal) > v4: > - Fixed review comments (Anshuman) > - In hwm_power1_max_interval_store() get PKG_MAX_WIN from > pkg_power_sku when it is valid (Ashutosh) > - KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko) > v5: On some of the DGFX setups it is seen that although pkg_power_sku > is valid the field PKG_WIN_MAX is not populated. So it is > decided to stick to default value of PKG_WIN_MAX (Ashutosh) > > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> > Acked-by: Guenter Roeck <linux@roeck-us.net> LGTM, Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> > --- > .../ABI/testing/sysfs-driver-intel-i915-hwmon | 9 ++ > drivers/gpu/drm/i915/i915_hwmon.c | 115 +++++++++++++++++- > drivers/gpu/drm/i915/intel_mchbar_regs.h | 7 ++ > 3 files changed, 130 insertions(+), 1 deletion(-) > > diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > index f9d6d3b08bba..19b9fe3ef237 100644 > --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > @@ -26,6 +26,15 @@ Description: RO. Card default power limit (default TDP setting). > > Only supported for particular Intel i915 graphics platforms. > > +What: /sys/devices/.../hwmon/hwmon<i>/power1_max_interval > +Date: February 2023 > +KernelVersion: 6.2 > +Contact: dri-devel@lists.freedesktop.org > +Description: RW. Sustained power limit interval (Tau in PL1/Tau) in > + milliseconds over which sustained power is averaged. > + > + Only supported for particular Intel i915 graphics platforms. > + > What: /sys/devices/.../hwmon/hwmon<i>/power1_crit > Date: February 2023 > KernelVersion: 6.2 > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > index 2394fa789793..641143956c45 100644 > --- a/drivers/gpu/drm/i915/i915_hwmon.c > +++ b/drivers/gpu/drm/i915/i915_hwmon.c > @@ -20,11 +20,13 @@ > * - power - microwatts > * - curr - milliamperes > * - energy - microjoules > + * - time - milliseconds > */ > #define SF_VOLTAGE 1000 > #define SF_POWER 1000000 > #define SF_CURR 1000 > #define SF_ENERGY 1000000 > +#define SF_TIME 1000 > > struct hwm_reg { > i915_reg_t gt_perf_status; > @@ -53,6 +55,7 @@ struct i915_hwmon { > struct hwm_reg rg; > int scl_shift_power; > int scl_shift_energy; > + int scl_shift_time; > }; > > static void > @@ -161,6 +164,115 @@ hwm_energy(struct hwm_drvdata *ddat, long *energy) > return 0; > } > > +static ssize_t > +hwm_power1_max_interval_show(struct device *dev, struct device_attribute *attr, > + char *buf) > +{ > + struct hwm_drvdata *ddat = dev_get_drvdata(dev); > + struct i915_hwmon *hwmon = ddat->hwmon; > + intel_wakeref_t wakeref; > + u32 r, x, y, x_w = 2; /* 2 bits */ > + u64 tau4, out; > + > + with_intel_runtime_pm(ddat->uncore->rpm, wakeref) > + r = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit); > + > + x = REG_FIELD_GET(PKG_PWR_LIM_1_TIME_X, r); > + y = REG_FIELD_GET(PKG_PWR_LIM_1_TIME_Y, r); > + /* > + * tau = 1.x * power(2,y), x = bits(23:22), y = bits(21:17) > + * = (4 | x) << (y - 2) > + * where (y - 2) ensures a 1.x fixed point representation of 1.x > + * However because y can be < 2, we compute > + * tau4 = (4 | x) << y > + * but add 2 when doing the final right shift to account for units > + */ > + tau4 = ((1 << x_w) | x) << y; > + /* val in hwmon interface units (millisec) */ > + out = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w); > + > + return sysfs_emit(buf, "%llu\n", out); > +} > + > +static ssize_t > +hwm_power1_max_interval_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + struct hwm_drvdata *ddat = dev_get_drvdata(dev); > + struct i915_hwmon *hwmon = ddat->hwmon; > + long val, max_win, ret; > + u32 x, y, rxy, x_w = 2; /* 2 bits */ > + u64 tau4, r; > + > +#define PKG_MAX_WIN_DEFAULT 0x12ull > + > + ret = kstrtoul(buf, 0, &val); > + if (ret) > + return ret; > + > + /* > + * val must be < max in hwmon interface units. The steps below are > + * explained in i915_power1_max_interval_show() > + */ > + r = FIELD_PREP(PKG_MAX_WIN, PKG_MAX_WIN_DEFAULT); > + > + x = REG_FIELD_GET(PKG_MAX_WIN_X, r); > + y = REG_FIELD_GET(PKG_MAX_WIN_Y, r); > + tau4 = ((1 << x_w) | x) << y; > + max_win = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w); > + > + if (val > max_win) > + return -EINVAL; > + > + /* val in hw units */ > + val = DIV_ROUND_CLOSEST_ULL((u64)val << hwmon->scl_shift_time, SF_TIME); > + /* Convert to 1.x * power(2,y) */ > + if (!val) > + return -EINVAL; > + y = ilog2(val); > + /* x = (val - (1 << y)) >> (y - 2); */ > + x = (val - (1ul << y)) << x_w >> y; > + > + rxy = REG_FIELD_PREP(PKG_PWR_LIM_1_TIME_X, x) | REG_FIELD_PREP(PKG_PWR_LIM_1_TIME_Y, y); > + > + hwm_locked_with_pm_intel_uncore_rmw(ddat, hwmon->rg.pkg_rapl_limit, > + PKG_PWR_LIM_1_TIME, rxy); > + return count; > +} > + > +static SENSOR_DEVICE_ATTR(power1_max_interval, 0664, > + hwm_power1_max_interval_show, > + hwm_power1_max_interval_store, 0); > + > +static struct attribute *hwm_attributes[] = { > + &sensor_dev_attr_power1_max_interval.dev_attr.attr, > + NULL > +}; > + > +static umode_t hwm_attributes_visible(struct kobject *kobj, > + struct attribute *attr, int index) > +{ > + struct device *dev = kobj_to_dev(kobj); > + struct hwm_drvdata *ddat = dev_get_drvdata(dev); > + struct i915_hwmon *hwmon = ddat->hwmon; > + > + if (attr == &sensor_dev_attr_power1_max_interval.dev_attr.attr) > + return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? attr->mode : 0; > + else > + return 0; > +} > + > +static const struct attribute_group hwm_attrgroup = { > + .attrs = hwm_attributes, > + .is_visible = hwm_attributes_visible, > +}; > + > +static const struct attribute_group *hwm_groups[] = { > + &hwm_attrgroup, > + NULL > +}; > + > static const struct hwmon_channel_info *hwm_info[] = { > HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), > HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX | HWMON_P_CRIT), > @@ -472,6 +584,7 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) > > hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); > hwmon->scl_shift_energy = REG_FIELD_GET(PKG_ENERGY_UNIT, val_sku_unit); > + hwmon->scl_shift_time = REG_FIELD_GET(PKG_TIME_UNIT, val_sku_unit); > > /* > * Initialize 'struct hwm_energy_info', i.e. set fields to the > @@ -510,7 +623,7 @@ void i915_hwmon_register(struct drm_i915_private *i915) > hwmon_dev = devm_hwmon_device_register_with_info(dev, ddat->name, > ddat, > &hwm_chip_info, > - NULL); > + hwm_groups); > if (IS_ERR(hwmon_dev)) { > i915->hwmon = NULL; > return; > diff --git a/drivers/gpu/drm/i915/intel_mchbar_regs.h b/drivers/gpu/drm/i915/intel_mchbar_regs.h > index bd42fb66e297..64aa1e9be463 100644 > --- a/drivers/gpu/drm/i915/intel_mchbar_regs.h > +++ b/drivers/gpu/drm/i915/intel_mchbar_regs.h > @@ -194,6 +194,9 @@ > */ > #define PCU_PACKAGE_POWER_SKU _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5930) > #define PKG_PKG_TDP GENMASK_ULL(14, 0) > +#define PKG_MAX_WIN GENMASK_ULL(54, 48) > +#define PKG_MAX_WIN_X GENMASK_ULL(54, 53) > +#define PKG_MAX_WIN_Y GENMASK_ULL(52, 48) > > #define PCU_PACKAGE_POWER_SKU_UNIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5938) > #define PKG_PWR_UNIT REG_GENMASK(3, 0) > @@ -212,6 +215,10 @@ > #define RPE_MASK REG_GENMASK(15, 8) > #define PCU_PACKAGE_RAPL_LIMIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x59a0) > #define PKG_PWR_LIM_1 REG_GENMASK(14, 0) > +#define PKG_PWR_LIM_1_EN REG_BIT(15) > +#define PKG_PWR_LIM_1_TIME REG_GENMASK(23, 17) > +#define PKG_PWR_LIM_1_TIME_X REG_GENMASK(23, 22) > +#define PKG_PWR_LIM_1_TIME_Y REG_GENMASK(21, 17) > > /* snb MCH registers for priority tuning */ > #define MCH_SSKPD _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5d10) ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 6/7] drm/i915/hwmon: Expose power1_max_interval 2022-09-27 5:50 ` [Intel-gfx] [PATCH 6/7] drm/i915/hwmon: Expose power1_max_interval Badal Nilawar 2022-09-28 7:09 ` Gupta, Anshuman @ 2022-10-03 21:32 ` Andi Shyti 2022-10-13 15:55 ` Dixit, Ashutosh 1 sibling, 1 reply; 54+ messages in thread From: Andi Shyti @ 2022-10-03 21:32 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, intel-gfx, dri-devel Hi Badal, > diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > index f9d6d3b08bba..19b9fe3ef237 100644 > --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > @@ -26,6 +26,15 @@ Description: RO. Card default power limit (default TDP setting). > > Only supported for particular Intel i915 graphics platforms. > > +What: /sys/devices/.../hwmon/hwmon<i>/power1_max_interval > +Date: February 2023 > +KernelVersion: 6.2 > +Contact: dri-devel@lists.freedesktop.org same question here. > +Description: RW. Sustained power limit interval (Tau in PL1/Tau) in > + milliseconds over which sustained power is averaged. > + > + Only supported for particular Intel i915 graphics platforms. > + > What: /sys/devices/.../hwmon/hwmon<i>/power1_crit > Date: February 2023 > KernelVersion: 6.2 > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > index 2394fa789793..641143956c45 100644 > --- a/drivers/gpu/drm/i915/i915_hwmon.c > +++ b/drivers/gpu/drm/i915/i915_hwmon.c > @@ -20,11 +20,13 @@ > * - power - microwatts > * - curr - milliamperes > * - energy - microjoules > + * - time - milliseconds > */ > #define SF_VOLTAGE 1000 > #define SF_POWER 1000000 > #define SF_CURR 1000 > #define SF_ENERGY 1000000 > +#define SF_TIME 1000 > > struct hwm_reg { > i915_reg_t gt_perf_status; > @@ -53,6 +55,7 @@ struct i915_hwmon { > struct hwm_reg rg; > int scl_shift_power; > int scl_shift_energy; > + int scl_shift_time; > }; > > static void > @@ -161,6 +164,115 @@ hwm_energy(struct hwm_drvdata *ddat, long *energy) > return 0; > } > > +static ssize_t > +hwm_power1_max_interval_show(struct device *dev, struct device_attribute *attr, > + char *buf) > +{ > + struct hwm_drvdata *ddat = dev_get_drvdata(dev); > + struct i915_hwmon *hwmon = ddat->hwmon; > + intel_wakeref_t wakeref; > + u32 r, x, y, x_w = 2; /* 2 bits */ > + u64 tau4, out; > + > + with_intel_runtime_pm(ddat->uncore->rpm, wakeref) > + r = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit); > + > + x = REG_FIELD_GET(PKG_PWR_LIM_1_TIME_X, r); > + y = REG_FIELD_GET(PKG_PWR_LIM_1_TIME_Y, r); > + /* > + * tau = 1.x * power(2,y), x = bits(23:22), y = bits(21:17) > + * = (4 | x) << (y - 2) > + * where (y - 2) ensures a 1.x fixed point representation of 1.x > + * However because y can be < 2, we compute > + * tau4 = (4 | x) << y > + * but add 2 when doing the final right shift to account for units > + */ > + tau4 = ((1 << x_w) | x) << y; > + /* val in hwmon interface units (millisec) */ > + out = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w); > + > + return sysfs_emit(buf, "%llu\n", out); > +} > + > +static ssize_t > +hwm_power1_max_interval_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + struct hwm_drvdata *ddat = dev_get_drvdata(dev); > + struct i915_hwmon *hwmon = ddat->hwmon; > + long val, max_win, ret; you have some type mismatch here: - val should be unsigned long - max_win should be u64 - ret should be int > + u32 x, y, rxy, x_w = 2; /* 2 bits */ > + u64 tau4, r; > + > +#define PKG_MAX_WIN_DEFAULT 0x12ull could you please add a comment here? > + > + ret = kstrtoul(buf, 0, &val); > + if (ret) > + return ret; > + > + /* > + * val must be < max in hwmon interface units. The steps below are > + * explained in i915_power1_max_interval_show() > + */ > + r = FIELD_PREP(PKG_MAX_WIN, PKG_MAX_WIN_DEFAULT); > + > + x = REG_FIELD_GET(PKG_MAX_WIN_X, r); > + y = REG_FIELD_GET(PKG_MAX_WIN_Y, r); > + tau4 = ((1 << x_w) | x) << y; > + max_win = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w); > + > + if (val > max_win) > + return -EINVAL; > + > + /* val in hw units */ > + val = DIV_ROUND_CLOSEST_ULL((u64)val << hwmon->scl_shift_time, SF_TIME); > + /* Convert to 1.x * power(2,y) */ > + if (!val) > + return -EINVAL; > + y = ilog2(val); > + /* x = (val - (1 << y)) >> (y - 2); */ some leftover > + x = (val - (1ul << y)) << x_w >> y; > + > + rxy = REG_FIELD_PREP(PKG_PWR_LIM_1_TIME_X, x) | REG_FIELD_PREP(PKG_PWR_LIM_1_TIME_Y, y); > + > + hwm_locked_with_pm_intel_uncore_rmw(ddat, hwmon->rg.pkg_rapl_limit, > + PKG_PWR_LIM_1_TIME, rxy); > + return count; > +} > + > +static SENSOR_DEVICE_ATTR(power1_max_interval, 0664, > + hwm_power1_max_interval_show, > + hwm_power1_max_interval_store, 0); > + > +static struct attribute *hwm_attributes[] = { > + &sensor_dev_attr_power1_max_interval.dev_attr.attr, > + NULL > +}; > + > +static umode_t hwm_attributes_visible(struct kobject *kobj, > + struct attribute *attr, int index) > +{ > + struct device *dev = kobj_to_dev(kobj); > + struct hwm_drvdata *ddat = dev_get_drvdata(dev); > + struct i915_hwmon *hwmon = ddat->hwmon; > + > + if (attr == &sensor_dev_attr_power1_max_interval.dev_attr.attr) > + return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? attr->mode : 0; > + else > + return 0; please remove the else Andi > +} > + > +static const struct attribute_group hwm_attrgroup = { > + .attrs = hwm_attributes, > + .is_visible = hwm_attributes_visible, > +}; > + > +static const struct attribute_group *hwm_groups[] = { > + &hwm_attrgroup, > + NULL > +}; > + > static const struct hwmon_channel_info *hwm_info[] = { > HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), > HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX | HWMON_P_CRIT), > @@ -472,6 +584,7 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) > > hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); > hwmon->scl_shift_energy = REG_FIELD_GET(PKG_ENERGY_UNIT, val_sku_unit); > + hwmon->scl_shift_time = REG_FIELD_GET(PKG_TIME_UNIT, val_sku_unit); > > /* > * Initialize 'struct hwm_energy_info', i.e. set fields to the > @@ -510,7 +623,7 @@ void i915_hwmon_register(struct drm_i915_private *i915) > hwmon_dev = devm_hwmon_device_register_with_info(dev, ddat->name, > ddat, > &hwm_chip_info, > - NULL); > + hwm_groups); > if (IS_ERR(hwmon_dev)) { > i915->hwmon = NULL; > return; > diff --git a/drivers/gpu/drm/i915/intel_mchbar_regs.h b/drivers/gpu/drm/i915/intel_mchbar_regs.h > index bd42fb66e297..64aa1e9be463 100644 > --- a/drivers/gpu/drm/i915/intel_mchbar_regs.h > +++ b/drivers/gpu/drm/i915/intel_mchbar_regs.h > @@ -194,6 +194,9 @@ > */ > #define PCU_PACKAGE_POWER_SKU _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5930) > #define PKG_PKG_TDP GENMASK_ULL(14, 0) > +#define PKG_MAX_WIN GENMASK_ULL(54, 48) > +#define PKG_MAX_WIN_X GENMASK_ULL(54, 53) > +#define PKG_MAX_WIN_Y GENMASK_ULL(52, 48) > > #define PCU_PACKAGE_POWER_SKU_UNIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5938) > #define PKG_PWR_UNIT REG_GENMASK(3, 0) > @@ -212,6 +215,10 @@ > #define RPE_MASK REG_GENMASK(15, 8) > #define PCU_PACKAGE_RAPL_LIMIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x59a0) > #define PKG_PWR_LIM_1 REG_GENMASK(14, 0) > +#define PKG_PWR_LIM_1_EN REG_BIT(15) > +#define PKG_PWR_LIM_1_TIME REG_GENMASK(23, 17) > +#define PKG_PWR_LIM_1_TIME_X REG_GENMASK(23, 22) > +#define PKG_PWR_LIM_1_TIME_Y REG_GENMASK(21, 17) > > /* snb MCH registers for priority tuning */ > #define MCH_SSKPD _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5d10) > -- > 2.25.1 ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 6/7] drm/i915/hwmon: Expose power1_max_interval 2022-10-03 21:32 ` Andi Shyti @ 2022-10-13 15:55 ` Dixit, Ashutosh 0 siblings, 0 replies; 54+ messages in thread From: Dixit, Ashutosh @ 2022-10-13 15:55 UTC (permalink / raw) To: Andi Shyti; +Cc: linux-hwmon, intel-gfx, dri-devel On Mon, 03 Oct 2022 14:32:36 -0700, Andi Shyti wrote: > Hi Andi, > > diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > index f9d6d3b08bba..19b9fe3ef237 100644 > > --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon > > @@ -26,6 +26,15 @@ Description: RO. Card default power limit (default TDP setting). > > > > Only supported for particular Intel i915 graphics platforms. > > > > +What: /sys/devices/.../hwmon/hwmon<i>/power1_max_interval > > +Date: February 2023 > > +KernelVersion: 6.2 > > +Contact: dri-devel@lists.freedesktop.org > > same question here. > > > +Description: RW. Sustained power limit interval (Tau in PL1/Tau) in > > + milliseconds over which sustained power is averaged. > > + > > + Only supported for particular Intel i915 graphics platforms. > > + > > What: /sys/devices/.../hwmon/hwmon<i>/power1_crit > > Date: February 2023 > > KernelVersion: 6.2 > > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > > index 2394fa789793..641143956c45 100644 > > --- a/drivers/gpu/drm/i915/i915_hwmon.c > > +++ b/drivers/gpu/drm/i915/i915_hwmon.c > > @@ -20,11 +20,13 @@ > > * - power - microwatts > > * - curr - milliamperes > > * - energy - microjoules > > + * - time - milliseconds > > */ > > #define SF_VOLTAGE 1000 > > #define SF_POWER 1000000 > > #define SF_CURR 1000 > > #define SF_ENERGY 1000000 > > +#define SF_TIME 1000 > > > > struct hwm_reg { > > i915_reg_t gt_perf_status; > > @@ -53,6 +55,7 @@ struct i915_hwmon { > > struct hwm_reg rg; > > int scl_shift_power; > > int scl_shift_energy; > > + int scl_shift_time; > > }; > > > > static void > > @@ -161,6 +164,115 @@ hwm_energy(struct hwm_drvdata *ddat, long *energy) > > return 0; > > } > > > > +static ssize_t > > +hwm_power1_max_interval_show(struct device *dev, struct device_attribute *attr, > > + char *buf) > > +{ > > + struct hwm_drvdata *ddat = dev_get_drvdata(dev); > > + struct i915_hwmon *hwmon = ddat->hwmon; > > + intel_wakeref_t wakeref; > > + u32 r, x, y, x_w = 2; /* 2 bits */ > > + u64 tau4, out; > > + > > + with_intel_runtime_pm(ddat->uncore->rpm, wakeref) > > + r = intel_uncore_read(ddat->uncore, hwmon->rg.pkg_rapl_limit); > > + > > + x = REG_FIELD_GET(PKG_PWR_LIM_1_TIME_X, r); > > + y = REG_FIELD_GET(PKG_PWR_LIM_1_TIME_Y, r); > > + /* > > + * tau = 1.x * power(2,y), x = bits(23:22), y = bits(21:17) > > + * = (4 | x) << (y - 2) > > + * where (y - 2) ensures a 1.x fixed point representation of 1.x > > + * However because y can be < 2, we compute > > + * tau4 = (4 | x) << y > > + * but add 2 when doing the final right shift to account for units > > + */ > > + tau4 = ((1 << x_w) | x) << y; > > + /* val in hwmon interface units (millisec) */ > > + out = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w); > > + > > + return sysfs_emit(buf, "%llu\n", out); > > +} > > + > > +static ssize_t > > +hwm_power1_max_interval_store(struct device *dev, > > + struct device_attribute *attr, > > + const char *buf, size_t count) > > +{ > > + struct hwm_drvdata *ddat = dev_get_drvdata(dev); > > + struct i915_hwmon *hwmon = ddat->hwmon; > > + long val, max_win, ret; > > you have some type mismatch here: > > - val should be unsigned long > - max_win should be u64 > - ret should be int Thanks, fixed in v9. > > > + u32 x, y, rxy, x_w = 2; /* 2 bits */ > > + u64 tau4, r; > > + > > +#define PKG_MAX_WIN_DEFAULT 0x12ull > > could you please add a comment here? Done. > > + > > + ret = kstrtoul(buf, 0, &val); > > + if (ret) > > + return ret; > > + > > + /* > > + * val must be < max in hwmon interface units. The steps below are > > + * explained in i915_power1_max_interval_show() > > + */ > > + r = FIELD_PREP(PKG_MAX_WIN, PKG_MAX_WIN_DEFAULT); > > + > > + x = REG_FIELD_GET(PKG_MAX_WIN_X, r); > > + y = REG_FIELD_GET(PKG_MAX_WIN_Y, r); > > + tau4 = ((1 << x_w) | x) << y; > > + max_win = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w); > > + > > + if (val > max_win) > > + return -EINVAL; > > + > > + /* val in hw units */ > > + val = DIV_ROUND_CLOSEST_ULL((u64)val << hwmon->scl_shift_time, SF_TIME); > > + /* Convert to 1.x * power(2,y) */ > > + if (!val) > > + return -EINVAL; > > + y = ilog2(val); > > + /* x = (val - (1 << y)) >> (y - 2); */ > > some leftover No, it's a comment describing what's happening in the line below. I've left it as is for now. Can remove it if you think it's unnecessary. > > > + x = (val - (1ul << y)) << x_w >> y; > > + > > + rxy = REG_FIELD_PREP(PKG_PWR_LIM_1_TIME_X, x) | REG_FIELD_PREP(PKG_PWR_LIM_1_TIME_Y, y); > > + > > + hwm_locked_with_pm_intel_uncore_rmw(ddat, hwmon->rg.pkg_rapl_limit, > > + PKG_PWR_LIM_1_TIME, rxy); > > + return count; > > +} > > + > > +static SENSOR_DEVICE_ATTR(power1_max_interval, 0664, > > + hwm_power1_max_interval_show, > > + hwm_power1_max_interval_store, 0); > > + > > +static struct attribute *hwm_attributes[] = { > > + &sensor_dev_attr_power1_max_interval.dev_attr.attr, > > + NULL > > +}; > > + > > +static umode_t hwm_attributes_visible(struct kobject *kobj, > > + struct attribute *attr, int index) > > +{ > > + struct device *dev = kobj_to_dev(kobj); > > + struct hwm_drvdata *ddat = dev_get_drvdata(dev); > > + struct i915_hwmon *hwmon = ddat->hwmon; > > + > > + if (attr == &sensor_dev_attr_power1_max_interval.dev_attr.attr) > > + return i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit) ? attr->mode : 0; > > + else > > + return 0; > > please remove the else Done. Thanks. -- Ashutosh > > +} > > + > > +static const struct attribute_group hwm_attrgroup = { > > + .attrs = hwm_attributes, > > + .is_visible = hwm_attributes_visible, > > +}; > > + > > +static const struct attribute_group *hwm_groups[] = { > > + &hwm_attrgroup, > > + NULL > > +}; > > + > > static const struct hwmon_channel_info *hwm_info[] = { > > HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), > > HWMON_CHANNEL_INFO(power, HWMON_P_MAX | HWMON_P_RATED_MAX | HWMON_P_CRIT), > > @@ -472,6 +584,7 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) > > > > hwmon->scl_shift_power = REG_FIELD_GET(PKG_PWR_UNIT, val_sku_unit); > > hwmon->scl_shift_energy = REG_FIELD_GET(PKG_ENERGY_UNIT, val_sku_unit); > > + hwmon->scl_shift_time = REG_FIELD_GET(PKG_TIME_UNIT, val_sku_unit); > > > > /* > > * Initialize 'struct hwm_energy_info', i.e. set fields to the > > @@ -510,7 +623,7 @@ void i915_hwmon_register(struct drm_i915_private *i915) > > hwmon_dev = devm_hwmon_device_register_with_info(dev, ddat->name, > > ddat, > > &hwm_chip_info, > > - NULL); > > + hwm_groups); > > if (IS_ERR(hwmon_dev)) { > > i915->hwmon = NULL; > > return; > > diff --git a/drivers/gpu/drm/i915/intel_mchbar_regs.h b/drivers/gpu/drm/i915/intel_mchbar_regs.h > > index bd42fb66e297..64aa1e9be463 100644 > > --- a/drivers/gpu/drm/i915/intel_mchbar_regs.h > > +++ b/drivers/gpu/drm/i915/intel_mchbar_regs.h > > @@ -194,6 +194,9 @@ > > */ > > #define PCU_PACKAGE_POWER_SKU _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5930) > > #define PKG_PKG_TDP GENMASK_ULL(14, 0) > > +#define PKG_MAX_WIN GENMASK_ULL(54, 48) > > +#define PKG_MAX_WIN_X GENMASK_ULL(54, 53) > > +#define PKG_MAX_WIN_Y GENMASK_ULL(52, 48) > > > > #define PCU_PACKAGE_POWER_SKU_UNIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5938) > > #define PKG_PWR_UNIT REG_GENMASK(3, 0) > > @@ -212,6 +215,10 @@ > > #define RPE_MASK REG_GENMASK(15, 8) > > #define PCU_PACKAGE_RAPL_LIMIT _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x59a0) > > #define PKG_PWR_LIM_1 REG_GENMASK(14, 0) > > +#define PKG_PWR_LIM_1_EN REG_BIT(15) > > +#define PKG_PWR_LIM_1_TIME REG_GENMASK(23, 17) > > +#define PKG_PWR_LIM_1_TIME_X REG_GENMASK(23, 22) > > +#define PKG_PWR_LIM_1_TIME_Y REG_GENMASK(21, 17) > > > > /* snb MCH registers for priority tuning */ > > #define MCH_SSKPD _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5d10) > > -- > > 2.25.1 ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 7/7] drm/i915/hwmon: Extend power/energy for XEHPSDV 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar ` (5 preceding siblings ...) 2022-09-27 5:50 ` [Intel-gfx] [PATCH 6/7] drm/i915/hwmon: Expose power1_max_interval Badal Nilawar @ 2022-09-27 5:50 ` Badal Nilawar 2022-10-03 21:40 ` Andi Shyti 2022-09-27 7:13 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Add HWMON support (rev8) Patchwork ` (4 subsequent siblings) 11 siblings, 1 reply; 54+ messages in thread From: Badal Nilawar @ 2022-09-27 5:50 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel From: Dale B Stimson <dale.b.stimson@intel.com> Extend hwmon power/energy for XEHPSDV especially per gt level energy usage. v2: Update to latest HWMON spec (Ashutosh) v3: Fix review comments (Ashutosh) v4: Fix review comments (Anshuman) v5: s/hwmon_device_register_with_info/ devm_hwmon_device_register_with_info/ (Ashutosh) Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> --- .../ABI/testing/sysfs-driver-intel-i915-hwmon | 7 +- drivers/gpu/drm/i915/gt/intel_gt_regs.h | 5 + drivers/gpu/drm/i915/i915_hwmon.c | 102 +++++++++++++++++- 3 files changed, 111 insertions(+), 3 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon index 19b9fe3ef237..dbd16b0f56d0 100644 --- a/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon +++ b/Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon @@ -65,6 +65,11 @@ What: /sys/devices/.../hwmon/hwmon<i>/energy1_input Date: February 2023 KernelVersion: 6.2 Contact: dri-devel@lists.freedesktop.org -Description: RO. Energy input of device in microjoules. +Description: RO. Energy input of device or gt in microjoules. + + For i915 device level hwmon devices (name "i915") this + reflects energy input for the entire device. For gt level + hwmon devices (name "i915_gtN") this reflects energy input + for the gt. Only supported for particular Intel i915 graphics platforms. diff --git a/drivers/gpu/drm/i915/gt/intel_gt_regs.h b/drivers/gpu/drm/i915/gt/intel_gt_regs.h index fcf5f9012852..30458f1cf0dd 100644 --- a/drivers/gpu/drm/i915/gt/intel_gt_regs.h +++ b/drivers/gpu/drm/i915/gt/intel_gt_regs.h @@ -1592,6 +1592,11 @@ #define GEN12_SFC_DONE(n) _MMIO(0x1cc000 + (n) * 0x1000) +#define GT0_PACKAGE_ENERGY_STATUS _MMIO(0x250004) +#define GT0_PACKAGE_RAPL_LIMIT _MMIO(0x250008) +#define GT0_PACKAGE_POWER_SKU_UNIT _MMIO(0x250068) +#define GT0_PLATFORM_ENERGY_STATUS _MMIO(0x25006c) + /* * Standalone Media's non-engine GT registers are located at their regular GT * offsets plus 0x380000. This extra offset is stored inside the intel_uncore diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c index 641143956c45..d80bc569ebcf 100644 --- a/drivers/gpu/drm/i915/i915_hwmon.c +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -12,6 +12,7 @@ #include "i915_reg.h" #include "intel_mchbar_regs.h" #include "intel_pcode.h" +#include "gt/intel_gt.h" #include "gt/intel_gt_regs.h" /* @@ -34,6 +35,7 @@ struct hwm_reg { i915_reg_t pkg_power_sku; i915_reg_t pkg_rapl_limit; i915_reg_t energy_status_all; + i915_reg_t energy_status_tile; }; struct hwm_energy_info { @@ -47,10 +49,12 @@ struct hwm_drvdata { struct device *hwmon_dev; struct hwm_energy_info ei; /* Energy info for energy1_input */ char name[12]; + int gt_n; }; struct i915_hwmon { struct hwm_drvdata ddat; + struct hwm_drvdata ddat_gt[I915_MAX_GT]; struct mutex hwmon_lock; /* counter overflow logic and rmw */ struct hwm_reg rg; int scl_shift_power; @@ -144,7 +148,10 @@ hwm_energy(struct hwm_drvdata *ddat, long *energy) i915_reg_t rgaddr; u32 reg_val; - rgaddr = hwmon->rg.energy_status_all; + if (ddat->gt_n >= 0) + rgaddr = hwmon->rg.energy_status_tile; + else + rgaddr = hwmon->rg.energy_status_all; mutex_lock(&hwmon->hwmon_lock); @@ -281,6 +288,11 @@ static const struct hwmon_channel_info *hwm_info[] = { NULL }; +static const struct hwmon_channel_info *hwm_gt_info[] = { + HWMON_CHANNEL_INFO(energy, HWMON_E_INPUT), + NULL +}; + /* I1 is exposed as power_crit or as curr_crit depending on bit 31 */ static int hwm_pcode_read_i1(struct drm_i915_private *i915, u32 *uval) { @@ -410,7 +422,10 @@ hwm_energy_is_visible(const struct hwm_drvdata *ddat, u32 attr) switch (attr) { case hwmon_energy_input: - rgaddr = hwmon->rg.energy_status_all; + if (ddat->gt_n >= 0) + rgaddr = hwmon->rg.energy_status_tile; + else + rgaddr = hwmon->rg.energy_status_all; return i915_mmio_reg_valid(rgaddr) ? 0444 : 0; default: return 0; @@ -545,6 +560,44 @@ static const struct hwmon_chip_info hwm_chip_info = { .info = hwm_info, }; +static umode_t +hwm_gt_is_visible(const void *drvdata, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + struct hwm_drvdata *ddat = (struct hwm_drvdata *)drvdata; + + switch (type) { + case hwmon_energy: + return hwm_energy_is_visible(ddat, attr); + default: + return 0; + } +} + +static int +hwm_gt_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long *val) +{ + struct hwm_drvdata *ddat = dev_get_drvdata(dev); + + switch (type) { + case hwmon_energy: + return hwm_energy_read(ddat, attr, val); + default: + return -EOPNOTSUPP; + } +} + +static const struct hwmon_ops hwm_gt_ops = { + .is_visible = hwm_gt_is_visible, + .read = hwm_gt_read, +}; + +static const struct hwmon_chip_info hwm_gt_chip_info = { + .ops = &hwm_gt_ops, + .info = hwm_gt_info, +}; + static void hwm_get_preregistration_info(struct drm_i915_private *i915) { @@ -553,7 +606,9 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) struct hwm_drvdata *ddat = &hwmon->ddat; intel_wakeref_t wakeref; u32 val_sku_unit; + struct intel_gt *gt; long energy; + int i; if (IS_DG1(i915) || IS_DG2(i915)) { hwmon->rg.gt_perf_status = GEN12_RPSTAT1; @@ -561,12 +616,21 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) hwmon->rg.pkg_power_sku = PCU_PACKAGE_POWER_SKU; hwmon->rg.pkg_rapl_limit = PCU_PACKAGE_RAPL_LIMIT; hwmon->rg.energy_status_all = PCU_PACKAGE_ENERGY_STATUS; + hwmon->rg.energy_status_tile = INVALID_MMIO_REG; + } else if (IS_XEHPSDV(i915)) { + hwmon->rg.pkg_power_sku_unit = GT0_PACKAGE_POWER_SKU_UNIT; + hwmon->rg.pkg_power_sku = INVALID_MMIO_REG; + hwmon->rg.pkg_rapl_limit = GT0_PACKAGE_RAPL_LIMIT; + hwmon->rg.energy_status_all = GT0_PLATFORM_ENERGY_STATUS; + hwmon->rg.energy_status_tile = GT0_PACKAGE_ENERGY_STATUS; + hwmon->rg.gt_perf_status = INVALID_MMIO_REG; } else { hwmon->rg.gt_perf_status = INVALID_MMIO_REG; hwmon->rg.pkg_power_sku_unit = INVALID_MMIO_REG; hwmon->rg.pkg_power_sku = INVALID_MMIO_REG; hwmon->rg.pkg_rapl_limit = INVALID_MMIO_REG; hwmon->rg.energy_status_all = INVALID_MMIO_REG; + hwmon->rg.energy_status_tile = INVALID_MMIO_REG; } with_intel_runtime_pm(uncore->rpm, wakeref) { @@ -592,6 +656,10 @@ hwm_get_preregistration_info(struct drm_i915_private *i915) */ if (i915_mmio_reg_valid(hwmon->rg.energy_status_all)) hwm_energy(ddat, &energy); + if (i915_mmio_reg_valid(hwmon->rg.energy_status_tile)) { + for_each_gt(gt, i915, i) + hwm_energy(&hwmon->ddat_gt[i], &energy); + } } void i915_hwmon_register(struct drm_i915_private *i915) @@ -600,6 +668,9 @@ void i915_hwmon_register(struct drm_i915_private *i915) struct i915_hwmon *hwmon; struct device *hwmon_dev; struct hwm_drvdata *ddat; + struct hwm_drvdata *ddat_gt; + struct intel_gt *gt; + int i; /* hwmon is available only for dGfx */ if (!IS_DGFX(i915)) @@ -616,6 +687,16 @@ void i915_hwmon_register(struct drm_i915_private *i915) ddat->hwmon = hwmon; ddat->uncore = &i915->uncore; snprintf(ddat->name, sizeof(ddat->name), "i915"); + ddat->gt_n = -1; + + for_each_gt(gt, i915, i) { + ddat_gt = hwmon->ddat_gt + i; + + ddat_gt->hwmon = hwmon; + ddat_gt->uncore = gt->uncore; + snprintf(ddat_gt->name, sizeof(ddat_gt->name), "i915_gt%u", i); + ddat_gt->gt_n = i; + } hwm_get_preregistration_info(i915); @@ -630,6 +711,23 @@ void i915_hwmon_register(struct drm_i915_private *i915) } ddat->hwmon_dev = hwmon_dev; + + for_each_gt(gt, i915, i) { + ddat_gt = hwmon->ddat_gt + i; + /* + * Create per-gt directories only if a per-gt attribute is + * visible. Currently this is only energy + */ + if (!hwm_gt_is_visible(ddat_gt, hwmon_energy, hwmon_energy_input, 0)) + continue; + + hwmon_dev = devm_hwmon_device_register_with_info(dev, ddat_gt->name, + ddat_gt, + &hwm_gt_chip_info, + NULL); + if (!IS_ERR(hwmon_dev)) + ddat_gt->hwmon_dev = hwmon_dev; + } } void i915_hwmon_unregister(struct drm_i915_private *i915) -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 7/7] drm/i915/hwmon: Extend power/energy for XEHPSDV 2022-09-27 5:50 ` [Intel-gfx] [PATCH 7/7] drm/i915/hwmon: Extend power/energy for XEHPSDV Badal Nilawar @ 2022-10-03 21:40 ` Andi Shyti 0 siblings, 0 replies; 54+ messages in thread From: Andi Shyti @ 2022-10-03 21:40 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, intel-gfx, dri-devel On Tue, Sep 27, 2022 at 11:20:20AM +0530, Badal Nilawar wrote: > From: Dale B Stimson <dale.b.stimson@intel.com> > > Extend hwmon power/energy for XEHPSDV especially per gt level energy > usage. > > v2: Update to latest HWMON spec (Ashutosh) > v3: Fix review comments (Ashutosh) > v4: Fix review comments (Anshuman) > v5: s/hwmon_device_register_with_info/ > devm_hwmon_device_register_with_info/ (Ashutosh) > > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> > Acked-by: Guenter Roeck <linux@roeck-us.net> > Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> This last patch is making me thing that the hwmon should have been under gt rather than under i915. We leave it to a later refactoring. Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com> Thanks, Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Add HWMON support (rev8) 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar ` (6 preceding siblings ...) 2022-09-27 5:50 ` [Intel-gfx] [PATCH 7/7] drm/i915/hwmon: Extend power/energy for XEHPSDV Badal Nilawar @ 2022-09-27 7:13 ` Patchwork 2022-09-27 7:13 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork ` (3 subsequent siblings) 11 siblings, 0 replies; 54+ messages in thread From: Patchwork @ 2022-09-27 7:13 UTC (permalink / raw) To: Badal Nilawar; +Cc: intel-gfx == Series Details == Series: drm/i915: Add HWMON support (rev8) URL : https://patchwork.freedesktop.org/series/104278/ State : warning == Summary == Error: dim checkpatch failed b72b46cfb7e4 drm/i915/hwmon: Add HWMON infrastructure Traceback (most recent call last): File "scripts/spdxcheck.py", line 11, in <module> import git ModuleNotFoundError: No module named 'git' Traceback (most recent call last): File "scripts/spdxcheck.py", line 11, in <module> import git ModuleNotFoundError: No module named 'git' -:89: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating? #89: new file mode 100644 total: 0 errors, 1 warnings, 0 checks, 182 lines checked 87e06a4c2163 drm/i915/hwmon: Add HWMON current voltage support -:27: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating? #27: new file mode 100644 total: 0 errors, 1 warnings, 0 checks, 104 lines checked 16453e9b0915 drm/i915/hwmon: Power PL1 limit and TDP setting eaecc335b767 drm/i915/hwmon: Show device level energy usage a2ccb4e2a5f9 drm/i915/hwmon: Expose card reactive critical power 0bac1dd270bf drm/i915/hwmon: Expose power1_max_interval 4eb96107ee9e drm/i915/hwmon: Extend power/energy for XEHPSDV ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915: Add HWMON support (rev8) 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar ` (7 preceding siblings ...) 2022-09-27 7:13 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Add HWMON support (rev8) Patchwork @ 2022-09-27 7:13 ` Patchwork 2022-09-27 7:36 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork ` (2 subsequent siblings) 11 siblings, 0 replies; 54+ messages in thread From: Patchwork @ 2022-09-27 7:13 UTC (permalink / raw) To: Badal Nilawar; +Cc: intel-gfx == Series Details == Series: drm/i915: Add HWMON support (rev8) URL : https://patchwork.freedesktop.org/series/104278/ State : warning == Summary == Error: dim sparse failed Sparse version: v0.6.2 Fast mode used, each commit won't be checked separately. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] ✗ Fi.CI.BAT: failure for drm/i915: Add HWMON support (rev8) 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar ` (8 preceding siblings ...) 2022-09-27 7:13 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork @ 2022-09-27 7:36 ` Patchwork 2022-09-29 6:51 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork 2022-09-30 4:19 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork 11 siblings, 0 replies; 54+ messages in thread From: Patchwork @ 2022-09-27 7:36 UTC (permalink / raw) To: Badal Nilawar; +Cc: intel-gfx [-- Attachment #1: Type: text/plain, Size: 13064 bytes --] == Series Details == Series: drm/i915: Add HWMON support (rev8) URL : https://patchwork.freedesktop.org/series/104278/ State : failure == Summary == CI Bug Log - changes from CI_DRM_12185 -> Patchwork_104278v8 ==================================================== Summary ------- **FAILURE** Serious unknown changes coming with Patchwork_104278v8 absolutely need to be verified manually. If you think the reported changes have nothing to do with the changes introduced in Patchwork_104278v8, please notify your bug team to allow them to document this new failure mode, which will reduce false positives in CI. External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/index.html Participating hosts (46 -> 47) ------------------------------ Additional (4): fi-tgl-dsi fi-rkl-11600 bat-adls-5 bat-dg1-6 Missing (3): fi-tgl-mst fi-bdw-samus bat-jsl-3 Possible new issues ------------------- Here are the unknown changes that may have been introduced in Patchwork_104278v8: ### IGT changes ### #### Possible regressions #### * igt@i915_pm_rc6_residency@rc6-idle@rcs0: - bat-dg1-5: NOTRUN -> [FAIL][1] [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-dg1-5/igt@i915_pm_rc6_residency@rc6-idle@rcs0.html Known issues ------------ Here are the changes found in Patchwork_104278v8 that come from known issues: ### CI changes ### #### Issues hit #### * boot: - bat-dg1-6: NOTRUN -> [FAIL][2] ([i915#6928]) [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-dg1-6/boot.html ### IGT changes ### #### Issues hit #### * igt@gem_huc_copy@huc-copy: - fi-rkl-11600: NOTRUN -> [SKIP][3] ([i915#2190]) [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@gem_huc_copy@huc-copy.html * igt@gem_lmem_swapping@basic: - fi-rkl-11600: NOTRUN -> [SKIP][4] ([i915#4613]) +3 similar issues [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@gem_lmem_swapping@basic.html * igt@gem_tiled_pread_basic: - fi-rkl-11600: NOTRUN -> [SKIP][5] ([i915#3282]) [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@gem_tiled_pread_basic.html * igt@i915_pm_backlight@basic-brightness: - fi-rkl-11600: NOTRUN -> [SKIP][6] ([i915#3012]) [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@i915_pm_backlight@basic-brightness.html * igt@i915_pm_rc6_residency@rc6-fence: - fi-icl-u2: NOTRUN -> [WARN][7] ([i915#2684]) +4 similar issues [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-icl-u2/igt@i915_pm_rc6_residency@rc6-fence.html - fi-elk-e7500: NOTRUN -> [SKIP][8] ([fdo#109271]) +2 similar issues [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-elk-e7500/igt@i915_pm_rc6_residency@rc6-fence.html - fi-pnv-d510: NOTRUN -> [SKIP][9] ([fdo#109271]) +1 similar issue [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-pnv-d510/igt@i915_pm_rc6_residency@rc6-fence.html * igt@i915_pm_rc6_residency@rc6-idle@rcs0: - fi-ilk-650: NOTRUN -> [SKIP][10] ([fdo#109271]) +2 similar issues [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-ilk-650/igt@i915_pm_rc6_residency@rc6-idle@rcs0.html - fi-blb-e6850: NOTRUN -> [SKIP][11] ([fdo#109271]) +1 similar issue [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-blb-e6850/igt@i915_pm_rc6_residency@rc6-idle@rcs0.html * igt@i915_pm_rc6_residency@rc6-idle@vcs0: - fi-tgl-u2: NOTRUN -> [WARN][12] ([i915#2681]) +4 similar issues [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-tgl-u2/igt@i915_pm_rc6_residency@rc6-idle@vcs0.html - fi-cfl-8109u: NOTRUN -> [WARN][13] ([i915#6405]) [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-cfl-8109u/igt@i915_pm_rc6_residency@rc6-idle@vcs0.html * igt@i915_pm_rc6_residency@rc6-idle@vecs0: - fi-hsw-g3258: NOTRUN -> [WARN][14] ([i915#1804]) [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-hsw-g3258/igt@i915_pm_rc6_residency@rc6-idle@vecs0.html * igt@i915_suspend@basic-s3-without-i915: - fi-rkl-11600: NOTRUN -> [INCOMPLETE][15] ([i915#5982]) [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@i915_suspend@basic-s3-without-i915.html * igt@kms_chamelium@hdmi-edid-read: - fi-rkl-11600: NOTRUN -> [SKIP][16] ([fdo#111827]) +7 similar issues [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@kms_chamelium@hdmi-edid-read.html * igt@kms_cursor_legacy@basic-busy-flip-before-cursor: - fi-rkl-11600: NOTRUN -> [SKIP][17] ([i915#4103]) [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@kms_cursor_legacy@basic-busy-flip-before-cursor.html * igt@kms_force_connector_basic@force-load-detect: - fi-rkl-11600: NOTRUN -> [SKIP][18] ([fdo#109285] / [i915#4098]) [18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@kms_force_connector_basic@force-load-detect.html * igt@kms_psr@primary_page_flip: - fi-rkl-11600: NOTRUN -> [SKIP][19] ([i915#1072]) +3 similar issues [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@kms_psr@primary_page_flip.html * igt@kms_setmode@basic-clone-single-crtc: - fi-rkl-11600: NOTRUN -> [SKIP][20] ([i915#3555] / [i915#4098]) [20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@kms_setmode@basic-clone-single-crtc.html * igt@prime_vgem@basic-read: - fi-rkl-11600: NOTRUN -> [SKIP][21] ([fdo#109295] / [i915#3291] / [i915#3708]) +2 similar issues [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@prime_vgem@basic-read.html * igt@prime_vgem@basic-userptr: - fi-rkl-11600: NOTRUN -> [SKIP][22] ([fdo#109295] / [i915#3301] / [i915#3708]) [22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@prime_vgem@basic-userptr.html #### Possible fixes #### * igt@gem_exec_suspend@basic-s3@smem: - {bat-adlm-1}: [DMESG-WARN][23] ([i915#2867]) -> [PASS][24] [23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/bat-adlm-1/igt@gem_exec_suspend@basic-s3@smem.html [24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-adlm-1/igt@gem_exec_suspend@basic-s3@smem.html * igt@gem_ringfill@basic-all: - {bat-dg2-9}: [FAIL][25] ([i915#5886]) -> [PASS][26] [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/bat-dg2-9/igt@gem_ringfill@basic-all.html [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-dg2-9/igt@gem_ringfill@basic-all.html * igt@i915_selftest@live@late_gt_pm: - fi-cfl-8109u: [DMESG-WARN][27] ([i915#5904]) -> [PASS][28] +30 similar issues [27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/fi-cfl-8109u/igt@i915_selftest@live@late_gt_pm.html [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-cfl-8109u/igt@i915_selftest@live@late_gt_pm.html * igt@i915_selftest@live@requests: - {bat-rpls-1}: [INCOMPLETE][29] ([i915#4983] / [i915#6257] / [i915#6380]) -> [PASS][30] [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/bat-rpls-1/igt@i915_selftest@live@requests.html [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-rpls-1/igt@i915_selftest@live@requests.html * igt@i915_selftest@live@slpc: - {bat-rplp-1}: [DMESG-FAIL][31] -> [PASS][32] [31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/bat-rplp-1/igt@i915_selftest@live@slpc.html [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-rplp-1/igt@i915_selftest@live@slpc.html * igt@i915_suspend@basic-s2idle-without-i915: - fi-cfl-8109u: [DMESG-WARN][33] ([i915#5904] / [i915#62]) -> [PASS][34] [33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/fi-cfl-8109u/igt@i915_suspend@basic-s2idle-without-i915.html [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-cfl-8109u/igt@i915_suspend@basic-s2idle-without-i915.html * igt@kms_frontbuffer_tracking@basic: - fi-cfl-8109u: [DMESG-FAIL][35] ([i915#62]) -> [PASS][36] +1 similar issue [35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/fi-cfl-8109u/igt@kms_frontbuffer_tracking@basic.html [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-cfl-8109u/igt@kms_frontbuffer_tracking@basic.html * igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-c-dp-1: - fi-cfl-8109u: [DMESG-WARN][37] ([i915#62]) -> [PASS][38] +10 similar issues [37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/fi-cfl-8109u/igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-c-dp-1.html [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-cfl-8109u/igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-c-dp-1.html * igt@kms_pipe_crc_basic@suspend-read-crc@pipe-d-dp-2: - {bat-dg2-11}: [FAIL][39] ([i915#6818]) -> [PASS][40] [39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/bat-dg2-11/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-d-dp-2.html [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-dg2-11/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-d-dp-2.html {name}: This element is suppressed. This means it is ignored when computing the status of the difference (SUCCESS, WARNING, or FAILURE). [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271 [fdo#109284]: https://bugs.freedesktop.org/show_bug.cgi?id=109284 [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285 [fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295 [fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189 [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827 [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072 [i915#1759]: https://gitlab.freedesktop.org/drm/intel/issues/1759 [i915#1804]: https://gitlab.freedesktop.org/drm/intel/issues/1804 [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190 [i915#2681]: https://gitlab.freedesktop.org/drm/intel/issues/2681 [i915#2684]: https://gitlab.freedesktop.org/drm/intel/issues/2684 [i915#2867]: https://gitlab.freedesktop.org/drm/intel/issues/2867 [i915#3012]: https://gitlab.freedesktop.org/drm/intel/issues/3012 [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282 [i915#3291]: https://gitlab.freedesktop.org/drm/intel/issues/3291 [i915#3301]: https://gitlab.freedesktop.org/drm/intel/issues/3301 [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555 [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708 [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098 [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103 [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613 [i915#4983]: https://gitlab.freedesktop.org/drm/intel/issues/4983 [i915#5886]: https://gitlab.freedesktop.org/drm/intel/issues/5886 [i915#5904]: https://gitlab.freedesktop.org/drm/intel/issues/5904 [i915#5982]: https://gitlab.freedesktop.org/drm/intel/issues/5982 [i915#62]: https://gitlab.freedesktop.org/drm/intel/issues/62 [i915#6257]: https://gitlab.freedesktop.org/drm/intel/issues/6257 [i915#6380]: https://gitlab.freedesktop.org/drm/intel/issues/6380 [i915#6405]: https://gitlab.freedesktop.org/drm/intel/issues/6405 [i915#6816]: https://gitlab.freedesktop.org/drm/intel/issues/6816 [i915#6818]: https://gitlab.freedesktop.org/drm/intel/issues/6818 [i915#6928]: https://gitlab.freedesktop.org/drm/intel/issues/6928 Build changes ------------- * IGT: IGT_6663 -> IGTPW_7800 * Linux: CI_DRM_12185 -> Patchwork_104278v8 CI-20190529: 20190529 CI_DRM_12185: ae6a4bb62f9524823ef5b00552e27231f7936da3 @ git://anongit.freedesktop.org/gfx-ci/linux IGTPW_7800: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_7800/index.html IGT_6663: 5e232c77cd762147e0882c337a984121fabb1c75 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git Patchwork_104278v8: ae6a4bb62f9524823ef5b00552e27231f7936da3 @ git://anongit.freedesktop.org/gfx-ci/linux ### Linux commits 2555b4f4febc drm/i915/hwmon: Extend power/energy for XEHPSDV 116ba307b4eb drm/i915/hwmon: Expose power1_max_interval 1fb583219aa0 drm/i915/hwmon: Expose card reactive critical power ace0d2ccafdb drm/i915/hwmon: Show device level energy usage 55080ffd4183 drm/i915/hwmon: Power PL1 limit and TDP setting 0756222ab47e drm/i915/hwmon: Add HWMON current voltage support 782a2eab8cf6 drm/i915/hwmon: Add HWMON infrastructure == Logs == For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/index.html [-- Attachment #2: Type: text/html, Size: 14807 bytes --] ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915: Add HWMON support (rev8) 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar ` (9 preceding siblings ...) 2022-09-27 7:36 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork @ 2022-09-29 6:51 ` Patchwork 2022-09-30 4:19 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork 11 siblings, 0 replies; 54+ messages in thread From: Patchwork @ 2022-09-29 6:51 UTC (permalink / raw) To: Badal Nilawar; +Cc: intel-gfx [-- Attachment #1: Type: text/plain, Size: 12693 bytes --] == Series Details == Series: drm/i915: Add HWMON support (rev8) URL : https://patchwork.freedesktop.org/series/104278/ State : success == Summary == CI Bug Log - changes from CI_DRM_12185 -> Patchwork_104278v8 ==================================================== Summary ------- **SUCCESS** No regressions found. External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/index.html Participating hosts (46 -> 47) ------------------------------ Additional (4): fi-tgl-dsi fi-rkl-11600 bat-adls-5 bat-dg1-6 Missing (3): fi-tgl-mst fi-bdw-samus bat-jsl-3 Known issues ------------ Here are the changes found in Patchwork_104278v8 that come from known issues: ### CI changes ### #### Issues hit #### * boot: - bat-dg1-6: NOTRUN -> [FAIL][1] ([i915#6928]) [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-dg1-6/boot.html ### IGT changes ### #### Issues hit #### * igt@gem_huc_copy@huc-copy: - fi-rkl-11600: NOTRUN -> [SKIP][2] ([i915#2190]) [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@gem_huc_copy@huc-copy.html * igt@gem_lmem_swapping@basic: - fi-rkl-11600: NOTRUN -> [SKIP][3] ([i915#4613]) +3 similar issues [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@gem_lmem_swapping@basic.html * igt@gem_tiled_pread_basic: - fi-rkl-11600: NOTRUN -> [SKIP][4] ([i915#3282]) [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@gem_tiled_pread_basic.html * igt@i915_pm_backlight@basic-brightness: - fi-rkl-11600: NOTRUN -> [SKIP][5] ([i915#3012]) [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@i915_pm_backlight@basic-brightness.html * igt@i915_pm_rc6_residency@rc6-fence: - fi-icl-u2: NOTRUN -> [WARN][6] ([i915#2684]) +4 similar issues [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-icl-u2/igt@i915_pm_rc6_residency@rc6-fence.html - fi-elk-e7500: NOTRUN -> [SKIP][7] ([fdo#109271]) +2 similar issues [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-elk-e7500/igt@i915_pm_rc6_residency@rc6-fence.html - fi-pnv-d510: NOTRUN -> [SKIP][8] ([fdo#109271]) +1 similar issue [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-pnv-d510/igt@i915_pm_rc6_residency@rc6-fence.html * igt@i915_pm_rc6_residency@rc6-idle@rcs0: - fi-ilk-650: NOTRUN -> [SKIP][9] ([fdo#109271]) +2 similar issues [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-ilk-650/igt@i915_pm_rc6_residency@rc6-idle@rcs0.html - fi-blb-e6850: NOTRUN -> [SKIP][10] ([fdo#109271]) +1 similar issue [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-blb-e6850/igt@i915_pm_rc6_residency@rc6-idle@rcs0.html - bat-dg1-5: NOTRUN -> [FAIL][11] ([i915#3591]) [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-dg1-5/igt@i915_pm_rc6_residency@rc6-idle@rcs0.html * igt@i915_pm_rc6_residency@rc6-idle@vcs0: - fi-tgl-u2: NOTRUN -> [WARN][12] ([i915#2681]) +4 similar issues [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-tgl-u2/igt@i915_pm_rc6_residency@rc6-idle@vcs0.html - fi-cfl-8109u: NOTRUN -> [WARN][13] ([i915#6405]) [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-cfl-8109u/igt@i915_pm_rc6_residency@rc6-idle@vcs0.html * igt@i915_pm_rc6_residency@rc6-idle@vecs0: - fi-hsw-g3258: NOTRUN -> [WARN][14] ([i915#1804]) [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-hsw-g3258/igt@i915_pm_rc6_residency@rc6-idle@vecs0.html * igt@i915_suspend@basic-s3-without-i915: - fi-rkl-11600: NOTRUN -> [INCOMPLETE][15] ([i915#5982]) [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@i915_suspend@basic-s3-without-i915.html * igt@kms_chamelium@hdmi-edid-read: - fi-rkl-11600: NOTRUN -> [SKIP][16] ([fdo#111827]) +7 similar issues [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@kms_chamelium@hdmi-edid-read.html * igt@kms_cursor_legacy@basic-busy-flip-before-cursor: - fi-rkl-11600: NOTRUN -> [SKIP][17] ([i915#4103]) [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@kms_cursor_legacy@basic-busy-flip-before-cursor.html * igt@kms_force_connector_basic@force-load-detect: - fi-rkl-11600: NOTRUN -> [SKIP][18] ([fdo#109285] / [i915#4098]) [18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@kms_force_connector_basic@force-load-detect.html * igt@kms_psr@primary_page_flip: - fi-rkl-11600: NOTRUN -> [SKIP][19] ([i915#1072]) +3 similar issues [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@kms_psr@primary_page_flip.html * igt@kms_setmode@basic-clone-single-crtc: - fi-rkl-11600: NOTRUN -> [SKIP][20] ([i915#3555] / [i915#4098]) [20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@kms_setmode@basic-clone-single-crtc.html * igt@prime_vgem@basic-read: - fi-rkl-11600: NOTRUN -> [SKIP][21] ([fdo#109295] / [i915#3291] / [i915#3708]) +2 similar issues [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@prime_vgem@basic-read.html * igt@prime_vgem@basic-userptr: - fi-rkl-11600: NOTRUN -> [SKIP][22] ([fdo#109295] / [i915#3301] / [i915#3708]) [22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-rkl-11600/igt@prime_vgem@basic-userptr.html #### Possible fixes #### * igt@gem_exec_suspend@basic-s3@smem: - {bat-adlm-1}: [DMESG-WARN][23] ([i915#2867]) -> [PASS][24] [23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/bat-adlm-1/igt@gem_exec_suspend@basic-s3@smem.html [24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-adlm-1/igt@gem_exec_suspend@basic-s3@smem.html * igt@gem_ringfill@basic-all: - {bat-dg2-9}: [FAIL][25] ([i915#5886]) -> [PASS][26] [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/bat-dg2-9/igt@gem_ringfill@basic-all.html [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-dg2-9/igt@gem_ringfill@basic-all.html * igt@i915_selftest@live@late_gt_pm: - fi-cfl-8109u: [DMESG-WARN][27] ([i915#5904]) -> [PASS][28] +30 similar issues [27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/fi-cfl-8109u/igt@i915_selftest@live@late_gt_pm.html [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-cfl-8109u/igt@i915_selftest@live@late_gt_pm.html * igt@i915_selftest@live@requests: - {bat-rpls-1}: [INCOMPLETE][29] ([i915#4983] / [i915#6257] / [i915#6380]) -> [PASS][30] [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/bat-rpls-1/igt@i915_selftest@live@requests.html [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-rpls-1/igt@i915_selftest@live@requests.html * igt@i915_selftest@live@slpc: - {bat-rplp-1}: [DMESG-FAIL][31] ([i915#6367]) -> [PASS][32] [31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/bat-rplp-1/igt@i915_selftest@live@slpc.html [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-rplp-1/igt@i915_selftest@live@slpc.html * igt@i915_suspend@basic-s2idle-without-i915: - fi-cfl-8109u: [DMESG-WARN][33] ([i915#5904] / [i915#62]) -> [PASS][34] [33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/fi-cfl-8109u/igt@i915_suspend@basic-s2idle-without-i915.html [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-cfl-8109u/igt@i915_suspend@basic-s2idle-without-i915.html * igt@kms_frontbuffer_tracking@basic: - fi-cfl-8109u: [DMESG-FAIL][35] ([i915#62]) -> [PASS][36] +1 similar issue [35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/fi-cfl-8109u/igt@kms_frontbuffer_tracking@basic.html [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-cfl-8109u/igt@kms_frontbuffer_tracking@basic.html * igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-c-dp-1: - fi-cfl-8109u: [DMESG-WARN][37] ([i915#62]) -> [PASS][38] +10 similar issues [37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/fi-cfl-8109u/igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-c-dp-1.html [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/fi-cfl-8109u/igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-c-dp-1.html * igt@kms_pipe_crc_basic@suspend-read-crc@pipe-d-dp-2: - {bat-dg2-11}: [FAIL][39] ([i915#6818]) -> [PASS][40] [39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12185/bat-dg2-11/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-d-dp-2.html [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/bat-dg2-11/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-d-dp-2.html {name}: This element is suppressed. This means it is ignored when computing the status of the difference (SUCCESS, WARNING, or FAILURE). [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271 [fdo#109284]: https://bugs.freedesktop.org/show_bug.cgi?id=109284 [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285 [fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295 [fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189 [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827 [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072 [i915#1759]: https://gitlab.freedesktop.org/drm/intel/issues/1759 [i915#1804]: https://gitlab.freedesktop.org/drm/intel/issues/1804 [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190 [i915#2681]: https://gitlab.freedesktop.org/drm/intel/issues/2681 [i915#2684]: https://gitlab.freedesktop.org/drm/intel/issues/2684 [i915#2867]: https://gitlab.freedesktop.org/drm/intel/issues/2867 [i915#3012]: https://gitlab.freedesktop.org/drm/intel/issues/3012 [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282 [i915#3291]: https://gitlab.freedesktop.org/drm/intel/issues/3291 [i915#3301]: https://gitlab.freedesktop.org/drm/intel/issues/3301 [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555 [i915#3591]: https://gitlab.freedesktop.org/drm/intel/issues/3591 [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708 [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098 [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103 [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613 [i915#4983]: https://gitlab.freedesktop.org/drm/intel/issues/4983 [i915#5886]: https://gitlab.freedesktop.org/drm/intel/issues/5886 [i915#5904]: https://gitlab.freedesktop.org/drm/intel/issues/5904 [i915#5982]: https://gitlab.freedesktop.org/drm/intel/issues/5982 [i915#62]: https://gitlab.freedesktop.org/drm/intel/issues/62 [i915#6257]: https://gitlab.freedesktop.org/drm/intel/issues/6257 [i915#6367]: https://gitlab.freedesktop.org/drm/intel/issues/6367 [i915#6380]: https://gitlab.freedesktop.org/drm/intel/issues/6380 [i915#6405]: https://gitlab.freedesktop.org/drm/intel/issues/6405 [i915#6816]: https://gitlab.freedesktop.org/drm/intel/issues/6816 [i915#6818]: https://gitlab.freedesktop.org/drm/intel/issues/6818 [i915#6928]: https://gitlab.freedesktop.org/drm/intel/issues/6928 Build changes ------------- * IGT: IGT_6663 -> IGTPW_7800 * Linux: CI_DRM_12185 -> Patchwork_104278v8 CI-20190529: 20190529 CI_DRM_12185: ae6a4bb62f9524823ef5b00552e27231f7936da3 @ git://anongit.freedesktop.org/gfx-ci/linux IGTPW_7800: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_7800/index.html IGT_6663: 5e232c77cd762147e0882c337a984121fabb1c75 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git Patchwork_104278v8: ae6a4bb62f9524823ef5b00552e27231f7936da3 @ git://anongit.freedesktop.org/gfx-ci/linux ### Linux commits 2555b4f4febc drm/i915/hwmon: Extend power/energy for XEHPSDV 116ba307b4eb drm/i915/hwmon: Expose power1_max_interval 1fb583219aa0 drm/i915/hwmon: Expose card reactive critical power ace0d2ccafdb drm/i915/hwmon: Show device level energy usage 55080ffd4183 drm/i915/hwmon: Power PL1 limit and TDP setting 0756222ab47e drm/i915/hwmon: Add HWMON current voltage support 782a2eab8cf6 drm/i915/hwmon: Add HWMON infrastructure == Logs == For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/index.html [-- Attachment #2: Type: text/html, Size: 14406 bytes --] ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915: Add HWMON support (rev8) 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar ` (10 preceding siblings ...) 2022-09-29 6:51 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork @ 2022-09-30 4:19 ` Patchwork 11 siblings, 0 replies; 54+ messages in thread From: Patchwork @ 2022-09-30 4:19 UTC (permalink / raw) To: Badal Nilawar; +Cc: intel-gfx [-- Attachment #1: Type: text/plain, Size: 1248 bytes --] == Series Details == Series: drm/i915: Add HWMON support (rev8) URL : https://patchwork.freedesktop.org/series/104278/ State : success == Summary == CI Bug Log - changes from CI_DRM_12185_full -> Patchwork_104278v8_full ==================================================== Summary ------- **SUCCESS** No regressions found. Participating hosts (12 -> 9) ------------------------------ Missing (3): shard-rkl shard-dg1 shard-tglu Changes ------- No changes found Build changes ------------- * CI: CI-20190529 -> None * IGT: IGT_6663 -> IGTPW_7800 * Linux: CI_DRM_12185 -> Patchwork_104278v8 CI-20190529: 20190529 CI_DRM_12185: ae6a4bb62f9524823ef5b00552e27231f7936da3 @ git://anongit.freedesktop.org/gfx-ci/linux IGTPW_7800: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_7800/index.html IGT_6663: 5e232c77cd762147e0882c337a984121fabb1c75 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git Patchwork_104278v8: ae6a4bb62f9524823ef5b00552e27231f7936da3 @ git://anongit.freedesktop.org/gfx-ci/linux piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit == Logs == For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104278v8/index.html [-- Attachment #2: Type: text/html, Size: 1833 bytes --] ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support
@ 2022-10-13 15:45 Ashutosh Dixit
2022-10-13 15:45 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Ashutosh Dixit
0 siblings, 1 reply; 54+ messages in thread
From: Ashutosh Dixit @ 2022-10-13 15:45 UTC (permalink / raw)
To: intel-gfx; +Cc: linux-hwmon, Andi Shyti, dri-devel, Rodrigo Vivi
This series adds the HWMON support for DGFX
Test-with: 20221013151400.2086268-1-ashutosh.dixit@intel.com
v2:
- Reorganized series. Created first patch as infrastructure patch
followed by feature patches. (Ashutosh)
- Fixed review comments (Jani)
- Fixed review comments (Ashutosh)
v3:
- Fixed review comments from Guenter
- Exposed energy inferface as standard hwmon interface (Ashutosh)
- For power interface added entries for critical power and maintained
standard interface for all the entries except
power1_max_interval
- Extended support for XEHPSDV (Ashutosh)
v4:
- Fixed review comment from Guenter
- Cleaned up unused code
v5:
- Fixed review comments (Jani)
v6:
- Fixed review comments (Ashutosh)
- Updated date and kernel version in documentation
v7:
- Fixed review comments (Anshuman)
- KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko)
v8: s/hwmon_device_register_with_info/
devm_hwmon_device_register_with_info/ (Ashutosh)
v9: Addressed review comments from Rodrigo and Andi
Ashutosh Dixit (2):
drm/i915/hwmon: Expose card reactive critical power
drm/i915/hwmon: Expose power1_max_interval
Dale B Stimson (4):
drm/i915/hwmon: Add HWMON infrastructure
drm/i915/hwmon: Power PL1 limit and TDP setting
drm/i915/hwmon: Show device level energy usage
drm/i915/hwmon: Extend power/energy for XEHPSDV
Riana Tauro (1):
drm/i915/hwmon: Add HWMON current voltage support
.../ABI/testing/sysfs-driver-intel-i915-hwmon | 75 ++
MAINTAINERS | 1 +
drivers/gpu/drm/i915/Makefile | 3 +
drivers/gpu/drm/i915/gt/intel_gt_regs.h | 8 +
drivers/gpu/drm/i915/i915_driver.c | 5 +
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/i915_hwmon.c | 738 ++++++++++++++++++
drivers/gpu/drm/i915/i915_hwmon.h | 20 +
drivers/gpu/drm/i915/i915_reg.h | 6 +
drivers/gpu/drm/i915/intel_mchbar_regs.h | 21 +
10 files changed, 879 insertions(+)
create mode 100644 Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h
--
2.38.0
^ permalink raw reply [flat|nested] 54+ messages in thread* [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-10-13 15:45 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Ashutosh Dixit @ 2022-10-13 15:45 ` Ashutosh Dixit 0 siblings, 0 replies; 54+ messages in thread From: Ashutosh Dixit @ 2022-10-13 15:45 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, Andi Shyti, dri-devel, Rodrigo Vivi From: Dale B Stimson <dale.b.stimson@intel.com> The i915 HWMON module will be used to expose voltage, power and energy values for dGfx. Here we set up i915 hwmon infrastructure including i915 hwmon registration, basic data structures and functions. v2: - Create HWMON infra patch (Ashutosh) - Fixed review comments (Jani) - Remove "select HWMON" from i915/Kconfig (Jani) v3: Use hwm_ prefix for static functions (Ashutosh) v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former doesn't work if hwmon is compiled as a module (Guenter) v5: Fixed review comments (Jani) v6: s/kzalloc/devm_kzalloc/ (Andi) v7: s/hwmon_device_register_with_info/ devm_hwmon_device_register_with_info/ (Ashutosh) Cc: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com> --- drivers/gpu/drm/i915/Makefile | 3 + drivers/gpu/drm/i915/i915_driver.c | 5 ++ drivers/gpu/drm/i915/i915_drv.h | 2 + drivers/gpu/drm/i915/i915_hwmon.c | 122 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ 5 files changed, 152 insertions(+) create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index f8cc1eb52626e..2535593ab379e 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -209,6 +209,9 @@ i915-y += gt/uc/intel_uc.o \ # graphics system controller (GSC) support i915-y += gt/intel_gsc.o +# graphics hardware monitoring (HWMON) support +i915-$(CONFIG_HWMON) += i915_hwmon.o + # modesetting core code i915-y += \ display/hsw_ips.o \ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index 24d3d2d85fd57..ffff49868dc51 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -81,6 +81,7 @@ #include "i915_drm_client.h" #include "i915_drv.h" #include "i915_getparam.h" +#include "i915_hwmon.h" #include "i915_ioc32.h" #include "i915_ioctl.h" #include "i915_irq.h" @@ -763,6 +764,8 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) for_each_gt(gt, dev_priv, i) intel_gt_driver_register(gt); + i915_hwmon_register(dev_priv); + intel_display_driver_register(dev_priv); intel_power_domains_enable(dev_priv); @@ -795,6 +798,8 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) for_each_gt(gt, dev_priv, i) intel_gt_driver_unregister(gt); + i915_hwmon_unregister(dev_priv); + i915_perf_unregister(dev_priv); i915_pmu_unregister(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 90ed8e6db2fe0..a81372ddd2db7 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -349,6 +349,8 @@ struct drm_i915_private { struct i915_perf perf; + struct i915_hwmon *hwmon; + /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ struct intel_gt gt0; diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c new file mode 100644 index 0000000000000..231552fda374a --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2022 Intel Corporation + */ + +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/types.h> + +#include "i915_drv.h" +#include "i915_hwmon.h" +#include "i915_reg.h" +#include "intel_mchbar_regs.h" + +struct hwm_reg { +}; + +struct hwm_drvdata { + struct i915_hwmon *hwmon; + struct intel_uncore *uncore; + struct device *hwmon_dev; + char name[12]; +}; + +struct i915_hwmon { + struct hwm_drvdata ddat; + struct mutex hwmon_lock; /* counter overflow logic and rmw */ + struct hwm_reg rg; +}; + +static const struct hwmon_channel_info *hwm_info[] = { + NULL +}; + +static umode_t +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + switch (type) { + default: + return 0; + } +} + +static int +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long *val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static int +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static const struct hwmon_ops hwm_ops = { + .is_visible = hwm_is_visible, + .read = hwm_read, + .write = hwm_write, +}; + +static const struct hwmon_chip_info hwm_chip_info = { + .ops = &hwm_ops, + .info = hwm_info, +}; + +static void +hwm_get_preregistration_info(struct drm_i915_private *i915) +{ +} + +void i915_hwmon_register(struct drm_i915_private *i915) +{ + struct device *dev = i915->drm.dev; + struct i915_hwmon *hwmon; + struct device *hwmon_dev; + struct hwm_drvdata *ddat; + + /* hwmon is available only for dGfx */ + if (!IS_DGFX(i915)) + return; + + hwmon = devm_kzalloc(dev, sizeof(*hwmon), GFP_KERNEL); + if (!hwmon) + return; + + i915->hwmon = hwmon; + mutex_init(&hwmon->hwmon_lock); + ddat = &hwmon->ddat; + + ddat->hwmon = hwmon; + ddat->uncore = &i915->uncore; + snprintf(ddat->name, sizeof(ddat->name), "i915"); + + hwm_get_preregistration_info(i915); + + /* hwmon_dev points to device hwmon<i> */ + hwmon_dev = devm_hwmon_device_register_with_info(dev, ddat->name, + ddat, + &hwm_chip_info, + NULL); + if (IS_ERR(hwmon_dev)) { + i915->hwmon = NULL; + return; + } + + ddat->hwmon_dev = hwmon_dev; +} + +void i915_hwmon_unregister(struct drm_i915_private *i915) +{ + fetch_and_zero(&i915->hwmon); +} diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h new file mode 100644 index 0000000000000..7ca9cf2c34c96 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: MIT */ + +/* + * Copyright © 2022 Intel Corporation + */ + +#ifndef __I915_HWMON_H__ +#define __I915_HWMON_H__ + +struct drm_i915_private; + +#if IS_REACHABLE(CONFIG_HWMON) +void i915_hwmon_register(struct drm_i915_private *i915); +void i915_hwmon_unregister(struct drm_i915_private *i915); +#else +static inline void i915_hwmon_register(struct drm_i915_private *i915) { }; +static inline void i915_hwmon_unregister(struct drm_i915_private *i915) { }; +#endif + +#endif /* __I915_HWMON_H__ */ -- 2.38.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 0/7] Add HWMON support
@ 2022-09-26 17:52 Badal Nilawar
2022-09-26 17:52 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar
0 siblings, 1 reply; 54+ messages in thread
From: Badal Nilawar @ 2022-09-26 17:52 UTC (permalink / raw)
To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel
This series adds the HWMON support for DGFX
Test-with: 20220919144408.251981-1-riana.tauro@intel.com
v2:
- Reorganized series. Created first patch as infrastructure patch
followed by feature patches. (Ashutosh)
- Fixed review comments (Jani)
- Fixed review comments (Ashutosh)
v3:
- Fixed review comments from Guenter
- Exposed energy inferface as standard hwmon interface (Ashutosh)
- For power interface added entries for critical power and maintained
standard interface for all the entries except
power1_max_interval
- Extended support for XEHPSDV (Ashutosh)
v4:
- Fixed review comment from Guenter
- Cleaned up unused code
v5:
- Fixed review comments (Jani)
v6:
- Fixed review comments (Ashutosh)
- Updated date and kernel version in documentation
v7:
- Fixed review comments (Anshuman)
- KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko)
v8: s/hwmon_device_register_with_info/
devm_hwmon_device_register_with_info/ (Ashutosh)
Ashutosh Dixit (2):
drm/i915/hwmon: Expose card reactive critical power
drm/i915/hwmon: Expose power1_max_interval
Dale B Stimson (4):
drm/i915/hwmon: Add HWMON infrastructure
drm/i915/hwmon: Power PL1 limit and TDP setting
drm/i915/hwmon: Show device level energy usage
drm/i915/hwmon: Extend power/energy for XEHPSDV
Riana Tauro (1):
drm/i915/hwmon: Add HWMON current voltage support
.../ABI/testing/sysfs-driver-intel-i915-hwmon | 75 ++
drivers/gpu/drm/i915/Makefile | 3 +
drivers/gpu/drm/i915/gt/intel_gt_regs.h | 8 +
drivers/gpu/drm/i915/i915_driver.c | 5 +
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/i915_hwmon.c | 736 ++++++++++++++++++
drivers/gpu/drm/i915/i915_hwmon.h | 20 +
drivers/gpu/drm/i915/i915_reg.h | 6 +
drivers/gpu/drm/i915/intel_mchbar_regs.h | 21 +
9 files changed, 876 insertions(+)
create mode 100644 Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h
--
2.25.1
^ permalink raw reply [flat|nested] 54+ messages in thread* [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-26 17:52 [Intel-gfx] [PATCH 0/7] Add HWMON support Badal Nilawar @ 2022-09-26 17:52 ` Badal Nilawar 0 siblings, 0 replies; 54+ messages in thread From: Badal Nilawar @ 2022-09-26 17:52 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel From: Dale B Stimson <dale.b.stimson@intel.com> The i915 HWMON module will be used to expose voltage, power and energy values for dGfx. Here we set up i915 hwmon infrastructure including i915 hwmon registration, basic data structures and functions. v2: - Create HWMON infra patch (Ashutosh) - Fixed review comments (Jani) - Remove "select HWMON" from i915/Kconfig (Jani) v3: Use hwm_ prefix for static functions (Ashutosh) v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former doesn't work if hwmon is compiled as a module (Guenter) v5: Fixed review comments (Jani) v6: s/kzalloc/devm_kzalloc/ (Andi) v7: s/hwmon_device_register_with_info/ devm_hwmon_device_register_with_info/ (Ashutosh) Cc: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> --- drivers/gpu/drm/i915/Makefile | 3 + drivers/gpu/drm/i915/i915_driver.c | 5 ++ drivers/gpu/drm/i915/i915_drv.h | 2 + drivers/gpu/drm/i915/i915_hwmon.c | 122 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ 5 files changed, 152 insertions(+) create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index a26edcdadc21..66a6023e61a6 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -209,6 +209,9 @@ i915-y += gt/uc/intel_uc.o \ # graphics system controller (GSC) support i915-y += gt/intel_gsc.o +# graphics hardware monitoring (HWMON) support +i915-$(CONFIG_HWMON) += i915_hwmon.o + # modesetting core code i915-y += \ display/hsw_ips.o \ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index fb3826dabe8b..0aec1513ad71 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -81,6 +81,7 @@ #include "i915_drm_client.h" #include "i915_drv.h" #include "i915_getparam.h" +#include "i915_hwmon.h" #include "i915_ioc32.h" #include "i915_ioctl.h" #include "i915_irq.h" @@ -764,6 +765,8 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) for_each_gt(gt, dev_priv, i) intel_gt_driver_register(gt); + i915_hwmon_register(dev_priv); + intel_display_driver_register(dev_priv); intel_power_domains_enable(dev_priv); @@ -796,6 +799,8 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) for_each_gt(gt, dev_priv, i) intel_gt_driver_unregister(gt); + i915_hwmon_unregister(dev_priv); + i915_perf_unregister(dev_priv); i915_pmu_unregister(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 84a2f6b16f57..2447794ac58d 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -349,6 +349,8 @@ struct drm_i915_private { struct i915_perf perf; + struct i915_hwmon *hwmon; + /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ struct intel_gt gt0; diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c new file mode 100644 index 000000000000..231552fda374 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2022 Intel Corporation + */ + +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/types.h> + +#include "i915_drv.h" +#include "i915_hwmon.h" +#include "i915_reg.h" +#include "intel_mchbar_regs.h" + +struct hwm_reg { +}; + +struct hwm_drvdata { + struct i915_hwmon *hwmon; + struct intel_uncore *uncore; + struct device *hwmon_dev; + char name[12]; +}; + +struct i915_hwmon { + struct hwm_drvdata ddat; + struct mutex hwmon_lock; /* counter overflow logic and rmw */ + struct hwm_reg rg; +}; + +static const struct hwmon_channel_info *hwm_info[] = { + NULL +}; + +static umode_t +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + switch (type) { + default: + return 0; + } +} + +static int +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long *val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static int +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static const struct hwmon_ops hwm_ops = { + .is_visible = hwm_is_visible, + .read = hwm_read, + .write = hwm_write, +}; + +static const struct hwmon_chip_info hwm_chip_info = { + .ops = &hwm_ops, + .info = hwm_info, +}; + +static void +hwm_get_preregistration_info(struct drm_i915_private *i915) +{ +} + +void i915_hwmon_register(struct drm_i915_private *i915) +{ + struct device *dev = i915->drm.dev; + struct i915_hwmon *hwmon; + struct device *hwmon_dev; + struct hwm_drvdata *ddat; + + /* hwmon is available only for dGfx */ + if (!IS_DGFX(i915)) + return; + + hwmon = devm_kzalloc(dev, sizeof(*hwmon), GFP_KERNEL); + if (!hwmon) + return; + + i915->hwmon = hwmon; + mutex_init(&hwmon->hwmon_lock); + ddat = &hwmon->ddat; + + ddat->hwmon = hwmon; + ddat->uncore = &i915->uncore; + snprintf(ddat->name, sizeof(ddat->name), "i915"); + + hwm_get_preregistration_info(i915); + + /* hwmon_dev points to device hwmon<i> */ + hwmon_dev = devm_hwmon_device_register_with_info(dev, ddat->name, + ddat, + &hwm_chip_info, + NULL); + if (IS_ERR(hwmon_dev)) { + i915->hwmon = NULL; + return; + } + + ddat->hwmon_dev = hwmon_dev; +} + +void i915_hwmon_unregister(struct drm_i915_private *i915) +{ + fetch_and_zero(&i915->hwmon); +} diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h new file mode 100644 index 000000000000..7ca9cf2c34c9 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: MIT */ + +/* + * Copyright © 2022 Intel Corporation + */ + +#ifndef __I915_HWMON_H__ +#define __I915_HWMON_H__ + +struct drm_i915_private; + +#if IS_REACHABLE(CONFIG_HWMON) +void i915_hwmon_register(struct drm_i915_private *i915); +void i915_hwmon_unregister(struct drm_i915_private *i915); +#else +static inline void i915_hwmon_register(struct drm_i915_private *i915) { }; +static inline void i915_hwmon_unregister(struct drm_i915_private *i915) { }; +#endif + +#endif /* __I915_HWMON_H__ */ -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support
@ 2022-09-23 19:56 Badal Nilawar
2022-09-23 19:56 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar
0 siblings, 1 reply; 54+ messages in thread
From: Badal Nilawar @ 2022-09-23 19:56 UTC (permalink / raw)
To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel
This series adds the HWMON support for DGFX
Test-with: 20220919144408.251981-1-riana.tauro@intel.com
v2:
- Reorganized series. Created first patch as infrastructure patch
followed by feature patches. (Ashutosh)
- Fixed review comments (Jani)
- Fixed review comments (Ashutosh)
v3:
- Fixed review comments from Guenter
- Exposed energy inferface as standard hwmon interface (Ashutosh)
- For power interface added entries for critical power and maintained
standard interface for all the entries except
power1_max_interval
- Extended support for XEHPSDV (Ashutosh)
v4:
- Fixed review comment from Guenter
- Cleaned up unused code
v5:
- Fixed review comments (Jani)
v6:
- Fixed review comments (Ashutosh)
- Updated date and kernel version in documentation
v7:
- Fixed review comments (Anshuman)
- KernelVersion: 6.2, Date: February 2023 in doc (Tvrtko)
Ashutosh Dixit (2):
drm/i915/hwmon: Expose card reactive critical power
drm/i915/hwmon: Expose power1_max_interval
Dale B Stimson (4):
drm/i915/hwmon: Add HWMON infrastructure
drm/i915/hwmon: Power PL1 limit and TDP setting
drm/i915/hwmon: Show device level energy usage
drm/i915/hwmon: Extend power/energy for XEHPSDV
Riana Tauro (1):
drm/i915/hwmon: Add HWMON current voltage support
.../ABI/testing/sysfs-driver-intel-i915-hwmon | 75 ++
drivers/gpu/drm/i915/Makefile | 3 +
drivers/gpu/drm/i915/gt/intel_gt_regs.h | 8 +
drivers/gpu/drm/i915/i915_driver.c | 5 +
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/i915_hwmon.c | 762 ++++++++++++++++++
drivers/gpu/drm/i915/i915_hwmon.h | 21 +
drivers/gpu/drm/i915/i915_reg.h | 6 +
drivers/gpu/drm/i915/intel_mchbar_regs.h | 21 +
9 files changed, 903 insertions(+)
create mode 100644 Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h
--
2.25.1
^ permalink raw reply [flat|nested] 54+ messages in thread* [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-23 19:56 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar @ 2022-09-23 19:56 ` Badal Nilawar 2022-09-24 3:54 ` Dixit, Ashutosh 0 siblings, 1 reply; 54+ messages in thread From: Badal Nilawar @ 2022-09-23 19:56 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, andi.shyti, dri-devel From: Dale B Stimson <dale.b.stimson@intel.com> The i915 HWMON module will be used to expose voltage, power and energy values for dGfx. Here we set up i915 hwmon infrastructure including i915 hwmon registration, basic data structures and functions. v2: - Create HWMON infra patch (Ashutosh) - Fixed review comments (Jani) - Remove "select HWMON" from i915/Kconfig (Jani) v3: Use hwm_ prefix for static functions (Ashutosh) v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former doesn't work if hwmon is compiled as a module (Guenter) v5: Fixed review comments (Jani) v6: s/kzalloc/devm_kzalloc/ (Andi) Cc: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> --- drivers/gpu/drm/i915/Makefile | 3 + drivers/gpu/drm/i915/i915_driver.c | 5 ++ drivers/gpu/drm/i915/i915_drv.h | 2 + drivers/gpu/drm/i915/i915_hwmon.c | 131 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ 5 files changed, 161 insertions(+) create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index a26edcdadc21..66a6023e61a6 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -209,6 +209,9 @@ i915-y += gt/uc/intel_uc.o \ # graphics system controller (GSC) support i915-y += gt/intel_gsc.o +# graphics hardware monitoring (HWMON) support +i915-$(CONFIG_HWMON) += i915_hwmon.o + # modesetting core code i915-y += \ display/hsw_ips.o \ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index 9d1fc2477f80..ae0414037625 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -81,6 +81,7 @@ #include "i915_drm_client.h" #include "i915_drv.h" #include "i915_getparam.h" +#include "i915_hwmon.h" #include "i915_ioc32.h" #include "i915_ioctl.h" #include "i915_irq.h" @@ -763,6 +764,8 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) for_each_gt(gt, dev_priv, i) intel_gt_driver_register(gt); + i915_hwmon_register(dev_priv); + intel_display_driver_register(dev_priv); intel_power_domains_enable(dev_priv); @@ -795,6 +798,8 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) for_each_gt(gt, dev_priv, i) intel_gt_driver_unregister(gt); + i915_hwmon_unregister(dev_priv); + i915_perf_unregister(dev_priv); i915_pmu_unregister(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 134fc1621821..3197aa9d35d6 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -350,6 +350,8 @@ struct drm_i915_private { struct i915_perf perf; + struct i915_hwmon *hwmon; + /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ struct intel_gt gt0; diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c new file mode 100644 index 000000000000..2847ca4e1a77 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2022 Intel Corporation + */ + +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/types.h> + +#include "i915_drv.h" +#include "i915_hwmon.h" +#include "i915_reg.h" +#include "intel_mchbar_regs.h" + +struct hwm_reg { +}; + +struct hwm_drvdata { + struct i915_hwmon *hwmon; + struct intel_uncore *uncore; + struct device *hwmon_dev; + char name[12]; +}; + +struct i915_hwmon { + struct hwm_drvdata ddat; + struct mutex hwmon_lock; /* counter overflow logic and rmw */ + struct hwm_reg rg; +}; + +static const struct hwmon_channel_info *hwm_info[] = { + NULL +}; + +static umode_t +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + switch (type) { + default: + return 0; + } +} + +static int +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long *val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static int +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static const struct hwmon_ops hwm_ops = { + .is_visible = hwm_is_visible, + .read = hwm_read, + .write = hwm_write, +}; + +static const struct hwmon_chip_info hwm_chip_info = { + .ops = &hwm_ops, + .info = hwm_info, +}; + +static void +hwm_get_preregistration_info(struct drm_i915_private *i915) +{ +} + +void i915_hwmon_register(struct drm_i915_private *i915) +{ + struct device *dev = i915->drm.dev; + struct i915_hwmon *hwmon; + struct device *hwmon_dev; + struct hwm_drvdata *ddat; + + /* hwmon is available only for dGfx */ + if (!IS_DGFX(i915)) + return; + + hwmon = devm_kzalloc(dev, sizeof(*hwmon), GFP_KERNEL); + if (!hwmon) + return; + + i915->hwmon = hwmon; + mutex_init(&hwmon->hwmon_lock); + ddat = &hwmon->ddat; + + ddat->hwmon = hwmon; + ddat->uncore = &i915->uncore; + snprintf(ddat->name, sizeof(ddat->name), "i915"); + + hwm_get_preregistration_info(i915); + + /* hwmon_dev points to device hwmon<i> */ + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, + ddat, + &hwm_chip_info, + NULL); + if (IS_ERR(hwmon_dev)) { + i915->hwmon = NULL; + return; + } + + ddat->hwmon_dev = hwmon_dev; +} + +void i915_hwmon_unregister(struct drm_i915_private *i915) +{ + struct i915_hwmon *hwmon; + struct hwm_drvdata *ddat; + + hwmon = fetch_and_zero(&i915->hwmon); + if (!hwmon) + return; + + ddat = &hwmon->ddat; + if (ddat->hwmon_dev) + hwmon_device_unregister(ddat->hwmon_dev); +} diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h new file mode 100644 index 000000000000..7ca9cf2c34c9 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: MIT */ + +/* + * Copyright © 2022 Intel Corporation + */ + +#ifndef __I915_HWMON_H__ +#define __I915_HWMON_H__ + +struct drm_i915_private; + +#if IS_REACHABLE(CONFIG_HWMON) +void i915_hwmon_register(struct drm_i915_private *i915); +void i915_hwmon_unregister(struct drm_i915_private *i915); +#else +static inline void i915_hwmon_register(struct drm_i915_private *i915) { }; +static inline void i915_hwmon_unregister(struct drm_i915_private *i915) { }; +#endif + +#endif /* __I915_HWMON_H__ */ -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-23 19:56 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar @ 2022-09-24 3:54 ` Dixit, Ashutosh 0 siblings, 0 replies; 54+ messages in thread From: Dixit, Ashutosh @ 2022-09-24 3:54 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, andi.shyti, intel-gfx, dri-devel On Fri, 23 Sep 2022 12:56:37 -0700, Badal Nilawar wrote: > Hi Badal, Let me add this comment on the latest version so we don't forget about it: > +void i915_hwmon_register(struct drm_i915_private *i915) > +{ > + struct device *dev = i915->drm.dev; > + struct i915_hwmon *hwmon; > + struct device *hwmon_dev; > + struct hwm_drvdata *ddat; > + > + /* hwmon is available only for dGfx */ > + if (!IS_DGFX(i915)) > + return; > + > + hwmon = devm_kzalloc(dev, sizeof(*hwmon), GFP_KERNEL); If we are using devm_kzalloc we might as well replace all the hwmon_device_register_with_info's (in Patch 1 and 7) with devm_hwmon_device_register_with_info and then i915_hwmon_unregister is just this: void i915_hwmon_unregister(struct drm_i915_private *i915) { fetch_and_zero(&i915->hwmon); } Even the above statement is probably not needed but might as well retain it for sanity. So this is a simple change. Thanks. -- Ashutosh ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support
@ 2022-09-16 15:00 Badal Nilawar
2022-09-16 15:00 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar
0 siblings, 1 reply; 54+ messages in thread
From: Badal Nilawar @ 2022-09-16 15:00 UTC (permalink / raw)
To: intel-gfx; +Cc: linux-hwmon, dri-devel
This series adds the HWMON support for DGFX
Test-with: 20220914140721.3500129-1-riana.tauro@intel.com
v2:
- Reorganized series. Created first patch as infrastructure patch
followed by feature patches. (Ashutosh)
- Fixed review comments (Jani)
- Fixed review comments (Ashutosh)
v3:
- Fixed review comments from Guenter
- Exposed energy inferface as standard hwmon interface (Ashutosh)
- For power interface added entries for critical power and maintained
standard interface for all the entries except
power1_max_interval
- Extended support for XEHPSDV (Ashutosh)
v4:
- Fixed review comment from Guenter
- Cleaned up unused code
v5:
- Fixed review comments (Jani)
v6:
- Fixed review comments (Ashutosh)
- Updated date and kernel version in documentation
Ashutosh Dixit (2):
drm/i915/hwmon: Expose card reactive critical power
drm/i915/hwmon: Expose power1_max_interval
Dale B Stimson (4):
drm/i915/hwmon: Add HWMON infrastructure
drm/i915/hwmon: Power PL1 limit and TDP setting
drm/i915/hwmon: Show device level energy usage
drm/i915/hwmon: Extend power/energy for XEHPSDV
Riana Tauro (1):
drm/i915/hwmon: Add HWMON current voltage support
.../ABI/testing/sysfs-driver-intel-i915-hwmon | 75 ++
drivers/gpu/drm/i915/Makefile | 3 +
drivers/gpu/drm/i915/gt/intel_gt_regs.h | 8 +
drivers/gpu/drm/i915/i915_driver.c | 5 +
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/i915_hwmon.c | 761 ++++++++++++++++++
drivers/gpu/drm/i915/i915_hwmon.h | 21 +
drivers/gpu/drm/i915/i915_reg.h | 14 +
drivers/gpu/drm/i915/intel_mchbar_regs.h | 12 +
9 files changed, 901 insertions(+)
create mode 100644 Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h
--
2.25.1
^ permalink raw reply [flat|nested] 54+ messages in thread* [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-16 15:00 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar @ 2022-09-16 15:00 ` Badal Nilawar 2022-09-21 10:59 ` Gupta, Anshuman 2022-09-21 12:44 ` Andi Shyti 0 siblings, 2 replies; 54+ messages in thread From: Badal Nilawar @ 2022-09-16 15:00 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, dri-devel From: Dale B Stimson <dale.b.stimson@intel.com> The i915 HWMON module will be used to expose voltage, power and energy values for dGfx. Here we set up i915 hwmon infrastructure including i915 hwmon registration, basic data structures and functions. v2: - Create HWMON infra patch (Ashutosh) - Fixed review comments (Jani) - Remove "select HWMON" from i915/Kconfig (Jani) v3: Use hwm_ prefix for static functions (Ashutosh) v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former doesn't work if hwmon is compiled as a module (Guenter) v5: Fixed review comments (Jani) Cc: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> --- drivers/gpu/drm/i915/Makefile | 3 + drivers/gpu/drm/i915/i915_driver.c | 5 ++ drivers/gpu/drm/i915/i915_drv.h | 2 + drivers/gpu/drm/i915/i915_hwmon.c | 136 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ 5 files changed, 166 insertions(+) create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index a26edcdadc21..66a6023e61a6 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -209,6 +209,9 @@ i915-y += gt/uc/intel_uc.o \ # graphics system controller (GSC) support i915-y += gt/intel_gsc.o +# graphics hardware monitoring (HWMON) support +i915-$(CONFIG_HWMON) += i915_hwmon.o + # modesetting core code i915-y += \ display/hsw_ips.o \ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index c459eb362c47..75655adb7bd3 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -81,6 +81,7 @@ #include "i915_drm_client.h" #include "i915_drv.h" #include "i915_getparam.h" +#include "i915_hwmon.h" #include "i915_ioc32.h" #include "i915_ioctl.h" #include "i915_irq.h" @@ -763,6 +764,8 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) for_each_gt(gt, dev_priv, i) intel_gt_driver_register(gt); + i915_hwmon_register(dev_priv); + intel_display_driver_register(dev_priv); intel_power_domains_enable(dev_priv); @@ -795,6 +798,8 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) for_each_gt(gt, dev_priv, i) intel_gt_driver_unregister(gt); + i915_hwmon_unregister(dev_priv); + i915_perf_unregister(dev_priv); i915_pmu_unregister(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 9f9372931fd2..01a2caf42635 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -353,6 +353,8 @@ struct drm_i915_private { struct i915_perf perf; + struct i915_hwmon *hwmon; + /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ struct intel_gt gt0; diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c new file mode 100644 index 000000000000..103dd543a214 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2022 Intel Corporation + */ + +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/types.h> + +#include "i915_drv.h" +#include "i915_hwmon.h" +#include "i915_reg.h" +#include "intel_mchbar_regs.h" + +struct hwm_reg { +}; + +struct hwm_drvdata { + struct i915_hwmon *hwmon; + struct intel_uncore *uncore; + struct device *hwmon_dev; + char name[12]; +}; + +struct i915_hwmon { + struct hwm_drvdata ddat; + struct mutex hwmon_lock; /* counter overflow logic and rmw */ + struct hwm_reg rg; +}; + +static const struct hwmon_channel_info *hwm_info[] = { + NULL +}; + +static umode_t +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + switch (type) { + default: + return 0; + } +} + +static int +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long *val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static int +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static const struct hwmon_ops hwm_ops = { + .is_visible = hwm_is_visible, + .read = hwm_read, + .write = hwm_write, +}; + +static const struct hwmon_chip_info hwm_chip_info = { + .ops = &hwm_ops, + .info = hwm_info, +}; + +static void +hwm_get_preregistration_info(struct drm_i915_private *i915) +{ +} + +void i915_hwmon_register(struct drm_i915_private *i915) +{ + struct device *dev = i915->drm.dev; + struct i915_hwmon *hwmon; + struct device *hwmon_dev; + struct hwm_drvdata *ddat; + + /* hwmon is available only for dGfx */ + if (!IS_DGFX(i915)) + return; + + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); + if (!hwmon) + return; + + i915->hwmon = hwmon; + mutex_init(&hwmon->hwmon_lock); + ddat = &hwmon->ddat; + + ddat->hwmon = hwmon; + ddat->uncore = &i915->uncore; + snprintf(ddat->name, sizeof(ddat->name), "i915"); + + hwm_get_preregistration_info(i915); + + /* hwmon_dev points to device hwmon<i> */ + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, + ddat, + &hwm_chip_info, + NULL); + if (IS_ERR(hwmon_dev)) { + mutex_destroy(&hwmon->hwmon_lock); + i915->hwmon = NULL; + kfree(hwmon); + return; + } + + ddat->hwmon_dev = hwmon_dev; +} + +void i915_hwmon_unregister(struct drm_i915_private *i915) +{ + struct i915_hwmon *hwmon; + struct hwm_drvdata *ddat; + + hwmon = fetch_and_zero(&i915->hwmon); + if (!hwmon) + return; + + ddat = &hwmon->ddat; + if (ddat->hwmon_dev) + hwmon_device_unregister(ddat->hwmon_dev); + + mutex_destroy(&hwmon->hwmon_lock); + kfree(hwmon); +} diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h new file mode 100644 index 000000000000..7ca9cf2c34c9 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: MIT */ + +/* + * Copyright © 2022 Intel Corporation + */ + +#ifndef __I915_HWMON_H__ +#define __I915_HWMON_H__ + +struct drm_i915_private; + +#if IS_REACHABLE(CONFIG_HWMON) +void i915_hwmon_register(struct drm_i915_private *i915); +void i915_hwmon_unregister(struct drm_i915_private *i915); +#else +static inline void i915_hwmon_register(struct drm_i915_private *i915) { }; +static inline void i915_hwmon_unregister(struct drm_i915_private *i915) { }; +#endif + +#endif /* __I915_HWMON_H__ */ -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-16 15:00 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar @ 2022-09-21 10:59 ` Gupta, Anshuman 2022-09-21 12:44 ` Andi Shyti 1 sibling, 0 replies; 54+ messages in thread From: Gupta, Anshuman @ 2022-09-21 10:59 UTC (permalink / raw) To: Badal Nilawar, intel-gfx; +Cc: linux-hwmon, dri-devel On 9/16/2022 8:30 PM, Badal Nilawar wrote: > From: Dale B Stimson <dale.b.stimson@intel.com> > > The i915 HWMON module will be used to expose voltage, power and energy > values for dGfx. Here we set up i915 hwmon infrastructure including i915 > hwmon registration, basic data structures and functions. > > v2: > - Create HWMON infra patch (Ashutosh) > - Fixed review comments (Jani) > - Remove "select HWMON" from i915/Kconfig (Jani) > v3: Use hwm_ prefix for static functions (Ashutosh) > v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former > doesn't work if hwmon is compiled as a module (Guenter) > v5: Fixed review comments (Jani) > > Cc: Guenter Roeck <linux@roeck-us.net> > Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Signed-off-by: Riana Tauro <riana.tauro@intel.com> > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> > Acked-by: Guenter Roeck <linux@roeck-us.net> > Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com> > --- > drivers/gpu/drm/i915/Makefile | 3 + > drivers/gpu/drm/i915/i915_driver.c | 5 ++ > drivers/gpu/drm/i915/i915_drv.h | 2 + > drivers/gpu/drm/i915/i915_hwmon.c | 136 +++++++++++++++++++++++++++++ > drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ > 5 files changed, 166 insertions(+) > create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c > create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index a26edcdadc21..66a6023e61a6 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -209,6 +209,9 @@ i915-y += gt/uc/intel_uc.o \ > # graphics system controller (GSC) support > i915-y += gt/intel_gsc.o > > +# graphics hardware monitoring (HWMON) support > +i915-$(CONFIG_HWMON) += i915_hwmon.o > + > # modesetting core code > i915-y += \ > display/hsw_ips.o \ > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c > index c459eb362c47..75655adb7bd3 100644 > --- a/drivers/gpu/drm/i915/i915_driver.c > +++ b/drivers/gpu/drm/i915/i915_driver.c > @@ -81,6 +81,7 @@ > #include "i915_drm_client.h" > #include "i915_drv.h" > #include "i915_getparam.h" > +#include "i915_hwmon.h" > #include "i915_ioc32.h" > #include "i915_ioctl.h" > #include "i915_irq.h" > @@ -763,6 +764,8 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) > for_each_gt(gt, dev_priv, i) > intel_gt_driver_register(gt); > > + i915_hwmon_register(dev_priv); > + > intel_display_driver_register(dev_priv); > > intel_power_domains_enable(dev_priv); > @@ -795,6 +798,8 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) > for_each_gt(gt, dev_priv, i) > intel_gt_driver_unregister(gt); > > + i915_hwmon_unregister(dev_priv); > + > i915_perf_unregister(dev_priv); > i915_pmu_unregister(dev_priv); > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 9f9372931fd2..01a2caf42635 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -353,6 +353,8 @@ struct drm_i915_private { > > struct i915_perf perf; > > + struct i915_hwmon *hwmon; > + > /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ > struct intel_gt gt0; > > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > new file mode 100644 > index 000000000000..103dd543a214 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.c > @@ -0,0 +1,136 @@ > +// SPDX-License-Identifier: MIT > +/* > + * Copyright © 2022 Intel Corporation > + */ > + > +#include <linux/hwmon.h> > +#include <linux/hwmon-sysfs.h> > +#include <linux/types.h> > + > +#include "i915_drv.h" > +#include "i915_hwmon.h" > +#include "i915_reg.h" > +#include "intel_mchbar_regs.h" > + > +struct hwm_reg { > +}; > + > +struct hwm_drvdata { > + struct i915_hwmon *hwmon; > + struct intel_uncore *uncore; > + struct device *hwmon_dev; > + char name[12]; > +}; > + > +struct i915_hwmon { > + struct hwm_drvdata ddat; > + struct mutex hwmon_lock; /* counter overflow logic and rmw */ > + struct hwm_reg rg; > +}; > + > +static const struct hwmon_channel_info *hwm_info[] = { > + NULL > +}; > + > +static umode_t > +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > + u32 attr, int channel) > +{ > + switch (type) { > + default: > + return 0; > + } > +} > + > +static int > +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long *val) > +{ > + switch (type) { > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static int > +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long val) > +{ > + switch (type) { > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static const struct hwmon_ops hwm_ops = { > + .is_visible = hwm_is_visible, > + .read = hwm_read, > + .write = hwm_write, > +}; > + > +static const struct hwmon_chip_info hwm_chip_info = { > + .ops = &hwm_ops, > + .info = hwm_info, > +}; > + > +static void > +hwm_get_preregistration_info(struct drm_i915_private *i915) > +{ > +} > + > +void i915_hwmon_register(struct drm_i915_private *i915) > +{ > + struct device *dev = i915->drm.dev; > + struct i915_hwmon *hwmon; > + struct device *hwmon_dev; > + struct hwm_drvdata *ddat; > + > + /* hwmon is available only for dGfx */ > + if (!IS_DGFX(i915)) > + return; > + > + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); > + if (!hwmon) > + return; > + > + i915->hwmon = hwmon; > + mutex_init(&hwmon->hwmon_lock); > + ddat = &hwmon->ddat; > + > + ddat->hwmon = hwmon; > + ddat->uncore = &i915->uncore; > + snprintf(ddat->name, sizeof(ddat->name), "i915"); > + > + hwm_get_preregistration_info(i915); > + > + /* hwmon_dev points to device hwmon<i> */ > + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, > + ddat, > + &hwm_chip_info, > + NULL); > + if (IS_ERR(hwmon_dev)) { > + mutex_destroy(&hwmon->hwmon_lock); > + i915->hwmon = NULL; > + kfree(hwmon); > + return; > + } > + > + ddat->hwmon_dev = hwmon_dev; > +} > + > +void i915_hwmon_unregister(struct drm_i915_private *i915) > +{ > + struct i915_hwmon *hwmon; > + struct hwm_drvdata *ddat; > + > + hwmon = fetch_and_zero(&i915->hwmon); > + if (!hwmon) > + return; > + > + ddat = &hwmon->ddat; > + if (ddat->hwmon_dev) > + hwmon_device_unregister(ddat->hwmon_dev); > + > + mutex_destroy(&hwmon->hwmon_lock); > + kfree(hwmon); > +} > diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h > new file mode 100644 > index 000000000000..7ca9cf2c34c9 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.h > @@ -0,0 +1,20 @@ > +/* SPDX-License-Identifier: MIT */ > + > +/* > + * Copyright © 2022 Intel Corporation > + */ > + > +#ifndef __I915_HWMON_H__ > +#define __I915_HWMON_H__ > + > +struct drm_i915_private; > + > +#if IS_REACHABLE(CONFIG_HWMON) > +void i915_hwmon_register(struct drm_i915_private *i915); > +void i915_hwmon_unregister(struct drm_i915_private *i915); > +#else > +static inline void i915_hwmon_register(struct drm_i915_private *i915) { }; > +static inline void i915_hwmon_unregister(struct drm_i915_private *i915) { }; > +#endif > + > +#endif /* __I915_HWMON_H__ */ ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-16 15:00 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-09-21 10:59 ` Gupta, Anshuman @ 2022-09-21 12:44 ` Andi Shyti 2022-09-21 15:17 ` Nilawar, Badal 2022-09-24 3:10 ` Dixit, Ashutosh 1 sibling, 2 replies; 54+ messages in thread From: Andi Shyti @ 2022-09-21 12:44 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, intel-gfx, dri-devel Hi Badal, > +struct hwm_reg { > +}; > + > +struct hwm_drvdata { > + struct i915_hwmon *hwmon; > + struct intel_uncore *uncore; > + struct device *hwmon_dev; > + char name[12]; > +}; > + > +struct i915_hwmon { > + struct hwm_drvdata ddat; > + struct mutex hwmon_lock; /* counter overflow logic and rmw */ > + struct hwm_reg rg; > +}; > + > +static const struct hwmon_channel_info *hwm_info[] = { > + NULL > +}; > + > +static umode_t > +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > + u32 attr, int channel) > +{ > + switch (type) { > + default: > + return 0; > + } > +} > + > +static int > +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long *val) > +{ > + switch (type) { > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static int > +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long val) > +{ > + switch (type) { > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static const struct hwmon_ops hwm_ops = { > + .is_visible = hwm_is_visible, > + .read = hwm_read, > + .write = hwm_write, > +}; > + > +static const struct hwmon_chip_info hwm_chip_info = { > + .ops = &hwm_ops, > + .info = hwm_info, > +}; what's the point for splitting so much? Can't you just send the hwmon driver all at once? With this patch you are not actually doing anything useful. In my opinion this should be squashed with the next ones. > +static void > +hwm_get_preregistration_info(struct drm_i915_private *i915) > +{ > +} > + > +void i915_hwmon_register(struct drm_i915_private *i915) > +{ > + struct device *dev = i915->drm.dev; > + struct i915_hwmon *hwmon; > + struct device *hwmon_dev; > + struct hwm_drvdata *ddat; > + > + /* hwmon is available only for dGfx */ > + if (!IS_DGFX(i915)) > + return; > + > + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); why don't we use devm_kzalloc? > + if (!hwmon) > + return; > + > + i915->hwmon = hwmon; > + mutex_init(&hwmon->hwmon_lock); > + ddat = &hwmon->ddat; > + > + ddat->hwmon = hwmon; > + ddat->uncore = &i915->uncore; > + snprintf(ddat->name, sizeof(ddat->name), "i915"); > + > + hwm_get_preregistration_info(i915); > + > + /* hwmon_dev points to device hwmon<i> */ > + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, > + ddat, > + &hwm_chip_info, > + NULL); > + if (IS_ERR(hwmon_dev)) { > + mutex_destroy(&hwmon->hwmon_lock); there is not such a big need to destroy the mutex. Destroying mutexes is more useful when you actually are creating/destroying and there is some debug need. I don't think that's the case. With the devm_kzalloc this would be just a return. Andi > + i915->hwmon = NULL; > + kfree(hwmon); > + return; > + } > + > + ddat->hwmon_dev = hwmon_dev; > +} > + > +void i915_hwmon_unregister(struct drm_i915_private *i915) > +{ > + struct i915_hwmon *hwmon; > + struct hwm_drvdata *ddat; > + > + hwmon = fetch_and_zero(&i915->hwmon); > + if (!hwmon) > + return; > + > + ddat = &hwmon->ddat; > + if (ddat->hwmon_dev) > + hwmon_device_unregister(ddat->hwmon_dev); > + > + mutex_destroy(&hwmon->hwmon_lock); > + kfree(hwmon); > +} > diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h > new file mode 100644 > index 000000000000..7ca9cf2c34c9 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.h > @@ -0,0 +1,20 @@ > +/* SPDX-License-Identifier: MIT */ > + > +/* > + * Copyright © 2022 Intel Corporation > + */ > + > +#ifndef __I915_HWMON_H__ > +#define __I915_HWMON_H__ > + > +struct drm_i915_private; > + > +#if IS_REACHABLE(CONFIG_HWMON) > +void i915_hwmon_register(struct drm_i915_private *i915); > +void i915_hwmon_unregister(struct drm_i915_private *i915); > +#else > +static inline void i915_hwmon_register(struct drm_i915_private *i915) { }; > +static inline void i915_hwmon_unregister(struct drm_i915_private *i915) { }; > +#endif > + > +#endif /* __I915_HWMON_H__ */ > -- > 2.25.1 ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-21 12:44 ` Andi Shyti @ 2022-09-21 15:17 ` Nilawar, Badal 2022-09-21 15:45 ` Andi Shyti 2022-09-24 3:10 ` Dixit, Ashutosh 1 sibling, 1 reply; 54+ messages in thread From: Nilawar, Badal @ 2022-09-21 15:17 UTC (permalink / raw) To: Andi Shyti; +Cc: linux-hwmon, intel-gfx, dri-devel On 21-09-2022 18:14, Andi Shyti wrote: > Hi Badal, > >> +struct hwm_reg { >> +}; >> + >> +struct hwm_drvdata { >> + struct i915_hwmon *hwmon; >> + struct intel_uncore *uncore; >> + struct device *hwmon_dev; >> + char name[12]; >> +}; >> + >> +struct i915_hwmon { >> + struct hwm_drvdata ddat; >> + struct mutex hwmon_lock; /* counter overflow logic and rmw */ >> + struct hwm_reg rg; >> +}; >> + >> +static const struct hwmon_channel_info *hwm_info[] = { >> + NULL >> +}; >> + >> +static umode_t >> +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, >> + u32 attr, int channel) >> +{ >> + switch (type) { >> + default: >> + return 0; >> + } >> +} >> + >> +static int >> +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, >> + int channel, long *val) >> +{ >> + switch (type) { >> + default: >> + return -EOPNOTSUPP; >> + } >> +} >> + >> +static int >> +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, >> + int channel, long val) >> +{ >> + switch (type) { >> + default: >> + return -EOPNOTSUPP; >> + } >> +} >> + >> +static const struct hwmon_ops hwm_ops = { >> + .is_visible = hwm_is_visible, >> + .read = hwm_read, >> + .write = hwm_write, >> +}; >> + >> +static const struct hwmon_chip_info hwm_chip_info = { >> + .ops = &hwm_ops, >> + .info = hwm_info, >> +}; > > what's the point for splitting so much? Can't you just send the > hwmon driver all at once? With this patch you are not actually > doing anything useful. In my opinion this should be squashed with > the next ones. During discussion in cover letter of rev0 series we decided to create separate infrastructure patch, as we wanted to keep kconfig, i915 hwmon structures and new file addition in separate patch. Further feature wise we kept adding new patches. > >> +static void >> +hwm_get_preregistration_info(struct drm_i915_private *i915) >> +{ >> +} >> + >> +void i915_hwmon_register(struct drm_i915_private *i915) >> +{ >> + struct device *dev = i915->drm.dev; >> + struct i915_hwmon *hwmon; >> + struct device *hwmon_dev; >> + struct hwm_drvdata *ddat; >> + >> + /* hwmon is available only for dGfx */ >> + if (!IS_DGFX(i915)) >> + return; >> + >> + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); > > why don't we use devm_kzalloc? > >> + if (!hwmon) >> + return; >> + >> + i915->hwmon = hwmon; >> + mutex_init(&hwmon->hwmon_lock); >> + ddat = &hwmon->ddat; >> + >> + ddat->hwmon = hwmon; >> + ddat->uncore = &i915->uncore; >> + snprintf(ddat->name, sizeof(ddat->name), "i915"); >> + >> + hwm_get_preregistration_info(i915); >> + >> + /* hwmon_dev points to device hwmon<i> */ >> + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, >> + ddat, >> + &hwm_chip_info, >> + NULL); >> + if (IS_ERR(hwmon_dev)) { >> + mutex_destroy(&hwmon->hwmon_lock); > > there is not such a big need to destroy the mutex. Destroying > mutexes is more useful when you actually are creating/destroying > and there is some debug need. I don't think that's the case. > > With the devm_kzalloc this would be just a return. I think we can switch to devm_kzalloc. Regards, Badal > > Andi > >> + i915->hwmon = NULL; >> + kfree(hwmon); >> + return; >> + } >> + >> + ddat->hwmon_dev = hwmon_dev; >> +} >> + >> +void i915_hwmon_unregister(struct drm_i915_private *i915) >> +{ >> + struct i915_hwmon *hwmon; >> + struct hwm_drvdata *ddat; >> + >> + hwmon = fetch_and_zero(&i915->hwmon); >> + if (!hwmon) >> + return; >> + >> + ddat = &hwmon->ddat; >> + if (ddat->hwmon_dev) >> + hwmon_device_unregister(ddat->hwmon_dev); >> + >> + mutex_destroy(&hwmon->hwmon_lock); >> + kfree(hwmon); >> +} >> diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h >> new file mode 100644 >> index 000000000000..7ca9cf2c34c9 >> --- /dev/null >> +++ b/drivers/gpu/drm/i915/i915_hwmon.h >> @@ -0,0 +1,20 @@ >> +/* SPDX-License-Identifier: MIT */ >> + >> +/* >> + * Copyright © 2022 Intel Corporation >> + */ >> + >> +#ifndef __I915_HWMON_H__ >> +#define __I915_HWMON_H__ >> + >> +struct drm_i915_private; >> + >> +#if IS_REACHABLE(CONFIG_HWMON) >> +void i915_hwmon_register(struct drm_i915_private *i915); >> +void i915_hwmon_unregister(struct drm_i915_private *i915); >> +#else >> +static inline void i915_hwmon_register(struct drm_i915_private *i915) { }; >> +static inline void i915_hwmon_unregister(struct drm_i915_private *i915) { }; >> +#endif >> + >> +#endif /* __I915_HWMON_H__ */ >> -- >> 2.25.1 ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-21 15:17 ` Nilawar, Badal @ 2022-09-21 15:45 ` Andi Shyti 0 siblings, 0 replies; 54+ messages in thread From: Andi Shyti @ 2022-09-21 15:45 UTC (permalink / raw) To: Nilawar, Badal; +Cc: linux-hwmon, intel-gfx, dri-devel Hi Badal, > > > +struct hwm_reg { > > > +}; > > > + > > > +struct hwm_drvdata { > > > + struct i915_hwmon *hwmon; > > > + struct intel_uncore *uncore; > > > + struct device *hwmon_dev; > > > + char name[12]; > > > +}; > > > + > > > +struct i915_hwmon { > > > + struct hwm_drvdata ddat; > > > + struct mutex hwmon_lock; /* counter overflow logic and rmw */ > > > + struct hwm_reg rg; > > > +}; > > > + > > > +static const struct hwmon_channel_info *hwm_info[] = { > > > + NULL > > > +}; > > > + > > > +static umode_t > > > +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > > > + u32 attr, int channel) > > > +{ > > > + switch (type) { > > > + default: > > > + return 0; > > > + } > > > +} > > > + > > > +static int > > > +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, > > > + int channel, long *val) > > > +{ > > > + switch (type) { > > > + default: > > > + return -EOPNOTSUPP; > > > + } > > > +} > > > + > > > +static int > > > +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, > > > + int channel, long val) > > > +{ > > > + switch (type) { > > > + default: > > > + return -EOPNOTSUPP; > > > + } > > > +} > > > + > > > +static const struct hwmon_ops hwm_ops = { > > > + .is_visible = hwm_is_visible, > > > + .read = hwm_read, > > > + .write = hwm_write, > > > +}; > > > + > > > +static const struct hwmon_chip_info hwm_chip_info = { > > > + .ops = &hwm_ops, > > > + .info = hwm_info, > > > +}; > > > > what's the point for splitting so much? Can't you just send the > > hwmon driver all at once? With this patch you are not actually > > doing anything useful. In my opinion this should be squashed with > > the next ones. > During discussion in cover letter of rev0 series we decided to create > separate infrastructure patch, as we wanted to keep kconfig, i915 hwmon > structures and new file addition in separate patch. Further feature wise we > kept adding new patches. I don't really like this patch splitting, but it's my fault I haven't reviewed it already in v1. Please, ignore then. Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-09-21 12:44 ` Andi Shyti 2022-09-21 15:17 ` Nilawar, Badal @ 2022-09-24 3:10 ` Dixit, Ashutosh 1 sibling, 0 replies; 54+ messages in thread From: Dixit, Ashutosh @ 2022-09-24 3:10 UTC (permalink / raw) To: Andi Shyti; +Cc: linux-hwmon, intel-gfx, dri-devel On Wed, 21 Sep 2022 05:44:35 -0700, Andi Shyti wrote: > > > +void i915_hwmon_register(struct drm_i915_private *i915) > > +{ > > + struct device *dev = i915->drm.dev; > > + struct i915_hwmon *hwmon; > > + struct device *hwmon_dev; > > + struct hwm_drvdata *ddat; > > + > > + /* hwmon is available only for dGfx */ > > + if (!IS_DGFX(i915)) > > + return; > > + > > + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); > > why don't we use devm_kzalloc? > > > + if (!hwmon) > > + return; > > + > > + i915->hwmon = hwmon; > > + mutex_init(&hwmon->hwmon_lock); > > + ddat = &hwmon->ddat; > > + > > + ddat->hwmon = hwmon; > > + ddat->uncore = &i915->uncore; > > + snprintf(ddat->name, sizeof(ddat->name), "i915"); > > + > > + hwm_get_preregistration_info(i915); > > + > > + /* hwmon_dev points to device hwmon<i> */ > > + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, > > + ddat, > > + &hwm_chip_info, > > + NULL); > > + if (IS_ERR(hwmon_dev)) { > > + mutex_destroy(&hwmon->hwmon_lock); > > there is not such a big need to destroy the mutex. Destroying > mutexes is more useful when you actually are creating/destroying > and there is some debug need. I don't think that's the case. > > With the devm_kzalloc this would be just a return. If we are using devm_kzalloc we might as well replace all the hwmon_device_register_with_info's (in Patch 1 and 7) with devm_hwmon_device_register_with_info and then i915_hwmon_unregister is just this: void i915_hwmon_unregister(struct drm_i915_private *i915) { fetch_and_zero(&i915->hwmon); } Even the above statement is probably not needed but might as well retain it for sanity. So this is a simple change. Thanks. -- Ashutosh ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support
@ 2022-08-25 13:21 Badal Nilawar
2022-08-25 13:21 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar
0 siblings, 1 reply; 54+ messages in thread
From: Badal Nilawar @ 2022-08-25 13:21 UTC (permalink / raw)
To: intel-gfx; +Cc: linux-hwmon
This series adds the HWMON support for DGFX
v2:
- Reorganized series. Created first patch as infrastructure patch
followed by feature patches. (Ashutosh)
- Fixed review comments (Jani)
- Fixed review comments (Ashutosh)
v3:
- Fixed review comments from Guenter
- Exposed energy inferface as standard hwmon interface (Ashutosh)
- For power interface added entries for critical power and maintained
standard interface for all the entries except
power1_max_interval
- Extended support for XEHPSDV (Ashutosh)
v4:
- Fixed review comment from Guenter
- Cleaned up unused code
v5:
- Fixed review comments (Jani)
Ashutosh Dixit (2):
drm/i915/hwmon: Expose card reactive critical power
drm/i915/hwmon: Expose power1_max_interval
Dale B Stimson (4):
drm/i915/hwmon: Add HWMON infrastructure
drm/i915/hwmon: Power PL1 limit and TDP setting
drm/i915/hwmon: Show device level energy usage
drm/i915/hwmon: Extend power/energy for XEHPSDV
Riana Tauro (1):
drm/i915/hwmon: Add HWMON current voltage support
.../ABI/testing/sysfs-driver-intel-i915-hwmon | 75 ++
drivers/gpu/drm/i915/Makefile | 3 +
drivers/gpu/drm/i915/gt/intel_gt_regs.h | 8 +
drivers/gpu/drm/i915/i915_driver.c | 5 +
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/i915_hwmon.c | 788 ++++++++++++++++++
drivers/gpu/drm/i915/i915_hwmon.h | 21 +
drivers/gpu/drm/i915/i915_reg.h | 22 +
drivers/gpu/drm/i915/intel_mchbar_regs.h | 12 +
9 files changed, 936 insertions(+)
create mode 100644 Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h
--
2.25.1
^ permalink raw reply [flat|nested] 54+ messages in thread* [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-25 13:21 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar @ 2022-08-25 13:21 ` Badal Nilawar 2022-08-26 13:30 ` Guenter Roeck 2022-08-29 17:26 ` Dixit, Ashutosh 0 siblings, 2 replies; 54+ messages in thread From: Badal Nilawar @ 2022-08-25 13:21 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon From: Dale B Stimson <dale.b.stimson@intel.com> The i915 HWMON module will be used to expose voltage, power and energy values for dGfx. Here we set up i915 hwmon infrastructure including i915 hwmon registration, basic data structures and functions. v2: - Create HWMON infra patch (Ashutosh) - Fixed review comments (Jani) - Remove "select HWMON" from i915/Kconfig (Jani) v3: Use hwm_ prefix for static functions (Ashutosh) v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former doesn't work if hwmon is compiled as a module (Guenter) v5: Fixed review comments (Jani) Cc: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> --- drivers/gpu/drm/i915/Makefile | 3 + drivers/gpu/drm/i915/i915_driver.c | 5 ++ drivers/gpu/drm/i915/i915_drv.h | 2 + drivers/gpu/drm/i915/i915_hwmon.c | 136 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ 5 files changed, 166 insertions(+) create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index 522ef9b4aff3..2b235f747490 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -208,6 +208,9 @@ i915-y += gt/uc/intel_uc.o \ # graphics system controller (GSC) support i915-y += gt/intel_gsc.o +# graphics hardware monitoring (HWMON) support +i915-$(CONFIG_HWMON) += i915_hwmon.o + # modesetting core code i915-y += \ display/hsw_ips.o \ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index 1332c70370a6..248deecd26a5 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -80,6 +80,7 @@ #include "i915_drm_client.h" #include "i915_drv.h" #include "i915_getparam.h" +#include "i915_hwmon.h" #include "i915_ioc32.h" #include "i915_ioctl.h" #include "i915_irq.h" @@ -736,6 +737,8 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) intel_gt_driver_register(to_gt(dev_priv)); + i915_hwmon_register(dev_priv); + intel_display_driver_register(dev_priv); intel_power_domains_enable(dev_priv); @@ -762,6 +765,8 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) intel_display_driver_unregister(dev_priv); + i915_hwmon_unregister(dev_priv); + intel_gt_driver_unregister(to_gt(dev_priv)); i915_perf_unregister(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 69ce6db6a7c1..7b5b10df3404 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -705,6 +705,8 @@ struct drm_i915_private { struct i915_perf perf; + struct i915_hwmon *hwmon; + /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ struct intel_gt gt0; diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c new file mode 100644 index 000000000000..103dd543a214 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2022 Intel Corporation + */ + +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/types.h> + +#include "i915_drv.h" +#include "i915_hwmon.h" +#include "i915_reg.h" +#include "intel_mchbar_regs.h" + +struct hwm_reg { +}; + +struct hwm_drvdata { + struct i915_hwmon *hwmon; + struct intel_uncore *uncore; + struct device *hwmon_dev; + char name[12]; +}; + +struct i915_hwmon { + struct hwm_drvdata ddat; + struct mutex hwmon_lock; /* counter overflow logic and rmw */ + struct hwm_reg rg; +}; + +static const struct hwmon_channel_info *hwm_info[] = { + NULL +}; + +static umode_t +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + switch (type) { + default: + return 0; + } +} + +static int +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long *val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static int +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static const struct hwmon_ops hwm_ops = { + .is_visible = hwm_is_visible, + .read = hwm_read, + .write = hwm_write, +}; + +static const struct hwmon_chip_info hwm_chip_info = { + .ops = &hwm_ops, + .info = hwm_info, +}; + +static void +hwm_get_preregistration_info(struct drm_i915_private *i915) +{ +} + +void i915_hwmon_register(struct drm_i915_private *i915) +{ + struct device *dev = i915->drm.dev; + struct i915_hwmon *hwmon; + struct device *hwmon_dev; + struct hwm_drvdata *ddat; + + /* hwmon is available only for dGfx */ + if (!IS_DGFX(i915)) + return; + + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); + if (!hwmon) + return; + + i915->hwmon = hwmon; + mutex_init(&hwmon->hwmon_lock); + ddat = &hwmon->ddat; + + ddat->hwmon = hwmon; + ddat->uncore = &i915->uncore; + snprintf(ddat->name, sizeof(ddat->name), "i915"); + + hwm_get_preregistration_info(i915); + + /* hwmon_dev points to device hwmon<i> */ + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, + ddat, + &hwm_chip_info, + NULL); + if (IS_ERR(hwmon_dev)) { + mutex_destroy(&hwmon->hwmon_lock); + i915->hwmon = NULL; + kfree(hwmon); + return; + } + + ddat->hwmon_dev = hwmon_dev; +} + +void i915_hwmon_unregister(struct drm_i915_private *i915) +{ + struct i915_hwmon *hwmon; + struct hwm_drvdata *ddat; + + hwmon = fetch_and_zero(&i915->hwmon); + if (!hwmon) + return; + + ddat = &hwmon->ddat; + if (ddat->hwmon_dev) + hwmon_device_unregister(ddat->hwmon_dev); + + mutex_destroy(&hwmon->hwmon_lock); + kfree(hwmon); +} diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h new file mode 100644 index 000000000000..7ca9cf2c34c9 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: MIT */ + +/* + * Copyright © 2022 Intel Corporation + */ + +#ifndef __I915_HWMON_H__ +#define __I915_HWMON_H__ + +struct drm_i915_private; + +#if IS_REACHABLE(CONFIG_HWMON) +void i915_hwmon_register(struct drm_i915_private *i915); +void i915_hwmon_unregister(struct drm_i915_private *i915); +#else +static inline void i915_hwmon_register(struct drm_i915_private *i915) { }; +static inline void i915_hwmon_unregister(struct drm_i915_private *i915) { }; +#endif + +#endif /* __I915_HWMON_H__ */ -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-25 13:21 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar @ 2022-08-26 13:30 ` Guenter Roeck 2022-08-29 17:26 ` Dixit, Ashutosh 1 sibling, 0 replies; 54+ messages in thread From: Guenter Roeck @ 2022-08-26 13:30 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, intel-gfx On Thu, Aug 25, 2022 at 06:51:12PM +0530, Badal Nilawar wrote: > From: Dale B Stimson <dale.b.stimson@intel.com> > > The i915 HWMON module will be used to expose voltage, power and energy > values for dGfx. Here we set up i915 hwmon infrastructure including i915 > hwmon registration, basic data structures and functions. > > v2: > - Create HWMON infra patch (Ashutosh) > - Fixed review comments (Jani) > - Remove "select HWMON" from i915/Kconfig (Jani) > v3: Use hwm_ prefix for static functions (Ashutosh) > v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former > doesn't work if hwmon is compiled as a module (Guenter) > v5: Fixed review comments (Jani) > > Cc: Guenter Roeck <linux@roeck-us.net> > Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Signed-off-by: Riana Tauro <riana.tauro@intel.com> > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> Acked-by: Guenter Roeck <linux@roeck-us.net> > --- > drivers/gpu/drm/i915/Makefile | 3 + > drivers/gpu/drm/i915/i915_driver.c | 5 ++ > drivers/gpu/drm/i915/i915_drv.h | 2 + > drivers/gpu/drm/i915/i915_hwmon.c | 136 +++++++++++++++++++++++++++++ > drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ > 5 files changed, 166 insertions(+) > create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c > create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index 522ef9b4aff3..2b235f747490 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -208,6 +208,9 @@ i915-y += gt/uc/intel_uc.o \ > # graphics system controller (GSC) support > i915-y += gt/intel_gsc.o > > +# graphics hardware monitoring (HWMON) support > +i915-$(CONFIG_HWMON) += i915_hwmon.o > + > # modesetting core code > i915-y += \ > display/hsw_ips.o \ > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c > index 1332c70370a6..248deecd26a5 100644 > --- a/drivers/gpu/drm/i915/i915_driver.c > +++ b/drivers/gpu/drm/i915/i915_driver.c > @@ -80,6 +80,7 @@ > #include "i915_drm_client.h" > #include "i915_drv.h" > #include "i915_getparam.h" > +#include "i915_hwmon.h" > #include "i915_ioc32.h" > #include "i915_ioctl.h" > #include "i915_irq.h" > @@ -736,6 +737,8 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) > > intel_gt_driver_register(to_gt(dev_priv)); > > + i915_hwmon_register(dev_priv); > + > intel_display_driver_register(dev_priv); > > intel_power_domains_enable(dev_priv); > @@ -762,6 +765,8 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) > > intel_display_driver_unregister(dev_priv); > > + i915_hwmon_unregister(dev_priv); > + > intel_gt_driver_unregister(to_gt(dev_priv)); > > i915_perf_unregister(dev_priv); > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 69ce6db6a7c1..7b5b10df3404 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -705,6 +705,8 @@ struct drm_i915_private { > > struct i915_perf perf; > > + struct i915_hwmon *hwmon; > + > /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ > struct intel_gt gt0; > > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > new file mode 100644 > index 000000000000..103dd543a214 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.c > @@ -0,0 +1,136 @@ > +// SPDX-License-Identifier: MIT > +/* > + * Copyright © 2022 Intel Corporation > + */ > + > +#include <linux/hwmon.h> > +#include <linux/hwmon-sysfs.h> > +#include <linux/types.h> > + > +#include "i915_drv.h" > +#include "i915_hwmon.h" > +#include "i915_reg.h" > +#include "intel_mchbar_regs.h" > + > +struct hwm_reg { > +}; > + > +struct hwm_drvdata { > + struct i915_hwmon *hwmon; > + struct intel_uncore *uncore; > + struct device *hwmon_dev; > + char name[12]; > +}; > + > +struct i915_hwmon { > + struct hwm_drvdata ddat; > + struct mutex hwmon_lock; /* counter overflow logic and rmw */ > + struct hwm_reg rg; > +}; > + > +static const struct hwmon_channel_info *hwm_info[] = { > + NULL > +}; > + > +static umode_t > +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > + u32 attr, int channel) > +{ > + switch (type) { > + default: > + return 0; > + } > +} > + > +static int > +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long *val) > +{ > + switch (type) { > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static int > +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long val) > +{ > + switch (type) { > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static const struct hwmon_ops hwm_ops = { > + .is_visible = hwm_is_visible, > + .read = hwm_read, > + .write = hwm_write, > +}; > + > +static const struct hwmon_chip_info hwm_chip_info = { > + .ops = &hwm_ops, > + .info = hwm_info, > +}; > + > +static void > +hwm_get_preregistration_info(struct drm_i915_private *i915) > +{ > +} > + > +void i915_hwmon_register(struct drm_i915_private *i915) > +{ > + struct device *dev = i915->drm.dev; > + struct i915_hwmon *hwmon; > + struct device *hwmon_dev; > + struct hwm_drvdata *ddat; > + > + /* hwmon is available only for dGfx */ > + if (!IS_DGFX(i915)) > + return; > + > + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); > + if (!hwmon) > + return; > + > + i915->hwmon = hwmon; > + mutex_init(&hwmon->hwmon_lock); > + ddat = &hwmon->ddat; > + > + ddat->hwmon = hwmon; > + ddat->uncore = &i915->uncore; > + snprintf(ddat->name, sizeof(ddat->name), "i915"); > + > + hwm_get_preregistration_info(i915); > + > + /* hwmon_dev points to device hwmon<i> */ > + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, > + ddat, > + &hwm_chip_info, > + NULL); > + if (IS_ERR(hwmon_dev)) { > + mutex_destroy(&hwmon->hwmon_lock); > + i915->hwmon = NULL; > + kfree(hwmon); > + return; > + } > + > + ddat->hwmon_dev = hwmon_dev; > +} > + > +void i915_hwmon_unregister(struct drm_i915_private *i915) > +{ > + struct i915_hwmon *hwmon; > + struct hwm_drvdata *ddat; > + > + hwmon = fetch_and_zero(&i915->hwmon); > + if (!hwmon) > + return; > + > + ddat = &hwmon->ddat; > + if (ddat->hwmon_dev) > + hwmon_device_unregister(ddat->hwmon_dev); > + > + mutex_destroy(&hwmon->hwmon_lock); > + kfree(hwmon); > +} > diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h > new file mode 100644 > index 000000000000..7ca9cf2c34c9 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.h > @@ -0,0 +1,20 @@ > +/* SPDX-License-Identifier: MIT */ > + > +/* > + * Copyright © 2022 Intel Corporation > + */ > + > +#ifndef __I915_HWMON_H__ > +#define __I915_HWMON_H__ > + > +struct drm_i915_private; > + > +#if IS_REACHABLE(CONFIG_HWMON) > +void i915_hwmon_register(struct drm_i915_private *i915); > +void i915_hwmon_unregister(struct drm_i915_private *i915); > +#else > +static inline void i915_hwmon_register(struct drm_i915_private *i915) { }; > +static inline void i915_hwmon_unregister(struct drm_i915_private *i915) { }; > +#endif > + > +#endif /* __I915_HWMON_H__ */ > -- > 2.25.1 > ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-25 13:21 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-08-26 13:30 ` Guenter Roeck @ 2022-08-29 17:26 ` Dixit, Ashutosh 1 sibling, 0 replies; 54+ messages in thread From: Dixit, Ashutosh @ 2022-08-29 17:26 UTC (permalink / raw) To: Badal Nilawar; +Cc: linux-hwmon, intel-gfx On Thu, 25 Aug 2022 06:21:12 -0700, Badal Nilawar wrote: > A couple of minor observations below but otherwise this patch is: Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > new file mode 100644 > index 000000000000..103dd543a214 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.c /snip/ > +struct hwm_reg { > +}; > + > +struct hwm_drvdata { > + struct i915_hwmon *hwmon; > + struct intel_uncore *uncore; Instead of 'struct intel_uncore' we could have a 'struct intel_gt' here since intel_gt is a higher level but I think uncore is fine and anyway has a backpointer to intel_gt should we need it. So no changes needed. > + struct device *hwmon_dev; > + char name[12]; > +}; > + > +struct i915_hwmon { > + struct hwm_drvdata ddat; > + struct mutex hwmon_lock; /* counter overflow logic and rmw */ > + struct hwm_reg rg; > +}; Somebody looking at just this patch might wonder why we have two data structs hwm_drvdata and i915_hwmon, rather than just one. The answer becomes clear in a later patch and that of course is that i915 exposes multiple hwmon devices. Anyway, just an observation, no changes required. ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support
@ 2022-08-18 19:38 Badal Nilawar
2022-08-18 19:38 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar
0 siblings, 1 reply; 54+ messages in thread
From: Badal Nilawar @ 2022-08-18 19:38 UTC (permalink / raw)
To: intel-gfx; +Cc: linux-hwmon, linux
This series adds the HWMON support for DGFX
v2:
- Reorganized series. Created first patch as infrastructure patch
followed by feature patches. (Ashutosh)
- Fixed review comments (Jani)
- Fixed review comments (Ashutosh)
v3:
- Fixed review comments from Guenter
- Exposed energy inferface as standard hwmon interface (Ashutosh)
- For power interface added entries for critical power and maintained
standard interface for all the entries except
power1_max_interval
- Extended support for XEHPSDV (Ashutosh)
v4:
- Fixed review comment from Guenter
- Cleaned up unused code
Ashutosh Dixit (2):
drm/i915/hwmon: Expose card reactive critical power
drm/i915/hwmon: Expose power1_max_interval
Dale B Stimson (4):
drm/i915/hwmon: Add HWMON infrastructure
drm/i915/hwmon: Power PL1 limit and TDP setting
drm/i915/hwmon: Show device level energy usage
drm/i915/hwmon: Extend power/energy for XEHPSDV
Riana Tauro (1):
drm/i915/hwmon: Add HWMON current voltage support
.../ABI/testing/sysfs-driver-intel-i915-hwmon | 75 ++
drivers/gpu/drm/i915/Makefile | 3 +
drivers/gpu/drm/i915/gt/intel_gt_regs.h | 8 +
drivers/gpu/drm/i915/i915_driver.c | 7 +
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/i915_hwmon.c | 787 ++++++++++++++++++
drivers/gpu/drm/i915/i915_hwmon.h | 21 +
drivers/gpu/drm/i915/i915_reg.h | 22 +
drivers/gpu/drm/i915/intel_mchbar_regs.h | 13 +
9 files changed, 938 insertions(+)
create mode 100644 Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h
--
2.25.1
^ permalink raw reply [flat|nested] 54+ messages in thread* [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-18 19:38 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar @ 2022-08-18 19:38 ` Badal Nilawar 2022-08-19 10:35 ` Jani Nikula 2022-08-19 10:37 ` Jani Nikula 0 siblings, 2 replies; 54+ messages in thread From: Badal Nilawar @ 2022-08-18 19:38 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, linux From: Dale B Stimson <dale.b.stimson@intel.com> The i915 HWMON module will be used to expose voltage, power and energy values for dGfx. Here we set up i915 hwmon infrastructure including i915 hwmon registration, basic data structures and functions. v2: - Create HWMON infra patch (Ashutosh) - Fixed review comments (Jani) - Remove "select HWMON" from i915/Kconfig (Jani) v3: Use hwm_ prefix for static functions (Ashutosh) v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former doesn't work if hwmon is compiled as a module (Guenter) Cc: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> --- drivers/gpu/drm/i915/Makefile | 3 + drivers/gpu/drm/i915/i915_driver.c | 7 ++ drivers/gpu/drm/i915/i915_drv.h | 2 + drivers/gpu/drm/i915/i915_hwmon.c | 135 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ 5 files changed, 167 insertions(+) create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index 522ef9b4aff3..2b235f747490 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -208,6 +208,9 @@ i915-y += gt/uc/intel_uc.o \ # graphics system controller (GSC) support i915-y += gt/intel_gsc.o +# graphics hardware monitoring (HWMON) support +i915-$(CONFIG_HWMON) += i915_hwmon.o + # modesetting core code i915-y += \ display/hsw_ips.o \ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index deb8a8b76965..62340cd01dde 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -80,6 +80,7 @@ #include "i915_drm_client.h" #include "i915_drv.h" #include "i915_getparam.h" +#include "i915_hwmon.h" #include "i915_ioc32.h" #include "i915_ioctl.h" #include "i915_irq.h" @@ -736,6 +737,9 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) intel_gt_driver_register(to_gt(dev_priv)); +#if IS_REACHABLE(CONFIG_HWMON) + i915_hwmon_register(dev_priv); +#endif intel_display_driver_register(dev_priv); intel_power_domains_enable(dev_priv); @@ -762,6 +766,9 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) intel_display_driver_unregister(dev_priv); +#if IS_REACHABLE(CONFIG_HWMON) + i915_hwmon_unregister(dev_priv); +#endif intel_gt_driver_unregister(to_gt(dev_priv)); i915_perf_unregister(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 086bbe8945d6..d437d588dec9 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -705,6 +705,8 @@ struct drm_i915_private { struct i915_perf perf; + struct i915_hwmon *hwmon; + /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ struct intel_gt gt0; diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c new file mode 100644 index 000000000000..5b80a0f024f0 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2022 Intel Corporation + */ + +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/types.h> + +#include "i915_drv.h" +#include "i915_hwmon.h" +#include "intel_mchbar_regs.h" + +struct hwm_reg { +}; + +struct hwm_drvdata { + struct i915_hwmon *hwmon; + struct intel_uncore *uncore; + struct device *hwmon_dev; + char name[12]; +}; + +struct i915_hwmon { + struct hwm_drvdata ddat; + struct mutex hwmon_lock; /* counter overflow logic and rmw */ + struct hwm_reg rg; +}; + +static const struct hwmon_channel_info *hwm_info[] = { + NULL +}; + +static umode_t +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + switch (type) { + default: + return 0; + } +} + +static int +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long *val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static int +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static const struct hwmon_ops hwm_ops = { + .is_visible = hwm_is_visible, + .read = hwm_read, + .write = hwm_write, +}; + +static const struct hwmon_chip_info hwm_chip_info = { + .ops = &hwm_ops, + .info = hwm_info, +}; + +static void +hwm_get_preregistration_info(struct drm_i915_private *i915) +{ +} + +void i915_hwmon_register(struct drm_i915_private *i915) +{ + struct device *dev = i915->drm.dev; + struct i915_hwmon *hwmon; + struct device *hwmon_dev; + struct hwm_drvdata *ddat; + + /* hwmon is available only for dGfx */ + if (!IS_DGFX(i915)) + return; + + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); + if (!hwmon) + return; + + i915->hwmon = hwmon; + mutex_init(&hwmon->hwmon_lock); + ddat = &hwmon->ddat; + + ddat->hwmon = hwmon; + ddat->uncore = &i915->uncore; + snprintf(ddat->name, sizeof(ddat->name), "i915"); + + hwm_get_preregistration_info(i915); + + /* hwmon_dev points to device hwmon<i> */ + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, + ddat, + &hwm_chip_info, + NULL); + if (IS_ERR(hwmon_dev)) { + mutex_destroy(&hwmon->hwmon_lock); + i915->hwmon = NULL; + kfree(hwmon); + return; + } + + ddat->hwmon_dev = hwmon_dev; +} + +void i915_hwmon_unregister(struct drm_i915_private *i915) +{ + struct i915_hwmon *hwmon; + struct hwm_drvdata *ddat; + + hwmon = fetch_and_zero(&i915->hwmon); + if (!hwmon) + return; + + ddat = &hwmon->ddat; + if (ddat->hwmon_dev) + hwmon_device_unregister(ddat->hwmon_dev); + + mutex_destroy(&hwmon->hwmon_lock); + kfree(hwmon); +} diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h new file mode 100644 index 000000000000..921ae76099d3 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: MIT */ + +/* + * Copyright © 2022 Intel Corporation + */ + +#ifndef __I915_HWMON_H__ +#define __I915_HWMON_H__ + +#include <linux/device.h> +#include <linux/mutex.h> +#include <linux/types.h> +#include "i915_reg.h" + +struct drm_i915_private; + +void i915_hwmon_register(struct drm_i915_private *i915); +void i915_hwmon_unregister(struct drm_i915_private *i915); + +#endif /* __I915_HWMON_H__ */ -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-18 19:38 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar @ 2022-08-19 10:35 ` Jani Nikula 2022-08-19 11:41 ` Guenter Roeck 2022-08-23 8:42 ` Nilawar, Badal 2022-08-19 10:37 ` Jani Nikula 1 sibling, 2 replies; 54+ messages in thread From: Jani Nikula @ 2022-08-19 10:35 UTC (permalink / raw) To: Badal Nilawar, intel-gfx; +Cc: linux-hwmon, linux On Fri, 19 Aug 2022, Badal Nilawar <badal.nilawar@intel.com> wrote: > From: Dale B Stimson <dale.b.stimson@intel.com> > > The i915 HWMON module will be used to expose voltage, power and energy > values for dGfx. Here we set up i915 hwmon infrastructure including i915 > hwmon registration, basic data structures and functions. > > v2: > - Create HWMON infra patch (Ashutosh) > - Fixed review comments (Jani) > - Remove "select HWMON" from i915/Kconfig (Jani) > v3: Use hwm_ prefix for static functions (Ashutosh) > v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former > doesn't work if hwmon is compiled as a module (Guenter) Is this really what we want to do? In my books, it's a misconfiguration to have CONFIG_HWMON=m with CONFIG_DRM_I915=y. That's really the problematic combo, not just CONFIG_HWMON=m, right? Why do we allow it at the kconfig level, and then have ugly hacks around it at the code level? Especially as CONFIG_DRM_I915=y should really be thought of as a corner case. So why not do this in i915 Kconfig: config DRM_I915 ... depends on HWMON || HWMON=n Which rejects the CONFIG_HWMON=m && CONFIG_DRM_I915=y combo. > > Cc: Guenter Roeck <linux@roeck-us.net> > Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Signed-off-by: Riana Tauro <riana.tauro@intel.com> > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> > --- > drivers/gpu/drm/i915/Makefile | 3 + > drivers/gpu/drm/i915/i915_driver.c | 7 ++ > drivers/gpu/drm/i915/i915_drv.h | 2 + > drivers/gpu/drm/i915/i915_hwmon.c | 135 +++++++++++++++++++++++++++++ > drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ > 5 files changed, 167 insertions(+) > create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c > create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index 522ef9b4aff3..2b235f747490 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -208,6 +208,9 @@ i915-y += gt/uc/intel_uc.o \ > # graphics system controller (GSC) support > i915-y += gt/intel_gsc.o > > +# graphics hardware monitoring (HWMON) support > +i915-$(CONFIG_HWMON) += i915_hwmon.o Moreover, this builds i915_hwmon.o as part of i915.ko (or kernel as it's builtin) even if we can't use it! BR, Jani. > + > # modesetting core code > i915-y += \ > display/hsw_ips.o \ > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c > index deb8a8b76965..62340cd01dde 100644 > --- a/drivers/gpu/drm/i915/i915_driver.c > +++ b/drivers/gpu/drm/i915/i915_driver.c > @@ -80,6 +80,7 @@ > #include "i915_drm_client.h" > #include "i915_drv.h" > #include "i915_getparam.h" > +#include "i915_hwmon.h" > #include "i915_ioc32.h" > #include "i915_ioctl.h" > #include "i915_irq.h" > @@ -736,6 +737,9 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) > > intel_gt_driver_register(to_gt(dev_priv)); > > +#if IS_REACHABLE(CONFIG_HWMON) > + i915_hwmon_register(dev_priv); > +#endif > intel_display_driver_register(dev_priv); > > intel_power_domains_enable(dev_priv); > @@ -762,6 +766,9 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) > > intel_display_driver_unregister(dev_priv); > > +#if IS_REACHABLE(CONFIG_HWMON) > + i915_hwmon_unregister(dev_priv); > +#endif > intel_gt_driver_unregister(to_gt(dev_priv)); > > i915_perf_unregister(dev_priv); > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 086bbe8945d6..d437d588dec9 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -705,6 +705,8 @@ struct drm_i915_private { > > struct i915_perf perf; > > + struct i915_hwmon *hwmon; > + > /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ > struct intel_gt gt0; > > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > new file mode 100644 > index 000000000000..5b80a0f024f0 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.c > @@ -0,0 +1,135 @@ > +// SPDX-License-Identifier: MIT > +/* > + * Copyright © 2022 Intel Corporation > + */ > + > +#include <linux/hwmon.h> > +#include <linux/hwmon-sysfs.h> > +#include <linux/types.h> > + > +#include "i915_drv.h" > +#include "i915_hwmon.h" > +#include "intel_mchbar_regs.h" > + > +struct hwm_reg { > +}; > + > +struct hwm_drvdata { > + struct i915_hwmon *hwmon; > + struct intel_uncore *uncore; > + struct device *hwmon_dev; > + char name[12]; > +}; > + > +struct i915_hwmon { > + struct hwm_drvdata ddat; > + struct mutex hwmon_lock; /* counter overflow logic and rmw */ > + struct hwm_reg rg; > +}; > + > +static const struct hwmon_channel_info *hwm_info[] = { > + NULL > +}; > + > +static umode_t > +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > + u32 attr, int channel) > +{ > + switch (type) { > + default: > + return 0; > + } > +} > + > +static int > +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long *val) > +{ > + switch (type) { > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static int > +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long val) > +{ > + switch (type) { > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static const struct hwmon_ops hwm_ops = { > + .is_visible = hwm_is_visible, > + .read = hwm_read, > + .write = hwm_write, > +}; > + > +static const struct hwmon_chip_info hwm_chip_info = { > + .ops = &hwm_ops, > + .info = hwm_info, > +}; > + > +static void > +hwm_get_preregistration_info(struct drm_i915_private *i915) > +{ > +} > + > +void i915_hwmon_register(struct drm_i915_private *i915) > +{ > + struct device *dev = i915->drm.dev; > + struct i915_hwmon *hwmon; > + struct device *hwmon_dev; > + struct hwm_drvdata *ddat; > + > + /* hwmon is available only for dGfx */ > + if (!IS_DGFX(i915)) > + return; > + > + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); > + if (!hwmon) > + return; > + > + i915->hwmon = hwmon; > + mutex_init(&hwmon->hwmon_lock); > + ddat = &hwmon->ddat; > + > + ddat->hwmon = hwmon; > + ddat->uncore = &i915->uncore; > + snprintf(ddat->name, sizeof(ddat->name), "i915"); > + > + hwm_get_preregistration_info(i915); > + > + /* hwmon_dev points to device hwmon<i> */ > + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, > + ddat, > + &hwm_chip_info, > + NULL); > + if (IS_ERR(hwmon_dev)) { > + mutex_destroy(&hwmon->hwmon_lock); > + i915->hwmon = NULL; > + kfree(hwmon); > + return; > + } > + > + ddat->hwmon_dev = hwmon_dev; > +} > + > +void i915_hwmon_unregister(struct drm_i915_private *i915) > +{ > + struct i915_hwmon *hwmon; > + struct hwm_drvdata *ddat; > + > + hwmon = fetch_and_zero(&i915->hwmon); > + if (!hwmon) > + return; > + > + ddat = &hwmon->ddat; > + if (ddat->hwmon_dev) > + hwmon_device_unregister(ddat->hwmon_dev); > + > + mutex_destroy(&hwmon->hwmon_lock); > + kfree(hwmon); > +} > diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h > new file mode 100644 > index 000000000000..921ae76099d3 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.h > @@ -0,0 +1,20 @@ > +/* SPDX-License-Identifier: MIT */ > + > +/* > + * Copyright © 2022 Intel Corporation > + */ > + > +#ifndef __I915_HWMON_H__ > +#define __I915_HWMON_H__ > + > +#include <linux/device.h> > +#include <linux/mutex.h> > +#include <linux/types.h> > +#include "i915_reg.h" > + > +struct drm_i915_private; > + > +void i915_hwmon_register(struct drm_i915_private *i915); > +void i915_hwmon_unregister(struct drm_i915_private *i915); > + > +#endif /* __I915_HWMON_H__ */ -- Jani Nikula, Intel Open Source Graphics Center ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-19 10:35 ` Jani Nikula @ 2022-08-19 11:41 ` Guenter Roeck 2022-08-23 8:42 ` Nilawar, Badal 1 sibling, 0 replies; 54+ messages in thread From: Guenter Roeck @ 2022-08-19 11:41 UTC (permalink / raw) To: Jani Nikula; +Cc: linux-hwmon, intel-gfx On Fri, Aug 19, 2022 at 01:35:52PM +0300, Jani Nikula wrote: > On Fri, 19 Aug 2022, Badal Nilawar <badal.nilawar@intel.com> wrote: > > From: Dale B Stimson <dale.b.stimson@intel.com> > > > > The i915 HWMON module will be used to expose voltage, power and energy > > values for dGfx. Here we set up i915 hwmon infrastructure including i915 > > hwmon registration, basic data structures and functions. > > > > v2: > > - Create HWMON infra patch (Ashutosh) > > - Fixed review comments (Jani) > > - Remove "select HWMON" from i915/Kconfig (Jani) > > v3: Use hwm_ prefix for static functions (Ashutosh) > > v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former > > doesn't work if hwmon is compiled as a module (Guenter) > > Is this really what we want to do? > > In my books, it's a misconfiguration to have CONFIG_HWMON=m with > CONFIG_DRM_I915=y. That's really the problematic combo, not just > CONFIG_HWMON=m, right? Why do we allow it at the kconfig level, and then > have ugly hacks around it at the code level? Especially as > CONFIG_DRM_I915=y should really be thought of as a corner case. > > So why not do this in i915 Kconfig: > > config DRM_I915 > ... > depends on HWMON || HWMON=n > Ok with me, but not my call to make. The ifdef should then use IS_ENABLED(), though. Guenter > Which rejects the CONFIG_HWMON=m && CONFIG_DRM_I915=y combo. > > > > > Cc: Guenter Roeck <linux@roeck-us.net> > > Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> > > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > > Signed-off-by: Riana Tauro <riana.tauro@intel.com> > > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> > > --- > > drivers/gpu/drm/i915/Makefile | 3 + > > drivers/gpu/drm/i915/i915_driver.c | 7 ++ > > drivers/gpu/drm/i915/i915_drv.h | 2 + > > drivers/gpu/drm/i915/i915_hwmon.c | 135 +++++++++++++++++++++++++++++ > > drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ > > 5 files changed, 167 insertions(+) > > create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c > > create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h > > > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > > index 522ef9b4aff3..2b235f747490 100644 > > --- a/drivers/gpu/drm/i915/Makefile > > +++ b/drivers/gpu/drm/i915/Makefile > > @@ -208,6 +208,9 @@ i915-y += gt/uc/intel_uc.o \ > > # graphics system controller (GSC) support > > i915-y += gt/intel_gsc.o > > > > +# graphics hardware monitoring (HWMON) support > > +i915-$(CONFIG_HWMON) += i915_hwmon.o > > Moreover, this builds i915_hwmon.o as part of i915.ko (or kernel as it's > builtin) even if we can't use it! > > > BR, > Jani. > > > > + > > # modesetting core code > > i915-y += \ > > display/hsw_ips.o \ > > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c > > index deb8a8b76965..62340cd01dde 100644 > > --- a/drivers/gpu/drm/i915/i915_driver.c > > +++ b/drivers/gpu/drm/i915/i915_driver.c > > @@ -80,6 +80,7 @@ > > #include "i915_drm_client.h" > > #include "i915_drv.h" > > #include "i915_getparam.h" > > +#include "i915_hwmon.h" > > #include "i915_ioc32.h" > > #include "i915_ioctl.h" > > #include "i915_irq.h" > > @@ -736,6 +737,9 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) > > > > intel_gt_driver_register(to_gt(dev_priv)); > > > > +#if IS_REACHABLE(CONFIG_HWMON) > > + i915_hwmon_register(dev_priv); > > +#endif > > intel_display_driver_register(dev_priv); > > > > intel_power_domains_enable(dev_priv); > > @@ -762,6 +766,9 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) > > > > intel_display_driver_unregister(dev_priv); > > > > +#if IS_REACHABLE(CONFIG_HWMON) > > + i915_hwmon_unregister(dev_priv); > > +#endif > > intel_gt_driver_unregister(to_gt(dev_priv)); > > > > i915_perf_unregister(dev_priv); > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > > index 086bbe8945d6..d437d588dec9 100644 > > --- a/drivers/gpu/drm/i915/i915_drv.h > > +++ b/drivers/gpu/drm/i915/i915_drv.h > > @@ -705,6 +705,8 @@ struct drm_i915_private { > > > > struct i915_perf perf; > > > > + struct i915_hwmon *hwmon; > > + > > /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ > > struct intel_gt gt0; > > > > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > > new file mode 100644 > > index 000000000000..5b80a0f024f0 > > --- /dev/null > > +++ b/drivers/gpu/drm/i915/i915_hwmon.c > > @@ -0,0 +1,135 @@ > > +// SPDX-License-Identifier: MIT > > +/* > > + * Copyright © 2022 Intel Corporation > > + */ > > + > > +#include <linux/hwmon.h> > > +#include <linux/hwmon-sysfs.h> > > +#include <linux/types.h> > > + > > +#include "i915_drv.h" > > +#include "i915_hwmon.h" > > +#include "intel_mchbar_regs.h" > > + > > +struct hwm_reg { > > +}; > > + > > +struct hwm_drvdata { > > + struct i915_hwmon *hwmon; > > + struct intel_uncore *uncore; > > + struct device *hwmon_dev; > > + char name[12]; > > +}; > > + > > +struct i915_hwmon { > > + struct hwm_drvdata ddat; > > + struct mutex hwmon_lock; /* counter overflow logic and rmw */ > > + struct hwm_reg rg; > > +}; > > + > > +static const struct hwmon_channel_info *hwm_info[] = { > > + NULL > > +}; > > + > > +static umode_t > > +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > > + u32 attr, int channel) > > +{ > > + switch (type) { > > + default: > > + return 0; > > + } > > +} > > + > > +static int > > +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, > > + int channel, long *val) > > +{ > > + switch (type) { > > + default: > > + return -EOPNOTSUPP; > > + } > > +} > > + > > +static int > > +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, > > + int channel, long val) > > +{ > > + switch (type) { > > + default: > > + return -EOPNOTSUPP; > > + } > > +} > > + > > +static const struct hwmon_ops hwm_ops = { > > + .is_visible = hwm_is_visible, > > + .read = hwm_read, > > + .write = hwm_write, > > +}; > > + > > +static const struct hwmon_chip_info hwm_chip_info = { > > + .ops = &hwm_ops, > > + .info = hwm_info, > > +}; > > + > > +static void > > +hwm_get_preregistration_info(struct drm_i915_private *i915) > > +{ > > +} > > + > > +void i915_hwmon_register(struct drm_i915_private *i915) > > +{ > > + struct device *dev = i915->drm.dev; > > + struct i915_hwmon *hwmon; > > + struct device *hwmon_dev; > > + struct hwm_drvdata *ddat; > > + > > + /* hwmon is available only for dGfx */ > > + if (!IS_DGFX(i915)) > > + return; > > + > > + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); > > + if (!hwmon) > > + return; > > + > > + i915->hwmon = hwmon; > > + mutex_init(&hwmon->hwmon_lock); > > + ddat = &hwmon->ddat; > > + > > + ddat->hwmon = hwmon; > > + ddat->uncore = &i915->uncore; > > + snprintf(ddat->name, sizeof(ddat->name), "i915"); > > + > > + hwm_get_preregistration_info(i915); > > + > > + /* hwmon_dev points to device hwmon<i> */ > > + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, > > + ddat, > > + &hwm_chip_info, > > + NULL); > > + if (IS_ERR(hwmon_dev)) { > > + mutex_destroy(&hwmon->hwmon_lock); > > + i915->hwmon = NULL; > > + kfree(hwmon); > > + return; > > + } > > + > > + ddat->hwmon_dev = hwmon_dev; > > +} > > + > > +void i915_hwmon_unregister(struct drm_i915_private *i915) > > +{ > > + struct i915_hwmon *hwmon; > > + struct hwm_drvdata *ddat; > > + > > + hwmon = fetch_and_zero(&i915->hwmon); > > + if (!hwmon) > > + return; > > + > > + ddat = &hwmon->ddat; > > + if (ddat->hwmon_dev) > > + hwmon_device_unregister(ddat->hwmon_dev); > > + > > + mutex_destroy(&hwmon->hwmon_lock); > > + kfree(hwmon); > > +} > > diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h > > new file mode 100644 > > index 000000000000..921ae76099d3 > > --- /dev/null > > +++ b/drivers/gpu/drm/i915/i915_hwmon.h > > @@ -0,0 +1,20 @@ > > +/* SPDX-License-Identifier: MIT */ > > + > > +/* > > + * Copyright © 2022 Intel Corporation > > + */ > > + > > +#ifndef __I915_HWMON_H__ > > +#define __I915_HWMON_H__ > > + > > +#include <linux/device.h> > > +#include <linux/mutex.h> > > +#include <linux/types.h> > > +#include "i915_reg.h" > > + > > +struct drm_i915_private; > > + > > +void i915_hwmon_register(struct drm_i915_private *i915); > > +void i915_hwmon_unregister(struct drm_i915_private *i915); > > + > > +#endif /* __I915_HWMON_H__ */ > > -- > Jani Nikula, Intel Open Source Graphics Center ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-19 10:35 ` Jani Nikula 2022-08-19 11:41 ` Guenter Roeck @ 2022-08-23 8:42 ` Nilawar, Badal 2022-08-23 9:46 ` Jani Nikula 1 sibling, 1 reply; 54+ messages in thread From: Nilawar, Badal @ 2022-08-23 8:42 UTC (permalink / raw) To: Jani Nikula, intel-gfx; +Cc: linux-hwmon, linux On 19-08-2022 16:05, Jani Nikula wrote: > On Fri, 19 Aug 2022, Badal Nilawar <badal.nilawar@intel.com> wrote: >> From: Dale B Stimson <dale.b.stimson@intel.com> >> >> The i915 HWMON module will be used to expose voltage, power and energy >> values for dGfx. Here we set up i915 hwmon infrastructure including i915 >> hwmon registration, basic data structures and functions. >> >> v2: >> - Create HWMON infra patch (Ashutosh) >> - Fixed review comments (Jani) >> - Remove "select HWMON" from i915/Kconfig (Jani) >> v3: Use hwm_ prefix for static functions (Ashutosh) >> v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former >> doesn't work if hwmon is compiled as a module (Guenter) > > Is this really what we want to do? > > In my books, it's a misconfiguration to have CONFIG_HWMON=m with > CONFIG_DRM_I915=y. That's really the problematic combo, not just > CONFIG_HWMON=m, right? Why do we allow it at the kconfig level, and then > have ugly hacks around it at the code level? Especially as > CONFIG_DRM_I915=y should really be thought of as a corner case. > > So why not do this in i915 Kconfig: > > config DRM_I915 > ... > depends on HWMON || HWMON=n With this change I am getting recursive dependancy error when I run make oldconfig badal@bnilawar-desk1:~/workspace/wp3/drm-tip$ make oldconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o HOSTCC scripts/kconfig/confdata.o HOSTCC scripts/kconfig/expr.o LEX scripts/kconfig/lexer.lex.c YACC scripts/kconfig/parser.tab.[ch] HOSTCC scripts/kconfig/lexer.lex.o HOSTCC scripts/kconfig/menu.o HOSTCC scripts/kconfig/parser.tab.o HOSTCC scripts/kconfig/preprocess.o HOSTCC scripts/kconfig/symbol.o HOSTCC scripts/kconfig/util.o HOSTLD scripts/kconfig/conf drivers/gpu/drm/i915/Kconfig:2:error: recursive dependency detected! drivers/gpu/drm/i915/Kconfig:2: symbol DRM_I915 depends on HWMON drivers/hwmon/Kconfig:6: symbol HWMON is selected by EEEPC_LAPTOP drivers/platform/x86/Kconfig:332: symbol EEEPC_LAPTOP depends on INPUT drivers/input/Kconfig:8: symbol INPUT is selected by DRM_I915 For a resolution refer to Documentation/kbuild/kconfig-language.rst subsection "Kconfig recursive dependency limitations" make[1]: *** [scripts/kconfig/Makefile:77: oldconfig] Error 1 make: *** [Makefile:632: oldconfig] Error 2 > > Which rejects the CONFIG_HWMON=m && CONFIG_DRM_I915=y combo. > >> >> Cc: Guenter Roeck <linux@roeck-us.net> >> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> >> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> >> Signed-off-by: Riana Tauro <riana.tauro@intel.com> >> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> >> --- >> drivers/gpu/drm/i915/Makefile | 3 + >> drivers/gpu/drm/i915/i915_driver.c | 7 ++ >> drivers/gpu/drm/i915/i915_drv.h | 2 + >> drivers/gpu/drm/i915/i915_hwmon.c | 135 +++++++++++++++++++++++++++++ >> drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ >> 5 files changed, 167 insertions(+) >> create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c >> create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h >> >> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile >> index 522ef9b4aff3..2b235f747490 100644 >> --- a/drivers/gpu/drm/i915/Makefile >> +++ b/drivers/gpu/drm/i915/Makefile >> @@ -208,6 +208,9 @@ i915-y += gt/uc/intel_uc.o \ >> # graphics system controller (GSC) support >> i915-y += gt/intel_gsc.o >> >> +# graphics hardware monitoring (HWMON) support >> +i915-$(CONFIG_HWMON) += i915_hwmon.o > > Moreover, this builds i915_hwmon.o as part of i915.ko (or kernel as it's > builtin) even if we can't use it! For CONFIG_HWMON=m && CONFIG_DRM_I915=y combo i915_hwmon.o didn't get build. It is only getting build for below combos CONFIG_HWMON=m && CONFIG_DRM_I915=y CONFIG_HWMON=m && CONFIG_DRM_I915=m CONFIG_HWMON=y && CONFIG_DRM_I915=m Regards, Badal > > > BR, > Jani. > > >> + >> # modesetting core code >> i915-y += \ >> display/hsw_ips.o \ >> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c >> index deb8a8b76965..62340cd01dde 100644 >> --- a/drivers/gpu/drm/i915/i915_driver.c >> +++ b/drivers/gpu/drm/i915/i915_driver.c >> @@ -80,6 +80,7 @@ >> #include "i915_drm_client.h" >> #include "i915_drv.h" >> #include "i915_getparam.h" >> +#include "i915_hwmon.h" >> #include "i915_ioc32.h" >> #include "i915_ioctl.h" >> #include "i915_irq.h" >> @@ -736,6 +737,9 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) >> >> intel_gt_driver_register(to_gt(dev_priv)); >> >> +#if IS_REACHABLE(CONFIG_HWMON) >> + i915_hwmon_register(dev_priv); >> +#endif >> intel_display_driver_register(dev_priv); >> >> intel_power_domains_enable(dev_priv); >> @@ -762,6 +766,9 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) >> >> intel_display_driver_unregister(dev_priv); >> >> +#if IS_REACHABLE(CONFIG_HWMON) >> + i915_hwmon_unregister(dev_priv); >> +#endif >> intel_gt_driver_unregister(to_gt(dev_priv)); >> >> i915_perf_unregister(dev_priv); >> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h >> index 086bbe8945d6..d437d588dec9 100644 >> --- a/drivers/gpu/drm/i915/i915_drv.h >> +++ b/drivers/gpu/drm/i915/i915_drv.h >> @@ -705,6 +705,8 @@ struct drm_i915_private { >> >> struct i915_perf perf; >> >> + struct i915_hwmon *hwmon; >> + >> /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ >> struct intel_gt gt0; >> >> diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c >> new file mode 100644 >> index 000000000000..5b80a0f024f0 >> --- /dev/null >> +++ b/drivers/gpu/drm/i915/i915_hwmon.c >> @@ -0,0 +1,135 @@ >> +// SPDX-License-Identifier: MIT >> +/* >> + * Copyright © 2022 Intel Corporation >> + */ >> + >> +#include <linux/hwmon.h> >> +#include <linux/hwmon-sysfs.h> >> +#include <linux/types.h> >> + >> +#include "i915_drv.h" >> +#include "i915_hwmon.h" >> +#include "intel_mchbar_regs.h" >> + >> +struct hwm_reg { >> +}; >> + >> +struct hwm_drvdata { >> + struct i915_hwmon *hwmon; >> + struct intel_uncore *uncore; >> + struct device *hwmon_dev; >> + char name[12]; >> +}; >> + >> +struct i915_hwmon { >> + struct hwm_drvdata ddat; >> + struct mutex hwmon_lock; /* counter overflow logic and rmw */ >> + struct hwm_reg rg; >> +}; >> + >> +static const struct hwmon_channel_info *hwm_info[] = { >> + NULL >> +}; >> + >> +static umode_t >> +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, >> + u32 attr, int channel) >> +{ >> + switch (type) { >> + default: >> + return 0; >> + } >> +} >> + >> +static int >> +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, >> + int channel, long *val) >> +{ >> + switch (type) { >> + default: >> + return -EOPNOTSUPP; >> + } >> +} >> + >> +static int >> +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, >> + int channel, long val) >> +{ >> + switch (type) { >> + default: >> + return -EOPNOTSUPP; >> + } >> +} >> + >> +static const struct hwmon_ops hwm_ops = { >> + .is_visible = hwm_is_visible, >> + .read = hwm_read, >> + .write = hwm_write, >> +}; >> + >> +static const struct hwmon_chip_info hwm_chip_info = { >> + .ops = &hwm_ops, >> + .info = hwm_info, >> +}; >> + >> +static void >> +hwm_get_preregistration_info(struct drm_i915_private *i915) >> +{ >> +} >> + >> +void i915_hwmon_register(struct drm_i915_private *i915) >> +{ >> + struct device *dev = i915->drm.dev; >> + struct i915_hwmon *hwmon; >> + struct device *hwmon_dev; >> + struct hwm_drvdata *ddat; >> + >> + /* hwmon is available only for dGfx */ >> + if (!IS_DGFX(i915)) >> + return; >> + >> + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); >> + if (!hwmon) >> + return; >> + >> + i915->hwmon = hwmon; >> + mutex_init(&hwmon->hwmon_lock); >> + ddat = &hwmon->ddat; >> + >> + ddat->hwmon = hwmon; >> + ddat->uncore = &i915->uncore; >> + snprintf(ddat->name, sizeof(ddat->name), "i915"); >> + >> + hwm_get_preregistration_info(i915); >> + >> + /* hwmon_dev points to device hwmon<i> */ >> + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, >> + ddat, >> + &hwm_chip_info, >> + NULL); >> + if (IS_ERR(hwmon_dev)) { >> + mutex_destroy(&hwmon->hwmon_lock); >> + i915->hwmon = NULL; >> + kfree(hwmon); >> + return; >> + } >> + >> + ddat->hwmon_dev = hwmon_dev; >> +} >> + >> +void i915_hwmon_unregister(struct drm_i915_private *i915) >> +{ >> + struct i915_hwmon *hwmon; >> + struct hwm_drvdata *ddat; >> + >> + hwmon = fetch_and_zero(&i915->hwmon); >> + if (!hwmon) >> + return; >> + >> + ddat = &hwmon->ddat; >> + if (ddat->hwmon_dev) >> + hwmon_device_unregister(ddat->hwmon_dev); >> + >> + mutex_destroy(&hwmon->hwmon_lock); >> + kfree(hwmon); >> +} >> diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h >> new file mode 100644 >> index 000000000000..921ae76099d3 >> --- /dev/null >> +++ b/drivers/gpu/drm/i915/i915_hwmon.h >> @@ -0,0 +1,20 @@ >> +/* SPDX-License-Identifier: MIT */ >> + >> +/* >> + * Copyright © 2022 Intel Corporation >> + */ >> + >> +#ifndef __I915_HWMON_H__ >> +#define __I915_HWMON_H__ >> + >> +#include <linux/device.h> >> +#include <linux/mutex.h> >> +#include <linux/types.h> >> +#include "i915_reg.h" >> + >> +struct drm_i915_private; >> + >> +void i915_hwmon_register(struct drm_i915_private *i915); >> +void i915_hwmon_unregister(struct drm_i915_private *i915); >> + >> +#endif /* __I915_HWMON_H__ */ > ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-23 8:42 ` Nilawar, Badal @ 2022-08-23 9:46 ` Jani Nikula 2022-08-23 12:19 ` Guenter Roeck 0 siblings, 1 reply; 54+ messages in thread From: Jani Nikula @ 2022-08-23 9:46 UTC (permalink / raw) To: Nilawar, Badal, intel-gfx; +Cc: linux-hwmon, linux On Tue, 23 Aug 2022, "Nilawar, Badal" <badal.nilawar@intel.com> wrote: > On 19-08-2022 16:05, Jani Nikula wrote: >> On Fri, 19 Aug 2022, Badal Nilawar <badal.nilawar@intel.com> wrote: >>> From: Dale B Stimson <dale.b.stimson@intel.com> >>> >>> The i915 HWMON module will be used to expose voltage, power and energy >>> values for dGfx. Here we set up i915 hwmon infrastructure including i915 >>> hwmon registration, basic data structures and functions. >>> >>> v2: >>> - Create HWMON infra patch (Ashutosh) >>> - Fixed review comments (Jani) >>> - Remove "select HWMON" from i915/Kconfig (Jani) >>> v3: Use hwm_ prefix for static functions (Ashutosh) >>> v4: s/#ifdef CONFIG_HWMON/#if IS_REACHABLE(CONFIG_HWMON)/ since the former >>> doesn't work if hwmon is compiled as a module (Guenter) >> >> Is this really what we want to do? >> >> In my books, it's a misconfiguration to have CONFIG_HWMON=m with >> CONFIG_DRM_I915=y. That's really the problematic combo, not just >> CONFIG_HWMON=m, right? Why do we allow it at the kconfig level, and then >> have ugly hacks around it at the code level? Especially as >> CONFIG_DRM_I915=y should really be thought of as a corner case. >> >> So why not do this in i915 Kconfig: >> >> config DRM_I915 >> ... >> depends on HWMON || HWMON=n > With this change I am getting recursive dependancy error when I run make > oldconfig > > badal@bnilawar-desk1:~/workspace/wp3/drm-tip$ make oldconfig > HOSTCC scripts/basic/fixdep > HOSTCC scripts/kconfig/conf.o > HOSTCC scripts/kconfig/confdata.o > HOSTCC scripts/kconfig/expr.o > LEX scripts/kconfig/lexer.lex.c > YACC scripts/kconfig/parser.tab.[ch] > HOSTCC scripts/kconfig/lexer.lex.o > HOSTCC scripts/kconfig/menu.o > HOSTCC scripts/kconfig/parser.tab.o > HOSTCC scripts/kconfig/preprocess.o > HOSTCC scripts/kconfig/symbol.o > HOSTCC scripts/kconfig/util.o > HOSTLD scripts/kconfig/conf > drivers/gpu/drm/i915/Kconfig:2:error: recursive dependency detected! > drivers/gpu/drm/i915/Kconfig:2: symbol DRM_I915 depends on HWMON > drivers/hwmon/Kconfig:6: symbol HWMON is selected by EEEPC_LAPTOP > drivers/platform/x86/Kconfig:332: symbol EEEPC_LAPTOP depends on INPUT > drivers/input/Kconfig:8: symbol INPUT is selected by DRM_I915 > For a resolution refer to Documentation/kbuild/kconfig-language.rst > subsection "Kconfig recursive dependency limitations" *sigh* Note: select should be used with care. select will force a symbol to a value without visiting the dependencies. By abusing select you are able to select a symbol FOO even if FOO depends on BAR that is not set. In general use select only for non-visible symbols (no prompts anywhere) and for symbols with no dependencies. That will limit the usefulness but on the other hand avoid the illegal configurations all over. One day someone's going to need to fix menuconfig to first start complaining about selecting stuff that shouldn't be selected, and then eventually refusing to select stuff that shouldn't be selected. This is an endless whack-a-mole, preventing people from adding reasonable dependencies. BR, Jani. > > make[1]: *** [scripts/kconfig/Makefile:77: oldconfig] Error 1 > make: *** [Makefile:632: oldconfig] Error 2 > > >> >> Which rejects the CONFIG_HWMON=m && CONFIG_DRM_I915=y combo. >> >>> >>> Cc: Guenter Roeck <linux@roeck-us.net> >>> Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> >>> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> >>> Signed-off-by: Riana Tauro <riana.tauro@intel.com> >>> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> >>> --- >>> drivers/gpu/drm/i915/Makefile | 3 + >>> drivers/gpu/drm/i915/i915_driver.c | 7 ++ >>> drivers/gpu/drm/i915/i915_drv.h | 2 + >>> drivers/gpu/drm/i915/i915_hwmon.c | 135 +++++++++++++++++++++++++++++ >>> drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ >>> 5 files changed, 167 insertions(+) >>> create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c >>> create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h >>> >>> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile >>> index 522ef9b4aff3..2b235f747490 100644 >>> --- a/drivers/gpu/drm/i915/Makefile >>> +++ b/drivers/gpu/drm/i915/Makefile >>> @@ -208,6 +208,9 @@ i915-y += gt/uc/intel_uc.o \ >>> # graphics system controller (GSC) support >>> i915-y += gt/intel_gsc.o >>> >>> +# graphics hardware monitoring (HWMON) support >>> +i915-$(CONFIG_HWMON) += i915_hwmon.o >> >> Moreover, this builds i915_hwmon.o as part of i915.ko (or kernel as it's >> builtin) even if we can't use it! > For CONFIG_HWMON=m && CONFIG_DRM_I915=y combo i915_hwmon.o didn't get > build. It is only getting build for below combos > CONFIG_HWMON=m && CONFIG_DRM_I915=y > CONFIG_HWMON=m && CONFIG_DRM_I915=m > CONFIG_HWMON=y && CONFIG_DRM_I915=m > > Regards, > Badal >> >> >> BR, >> Jani. >> >> >>> + >>> # modesetting core code >>> i915-y += \ >>> display/hsw_ips.o \ >>> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c >>> index deb8a8b76965..62340cd01dde 100644 >>> --- a/drivers/gpu/drm/i915/i915_driver.c >>> +++ b/drivers/gpu/drm/i915/i915_driver.c >>> @@ -80,6 +80,7 @@ >>> #include "i915_drm_client.h" >>> #include "i915_drv.h" >>> #include "i915_getparam.h" >>> +#include "i915_hwmon.h" >>> #include "i915_ioc32.h" >>> #include "i915_ioctl.h" >>> #include "i915_irq.h" >>> @@ -736,6 +737,9 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) >>> >>> intel_gt_driver_register(to_gt(dev_priv)); >>> >>> +#if IS_REACHABLE(CONFIG_HWMON) >>> + i915_hwmon_register(dev_priv); >>> +#endif >>> intel_display_driver_register(dev_priv); >>> >>> intel_power_domains_enable(dev_priv); >>> @@ -762,6 +766,9 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) >>> >>> intel_display_driver_unregister(dev_priv); >>> >>> +#if IS_REACHABLE(CONFIG_HWMON) >>> + i915_hwmon_unregister(dev_priv); >>> +#endif >>> intel_gt_driver_unregister(to_gt(dev_priv)); >>> >>> i915_perf_unregister(dev_priv); >>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h >>> index 086bbe8945d6..d437d588dec9 100644 >>> --- a/drivers/gpu/drm/i915/i915_drv.h >>> +++ b/drivers/gpu/drm/i915/i915_drv.h >>> @@ -705,6 +705,8 @@ struct drm_i915_private { >>> >>> struct i915_perf perf; >>> >>> + struct i915_hwmon *hwmon; >>> + >>> /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ >>> struct intel_gt gt0; >>> >>> diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c >>> new file mode 100644 >>> index 000000000000..5b80a0f024f0 >>> --- /dev/null >>> +++ b/drivers/gpu/drm/i915/i915_hwmon.c >>> @@ -0,0 +1,135 @@ >>> +// SPDX-License-Identifier: MIT >>> +/* >>> + * Copyright © 2022 Intel Corporation >>> + */ >>> + >>> +#include <linux/hwmon.h> >>> +#include <linux/hwmon-sysfs.h> >>> +#include <linux/types.h> >>> + >>> +#include "i915_drv.h" >>> +#include "i915_hwmon.h" >>> +#include "intel_mchbar_regs.h" >>> + >>> +struct hwm_reg { >>> +}; >>> + >>> +struct hwm_drvdata { >>> + struct i915_hwmon *hwmon; >>> + struct intel_uncore *uncore; >>> + struct device *hwmon_dev; >>> + char name[12]; >>> +}; >>> + >>> +struct i915_hwmon { >>> + struct hwm_drvdata ddat; >>> + struct mutex hwmon_lock; /* counter overflow logic and rmw */ >>> + struct hwm_reg rg; >>> +}; >>> + >>> +static const struct hwmon_channel_info *hwm_info[] = { >>> + NULL >>> +}; >>> + >>> +static umode_t >>> +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, >>> + u32 attr, int channel) >>> +{ >>> + switch (type) { >>> + default: >>> + return 0; >>> + } >>> +} >>> + >>> +static int >>> +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, >>> + int channel, long *val) >>> +{ >>> + switch (type) { >>> + default: >>> + return -EOPNOTSUPP; >>> + } >>> +} >>> + >>> +static int >>> +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, >>> + int channel, long val) >>> +{ >>> + switch (type) { >>> + default: >>> + return -EOPNOTSUPP; >>> + } >>> +} >>> + >>> +static const struct hwmon_ops hwm_ops = { >>> + .is_visible = hwm_is_visible, >>> + .read = hwm_read, >>> + .write = hwm_write, >>> +}; >>> + >>> +static const struct hwmon_chip_info hwm_chip_info = { >>> + .ops = &hwm_ops, >>> + .info = hwm_info, >>> +}; >>> + >>> +static void >>> +hwm_get_preregistration_info(struct drm_i915_private *i915) >>> +{ >>> +} >>> + >>> +void i915_hwmon_register(struct drm_i915_private *i915) >>> +{ >>> + struct device *dev = i915->drm.dev; >>> + struct i915_hwmon *hwmon; >>> + struct device *hwmon_dev; >>> + struct hwm_drvdata *ddat; >>> + >>> + /* hwmon is available only for dGfx */ >>> + if (!IS_DGFX(i915)) >>> + return; >>> + >>> + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); >>> + if (!hwmon) >>> + return; >>> + >>> + i915->hwmon = hwmon; >>> + mutex_init(&hwmon->hwmon_lock); >>> + ddat = &hwmon->ddat; >>> + >>> + ddat->hwmon = hwmon; >>> + ddat->uncore = &i915->uncore; >>> + snprintf(ddat->name, sizeof(ddat->name), "i915"); >>> + >>> + hwm_get_preregistration_info(i915); >>> + >>> + /* hwmon_dev points to device hwmon<i> */ >>> + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, >>> + ddat, >>> + &hwm_chip_info, >>> + NULL); >>> + if (IS_ERR(hwmon_dev)) { >>> + mutex_destroy(&hwmon->hwmon_lock); >>> + i915->hwmon = NULL; >>> + kfree(hwmon); >>> + return; >>> + } >>> + >>> + ddat->hwmon_dev = hwmon_dev; >>> +} >>> + >>> +void i915_hwmon_unregister(struct drm_i915_private *i915) >>> +{ >>> + struct i915_hwmon *hwmon; >>> + struct hwm_drvdata *ddat; >>> + >>> + hwmon = fetch_and_zero(&i915->hwmon); >>> + if (!hwmon) >>> + return; >>> + >>> + ddat = &hwmon->ddat; >>> + if (ddat->hwmon_dev) >>> + hwmon_device_unregister(ddat->hwmon_dev); >>> + >>> + mutex_destroy(&hwmon->hwmon_lock); >>> + kfree(hwmon); >>> +} >>> diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h >>> new file mode 100644 >>> index 000000000000..921ae76099d3 >>> --- /dev/null >>> +++ b/drivers/gpu/drm/i915/i915_hwmon.h >>> @@ -0,0 +1,20 @@ >>> +/* SPDX-License-Identifier: MIT */ >>> + >>> +/* >>> + * Copyright © 2022 Intel Corporation >>> + */ >>> + >>> +#ifndef __I915_HWMON_H__ >>> +#define __I915_HWMON_H__ >>> + >>> +#include <linux/device.h> >>> +#include <linux/mutex.h> >>> +#include <linux/types.h> >>> +#include "i915_reg.h" >>> + >>> +struct drm_i915_private; >>> + >>> +void i915_hwmon_register(struct drm_i915_private *i915); >>> +void i915_hwmon_unregister(struct drm_i915_private *i915); >>> + >>> +#endif /* __I915_HWMON_H__ */ >> -- Jani Nikula, Intel Open Source Graphics Center ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-23 9:46 ` Jani Nikula @ 2022-08-23 12:19 ` Guenter Roeck 2022-08-23 13:35 ` Jani Nikula 0 siblings, 1 reply; 54+ messages in thread From: Guenter Roeck @ 2022-08-23 12:19 UTC (permalink / raw) To: Jani Nikula; +Cc: linux-hwmon, intel-gfx On Tue, Aug 23, 2022 at 12:46:14PM +0300, Jani Nikula wrote: [ ... ] > >> > >> So why not do this in i915 Kconfig: > >> > >> config DRM_I915 > >> ... > >> depends on HWMON || HWMON=n > > With this change I am getting recursive dependancy error when I run make > > oldconfig > > > > badal@bnilawar-desk1:~/workspace/wp3/drm-tip$ make oldconfig > > HOSTCC scripts/basic/fixdep > > HOSTCC scripts/kconfig/conf.o > > HOSTCC scripts/kconfig/confdata.o > > HOSTCC scripts/kconfig/expr.o > > LEX scripts/kconfig/lexer.lex.c > > YACC scripts/kconfig/parser.tab.[ch] > > HOSTCC scripts/kconfig/lexer.lex.o > > HOSTCC scripts/kconfig/menu.o > > HOSTCC scripts/kconfig/parser.tab.o > > HOSTCC scripts/kconfig/preprocess.o > > HOSTCC scripts/kconfig/symbol.o > > HOSTCC scripts/kconfig/util.o > > HOSTLD scripts/kconfig/conf > > drivers/gpu/drm/i915/Kconfig:2:error: recursive dependency detected! > > drivers/gpu/drm/i915/Kconfig:2: symbol DRM_I915 depends on HWMON > > drivers/hwmon/Kconfig:6: symbol HWMON is selected by EEEPC_LAPTOP > > drivers/platform/x86/Kconfig:332: symbol EEEPC_LAPTOP depends on INPUT > > drivers/input/Kconfig:8: symbol INPUT is selected by DRM_I915 > > For a resolution refer to Documentation/kbuild/kconfig-language.rst > > subsection "Kconfig recursive dependency limitations" > > *sigh* > > Note: > select should be used with care. select will force > a symbol to a value without visiting the dependencies. > By abusing select you are able to select a symbol FOO even > if FOO depends on BAR that is not set. > In general use select only for non-visible symbols > (no prompts anywhere) and for symbols with no dependencies. > That will limit the usefulness but on the other hand avoid > the illegal configurations all over. > Agreed. HWMON should not be selected anywhere. Unfortunately it is, and drm is no exception. It is selected by DRM_RADEON and DRM_AMDGPU. Maybe just select it in DRM_I915 as well after all; in practice it won't make a difference. Guenter ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-23 12:19 ` Guenter Roeck @ 2022-08-23 13:35 ` Jani Nikula 2022-08-23 14:28 ` Nilawar, Badal 0 siblings, 1 reply; 54+ messages in thread From: Jani Nikula @ 2022-08-23 13:35 UTC (permalink / raw) To: Guenter Roeck; +Cc: linux-hwmon, intel-gfx On Tue, 23 Aug 2022, Guenter Roeck <linux@roeck-us.net> wrote: > On Tue, Aug 23, 2022 at 12:46:14PM +0300, Jani Nikula wrote: > [ ... ] >> >> >> >> So why not do this in i915 Kconfig: >> >> >> >> config DRM_I915 >> >> ... >> >> depends on HWMON || HWMON=n >> > With this change I am getting recursive dependancy error when I run make >> > oldconfig >> > >> > badal@bnilawar-desk1:~/workspace/wp3/drm-tip$ make oldconfig >> > HOSTCC scripts/basic/fixdep >> > HOSTCC scripts/kconfig/conf.o >> > HOSTCC scripts/kconfig/confdata.o >> > HOSTCC scripts/kconfig/expr.o >> > LEX scripts/kconfig/lexer.lex.c >> > YACC scripts/kconfig/parser.tab.[ch] >> > HOSTCC scripts/kconfig/lexer.lex.o >> > HOSTCC scripts/kconfig/menu.o >> > HOSTCC scripts/kconfig/parser.tab.o >> > HOSTCC scripts/kconfig/preprocess.o >> > HOSTCC scripts/kconfig/symbol.o >> > HOSTCC scripts/kconfig/util.o >> > HOSTLD scripts/kconfig/conf >> > drivers/gpu/drm/i915/Kconfig:2:error: recursive dependency detected! >> > drivers/gpu/drm/i915/Kconfig:2: symbol DRM_I915 depends on HWMON >> > drivers/hwmon/Kconfig:6: symbol HWMON is selected by EEEPC_LAPTOP >> > drivers/platform/x86/Kconfig:332: symbol EEEPC_LAPTOP depends on INPUT >> > drivers/input/Kconfig:8: symbol INPUT is selected by DRM_I915 >> > For a resolution refer to Documentation/kbuild/kconfig-language.rst >> > subsection "Kconfig recursive dependency limitations" >> >> *sigh* >> >> Note: >> select should be used with care. select will force >> a symbol to a value without visiting the dependencies. >> By abusing select you are able to select a symbol FOO even >> if FOO depends on BAR that is not set. >> In general use select only for non-visible symbols >> (no prompts anywhere) and for symbols with no dependencies. >> That will limit the usefulness but on the other hand avoid >> the illegal configurations all over. >> > Agreed. HWMON should not be selected anywhere. Unfortunately it is, and > drm is no exception. It is selected by DRM_RADEON and DRM_AMDGPU. > Maybe just select it in DRM_I915 as well after all; in practice it won't > make a difference. And I guess everyone just does what I'm about to do now, throw my hands up in the air in disgust and resignation. :p BR, Jani. -- Jani Nikula, Intel Open Source Graphics Center ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-23 13:35 ` Jani Nikula @ 2022-08-23 14:28 ` Nilawar, Badal 2022-08-23 14:41 ` Jani Nikula 0 siblings, 1 reply; 54+ messages in thread From: Nilawar, Badal @ 2022-08-23 14:28 UTC (permalink / raw) To: Jani Nikula, Guenter Roeck; +Cc: linux-hwmon, intel-gfx On 23-08-2022 19:05, Jani Nikula wrote: > On Tue, 23 Aug 2022, Guenter Roeck <linux@roeck-us.net> wrote: >> On Tue, Aug 23, 2022 at 12:46:14PM +0300, Jani Nikula wrote: >> [ ... ] >>>>> >>>>> So why not do this in i915 Kconfig: >>>>> >>>>> config DRM_I915 >>>>> ... >>>>> depends on HWMON || HWMON=n >>>> With this change I am getting recursive dependancy error when I run make >>>> oldconfig >>>> >>>> badal@bnilawar-desk1:~/workspace/wp3/drm-tip$ make oldconfig >>>> HOSTCC scripts/basic/fixdep >>>> HOSTCC scripts/kconfig/conf.o >>>> HOSTCC scripts/kconfig/confdata.o >>>> HOSTCC scripts/kconfig/expr.o >>>> LEX scripts/kconfig/lexer.lex.c >>>> YACC scripts/kconfig/parser.tab.[ch] >>>> HOSTCC scripts/kconfig/lexer.lex.o >>>> HOSTCC scripts/kconfig/menu.o >>>> HOSTCC scripts/kconfig/parser.tab.o >>>> HOSTCC scripts/kconfig/preprocess.o >>>> HOSTCC scripts/kconfig/symbol.o >>>> HOSTCC scripts/kconfig/util.o >>>> HOSTLD scripts/kconfig/conf >>>> drivers/gpu/drm/i915/Kconfig:2:error: recursive dependency detected! >>>> drivers/gpu/drm/i915/Kconfig:2: symbol DRM_I915 depends on HWMON >>>> drivers/hwmon/Kconfig:6: symbol HWMON is selected by EEEPC_LAPTOP >>>> drivers/platform/x86/Kconfig:332: symbol EEEPC_LAPTOP depends on INPUT >>>> drivers/input/Kconfig:8: symbol INPUT is selected by DRM_I915 >>>> For a resolution refer to Documentation/kbuild/kconfig-language.rst >>>> subsection "Kconfig recursive dependency limitations" >>> >>> *sigh* >>> >>> Note: >>> select should be used with care. select will force >>> a symbol to a value without visiting the dependencies. >>> By abusing select you are able to select a symbol FOO even >>> if FOO depends on BAR that is not set. >>> In general use select only for non-visible symbols >>> (no prompts anywhere) and for symbols with no dependencies. >>> That will limit the usefulness but on the other hand avoid >>> the illegal configurations all over. >>> >> Agreed. HWMON should not be selected anywhere. Unfortunately it is, and >> drm is no exception. It is selected by DRM_RADEON and DRM_AMDGPU. >> Maybe just select it in DRM_I915 as well after all; in practice it won't >> make a difference. > > And I guess everyone just does what I'm about to do now, throw my hands > up in the air in disgust and resignation. :p How about sticking to existing approach only. In my previous response I mentioned that for combo which we want to reject CONFIG_HWMON=m && CONFIG_DRM_I915=y combo i915_hwmon.o is not getting build. It is only getting build for below combos CONFIG_HWMON=m && CONFIG_DRM_I915=y CONFIG_HWMON=m && CONFIG_DRM_I915=m CONFIG_HWMON=y && CONFIG_DRM_I915=m Regards, Badal > > BR, > Jani. > > > ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-23 14:28 ` Nilawar, Badal @ 2022-08-23 14:41 ` Jani Nikula 2022-08-25 7:27 ` Nilawar, Badal 0 siblings, 1 reply; 54+ messages in thread From: Jani Nikula @ 2022-08-23 14:41 UTC (permalink / raw) To: Nilawar, Badal, Guenter Roeck; +Cc: linux-hwmon, intel-gfx On Tue, 23 Aug 2022, "Nilawar, Badal" <badal.nilawar@intel.com> wrote: > On 23-08-2022 19:05, Jani Nikula wrote: >> On Tue, 23 Aug 2022, Guenter Roeck <linux@roeck-us.net> wrote: >>> On Tue, Aug 23, 2022 at 12:46:14PM +0300, Jani Nikula wrote: >>> [ ... ] >>>>>> >>>>>> So why not do this in i915 Kconfig: >>>>>> >>>>>> config DRM_I915 >>>>>> ... >>>>>> depends on HWMON || HWMON=n >>>>> With this change I am getting recursive dependancy error when I run make >>>>> oldconfig >>>>> >>>>> badal@bnilawar-desk1:~/workspace/wp3/drm-tip$ make oldconfig >>>>> HOSTCC scripts/basic/fixdep >>>>> HOSTCC scripts/kconfig/conf.o >>>>> HOSTCC scripts/kconfig/confdata.o >>>>> HOSTCC scripts/kconfig/expr.o >>>>> LEX scripts/kconfig/lexer.lex.c >>>>> YACC scripts/kconfig/parser.tab.[ch] >>>>> HOSTCC scripts/kconfig/lexer.lex.o >>>>> HOSTCC scripts/kconfig/menu.o >>>>> HOSTCC scripts/kconfig/parser.tab.o >>>>> HOSTCC scripts/kconfig/preprocess.o >>>>> HOSTCC scripts/kconfig/symbol.o >>>>> HOSTCC scripts/kconfig/util.o >>>>> HOSTLD scripts/kconfig/conf >>>>> drivers/gpu/drm/i915/Kconfig:2:error: recursive dependency detected! >>>>> drivers/gpu/drm/i915/Kconfig:2: symbol DRM_I915 depends on HWMON >>>>> drivers/hwmon/Kconfig:6: symbol HWMON is selected by EEEPC_LAPTOP >>>>> drivers/platform/x86/Kconfig:332: symbol EEEPC_LAPTOP depends on INPUT >>>>> drivers/input/Kconfig:8: symbol INPUT is selected by DRM_I915 >>>>> For a resolution refer to Documentation/kbuild/kconfig-language.rst >>>>> subsection "Kconfig recursive dependency limitations" >>>> >>>> *sigh* >>>> >>>> Note: >>>> select should be used with care. select will force >>>> a symbol to a value without visiting the dependencies. >>>> By abusing select you are able to select a symbol FOO even >>>> if FOO depends on BAR that is not set. >>>> In general use select only for non-visible symbols >>>> (no prompts anywhere) and for symbols with no dependencies. >>>> That will limit the usefulness but on the other hand avoid >>>> the illegal configurations all over. >>>> >>> Agreed. HWMON should not be selected anywhere. Unfortunately it is, and >>> drm is no exception. It is selected by DRM_RADEON and DRM_AMDGPU. >>> Maybe just select it in DRM_I915 as well after all; in practice it won't >>> make a difference. >> >> And I guess everyone just does what I'm about to do now, throw my hands >> up in the air in disgust and resignation. :p > How about sticking to existing approach only. In my previous response I > mentioned that for combo which we want to reject CONFIG_HWMON=m && > CONFIG_DRM_I915=y combo i915_hwmon.o is not getting build. > It is only getting build for below combos > CONFIG_HWMON=m && CONFIG_DRM_I915=y > CONFIG_HWMON=m && CONFIG_DRM_I915=m > CONFIG_HWMON=y && CONFIG_DRM_I915=m Then please hide the IS_REACHABLE() within i915_hwmon.h and add stubs as is customary. Let's not clutter high level driver code with some random #if directives. BR, Jani. > Regards, > Badal >> >> BR, >> Jani. >> >> >> -- Jani Nikula, Intel Open Source Graphics Center ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-23 14:41 ` Jani Nikula @ 2022-08-25 7:27 ` Nilawar, Badal 0 siblings, 0 replies; 54+ messages in thread From: Nilawar, Badal @ 2022-08-25 7:27 UTC (permalink / raw) To: Jani Nikula, Guenter Roeck; +Cc: linux-hwmon, intel-gfx On 23-08-2022 20:11, Jani Nikula wrote: > On Tue, 23 Aug 2022, "Nilawar, Badal" <badal.nilawar@intel.com> wrote: >> On 23-08-2022 19:05, Jani Nikula wrote: >>> On Tue, 23 Aug 2022, Guenter Roeck <linux@roeck-us.net> wrote: >>>> On Tue, Aug 23, 2022 at 12:46:14PM +0300, Jani Nikula wrote: >>>> [ ... ] >>>>>>> >>>>>>> So why not do this in i915 Kconfig: >>>>>>> >>>>>>> config DRM_I915 >>>>>>> ... >>>>>>> depends on HWMON || HWMON=n >>>>>> With this change I am getting recursive dependancy error when I run make >>>>>> oldconfig >>>>>> >>>>>> badal@bnilawar-desk1:~/workspace/wp3/drm-tip$ make oldconfig >>>>>> HOSTCC scripts/basic/fixdep >>>>>> HOSTCC scripts/kconfig/conf.o >>>>>> HOSTCC scripts/kconfig/confdata.o >>>>>> HOSTCC scripts/kconfig/expr.o >>>>>> LEX scripts/kconfig/lexer.lex.c >>>>>> YACC scripts/kconfig/parser.tab.[ch] >>>>>> HOSTCC scripts/kconfig/lexer.lex.o >>>>>> HOSTCC scripts/kconfig/menu.o >>>>>> HOSTCC scripts/kconfig/parser.tab.o >>>>>> HOSTCC scripts/kconfig/preprocess.o >>>>>> HOSTCC scripts/kconfig/symbol.o >>>>>> HOSTCC scripts/kconfig/util.o >>>>>> HOSTLD scripts/kconfig/conf >>>>>> drivers/gpu/drm/i915/Kconfig:2:error: recursive dependency detected! >>>>>> drivers/gpu/drm/i915/Kconfig:2: symbol DRM_I915 depends on HWMON >>>>>> drivers/hwmon/Kconfig:6: symbol HWMON is selected by EEEPC_LAPTOP >>>>>> drivers/platform/x86/Kconfig:332: symbol EEEPC_LAPTOP depends on INPUT >>>>>> drivers/input/Kconfig:8: symbol INPUT is selected by DRM_I915 >>>>>> For a resolution refer to Documentation/kbuild/kconfig-language.rst >>>>>> subsection "Kconfig recursive dependency limitations" >>>>> >>>>> *sigh* >>>>> >>>>> Note: >>>>> select should be used with care. select will force >>>>> a symbol to a value without visiting the dependencies. >>>>> By abusing select you are able to select a symbol FOO even >>>>> if FOO depends on BAR that is not set. >>>>> In general use select only for non-visible symbols >>>>> (no prompts anywhere) and for symbols with no dependencies. >>>>> That will limit the usefulness but on the other hand avoid >>>>> the illegal configurations all over. >>>>> >>>> Agreed. HWMON should not be selected anywhere. Unfortunately it is, and >>>> drm is no exception. It is selected by DRM_RADEON and DRM_AMDGPU. >>>> Maybe just select it in DRM_I915 as well after all; in practice it won't >>>> make a difference. >>> >>> And I guess everyone just does what I'm about to do now, throw my hands >>> up in the air in disgust and resignation. :p >> How about sticking to existing approach only. In my previous response I >> mentioned that for combo which we want to reject CONFIG_HWMON=m && >> CONFIG_DRM_I915=y combo i915_hwmon.o is not getting build. >> It is only getting build for below combos >> CONFIG_HWMON=m && CONFIG_DRM_I915=y >> CONFIG_HWMON=m && CONFIG_DRM_I915=m >> CONFIG_HWMON=y && CONFIG_DRM_I915=m > > Then please hide the IS_REACHABLE() within i915_hwmon.h and add stubs as > is customary. Let's not clutter high level driver code with some random > #if directives. Thanks, I will resolve this and float the new series. Regards, Badal > > BR, > Jani. > > >> Regards, >> Badal >>> >>> BR, >>> Jani. >>> >>> >>> > ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-18 19:38 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-08-19 10:35 ` Jani Nikula @ 2022-08-19 10:37 ` Jani Nikula 1 sibling, 0 replies; 54+ messages in thread From: Jani Nikula @ 2022-08-19 10:37 UTC (permalink / raw) To: Badal Nilawar, intel-gfx; +Cc: linux-hwmon, linux On Fri, 19 Aug 2022, Badal Nilawar <badal.nilawar@intel.com> wrote: > diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h > new file mode 100644 > index 000000000000..921ae76099d3 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.h > @@ -0,0 +1,20 @@ > +/* SPDX-License-Identifier: MIT */ > + > +/* > + * Copyright © 2022 Intel Corporation > + */ > + > +#ifndef __I915_HWMON_H__ > +#define __I915_HWMON_H__ > + > +#include <linux/device.h> > +#include <linux/mutex.h> > +#include <linux/types.h> > +#include "i915_reg.h" All of the above #includes are unnecessary. Please remove. BR, Jani. > + > +struct drm_i915_private; > + > +void i915_hwmon_register(struct drm_i915_private *i915); > +void i915_hwmon_unregister(struct drm_i915_private *i915); > + > +#endif /* __I915_HWMON_H__ */ -- Jani Nikula, Intel Open Source Graphics Center ^ permalink raw reply [flat|nested] 54+ messages in thread
* [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support
@ 2022-08-12 17:37 Badal Nilawar
2022-08-12 17:37 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar
0 siblings, 1 reply; 54+ messages in thread
From: Badal Nilawar @ 2022-08-12 17:37 UTC (permalink / raw)
To: intel-gfx; +Cc: linux-hwmon, linux
This series adds the HWMON support for DGFX
v2:
- Reorganized series. Created first patch as infrastructure patch
followed by feature patches. (Ashutosh)
- Fixed review comments (Jani)
- Fixed review comments (Ashutosh)
v3:
- Fixed review comments from Guenter
- Exposed energy inferface as standard hwmon interface (Ashutosh)
- For power interface added entries for critical power and maintained
standard interface for all the entries except
power1_max_interval
- Extended support for XEHPSDV (Ashutosh)
Ashutosh Dixit (2):
drm/i915/hwmon: Expose card reactive critical power
drm/i915/hwmon: Expose power1_max_interval
Dale B Stimson (4):
drm/i915/hwmon: Add HWMON infrastructure
drm/i915/hwmon: Power PL1 limit and TDP setting
drm/i915/hwmon: Show device level energy usage
drm/i915/hwmon: Extend power/energy for XEHPSDV
Riana Tauro (1):
drm/i915/hwmon: Add HWMON current voltage support
.../ABI/testing/sysfs-driver-intel-i915-hwmon | 75 ++
drivers/gpu/drm/i915/Makefile | 3 +
drivers/gpu/drm/i915/gt/intel_gt_regs.h | 8 +
drivers/gpu/drm/i915/i915_driver.c | 7 +
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/i915_hwmon.c | 802 ++++++++++++++++++
drivers/gpu/drm/i915/i915_hwmon.h | 21 +
drivers/gpu/drm/i915/i915_reg.h | 22 +
drivers/gpu/drm/i915/intel_mchbar_regs.h | 13 +
9 files changed, 953 insertions(+)
create mode 100644 Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c
create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h
--
2.25.1
^ permalink raw reply [flat|nested] 54+ messages in thread* [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-12 17:37 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar @ 2022-08-12 17:37 ` Badal Nilawar 2022-08-12 18:05 ` Guenter Roeck 0 siblings, 1 reply; 54+ messages in thread From: Badal Nilawar @ 2022-08-12 17:37 UTC (permalink / raw) To: intel-gfx; +Cc: linux-hwmon, linux From: Dale B Stimson <dale.b.stimson@intel.com> The i915 HWMON module will be used to expose voltage, power and energy values for dGfx. Here we set up i915 hwmon infrastructure including i915 hwmon registration, basic data structures and functions. v2: - Create HWMON infra patch (Ashutosh) - Fixed review comments (Jani) - Remove "select HWMON" from i915/Kconfig (Jani) v3: Use hwm_ prefix for static functions (Ashutosh) Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> --- drivers/gpu/drm/i915/Makefile | 3 + drivers/gpu/drm/i915/i915_driver.c | 7 ++ drivers/gpu/drm/i915/i915_drv.h | 2 + drivers/gpu/drm/i915/i915_hwmon.c | 135 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ 5 files changed, 167 insertions(+) create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index 522ef9b4aff3..2b235f747490 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -208,6 +208,9 @@ i915-y += gt/uc/intel_uc.o \ # graphics system controller (GSC) support i915-y += gt/intel_gsc.o +# graphics hardware monitoring (HWMON) support +i915-$(CONFIG_HWMON) += i915_hwmon.o + # modesetting core code i915-y += \ display/hsw_ips.o \ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index deb8a8b76965..949908dd7496 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -80,6 +80,7 @@ #include "i915_drm_client.h" #include "i915_drv.h" #include "i915_getparam.h" +#include "i915_hwmon.h" #include "i915_ioc32.h" #include "i915_ioctl.h" #include "i915_irq.h" @@ -736,6 +737,9 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) intel_gt_driver_register(to_gt(dev_priv)); +#ifdef CONFIG_HWMON + i915_hwmon_register(dev_priv); +#endif intel_display_driver_register(dev_priv); intel_power_domains_enable(dev_priv); @@ -762,6 +766,9 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) intel_display_driver_unregister(dev_priv); +#ifdef CONFIG_HWMON + i915_hwmon_unregister(dev_priv); +#endif intel_gt_driver_unregister(to_gt(dev_priv)); i915_perf_unregister(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 086bbe8945d6..d437d588dec9 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -705,6 +705,8 @@ struct drm_i915_private { struct i915_perf perf; + struct i915_hwmon *hwmon; + /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ struct intel_gt gt0; diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c new file mode 100644 index 000000000000..5b80a0f024f0 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.c @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2022 Intel Corporation + */ + +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/types.h> + +#include "i915_drv.h" +#include "i915_hwmon.h" +#include "intel_mchbar_regs.h" + +struct hwm_reg { +}; + +struct hwm_drvdata { + struct i915_hwmon *hwmon; + struct intel_uncore *uncore; + struct device *hwmon_dev; + char name[12]; +}; + +struct i915_hwmon { + struct hwm_drvdata ddat; + struct mutex hwmon_lock; /* counter overflow logic and rmw */ + struct hwm_reg rg; +}; + +static const struct hwmon_channel_info *hwm_info[] = { + NULL +}; + +static umode_t +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + switch (type) { + default: + return 0; + } +} + +static int +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long *val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static int +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long val) +{ + switch (type) { + default: + return -EOPNOTSUPP; + } +} + +static const struct hwmon_ops hwm_ops = { + .is_visible = hwm_is_visible, + .read = hwm_read, + .write = hwm_write, +}; + +static const struct hwmon_chip_info hwm_chip_info = { + .ops = &hwm_ops, + .info = hwm_info, +}; + +static void +hwm_get_preregistration_info(struct drm_i915_private *i915) +{ +} + +void i915_hwmon_register(struct drm_i915_private *i915) +{ + struct device *dev = i915->drm.dev; + struct i915_hwmon *hwmon; + struct device *hwmon_dev; + struct hwm_drvdata *ddat; + + /* hwmon is available only for dGfx */ + if (!IS_DGFX(i915)) + return; + + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); + if (!hwmon) + return; + + i915->hwmon = hwmon; + mutex_init(&hwmon->hwmon_lock); + ddat = &hwmon->ddat; + + ddat->hwmon = hwmon; + ddat->uncore = &i915->uncore; + snprintf(ddat->name, sizeof(ddat->name), "i915"); + + hwm_get_preregistration_info(i915); + + /* hwmon_dev points to device hwmon<i> */ + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, + ddat, + &hwm_chip_info, + NULL); + if (IS_ERR(hwmon_dev)) { + mutex_destroy(&hwmon->hwmon_lock); + i915->hwmon = NULL; + kfree(hwmon); + return; + } + + ddat->hwmon_dev = hwmon_dev; +} + +void i915_hwmon_unregister(struct drm_i915_private *i915) +{ + struct i915_hwmon *hwmon; + struct hwm_drvdata *ddat; + + hwmon = fetch_and_zero(&i915->hwmon); + if (!hwmon) + return; + + ddat = &hwmon->ddat; + if (ddat->hwmon_dev) + hwmon_device_unregister(ddat->hwmon_dev); + + mutex_destroy(&hwmon->hwmon_lock); + kfree(hwmon); +} diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h new file mode 100644 index 000000000000..921ae76099d3 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hwmon.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: MIT */ + +/* + * Copyright © 2022 Intel Corporation + */ + +#ifndef __I915_HWMON_H__ +#define __I915_HWMON_H__ + +#include <linux/device.h> +#include <linux/mutex.h> +#include <linux/types.h> +#include "i915_reg.h" + +struct drm_i915_private; + +void i915_hwmon_register(struct drm_i915_private *i915); +void i915_hwmon_unregister(struct drm_i915_private *i915); + +#endif /* __I915_HWMON_H__ */ -- 2.25.1 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure 2022-08-12 17:37 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar @ 2022-08-12 18:05 ` Guenter Roeck 0 siblings, 0 replies; 54+ messages in thread From: Guenter Roeck @ 2022-08-12 18:05 UTC (permalink / raw) To: Badal Nilawar, intel-gfx; +Cc: linux-hwmon On 8/12/22 10:37, Badal Nilawar wrote: > From: Dale B Stimson <dale.b.stimson@intel.com> > > The i915 HWMON module will be used to expose voltage, power and energy > values for dGfx. Here we set up i915 hwmon infrastructure including i915 > hwmon registration, basic data structures and functions. > > v2: > - Create HWMON infra patch (Ashutosh) > - Fixed review comments (Jani) > - Remove "select HWMON" from i915/Kconfig (Jani) > v3: Use hwm_ prefix for static functions (Ashutosh) > > Signed-off-by: Dale B Stimson <dale.b.stimson@intel.com> > Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > Signed-off-by: Riana Tauro <riana.tauro@intel.com> > Signed-off-by: Badal Nilawar <badal.nilawar@intel.com> > --- > drivers/gpu/drm/i915/Makefile | 3 + > drivers/gpu/drm/i915/i915_driver.c | 7 ++ > drivers/gpu/drm/i915/i915_drv.h | 2 + > drivers/gpu/drm/i915/i915_hwmon.c | 135 +++++++++++++++++++++++++++++ > drivers/gpu/drm/i915/i915_hwmon.h | 20 +++++ > 5 files changed, 167 insertions(+) > create mode 100644 drivers/gpu/drm/i915/i915_hwmon.c > create mode 100644 drivers/gpu/drm/i915/i915_hwmon.h > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index 522ef9b4aff3..2b235f747490 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -208,6 +208,9 @@ i915-y += gt/uc/intel_uc.o \ > # graphics system controller (GSC) support > i915-y += gt/intel_gsc.o > > +# graphics hardware monitoring (HWMON) support > +i915-$(CONFIG_HWMON) += i915_hwmon.o > + > # modesetting core code > i915-y += \ > display/hsw_ips.o \ > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c > index deb8a8b76965..949908dd7496 100644 > --- a/drivers/gpu/drm/i915/i915_driver.c > +++ b/drivers/gpu/drm/i915/i915_driver.c > @@ -80,6 +80,7 @@ > #include "i915_drm_client.h" > #include "i915_drv.h" > #include "i915_getparam.h" > +#include "i915_hwmon.h" > #include "i915_ioc32.h" > #include "i915_ioctl.h" > #include "i915_irq.h" > @@ -736,6 +737,9 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) > > intel_gt_driver_register(to_gt(dev_priv)); > > +#ifdef CONFIG_HWMON > + i915_hwmon_register(dev_priv); > +#endif > intel_display_driver_register(dev_priv); > > intel_power_domains_enable(dev_priv); > @@ -762,6 +766,9 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) > > intel_display_driver_unregister(dev_priv); > > +#ifdef CONFIG_HWMON IS_REACHABLE() might be more appropriate. Otherwise this won't be included if HWMON=m. An alternate approach might be to have dummy functions if the hwmon code isn't rechable to avoid conditional code, but that is really personal preference. > + i915_hwmon_unregister(dev_priv); > +#endif > intel_gt_driver_unregister(to_gt(dev_priv)); > > i915_perf_unregister(dev_priv); > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 086bbe8945d6..d437d588dec9 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -705,6 +705,8 @@ struct drm_i915_private { > > struct i915_perf perf; > > + struct i915_hwmon *hwmon; > + > /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ > struct intel_gt gt0; > > diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c > new file mode 100644 > index 000000000000..5b80a0f024f0 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.c > @@ -0,0 +1,135 @@ > +// SPDX-License-Identifier: MIT > +/* > + * Copyright © 2022 Intel Corporation > + */ > + > +#include <linux/hwmon.h> > +#include <linux/hwmon-sysfs.h> > +#include <linux/types.h> > + > +#include "i915_drv.h" > +#include "i915_hwmon.h" > +#include "intel_mchbar_regs.h" > + > +struct hwm_reg { > +}; > + > +struct hwm_drvdata { > + struct i915_hwmon *hwmon; > + struct intel_uncore *uncore; > + struct device *hwmon_dev; > + char name[12]; > +}; > + > +struct i915_hwmon { > + struct hwm_drvdata ddat; > + struct mutex hwmon_lock; /* counter overflow logic and rmw */ > + struct hwm_reg rg; > +}; > + > +static const struct hwmon_channel_info *hwm_info[] = { > + NULL > +}; > + > +static umode_t > +hwm_is_visible(const void *drvdata, enum hwmon_sensor_types type, > + u32 attr, int channel) > +{ > + switch (type) { > + default: > + return 0; > + } > +} > + > +static int > +hwm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long *val) > +{ > + switch (type) { > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static int > +hwm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long val) > +{ > + switch (type) { > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static const struct hwmon_ops hwm_ops = { > + .is_visible = hwm_is_visible, > + .read = hwm_read, > + .write = hwm_write, > +}; > + > +static const struct hwmon_chip_info hwm_chip_info = { > + .ops = &hwm_ops, > + .info = hwm_info, > +}; > + > +static void > +hwm_get_preregistration_info(struct drm_i915_private *i915) > +{ > +} > + > +void i915_hwmon_register(struct drm_i915_private *i915) > +{ > + struct device *dev = i915->drm.dev; > + struct i915_hwmon *hwmon; > + struct device *hwmon_dev; > + struct hwm_drvdata *ddat; > + > + /* hwmon is available only for dGfx */ > + if (!IS_DGFX(i915)) > + return; > + > + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); > + if (!hwmon) > + return; > + > + i915->hwmon = hwmon; > + mutex_init(&hwmon->hwmon_lock); > + ddat = &hwmon->ddat; > + > + ddat->hwmon = hwmon; > + ddat->uncore = &i915->uncore; > + snprintf(ddat->name, sizeof(ddat->name), "i915"); > + > + hwm_get_preregistration_info(i915); > + > + /* hwmon_dev points to device hwmon<i> */ > + hwmon_dev = hwmon_device_register_with_info(dev, ddat->name, > + ddat, > + &hwm_chip_info, > + NULL); > + if (IS_ERR(hwmon_dev)) { > + mutex_destroy(&hwmon->hwmon_lock); > + i915->hwmon = NULL; > + kfree(hwmon); > + return; > + } > + > + ddat->hwmon_dev = hwmon_dev; > +} > + > +void i915_hwmon_unregister(struct drm_i915_private *i915) > +{ > + struct i915_hwmon *hwmon; > + struct hwm_drvdata *ddat; > + > + hwmon = fetch_and_zero(&i915->hwmon); > + if (!hwmon) > + return; > + > + ddat = &hwmon->ddat; > + if (ddat->hwmon_dev) > + hwmon_device_unregister(ddat->hwmon_dev); > + > + mutex_destroy(&hwmon->hwmon_lock); > + kfree(hwmon); > +} > diff --git a/drivers/gpu/drm/i915/i915_hwmon.h b/drivers/gpu/drm/i915/i915_hwmon.h > new file mode 100644 > index 000000000000..921ae76099d3 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hwmon.h > @@ -0,0 +1,20 @@ > +/* SPDX-License-Identifier: MIT */ > + > +/* > + * Copyright © 2022 Intel Corporation > + */ > + > +#ifndef __I915_HWMON_H__ > +#define __I915_HWMON_H__ > + > +#include <linux/device.h> > +#include <linux/mutex.h> > +#include <linux/types.h> > +#include "i915_reg.h" > + > +struct drm_i915_private; > + > +void i915_hwmon_register(struct drm_i915_private *i915); > +void i915_hwmon_unregister(struct drm_i915_private *i915); > + > +#endif /* __I915_HWMON_H__ */ ^ permalink raw reply [flat|nested] 54+ messages in thread
end of thread, other threads:[~2022-10-13 15:55 UTC | newest] Thread overview: 54+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-09-27 5:50 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar 2022-09-27 5:50 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-10-03 20:50 ` Andi Shyti 2022-09-27 5:50 ` [Intel-gfx] [PATCH 2/7] drm/i915/hwmon: Add HWMON current voltage support Badal Nilawar 2022-10-03 20:56 ` Andi Shyti 2022-10-13 15:52 ` Dixit, Ashutosh 2022-09-27 5:50 ` [Intel-gfx] [PATCH 3/7] drm/i915/hwmon: Power PL1 limit and TDP setting Badal Nilawar 2022-09-28 7:08 ` Gupta, Anshuman 2022-10-03 21:05 ` Andi Shyti 2022-10-13 15:54 ` Dixit, Ashutosh 2022-09-27 5:50 ` [Intel-gfx] [PATCH 4/7] drm/i915/hwmon: Show device level energy usage Badal Nilawar 2022-09-30 16:52 ` Rodrigo Vivi 2022-10-03 21:13 ` Andi Shyti 2022-10-13 15:54 ` Dixit, Ashutosh 2022-10-13 15:54 ` Dixit, Ashutosh 2022-09-27 5:50 ` [Intel-gfx] [PATCH 5/7] drm/i915/hwmon: Expose card reactive critical power Badal Nilawar 2022-10-03 21:18 ` Andi Shyti 2022-09-27 5:50 ` [Intel-gfx] [PATCH 6/7] drm/i915/hwmon: Expose power1_max_interval Badal Nilawar 2022-09-28 7:09 ` Gupta, Anshuman 2022-10-03 21:32 ` Andi Shyti 2022-10-13 15:55 ` Dixit, Ashutosh 2022-09-27 5:50 ` [Intel-gfx] [PATCH 7/7] drm/i915/hwmon: Extend power/energy for XEHPSDV Badal Nilawar 2022-10-03 21:40 ` Andi Shyti 2022-09-27 7:13 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Add HWMON support (rev8) Patchwork 2022-09-27 7:13 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork 2022-09-27 7:36 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork 2022-09-29 6:51 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork 2022-09-30 4:19 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork -- strict thread matches above, loose matches on Subject: below -- 2022-10-13 15:45 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Ashutosh Dixit 2022-10-13 15:45 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Ashutosh Dixit 2022-09-26 17:52 [Intel-gfx] [PATCH 0/7] Add HWMON support Badal Nilawar 2022-09-26 17:52 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-09-23 19:56 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar 2022-09-23 19:56 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-09-24 3:54 ` Dixit, Ashutosh 2022-09-16 15:00 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar 2022-09-16 15:00 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-09-21 10:59 ` Gupta, Anshuman 2022-09-21 12:44 ` Andi Shyti 2022-09-21 15:17 ` Nilawar, Badal 2022-09-21 15:45 ` Andi Shyti 2022-09-24 3:10 ` Dixit, Ashutosh 2022-08-25 13:21 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar 2022-08-25 13:21 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-08-26 13:30 ` Guenter Roeck 2022-08-29 17:26 ` Dixit, Ashutosh 2022-08-18 19:38 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar 2022-08-18 19:38 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-08-19 10:35 ` Jani Nikula 2022-08-19 11:41 ` Guenter Roeck 2022-08-23 8:42 ` Nilawar, Badal 2022-08-23 9:46 ` Jani Nikula 2022-08-23 12:19 ` Guenter Roeck 2022-08-23 13:35 ` Jani Nikula 2022-08-23 14:28 ` Nilawar, Badal 2022-08-23 14:41 ` Jani Nikula 2022-08-25 7:27 ` Nilawar, Badal 2022-08-19 10:37 ` Jani Nikula 2022-08-12 17:37 [Intel-gfx] [PATCH 0/7] drm/i915: Add HWMON support Badal Nilawar 2022-08-12 17:37 ` [Intel-gfx] [PATCH 1/7] drm/i915/hwmon: Add HWMON infrastructure Badal Nilawar 2022-08-12 18:05 ` Guenter Roeck
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox