drm/xe/mmio: Account for GSI offset when checking ranges
authorLucas De Marchi <lucas.demarchi@intel.com>
Fri, 8 Sep 2023 22:52:27 +0000 (15:52 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:41:06 +0000 (11:41 -0500)
Change xe_mmio_in_range() to use the same logic to account for the GT's
adj_offset as the read and write functions. This is needed when checking
ranges for the MCR registers if the GT has an offset to adjust.

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

index e74d3c5743c85e7da66a52d918ab8d9e5ceba010..77925b35cf8dcb0ee1d62ba7c579767796c8d807 100644 (file)
@@ -448,7 +448,7 @@ static bool xe_gt_mcr_get_nonterminated_steering(struct xe_gt *gt,
                        continue;
 
                for (int i = 0; gt->steering[type].ranges[i].end > 0; i++) {
-                       if (xe_mmio_in_range(&gt->steering[type].ranges[i], reg)) {
+                       if (xe_mmio_in_range(gt, &gt->steering[type].ranges[i], reg)) {
                                *group = gt->steering[type].group_target;
                                *instance = gt->steering[type].instance_target;
                                return true;
@@ -459,7 +459,7 @@ static bool xe_gt_mcr_get_nonterminated_steering(struct xe_gt *gt,
        implicit_ranges = gt->steering[IMPLICIT_STEERING].ranges;
        if (implicit_ranges)
                for (int i = 0; implicit_ranges[i].end > 0; i++)
-                       if (xe_mmio_in_range(&implicit_ranges[i], reg))
+                       if (xe_mmio_in_range(gt, &implicit_ranges[i], reg))
                                return false;
 
        /*
index cd9fe08ccf4ada6673bd523607ae664548ea0b54..9e0fd4a6fb29c42e4cf912c1e1342f6709cc464e 100644 (file)
@@ -127,9 +127,13 @@ static inline int xe_mmio_wait32(struct xe_gt *gt, struct xe_reg reg, u32 mask,
 int xe_mmio_ioctl(struct drm_device *dev, void *data,
                  struct drm_file *file);
 
-static inline bool xe_mmio_in_range(const struct xe_mmio_range *range,
+static inline bool xe_mmio_in_range(const struct xe_gt *gt,
+                                   const struct xe_mmio_range *range,
                                    struct xe_reg reg)
 {
+       if (reg.addr < gt->mmio.adj_limit)
+               reg.addr += gt->mmio.adj_offset;
+
        return range && reg.addr >= range->start && reg.addr <= range->end;
 }