diff options
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.c | 50 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.h | 4 |
2 files changed, 54 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c index b55b3580ca1d..8caf72c1e794 100644 --- a/drivers/gpu/drm/i915/gvt/scheduler.c +++ b/drivers/gpu/drm/i915/gvt/scheduler.c | |||
| @@ -52,6 +52,54 @@ static void set_context_pdp_root_pointer( | |||
| 52 | pdp_pair[i].val = pdp[7 - i]; | 52 | pdp_pair[i].val = pdp[7 - i]; |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | /* | ||
| 56 | * when populating shadow ctx from guest, we should not overrride oa related | ||
| 57 | * registers, so that they will not be overlapped by guest oa configs. Thus | ||
| 58 | * made it possible to capture oa data from host for both host and guests. | ||
| 59 | */ | ||
| 60 | static void sr_oa_regs(struct intel_vgpu_workload *workload, | ||
| 61 | u32 *reg_state, bool save) | ||
| 62 | { | ||
| 63 | struct drm_i915_private *dev_priv = workload->vgpu->gvt->dev_priv; | ||
| 64 | u32 ctx_oactxctrl = dev_priv->perf.oa.ctx_oactxctrl_offset; | ||
| 65 | u32 ctx_flexeu0 = dev_priv->perf.oa.ctx_flexeu0_offset; | ||
| 66 | int i = 0; | ||
| 67 | u32 flex_mmio[] = { | ||
| 68 | i915_mmio_reg_offset(EU_PERF_CNTL0), | ||
| 69 | i915_mmio_reg_offset(EU_PERF_CNTL1), | ||
| 70 | i915_mmio_reg_offset(EU_PERF_CNTL2), | ||
| 71 | i915_mmio_reg_offset(EU_PERF_CNTL3), | ||
| 72 | i915_mmio_reg_offset(EU_PERF_CNTL4), | ||
| 73 | i915_mmio_reg_offset(EU_PERF_CNTL5), | ||
| 74 | i915_mmio_reg_offset(EU_PERF_CNTL6), | ||
| 75 | }; | ||
| 76 | |||
| 77 | if (!workload || !reg_state || workload->ring_id != RCS) | ||
| 78 | return; | ||
| 79 | |||
| 80 | if (save) { | ||
| 81 | workload->oactxctrl = reg_state[ctx_oactxctrl + 1]; | ||
| 82 | |||
| 83 | for (i = 0; i < ARRAY_SIZE(workload->flex_mmio); i++) { | ||
| 84 | u32 state_offset = ctx_flexeu0 + i * 2; | ||
| 85 | |||
| 86 | workload->flex_mmio[i] = reg_state[state_offset + 1]; | ||
| 87 | } | ||
| 88 | } else { | ||
| 89 | reg_state[ctx_oactxctrl] = | ||
| 90 | i915_mmio_reg_offset(GEN8_OACTXCONTROL); | ||
| 91 | reg_state[ctx_oactxctrl + 1] = workload->oactxctrl; | ||
| 92 | |||
| 93 | for (i = 0; i < ARRAY_SIZE(workload->flex_mmio); i++) { | ||
| 94 | u32 state_offset = ctx_flexeu0 + i * 2; | ||
| 95 | u32 mmio = flex_mmio[i]; | ||
| 96 | |||
| 97 | reg_state[state_offset] = mmio; | ||
| 98 | reg_state[state_offset + 1] = workload->flex_mmio[i]; | ||
| 99 | } | ||
| 100 | } | ||
| 101 | } | ||
| 102 | |||
| 55 | static int populate_shadow_context(struct intel_vgpu_workload *workload) | 103 | static int populate_shadow_context(struct intel_vgpu_workload *workload) |
| 56 | { | 104 | { |
| 57 | struct intel_vgpu *vgpu = workload->vgpu; | 105 | struct intel_vgpu *vgpu = workload->vgpu; |
| @@ -98,6 +146,7 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload) | |||
| 98 | page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN); | 146 | page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN); |
| 99 | shadow_ring_context = kmap(page); | 147 | shadow_ring_context = kmap(page); |
| 100 | 148 | ||
| 149 | sr_oa_regs(workload, (u32 *)shadow_ring_context, true); | ||
| 101 | #define COPY_REG(name) \ | 150 | #define COPY_REG(name) \ |
| 102 | intel_gvt_hypervisor_read_gpa(vgpu, workload->ring_context_gpa \ | 151 | intel_gvt_hypervisor_read_gpa(vgpu, workload->ring_context_gpa \ |
| 103 | + RING_CTX_OFF(name.val), &shadow_ring_context->name.val, 4) | 152 | + RING_CTX_OFF(name.val), &shadow_ring_context->name.val, 4) |
| @@ -122,6 +171,7 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload) | |||
| 122 | sizeof(*shadow_ring_context), | 171 | sizeof(*shadow_ring_context), |
| 123 | I915_GTT_PAGE_SIZE - sizeof(*shadow_ring_context)); | 172 | I915_GTT_PAGE_SIZE - sizeof(*shadow_ring_context)); |
| 124 | 173 | ||
| 174 | sr_oa_regs(workload, (u32 *)shadow_ring_context, false); | ||
| 125 | kunmap(page); | 175 | kunmap(page); |
| 126 | return 0; | 176 | return 0; |
| 127 | } | 177 | } |
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.h b/drivers/gpu/drm/i915/gvt/scheduler.h index ff175a98b19e..2603336b7c6d 100644 --- a/drivers/gpu/drm/i915/gvt/scheduler.h +++ b/drivers/gpu/drm/i915/gvt/scheduler.h | |||
| @@ -110,6 +110,10 @@ struct intel_vgpu_workload { | |||
| 110 | /* shadow batch buffer */ | 110 | /* shadow batch buffer */ |
| 111 | struct list_head shadow_bb; | 111 | struct list_head shadow_bb; |
| 112 | struct intel_shadow_wa_ctx wa_ctx; | 112 | struct intel_shadow_wa_ctx wa_ctx; |
| 113 | |||
| 114 | /* oa registers */ | ||
| 115 | u32 oactxctrl; | ||
| 116 | u32 flex_mmio[7]; | ||
| 113 | }; | 117 | }; |
| 114 | 118 | ||
| 115 | struct intel_vgpu_shadow_bb { | 119 | struct intel_vgpu_shadow_bb { |
