mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	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>
			
			
This commit is contained in:
		
							parent
							
								
									9174c1d619
								
							
						
					
					
						commit
						c8ab5ac30c
					
				| @ -1538,9 +1538,15 @@ static int bxt_phy_ctl_family_write(struct intel_vgpu *vgpu, | |||||||
| 	u32 v = *(u32 *)p_data; | 	u32 v = *(u32 *)p_data; | ||||||
| 	u32 data = v & COMMON_RESET_DIS ? BXT_PHY_LANE_ENABLED : 0; | 	u32 data = v & COMMON_RESET_DIS ? BXT_PHY_LANE_ENABLED : 0; | ||||||
| 
 | 
 | ||||||
| 	vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_A) = data; | 	switch (offset) { | ||||||
| 	vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_B) = data; | 	case _PHY_CTL_FAMILY_EDP: | ||||||
| 	vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_C) = data; | 		vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_A) = data; | ||||||
|  | 		break; | ||||||
|  | 	case _PHY_CTL_FAMILY_DDI: | ||||||
|  | 		vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_B) = data; | ||||||
|  | 		vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_C) = data; | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	vgpu_vreg(vgpu, offset) = v; | 	vgpu_vreg(vgpu, offset) = v; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Colin Xu
						Colin Xu