]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe: Move survivability back to xe
authorLucas De Marchi <lucas.demarchi@intel.com>
Fri, 14 Mar 2025 13:48:58 +0000 (06:48 -0700)
committerLucas De Marchi <lucas.demarchi@intel.com>
Fri, 21 Mar 2025 18:48:09 +0000 (11:48 -0700)
Commit d40f275d96e8 ("drm/xe: Move survivability entirely to xe_pci")
moved the survivability handling to be done entirely in the xe_pci
layer. However there are some issues with that approach:

1) Survivability mode needs at least the mmio initialized, otherwise it
   can't really read a register to decide if it should enter that state
2) SR-IOV mode should be initialized, otherwise it's not possible to
   check if it's VF

Besides, as pointed by Riana the check for
xe_survivability_mode_enable() was wrong in xe_pci_probe() since it's
not a bool return.

Fix that by moving the initialization to be entirely in the xe_device
layer, with the correct dependencies handled: only after mmio and sriov
initialization, and not triggering it on error from
wait_for_lmem_ready(). This restores the trigger behavior before that
commit. The xe_pci layer now only checks for "is it enabled?",
like it's doing in xe_pci_suspend()/xe_pci_remove(), etc.

Cc: Riana Tauro <riana.tauro@intel.com>
Fixes: d40f275d96e8 ("drm/xe: Move survivability entirely to xe_pci")
Reviewed-by: Riana Tauro <riana.tauro@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250314-fix-survivability-v5-1-fdb3559ea965@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_pci.c
drivers/gpu/drm/xe/xe_survivability_mode.c
drivers/gpu/drm/xe/xe_survivability_mode.h

index b2f656b2a563eb6066683062467a8590aedab828..0e8805f93468dcf2ad39f54ebf5bd75a69f63918 100644 (file)
@@ -53,6 +53,7 @@
 #include "xe_pxp.h"
 #include "xe_query.h"
 #include "xe_shrinker.h"
+#include "xe_survivability_mode.h"
 #include "xe_sriov.h"
 #include "xe_tile.h"
 #include "xe_ttm_stolen_mgr.h"
@@ -711,8 +712,20 @@ int xe_device_probe_early(struct xe_device *xe)
        sriov_update_device_info(xe);
 
        err = xe_pcode_probe_early(xe);
-       if (err)
-               return err;
+       if (err) {
+               int save_err = err;
+
+               /*
+                * Try to leave device in survivability mode if device is
+                * possible, but still return the previous error for error
+                * propagation
+                */
+               err = xe_survivability_mode_enable(xe);
+               if (err)
+                       return err;
+
+               return save_err;
+       }
 
        err = wait_for_lmem_ready(xe);
        if (err)
index fc89d744978a6d4443cc574722532bdfbb60e810..88138a3fcf5061a7941b0126db543740f7cf55e1 100644 (file)
@@ -807,16 +807,14 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                return err;
 
        err = xe_device_probe_early(xe);
-
-       /*
-        * In Boot Survivability mode, no drm card is exposed and driver is
-        * loaded with bare minimum to allow for firmware to be flashed through
-        * mei. If early probe fails, check if survivability mode is flagged by
-        * HW to be enabled. In that case enable it and return success.
-        */
        if (err) {
-               if (xe_survivability_mode_required(xe) &&
-                   xe_survivability_mode_enable(xe))
+               /*
+                * In Boot Survivability mode, no drm card is exposed and driver
+                * is loaded with bare minimum to allow for firmware to be
+                * flashed through mei. If early probe failed, but it managed to
+                * enable survivability mode, return success.
+                */
+               if (xe_survivability_mode_is_enabled(xe))
                        return 0;
 
                return err;
index d939ce70e6fa82b414353045f3264eb895aab831..7b1ec643f0f097110beff6bbd708561b62683a65 100644 (file)
@@ -178,15 +178,16 @@ bool xe_survivability_mode_is_enabled(struct xe_device *xe)
        return xe->survivability.mode;
 }
 
-/**
- * xe_survivability_mode_required - checks if survivability mode is required
- * @xe: xe device instance
+/*
+ * survivability_mode_requested - check if it's possible to enable
+ * survivability mode and that was requested by firmware
  *
- * This function reads the boot status from Pcode
+ * This function reads the boot status from Pcode.
  *
- * Return: true if boot status indicates failure, false otherwise
+ * Return: true if platform support is available and boot status indicates
+ * failure, false otherwise.
  */
-bool xe_survivability_mode_required(struct xe_device *xe)
+static bool survivability_mode_requested(struct xe_device *xe)
 {
        struct xe_survivability *survivability = &xe->survivability;
        struct xe_mmio *mmio = xe_root_tile_mmio(xe);
@@ -208,7 +209,8 @@ bool xe_survivability_mode_required(struct xe_device *xe)
  *
  * Initialize survivability information and enable survivability mode
  *
- * Return: 0 for success, negative error code otherwise.
+ * Return: 0 if survivability mode is enabled or not requested; negative error
+ * code otherwise.
  */
 int xe_survivability_mode_enable(struct xe_device *xe)
 {
@@ -216,6 +218,9 @@ int xe_survivability_mode_enable(struct xe_device *xe)
        struct xe_survivability_info *info;
        struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
 
+       if (!survivability_mode_requested(xe))
+               return 0;
+
        survivability->size = MAX_SCRATCH_MMIO;
 
        info = devm_kcalloc(xe->drm.dev, survivability->size, sizeof(*info),
index f4df5f9025ce81202185fd3dc4307e0508e4133f..d7e64885570d41612b36a0271febf5a13fa5a138 100644 (file)
@@ -12,6 +12,5 @@ struct xe_device;
 
 int xe_survivability_mode_enable(struct xe_device *xe);
 bool xe_survivability_mode_is_enabled(struct xe_device *xe);
-bool xe_survivability_mode_required(struct xe_device *xe);
 
 #endif /* _XE_SURVIVABILITY_MODE_H_ */