Download raw body.
[PATCH 2/4] unstub intel_slicemask_from_xehp_dssmask
sys/dev/pci/drm/i915/gt/intel_sseu.c | 30 ++++++++++++++++++++++++----
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/sys/dev/pci/drm/i915/gt/intel_sseu.c b/sys/dev/pci/drm/i915/gt/intel_sseu.c
index 9b53e6a61f4..21c964a9f89 100644
--- a/sys/dev/pci/drm/i915/gt/intel_sseu.c
+++ b/sys/dev/pci/drm/i915/gt/intel_sseu.c
@@ -871,13 +871,10 @@ void intel_sseu_print_ss_info(const char *type,
u16 intel_slicemask_from_xehp_dssmask(intel_sseu_ss_mask_t dss_mask,
int dss_per_slice)
{
- STUB();
- return 0;
-#ifdef notyet
intel_sseu_ss_mask_t per_slice_mask = {};
unsigned long slice_mask = 0;
int i;
-
+#ifdef __linux__
WARN_ON(DIV_ROUND_UP(XEHP_BITMAP_BITS(dss_mask), dss_per_slice) >
8 * sizeof(slice_mask));
@@ -889,7 +886,32 @@ u16 intel_slicemask_from_xehp_dssmask(intel_sseu_ss_mask_t dss_mask,
bitmap_shift_right(dss_mask.xehp, dss_mask.xehp, dss_per_slice,
XEHP_BITMAP_BITS(dss_mask));
}
+#else
+ int bit, total_bits;
+
+ total_bits = XEHP_BITMAP_BITS(dss_mask);
+
+ WARN_ON(DIV_ROUND_UP(total_bits, dss_per_slice) > 8 * sizeof(slice_mask));
+
+ memset(&per_slice_mask, 0, sizeof(per_slice_mask));
+ for (bit = 0; bit < dss_per_slice && bit < total_bits; bit++)
+ per_slice_mask.xehp[bit / 32] |= (1U << (bit % 32));
+
+ for (i = 0; i < total_bits; i += dss_per_slice) {
+ int j, has_dss = 0;
+
+ for (j = 0; j < dss_per_slice && (i + j) < total_bits; j++) {
+ int idx = (i + j) / 32;
+ int pos = (i + j) % 32;
+ if (dss_mask.xehp[idx] & (1U << pos)) {
+ has_dss = 1;
+ break;
+ }
+ }
+ if (has_dss)
+ slice_mask |= (1UL << (i / dss_per_slice));
+ }
return slice_mask;
#endif
}
[PATCH 2/4] unstub intel_slicemask_from_xehp_dssmask