@@ -194,6 +194,7 @@ static int emit_wa_job(struct xe_gt *gt, struct xe_exec_queue *q)
194
194
unsigned long idx ;
195
195
struct xe_bb * bb ;
196
196
size_t bb_len = 0 ;
197
+ u32 * cs ;
197
198
198
199
/* count RMW registers as those will be handled separately */
199
200
xa_for_each (& sr -> xa , idx , entry ) {
@@ -222,13 +223,15 @@ static int emit_wa_job(struct xe_gt *gt, struct xe_exec_queue *q)
222
223
if (IS_ERR (bb ))
223
224
return PTR_ERR (bb );
224
225
226
+ cs = bb -> cs ;
227
+
225
228
if (count ) {
226
229
/*
227
230
* Emit single LRI with all non RMW regs: 1 leading dw + 2dw per
228
231
* reg + 1
229
232
*/
230
233
231
- bb -> cs [ bb -> len ++ ] = MI_LOAD_REGISTER_IMM | MI_LRI_NUM_REGS (count );
234
+ * cs ++ = MI_LOAD_REGISTER_IMM | MI_LRI_NUM_REGS (count );
232
235
233
236
xa_for_each (& sr -> xa , idx , entry ) {
234
237
struct xe_reg reg = entry -> reg ;
@@ -243,8 +246,8 @@ static int emit_wa_job(struct xe_gt *gt, struct xe_exec_queue *q)
243
246
244
247
val |= entry -> set_bits ;
245
248
246
- bb -> cs [ bb -> len ++ ] = reg .addr ;
247
- bb -> cs [ bb -> len ++ ] = val ;
249
+ * cs ++ = reg .addr ;
250
+ * cs ++ = val ;
248
251
xe_gt_dbg (gt , "REG[0x%x] = 0x%08x" , reg .addr , val );
249
252
}
250
253
}
@@ -256,46 +259,49 @@ static int emit_wa_job(struct xe_gt *gt, struct xe_exec_queue *q)
256
259
if (entry -> reg .masked || entry -> clr_bits == ~0 )
257
260
continue ;
258
261
259
- bb -> cs [ bb -> len ++ ] = MI_LOAD_REGISTER_REG | MI_LRR_DST_CS_MMIO ;
260
- bb -> cs [ bb -> len ++ ] = entry -> reg .addr ;
261
- bb -> cs [ bb -> len ++ ] = CS_GPR_REG (0 , 0 ).addr ;
262
-
263
- bb -> cs [ bb -> len ++ ] = MI_LOAD_REGISTER_IMM | MI_LRI_NUM_REGS (2 ) |
264
- MI_LRI_LRM_CS_MMIO ;
265
- bb -> cs [ bb -> len ++ ] = CS_GPR_REG (0 , 1 ).addr ;
266
- bb -> cs [ bb -> len ++ ] = entry -> clr_bits ;
267
- bb -> cs [ bb -> len ++ ] = CS_GPR_REG (0 , 2 ).addr ;
268
- bb -> cs [ bb -> len ++ ] = entry -> set_bits ;
269
-
270
- bb -> cs [ bb -> len ++ ] = MI_MATH (8 );
271
- bb -> cs [ bb -> len ++ ] = CS_ALU_INSTR_LOAD (SRCA , REG0 );
272
- bb -> cs [ bb -> len ++ ] = CS_ALU_INSTR_LOADINV (SRCB , REG1 );
273
- bb -> cs [ bb -> len ++ ] = CS_ALU_INSTR_AND ;
274
- bb -> cs [ bb -> len ++ ] = CS_ALU_INSTR_STORE (REG0 , ACCU );
275
- bb -> cs [ bb -> len ++ ] = CS_ALU_INSTR_LOAD (SRCA , REG0 );
276
- bb -> cs [ bb -> len ++ ] = CS_ALU_INSTR_LOAD (SRCB , REG2 );
277
- bb -> cs [ bb -> len ++ ] = CS_ALU_INSTR_OR ;
278
- bb -> cs [ bb -> len ++ ] = CS_ALU_INSTR_STORE (REG0 , ACCU );
279
-
280
- bb -> cs [ bb -> len ++ ] = MI_LOAD_REGISTER_REG | MI_LRR_SRC_CS_MMIO ;
281
- bb -> cs [ bb -> len ++ ] = CS_GPR_REG (0 , 0 ).addr ;
282
- bb -> cs [ bb -> len ++ ] = entry -> reg .addr ;
262
+ * cs ++ = MI_LOAD_REGISTER_REG | MI_LRR_DST_CS_MMIO ;
263
+ * cs ++ = entry -> reg .addr ;
264
+ * cs ++ = CS_GPR_REG (0 , 0 ).addr ;
265
+
266
+ * cs ++ = MI_LOAD_REGISTER_IMM | MI_LRI_NUM_REGS (2 ) |
267
+ MI_LRI_LRM_CS_MMIO ;
268
+ * cs ++ = CS_GPR_REG (0 , 1 ).addr ;
269
+ * cs ++ = entry -> clr_bits ;
270
+ * cs ++ = CS_GPR_REG (0 , 2 ).addr ;
271
+ * cs ++ = entry -> set_bits ;
272
+
273
+ * cs ++ = MI_MATH (8 );
274
+ * cs ++ = CS_ALU_INSTR_LOAD (SRCA , REG0 );
275
+ * cs ++ = CS_ALU_INSTR_LOADINV (SRCB , REG1 );
276
+ * cs ++ = CS_ALU_INSTR_AND ;
277
+ * cs ++ = CS_ALU_INSTR_STORE (REG0 , ACCU );
278
+ * cs ++ = CS_ALU_INSTR_LOAD (SRCA , REG0 );
279
+ * cs ++ = CS_ALU_INSTR_LOAD (SRCB , REG2 );
280
+ * cs ++ = CS_ALU_INSTR_OR ;
281
+ * cs ++ = CS_ALU_INSTR_STORE (REG0 , ACCU );
282
+
283
+ * cs ++ = MI_LOAD_REGISTER_REG | MI_LRR_SRC_CS_MMIO ;
284
+ * cs ++ = CS_GPR_REG (0 , 0 ).addr ;
285
+ * cs ++ = entry -> reg .addr ;
283
286
284
287
xe_gt_dbg (gt , "REG[%#x] = ~%#x|%#x\n" ,
285
288
entry -> reg .addr , entry -> clr_bits , entry -> set_bits );
286
289
}
287
290
288
291
/* reset used GPR */
289
- bb -> cs [bb -> len ++ ] = MI_LOAD_REGISTER_IMM | MI_LRI_NUM_REGS (3 ) | MI_LRI_LRM_CS_MMIO ;
290
- bb -> cs [bb -> len ++ ] = CS_GPR_REG (0 , 0 ).addr ;
291
- bb -> cs [bb -> len ++ ] = 0 ;
292
- bb -> cs [bb -> len ++ ] = CS_GPR_REG (0 , 1 ).addr ;
293
- bb -> cs [bb -> len ++ ] = 0 ;
294
- bb -> cs [bb -> len ++ ] = CS_GPR_REG (0 , 2 ).addr ;
295
- bb -> cs [bb -> len ++ ] = 0 ;
292
+ * cs ++ = MI_LOAD_REGISTER_IMM | MI_LRI_NUM_REGS (3 ) |
293
+ MI_LRI_LRM_CS_MMIO ;
294
+ * cs ++ = CS_GPR_REG (0 , 0 ).addr ;
295
+ * cs ++ = 0 ;
296
+ * cs ++ = CS_GPR_REG (0 , 1 ).addr ;
297
+ * cs ++ = 0 ;
298
+ * cs ++ = CS_GPR_REG (0 , 2 ).addr ;
299
+ * cs ++ = 0 ;
296
300
}
297
301
298
- xe_lrc_emit_hwe_state_instructions (q , bb );
302
+ cs = xe_lrc_emit_hwe_state_instructions (q , cs );
303
+
304
+ bb -> len = cs - bb -> cs ;
299
305
300
306
ret = emit_job_sync (q , bb , HZ );
301
307
0 commit comments