Re: [PATCH] drm/amdgpu: used cached pcie gen info for SI (v2)

2018-03-02 Thread Zhu, Rex
Reviewed-by: Rex Zhu

Best Regards
Rex



From: amd-gfx  on behalf of Alex Deucher 

Sent: Thursday, March 1, 2018 10:04 AM
To: amd-gfx@lists.freedesktop.org
Cc: Deucher, Alexander; sta...@vger.kernel.org
Subject: [PATCH] drm/amdgpu: used cached pcie gen info for SI (v2)

Rather than querying it every time we need it.
Also fixes a crash in VM pass through if there is no
root bridge because the cached value fetch already checks
this properly.

v2: fix includes

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=105244
Signed-off-by: Alex Deucher 
Cc: sta...@vger.kernel.org
---
 drivers/gpu/drm/amd/amdgpu/si.c | 22 
 drivers/gpu/drm/amd/amdgpu/si_dpm.c | 50 ++---
 2 files changed, 23 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c
index f20c4b7414e8..6e61b56bfbfc 100644
--- a/drivers/gpu/drm/amd/amdgpu/si.c
+++ b/drivers/gpu/drm/amd/amdgpu/si.c
@@ -31,6 +31,7 @@
 #include "amdgpu_uvd.h"
 #include "amdgpu_vce.h"
 #include "atom.h"
+#include "amd_pcie.h"
 #include "amdgpu_powerplay.h"
 #include "sid.h"
 #include "si_ih.h"
@@ -1484,8 +1485,8 @@ 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, mask, current_data_rate;
-   int ret, i;
+   u32 speed_cntl, current_data_rate;
+   int i;
 u16 tmp16;

 if (pci_is_root_bus(adev->pdev->bus))
@@ -1497,23 +1498,20 @@ static void si_pcie_gen3_enable(struct amdgpu_device 
*adev)
 if (adev->flags & AMD_IS_APU)
 return;

-   ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
-   if (ret != 0)
-   return;
-
-   if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
+   if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
+   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
 return;

 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
 LC_CURRENT_DATA_RATE_SHIFT;
