@@ -1489,7 +1489,8 @@ static int hws_pga_write(struct intel_vgpu *vgpu, unsigned int offset,
14891489 const struct intel_engine_cs * engine =
14901490 intel_gvt_render_mmio_to_engine (vgpu -> gvt , offset );
14911491
1492- if (!intel_gvt_ggtt_validate_range (vgpu , value , I915_GTT_PAGE_SIZE )) {
1492+ if (value != 0 &&
1493+ !intel_gvt_ggtt_validate_range (vgpu , value , I915_GTT_PAGE_SIZE )) {
14931494 gvt_vgpu_err ("write invalid HWSP address, reg:0x%x, value:0x%x\n" ,
14941495 offset , value );
14951496 return - EINVAL ;
@@ -1650,6 +1651,34 @@ static int edp_psr_imr_iir_write(struct intel_vgpu *vgpu,
16501651 return 0 ;
16511652}
16521653
1654+ /**
1655+ * FixMe:
1656+ * If guest fills non-priv batch buffer on ApolloLake/Broxton as Mesa i965 did:
1657+ * 717e7539124d (i965: Use a WC map and memcpy for the batch instead of pwrite.)
1658+ * Due to the missing flush of bb filled by VM vCPU, host GPU hangs on executing
1659+ * these MI_BATCH_BUFFER.
1660+ * Temporarily workaround this by setting SNOOP bit for PAT3 used by PPGTT
1661+ * PML4 PTE: PAT(0) PCD(1) PWT(1).
1662+ * The performance is still expected to be low, will need further improvement.
1663+ */
1664+ static int bxt_ppat_low_write (struct intel_vgpu * vgpu , unsigned int offset ,
1665+ void * p_data , unsigned int bytes )
1666+ {
1667+ u64 pat =
1668+ GEN8_PPAT (0 , CHV_PPAT_SNOOP ) |
1669+ GEN8_PPAT (1 , 0 ) |
1670+ GEN8_PPAT (2 , 0 ) |
1671+ GEN8_PPAT (3 , CHV_PPAT_SNOOP ) |
1672+ GEN8_PPAT (4 , CHV_PPAT_SNOOP ) |
1673+ GEN8_PPAT (5 , CHV_PPAT_SNOOP ) |
1674+ GEN8_PPAT (6 , CHV_PPAT_SNOOP ) |
1675+ GEN8_PPAT (7 , CHV_PPAT_SNOOP );
1676+
1677+ vgpu_vreg (vgpu , offset ) = lower_32_bits (pat );
1678+
1679+ return 0 ;
1680+ }
1681+
16531682static int guc_status_read (struct intel_vgpu * vgpu ,
16541683 unsigned int offset , void * p_data ,
16551684 unsigned int bytes )
@@ -2812,7 +2841,7 @@ static int init_bdw_mmio_info(struct intel_gvt *gvt)
28122841
28132842 MMIO_DH (GEN6_PCODE_MAILBOX , D_BDW_PLUS , NULL , mailbox_write );
28142843
2815- MMIO_D (GEN8_PRIVATE_PAT_LO , D_BDW_PLUS );
2844+ MMIO_D (GEN8_PRIVATE_PAT_LO , D_BDW_PLUS & ~ D_BXT );
28162845 MMIO_D (GEN8_PRIVATE_PAT_HI , D_BDW_PLUS );
28172846
28182847 MMIO_D (GAMTARBMODE , D_BDW_PLUS );
@@ -3139,7 +3168,7 @@ static int init_skl_mmio_info(struct intel_gvt *gvt)
31393168 NULL , NULL );
31403169
31413170 MMIO_DFH (GAMT_CHKN_BIT_REG , D_KBL | D_CFL , F_CMD_ACCESS , NULL , NULL );
3142- MMIO_D (GEN9_CTX_PREEMPT_REG , D_SKL_PLUS );
3171+ MMIO_D (GEN9_CTX_PREEMPT_REG , D_SKL_PLUS & ~ D_BXT );
31433172
31443173 return 0 ;
31453174}
@@ -3313,9 +3342,21 @@ static int init_bxt_mmio_info(struct intel_gvt *gvt)
33133342 MMIO_D (GEN8_PUSHBUS_SHIFT , D_BXT );
33143343 MMIO_D (GEN6_GFXPAUSE , D_BXT );
33153344 MMIO_DFH (GEN8_L3SQCREG1 , D_BXT , F_CMD_ACCESS , NULL , NULL );
3345+ MMIO_DFH (GEN8_L3CNTLREG , D_BXT , F_CMD_ACCESS , NULL , NULL );
3346+ MMIO_DFH (_MMIO (0x20D8 ), D_BXT , F_CMD_ACCESS , NULL , NULL );
3347+ MMIO_F (GEN8_RING_CS_GPR (RENDER_RING_BASE , 0 ), 0x40 , F_CMD_ACCESS ,
3348+ 0 , 0 , D_BXT , NULL , NULL );
3349+ MMIO_F (GEN8_RING_CS_GPR (GEN6_BSD_RING_BASE , 0 ), 0x40 , F_CMD_ACCESS ,
3350+ 0 , 0 , D_BXT , NULL , NULL );
3351+ MMIO_F (GEN8_RING_CS_GPR (BLT_RING_BASE , 0 ), 0x40 , F_CMD_ACCESS ,
3352+ 0 , 0 , D_BXT , NULL , NULL );
3353+ MMIO_F (GEN8_RING_CS_GPR (VEBOX_RING_BASE , 0 ), 0x40 , F_CMD_ACCESS ,
3354+ 0 , 0 , D_BXT , NULL , NULL );
33163355
33173356 MMIO_DFH (GEN9_CTX_PREEMPT_REG , D_BXT , F_CMD_ACCESS , NULL , NULL );
33183357
3358+ MMIO_DH (GEN8_PRIVATE_PAT_LO , D_BXT , NULL , bxt_ppat_low_write );
3359+
33193360 return 0 ;
33203361}
33213362
0 commit comments