mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
drm/xe/hwmon: Stop ignoring errors on probe
Not registering hwmon because it's not available (SRIOV_VF and DGFX) is different from failing the initialization. Handle the errors appropriately. Cc: Badal Nilawar <badal.nilawar@intel.com> Cc: Karthik Poosa <karthik.poosa@intel.com> Reviewed-by: Raag Jadav <raag.jadav@intel.com> Reviewed-by: Badal Nilawar <badal.nilawar@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250213192909.996148-13-lucas.demarchi@intel.com Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
This commit is contained in:
@@ -895,7 +895,9 @@ int xe_device_probe(struct xe_device *xe)
|
||||
|
||||
xe_debugfs_register(xe);
|
||||
|
||||
xe_hwmon_register(xe);
|
||||
err = xe_hwmon_register(xe);
|
||||
if (err)
|
||||
goto err_unregister_display;
|
||||
|
||||
for_each_gt(gt, xe, id)
|
||||
xe_gt_sanitize_freq(gt);
|
||||
|
||||
@@ -839,10 +839,9 @@ static const struct hwmon_chip_info hwmon_chip_info = {
|
||||
};
|
||||
|
||||
static void
|
||||
xe_hwmon_get_preregistration_info(struct xe_device *xe)
|
||||
xe_hwmon_get_preregistration_info(struct xe_hwmon *hwmon)
|
||||
{
|
||||
struct xe_mmio *mmio = xe_root_tile_mmio(xe);
|
||||
struct xe_hwmon *hwmon = xe->hwmon;
|
||||
struct xe_mmio *mmio = xe_root_tile_mmio(hwmon->xe);
|
||||
long energy;
|
||||
u64 val_sku_unit = 0;
|
||||
int channel;
|
||||
@@ -876,33 +875,34 @@ static void xe_hwmon_mutex_destroy(void *arg)
|
||||
mutex_destroy(&hwmon->hwmon_lock);
|
||||
}
|
||||
|
||||
void xe_hwmon_register(struct xe_device *xe)
|
||||
int xe_hwmon_register(struct xe_device *xe)
|
||||
{
|
||||
struct device *dev = xe->drm.dev;
|
||||
struct xe_hwmon *hwmon;
|
||||
int ret;
|
||||
|
||||
/* hwmon is available only for dGfx */
|
||||
if (!IS_DGFX(xe))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
/* hwmon is not available on VFs */
|
||||
if (IS_SRIOV_VF(xe))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
hwmon = devm_kzalloc(dev, sizeof(*hwmon), GFP_KERNEL);
|
||||
if (!hwmon)
|
||||
return;
|
||||
|
||||
xe->hwmon = hwmon;
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_init(&hwmon->hwmon_lock);
|
||||
if (devm_add_action_or_reset(dev, xe_hwmon_mutex_destroy, hwmon))
|
||||
return;
|
||||
ret = devm_add_action_or_reset(dev, xe_hwmon_mutex_destroy, hwmon);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* There's only one instance of hwmon per device */
|
||||
hwmon->xe = xe;
|
||||
xe->hwmon = hwmon;
|
||||
|
||||
xe_hwmon_get_preregistration_info(xe);
|
||||
xe_hwmon_get_preregistration_info(hwmon);
|
||||
|
||||
drm_dbg(&xe->drm, "Register xe hwmon interface\n");
|
||||
|
||||
@@ -910,11 +910,12 @@ void xe_hwmon_register(struct xe_device *xe)
|
||||
hwmon->hwmon_dev = devm_hwmon_device_register_with_info(dev, "xe", hwmon,
|
||||
&hwmon_chip_info,
|
||||
hwmon_groups);
|
||||
|
||||
if (IS_ERR(hwmon->hwmon_dev)) {
|
||||
drm_warn(&xe->drm, "Failed to register xe hwmon (%pe)\n", hwmon->hwmon_dev);
|
||||
drm_err(&xe->drm, "Failed to register xe hwmon (%pe)\n", hwmon->hwmon_dev);
|
||||
xe->hwmon = NULL;
|
||||
return;
|
||||
return PTR_ERR(hwmon->hwmon_dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
struct xe_device;
|
||||
|
||||
#if IS_REACHABLE(CONFIG_HWMON)
|
||||
void xe_hwmon_register(struct xe_device *xe);
|
||||
int xe_hwmon_register(struct xe_device *xe);
|
||||
#else
|
||||
static inline void xe_hwmon_register(struct xe_device *xe) { };
|
||||
static inline int xe_hwmon_register(struct xe_device *xe) { return 0; };
|
||||
#endif
|
||||
|
||||
#endif /* _XE_HWMON_H_ */
|
||||
|
||||
Reference in New Issue
Block a user