• Home
  • Raw
  • Download

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(&sseu->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 void gen11_compute_sseu_info(struct sseu_dev_info *sseu, in gen11_compute_sseu_info() argument
109 GEM_BUG_ON(sseu->max_slices * sseu->max_subslices > in gen11_compute_sseu_info()
112 for (s = 0; s < sseu->max_slices; s++) { in gen11_compute_sseu_info()
116 sseu->slice_mask |= BIT(s); in gen11_compute_sseu_info()
118 intel_sseu_set_subslices(sseu, s, ss_en); in gen11_compute_sseu_info()
120 for (ss = 0; ss < sseu->max_subslices; ss++) in gen11_compute_sseu_info()
121 if (intel_sseu_has_subslice(sseu, s, ss)) in gen11_compute_sseu_info()
122 sseu_set_eus(sseu, s, ss, eu_en); in gen11_compute_sseu_info()
124 sseu->eu_per_subslice = hweight16(eu_en); in gen11_compute_sseu_info()
125 sseu->eu_total = compute_eu_total(sseu); in gen11_compute_sseu_info()
130 struct sseu_dev_info *sseu = &gt->info.sseu; in gen12_sseu_info_init() local
149 intel_sseu_set_info(sseu, 1, 32, 16); in gen12_sseu_info_init()
151 intel_sseu_set_info(sseu, 1, 6, 16); in gen12_sseu_info_init()
172 for (eu = 0; eu < sseu->max_eus_per_subslice / 2; eu++) in gen12_sseu_info_init()
176 gen11_compute_sseu_info(sseu, s_en, dss_en, eu_en); in gen12_sseu_info_init()
179 sseu->has_slice_pg = 1; in gen12_sseu_info_init()
184 struct sseu_dev_info *sseu = &gt->info.sseu; in gen11_sseu_info_init() local
191 intel_sseu_set_info(sseu, 1, 4, 8); in gen11_sseu_info_init()
193 intel_sseu_set_info(sseu, 1, 8, 8); in gen11_sseu_info_init()
202 gen11_compute_sseu_info(sseu, s_en, ss_en, eu_en); in gen11_sseu_info_init()
205 sseu->has_slice_pg = 1; in gen11_sseu_info_init()
206 sseu->has_subslice_pg = 1; in gen11_sseu_info_init()
207 sseu->has_eu_pg = 1; in gen11_sseu_info_init()
212 struct sseu_dev_info *sseu = &gt->info.sseu; in cherryview_sseu_info_init() local
218 sseu->slice_mask = BIT(0); in cherryview_sseu_info_init()
219 intel_sseu_set_info(sseu, 1, 2, 8); in cherryview_sseu_info_init()
229 sseu_set_eus(sseu, 0, 0, ~disabled_mask); in cherryview_sseu_info_init()
240 sseu_set_eus(sseu, 0, 1, ~disabled_mask); in cherryview_sseu_info_init()
243 intel_sseu_set_subslices(sseu, 0, subslice_mask); in cherryview_sseu_info_init()
245 sseu->eu_total = compute_eu_total(sseu); in cherryview_sseu_info_init()
251 sseu->eu_per_subslice = intel_sseu_subslice_total(sseu) ? in cherryview_sseu_info_init()
252 sseu->eu_total / in cherryview_sseu_info_init()
253 intel_sseu_subslice_total(sseu) : in cherryview_sseu_info_init()
260 sseu->has_slice_pg = 0; in cherryview_sseu_info_init()
261 sseu->has_subslice_pg = intel_sseu_subslice_total(sseu) > 1; in cherryview_sseu_info_init()
262 sseu->has_eu_pg = (sseu->eu_per_subslice > 2); in cherryview_sseu_info_init()
269 struct sseu_dev_info *sseu = &gt->info.sseu; in gen9_sseu_info_init() local
276 sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT; in gen9_sseu_info_init()
279 intel_sseu_set_info(sseu, IS_GEN9_LP(i915) ? 1 : 3, in gen9_sseu_info_init()
286 subslice_mask = (1 << sseu->max_subslices) - 1; in gen9_sseu_info_init()
294 for (s = 0; s < sseu->max_slices; s++) { in gen9_sseu_info_init()
295 if (!(sseu->slice_mask & BIT(s))) in gen9_sseu_info_init()
299 intel_sseu_set_subslices(sseu, s, subslice_mask); in gen9_sseu_info_init()
302 for (ss = 0; ss < sseu->max_subslices; ss++) { in gen9_sseu_info_init()
306 if (!intel_sseu_has_subslice(sseu, s, ss)) in gen9_sseu_info_init()
312 sseu_set_eus(sseu, s, ss, ~eu_disabled_mask); in gen9_sseu_info_init()
314 eu_per_ss = sseu->max_eus_per_subslice - in gen9_sseu_info_init()
323 sseu->subslice_7eu[s] |= BIT(ss); in gen9_sseu_info_init()
327 sseu->eu_total = compute_eu_total(sseu); in gen9_sseu_info_init()
336 sseu->eu_per_subslice = in gen9_sseu_info_init()
337 intel_sseu_subslice_total(sseu) ? in gen9_sseu_info_init()
338 DIV_ROUND_UP(sseu->eu_total, intel_sseu_subslice_total(sseu)) : in gen9_sseu_info_init()
349 sseu->has_slice_pg = in gen9_sseu_info_init()
350 !IS_GEN9_LP(i915) && hweight8(sseu->slice_mask) > 1; in gen9_sseu_info_init()
351 sseu->has_subslice_pg = in gen9_sseu_info_init()
352 IS_GEN9_LP(i915) && intel_sseu_subslice_total(sseu) > 1; in gen9_sseu_info_init()
353 sseu->has_eu_pg = sseu->eu_per_subslice > 2; in gen9_sseu_info_init()
356 #define IS_SS_DISABLED(ss) (!(sseu->subslice_mask[0] & BIT(ss))) in gen9_sseu_info_init()
357 info->has_pooled_eu = hweight8(sseu->subslice_mask[0]) == 3; in gen9_sseu_info_init()
359 sseu->min_eu_in_pool = 0; in gen9_sseu_info_init()
362 sseu->min_eu_in_pool = 3; in gen9_sseu_info_init()
364 sseu->min_eu_in_pool = 6; in gen9_sseu_info_init()
366 sseu->min_eu_in_pool = 9; in gen9_sseu_info_init()
374 struct sseu_dev_info *sseu = &gt->info.sseu; in bdw_sseu_info_init() local
381 sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT; in bdw_sseu_info_init()
382 intel_sseu_set_info(sseu, 3, 3, 8); in bdw_sseu_info_init()
388 subslice_mask = GENMASK(sseu->max_subslices - 1, 0); in bdw_sseu_info_init()
406 for (s = 0; s < sseu->max_slices; s++) { in bdw_sseu_info_init()
407 if (!(sseu->slice_mask & BIT(s))) in bdw_sseu_info_init()
411 intel_sseu_set_subslices(sseu, s, subslice_mask); in bdw_sseu_info_init()
413 for (ss = 0; ss < sseu->max_subslices; ss++) { in bdw_sseu_info_init()
417 if (!intel_sseu_has_subslice(sseu, s, ss)) in bdw_sseu_info_init()
422 eu_disable[s] >> (ss * sseu->max_eus_per_subslice); in bdw_sseu_info_init()
424 sseu_set_eus(sseu, s, ss, ~eu_disabled_mask); in bdw_sseu_info_init()
431 if (sseu->max_eus_per_subslice - n_disabled == 7) in bdw_sseu_info_init()
432 sseu->subslice_7eu[s] |= 1 << ss; in bdw_sseu_info_init()
436 sseu->eu_total = compute_eu_total(sseu); in bdw_sseu_info_init()
443 sseu->eu_per_subslice = in bdw_sseu_info_init()
444 intel_sseu_subslice_total(sseu) ? in bdw_sseu_info_init()
445 DIV_ROUND_UP(sseu->eu_total, intel_sseu_subslice_total(sseu)) : in bdw_sseu_info_init()
452 sseu->has_slice_pg = hweight8(sseu->slice_mask) > 1; in bdw_sseu_info_init()
453 sseu->has_subslice_pg = 0; in bdw_sseu_info_init()
454 sseu->has_eu_pg = 0; in bdw_sseu_info_init()
460 struct sseu_dev_info *sseu = &gt->info.sseu; in hsw_sseu_info_init() local
474 sseu->slice_mask = BIT(0); in hsw_sseu_info_init()
478 sseu->slice_mask = BIT(0); in hsw_sseu_info_init()
482 sseu->slice_mask = BIT(0) | BIT(1); in hsw_sseu_info_init()
494 sseu->eu_per_subslice = 10; in hsw_sseu_info_init()
497 sseu->eu_per_subslice = 8; in hsw_sseu_info_init()
500 sseu->eu_per_subslice = 6; in hsw_sseu_info_init()
504 intel_sseu_set_info(sseu, hweight8(sseu->slice_mask), in hsw_sseu_info_init()
506 sseu->eu_per_subslice); in hsw_sseu_info_init()
508 for (s = 0; s < sseu->max_slices; s++) { in hsw_sseu_info_init()
509 intel_sseu_set_subslices(sseu, s, subslice_mask); in hsw_sseu_info_init()
511 for (ss = 0; ss < sseu->max_subslices; ss++) { in hsw_sseu_info_init()
512 sseu_set_eus(sseu, s, ss, in hsw_sseu_info_init()
513 (1UL << sseu->eu_per_subslice) - 1); in hsw_sseu_info_init()
517 sseu->eu_total = compute_eu_total(sseu); in hsw_sseu_info_init()
520 sseu->has_slice_pg = 0; in hsw_sseu_info_init()
521 sseu->has_subslice_pg = 0; in hsw_sseu_info_init()
522 sseu->has_eu_pg = 0; in hsw_sseu_info_init()
547 const struct sseu_dev_info *sseu = &gt->info.sseu; in intel_sseu_make_rpcs() local
548 bool subslice_pg = sseu->has_subslice_pg; in intel_sseu_make_rpcs()
564 req_sseu = &i915->perf.sseu; in intel_sseu_make_rpcs()
596 subslices > min_t(u8, 4, hweight8(sseu->subslice_mask[0]) / 2)) { in intel_sseu_make_rpcs()
609 if (sseu->has_slice_pg) { in intel_sseu_make_rpcs()
637 if (sseu->has_eu_pg) { in intel_sseu_make_rpcs()
658 void intel_sseu_dump(const struct sseu_dev_info *sseu, struct drm_printer *p) in intel_sseu_dump() argument
663 hweight8(sseu->slice_mask), sseu->slice_mask); in intel_sseu_dump()
664 drm_printf(p, "subslice total: %u\n", intel_sseu_subslice_total(sseu)); in intel_sseu_dump()
665 for (s = 0; s < sseu->max_slices; s++) { in intel_sseu_dump()
667 s, intel_sseu_subslices_per_slice(sseu, s), in intel_sseu_dump()
668 intel_sseu_get_subslices(sseu, s)); in intel_sseu_dump()
670 drm_printf(p, "EU total: %u\n", sseu->eu_total); in intel_sseu_dump()
671 drm_printf(p, "EU per subslice: %u\n", sseu->eu_per_subslice); in intel_sseu_dump()
673 yesno(sseu->has_slice_pg)); in intel_sseu_dump()
675 yesno(sseu->has_subslice_pg)); in intel_sseu_dump()
676 drm_printf(p, "has EU power gating: %s\n", yesno(sseu->has_eu_pg)); in intel_sseu_dump()
679 void intel_sseu_print_topology(const struct sseu_dev_info *sseu, in intel_sseu_print_topology() argument
684 if (sseu->max_slices == 0) { in intel_sseu_print_topology()
689 for (s = 0; s < sseu->max_slices; s++) { in intel_sseu_print_topology()
691 s, intel_sseu_subslices_per_slice(sseu, s), in intel_sseu_print_topology()
692 intel_sseu_get_subslices(sseu, s)); in intel_sseu_print_topology()
694 for (ss = 0; ss < sseu->max_subslices; ss++) { in intel_sseu_print_topology()
695 u16 enabled_eus = sseu_get_eus(sseu, s, ss); in intel_sseu_print_topology()