aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/gvt/gtt.c12
-rw-r--r--drivers/gpu/drm/i915/gvt/handlers.c13
-rw-r--r--drivers/gpu/drm/i915/gvt/reg.h2
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.c25
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.h1
5 files changed, 46 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
index d767c45a57e2..53115bdae12b 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.c
+++ b/drivers/gpu/drm/i915/gvt/gtt.c
@@ -948,7 +948,16 @@ static int ppgtt_invalidate_spt_by_shadow_entry(struct intel_vgpu *vgpu,
948 948
949 if (e->type != GTT_TYPE_PPGTT_ROOT_L3_ENTRY 949 if (e->type != GTT_TYPE_PPGTT_ROOT_L3_ENTRY
950 && e->type != GTT_TYPE_PPGTT_ROOT_L4_ENTRY) { 950 && e->type != GTT_TYPE_PPGTT_ROOT_L4_ENTRY) {
951 cur_pt_type = get_next_pt_type(e->type) + 1; 951 cur_pt_type = get_next_pt_type(e->type);
952
953 if (!gtt_type_is_pt(cur_pt_type) ||
954 !gtt_type_is_pt(cur_pt_type + 1)) {
955 WARN(1, "Invalid page table type, cur_pt_type is: %d\n", cur_pt_type);
956 return -EINVAL;
957 }
958
959 cur_pt_type += 1;
960
952 if (ops->get_pfn(e) == 961 if (ops->get_pfn(e) ==
953 vgpu->gtt.scratch_pt[cur_pt_type].page_mfn) 962 vgpu->gtt.scratch_pt[cur_pt_type].page_mfn)
954 return 0; 963 return 0;
@@ -1108,6 +1117,7 @@ static struct intel_vgpu_ppgtt_spt *ppgtt_populate_spt_by_guest_entry(
1108 1117
1109err_free_spt: 1118err_free_spt:
1110 ppgtt_free_spt(spt); 1119 ppgtt_free_spt(spt);
1120 spt = NULL;
1111err: 1121err:
1112 gvt_vgpu_err("fail: shadow page %p guest entry 0x%llx type %d\n", 1122 gvt_vgpu_err("fail: shadow page %p guest entry 0x%llx type %d\n",
1113 spt, we->val64, we->type); 1123 spt, we->val64, we->type);
diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c
index 7732caa1a546..a6ade66349bd 100644
--- a/drivers/gpu/drm/i915/gvt/handlers.c
+++ b/drivers/gpu/drm/i915/gvt/handlers.c
@@ -1924,7 +1924,8 @@ static int init_generic_mmio_info(struct intel_gvt *gvt)
1924 MMIO_DFH(_MMIO(0x20dc), D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); 1924 MMIO_DFH(_MMIO(0x20dc), D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
1925 MMIO_DFH(_3D_CHICKEN3, D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); 1925 MMIO_DFH(_3D_CHICKEN3, D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
1926 MMIO_DFH(_MMIO(0x2088), D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); 1926 MMIO_DFH(_MMIO(0x2088), D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
1927 MMIO_DFH(_MMIO(0x20e4), D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); 1927 MMIO_DFH(FF_SLICE_CS_CHICKEN2, D_ALL,
1928 F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
1928 MMIO_DFH(_MMIO(0x2470), D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); 1929 MMIO_DFH(_MMIO(0x2470), D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
1929 MMIO_DFH(GAM_ECOCHK, D_ALL, F_CMD_ACCESS, NULL, NULL); 1930 MMIO_DFH(GAM_ECOCHK, D_ALL, F_CMD_ACCESS, NULL, NULL);
1930 MMIO_DFH(GEN7_COMMON_SLICE_CHICKEN1, D_ALL, F_MODE_MASK | F_CMD_ACCESS, 1931 MMIO_DFH(GEN7_COMMON_SLICE_CHICKEN1, D_ALL, F_MODE_MASK | F_CMD_ACCESS,
@@ -3028,7 +3029,7 @@ static int init_skl_mmio_info(struct intel_gvt *gvt)
3028 MMIO_D(CSR_HTP_SKL, D_SKL_PLUS); 3029 MMIO_D(CSR_HTP_SKL, D_SKL_PLUS);
3029 MMIO_D(CSR_LAST_WRITE, D_SKL_PLUS); 3030 MMIO_D(CSR_LAST_WRITE, D_SKL_PLUS);
3030 3031
3031 MMIO_D(BDW_SCRATCH1, D_SKL_PLUS); 3032 MMIO_DFH(BDW_SCRATCH1, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
3032 3033
3033 MMIO_D(SKL_DFSM, D_SKL_PLUS); 3034 MMIO_D(SKL_DFSM, D_SKL_PLUS);
3034 MMIO_D(DISPIO_CR_TX_BMU_CR0, D_SKL_PLUS); 3035 MMIO_D(DISPIO_CR_TX_BMU_CR0, D_SKL_PLUS);
@@ -3041,8 +3042,8 @@ static int init_skl_mmio_info(struct intel_gvt *gvt)
3041 MMIO_D(RPM_CONFIG0, D_SKL_PLUS); 3042 MMIO_D(RPM_CONFIG0, D_SKL_PLUS);
3042 MMIO_D(_MMIO(0xd08), D_SKL_PLUS); 3043 MMIO_D(_MMIO(0xd08), D_SKL_PLUS);
3043 MMIO_D(RC6_LOCATION, D_SKL_PLUS); 3044 MMIO_D(RC6_LOCATION, D_SKL_PLUS);
3044 MMIO_DFH(GEN7_FF_SLICE_CS_CHICKEN1, D_SKL_PLUS, F_MODE_MASK, 3045 MMIO_DFH(GEN7_FF_SLICE_CS_CHICKEN1, D_SKL_PLUS,
3045 NULL, NULL); 3046 F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
3046 MMIO_DFH(GEN9_CS_DEBUG_MODE1, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS, 3047 MMIO_DFH(GEN9_CS_DEBUG_MODE1, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS,
3047 NULL, NULL); 3048 NULL, NULL);
3048 3049
@@ -3061,7 +3062,7 @@ static int init_skl_mmio_info(struct intel_gvt *gvt)
3061 MMIO_D(_MMIO(0x46520), D_SKL_PLUS); 3062 MMIO_D(_MMIO(0x46520), D_SKL_PLUS);
3062 3063
3063 MMIO_D(_MMIO(0xc403c), D_SKL_PLUS); 3064 MMIO_D(_MMIO(0xc403c), D_SKL_PLUS);
3064 MMIO_D(_MMIO(0xb004), D_SKL_PLUS); 3065 MMIO_DFH(GEN8_GARBCNTL, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
3065 MMIO_DH(DMA_CTRL, D_SKL_PLUS, NULL, dma_ctrl_write); 3066 MMIO_DH(DMA_CTRL, D_SKL_PLUS, NULL, dma_ctrl_write);
3066 3067
3067 MMIO_D(_MMIO(0x65900), D_SKL_PLUS); 3068 MMIO_D(_MMIO(0x65900), D_SKL_PLUS);
@@ -3273,7 +3274,7 @@ static int init_bxt_mmio_info(struct intel_gvt *gvt)
3273 MMIO_D(GEN8_PUSHBUS_ENABLE, D_BXT); 3274 MMIO_D(GEN8_PUSHBUS_ENABLE, D_BXT);
3274 MMIO_D(GEN8_PUSHBUS_SHIFT, D_BXT); 3275 MMIO_D(GEN8_PUSHBUS_SHIFT, D_BXT);
3275 MMIO_D(GEN6_GFXPAUSE, D_BXT); 3276 MMIO_D(GEN6_GFXPAUSE, D_BXT);
3276 MMIO_D(GEN8_L3SQCREG1, D_BXT); 3277 MMIO_DFH(GEN8_L3SQCREG1, D_BXT, F_CMD_ACCESS, NULL, NULL);
3277 3278
3278 MMIO_DFH(GEN9_CTX_PREEMPT_REG, D_BXT, F_CMD_ACCESS, NULL, NULL); 3279 MMIO_DFH(GEN9_CTX_PREEMPT_REG, D_BXT, F_CMD_ACCESS, NULL, NULL);
3279 3280
diff --git a/drivers/gpu/drm/i915/gvt/reg.h b/drivers/gpu/drm/i915/gvt/reg.h
index 33aaa14bfdde..5b66e14c5b7b 100644
--- a/drivers/gpu/drm/i915/gvt/reg.h
+++ b/drivers/gpu/drm/i915/gvt/reg.h
@@ -102,6 +102,8 @@
102#define FORCEWAKE_ACK_MEDIA_GEN9_REG 0x0D88 102#define FORCEWAKE_ACK_MEDIA_GEN9_REG 0x0D88
103#define FORCEWAKE_ACK_HSW_REG 0x130044 103#define FORCEWAKE_ACK_HSW_REG 0x130044
104 104
105#define RB_HEAD_WRAP_CNT_MAX ((1 << 11) - 1)
106#define RB_HEAD_WRAP_CNT_OFF 21
105#define RB_HEAD_OFF_MASK ((1U << 21) - (1U << 2)) 107#define RB_HEAD_OFF_MASK ((1U << 21) - (1U << 2))
106#define RB_TAIL_OFF_MASK ((1U << 21) - (1U << 3)) 108#define RB_TAIL_OFF_MASK ((1U << 21) - (1U << 3))
107#define RB_TAIL_SIZE_MASK ((1U << 21) - (1U << 12)) 109#define RB_TAIL_SIZE_MASK ((1U << 21) - (1U << 12))
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
index 13632dba8b2a..0f919f0a43d4 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.c
+++ b/drivers/gpu/drm/i915/gvt/scheduler.c
@@ -812,10 +812,31 @@ static void update_guest_context(struct intel_vgpu_workload *workload)
812 void *src; 812 void *src;
813 unsigned long context_gpa, context_page_num; 813 unsigned long context_gpa, context_page_num;
814 int i; 814 int i;
815 struct drm_i915_private *dev_priv = gvt->dev_priv;
816 u32 ring_base;
817 u32 head, tail;
818 u16 wrap_count;
815 819
816 gvt_dbg_sched("ring id %d workload lrca %x\n", rq->engine->id, 820 gvt_dbg_sched("ring id %d workload lrca %x\n", rq->engine->id,
817 workload->ctx_desc.lrca); 821 workload->ctx_desc.lrca);
818 822
823 head = workload->rb_head;
824 tail = workload->rb_tail;
825 wrap_count = workload->guest_rb_head >> RB_HEAD_WRAP_CNT_OFF;
826
827 if (tail < head) {
828 if (wrap_count == RB_HEAD_WRAP_CNT_MAX)
829 wrap_count = 0;
830 else
831 wrap_count += 1;
832 }
833
834 head = (wrap_count << RB_HEAD_WRAP_CNT_OFF) | tail;
835
836 ring_base = dev_priv->engine[workload->ring_id]->mmio_base;
837 vgpu_vreg_t(vgpu, RING_TAIL(ring_base)) = tail;
838 vgpu_vreg_t(vgpu, RING_HEAD(ring_base)) = head;
839
819 context_page_num = rq->engine->context_size; 840 context_page_num = rq->engine->context_size;
820 context_page_num = context_page_num >> PAGE_SHIFT; 841 context_page_num = context_page_num >> PAGE_SHIFT;
821 842
@@ -1415,6 +1436,7 @@ intel_vgpu_create_workload(struct intel_vgpu *vgpu, int ring_id,
1415 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; 1436 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
1416 u64 ring_context_gpa; 1437 u64 ring_context_gpa;
1417 u32 head, tail, start, ctl, ctx_ctl, per_ctx, indirect_ctx; 1438 u32 head, tail, start, ctl, ctx_ctl, per_ctx, indirect_ctx;
1439 u32 guest_head;
1418 int ret; 1440 int ret;
1419 1441
1420 ring_context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm, 1442 ring_context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
@@ -1430,6 +1452,8 @@ intel_vgpu_create_workload(struct intel_vgpu *vgpu, int ring_id,
1430 intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa + 1452 intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
1431 RING_CTX_OFF(ring_tail.val), &tail, 4); 1453 RING_CTX_OFF(ring_tail.val), &tail, 4);
1432 1454
1455 guest_head = head;
1456
1433 head &= RB_HEAD_OFF_MASK; 1457 head &= RB_HEAD_OFF_MASK;
1434 tail &= RB_TAIL_OFF_MASK; 1458 tail &= RB_TAIL_OFF_MASK;
1435 1459
@@ -1462,6 +1486,7 @@ intel_vgpu_create_workload(struct intel_vgpu *vgpu, int ring_id,
1462 workload->ctx_desc = *desc; 1486 workload->ctx_desc = *desc;
1463 workload->ring_context_gpa = ring_context_gpa; 1487 workload->ring_context_gpa = ring_context_gpa;
1464 workload->rb_head = head; 1488 workload->rb_head = head;
1489 workload->guest_rb_head = guest_head;
1465 workload->rb_tail = tail; 1490 workload->rb_tail = tail;
1466 workload->rb_start = start; 1491 workload->rb_start = start;
1467 workload->rb_ctl = ctl; 1492 workload->rb_ctl = ctl;
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.h b/drivers/gpu/drm/i915/gvt/scheduler.h
index 90c6756f5453..c50d14a9ce85 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.h
+++ b/drivers/gpu/drm/i915/gvt/scheduler.h
@@ -100,6 +100,7 @@ struct intel_vgpu_workload {
100 struct execlist_ctx_descriptor_format ctx_desc; 100 struct execlist_ctx_descriptor_format ctx_desc;
101 struct execlist_ring_context *ring_context; 101 struct execlist_ring_context *ring_context;
102 unsigned long rb_head, rb_tail, rb_ctl, rb_start, rb_len; 102 unsigned long rb_head, rb_tail, rb_ctl, rb_start, rb_len;
103 unsigned long guest_rb_head;
103 bool restore_inhibit; 104 bool restore_inhibit;
104 struct intel_vgpu_elsp_dwords elsp_dwords; 105 struct intel_vgpu_elsp_dwords elsp_dwords;
105 bool emulate_schedule_in; 106 bool emulate_schedule_in;