Skip to content

Commit 8fde410

Browse files
icklezhenyw
authored andcommitted
drm/i915/gvt: Wean gvt off dev_priv->engine[]
Stop trying to escape out of the gvt layer to find the engine that we initially setup for use with gvt. Record the engines during initialisation and use them henceforth. add/remove: 1/4 grow/shrink: 22/28 up/down: 341/-1410 (-1069) [Zhenyu: rebase, fix nonpriv register check fault, fix gvt engine thread run failure.] Cc: Ding Zhuocheng <[email protected]> Signed-off-by: Chris Wilson <[email protected]> Acked-by: Zhenyu Wang <[email protected]> Signed-off-by: Zhenyu Wang <[email protected]> Link: http://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent aa444fc commit 8fde410

File tree

11 files changed

+367
-412
lines changed

11 files changed

+367
-412
lines changed

drivers/gpu/drm/i915/gvt/cmd_parser.c

Lines changed: 92 additions & 112 deletions
Large diffs are not rendered by default.

drivers/gpu/drm/i915/gvt/execlist.c

Lines changed: 47 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@
3939
#define _EL_OFFSET_STATUS_BUF 0x370
4040
#define _EL_OFFSET_STATUS_PTR 0x3A0
4141

42-
#define execlist_ring_mmio(gvt, ring_id, offset) \
43-
(gvt->dev_priv->engine[ring_id]->mmio_base + (offset))
42+
#define execlist_ring_mmio(e, offset) ((e)->mmio_base + (offset))
4443

4544
#define valid_context(ctx) ((ctx)->valid)
4645
#define same_context(a, b) (((a)->context_id == (b)->context_id) && \
@@ -54,12 +53,12 @@ static int context_switch_events[] = {
5453
[VECS0] = VECS_AS_CONTEXT_SWITCH,
5554
};
5655

57-
static int ring_id_to_context_switch_event(unsigned int ring_id)
56+
static int to_context_switch_event(const struct intel_engine_cs *engine)
5857
{
59-
if (WARN_ON(ring_id >= ARRAY_SIZE(context_switch_events)))
58+
if (WARN_ON(engine->id >= ARRAY_SIZE(context_switch_events)))
6059
return -EINVAL;
6160

62-
return context_switch_events[ring_id];
61+
return context_switch_events[engine->id];
6362
}
6463

6564
static void switch_virtual_execlist_slot(struct intel_vgpu_execlist *execlist)
@@ -93,9 +92,8 @@ static void emulate_execlist_status(struct intel_vgpu_execlist *execlist)
9392
struct execlist_ctx_descriptor_format *desc = execlist->running_context;
9493
struct intel_vgpu *vgpu = execlist->vgpu;
9594
struct execlist_status_format status;
96-
int ring_id = execlist->ring_id;
97-
u32 status_reg = execlist_ring_mmio(vgpu->gvt,
98-
ring_id, _EL_OFFSET_STATUS);
95+
u32 status_reg =
96+
execlist_ring_mmio(execlist->engine, _EL_OFFSET_STATUS);
9997

10098
status.ldw = vgpu_vreg(vgpu, status_reg);
10199
status.udw = vgpu_vreg(vgpu, status_reg + 4);
@@ -124,21 +122,19 @@ static void emulate_execlist_status(struct intel_vgpu_execlist *execlist)
124122
}
125123

