diff options
author | Huang Rui <ray.huang@amd.com> | 2017-02-28 03:07:48 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-05-24 17:41:14 -0400 |
commit | db3144029c30f5567d67c1aa4a2a60d0e94a4803 (patch) | |
tree | c5f0af82d8a22dfd9f8882d42c9078ec19d52d78 | |
parent | fe1a3b2e416b9e5893c32917ff7bccd50477023e (diff) |
drm/amdgpu: init sdma power gating for raven
Initialize sdma for powergating.
Signed-off-by: Huang Rui <ray.huang@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index 2afcadbb1730..3d24e50aa34c 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include "vega10/MMHUB/mmhub_1_0_offset.h" | 35 | #include "vega10/MMHUB/mmhub_1_0_offset.h" |
36 | #include "vega10/MMHUB/mmhub_1_0_sh_mask.h" | 36 | #include "vega10/MMHUB/mmhub_1_0_sh_mask.h" |
37 | #include "vega10/HDP/hdp_4_0_offset.h" | 37 | #include "vega10/HDP/hdp_4_0_offset.h" |
38 | #include "raven1/SDMA0/sdma0_4_1_default.h" | ||
38 | 39 | ||
39 | #include "soc15_common.h" | 40 | #include "soc15_common.h" |
40 | #include "soc15.h" | 41 | #include "soc15.h" |
@@ -44,6 +45,9 @@ MODULE_FIRMWARE("amdgpu/vega10_sdma.bin"); | |||
44 | MODULE_FIRMWARE("amdgpu/vega10_sdma1.bin"); | 45 | MODULE_FIRMWARE("amdgpu/vega10_sdma1.bin"); |
45 | MODULE_FIRMWARE("amdgpu/raven_sdma.bin"); | 46 | MODULE_FIRMWARE("amdgpu/raven_sdma.bin"); |
46 | 47 | ||
48 | #define SDMA0_POWER_CNTL__ON_OFF_CONDITION_HOLD_TIME_MASK 0x000000F8L | ||
49 | #define SDMA0_POWER_CNTL__ON_OFF_STATUS_DURATION_TIME_MASK 0xFC000000L | ||
50 | |||
47 | static void sdma_v4_0_set_ring_funcs(struct amdgpu_device *adev); | 51 | static void sdma_v4_0_set_ring_funcs(struct amdgpu_device *adev); |
48 | static void sdma_v4_0_set_buffer_funcs(struct amdgpu_device *adev); | 52 | static void sdma_v4_0_set_buffer_funcs(struct amdgpu_device *adev); |
49 | static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev); | 53 | static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev); |
@@ -665,6 +669,47 @@ static int sdma_v4_0_gfx_resume(struct amdgpu_device *adev) | |||
665 | return 0; | 669 | return 0; |
666 | } | 670 | } |
667 | 671 | ||
672 | static void sdma_v4_1_init_power_gating(struct amdgpu_device *adev) | ||
673 | { | ||
674 | uint32_t def, data; | ||
675 | |||
676 | /* Enable HW based PG. */ | ||
677 | def = data = RREG32(SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_POWER_CNTL)); | ||
678 | data |= SDMA0_POWER_CNTL__PG_CNTL_ENABLE_MASK; | ||
679 | if (data != def) | ||
680 | WREG32(SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_POWER_CNTL), data); | ||
681 | |||
682 | /* enable interrupt */ | ||
683 | def = data = RREG32(SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_CNTL)); | ||
684 | data |= SDMA0_CNTL__CTXEMPTY_INT_ENABLE_MASK; | ||
685 | if (data != def) | ||
686 | WREG32(SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_CNTL), data); | ||
687 | |||
688 | /* Configure hold time to filter in-valid power on/off request. Use default right now */ | ||
689 | def = data = RREG32(SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_POWER_CNTL)); | ||
690 | data &= ~SDMA0_POWER_CNTL__ON_OFF_CONDITION_HOLD_TIME_MASK; | ||
691 | data |= (mmSDMA0_POWER_CNTL_DEFAULT & SDMA0_POWER_CNTL__ON_OFF_CONDITION_HOLD_TIME_MASK); | ||
692 | /* Configure switch time for hysteresis purpose. Use default right now */ | ||
693 | data &= ~SDMA0_POWER_CNTL__ON_OFF_STATUS_DURATION_TIME_MASK; | ||
694 | data |= (mmSDMA0_POWER_CNTL_DEFAULT & SDMA0_POWER_CNTL__ON_OFF_STATUS_DURATION_TIME_MASK); | ||
695 | if(data != def) | ||
696 | WREG32(SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_POWER_CNTL), data); | ||
697 | } | ||
698 | |||
699 | static void sdma_v4_0_init_pg(struct amdgpu_device *adev) | ||
700 | { | ||
701 | if (!(adev->pg_flags & AMD_PG_SUPPORT_SDMA)) | ||
702 | return; | ||
703 | |||
704 | switch (adev->asic_type) { | ||
705 | case CHIP_RAVEN: | ||
706 | sdma_v4_1_init_power_gating(adev); | ||
707 | break; | ||
708 | default: | ||
709 | break; | ||
710 | } | ||
711 | } | ||
712 | |||
668 | /** | 713 | /** |
669 | * sdma_v4_0_rlc_resume - setup and start the async dma engines | 714 | * sdma_v4_0_rlc_resume - setup and start the async dma engines |
670 | * | 715 | * |
@@ -675,7 +720,8 @@ static int sdma_v4_0_gfx_resume(struct amdgpu_device *adev) | |||
675 | */ | 720 | */ |
676 | static int sdma_v4_0_rlc_resume(struct amdgpu_device *adev) | 721 | static int sdma_v4_0_rlc_resume(struct amdgpu_device *adev) |
677 | { | 722 | { |
678 | /* XXX todo */ | 723 | sdma_v4_0_init_pg(adev); |
724 | |||
679 | return 0; | 725 | return 0; |
680 | } | 726 | } |
681 | 727 | ||