Lines Matching refs:sseu

10 void intel_sseu_set_info(struct sseu_dev_info *sseu, u8 max_slices,  in intel_sseu_set_info()  argument
13 sseu->max_slices = max_slices; in intel_sseu_set_info()
14 sseu->max_subslices = max_subslices; in intel_sseu_set_info()
15 sseu->max_eus_per_subslice = max_eus_per_subslice; in intel_sseu_set_info()
17 sseu->ss_stride = GEN_SSEU_STRIDE(sseu->max_subslices); in intel_sseu_set_info()
18 GEM_BUG_ON(sseu->ss_stride > GEN_MAX_SUBSLICE_STRIDE); in intel_sseu_set_info()
19 sseu->eu_stride = GEN_SSEU_STRIDE(sseu->max_eus_per_subslice); in intel_sseu_set_info()
20 GEM_BUG_ON(sseu->eu_stride > GEN_MAX_EU_STRIDE); in intel_sseu_set_info()
24 intel_sseu_subslice_total(const struct sseu_dev_info *sseu) in intel_sseu_subslice_total() argument
28 for (i = 0; i < ARRAY_SIZE(sseu->subslice_mask); i++) in intel_sseu_subslice_total()
29 total += hweight8(sseu->subslice_mask[i]); in intel_sseu_subslice_total()
34 u32 intel_sseu_get_subslices(const struct sseu_dev_info *sseu, u8 slice) in intel_sseu_get_subslices() argument
36 int i, offset = slice * sseu->ss_stride; in intel_sseu_get_subslices()
39 GEM_BUG_ON(slice >= sseu->max_slices); in intel_sseu_get_subslices()
41 for (i = 0; i < sseu->ss_stride; i++) in intel_sseu_get_subslices()
42 mask |= (u32)sseu->subslice_mask[offset + i] << in intel_sseu_get_subslices()
48 void intel_sseu_set_subslices(struct sseu_dev_info *sseu, int slice, in intel_sseu_set_subslices() argument
51 int offset = slice * sseu->ss_stride; in intel_sseu_set_subslices()
53 memcpy(&subslice_mask[offset], &ss_mask, sseu->ss_stride); in intel_sseu_set_subslices()
57 intel_sseu_subslices_per_slice(const struct sseu_dev_info *sseu, u8 slice) in intel_sseu_subslices_per_slice() argument
59 return hweight32(intel_sseu_get_subslices(sseu, slice)); in intel_sseu_subslices_per_slice()
62 static int sseu_eu_idx(const struct sseu_dev_info *sseu, int slice, in sseu_eu_idx() argument
65 int slice_stride = sseu->max_subslices * sseu->eu_stride; in sseu_eu_idx()
67 return slice * slice_stride + subslice * sseu->eu_stride; in sseu_eu_idx()
70 static u16 sseu_get_eus(const struct sseu_dev_info *sseu, int slice, in sseu_get_eus() argument
73 int i, offset = sseu_eu_idx(sseu, slice, subslice); in sseu_get_eus()
76 for (i = 0; i < sseu->eu_stride; i++) in sseu_get_eus()
78 ((u16)sseu->eu_mask[offset + i]) << (i * BITS_PER_BYTE); in sseu_get_eus()
83 static void sseu_set_eus(struct sseu_dev_info *sseu, int slice, int subslice, in sseu_set_eus() argument
86 int i, offset = sseu_eu_idx(sseu, slice, subslice); in sseu_set_eus()
88 for (i = 0; i < sseu->eu_stride; i++) in sseu_set_eus()
89 sseu->eu_mask[offset + i] = in sseu_set_eus()
93 static u16 compute_eu_total(const struct sseu_dev_info *sseu) in compute_eu_total() argument
97 for (i = 0; i < ARRAY_SIZE(sseu->eu_mask); i++) in compute_eu_total()
98 total += hweight8(sseu->eu_mask[i]); in compute_eu_total()
103 static u32 get_ss_stride_mask(struct sseu_dev_info *sseu, u8 s, u32 ss_en) in get_ss_stride_mask() argument
107 ss_mask = ss_en >> (s * sseu->max_subslices); in get_ss_stride_mask()
108 ss_mask &= GENMASK(sseu->max_subslices - 1, 0); in get_ss_stride_mask()
113 static void gen11_compute_sseu_info(struct sseu_dev_info *sseu, u8 s_en, in gen11_compute_sseu_info() argument
119 GEM_BUG_ON(sseu->max_slices * sseu->max_subslices > in gen11_compute_sseu_info()
122 for (s = 0; s < sseu->max_slices; s++) { in gen11_compute_sseu_info()
126 sseu->slice_mask |= BIT(s); in gen11_compute_sseu_info()
137 intel_sseu_set_subslices(sseu, s, sseu->compute_subslice_mask, in gen11_compute_sseu_info()
138 get_ss_stride_mask(sseu, s, c_ss_en)); in gen11_compute_sseu_info()
139 intel_sseu_set_subslices(sseu, s, sseu->geometry_subslice_mask, in gen11_compute_sseu_info()
140 get_ss_stride_mask(sseu, s, g_ss_en)); in gen11_compute_sseu_info()
141 intel_sseu_set_subslices(sseu, s, sseu->subslice_mask, in gen11_compute_sseu_info()
142 get_ss_stride_mask(sseu, s, in gen11_compute_sseu_info()
145 for (ss = 0; ss < sseu->max_subslices; ss++) in gen11_compute_sseu_info()
146 if (intel_sseu_has_subslice(sseu, s, ss)) in gen11_compute_sseu_info()
147 sseu_set_eus(sseu, s, ss, eu_en); in gen11_compute_sseu_info()
149 sseu->eu_per_subslice = hweight16(eu_en); in gen11_compute_sseu_info()
150 sseu->eu_total = compute_eu_total(sseu); in gen11_compute_sseu_info()
155 struct sseu_dev_info *sseu = &gt->info.sseu; in gen12_sseu_info_init() local
174 intel_sseu_set_info(sseu, 1, 32, 16); in gen12_sseu_info_init()
176 intel_sseu_set_info(sseu, 1, 6, 16); in gen12_sseu_info_init()
199 for (eu = 0; eu < sseu->max_eus_per_subslice / 2; eu++) in gen12_sseu_info_init()
203 gen11_compute_sseu_info(sseu, s_en, g_dss_en, c_dss_en, eu_en); in gen12_sseu_info_init()
206 sseu->has_slice_pg = 1; in gen12_sseu_info_init()
211 struct sseu_dev_info *sseu = &gt->info.sseu; in gen11_sseu_info_init() local
218 intel_sseu_set_info(sseu, 1, 4, 8); in gen11_sseu_info_init()
220 intel_sseu_set_info(sseu, 1, 8, 8); in gen11_sseu_info_init()
229 gen11_compute_sseu_info(sseu, s_en, ss_en, 0, eu_en); in gen11_sseu_info_init()
232 sseu->has_slice_pg = 1; in gen11_sseu_info_init()
233 sseu->has_subslice_pg = 1; in gen11_sseu_info_init()
234 sseu->has_eu_pg = 1; in gen11_sseu_info_init()
239 struct sseu_dev_info *sseu = &gt->info.sseu; in cherryview_sseu_info_init() local
245 sseu->slice_mask = BIT(0); in cherryview_sseu_info_init()
246 intel_sseu_set_info(sseu, 1, 2, 8); in cherryview_sseu_info_init()
256 sseu_set_eus(sseu, 0, 0, ~disabled_mask); in cherryview_sseu_info_init()
267 sseu_set_eus(sseu, 0, 1, ~disabled_mask); in cherryview_sseu_info_init()
270 intel_sseu_set_subslices(sseu, 0, sseu->subslice_mask, subslice_mask); in cherryview_sseu_info_init()
272 sseu->eu_total = compute_eu_total(sseu); in cherryview_sseu_info_init()
278 sseu->eu_per_subslice = intel_sseu_subslice_total(sseu) ? in cherryview_sseu_info_init()
279 sseu->eu_total / in cherryview_sseu_info_init()
280 intel_sseu_subslice_total(sseu) : in cherryview_sseu_info_init()
287 sseu->has_slice_pg = 0; in cherryview_sseu_info_init()
288 sseu->has_subslice_pg = intel_sseu_subslice_total(sseu) > 1; in cherryview_sseu_info_init()
289 sseu->has_eu_pg = (sseu->eu_per_subslice > 2); in cherryview_sseu_info_init()
296 struct sseu_dev_info *sseu = &gt->info.sseu; in gen9_sseu_info_init() local
303 sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT; in gen9_sseu_info_init()
306 intel_sseu_set_info(sseu, IS_GEN9_LP(i915) ? 1 : 3, in gen9_sseu_info_init()
313 subslice_mask = (1 << sseu->max_subslices) - 1; in gen9_sseu_info_init()
321 for (s = 0; s < sseu->max_slices; s++) { in gen9_sseu_info_init()
322 if (!(sseu->slice_mask & BIT(s))) in gen9_sseu_info_init()
326 intel_sseu_set_subslices(sseu, s, sseu->subslice_mask, in gen9_sseu_info_init()
330 for (ss = 0; ss < sseu->max_subslices; ss++) { in gen9_sseu_info_init()
334 if (!intel_sseu_has_subslice(sseu, s, ss)) in gen9_sseu_info_init()
340 sseu_set_eus(sseu, s, ss, ~eu_disabled_mask); in gen9_sseu_info_init()
342 eu_per_ss = sseu->max_eus_per_subslice - in gen9_sseu_info_init()
351 sseu->subslice_7eu[s] |= BIT(ss); in gen9_sseu_info_init()
355 sseu->eu_total = compute_eu_total(sseu); in gen9_sseu_info_init()
364 sseu->eu_per_subslice = in gen9_sseu_info_init()
365 intel_sseu_subslice_total(sseu) ? in gen9_sseu_info_init()
366 DIV_ROUND_UP(sseu->eu_total, intel_sseu_subslice_total(sseu)) : in gen9_sseu_info_init()
377 sseu->has_slice_pg = in gen9_sseu_info_init()
378 !IS_GEN9_LP(i915) && hweight8(sseu->slice_mask) > 1; in gen9_sseu_info_init()
379 sseu->has_subslice_pg = in gen9_sseu_info_init()
380 IS_GEN9_LP(i915) && intel_sseu_subslice_total(sseu) > 1; in gen9_sseu_info_init()
381 sseu->has_eu_pg = sseu->eu_per_subslice > 2; in gen9_sseu_info_init()
384 #define IS_SS_DISABLED(ss) (!(sseu->subslice_mask[0] & BIT(ss))) in gen9_sseu_info_init()
385 info->has_pooled_eu = hweight8(sseu->subslice_mask[0]) == 3; in gen9_sseu_info_init()
387 sseu->min_eu_in_pool = 0; in gen9_sseu_info_init()
390 sseu->min_eu_in_pool = 3; in gen9_sseu_info_init()
392 sseu->min_eu_in_pool = 6; in gen9_sseu_info_init()
394 sseu->min_eu_in_pool = 9; in gen9_sseu_info_init()
402 struct sseu_dev_info *sseu = &gt->info.sseu; in bdw_sseu_info_init() local
409 sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT; in bdw_sseu_info_init()
410 intel_sseu_set_info(sseu, 3, 3, 8); in bdw_sseu_info_init()
416 subslice_mask = GENMASK(sseu->max_subslices - 1, 0); in bdw_sseu_info_init()
434 for (s = 0; s < sseu->max_slices; s++) { in bdw_sseu_info_init()
435 if (!(sseu->slice_mask & BIT(s))) in bdw_sseu_info_init()
439 intel_sseu_set_subslices(sseu, s, sseu->subslice_mask, in bdw_sseu_info_init()
442 for (ss = 0; ss < sseu->max_subslices; ss++) { in bdw_sseu_info_init()
446 if (!intel_sseu_has_subslice(sseu, s, ss)) in bdw_sseu_info_init()
451 eu_disable[s] >> (ss * sseu->max_eus_per_subslice); in bdw_sseu_info_init()
453 sseu_set_eus(sseu, s, ss, ~eu_disabled_mask); in bdw_sseu_info_init()
460 if (sseu->max_eus_per_subslice - n_disabled == 7) in bdw_sseu_info_init()
461 sseu->subslice_7eu[s] |= 1 << ss; in bdw_sseu_info_init()
465 sseu->eu_total = compute_eu_total(sseu); in bdw_sseu_info_init()
472 sseu->eu_per_subslice = in bdw_sseu_info_init()
473 intel_sseu_subslice_total(sseu) ? in bdw_sseu_info_init()
474 DIV_ROUND_UP(sseu->eu_total, intel_sseu_subslice_total(sseu)) : in bdw_sseu_info_init()
481 sseu->has_slice_pg = hweight8(sseu->slice_mask) > 1; in bdw_sseu_info_init()
482 sseu->has_subslice_pg = 0; in bdw_sseu_info_init()
483 sseu->has_eu_pg = 0; in bdw_sseu_info_init()
489 struct sseu_dev_info *sseu = &gt->info.sseu; in hsw_sseu_info_init() local
503 sseu->slice_mask = BIT(0); in hsw_sseu_info_init()
507 sseu->slice_mask = BIT(0); in hsw_sseu_info_init()
511 sseu->slice_mask = BIT(0) | BIT(1); in hsw_sseu_info_init()
522 sseu->eu_per_subslice = 10; in hsw_sseu_info_init()
525 sseu->eu_per_subslice = 8; in hsw_sseu_info_init()
528 sseu->eu_per_subslice = 6; in hsw_sseu_info_init()
532 intel_sseu_set_info(sseu, hweight8(sseu->slice_mask), in hsw_sseu_info_init()
534 sseu->eu_per_subslice); in hsw_sseu_info_init()
536 for (s = 0; s < sseu->max_slices; s++) { in hsw_sseu_info_init()
537 intel_sseu_set_subslices(sseu, s, sseu->subslice_mask, in hsw_sseu_info_init()
540 for (ss = 0; ss < sseu->max_subslices; ss++) { in hsw_sseu_info_init()
541 sseu_set_eus(sseu, s, ss, in hsw_sseu_info_init()
542 (1UL << sseu->eu_per_subslice) - 1); in hsw_sseu_info_init()
546 sseu->eu_total = compute_eu_total(sseu); in hsw_sseu_info_init()
549 sseu->has_slice_pg = 0; in hsw_sseu_info_init()
550 sseu->has_subslice_pg = 0; in hsw_sseu_info_init()
551 sseu->has_eu_pg = 0; in hsw_sseu_info_init()
576 const struct sseu_dev_info *sseu = &gt->info.sseu; in intel_sseu_make_rpcs() local
577 bool subslice_pg = sseu->has_subslice_pg; in intel_sseu_make_rpcs()
593 req_sseu = &i915->perf.sseu; in intel_sseu_make_rpcs()
625 subslices > min_t(u8, 4, hweight8(sseu->subslice_mask[0]) / 2)) { in intel_sseu_make_rpcs()
638 if (sseu->has_slice_pg) { in intel_sseu_make_rpcs()
666 if (sseu->has_eu_pg) { in intel_sseu_make_rpcs()
687 void intel_sseu_dump(const struct sseu_dev_info *sseu, struct drm_printer *p) in intel_sseu_dump() argument
692 hweight8(sseu->slice_mask), sseu->slice_mask); in intel_sseu_dump()
693 drm_printf(p, "subslice total: %u\n", intel_sseu_subslice_total(sseu)); in intel_sseu_dump()
694 for (s = 0; s < sseu->max_slices; s++) { in intel_sseu_dump()
696 s, intel_sseu_subslices_per_slice(sseu, s), in intel_sseu_dump()
697 intel_sseu_get_subslices(sseu, s)); in intel_sseu_dump()
699 drm_printf(p, "EU total: %u\n", sseu->eu_total); in intel_sseu_dump()
700 drm_printf(p, "EU per subslice: %u\n", sseu->eu_per_subslice); in intel_sseu_dump()
702 yesno(sseu->has_slice_pg)); in intel_sseu_dump()
704 yesno(sseu->has_subslice_pg)); in intel_sseu_dump()
705 drm_printf(p, "has EU power gating: %s\n", yesno(sseu->has_eu_pg)); in intel_sseu_dump()
708 void intel_sseu_print_topology(const struct sseu_dev_info *sseu, in intel_sseu_print_topology() argument
713 if (sseu->max_slices == 0) { in intel_sseu_print_topology()
718 for (s = 0; s < sseu->max_slices; s++) { in intel_sseu_print_topology()
720 s, intel_sseu_subslices_per_slice(sseu, s), in intel_sseu_print_topology()
721 intel_sseu_get_subslices(sseu, s)); in intel_sseu_print_topology()
723 for (ss = 0; ss < sseu->max_subslices; ss++) { in intel_sseu_print_topology()
724 u16 enabled_eus = sseu_get_eus(sseu, s, ss); in intel_sseu_print_topology()