126124
static void emulate_csb_update(struct intel_vgpu_execlist *execlist,
127-
struct execlist_context_status_format *status,
128-
bool trigger_interrupt_later)
125+
struct execlist_context_status_format *status,
126+
bool trigger_interrupt_later)
129127
{
130128
struct intel_vgpu *vgpu = execlist->vgpu;
131-
int ring_id = execlist->ring_id;
132129
struct execlist_context_status_pointer_format ctx_status_ptr;
133130
u32 write_pointer;
134131
u32 ctx_status_ptr_reg, ctx_status_buf_reg, offset;
135132
unsigned long hwsp_gpa;
136-
struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
137133

138-
ctx_status_ptr_reg = execlist_ring_mmio(vgpu->gvt, ring_id,
139-
_EL_OFFSET_STATUS_PTR);
140-
ctx_status_buf_reg = execlist_ring_mmio(vgpu->gvt, ring_id,
141-
_EL_OFFSET_STATUS_BUF);
134+
ctx_status_ptr_reg =
135+
execlist_ring_mmio(execlist->engine, _EL_OFFSET_STATUS_PTR);
136+
ctx_status_buf_reg =
137+
execlist_ring_mmio(execlist->engine, _EL_OFFSET_STATUS_BUF);
142138

143139
ctx_status_ptr.dw = vgpu_vreg(vgpu, ctx_status_ptr_reg);
144140

@@ -161,26 +157,24 @@ static void emulate_csb_update(struct intel_vgpu_execlist *execlist,
161157

162158
/* Update the CSB and CSB write pointer in HWSP */
163159
hwsp_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
164-
vgpu->hws_pga[ring_id]);
160+
vgpu->hws_pga[execlist->engine->id]);
165161
if (hwsp_gpa != INTEL_GVT_INVALID_ADDR) {
166162
intel_gvt_hypervisor_write_gpa(vgpu,
167-
hwsp_gpa + I915_HWS_CSB_BUF0_INDEX * 4 +
168-
write_pointer * 8,
169-
status, 8);
163+
hwsp_gpa + I915_HWS_CSB_BUF0_INDEX * 4 + write_pointer * 8,
164+
status, 8);
170165
intel_gvt_hypervisor_write_gpa(vgpu,
171-
hwsp_gpa +
172-
intel_hws_csb_write_index(dev_priv) * 4,
173-
&write_pointer, 4);
166+
hwsp_gpa + intel_hws_csb_write_index(execlist->engine->i915) * 4,
167+
&write_pointer, 4);
174168
}
175169

176170
gvt_dbg_el("vgpu%d: w pointer %u reg %x csb l %x csb h %x\n",
177-
vgpu->id, write_pointer, offset, status->ldw, status->udw);
171+
vgpu->id, write_pointer, offset, status->ldw, status->udw);
178172

179173
if (trigger_interrupt_later)
180174
return;
181175

182176
intel_vgpu_trigger_virtual_event(vgpu,
183-
ring_id_to_context_switch_event(execlist->ring_id));
177+
to_context_switch_event(execlist->engine));
184178
}
185179

