|
|
|
|
@@ -3311,8 +3311,9 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
|
|
|
|
|
*/
|
|
|
|
|
static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
|
|
|
|
|
{
|
|
|
|
|
u32 mask;
|
|
|
|
|
int ret;
|
|
|
|
|
struct pci_dev *pdev;
|
|
|
|
|
enum pci_bus_speed speed_cap;
|
|
|
|
|
enum pcie_link_width link_width;
|
|
|
|
|
|
|
|
|
|
if (amdgpu_pcie_gen_cap)
|
|
|
|
|
adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap;
|
|
|
|
|
@@ -3330,27 +3331,61 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (adev->pm.pcie_gen_mask == 0) {
|
|
|
|
|
ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
|
|
|
|
|
if (!ret) {
|
|
|
|
|
adev->pm.pcie_gen_mask = (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
|
|
|
|
|
/* asic caps */
|
|
|
|
|
pdev = adev->pdev;
|
|
|
|
|
speed_cap = pcie_get_speed_cap(pdev);
|
|
|
|
|
if (speed_cap == PCI_SPEED_UNKNOWN) {
|
|
|
|
|
adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
|
|
|
|
|
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
|
|
|
|
|
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
|
|
|
|
|
|
|
|
|
|
if (mask & DRM_PCIE_SPEED_25)
|
|
|
|
|
adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;
|
|
|
|
|
if (mask & DRM_PCIE_SPEED_50)
|
|
|
|
|
adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2;
|
|
|
|
|
if (mask & DRM_PCIE_SPEED_80)
|
|
|
|
|
adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3;
|
|
|
|
|
} else {
|
|
|
|
|
adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
|
|
|
|
|
if (speed_cap == PCIE_SPEED_16_0GT)
|
|
|
|
|
adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
|
|
|
|
|
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
|
|
|
|
|
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3 |
|
|
|
|
|
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN4);
|
|
|
|
|
else if (speed_cap == PCIE_SPEED_8_0GT)
|
|
|
|
|
adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
|
|
|
|
|
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
|
|
|
|
|
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
|
|
|
|
|
else if (speed_cap == PCIE_SPEED_5_0GT)
|
|
|
|
|
adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
|
|
|
|
|
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2);
|
|
|
|
|
else
|
|
|
|
|
adev->pm.pcie_gen_mask |= CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1;
|
|
|
|
|
}
|
|
|
|
|
/* platform caps */
|
|
|
|
|
pdev = adev->ddev->pdev->bus->self;
|
|
|
|
|
speed_cap = pcie_get_speed_cap(pdev);
|
|
|
|
|
if (speed_cap == PCI_SPEED_UNKNOWN) {
|
|
|
|
|
adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
|
|
|
|
|
CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2);
|
|
|
|
|
} else {
|
|
|
|
|
if (speed_cap == PCIE_SPEED_16_0GT)
|
|
|
|
|
adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
|
|
|
|
|
CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
|
|
|
|
|
CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3 |
|
|
|
|
|
CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4);
|
|
|
|
|
else if (speed_cap == PCIE_SPEED_8_0GT)
|
|
|
|
|
adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
|
|
|
|
|
CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
|
|
|
|
|
CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3);
|
|
|
|
|
else if (speed_cap == PCIE_SPEED_5_0GT)
|
|
|
|
|
adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 |
|
|
|
|
|
CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2);
|
|
|
|
|
else
|
|
|
|
|
adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (adev->pm.pcie_mlw_mask == 0) {
|
|
|
|
|
ret = drm_pcie_get_max_link_width(adev->ddev, &mask);
|
|
|
|
|
if (!ret) {
|
|
|
|
|
switch (mask) {
|
|
|
|
|
case 32:
|
|
|
|
|
pdev = adev->ddev->pdev->bus->self;
|
|
|
|
|
link_width = pcie_get_width_cap(pdev);
|
|
|
|
|
if (link_width == PCIE_LNK_WIDTH_UNKNOWN) {
|
|
|
|
|
adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK;
|
|
|
|
|
} else {
|
|
|
|
|
switch (link_width) {
|
|
|
|
|
case PCIE_LNK_X32:
|
|
|
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
|
|
|
|
@@ -3359,7 +3394,7 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
|
|
|
break;
|
|
|
|
|
case 16:
|
|
|
|
|
case PCIE_LNK_X16:
|
|
|
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
|
|
|
|
@@ -3367,36 +3402,34 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
|
|
|
break;
|
|
|
|
|
case 12:
|
|
|
|
|
case PCIE_LNK_X12:
|
|
|
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
|
|
|
break;
|
|
|
|
|
case 8:
|
|
|
|
|
case PCIE_LNK_X8:
|
|
|
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
case PCIE_LNK_X4:
|
|
|
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
case PCIE_LNK_X2:
|
|
|
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
|
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
case PCIE_LNK_X1:
|
|
|
|
|
adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|