diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/soc15.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/soc15.c | 125 |
1 files changed, 60 insertions, 65 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index 51cf8a30f6c2..68b4a22a8892 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c | |||
| @@ -41,8 +41,6 @@ | |||
| 41 | #include "sdma1/sdma1_4_0_offset.h" | 41 | #include "sdma1/sdma1_4_0_offset.h" |
| 42 | #include "hdp/hdp_4_0_offset.h" | 42 | #include "hdp/hdp_4_0_offset.h" |
| 43 | #include "hdp/hdp_4_0_sh_mask.h" | 43 | #include "hdp/hdp_4_0_sh_mask.h" |
| 44 | #include "mp/mp_9_0_offset.h" | ||
| 45 | #include "mp/mp_9_0_sh_mask.h" | ||
| 46 | #include "smuio/smuio_9_0_offset.h" | 44 | #include "smuio/smuio_9_0_offset.h" |
| 47 | #include "smuio/smuio_9_0_sh_mask.h" | 45 | #include "smuio/smuio_9_0_sh_mask.h" |
| 48 | 46 | ||
| @@ -52,6 +50,8 @@ | |||
| 52 | #include "gmc_v9_0.h" | 50 | #include "gmc_v9_0.h" |
| 53 | #include "gfxhub_v1_0.h" | 51 | #include "gfxhub_v1_0.h" |
| 54 | #include "mmhub_v1_0.h" | 52 | #include "mmhub_v1_0.h" |
| 53 | #include "df_v1_7.h" | ||
| 54 | #include "df_v3_6.h" | ||
| 55 | #include "vega10_ih.h" | 55 | #include "vega10_ih.h" |
| 56 | #include "sdma_v4_0.h" | 56 | #include "sdma_v4_0.h" |
| 57 | #include "uvd_v7_0.h" | 57 | #include "uvd_v7_0.h" |
| @@ -60,33 +60,6 @@ | |||
| 60 | #include "dce_virtual.h" | 60 | #include "dce_virtual.h" |
| 61 | #include "mxgpu_ai.h" | 61 | #include "mxgpu_ai.h" |
| 62 | 62 | ||
| 63 | #define mmFabricConfigAccessControl 0x0410 | ||
| 64 | #define mmFabricConfigAccessControl_BASE_IDX 0 | ||
| 65 | #define mmFabricConfigAccessControl_DEFAULT 0x00000000 | ||
| 66 | //FabricConfigAccessControl | ||
| 67 | #define FabricConfigAccessControl__CfgRegInstAccEn__SHIFT 0x0 | ||
| 68 | #define FabricConfigAccessControl__CfgRegInstAccRegLock__SHIFT 0x1 | ||
| 69 | #define FabricConfigAccessControl__CfgRegInstID__SHIFT 0x10 | ||
| 70 | #define FabricConfigAccessControl__CfgRegInstAccEn_MASK 0x00000001L | ||
| 71 | #define FabricConfigAccessControl__CfgRegInstAccRegLock_MASK 0x00000002L | ||
| 72 | #define FabricConfigAccessControl__CfgRegInstID_MASK 0x00FF0000L | ||
| 73 | |||
| 74 | |||
| 75 | #define mmDF_PIE_AON0_DfGlobalClkGater 0x00fc | ||
| 76 | #define mmDF_PIE_AON0_DfGlobalClkGater_BASE_IDX 0 | ||
| 77 | //DF_PIE_AON0_DfGlobalClkGater | ||
| 78 | #define DF_PIE_AON0_DfGlobalClkGater__MGCGMode__SHIFT 0x0 | ||
| 79 | #define DF_PIE_AON0_DfGlobalClkGater__MGCGMode_MASK 0x0000000FL | ||
| 80 | |||
| 81 | enum { | ||
| 82 | DF_MGCG_DISABLE = 0, | ||
| 83 | DF_MGCG_ENABLE_00_CYCLE_DELAY =1, | ||
| 84 | DF_MGCG_ENABLE_01_CYCLE_DELAY =2, | ||
| 85 | DF_MGCG_ENABLE_15_CYCLE_DELAY =13, | ||
| 86 | DF_MGCG_ENABLE_31_CYCLE_DELAY =14, | ||
| 87 | DF_MGCG_ENABLE_63_CYCLE_DELAY =15 | ||
| 88 | }; | ||
| 89 | |||
| 90 | #define mmMP0_MISC_CGTT_CTRL0 0x01b9 | 63 | #define mmMP0_MISC_CGTT_CTRL0 0x01b9 |
| 91 | #define mmMP0_MISC_CGTT_CTRL0_BASE_IDX 0 | 64 | #define mmMP0_MISC_CGTT_CTRL0_BASE_IDX 0 |
| 92 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL 0x01ba | 65 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL 0x01ba |
| @@ -313,6 +286,7 @@ static struct soc15_allowed_register_entry soc15_allowed_read_registers[] = { | |||
| 313 | { SOC15_REG_ENTRY(GC, 0, mmCP_CPC_STALLED_STAT1)}, | 286 | { SOC15_REG_ENTRY(GC, 0, mmCP_CPC_STALLED_STAT1)}, |
| 314 | { SOC15_REG_ENTRY(GC, 0, mmCP_CPC_STATUS)}, | 287 | { SOC15_REG_ENTRY(GC, 0, mmCP_CPC_STATUS)}, |
| 315 | { SOC15_REG_ENTRY(GC, 0, mmGB_ADDR_CONFIG)}, | 288 | { SOC15_REG_ENTRY(GC, 0, mmGB_ADDR_CONFIG)}, |
| 289 | { SOC15_REG_ENTRY(GC, 0, mmDB_DEBUG2)}, | ||
| 316 | }; | 290 | }; |
| 317 | 291 | ||
| 318 | static uint32_t soc15_read_indexed_register(struct amdgpu_device *adev, u32 se_num, | 292 | static uint32_t soc15_read_indexed_register(struct amdgpu_device *adev, u32 se_num, |
| @@ -341,6 +315,8 @@ static uint32_t soc15_get_register_value(struct amdgpu_device *adev, | |||
| 341 | } else { | 315 | } else { |
| 342 | if (reg_offset == SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG)) | 316 | if (reg_offset == SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG)) |
| 343 | return adev->gfx.config.gb_addr_config; | 317 | return adev->gfx.config.gb_addr_config; |
| 318 | else if (reg_offset == SOC15_REG_OFFSET(GC, 0, mmDB_DEBUG2)) | ||
| 319 | return adev->gfx.config.db_debug2; | ||
| 344 | return RREG32(reg_offset); | 320 | return RREG32(reg_offset); |
| 345 | } | 321 | } |
| 346 | } | 322 | } |
| @@ -512,15 +488,24 @@ int soc15_set_ip_blocks(struct amdgpu_device *adev) | |||
| 512 | case CHIP_RAVEN: | 488 | case CHIP_RAVEN: |
| 513 | vega10_reg_base_init(adev); | 489 | vega10_reg_base_init(adev); |
| 514 | break; | 490 | break; |
| 491 | case CHIP_VEGA20: | ||
| 492 | vega20_reg_base_init(adev); | ||
| 493 | break; | ||
| 515 | default: | 494 | default: |
| 516 | return -EINVAL; | 495 | return -EINVAL; |
| 517 | } | 496 | } |
| 518 | 497 | ||
| 519 | if (adev->flags & AMD_IS_APU) | 498 | if (adev->flags & AMD_IS_APU) |
| 520 | adev->nbio_funcs = &nbio_v7_0_funcs; | 499 | adev->nbio_funcs = &nbio_v7_0_funcs; |
| 500 | else if (adev->asic_type == CHIP_VEGA20) | ||
| 501 | adev->nbio_funcs = &nbio_v7_0_funcs; | ||
| 521 | else | 502 | else |
| 522 | adev->nbio_funcs = &nbio_v6_1_funcs; | 503 | adev->nbio_funcs = &nbio_v6_1_funcs; |
| 523 | 504 | ||
| 505 | if (adev->asic_type == CHIP_VEGA20) | ||
| 506 | adev->df_funcs = &df_v3_6_funcs; | ||
| 507 | else | ||
| 508 | adev->df_funcs = &df_v1_7_funcs; | ||
| 524 | adev->nbio_funcs->detect_hw_virt(adev); | 509 | adev->nbio_funcs->detect_hw_virt(adev); |
| 525 | 510 | ||
| 526 | if (amdgpu_sriov_vf(adev)) | 511 | if (amdgpu_sriov_vf(adev)) |
| @@ -529,12 +514,15 @@ int soc15_set_ip_blocks(struct amdgpu_device *adev) | |||
| 529 | switch (adev->asic_type) { | 514 | switch (adev->asic_type) { |
| 530 | case CHIP_VEGA10: | 515 | case CHIP_VEGA10: |
| 531 | case CHIP_VEGA12: | 516 | case CHIP_VEGA12: |
| 517 | case CHIP_VEGA20: | ||
| 532 | amdgpu_device_ip_block_add(adev, &vega10_common_ip_block); | 518 | amdgpu_device_ip_block_add(adev, &vega10_common_ip_block); |
| 533 | amdgpu_device_ip_block_add(adev, &gmc_v9_0_ip_block); | 519 | amdgpu_device_ip_block_add(adev, &gmc_v9_0_ip_block); |
| 534 | amdgpu_device_ip_block_add(adev, &vega10_ih_ip_block); | 520 | amdgpu_device_ip_block_add(adev, &vega10_ih_ip_block); |
| 535 | amdgpu_device_ip_block_add(adev, &psp_v3_1_ip_block); | 521 | if (adev->asic_type != CHIP_VEGA20) { |
| 536 | if (!amdgpu_sriov_vf(adev)) | 522 | amdgpu_device_ip_block_add(adev, &psp_v3_1_ip_block); |
| 537 | amdgpu_device_ip_block_add(adev, &pp_smu_ip_block); | 523 | if (!amdgpu_sriov_vf(adev)) |
| 524 | amdgpu_device_ip_block_add(adev, &pp_smu_ip_block); | ||
| 525 | } | ||
| 538 | if (adev->enable_virtual_display || amdgpu_sriov_vf(adev)) | 526 | if (adev->enable_virtual_display || amdgpu_sriov_vf(adev)) |
| 539 | amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); | 527 | amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); |
| 540 | #if defined(CONFIG_DRM_AMD_DC) | 528 | #if defined(CONFIG_DRM_AMD_DC) |
| @@ -593,6 +581,12 @@ static void soc15_invalidate_hdp(struct amdgpu_device *adev, | |||
| 593 | HDP, 0, mmHDP_READ_CACHE_INVALIDATE), 1); | 581 | HDP, 0, mmHDP_READ_CACHE_INVALIDATE), 1); |
| 594 | } | 582 | } |
| 595 | 583 | ||
| 584 | static bool soc15_need_full_reset(struct amdgpu_device *adev) | ||
| 585 | { | ||
| 586 | /* change this when we implement soft reset */ | ||
| 587 | return true; | ||
| 588 | } | ||
| 589 | |||
| 596 | static const struct amdgpu_asic_funcs soc15_asic_funcs = | 590 | static const struct amdgpu_asic_funcs soc15_asic_funcs = |
| 597 | { | 591 | { |
| 598 | .read_disabled_bios = &soc15_read_disabled_bios, | 592 | .read_disabled_bios = &soc15_read_disabled_bios, |
| @@ -606,6 +600,7 @@ static const struct amdgpu_asic_funcs soc15_asic_funcs = | |||
| 606 | .get_config_memsize = &soc15_get_config_memsize, | 600 | .get_config_memsize = &soc15_get_config_memsize, |
| 607 | .flush_hdp = &soc15_flush_hdp, | 601 | .flush_hdp = &soc15_flush_hdp, |
| 608 | .invalidate_hdp = &soc15_invalidate_hdp, | 602 | .invalidate_hdp = &soc15_invalidate_hdp, |
| 603 | .need_full_reset = &soc15_need_full_reset, | ||
| 609 | }; | 604 | }; |
| 610 | 605 | ||
| 611 | static int soc15_common_early_init(void *handle) | 606 | static int soc15_common_early_init(void *handle) |
| @@ -675,6 +670,27 @@ static int soc15_common_early_init(void *handle) | |||
| 675 | adev->pg_flags = 0; | 670 | adev->pg_flags = 0; |
| 676 | adev->external_rev_id = adev->rev_id + 0x14; | 671 | adev->external_rev_id = adev->rev_id + 0x14; |
| 677 | break; | 672 | break; |
| 673 | case CHIP_VEGA20: | ||
| 674 | adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG | | ||
| 675 | AMD_CG_SUPPORT_GFX_MGLS | | ||
| 676 | AMD_CG_SUPPORT_GFX_CGCG | | ||
| 677 | AMD_CG_SUPPORT_GFX_CGLS | | ||
| 678 | AMD_CG_SUPPORT_GFX_3D_CGCG | | ||
| 679 | AMD_CG_SUPPORT_GFX_3D_CGLS | | ||
| 680 | AMD_CG_SUPPORT_GFX_CP_LS | | ||
| 681 | AMD_CG_SUPPORT_MC_LS | | ||
| 682 | AMD_CG_SUPPORT_MC_MGCG | | ||
| 683 | AMD_CG_SUPPORT_SDMA_MGCG | | ||
| 684 | AMD_CG_SUPPORT_SDMA_LS | | ||
| 685 | AMD_CG_SUPPORT_BIF_MGCG | | ||
| 686 | AMD_CG_SUPPORT_BIF_LS | | ||
| 687 | AMD_CG_SUPPORT_HDP_MGCG | | ||
| 688 | AMD_CG_SUPPORT_ROM_MGCG | | ||
| 689 | AMD_CG_SUPPORT_VCE_MGCG | | ||
| 690 | AMD_CG_SUPPORT_UVD_MGCG; | ||
| 691 | adev->pg_flags = 0; | ||
| 692 | adev->external_rev_id = adev->rev_id + 0x28; | ||
| 693 | break; | ||
| 678 | case CHIP_RAVEN: | 694 | case CHIP_RAVEN: |
| 679 | adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG | | 695 | adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG | |
| 680 | AMD_CG_SUPPORT_GFX_MGLS | | 696 | AMD_CG_SUPPORT_GFX_MGLS | |
| @@ -694,8 +710,15 @@ static int soc15_common_early_init(void *handle) | |||
| 694 | AMD_CG_SUPPORT_MC_MGCG | | 710 | AMD_CG_SUPPORT_MC_MGCG | |
| 695 | AMD_CG_SUPPORT_MC_LS | | 711 | AMD_CG_SUPPORT_MC_LS | |
| 696 | AMD_CG_SUPPORT_SDMA_MGCG | | 712 | AMD_CG_SUPPORT_SDMA_MGCG | |
| 697 | AMD_CG_SUPPORT_SDMA_LS; | 713 | AMD_CG_SUPPORT_SDMA_LS | |
| 698 | adev->pg_flags = AMD_PG_SUPPORT_SDMA; | 714 | AMD_CG_SUPPORT_VCN_MGCG; |
| 715 | |||
| 716 | adev->pg_flags = AMD_PG_SUPPORT_SDMA | AMD_PG_SUPPORT_VCN; | ||
| 717 | |||
| 718 | if (adev->powerplay.pp_feature & PP_GFXOFF_MASK) | ||
| 719 | adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG | | ||
| 720 | AMD_PG_SUPPORT_CP | | ||
| 721 | AMD_PG_SUPPORT_RLC_SMU_HS; | ||
| 699 | 722 | ||
| 700 | adev->external_rev_id = 0x1; | 723 | adev->external_rev_id = 0x1; |
| 701 | break; | 724 | break; |
| @@ -871,32 +894,6 @@ static void soc15_update_rom_medium_grain_clock_gating(struct amdgpu_device *ade | |||
| 871 | WREG32(SOC15_REG_OFFSET(SMUIO, 0, mmCGTT_ROM_CLK_CTRL0), data); | 894 | WREG32(SOC15_REG_OFFSET(SMUIO, 0, mmCGTT_ROM_CLK_CTRL0), data); |
| 872 | } | 895 | } |
| 873 | 896 | ||
| 874 | static void soc15_update_df_medium_grain_clock_gating(struct amdgpu_device *adev, | ||
| 875 | bool enable) | ||
| 876 | { | ||
| 877 | uint32_t data; | ||
| 878 | |||
| 879 | /* Put DF on broadcast mode */ | ||
| 880 | data = RREG32(SOC15_REG_OFFSET(DF, 0, mmFabricConfigAccessControl)); | ||
| 881 | data &= ~FabricConfigAccessControl__CfgRegInstAccEn_MASK; | ||
| 882 | WREG32(SOC15_REG_OFFSET(DF, 0, mmFabricConfigAccessControl), data); | ||
| 883 | |||
| 884 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_DF_MGCG)) { | ||
| 885 | data = RREG32(SOC15_REG_OFFSET(DF, 0, mmDF_PIE_AON0_DfGlobalClkGater)); | ||
| 886 | data &= ~DF_PIE_AON0_DfGlobalClkGater__MGCGMode_MASK; | ||
| 887 | data |= DF_MGCG_ENABLE_15_CYCLE_DELAY; | ||
| 888 | WREG32(SOC15_REG_OFFSET(DF, 0, mmDF_PIE_AON0_DfGlobalClkGater), data); | ||
| 889 | } else { | ||
| 890 | data = RREG32(SOC15_REG_OFFSET(DF, 0, mmDF_PIE_AON0_DfGlobalClkGater)); | ||
| 891 | data &= ~DF_PIE_AON0_DfGlobalClkGater__MGCGMode_MASK; | ||
| 892 | data |= DF_MGCG_DISABLE; | ||
| 893 | WREG32(SOC15_REG_OFFSET(DF, 0, mmDF_PIE_AON0_DfGlobalClkGater), data); | ||
| 894 | } | ||
| 895 | |||
| 896 | WREG32(SOC15_REG_OFFSET(DF, 0, mmFabricConfigAccessControl), | ||
| 897 | mmFabricConfigAccessControl_DEFAULT); | ||
| 898 | } | ||
| 899 | |||
| 900 | static int soc15_common_set_clockgating_state(void *handle, | 897 | static int soc15_common_set_clockgating_state(void *handle, |
| 901 | enum amd_clockgating_state state) | 898 | enum amd_clockgating_state state) |
| 902 | { | 899 | { |
| @@ -908,6 +905,7 @@ static int soc15_common_set_clockgating_state(void *handle, | |||
| 908 | switch (adev->asic_type) { | 905 | switch (adev->asic_type) { |
| 909 | case CHIP_VEGA10: | 906 | case CHIP_VEGA10: |
| 910 | case CHIP_VEGA12: | 907 | case CHIP_VEGA12: |
| 908 | case CHIP_VEGA20: | ||
| 911 | adev->nbio_funcs->update_medium_grain_clock_gating(adev, | 909 | adev->nbio_funcs->update_medium_grain_clock_gating(adev, |
| 912 | state == AMD_CG_STATE_GATE ? true : false); | 910 | state == AMD_CG_STATE_GATE ? true : false); |
| 913 | adev->nbio_funcs->update_medium_grain_light_sleep(adev, | 911 | adev->nbio_funcs->update_medium_grain_light_sleep(adev, |
| @@ -920,7 +918,7 @@ static int soc15_common_set_clockgating_state(void *handle, | |||
| 920 | state == AMD_CG_STATE_GATE ? true : false); | 918 | state == AMD_CG_STATE_GATE ? true : false); |
| 921 | soc15_update_rom_medium_grain_clock_gating(adev, | 919 | soc15_update_rom_medium_grain_clock_gating(adev, |
| 922 | state == AMD_CG_STATE_GATE ? true : false); | 920 | state == AMD_CG_STATE_GATE ? true : false); |
| 923 | soc15_update_df_medium_grain_clock_gating(adev, | 921 | adev->df_funcs->update_medium_grain_clock_gating(adev, |
| 924 | state == AMD_CG_STATE_GATE ? true : false); | 922 | state == AMD_CG_STATE_GATE ? true : false); |
| 925 | break; | 923 | break; |
| 926 | case CHIP_RAVEN: | 924 | case CHIP_RAVEN: |
| @@ -973,10 +971,7 @@ static void soc15_common_get_clockgating_state(void *handle, u32 *flags) | |||
| 973 | if (!(data & CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK)) | 971 | if (!(data & CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK)) |
| 974 | *flags |= AMD_CG_SUPPORT_ROM_MGCG; | 972 | *flags |= AMD_CG_SUPPORT_ROM_MGCG; |
| 975 | 973 | ||
| 976 | /* AMD_CG_SUPPORT_DF_MGCG */ | 974 | adev->df_funcs->get_clockgating_state(adev, flags); |
| 977 | data = RREG32(SOC15_REG_OFFSET(DF, 0, mmDF_PIE_AON0_DfGlobalClkGater)); | ||
| 978 | if (data & DF_MGCG_ENABLE_15_CYCLE_DELAY) | ||
| 979 | *flags |= AMD_CG_SUPPORT_DF_MGCG; | ||
| 980 | } | 975 | } |
| 981 | 976 | ||
| 982 | static int soc15_common_set_powergating_state(void *handle, | 977 | static int soc15_common_set_powergating_state(void *handle, |