186180
static int emulate_execlist_ctx_schedule_out(
@@ -261,9 +255,8 @@ static struct intel_vgpu_execlist_slot *get_next_execlist_slot(
261255
struct intel_vgpu_execlist *execlist)
262256
{
263257
struct intel_vgpu *vgpu = execlist->vgpu;
264-
int ring_id = execlist->ring_id;
265-
u32 status_reg = execlist_ring_mmio(vgpu->gvt, ring_id,
266-
_EL_OFFSET_STATUS);
258+
u32 status_reg =
259+
execlist_ring_mmio(execlist->engine, _EL_OFFSET_STATUS);
267260
struct execlist_status_format status;
268261

269262
status.ldw = vgpu_vreg(vgpu, status_reg);
@@ -379,7 +372,6 @@ static int prepare_execlist_workload(struct intel_vgpu_workload *workload)
379372
struct intel_vgpu *vgpu = workload->vgpu;
380373
struct intel_vgpu_submission *s = &vgpu->submission;
381374
struct execlist_ctx_descriptor_format ctx[2];
382-
int ring_id = workload->ring_id;
383375
int ret;
384376

385377
if (!workload->emulate_schedule_in)
@@ -388,7 +380,8 @@ static int prepare_execlist_workload(struct intel_vgpu_workload *workload)
388380
ctx[0] = *get_desc_from_elsp_dwords(&workload->elsp_dwords, 0);
389381
ctx[1] = *get_desc_from_elsp_dwords(&workload->elsp_dwords, 1);
390382

391-
ret = emulate_execlist_schedule_in(&s->execlist[ring_id], ctx);
383+
ret = emulate_execlist_schedule_in(&s->execlist[workload->engine->id],
384+
ctx);
392385
if (ret) {
393386
gvt_vgpu_err("fail to emulate execlist schedule in\n");
394387
return ret;
@@ -399,21 +392,21 @@ static int prepare_execlist_workload(struct intel_vgpu_workload *workload)
399392
static int complete_execlist_workload(struct intel_vgpu_workload *workload)
400393
{
401394
struct intel_vgpu *vgpu = workload->vgpu;
402-
int ring_id = workload->ring_id;
403395
struct intel_vgpu_submission *s = &vgpu->submission;
404-
struct intel_vgpu_execlist *execlist = &s->execlist[ring_id];
396+
struct intel_vgpu_execlist *execlist =
397+
&s->execlist[workload->engine->id];
405398
struct intel_vgpu_workload *next_workload;
406-
struct list_head *next = workload_q_head(vgpu, ring_id)->next;
399+
struct list_head *next = workload_q_head(vgpu, workload->engine)->next;
407400
bool lite_restore = false;
408401
int ret = 0;
409402

410-
gvt_dbg_el("complete workload %p status %d\n", workload,
411-
workload->status);
403+
gvt_dbg_el("complete workload %p status %d\n",
404+
workload, workload->status);
412405

413-
if (workload->status || (vgpu->resetting_eng & BIT(ring_id)))
406+
if (workload->status || vgpu->resetting_eng & workload->engine->mask)
414407
goto out;
415408

416-
if (!list_empty(workload_q_head(vgpu, ring_id))) {
409+
if (!list_empty(workload_q_head(vgpu, workload->engine))) {
417410
struct execlist_ctx_descriptor_format *this_desc, *next_desc;
418411

419412
next_workload = container_of(next,
@@ -436,14 +429,15 @@ static int complete_execlist_workload(struct intel_vgpu_workload *workload)
436429
return ret;
437430
}
438431

439-
static int submit_context(struct intel_vgpu *vgpu, int ring_id,
440-
struct execlist_ctx_descriptor_format *desc,
441-
bool emulate_schedule_in)
432+
static int submit_context(struct intel_vgpu *vgpu,
433+
const struct intel_engine_cs *engine,
434+
struct execlist_ctx_descriptor_format *desc,
435+
bool emulate_schedule_in)
442436
{
443437
struct intel_vgpu_submission *s = &vgpu->submission;
444438
struct intel_vgpu_workload *workload = NULL;
445439

446-
workload = intel_vgpu_create_workload(vgpu, ring_id, desc);
440+
workload = intel_vgpu_create_workload(vgpu, engine, desc);
447441
if (IS_ERR(workload))
448442
return PTR_ERR(workload);
449443

@@ -452,19 +446,20 @@ static int submit_context(struct intel_vgpu *vgpu, int ring_id,
452446
workload->emulate_schedule_in = emulate_schedule_in;
453447

454448
if (emulate_schedule_in)
455-
workload->elsp_dwords = s->execlist[ring_id].elsp_dwords;
449+
workload->elsp_dwords = s->execlist[engine->id].elsp_dwords;
456450

457451
gvt_dbg_el("workload %p emulate schedule_in %d\n", workload,
458-
emulate_schedule_in);
452+
emulate_schedule_in);
459453

460454
intel_vgpu_queue_workload(workload);
461455
return 0;
462456
}
463457

464-
int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id)
458+
int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu,
459+
const struct intel_engine_cs *engine)
465460
{
466461
struct intel_vgpu_submission *s = &vgpu->submission;
467-
struct intel_vgpu_execlist *execlist = &s->execlist[ring_id];
462+
struct intel_vgpu_execlist *execlist = &s->execlist[engine->id];
468463
struct execlist_ctx_descriptor_format *desc[2];
469464
int i, ret;
470465

@@ -489,7 +484,7 @@ int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id)
489484
for (i = 0; i < ARRAY_SIZE(desc); i++) {
490485
if (!desc[i]->valid)
491486
continue;
492-
ret = submit_context(vgpu, ring_id, desc[i], i == 0);
487+
ret = submit_context(vgpu, engine, desc[i], i == 0);
493488
if (ret) {
494489
gvt_vgpu_err("failed to submit desc %d\n", i);
495490
return ret;
@@ -504,22 +499,22 @@ int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id)
504499
return -EINVAL;
505500
}
506501

507-
static void init_vgpu_execlist(struct intel_vgpu *vgpu, int ring_id)
502+
static void init_vgpu_execlist(struct intel_vgpu *vgpu,
503+
const struct intel_engine_cs *engine)
508504
{
509505
struct intel_vgpu_submission *s = &vgpu->submission;
510-
struct intel_vgpu_execlist *execlist = &s->execlist[ring_id];
506+
struct intel_vgpu_execlist *execlist = &s->execlist[engine->id];
511507
struct execlist_context_status_pointer_format ctx_status_ptr;
512508
u32 ctx_status_ptr_reg;
513509

514510
memset(execlist, 0, sizeof(*execlist));
515511

516512
execlist->vgpu = vgpu;
517-
execlist->ring_id = ring_id;
513+
execlist->engine = engine;
518514
execlist->slot[0].index = 0;
519515
execlist->slot[1].index = 1;
520516

521-
ctx_status_ptr_reg = execlist_ring_mmio(vgpu->gvt, ring_id,
522-
_EL_OFFSET_STATUS_PTR);
517+
ctx_status_ptr_reg = execlist_ring_mmio(engine, _EL_OFFSET_STATUS_PTR);
523518
ctx_status_ptr.dw = vgpu_vreg(vgpu, ctx_status_ptr_reg);
524519
ctx_status_ptr.read_ptr = 0;
525520
ctx_status_ptr.write_ptr = 0x7;
@@ -549,7 +544,7 @@ static void reset_execlist(struct intel_vgpu *vgpu,
549544
intel_engine_mask_t tmp;
550545

551546
for_each_engine_masked(engine, &dev_priv->gt, engine_mask, tmp)
552-
init_vgpu_execlist(vgpu, engine->id);
547+
init_vgpu_execlist(vgpu, engine);
553548
}
554549

555550
static int init_execlist(struct intel_vgpu *vgpu,

drivers/gpu/drm/i915/gvt/execlist.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,16 +170,17 @@ struct intel_vgpu_execlist {
170170
struct intel_vgpu_execlist_slot *running_slot;
171171
struct intel_vgpu_execlist_slot *pending_slot;
172172
struct execlist_ctx_descriptor_format *running_context;
173-
int ring_id;
174173
struct intel_vgpu *vgpu;
175174
struct intel_vgpu_elsp_dwords elsp_dwords;
175+
const struct intel_engine_cs *engine;
176176
};
177177

178178
void intel_vgpu_clean_execlist(struct intel_vgpu *vgpu);
179179

180180
int intel_vgpu_init_execlist(struct intel_vgpu *vgpu);
181181

182-
int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id);
182+
int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu,
183+
const struct intel_engine_cs *engine);
183184

184185
void intel_vgpu_reset_execlist(struct intel_vgpu *vgpu,
185186
intel_engine_mask_t engine_mask);

drivers/gpu/drm/i915/gvt/gvt.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
318318
mutex_init(&gvt->lock);
319319
mutex_init(&gvt->sched_lock);
320320
gvt->dev_priv = dev_priv;
321+
dev_priv->gvt = gvt;
321322

322323
init_device_info(gvt);
323324

@@ -376,7 +377,6 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
376377
intel_gvt_debugfs_init(gvt);
377378

378379
gvt_dbg_core("gvt device initialization is done\n");
379-
dev_priv->gvt = gvt;
380380
intel_gvt_host.dev = &dev_priv->drm.pdev->dev;
381381
intel_gvt_host.initialized = true;
382382
return 0;
@@ -402,6 +402,7 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
402402
out_clean_idr:
403403
idr_destroy(&gvt->vgpu_idr);
404404
kfree(gvt);
405+
dev_priv->gvt = NULL;
405406
return ret;
406407
}
407408

0 commit comments

Comments
 (0)