drm/i915: Add new function to copy subslices for a slice
authorStuart Summers <stuart.summers@intel.com>
Fri, 23 Aug 2019 16:03:06 +0000 (09:03 -0700)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 23 Aug 2019 18:14:27 +0000 (19:14 +0100)
Add a new function to copy subslices for a specified slice
between intel_sseu structures for the purpose of determining
power-gate status. Note that currently ss_stride has a max
of 1.

Signed-off-by: Stuart Summers <stuart.summers@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190823160307.180813-11-stuart.summers@intel.com
drivers/gpu/drm/i915/i915_debugfs.c

index 44797f8b7c501567d189f803d308ace0f9891aca..6e8b4029993997e8b2f8fafcb848b52e5969ab47 100644 (file)
@@ -3726,6 +3726,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");
@@ -3799,7 +3808,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;
@@ -3850,7 +3859,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;
@@ -3886,7 +3896,8 @@ 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];
+                       intel_sseu_copy_subslices(&info->sseu, s,
+                                                 sseu->subslice_mask);
                sseu->eu_total = sseu->eu_per_subslice *
                                 intel_sseu_subslice_total(sseu);