drm/i915/gvt: Backport GVT BXT/APL fix to 5.4.y
cover drm/i915/gvt: Backport GVT BXT/APL fix to 5.4.y
commit 8fe105679765700378eb328495fcfe1566cdbbd0 upstream commit 92010a97098c4c9fd777408cc98064d26b32695b upstream commit a5a8ef937cfa79167f4b2a5602092b8d14fd6b9a upstream commit 28284943ac94014767ecc2f7b3c5747c4a5617a0 upstream commit 4ceb06e7c336f4a8d3f3b6ac9a4fea2e9c97dc07 upstream
Upstream intel-gvt fixed some breaking and GPU hang issues on BXT/APL platform but 5.4.y doesn't have so backport them. These patch have been rebased to linux-5.4.y.
Colin Xu (4):
drm/i915/gvt: Set SNOOP for PAT3 on BXT/APL to workaround GPU BB hang drm/i915/gvt: Fix mmio handler break on BXT/APL. drm/i915/gvt: Fix virtual display setup for BXT/APL drm/i915/gvt: Fix vfio_edid issue for BXT/APL
Zhenyu Wang (1):
drm/i915/gvt: Fix port number for BDW on EDID region setup
drivers/gpu/drm/i915/gvt/display.c | 212 ++++++++++++++++++++++++++++ drivers/gpu/drm/i915/gvt/handlers.c | 40 +++++- drivers/gpu/drm/i915/gvt/mmio.c | 5 + drivers/gpu/drm/i915/gvt/vgpu.c | 5 +- 4 files changed, 258 insertions(+), 4 deletions(-)
Signature · 1 line
2.30.2
PATCH 1/5 drm/i915/gvt: Set SNOOP for PAT3 on BXT/APL to workaround GPU BB hang
commit 8fe105679765700378eb328495fcfe1566cdbbd0 upstream
If guest fills non-priv bb on ApolloLake/Broxton as Mesa i965 does in:717e7539124d (i965: Use a WC map and memcpy for the batch instead of pw-) 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.
--- drivers/gpu/drm/i915/gvt/handlers.c | 32 ++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/gvt/handlers.c +31 -1
@@ -1632,6 +1632,34 @@ static int edp_psr_imr_iir_write(struct intel_vgpu *vgpu,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 mmio_read_from_hw (struct intel_vgpu *vgpu,unsigned int offset,void *p_data,unsigned int bytes) {
@@ -2778,7 +2806,7 @@ static int init_broadwell_mmio_info(struct intel_gvt *gvt)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 );
@@ -3281,6 +3309,8 @@ static int init_bxt_mmio_info(struct intel_gvt *gvt)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 ; }
Signature · 1 line
2.30.2
PATCH 2/5 drm/i915/gvt: Fix mmio handler break on BXT/APL.
In reply to Colin Xucommit 92010a97098c4c9fd777408cc98064d26b32695b upstream
- Remove dup mmio handler for BXT/APL. Otherwise mmio handler will fail to init.
- Add engine GPR with F_CMD_ACCESS since BXT/APL will load them via LRI. Otherwise, guest will enter failsafe mode.
V2:
Use RCS/BCS GPR macros instead of offset.
Revise commit message.
V3:
Use GEN8_RING_CS_GPR macros on ring base.
--- drivers/gpu/drm/i915/gvt/handlers.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/gvt/handlers.c +7 -1
@@ -3132,7 +3132,7 @@ static int init_skl_mmio_info(struct intel_gvt *gvt) NULL, NULL);MMIO_D (GAMT_CHKN_BIT_REG ,D_KBL |D_CFL ); -MMIO_D (GEN9_CTX_PREEMPT_REG ,D_SKL_PLUS ); +MMIO_D (GEN9_CTX_PREEMPT_REG ,D_SKL_PLUS & ~D_BXT );return 0 ; }
@@ -3306,6 +3306,12 @@ static int init_bxt_mmio_info(struct intel_gvt *gvt)MMIO_D (GEN8_PUSHBUS_SHIFT ,D_BXT );MMIO_D (GEN6_GFXPAUSE ,D_BXT );MMIO_DFH (GEN8_L3SQCREG1 ,D_BXT ,F_CMD_ACCESS ,NULL ,NULL ); +MMIO_DFH (GEN8_L3CNTLREG ,D_BXT ,F_CMD_ACCESS ,NULL ,NULL ); +MMIO_DFH (_MMIO (0x20D8 ),D_BXT ,F_CMD_ACCESS ,NULL ,NULL ); +MMIO_F (HSW_CS_GPR (0 ),0x40 ,F_CMD_ACCESS ,0 ,0 ,D_BXT ,NULL ,NULL ); +MMIO_F (_MMIO (0x12600 ),0x40 ,F_CMD_ACCESS ,0 ,0 ,D_BXT ,NULL ,NULL ); +MMIO_F (BCS_GPR (0 ),0x40 ,F_CMD_ACCESS ,0 ,0 ,D_BXT ,NULL ,NULL ); +MMIO_F (_MMIO (0x1a600 ),0x40 ,F_CMD_ACCESS ,0 ,0 ,D_BXT ,NULL ,NULL );MMIO_DFH (GEN9_CTX_PREEMPT_REG ,D_BXT ,F_CMD_ACCESS ,NULL ,NULL );
Signature · 1 line
2.30.2
PATCH 3/5 drm/i915/gvt: Fix virtual display setup for BXT/APL
In reply to Colin Xucommit a5a8ef937cfa79167f4b2a5602092b8d14fd6b9a upstream
Program display related vregs to proper value at initialization, setup virtual monitor and hotplug.
vGPU virtual display vregs inherit the value from pregs. The virtual DP monitor is always setup on PORT_B for BXT/APL. However the host may connect monitor on other PORT or without any monitor connected. Without properly setup PIPE/DDI/PLL related vregs, guest driver may not setup the virutal display as expected, and the guest desktop may not be created.
Since only one virtual display is supported, enable PIPE_A only. And enable transcoder/DDI/PLL based on which port is setup for BXT/APL.
V2:
Revise commit message.
V3:set_edid should on PORT_B for BXT.
Inject hpd event for BXT.
V4:
Temporarily disable vfio edid on BXT/APL until issue fixed.
V5:
Rebase to use new HPD define GEN8_DE_PORT_HOTPLUG for BXT. Put vfio edid disabling on BXT/APL to a separate patch.
--- drivers/gpu/drm/i915/gvt/display.c | 173 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/gvt/mmio.c | 5 + 2 files changed, 178 insertions(+)
drivers/gpu/drm/i915/gvt/display.c +173 -0
@@ -172,21 +172,161 @@ static void emulate_monitor_status_change(struct intel_vgpu *vgpu)int pipe;if (IS_BROXTON (dev_priv)) { +enum transcoder trans; +enum port port; + +/* Clear PIPE, DDI, PHY, HPD before setting new */ vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= ~(BXT_DE_PORT_HP_DDIA |BXT_DE_PORT_HP_DDIB |BXT_DE_PORT_HP_DDIC ); +for_each_pipe (dev_priv, pipe) { +vgpu_vreg_t (vgpu,PIPECONF (pipe)) &= + ~(PIPECONF_ENABLE |I965_PIPECONF_ACTIVE ); +vgpu_vreg_t (vgpu,DSPCNTR (pipe)) &= ~DISPLAY_PLANE_ENABLE ; +vgpu_vreg_t (vgpu,SPRCTL (pipe)) &= ~SPRITE_ENABLE ; +vgpu_vreg_t (vgpu,CURCNTR (pipe)) &= ~MCURSOR_MODE ; +vgpu_vreg_t (vgpu,CURCNTR (pipe)) |=MCURSOR_MODE_DISABLE ; + } + +for (trans =TRANSCODER_A ; trans <=TRANSCODER_EDP ; trans++) { +vgpu_vreg_t (vgpu,TRANS_DDI_FUNC_CTL (trans)) &= + ~(TRANS_DDI_BPC_MASK |TRANS_DDI_MODE_SELECT_MASK | +TRANS_DDI_PORT_MASK |TRANS_DDI_FUNC_ENABLE ); + } +vgpu_vreg_t (vgpu,TRANS_DDI_FUNC_CTL (TRANSCODER_A )) &= + ~(TRANS_DDI_BPC_MASK |TRANS_DDI_MODE_SELECT_MASK | +TRANS_DDI_PORT_MASK ); + +for (port =PORT_A ; port <=PORT_C ; port++) { +vgpu_vreg_t (vgpu,BXT_PHY_CTL (port)) &= + ~BXT_PHY_LANE_ENABLED ; +vgpu_vreg_t (vgpu,BXT_PHY_CTL (port)) |= + (BXT_PHY_CMNLANE_POWERDOWN_ACK | +BXT_PHY_LANE_POWERDOWN_ACK ); + +vgpu_vreg_t (vgpu,BXT_PORT_PLL_ENABLE (port)) &= + ~(PORT_PLL_POWER_STATE |PORT_PLL_POWER_ENABLE | +PORT_PLL_REF_SEL |PORT_PLL_LOCK | +PORT_PLL_ENABLE ); + +vgpu_vreg_t (vgpu,DDI_BUF_CTL (port)) &= + ~(DDI_INIT_DISPLAY_DETECTED | +DDI_BUF_CTL_ENABLE ); +vgpu_vreg_t (vgpu,DDI_BUF_CTL (port)) |=DDI_BUF_IS_IDLE ; + } + +vgpu_vreg_t (vgpu,BXT_P_CR_GT_DISP_PWRON ) &= ~(BIT (0 ) |BIT (1 )); +vgpu_vreg_t (vgpu,BXT_PORT_CL1CM_DW0 (DPIO_PHY0 )) &= + ~PHY_POWER_GOOD ; +vgpu_vreg_t (vgpu,BXT_PORT_CL1CM_DW0 (DPIO_PHY1 )) &= + ~PHY_POWER_GOOD ; +vgpu_vreg_t (vgpu,BXT_PHY_CTL_FAMILY (DPIO_PHY0 )) &= ~BIT (30 ); +vgpu_vreg_t (vgpu,BXT_PHY_CTL_FAMILY (DPIO_PHY1 )) &= ~BIT (30 ); + +vgpu_vreg_t (vgpu,SFUSE_STRAP ) &= ~SFUSE_STRAP_DDIB_DETECTED ; +vgpu_vreg_t (vgpu,SFUSE_STRAP ) &= ~SFUSE_STRAP_DDIC_DETECTED ; + +/* +* Only 1 PIPE enabled in current vGPU display and PIPE_A is +* tied to TRANSCODER_A in HW, so it's safe to assume PIPE_A, +* TRANSCODER_A can be enabled. PORT_x depends on the input of +* setup_virtual_dp_monitor. +*/ +vgpu_vreg_t (vgpu,PIPECONF (PIPE_A )) |=PIPECONF_ENABLE ; +vgpu_vreg_t (vgpu,PIPECONF (PIPE_A )) |=I965_PIPECONF_ACTIVE ; + +/* +* Golden M/N are calculated based on: +* 24 bpp, 4 lanes, 154000 pixel clk (from virtual EDID), +* DP link clk 1620 MHz and non-constant_n. +* TODO: calculate DP link symbol clk and stream clk m/n. +*/ +vgpu_vreg_t (vgpu,PIPE_DATA_M1 (TRANSCODER_A )) =63 <<TU_SIZE_SHIFT ; +vgpu_vreg_t (vgpu,PIPE_DATA_M1 (TRANSCODER_A )) |=0x5b425e ; +vgpu_vreg_t (vgpu,PIPE_DATA_N1 (TRANSCODER_A )) =0x800000 ; +vgpu_vreg_t (vgpu,PIPE_LINK_M1 (TRANSCODER_A )) =0x3cd6e ; +vgpu_vreg_t (vgpu,PIPE_LINK_N1 (TRANSCODER_A )) =0x80000 ; + +/* Enable per-DDI/PORT vreg */ if (intel_vgpu_has_monitor_on_port (vgpu,PORT_A )) { +vgpu_vreg_t (vgpu,BXT_P_CR_GT_DISP_PWRON ) |=BIT (1 ); +vgpu_vreg_t (vgpu,BXT_PORT_CL1CM_DW0 (DPIO_PHY1 )) |= +PHY_POWER_GOOD ; +vgpu_vreg_t (vgpu,BXT_PHY_CTL_FAMILY (DPIO_PHY1 )) |= +BIT (30 ); +vgpu_vreg_t (vgpu,BXT_PHY_CTL (PORT_A )) |= +BXT_PHY_LANE_ENABLED ; +vgpu_vreg_t (vgpu,BXT_PHY_CTL (PORT_A )) &= + ~(BXT_PHY_CMNLANE_POWERDOWN_ACK | +BXT_PHY_LANE_POWERDOWN_ACK ); +vgpu_vreg_t (vgpu,BXT_PORT_PLL_ENABLE (PORT_A )) |= + (PORT_PLL_POWER_STATE |PORT_PLL_POWER_ENABLE | +PORT_PLL_REF_SEL |PORT_PLL_LOCK | +PORT_PLL_ENABLE ); +vgpu_vreg_t (vgpu,DDI_BUF_CTL (PORT_A )) |= + (DDI_BUF_CTL_ENABLE |DDI_INIT_DISPLAY_DETECTED ); +vgpu_vreg_t (vgpu,DDI_BUF_CTL (PORT_A )) &= + ~DDI_BUF_IS_IDLE ; +vgpu_vreg_t (vgpu,TRANS_DDI_FUNC_CTL (TRANSCODER_EDP )) |= + (TRANS_DDI_BPC_8 |TRANS_DDI_MODE_SELECT_DP_SST | +TRANS_DDI_FUNC_ENABLE );vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIA ; }if (intel_vgpu_has_monitor_on_port (vgpu,PORT_B )) { +vgpu_vreg_t (vgpu,SFUSE_STRAP ) |=SFUSE_STRAP_DDIB_DETECTED ; +vgpu_vreg_t (vgpu,BXT_P_CR_GT_DISP_PWRON ) |=BIT (0 ); +vgpu_vreg_t (vgpu,BXT_PORT_CL1CM_DW0 (DPIO_PHY0 )) |= +PHY_POWER_GOOD ; +vgpu_vreg_t (vgpu,BXT_PHY_CTL_FAMILY (DPIO_PHY0 )) |= +BIT (30 ); +vgpu_vreg_t (vgpu,BXT_PHY_CTL (PORT_B )) |= +BXT_PHY_LANE_ENABLED ; +vgpu_vreg_t (vgpu,BXT_PHY_CTL (PORT_B )) &= + ~(BXT_PHY_CMNLANE_POWERDOWN_ACK | +BXT_PHY_LANE_POWERDOWN_ACK ); +vgpu_vreg_t (vgpu,BXT_PORT_PLL_ENABLE (PORT_B )) |= + (PORT_PLL_POWER_STATE |PORT_PLL_POWER_ENABLE | +PORT_PLL_REF_SEL |PORT_PLL_LOCK | +PORT_PLL_ENABLE ); +vgpu_vreg_t (vgpu,DDI_BUF_CTL (PORT_B )) |= +DDI_BUF_CTL_ENABLE ; +vgpu_vreg_t (vgpu,DDI_BUF_CTL (PORT_B )) &= + ~DDI_BUF_IS_IDLE ; +vgpu_vreg_t (vgpu,TRANS_DDI_FUNC_CTL (TRANSCODER_A )) |= + (TRANS_DDI_BPC_8 |TRANS_DDI_MODE_SELECT_DP_SST | + (PORT_B <<TRANS_DDI_PORT_SHIFT ) | +TRANS_DDI_FUNC_ENABLE );vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIB ; }if (intel_vgpu_has_monitor_on_port (vgpu,PORT_C )) { +vgpu_vreg_t (vgpu,SFUSE_STRAP ) |=SFUSE_STRAP_DDIC_DETECTED ; +vgpu_vreg_t (vgpu,BXT_P_CR_GT_DISP_PWRON ) |=BIT (0 ); +vgpu_vreg_t (vgpu,BXT_PORT_CL1CM_DW0 (DPIO_PHY0 )) |= +PHY_POWER_GOOD ; +vgpu_vreg_t (vgpu,BXT_PHY_CTL_FAMILY (DPIO_PHY0 )) |= +BIT (30 ); +vgpu_vreg_t (vgpu,BXT_PHY_CTL (PORT_C )) |= +BXT_PHY_LANE_ENABLED ; +vgpu_vreg_t (vgpu,BXT_PHY_CTL (PORT_C )) &= + ~(BXT_PHY_CMNLANE_POWERDOWN_ACK | +BXT_PHY_LANE_POWERDOWN_ACK ); +vgpu_vreg_t (vgpu,BXT_PORT_PLL_ENABLE (PORT_C )) |= + (PORT_PLL_POWER_STATE |PORT_PLL_POWER_ENABLE | +PORT_PLL_REF_SEL |PORT_PLL_LOCK | +PORT_PLL_ENABLE ); +vgpu_vreg_t (vgpu,DDI_BUF_CTL (PORT_C )) |= +DDI_BUF_CTL_ENABLE ; +vgpu_vreg_t (vgpu,DDI_BUF_CTL (PORT_C )) &= + ~DDI_BUF_IS_IDLE ; +vgpu_vreg_t (vgpu,TRANS_DDI_FUNC_CTL (TRANSCODER_A )) |= + (TRANS_DDI_BPC_8 |TRANS_DDI_MODE_SELECT_DP_SST | + (PORT_B <<TRANS_DDI_PORT_SHIFT ) | +TRANS_DDI_FUNC_ENABLE );vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIC ; }
@@ -511,6 +651,39 @@ void intel_vgpu_emulate_hotplug(struct intel_vgpu *vgpu, bool connected)vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) |=PORTD_HOTPLUG_STATUS_MASK ;intel_vgpu_trigger_virtual_event (vgpu,DP_D_HOTPLUG ); + }else if (IS_BROXTON (dev_priv)) { +if (connected) { +if (intel_vgpu_has_monitor_on_port (vgpu,PORT_A )) { +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIA ; + } +if (intel_vgpu_has_monitor_on_port (vgpu,PORT_B )) { +vgpu_vreg_t (vgpu,SFUSE_STRAP ) |= +SFUSE_STRAP_DDIB_DETECTED ; +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIB ; + } +if (intel_vgpu_has_monitor_on_port (vgpu,PORT_C )) { +vgpu_vreg_t (vgpu,SFUSE_STRAP ) |= +SFUSE_STRAP_DDIC_DETECTED ; +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIC ; + } + }else { +if (intel_vgpu_has_monitor_on_port (vgpu,PORT_A )) { +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= ~BXT_DE_PORT_HP_DDIA ; + } +if (intel_vgpu_has_monitor_on_port (vgpu,PORT_B )) { +vgpu_vreg_t (vgpu,SFUSE_STRAP ) &= + ~SFUSE_STRAP_DDIB_DETECTED ; +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= ~BXT_DE_PORT_HP_DDIB ; + } +if (intel_vgpu_has_monitor_on_port (vgpu,PORT_C )) { +vgpu_vreg_t (vgpu,SFUSE_STRAP ) &= + ~SFUSE_STRAP_DDIC_DETECTED ; +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= ~BXT_DE_PORT_HP_DDIC ; + } + } +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) |= +PORTB_HOTPLUG_STATUS_MASK ; +intel_vgpu_trigger_virtual_event (vgpu,DP_B_HOTPLUG ); } }
drivers/gpu/drm/i915/gvt/mmio.c +5 -0
@@ -271,6 +271,11 @@ void intel_vgpu_reset_mmio(struct intel_vgpu *vgpu, bool dmlr)vgpu_vreg_t (vgpu,BXT_PHY_CTL (PORT_C )) |=BXT_PHY_CMNLANE_POWERDOWN_ACK |BXT_PHY_LANE_POWERDOWN_ACK ; +vgpu_vreg_t (vgpu,SKL_FUSE_STATUS ) |= +SKL_FUSE_DOWNLOAD_STATUS | +SKL_FUSE_PG_DIST_STATUS (SKL_PG0 ) | +SKL_FUSE_PG_DIST_STATUS (SKL_PG1 ) | +SKL_FUSE_PG_DIST_STATUS (SKL_PG2 ); } }else {#define GVT_GEN8_MMIO_RESET_OFFSET (0x44200)
Signature · 1 line
2.30.2
PATCH 4/5 drm/i915/gvt: Fix port number for BDW on EDID region setup
In reply to Colin XuFrom: Zhenyu Wang <[email protected]>
commit 28284943ac94014767ecc2f7b3c5747c4a5617a0 upstream
Current BDW virtual display port is initialized as PORT_B, so need to use same port for VFIO EDID region, otherwise invalid EDID blob pointer is assigned which caused kernel null pointer reference. We might evaluate actual display hotplug for BDW to make this function work as expected, anyway this is always required to be fixed first.
--- drivers/gpu/drm/i915/gvt/vgpu.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/gvt/vgpu.c +3 -2
@@ -432,8 +432,9 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,if (ret) goto out_clean_sched_policy; -/*TODO: add more platforms support */ -if (IS_SKYLAKE (gvt->dev_priv) ||IS_KABYLAKE (gvt->dev_priv)) +if (IS_BROADWELL (gvt->dev_priv)) + ret =intel_gvt_hypervisor_set_edid (vgpu,PORT_B ); +else ret =intel_gvt_hypervisor_set_edid (vgpu,PORT_D );if (ret) goto out_clean_sched_policy;
Signature · 1 line
2.30.2
PATCH 5/5 drm/i915/gvt: Fix vfio_edid issue for BXT/APL
In reply to Colin Xucommit 4ceb06e7c336f4a8d3f3b6ac9a4fea2e9c97dc07 upstream
BXT/APL has different isr/irr/hpd regs compared with other GEN9. If not setting these regs bits correctly according to the emulated monitor (currently a DP on PORT_B), although gvt still triggers a virtual HPD event, the guest driver won't detect a valid HPD pulse thus no full display detection will be executed to read the updated EDID.
With this patch, the vfio_edid is enabled again on BXT/APL, which is previously disabled.
--- drivers/gpu/drm/i915/gvt/display.c | 83 ++++++++++++++++++++++-------- drivers/gpu/drm/i915/gvt/vgpu.c | 2 +- 2 files changed, 62 insertions(+), 23 deletions(-)
drivers/gpu/drm/i915/gvt/display.c +61 -22
@@ -215,6 +215,15 @@ static void emulate_monitor_status_change(struct intel_vgpu *vgpu) DDI_BUF_CTL_ENABLE);vgpu_vreg_t (vgpu,DDI_BUF_CTL (port)) |=DDI_BUF_IS_IDLE ; } +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) &= + ~(PORTA_HOTPLUG_ENABLE |PORTA_HOTPLUG_STATUS_MASK ); +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) &= + ~(PORTB_HOTPLUG_ENABLE |PORTB_HOTPLUG_STATUS_MASK ); +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) &= + ~(PORTC_HOTPLUG_ENABLE |PORTC_HOTPLUG_STATUS_MASK ); +/* No hpd_invert set in vgpu vbt, need to clear invert mask */ +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) &= ~BXT_DDI_HPD_INVERT_MASK ; +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= ~BXT_DE_PORT_HOTPLUG_MASK ;vgpu_vreg_t (vgpu,BXT_P_CR_GT_DISP_PWRON ) &= ~(BIT (0 ) |BIT (1 )); vgpu_vreg_t(vgpu, BXT_PORT_CL1CM_DW0(DPIO_PHY0)) &=
@@ -271,6 +280,8 @@ static void emulate_monitor_status_change(struct intel_vgpu *vgpu)vgpu_vreg_t (vgpu,TRANS_DDI_FUNC_CTL (TRANSCODER_EDP )) |= (TRANS_DDI_BPC_8 |TRANS_DDI_MODE_SELECT_DP_SST |TRANS_DDI_FUNC_ENABLE ); +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) |= +PORTA_HOTPLUG_ENABLE ;vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIA ; }
@@ -299,6 +310,8 @@ static void emulate_monitor_status_change(struct intel_vgpu *vgpu) (TRANS_DDI_BPC_8 |TRANS_DDI_MODE_SELECT_DP_SST | (PORT_B <<TRANS_DDI_PORT_SHIFT ) |TRANS_DDI_FUNC_ENABLE ); +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) |= +PORTB_HOTPLUG_ENABLE ;vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIB ; }
@@ -327,6 +340,8 @@ static void emulate_monitor_status_change(struct intel_vgpu *vgpu) (TRANS_DDI_BPC_8 |TRANS_DDI_MODE_SELECT_DP_SST | (PORT_B <<TRANS_DDI_PORT_SHIFT ) |TRANS_DDI_FUNC_ENABLE ); +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) |= +PORTC_HOTPLUG_ENABLE ;vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIC ; }
@@ -652,38 +667,62 @@ void intel_vgpu_emulate_hotplug(struct intel_vgpu *vgpu, bool connected)PORTD_HOTPLUG_STATUS_MASK ;intel_vgpu_trigger_virtual_event (vgpu,DP_D_HOTPLUG ); }else if (IS_BROXTON (dev_priv)) { -if (connected) { -if (intel_vgpu_has_monitor_on_port (vgpu,PORT_A )) { -vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIA ; +if (intel_vgpu_has_monitor_on_port (vgpu,PORT_A )) { +if (connected) { +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |= +BXT_DE_PORT_HP_DDIA ; + }else { +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= + ~BXT_DE_PORT_HP_DDIA ; } -if (intel_vgpu_has_monitor_on_port (vgpu,PORT_B )) { +vgpu_vreg_t (vgpu,GEN8_DE_PORT_IIR ) |= +BXT_DE_PORT_HP_DDIA ; +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) &= + ~PORTA_HOTPLUG_STATUS_MASK ; +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) |= +PORTA_HOTPLUG_LONG_DETECT ; +intel_vgpu_trigger_virtual_event (vgpu,DP_A_HOTPLUG ); + } +if (intel_vgpu_has_monitor_on_port (vgpu,PORT_B )) { +if (connected) { +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |= +BXT_DE_PORT_HP_DDIB ;vgpu_vreg_t (vgpu,SFUSE_STRAP ) |=SFUSE_STRAP_DDIB_DETECTED ; -vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIB ; - } -if (intel_vgpu_has_monitor_on_port (vgpu,PORT_C )) { -vgpu_vreg_t (vgpu,SFUSE_STRAP ) |= -SFUSE_STRAP_DDIC_DETECTED ; -vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |=BXT_DE_PORT_HP_DDIC ; - } - }else { -if (intel_vgpu_has_monitor_on_port (vgpu,PORT_A )) { -vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= ~BXT_DE_PORT_HP_DDIA ; - } -if (intel_vgpu_has_monitor_on_port (vgpu,PORT_B )) { + }else { +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= + ~BXT_DE_PORT_HP_DDIB ;vgpu_vreg_t (vgpu,SFUSE_STRAP ) &= ~SFUSE_STRAP_DDIB_DETECTED ; -vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= ~BXT_DE_PORT_HP_DDIB ; } -if (intel_vgpu_has_monitor_on_port (vgpu,PORT_C )) { +vgpu_vreg_t (vgpu,GEN8_DE_PORT_IIR ) |= +BXT_DE_PORT_HP_DDIB ; +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) &= + ~PORTB_HOTPLUG_STATUS_MASK ; +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) |= +PORTB_HOTPLUG_LONG_DETECT ; +intel_vgpu_trigger_virtual_event (vgpu,DP_B_HOTPLUG ); + } +if (intel_vgpu_has_monitor_on_port (vgpu,PORT_C )) { +if (connected) { +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) |= +BXT_DE_PORT_HP_DDIC ; +vgpu_vreg_t (vgpu,SFUSE_STRAP ) |= +SFUSE_STRAP_DDIC_DETECTED ; + }else { +vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= + ~BXT_DE_PORT_HP_DDIC ;vgpu_vreg_t (vgpu,SFUSE_STRAP ) &= ~SFUSE_STRAP_DDIC_DETECTED ; -vgpu_vreg_t (vgpu,GEN8_DE_PORT_ISR ) &= ~BXT_DE_PORT_HP_DDIC ; } +vgpu_vreg_t (vgpu,GEN8_DE_PORT_IIR ) |= +BXT_DE_PORT_HP_DDIC ; +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) &= + ~PORTC_HOTPLUG_STATUS_MASK ; +vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) |= +PORTC_HOTPLUG_LONG_DETECT ; +intel_vgpu_trigger_virtual_event (vgpu,DP_C_HOTPLUG ); } -vgpu_vreg_t (vgpu,PCH_PORT_HOTPLUG ) |= -PORTB_HOTPLUG_STATUS_MASK ; -intel_vgpu_trigger_virtual_event (vgpu,DP_B_HOTPLUG ); } }
drivers/gpu/drm/i915/gvt/vgpu.c +1 -1
@@ -432,7 +432,7 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,if (ret) goto out_clean_sched_policy; -if (IS_BROADWELL (gvt->dev_priv)) +if (IS_BROADWELL (gvt->dev_priv) ||IS_BROXTON (gvt->dev_priv)) ret =intel_gvt_hypervisor_set_edid (vgpu,PORT_B );else ret =intel_gvt_hypervisor_set_edid (vgpu,PORT_D );
Signature · 1 line
2.30.2
Re: [PATCH 5/5] drm/i915/gvt: Fix vfio_edid issue for BXT/APL
Quoted 19 lines · Colin Xu
commit
4ceb06e7c336f4a8d3f3b6ac9a4fea2e9c97dc07upstreamBXT/APL has different isr/irr/hpd regs compared with other GEN9. If not setting these regs bits correctly according to the emulated monitor (currently a DP on
PORT_B), although gvt still triggers a virtual HPD event, the guest driver won't detect a valid HPD pulse thus no full display detection will be executed to read the updated EDID.With this patch, the
vfio_edidis enabled again on BXT/APL, which is previously disabled.Fixes 642403e3599e ("drm/i915/gvt: Temporarily disable vfio_edid for BXT/APL")Signed-off-by Colin Xu <[email protected]>Signed-off-by Zhenyu Wang <[email protected]>Reviewed-by Zhenyu Wang <[email protected]>(cherry picked from commit 4ceb06e7c336f4a8d3f3b6ac9a4fea2e9c97dc07)Signed-off-by Colin Xu <[email protected]>Cc <[email protected]> # 5.4.y
Quoted 4 lines
--- drivers/gpu/drm/i915/gvt/display.c | 83 ++++++++++++++++++++++-------- drivers/gpu/drm/i915/gvt/vgpu.c | 2 +- 2 files changed, 62 insertions(+), 23 deletions(-)
Can you also send a backport for 5.10.y for this patch as it is needed there as well?
thanks,
greg k-h
Re: [PATCH 3/5] drm/i915/gvt: Fix virtual display setup for BXT/APL
In reply to Colin XuQuoted 35 lines · Colin Xu
commit
a5a8ef937cfa79167f4b2a5602092b8d14fd6b9aupstreamProgram display related vregs to proper value at initialization, setup virtual monitor and hotplug.
vGPU virtual display vregs inherit the value from pregs. The virtual DP monitor is always setup on
PORT_Bfor BXT/APL. However the host may connect monitor on other PORT or without any monitor connected. Without properly setup PIPE/DDI/PLL related vregs, guest driver may not setup the virutal display as expected, and the guest desktop may not be created.
Since only one virtual display is supported, enablePIPE_Aonly. And enable transcoder/DDI/PLL based on which port is setup for BXT/APL.V2:
Revise commit message.V3:
set_edidshould onPORT_Bfor BXT.
Inject hpd event for BXT.V4:
Temporarily disable vfio edid on BXT/APL until issue fixed.V5:
Rebase to use new HPD defineGEN8_DE_PORT_HOTPLUGfor BXT. Put vfio edid disabling on BXT/APL to a separate patch.Acked-by Zhenyu Wang <[email protected]>Signed-off-by Colin Xu <[email protected]>Signed-off-by Zhenyu Wang <[email protected]>(cherry picked from commit a5a8ef937cfa79167f4b2a5602092b8d14fd6b9a)Signed-off-by Colin Xu <[email protected]>Cc <[email protected]> # 5.4.y
Quoted 4 lines
--- drivers/gpu/drm/i915/gvt/display.c | 173 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/gvt/mmio.c | 5 + 2 files changed, 178 insertions(+)
I've taken this backport for 5.10.y as well, because it is missing there.
greg k-h
Re: [PATCH 3/5] drm/i915/gvt: Fix virtual display setup for BXT/APL
Quoted 41 lines · Greg KH
Quoted 35 lines · Colin Xu
commit
a5a8ef937cfa79167f4b2a5602092b8d14fd6b9aupstreamProgram display related vregs to proper value at initialization, setup virtual monitor and hotplug.
vGPU virtual display vregs inherit the value from pregs. The virtual DP monitor is always setup on
PORT_Bfor BXT/APL. However the host may connect monitor on other PORT or without any monitor connected. Without properly setup PIPE/DDI/PLL related vregs, guest driver may not setup the virutal display as expected, and the guest desktop may not be created.
Since only one virtual display is supported, enablePIPE_Aonly. And enable transcoder/DDI/PLL based on which port is setup for BXT/APL.V2:
Revise commit message.V3:
set_edidshould onPORT_Bfor BXT.
Inject hpd event for BXT.V4:
Temporarily disable vfio edid on BXT/APL until issue fixed.V5:
Rebase to use new HPD defineGEN8_DE_PORT_HOTPLUGfor BXT. Put vfio edid disabling on BXT/APL to a separate patch.Acked-by Zhenyu Wang <[email protected]>Signed-off-by Colin Xu <[email protected]>Signed-off-by Zhenyu Wang <[email protected]>(cherry picked from commit a5a8ef937cfa79167f4b2a5602092b8d14fd6b9a)Signed-off-by Colin Xu <[email protected]>Cc <[email protected]> # 5.4.yQuoted 4 lines
--- drivers/gpu/drm/i915/gvt/display.c | 173 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/gvt/mmio.c | 5 + 2 files changed, 178 insertions(+)
Quoted 2 lines
I've taken this backport for 5.10.y as well, because it is missing there.
Oops, nope, it breaks the build.
Please also provide a working backport for this as well, we can not have users moving to a newer kernel version and have a regression for a known issue.
thanks,
greg k-h