Skip to content

Commit c8ab5ac

Browse files
coxuintelzhenyw
authored andcommitted
drm/i915/gvt: Make correct handling to vreg BXT_PHY_CTL_FAMILY
Guest kernel will write to BXT_PHY_CTL_FAMILY to reset DDI PHY and pull BXT_PHY_CTL to check PHY status. Previous handling will set/reset BXT_PHY_CTL of all PHYs at same time on receiving vreg write to some BXT_PHY_CTL_FAMILY. If some BXT_PHY_CTL is already enabled, following reset to another BXT_PHY_CTL_FAMILY will clear the enabled BXT_PHY_CTL, which result in guest kernel print: ----------------------------------- [drm:intel_ddi_get_hw_state [i915]] *ERROR* Port B enabled but PHY powered down? (PHY_CTL 00000000) ----------------------------------- The correct handling should operate BXT_PHY_CTL_FAMILY and BXT_PHY_CTL on the same DDI. v2: Use correct reg define. The naming looks confusing, however current i915_reg.h bind DPIO_PHY0 to _PHY_CTL_FAMILY_DDI and bind DPIO_PHY1 to _PHY_CTL_FAMILY_EDP, pairing to _BXT_PHY_CTL_DDI_A and _BXT_PHY_CTL_DDI_B respectively. v3: v2 incorrectly map _PHY_CTL_FAMILY_EDP to _BXT_PHY_CTL_DDI_A. BXT_PHY_CTL() looks up DDI using PORTx but not PHYx. Based on DPIO_PHY to DDI mapping, make correct vreg handle to BXT_PHY_CTL on receiving vreg write to BXT_PHY_CTL_FAMILY. (He, Min) Current mapping according to bxt_power_wells: dpio-common-a: >>> DPIO_PHY1 >>> BXT_DPIO_CMN_A_POWER_DOMAINS >>> POWER_DOMAIN_PORT_DDI_A_LANES >>> PORT_A dpio-common-bc: >>> DPIO_PHY0 >>> BXT_DPIO_CMN_BC_POWER_DOMAINS >>> POWER_DOMAIN_PORT_DDI_B_LANES | POWER_DOMAIN_PORT_DDI_C_LANES >>> PORT_B or PORT_C Signed-off-by: Colin Xu <colin.xu@intel.com> Reviewed-by: He, Min <min.he@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
1 parent 9174c1d commit c8ab5ac

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

drivers/gpu/drm/i915/gvt/handlers.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,9 +1538,15 @@ static int bxt_phy_ctl_family_write(struct intel_vgpu *vgpu,
15381538
u32 v = *(u32 *)p_data;
15391539
u32 data = v & COMMON_RESET_DIS ? BXT_PHY_LANE_ENABLED : 0;
15401540

1541-
vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_A) = data;
1542-
vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_B) = data;
1543-
vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_C) = data;
1541+
switch (offset) {
1542+
case _PHY_CTL_FAMILY_EDP:
1543+
vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_A) = data;
1544+
break;
1545+
case _PHY_CTL_FAMILY_DDI:
1546+
vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_B) = data;
1547+
vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_C) = data;
1548+
break;
1549+
}
15441550

15451551
vgpu_vreg(vgpu, offset) = v;
15461552

0 commit comments

Comments
 (0)