diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/si.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c index b154667a8fd9..a675ec6d2811 100644 --- a/drivers/gpu/drm/amd/amdgpu/si.c +++ b/drivers/gpu/drm/amd/amdgpu/si.c | |||
@@ -1252,6 +1252,71 @@ static void si_invalidate_hdp(struct amdgpu_device *adev, | |||
1252 | } | 1252 | } |
1253 | } | 1253 | } |
1254 | 1254 | ||
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 | |||
1255 | static const struct amdgpu_asic_funcs si_asic_funcs = | 1320 | static const struct amdgpu_asic_funcs si_asic_funcs = |
1256 | { | 1321 | { |
1257 | .read_disabled_bios = &si_read_disabled_bios, | 1322 | .read_disabled_bios = &si_read_disabled_bios, |
@@ -1262,6 +1327,8 @@ static const struct amdgpu_asic_funcs si_asic_funcs = | |||
1262 | .get_xclk = &si_get_xclk, | 1327 | .get_xclk = &si_get_xclk, |
1263 | .set_uvd_clocks = &si_set_uvd_clocks, | 1328 | .set_uvd_clocks = &si_set_uvd_clocks, |
1264 | .set_vce_clocks = NULL, | 1329 | .set_vce_clocks = NULL, |
1330 | .get_pcie_lanes = &si_get_pcie_lanes, | ||
1331 | .set_pcie_lanes = &si_set_pcie_lanes, | ||
1265 | .get_config_memsize = &si_get_config_memsize, | 1332 | .get_config_memsize = &si_get_config_memsize, |
1266 | .flush_hdp = &si_flush_hdp, | 1333 | .flush_hdp = &si_flush_hdp, |
1267 | .invalidate_hdp = &si_invalidate_hdp, | 1334 | .invalidate_hdp = &si_invalidate_hdp, |