@@ -210,27 +210,44 @@ static void xehp_sseu_info_init(struct intel_gt *gt)
210210 struct intel_uncore * uncore = gt -> uncore ;
211211 u16 eu_en = 0 ;
212212 u8 eu_en_fuse ;
213+ int num_compute_regs , num_geometry_regs ;
213214 int eu ;
214215
216+ if (IS_PONTEVECCHIO (gt -> i915 )) {
217+ num_geometry_regs = 0 ;
218+ num_compute_regs = 2 ;
219+ } else {
220+ num_geometry_regs = 1 ;
221+ num_compute_regs = 1 ;
222+ }
223+
215224 /*
216225 * The concept of slice has been removed in Xe_HP. To be compatible
217226 * with prior generations, assume a single slice across the entire
218227 * device. Then calculate out the DSS for each workload type within
219228 * that software slice.
220229 */
221- intel_sseu_set_info (sseu , 1 , 32 , 16 );
230+ intel_sseu_set_info (sseu , 1 ,
231+ 32 * max (num_geometry_regs , num_compute_regs ),
232+ 16 );
222233 sseu -> has_xehp_dss = 1 ;
223234
224- xehp_load_dss_mask (uncore , & sseu -> geometry_subslice_mask , 1 ,
235+ xehp_load_dss_mask (uncore , & sseu -> geometry_subslice_mask ,
236+ num_geometry_regs ,
225237 GEN12_GT_GEOMETRY_DSS_ENABLE );
226- xehp_load_dss_mask (uncore , & sseu -> compute_subslice_mask , 1 ,
227- GEN12_GT_COMPUTE_DSS_ENABLE );
238+ xehp_load_dss_mask (uncore , & sseu -> compute_subslice_mask ,
239+ num_compute_regs ,
240+ GEN12_GT_COMPUTE_DSS_ENABLE ,
241+ XEHPC_GT_COMPUTE_DSS_ENABLE_EXT );
228242
229243 eu_en_fuse = intel_uncore_read (uncore , XEHP_EU_ENABLE ) & XEHP_EU_ENA_MASK ;
230244
231- for (eu = 0 ; eu < sseu -> max_eus_per_subslice / 2 ; eu ++ )
232- if (eu_en_fuse & BIT (eu ))
233- eu_en |= BIT (eu * 2 ) | BIT (eu * 2 + 1 );
245+ if (HAS_ONE_EU_PER_FUSE_BIT (gt -> i915 ))
246+ eu_en = eu_en_fuse ;
247+ else
248+ for (eu = 0 ; eu < sseu -> max_eus_per_subslice / 2 ; eu ++ )
249+ if (eu_en_fuse & BIT (eu ))
250+ eu_en |= BIT (eu * 2 ) | BIT (eu * 2 + 1 );
234251
235252 xehp_compute_sseu_info (sseu , eu_en );
236253}
0 commit comments