Lines Matching refs:sseu
14 void intel_sseu_set_info(struct sseu_dev_info *sseu, u8 max_slices, in intel_sseu_set_info() argument
17 sseu->max_slices = max_slices; in intel_sseu_set_info()
18 sseu->max_subslices = max_subslices; in intel_sseu_set_info()
19 sseu->max_eus_per_subslice = max_eus_per_subslice; in intel_sseu_set_info()
23 intel_sseu_subslice_total(const struct sseu_dev_info *sseu) in intel_sseu_subslice_total() argument
27 if (sseu->has_xehp_dss) in intel_sseu_subslice_total()
28 return bitmap_weight(sseu->subslice_mask.xehp, in intel_sseu_subslice_total()
29 XEHP_BITMAP_BITS(sseu->subslice_mask)); in intel_sseu_subslice_total()
31 for (i = 0; i < ARRAY_SIZE(sseu->subslice_mask.hsw); i++) in intel_sseu_subslice_total()
32 total += hweight8(sseu->subslice_mask.hsw[i]); in intel_sseu_subslice_total()
38 intel_sseu_get_hsw_subslices(const struct sseu_dev_info *sseu, u8 slice) in intel_sseu_get_hsw_subslices() argument
40 WARN_ON(sseu->has_xehp_dss); in intel_sseu_get_hsw_subslices()
41 if (WARN_ON(slice >= sseu->max_slices)) in intel_sseu_get_hsw_subslices()
44 return sseu->subslice_mask.hsw[slice]; in intel_sseu_get_hsw_subslices()
47 static u16 sseu_get_eus(const struct sseu_dev_info *sseu, int slice, in sseu_get_eus() argument
50 if (sseu->has_xehp_dss) { in sseu_get_eus()
52 return sseu->eu_mask.xehp[subslice]; in sseu_get_eus()
54 return sseu->eu_mask.hsw[slice][subslice]; in sseu_get_eus()
58 static void sseu_set_eus(struct sseu_dev_info *sseu, int slice, int subslice, in sseu_set_eus() argument
61 GEM_WARN_ON(eu_mask && __fls(eu_mask) >= sseu->max_eus_per_subslice); in sseu_set_eus()
62 if (sseu->has_xehp_dss) { in sseu_set_eus()
64 sseu->eu_mask.xehp[subslice] = eu_mask; in sseu_set_eus()
66 sseu->eu_mask.hsw[slice][subslice] = eu_mask; in sseu_set_eus()
70 static u16 compute_eu_total(const struct sseu_dev_info *sseu) in compute_eu_total() argument
74 for (s = 0; s < sseu->max_slices; s++) in compute_eu_total()
75 for (ss = 0; ss < sseu->max_subslices; ss++) in compute_eu_total()
76 if (sseu->has_xehp_dss) in compute_eu_total()
77 total += hweight16(sseu->eu_mask.xehp[ss]); in compute_eu_total()
79 total += hweight16(sseu->eu_mask.hsw[s][ss]); in compute_eu_total()
95 const struct sseu_dev_info *sseu) in intel_sseu_copy_eumask_to_user() argument
98 int eu_stride = GEN_SSEU_STRIDE(sseu->max_eus_per_subslice); in intel_sseu_copy_eumask_to_user()
99 int len = sseu->max_slices * sseu->max_subslices * eu_stride; in intel_sseu_copy_eumask_to_user()
102 for (s = 0; s < sseu->max_slices; s++) { in intel_sseu_copy_eumask_to_user()
103 for (ss = 0; ss < sseu->max_subslices; ss++) { in intel_sseu_copy_eumask_to_user()
105 s * sseu->max_subslices * eu_stride + in intel_sseu_copy_eumask_to_user()
107 u16 mask = sseu_get_eus(sseu, s, ss); in intel_sseu_copy_eumask_to_user()
129 const struct sseu_dev_info *sseu) in intel_sseu_copy_ssmask_to_user() argument
132 int ss_stride = GEN_SSEU_STRIDE(sseu->max_subslices); in intel_sseu_copy_ssmask_to_user()
133 int len = sseu->max_slices * ss_stride; in intel_sseu_copy_ssmask_to_user()
136 for (s = 0; s < sseu->max_slices; s++) { in intel_sseu_copy_ssmask_to_user()
137 for (ss = 0; ss < sseu->max_subslices; ss++) { in intel_sseu_copy_ssmask_to_user()
140 if (!intel_sseu_has_subslice(sseu, s, ss)) in intel_sseu_copy_ssmask_to_user()
150 static void gen11_compute_sseu_info(struct sseu_dev_info *sseu, in gen11_compute_sseu_info() argument
153 u32 valid_ss_mask = GENMASK(sseu->max_subslices - 1, 0); in gen11_compute_sseu_info()
156 sseu->slice_mask |= BIT(0); in gen11_compute_sseu_info()
157 sseu->subslice_mask.hsw[0] = ss_en & valid_ss_mask; in gen11_compute_sseu_info()
159 for (ss = 0; ss < sseu->max_subslices; ss++) in gen11_compute_sseu_info()
160 if (intel_sseu_has_subslice(sseu, 0, ss)) in gen11_compute_sseu_info()
161 sseu_set_eus(sseu, 0, ss, eu_en); in gen11_compute_sseu_info()
163 sseu->eu_per_subslice = hweight16(eu_en); in gen11_compute_sseu_info()
164 sseu->eu_total = compute_eu_total(sseu); in gen11_compute_sseu_info()
167 static void xehp_compute_sseu_info(struct sseu_dev_info *sseu, in xehp_compute_sseu_info() argument
172 sseu->slice_mask |= BIT(0); in xehp_compute_sseu_info()
174 bitmap_or(sseu->subslice_mask.xehp, in xehp_compute_sseu_info()
175 sseu->compute_subslice_mask.xehp, in xehp_compute_sseu_info()
176 sseu->geometry_subslice_mask.xehp, in xehp_compute_sseu_info()
177 XEHP_BITMAP_BITS(sseu->subslice_mask)); in xehp_compute_sseu_info()
179 for (ss = 0; ss < sseu->max_subslices; ss++) in xehp_compute_sseu_info()
180 if (intel_sseu_has_subslice(sseu, 0, ss)) in xehp_compute_sseu_info()
181 sseu_set_eus(sseu, 0, ss, eu_en); in xehp_compute_sseu_info()
183 sseu->eu_per_subslice = hweight16(eu_en); in xehp_compute_sseu_info()
184 sseu->eu_total = compute_eu_total(sseu); in xehp_compute_sseu_info()
210 struct sseu_dev_info *sseu = >->info.sseu; in xehp_sseu_info_init() local
231 intel_sseu_set_info(sseu, 1, in xehp_sseu_info_init()
234 sseu->has_xehp_dss = 1; in xehp_sseu_info_init()
236 xehp_load_dss_mask(uncore, &sseu->geometry_subslice_mask, in xehp_sseu_info_init()
239 xehp_load_dss_mask(uncore, &sseu->compute_subslice_mask, in xehp_sseu_info_init()
249 for (eu = 0; eu < sseu->max_eus_per_subslice / 2; eu++) in xehp_sseu_info_init()
253 xehp_compute_sseu_info(sseu, eu_en); in xehp_sseu_info_init()
258 struct sseu_dev_info *sseu = >->info.sseu; in gen12_sseu_info_init() local
271 intel_sseu_set_info(sseu, 1, 6, 16); in gen12_sseu_info_init()
287 for (eu = 0; eu < sseu->max_eus_per_subslice / 2; eu++) in gen12_sseu_info_init()
291 gen11_compute_sseu_info(sseu, g_dss_en, eu_en); in gen12_sseu_info_init()
294 sseu->has_slice_pg = 1; in gen12_sseu_info_init()
299 struct sseu_dev_info *sseu = >->info.sseu; in gen11_sseu_info_init() local
306 intel_sseu_set_info(sseu, 1, 4, 8); in gen11_sseu_info_init()
308 intel_sseu_set_info(sseu, 1, 8, 8); in gen11_sseu_info_init()
323 gen11_compute_sseu_info(sseu, ss_en, eu_en); in gen11_sseu_info_init()
326 sseu->has_slice_pg = 1; in gen11_sseu_info_init()
327 sseu->has_subslice_pg = 1; in gen11_sseu_info_init()
328 sseu->has_eu_pg = 1; in gen11_sseu_info_init()
333 struct sseu_dev_info *sseu = >->info.sseu; in cherryview_sseu_info_init() local
338 sseu->slice_mask = BIT(0); in cherryview_sseu_info_init()
339 intel_sseu_set_info(sseu, 1, 2, 8); in cherryview_sseu_info_init()
348 sseu->subslice_mask.hsw[0] |= BIT(0); in cherryview_sseu_info_init()
349 sseu_set_eus(sseu, 0, 0, ~disabled_mask & 0xFF); in cherryview_sseu_info_init()
359 sseu->subslice_mask.hsw[0] |= BIT(1); in cherryview_sseu_info_init()
360 sseu_set_eus(sseu, 0, 1, ~disabled_mask & 0xFF); in cherryview_sseu_info_init()
363 sseu->eu_total = compute_eu_total(sseu); in cherryview_sseu_info_init()
369 sseu->eu_per_subslice = intel_sseu_subslice_total(sseu) ? in cherryview_sseu_info_init()
370 sseu->eu_total / in cherryview_sseu_info_init()
371 intel_sseu_subslice_total(sseu) : in cherryview_sseu_info_init()
378 sseu->has_slice_pg = 0; in cherryview_sseu_info_init()
379 sseu->has_subslice_pg = intel_sseu_subslice_total(sseu) > 1; in cherryview_sseu_info_init()
380 sseu->has_eu_pg = (sseu->eu_per_subslice > 2); in cherryview_sseu_info_init()
386 struct sseu_dev_info *sseu = >->info.sseu; in gen9_sseu_info_init() local
393 sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT; in gen9_sseu_info_init()
396 intel_sseu_set_info(sseu, IS_GEN9_LP(i915) ? 1 : 3, in gen9_sseu_info_init()
403 subslice_mask = (1 << sseu->max_subslices) - 1; in gen9_sseu_info_init()
411 for (s = 0; s < sseu->max_slices; s++) { in gen9_sseu_info_init()
412 if (!(sseu->slice_mask & BIT(s))) in gen9_sseu_info_init()
416 sseu->subslice_mask.hsw[s] = subslice_mask; in gen9_sseu_info_init()
419 for (ss = 0; ss < sseu->max_subslices; ss++) { in gen9_sseu_info_init()
423 if (!intel_sseu_has_subslice(sseu, s, ss)) in gen9_sseu_info_init()
429 sseu_set_eus(sseu, s, ss, ~eu_disabled_mask & eu_mask); in gen9_sseu_info_init()
431 eu_per_ss = sseu->max_eus_per_subslice - in gen9_sseu_info_init()
440 sseu->subslice_7eu[s] |= BIT(ss); in gen9_sseu_info_init()
444 sseu->eu_total = compute_eu_total(sseu); in gen9_sseu_info_init()
453 sseu->eu_per_subslice = in gen9_sseu_info_init()
454 intel_sseu_subslice_total(sseu) ? in gen9_sseu_info_init()
455 DIV_ROUND_UP(sseu->eu_total, intel_sseu_subslice_total(sseu)) : in gen9_sseu_info_init()
466 sseu->has_slice_pg = in gen9_sseu_info_init()
467 !IS_GEN9_LP(i915) && hweight8(sseu->slice_mask) > 1; in gen9_sseu_info_init()
468 sseu->has_subslice_pg = in gen9_sseu_info_init()
469 IS_GEN9_LP(i915) && intel_sseu_subslice_total(sseu) > 1; in gen9_sseu_info_init()
470 sseu->has_eu_pg = sseu->eu_per_subslice > 2; in gen9_sseu_info_init()
473 #define IS_SS_DISABLED(ss) (!(sseu->subslice_mask.hsw[0] & BIT(ss))) in gen9_sseu_info_init()
474 RUNTIME_INFO(i915)->has_pooled_eu = hweight8(sseu->subslice_mask.hsw[0]) == 3; in gen9_sseu_info_init()
476 sseu->min_eu_in_pool = 0; in gen9_sseu_info_init()
479 sseu->min_eu_in_pool = 3; in gen9_sseu_info_init()
481 sseu->min_eu_in_pool = 6; in gen9_sseu_info_init()
483 sseu->min_eu_in_pool = 9; in gen9_sseu_info_init()
491 struct sseu_dev_info *sseu = >->info.sseu; in bdw_sseu_info_init() local
498 sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT; in bdw_sseu_info_init()
499 intel_sseu_set_info(sseu, 3, 3, 8); in bdw_sseu_info_init()
505 subslice_mask = GENMASK(sseu->max_subslices - 1, 0); in bdw_sseu_info_init()
523 for (s = 0; s < sseu->max_slices; s++) { in bdw_sseu_info_init()
524 if (!(sseu->slice_mask & BIT(s))) in bdw_sseu_info_init()
528 sseu->subslice_mask.hsw[s] = subslice_mask; in bdw_sseu_info_init()
530 for (ss = 0; ss < sseu->max_subslices; ss++) { in bdw_sseu_info_init()
534 if (!intel_sseu_has_subslice(sseu, s, ss)) in bdw_sseu_info_init()
539 eu_disable[s] >> (ss * sseu->max_eus_per_subslice); in bdw_sseu_info_init()
541 sseu_set_eus(sseu, s, ss, ~eu_disabled_mask & 0xFF); in bdw_sseu_info_init()
548 if (sseu->max_eus_per_subslice - n_disabled == 7) in bdw_sseu_info_init()
549 sseu->subslice_7eu[s] |= 1 << ss; in bdw_sseu_info_init()
553 sseu->eu_total = compute_eu_total(sseu); in bdw_sseu_info_init()
560 sseu->eu_per_subslice = in bdw_sseu_info_init()
561 intel_sseu_subslice_total(sseu) ? in bdw_sseu_info_init()
562 DIV_ROUND_UP(sseu->eu_total, intel_sseu_subslice_total(sseu)) : in bdw_sseu_info_init()
569 sseu->has_slice_pg = hweight8(sseu->slice_mask) > 1; in bdw_sseu_info_init()
570 sseu->has_subslice_pg = 0; in bdw_sseu_info_init()
571 sseu->has_eu_pg = 0; in bdw_sseu_info_init()
577 struct sseu_dev_info *sseu = >->info.sseu; in hsw_sseu_info_init() local
591 sseu->slice_mask = BIT(0); in hsw_sseu_info_init()
595 sseu->slice_mask = BIT(0); in hsw_sseu_info_init()
599 sseu->slice_mask = BIT(0) | BIT(1); in hsw_sseu_info_init()
610 sseu->eu_per_subslice = 10; in hsw_sseu_info_init()
613 sseu->eu_per_subslice = 8; in hsw_sseu_info_init()
616 sseu->eu_per_subslice = 6; in hsw_sseu_info_init()
620 intel_sseu_set_info(sseu, hweight8(sseu->slice_mask), in hsw_sseu_info_init()
622 sseu->eu_per_subslice); in hsw_sseu_info_init()
624 for (s = 0; s < sseu->max_slices; s++) { in hsw_sseu_info_init()
625 sseu->subslice_mask.hsw[s] = subslice_mask; in hsw_sseu_info_init()
627 for (ss = 0; ss < sseu->max_subslices; ss++) { in hsw_sseu_info_init()
628 sseu_set_eus(sseu, s, ss, in hsw_sseu_info_init()
629 (1UL << sseu->eu_per_subslice) - 1); in hsw_sseu_info_init()
633 sseu->eu_total = compute_eu_total(sseu); in hsw_sseu_info_init()
636 sseu->has_slice_pg = 0; in hsw_sseu_info_init()
637 sseu->has_subslice_pg = 0; in hsw_sseu_info_init()
638 sseu->has_eu_pg = 0; in hsw_sseu_info_init()
665 const struct sseu_dev_info *sseu = >->info.sseu; in intel_sseu_make_rpcs() local
666 bool subslice_pg = sseu->has_subslice_pg; in intel_sseu_make_rpcs()
682 req_sseu = >->perf.sseu; in intel_sseu_make_rpcs()
714 subslices > min_t(u8, 4, hweight8(sseu->subslice_mask.hsw[0]) / 2)) { in intel_sseu_make_rpcs()
727 if (sseu->has_slice_pg) { in intel_sseu_make_rpcs()
755 if (sseu->has_eu_pg) { in intel_sseu_make_rpcs()
776 void intel_sseu_dump(const struct sseu_dev_info *sseu, struct drm_printer *p) in intel_sseu_dump() argument
780 if (sseu->has_xehp_dss) { in intel_sseu_dump()
782 intel_sseu_subslice_total(sseu)); in intel_sseu_dump()
784 XEHP_BITMAP_BITS(sseu->geometry_subslice_mask), in intel_sseu_dump()
785 sseu->geometry_subslice_mask.xehp); in intel_sseu_dump()
787 XEHP_BITMAP_BITS(sseu->compute_subslice_mask), in intel_sseu_dump()
788 sseu->compute_subslice_mask.xehp); in intel_sseu_dump()
791 hweight8(sseu->slice_mask), sseu->slice_mask); in intel_sseu_dump()
793 intel_sseu_subslice_total(sseu)); in intel_sseu_dump()
795 for (s = 0; s < sseu->max_slices; s++) { in intel_sseu_dump()
796 u8 ss_mask = sseu->subslice_mask.hsw[s]; in intel_sseu_dump()
803 drm_printf(p, "EU total: %u\n", sseu->eu_total); in intel_sseu_dump()
804 drm_printf(p, "EU per subslice: %u\n", sseu->eu_per_subslice); in intel_sseu_dump()
806 str_yes_no(sseu->has_slice_pg)); in intel_sseu_dump()
808 str_yes_no(sseu->has_subslice_pg)); in intel_sseu_dump()
810 str_yes_no(sseu->has_eu_pg)); in intel_sseu_dump()
813 static void sseu_print_hsw_topology(const struct sseu_dev_info *sseu, in sseu_print_hsw_topology() argument
818 for (s = 0; s < sseu->max_slices; s++) { in sseu_print_hsw_topology()
819 u8 ss_mask = sseu->subslice_mask.hsw[s]; in sseu_print_hsw_topology()
824 for (ss = 0; ss < sseu->max_subslices; ss++) { in sseu_print_hsw_topology()
825 u16 enabled_eus = sseu_get_eus(sseu, s, ss); in sseu_print_hsw_topology()
833 static void sseu_print_xehp_topology(const struct sseu_dev_info *sseu, in sseu_print_xehp_topology() argument
838 for (dss = 0; dss < sseu->max_subslices; dss++) { in sseu_print_xehp_topology()
839 u16 enabled_eus = sseu_get_eus(sseu, 0, dss); in sseu_print_xehp_topology()
842 str_yes_no(test_bit(dss, sseu->geometry_subslice_mask.xehp)), in sseu_print_xehp_topology()
843 str_yes_no(test_bit(dss, sseu->compute_subslice_mask.xehp)), in sseu_print_xehp_topology()
849 const struct sseu_dev_info *sseu, in intel_sseu_print_topology() argument
852 if (sseu->max_slices == 0) { in intel_sseu_print_topology()
855 sseu_print_xehp_topology(sseu, p); in intel_sseu_print_topology()
857 sseu_print_hsw_topology(sseu, p); in intel_sseu_print_topology()
862 const struct sseu_dev_info *sseu, in intel_sseu_print_ss_info() argument
867 if (sseu->has_xehp_dss) { in intel_sseu_print_ss_info()
869 bitmap_weight(sseu->geometry_subslice_mask.xehp, in intel_sseu_print_ss_info()
870 XEHP_BITMAP_BITS(sseu->geometry_subslice_mask))); in intel_sseu_print_ss_info()
872 bitmap_weight(sseu->compute_subslice_mask.xehp, in intel_sseu_print_ss_info()
873 XEHP_BITMAP_BITS(sseu->compute_subslice_mask))); in intel_sseu_print_ss_info()
875 for (s = 0; s < fls(sseu->slice_mask); s++) in intel_sseu_print_ss_info()
877 s, hweight8(sseu->subslice_mask.hsw[s])); in intel_sseu_print_ss_info()