diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/si.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si.c | 97 | 
1 files changed, 61 insertions, 36 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c index 29024e64c886..f2d70a47a3af 100644 --- a/drivers/gpu/drm/amd/amdgpu/si.c +++ b/drivers/gpu/drm/amd/amdgpu/si.c @@ -1644,7 +1644,6 @@ static void si_init_golden_registers(struct amdgpu_device *adev)  static void si_pcie_gen3_enable(struct amdgpu_device *adev)  {  	struct pci_dev *root = adev->pdev->bus->self; -	int bridge_pos, gpu_pos;  	u32 speed_cntl, current_data_rate;  	int i;  	u16 tmp16; @@ -1679,12 +1678,7 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev)  		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");  	} -	bridge_pos = pci_pcie_cap(root); -	if (!bridge_pos) -		return; - -	gpu_pos = pci_pcie_cap(adev->pdev); -	if (!gpu_pos) +	if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))  		return;  	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) { @@ -1693,14 +1687,17 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev)  			u16 bridge_cfg2, gpu_cfg2;  			u32 max_lw, current_lw, tmp; -			pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg); -			pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg); +			pcie_capability_read_word(root, PCI_EXP_LNKCTL, +						  &bridge_cfg); +			pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL, +						  &gpu_cfg);  			tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD; -			pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16); +			pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);  			tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD; -			pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16); +			pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL, +						   tmp16);  			tmp = RREG32_PCIE(PCIE_LC_STATUS1);  			max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT; @@ -1717,15 +1714,23 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev)  			}  			for (i = 0; i < 10; i++) { -				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16); +				pcie_capability_read_word(adev->pdev, +							  PCI_EXP_DEVSTA, +							  &tmp16);  				if (tmp16 & PCI_EXP_DEVSTA_TRPND)  					break; -				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg); -				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg); +				pcie_capability_read_word(root, PCI_EXP_LNKCTL, +							  &bridge_cfg); +				pcie_capability_read_word(adev->pdev, +							  PCI_EXP_LNKCTL, +							  &gpu_cfg); -				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2); -				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2); +				pcie_capability_read_word(root, PCI_EXP_LNKCTL2, +							  &bridge_cfg2); +				pcie_capability_read_word(adev->pdev, +							  PCI_EXP_LNKCTL2, +							  &gpu_cfg2);  				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);  				tmp |= LC_SET_QUIESCE; @@ -1737,25 +1742,44 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev)  				mdelay(100); -				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16); +				pcie_capability_read_word(root, PCI_EXP_LNKCTL, +							  &tmp16);  				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;  				tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD); -				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16); +				pcie_capability_write_word(root, PCI_EXP_LNKCTL, +							   tmp16); -				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16); +				pcie_capability_read_word(adev->pdev, +							  PCI_EXP_LNKCTL, +							  &tmp16);  				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;  				tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD); -				pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16); - -				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16); -				tmp16 &= ~((1 << 4) | (7 << 9)); -				tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9))); -				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16); - -				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16); -				tmp16 &= ~((1 << 4) | (7 << 9)); -				tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9))); -				pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16); +				pcie_capability_write_word(adev->pdev, +							   PCI_EXP_LNKCTL, +							   tmp16); + +				pcie_capability_read_word(root, PCI_EXP_LNKCTL2, +							  &tmp16); +				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP | +					   PCI_EXP_LNKCTL2_TX_MARGIN); +				tmp16 |= (bridge_cfg2 & +					  (PCI_EXP_LNKCTL2_ENTER_COMP | +					   PCI_EXP_LNKCTL2_TX_MARGIN)); +				pcie_capability_write_word(root, +							   PCI_EXP_LNKCTL2, +							   tmp16); + +				pcie_capability_read_word(adev->pdev, +							  PCI_EXP_LNKCTL2, +							  &tmp16); +				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP | +					   PCI_EXP_LNKCTL2_TX_MARGIN); +				tmp16 |= (gpu_cfg2 & +					  (PCI_EXP_LNKCTL2_ENTER_COMP | +					   PCI_EXP_LNKCTL2_TX_MARGIN)); +				pcie_capability_write_word(adev->pdev, +							   PCI_EXP_LNKCTL2, +							   tmp16);  				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);  				tmp &= ~LC_SET_QUIESCE; @@ -1768,15 +1792,16 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev)  	speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;  	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); -	pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16); -	tmp16 &= ~0xf; +	pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16); +	tmp16 &= ~PCI_EXP_LNKCTL2_TLS; +  	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) -		tmp16 |= 3; +		tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */  	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) -		tmp16 |= 2; +		tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */  	else -		tmp16 |= 1; -	pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16); +		tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */ +	pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);  	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);  	speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE; | 
