|
@@ -3311,8 +3311,9 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
|
|
*/
|
|
*/
|
|
static void amdgpu_device_get_pcie_info(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)
|
|
if (amdgpu_pcie_gen_cap)
|
|
adev->pm.pcie_gen_mask = 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) {
|
|
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_GEN2 |
|
|
CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
|
|
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 {
|
|
} 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) {
|
|
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 |
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
|
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_X2 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
break;
|
|
break;
|
|
- case 16:
|
|
|
|
|
|
+ case PCIE_LNK_X16:
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
|
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_X2 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
break;
|
|
break;
|
|
- case 12:
|
|
|
|
|
|
+ case PCIE_LNK_X12:
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
break;
|
|
break;
|
|
- case 8:
|
|
|
|
|
|
+ case PCIE_LNK_X8:
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
break;
|
|
break;
|
|
- case 4:
|
|
|
|
|
|
+ case PCIE_LNK_X4:
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
break;
|
|
break;
|
|
- case 2:
|
|
|
|
|
|
+ case PCIE_LNK_X2:
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
|
|
break;
|
|
break;
|
|
- case 1:
|
|
|
|
|
|
+ case PCIE_LNK_X1:
|
|
adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
|
|
adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|