Add a new function to set a range of subslices for a
specified slice based on a given mask.

Signed-off-by: Stuart Summers <stuart.summ...@intel.com>
---
 drivers/gpu/drm/i915/gt/intel_sseu.c     | 10 +++++
 drivers/gpu/drm/i915/gt/intel_sseu.h     |  3 ++
 drivers/gpu/drm/i915/intel_device_info.c | 53 ++++++++++++++----------
 3 files changed, 45 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_sseu.c 
b/drivers/gpu/drm/i915/gt/intel_sseu.c
index 71abf0c9a46b..607c1447287c 100644
--- a/drivers/gpu/drm/i915/gt/intel_sseu.c
+++ b/drivers/gpu/drm/i915/gt/intel_sseu.c
@@ -30,6 +30,16 @@ intel_sseu_subslice_total(const struct sseu_dev_info *sseu)
        return total;
 }
 
+void intel_sseu_set_subslices(struct sseu_dev_info *sseu, int slice,
+                             u32 ss_mask)
+{
+       int i, offset = slice * sseu->ss_stride;
+
+       for (i = 0; i < sseu->ss_stride; i++)
+               sseu->subslice_mask[offset + i] =
+                       (ss_mask >> (BITS_PER_BYTE * i)) & 0xff;
+}
+
 unsigned int
 intel_sseu_subslices_per_slice(const struct sseu_dev_info *sseu, u8 slice)
 {
diff --git a/drivers/gpu/drm/i915/gt/intel_sseu.h 
b/drivers/gpu/drm/i915/gt/intel_sseu.h
index fe22d5b18e67..2261d4e7d98b 100644
--- a/drivers/gpu/drm/i915/gt/intel_sseu.h
+++ b/drivers/gpu/drm/i915/gt/intel_sseu.h
@@ -75,6 +75,9 @@ intel_sseu_subslice_total(const struct sseu_dev_info *sseu);
 unsigned int
 intel_sseu_subslices_per_slice(const struct sseu_dev_info *sseu, u8 slice);
 
+void intel_sseu_set_subslices(struct sseu_dev_info *sseu, int slice,
+                             u32 ss_mask);
+
 u32 intel_sseu_make_rpcs(struct drm_i915_private *i915,
                         const struct intel_sseu *req_sseu);
 
diff --git a/drivers/gpu/drm/i915/intel_device_info.c 
b/drivers/gpu/drm/i915/intel_device_info.c
index 7de7b7b540cb..22b59fdb31fc 100644
--- a/drivers/gpu/drm/i915/intel_device_info.c
+++ b/drivers/gpu/drm/i915/intel_device_info.c
@@ -206,7 +206,10 @@ static void gen11_sseu_info_init(struct drm_i915_private 
*dev_priv)
                        int ss;
 
                        sseu->slice_mask |= BIT(s);
-                       sseu->subslice_mask[s] = (ss_en >> ss_idx) & ss_en_mask;
+
+                       intel_sseu_set_subslices(sseu, s, (ss_en >> ss_idx) &
+                                                         ss_en_mask);
+
                        for (ss = 0; ss < sseu->max_subslices; ss++) {
                                if (sseu->subslice_mask[s] & BIT(ss))
                                        sseu_set_eus(sseu, s, ss, eu_en);
@@ -235,14 +238,6 @@ static void gen10_sseu_info_init(struct drm_i915_private 
*dev_priv)
        sseu->slice_mask = (fuse2 & GEN10_F2_S_ENA_MASK) >>
                            GEN10_F2_S_ENA_SHIFT;
 
-       subslice_mask = (1 << 4) - 1;
-       subslice_mask &= ~((fuse2 & GEN10_F2_SS_DIS_MASK) >>
-                          GEN10_F2_SS_DIS_SHIFT);
-
-       /*
-        * Slice0 can have up to 3 subslices, but there are only 2 in
-        * slice1/2.
-        */
        sseu->subslice_mask[0] = subslice_mask;
        for (s = 1; s < sseu->max_slices; s++)
                sseu->subslice_mask[s] = subslice_mask & 0x3;
@@ -270,14 +265,25 @@ static void gen10_sseu_info_init(struct drm_i915_private 
*dev_priv)
        eu_en = ~I915_READ(GEN10_EU_DISABLE3);
        sseu_set_eus(sseu, 5, 1, eu_en & eu_mask);
 
-       /* Do a second pass where we mark the subslices disabled if all their
-        * eus are off.
-        */
+       subslice_mask = (1 << 4) - 1;
+       subslice_mask &= ~((fuse2 & GEN10_F2_SS_DIS_MASK) >>
+                          GEN10_F2_SS_DIS_SHIFT);
+
        for (s = 0; s < sseu->max_slices; s++) {
+               u32 subslice_mask_with_eus = subslice_mask;
+
                for (ss = 0; ss < sseu->max_subslices; ss++) {
                        if (sseu_get_eus(sseu, s, ss) == 0)
-                               sseu->subslice_mask[s] &= ~BIT(ss);
+                               subslice_mask_with_eus &= ~BIT(ss);
                }
+
+               /*
+                * Slice0 can have up to 3 subslices, but there are only 2 in
+                * slice1/2.
+                */
+               intel_sseu_set_subslices(sseu, s, s == 0 ?
+                                                 subslice_mask_with_eus :
+                                                 subslice_mask_with_eus & 0x3);
        }
 
        sseu->eu_total = compute_eu_total(sseu);
@@ -303,6 +309,7 @@ static void cherryview_sseu_info_init(struct 
drm_i915_private *dev_priv)
 {
        struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu;
        u32 fuse;
+       u8 subslice_mask;
 
        fuse = I915_READ(CHV_FUSE_GT);
 
@@ -316,7 +323,7 @@ static void cherryview_sseu_info_init(struct 
drm_i915_private *dev_priv)
                        (((fuse & CHV_FGT_EU_DIS_SS0_R1_MASK) >>
                          CHV_FGT_EU_DIS_SS0_R1_SHIFT) << 4);
 
-               sseu->subslice_mask[0] |= BIT(0);
+               subslice_mask |= BIT(0);
                sseu_set_eus(sseu, 0, 0, ~disabled_mask);
        }
 
@@ -327,10 +334,12 @@ static void cherryview_sseu_info_init(struct 
drm_i915_private *dev_priv)
                        (((fuse & CHV_FGT_EU_DIS_SS1_R1_MASK) >>
                          CHV_FGT_EU_DIS_SS1_R1_SHIFT) << 4);
 
-               sseu->subslice_mask[0] |= BIT(1);
+               subslice_mask |= BIT(1);
                sseu_set_eus(sseu, 0, 1, ~disabled_mask);
        }
 
+       intel_sseu_set_subslices(sseu, 0, subslice_mask);
+
        sseu->eu_total = compute_eu_total(sseu);
 
        /*
@@ -383,7 +392,7 @@ static void gen9_sseu_info_init(struct drm_i915_private 
*dev_priv)
                        /* skip disabled slice */
                        continue;
 
-               sseu->subslice_mask[s] = subslice_mask;
+               intel_sseu_set_subslices(sseu, s, subslice_mask);
 
                eu_disable = I915_READ(GEN9_EU_DISABLE(s));
                for (ss = 0; ss < sseu->max_subslices; ss++) {
@@ -490,7 +499,7 @@ static void broadwell_sseu_info_init(struct 
drm_i915_private *dev_priv)
                        /* skip disabled slice */
                        continue;
 
-               sseu->subslice_mask[s] = subslice_mask;
+               intel_sseu_set_subslices(sseu, s, subslice_mask);
 
                for (ss = 0; ss < sseu->max_subslices; ss++) {
                        u8 eu_disabled_mask;
@@ -541,6 +550,7 @@ static void haswell_sseu_info_init(struct drm_i915_private 
*dev_priv)
        struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu;
        u32 fuse1;
        int s, ss;
+       u32 subslice_mask;
 
        /*
         * There isn't a register to tell us how many slices/subslices. We
@@ -552,16 +562,15 @@ static void haswell_sseu_info_init(struct 
drm_i915_private *dev_priv)
                /* fall through */
        case 1:
                sseu->slice_mask = BIT(0);
-               sseu->subslice_mask[0] = BIT(0);
+               subslice_mask = BIT(0);
                break;
        case 2:
                sseu->slice_mask = BIT(0);
-               sseu->subslice_mask[0] = BIT(0) | BIT(1);
+               subslice_mask = BIT(0) | BIT(1);
                break;
        case 3:
                sseu->slice_mask = BIT(0) | BIT(1);
-               sseu->subslice_mask[0] = BIT(0) | BIT(1);
-               sseu->subslice_mask[1] = BIT(0) | BIT(1);
+               subslice_mask = BIT(0) | BIT(1);
                break;
        }
 
@@ -587,6 +596,8 @@ static void haswell_sseu_info_init(struct drm_i915_private 
*dev_priv)
                            sseu->eu_per_subslice);
 
        for (s = 0; s < sseu->max_slices; s++) {
+               intel_sseu_set_subslices(sseu, s, subslice_mask);
+
                for (ss = 0; ss < sseu->max_subslices; ss++) {
                        sseu_set_eus(sseu, s, ss,
                                     (1UL << sseu->eu_per_subslice) - 1);
-- 
2.21.0.5.gaeb582a983

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to