Add a new function to copy subslices for a specified slice
between intel_sseu structures for the purpose of determining
power-gate status.

Signed-off-by: Stuart Summers <stuart.summ...@intel.com>
---
 drivers/gpu/drm/i915/i915_debugfs.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 55d72bff5308..083767a985ef 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -3811,6 +3811,15 @@ i915_cache_sharing_set(void *data, u64 val)
        return 0;
 }
 
+static void
+intel_sseu_copy_subslices(const struct sseu_dev_info *sseu, int slice,
+                         u8 *to_mask)
+{
+       int offset = slice * sseu->ss_stride;
+
+       memcpy(&to_mask[offset], &sseu->subslice_mask[offset], sseu->ss_stride);
+}
+
 DEFINE_SIMPLE_ATTRIBUTE(i915_cache_sharing_fops,
                        i915_cache_sharing_get, i915_cache_sharing_set,
                        "%llu\n");
@@ -3884,7 +3893,7 @@ static void gen10_sseu_device_status(struct 
drm_i915_private *dev_priv,
                        continue;
 
                sseu->slice_mask |= BIT(s);
-               sseu->subslice_mask[s] = info->sseu.subslice_mask[s];
+               intel_sseu_copy_subslices(&info->sseu, s, sseu->subslice_mask);
 
                for (ss = 0; ss < info->sseu.max_subslices; ss++) {
                        unsigned int eu_cnt;
@@ -3935,7 +3944,8 @@ static void gen9_sseu_device_status(struct 
drm_i915_private *dev_priv,
                sseu->slice_mask |= BIT(s);
 
                if (IS_GEN9_BC(dev_priv))
-                       sseu->subslice_mask[s] = info->sseu.subslice_mask[s];
+                       intel_sseu_copy_subslices(&info->sseu, s,
+                                                 sseu->subslice_mask);
 
                for (ss = 0; ss < info->sseu.max_subslices; ss++) {
                        unsigned int eu_cnt;
@@ -3971,10 +3981,9 @@ static void broadwell_sseu_device_status(struct 
drm_i915_private *dev_priv,
        if (sseu->slice_mask) {
                sseu->eu_per_subslice =
                        info->sseu.eu_per_subslice;
-               for (s = 0; s < fls(sseu->slice_mask); s++) {
-                       sseu->subslice_mask[s] =
-                               info->sseu.subslice_mask[s];
-               }
+               for (s = 0; s < fls(sseu->slice_mask); s++)
+                       intel_sseu_copy_subslices(&info->sseu, s,
+                                                 sseu->subslice_mask);
                sseu->eu_total = sseu->eu_per_subslice *
                                 intel_sseu_subslice_total(sseu);
 
-- 
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