drm/radeon/kms: auto detect pcie link speed from root port
authorDave Airlie <airlied@redhat.com>
Wed, 27 Jun 2012 07:35:54 +0000 (08:35 +0100)
committerDave Airlie <airlied@redhat.com>
Fri, 20 Jul 2012 02:30:32 +0000 (22:30 -0400)
This check the root ports supported link speeds and enables
GEN2 mode if the 5.0 GT link speed is available.

The first 3.0 cards are SI so they will probably need more investigation.

Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/evergreen.c
drivers/gpu/drm/radeon/r600.c
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/radeon/rv770.c

index 14098ace156972761131732a0f3bca6dc34732b0..e585a3b947eb7c169fe9869aa18880744ab92ef2 100644 (file)
@@ -3421,7 +3421,8 @@ void evergreen_fini(struct radeon_device *rdev)
 
 void evergreen_pcie_gen2_enable(struct radeon_device *rdev)
 {
-       u32 link_width_cntl, speed_cntl;
+       u32 link_width_cntl, speed_cntl, mask;
+       int ret;
 
        if (radeon_pcie_gen2 == 0)
                return;
@@ -3436,6 +3437,15 @@ void evergreen_pcie_gen2_enable(struct radeon_device *rdev)
        if (ASIC_IS_X2(rdev))
                return;
 
+       ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
+       if (ret != 0)
+               return;
+
+       if (!(mask & DRM_PCIE_SPEED_50))
+               return;
+
+       DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
+
        speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
        if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) ||
            (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
index e2dee80e27dc1fa41f917139b8d0172c87a59064..637280f541a38492e8a0289e209285e0bb518aaf 100644 (file)
@@ -3681,6 +3681,8 @@ static void r600_pcie_gen2_enable(struct radeon_device *rdev)
 {
        u32 link_width_cntl, lanes, speed_cntl, training_cntl, tmp;
        u16 link_cntl2;
+       u32 mask;
+       int ret;
 
        if (radeon_pcie_gen2 == 0)
                return;
@@ -3699,6 +3701,15 @@ static void r600_pcie_gen2_enable(struct radeon_device *rdev)
        if (rdev->family <= CHIP_R600)
                return;
 
+       ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
+       if (ret != 0)
+               return;
+
+       if (!(mask & DRM_PCIE_SPEED_50))
+               return;
+
+       DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
+
        /* 55 nm r6xx asics */
        if ((rdev->family == CHIP_RV670) ||
            (rdev->family == CHIP_RV620) ||
index 2c4d53fd20c5c1e010e0d297d62c591e6ff618b9..042fcfff3bc4fcefba3d5c8a8c4087a1b27caab4 100644 (file)
@@ -133,7 +133,7 @@ int radeon_tv = 1;
 int radeon_audio = 0;
 int radeon_disp_priority = 0;
 int radeon_hw_i2c = 0;
-int radeon_pcie_gen2 = 0;
+int radeon_pcie_gen2 = -1;
 int radeon_msi = -1;
 int radeon_lockup_timeout = 10000;
 
@@ -179,7 +179,7 @@ module_param_named(disp_priority, radeon_disp_priority, int, 0444);
 MODULE_PARM_DESC(hw_i2c, "hw i2c engine enable (0 = disable)");
 module_param_named(hw_i2c, radeon_hw_i2c, int, 0444);
 
-MODULE_PARM_DESC(pcie_gen2, "PCIE Gen2 mode (1 = enable)");
+MODULE_PARM_DESC(pcie_gen2, "PCIE Gen2 mode (-1 = auto, 0 = disable, 1 = enable)");
 module_param_named(pcie_gen2, radeon_pcie_gen2, int, 0444);
 
 MODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)");
index eb4704e72bdbb33b519774aa899153cc977f95f4..ca8ffec10ff64737e7fa38b251b997d9fd2d3436 100644 (file)
@@ -1112,6 +1112,8 @@ static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
 {
        u32 link_width_cntl, lanes, speed_cntl, tmp;
        u16 link_cntl2;
+       u32 mask;
+       int ret;
 
        if (radeon_pcie_gen2 == 0)
                return;
@@ -1126,6 +1128,15 @@ static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
        if (ASIC_IS_X2(rdev))
                return;
 
+       ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
+       if (ret != 0)
+               return;
+
+       if (!(mask & DRM_PCIE_SPEED_50))
+               return;
+
+       DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
+
        /* advertise upconfig capability */
        link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
        link_width_cntl &= ~LC_UPCONFIGURE_DIS;