diff options
Diffstat (limited to 'drivers/gpu/drm/amd')
9 files changed, 39 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index bc62bf41b7e9..5dc349173e4f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
@@ -212,6 +212,7 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags) | |||
212 | } | 212 | } |
213 | 213 | ||
214 | if (amdgpu_device_is_px(dev)) { | 214 | if (amdgpu_device_is_px(dev)) { |
215 | dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NEVER_SKIP); | ||
215 | pm_runtime_use_autosuspend(dev->dev); | 216 | pm_runtime_use_autosuspend(dev->dev); |
216 | pm_runtime_set_autosuspend_delay(dev->dev, 5000); | 217 | pm_runtime_set_autosuspend_delay(dev->dev, 5000); |
217 | pm_runtime_set_active(dev->dev); | 218 | pm_runtime_set_active(dev->dev); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 7c108e687683..698bcb8ce61d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -638,12 +638,14 @@ void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev, | |||
638 | struct ttm_bo_global *glob = adev->mman.bdev.glob; | 638 | struct ttm_bo_global *glob = adev->mman.bdev.glob; |
639 | struct amdgpu_vm_bo_base *bo_base; | 639 | struct amdgpu_vm_bo_base *bo_base; |
640 | 640 | ||
641 | #if 0 | ||
641 | if (vm->bulk_moveable) { | 642 | if (vm->bulk_moveable) { |
642 | spin_lock(&glob->lru_lock); | 643 | spin_lock(&glob->lru_lock); |
643 | ttm_bo_bulk_move_lru_tail(&vm->lru_bulk_move); | 644 | ttm_bo_bulk_move_lru_tail(&vm->lru_bulk_move); |
644 | spin_unlock(&glob->lru_lock); | 645 | spin_unlock(&glob->lru_lock); |
645 | return; | 646 | return; |
646 | } | 647 | } |
648 | #endif | ||
647 | 649 | ||
648 | memset(&vm->lru_bulk_move, 0, sizeof(vm->lru_bulk_move)); | 650 | memset(&vm->lru_bulk_move, 0, sizeof(vm->lru_bulk_move)); |
649 | 651 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index 6811a5d05b27..aa2f71cc1eba 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | |||
@@ -128,7 +128,7 @@ static const struct soc15_reg_golden golden_settings_sdma0_4_2_init[] = { | |||
128 | 128 | ||
129 | static const struct soc15_reg_golden golden_settings_sdma0_4_2[] = | 129 | static const struct soc15_reg_golden golden_settings_sdma0_4_2[] = |
130 | { | 130 | { |
131 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CHICKEN_BITS, 0xfe931f07, 0x02831d07), | 131 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CHICKEN_BITS, 0xfe931f07, 0x02831f07), |
132 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CLK_CTRL, 0xffffffff, 0x3f000100), | 132 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CLK_CTRL, 0xffffffff, 0x3f000100), |
133 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0000773f, 0x00004002), | 133 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0000773f, 0x00004002), |
134 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), | 134 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), |
@@ -158,7 +158,7 @@ static const struct soc15_reg_golden golden_settings_sdma0_4_2[] = | |||
158 | }; | 158 | }; |
159 | 159 | ||
160 | static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = { | 160 | static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = { |
161 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831d07), | 161 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831f07), |
162 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CLK_CTRL, 0xffffffff, 0x3f000100), | 162 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CLK_CTRL, 0xffffffff, 0x3f000100), |
163 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG, 0x0000773f, 0x00004002), | 163 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG, 0x0000773f, 0x00004002), |
164 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), | 164 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 0b392bfca284..5296b8f3e0ab 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |||
@@ -786,12 +786,13 @@ static int dm_suspend(void *handle) | |||
786 | struct amdgpu_display_manager *dm = &adev->dm; | 786 | struct amdgpu_display_manager *dm = &adev->dm; |
787 | int ret = 0; | 787 | int ret = 0; |
788 | 788 | ||
789 | WARN_ON(adev->dm.cached_state); | ||
790 | adev->dm.cached_state = drm_atomic_helper_suspend(adev->ddev); | ||
791 | |||
789 | s3_handle_mst(adev->ddev, true); | 792 | s3_handle_mst(adev->ddev, true); |
790 | 793 | ||
791 | amdgpu_dm_irq_suspend(adev); | 794 | amdgpu_dm_irq_suspend(adev); |
792 | 795 | ||
793 | WARN_ON(adev->dm.cached_state); | ||
794 | adev->dm.cached_state = drm_atomic_helper_suspend(adev->ddev); | ||
795 | 796 | ||
796 | dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D3); | 797 | dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D3); |
797 | 798 | ||
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c index 19801bdba0d2..7a72ee46f14b 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c | |||
@@ -662,6 +662,11 @@ static void dce11_update_clocks(struct clk_mgr *clk_mgr, | |||
662 | { | 662 | { |
663 | struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr); | 663 | struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr); |
664 | struct dm_pp_power_level_change_request level_change_req; | 664 | struct dm_pp_power_level_change_request level_change_req; |
665 | int patched_disp_clk = context->bw.dce.dispclk_khz; | ||
666 | |||
667 | /*TODO: W/A for dal3 linux, investigate why this works */ | ||
668 | if (!clk_mgr_dce->dfs_bypass_active) | ||
669 | patched_disp_clk = patched_disp_clk * 115 / 100; | ||
665 | 670 | ||
666 | level_change_req.power_level = dce_get_required_clocks_state(clk_mgr, context); | 671 | level_change_req.power_level = dce_get_required_clocks_state(clk_mgr, context); |
667 | /* get max clock state from PPLIB */ | 672 | /* get max clock state from PPLIB */ |
@@ -671,9 +676,9 @@ static void dce11_update_clocks(struct clk_mgr *clk_mgr, | |||
671 | clk_mgr_dce->cur_min_clks_state = level_change_req.power_level; | 676 | clk_mgr_dce->cur_min_clks_state = level_change_req.power_level; |
672 | } | 677 | } |
673 | 678 | ||
674 | if (should_set_clock(safe_to_lower, context->bw.dce.dispclk_khz, clk_mgr->clks.dispclk_khz)) { | 679 | if (should_set_clock(safe_to_lower, patched_disp_clk, clk_mgr->clks.dispclk_khz)) { |
675 | context->bw.dce.dispclk_khz = dce_set_clock(clk_mgr, context->bw.dce.dispclk_khz); | 680 | context->bw.dce.dispclk_khz = dce_set_clock(clk_mgr, patched_disp_clk); |
676 | clk_mgr->clks.dispclk_khz = context->bw.dce.dispclk_khz; | 681 | clk_mgr->clks.dispclk_khz = patched_disp_clk; |
677 | } | 682 | } |
678 | dce11_pplib_apply_display_requirements(clk_mgr->ctx->dc, context); | 683 | dce11_pplib_apply_display_requirements(clk_mgr->ctx->dc, context); |
679 | } | 684 | } |
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h index acd418515346..a6b80fdaa666 100644 --- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h +++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h | |||
@@ -37,6 +37,10 @@ void dce100_prepare_bandwidth( | |||
37 | struct dc *dc, | 37 | struct dc *dc, |
38 | struct dc_state *context); | 38 | struct dc_state *context); |
39 | 39 | ||
40 | void dce100_optimize_bandwidth( | ||
41 | struct dc *dc, | ||
42 | struct dc_state *context); | ||
43 | |||
40 | bool dce100_enable_display_power_gating(struct dc *dc, uint8_t controller_id, | 44 | bool dce100_enable_display_power_gating(struct dc *dc, uint8_t controller_id, |
41 | struct dc_bios *dcb, | 45 | struct dc_bios *dcb, |
42 | enum pipe_gating_control power_gating); | 46 | enum pipe_gating_control power_gating); |
diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c index a60a90e68d91..c4543178ba20 100644 --- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c | |||
@@ -77,6 +77,6 @@ void dce80_hw_sequencer_construct(struct dc *dc) | |||
77 | dc->hwss.enable_display_power_gating = dce100_enable_display_power_gating; | 77 | dc->hwss.enable_display_power_gating = dce100_enable_display_power_gating; |
78 | dc->hwss.pipe_control_lock = dce_pipe_control_lock; | 78 | dc->hwss.pipe_control_lock = dce_pipe_control_lock; |
79 | dc->hwss.prepare_bandwidth = dce100_prepare_bandwidth; | 79 | dc->hwss.prepare_bandwidth = dce100_prepare_bandwidth; |
80 | dc->hwss.optimize_bandwidth = dce100_prepare_bandwidth; | 80 | dc->hwss.optimize_bandwidth = dce100_optimize_bandwidth; |
81 | } | 81 | } |
82 | 82 | ||
diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c index cdd1d6b7b9f2..4e9ea50141bd 100644 --- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c | |||
@@ -790,9 +790,22 @@ bool dce80_validate_bandwidth( | |||
790 | struct dc *dc, | 790 | struct dc *dc, |
791 | struct dc_state *context) | 791 | struct dc_state *context) |
792 | { | 792 | { |
793 | /* TODO implement when needed but for now hardcode max value*/ | 793 | int i; |
794 | context->bw.dce.dispclk_khz = 681000; | 794 | bool at_least_one_pipe = false; |
795 | context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER_CZ; | 795 | |
796 | for (i = 0; i < dc->res_pool->pipe_count; i++) { | ||
797 | if (context->res_ctx.pipe_ctx[i].stream) | ||
798 | at_least_one_pipe = true; | ||
799 | } | ||
800 | |||
801 | if (at_least_one_pipe) { | ||
802 | /* TODO implement when needed but for now hardcode max value*/ | ||
803 | context->bw.dce.dispclk_khz = 681000; | ||
804 | context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER_CZ; | ||
805 | } else { | ||
806 | context->bw.dce.dispclk_khz = 0; | ||
807 | context->bw.dce.yclk_khz = 0; | ||
808 | } | ||
796 | 809 | ||
797 | return true; | 810 | return true; |
798 | } | 811 | } |
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c index 58a12ddf12f3..41883c981789 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | |||
@@ -2658,8 +2658,8 @@ static void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) | |||
2658 | .mirror = pipe_ctx->plane_state->horizontal_mirror | 2658 | .mirror = pipe_ctx->plane_state->horizontal_mirror |
2659 | }; | 2659 | }; |
2660 | 2660 | ||
2661 | pos_cpy.x -= pipe_ctx->plane_state->dst_rect.x; | 2661 | pos_cpy.x_hotspot += pipe_ctx->plane_state->dst_rect.x; |
2662 | pos_cpy.y -= pipe_ctx->plane_state->dst_rect.y; | 2662 | pos_cpy.y_hotspot += pipe_ctx->plane_state->dst_rect.y; |
2663 | 2663 | ||
2664 | if (pipe_ctx->plane_state->address.type | 2664 | if (pipe_ctx->plane_state->address.type |
2665 | == PLN_ADDR_TYPE_VIDEO_PROGRESSIVE) | 2665 | == PLN_ADDR_TYPE_VIDEO_PROGRESSIVE) |