Lines Matching refs:sseu

13 void intel_sseu_set_info(struct sseu_dev_info *sseu, u8 max_slices,  in intel_sseu_set_info()  argument
16 sseu->max_slices = max_slices; in intel_sseu_set_info()
17 sseu->max_subslices = max_subslices; in intel_sseu_set_info()
18 sseu->max_eus_per_subslice = max_eus_per_subslice; in intel_sseu_set_info()
22 intel_sseu_subslice_total(const struct sseu_dev_info *sseu) in intel_sseu_subslice_total() argument
26 if (sseu->has_xehp_dss) in intel_sseu_subslice_total()
27 return bitmap_weight(sseu->subslice_mask.xehp, in intel_sseu_subslice_total()
28 XEHP_BITMAP_BITS(sseu->subslice_mask)); in intel_sseu_subslice_total()
30 for (i = 0; i < ARRAY_SIZE(sseu->subslice_mask.hsw); i++) in intel_sseu_subslice_total()
31 total += hweight8(sseu->subslice_mask.hsw[i]); in intel_sseu_subslice_total()
37 intel_sseu_get_hsw_subslices(const struct sseu_dev_info *sseu, u8 slice) in intel_sseu_get_hsw_subslices() argument
39 WARN_ON(sseu->has_xehp_dss); in intel_sseu_get_hsw_subslices()
40 if (WARN_ON(slice >= sseu->max_slices)) in intel_sseu_get_hsw_subslices()
43 return sseu->subslice_mask.hsw[slice]; in intel_sseu_get_hsw_subslices()
46 static u16 sseu_get_eus(const struct sseu_dev_info *sseu, int slice, in sseu_get_eus() argument
49 if (sseu->has_xehp_dss) { in sseu_get_eus()
51 return sseu->eu_mask.xehp[subslice]; in sseu_get_eus()
53 return sseu->eu_mask.hsw[slice][subslice]; in sseu_get_eus()
57 static void sseu_set_eus(struct sseu_dev_info *sseu, int slice, int subslice, in sseu_set_eus() argument
60 GEM_WARN_ON(eu_mask && __fls(eu_mask) >= sseu->max_eus_per_subslice); in sseu_set_eus()
61 if (sseu->has_xehp_dss) { in sseu_set_eus()
63 sseu->eu_mask.xehp[subslice] = eu_mask; in sseu_set_eus()
65 sseu->eu_mask.hsw[slice][subslice] = eu_mask; in sseu_set_eus()
69 static u16 compute_eu_total(const struct sseu_dev_info *sseu) in compute_eu_total() argument
73 for (s = 0; s < sseu->max_slices; s++) in compute_eu_total()
74 for (ss = 0; ss < sseu->max_subslices; ss++) in compute_eu_total()
75 if (sseu->has_xehp_dss) in compute_eu_total()
76 total += hweight16(sseu->eu_mask.xehp[ss]); in compute_eu_total()
78 total += hweight16(sseu->eu_mask.hsw[s][ss]); in compute_eu_total()
94 const struct sseu_dev_info *sseu) in intel_sseu_copy_eumask_to_user() argument
97 int eu_stride = GEN_SSEU_STRIDE(sseu->max_eus_per_subslice); in intel_sseu_copy_eumask_to_user()
98 int len = sseu->max_slices * sseu->max_subslices * eu_stride; in intel_sseu_copy_eumask_to_user()
101 for (s = 0; s < sseu->max_slices; s++) { in intel_sseu_copy_eumask_to_user()
102 for (ss = 0; ss < sseu->max_subslices; ss++) { in intel_sseu_copy_eumask_to_user()
104 s * sseu->max_subslices * eu_stride + in intel_sseu_copy_eumask_to_user()
106 u16 mask = sseu_get_eus(sseu, s, ss); in intel_sseu_copy_eumask_to_user()
128 const struct sseu_dev_info *sseu) in intel_sseu_copy_ssmask_to_user() argument
131 int ss_stride = GEN_SSEU_STRIDE(sseu->max_subslices); in intel_sseu_copy_ssmask_to_user()
132 int len = sseu->max_slices * ss_stride; in intel_sseu_copy_ssmask_to_user()
135 for (s = 0; s < sseu->max_slices; s++) { in intel_sseu_copy_ssmask_to_user()
136 for (ss = 0; ss < sseu->max_subslices; ss++) { in intel_sseu_copy_ssmask_to_user()
139 if (!intel_sseu_has_subslice(sseu, s, ss)) in intel_sseu_copy_ssmask_to_user()
149 static void gen11_compute_sseu_info(struct sseu_dev_info *sseu, in gen11_compute_sseu_info() argument
152 u32 valid_ss_mask = GENMASK(sseu->max_subslices - 1, 0); in gen11_compute_sseu_info()
155 sseu->slice_mask |= BIT(0); in gen11_compute_sseu_info()
156 sseu->subslice_mask.hsw[0] = ss_en & valid_ss_mask; in gen11_compute_sseu_info()
158 for (ss = 0; ss < sseu->max_subslices; ss++) in gen11_compute_sseu_info()
159 if (intel_sseu_has_subslice(sseu, 0, ss)) in gen11_compute_sseu_info()
160 sseu_set_eus(sseu, 0, ss, eu_en); in gen11_compute_sseu_info()
162 sseu->eu_per_subslice = hweight16(eu_en); in gen11_compute_sseu_info()
163 sseu->eu_total = compute_eu_total(sseu); in gen11_compute_sseu_info()
166 static void xehp_compute_sseu_info(struct sseu_dev_info *sseu, in xehp_compute_sseu_info() argument
171 sseu->slice_mask |= BIT(0); in xehp_compute_sseu_info()
173 bitmap_or(sseu->subslice_mask.xehp, in xehp_compute_sseu_info()
174 sseu->compute_subslice_mask.xehp, in xehp_compute_sseu_info()
175 sseu->geometry_subslice_mask.xehp, in xehp_compute_sseu_info()
176 XEHP_BITMAP_BITS(sseu->subslice_mask)); in xehp_compute_sseu_info()
178 for (ss = 0; ss < sseu->max_subslices; ss++) in xehp_compute_sseu_info()
179 if (intel_sseu_has_subslice(sseu, 0, ss)) in xehp_compute_sseu_info()
180 sseu_set_eus(sseu, 0, ss, eu_en); in xehp_compute_sseu_info()
182 sseu->eu_per_subslice = hweight16(eu_en); in xehp_compute_sseu_info()
183 sseu->eu_total = compute_eu_total(sseu); in xehp_compute_sseu_info()
209 struct sseu_dev_info *sseu = &gt->info.sseu; in xehp_sseu_info_init() local
230 intel_sseu_set_info(sseu, 1, in xehp_sseu_info_init()
233 sseu->has_xehp_dss = 1; in xehp_sseu_info_init()
235 xehp_load_dss_mask(uncore, &sseu->geometry_subslice_mask, in xehp_sseu_info_init()
238 xehp_load_dss_mask(uncore, &sseu->compute_subslice_mask, in xehp_sseu_info_init()
248 for (eu = 0; eu < sseu->max_eus_per_subslice / 2; eu++) in xehp_sseu_info_init()
252 xehp_compute_sseu_info(sseu, eu_en); in xehp_sseu_info_init()
257 struct sseu_dev_info *sseu = &gt->info.sseu; in gen12_sseu_info_init() local
270 intel_sseu_set_info(sseu, 1, 6, 16); in gen12_sseu_info_init()
286 for (eu = 0; eu < sseu->max_eus_per_subslice / 2; eu++) in gen12_sseu_info_init()
290 gen11_compute_sseu_info(sseu, g_dss_en, eu_en); in gen12_sseu_info_init()
293 sseu->has_slice_pg = 1; in gen12_sseu_info_init()
298 struct sseu_dev_info *sseu = &gt->info.sseu; in gen11_sseu_info_init() local
305 intel_sseu_set_info(sseu, 1, 4, 8); in gen11_sseu_info_init()
307 intel_sseu_set_info(sseu, 1, 8, 8); in gen11_sseu_info_init()
322 gen11_compute_sseu_info(sseu, ss_en, eu_en); in gen11_sseu_info_init()
325 sseu->has_slice_pg = 1; in gen11_sseu_info_init()
326 sseu->has_subslice_pg = 1; in gen11_sseu_info_init()
327 sseu->has_eu_pg = 1; in gen11_sseu_info_init()
332 struct sseu_dev_info *sseu = &gt->info.sseu; in cherryview_sseu_info_init() local
337 sseu->slice_mask = BIT(0); in cherryview_sseu_info_init()
338 intel_sseu_set_info(sseu, 1, 2, 8); in cherryview_sseu_info_init()
347 sseu->subslice_mask.hsw[0] |= BIT(0); in cherryview_sseu_info_init()
348 sseu_set_eus(sseu, 0, 0, ~disabled_mask & 0xFF); in cherryview_sseu_info_init()
358 sseu->subslice_mask.hsw[0] |= BIT(1); in cherryview_sseu_info_init()
359 sseu_set_eus(sseu, 0, 1, ~disabled_mask & 0xFF); in cherryview_sseu_info_init()
362 sseu->eu_total = compute_eu_total(sseu); in cherryview_sseu_info_init()
368 sseu->eu_per_subslice = intel_sseu_subslice_total(sseu) ? in cherryview_sseu_info_init()
369 sseu->eu_total / in cherryview_sseu_info_init()
370 intel_sseu_subslice_total(sseu) : in cherryview_sseu_info_init()
377 sseu->has_slice_pg = 0; in cherryview_sseu_info_init()
378 sseu->has_subslice_pg = intel_sseu_subslice_total(sseu) > 1; in cherryview_sseu_info_init()
379 sseu->has_eu_pg = (sseu->eu_per_subslice > 2); in cherryview_sseu_info_init()
385 struct sseu_dev_info *sseu = &gt->info.sseu; in gen9_sseu_info_init() local
392 sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT; in gen9_sseu_info_init()
395 intel_sseu_set_info(sseu, IS_GEN9_LP(i915) ? 1 : 3, in gen9_sseu_info_init()
402 subslice_mask = (1 << sseu->max_subslices) - 1; in gen9_sseu_info_init()
410 for (s = 0; s < sseu->max_slices; s++) { in gen9_sseu_info_init()
411 if (!(sseu->slice_mask & BIT(s))) in gen9_sseu_info_init()
415 sseu->subslice_mask.hsw[s] = subslice_mask; in gen9_sseu_info_init()
418 for (ss = 0; ss < sseu->max_subslices; ss++) { in gen9_sseu_info_init()
422 if (!intel_sseu_has_subslice(sseu, s, ss)) in gen9_sseu_info_init()
428 sseu_set_eus(sseu, s, ss, ~eu_disabled_mask & eu_mask); in gen9_sseu_info_init()
430 eu_per_ss = sseu->max_eus_per_subslice - in gen9_sseu_info_init()
439 sseu->subslice_7eu[s] |= BIT(ss); in gen9_sseu_info_init()
443 sseu->eu_total = compute_eu_total(sseu); in gen9_sseu_info_init()
452 sseu->eu_per_subslice = in gen9_sseu_info_init()
453 intel_sseu_subslice_total(sseu) ? in gen9_sseu_info_init()
454 DIV_ROUND_UP(sseu->eu_total, intel_sseu_subslice_total(sseu)) : in gen9_sseu_info_init()
465 sseu->has_slice_pg = in gen9_sseu_info_init()
466 !IS_GEN9_LP(i915) && hweight8(sseu->slice_mask) > 1; in gen9_sseu_info_init()
467 sseu->has_subslice_pg = in gen9_sseu_info_init()
468 IS_GEN9_LP(i915) && intel_sseu_subslice_total(sseu) > 1; in gen9_sseu_info_init()
469 sseu->has_eu_pg = sseu->eu_per_subslice > 2; in gen9_sseu_info_init()
472 #define IS_SS_DISABLED(ss) (!(sseu->subslice_mask.hsw[0] & BIT(ss))) in gen9_sseu_info_init()
473 RUNTIME_INFO(i915)->has_pooled_eu = hweight8(sseu->subslice_mask.hsw[0]) == 3; in gen9_sseu_info_init()
475 sseu->min_eu_in_pool = 0; in gen9_sseu_info_init()
478 sseu->min_eu_in_pool = 3; in gen9_sseu_info_init()
480 sseu->min_eu_in_pool = 6; in gen9_sseu_info_init()
482 sseu->min_eu_in_pool = 9; in gen9_sseu_info_init()
490 struct sseu_dev_info *sseu = &gt->info.sseu; in bdw_sseu_info_init() local
497 sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT; in bdw_sseu_info_init()
498 intel_sseu_set_info(sseu, 3, 3, 8); in bdw_sseu_info_init()
504 subslice_mask = GENMASK(sseu->max_subslices - 1, 0); in bdw_sseu_info_init()
522 for (s = 0; s < sseu->max_slices; s++) { in bdw_sseu_info_init()
523 if (!(sseu->slice_mask & BIT(s))) in bdw_sseu_info_init()
527 sseu->subslice_mask.hsw[s] = subslice_mask; in bdw_sseu_info_init()
529 for (ss = 0; ss < sseu->max_subslices; ss++) { in bdw_sseu_info_init()
533 if (!intel_sseu_has_subslice(sseu, s, ss)) in bdw_sseu_info_init()
538 eu_disable[s] >> (ss * sseu->max_eus_per_subslice); in bdw_sseu_info_init()
540 sseu_set_eus(sseu, s, ss, ~eu_disabled_mask & 0xFF); in bdw_sseu_info_init()
547 if (sseu->max_eus_per_subslice - n_disabled == 7) in bdw_sseu_info_init()
548 sseu->subslice_7eu[s] |= 1 << ss; in bdw_sseu_info_init()
552 sseu->eu_total = compute_eu_total(sseu); in bdw_sseu_info_init()
559 sseu->eu_per_subslice = in bdw_sseu_info_init()
560 intel_sseu_subslice_total(sseu) ? in bdw_sseu_info_init()
561 DIV_ROUND_UP(sseu->eu_total, intel_sseu_subslice_total(sseu)) : in bdw_sseu_info_init()
568 sseu->has_slice_pg = hweight8(sseu->slice_mask) > 1; in bdw_sseu_info_init()
569 sseu->has_subslice_pg = 0; in bdw_sseu_info_init()
570 sseu->has_eu_pg = 0; in bdw_sseu_info_init()
576 struct sseu_dev_info *sseu = &gt->info.sseu; in hsw_sseu_info_init() local
590 sseu->slice_mask = BIT(0); in hsw_sseu_info_init()
594 sseu->slice_mask = BIT(0); in hsw_sseu_info_init()
598 sseu->slice_mask = BIT(0) | BIT(1); in hsw_sseu_info_init()
609 sseu->eu_per_subslice = 10; in hsw_sseu_info_init()
612 sseu->eu_per_subslice = 8; in hsw_sseu_info_init()
615 sseu->eu_per_subslice = 6; in hsw_sseu_info_init()
619 intel_sseu_set_info(sseu, hweight8(sseu->slice_mask), in hsw_sseu_info_init()
621 sseu->eu_per_subslice); in hsw_sseu_info_init()
623 for (s = 0; s < sseu->max_slices; s++) { in hsw_sseu_info_init()
624 sseu->subslice_mask.hsw[s] = subslice_mask; in hsw_sseu_info_init()
626 for (ss = 0; ss < sseu->max_subslices; ss++) { in hsw_sseu_info_init()
627 sseu_set_eus(sseu, s, ss, in hsw_sseu_info_init()
628 (1UL << sseu->eu_per_subslice) - 1); in hsw_sseu_info_init()
632 sseu->eu_total = compute_eu_total(sseu); in hsw_sseu_info_init()
635 sseu->has_slice_pg = 0; in hsw_sseu_info_init()
636 sseu->has_subslice_pg = 0; in hsw_sseu_info_init()
637 sseu->has_eu_pg = 0; in hsw_sseu_info_init()
664 const struct sseu_dev_info *sseu = &gt->info.sseu; in intel_sseu_make_rpcs() local
665 bool subslice_pg = sseu->has_subslice_pg; in intel_sseu_make_rpcs()
681 req_sseu = &gt->perf.sseu; in intel_sseu_make_rpcs()
713 subslices > min_t(u8, 4, hweight8(sseu->subslice_mask.hsw[0]) / 2)) { in intel_sseu_make_rpcs()
726 if (sseu->has_slice_pg) { in intel_sseu_make_rpcs()
754 if (sseu->has_eu_pg) { in intel_sseu_make_rpcs()
775 void intel_sseu_dump(const struct sseu_dev_info *sseu, struct drm_printer *p) in intel_sseu_dump() argument
779 if (sseu->has_xehp_dss) { in intel_sseu_dump()
781 intel_sseu_subslice_total(sseu)); in intel_sseu_dump()
783 XEHP_BITMAP_BITS(sseu->geometry_subslice_mask), in intel_sseu_dump()
784 sseu->geometry_subslice_mask.xehp); in intel_sseu_dump()
786 XEHP_BITMAP_BITS(sseu->compute_subslice_mask), in intel_sseu_dump()
787 sseu->compute_subslice_mask.xehp); in intel_sseu_dump()
790 hweight8(sseu->slice_mask), sseu->slice_mask); in intel_sseu_dump()
792 intel_sseu_subslice_total(sseu)); in intel_sseu_dump()
794 for (s = 0; s < sseu->max_slices; s++) { in intel_sseu_dump()
795 u8 ss_mask = sseu->subslice_mask.hsw[s]; in intel_sseu_dump()
802 drm_printf(p, "EU total: %u\n", sseu->eu_total); in intel_sseu_dump()
803 drm_printf(p, "EU per subslice: %u\n", sseu->eu_per_subslice); in intel_sseu_dump()
805 str_yes_no(sseu->has_slice_pg)); in intel_sseu_dump()
807 str_yes_no(sseu->has_subslice_pg)); in intel_sseu_dump()
809 str_yes_no(sseu->has_eu_pg)); in intel_sseu_dump()
812 static void sseu_print_hsw_topology(const struct sseu_dev_info *sseu, in sseu_print_hsw_topology() argument
817 for (s = 0; s < sseu->max_slices; s++) { in sseu_print_hsw_topology()
818 u8 ss_mask = sseu->subslice_mask.hsw[s]; in sseu_print_hsw_topology()
823 for (ss = 0; ss < sseu->max_subslices; ss++) { in sseu_print_hsw_topology()
824 u16 enabled_eus = sseu_get_eus(sseu, s, ss); in sseu_print_hsw_topology()
832 static void sseu_print_xehp_topology(const struct sseu_dev_info *sseu, in sseu_print_xehp_topology() argument
837 for (dss = 0; dss < sseu->max_subslices; dss++) { in sseu_print_xehp_topology()
838 u16 enabled_eus = sseu_get_eus(sseu, 0, dss); in sseu_print_xehp_topology()
841 str_yes_no(test_bit(dss, sseu->geometry_subslice_mask.xehp)), in sseu_print_xehp_topology()
842 str_yes_no(test_bit(dss, sseu->compute_subslice_mask.xehp)), in sseu_print_xehp_topology()
848 const struct sseu_dev_info *sseu, in intel_sseu_print_topology() argument
851 if (sseu->max_slices == 0) { in intel_sseu_print_topology()
854 sseu_print_xehp_topology(sseu, p); in intel_sseu_print_topology()
856 sseu_print_hsw_topology(sseu, p); in intel_sseu_print_topology()
861 const struct sseu_dev_info *sseu, in intel_sseu_print_ss_info() argument
866 if (sseu->has_xehp_dss) { in intel_sseu_print_ss_info()
868 bitmap_weight(sseu->geometry_subslice_mask.xehp, in intel_sseu_print_ss_info()
869 XEHP_BITMAP_BITS(sseu->geometry_subslice_mask))); in intel_sseu_print_ss_info()
871 bitmap_weight(sseu->compute_subslice_mask.xehp, in intel_sseu_print_ss_info()
872 XEHP_BITMAP_BITS(sseu->compute_subslice_mask))); in intel_sseu_print_ss_info()
874 for (s = 0; s < fls(sseu->slice_mask); s++) in intel_sseu_print_ss_info()
876 s, hweight8(sseu->subslice_mask.hsw[s])); in intel_sseu_print_ss_info()