]> www.infradead.org Git - linux.git/commitdiff
drm/xe: Handle unreliable MMIO reads during forcewake
authorShuicheng Lin <shuicheng.lin@intel.com>
Thu, 17 Oct 2024 22:15:47 +0000 (22:15 +0000)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Fri, 18 Oct 2024 15:08:20 +0000 (11:08 -0400)
In some cases, when the driver attempts to read an MMIO register,
the hardware may return 0xFFFFFFFF. The current force wake path
code treats this as a valid response, as it only checks the BIT.
However, 0xFFFFFFFF should be considered an invalid value, indicating
a potential issue. To address this, we should add a log entry to
highlight this condition and return failure.
The force wake failure log level is changed from notice to err
to match the failure return value.

v2 (Matt Brost):
  - set ret value (-EIO) to kick the error to upper layers
v3 (Rodrigo):
  - add commit message for the log level promotion from notice to err
v4:
  - update reviewed info

Suggested-by: Alex Zuo <alex.zuo@intel.com>
Signed-off-by: Shuicheng Lin <shuicheng.lin@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Acked-by: Badal Nilawar <badal.nilawar@intel.com>
Cc: Anshuman Gupta <anshuman.gupta@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241017221547.1564029-1-shuicheng.lin@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_force_wake.c

index f5067dea59c9f301540ef0bddba638f9c12339d3..4f6784e5abf88913b81a364bb393f6286d52be78 100644 (file)
@@ -119,9 +119,15 @@ static int __domain_wait(struct xe_gt *gt, struct xe_force_wake_domain *domain,
                             XE_FORCE_WAKE_ACK_TIMEOUT_MS * USEC_PER_MSEC,
                             &value, true);
        if (ret)
-               xe_gt_notice(gt, "Force wake domain %d failed to ack %s (%pe) reg[%#x] = %#x\n",
-                            domain->id, str_wake_sleep(wake), ERR_PTR(ret),
-                            domain->reg_ack.addr, value);
+               xe_gt_err(gt, "Force wake domain %d failed to ack %s (%pe) reg[%#x] = %#x\n",
+                         domain->id, str_wake_sleep(wake), ERR_PTR(ret),
+                         domain->reg_ack.addr, value);
+       if (value == ~0) {
+               xe_gt_err(gt,
+                         "Force wake domain %d: %s. MMIO unreliable (forcewake register returns 0xFFFFFFFF)!\n",
+                         domain->id, str_wake_sleep(wake));
+               ret = -EIO;
+       }
 
        return ret;
 }