drm/xe/hwmon: Stop ignoring errors on probe
authorLucas De Marchi <lucas.demarchi@intel.com>
Thu, 13 Feb 2025 19:29:09 +0000 (11:29 -0800)
committerLucas De Marchi <lucas.demarchi@intel.com>
Fri, 14 Feb 2025 19:42:55 +0000 (11:42 -0800)
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>
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_hwmon.c
drivers/gpu/drm/xe/xe_hwmon.h

index 6718b7c2d1ea1464b677bce7d7f0f26043d12cc4..91525299494ed8ff9eb75c05cd39cc29caa5c14f 100644 (file)
@@ -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);
index 7f327e3342123cdc9c4151418a3acbe3ce35fe6f..48d80ffdf7bb9cd84d97a8670d20c6b79d620554 100644 (file)
@@ -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;
 }
 
index c42a1de2cd7a289ad408b3647c4f9b27e46ae6e2..d02c1bfe8c0a05185cf1dfa91b1b4c3d9ccb3c32 100644 (file)
@@ -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_ */