diff options
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/gtt.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/handlers.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/reg.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.c | 25 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.h | 1 |
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 | ||
| 1109 | err_free_spt: | 1118 | err_free_spt: |
| 1110 | ppgtt_free_spt(spt); | 1119 | ppgtt_free_spt(spt); |
| 1120 | spt = NULL; | ||
| 1111 | err: | 1121 | err: |
| 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; |
