Skip to content

Commit 20ca25e

Browse files
committed
drm/amdgpu/si: implement get/set pcie_lanes asic callback
Required for dpm setup on some asics. Fixes a NULL dereference on asics that require it. Acked-by: Christian König <christian.koenig@amd.com> Bug: https://bugs.freedesktop.org/show_bug.cgi?id=102553 Tested-by: Abel Garcia Dorta <mercuriete@yahoo.es> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
1 parent f7a9ee8 commit 20ca25e

File tree

1 file changed

+67
-0
lines changed
  • drivers/gpu/drm/amd/amdgpu

1 file changed

+67
-0
lines changed

drivers/gpu/drm/amd/amdgpu/si.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,6 +1252,71 @@ static void si_invalidate_hdp(struct amdgpu_device *adev,
12521252
}
12531253
}
12541254

1255+
static int si_get_pcie_lanes(struct amdgpu_device *adev)
1256+
{
1257+
u32 link_width_cntl;
1258+
1259+
if (adev->flags & AMD_IS_APU)
1260+
return 0;
1261+
1262+
link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1263+
1264+
switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
1265+
case LC_LINK_WIDTH_X1:
1266+
return 1;
1267+
case LC_LINK_WIDTH_X2:
1268+
return 2;
1269+
case LC_LINK_WIDTH_X4:
1270+
return 4;
1271+
case LC_LINK_WIDTH_X8:
1272+
return 8;
1273+
case LC_LINK_WIDTH_X0:
1274+
case LC_LINK_WIDTH_X16:
1275+
default:
1276+
return 16;
1277+
}
1278+
}
1279+
1280+
static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
1281+
{
1282+
u32 link_width_cntl, mask;
1283+
1284+
if (adev->flags & AMD_IS_APU)
1285+
return;
1286+
1287+
switch (lanes) {
1288+
case 0:
1289+
mask = LC_LINK_WIDTH_X0;
1290+
break;
1291+
case 1:
1292+
mask = LC_LINK_WIDTH_X1;
1293+
break;
1294+
case 2:
1295+
mask = LC_LINK_WIDTH_X2;
1296+
break;
1297+
case 4:
1298+
mask = LC_LINK_WIDTH_X4;
1299+
break;
1300+
case 8:
1301+
mask = LC_LINK_WIDTH_X8;
1302+
break;
1303+
case 16:
1304+
mask = LC_LINK_WIDTH_X16;
1305+
break;
1306+
default:
1307+
DRM_ERROR("invalid pcie lane request: %d\n", lanes);
1308+
return;
1309+
}
1310+
1311+
link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1312+
link_width_cntl &= ~LC_LINK_WIDTH_MASK;
1313+
link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
1314+
link_width_cntl |= (LC_RECONFIG_NOW |
1315+
LC_RECONFIG_ARC_MISSING_ESCAPE);
1316+
1317+
WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1318+
}
1319+
12551320
static const struct amdgpu_asic_funcs si_asic_funcs =
12561321
{
12571322
.read_disabled_bios = &si_read_disabled_bios,
@@ -1262,6 +1327,8 @@ static const struct amdgpu_asic_funcs si_asic_funcs =
12621327
.get_xclk = &si_get_xclk,
12631328
.set_uvd_clocks = &si_set_uvd_clocks,
12641329
.set_vce_clocks = NULL,
1330+
.get_pcie_lanes = &si_get_pcie_lanes,
1331+
.set_pcie_lanes = &si_set_pcie_lanes,
12651332
.get_config_memsize = &si_get_config_memsize,
12661333
.flush_hdp = &si_flush_hdp,
12671334
.invalidate_hdp = &si_invalidate_hdp,

0 commit comments

Comments
 (0)