Mesa (main): intel/dev: extract slice/subslice total computation

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 14 12:17:34 UTC 2022


Module: Mesa
Branch: main
Commit: 5f3b0327b783aebe4a68a05ea619ebf7cc5cbf35
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5f3b0327b783aebe4a68a05ea619ebf7cc5cbf35

Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date:   Wed Jan 12 22:17:06 2022 +0200

intel/dev: extract slice/subslice total computation

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Francisco Jerez <currojerez at riseup.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14297>

---

 src/intel/dev/intel_device_info.c | 56 +++++++++++++++++++--------------------
 1 file changed, 28 insertions(+), 28 deletions(-)

diff --git a/src/intel/dev/intel_device_info.c b/src/intel/dev/intel_device_info.c
index ceba3053738..450f0508fe8 100644
--- a/src/intel/dev/intel_device_info.c
+++ b/src/intel/dev/intel_device_info.c
@@ -1069,6 +1069,25 @@ reset_masks(struct intel_device_info *devinfo)
    memset(devinfo->ppipe_subslices, 0, sizeof(devinfo->ppipe_subslices));
 }
 
+static void
+update_slice_subslice_counts(struct intel_device_info *devinfo)
+{
+   devinfo->num_slices = __builtin_popcount(devinfo->slice_masks);
+   devinfo->subslice_total = 0;
+   for (int s = 0; s < devinfo->max_slices; s++) {
+      if (!intel_device_info_slice_available(devinfo, s))
+         continue;
+
+      for (int b = 0; b < devinfo->subslice_slice_stride; b++) {
+         devinfo->num_subslices[s] +=
+            __builtin_popcount(devinfo->subslice_masks[s * devinfo->subslice_slice_stride + b]);
+      }
+      devinfo->subslice_total += devinfo->num_subslices[s];
+   }
+   assert(devinfo->num_slices > 0);
+   assert(devinfo->subslice_total > 0);
+}
+
 static void
 update_from_topology(struct intel_device_info *devinfo,
                      const struct drm_i915_query_topology_info *topology)
@@ -1086,7 +1105,6 @@ update_from_topology(struct intel_device_info *devinfo,
 
    assert(sizeof(devinfo->slice_masks) >= DIV_ROUND_UP(topology->max_slices, 8));
    memcpy(&devinfo->slice_masks, topology->data, DIV_ROUND_UP(topology->max_slices, 8));
-   devinfo->num_slices = __builtin_popcount(devinfo->slice_masks);
    devinfo->max_slices = topology->max_slices;
    devinfo->max_subslices_per_slice = topology->max_subslices;
    devinfo->max_eus_per_subslice = topology->max_eus_per_subslice;
@@ -1097,18 +1115,13 @@ update_from_topology(struct intel_device_info *devinfo,
    memcpy(devinfo->subslice_masks, &topology->data[topology->subslice_offset],
           subslice_mask_len);
 
-   uint32_t n_subslices = 0;
-   for (int s = 0; s < topology->max_slices; s++) {
-      if ((devinfo->slice_masks & (1 << s)) == 0)
-         continue;
+   uint32_t eu_mask_len =
+      topology->eu_stride * topology->max_subslices * topology->max_slices;
+   assert(sizeof(devinfo->eu_masks) >= eu_mask_len);
+   memcpy(devinfo->eu_masks, &topology->data[topology->eu_offset], eu_mask_len);
 
-      for (int b = 0; b < devinfo->subslice_slice_stride; b++) {
-         devinfo->num_subslices[s] +=
-            __builtin_popcount(devinfo->subslice_masks[s * devinfo->subslice_slice_stride + b]);
-      }
-      n_subslices += devinfo->num_subslices[s];
-   }
-   assert(n_subslices > 0);
+   /* Now that all the masks are in place, update the counts. */
+   update_slice_subslice_counts(devinfo);
 
    if (devinfo->ver >= 11) {
       /* The kernel only reports one slice on all existing ICL+
@@ -1159,24 +1172,15 @@ update_from_topology(struct intel_device_info *devinfo,
    }
 
    if (devinfo->ver == 12 && devinfo->num_slices == 1) {
-      if (n_subslices >= 6) {
-         assert(n_subslices == 6);
+      if (devinfo->subslice_total >= 6) {
+         assert(devinfo->subslice_total == 6);
          devinfo->l3_banks = 8;
-      } else if (n_subslices > 2) {
+      } else if (devinfo->subslice_total > 2) {
          devinfo->l3_banks = 6;
       } else {
          devinfo->l3_banks = 4;
       }
    }
-
-   uint32_t eu_mask_len =
-      topology->eu_stride * topology->max_subslices * topology->max_slices;
-   assert(sizeof(devinfo->eu_masks) >= eu_mask_len);
-   memcpy(devinfo->eu_masks, &topology->data[topology->eu_offset], eu_mask_len);
-
-   uint32_t n_eus = 0;
-   for (int b = 0; b < eu_mask_len; b++)
-      n_eus += __builtin_popcount(devinfo->eu_masks[b]);
 }
 
 /* Generate detailed mask from the I915_PARAM_SLICE_MASK,
@@ -1793,10 +1797,6 @@ intel_get_device_info_from_fd(int fd, struct intel_device_info *devinfo)
    get_context_param(fd, 0, I915_CONTEXT_PARAM_GTT_SIZE, &devinfo->gtt_size);
    devinfo->has_tiling_uapi = has_get_tiling(fd);
 
-   devinfo->subslice_total = 0;
-   for (uint32_t i = 0; i < devinfo->max_slices; i++)
-      devinfo->subslice_total += __builtin_popcount(devinfo->subslice_masks[i]);
-
    /* Gfx7 and older do not support EU/Subslice info */
    assert(devinfo->subslice_total >= 1 || devinfo->ver <= 7);
    devinfo->subslice_total = MAX2(devinfo->subslice_total, 1);



More information about the mesa-commit mailing list