Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: support ASPM for some specific ASIC

Support to program ASPM and LTR for Sienna Cichlid and forward ASIC.
Disable ASPM for Sienna Cichlid and forward ASIC by default.

Signed-off-by: Likun Gao <Likun.Gao@amd.com>
Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Likun Gao and committed by
Alex Deucher
e1edaeaf 680602d6

+124 -6
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h
··· 88 88 int (*ras_late_init)(struct amdgpu_device *adev); 89 89 void (*enable_aspm)(struct amdgpu_device *adev, 90 90 bool enable); 91 + void (*program_aspm)(struct amdgpu_device *adev); 91 92 }; 92 93 93 94 struct amdgpu_nbio {
+114
drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c
··· 34 34 #define smnCPM_CONTROL 0x11180460 35 35 #define smnPCIE_CNTL2 0x11180070 36 36 #define smnPCIE_LC_CNTL 0x11140280 37 + #define smnPCIE_LC_CNTL3 0x111402d4 38 + #define smnPCIE_LC_CNTL6 0x111402ec 39 + #define smnPCIE_LC_CNTL7 0x111402f0 40 + #define smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2 0x1014008c 41 + #define smnRCC_EP_DEV0_0_EP_PCIE_TX_LTR_CNTL 0x10123538 42 + #define smnBIF_CFG_DEV0_EPF0_PCIE_LTR_CAP 0x10140324 43 + #define smnPSWUSP0_PCIE_LC_CNTL2 0x111402c4 44 + #define smnNBIF_MGCG_CTRL_LCLK 0x1013a21c 37 45 38 46 #define mmBIF_SDMA2_DOORBELL_RANGE 0x01d6 39 47 #define mmBIF_SDMA2_DOORBELL_RANGE_BASE_IDX 2 ··· 358 350 WREG32_PCIE(smnPCIE_LC_CNTL, data); 359 351 } 360 352 353 + static void nbio_v2_3_program_ltr(struct amdgpu_device *adev) 354 + { 355 + uint32_t def, data; 356 + 357 + WREG32_PCIE(smnRCC_EP_DEV0_0_EP_PCIE_TX_LTR_CNTL, 0x75EB); 358 + 359 + def = data = RREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP2); 360 + data &= ~RCC_BIF_STRAP2__STRAP_LTR_IN_ASPML1_DIS_MASK; 361 + if (def != data) 362 + WREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP2, data); 363 + 364 + def = data = RREG32_PCIE(smnRCC_EP_DEV0_0_EP_PCIE_TX_LTR_CNTL); 365 + data &= ~EP_PCIE_TX_LTR_CNTL__LTR_PRIV_MSG_DIS_IN_PM_NON_D0_MASK; 366 + if (def != data) 367 + WREG32_PCIE(smnRCC_EP_DEV0_0_EP_PCIE_TX_LTR_CNTL, data); 368 + 369 + def = data = RREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2); 370 + data |= BIF_CFG_DEV0_EPF0_DEVICE_CNTL2__LTR_EN_MASK; 371 + if (def != data) 372 + WREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2, data); 373 + } 374 + 375 + static void nbio_v2_3_program_aspm(struct amdgpu_device *adev) 376 + { 377 + uint32_t def, data; 378 + 379 + def = data = RREG32_PCIE(smnPCIE_LC_CNTL); 380 + data &= ~PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK; 381 + data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK; 382 + data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK; 383 + if (def != data) 384 + WREG32_PCIE(smnPCIE_LC_CNTL, data); 385 + 386 + def = data = RREG32_PCIE(smnPCIE_LC_CNTL7); 387 + data |= PCIE_LC_CNTL7__LC_NBIF_ASPM_INPUT_EN_MASK; 388 + if (def != data) 389 + WREG32_PCIE(smnPCIE_LC_CNTL7, data); 390 + 391 + def = data = RREG32_PCIE(smnNBIF_MGCG_CTRL_LCLK); 392 + data |= NBIF_MGCG_CTRL_LCLK__NBIF_MGCG_REG_DIS_LCLK_MASK; 393 + if (def != data) 394 + WREG32_PCIE(smnNBIF_MGCG_CTRL_LCLK, data); 395 + 396 + def = data = RREG32_PCIE(smnPCIE_LC_CNTL3); 397 + data |= PCIE_LC_CNTL3__LC_DSC_DONT_ENTER_L23_AFTER_PME_ACK_MASK; 398 + if (def != data) 399 + WREG32_PCIE(smnPCIE_LC_CNTL3, data); 400 + 401 + def = data = RREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP3); 402 + data &= ~RCC_BIF_STRAP3__STRAP_VLINK_ASPM_IDLE_TIMER_MASK; 403 + data &= ~RCC_BIF_STRAP3__STRAP_VLINK_PM_L1_ENTRY_TIMER_MASK; 404 + if (def != data) 405 + WREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP3, data); 406 + 407 + def = data = RREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP5); 408 + data &= ~RCC_BIF_STRAP5__STRAP_VLINK_LDN_ENTRY_TIMER_MASK; 409 + if (def != data) 410 + WREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP5, data); 411 + 412 + def = data = RREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2); 413 + data &= ~BIF_CFG_DEV0_EPF0_DEVICE_CNTL2__LTR_EN_MASK; 414 + if (def != data) 415 + WREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2, data); 416 + 417 + WREG32_PCIE(smnBIF_CFG_DEV0_EPF0_PCIE_LTR_CAP, 0x10011001); 418 + 419 + def = data = RREG32_PCIE(smnPSWUSP0_PCIE_LC_CNTL2); 420 + data |= PSWUSP0_PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK | 421 + PSWUSP0_PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK; 422 + data &= ~PSWUSP0_PCIE_LC_CNTL2__LC_RCV_L0_TO_RCV_L0S_DIS_MASK; 423 + if (def != data) 424 + WREG32_PCIE(smnPSWUSP0_PCIE_LC_CNTL2, data); 425 + 426 + def = data = RREG32_PCIE(smnPCIE_LC_CNTL6); 427 + data |= PCIE_LC_CNTL6__LC_L1_POWERDOWN_MASK | 428 + PCIE_LC_CNTL6__LC_RX_L0S_STANDBY_EN_MASK; 429 + if (def != data) 430 + WREG32_PCIE(smnPCIE_LC_CNTL6, data); 431 + 432 + nbio_v2_3_program_ltr(adev); 433 + 434 + def = data = RREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP3); 435 + data |= 0x5DE0 << RCC_BIF_STRAP3__STRAP_VLINK_ASPM_IDLE_TIMER__SHIFT; 436 + data |= 0x0010 << RCC_BIF_STRAP3__STRAP_VLINK_PM_L1_ENTRY_TIMER__SHIFT; 437 + if (def != data) 438 + WREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP3, data); 439 + 440 + def = data = RREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP5); 441 + data |= 0x0010 << RCC_BIF_STRAP5__STRAP_VLINK_LDN_ENTRY_TIMER__SHIFT; 442 + if (def != data) 443 + WREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP5, data); 444 + 445 + def = data = RREG32_PCIE(smnPCIE_LC_CNTL); 446 + data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK; 447 + data |= 0x9 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT; 448 + data |= 0x1 << PCIE_LC_CNTL__LC_PMI_TO_L1_DIS__SHIFT; 449 + if (def != data) 450 + WREG32_PCIE(smnPCIE_LC_CNTL, data); 451 + 452 + def = data = RREG32_PCIE(smnPCIE_LC_CNTL3); 453 + data &= ~PCIE_LC_CNTL3__LC_DSC_DONT_ENTER_L23_AFTER_PME_ACK_MASK; 454 + if (def != data) 455 + WREG32_PCIE(smnPCIE_LC_CNTL3, data); 456 + } 457 + 361 458 const struct amdgpu_nbio_funcs nbio_v2_3_funcs = { 362 459 .get_hdp_flush_req_offset = nbio_v2_3_get_hdp_flush_req_offset, 363 460 .get_hdp_flush_done_offset = nbio_v2_3_get_hdp_flush_done_offset, ··· 483 370 .init_registers = nbio_v2_3_init_registers, 484 371 .remap_hdp_registers = nbio_v2_3_remap_hdp_registers, 485 372 .enable_aspm = nbio_v2_3_enable_aspm, 373 + .program_aspm = nbio_v2_3_program_aspm, 486 374 };
+9 -6
drivers/gpu/drm/amd/amdgpu/nv.c
··· 468 468 469 469 static void nv_program_aspm(struct amdgpu_device *adev) 470 470 { 471 - 472 - if (amdgpu_aspm == 0) 471 + if (amdgpu_aspm != 1) 473 472 return; 474 473 475 - /* todo */ 474 + if ((adev->asic_type >= CHIP_SIENNA_CICHLID) && 475 + !(adev->flags & AMD_IS_APU) && 476 + (adev->nbio.funcs->program_aspm)) 477 + adev->nbio.funcs->program_aspm(adev); 478 + 476 479 } 477 480 478 481 static void nv_enable_doorbell_aperture(struct amdgpu_device *adev, ··· 801 798 * The ASPM function is not fully enabled and verified on 802 799 * Navi yet. Temporarily skip this until ASPM enabled. 803 800 */ 804 - #if 0 805 - if (adev->nbio.funcs->enable_aspm) 801 + if ((adev->asic_type >= CHIP_SIENNA_CICHLID) && 802 + !(adev->flags & AMD_IS_APU) && 803 + (adev->nbio.funcs->enable_aspm)) 806 804 adev->nbio.funcs->enable_aspm(adev, !enter); 807 - #endif 808 805 809 806 return 0; 810 807 }