drm/xe: Fix xe_mmio_rmw32 operation
authorMatt Roper <matthew.d.roper@intel.com>
Fri, 21 Apr 2023 14:50:05 +0000 (07:50 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:31:42 +0000 (18:31 -0500)
xe_mmio_rmw32 was failing to invert the passed in mask, resulting in a
register update that wasn't the expected RMW operation.  Fortunately the
impact of this mistake was limited, since this function isn't heavily
used in Xe right now; this will mostly fix some GuC PM interrupt
unmasking.

v2:
 - Rename parameters as 'clr' and 'set' to clarify semantics.  (Lucas)

Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Link: https://lore.kernel.org/r/20230421145006.10940-1-matthew.d.roper@intel.com
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_mmio.h

index 354be6fae0d47d3f31412c45c85fd1ca7e4297b4..be7ba2813d58d6fb1a4960e27601c5cab592f082 100644 (file)
@@ -42,13 +42,13 @@ static inline u32 xe_mmio_read32(struct xe_gt *gt, u32 reg)
        return readl(gt->mmio.regs + reg);
 }
 
-static inline u32 xe_mmio_rmw32(struct xe_gt *gt, u32 reg, u32 mask,
-                                u32 val)
+static inline u32 xe_mmio_rmw32(struct xe_gt *gt, u32 reg, u32 clr,
+                                u32 set)
 {
        u32 old, reg_val;
 
        old = xe_mmio_read32(gt, reg);
-       reg_val = (old & mask) | val;
+       reg_val = (old & ~clr) | set;
        xe_mmio_write32(gt, reg, reg_val);
 
        return old;