Merge tag 'drm-intel-fixes-2020-10-29' into gvt-fixes
authorZhenyu Wang <zhenyuw@linux.intel.com>
Fri, 30 Oct 2020 03:48:17 +0000 (11:48 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Fri, 30 Oct 2020 03:48:17 +0000 (11:48 +0800)
Backmerge for 5.10-rc1 to apply one extra APL fix.

Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
1  2 
drivers/gpu/drm/i915/gvt/handlers.c
drivers/gpu/drm/i915/gvt/scheduler.c

index beafc5e435b475b34e6624eb3d5b3af81167144e,3be37e6fe33da016b66123b6077996621899e262..6a026539c873e157272ec3ed90b52214f32206d0
@@@ -1489,8 -1489,7 +1489,8 @@@ static int hws_pga_write(struct intel_v
        const struct intel_engine_cs *engine =
                intel_gvt_render_mmio_to_engine(vgpu->gvt, offset);
  
 -      if (!intel_gvt_ggtt_validate_range(vgpu, value, I915_GTT_PAGE_SIZE)) {
 +      if (value != 0 &&
 +          !intel_gvt_ggtt_validate_range(vgpu, value, I915_GTT_PAGE_SIZE)) {
                gvt_vgpu_err("write invalid HWSP address, reg:0x%x, value:0x%x\n",
                              offset, value);
                return -EINVAL;
@@@ -1651,34 -1650,6 +1651,34 @@@ static int edp_psr_imr_iir_write(struc
        return 0;
  }
  
 +/**
 + * FixMe:
 + * If guest fills non-priv batch buffer on ApolloLake/Broxton as Mesa i965 did:
 + * 717e7539124d (i965: Use a WC map and memcpy for the batch instead of pwrite.)
 + * Due to the missing flush of bb filled by VM vCPU, host GPU hangs on executing
 + * these MI_BATCH_BUFFER.
 + * Temporarily workaround this by setting SNOOP bit for PAT3 used by PPGTT
 + * PML4 PTE: PAT(0) PCD(1) PWT(1).
 + * The performance is still expected to be low, will need further improvement.
 + */
 +static int bxt_ppat_low_write(struct intel_vgpu *vgpu, unsigned int offset,
 +                            void *p_data, unsigned int bytes)
 +{
 +      u64 pat =
 +              GEN8_PPAT(0, CHV_PPAT_SNOOP) |
 +              GEN8_PPAT(1, 0) |
 +              GEN8_PPAT(2, 0) |
 +              GEN8_PPAT(3, CHV_PPAT_SNOOP) |
 +              GEN8_PPAT(4, CHV_PPAT_SNOOP) |
 +              GEN8_PPAT(5, CHV_PPAT_SNOOP) |
 +              GEN8_PPAT(6, CHV_PPAT_SNOOP) |
 +              GEN8_PPAT(7, CHV_PPAT_SNOOP);
 +
 +      vgpu_vreg(vgpu, offset) = lower_32_bits(pat);
 +
 +      return 0;
 +}
 +
  static int guc_status_read(struct intel_vgpu *vgpu,
                           unsigned int offset, void *p_data,
                           unsigned int bytes)
@@@ -1921,7 -1892,7 +1921,7 @@@ static int init_generic_mmio_info(struc
        struct drm_i915_private *dev_priv = gvt->gt->i915;
        int ret;
  
-       MMIO_RING_DFH(RING_IMR, D_ALL, F_CMD_ACCESS, NULL,
+       MMIO_RING_DFH(RING_IMR, D_ALL, 0, NULL,
                intel_vgpu_reg_imr_handler);
  
        MMIO_DFH(SDEIMR, D_ALL, 0, NULL, intel_vgpu_reg_imr_handler);
        MMIO_DFH(SDEIIR, D_ALL, 0, NULL, intel_vgpu_reg_iir_handler);
        MMIO_D(SDEISR, D_ALL);
  
-       MMIO_RING_DFH(RING_HWSTAM, D_ALL, F_CMD_ACCESS, NULL, NULL);
+       MMIO_RING_DFH(RING_HWSTAM, D_ALL, 0, NULL, NULL);
  
        MMIO_DH(GEN8_GAMW_ECO_DEV_RW_IA, D_BDW_PLUS, NULL,
                gamw_echo_dev_rw_ia_write);
        MMIO_GM_RDR(_MMIO(0x12198), D_ALL, NULL, NULL);
        MMIO_D(GEN7_CXT_SIZE, D_ALL);
  
-       MMIO_RING_DFH(RING_TAIL, D_ALL, F_CMD_ACCESS, NULL, NULL);
-       MMIO_RING_DFH(RING_HEAD, D_ALL, F_CMD_ACCESS, NULL, NULL);
-       MMIO_RING_DFH(RING_CTL, D_ALL, F_CMD_ACCESS, NULL, NULL);
-       MMIO_RING_DFH(RING_ACTHD, D_ALL, F_CMD_ACCESS, mmio_read_from_hw, NULL);
-       MMIO_RING_GM_RDR(RING_START, D_ALL, NULL, NULL);
+       MMIO_RING_DFH(RING_TAIL, D_ALL, 0, NULL, NULL);
+       MMIO_RING_DFH(RING_HEAD, D_ALL, 0, NULL, NULL);
+       MMIO_RING_DFH(RING_CTL, D_ALL, 0, NULL, NULL);
+       MMIO_RING_DFH(RING_ACTHD, D_ALL, 0, mmio_read_from_hw, NULL);
+       MMIO_RING_GM(RING_START, D_ALL, NULL, NULL);
  
        /* RING MODE */
  #define RING_REG(base) _MMIO((base) + 0x29c)
        MMIO_DFH(_MMIO(0x4094), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
  
        MMIO_DFH(ARB_MODE, D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
-       MMIO_RING_GM_RDR(RING_BBADDR, D_ALL, NULL, NULL);
+       MMIO_RING_GM(RING_BBADDR, D_ALL, NULL, NULL);
        MMIO_DFH(_MMIO(0x2220), D_ALL, F_CMD_ACCESS, NULL, NULL);
        MMIO_DFH(_MMIO(0x12220), D_ALL, F_CMD_ACCESS, NULL, NULL);
        MMIO_DFH(_MMIO(0x22220), D_ALL, F_CMD_ACCESS, NULL, NULL);
@@@ -2800,7 -2772,7 +2801,7 @@@ static int init_bdw_mmio_info(struct in
        MMIO_DH(GEN8_MASTER_IRQ, D_BDW_PLUS, NULL,
                intel_vgpu_reg_master_irq_handler);
  
-       MMIO_RING_DFH(RING_ACTHD_UDW, D_BDW_PLUS, F_CMD_ACCESS,
+       MMIO_RING_DFH(RING_ACTHD_UDW, D_BDW_PLUS, 0,
                mmio_read_from_hw, NULL);
  
  #define RING_REG(base) _MMIO((base) + 0xd0)
  #undef RING_REG
  
  #define RING_REG(base) _MMIO((base) + 0x234)
-       MMIO_RING_F(RING_REG, 8, F_RO | F_CMD_ACCESS, 0, ~0, D_BDW_PLUS,
+       MMIO_RING_F(RING_REG, 8, F_RO, 0, ~0, D_BDW_PLUS,
                NULL, NULL);
  #undef RING_REG
  
  
        MMIO_DH(GEN6_PCODE_MAILBOX, D_BDW_PLUS, NULL, mailbox_write);
  
 -      MMIO_D(GEN8_PRIVATE_PAT_LO, D_BDW_PLUS);
 +      MMIO_D(GEN8_PRIVATE_PAT_LO, D_BDW_PLUS & ~D_BXT);
        MMIO_D(GEN8_PRIVATE_PAT_HI, D_BDW_PLUS);
  
        MMIO_D(GAMTARBMODE, D_BDW_PLUS);
        MMIO_RING_F(RING_REG, 32, F_CMD_ACCESS, 0, 0, D_BDW_PLUS, NULL, NULL);
  #undef RING_REG
  
-       MMIO_RING_GM_RDR(RING_HWS_PGA, D_BDW_PLUS, NULL, hws_pga_write);
+       MMIO_RING_GM(RING_HWS_PGA, D_BDW_PLUS, NULL, hws_pga_write);
  
        MMIO_DFH(HDC_CHICKEN0, D_BDW_PLUS, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
  
@@@ -2950,7 -2922,7 +2951,7 @@@ static int init_skl_mmio_info(struct in
        MMIO_D(GEN9_MEDIA_PG_IDLE_HYSTERESIS, D_SKL_PLUS);
        MMIO_D(GEN9_RENDER_PG_IDLE_HYSTERESIS, D_SKL_PLUS);
        MMIO_DFH(GEN9_GAMT_ECO_REG_RW_IA, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
-       MMIO_DH(MMCD_MISC_CTRL, D_SKL_PLUS, NULL, NULL);
+       MMIO_DFH(MMCD_MISC_CTRL, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
        MMIO_DH(CHICKEN_PAR1_1, D_SKL_PLUS, NULL, NULL);
        MMIO_D(DC_STATE_EN, D_SKL_PLUS);
        MMIO_D(DC_STATE_DEBUG, D_SKL_PLUS);
        MMIO_DFH(GEN9_WM_CHICKEN3, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS,
                 NULL, NULL);
  
-       MMIO_D(GAMT_CHKN_BIT_REG, D_KBL | D_CFL);
+       MMIO_DFH(GAMT_CHKN_BIT_REG, D_KBL | D_CFL, F_CMD_ACCESS, NULL, NULL);
        MMIO_D(GEN9_CTX_PREEMPT_REG, D_SKL_PLUS);
  
        return 0;
@@@ -3344,8 -3316,6 +3345,8 @@@ static int init_bxt_mmio_info(struct in
  
        MMIO_DFH(GEN9_CTX_PREEMPT_REG, D_BXT, F_CMD_ACCESS, NULL, NULL);
  
 +      MMIO_DH(GEN8_PRIVATE_PAT_LO, D_BXT, NULL, bxt_ppat_low_write);
 +
        return 0;
  }
  
@@@ -3388,7 -3358,10 +3389,10 @@@ void intel_gvt_clean_mmio_info(struct i
        gvt->mmio.mmio_attribute = NULL;
  }
  
- /* Special MMIO blocks. */
+ /* Special MMIO blocks. registers in MMIO block ranges should not be command
+  * accessible (should have no F_CMD_ACCESS flag).
+  * otherwise, need to update cmd_reg_handler in cmd_parser.c
+  */
  static struct gvt_mmio_block mmio_blocks[] = {
        {D_SKL_PLUS, _MMIO(CSR_MMIO_START_RANGE), 0x3000, NULL, NULL},
        {D_ALL, _MMIO(MCHBAR_MIRROR_BASE_SNB), 0x40000, NULL, NULL},
index 68b2d10108fd18807aa5c0ecd60f2c2063b75801,1570eb8aa97836130e8f3ca703947359991a9c3e..aed2ef6466a2db765db71bfa52696d698aa134ee
@@@ -403,6 -403,14 +403,14 @@@ static void release_shadow_wa_ctx(struc
        wa_ctx->indirect_ctx.shadow_va = NULL;
  }
  
+ static void set_dma_address(struct i915_page_directory *pd, dma_addr_t addr)
+ {
+       struct scatterlist *sg = pd->pt.base->mm.pages->sgl;
+       /* This is not a good idea */
+       sg->dma_address = addr;
+ }
  static void set_context_ppgtt_from_shadow(struct intel_vgpu_workload *workload,
                                          struct intel_context *ce)
  {
        int i = 0;
  
        if (mm->ppgtt_mm.root_entry_type == GTT_TYPE_PPGTT_ROOT_L4_ENTRY) {
-               px_dma(ppgtt->pd) = mm->ppgtt_mm.shadow_pdps[0];
+               set_dma_address(ppgtt->pd, mm->ppgtt_mm.shadow_pdps[0]);
        } else {
                for (i = 0; i < GVT_RING_CTX_NR_PDPS; i++) {
                        struct i915_page_directory * const pd =
                           shadow ppgtt. */
                        if (!pd)
                                break;
-                       px_dma(pd) = mm->ppgtt_mm.shadow_pdps[i];
+                       set_dma_address(pd, mm->ppgtt_mm.shadow_pdps[i]);
                }
        }
  }
@@@ -1240,13 -1249,13 +1249,13 @@@ i915_context_ppgtt_root_restore(struct 
        int i;
  
        if (i915_vm_is_4lvl(&ppgtt->vm)) {
-               px_dma(ppgtt->pd) = s->i915_context_pml4;
+               set_dma_address(ppgtt->pd, s->i915_context_pml4);
        } else {
                for (i = 0; i < GEN8_3LVL_PDPES; i++) {
                        struct i915_page_directory * const pd =
                                i915_pd_entry(ppgtt->pd, i);
  
-                       px_dma(pd) = s->i915_context_pdps[i];
+                       set_dma_address(pd, s->i915_context_pdps[i]);
                }
        }
  }
@@@ -1268,7 -1277,7 +1277,7 @@@ void intel_vgpu_clean_submission(struc
  
        i915_context_ppgtt_root_restore(s, i915_vm_to_ppgtt(s->shadow[0]->vm));
        for_each_engine(engine, vgpu->gvt->gt, id)
 -              intel_context_unpin(s->shadow[id]);
 +              intel_context_put(s->shadow[id]);
  
        kmem_cache_destroy(s->workloads);
  }
@@@ -1360,6 -1369,11 +1369,6 @@@ int intel_vgpu_setup_submission(struct 
                        ce->ring = __intel_context_ring_size(ring_size);
                }
  
 -              ret = intel_context_pin(ce);
 -              intel_context_put(ce);
 -              if (ret)
 -                      goto out_shadow_ctx;
 -
                s->shadow[i] = ce;
        }
  
@@@ -1391,6 -1405,7 +1400,6 @@@ out_shadow_ctx
                if (IS_ERR(s->shadow[i]))
                        break;
  
 -              intel_context_unpin(s->shadow[i]);
                intel_context_put(s->shadow[i]);
        }
        i915_vm_put(&ppgtt->vm);
@@@ -1464,7 -1479,6 +1473,7 @@@ void intel_vgpu_destroy_workload(struc
  {
        struct intel_vgpu_submission *s = &workload->vgpu->submission;
  
 +      intel_context_unpin(s->shadow[workload->engine->id]);
        release_shadow_batch_buffer(workload);
        release_shadow_wa_ctx(&workload->wa_ctx);
  
@@@ -1710,12 -1724,6 +1719,12 @@@ intel_vgpu_create_workload(struct intel
                return ERR_PTR(ret);
        }
  
 +      ret = intel_context_pin(s->shadow[engine->id]);
 +      if (ret) {
 +              intel_vgpu_destroy_workload(workload);
 +              return ERR_PTR(ret);
 +      }
 +
        return workload;
  }