-   if (mask & DRM_PCIE_SPEED_80) {
+   if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
 if (current_data_rate == 2) {
 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
 return;
 }
 DRM_INFO("enabling PCIE gen 3 link speeds, disable with 
amdgpu.pcie_gen2=0\n");
-   } else if (mask & DRM_PCIE_SPEED_50) {
+   } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
 if (current_data_rate == 1) {
 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
 return;
@@ -1529,7 +1527,7 @@ static void si_pcie_gen3_enable(struct amdgpu_device 
*adev)
 if (!gpu_pos)
 return;

-   if (mask & DRM_PCIE_SPEED_80) {
+   if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
 if (current_data_rate != 2) {
 u16 bridge_cfg, gpu_cfg;
 u16 bridge_cfg2, gpu_cfg2;
@@ -1612,9 +1610,9 @@ static void si_pcie_gen3_enable(struct amdgpu_device 
*adev)

 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
 tmp16 &= ~0xf;
-   if (mask & DRM_PCIE_SPEED_80)
+   if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
 tmp16 |= 3;
-   else if (mask & DRM_PCIE_SPEED_50)
+   else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
 tmp16 |= 2;
 else
 tmp16 |= 1;
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c 
b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
index 8138053fcef1..8137c02fd16a 100644
--- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
@@ -26,6 +26,7 @@
 #include "amdgpu_pm.h"
 #include "amdgpu_dpm.h"
 #include "amdgpu_atombios.h"
+#include "amd_pcie.h"
 #include "sid.h"
 #include "r600_dpm.h"
 #include "si_dpm.h"
@@ -3331,29 +3332,6 @@ static void btc_apply_voltage_delta_rules(struct 
amdgpu_device *adev,
 }
 }

-static enum amdgpu_pcie_gen r600_get_pcie_gen_support(struct amdgpu_device 
*adev,
-  u32 sys_mask,
-  enum amdgpu_pcie_gen asic_gen,
-  enum amdgpu_pcie_gen default_gen)
-{
-   switch (asic_gen) {
-   case AMDGPU_PCIE_GEN1:
-   return AMDGPU_PCIE_GEN1;
-   case AMDGPU_PCIE_GEN2:
-   return AMDGPU_PCIE_GEN2;
-   case AMDGPU_PCIE_GEN3:
-   return AMDGPU_PCIE_GEN3;
-   default:
-   if ((sys_mask & DRM_PCIE_SPEED_80) && (default_gen == 
AMDGPU_PCIE_GEN3))
-

Re: [PATCH] drm/amdgpu: used cached pcie gen info for SI (v2)

2018-03-01 Thread Christian König

Am 01.03.2018 um 03:04 schrieb Alex Deucher:

Rather than querying it every time we need it.
Also fixes a crash in VM pass through if there is no
root bridge because the cached value fetch already checks
this properly.

v2: fix includes

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=105244
Signed-off-by: Alex Deucher 


Acked-by: Christian König 


Cc: sta...@vger.kernel.org
---
  drivers/gpu/drm/amd/amdgpu/si.c | 22 
  drivers/gpu/drm/amd/amdgpu/si_dpm.c | 50 ++---
  2 files changed, 23 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c
index f20c4b7414e8..6e61b56bfbfc 100644
--- a/drivers/gpu/drm/amd/amdgpu/si.c
+++ b/drivers/gpu/drm/amd/amdgpu/si.c
@@ -31,6 +31,7 @@
  #include "amdgpu_uvd.h"
  #include "amdgpu_vce.h"
  #include "atom.h"
+#include "amd_pcie.h"
  #include "amdgpu_powerplay.h"
  #include "sid.h"
  #include "si_ih.h"
@@ -1484,8 +1485,8 @@ 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, mask, current_data_rate;
-   int ret, i;
+   u32 speed_cntl, current_data_rate;
+   int i;
u16 tmp16;
  
  	if (pci_is_root_bus(adev->pdev->bus))

@@ -1497,23 +1498,20 @@ static void si_pcie_gen3_enable(struct amdgpu_device 
*adev)
if (adev->flags & AMD_IS_APU)
return;
  
-	ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);

-   if (ret != 0)
-   return;
-
-   if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
+   if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
+   CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
return;
  
  	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);

current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
LC_CURRENT_DATA_RATE_SHIFT;
-   if (mask & DRM_PCIE_SPEED_80) {
+   if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
if (current_data_rate == 2) {
DRM_INFO("PCIE gen 3 link speeds already enabled\n");
return;
}
DRM_INFO("enabling PCIE gen 3 link speeds, disable with 
amdgpu.pcie_gen2=0\n");
-   } else if (mask & DRM_PCIE_SPEED_50) {
+   } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
if (current_data_rate == 1) {
DRM_INFO("PCIE gen 2 link speeds already enabled\n");
return;
@@ -1529,7 +1527,7 @@ static void si_pcie_gen3_enable(struct amdgpu_device 
*adev)
if (!gpu_pos)
return;
  
-	if (mask & DRM_PCIE_SPEED_80) {

+   if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
if (current_data_rate != 2) {
u16 bridge_cfg, gpu_cfg;
u16 bridge_cfg2, gpu_cfg2;
@@ -1612,9 +1610,9 @@ static void si_pcie_gen3_enable(struct amdgpu_device 
*adev)
  
  	pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);

tmp16 &= ~0xf;
-   if (mask & DRM_PCIE_SPEED_80)
+   if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
tmp16 |= 3;
-   else if (mask & DRM_PCIE_SPEED_50)
+   else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
tmp16 |= 2;
else
tmp16 |= 1;
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c 
b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
index 8138053fcef1..8137c02fd16a 100644
--- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
@@ -26,6 +26,7 @@
  #include "amdgpu_pm.h"
  #include "amdgpu_dpm.h"
  #include "amdgpu_atombios.h"
+#include "amd_pcie.h"
  #include "sid.h"
  #include "r600_dpm.h"
  #include "si_dpm.h"
@@ -3331,29 +3332,6 @@ static void btc_apply_voltage_delta_rules(struct 
amdgpu_device *adev,
}
  }
  
-static enum amdgpu_pcie_gen r600_get_pcie_gen_support(struct amdgpu_device *adev,

-  u32 sys_mask,
-  enum amdgpu_pcie_gen asic_gen,
-  enum amdgpu_pcie_gen default_gen)
-{
-   switch (asic_gen) {
-   case AMDGPU_PCIE_GEN1:
-   return AMDGPU_PCIE_GEN1;
-   case AMDGPU_PCIE_GEN2:
-   return AMDGPU_PCIE_GEN2;
-   case AMDGPU_PCIE_GEN3:
-   return AMDGPU_PCIE_GEN3;
-   default:
-   if ((sys_mask & DRM_PCIE_SPEED_80) && (default_gen == 
AMDGPU_PCIE_GEN3))
-   return AMDGPU_PCIE_GEN3;
-   else if ((sys_mask & DRM_PCIE_SPEED_50) && (default_gen == 
AMDGPU_PCIE_GEN2))
-   return AMDGPU_PCIE_GEN2;
-   else
-   return AMDGPU_PCIE_GEN1;
-