diff options
Diffstat (limited to 'meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1037-Revert-display-patches-temporarily-for-build-passed.patch')
-rw-r--r-- | meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1037-Revert-display-patches-temporarily-for-build-passed.patch | 19188 |
1 files changed, 0 insertions, 19188 deletions
diff --git a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1037-Revert-display-patches-temporarily-for-build-passed.patch b/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1037-Revert-display-patches-temporarily-for-build-passed.patch deleted file mode 100644 index c67cd736..00000000 --- a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1037-Revert-display-patches-temporarily-for-build-passed.patch +++ /dev/null @@ -1,19188 +0,0 @@ -From 6aa37d7faa5d42c0340e9a5d9af71ff43f0e2f25 Mon Sep 17 00:00:00 2001 -From: "Le.Ma" <Le.Ma@amd.com> -Date: Thu, 28 Sep 2017 15:29:29 +0800 -Subject: [PATCH 1037/4131] Revert display patches temporarily for build passed - -This commit revert several display commits as below: - - from: "3769698 drm/amd/display: fix gamma distortion on Vega" - - to: "fe4ca20 drm/amdkcl: [4.12] Reserve flip_flags for display usage" - -It's because these patches cause dkms build error, and the fix(kcl) patches may -not be finished in a short time. So temporarily revert them to make daily build -passed for other urgent usage. - -Will apply them again after fix(kcl) patches are ready. - -Change-Id: I370efc95cbd6b052c7c390d56a4e9c9f146f1f11 -Signed-off-by: Le.Ma <Le.Ma@amd.com> ---- - drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 1 + - drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 588 ++++---- - drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 2 +- - .../drm/amd/display/amdgpu_dm/amdgpu_dm_services.c | 13 +- - drivers/gpu/drm/amd/display/dc/bios/bios_parser.c | 1 - - drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | 70 +- - .../gpu/drm/amd/display/dc/bios/command_table2.c | 1 + - .../amd/display/dc/bios/command_table_helper2.c | 1 + - drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c | 733 +++++----- - drivers/gpu/drm/amd/display/dc/core/dc.c | 793 ++++++---- - drivers/gpu/drm/amd/display/dc/core/dc_debug.c | 22 +- - .../gpu/drm/amd/display/dc/core/dc_hw_sequencer.c | 3 +- - drivers/gpu/drm/amd/display/dc/core/dc_link.c | 507 +------ - drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 27 +- - drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c | 48 +- - drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 798 ++++------ - drivers/gpu/drm/amd/display/dc/core/dc_sink.c | 12 +- - drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 68 +- - drivers/gpu/drm/amd/display/dc/core/dc_surface.c | 50 +- - drivers/gpu/drm/amd/display/dc/dc.h | 215 ++- - drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 2 +- - .../gpu/drm/amd/display/dc/dce/dce_clock_source.c | 87 +- - .../gpu/drm/amd/display/dc/dce/dce_clock_source.h | 14 +- - drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c | 35 +- - drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c | 32 +- - drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.c | 4 +- - drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h | 54 +- - .../gpu/drm/amd/display/dc/dce/dce_link_encoder.c | 8 +- - drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c | 2 - - drivers/gpu/drm/amd/display/dc/dce/dce_transform.h | 23 - - .../amd/display/dc/dce100/dce100_hw_sequencer.c | 17 +- - .../amd/display/dc/dce100/dce100_hw_sequencer.h | 10 +- - .../drm/amd/display/dc/dce100/dce100_resource.c | 123 +- - .../drm/amd/display/dc/dce100/dce100_resource.h | 9 +- - .../drm/amd/display/dc/dce110/dce110_compressor.c | 26 +- - .../amd/display/dc/dce110/dce110_hw_sequencer.c | 248 ++-- - .../amd/display/dc/dce110/dce110_hw_sequencer.h | 25 +- - .../drm/amd/display/dc/dce110/dce110_resource.c | 185 ++- - .../drm/amd/display/dc/dce110/dce110_resource.h | 4 +- - .../amd/display/dc/dce112/dce112_hw_sequencer.c | 5 +- - .../amd/display/dc/dce112/dce112_hw_sequencer.h | 4 +- - .../drm/amd/display/dc/dce112/dce112_resource.c | 237 +-- - .../drm/amd/display/dc/dce112/dce112_resource.h | 23 +- - .../amd/display/dc/dce120/dce120_hw_sequencer.c | 6 +- - .../amd/display/dc/dce120/dce120_hw_sequencer.h | 4 +- - .../drm/amd/display/dc/dce120/dce120_resource.c | 46 +- - .../drm/amd/display/dc/dce120/dce120_resource.h | 4 +- - .../drm/amd/display/dc/dce80/dce80_hw_sequencer.c | 5 +- - .../drm/amd/display/dc/dce80/dce80_hw_sequencer.h | 4 +- - .../gpu/drm/amd/display/dc/dce80/dce80_resource.c | 152 +- - .../gpu/drm/amd/display/dc/dce80/dce80_resource.h | 8 +- - drivers/gpu/drm/amd/display/dc/dcn10/Makefile | 3 +- - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c | 1521 +++++++++++++++++--- - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h | 787 +++++----- - .../gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c | 864 ----------- - .../gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c | 710 --------- - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.c | 651 --------- - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.h | 32 - - .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 433 ++---- - .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h | 6 +- - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c | 717 ++++++++- - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h | 416 ++++++ - .../gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.c | 118 +- - .../gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.h | 41 +- - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c | 16 +- - .../gpu/drm/amd/display/dc/dcn10/dcn10_resource.c | 189 ++- - .../gpu/drm/amd/display/dc/dcn10/dcn10_resource.h | 4 +- - .../amd/display/dc/dcn10/dcn10_timing_generator.c | 49 - - .../amd/display/dc/dcn10/dcn10_timing_generator.h | 29 - - drivers/gpu/drm/amd/display/dc/dm_helpers.h | 5 + - drivers/gpu/drm/amd/display/dc/dm_pp_smu.h | 131 -- - drivers/gpu/drm/amd/display/dc/dm_services.h | 7 +- - drivers/gpu/drm/amd/display/dc/dm_services_types.h | 2 - - drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c | 6 - - drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.h | 2 - - .../display/dc/i2caux/dce110/aux_engine_dce110.c | 30 +- - drivers/gpu/drm/amd/display/dc/inc/clock_source.h | 4 - - drivers/gpu/drm/amd/display/dc/inc/core_dc.h | 59 + - drivers/gpu/drm/amd/display/dc/inc/core_types.h | 57 +- - drivers/gpu/drm/amd/display/dc/inc/dce_calcs.h | 4 +- - drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h | 16 +- - .../gpu/drm/amd/display/dc/inc/hw/display_clock.h | 2 +- - drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h | 2 +- - drivers/gpu/drm/amd/display/dc/inc/hw/dwb.h | 193 --- - drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h | 18 - - drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h | 17 +- - .../gpu/drm/amd/display/dc/inc/hw/link_encoder.h | 1 - - drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h | 24 - - drivers/gpu/drm/amd/display/dc/inc/hw/transform.h | 20 - - drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h | 61 +- - drivers/gpu/drm/amd/display/dc/inc/resource.h | 44 +- - .../amd/display/dc/irq/dce110/irq_service_dce110.c | 8 +- - .../amd/display/dc/irq/dce80/irq_service_dce80.c | 1 + - .../amd/display/include/grph_object_ctrl_defs.h | 38 - - .../gpu/drm/amd/display/include/logger_interface.h | 14 +- - .../drm/amd/display/modules/freesync/freesync.c | 20 +- - 96 files changed, 5785 insertions(+), 6946 deletions(-) - delete mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c - delete mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c - delete mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.c - delete mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.h - delete mode 100644 drivers/gpu/drm/amd/display/dc/dm_pp_smu.h - create mode 100644 drivers/gpu/drm/amd/display/dc/inc/core_dc.h - delete mode 100644 drivers/gpu/drm/amd/display/dc/inc/hw/dwb.h - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h -index 7aeae3c..5c527f4 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h -@@ -440,6 +440,7 @@ struct amdgpu_crtc { - enum amdgpu_interrupt_state vsync_timer_enabled; - - int otg_inst; -+ uint32_t flip_flags; - /* After Set Mode stream will be non-NULL */ - const struct dc_stream *stream; - struct drm_pending_vblank_event *event; -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 feae180..3d14dda 100644 ---- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -@@ -25,7 +25,6 @@ - - #include "dm_services_types.h" - #include "dc.h" --#include "dc/inc/core_types.h" - - #include "vid.h" - #include "amdgpu.h" -@@ -820,33 +819,13 @@ struct drm_atomic_state * - dm_atomic_state_alloc(struct drm_device *dev) - { - struct dm_atomic_state *state = kzalloc(sizeof(*state), GFP_KERNEL); -- struct dc_state *new_ctx; -- struct amdgpu_device *adev = dev->dev_private; -- struct dc *dc = adev->dm.dc; - -- if (!state) -+ if (!state || drm_atomic_state_init(dev, &state->base) < 0) { -+ kfree(state); - return NULL; -- -- if (drm_atomic_state_init(dev, &state->base) < 0) -- goto fail; -- -- /* copy existing configuration */ -- new_ctx = dm_alloc(sizeof(*new_ctx)); -- -- if (!new_ctx) -- goto fail; -- -- atomic_inc(&new_ctx->ref_count); -- -- dc_resource_state_copy_construct_current(dc, new_ctx); -- -- state->context = new_ctx; -+ } - - return &state->base; -- --fail: -- kfree(state); -- return NULL; - } - - static void -@@ -855,7 +834,7 @@ dm_atomic_state_clear(struct drm_atomic_state *state) - struct dm_atomic_state *dm_state = to_dm_atomic_state(state); - - if (dm_state->context) { -- dc_release_state(dm_state->context); -+ dc_release_validate_context(dm_state->context); - dm_state->context = NULL; - } - -@@ -1789,6 +1768,12 @@ static bool modeset_required(struct drm_crtc_state *crtc_state, - struct dc_stream_state *new_stream, - struct dc_stream_state *old_stream) - { -+ if (dc_is_stream_unchanged(new_stream, old_stream)) { -+ crtc_state->mode_changed = false; -+ DRM_DEBUG_KMS("Mode change not required, setting mode_changed to %d", -+ crtc_state->mode_changed); -+ } -+ - if (!drm_atomic_crtc_needs_modeset(crtc_state)) - return false; - -@@ -4011,7 +3996,7 @@ static void amdgpu_dm_do_flip( - struct amdgpu_framebuffer *afb = to_amdgpu_framebuffer(fb); - struct amdgpu_bo *abo = gem_to_amdgpu_bo(afb->obj); - struct amdgpu_device *adev = crtc->dev->dev_private; -- bool async_flip = (crtc->state->pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC) != 0; -+ bool async_flip = (acrtc->flip_flags & DRM_MODE_PAGE_FLIP_ASYNC) != 0; - struct dc_flip_addrs addr = { {0} }; - /* TODO eliminate or rename surface_update */ - struct dc_surface_update surface_updates[1] = { {0} }; -@@ -4113,7 +4098,9 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, - continue; - } - -- if (!fb || !crtc || pcrtc != crtc || !crtc->state->active) -+ if (!fb || !crtc || pcrtc != crtc || !crtc->state->active || -+ (!crtc->state->planes_changed && -+ !pcrtc->state->color_mgmt_changed)) - continue; - - pflip_needed = !state->allow_modeset; -@@ -4143,7 +4130,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, - * TODO Check if it's correct - */ - *wait_for_vblank = -- pcrtc->state->pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC ? -+ acrtc_attach->flip_flags & DRM_MODE_PAGE_FLIP_ASYNC ? - false : true; - - /* TODO: Needs rework for multiplane flip */ -@@ -4342,7 +4329,7 @@ void amdgpu_dm_atomic_commit_tail( - } - - if (dm_state->context) -- WARN_ON(!dc_commit_state(dm->dc, dm_state->context)); -+ WARN_ON(!dc_commit_context(dm->dc, dm_state->context)); - - - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { -@@ -4535,6 +4522,77 @@ void dm_restore_drm_connector_state(struct drm_device *dev, struct drm_connector - dm_force_atomic_commit(&aconnector->base); - } - -+static uint32_t add_val_sets_plane( -+ struct dc_validation_set *val_sets, -+ uint32_t set_count, -+ const struct dc_stream_state *stream, -+ struct dc_plane_state *plane_state) -+{ -+ uint32_t i = 0, j = 0; -+ -+ while (i < set_count) { -+ if (val_sets[i].stream == stream) { -+ while (val_sets[i].plane_states[j]) -+ j++; -+ break; -+ } -+ ++i; -+ } -+ -+ val_sets[i].plane_states[j] = plane_state; -+ val_sets[i].plane_count++; -+ -+ return val_sets[i].plane_count; -+} -+ -+static uint32_t update_in_val_sets_stream( -+ struct dc_validation_set *val_sets, -+ uint32_t set_count, -+ struct dc_stream_state *old_stream, -+ struct dc_stream_state *new_stream, -+ struct drm_crtc *crtc) -+{ -+ uint32_t i = 0; -+ -+ while (i < set_count) { -+ if (val_sets[i].stream == old_stream) -+ break; -+ ++i; -+ } -+ -+ val_sets[i].stream = new_stream; -+ -+ if (i == set_count) -+ /* nothing found. add new one to the end */ -+ return set_count + 1; -+ -+ return set_count; -+} -+ -+static uint32_t remove_from_val_sets( -+ struct dc_validation_set *val_sets, -+ uint32_t set_count, -+ const struct dc_stream_state *stream) -+{ -+ int i; -+ -+ for (i = 0; i < set_count; i++) -+ if (val_sets[i].stream == stream) -+ break; -+ -+ if (i == set_count) { -+ /* nothing found */ -+ return set_count; -+ } -+ -+ set_count--; -+ -+ for (; i < set_count; i++) -+ val_sets[i] = val_sets[i + 1]; -+ -+ return set_count; -+} -+ - /*` - * Grabs all modesetting locks to serialize against any blocking commits, - * Waits for completion of all non blocking commits. -@@ -4585,331 +4643,167 @@ static int do_aquire_global_lock( - return ret < 0 ? ret : 0; - } - --static int dm_update_crtcs_state( -- struct dc *dc, -- struct drm_atomic_state *state, -- bool enable, -- bool *lock_and_validation_needed) --{ -- struct drm_crtc *crtc; -- struct drm_crtc_state *crtc_state; -- int i; -- struct dm_crtc_state *old_acrtc_state, *new_acrtc_state; -- struct dm_atomic_state *dm_state = to_dm_atomic_state(state); -- int ret = 0; -- -- /*TODO Move this code into dm_crtc_atomic_check once we get rid of dc_validation_set */ -- /* update changed items */ -- for_each_crtc_in_state(state, crtc, crtc_state, i) { -- struct amdgpu_crtc *acrtc = NULL; -- struct amdgpu_connector *aconnector = NULL; -- struct dc_stream_state *new_stream = NULL; -- struct drm_connector_state *conn_state = NULL; -- struct dm_connector_state *dm_conn_state = NULL; -- -- old_acrtc_state = to_dm_crtc_state(crtc->state); -- new_acrtc_state = to_dm_crtc_state(crtc_state); -- acrtc = to_amdgpu_crtc(crtc); -- -- aconnector = amdgpu_dm_find_first_crct_matching_connector(state, crtc, true); -- -- /* TODO This hack should go away */ -- if (aconnector && aconnector->dc_sink) { -- conn_state = drm_atomic_get_connector_state(state, -- &aconnector->base); -- -- if (IS_ERR(conn_state)) { -- ret = PTR_ERR_OR_ZERO(conn_state); -- break; -- } -- -- dm_conn_state = to_dm_connector_state(conn_state); -- -- new_stream = create_stream_for_sink(aconnector, -- &crtc_state->mode, -- dm_conn_state); -- /* -- * we can have no stream on ACTION_SET if a display -- * was disconnected during S3, in this case it not and -- * error, the OS will be updated after detection, and -- * do the right thing on next atomic commit -- */ -- -- if (!new_stream) { -- DRM_DEBUG_KMS("%s: Failed to create new stream for crtc %d\n", -- __func__, acrtc->base.base.id); -- break; -- } -- } -- -- if (dc_is_stream_unchanged(new_stream, -- old_acrtc_state->stream)) { -- crtc_state->mode_changed = false; -- DRM_DEBUG_KMS("Mode change not required, setting mode_changed to %d", -- crtc_state->mode_changed); -- } -- -- -- if (!drm_atomic_crtc_needs_modeset(crtc_state)) -- continue; -- -- DRM_DEBUG_KMS( -- "amdgpu_crtc id:%d crtc_state_flags: enable:%d, active:%d, " -- "planes_changed:%d, mode_changed:%d,active_changed:%d," -- "connectors_changed:%d\n", -- acrtc->crtc_id, -- crtc_state->enable, -- crtc_state->active, -- crtc_state->planes_changed, -- crtc_state->mode_changed, -- crtc_state->active_changed, -- crtc_state->connectors_changed); -- -- /* Remove stream for any changed/disabled CRTC */ -- if (!enable) { -- -- if (!old_acrtc_state->stream) -- continue; -- -- DRM_DEBUG_KMS("Disabling DRM crtc: %d\n", -- crtc->base.id); -- /* i.e. reset mode */ -- if (!dc_remove_stream_from_ctx( -- dc, -- dm_state->context, -- old_acrtc_state->stream)) { -- ret = -EINVAL; -- break; -- } -- -- dc_stream_release(old_acrtc_state->stream); -- new_acrtc_state->stream = NULL; -- -- *lock_and_validation_needed = true; -- -- } else {/* Add stream for any updated/enabled CRTC */ -- -- if (modereset_required(crtc_state)) -- continue; -- -- if (modeset_required(crtc_state, new_stream, -- old_acrtc_state->stream)) { -- -- WARN_ON(new_acrtc_state->stream); -- -- new_acrtc_state->stream = new_stream; -- dc_stream_retain(new_stream); -- -- DRM_DEBUG_KMS("Enabling DRM crtc: %d\n", -- crtc->base.id); -- -- if (!dc_add_stream_to_ctx( -- dc, -- dm_state->context, -- new_acrtc_state->stream)) { -- ret = -EINVAL; -- break; -- } -- -- *lock_and_validation_needed = true; -- } -- } -- -- /* Release extra reference */ -- if (new_stream) -- dc_stream_release(new_stream); -- } -- -- return ret; --} -- --static int dm_update_planes_state( -- struct dc *dc, -- struct drm_atomic_state *state, -- bool enable, -- bool *lock_and_validation_needed) -+int amdgpu_dm_atomic_check(struct drm_device *dev, -+ struct drm_atomic_state *state) - { -- struct drm_crtc *new_plane_crtc, *old_plane_crtc; -- struct drm_crtc_state *new_crtc_state; -+ struct dm_atomic_state *dm_state; -+ struct drm_crtc *crtc; -+ struct drm_crtc_state *crtc_state; - struct drm_plane *plane; -- struct drm_plane_state *old_plane_state, *new_plane_state; -- struct dm_crtc_state *new_acrtc_state, *old_acrtc_state; -- struct dm_atomic_state *dm_state = to_dm_atomic_state(state); -- struct dm_plane_state *new_dm_plane_state, *old_dm_plane_state; -- int i ; -- /* TODO return page_flip_needed() function */ -- bool pflip_needed = !state->allow_modeset; -- int ret = 0; -- -- if (pflip_needed) -- return ret; -- -- /* Add new planes */ -- for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) { -- new_plane_crtc = new_plane_state->crtc; -- old_plane_crtc = old_plane_state->crtc; -- new_dm_plane_state = to_dm_plane_state(new_plane_state); -- old_dm_plane_state = to_dm_plane_state(old_plane_state); -+ struct drm_plane_state *plane_state; -+ int i, j; -+ int ret; -+ struct amdgpu_device *adev = dev->dev_private; -+ struct dc *dc = adev->dm.dc; -+ struct drm_connector *connector; -+ struct drm_connector_state *conn_state; -+ int set_count; -+ struct dc_validation_set set[MAX_STREAMS] = { { 0 } }; -+ struct dm_crtc_state *old_acrtc_state, *new_acrtc_state; - -- /*TODO Implement atomic check for cursor plane */ -- if (plane->type == DRM_PLANE_TYPE_CURSOR) -- continue; -+ /* -+ * This bool will be set for true for any modeset/reset -+ * or plane update which implies non fast surface update. -+ */ -+ bool lock_and_validation_needed = false; - -- /* Remove any changed/removed planes */ -- if (!enable) { -+ ret = drm_atomic_helper_check_modeset(dev, state); - -- if (!old_plane_crtc) -- continue; -+ if (ret) { -+ DRM_ERROR("Atomic state validation failed with error :%d !\n", ret); -+ return ret; -+ } - -- old_acrtc_state = to_dm_crtc_state( -- drm_atomic_get_old_crtc_state( -- state, -- old_plane_crtc)); -+ dm_state = to_dm_atomic_state(state); - -- if (!old_acrtc_state->stream) -- continue; -+ /* copy existing configuration */ -+ set_count = 0; -+ list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { - -- DRM_DEBUG_KMS("Disabling DRM plane: %d on DRM crtc %d\n", -- plane->base.id, old_plane_crtc->base.id); -+ old_acrtc_state = to_dm_crtc_state(crtc->state); - -- if (!dc_remove_plane_from_context( -- dc, -- old_acrtc_state->stream, -- old_dm_plane_state->dc_state, -- dm_state->context)) { -+ if (old_acrtc_state->stream) { -+ dc_stream_retain(old_acrtc_state->stream); -+ set[set_count].stream = old_acrtc_state->stream; -+ ++set_count; -+ } -+ } - -- ret = EINVAL; -- return ret; -+ /*TODO Move this code into dm_crtc_atomic_check once we get rid of dc_validation_set */ -+ /* update changed items */ -+ for_each_crtc_in_state(state, crtc, crtc_state, i) { -+ struct amdgpu_crtc *acrtc = NULL; -+ struct amdgpu_connector *aconnector = NULL; -+ struct dc_stream_state *new_stream = NULL; -+ struct drm_connector_state *conn_state = NULL; -+ struct dm_connector_state *dm_conn_state = NULL; -+ -+ old_acrtc_state = to_dm_crtc_state(crtc->state); -+ new_acrtc_state = to_dm_crtc_state(crtc_state); -+ acrtc = to_amdgpu_crtc(crtc); -+ -+ aconnector = amdgpu_dm_find_first_crct_matching_connector(state, crtc, true); -+ -+ DRM_DEBUG_KMS( -+ "amdgpu_crtc id:%d crtc_state_flags: enable:%d, active:%d, " -+ "planes_changed:%d, mode_changed:%d,active_changed:%d," -+ "connectors_changed:%d\n", -+ acrtc->crtc_id, -+ crtc_state->enable, -+ crtc_state->active, -+ crtc_state->planes_changed, -+ crtc_state->mode_changed, -+ crtc_state->active_changed, -+ crtc_state->connectors_changed); -+ -+ -+ if (modereset_required(crtc_state)) { -+ -+ /* i.e. reset mode */ -+ if (new_acrtc_state->stream) { -+ set_count = remove_from_val_sets( -+ set, -+ set_count, -+ new_acrtc_state->stream); -+ -+ dc_stream_release(new_acrtc_state->stream); -+ new_acrtc_state->stream = NULL; -+ -+ lock_and_validation_needed = true; - } - -+ } else { - -- dc_plane_state_release(old_dm_plane_state->dc_state); -- new_dm_plane_state->dc_state = NULL; -- -- *lock_and_validation_needed = true; -+ if (aconnector) { -+ conn_state = drm_atomic_get_connector_state(state, -+ &aconnector->base); - -- } else { /* Add new planes */ -+ if (IS_ERR(conn_state)) { -+ ret = PTR_ERR_OR_ZERO(conn_state); -+ goto fail; -+ } - -- if (drm_atomic_plane_disabling(plane->state, new_plane_state)) -- continue; -- -- if (!new_plane_crtc) -- continue; -+ dm_conn_state = to_dm_connector_state(conn_state); - -- new_crtc_state = drm_atomic_get_new_crtc_state(state, new_plane_crtc); -- new_acrtc_state = to_dm_crtc_state(new_crtc_state); -+ new_stream = create_stream_for_sink(aconnector, -+ &crtc_state->mode, -+ dm_conn_state); - -- if (!new_acrtc_state->stream) -- continue; -+ /* -+ * we can have no stream on ACTION_SET if a display -+ * was disconnected during S3, in this case it not and -+ * error, the OS will be updated after detection, and -+ * do the right thing on next atomic commit -+ */ - -+ if (!new_stream) { -+ DRM_DEBUG_KMS("%s: Failed to create new stream for crtc %d\n", -+ __func__, acrtc->base.base.id); -+ break; -+ } - -- WARN_ON(new_dm_plane_state->dc_state); - -- new_dm_plane_state->dc_state = dc_create_plane_state(dc); -+ } - -- DRM_DEBUG_KMS("Enabling DRM plane: %d on DRM crtc %d\n", -- plane->base.id, new_plane_crtc->base.id); -+ if (modeset_required(crtc_state, new_stream, -+ old_acrtc_state->stream)) { - -- if (!new_dm_plane_state->dc_state) { -- ret = -EINVAL; -- return ret; -- } -+ if (new_acrtc_state->stream) -+ dc_stream_release(new_acrtc_state->stream); - -- ret = fill_plane_attributes( -- new_plane_crtc->dev->dev_private, -- new_dm_plane_state->dc_state, -- new_plane_state, -- new_crtc_state, -- false); -- if (ret) -- return ret; -+ new_acrtc_state->stream = new_stream; - -+ set_count = update_in_val_sets_stream( -+ set, -+ set_count, -+ old_acrtc_state->stream, -+ new_acrtc_state->stream, -+ crtc); - -- if (!dc_add_plane_to_context( -- dc, -- new_acrtc_state->stream, -- new_dm_plane_state->dc_state, -- dm_state->context)) { -+ lock_and_validation_needed = true; -+ } else { -+ /* -+ * The new stream is unused, so we release it -+ */ -+ if (new_stream) -+ dc_stream_release(new_stream); - -- ret = -EINVAL; -- return ret; - } -- -- *lock_and_validation_needed = true; - } -- } -- -- -- return ret; --} -- --int amdgpu_dm_atomic_check(struct drm_device *dev, -- struct drm_atomic_state *state) --{ -- int i; -- int ret; -- struct amdgpu_device *adev = dev->dev_private; -- struct dc *dc = adev->dm.dc; -- struct dm_atomic_state *dm_state = to_dm_atomic_state(state); -- struct drm_connector *connector; -- struct drm_connector_state *conn_state; -- struct drm_crtc *crtc; -- struct drm_crtc_state *crtc_state; -- -- /* -- * This bool will be set for true for any modeset/reset -- * or plane update which implies non fast surface update. -- */ -- bool lock_and_validation_needed = false; - -- ret = drm_atomic_helper_check_modeset(dev, state); - -- if (ret) { -- DRM_ERROR("Atomic state validation failed with error :%d !\n", ret); -- return ret; -- } -- -- /* -- * Hack: Commit needs planes right now, specifically for gamma -- * TODO rework commit to check CRTC for gamma change -- */ -- for_each_crtc_in_state(state, crtc, crtc_state, i) { -+ /* -+ * Hack: Commit needs planes right now, specifically for gamma -+ * TODO rework commit to check CRTC for gamma change -+ */ - if (crtc_state->color_mgmt_changed) { -+ - ret = drm_atomic_add_affected_planes(state, crtc); - if (ret) - goto fail; - } - } - -- /* Remove exiting planes if they are modified */ -- ret = dm_update_planes_state(dc, state, false, &lock_and_validation_needed); -- if (ret) { -- goto fail; -- } -- -- /* Disable all crtcs which require disable */ -- ret = dm_update_crtcs_state(dc, state, false, &lock_and_validation_needed); -- if (ret) { -- goto fail; -- } -- -- /* Enable all crtcs which require enable */ -- ret = dm_update_crtcs_state(dc, state, true, &lock_and_validation_needed); -- if (ret) { -- goto fail; -- } -- -- /* Add new/modified planes */ -- ret = dm_update_planes_state(dc, state, true, &lock_and_validation_needed); -- if (ret) { -- goto fail; -- } -- -- /* Run this here since we want to validate the streams we created */ -- ret = drm_atomic_helper_check_planes(dev, state); -- if (ret) -- goto fail; -- - /* Check scaling and undersacn changes*/ - /*TODO Removed scaling changes validation due to inability to commit - * new stream into context w\o causing full reset. Need to -@@ -4934,6 +4828,59 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, - lock_and_validation_needed = true; - } - -+ for_each_crtc_in_state(state, crtc, crtc_state, i) { -+ new_acrtc_state = to_dm_crtc_state(crtc_state); -+ -+ for_each_plane_in_state(state, plane, plane_state, j) { -+ struct drm_crtc *plane_crtc = plane_state->crtc; -+ struct drm_framebuffer *fb = plane_state->fb; -+ bool pflip_needed; -+ struct dm_plane_state *dm_plane_state = to_dm_plane_state(plane_state); -+ -+ /*TODO Implement atomic check for cursor plane */ -+ if (plane->type == DRM_PLANE_TYPE_CURSOR) -+ continue; -+ -+ if (!fb || !plane_crtc || crtc != plane_crtc || !crtc_state->active) -+ continue; -+ -+ WARN_ON(!new_acrtc_state->stream); -+ -+ pflip_needed = !state->allow_modeset; -+ if (!pflip_needed) { -+ struct dc_plane_state *dc_plane_state; -+ -+ dc_plane_state = dc_create_plane_state(dc); -+ -+ if (dm_plane_state->dc_state) -+ dc_plane_state_release(dm_plane_state->dc_state); -+ -+ dm_plane_state->dc_state = dc_plane_state; -+ -+ ret = fill_plane_attributes( -+ plane_crtc->dev->dev_private, -+ dc_plane_state, -+ plane_state, -+ crtc_state, -+ false); -+ if (ret) -+ goto fail; -+ -+ add_val_sets_plane(set, -+ set_count, -+ new_acrtc_state->stream, -+ dc_plane_state); -+ -+ lock_and_validation_needed = true; -+ } -+ } -+ } -+ -+ /* Run this here since we want to validate the streams we created */ -+ ret = drm_atomic_helper_check_planes(dev, state); -+ if (ret) -+ goto fail; -+ - /* - * For full updates case when - * removing/adding/updating streams on once CRTC while flipping -@@ -4949,8 +4896,9 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, - ret = do_aquire_global_lock(dev, state); - if (ret) - goto fail; -- -- if (!dc_validate_global_state(dc, dm_state->context)) { -+ WARN_ON(dm_state->context); -+ dm_state->context = dc_get_validate_context(dc, set, set_count); -+ if (!dm_state->context) { - ret = -EINVAL; - goto fail; - } -@@ -4966,7 +4914,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, - else if (ret == -EINTR || ret == -EAGAIN || ret == -ERESTARTSYS) - DRM_DEBUG_KMS("Atomic check stopped due to to signal.\n"); - else -- DRM_ERROR("Atomic check failed with err: %d \n", ret); -+ DRM_ERROR("Atomic check failed with err: %d .\n", ret); - - return ret; - } -diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h -index 606bfbc..54acbb5 100644 ---- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h -+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h -@@ -205,7 +205,7 @@ struct dm_crtc_state { - struct dm_atomic_state { - struct drm_atomic_state base; - -- struct dc_state *context; -+ struct validate_context *context; - }; - - #define to_dm_atomic_state(x) container_of(x, struct dm_atomic_state, base) -diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c -index aefd9eb..3348e90 100644 ---- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c -+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c -@@ -401,6 +401,14 @@ bool dm_pp_notify_wm_clock_changes( - return false; - } - -+bool dm_pp_notify_wm_clock_changes_soc15( -+ const struct dc_context *ctx, -+ struct dm_pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges) -+{ -+ /* TODO: to be implemented */ -+ return false; -+} -+ - bool dm_pp_apply_power_level_change_request( - const struct dc_context *ctx, - struct dm_pp_power_level_change_request *level_change_req) -@@ -425,9 +433,4 @@ bool dm_pp_get_static_clocks( - return false; - } - --void dm_pp_get_funcs_rv( -- struct dc_context *ctx, -- struct pp_smu_funcs_rv *funcs) --{} -- - /**** end of power component interfaces ****/ -diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c -index 2c41144..2c683d4 100644 ---- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c -+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c -@@ -1853,7 +1853,6 @@ static enum bp_result bios_parser_get_encoder_cap_info( - - info->DP_HBR2_EN = record->usHBR2En; - info->DP_HBR3_EN = record->usHBR3En; -- info->HDMI_6GB_EN = record->usHDMI6GEn; - return BP_RESULT_OK; - } - -diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c -index 95fe50f..86fce5a 100644 ---- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c -+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c -@@ -29,6 +29,7 @@ - - #include "ObjectID.h" - #include "atomfirmware.h" -+#include "atomfirmwareid.h" - - #include "dc_bios_types.h" - #include "include/grph_object_ctrl_defs.h" -@@ -992,8 +993,6 @@ static struct device_id device_type_from_device_id(uint16_t device_id) - - struct device_id result_device_id; - -- result_device_id.raw_device_tag = device_id; -- - switch (device_id) { - case ATOM_DISPLAY_LCD1_SUPPORT: - result_device_id.device_type = DEVICE_TYPE_LCD; -@@ -1813,77 +1812,10 @@ static enum bp_result get_integrated_info_v11( - info_v11->extdispconninfo.path[i].hpdlut_index; - info->ext_disp_conn_info.path[i].channel_mapping.raw = - info_v11->extdispconninfo.path[i].channelmapping; -- info->ext_disp_conn_info.path[i].caps = -- le16_to_cpu(info_v11->extdispconninfo.path[i].caps); - } - info->ext_disp_conn_info.checksum = - info_v11->extdispconninfo.checksum; - -- info->dp0_ext_hdmi_slv_addr = info_v11->dp0_retimer_set.HdmiSlvAddr; -- info->dp0_ext_hdmi_reg_num = info_v11->dp0_retimer_set.HdmiRegNum; -- for (i = 0; i < info->dp0_ext_hdmi_reg_num; i++) { -- info->dp0_ext_hdmi_reg_settings[i].i2c_reg_index = -- info_v11->dp0_retimer_set.HdmiRegSetting[i].ucI2cRegIndex; -- info->dp0_ext_hdmi_reg_settings[i].i2c_reg_val = -- info_v11->dp0_retimer_set.HdmiRegSetting[i].ucI2cRegVal; -- } -- info->dp0_ext_hdmi_6g_reg_num = info_v11->dp0_retimer_set.Hdmi6GRegNum; -- for (i = 0; i < info->dp0_ext_hdmi_6g_reg_num; i++) { -- info->dp0_ext_hdmi_6g_reg_settings[i].i2c_reg_index = -- info_v11->dp0_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegIndex; -- info->dp0_ext_hdmi_6g_reg_settings[i].i2c_reg_val = -- info_v11->dp0_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegVal; -- } -- -- info->dp1_ext_hdmi_slv_addr = info_v11->dp1_retimer_set.HdmiSlvAddr; -- info->dp1_ext_hdmi_reg_num = info_v11->dp1_retimer_set.HdmiRegNum; -- for (i = 0; i < info->dp1_ext_hdmi_reg_num; i++) { -- info->dp1_ext_hdmi_reg_settings[i].i2c_reg_index = -- info_v11->dp1_retimer_set.HdmiRegSetting[i].ucI2cRegIndex; -- info->dp1_ext_hdmi_reg_settings[i].i2c_reg_val = -- info_v11->dp1_retimer_set.HdmiRegSetting[i].ucI2cRegVal; -- } -- info->dp1_ext_hdmi_6g_reg_num = info_v11->dp1_retimer_set.Hdmi6GRegNum; -- for (i = 0; i < info->dp1_ext_hdmi_6g_reg_num; i++) { -- info->dp1_ext_hdmi_6g_reg_settings[i].i2c_reg_index = -- info_v11->dp1_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegIndex; -- info->dp1_ext_hdmi_6g_reg_settings[i].i2c_reg_val = -- info_v11->dp1_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegVal; -- } -- -- info->dp2_ext_hdmi_slv_addr = info_v11->dp2_retimer_set.HdmiSlvAddr; -- info->dp2_ext_hdmi_reg_num = info_v11->dp2_retimer_set.HdmiRegNum; -- for (i = 0; i < info->dp2_ext_hdmi_reg_num; i++) { -- info->dp2_ext_hdmi_reg_settings[i].i2c_reg_index = -- info_v11->dp2_retimer_set.HdmiRegSetting[i].ucI2cRegIndex; -- info->dp2_ext_hdmi_reg_settings[i].i2c_reg_val = -- info_v11->dp2_retimer_set.HdmiRegSetting[i].ucI2cRegVal; -- } -- info->dp2_ext_hdmi_6g_reg_num = info_v11->dp2_retimer_set.Hdmi6GRegNum; -- for (i = 0; i < info->dp2_ext_hdmi_6g_reg_num; i++) { -- info->dp2_ext_hdmi_6g_reg_settings[i].i2c_reg_index = -- info_v11->dp2_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegIndex; -- info->dp2_ext_hdmi_6g_reg_settings[i].i2c_reg_val = -- info_v11->dp2_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegVal; -- } -- -- info->dp3_ext_hdmi_slv_addr = info_v11->dp3_retimer_set.HdmiSlvAddr; -- info->dp3_ext_hdmi_reg_num = info_v11->dp3_retimer_set.HdmiRegNum; -- for (i = 0; i < info->dp3_ext_hdmi_reg_num; i++) { -- info->dp3_ext_hdmi_reg_settings[i].i2c_reg_index = -- info_v11->dp3_retimer_set.HdmiRegSetting[i].ucI2cRegIndex; -- info->dp3_ext_hdmi_reg_settings[i].i2c_reg_val = -- info_v11->dp3_retimer_set.HdmiRegSetting[i].ucI2cRegVal; -- } -- info->dp3_ext_hdmi_6g_reg_num = info_v11->dp3_retimer_set.Hdmi6GRegNum; -- for (i = 0; i < info->dp3_ext_hdmi_6g_reg_num; i++) { -- info->dp3_ext_hdmi_6g_reg_settings[i].i2c_reg_index = -- info_v11->dp3_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegIndex; -- info->dp3_ext_hdmi_6g_reg_settings[i].i2c_reg_val = -- info_v11->dp3_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegVal; -- } -- -- - /** TODO - review **/ - #if 0 - info->boot_up_engine_clock = le32_to_cpu(info_v11->ulBootUpEngineClock) -diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table2.c b/drivers/gpu/drm/amd/display/dc/bios/command_table2.c -index 64eab35..e33e6bf 100644 ---- a/drivers/gpu/drm/amd/display/dc/bios/command_table2.c -+++ b/drivers/gpu/drm/amd/display/dc/bios/command_table2.c -@@ -27,6 +27,7 @@ - - #include "ObjectID.h" - #include "atomfirmware.h" -+#include "atomfirmwareid.h" - - #include "include/bios_parser_interface.h" - -diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.c b/drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.c -index 9a4d30d..35c3f3a 100644 ---- a/drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.c -+++ b/drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.c -@@ -27,6 +27,7 @@ - - #include "ObjectID.h" - #include "atomfirmware.h" -+#include "atomfirmwareid.h" - - #include "include/bios_parser_types.h" - -diff --git a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c -index 1b0f647..67da973 100644 ---- a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c -+++ b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c -@@ -27,6 +27,7 @@ - #include "dcn_calcs.h" - #include "dcn_calc_auto.h" - #include "dc.h" -+#include "core_dc.h" - #include "dal_asic_id.h" - - #include "resource.h" -@@ -398,7 +399,7 @@ static void pipe_ctx_to_e2e_pipe_params ( - } - - static void dcn_bw_calc_rq_dlg_ttu( -- const struct dc *dc, -+ const struct core_dc *dc, - const struct dcn_bw_internal_vars *v, - struct pipe_ctx *pipe, - int in_idx) -@@ -456,7 +457,7 @@ static void dcn_bw_calc_rq_dlg_ttu( - } - - /*todo: soc->sr_enter_plus_exit_time??*/ -- dlg_sys_param.t_srx_delay_us = dc->dcn_ip->dcfclk_cstate_latency / v->dcf_clk_deep_sleep; -+ dlg_sys_param.t_srx_delay_us = dc->dcn_ip.dcfclk_cstate_latency / v->dcf_clk_deep_sleep; - - dml_rq_dlg_get_rq_params(dml, &rq_param, input.pipe.src); - extract_rq_regs(dml, rq_regs, rq_param); -@@ -476,7 +477,7 @@ static void dcn_bw_calc_rq_dlg_ttu( - static void dcn_dml_wm_override( - const struct dcn_bw_internal_vars *v, - struct display_mode_lib *dml, -- struct dc_state *context, -+ struct validate_context *context, - const struct resource_pool *pool) - { - int i, in_idx, active_count; -@@ -581,7 +582,6 @@ static void split_stream_across_pipes( - secondary_pipe->plane_res.ipp = pool->ipps[secondary_pipe->pipe_idx]; - secondary_pipe->plane_res.xfm = pool->transforms[secondary_pipe->pipe_idx]; - if (primary_pipe->bottom_pipe) { -- ASSERT(primary_pipe->bottom_pipe != secondary_pipe); - secondary_pipe->bottom_pipe = primary_pipe->bottom_pipe; - secondary_pipe->bottom_pipe->top_pipe = secondary_pipe; - } -@@ -593,7 +593,7 @@ static void split_stream_across_pipes( - } - - static void calc_wm_sets_and_perf_params( -- struct dc_state *context, -+ struct validate_context *context, - struct dcn_bw_internal_vars *v) - { - /* Calculate set A last to keep internal var state consistent for required config */ -@@ -674,45 +674,45 @@ static void calc_wm_sets_and_perf_params( - context->bw.dcn.watermarks.d = context->bw.dcn.watermarks.a; - } - --static bool dcn_bw_apply_registry_override(struct dc *dc) -+static bool dcn_bw_apply_registry_override(struct core_dc *dc) - { - bool updated = false; - - kernel_fpu_begin(); -- if ((int)(dc->dcn_soc->sr_exit_time * 1000) != dc->debug.sr_exit_time_ns -- && dc->debug.sr_exit_time_ns) { -+ if ((int)(dc->dcn_soc.sr_exit_time * 1000) != dc->public.debug.sr_exit_time_ns -+ && dc->public.debug.sr_exit_time_ns) { - updated = true; -- dc->dcn_soc->sr_exit_time = dc->debug.sr_exit_time_ns / 1000.0; -+ dc->dcn_soc.sr_exit_time = dc->public.debug.sr_exit_time_ns / 1000.0; - } - -- if ((int)(dc->dcn_soc->sr_enter_plus_exit_time * 1000) -- != dc->debug.sr_enter_plus_exit_time_ns -- && dc->debug.sr_enter_plus_exit_time_ns) { -+ if ((int)(dc->dcn_soc.sr_enter_plus_exit_time * 1000) -+ != dc->public.debug.sr_enter_plus_exit_time_ns -+ && dc->public.debug.sr_enter_plus_exit_time_ns) { - updated = true; -- dc->dcn_soc->sr_enter_plus_exit_time = -- dc->debug.sr_enter_plus_exit_time_ns / 1000.0; -+ dc->dcn_soc.sr_enter_plus_exit_time = -+ dc->public.debug.sr_enter_plus_exit_time_ns / 1000.0; - } - -- if ((int)(dc->dcn_soc->urgent_latency * 1000) != dc->debug.urgent_latency_ns -- && dc->debug.urgent_latency_ns) { -+ if ((int)(dc->dcn_soc.urgent_latency * 1000) != dc->public.debug.urgent_latency_ns -+ && dc->public.debug.urgent_latency_ns) { - updated = true; -- dc->dcn_soc->urgent_latency = dc->debug.urgent_latency_ns / 1000.0; -+ dc->dcn_soc.urgent_latency = dc->public.debug.urgent_latency_ns / 1000.0; - } - -- if ((int)(dc->dcn_soc->percent_of_ideal_drambw_received_after_urg_latency * 1000) -- != dc->debug.percent_of_ideal_drambw -- && dc->debug.percent_of_ideal_drambw) { -+ if ((int)(dc->dcn_soc.percent_of_ideal_drambw_received_after_urg_latency * 1000) -+ != dc->public.debug.percent_of_ideal_drambw -+ && dc->public.debug.percent_of_ideal_drambw) { - updated = true; -- dc->dcn_soc->percent_of_ideal_drambw_received_after_urg_latency = -- dc->debug.percent_of_ideal_drambw; -+ dc->dcn_soc.percent_of_ideal_drambw_received_after_urg_latency = -+ dc->public.debug.percent_of_ideal_drambw; - } - -- if ((int)(dc->dcn_soc->dram_clock_change_latency * 1000) -- != dc->debug.dram_clock_change_latency_ns -- && dc->debug.dram_clock_change_latency_ns) { -+ if ((int)(dc->dcn_soc.dram_clock_change_latency * 1000) -+ != dc->public.debug.dram_clock_change_latency_ns -+ && dc->public.debug.dram_clock_change_latency_ns) { - updated = true; -- dc->dcn_soc->dram_clock_change_latency = -- dc->debug.dram_clock_change_latency_ns / 1000.0; -+ dc->dcn_soc.dram_clock_change_latency = -+ dc->public.debug.dram_clock_change_latency_ns / 1000.0; - } - kernel_fpu_end(); - -@@ -720,8 +720,8 @@ static bool dcn_bw_apply_registry_override(struct dc *dc) - } - - bool dcn_validate_bandwidth( -- struct dc *dc, -- struct dc_state *context) -+ const struct core_dc *dc, -+ struct validate_context *context) - { - const struct resource_pool *pool = dc->res_pool; - struct dcn_bw_internal_vars *v = &context->dcn_bw_vars; -@@ -730,88 +730,88 @@ bool dcn_validate_bandwidth( - bool bw_limit_pass; - float bw_limit; - -- if (dcn_bw_apply_registry_override(dc)) -- dcn_bw_sync_calcs_and_dml(dc); -+ if (dcn_bw_apply_registry_override(DC_TO_CORE(&dc->public))) -+ dcn_bw_sync_calcs_and_dml(DC_TO_CORE(&dc->public)); - - memset(v, 0, sizeof(*v)); - kernel_fpu_begin(); -- v->sr_exit_time = dc->dcn_soc->sr_exit_time; -- v->sr_enter_plus_exit_time = dc->dcn_soc->sr_enter_plus_exit_time; -- v->urgent_latency = dc->dcn_soc->urgent_latency; -- v->write_back_latency = dc->dcn_soc->write_back_latency; -+ v->sr_exit_time = dc->dcn_soc.sr_exit_time; -+ v->sr_enter_plus_exit_time = dc->dcn_soc.sr_enter_plus_exit_time; -+ v->urgent_latency = dc->dcn_soc.urgent_latency; -+ v->write_back_latency = dc->dcn_soc.write_back_latency; - v->percent_of_ideal_drambw_received_after_urg_latency = -- dc->dcn_soc->percent_of_ideal_drambw_received_after_urg_latency; -- -- v->dcfclkv_min0p65 = dc->dcn_soc->dcfclkv_min0p65; -- v->dcfclkv_mid0p72 = dc->dcn_soc->dcfclkv_mid0p72; -- v->dcfclkv_nom0p8 = dc->dcn_soc->dcfclkv_nom0p8; -- v->dcfclkv_max0p9 = dc->dcn_soc->dcfclkv_max0p9; -- -- v->max_dispclk_vmin0p65 = dc->dcn_soc->max_dispclk_vmin0p65; -- v->max_dispclk_vmid0p72 = dc->dcn_soc->max_dispclk_vmid0p72; -- v->max_dispclk_vnom0p8 = dc->dcn_soc->max_dispclk_vnom0p8; -- v->max_dispclk_vmax0p9 = dc->dcn_soc->max_dispclk_vmax0p9; -- -- v->max_dppclk_vmin0p65 = dc->dcn_soc->max_dppclk_vmin0p65; -- v->max_dppclk_vmid0p72 = dc->dcn_soc->max_dppclk_vmid0p72; -- v->max_dppclk_vnom0p8 = dc->dcn_soc->max_dppclk_vnom0p8; -- v->max_dppclk_vmax0p9 = dc->dcn_soc->max_dppclk_vmax0p9; -- -- v->socclk = dc->dcn_soc->socclk; -- -- v->fabric_and_dram_bandwidth_vmin0p65 = dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65; -- v->fabric_and_dram_bandwidth_vmid0p72 = dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72; -- v->fabric_and_dram_bandwidth_vnom0p8 = dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8; -- v->fabric_and_dram_bandwidth_vmax0p9 = dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9; -- -- v->phyclkv_min0p65 = dc->dcn_soc->phyclkv_min0p65; -- v->phyclkv_mid0p72 = dc->dcn_soc->phyclkv_mid0p72; -- v->phyclkv_nom0p8 = dc->dcn_soc->phyclkv_nom0p8; -- v->phyclkv_max0p9 = dc->dcn_soc->phyclkv_max0p9; -- -- v->downspreading = dc->dcn_soc->downspreading; -- v->round_trip_ping_latency_cycles = dc->dcn_soc->round_trip_ping_latency_cycles; -- v->urgent_out_of_order_return_per_channel = dc->dcn_soc->urgent_out_of_order_return_per_channel; -- v->number_of_channels = dc->dcn_soc->number_of_channels; -- v->vmm_page_size = dc->dcn_soc->vmm_page_size; -- v->dram_clock_change_latency = dc->dcn_soc->dram_clock_change_latency; -- v->return_bus_width = dc->dcn_soc->return_bus_width; -- -- v->rob_buffer_size_in_kbyte = dc->dcn_ip->rob_buffer_size_in_kbyte; -- v->det_buffer_size_in_kbyte = dc->dcn_ip->det_buffer_size_in_kbyte; -- v->dpp_output_buffer_pixels = dc->dcn_ip->dpp_output_buffer_pixels; -- v->opp_output_buffer_lines = dc->dcn_ip->opp_output_buffer_lines; -- v->pixel_chunk_size_in_kbyte = dc->dcn_ip->pixel_chunk_size_in_kbyte; -- v->pte_enable = dc->dcn_ip->pte_enable; -- v->pte_chunk_size = dc->dcn_ip->pte_chunk_size; -- v->meta_chunk_size = dc->dcn_ip->meta_chunk_size; -- v->writeback_chunk_size = dc->dcn_ip->writeback_chunk_size; -- v->odm_capability = dc->dcn_ip->odm_capability; -- v->dsc_capability = dc->dcn_ip->dsc_capability; -- v->line_buffer_size = dc->dcn_ip->line_buffer_size; -- v->is_line_buffer_bpp_fixed = dc->dcn_ip->is_line_buffer_bpp_fixed; -- v->line_buffer_fixed_bpp = dc->dcn_ip->line_buffer_fixed_bpp; -- v->max_line_buffer_lines = dc->dcn_ip->max_line_buffer_lines; -- v->writeback_luma_buffer_size = dc->dcn_ip->writeback_luma_buffer_size; -- v->writeback_chroma_buffer_size = dc->dcn_ip->writeback_chroma_buffer_size; -- v->max_num_dpp = dc->dcn_ip->max_num_dpp; -- v->max_num_writeback = dc->dcn_ip->max_num_writeback; -- v->max_dchub_topscl_throughput = dc->dcn_ip->max_dchub_topscl_throughput; -- v->max_pscl_tolb_throughput = dc->dcn_ip->max_pscl_tolb_throughput; -- v->max_lb_tovscl_throughput = dc->dcn_ip->max_lb_tovscl_throughput; -- v->max_vscl_tohscl_throughput = dc->dcn_ip->max_vscl_tohscl_throughput; -- v->max_hscl_ratio = dc->dcn_ip->max_hscl_ratio; -- v->max_vscl_ratio = dc->dcn_ip->max_vscl_ratio; -- v->max_hscl_taps = dc->dcn_ip->max_hscl_taps; -- v->max_vscl_taps = dc->dcn_ip->max_vscl_taps; -- v->under_scan_factor = dc->dcn_ip->under_scan_factor; -- v->pte_buffer_size_in_requests = dc->dcn_ip->pte_buffer_size_in_requests; -- v->dispclk_ramping_margin = dc->dcn_ip->dispclk_ramping_margin; -- v->max_inter_dcn_tile_repeaters = dc->dcn_ip->max_inter_dcn_tile_repeaters; -+ dc->dcn_soc.percent_of_ideal_drambw_received_after_urg_latency; -+ -+ v->dcfclkv_min0p65 = dc->dcn_soc.dcfclkv_min0p65; -+ v->dcfclkv_mid0p72 = dc->dcn_soc.dcfclkv_mid0p72; -+ v->dcfclkv_nom0p8 = dc->dcn_soc.dcfclkv_nom0p8; -+ v->dcfclkv_max0p9 = dc->dcn_soc.dcfclkv_max0p9; -+ -+ v->max_dispclk_vmin0p65 = dc->dcn_soc.max_dispclk_vmin0p65; -+ v->max_dispclk_vmid0p72 = dc->dcn_soc.max_dispclk_vmid0p72; -+ v->max_dispclk_vnom0p8 = dc->dcn_soc.max_dispclk_vnom0p8; -+ v->max_dispclk_vmax0p9 = dc->dcn_soc.max_dispclk_vmax0p9; -+ -+ v->max_dppclk_vmin0p65 = dc->dcn_soc.max_dppclk_vmin0p65; -+ v->max_dppclk_vmid0p72 = dc->dcn_soc.max_dppclk_vmid0p72; -+ v->max_dppclk_vnom0p8 = dc->dcn_soc.max_dppclk_vnom0p8; -+ v->max_dppclk_vmax0p9 = dc->dcn_soc.max_dppclk_vmax0p9; -+ -+ v->socclk = dc->dcn_soc.socclk; -+ -+ v->fabric_and_dram_bandwidth_vmin0p65 = dc->dcn_soc.fabric_and_dram_bandwidth_vmin0p65; -+ v->fabric_and_dram_bandwidth_vmid0p72 = dc->dcn_soc.fabric_and_dram_bandwidth_vmid0p72; -+ v->fabric_and_dram_bandwidth_vnom0p8 = dc->dcn_soc.fabric_and_dram_bandwidth_vnom0p8; -+ v->fabric_and_dram_bandwidth_vmax0p9 = dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9; -+ -+ v->phyclkv_min0p65 = dc->dcn_soc.phyclkv_min0p65; -+ v->phyclkv_mid0p72 = dc->dcn_soc.phyclkv_mid0p72; -+ v->phyclkv_nom0p8 = dc->dcn_soc.phyclkv_nom0p8; -+ v->phyclkv_max0p9 = dc->dcn_soc.phyclkv_max0p9; -+ -+ v->downspreading = dc->dcn_soc.downspreading; -+ v->round_trip_ping_latency_cycles = dc->dcn_soc.round_trip_ping_latency_cycles; -+ v->urgent_out_of_order_return_per_channel = dc->dcn_soc.urgent_out_of_order_return_per_channel; -+ v->number_of_channels = dc->dcn_soc.number_of_channels; -+ v->vmm_page_size = dc->dcn_soc.vmm_page_size; -+ v->dram_clock_change_latency = dc->dcn_soc.dram_clock_change_latency; -+ v->return_bus_width = dc->dcn_soc.return_bus_width; -+ -+ v->rob_buffer_size_in_kbyte = dc->dcn_ip.rob_buffer_size_in_kbyte; -+ v->det_buffer_size_in_kbyte = dc->dcn_ip.det_buffer_size_in_kbyte; -+ v->dpp_output_buffer_pixels = dc->dcn_ip.dpp_output_buffer_pixels; -+ v->opp_output_buffer_lines = dc->dcn_ip.opp_output_buffer_lines; -+ v->pixel_chunk_size_in_kbyte = dc->dcn_ip.pixel_chunk_size_in_kbyte; -+ v->pte_enable = dc->dcn_ip.pte_enable; -+ v->pte_chunk_size = dc->dcn_ip.pte_chunk_size; -+ v->meta_chunk_size = dc->dcn_ip.meta_chunk_size; -+ v->writeback_chunk_size = dc->dcn_ip.writeback_chunk_size; -+ v->odm_capability = dc->dcn_ip.odm_capability; -+ v->dsc_capability = dc->dcn_ip.dsc_capability; -+ v->line_buffer_size = dc->dcn_ip.line_buffer_size; -+ v->is_line_buffer_bpp_fixed = dc->dcn_ip.is_line_buffer_bpp_fixed; -+ v->line_buffer_fixed_bpp = dc->dcn_ip.line_buffer_fixed_bpp; -+ v->max_line_buffer_lines = dc->dcn_ip.max_line_buffer_lines; -+ v->writeback_luma_buffer_size = dc->dcn_ip.writeback_luma_buffer_size; -+ v->writeback_chroma_buffer_size = dc->dcn_ip.writeback_chroma_buffer_size; -+ v->max_num_dpp = dc->dcn_ip.max_num_dpp; -+ v->max_num_writeback = dc->dcn_ip.max_num_writeback; -+ v->max_dchub_topscl_throughput = dc->dcn_ip.max_dchub_topscl_throughput; -+ v->max_pscl_tolb_throughput = dc->dcn_ip.max_pscl_tolb_throughput; -+ v->max_lb_tovscl_throughput = dc->dcn_ip.max_lb_tovscl_throughput; -+ v->max_vscl_tohscl_throughput = dc->dcn_ip.max_vscl_tohscl_throughput; -+ v->max_hscl_ratio = dc->dcn_ip.max_hscl_ratio; -+ v->max_vscl_ratio = dc->dcn_ip.max_vscl_ratio; -+ v->max_hscl_taps = dc->dcn_ip.max_hscl_taps; -+ v->max_vscl_taps = dc->dcn_ip.max_vscl_taps; -+ v->under_scan_factor = dc->dcn_ip.under_scan_factor; -+ v->pte_buffer_size_in_requests = dc->dcn_ip.pte_buffer_size_in_requests; -+ v->dispclk_ramping_margin = dc->dcn_ip.dispclk_ramping_margin; -+ v->max_inter_dcn_tile_repeaters = dc->dcn_ip.max_inter_dcn_tile_repeaters; - v->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one = -- dc->dcn_ip->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one; -+ dc->dcn_ip.can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one; - v->bug_forcing_luma_and_chroma_request_to_same_size_fixed = -- dc->dcn_ip->bug_forcing_luma_and_chroma_request_to_same_size_fixed; -+ dc->dcn_ip.bug_forcing_luma_and_chroma_request_to_same_size_fixed; - - v->voltage[5] = dcn_bw_no_support; - v->voltage[4] = dcn_bw_v_max0p9; -@@ -850,7 +850,7 @@ bool dcn_validate_bandwidth( - v->phyclk_per_state[1] = v->phyclkv_mid0p72; - v->phyclk_per_state[0] = v->phyclkv_min0p65; - -- if (dc->debug.disable_pipe_split) { -+ if (dc->public.debug.disable_pipe_split) { - v->max_dispclk[0] = v->max_dppclk_vmin0p65; - } - -@@ -982,16 +982,17 @@ bool dcn_validate_bandwidth( - mode_support_and_system_configuration(v); - - if (v->voltage_level == 0 && -- (dc->debug.sr_exit_time_dpm0_ns -- || dc->debug.sr_enter_plus_exit_time_dpm0_ns)) { -+ (dc->public.debug.sr_exit_time_dpm0_ns -+ || dc->public.debug.sr_enter_plus_exit_time_dpm0_ns)) { -+ struct core_dc *dc_core = DC_TO_CORE(&dc->public); - -- if (dc->debug.sr_enter_plus_exit_time_dpm0_ns) -+ if (dc->public.debug.sr_enter_plus_exit_time_dpm0_ns) - v->sr_enter_plus_exit_time = -- dc->debug.sr_enter_plus_exit_time_dpm0_ns / 1000.0f; -- if (dc->debug.sr_exit_time_dpm0_ns) -- v->sr_exit_time = dc->debug.sr_exit_time_dpm0_ns / 1000.0f; -- dc->dml.soc.sr_enter_plus_exit_time_us = v->sr_enter_plus_exit_time; -- dc->dml.soc.sr_exit_time_us = v->sr_exit_time; -+ dc->public.debug.sr_enter_plus_exit_time_dpm0_ns / 1000.0f; -+ if (dc->public.debug.sr_exit_time_dpm0_ns) -+ v->sr_exit_time = dc->public.debug.sr_exit_time_dpm0_ns / 1000.0f; -+ dc_core->dml.soc.sr_enter_plus_exit_time_us = v->sr_enter_plus_exit_time; -+ dc_core->dml.soc.sr_exit_time_us = v->sr_exit_time; - mode_support_and_system_configuration(v); - } - -@@ -1019,8 +1020,8 @@ bool dcn_validate_bandwidth( - context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz = (int)(v->dcf_clk_deep_sleep * 1000); - context->bw.dcn.calc_clk.dcfclk_khz = (int)(v->dcfclk * 1000); - context->bw.dcn.calc_clk.dispclk_khz = (int)(v->dispclk * 1000); -- if (dc->debug.max_disp_clk == true) -- context->bw.dcn.calc_clk.dispclk_khz = (int)(dc->dcn_soc->max_dispclk_vmax0p9 * 1000); -+ if (dc->public.debug.max_disp_clk == true) -+ context->bw.dcn.calc_clk.dispclk_khz = (int)(dc->dcn_soc.max_dispclk_vmax0p9 * 1000); - context->bw.dcn.calc_clk.dppclk_div = (int)(v->dispclk_dppclk_ratio) == 2; - - for (i = 0, input_idx = 0; i < pool->pipe_count; i++) { -@@ -1108,23 +1109,24 @@ bool dcn_validate_bandwidth( - - input_idx++; - } -- if (dc->debug.use_dml_wm) -+ if (dc->public.debug.use_dml_wm) - dcn_dml_wm_override(v, (struct display_mode_lib *) - &dc->dml, context, pool); - } - - if (v->voltage_level == 0) { -+ struct core_dc *dc_core = DC_TO_CORE(&dc->public); - -- dc->dml.soc.sr_enter_plus_exit_time_us = -- dc->dcn_soc->sr_enter_plus_exit_time; -- dc->dml.soc.sr_exit_time_us = dc->dcn_soc->sr_exit_time; -+ dc_core->dml.soc.sr_enter_plus_exit_time_us = -+ dc_core->dcn_soc.sr_enter_plus_exit_time; -+ dc_core->dml.soc.sr_exit_time_us = dc_core->dcn_soc.sr_exit_time; - } - - /* - * BW limit is set to prevent display from impacting other system functions - */ - -- bw_limit = dc->dcn_soc->percent_disp_bw_limit * v->fabric_and_dram_bandwidth_vmax0p9; -+ bw_limit = dc->dcn_soc.percent_disp_bw_limit * v->fabric_and_dram_bandwidth_vmax0p9; - bw_limit_pass = (v->total_data_read_bandwidth / 1000.0) < bw_limit; - - kernel_fpu_end(); -@@ -1136,7 +1138,7 @@ bool dcn_validate_bandwidth( - } - - unsigned int dcn_find_normalized_clock_vdd_Level( -- const struct dc *dc, -+ const struct core_dc *dc, - enum dm_pp_clock_type clocks_type, - int clocks_in_khz) - { -@@ -1147,41 +1149,41 @@ unsigned int dcn_find_normalized_clock_vdd_Level( - - switch (clocks_type) { - case DM_PP_CLOCK_TYPE_DISPLAY_CLK: -- if (clocks_in_khz > dc->dcn_soc->max_dispclk_vmax0p9*1000) { -+ if (clocks_in_khz > dc->dcn_soc.max_dispclk_vmax0p9*1000) { - vdd_level = dcn_bw_v_max0p91; - BREAK_TO_DEBUGGER(); -- } else if (clocks_in_khz > dc->dcn_soc->max_dispclk_vnom0p8*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.max_dispclk_vnom0p8*1000) { - vdd_level = dcn_bw_v_max0p9; -- } else if (clocks_in_khz > dc->dcn_soc->max_dispclk_vmid0p72*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.max_dispclk_vmid0p72*1000) { - vdd_level = dcn_bw_v_nom0p8; -- } else if (clocks_in_khz > dc->dcn_soc->max_dispclk_vmin0p65*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.max_dispclk_vmin0p65*1000) { - vdd_level = dcn_bw_v_mid0p72; - } else - vdd_level = dcn_bw_v_min0p65; - break; - case DM_PP_CLOCK_TYPE_DISPLAYPHYCLK: -- if (clocks_in_khz > dc->dcn_soc->phyclkv_max0p9*1000) { -+ if (clocks_in_khz > dc->dcn_soc.phyclkv_max0p9*1000) { - vdd_level = dcn_bw_v_max0p91; - BREAK_TO_DEBUGGER(); -- } else if (clocks_in_khz > dc->dcn_soc->phyclkv_nom0p8*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.phyclkv_nom0p8*1000) { - vdd_level = dcn_bw_v_max0p9; -- } else if (clocks_in_khz > dc->dcn_soc->phyclkv_mid0p72*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.phyclkv_mid0p72*1000) { - vdd_level = dcn_bw_v_nom0p8; -- } else if (clocks_in_khz > dc->dcn_soc->phyclkv_min0p65*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.phyclkv_min0p65*1000) { - vdd_level = dcn_bw_v_mid0p72; - } else - vdd_level = dcn_bw_v_min0p65; - break; - - case DM_PP_CLOCK_TYPE_DPPCLK: -- if (clocks_in_khz > dc->dcn_soc->max_dppclk_vmax0p9*1000) { -+ if (clocks_in_khz > dc->dcn_soc.max_dppclk_vmax0p9*1000) { - vdd_level = dcn_bw_v_max0p91; - BREAK_TO_DEBUGGER(); -- } else if (clocks_in_khz > dc->dcn_soc->max_dppclk_vnom0p8*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.max_dppclk_vnom0p8*1000) { - vdd_level = dcn_bw_v_max0p9; -- } else if (clocks_in_khz > dc->dcn_soc->max_dppclk_vmid0p72*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.max_dppclk_vmid0p72*1000) { - vdd_level = dcn_bw_v_nom0p8; -- } else if (clocks_in_khz > dc->dcn_soc->max_dppclk_vmin0p65*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.max_dppclk_vmin0p65*1000) { - vdd_level = dcn_bw_v_mid0p72; - } else - vdd_level = dcn_bw_v_min0p65; -@@ -1189,16 +1191,15 @@ unsigned int dcn_find_normalized_clock_vdd_Level( - - case DM_PP_CLOCK_TYPE_MEMORY_CLK: - { -- unsigned factor = (ddr4_dram_factor_single_Channel * dc->dcn_soc->number_of_channels); -- -- if (clocks_in_khz > dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9*1000000/factor) { -+ unsigned factor = (ddr4_dram_factor_single_Channel * dc->dcn_soc.number_of_channels); -+ if (clocks_in_khz > dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9*1000000/factor) { - vdd_level = dcn_bw_v_max0p91; - BREAK_TO_DEBUGGER(); -- } else if (clocks_in_khz > dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8*1000000/factor) { -+ } else if (clocks_in_khz > dc->dcn_soc.fabric_and_dram_bandwidth_vnom0p8*1000000/factor) { - vdd_level = dcn_bw_v_max0p9; -- } else if (clocks_in_khz > dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72*1000000/factor) { -+ } else if (clocks_in_khz > dc->dcn_soc.fabric_and_dram_bandwidth_vmid0p72*1000000/factor) { - vdd_level = dcn_bw_v_nom0p8; -- } else if (clocks_in_khz > dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65*1000000/factor) { -+ } else if (clocks_in_khz > dc->dcn_soc.fabric_and_dram_bandwidth_vmin0p65*1000000/factor) { - vdd_level = dcn_bw_v_mid0p72; - } else - vdd_level = dcn_bw_v_min0p65; -@@ -1206,14 +1207,14 @@ unsigned int dcn_find_normalized_clock_vdd_Level( - break; - - case DM_PP_CLOCK_TYPE_DCFCLK: -- if (clocks_in_khz > dc->dcn_soc->dcfclkv_max0p9*1000) { -+ if (clocks_in_khz > dc->dcn_soc.dcfclkv_max0p9*1000) { - vdd_level = dcn_bw_v_max0p91; - BREAK_TO_DEBUGGER(); -- } else if (clocks_in_khz > dc->dcn_soc->dcfclkv_nom0p8*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.dcfclkv_nom0p8*1000) { - vdd_level = dcn_bw_v_max0p9; -- } else if (clocks_in_khz > dc->dcn_soc->dcfclkv_mid0p72*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.dcfclkv_mid0p72*1000) { - vdd_level = dcn_bw_v_nom0p8; -- } else if (clocks_in_khz > dc->dcn_soc->dcfclkv_min0p65*1000) { -+ } else if (clocks_in_khz > dc->dcn_soc.dcfclkv_min0p65*1000) { - vdd_level = dcn_bw_v_mid0p72; - } else - vdd_level = dcn_bw_v_min0p65; -@@ -1226,7 +1227,7 @@ unsigned int dcn_find_normalized_clock_vdd_Level( - } - - unsigned int dcn_find_dcfclk_suits_all( -- const struct dc *dc, -+ const struct core_dc *dc, - struct clocks_value *clocks) - { - unsigned vdd_level, vdd_level_temp; -@@ -1253,22 +1254,22 @@ unsigned int dcn_find_dcfclk_suits_all( - vdd_level = dcn_bw_max(vdd_level, vdd_level_temp); - if (vdd_level == dcn_bw_v_max0p91) { - BREAK_TO_DEBUGGER(); -- dcf_clk = dc->dcn_soc->dcfclkv_max0p9*1000; -+ dcf_clk = dc->dcn_soc.dcfclkv_max0p9*1000; - } else if (vdd_level == dcn_bw_v_max0p9) -- dcf_clk = dc->dcn_soc->dcfclkv_max0p9*1000; -+ dcf_clk = dc->dcn_soc.dcfclkv_max0p9*1000; - else if (vdd_level == dcn_bw_v_nom0p8) -- dcf_clk = dc->dcn_soc->dcfclkv_nom0p8*1000; -+ dcf_clk = dc->dcn_soc.dcfclkv_nom0p8*1000; - else if (vdd_level == dcn_bw_v_mid0p72) -- dcf_clk = dc->dcn_soc->dcfclkv_mid0p72*1000; -+ dcf_clk = dc->dcn_soc.dcfclkv_mid0p72*1000; - else -- dcf_clk = dc->dcn_soc->dcfclkv_min0p65*1000; -+ dcf_clk = dc->dcn_soc.dcfclkv_min0p65*1000; - - dm_logger_write(dc->ctx->logger, LOG_HW_MARKS, - "\tdcf_clk for voltage = %d\n", dcf_clk); - return dcf_clk; - } - --void dcn_bw_update_from_pplib(struct dc *dc) -+void dcn_bw_update_from_pplib(struct core_dc *dc) - { - struct dc_context *ctx = dc->ctx; - struct dm_pp_clock_levels_with_voltage clks = {0}; -@@ -1281,54 +1282,50 @@ void dcn_bw_update_from_pplib(struct dc *dc) - ctx, DM_PP_CLOCK_TYPE_FCLK, &clks) && - clks.num_levels != 0) { - ASSERT(clks.num_levels >= 3); -- dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 = 32 * (clks.data[0].clocks_in_khz / 1000.0) / 1000.0; -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmin0p65 = 32 * (clks.data[0].clocks_in_khz / 1000.0) / 1000.0; - if (clks.num_levels > 2) { -- dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 = dc->dcn_soc->number_of_channels * -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmid0p72 = dc->dcn_soc.number_of_channels * - (clks.data[clks.num_levels - 3].clocks_in_khz / 1000.0) * ddr4_dram_factor_single_Channel / 1000.0; - } else { -- dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 = dc->dcn_soc->number_of_channels * -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmid0p72 = dc->dcn_soc.number_of_channels * - (clks.data[clks.num_levels - 2].clocks_in_khz / 1000.0) * ddr4_dram_factor_single_Channel / 1000.0; - } -- dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 = dc->dcn_soc->number_of_channels * -+ dc->dcn_soc.fabric_and_dram_bandwidth_vnom0p8 = dc->dcn_soc.number_of_channels * - (clks.data[clks.num_levels - 2].clocks_in_khz / 1000.0) * ddr4_dram_factor_single_Channel / 1000.0; -- dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = dc->dcn_soc->number_of_channels * -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9 = dc->dcn_soc.number_of_channels * - (clks.data[clks.num_levels - 1].clocks_in_khz / 1000.0) * ddr4_dram_factor_single_Channel / 1000.0; - } else - BREAK_TO_DEBUGGER(); - if (dm_pp_get_clock_levels_by_type_with_voltage( - ctx, DM_PP_CLOCK_TYPE_DCFCLK, &clks) && - clks.num_levels >= 3) { -- dc->dcn_soc->dcfclkv_min0p65 = clks.data[0].clocks_in_khz / 1000.0; -- dc->dcn_soc->dcfclkv_mid0p72 = clks.data[clks.num_levels - 3].clocks_in_khz / 1000.0; -- dc->dcn_soc->dcfclkv_nom0p8 = clks.data[clks.num_levels - 2].clocks_in_khz / 1000.0; -- dc->dcn_soc->dcfclkv_max0p9 = clks.data[clks.num_levels - 1].clocks_in_khz / 1000.0; -+ dc->dcn_soc.dcfclkv_min0p65 = clks.data[0].clocks_in_khz / 1000.0; -+ dc->dcn_soc.dcfclkv_mid0p72 = clks.data[clks.num_levels - 3].clocks_in_khz / 1000.0; -+ dc->dcn_soc.dcfclkv_nom0p8 = clks.data[clks.num_levels - 2].clocks_in_khz / 1000.0; -+ dc->dcn_soc.dcfclkv_max0p9 = clks.data[clks.num_levels - 1].clocks_in_khz / 1000.0; - } else - BREAK_TO_DEBUGGER(); - - kernel_fpu_end(); - } - --void dcn_bw_notify_pplib_of_wm_ranges(struct dc *dc) -+void dcn_bw_notify_pplib_of_wm_ranges(struct core_dc *dc) - { -- struct pp_smu_funcs_rv *pp = dc->res_pool->pp_smu; -- struct pp_smu_wm_range_sets ranges = {0}; -- int max_fclk_khz, nom_fclk_khz, mid_fclk_khz, min_fclk_khz; -- int max_dcfclk_khz, min_dcfclk_khz; -- int socclk_khz; -+ struct dm_pp_wm_sets_with_clock_ranges_soc15 clk_ranges = {0}; -+ int max_fclk_khz, nom_fclk_khz, min_fclk_khz, max_dcfclk_khz, -+ nom_dcfclk_khz, mid_fclk_khz, min_dcfclk_khz, socclk_khz; - const int overdrive = 5000000; /* 5 GHz to cover Overdrive */ -- unsigned factor = (ddr4_dram_factor_single_Channel * dc->dcn_soc->number_of_channels); -- -- if (!pp->set_wm_ranges) -- return; -+ unsigned factor = (ddr4_dram_factor_single_Channel * dc->dcn_soc.number_of_channels); - - kernel_fpu_begin(); -- max_fclk_khz = dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 * 1000000 / factor; -- nom_fclk_khz = dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 * 1000000 / factor; -- mid_fclk_khz = dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 * 1000000 / factor; -- min_fclk_khz = dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 * 1000000 / 32; -- max_dcfclk_khz = dc->dcn_soc->dcfclkv_max0p9 * 1000; -- min_dcfclk_khz = dc->dcn_soc->dcfclkv_min0p65 * 1000; -- socclk_khz = dc->dcn_soc->socclk * 1000; -+ max_fclk_khz = dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9 * 1000000 / factor; -+ nom_fclk_khz = dc->dcn_soc.fabric_and_dram_bandwidth_vnom0p8 * 1000000 / factor; -+ mid_fclk_khz = dc->dcn_soc.fabric_and_dram_bandwidth_vmid0p72 * 1000000 / factor; -+ min_fclk_khz = dc->dcn_soc.fabric_and_dram_bandwidth_vmin0p65 * 1000000 / 32; -+ max_dcfclk_khz = dc->dcn_soc.dcfclkv_max0p9 * 1000; -+ nom_dcfclk_khz = dc->dcn_soc.dcfclkv_nom0p8 * 1000; -+ min_dcfclk_khz = dc->dcn_soc.dcfclkv_min0p65 * 1000; -+ socclk_khz = dc->dcn_soc.socclk * 1000; - kernel_fpu_end(); - - /* Now notify PPLib/SMU about which Watermarks sets they should select -@@ -1339,58 +1336,58 @@ void dcn_bw_notify_pplib_of_wm_ranges(struct dc *dc) - /* SOCCLK does not affect anytihng but writeback for DCN so for now we dont - * care what the value is, hence min to overdrive level - */ -- ranges.num_reader_wm_sets = WM_COUNT; -- ranges.num_writer_wm_sets = WM_COUNT; -- ranges.reader_wm_sets[0].wm_inst = WM_A; -- ranges.reader_wm_sets[0].min_drain_clk_khz = min_dcfclk_khz; -- ranges.reader_wm_sets[0].max_drain_clk_khz = max_dcfclk_khz; -- ranges.reader_wm_sets[0].min_fill_clk_khz = min_fclk_khz; -- ranges.reader_wm_sets[0].max_fill_clk_khz = min_fclk_khz; -- ranges.writer_wm_sets[0].wm_inst = WM_A; -- ranges.writer_wm_sets[0].min_fill_clk_khz = socclk_khz; -- ranges.writer_wm_sets[0].max_fill_clk_khz = overdrive; -- ranges.writer_wm_sets[0].min_drain_clk_khz = min_fclk_khz; -- ranges.writer_wm_sets[0].max_drain_clk_khz = min_fclk_khz; -- -- ranges.reader_wm_sets[1].wm_inst = WM_B; -- ranges.reader_wm_sets[1].min_drain_clk_khz = min_fclk_khz; -- ranges.reader_wm_sets[1].max_drain_clk_khz = max_dcfclk_khz; -- ranges.reader_wm_sets[1].min_fill_clk_khz = mid_fclk_khz; -- ranges.reader_wm_sets[1].max_fill_clk_khz = mid_fclk_khz; -- ranges.writer_wm_sets[1].wm_inst = WM_B; -- ranges.writer_wm_sets[1].min_fill_clk_khz = socclk_khz; -- ranges.writer_wm_sets[1].max_fill_clk_khz = overdrive; -- ranges.writer_wm_sets[1].min_drain_clk_khz = mid_fclk_khz; -- ranges.writer_wm_sets[1].max_drain_clk_khz = mid_fclk_khz; -- -- -- ranges.reader_wm_sets[2].wm_inst = WM_C; -- ranges.reader_wm_sets[2].min_drain_clk_khz = min_fclk_khz; -- ranges.reader_wm_sets[2].max_drain_clk_khz = max_dcfclk_khz; -- ranges.reader_wm_sets[2].min_fill_clk_khz = nom_fclk_khz; -- ranges.reader_wm_sets[2].max_fill_clk_khz = nom_fclk_khz; -- ranges.writer_wm_sets[2].wm_inst = WM_C; -- ranges.writer_wm_sets[2].min_fill_clk_khz = socclk_khz; -- ranges.writer_wm_sets[2].max_fill_clk_khz = overdrive; -- ranges.writer_wm_sets[2].min_drain_clk_khz = nom_fclk_khz; -- ranges.writer_wm_sets[2].max_drain_clk_khz = nom_fclk_khz; -- -- ranges.reader_wm_sets[3].wm_inst = WM_D; -- ranges.reader_wm_sets[3].min_drain_clk_khz = min_fclk_khz; -- ranges.reader_wm_sets[3].max_drain_clk_khz = max_dcfclk_khz; -- ranges.reader_wm_sets[3].min_fill_clk_khz = max_fclk_khz; -- ranges.reader_wm_sets[3].max_fill_clk_khz = max_fclk_khz; -- ranges.writer_wm_sets[3].wm_inst = WM_D; -- ranges.writer_wm_sets[3].min_fill_clk_khz = socclk_khz; -- ranges.writer_wm_sets[3].max_fill_clk_khz = overdrive; -- ranges.writer_wm_sets[3].min_drain_clk_khz = max_fclk_khz; -- ranges.writer_wm_sets[3].max_drain_clk_khz = max_fclk_khz; -+ clk_ranges.num_wm_dmif_sets = 4; -+ clk_ranges.num_wm_mcif_sets = 4; -+ clk_ranges.wm_dmif_clocks_ranges[0].wm_set_id = WM_SET_A; -+ clk_ranges.wm_dmif_clocks_ranges[0].wm_min_dcfclk_clk_in_khz = min_dcfclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[0].wm_max_dcfclk_clk_in_khz = max_dcfclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[0].wm_min_memg_clk_in_khz = min_fclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[0].wm_max_mem_clk_in_khz = min_fclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[0].wm_set_id = WM_SET_A; -+ clk_ranges.wm_mcif_clocks_ranges[0].wm_min_socclk_clk_in_khz = socclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[0].wm_max_socclk_clk_in_khz = overdrive; -+ clk_ranges.wm_mcif_clocks_ranges[0].wm_min_memg_clk_in_khz = min_fclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[0].wm_max_mem_clk_in_khz = min_fclk_khz; -+ -+ clk_ranges.wm_dmif_clocks_ranges[1].wm_set_id = WM_SET_B; -+ clk_ranges.wm_dmif_clocks_ranges[1].wm_min_dcfclk_clk_in_khz = min_fclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[1].wm_max_dcfclk_clk_in_khz = max_dcfclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[1].wm_min_memg_clk_in_khz = mid_fclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[1].wm_max_mem_clk_in_khz = mid_fclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[1].wm_set_id = WM_SET_B; -+ clk_ranges.wm_mcif_clocks_ranges[1].wm_min_socclk_clk_in_khz = socclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[1].wm_max_socclk_clk_in_khz = overdrive; -+ clk_ranges.wm_mcif_clocks_ranges[1].wm_min_memg_clk_in_khz = mid_fclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[1].wm_max_mem_clk_in_khz = mid_fclk_khz; -+ -+ -+ clk_ranges.wm_dmif_clocks_ranges[2].wm_set_id = WM_SET_C; -+ clk_ranges.wm_dmif_clocks_ranges[2].wm_min_dcfclk_clk_in_khz = min_fclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[2].wm_max_dcfclk_clk_in_khz = max_dcfclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[2].wm_min_memg_clk_in_khz = nom_fclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[2].wm_max_mem_clk_in_khz = nom_fclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[2].wm_set_id = WM_SET_C; -+ clk_ranges.wm_mcif_clocks_ranges[2].wm_min_socclk_clk_in_khz = socclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[2].wm_max_socclk_clk_in_khz = overdrive; -+ clk_ranges.wm_mcif_clocks_ranges[2].wm_min_memg_clk_in_khz = nom_fclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[2].wm_max_mem_clk_in_khz = nom_fclk_khz; -+ -+ clk_ranges.wm_dmif_clocks_ranges[3].wm_set_id = WM_SET_D; -+ clk_ranges.wm_dmif_clocks_ranges[3].wm_min_dcfclk_clk_in_khz = min_fclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[3].wm_max_dcfclk_clk_in_khz = max_dcfclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[3].wm_min_memg_clk_in_khz = max_fclk_khz; -+ clk_ranges.wm_dmif_clocks_ranges[3].wm_max_mem_clk_in_khz = max_fclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[3].wm_set_id = WM_SET_D; -+ clk_ranges.wm_mcif_clocks_ranges[3].wm_min_socclk_clk_in_khz = socclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[3].wm_max_socclk_clk_in_khz = overdrive; -+ clk_ranges.wm_mcif_clocks_ranges[3].wm_min_memg_clk_in_khz = max_fclk_khz; -+ clk_ranges.wm_mcif_clocks_ranges[3].wm_max_mem_clk_in_khz = max_fclk_khz; - - /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */ -- pp->set_wm_ranges(&pp->pp_smu, &ranges); -+ dm_pp_notify_wm_clock_changes_soc15(dc->ctx, &clk_ranges); - } - --void dcn_bw_sync_calcs_and_dml(struct dc *dc) -+void dcn_bw_sync_calcs_and_dml(struct core_dc *dc) - { - kernel_fpu_begin(); - dm_logger_write(dc->ctx->logger, LOG_BANDWIDTH_CALCS, -@@ -1428,40 +1425,40 @@ void dcn_bw_sync_calcs_and_dml(struct dc *dc) - "vmm_page_size: %d Bytes\n" - "dram_clock_change_latency: %d ns\n" - "return_bus_width: %d Bytes\n", -- dc->dcn_soc->sr_exit_time * 1000, -- dc->dcn_soc->sr_enter_plus_exit_time * 1000, -- dc->dcn_soc->urgent_latency * 1000, -- dc->dcn_soc->write_back_latency * 1000, -- dc->dcn_soc->percent_of_ideal_drambw_received_after_urg_latency, -- dc->dcn_soc->max_request_size, -- dc->dcn_soc->dcfclkv_max0p9 * 1000, -- dc->dcn_soc->dcfclkv_nom0p8 * 1000, -- dc->dcn_soc->dcfclkv_mid0p72 * 1000, -- dc->dcn_soc->dcfclkv_min0p65 * 1000, -- dc->dcn_soc->max_dispclk_vmax0p9 * 1000, -- dc->dcn_soc->max_dispclk_vnom0p8 * 1000, -- dc->dcn_soc->max_dispclk_vmid0p72 * 1000, -- dc->dcn_soc->max_dispclk_vmin0p65 * 1000, -- dc->dcn_soc->max_dppclk_vmax0p9 * 1000, -- dc->dcn_soc->max_dppclk_vnom0p8 * 1000, -- dc->dcn_soc->max_dppclk_vmid0p72 * 1000, -- dc->dcn_soc->max_dppclk_vmin0p65 * 1000, -- dc->dcn_soc->socclk * 1000, -- dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 * 1000, -- dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 * 1000, -- dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 * 1000, -- dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 * 1000, -- dc->dcn_soc->phyclkv_max0p9 * 1000, -- dc->dcn_soc->phyclkv_nom0p8 * 1000, -- dc->dcn_soc->phyclkv_mid0p72 * 1000, -- dc->dcn_soc->phyclkv_min0p65 * 1000, -- dc->dcn_soc->downspreading * 100, -- dc->dcn_soc->round_trip_ping_latency_cycles, -- dc->dcn_soc->urgent_out_of_order_return_per_channel, -- dc->dcn_soc->number_of_channels, -- dc->dcn_soc->vmm_page_size, -- dc->dcn_soc->dram_clock_change_latency * 1000, -- dc->dcn_soc->return_bus_width); -+ dc->dcn_soc.sr_exit_time * 1000, -+ dc->dcn_soc.sr_enter_plus_exit_time * 1000, -+ dc->dcn_soc.urgent_latency * 1000, -+ dc->dcn_soc.write_back_latency * 1000, -+ dc->dcn_soc.percent_of_ideal_drambw_received_after_urg_latency, -+ dc->dcn_soc.max_request_size, -+ dc->dcn_soc.dcfclkv_max0p9 * 1000, -+ dc->dcn_soc.dcfclkv_nom0p8 * 1000, -+ dc->dcn_soc.dcfclkv_mid0p72 * 1000, -+ dc->dcn_soc.dcfclkv_min0p65 * 1000, -+ dc->dcn_soc.max_dispclk_vmax0p9 * 1000, -+ dc->dcn_soc.max_dispclk_vnom0p8 * 1000, -+ dc->dcn_soc.max_dispclk_vmid0p72 * 1000, -+ dc->dcn_soc.max_dispclk_vmin0p65 * 1000, -+ dc->dcn_soc.max_dppclk_vmax0p9 * 1000, -+ dc->dcn_soc.max_dppclk_vnom0p8 * 1000, -+ dc->dcn_soc.max_dppclk_vmid0p72 * 1000, -+ dc->dcn_soc.max_dppclk_vmin0p65 * 1000, -+ dc->dcn_soc.socclk * 1000, -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9 * 1000, -+ dc->dcn_soc.fabric_and_dram_bandwidth_vnom0p8 * 1000, -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmid0p72 * 1000, -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmin0p65 * 1000, -+ dc->dcn_soc.phyclkv_max0p9 * 1000, -+ dc->dcn_soc.phyclkv_nom0p8 * 1000, -+ dc->dcn_soc.phyclkv_mid0p72 * 1000, -+ dc->dcn_soc.phyclkv_min0p65 * 1000, -+ dc->dcn_soc.downspreading * 100, -+ dc->dcn_soc.round_trip_ping_latency_cycles, -+ dc->dcn_soc.urgent_out_of_order_return_per_channel, -+ dc->dcn_soc.number_of_channels, -+ dc->dcn_soc.vmm_page_size, -+ dc->dcn_soc.dram_clock_change_latency * 1000, -+ dc->dcn_soc.return_bus_width); - dm_logger_write(dc->ctx->logger, LOG_BANDWIDTH_CALCS, - "rob_buffer_size_in_kbyte: %d\n" - "det_buffer_size_in_kbyte: %d\n" -@@ -1497,120 +1494,120 @@ void dcn_bw_sync_calcs_and_dml(struct dc *dc) - "can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one: %d\n" - "bug_forcing_luma_and_chroma_request_to_same_size_fixed: %d\n" - "dcfclk_cstate_latency: %d\n", -- dc->dcn_ip->rob_buffer_size_in_kbyte, -- dc->dcn_ip->det_buffer_size_in_kbyte, -- dc->dcn_ip->dpp_output_buffer_pixels, -- dc->dcn_ip->opp_output_buffer_lines, -- dc->dcn_ip->pixel_chunk_size_in_kbyte, -- dc->dcn_ip->pte_enable, -- dc->dcn_ip->pte_chunk_size, -- dc->dcn_ip->meta_chunk_size, -- dc->dcn_ip->writeback_chunk_size, -- dc->dcn_ip->odm_capability, -- dc->dcn_ip->dsc_capability, -- dc->dcn_ip->line_buffer_size, -- dc->dcn_ip->max_line_buffer_lines, -- dc->dcn_ip->is_line_buffer_bpp_fixed, -- dc->dcn_ip->line_buffer_fixed_bpp, -- dc->dcn_ip->writeback_luma_buffer_size, -- dc->dcn_ip->writeback_chroma_buffer_size, -- dc->dcn_ip->max_num_dpp, -- dc->dcn_ip->max_num_writeback, -- dc->dcn_ip->max_dchub_topscl_throughput, -- dc->dcn_ip->max_pscl_tolb_throughput, -- dc->dcn_ip->max_lb_tovscl_throughput, -- dc->dcn_ip->max_vscl_tohscl_throughput, -- dc->dcn_ip->max_hscl_ratio, -- dc->dcn_ip->max_vscl_ratio, -- dc->dcn_ip->max_hscl_taps, -- dc->dcn_ip->max_vscl_taps, -- dc->dcn_ip->pte_buffer_size_in_requests, -- dc->dcn_ip->dispclk_ramping_margin, -- dc->dcn_ip->under_scan_factor * 100, -- dc->dcn_ip->max_inter_dcn_tile_repeaters, -- dc->dcn_ip->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one, -- dc->dcn_ip->bug_forcing_luma_and_chroma_request_to_same_size_fixed, -- dc->dcn_ip->dcfclk_cstate_latency); -- dc->dml.soc.vmin.socclk_mhz = dc->dcn_soc->socclk; -- dc->dml.soc.vmid.socclk_mhz = dc->dcn_soc->socclk; -- dc->dml.soc.vnom.socclk_mhz = dc->dcn_soc->socclk; -- dc->dml.soc.vmax.socclk_mhz = dc->dcn_soc->socclk; -- -- dc->dml.soc.vmin.dcfclk_mhz = dc->dcn_soc->dcfclkv_min0p65; -- dc->dml.soc.vmid.dcfclk_mhz = dc->dcn_soc->dcfclkv_mid0p72; -- dc->dml.soc.vnom.dcfclk_mhz = dc->dcn_soc->dcfclkv_nom0p8; -- dc->dml.soc.vmax.dcfclk_mhz = dc->dcn_soc->dcfclkv_max0p9; -- -- dc->dml.soc.vmin.dispclk_mhz = dc->dcn_soc->max_dispclk_vmin0p65; -- dc->dml.soc.vmid.dispclk_mhz = dc->dcn_soc->max_dispclk_vmid0p72; -- dc->dml.soc.vnom.dispclk_mhz = dc->dcn_soc->max_dispclk_vnom0p8; -- dc->dml.soc.vmax.dispclk_mhz = dc->dcn_soc->max_dispclk_vmax0p9; -- -- dc->dml.soc.vmin.dppclk_mhz = dc->dcn_soc->max_dppclk_vmin0p65; -- dc->dml.soc.vmid.dppclk_mhz = dc->dcn_soc->max_dppclk_vmid0p72; -- dc->dml.soc.vnom.dppclk_mhz = dc->dcn_soc->max_dppclk_vnom0p8; -- dc->dml.soc.vmax.dppclk_mhz = dc->dcn_soc->max_dppclk_vmax0p9; -- -- dc->dml.soc.vmin.phyclk_mhz = dc->dcn_soc->phyclkv_min0p65; -- dc->dml.soc.vmid.phyclk_mhz = dc->dcn_soc->phyclkv_mid0p72; -- dc->dml.soc.vnom.phyclk_mhz = dc->dcn_soc->phyclkv_nom0p8; -- dc->dml.soc.vmax.phyclk_mhz = dc->dcn_soc->phyclkv_max0p9; -- -- dc->dml.soc.vmin.dram_bw_per_chan_gbps = dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65; -- dc->dml.soc.vmid.dram_bw_per_chan_gbps = dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72; -- dc->dml.soc.vnom.dram_bw_per_chan_gbps = dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8; -- dc->dml.soc.vmax.dram_bw_per_chan_gbps = dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9; -- -- dc->dml.soc.sr_exit_time_us = dc->dcn_soc->sr_exit_time; -- dc->dml.soc.sr_enter_plus_exit_time_us = dc->dcn_soc->sr_enter_plus_exit_time; -- dc->dml.soc.urgent_latency_us = dc->dcn_soc->urgent_latency; -- dc->dml.soc.writeback_latency_us = dc->dcn_soc->write_back_latency; -+ dc->dcn_ip.rob_buffer_size_in_kbyte, -+ dc->dcn_ip.det_buffer_size_in_kbyte, -+ dc->dcn_ip.dpp_output_buffer_pixels, -+ dc->dcn_ip.opp_output_buffer_lines, -+ dc->dcn_ip.pixel_chunk_size_in_kbyte, -+ dc->dcn_ip.pte_enable, -+ dc->dcn_ip.pte_chunk_size, -+ dc->dcn_ip.meta_chunk_size, -+ dc->dcn_ip.writeback_chunk_size, -+ dc->dcn_ip.odm_capability, -+ dc->dcn_ip.dsc_capability, -+ dc->dcn_ip.line_buffer_size, -+ dc->dcn_ip.max_line_buffer_lines, -+ dc->dcn_ip.is_line_buffer_bpp_fixed, -+ dc->dcn_ip.line_buffer_fixed_bpp, -+ dc->dcn_ip.writeback_luma_buffer_size, -+ dc->dcn_ip.writeback_chroma_buffer_size, -+ dc->dcn_ip.max_num_dpp, -+ dc->dcn_ip.max_num_writeback, -+ dc->dcn_ip.max_dchub_topscl_throughput, -+ dc->dcn_ip.max_pscl_tolb_throughput, -+ dc->dcn_ip.max_lb_tovscl_throughput, -+ dc->dcn_ip.max_vscl_tohscl_throughput, -+ dc->dcn_ip.max_hscl_ratio, -+ dc->dcn_ip.max_vscl_ratio, -+ dc->dcn_ip.max_hscl_taps, -+ dc->dcn_ip.max_vscl_taps, -+ dc->dcn_ip.pte_buffer_size_in_requests, -+ dc->dcn_ip.dispclk_ramping_margin, -+ dc->dcn_ip.under_scan_factor * 100, -+ dc->dcn_ip.max_inter_dcn_tile_repeaters, -+ dc->dcn_ip.can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one, -+ dc->dcn_ip.bug_forcing_luma_and_chroma_request_to_same_size_fixed, -+ dc->dcn_ip.dcfclk_cstate_latency); -+ dc->dml.soc.vmin.socclk_mhz = dc->dcn_soc.socclk; -+ dc->dml.soc.vmid.socclk_mhz = dc->dcn_soc.socclk; -+ dc->dml.soc.vnom.socclk_mhz = dc->dcn_soc.socclk; -+ dc->dml.soc.vmax.socclk_mhz = dc->dcn_soc.socclk; -+ -+ dc->dml.soc.vmin.dcfclk_mhz = dc->dcn_soc.dcfclkv_min0p65; -+ dc->dml.soc.vmid.dcfclk_mhz = dc->dcn_soc.dcfclkv_mid0p72; -+ dc->dml.soc.vnom.dcfclk_mhz = dc->dcn_soc.dcfclkv_nom0p8; -+ dc->dml.soc.vmax.dcfclk_mhz = dc->dcn_soc.dcfclkv_max0p9; -+ -+ dc->dml.soc.vmin.dispclk_mhz = dc->dcn_soc.max_dispclk_vmin0p65; -+ dc->dml.soc.vmid.dispclk_mhz = dc->dcn_soc.max_dispclk_vmid0p72; -+ dc->dml.soc.vnom.dispclk_mhz = dc->dcn_soc.max_dispclk_vnom0p8; -+ dc->dml.soc.vmax.dispclk_mhz = dc->dcn_soc.max_dispclk_vmax0p9; -+ -+ dc->dml.soc.vmin.dppclk_mhz = dc->dcn_soc.max_dppclk_vmin0p65; -+ dc->dml.soc.vmid.dppclk_mhz = dc->dcn_soc.max_dppclk_vmid0p72; -+ dc->dml.soc.vnom.dppclk_mhz = dc->dcn_soc.max_dppclk_vnom0p8; -+ dc->dml.soc.vmax.dppclk_mhz = dc->dcn_soc.max_dppclk_vmax0p9; -+ -+ dc->dml.soc.vmin.phyclk_mhz = dc->dcn_soc.phyclkv_min0p65; -+ dc->dml.soc.vmid.phyclk_mhz = dc->dcn_soc.phyclkv_mid0p72; -+ dc->dml.soc.vnom.phyclk_mhz = dc->dcn_soc.phyclkv_nom0p8; -+ dc->dml.soc.vmax.phyclk_mhz = dc->dcn_soc.phyclkv_max0p9; -+ -+ dc->dml.soc.vmin.dram_bw_per_chan_gbps = dc->dcn_soc.fabric_and_dram_bandwidth_vmin0p65; -+ dc->dml.soc.vmid.dram_bw_per_chan_gbps = dc->dcn_soc.fabric_and_dram_bandwidth_vmid0p72; -+ dc->dml.soc.vnom.dram_bw_per_chan_gbps = dc->dcn_soc.fabric_and_dram_bandwidth_vnom0p8; -+ dc->dml.soc.vmax.dram_bw_per_chan_gbps = dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9; -+ -+ dc->dml.soc.sr_exit_time_us = dc->dcn_soc.sr_exit_time; -+ dc->dml.soc.sr_enter_plus_exit_time_us = dc->dcn_soc.sr_enter_plus_exit_time; -+ dc->dml.soc.urgent_latency_us = dc->dcn_soc.urgent_latency; -+ dc->dml.soc.writeback_latency_us = dc->dcn_soc.write_back_latency; - dc->dml.soc.ideal_dram_bw_after_urgent_percent = -- dc->dcn_soc->percent_of_ideal_drambw_received_after_urg_latency; -- dc->dml.soc.max_request_size_bytes = dc->dcn_soc->max_request_size; -- dc->dml.soc.downspread_percent = dc->dcn_soc->downspreading; -+ dc->dcn_soc.percent_of_ideal_drambw_received_after_urg_latency; -+ dc->dml.soc.max_request_size_bytes = dc->dcn_soc.max_request_size; -+ dc->dml.soc.downspread_percent = dc->dcn_soc.downspreading; - dc->dml.soc.round_trip_ping_latency_dcfclk_cycles = -- dc->dcn_soc->round_trip_ping_latency_cycles; -+ dc->dcn_soc.round_trip_ping_latency_cycles; - dc->dml.soc.urgent_out_of_order_return_per_channel_bytes = -- dc->dcn_soc->urgent_out_of_order_return_per_channel; -- dc->dml.soc.num_chans = dc->dcn_soc->number_of_channels; -- dc->dml.soc.vmm_page_size_bytes = dc->dcn_soc->vmm_page_size; -- dc->dml.soc.dram_clock_change_latency_us = dc->dcn_soc->dram_clock_change_latency; -- dc->dml.soc.return_bus_width_bytes = dc->dcn_soc->return_bus_width; -- -- dc->dml.ip.rob_buffer_size_kbytes = dc->dcn_ip->rob_buffer_size_in_kbyte; -- dc->dml.ip.det_buffer_size_kbytes = dc->dcn_ip->det_buffer_size_in_kbyte; -- dc->dml.ip.dpp_output_buffer_pixels = dc->dcn_ip->dpp_output_buffer_pixels; -- dc->dml.ip.opp_output_buffer_lines = dc->dcn_ip->opp_output_buffer_lines; -- dc->dml.ip.pixel_chunk_size_kbytes = dc->dcn_ip->pixel_chunk_size_in_kbyte; -- dc->dml.ip.pte_enable = dc->dcn_ip->pte_enable == dcn_bw_yes; -- dc->dml.ip.pte_chunk_size_kbytes = dc->dcn_ip->pte_chunk_size; -- dc->dml.ip.meta_chunk_size_kbytes = dc->dcn_ip->meta_chunk_size; -- dc->dml.ip.writeback_chunk_size_kbytes = dc->dcn_ip->writeback_chunk_size; -- dc->dml.ip.line_buffer_size_bits = dc->dcn_ip->line_buffer_size; -- dc->dml.ip.max_line_buffer_lines = dc->dcn_ip->max_line_buffer_lines; -- dc->dml.ip.IsLineBufferBppFixed = dc->dcn_ip->is_line_buffer_bpp_fixed == dcn_bw_yes; -- dc->dml.ip.LineBufferFixedBpp = dc->dcn_ip->line_buffer_fixed_bpp; -- dc->dml.ip.writeback_luma_buffer_size_kbytes = dc->dcn_ip->writeback_luma_buffer_size; -- dc->dml.ip.writeback_chroma_buffer_size_kbytes = dc->dcn_ip->writeback_chroma_buffer_size; -- dc->dml.ip.max_num_dpp = dc->dcn_ip->max_num_dpp; -- dc->dml.ip.max_num_wb = dc->dcn_ip->max_num_writeback; -- dc->dml.ip.max_dchub_pscl_bw_pix_per_clk = dc->dcn_ip->max_dchub_topscl_throughput; -- dc->dml.ip.max_pscl_lb_bw_pix_per_clk = dc->dcn_ip->max_pscl_tolb_throughput; -- dc->dml.ip.max_lb_vscl_bw_pix_per_clk = dc->dcn_ip->max_lb_tovscl_throughput; -- dc->dml.ip.max_vscl_hscl_bw_pix_per_clk = dc->dcn_ip->max_vscl_tohscl_throughput; -- dc->dml.ip.max_hscl_ratio = dc->dcn_ip->max_hscl_ratio; -- dc->dml.ip.max_vscl_ratio = dc->dcn_ip->max_vscl_ratio; -- dc->dml.ip.max_hscl_taps = dc->dcn_ip->max_hscl_taps; -- dc->dml.ip.max_vscl_taps = dc->dcn_ip->max_vscl_taps; -+ dc->dcn_soc.urgent_out_of_order_return_per_channel; -+ dc->dml.soc.num_chans = dc->dcn_soc.number_of_channels; -+ dc->dml.soc.vmm_page_size_bytes = dc->dcn_soc.vmm_page_size; -+ dc->dml.soc.dram_clock_change_latency_us = dc->dcn_soc.dram_clock_change_latency; -+ dc->dml.soc.return_bus_width_bytes = dc->dcn_soc.return_bus_width; -+ -+ dc->dml.ip.rob_buffer_size_kbytes = dc->dcn_ip.rob_buffer_size_in_kbyte; -+ dc->dml.ip.det_buffer_size_kbytes = dc->dcn_ip.det_buffer_size_in_kbyte; -+ dc->dml.ip.dpp_output_buffer_pixels = dc->dcn_ip.dpp_output_buffer_pixels; -+ dc->dml.ip.opp_output_buffer_lines = dc->dcn_ip.opp_output_buffer_lines; -+ dc->dml.ip.pixel_chunk_size_kbytes = dc->dcn_ip.pixel_chunk_size_in_kbyte; -+ dc->dml.ip.pte_enable = dc->dcn_ip.pte_enable == dcn_bw_yes; -+ dc->dml.ip.pte_chunk_size_kbytes = dc->dcn_ip.pte_chunk_size; -+ dc->dml.ip.meta_chunk_size_kbytes = dc->dcn_ip.meta_chunk_size; -+ dc->dml.ip.writeback_chunk_size_kbytes = dc->dcn_ip.writeback_chunk_size; -+ dc->dml.ip.line_buffer_size_bits = dc->dcn_ip.line_buffer_size; -+ dc->dml.ip.max_line_buffer_lines = dc->dcn_ip.max_line_buffer_lines; -+ dc->dml.ip.IsLineBufferBppFixed = dc->dcn_ip.is_line_buffer_bpp_fixed == dcn_bw_yes; -+ dc->dml.ip.LineBufferFixedBpp = dc->dcn_ip.line_buffer_fixed_bpp; -+ dc->dml.ip.writeback_luma_buffer_size_kbytes = dc->dcn_ip.writeback_luma_buffer_size; -+ dc->dml.ip.writeback_chroma_buffer_size_kbytes = dc->dcn_ip.writeback_chroma_buffer_size; -+ dc->dml.ip.max_num_dpp = dc->dcn_ip.max_num_dpp; -+ dc->dml.ip.max_num_wb = dc->dcn_ip.max_num_writeback; -+ dc->dml.ip.max_dchub_pscl_bw_pix_per_clk = dc->dcn_ip.max_dchub_topscl_throughput; -+ dc->dml.ip.max_pscl_lb_bw_pix_per_clk = dc->dcn_ip.max_pscl_tolb_throughput; -+ dc->dml.ip.max_lb_vscl_bw_pix_per_clk = dc->dcn_ip.max_lb_tovscl_throughput; -+ dc->dml.ip.max_vscl_hscl_bw_pix_per_clk = dc->dcn_ip.max_vscl_tohscl_throughput; -+ dc->dml.ip.max_hscl_ratio = dc->dcn_ip.max_hscl_ratio; -+ dc->dml.ip.max_vscl_ratio = dc->dcn_ip.max_vscl_ratio; -+ dc->dml.ip.max_hscl_taps = dc->dcn_ip.max_hscl_taps; -+ dc->dml.ip.max_vscl_taps = dc->dcn_ip.max_vscl_taps; - /*pte_buffer_size_in_requests missing in dml*/ -- dc->dml.ip.dispclk_ramp_margin_percent = dc->dcn_ip->dispclk_ramping_margin; -- dc->dml.ip.underscan_factor = dc->dcn_ip->under_scan_factor; -- dc->dml.ip.max_inter_dcn_tile_repeaters = dc->dcn_ip->max_inter_dcn_tile_repeaters; -+ dc->dml.ip.dispclk_ramp_margin_percent = dc->dcn_ip.dispclk_ramping_margin; -+ dc->dml.ip.underscan_factor = dc->dcn_ip.under_scan_factor; -+ dc->dml.ip.max_inter_dcn_tile_repeaters = dc->dcn_ip.max_inter_dcn_tile_repeaters; - dc->dml.ip.can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one = -- dc->dcn_ip->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one == dcn_bw_yes; -+ dc->dcn_ip.can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one == dcn_bw_yes; - dc->dml.ip.bug_forcing_LC_req_same_size_fixed = -- dc->dcn_ip->bug_forcing_luma_and_chroma_request_to_same_size_fixed == dcn_bw_yes; -- dc->dml.ip.dcfclk_cstate_latency = dc->dcn_ip->dcfclk_cstate_latency; -+ dc->dcn_ip.bug_forcing_luma_and_chroma_request_to_same_size_fixed == dcn_bw_yes; -+ dc->dml.ip.dcfclk_cstate_latency = dc->dcn_ip.dcfclk_cstate_latency; - kernel_fpu_end(); - } -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c -index c7ed874..929d949 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c -@@ -35,6 +35,7 @@ - #include "clock_source.h" - #include "dc_bios_types.h" - -+#include "dce_calcs.h" - #include "bios_parser_interface.h" - #include "include/irq_service_interface.h" - #include "transform.h" -@@ -48,13 +49,10 @@ - #include "dm_helpers.h" - #include "mem_input.h" - -- --char dc_ver[] = DC_VER; -- - /******************************************************************************* - * Private functions - ******************************************************************************/ --static void destroy_links(struct dc *dc) -+static void destroy_links(struct core_dc *dc) - { - uint32_t i; - -@@ -65,7 +63,7 @@ static void destroy_links(struct dc *dc) - } - - static bool create_links( -- struct dc *dc, -+ struct core_dc *dc, - uint32_t num_virtual_links) - { - int i; -@@ -155,19 +153,20 @@ static bool stream_adjust_vmin_vmax(struct dc *dc, - int vmin, int vmax) - { - /* TODO: Support multiple streams */ -+ struct core_dc *core_dc = DC_TO_CORE(dc); - struct dc_stream_state *stream = streams[0]; - int i = 0; - bool ret = false; - - for (i = 0; i < MAX_PIPES; i++) { -- struct pipe_ctx *pipe = &dc->current_state->res_ctx.pipe_ctx[i]; -+ struct pipe_ctx *pipe = &core_dc->current_context->res_ctx.pipe_ctx[i]; - - if (pipe->stream == stream && pipe->stream_res.stream_enc) { -- dc->hwss.set_drr(&pipe, 1, vmin, vmax); -+ core_dc->hwss.set_drr(&pipe, 1, vmin, vmax); - - /* build and update the info frame */ - resource_build_info_frame(pipe); -- dc->hwss.update_info_frame(pipe); -+ core_dc->hwss.update_info_frame(pipe); - - ret = true; - } -@@ -180,6 +179,7 @@ static bool stream_get_crtc_position(struct dc *dc, - unsigned int *v_pos, unsigned int *nom_v_pos) - { - /* TODO: Support multiple streams */ -+ struct core_dc *core_dc = DC_TO_CORE(dc); - struct dc_stream_state *stream = streams[0]; - int i = 0; - bool ret = false; -@@ -187,10 +187,10 @@ static bool stream_get_crtc_position(struct dc *dc, - - for (i = 0; i < MAX_PIPES; i++) { - struct pipe_ctx *pipe = -- &dc->current_state->res_ctx.pipe_ctx[i]; -+ &core_dc->current_context->res_ctx.pipe_ctx[i]; - - if (pipe->stream == stream && pipe->stream_res.stream_enc) { -- dc->hwss.get_position(&pipe, 1, &position); -+ core_dc->hwss.get_position(&pipe, 1, &position); - - *v_pos = position.vertical_count; - *nom_v_pos = position.nominal_vcount; -@@ -202,14 +202,15 @@ static bool stream_get_crtc_position(struct dc *dc, - - static bool set_gamut_remap(struct dc *dc, const struct dc_stream_state *stream) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - int i = 0; - bool ret = false; - struct pipe_ctx *pipes; - - for (i = 0; i < MAX_PIPES; i++) { -- if (dc->current_state->res_ctx.pipe_ctx[i].stream == stream) { -- pipes = &dc->current_state->res_ctx.pipe_ctx[i]; -- dc->hwss.program_gamut_remap(pipes); -+ if (core_dc->current_context->res_ctx.pipe_ctx[i].stream == stream) { -+ pipes = &core_dc->current_context->res_ctx.pipe_ctx[i]; -+ core_dc->hwss.program_gamut_remap(pipes); - ret = true; - } - } -@@ -219,16 +220,17 @@ static bool set_gamut_remap(struct dc *dc, const struct dc_stream_state *stream) - - static bool program_csc_matrix(struct dc *dc, struct dc_stream_state *stream) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - int i = 0; - bool ret = false; - struct pipe_ctx *pipes; - - for (i = 0; i < MAX_PIPES; i++) { -- if (dc->current_state->res_ctx.pipe_ctx[i].stream -+ if (core_dc->current_context->res_ctx.pipe_ctx[i].stream - == stream) { - -- pipes = &dc->current_state->res_ctx.pipe_ctx[i]; -- dc->hwss.program_csc_matrix(pipes, -+ pipes = &core_dc->current_context->res_ctx.pipe_ctx[i]; -+ core_dc->hwss.program_csc_matrix(pipes, - stream->output_color_space, - stream->csc_color_matrix.matrix); - ret = true; -@@ -243,6 +245,7 @@ static void set_static_screen_events(struct dc *dc, - int num_streams, - const struct dc_static_screen_events *events) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - int i = 0; - int j = 0; - struct pipe_ctx *pipes_affected[MAX_PIPES]; -@@ -252,44 +255,45 @@ static void set_static_screen_events(struct dc *dc, - struct dc_stream_state *stream = streams[i]; - - for (j = 0; j < MAX_PIPES; j++) { -- if (dc->current_state->res_ctx.pipe_ctx[j].stream -+ if (core_dc->current_context->res_ctx.pipe_ctx[j].stream - == stream) { - pipes_affected[num_pipes_affected++] = -- &dc->current_state->res_ctx.pipe_ctx[j]; -+ &core_dc->current_context->res_ctx.pipe_ctx[j]; - } - } - } - -- dc->hwss.set_static_screen_control(pipes_affected, num_pipes_affected, events); -+ core_dc->hwss.set_static_screen_control(pipes_affected, num_pipes_affected, events); - } - - static void set_drive_settings(struct dc *dc, - struct link_training_settings *lt_settings, - const struct dc_link *link) - { -- -+ struct core_dc *core_dc = DC_TO_CORE(dc); - int i; - -- for (i = 0; i < dc->link_count; i++) { -- if (dc->links[i] == link) -+ for (i = 0; i < core_dc->link_count; i++) { -+ if (core_dc->links[i] == link) - break; - } - -- if (i >= dc->link_count) -+ if (i >= core_dc->link_count) - ASSERT_CRITICAL(false); - -- dc_link_dp_set_drive_settings(dc->links[i], lt_settings); -+ dc_link_dp_set_drive_settings(core_dc->links[i], lt_settings); - } - - static void perform_link_training(struct dc *dc, - struct dc_link_settings *link_setting, - bool skip_video_pattern) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - int i; - -- for (i = 0; i < dc->link_count; i++) -+ for (i = 0; i < core_dc->link_count; i++) - dc_link_dp_perform_link_training( -- dc->links[i], -+ core_dc->links[i], - link_setting, - skip_video_pattern); - } -@@ -334,7 +338,7 @@ void set_dither_option(struct dc_stream_state *stream, - { - struct bit_depth_reduction_params params; - struct dc_link *link = stream->status.link; -- struct pipe_ctx *pipes = link->dc->current_state->res_ctx.pipe_ctx; -+ struct pipe_ctx *pipes = link->dc->current_context->res_ctx.pipe_ctx; - - memset(¶ms, 0, sizeof(params)); - if (!stream) -@@ -365,51 +369,51 @@ void set_dither_option(struct dc_stream_state *stream, - opp_program_bit_depth_reduction(pipes->stream_res.opp, ¶ms); - } - --static void allocate_dc_stream_funcs(struct dc *dc) -+static void allocate_dc_stream_funcs(struct core_dc *core_dc) - { -- if (dc->hwss.set_drr != NULL) { -- dc->stream_funcs.adjust_vmin_vmax = -+ if (core_dc->hwss.set_drr != NULL) { -+ core_dc->public.stream_funcs.adjust_vmin_vmax = - stream_adjust_vmin_vmax; - } - -- dc->stream_funcs.set_static_screen_events = -+ core_dc->public.stream_funcs.set_static_screen_events = - set_static_screen_events; - -- dc->stream_funcs.get_crtc_position = -+ core_dc->public.stream_funcs.get_crtc_position = - stream_get_crtc_position; - -- dc->stream_funcs.set_gamut_remap = -+ core_dc->public.stream_funcs.set_gamut_remap = - set_gamut_remap; - -- dc->stream_funcs.program_csc_matrix = -+ core_dc->public.stream_funcs.program_csc_matrix = - program_csc_matrix; - -- dc->stream_funcs.set_dither_option = -+ core_dc->public.stream_funcs.set_dither_option = - set_dither_option; - -- dc->link_funcs.set_drive_settings = -+ core_dc->public.link_funcs.set_drive_settings = - set_drive_settings; - -- dc->link_funcs.perform_link_training = -+ core_dc->public.link_funcs.perform_link_training = - perform_link_training; - -- dc->link_funcs.set_preferred_link_settings = -+ core_dc->public.link_funcs.set_preferred_link_settings = - set_preferred_link_settings; - -- dc->link_funcs.enable_hpd = -+ core_dc->public.link_funcs.enable_hpd = - enable_hpd; - -- dc->link_funcs.disable_hpd = -+ core_dc->public.link_funcs.disable_hpd = - disable_hpd; - -- dc->link_funcs.set_test_pattern = -+ core_dc->public.link_funcs.set_test_pattern = - set_test_pattern; - } - --static void destruct(struct dc *dc) -+static void destruct(struct core_dc *dc) - { -- dc_release_state(dc->current_state); -- dc->current_state = NULL; -+ dc_release_validate_context(dc->current_context); -+ dc->current_context = NULL; - - destroy_links(dc); - -@@ -429,83 +433,32 @@ static void destruct(struct dc *dc) - - dm_free(dc->ctx); - dc->ctx = NULL; -- -- dm_free(dc->bw_vbios); -- dc->bw_vbios = NULL; -- -- dm_free(dc->bw_dceip); -- dc->bw_dceip = NULL; -- --#ifdef CONFIG_DRM_AMD_DC_DCN1_0 -- dm_free(dc->dcn_soc); -- dc->dcn_soc = NULL; -- -- dm_free(dc->dcn_ip); -- dc->dcn_ip = NULL; -- --#endif - } - --static bool construct(struct dc *dc, -+static bool construct(struct core_dc *dc, - const struct dc_init_data *init_params) - { - struct dal_logger *logger; - struct dc_context *dc_ctx = dm_alloc(sizeof(*dc_ctx)); -- struct bw_calcs_dceip *dc_dceip = dm_alloc(sizeof(*dc_dceip)); -- struct bw_calcs_vbios *dc_vbios = dm_alloc(sizeof(*dc_vbios)); --#ifdef CONFIG_DRM_AMD_DC_DCN1_0 -- struct dcn_soc_bounding_box *dcn_soc = dm_alloc(sizeof(*dcn_soc)); -- struct dcn_ip_params *dcn_ip = dm_alloc(sizeof(*dcn_ip)); --#endif -- - enum dce_version dc_version = DCE_VERSION_UNKNOWN; - -- if (!dc_dceip) { -- dm_error("%s: failed to create dceip\n", __func__); -- goto fail; -- } -- -- dc->bw_dceip = dc_dceip; -- -- if (!dc_vbios) { -- dm_error("%s: failed to create vbios\n", __func__); -- goto fail; -- } -- -- dc->bw_vbios = dc_vbios; --#ifdef CONFIG_DRM_AMD_DC_DCN1_0 -- if (!dcn_soc) { -- dm_error("%s: failed to create dcn_soc\n", __func__); -- goto fail; -- } -- -- dc->dcn_soc = dcn_soc; -- -- if (!dcn_ip) { -- dm_error("%s: failed to create dcn_ip\n", __func__); -- goto fail; -- } -- -- dc->dcn_ip = dcn_ip; --#endif -- - if (!dc_ctx) { - dm_error("%s: failed to create ctx\n", __func__); -- goto fail; -+ goto ctx_fail; - } - -- dc->current_state = dm_alloc(sizeof(*dc->current_state)); -+ dc->current_context = dm_alloc(sizeof(*dc->current_context)); - -- if (!dc->current_state) { -+ if (!dc->current_context) { - dm_error("%s: failed to create validate ctx\n", __func__); -- goto fail; -+ goto val_ctx_fail; - } - -- atomic_inc(&dc->current_state->ref_count); -+ dc->current_context->ref_count++; - - dc_ctx->cgs_device = init_params->cgs_device; - dc_ctx->driver_context = init_params->driver; -- dc_ctx->dc = dc; -+ dc_ctx->dc = &dc->public; - dc_ctx->asic_id = init_params->asic_id; - - /* Create logger */ -@@ -514,7 +467,7 @@ static bool construct(struct dc *dc, - if (!logger) { - /* can *not* call logger. call base driver 'print error' */ - dm_error("%s: failed to create Logger!\n", __func__); -- goto fail; -+ goto logger_fail; - } - dc_ctx->logger = logger; - dc->ctx = dc_ctx; -@@ -542,7 +495,7 @@ static bool construct(struct dc *dc, - - if (!dc_ctx->dc_bios) { - ASSERT_CRITICAL(false); -- goto fail; -+ goto bios_fail; - } - - dc_ctx->created_bios = true; -@@ -553,7 +506,7 @@ static bool construct(struct dc *dc, - - if (!dc_ctx->i2caux) { - ASSERT_CRITICAL(false); -- goto fail; -+ goto failed_to_create_i2caux; - } - - /* Create GPIO service */ -@@ -564,7 +517,7 @@ static bool construct(struct dc *dc, - - if (!dc_ctx->gpio_service) { - ASSERT_CRITICAL(false); -- goto fail; -+ goto gpio_fail; - } - - dc->res_pool = dc_create_resource_pool( -@@ -573,19 +526,24 @@ static bool construct(struct dc *dc, - dc_version, - init_params->asic_id); - if (!dc->res_pool) -- goto fail; -- -- dc_resource_state_construct(dc, dc->current_state); -+ goto create_resource_fail; - - if (!create_links(dc, init_params->num_virtual_links)) -- goto fail; -+ goto create_links_fail; - - allocate_dc_stream_funcs(dc); - - return true; - --fail: -- -+ /**** error handling here ****/ -+create_links_fail: -+create_resource_fail: -+gpio_fail: -+failed_to_create_i2caux: -+bios_fail: -+logger_fail: -+val_ctx_fail: -+ctx_fail: - destruct(dc); - return false; - } -@@ -620,41 +578,41 @@ void ProgramPixelDurationV(unsigned int pixelClockInKHz ) - - struct dc *dc_create(const struct dc_init_data *init_params) - { -- struct dc *dc = dm_alloc(sizeof(*dc)); -+ struct core_dc *core_dc = dm_alloc(sizeof(*core_dc)); - unsigned int full_pipe_count; - -- if (NULL == dc) -+ if (NULL == core_dc) - goto alloc_fail; - -- if (false == construct(dc, init_params)) -+ if (false == construct(core_dc, init_params)) - goto construct_fail; - - /*TODO: separate HW and SW initialization*/ -- dc->hwss.init_hw(dc); -+ core_dc->hwss.init_hw(core_dc); - -- full_pipe_count = dc->res_pool->pipe_count; -- if (dc->res_pool->underlay_pipe_index != NO_UNDERLAY_PIPE) -+ full_pipe_count = core_dc->res_pool->pipe_count; -+ if (core_dc->res_pool->underlay_pipe_index != NO_UNDERLAY_PIPE) - full_pipe_count--; -- dc->caps.max_streams = min( -+ core_dc->public.caps.max_streams = min( - full_pipe_count, -- dc->res_pool->stream_enc_count); -+ core_dc->res_pool->stream_enc_count); - -- dc->caps.max_links = dc->link_count; -- dc->caps.max_audios = dc->res_pool->audio_count; -+ core_dc->public.caps.max_links = core_dc->link_count; -+ core_dc->public.caps.max_audios = core_dc->res_pool->audio_count; - -- dc->config = init_params->flags; -+ core_dc->public.config = init_params->flags; - -- dm_logger_write(dc->ctx->logger, LOG_DC, -+ dm_logger_write(core_dc->ctx->logger, LOG_DC, - "Display Core initialized\n"); - - - /* TODO: missing feature to be enabled */ -- dc->debug.disable_dfs_bypass = true; -+ core_dc->public.debug.disable_dfs_bypass = true; - -- return dc; -+ return &core_dc->public; - - construct_fail: -- dm_free(dc); -+ dm_free(core_dc); - - alloc_fail: - return NULL; -@@ -662,37 +620,178 @@ struct dc *dc_create(const struct dc_init_data *init_params) - - void dc_destroy(struct dc **dc) - { -- destruct(*dc); -- dm_free(*dc); -+ struct core_dc *core_dc = DC_TO_CORE(*dc); -+ destruct(core_dc); -+ dm_free(core_dc); - *dc = NULL; - } - -+static bool is_validation_required( -+ const struct core_dc *dc, -+ const struct dc_validation_set set[], -+ int set_count) -+{ -+ const struct validate_context *context = dc->current_context; -+ int i, j; -+ -+ if (context->stream_count != set_count) -+ return true; -+ -+ for (i = 0; i < set_count; i++) { -+ -+ if (set[i].plane_count != context->stream_status[i].plane_count) -+ return true; -+ if (!dc_is_stream_unchanged(set[i].stream, context->streams[i])) -+ return true; -+ -+ for (j = 0; j < set[i].plane_count; j++) { -+ struct dc_plane_state temp_plane; -+ memset(&temp_plane, 0, sizeof(temp_plane)); -+ -+ temp_plane = *context->stream_status[i].plane_states[j]; -+ temp_plane.clip_rect = set[i].plane_states[j]->clip_rect; -+ temp_plane.dst_rect.x = set[i].plane_states[j]->dst_rect.x; -+ temp_plane.dst_rect.y = set[i].plane_states[j]->dst_rect.y; -+ -+ if (memcmp(&temp_plane, set[i].plane_states[j], sizeof(temp_plane)) != 0) -+ return true; -+ } -+ } -+ -+ return false; -+} -+ -+static bool validate_streams ( -+ const struct dc *dc, -+ const struct dc_validation_set set[], -+ int set_count) -+{ -+ int i; -+ -+ for (i = 0; i < set_count; i++) -+ if (!dc_validate_stream(dc, set[i].stream)) -+ return false; -+ -+ return true; -+} -+ -+static bool validate_surfaces( -+ const struct dc *dc, -+ const struct dc_validation_set set[], -+ int set_count) -+{ -+ int i, j; -+ -+ for (i = 0; i < set_count; i++) -+ for (j = 0; j < set[i].plane_count; j++) -+ if (!dc_validate_plane(dc, set[i].plane_states[j])) -+ return false; -+ -+ return true; -+} -+ -+struct validate_context *dc_get_validate_context( -+ const struct dc *dc, -+ const struct dc_validation_set set[], -+ uint8_t set_count) -+{ -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ enum dc_status result = DC_ERROR_UNEXPECTED; -+ struct validate_context *context; -+ -+ -+ context = dm_alloc(sizeof(struct validate_context)); -+ if (context == NULL) -+ goto context_alloc_fail; -+ -+ ++context->ref_count; -+ -+ if (!is_validation_required(core_dc, set, set_count)) { -+ dc_resource_validate_ctx_copy_construct(core_dc->current_context, context); -+ return context; -+ } -+ -+ result = core_dc->res_pool->funcs->validate_with_context( -+ core_dc, set, set_count, context, core_dc->current_context); -+ -+context_alloc_fail: -+ if (result != DC_OK) { -+ dm_logger_write(core_dc->ctx->logger, LOG_WARNING, -+ "%s:resource validation failed, dc_status:%d\n", -+ __func__, -+ result); -+ -+ dc_release_validate_context(context); -+ context = NULL; -+ } -+ -+ return context; -+ -+} -+ -+bool dc_validate_resources( -+ const struct dc *dc, -+ const struct dc_validation_set set[], -+ uint8_t set_count) -+{ -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ enum dc_status result = DC_ERROR_UNEXPECTED; -+ struct validate_context *context; -+ -+ if (!validate_streams(dc, set, set_count)) -+ return false; -+ -+ if (!validate_surfaces(dc, set, set_count)) -+ return false; -+ -+ context = dm_alloc(sizeof(struct validate_context)); -+ if (context == NULL) -+ goto context_alloc_fail; -+ -+ ++context->ref_count; -+ -+ result = core_dc->res_pool->funcs->validate_with_context( -+ core_dc, set, set_count, context, NULL); -+ -+context_alloc_fail: -+ if (result != DC_OK) { -+ dm_logger_write(core_dc->ctx->logger, LOG_WARNING, -+ "%s:resource validation failed, dc_status:%d\n", -+ __func__, -+ result); -+ } -+ -+ dc_release_validate_context(context); -+ context = NULL; -+ -+ return result == DC_OK; -+} -+ - bool dc_validate_guaranteed( -- struct dc *dc, -+ const struct dc *dc, - struct dc_stream_state *stream) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - enum dc_status result = DC_ERROR_UNEXPECTED; -- struct dc_state *context; -+ struct validate_context *context; - - if (!dc_validate_stream(dc, stream)) - return false; - -- context = dm_alloc(sizeof(struct dc_state)); -+ context = dm_alloc(sizeof(struct validate_context)); - if (context == NULL) - goto context_alloc_fail; - -- dc_resource_state_construct(dc, dc->current_state); -+ ++context->ref_count; - -- atomic_inc(&context->ref_count); -+ result = core_dc->res_pool->funcs->validate_guaranteed( -+ core_dc, stream, context); - -- result = dc->res_pool->funcs->validate_guaranteed( -- dc, stream, context); -- -- dc_release_state(context); -+ dc_release_validate_context(context); - - context_alloc_fail: - if (result != DC_OK) { -- dm_logger_write(dc->ctx->logger, LOG_WARNING, -+ dm_logger_write(core_dc->ctx->logger, LOG_WARNING, - "%s:guaranteed validation failed, dc_status:%d\n", - __func__, - result); -@@ -702,12 +801,12 @@ bool dc_validate_guaranteed( - } - - static void program_timing_sync( -- struct dc *dc, -- struct dc_state *ctx) -+ struct core_dc *core_dc, -+ struct validate_context *ctx) - { - int i, j; - int group_index = 0; -- int pipe_count = dc->res_pool->pipe_count; -+ int pipe_count = core_dc->res_pool->pipe_count; - struct pipe_ctx *unsynced_pipes[MAX_PIPES] = { NULL }; - - for (i = 0; i < pipe_count; i++) { -@@ -768,24 +867,42 @@ static void program_timing_sync( - } - - if (group_size > 1) { -- dc->hwss.enable_timing_synchronization( -- dc, group_index, group_size, pipe_set); -+ core_dc->hwss.enable_timing_synchronization( -+ core_dc, group_index, group_size, pipe_set); - group_index++; - } - } - } - - static bool context_changed( -- struct dc *dc, -- struct dc_state *context) -+ struct core_dc *dc, -+ struct validate_context *context) -+{ -+ uint8_t i; -+ -+ if (context->stream_count != dc->current_context->stream_count) -+ return true; -+ -+ for (i = 0; i < dc->current_context->stream_count; i++) { -+ if (dc->current_context->streams[i] != context->streams[i]) -+ return true; -+ } -+ -+ return false; -+} -+ -+static bool streams_changed( -+ struct core_dc *dc, -+ struct dc_stream_state *streams[], -+ uint8_t stream_count) - { - uint8_t i; - -- if (context->stream_count != dc->current_state->stream_count) -+ if (stream_count != dc->current_context->stream_count) - return true; - -- for (i = 0; i < dc->current_state->stream_count; i++) { -- if (dc->current_state->streams[i] != context->streams[i]) -+ for (i = 0; i < dc->current_context->stream_count; i++) { -+ if (dc->current_context->streams[i] != streams[i]) - return true; - } - -@@ -794,26 +911,38 @@ static bool context_changed( - - bool dc_enable_stereo( - struct dc *dc, -- struct dc_state *context, -+ struct validate_context *context, - struct dc_stream_state *streams[], - uint8_t stream_count) - { - bool ret = true; - int i, j; - struct pipe_ctx *pipe; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ -+#ifdef ENABLE_FBC -+ struct compressor *fbc_compressor = core_dc->fbc_compressor; -+#endif - - for (i = 0; i < MAX_PIPES; i++) { - if (context != NULL) - pipe = &context->res_ctx.pipe_ctx[i]; - else -- pipe = &dc->current_state->res_ctx.pipe_ctx[i]; -+ pipe = &core_dc->current_context->res_ctx.pipe_ctx[i]; - for (j = 0 ; pipe && j < stream_count; j++) { - if (streams[j] && streams[j] == pipe->stream && -- dc->hwss.setup_stereo) -- dc->hwss.setup_stereo(pipe, dc); -+ core_dc->hwss.setup_stereo) -+ core_dc->hwss.setup_stereo(pipe, core_dc); - } - } - -+#ifdef ENABLE_FBC -+ if (fbc_compressor != NULL && -+ fbc_compressor->funcs->is_fbc_enabled_in_hw(core_dc->fbc_compressor, -+ NULL)) -+ fbc_compressor->funcs->disable_fbc(fbc_compressor); -+ -+#endif - return ret; - } - -@@ -822,9 +951,10 @@ bool dc_enable_stereo( - * Applies given context to HW and copy it into current context. - * It's up to the user to release the src context afterwards. - */ --static bool dc_commit_state_no_check(struct dc *dc, struct dc_state *context) -+static bool dc_commit_context_no_check(struct dc *dc, struct validate_context *context) - { -- struct dc_bios *dcb = dc->ctx->dc_bios; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ struct dc_bios *dcb = core_dc->ctx->dc_bios; - enum dc_status result = DC_ERROR_UNEXPECTED; - struct pipe_ctx *pipe; - int i, j, k, l; -@@ -834,24 +964,22 @@ static bool dc_commit_state_no_check(struct dc *dc, struct dc_state *context) - dc_streams[i] = context->streams[i]; - - if (!dcb->funcs->is_accelerated_mode(dcb)) -- dc->hwss.enable_accelerated_mode(dc); -- -- dc->hwss.ready_shared_resources(dc); -+ core_dc->hwss.enable_accelerated_mode(core_dc); - -- for (i = 0; i < dc->res_pool->pipe_count; i++) { -+ for (i = 0; i < core_dc->res_pool->pipe_count; i++) { - pipe = &context->res_ctx.pipe_ctx[i]; -- dc->hwss.wait_for_mpcc_disconnect(dc, dc->res_pool, pipe); -+ core_dc->hwss.wait_for_mpcc_disconnect(core_dc, core_dc->res_pool, pipe); - } -- result = dc->hwss.apply_ctx_to_hw(dc, context); -+ result = core_dc->hwss.apply_ctx_to_hw(core_dc, context); - -- program_timing_sync(dc, context); -+ program_timing_sync(core_dc, context); - - for (i = 0; i < context->stream_count; i++) { - const struct dc_sink *sink = context->streams[i]->sink; - - for (j = 0; j < context->stream_status[i].plane_count; j++) { -- dc->hwss.apply_ctx_for_surface( -- dc, context->streams[i], -+ core_dc->hwss.apply_ctx_for_surface( -+ core_dc, context->streams[i], - context->stream_status[i].plane_count, - context); - -@@ -865,8 +993,8 @@ static bool dc_commit_state_no_check(struct dc *dc, struct dc_state *context) - for (l = 0 ; pipe && l < context->stream_count; l++) { - if (context->streams[l] && - context->streams[l] == pipe->stream && -- dc->hwss.setup_stereo) -- dc->hwss.setup_stereo(pipe, dc); -+ core_dc->hwss.setup_stereo) -+ core_dc->hwss.setup_stereo(pipe, core_dc); - } - } - } -@@ -881,59 +1009,127 @@ static bool dc_commit_state_no_check(struct dc *dc, struct dc_state *context) - - dc_enable_stereo(dc, context, dc_streams, context->stream_count); - -- dc_release_state(dc->current_state); -- -- dc->current_state = context; -+ dc_release_validate_context(core_dc->current_context); - -- dc_retain_state(dc->current_state); -+ core_dc->current_context = context; - -- dc->hwss.optimize_shared_resources(dc); -+ dc_retain_validate_context(core_dc->current_context); - - return (result == DC_OK); - } - --bool dc_commit_state(struct dc *dc, struct dc_state *context) -+bool dc_commit_context(struct dc *dc, struct validate_context *context) - { - enum dc_status result = DC_ERROR_UNEXPECTED; -+ struct core_dc *core_dc = DC_TO_CORE(dc); - int i; - -- if (false == context_changed(dc, context)) -+ if (false == context_changed(core_dc, context)) - return DC_OK; - -- dm_logger_write(dc->ctx->logger, LOG_DC, "%s: %d streams\n", -+ dm_logger_write(core_dc->ctx->logger, LOG_DC, "%s: %d streams\n", - __func__, context->stream_count); - - for (i = 0; i < context->stream_count; i++) { - struct dc_stream_state *stream = context->streams[i]; - - dc_stream_log(stream, -- dc->ctx->logger, -+ core_dc->ctx->logger, - LOG_DC); - } - -- result = dc_commit_state_no_check(dc, context); -+ result = dc_commit_context_no_check(dc, context); - - return (result == DC_OK); - } - - -+bool dc_commit_streams( -+ struct dc *dc, -+ struct dc_stream_state *streams[], -+ uint8_t stream_count) -+{ -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ enum dc_status result = DC_ERROR_UNEXPECTED; -+ struct validate_context *context; -+ struct dc_validation_set set[MAX_STREAMS] = { {0, {0} } }; -+ int i; -+ -+ if (false == streams_changed(core_dc, streams, stream_count)) -+ return DC_OK; -+ -+ dm_logger_write(core_dc->ctx->logger, LOG_DC, "%s: %d streams\n", -+ __func__, stream_count); -+ -+ for (i = 0; i < stream_count; i++) { -+ struct dc_stream_state *stream = streams[i]; -+ struct dc_stream_status *status = dc_stream_get_status(stream); -+ int j; -+ -+ dc_stream_log(stream, -+ core_dc->ctx->logger, -+ LOG_DC); -+ -+ set[i].stream = stream; -+ -+ if (status) { -+ set[i].plane_count = status->plane_count; -+ for (j = 0; j < status->plane_count; j++) -+ set[i].plane_states[j] = status->plane_states[j]; -+ } -+ -+ } -+ -+ if (!validate_streams(dc, set, stream_count)) -+ return false; -+ -+ if (!validate_surfaces(dc, set, stream_count)) -+ return false; -+ -+ context = dm_alloc(sizeof(struct validate_context)); -+ if (context == NULL) -+ goto context_alloc_fail; -+ -+ ++context->ref_count; -+ -+ result = core_dc->res_pool->funcs->validate_with_context( -+ core_dc, set, stream_count, context, core_dc->current_context); -+ if (result != DC_OK){ -+ dm_logger_write(core_dc->ctx->logger, LOG_ERROR, -+ "%s: Context validation failed! dc_status:%d\n", -+ __func__, -+ result); -+ BREAK_TO_DEBUGGER(); -+ goto fail; -+ } -+ -+ result = dc_commit_context_no_check(dc, context); -+ -+fail: -+ dc_release_validate_context(context); -+ -+context_alloc_fail: -+ return (result == DC_OK); -+} -+ - bool dc_post_update_surfaces_to_stream(struct dc *dc) - { - int i; -- struct dc_state *context = dc->current_state; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ struct validate_context *context = core_dc->current_context; - - post_surface_trace(dc); - -- for (i = 0; i < dc->res_pool->pipe_count; i++) -+ for (i = 0; i < core_dc->res_pool->pipe_count; i++) - if (context->res_ctx.pipe_ctx[i].stream == NULL - || context->res_ctx.pipe_ctx[i].plane_state == NULL) -- dc->hwss.power_down_front_end(dc, i); -+ core_dc->hwss.power_down_front_end(core_dc, i); - - /* 3rd param should be true, temp w/a for RV*/ - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) -- dc->hwss.set_bandwidth(dc, context, dc->ctx->dce_version < DCN_VERSION_1_0); -+ core_dc->hwss.set_bandwidth(core_dc, context, core_dc->ctx->dce_version < DCN_VERSION_1_0); - #else -- dc->hwss.set_bandwidth(dc, context, true); -+ core_dc->hwss.set_bandwidth(core_dc, context, true); - #endif - return true; - } -@@ -1005,25 +1201,25 @@ bool dc_commit_planes_to_stream( - return true; - } - --void dc_retain_state(struct dc_state *context) -+void dc_retain_validate_context(struct validate_context *context) - { -- ASSERT(atomic_read(&context->ref_count) > 0); -- atomic_inc(&context->ref_count); -+ ASSERT(context->ref_count > 0); -+ ++context->ref_count; - } - --void dc_release_state(struct dc_state *context) -+void dc_release_validate_context(struct validate_context *context) - { -- ASSERT(atomic_read(&context->ref_count) > 0); -- atomic_dec(&context->ref_count); -+ ASSERT(context->ref_count > 0); -+ --context->ref_count; - -- if (atomic_read(&context->ref_count) == 0) { -- dc_resource_state_destruct(context); -+ if (context->ref_count == 0) { -+ dc_resource_validate_ctx_destruct(context); - dm_free(context); - } - } - - static bool is_surface_in_context( -- const struct dc_state *context, -+ const struct validate_context *context, - const struct dc_plane_state *plane_state) - { - int j; -@@ -1136,11 +1332,11 @@ static enum surface_update_type get_scaling_info_update_type( - } - - static enum surface_update_type det_surface_update( -- const struct dc *dc, -+ const struct core_dc *dc, - const struct dc_surface_update *u, - int surface_index) - { -- const struct dc_state *context = dc->current_state; -+ const struct validate_context *context = dc->current_context; - enum surface_update_type type = UPDATE_TYPE_FAST; - enum surface_update_type overall_type = UPDATE_TYPE_FAST; - -@@ -1171,6 +1367,7 @@ enum surface_update_type dc_check_update_surfaces_for_stream( - struct dc_stream_update *stream_update, - const struct dc_stream_status *stream_status) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - int i; - enum surface_update_type overall_type = UPDATE_TYPE_FAST; - -@@ -1182,7 +1379,7 @@ enum surface_update_type dc_check_update_surfaces_for_stream( - - for (i = 0 ; i < surface_count; i++) { - enum surface_update_type type = -- det_surface_update(dc, &updates[i], i); -+ det_surface_update(core_dc, &updates[i], i); - - if (type == UPDATE_TYPE_FULL) - return type; -@@ -1195,7 +1392,7 @@ enum surface_update_type dc_check_update_surfaces_for_stream( - } - - static struct dc_stream_status *stream_get_status( -- struct dc_state *ctx, -+ struct validate_context *ctx, - struct dc_stream_state *stream) - { - uint8_t i; -@@ -1216,11 +1413,12 @@ void dc_update_planes_and_stream(struct dc *dc, - struct dc_stream_state *stream, - struct dc_stream_update *stream_update) - { -- struct dc_state *context; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ struct validate_context *context; - int i, j; - enum surface_update_type update_type; - const struct dc_stream_status *stream_status; -- struct dc_context *dc_ctx = dc->ctx; -+ struct dc_context *dc_ctx = core_dc->ctx; - - stream_status = dc_stream_get_status(stream); - -@@ -1234,7 +1432,7 @@ void dc_update_planes_and_stream(struct dc *dc, - ASSERT(0); - } - #endif -- context = dc->current_state; -+ context = core_dc->current_context; - - /* update current stream with the new updates */ - if (stream_update) { -@@ -1287,21 +1485,15 @@ void dc_update_planes_and_stream(struct dc *dc, - if (context == NULL) - goto context_alloc_fail; - -- atomic_inc(&context->ref_count); -+ ++context->ref_count; - -- dc_resource_state_copy_construct( -- dc->current_state, context); -- -- /*remove old surfaces from context */ -- if (!dc_rem_all_planes_for_stream(dc, stream, context)) { -- -- BREAK_TO_DEBUGGER(); -- goto fail; -- } -+ dc_resource_validate_ctx_copy_construct( -+ core_dc->current_context, context); - - /* add surface to context */ -- if (!dc_add_all_planes_for_stream(dc, stream, new_planes, surface_count, context)) { -- -+ if (!resource_attach_surfaces_to_context( -+ new_planes, surface_count, stream, -+ context, core_dc->res_pool)) { - BREAK_TO_DEBUGGER(); - goto fail; - } -@@ -1352,7 +1544,7 @@ void dc_update_planes_and_stream(struct dc *dc, - } - - if (update_type >= UPDATE_TYPE_MED) { -- for (j = 0; j < dc->res_pool->pipe_count; j++) { -+ for (j = 0; j < core_dc->res_pool->pipe_count; j++) { - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; - - if (pipe_ctx->plane_state != surface) -@@ -1390,31 +1582,31 @@ void dc_update_planes_and_stream(struct dc *dc, - } - - if (update_type == UPDATE_TYPE_FULL) { -- if (!dc->res_pool->funcs->validate_bandwidth(dc, context)) { -+ if (!core_dc->res_pool->funcs->validate_bandwidth(core_dc, context)) { - BREAK_TO_DEBUGGER(); - goto fail; - } else { -- dc->hwss.set_bandwidth(dc, context, false); -+ core_dc->hwss.set_bandwidth(core_dc, context, false); - context_clock_trace(dc, context); - } - } - - if (update_type > UPDATE_TYPE_FAST) { -- for (j = 0; j < dc->res_pool->pipe_count; j++) { -+ for (j = 0; j < core_dc->res_pool->pipe_count; j++) { - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; - -- dc->hwss.wait_for_mpcc_disconnect(dc, dc->res_pool, pipe_ctx); -+ core_dc->hwss.wait_for_mpcc_disconnect(core_dc, core_dc->res_pool, pipe_ctx); - } - } - - if (surface_count == 0) -- dc->hwss.apply_ctx_for_surface(dc, stream, surface_count, context); -+ core_dc->hwss.apply_ctx_for_surface(core_dc, stream, surface_count, context); - - /* Lock pipes for provided surfaces, or all active if full update*/ - for (i = 0; i < surface_count; i++) { - struct dc_plane_state *plane_state = srf_updates[i].surface; - -- for (j = 0; j < dc->res_pool->pipe_count; j++) { -+ for (j = 0; j < core_dc->res_pool->pipe_count; j++) { - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; - - if (update_type != UPDATE_TYPE_FULL && pipe_ctx->plane_state != plane_state) -@@ -1422,8 +1614,8 @@ void dc_update_planes_and_stream(struct dc *dc, - if (!pipe_ctx->plane_state || pipe_ctx->top_pipe) - continue; - -- dc->hwss.pipe_control_lock( -- dc, -+ core_dc->hwss.pipe_control_lock( -+ core_dc, - pipe_ctx, - true); - } -@@ -1432,9 +1624,9 @@ void dc_update_planes_and_stream(struct dc *dc, - } - - /* Full fe update*/ -- for (j = 0; j < dc->res_pool->pipe_count; j++) { -+ for (j = 0; j < core_dc->res_pool->pipe_count; j++) { - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; -- struct pipe_ctx *cur_pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[j]; -+ struct pipe_ctx *cur_pipe_ctx = &core_dc->current_context->res_ctx.pipe_ctx[j]; - bool is_new_pipe_surface = cur_pipe_ctx->plane_state != pipe_ctx->plane_state; - struct dc_cursor_position position = { 0 }; - -@@ -1445,18 +1637,18 @@ void dc_update_planes_and_stream(struct dc *dc, - if (!pipe_ctx->top_pipe && pipe_ctx->stream) { - struct dc_stream_status *stream_status = stream_get_status(context, pipe_ctx->stream); - -- dc->hwss.apply_ctx_for_surface( -- dc, pipe_ctx->stream, stream_status->plane_count, context); -+ core_dc->hwss.apply_ctx_for_surface( -+ core_dc, pipe_ctx->stream, stream_status->plane_count, context); - } - - /* TODO: this is a hack w/a for switching from mpo to pipe split */ - dc_stream_set_cursor_position(pipe_ctx->stream, &position); - - if (is_new_pipe_surface) { -- dc->hwss.update_plane_addr(dc, pipe_ctx); -- dc->hwss.set_input_transfer_func( -+ core_dc->hwss.update_plane_addr(core_dc, pipe_ctx); -+ core_dc->hwss.set_input_transfer_func( - pipe_ctx, pipe_ctx->plane_state); -- dc->hwss.set_output_transfer_func( -+ core_dc->hwss.set_output_transfer_func( - pipe_ctx, pipe_ctx->stream); - } - } -@@ -1469,40 +1661,40 @@ void dc_update_planes_and_stream(struct dc *dc, - struct dc_plane_state *plane_state = srf_updates[i].surface; - - if (update_type == UPDATE_TYPE_MED) -- dc->hwss.apply_ctx_for_surface( -- dc, stream, surface_count, context); -+ core_dc->hwss.apply_ctx_for_surface( -+ core_dc, stream, surface_count, context); - -- for (j = 0; j < dc->res_pool->pipe_count; j++) { -+ for (j = 0; j < core_dc->res_pool->pipe_count; j++) { - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; - - if (pipe_ctx->plane_state != plane_state) - continue; - - if (srf_updates[i].flip_addr) -- dc->hwss.update_plane_addr(dc, pipe_ctx); -+ core_dc->hwss.update_plane_addr(core_dc, pipe_ctx); - - if (update_type == UPDATE_TYPE_FAST) - continue; - - if (srf_updates[i].in_transfer_func) -- dc->hwss.set_input_transfer_func( -+ core_dc->hwss.set_input_transfer_func( - pipe_ctx, pipe_ctx->plane_state); - - if (stream_update != NULL && - stream_update->out_transfer_func != NULL) { -- dc->hwss.set_output_transfer_func( -+ core_dc->hwss.set_output_transfer_func( - pipe_ctx, pipe_ctx->stream); - } - - if (srf_updates[i].hdr_static_metadata) { - resource_build_info_frame(pipe_ctx); -- dc->hwss.update_info_frame(pipe_ctx); -+ core_dc->hwss.update_info_frame(pipe_ctx); - } - } - } - - /* Unlock pipes */ -- for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) { -+ for (i = core_dc->res_pool->pipe_count - 1; i >= 0; i--) { - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; - - for (j = 0; j < surface_count; j++) { -@@ -1512,8 +1704,8 @@ void dc_update_planes_and_stream(struct dc *dc, - if (!pipe_ctx->plane_state || pipe_ctx->top_pipe) - continue; - -- dc->hwss.pipe_control_lock( -- dc, -+ core_dc->hwss.pipe_control_lock( -+ core_dc, - pipe_ctx, - false); - -@@ -1521,72 +1713,60 @@ void dc_update_planes_and_stream(struct dc *dc, - } - } - -- if (dc->current_state != context) { -- -- /* Since memory free requires elevated IRQL, an interrupt -- * request is generated by mem free. If this happens -- * between freeing and reassigning the context, our vsync -- * interrupt will call into dc and cause a memory -- * corruption BSOD. Hence, we first reassign the context, -- * then free the old context. -- */ -- -- struct dc_state *old = dc->current_state; -+ if (core_dc->current_context != context) { -+ struct validate_context *old = core_dc->current_context; - -- dc->current_state = context; -- dc_release_state(old); -+ core_dc->current_context = context; -+ dc_release_validate_context(old); - - } - return; - - fail: -- dc_release_state(context); -+ dc_release_validate_context(context); - - context_alloc_fail: - DC_ERROR("Failed to allocate new validate context!\n"); - } - --uint8_t dc_get_current_stream_count(struct dc *dc) -+uint8_t dc_get_current_stream_count(const struct dc *dc) - { -- return dc->current_state->stream_count; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ return core_dc->current_context->stream_count; - } - --struct dc_stream_state *dc_get_stream_at_index(struct dc *dc, uint8_t i) -+struct dc_stream_state *dc_get_stream_at_index(const struct dc *dc, uint8_t i) - { -- if (i < dc->current_state->stream_count) -- return dc->current_state->streams[i]; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ if (i < core_dc->current_context->stream_count) -+ return core_dc->current_context->streams[i]; - return NULL; - } - --struct dc_link *dc_get_link_at_index(struct dc *dc, uint32_t link_index) --{ -- return dc->links[link_index]; --} -- --struct dwbc *dc_get_dwb_at_pipe(struct dc *dc, uint32_t pipe) -+struct dc_link *dc_get_link_at_index(const struct dc *dc, uint32_t link_index) - { -- if ((pipe >= dwb_pipe0) && (pipe < dwb_pipe_max_num)) { -- return dc->res_pool->dwbc[(int)pipe]; -- } else { -- return NULL; -- } -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ return core_dc->links[link_index]; - } - - const struct graphics_object_id dc_get_link_id_at_index( - struct dc *dc, uint32_t link_index) - { -- return dc->links[link_index]->link_id; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ return core_dc->links[link_index]->link_id; - } - - enum dc_irq_source dc_get_hpd_irq_source_at_index( - struct dc *dc, uint32_t link_index) - { -- return dc->links[link_index]->irq_source_hpd; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ return core_dc->links[link_index]->irq_source_hpd; - } - - const struct audio **dc_get_audios(struct dc *dc) - { -- return (const struct audio **)dc->res_pool->audios; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ return (const struct audio **)core_dc->res_pool->audios; - } - - void dc_flip_plane_addrs( -@@ -1595,7 +1775,7 @@ void dc_flip_plane_addrs( - struct dc_flip_addrs flip_addrs[], - uint32_t count) - { -- struct dc *core_dc = dc; -+ struct core_dc *core_dc = DC_TO_CORE(dc); - int i, j; - - for (i = 0; i < count; i++) { -@@ -1620,21 +1800,25 @@ enum dc_irq_source dc_interrupt_to_irq_source( - uint32_t src_id, - uint32_t ext_id) - { -- return dal_irq_service_to_irq_source(dc->res_pool->irqs, src_id, ext_id); -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ return dal_irq_service_to_irq_source(core_dc->res_pool->irqs, src_id, ext_id); - } - --void dc_interrupt_set(struct dc *dc, enum dc_irq_source src, bool enable) -+void dc_interrupt_set(const struct dc *dc, enum dc_irq_source src, bool enable) - { -+ struct core_dc *core_dc; - - if (dc == NULL) - return; -+ core_dc = DC_TO_CORE(dc); - -- dal_irq_service_set(dc->res_pool->irqs, src, enable); -+ dal_irq_service_set(core_dc->res_pool->irqs, src, enable); - } - - void dc_interrupt_ack(struct dc *dc, enum dc_irq_source src) - { -- dal_irq_service_ack(dc->res_pool->irqs, src); -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ dal_irq_service_ack(core_dc->res_pool->irqs, src); - } - - void dc_set_power_state( -@@ -1642,22 +1826,21 @@ void dc_set_power_state( - enum dc_acpi_cm_power_state power_state, - enum dc_video_power_state video_power_state) - { -- atomic_t ref_count; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ int ref_count; - - core_dc->previous_power_state = core_dc->current_power_state; - core_dc->current_power_state = video_power_state; - - switch (power_state) { - case DC_ACPI_CM_POWER_STATE_D0: -- dc_resource_state_construct(dc, dc->current_state); -- -- dc->hwss.init_hw(dc); -+ core_dc->hwss.init_hw(core_dc); - break; - default: - /* NULL means "reset/release all DC streams" */ - dc_commit_streams(dc, NULL, 0); - -- dc->hwss.power_down(dc); -+ core_dc->hwss.power_down(core_dc); - - /* Zero out the current context so that on resume we start with - * clean state, and dc hw programming optimizations will not -@@ -1665,25 +1848,25 @@ void dc_set_power_state( - */ - - /* Preserve refcount */ -- ref_count = dc->current_state->ref_count; -- dc_resource_state_destruct(dc->current_state); -- memset(dc->current_state, 0, -- sizeof(*dc->current_state)); -- -- dc->current_state->ref_count = ref_count; -+ ref_count = core_dc->current_context->ref_count; -+ dc_resource_validate_ctx_destruct(core_dc->current_context); -+ memset(core_dc->current_context, 0, -+ sizeof(*core_dc->current_context)); -+ core_dc->current_context->ref_count = ref_count; - - break; - } - - } - --void dc_resume(struct dc *dc) -+void dc_resume(const struct dc *dc) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - - uint32_t i; - -- for (i = 0; i < dc->link_count; i++) -- core_link_resume(dc->links[i]); -+ for (i = 0; i < core_dc->link_count; i++) -+ core_link_resume(core_dc->links[i]); - } - - bool dc_read_aux_dpcd( -@@ -1693,8 +1876,9 @@ bool dc_read_aux_dpcd( - uint8_t *data, - uint32_t size) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - -- struct dc_link *link = dc->links[link_index]; -+ struct dc_link *link = core_dc->links[link_index]; - enum ddc_result r = dal_ddc_service_read_dpcd_data( - link->ddc, - false, -@@ -1712,7 +1896,8 @@ bool dc_write_aux_dpcd( - const uint8_t *data, - uint32_t size) - { -- struct dc_link *link = dc->links[link_index]; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ struct dc_link *link = core_dc->links[link_index]; - - enum ddc_result r = dal_ddc_service_write_dpcd_data( - link->ddc, -@@ -1732,8 +1917,9 @@ bool dc_read_aux_i2c( - uint8_t *data, - uint32_t size) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - -- struct dc_link *link = dc->links[link_index]; -+ struct dc_link *link = core_dc->links[link_index]; - enum ddc_result r = dal_ddc_service_read_dpcd_data( - link->ddc, - true, -@@ -1752,7 +1938,8 @@ bool dc_write_aux_i2c( - const uint8_t *data, - uint32_t size) - { -- struct dc_link *link = dc->links[link_index]; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ struct dc_link *link = core_dc->links[link_index]; - - enum ddc_result r = dal_ddc_service_write_dpcd_data( - link->ddc, -@@ -1773,8 +1960,9 @@ bool dc_query_ddc_data( - uint8_t *read_buf, - uint32_t read_size) { - -+ struct core_dc *core_dc = DC_TO_CORE(dc); - -- struct dc_link *link = dc->links[link_index]; -+ struct dc_link *link = core_dc->links[link_index]; - - bool result = dal_ddc_service_query_ddc_data( - link->ddc, -@@ -1792,8 +1980,9 @@ bool dc_submit_i2c( - uint32_t link_index, - struct i2c_command *cmd) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - -- struct dc_link *link = dc->links[link_index]; -+ struct dc_link *link = core_dc->links[link_index]; - struct ddc_service *ddc = link->ddc; - - return dal_i2caux_submit_i2c_command( -@@ -1910,11 +2099,12 @@ void dc_link_remove_remote_sink(struct dc_link *link, struct dc_sink *sink) - bool dc_init_dchub(struct dc *dc, struct dchub_init_data *dh_data) - { - int i; -+ struct core_dc *core_dc = DC_TO_CORE(dc); - struct mem_input *mi = NULL; - -- for (i = 0; i < dc->res_pool->pipe_count; i++) { -- if (dc->res_pool->mis[i] != NULL) { -- mi = dc->res_pool->mis[i]; -+ for (i = 0; i < core_dc->res_pool->pipe_count; i++) { -+ if (core_dc->res_pool->mis[i] != NULL) { -+ mi = core_dc->res_pool->mis[i]; - break; - } - } -@@ -1923,10 +2113,10 @@ bool dc_init_dchub(struct dc *dc, struct dchub_init_data *dh_data) - return false; - } - -- if (dc->hwss.update_dchub) -- dc->hwss.update_dchub(dc->hwseq, dh_data); -+ if (core_dc->hwss.update_dchub) -+ core_dc->hwss.update_dchub(core_dc->hwseq, dh_data); - else -- ASSERT(dc->hwss.update_dchub); -+ ASSERT(core_dc->hwss.update_dchub); - - - return true; -@@ -1935,8 +2125,9 @@ bool dc_init_dchub(struct dc *dc, struct dchub_init_data *dh_data) - - void dc_log_hw_state(struct dc *dc) - { -+ struct core_dc *core_dc = DC_TO_CORE(dc); - -- if (dc->hwss.log_hw_state) -- dc->hwss.log_hw_state(dc); -+ if (core_dc->hwss.log_hw_state) -+ core_dc->hwss.log_hw_state(core_dc); - } - -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_debug.c b/drivers/gpu/drm/amd/display/dc/core/dc_debug.c -index 6acee54..21af3bc 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_debug.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_debug.c -@@ -37,12 +37,12 @@ - } while (0) - - void pre_surface_trace( -- struct dc *dc, -+ const struct dc *dc, - const struct dc_plane_state *const *plane_states, - int surface_count) - { - int i; -- struct dc *core_dc = dc; -+ struct core_dc *core_dc = DC_TO_CORE(dc); - struct dal_logger *logger = core_dc->ctx->logger; - - for (i = 0; i < surface_count; i++) { -@@ -158,12 +158,12 @@ void pre_surface_trace( - } - - void update_surface_trace( -- struct dc *dc, -+ const struct dc *dc, - const struct dc_surface_update *updates, - int surface_count) - { - int i; -- struct dc *core_dc = dc; -+ struct core_dc *core_dc = DC_TO_CORE(dc); - struct dal_logger *logger = core_dc->ctx->logger; - - for (i = 0; i < surface_count; i++) { -@@ -279,9 +279,9 @@ void update_surface_trace( - SURFACE_TRACE("\n"); - } - --void post_surface_trace(struct dc *dc) -+void post_surface_trace(const struct dc *dc) - { -- struct dc *core_dc = dc; -+ struct core_dc *core_dc = DC_TO_CORE(dc); - struct dal_logger *logger = core_dc->ctx->logger; - - SURFACE_TRACE("post surface process.\n"); -@@ -289,11 +289,11 @@ void post_surface_trace(struct dc *dc) - } - - void context_timing_trace( -- struct dc *dc, -+ const struct dc *dc, - struct resource_context *res_ctx) - { - int i; -- struct dc *core_dc = dc; -+ struct core_dc *core_dc = DC_TO_CORE(dc); - struct dal_logger *logger = core_dc->ctx->logger; - int h_pos[MAX_PIPES], v_pos[MAX_PIPES]; - struct crtc_position position; -@@ -328,11 +328,11 @@ void context_timing_trace( - } - - void context_clock_trace( -- struct dc *dc, -- struct dc_state *context) -+ const struct dc *dc, -+ struct validate_context *context) - { - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) -- struct dc *core_dc = dc; -+ struct core_dc *core_dc = DC_TO_CORE(dc); - struct dal_logger *logger = core_dc->ctx->logger; - - CLOCK_TRACE("Current: dispclk_khz:%d dppclk_div:%d dcfclk_khz:%d\n" -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c -index 71993d5..7b1f249 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c -@@ -25,6 +25,7 @@ - - #include "dm_services.h" - #include "core_types.h" -+#include "core_dc.h" - #include "timing_generator.h" - #include "hw_sequencer.h" - -@@ -54,7 +55,7 @@ static const struct tg_color black_color_format[] = { - }; - - void color_space_to_black_color( -- const struct dc *dc, -+ const struct core_dc *dc, - enum dc_color_space colorspace, - struct tg_color *black_color) - { -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c -index cea8daf..b858fec 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c -@@ -26,13 +26,14 @@ - #include "dm_services.h" - #include "dm_helpers.h" - #include "dc.h" -+#include "core_dc.h" - #include "grph_object_id.h" - #include "gpio_service_interface.h" - #include "core_status.h" - #include "dc_link_dp.h" - #include "dc_link_ddc.h" - #include "link_hwss.h" -- -+#include "stream_encoder.h" - #include "link_encoder.h" - #include "hw_sequencer.h" - #include "resource.h" -@@ -607,12 +608,6 @@ bool dc_link_detect(struct dc_link *link, bool boot) - if (link->type == dc_connection_mst_branch) { - LINK_INFO("link=%d, mst branch is now Connected\n", - link->link_index); -- /* Need to setup mst link_cap struct here -- * otherwise dc_link_detect() will leave mst link_cap -- * empty which leads to allocate_mst_payload() has "0" -- * pbn_per_slot value leading to exception on dal_fixed31_32_div() -- */ -- link->verified_link_cap = link->reported_link_cap; - return false; - } - -@@ -678,9 +673,13 @@ bool dc_link_detect(struct dc_link *link, bool boot) - * TODO debug why Dell 2413 doesn't like - * two link trainings - */ -- -- /* deal with non-mst cases */ -- dp_hbr_verify_link_cap(link, &link->reported_link_cap); -+ if (is_mst_supported(link)) { -+ link->verified_link_cap = -+ link->reported_link_cap; -+ } else { -+ dp_hbr_verify_link_cap(link, -+ &link->reported_link_cap); -+ } - } - - /* HDMI-DVI Dongle */ -@@ -1046,17 +1045,10 @@ static bool construct( - &info.ext_disp_conn_info.path[i]; - if (path->device_connector_id.enum_id == link->link_id.enum_id - && path->device_connector_id.id == link->link_id.id -- && path->device_connector_id.type == link->link_id.type) { -- -- if (link->device_tag.acpi_device != 0 -- && path->device_acpi_enum == link->device_tag.acpi_device) { -- link->ddi_channel_mapping = path->channel_mapping; -- link->chip_caps = path->caps; -- } else if (path->device_tag == -- link->device_tag.dev_id.raw_device_tag) { -- link->ddi_channel_mapping = path->channel_mapping; -- link->chip_caps = path->caps; -- } -+ && path->device_connector_id.type == link->link_id.type -+ && path->device_acpi_enum -+ == link->device_tag.acpi_device) { -+ link->ddi_channel_mapping = path->channel_mapping; - break; - } - } -@@ -1181,9 +1173,7 @@ static void enable_stream_features(struct pipe_ctx *pipe_ctx) - &downspread.raw, sizeof(downspread)); - } - --static enum dc_status enable_link_dp( -- struct dc_state *state, -- struct pipe_ctx *pipe_ctx) -+static enum dc_status enable_link_dp(struct pipe_ctx *pipe_ctx) - { - struct dc_stream_state *stream = pipe_ctx->stream; - enum dc_status status; -@@ -1203,14 +1193,14 @@ static enum dc_status enable_link_dp( - max_link_rate = LINK_RATE_HIGH3; - - if (link_settings.link_rate == max_link_rate) { -- if (state->dis_clk->funcs->set_min_clocks_state) { -- if (state->dis_clk->cur_min_clks_state < DM_PP_CLOCKS_STATE_NOMINAL) -- state->dis_clk->funcs->set_min_clocks_state( -- state->dis_clk, DM_PP_CLOCKS_STATE_NOMINAL); -+ if (pipe_ctx->dis_clk->funcs->set_min_clocks_state) { -+ if (pipe_ctx->dis_clk->cur_min_clks_state < DM_PP_CLOCKS_STATE_NOMINAL) -+ pipe_ctx->dis_clk->funcs->set_min_clocks_state( -+ pipe_ctx->dis_clk, DM_PP_CLOCKS_STATE_NOMINAL); - } else { - uint32_t dp_phyclk_in_khz; - const struct clocks_value clocks_value = -- state->dis_clk->cur_clocks_value; -+ pipe_ctx->dis_clk->cur_clocks_value; - - /* 27mhz = 27000000hz= 27000khz */ - dp_phyclk_in_khz = link_settings.link_rate * 27000; -@@ -1218,8 +1208,8 @@ static enum dc_status enable_link_dp( - if (((clocks_value.max_non_dp_phyclk_in_khz != 0) && - (dp_phyclk_in_khz > clocks_value.max_non_dp_phyclk_in_khz)) || - (dp_phyclk_in_khz > clocks_value.max_dp_phyclk_in_khz)) { -- state->dis_clk->funcs->apply_clock_voltage_request( -- state->dis_clk, -+ pipe_ctx->dis_clk->funcs->apply_clock_voltage_request( -+ pipe_ctx->dis_clk, - DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, - dp_phyclk_in_khz, - false, -@@ -1258,9 +1248,7 @@ static enum dc_status enable_link_dp( - return status; - } - --static enum dc_status enable_link_dp_mst( -- struct dc_state *state, -- struct pipe_ctx *pipe_ctx) -+static enum dc_status enable_link_dp_mst(struct pipe_ctx *pipe_ctx) - { - struct dc_link *link = pipe_ctx->stream->sink->link; - -@@ -1273,386 +1261,7 @@ static enum dc_status enable_link_dp_mst( - /* set the sink to MST mode before enabling the link */ - dp_enable_mst_on_sink(link, true); - -- return enable_link_dp(state, pipe_ctx); --} -- --static bool get_ext_hdmi_settings(struct pipe_ctx *pipe_ctx, -- enum engine_id eng_id, -- struct ext_hdmi_settings *settings) --{ -- bool result = false; -- int i = 0; -- struct integrated_info *integrated_info = -- pipe_ctx->stream->ctx->dc_bios->integrated_info; -- -- if (integrated_info == NULL) -- return false; -- -- /* -- * Get retimer settings from sbios for passing SI eye test for DCE11 -- * The setting values are varied based on board revision and port id -- * Therefore the setting values of each ports is passed by sbios. -- */ -- -- // Check if current bios contains ext Hdmi settings -- if (integrated_info->gpu_cap_info & 0x20) { -- switch (eng_id) { -- case ENGINE_ID_DIGA: -- settings->slv_addr = integrated_info->dp0_ext_hdmi_slv_addr; -- settings->reg_num = integrated_info->dp0_ext_hdmi_6g_reg_num; -- settings->reg_num_6g = integrated_info->dp0_ext_hdmi_6g_reg_num; -- memmove(settings->reg_settings, -- integrated_info->dp0_ext_hdmi_reg_settings, -- sizeof(integrated_info->dp0_ext_hdmi_reg_settings)); -- memmove(settings->reg_settings_6g, -- integrated_info->dp0_ext_hdmi_6g_reg_settings, -- sizeof(integrated_info->dp0_ext_hdmi_6g_reg_settings)); -- result = true; -- break; -- case ENGINE_ID_DIGB: -- settings->slv_addr = integrated_info->dp1_ext_hdmi_slv_addr; -- settings->reg_num = integrated_info->dp1_ext_hdmi_6g_reg_num; -- settings->reg_num_6g = integrated_info->dp1_ext_hdmi_6g_reg_num; -- memmove(settings->reg_settings, -- integrated_info->dp1_ext_hdmi_reg_settings, -- sizeof(integrated_info->dp1_ext_hdmi_reg_settings)); -- memmove(settings->reg_settings_6g, -- integrated_info->dp1_ext_hdmi_6g_reg_settings, -- sizeof(integrated_info->dp1_ext_hdmi_6g_reg_settings)); -- result = true; -- break; -- case ENGINE_ID_DIGC: -- settings->slv_addr = integrated_info->dp2_ext_hdmi_slv_addr; -- settings->reg_num = integrated_info->dp2_ext_hdmi_6g_reg_num; -- settings->reg_num_6g = integrated_info->dp2_ext_hdmi_6g_reg_num; -- memmove(settings->reg_settings, -- integrated_info->dp2_ext_hdmi_reg_settings, -- sizeof(integrated_info->dp2_ext_hdmi_reg_settings)); -- memmove(settings->reg_settings_6g, -- integrated_info->dp2_ext_hdmi_6g_reg_settings, -- sizeof(integrated_info->dp2_ext_hdmi_6g_reg_settings)); -- result = true; -- break; -- -- default: -- break; -- } -- -- if (result == true) { -- // Validate settings from bios integrated info table -- if (settings->slv_addr == 0) -- return false; -- if (settings->reg_num > 9) -- return false; -- if (settings->reg_num_6g > 3) -- return false; -- -- for (i = 0; i < settings->reg_num; i++) { -- if (settings->reg_settings[i].i2c_reg_index > 0x20) -- return false; -- } -- -- for (i = 0; i < settings->reg_num_6g; i++) { -- if (settings->reg_settings_6g[i].i2c_reg_index > 0x20) -- return false; -- } -- } -- } -- -- return result; --} -- --static bool i2c_write(struct pipe_ctx *pipe_ctx, -- uint8_t address, uint8_t *buffer, uint32_t length) --{ -- struct i2c_command cmd = {0}; -- struct i2c_payload payload = {0}; -- -- memset(&payload, 0, sizeof(payload)); -- memset(&cmd, 0, sizeof(cmd)); -- -- cmd.number_of_payloads = 1; -- cmd.engine = I2C_COMMAND_ENGINE_DEFAULT; -- cmd.speed = pipe_ctx->stream->ctx->dc->caps.i2c_speed_in_khz; -- -- payload.address = address; -- payload.data = buffer; -- payload.length = length; -- payload.write = true; -- cmd.payloads = &payload; -- -- if (dc_submit_i2c(pipe_ctx->stream->ctx->dc, -- pipe_ctx->stream->sink->link->link_index, &cmd)) -- return true; -- -- return false; --} -- --static void write_i2c_retimer_setting( -- struct pipe_ctx *pipe_ctx, -- bool is_vga_mode, -- bool is_over_340mhz, -- struct ext_hdmi_settings *settings) --{ -- uint8_t slave_address = (settings->slv_addr >> 1); -- uint8_t buffer[2]; -- const uint8_t apply_rx_tx_change = 0x4; -- uint8_t offset = 0xA; -- uint8_t value = 0; -- int i = 0; -- bool i2c_success = false; -- -- memset(&buffer, 0, sizeof(buffer)); -- -- /* Start Ext-Hdmi programming*/ -- -- for (i = 0; i < settings->reg_num; i++) { -- /* Apply 3G settings */ -- if (settings->reg_settings[i].i2c_reg_index <= 0x20) { -- -- buffer[0] = settings->reg_settings[i].i2c_reg_index; -- buffer[1] = settings->reg_settings[i].i2c_reg_val; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Based on DP159 specs, APPLY_RX_TX_CHANGE bit in 0x0A -- * needs to be set to 1 on every 0xA-0xC write. -- */ -- if (settings->reg_settings[i].i2c_reg_index == 0xA || -- settings->reg_settings[i].i2c_reg_index == 0xB || -- settings->reg_settings[i].i2c_reg_index == 0xC) { -- -- /* Query current value from offset 0xA */ -- if (settings->reg_settings[i].i2c_reg_index == 0xA) -- value = settings->reg_settings[i].i2c_reg_val; -- else { -- i2c_success = -- dal_ddc_service_query_ddc_data( -- pipe_ctx->stream->sink->link->ddc, -- slave_address, &offset, 1, &value, 1); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- } -- -- buffer[0] = offset; -- /* Set APPLY_RX_TX_CHANGE bit to 1 */ -- buffer[1] = value | apply_rx_tx_change; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- } -- } -- } -- -- /* Apply 3G settings */ -- if (is_over_340mhz) { -- for (i = 0; i < settings->reg_num_6g; i++) { -- /* Apply 3G settings */ -- if (settings->reg_settings[i].i2c_reg_index <= 0x20) { -- -- buffer[0] = settings->reg_settings_6g[i].i2c_reg_index; -- buffer[1] = settings->reg_settings_6g[i].i2c_reg_val; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Based on DP159 specs, APPLY_RX_TX_CHANGE bit in 0x0A -- * needs to be set to 1 on every 0xA-0xC write. -- */ -- if (settings->reg_settings_6g[i].i2c_reg_index == 0xA || -- settings->reg_settings_6g[i].i2c_reg_index == 0xB || -- settings->reg_settings_6g[i].i2c_reg_index == 0xC) { -- -- /* Query current value from offset 0xA */ -- if (settings->reg_settings_6g[i].i2c_reg_index == 0xA) -- value = settings->reg_settings_6g[i].i2c_reg_val; -- else { -- i2c_success = -- dal_ddc_service_query_ddc_data( -- pipe_ctx->stream->sink->link->ddc, -- slave_address, &offset, 1, &value, 1); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- } -- -- buffer[0] = offset; -- /* Set APPLY_RX_TX_CHANGE bit to 1 */ -- buffer[1] = value | apply_rx_tx_change; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- } -- } -- } -- } -- -- if (is_vga_mode) { -- /* Program additional settings if using 640x480 resolution */ -- -- /* Write offset 0xFF to 0x01 */ -- buffer[0] = 0xff; -- buffer[1] = 0x01; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Write offset 0x00 to 0x23 */ -- buffer[0] = 0x00; -- buffer[1] = 0x23; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Write offset 0xff to 0x00 */ -- buffer[0] = 0xff; -- buffer[1] = 0x00; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- } --} -- --static void write_i2c_default_retimer_setting( -- struct pipe_ctx *pipe_ctx, -- bool is_vga_mode, -- bool is_over_340mhz) --{ -- uint8_t slave_address = (0xBA >> 1); -- uint8_t buffer[2]; -- bool i2c_success = false; -- -- memset(&buffer, 0, sizeof(buffer)); -- -- /* Program Slave Address for tuning single integrity */ -- /* Write offset 0x0A to 0x13 */ -- buffer[0] = 0x0A; -- buffer[1] = 0x13; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Write offset 0x0A to 0x17 */ -- buffer[0] = 0x0A; -- buffer[1] = 0x17; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Write offset 0x0B to 0xDA or 0xD8 */ -- buffer[0] = 0x0B; -- buffer[1] = is_over_340mhz ? 0xDA : 0xD8; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Write offset 0x0A to 0x17 */ -- buffer[0] = 0x0A; -- buffer[1] = 0x17; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Write offset 0x0C to 0x1D or 0x91 */ -- buffer[0] = 0x0C; -- buffer[1] = is_over_340mhz ? 0x1D : 0x91; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Write offset 0x0A to 0x17 */ -- buffer[0] = 0x0A; -- buffer[1] = 0x17; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- -- if (is_vga_mode) { -- /* Program additional settings if using 640x480 resolution */ -- -- /* Write offset 0xFF to 0x01 */ -- buffer[0] = 0xff; -- buffer[1] = 0x01; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Write offset 0x00 to 0x23 */ -- buffer[0] = 0x00; -- buffer[1] = 0x23; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- -- /* Write offset 0xff to 0x00 */ -- buffer[0] = 0xff; -- buffer[1] = 0x00; -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -- } --} -- --static void write_i2c_redriver_setting( -- struct pipe_ctx *pipe_ctx, -- bool is_over_340mhz) --{ -- uint8_t slave_address = (0xF0 >> 1); -- uint8_t buffer[16]; -- bool i2c_success = false; -- -- memset(&buffer, 0, sizeof(buffer)); -- -- // Program Slave Address for tuning single integrity -- buffer[3] = 0x4E; -- buffer[4] = 0x4E; -- buffer[5] = 0x4E; -- buffer[6] = is_over_340mhz ? 0x4E : 0x4A; -- -- i2c_success = i2c_write(pipe_ctx, slave_address, -- buffer, sizeof(buffer)); -- -- if (!i2c_success) -- /* Write failure */ -- ASSERT(i2c_success); -+ return enable_link_dp(pipe_ctx); - } - - static void enable_link_hdmi(struct pipe_ctx *pipe_ctx) -@@ -1660,32 +1269,6 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx) - struct dc_stream_state *stream = pipe_ctx->stream; - struct dc_link *link = stream->sink->link; - enum dc_color_depth display_color_depth; -- enum engine_id eng_id; -- struct ext_hdmi_settings settings = {0}; -- bool is_over_340mhz = false; -- bool is_vga_mode = (stream->timing.h_addressable == 640) -- && (stream->timing.v_addressable == 480); -- -- if (stream->phy_pix_clk > 340000) -- is_over_340mhz = true; -- -- if (dc_is_hdmi_signal(pipe_ctx->stream->signal)) { -- if ((pipe_ctx->stream->sink->link->chip_caps >> 2) == 0x2) { -- /* DP159, Retimer settings */ -- eng_id = pipe_ctx->stream_res.stream_enc->id; -- -- if (get_ext_hdmi_settings(pipe_ctx, eng_id, &settings)) { -- write_i2c_retimer_setting(pipe_ctx, -- is_vga_mode, is_over_340mhz, &settings); -- } else { -- write_i2c_default_retimer_setting(pipe_ctx, -- is_vga_mode, is_over_340mhz); -- } -- } else if ((pipe_ctx->stream->sink->link->chip_caps >> 2) == 0x1) { -- /* PI3EQX1204, Redriver settings */ -- write_i2c_redriver_setting(pipe_ctx, is_over_340mhz); -- } -- } - - if (dc_is_hdmi_signal(pipe_ctx->stream->signal)) - dal_ddc_service_write_scdc_data( -@@ -1713,18 +1296,16 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx) - } - - /****************************enable_link***********************************/ --static enum dc_status enable_link( -- struct dc_state *state, -- struct pipe_ctx *pipe_ctx) -+static enum dc_status enable_link(struct pipe_ctx *pipe_ctx) - { - enum dc_status status = DC_ERROR_UNEXPECTED; - switch (pipe_ctx->stream->signal) { - case SIGNAL_TYPE_DISPLAY_PORT: - case SIGNAL_TYPE_EDP: -- status = enable_link_dp(state, pipe_ctx); -+ status = enable_link_dp(pipe_ctx); - break; - case SIGNAL_TYPE_DISPLAY_PORT_MST: -- status = enable_link_dp_mst(state, pipe_ctx); -+ status = enable_link_dp_mst(pipe_ctx); - msleep(200); - break; - case SIGNAL_TYPE_DVI_SINGLE_LINK: -@@ -1811,7 +1392,7 @@ enum dc_status dc_link_validate_mode_timing( - bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level, - uint32_t frame_ramp, const struct dc_stream_state *stream) - { -- struct dc *core_dc = link->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(link->ctx->dc); - struct abm *abm = core_dc->res_pool->abm; - unsigned int controller_id = 0; - int i; -@@ -1825,14 +1406,14 @@ bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level, - if (dc_is_embedded_signal(link->connector_signal)) { - if (stream != NULL) { - for (i = 0; i < MAX_PIPES; i++) { -- if (core_dc->current_state->res_ctx. -+ if (core_dc->current_context->res_ctx. - pipe_ctx[i].stream - == stream) - /* DMCU -1 for all controller id values, - * therefore +1 here - */ - controller_id = -- core_dc->current_state-> -+ core_dc->current_context-> - res_ctx.pipe_ctx[i].stream_res.tg->inst + - 1; - } -@@ -1850,7 +1431,7 @@ bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level, - - bool dc_link_set_abm_disable(const struct dc_link *link) - { -- struct dc *core_dc = link->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(link->ctx->dc); - struct abm *abm = core_dc->res_pool->abm; - - if ((abm == NULL) || (abm->funcs->set_backlight_level == NULL)) -@@ -1862,20 +1443,20 @@ bool dc_link_set_abm_disable(const struct dc_link *link) - } - - --bool dc_link_set_psr_enable(const struct dc_link *link, bool enable, bool wait) -+bool dc_link_set_psr_enable(const struct dc_link *link, bool enable) - { -- struct dc *core_dc = link->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(link->ctx->dc); - struct dmcu *dmcu = core_dc->res_pool->dmcu; - - if (dmcu != NULL && link->psr_enabled) -- dmcu->funcs->set_psr_enable(dmcu, enable, wait); -+ dmcu->funcs->set_psr_enable(dmcu, enable); - - return true; - } - - bool dc_link_get_psr_state(const struct dc_link *link, uint32_t *psr_state) - { -- struct dc *core_dc = link->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(link->ctx->dc); - struct dmcu *dmcu = core_dc->res_pool->dmcu; - - if (dmcu != NULL && link->psr_enabled) -@@ -1888,7 +1469,7 @@ bool dc_link_setup_psr(struct dc_link *link, - const struct dc_stream_state *stream, struct psr_config *psr_config, - struct psr_context *psr_context) - { -- struct dc *core_dc = link->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(link->ctx->dc); - struct dmcu *dmcu = core_dc->res_pool->dmcu; - int i; - -@@ -1932,13 +1513,13 @@ bool dc_link_setup_psr(struct dc_link *link, - psr_context->engineId = link->link_enc->preferred_engine; - - for (i = 0; i < MAX_PIPES; i++) { -- if (core_dc->current_state->res_ctx.pipe_ctx[i].stream -+ if (core_dc->current_context->res_ctx.pipe_ctx[i].stream - == stream) { - /* dmcu -1 for all controller id values, - * therefore +1 here - */ - psr_context->controllerId = -- core_dc->current_state->res_ctx. -+ core_dc->current_context->res_ctx. - pipe_ctx[i].stream_res.tg->inst + 1; - break; - } -@@ -1983,7 +1564,7 @@ bool dc_link_setup_psr(struct dc_link *link, - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) - /*skip power down the single pipe since it blocks the cstate*/ - if (ASIC_REV_IS_RAVEN(link->ctx->asic_id.hw_internal_rev)) -- psr_context->psr_level.bits.SKIP_CRTC_DISABLE = true; -+ psr_context->psr_level.bits.SKIP_SINGLE_OTG_DISABLE = true; - #endif - - /* SMU will perform additional powerdown sequence. -@@ -2291,13 +1872,11 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx) - return DC_OK; - } - --void core_link_enable_stream( -- struct dc_state *state, -- struct pipe_ctx *pipe_ctx) -+void core_link_enable_stream(struct pipe_ctx *pipe_ctx) - { -- struct dc *core_dc = pipe_ctx->stream->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(pipe_ctx->stream->ctx->dc); - -- enum dc_status status = enable_link(state, pipe_ctx); -+ enum dc_status status = enable_link(pipe_ctx); - - if (status != DC_OK) { - dm_logger_write(pipe_ctx->stream->ctx->logger, -@@ -2328,7 +1907,7 @@ void core_link_enable_stream( - - void core_link_disable_stream(struct pipe_ctx *pipe_ctx) - { -- struct dc *core_dc = pipe_ctx->stream->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(pipe_ctx->stream->ctx->dc); - - if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) - deallocate_mst_payload(pipe_ctx); -@@ -2340,7 +1919,7 @@ void core_link_disable_stream(struct pipe_ctx *pipe_ctx) - - void core_link_set_avmute(struct pipe_ctx *pipe_ctx, bool enable) - { -- struct dc *core_dc = pipe_ctx->stream->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(pipe_ctx->stream->ctx->dc); - - if (pipe_ctx->stream->signal != SIGNAL_TYPE_HDMI_TYPE_A) - return; -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c -index 527cc04..9d5fe65 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c -@@ -10,6 +10,7 @@ - #include "core_status.h" - #include "dpcd_defs.h" - -+#include "core_dc.h" - #include "resource.h" - - /* maximum pre emphasis level allowed for each voltage swing level*/ -@@ -1302,6 +1303,8 @@ bool decide_fallback_link_setting( - current_link_setting->lane_count); - } else if (!reached_minimum_link_rate - (current_link_setting->link_rate)) { -+ current_link_setting->lane_count = -+ initial_link_settings.lane_count; - current_link_setting->link_rate = - reduce_link_rate( - current_link_setting->link_rate); -@@ -1457,14 +1460,6 @@ void decide_link_settings(struct dc_stream_state *stream, - return; - } - -- /* MST doesn't perform link training for now -- * TODO: add MST specific link training routine -- */ -- if (is_mst_supported(link)) { -- *link_setting = link->verified_link_cap; -- return; -- } -- - /* search for the minimum link setting that: - * 1. is supported according to the link training result - * 2. could support the b/w requested by the timing -@@ -1653,8 +1648,8 @@ static bool handle_hpd_irq_psr_sink(const struct dc_link *link) - sizeof(psr_error_status.raw)); - - /* PSR error, disable and re-enable PSR */ -- dc_link_set_psr_enable(link, false, true); -- dc_link_set_psr_enable(link, true, true); -+ dc_link_set_psr_enable(link, false); -+ dc_link_set_psr_enable(link, true); - - return true; - } else if (psr_sink_psr_status.bits.SINK_SELF_REFRESH_STATUS == -@@ -1962,11 +1957,11 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd - * so do not handle as a normal sink status change interrupt. - */ - -- if (hpd_irq_dpcd_data.bytes.device_service_irq.bits.UP_REQ_MSG_RDY) -- return true; -- - /* check if we have MST msg and return since we poll for it */ -- if (hpd_irq_dpcd_data.bytes.device_service_irq.bits.DOWN_REP_MSG_RDY) -+ if (hpd_irq_dpcd_data.bytes.device_service_irq. -+ bits.DOWN_REP_MSG_RDY || -+ hpd_irq_dpcd_data.bytes.device_service_irq. -+ bits.UP_REQ_MSG_RDY) - return false; - - /* For now we only handle 'Downstream port status' case. -@@ -2264,8 +2259,6 @@ static void retrieve_link_cap(struct dc_link *link) - DP_EDP_CONFIGURATION_CAP - DP_DPCD_REV]; - link->dpcd_caps.panel_mode_edp = - edp_config_cap.bits.ALT_SCRAMBLER_RESET; -- link->dpcd_caps.dpcd_display_control_capable = -- edp_config_cap.bits.DPCD_DISPLAY_CONTROL_CAPABLE; - - link->test_pattern_enabled = false; - link->compliance_test_state.raw = 0; -@@ -2406,7 +2399,7 @@ bool dc_link_dp_set_test_pattern( - const unsigned char *p_custom_pattern, - unsigned int cust_pattern_size) - { -- struct pipe_ctx *pipes = link->dc->current_state->res_ctx.pipe_ctx; -+ struct pipe_ctx *pipes = link->dc->current_context->res_ctx.pipe_ctx; - struct pipe_ctx *pipe_ctx = &pipes[0]; - unsigned int lane; - unsigned int i; -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c -index 3427fb5..d19c663 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c -@@ -3,7 +3,7 @@ - - #include "dm_services.h" - #include "dc.h" --#include "inc/core_types.h" -+#include "inc/core_dc.h" - #include "include/ddc_service_types.h" - #include "include/i2caux_interface.h" - #include "link_hwss.h" -@@ -62,7 +62,7 @@ void dp_enable_link_phy( - struct link_encoder *link_enc = link->link_enc; - - struct pipe_ctx *pipes = -- link->dc->current_state->res_ctx.pipe_ctx; -+ link->dc->current_context->res_ctx.pipe_ctx; - struct clock_source *dp_cs = - link->dc->res_pool->dp_clock_source; - unsigned int i; -@@ -110,28 +110,6 @@ void dp_enable_link_phy( - dp_receiver_power_ctrl(link, true); - } - --bool edp_receiver_ready_T9(struct dc_link *link) --{ -- unsigned int tries = 0; -- unsigned char sinkstatus = 0; -- unsigned char edpRev = 0; -- enum dc_status result = DC_OK; -- result = core_link_read_dpcd(link, DP_EDP_DPCD_REV, &edpRev, sizeof(edpRev)); -- if (edpRev < DP_EDP_12) -- return true; -- /* start from eDP version 1.2, SINK_STAUS indicate the sink is ready.*/ -- do { -- sinkstatus = 1; -- result = core_link_read_dpcd(link, DP_SINK_STATUS, &sinkstatus, sizeof(sinkstatus)); -- if (sinkstatus == 0) -- break; -- if (result != DC_OK) -- break; -- dm_delay_in_microseconds(link->ctx, 100); //MAx T9 -- } while (++tries < 50); -- return result; --} -- - void dp_disable_link_phy(struct dc_link *link, enum signal_type signal) - { - if (!link->wa_flags.dp_keep_receiver_powered) -@@ -139,7 +117,6 @@ void dp_disable_link_phy(struct dc_link *link, enum signal_type signal) - - if (signal == SIGNAL_TYPE_EDP) { - link->link_enc->funcs->backlight_control(link->link_enc, false); -- edp_receiver_ready_T9(link); - link->link_enc->funcs->disable_output(link->link_enc, signal); - link->link_enc->funcs->power_control(link->link_enc, false); - } else -@@ -262,7 +239,7 @@ void dp_retrain_link_dp_test(struct dc_link *link, - bool skip_video_pattern) - { - struct pipe_ctx *pipes = -- &link->dc->current_state->res_ctx.pipe_ctx[0]; -+ &link->dc->current_context->res_ctx.pipe_ctx[0]; - unsigned int i; - - for (i = 0; i < MAX_PIPES; i++) { -@@ -299,11 +276,10 @@ void dp_retrain_link_dp_test(struct dc_link *link, - - dp_receiver_power_ctrl(link, true); - -- perform_link_training_with_retries( -+ dc_link_dp_perform_link_training( - link, - link_setting, -- skip_video_pattern, -- LINK_TRAINING_ATTEMPTS); -+ skip_video_pattern); - - link->cur_link_settings = *link_setting; - -@@ -311,20 +287,6 @@ void dp_retrain_link_dp_test(struct dc_link *link, - - link->dc->hwss.unblank_stream(&pipes[i], - link_setting); -- -- if (pipes[i].stream_res.audio) { -- /* notify audio driver for -- * audio modes of monitor */ -- pipes[i].stream_res.audio->funcs->az_enable( -- pipes[i].stream_res.audio); -- -- /* un-mute audio */ -- /* TODO: audio should be per stream rather than -- * per link */ -- pipes[i].stream_res.stream_enc->funcs-> -- audio_mute_control( -- pipes[i].stream_res.stream_enc, false); -- } - } - } - } -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c -index 8e60e83..f010039 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c -@@ -92,7 +92,7 @@ enum dce_version resource_parse_asic_id(struct hw_asic_id asic_id) - } - - struct resource_pool *dc_create_resource_pool( -- struct dc *dc, -+ struct core_dc *dc, - int num_virtual_links, - enum dce_version dc_version, - struct hw_asic_id asic_id) -@@ -132,7 +132,7 @@ struct resource_pool *dc_create_resource_pool( - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) - case DCN_VERSION_1_0: - res_pool = dcn10_create_resource_pool( -- num_virtual_links, dc); -+ num_virtual_links, dc); - break; - #endif - -@@ -153,7 +153,7 @@ struct resource_pool *dc_create_resource_pool( - return res_pool; - } - --void dc_destroy_resource_pool(struct dc *dc) -+void dc_destroy_resource_pool(struct core_dc *dc) - { - if (dc) { - if (dc->res_pool) -@@ -169,14 +169,16 @@ static void update_num_audio( - unsigned int *num_audio, - struct audio_support *aud_support) - { -- aud_support->dp_audio = true; -- aud_support->hdmi_audio_native = false; -- aud_support->hdmi_audio_on_dongle = false; -- - if (straps->hdmi_disable == 0) { -+ aud_support->hdmi_audio_native = true; -+ aud_support->hdmi_audio_on_dongle = true; -+ aud_support->dp_audio = true; -+ } else { - if (straps->dc_pinstraps_audio & 0x2) { - aud_support->hdmi_audio_on_dongle = true; -- aud_support->hdmi_audio_native = true; -+ aud_support->dp_audio = true; -+ } else { -+ aud_support->dp_audio = true; - } - } - -@@ -193,7 +195,7 @@ static void update_num_audio( - - bool resource_construct( - unsigned int num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct resource_pool *pool, - const struct resource_create_funcs *create_funcs) - { -@@ -892,8 +894,8 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx) - - - enum dc_status resource_build_scaling_params_for_context( -- const struct dc *dc, -- struct dc_state *context) -+ const struct core_dc *dc, -+ struct validate_context *context) - { - int i; - -@@ -938,7 +940,7 @@ struct pipe_ctx *resource_get_head_pipe_for_stream( - int i; - for (i = 0; i < MAX_PIPES; i++) { - if (res_ctx->pipe_ctx[i].stream == stream && -- !res_ctx->pipe_ctx[i].top_pipe) { -+ res_ctx->pipe_ctx[i].stream_res.stream_enc) { - return &res_ctx->pipe_ctx[i]; - break; - } -@@ -946,32 +948,12 @@ struct pipe_ctx *resource_get_head_pipe_for_stream( - return NULL; - } - --static struct pipe_ctx *resource_get_tail_pipe_for_stream( -- struct resource_context *res_ctx, -- struct dc_stream_state *stream) --{ -- struct pipe_ctx *head_pipe, *tail_pipe; -- head_pipe = resource_get_head_pipe_for_stream(res_ctx, stream); -- -- if (!head_pipe) -- return NULL; -- -- tail_pipe = head_pipe->bottom_pipe; -- -- while (tail_pipe) { -- head_pipe = tail_pipe; -- tail_pipe = tail_pipe->bottom_pipe; -- } -- -- return head_pipe; --} -- - /* - * A free_pipe for a stream is defined here as a pipe - * that has no surface attached yet - */ - static struct pipe_ctx *acquire_free_pipe_for_stream( -- struct dc_state *context, -+ struct validate_context *context, - const struct resource_pool *pool, - struct dc_stream_state *stream) - { -@@ -1010,6 +992,22 @@ static struct pipe_ctx *acquire_free_pipe_for_stream( - - } - -+static void release_free_pipes_for_stream( -+ struct resource_context *res_ctx, -+ struct dc_stream_state *stream) -+{ -+ int i; -+ -+ for (i = MAX_PIPES - 1; i >= 0; i--) { -+ /* never release the topmost pipe*/ -+ if (res_ctx->pipe_ctx[i].stream == stream && -+ res_ctx->pipe_ctx[i].top_pipe && -+ !res_ctx->pipe_ctx[i].plane_state) { -+ memset(&res_ctx->pipe_ctx[i], 0, sizeof(struct pipe_ctx)); -+ } -+ } -+} -+ - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) - static int acquire_first_split_pipe( - struct resource_context *res_ctx, -@@ -1033,6 +1031,7 @@ static int acquire_first_split_pipe( - pipe_ctx->plane_res.ipp = pool->ipps[i]; - pipe_ctx->plane_res.xfm = pool->transforms[i]; - pipe_ctx->stream_res.opp = pool->opps[i]; -+ pipe_ctx->dis_clk = pool->display_clock; - pipe_ctx->pipe_idx = i; - - pipe_ctx->stream = stream; -@@ -1043,236 +1042,97 @@ static int acquire_first_split_pipe( - } - #endif - --bool dc_add_plane_to_context( -- const struct dc *dc, -+bool resource_attach_surfaces_to_context( -+ struct dc_plane_state * const *plane_states, -+ int surface_count, - struct dc_stream_state *stream, -- struct dc_plane_state *plane_state, -- struct dc_state *context) -+ struct validate_context *context, -+ const struct resource_pool *pool) - { - int i; -- struct resource_pool *pool = dc->res_pool; -- struct pipe_ctx *head_pipe, *tail_pipe, *free_pipe; -+ struct pipe_ctx *tail_pipe; - struct dc_stream_status *stream_status = NULL; - -- for (i = 0; i < context->stream_count; i++) -- if (context->streams[i] == stream) { -- stream_status = &context->stream_status[i]; -- break; -- } -- if (stream_status == NULL) { -- dm_error("Existing stream not found; failed to attach surface!\n"); -- return false; -- } -- -- -- if (stream_status->plane_count == MAX_SURFACE_NUM) { -- dm_error("Surface: can not attach plane_state %p! Maximum is: %d\n", -- plane_state, MAX_SURFACE_NUM); -- return false; -- } -- -- head_pipe = resource_get_head_pipe_for_stream(&context->res_ctx, stream); - -- if (!head_pipe) { -- dm_error("Head pipe not found for stream_state %p !\n", stream); -- return false; -- } -- -- /* retain new surfaces */ -- dc_plane_state_retain(plane_state); -- -- free_pipe = acquire_free_pipe_for_stream(context, pool, stream); -- --#if defined(CONFIG_DRM_AMD_DC_DCN1_0) -- if (!free_pipe) { -- int pipe_idx = acquire_first_split_pipe(&context->res_ctx, pool, stream); -- if (pipe_idx >= 0) -- free_pipe = &context->res_ctx.pipe_ctx[pipe_idx]; -- } --#endif -- if (!free_pipe) { -- stream_status->plane_states[i] = NULL; -+ if (surface_count > MAX_SURFACE_NUM) { -+ dm_error("Surface: can not attach %d surfaces! Maximum is: %d\n", -+ surface_count, MAX_SURFACE_NUM); - return false; - } - -- free_pipe->plane_state = plane_state; -- -- if (head_pipe != free_pipe) { -- -- tail_pipe = resource_get_tail_pipe_for_stream(&context->res_ctx, stream); -- ASSERT(tail_pipe); -- -- free_pipe->stream_res.tg = tail_pipe->stream_res.tg; -- free_pipe->stream_res.opp = tail_pipe->stream_res.opp; -- free_pipe->stream_res.stream_enc = tail_pipe->stream_res.stream_enc; -- free_pipe->stream_res.audio = tail_pipe->stream_res.audio; -- free_pipe->clock_source = tail_pipe->clock_source; -- free_pipe->top_pipe = tail_pipe; -- tail_pipe->bottom_pipe = free_pipe; -- } -- -- /* assign new surfaces*/ -- stream_status->plane_states[stream_status->plane_count] = plane_state; -- -- stream_status->plane_count++; -- -- return true; --} -- --bool dc_remove_plane_from_context( -- const struct dc *dc, -- struct dc_stream_state *stream, -- struct dc_plane_state *plane_state, -- struct dc_state *context) --{ -- int i; -- struct dc_stream_status *stream_status = NULL; -- struct resource_pool *pool = dc->res_pool; -- - for (i = 0; i < context->stream_count; i++) - if (context->streams[i] == stream) { - stream_status = &context->stream_status[i]; - break; - } -- - if (stream_status == NULL) { -- dm_error("Existing stream not found; failed to remove plane.\n"); -+ dm_error("Existing stream not found; failed to attach surfaces\n"); - return false; - } - -- /* release pipe for plane*/ -- for (i = pool->pipe_count - 1; i >= 0; i--) { -- struct pipe_ctx *pipe_ctx; -- -- if (context->res_ctx.pipe_ctx[i].plane_state == plane_state) { -- pipe_ctx = &context->res_ctx.pipe_ctx[i]; -- -- if (pipe_ctx->top_pipe) -- pipe_ctx->top_pipe->bottom_pipe = pipe_ctx->bottom_pipe; -- -- /* Second condition is to avoid setting NULL to top pipe -- * of tail pipe making it look like head pipe in subsequent -- * deletes -- */ -- if (pipe_ctx->bottom_pipe && pipe_ctx->top_pipe) -- pipe_ctx->bottom_pipe->top_pipe = pipe_ctx->top_pipe; -- -- /* -- * For head pipe detach surfaces from pipe for tail -- * pipe just zero it out -- */ -- if (!pipe_ctx->top_pipe) { -- pipe_ctx->plane_state = NULL; -- pipe_ctx->bottom_pipe = NULL; -- } else { -- memset(pipe_ctx, 0, sizeof(*pipe_ctx)); -- } -- } -- } -- -- -- for (i = 0; i < stream_status->plane_count; i++) { -- if (stream_status->plane_states[i] == plane_state) { -- -- dc_plane_state_release(stream_status->plane_states[i]); -- break; -+ /* retain new surfaces */ -+ for (i = 0; i < surface_count; i++) -+ dc_plane_state_retain(plane_states[i]); -+ -+ /* detach surfaces from pipes */ -+ for (i = 0; i < pool->pipe_count; i++) -+ if (context->res_ctx.pipe_ctx[i].stream == stream) { -+ context->res_ctx.pipe_ctx[i].plane_state = NULL; -+ context->res_ctx.pipe_ctx[i].bottom_pipe = NULL; - } -- } -- -- if (i == stream_status->plane_count) { -- dm_error("Existing plane_state not found; failed to detach it!\n"); -- return false; -- } -- -- stream_status->plane_count--; - -- /* Trim back arrays */ -+ /* release existing surfaces*/ - for (i = 0; i < stream_status->plane_count; i++) -- stream_status->plane_states[i] = stream_status->plane_states[i + 1]; -- -- stream_status->plane_states[stream_status->plane_count] = NULL; -- -- return true; --} -+ dc_plane_state_release(stream_status->plane_states[i]); - --bool dc_rem_all_planes_for_stream( -- const struct dc *dc, -- struct dc_stream_state *stream, -- struct dc_state *context) --{ -- int i, old_plane_count; -- struct dc_stream_status *stream_status = NULL; -- struct dc_plane_state *del_planes[MAX_SURFACE_NUM] = { 0 }; -- -- for (i = 0; i < context->stream_count; i++) -- if (context->streams[i] == stream) { -- stream_status = &context->stream_status[i]; -- break; -- } -- -- if (stream_status == NULL) { -- dm_error("Existing stream %p not found!\n", stream); -- return false; -- } -- -- old_plane_count = stream_status->plane_count; -+ for (i = surface_count; i < stream_status->plane_count; i++) -+ stream_status->plane_states[i] = NULL; - -- for (i = 0; i < old_plane_count; i++) -- del_planes[i] = stream_status->plane_states[i]; -+ tail_pipe = NULL; -+ for (i = 0; i < surface_count; i++) { -+ struct dc_plane_state *plane_state = plane_states[i]; -+ struct pipe_ctx *free_pipe = acquire_free_pipe_for_stream( -+ context, pool, stream); - -- for (i = 0; i < old_plane_count; i++) -- if (!dc_remove_plane_from_context(dc, stream, del_planes[i], context)) -+#if defined(CONFIG_DRM_AMD_DC_DCN1_0) -+ if (!free_pipe) { -+ int pipe_idx = acquire_first_split_pipe(&context->res_ctx, pool, stream); -+ if (pipe_idx >= 0) -+ free_pipe = &context->res_ctx.pipe_ctx[pipe_idx]; -+ } -+#endif -+ if (!free_pipe) { -+ stream_status->plane_states[i] = NULL; - return false; -+ } - -- return true; --} -- --static bool add_all_planes_for_stream( -- const struct dc *dc, -- struct dc_stream_state *stream, -- const struct dc_validation_set set[], -- int set_count, -- struct dc_state *context) --{ -- int i, j; -+ free_pipe->plane_state = plane_state; - -- for (i = 0; i < set_count; i++) -- if (set[i].stream == stream) -- break; -+ if (tail_pipe) { -+ free_pipe->stream_res.tg = tail_pipe->stream_res.tg; -+ free_pipe->stream_res.opp = tail_pipe->stream_res.opp; -+ free_pipe->stream_res.stream_enc = tail_pipe->stream_res.stream_enc; -+ free_pipe->stream_res.audio = tail_pipe->stream_res.audio; -+ free_pipe->clock_source = tail_pipe->clock_source; -+ free_pipe->top_pipe = tail_pipe; -+ tail_pipe->bottom_pipe = free_pipe; -+ } - -- if (i == set_count) { -- dm_error("Stream %p not found in set!\n", stream); -- return false; -+ tail_pipe = free_pipe; - } - -- for (j = 0; j < set[i].plane_count; j++) -- if (!dc_add_plane_to_context(dc, stream, set[i].plane_states[j], context)) -- return false; -- -- return true; --} -+ release_free_pipes_for_stream(&context->res_ctx, stream); - --bool dc_add_all_planes_for_stream( -- const struct dc *dc, -- struct dc_stream_state *stream, -- struct dc_plane_state * const *plane_states, -- int plane_count, -- struct dc_state *context) --{ -- struct dc_validation_set set; -- int i; -- -- set.stream = stream; -- set.plane_count = plane_count; -+ /* assign new surfaces*/ -+ for (i = 0; i < surface_count; i++) -+ stream_status->plane_states[i] = plane_states[i]; - -- for (i = 0; i < plane_count; i++) -- set.plane_states[i] = plane_states[i]; -+ stream_status->plane_count = surface_count; - -- return add_all_planes_for_stream(dc, stream, &set, 1, context); -+ return true; - } - - -- - static bool is_timing_changed(struct dc_stream_state *cur_stream, - struct dc_stream_state *new_stream) - { -@@ -1320,34 +1180,68 @@ bool dc_is_stream_unchanged( - return true; - } - -+bool resource_validate_attach_surfaces( -+ const struct dc_validation_set set[], -+ int set_count, -+ const struct validate_context *old_context, -+ struct validate_context *context, -+ const struct resource_pool *pool) -+{ -+ int i, j; -+ -+ for (i = 0; i < set_count; i++) { -+ for (j = 0; old_context && j < old_context->stream_count; j++) -+ if (dc_is_stream_unchanged( -+ old_context->streams[j], -+ context->streams[i])) { -+ if (!resource_attach_surfaces_to_context( -+ old_context->stream_status[j].plane_states, -+ old_context->stream_status[j].plane_count, -+ context->streams[i], -+ context, pool)) -+ return false; -+ context->stream_status[i] = old_context->stream_status[j]; -+ } -+ if (set[i].plane_count != 0) -+ if (!resource_attach_surfaces_to_context( -+ set[i].plane_states, -+ set[i].plane_count, -+ context->streams[i], -+ context, pool)) -+ return false; -+ -+ } -+ -+ return true; -+} -+ - /* Maximum TMDS single link pixel clock 165MHz */ - #define TMDS_MAX_PIXEL_CLOCK_IN_KHZ 165000 -+#define TMDS_MAX_PIXEL_CLOCK_IN_KHZ_UPMOST 297000 - --static void update_stream_engine_usage( -+static void set_stream_engine_in_use( - struct resource_context *res_ctx, - const struct resource_pool *pool, -- struct stream_encoder *stream_enc, -- bool acquired) -+ struct stream_encoder *stream_enc) - { - int i; - - for (i = 0; i < pool->stream_enc_count; i++) { - if (pool->stream_enc[i] == stream_enc) -- res_ctx->is_stream_enc_acquired[i] = acquired; -+ res_ctx->is_stream_enc_acquired[i] = true; - } - } - - /* TODO: release audio object */ --static void update_audio_usage( -+static void set_audio_in_use( - struct resource_context *res_ctx, - const struct resource_pool *pool, -- struct audio *audio, -- bool acquired) -+ struct audio *audio) - { - int i; - for (i = 0; i < pool->audio_count; i++) { - if (pool->audios[i] == audio) -- res_ctx->is_audio_acquired[i] = acquired; -+ res_ctx->is_audio_acquired[i] = true; - } - } - -@@ -1367,6 +1261,7 @@ static int acquire_first_free_pipe( - pipe_ctx->plane_res.ipp = pool->ipps[i]; - pipe_ctx->plane_res.xfm = pool->transforms[i]; - pipe_ctx->stream_res.opp = pool->opps[i]; -+ pipe_ctx->dis_clk = pool->display_clock; - pipe_ctx->pipe_idx = i; - - -@@ -1431,110 +1326,41 @@ static struct audio *find_first_free_audio( - return 0; - } - --bool resource_is_stream_unchanged( -- struct dc_state *old_context, struct dc_stream_state *stream) -+static void update_stream_signal(struct dc_stream_state *stream) - { -- int i; -+ if (stream->output_signal == SIGNAL_TYPE_NONE) { -+ struct dc_sink *dc_sink = stream->sink; - -- for (i = 0; i < old_context->stream_count; i++) { -- struct dc_stream_state *old_stream = old_context->streams[i]; -- -- if (are_stream_backends_same(old_stream, stream)) -- return true; -+ if (dc_sink->sink_signal == SIGNAL_TYPE_NONE) -+ stream->signal = stream->sink->link->connector_signal; -+ else -+ stream->signal = dc_sink->sink_signal; -+ } else { -+ stream->signal = stream->output_signal; - } - -- return false; --} -- --bool dc_add_stream_to_ctx( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *stream) --{ -- struct dc_context *dc_ctx = dc->ctx; -- enum dc_status res; -- -- if (new_ctx->stream_count >= dc->res_pool->pipe_count) { -- DC_ERROR("Max streams reached, can add stream %p !\n", stream); -- return DC_ERROR_UNEXPECTED; -+ if (dc_is_dvi_signal(stream->signal)) { -+ if (stream->timing.pix_clk_khz > TMDS_MAX_PIXEL_CLOCK_IN_KHZ_UPMOST && -+ stream->sink->sink_signal != SIGNAL_TYPE_DVI_SINGLE_LINK) -+ stream->signal = SIGNAL_TYPE_DVI_DUAL_LINK; -+ else -+ stream->signal = SIGNAL_TYPE_DVI_SINGLE_LINK; - } -- -- new_ctx->streams[new_ctx->stream_count] = stream; -- dc_stream_retain(stream); -- new_ctx->stream_count++; -- -- res = dc->res_pool->funcs->add_stream_to_ctx(dc, new_ctx, stream); -- if (res != DC_OK) -- DC_ERROR("Adding stream %p to context failed with err %d!\n", stream, res); -- -- return res == DC_OK; - } - --bool dc_remove_stream_from_ctx( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *stream) -+bool resource_is_stream_unchanged( -+ struct validate_context *old_context, struct dc_stream_state *stream) - { - int i; -- struct dc_context *dc_ctx = dc->ctx; -- struct pipe_ctx *del_pipe = NULL; -- -- /* Release primary pipe */ -- for (i = 0; i < MAX_PIPES; i++) { -- if (new_ctx->res_ctx.pipe_ctx[i].stream == stream && -- !new_ctx->res_ctx.pipe_ctx[i].top_pipe) { -- del_pipe = &new_ctx->res_ctx.pipe_ctx[i]; -- -- ASSERT(del_pipe->stream_res.stream_enc); -- update_stream_engine_usage( -- &new_ctx->res_ctx, -- dc->res_pool, -- del_pipe->stream_res.stream_enc, -- false); -- -- if (del_pipe->stream_res.audio) -- update_audio_usage( -- &new_ctx->res_ctx, -- dc->res_pool, -- del_pipe->stream_res.audio, -- false); -- -- memset(del_pipe, 0, sizeof(*del_pipe)); -- -- break; -- } -- } - -- if (!del_pipe) { -- DC_ERROR("Pipe not found for stream %p !\n", stream); -- return DC_ERROR_UNEXPECTED; -- } -- -- for (i = 0; i < new_ctx->stream_count; i++) -- if (new_ctx->streams[i] == stream) -- break; -- -- if (new_ctx->streams[i] != stream) { -- DC_ERROR("Context doesn't have stream %p !\n", stream); -- return DC_ERROR_UNEXPECTED; -- } -- -- dc_stream_release(new_ctx->streams[i]); -- new_ctx->stream_count--; -+ for (i = 0; i < old_context->stream_count; i++) { -+ struct dc_stream_state *old_stream = old_context->streams[i]; - -- /* Trim back arrays */ -- for (; i < new_ctx->stream_count; i++) { -- new_ctx->streams[i] = new_ctx->streams[i + 1]; -- new_ctx->stream_status[i] = new_ctx->stream_status[i + 1]; -+ if (are_stream_backends_same(old_stream, stream)) -+ return true; - } - -- new_ctx->streams[new_ctx->stream_count] = NULL; -- memset( -- &new_ctx->stream_status[new_ctx->stream_count], -- 0, -- sizeof(new_ctx->stream_status[0])); -- -- return DC_OK; -+ return false; - } - - static void copy_pipe_ctx( -@@ -1551,7 +1377,7 @@ static void copy_pipe_ctx( - - static struct dc_stream_state *find_pll_sharable_stream( - struct dc_stream_state *stream_needs_pll, -- struct dc_state *context) -+ struct validate_context *context) - { - int i; - -@@ -1602,6 +1428,8 @@ static int get_norm_pix_clk(const struct dc_crtc_timing *timing) - - static void calculate_phy_pix_clks(struct dc_stream_state *stream) - { -+ update_stream_signal(stream); -+ - /* update actual pixel clock on all streams */ - if (dc_is_hdmi_signal(stream->signal)) - stream->phy_pix_clk = get_norm_pix_clk( -@@ -1612,18 +1440,17 @@ static void calculate_phy_pix_clks(struct dc_stream_state *stream) - } - - enum dc_status resource_map_pool_resources( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream) -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context) - { - const struct resource_pool *pool = dc->res_pool; -- int i; -- struct dc_context *dc_ctx = dc->ctx; -- struct pipe_ctx *pipe_ctx = NULL; -- int pipe_idx = -1; -+ int i, j; -+ -+ for (i = 0; old_context && i < context->stream_count; i++) { -+ struct dc_stream_state *stream = context->streams[i]; - -- /* TODO Check if this is needed */ -- /*if (!resource_is_stream_unchanged(old_context, stream)) { -+ if (!resource_is_stream_unchanged(old_context, stream)) { - if (stream != NULL && old_context->streams[i] != NULL) { - stream->bit_depth_params = - old_context->streams[i]->bit_depth_params; -@@ -1631,63 +1458,104 @@ enum dc_status resource_map_pool_resources( - continue; - } - } -- */ - -- /* acquire new resources */ -- pipe_idx = acquire_first_free_pipe(&context->res_ctx, pool, stream); -+ /* mark resources used for stream that is already active */ -+ for (j = 0; j < pool->pipe_count; j++) { -+ struct pipe_ctx *pipe_ctx = -+ &context->res_ctx.pipe_ctx[j]; -+ const struct pipe_ctx *old_pipe_ctx = -+ &old_context->res_ctx.pipe_ctx[j]; -+ -+ if (!are_stream_backends_same(old_pipe_ctx->stream, stream)) -+ continue; -+ -+ if (old_pipe_ctx->top_pipe) -+ continue; -+ -+ pipe_ctx->stream = stream; -+ copy_pipe_ctx(old_pipe_ctx, pipe_ctx); -+ -+ /* Split pipe resource, do not acquire back end */ -+ if (!pipe_ctx->stream_res.stream_enc) -+ continue; -+ -+ set_stream_engine_in_use( -+ &context->res_ctx, pool, -+ pipe_ctx->stream_res.stream_enc); -+ -+ /* Switch to dp clock source only if there is -+ * no non dp stream that shares the same timing -+ * with the dp stream. -+ */ -+ if (dc_is_dp_signal(pipe_ctx->stream->signal) && -+ !find_pll_sharable_stream(stream, context)) -+ pipe_ctx->clock_source = pool->dp_clock_source; - -+ resource_reference_clock_source( -+ &context->res_ctx, pool, -+ pipe_ctx->clock_source); -+ -+ set_audio_in_use(&context->res_ctx, pool, -+ pipe_ctx->stream_res.audio); -+ } -+ } -+ -+ for (i = 0; i < context->stream_count; i++) { -+ struct dc_stream_state *stream = context->streams[i]; -+ struct pipe_ctx *pipe_ctx = NULL; -+ int pipe_idx = -1; -+ -+ if (old_context && resource_is_stream_unchanged(old_context, stream)) -+ continue; -+ /* acquire new resources */ -+ pipe_idx = acquire_first_free_pipe(&context->res_ctx, pool, stream); - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) -- if (pipe_idx < 0) -- acquire_first_split_pipe(&context->res_ctx, pool, stream); -+ if (pipe_idx < 0) -+ acquire_first_split_pipe(&context->res_ctx, pool, stream); - #endif -- if (pipe_idx < 0) -- return DC_NO_CONTROLLER_RESOURCE; -- -- pipe_ctx = &context->res_ctx.pipe_ctx[pipe_idx]; -- -- pipe_ctx->stream_res.stream_enc = -- find_first_free_match_stream_enc_for_link( -- &context->res_ctx, pool, stream); -- -- if (!pipe_ctx->stream_res.stream_enc) -- return DC_NO_STREAM_ENG_RESOURCE; -- -- update_stream_engine_usage( -- &context->res_ctx, pool, -- pipe_ctx->stream_res.stream_enc, -- true); -- -- /* TODO: Add check if ASIC support and EDID audio */ -- if (!stream->sink->converter_disable_audio && -- dc_is_audio_capable_signal(pipe_ctx->stream->signal) && -- stream->audio_info.mode_count) { -- pipe_ctx->stream_res.audio = find_first_free_audio( -- &context->res_ctx, pool); -- -- /* -- * Audio assigned in order first come first get. -- * There are asics which has number of audio -- * resources less then number of pipes -- */ -- if (pipe_ctx->stream_res.audio) -- update_audio_usage(&context->res_ctx, pool, -- pipe_ctx->stream_res.audio, true); -- } -+ if (pipe_idx < 0) -+ return DC_NO_CONTROLLER_RESOURCE; - -- for (i = 0; i < context->stream_count; i++) -- if (context->streams[i] == stream) { -- context->stream_status[i].primary_otg_inst = pipe_ctx->stream_res.tg->inst; -- context->stream_status[i].stream_enc_inst = pipe_ctx->stream_res.stream_enc->id; -- return DC_OK; -+ pipe_ctx = &context->res_ctx.pipe_ctx[pipe_idx]; -+ -+ pipe_ctx->stream_res.stream_enc = -+ find_first_free_match_stream_enc_for_link( -+ &context->res_ctx, pool, stream); -+ -+ if (!pipe_ctx->stream_res.stream_enc) -+ return DC_NO_STREAM_ENG_RESOURCE; -+ -+ set_stream_engine_in_use( -+ &context->res_ctx, pool, -+ pipe_ctx->stream_res.stream_enc); -+ -+ /* TODO: Add check if ASIC support and EDID audio */ -+ if (!stream->sink->converter_disable_audio && -+ dc_is_audio_capable_signal(pipe_ctx->stream->signal) && -+ stream->audio_info.mode_count) { -+ pipe_ctx->stream_res.audio = find_first_free_audio( -+ &context->res_ctx, pool); -+ -+ /* -+ * Audio assigned in order first come first get. -+ * There are asics which has number of audio -+ * resources less then number of pipes -+ */ -+ if (pipe_ctx->stream_res.audio) -+ set_audio_in_use( -+ &context->res_ctx, pool, -+ pipe_ctx->stream_res.audio); - } - -- DC_ERROR("Stream %p not found in new ctx!\n", stream); -- return DC_ERROR_UNEXPECTED; -+ context->stream_status[i].primary_otg_inst = pipe_ctx->stream_res.tg->inst; -+ } -+ -+ return DC_OK; - } - - /* first stream in the context is used to populate the rest */ - void validate_guaranteed_copy_streams( -- struct dc_state *context, -+ struct validate_context *context, - int max_streams) - { - int i; -@@ -1705,79 +1573,6 @@ void validate_guaranteed_copy_streams( - } - } - --void dc_resource_state_copy_construct_current( -- const struct dc *dc, -- struct dc_state *dst_ctx) --{ -- dc_resource_state_copy_construct(dc->current_state, dst_ctx); --} -- -- --void dc_resource_state_construct( -- const struct dc *dc, -- struct dc_state *dst_ctx) --{ -- dst_ctx->dis_clk = dc->res_pool->display_clock; --} -- --bool dc_validate_global_state( -- struct dc *dc, -- struct dc_state *new_ctx) --{ -- enum dc_status result = DC_ERROR_UNEXPECTED; -- int i, j; -- -- if (dc->res_pool->funcs->validate_global && -- dc->res_pool->funcs->validate_global( -- dc, new_ctx) != DC_OK) -- return false; -- -- /* TODO without this SWDEV-114774 brakes */ -- for (i = 0; i < dc->res_pool->pipe_count; i++) { -- struct pipe_ctx *pipe_ctx = &new_ctx->res_ctx.pipe_ctx[i]; -- -- if (pipe_ctx->top_pipe) -- memset(pipe_ctx, 0, sizeof(*pipe_ctx)); -- } -- -- for (i = 0; new_ctx && i < new_ctx->stream_count; i++) { -- struct dc_stream_state *stream = new_ctx->streams[i]; -- -- for (j = 0; j < dc->res_pool->pipe_count; j++) { -- struct pipe_ctx *pipe_ctx = &new_ctx->res_ctx.pipe_ctx[j]; -- -- if (pipe_ctx->stream != stream) -- continue; -- -- /* Switch to dp clock source only if there is -- * no non dp stream that shares the same timing -- * with the dp stream. -- */ -- if (dc_is_dp_signal(pipe_ctx->stream->signal) && -- !find_pll_sharable_stream(stream, new_ctx)) { -- -- resource_unreference_clock_source( -- &new_ctx->res_ctx, -- dc->res_pool, -- &pipe_ctx->clock_source); -- pipe_ctx->clock_source = dc->res_pool->dp_clock_source; -- resource_reference_clock_source( -- &new_ctx->res_ctx, -- dc->res_pool, -- pipe_ctx->clock_source); -- } -- } -- } -- -- result = resource_build_scaling_params_for_context(dc, new_ctx); -- -- if (result == DC_OK) -- if (!dc->res_pool->funcs->validate_bandwidth(dc, new_ctx)) -- result = DC_FAIL_BANDWIDTH_VALIDATE; -- -- return result; --} -- - static void patch_gamut_packet_checksum( - struct encoder_info_packet *gamut_packet) - { -@@ -2419,7 +2214,7 @@ static void set_vsc_info_packet( - /*TODO: stereo 3D support and extend pixel encoding colorimetry*/ - } - --void dc_resource_state_destruct(struct dc_state *context) -+void dc_resource_validate_ctx_destruct(struct validate_context *context) - { - int i, j; - -@@ -2438,12 +2233,12 @@ void dc_resource_state_destruct(struct dc_state *context) - * Copy src_ctx into dst_ctx and retain all surfaces and streams referenced - * by the src_ctx - */ --void dc_resource_state_copy_construct( -- const struct dc_state *src_ctx, -- struct dc_state *dst_ctx) -+void dc_resource_validate_ctx_copy_construct( -+ const struct validate_context *src_ctx, -+ struct validate_context *dst_ctx) - { - int i, j; -- atomic_t ref_count = dst_ctx->ref_count; -+ int ref_count = dst_ctx->ref_count; - - *dst_ctx = *src_ctx; - -@@ -2523,42 +2318,56 @@ void resource_build_info_frame(struct pipe_ctx *pipe_ctx) - } - - enum dc_status resource_map_clock_resources( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream) -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context) - { -- /* acquire new resources */ -+ int i, j; - const struct resource_pool *pool = dc->res_pool; -- struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream( -- &context->res_ctx, stream); - -- if (!pipe_ctx) -- return DC_ERROR_UNEXPECTED; -+ /* acquire new resources */ -+ for (i = 0; i < context->stream_count; i++) { -+ struct dc_stream_state *stream = context->streams[i]; - -- if (dc_is_dp_signal(pipe_ctx->stream->signal) -- || pipe_ctx->stream->signal == SIGNAL_TYPE_VIRTUAL) -- pipe_ctx->clock_source = pool->dp_clock_source; -- else { -- pipe_ctx->clock_source = NULL; -+ if (old_context && resource_is_stream_unchanged(old_context, stream)) -+ continue; - -- if (!dc->config.disable_disp_pll_sharing) -- pipe_ctx->clock_source = resource_find_used_clk_src_for_sharing( -- &context->res_ctx, -- pipe_ctx); -+ for (j = 0; j < MAX_PIPES; j++) { -+ struct pipe_ctx *pipe_ctx = -+ &context->res_ctx.pipe_ctx[j]; - -- if (pipe_ctx->clock_source == NULL) -- pipe_ctx->clock_source = -- dc_resource_find_first_free_pll( -- &context->res_ctx, -- pool); -- } -+ if (context->res_ctx.pipe_ctx[j].stream != stream) -+ continue; - -- if (pipe_ctx->clock_source == NULL) -- return DC_NO_CLOCK_SOURCE_RESOURCE; -+ if (dc_is_dp_signal(pipe_ctx->stream->signal) -+ || pipe_ctx->stream->signal == SIGNAL_TYPE_VIRTUAL) -+ pipe_ctx->clock_source = pool->dp_clock_source; -+ else { -+ pipe_ctx->clock_source = NULL; -+ -+ if (!dc->public.config.disable_disp_pll_sharing) -+ resource_find_used_clk_src_for_sharing( -+ &context->res_ctx, -+ pipe_ctx); -+ -+ if (pipe_ctx->clock_source == NULL) -+ pipe_ctx->clock_source = -+ dc_resource_find_first_free_pll( -+ &context->res_ctx, -+ pool); -+ } -+ -+ if (pipe_ctx->clock_source == NULL) -+ return DC_NO_CLOCK_SOURCE_RESOURCE; - -- resource_reference_clock_source( -- &context->res_ctx, pool, -- pipe_ctx->clock_source); -+ resource_reference_clock_source( -+ &context->res_ctx, pool, -+ pipe_ctx->clock_source); -+ -+ /* only one cs per stream regardless of mpo */ -+ break; -+ } -+ } - - return DC_OK; - } -@@ -2708,9 +2517,10 @@ void resource_build_bit_depth_reduction_params(struct dc_stream_state *stream, - fmt_bit_depth->pixel_encoding = pixel_encoding; - } - --bool dc_validate_stream(struct dc *dc, struct dc_stream_state *stream) -+bool dc_validate_stream(const struct dc *dc, struct dc_stream_state *stream) - { -- struct dc *core_dc = dc; -+ struct core_dc *core_dc = DC_TO_CORE(dc); -+ struct dc_context *dc_ctx = core_dc->ctx; - struct dc_link *link = stream->sink->link; - struct timing_generator *tg = core_dc->res_pool->timing_generators[0]; - enum dc_status res = DC_OK; -@@ -2732,12 +2542,16 @@ bool dc_validate_stream(struct dc *dc, struct dc_stream_state *stream) - link, - &stream->timing); - -+ if (res != DC_OK) -+ DC_ERROR("Failed validation for stream %p, err:%d, !\n", -+ stream, res); -+ - return res == DC_OK; - } - --bool dc_validate_plane(struct dc *dc, const struct dc_plane_state *plane_state) -+bool dc_validate_plane(const struct dc *dc, const struct dc_plane_state *plane_state) - { -- struct dc *core_dc = dc; -+ struct core_dc *core_dc = DC_TO_CORE(dc); - - /* TODO For now validates pixel format only */ - if (core_dc->res_pool->funcs->validate_plane) -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c -index 7717350..a83f124 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c -@@ -63,16 +63,16 @@ static bool construct(struct dc_sink *sink, const struct dc_sink_init_data *init - - void dc_sink_retain(struct dc_sink *sink) - { -- ASSERT(atomic_read(&sink->ref_count) > 0); -- atomic_inc(&sink->ref_count); -+ ASSERT(sink->ref_count > 0); -+ ++sink->ref_count; - } - - void dc_sink_release(struct dc_sink *sink) - { -- ASSERT(atomic_read(&sink->ref_count) > 0); -- atomic_dec(&sink->ref_count); -+ ASSERT(sink->ref_count > 0); -+ --sink->ref_count; - -- if (atomic_read(&sink->ref_count) == 0) { -+ if (sink->ref_count == 0) { - destruct(sink); - dm_free(sink); - } -@@ -88,7 +88,7 @@ struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params) - if (false == construct(sink, init_params)) - goto construct_fail; - -- atomic_inc(&sink->ref_count); -+ ++sink->ref_count; - - return sink; - -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c -index a421779..2de37fe 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c -@@ -33,28 +33,6 @@ - /******************************************************************************* - * Private functions - ******************************************************************************/ --#define TMDS_MAX_PIXEL_CLOCK_IN_KHZ_UPMOST 297000 --static void update_stream_signal(struct dc_stream_state *stream) --{ -- if (stream->output_signal == SIGNAL_TYPE_NONE) { -- struct dc_sink *dc_sink = stream->sink; -- -- if (dc_sink->sink_signal == SIGNAL_TYPE_NONE) -- stream->signal = stream->sink->link->connector_signal; -- else -- stream->signal = dc_sink->sink_signal; -- } else { -- stream->signal = stream->output_signal; -- } -- -- if (dc_is_dvi_signal(stream->signal)) { -- if (stream->timing.pix_clk_khz > TMDS_MAX_PIXEL_CLOCK_IN_KHZ_UPMOST && -- stream->sink->sink_signal != SIGNAL_TYPE_DVI_SINGLE_LINK) -- stream->signal = SIGNAL_TYPE_DVI_DUAL_LINK; -- else -- stream->signal = SIGNAL_TYPE_DVI_SINGLE_LINK; -- } --} - - static bool construct(struct dc_stream_state *stream, - struct dc_sink *dc_sink_data) -@@ -63,6 +41,7 @@ static bool construct(struct dc_stream_state *stream, - - stream->sink = dc_sink_data; - stream->ctx = stream->sink->ctx; -+ stream->sink = dc_sink_data; - - dc_sink_retain(dc_sink_data); - -@@ -102,8 +81,6 @@ static bool construct(struct dc_stream_state *stream, - stream->timing.flags.LTE_340MCSC_SCRAMBLE = dc_sink_data->edid_caps.lte_340mcsc_scramble; - - stream->status.link = stream->sink->link; -- -- update_stream_signal(stream); - return true; - } - -@@ -119,17 +96,19 @@ static void destruct(struct dc_stream_state *stream) - - void dc_stream_retain(struct dc_stream_state *stream) - { -- ASSERT(atomic_read(&stream->ref_count) > 0); -- atomic_inc(&stream->ref_count); -+ -+ ASSERT(stream->ref_count > 0); -+ stream->ref_count++; - } - - void dc_stream_release(struct dc_stream_state *stream) - { -+ - if (stream != NULL) { -- ASSERT(atomic_read(&stream->ref_count) > 0); -- atomic_dec(&stream->ref_count); -+ ASSERT(stream->ref_count > 0); -+ stream->ref_count--; - -- if (atomic_read(&stream->ref_count) == 0) { -+ if (stream->ref_count == 0) { - destruct(stream); - dm_free(stream); - } -@@ -152,7 +131,7 @@ struct dc_stream_state *dc_create_stream_for_sink( - if (false == construct(stream, sink)) - goto construct_fail; - -- atomic_inc(&stream->ref_count); -+ stream->ref_count++; - - return stream; - -@@ -167,11 +146,12 @@ struct dc_stream_status *dc_stream_get_status( - struct dc_stream_state *stream) - { - uint8_t i; -- struct dc *dc = stream->ctx->dc; -+ struct core_dc *dc = DC_TO_CORE(stream->ctx->dc); - -- for (i = 0; i < dc->current_state->stream_count; i++) { -- if (stream == dc->current_state->streams[i]) -- return &dc->current_state->stream_status[i]; -+ for (i = 0; i < dc->current_context->stream_count; i++) { -+ if (stream == dc->current_context->streams[i]) { -+ return &dc->current_context->stream_status[i]; -+ } - } - - return NULL; -@@ -185,7 +165,7 @@ bool dc_stream_set_cursor_attributes( - const struct dc_cursor_attributes *attributes) - { - int i; -- struct dc *core_dc; -+ struct core_dc *core_dc; - struct resource_context *res_ctx; - - if (NULL == stream) { -@@ -197,8 +177,8 @@ bool dc_stream_set_cursor_attributes( - return false; - } - -- core_dc = stream->ctx->dc; -- res_ctx = &core_dc->current_state->res_ctx; -+ core_dc = DC_TO_CORE(stream->ctx->dc); -+ res_ctx = &core_dc->current_context->res_ctx; - - for (i = 0; i < MAX_PIPES; i++) { - struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i]; -@@ -220,7 +200,7 @@ bool dc_stream_set_cursor_position( - const struct dc_cursor_position *position) - { - int i; -- struct dc *core_dc; -+ struct core_dc *core_dc; - struct resource_context *res_ctx; - - if (NULL == stream) { -@@ -233,8 +213,8 @@ bool dc_stream_set_cursor_position( - return false; - } - -- core_dc = stream->ctx->dc; -- res_ctx = &core_dc->current_state->res_ctx; -+ core_dc = DC_TO_CORE(stream->ctx->dc); -+ res_ctx = &core_dc->current_context->res_ctx; - - for (i = 0; i < MAX_PIPES; i++) { - struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i]; -@@ -268,9 +248,9 @@ bool dc_stream_set_cursor_position( - uint32_t dc_stream_get_vblank_counter(const struct dc_stream_state *stream) - { - uint8_t i; -- struct dc *core_dc = stream->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(stream->ctx->dc); - struct resource_context *res_ctx = -- &core_dc->current_state->res_ctx; -+ &core_dc->current_context->res_ctx; - - for (i = 0; i < MAX_PIPES; i++) { - struct timing_generator *tg = res_ctx->pipe_ctx[i].stream_res.tg; -@@ -292,9 +272,9 @@ bool dc_stream_get_scanoutpos(const struct dc_stream_state *stream, - { - uint8_t i; - bool ret = false; -- struct dc *core_dc = stream->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(stream->ctx->dc); - struct resource_context *res_ctx = -- &core_dc->current_state->res_ctx; -+ &core_dc->current_context->res_ctx; - - for (i = 0; i < MAX_PIPES; i++) { - struct timing_generator *tg = res_ctx->pipe_ctx[i].stream_res.tg; -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_surface.c b/drivers/gpu/drm/amd/display/dc/core/dc_surface.c -index e96f63e..3bcca2d 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_surface.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_surface.c -@@ -28,7 +28,7 @@ - #include "dc.h" - - /* DC core (private) */ --#include "core_types.h" -+#include "core_dc.h" - #include "transform.h" - - /******************************************************************************* -@@ -64,9 +64,9 @@ void enable_surface_flip_reporting(struct dc_plane_state *plane_state, - /*register_flip_interrupt(surface);*/ - } - --struct dc_plane_state *dc_create_plane_state(struct dc *dc) -+struct dc_plane_state *dc_create_plane_state(const struct dc *dc) - { -- struct dc *core_dc = dc; -+ struct core_dc *core_dc = DC_TO_CORE(dc); - - struct dc_plane_state *plane_state = dm_alloc(sizeof(*plane_state)); - -@@ -76,7 +76,7 @@ struct dc_plane_state *dc_create_plane_state(struct dc *dc) - if (false == construct(core_dc->ctx, plane_state)) - goto construct_fail; - -- atomic_inc(&plane_state->ref_count); -+ ++plane_state->ref_count; - - return plane_state; - -@@ -91,7 +91,7 @@ const struct dc_plane_status *dc_plane_get_status( - const struct dc_plane_state *plane_state) - { - const struct dc_plane_status *plane_status; -- struct dc *core_dc; -+ struct core_dc *core_dc; - int i; - - if (!plane_state || -@@ -102,14 +102,14 @@ const struct dc_plane_status *dc_plane_get_status( - } - - plane_status = &plane_state->status; -- core_dc = plane_state->ctx->dc; -+ core_dc = DC_TO_CORE(plane_state->ctx->dc); - -- if (core_dc->current_state == NULL) -+ if (core_dc->current_context == NULL) - return NULL; - - for (i = 0; i < core_dc->res_pool->pipe_count; i++) { - struct pipe_ctx *pipe_ctx = -- &core_dc->current_state->res_ctx.pipe_ctx[i]; -+ &core_dc->current_context->res_ctx.pipe_ctx[i]; - - if (pipe_ctx->plane_state != plane_state) - continue; -@@ -122,16 +122,16 @@ const struct dc_plane_status *dc_plane_get_status( - - void dc_plane_state_retain(struct dc_plane_state *plane_state) - { -- ASSERT(atomic_read(&plane_state->ref_count) > 0); -- atomic_inc(&plane_state->ref_count); -+ ASSERT(plane_state->ref_count > 0); -+ ++plane_state->ref_count; - } - - void dc_plane_state_release(struct dc_plane_state *plane_state) - { -- ASSERT(atomic_read(&plane_state->ref_count) > 0); -- atomic_dec(&plane_state->ref_count); -+ ASSERT(plane_state->ref_count > 0); -+ --plane_state->ref_count; - -- if (atomic_read(&plane_state->ref_count) == 0) { -+ if (plane_state->ref_count == 0) { - destruct(plane_state); - dm_free(plane_state); - } -@@ -139,16 +139,16 @@ void dc_plane_state_release(struct dc_plane_state *plane_state) - - void dc_gamma_retain(struct dc_gamma *gamma) - { -- ASSERT(atomic_read(&gamma->ref_count) > 0); -- atomic_inc(&gamma->ref_count); -+ ASSERT(gamma->ref_count > 0); -+ ++gamma->ref_count; - } - - void dc_gamma_release(struct dc_gamma **gamma) - { -- ASSERT(atomic_read(&(*gamma)->ref_count) > 0); -- atomic_dec(&(*gamma)->ref_count); -+ ASSERT((*gamma)->ref_count > 0); -+ --(*gamma)->ref_count; - -- if (atomic_read(&(*gamma)->ref_count) == 0) -+ if ((*gamma)->ref_count == 0) - dm_free((*gamma)); - - *gamma = NULL; -@@ -161,7 +161,7 @@ struct dc_gamma *dc_create_gamma() - if (gamma == NULL) - goto alloc_fail; - -- atomic_inc(&gamma->ref_count); -+ ++gamma->ref_count; - - return gamma; - -@@ -171,16 +171,16 @@ struct dc_gamma *dc_create_gamma() - - void dc_transfer_func_retain(struct dc_transfer_func *tf) - { -- ASSERT(atomic_read(&tf->ref_count) > 0); -- atomic_inc(&tf->ref_count); -+ ASSERT(tf->ref_count > 0); -+ ++tf->ref_count; - } - - void dc_transfer_func_release(struct dc_transfer_func *tf) - { -- ASSERT(atomic_read(&tf->ref_count) > 0); -- atomic_dec(&tf->ref_count); -+ ASSERT(tf->ref_count > 0); -+ --tf->ref_count; - -- if (atomic_read(&tf->ref_count) == 0) -+ if (tf->ref_count == 0) - dm_free(tf); - } - -@@ -191,7 +191,7 @@ struct dc_transfer_func *dc_create_transfer_func() - if (tf == NULL) - goto alloc_fail; - -- atomic_inc(&tf->ref_count); -+ ++tf->ref_count; - - return tf; - -diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h -index d6d7f34..9d08e68 100644 ---- a/drivers/gpu/drm/amd/display/dc/dc.h -+++ b/drivers/gpu/drm/amd/display/dc/dc.h -@@ -34,20 +34,14 @@ - #include "grph_object_ctrl_defs.h" - #include <inc/hw/opp.h> - --#include "inc/hw_sequencer.h" --#include "inc/compressor.h" --#include "dml/display_mode_lib.h" -- --#define DC_VER "3.1.01" -- - #define MAX_SURFACES 3 - #define MAX_STREAMS 6 - #define MAX_SINKS_PER_LINK 4 - -- - /******************************************************************************* - * Display Core Interfaces - ******************************************************************************/ -+ - struct dc_caps { - uint32_t max_streams; - uint32_t max_links; -@@ -99,7 +93,7 @@ struct dc_static_screen_events { - /* Forward declaration*/ - struct dc; - struct dc_plane_state; --struct dc_state; -+struct validate_context; - - struct dc_cap_funcs { - bool (*get_dcc_compression_cap)(const struct dc *dc, -@@ -192,9 +186,7 @@ struct dc_debug { - bool disable_psr; - bool force_abm_enable; - }; --struct dc_state; --struct resource_pool; --struct dce_hwseq; -+ - struct dc { - struct dc_caps caps; - struct dc_cap_funcs cap_funcs; -@@ -202,44 +194,6 @@ struct dc { - struct dc_link_funcs link_funcs; - struct dc_config config; - struct dc_debug debug; -- -- struct dc_context *ctx; -- -- uint8_t link_count; -- struct dc_link *links[MAX_PIPES * 2]; -- -- struct dc_state *current_state; -- struct resource_pool *res_pool; -- -- /*Power State*/ -- enum dc_video_power_state previous_power_state; -- enum dc_video_power_state current_power_state; -- -- /* Display Engine Clock levels */ -- struct dm_pp_clock_levels sclk_lvls; -- -- /* Inputs into BW and WM calculations. */ -- struct bw_calcs_dceip *bw_dceip; -- struct bw_calcs_vbios *bw_vbios; --#ifdef CONFIG_DRM_AMD_DC_DCN1_0 -- struct dcn_soc_bounding_box *dcn_soc; -- struct dcn_ip_params *dcn_ip; -- struct display_mode_lib dml; --#endif -- -- /* HW functions */ -- struct hw_sequencer_funcs hwss; -- struct dce_hwseq *hwseq; -- -- /* temp store of dm_pp_display_configuration -- * to compare to see if display config changed -- */ -- struct dm_pp_display_configuration prev_display_config; -- -- /* FBC compressor */ --#ifdef ENABLE_FBC -- struct compressor *fbc_compressor; --#endif - }; - - enum frame_buffer_mode { -@@ -341,7 +295,7 @@ struct dc_transfer_func { - enum dc_transfer_func_type type; - enum dc_transfer_func_predefined tf; - struct dc_context *ctx; -- atomic_t ref_count; -+ int ref_count; - }; - - /* -@@ -388,7 +342,7 @@ struct dc_plane_state { - - /* private to dc_surface.c */ - enum dc_irq_source irq_source; -- atomic_t ref_count; -+ int ref_count; - }; - - struct dc_plane_info { -@@ -430,7 +384,7 @@ struct dc_surface_update { - /* - * Create a new surface with default parameters; - */ --struct dc_plane_state *dc_create_plane_state(struct dc *dc); -+struct dc_plane_state *dc_create_plane_state(const struct dc *dc); - const struct dc_plane_status *dc_plane_get_status( - const struct dc_plane_state *plane_state); - -@@ -526,7 +480,6 @@ enum surface_update_type { - - struct dc_stream_status { - int primary_otg_inst; -- int stream_enc_inst; - int plane_count; - struct dc_plane_state *plane_states[MAX_SURFACE_NUM]; - -@@ -577,7 +530,7 @@ struct dc_stream_state { - struct dc_stream_status status; - - /* from stream struct */ -- atomic_t ref_count; -+ int ref_count; - }; - - struct dc_stream_update { -@@ -617,8 +570,8 @@ void dc_stream_log( - struct dal_logger *dc_logger, - enum dc_log_type log_type); - --uint8_t dc_get_current_stream_count(struct dc *dc); --struct dc_stream_state *dc_get_stream_at_index(struct dc *dc, uint8_t i); -+uint8_t dc_get_current_stream_count(const struct dc *dc); -+struct dc_stream_state *dc_get_stream_at_index(const struct dc *dc, uint8_t i); - - /* - * Return the current frame counter. -@@ -635,41 +588,6 @@ bool dc_stream_get_scanoutpos(const struct dc_stream_state *stream, - uint32_t *h_position, - uint32_t *v_position); - --bool dc_add_stream_to_ctx( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *stream); -- --bool dc_remove_stream_from_ctx( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *stream); -- -- --bool dc_add_plane_to_context( -- const struct dc *dc, -- struct dc_stream_state *stream, -- struct dc_plane_state *plane_state, -- struct dc_state *context); -- --bool dc_remove_plane_from_context( -- const struct dc *dc, -- struct dc_stream_state *stream, -- struct dc_plane_state *plane_state, -- struct dc_state *context); -- --bool dc_rem_all_planes_for_stream( -- const struct dc *dc, -- struct dc_stream_state *stream, -- struct dc_state *context); -- --bool dc_add_all_planes_for_stream( -- const struct dc *dc, -- struct dc_stream_state *stream, -- struct dc_plane_state * const *plane_states, -- int plane_count, -- struct dc_state *context); -- - /* - * Structure to store surface/stream associations for validation - */ -@@ -679,13 +597,24 @@ struct dc_validation_set { - uint8_t plane_count; - }; - --bool dc_validate_stream(struct dc *dc, struct dc_stream_state *stream); -+bool dc_validate_stream(const struct dc *dc, struct dc_stream_state *stream); - --bool dc_validate_plane(struct dc *dc, const struct dc_plane_state *plane_state); -+bool dc_validate_plane(const struct dc *dc, const struct dc_plane_state *plane_state); -+/* -+ * This function takes a set of resources and checks that they are cofunctional. -+ * -+ * After this call: -+ * No hardware is programmed for call. Only validation is done. -+ */ -+struct validate_context *dc_get_validate_context( -+ const struct dc *dc, -+ const struct dc_validation_set set[], -+ uint8_t set_count); - --bool dc_validate_global_state( -- struct dc *dc, -- struct dc_state *new_ctx); -+bool dc_validate_resources( -+ const struct dc *dc, -+ const struct dc_validation_set set[], -+ uint8_t set_count); - - /* - * This function takes a stream and checks if it is guaranteed to be supported. -@@ -695,20 +624,15 @@ bool dc_validate_global_state( - * No hardware is programmed for call. Only validation is done. - */ - -- --void dc_resource_state_construct( -+bool dc_validate_guaranteed( - const struct dc *dc, -- struct dc_state *dst_ctx); -- --void dc_resource_state_copy_construct( -- const struct dc_state *src_ctx, -- struct dc_state *dst_ctx); -+ struct dc_stream_state *stream); - --void dc_resource_state_copy_construct_current( -- const struct dc *dc, -- struct dc_state *dst_ctx); -+void dc_resource_validate_ctx_copy_construct( -+ const struct validate_context *src_ctx, -+ struct validate_context *dst_ctx); - --void dc_resource_state_destruct(struct dc_state *context); -+void dc_resource_validate_ctx_destruct(struct validate_context *context); - - /* - * TODO update to make it about validation sets -@@ -719,7 +643,7 @@ void dc_resource_state_destruct(struct dc_state *context); - * Phy, Encoder, Timing Generator are programmed and enabled. - * New streams are enabled with blank stream; no memory read. - */ --bool dc_commit_state(struct dc *dc, struct dc_state *context); -+bool dc_commit_context(struct dc *dc, struct validate_context *context); - - /* - * Set up streams and links associated to drive sinks -@@ -729,13 +653,17 @@ bool dc_commit_state(struct dc *dc, struct dc_state *context); - * Phy, Encoder, Timing Generator are programmed and enabled. - * New streams are enabled with blank stream; no memory read. - */ -+bool dc_commit_streams( -+ struct dc *dc, -+ struct dc_stream_state *streams[], -+ uint8_t stream_count); - /* - * Enable stereo when commit_streams is not required, - * for example, frame alternate. - */ - bool dc_enable_stereo( - struct dc *dc, -- struct dc_state *context, -+ struct validate_context *context, - struct dc_stream_state *streams[], - uint8_t stream_count); - -@@ -758,8 +686,8 @@ enum surface_update_type dc_check_update_surfaces_for_stream( - const struct dc_stream_status *stream_status); - - --void dc_retain_state(struct dc_state *context); --void dc_release_state(struct dc_state *context); -+void dc_retain_validate_context(struct validate_context *context); -+void dc_release_validate_context(struct validate_context *context); - - /******************************************************************************* - * Link Interfaces -@@ -785,7 +713,6 @@ struct dpcd_caps { - - bool allow_invalid_MSA_timing_param; - bool panel_mode_edp; -- bool dpcd_display_control_capable; - }; - - struct dc_link_status { -@@ -849,7 +776,7 @@ struct dc_link { - - /* Private to DC core */ - -- const struct dc *dc; -+ const struct core_dc *dc; - - struct dc_context *ctx; - -@@ -858,8 +785,8 @@ struct dc_link { - union ddi_channel_mapping ddi_channel_mapping; - struct connector_device_tag_info device_tag; - struct dpcd_caps dpcd_caps; -- unsigned short chip_caps; - unsigned int dpcd_sink_count; -+ - enum edp_revision edp_revision; - bool psr_enabled; - -@@ -880,13 +807,19 @@ const struct dc_link_status *dc_link_get_status(const struct dc_link *dc_link); - * boot time. They cannot be created or destroyed. - * Use dc_get_caps() to get number of links. - */ --struct dc_link *dc_get_link_at_index(struct dc *dc, uint32_t link_index); -+struct dc_link *dc_get_link_at_index(const struct dc *dc, uint32_t link_index); -+ -+/* Return id of physical connector represented by a dc_link at link_index.*/ -+const struct graphics_object_id dc_get_link_id_at_index( -+ struct dc *dc, uint32_t link_index); - - /* Set backlight level of an embedded panel (eDP, LVDS). */ - bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level, - uint32_t frame_ramp, const struct dc_stream_state *stream); - --bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable, bool wait); -+bool dc_link_set_abm_disable(const struct dc_link *dc_link); -+ -+bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable); - - bool dc_link_get_psr_state(const struct dc_link *dc_link, uint32_t *psr_state); - -@@ -924,6 +857,7 @@ void dc_link_remove_remote_sink( - struct dc_sink *sink); - - /* Used by diagnostics for virtual link at the moment */ -+void dc_link_set_sink(struct dc_link *link, struct dc_sink *sink); - - void dc_link_dp_set_drive_settings( - struct dc_link *link, -@@ -980,12 +914,14 @@ struct dc_sink { - struct dc_context *ctx; - - /* private to dc_sink.c */ -- atomic_t ref_count; -+ int ref_count; - }; - - void dc_sink_retain(struct dc_sink *sink); - void dc_sink_release(struct dc_sink *sink); - -+const struct audio **dc_get_audios(struct dc *dc); -+ - struct dc_sink_init_data { - enum signal_type sink_signal; - struct dc_link *link; -@@ -994,6 +930,8 @@ struct dc_sink_init_data { - }; - - struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params); -+bool dc_sink_get_container_id(struct dc_sink *dc_sink, struct dc_container_id *container_id); -+bool dc_sink_set_container_id(struct dc_sink *dc_sink, const struct dc_container_id *container_id); - - /******************************************************************************* - * Cursor interfaces - To manages the cursor within a stream -@@ -1020,7 +958,7 @@ enum dc_irq_source dc_interrupt_to_irq_source( - struct dc *dc, - uint32_t src_id, - uint32_t ext_id); --void dc_interrupt_set(struct dc *dc, enum dc_irq_source src, bool enable); -+void dc_interrupt_set(const struct dc *dc, enum dc_irq_source src, bool enable); - void dc_interrupt_ack(struct dc *dc, enum dc_irq_source src); - enum dc_irq_source dc_get_hpd_irq_source_at_index( - struct dc *dc, uint32_t link_index); -@@ -1033,12 +971,51 @@ void dc_set_power_state( - struct dc *dc, - enum dc_acpi_cm_power_state power_state, - enum dc_video_power_state video_power_state); --void dc_resume(struct dc *dc); -+void dc_resume(const struct dc *dc); - - /* - * DPCD access interfaces - */ - -+bool dc_read_aux_dpcd( -+ struct dc *dc, -+ uint32_t link_index, -+ uint32_t address, -+ uint8_t *data, -+ uint32_t size); -+ -+bool dc_write_aux_dpcd( -+ struct dc *dc, -+ uint32_t link_index, -+ uint32_t address, -+ const uint8_t *data, -+ uint32_t size); -+ -+bool dc_read_aux_i2c( -+ struct dc *dc, -+ uint32_t link_index, -+ enum i2c_mot_mode mot, -+ uint32_t address, -+ uint8_t *data, -+ uint32_t size); -+ -+bool dc_write_aux_i2c( -+ struct dc *dc, -+ uint32_t link_index, -+ enum i2c_mot_mode mot, -+ uint32_t address, -+ const uint8_t *data, -+ uint32_t size); -+ -+bool dc_query_ddc_data( -+ struct dc *dc, -+ uint32_t link_index, -+ uint32_t address, -+ uint8_t *write_buf, -+ uint32_t write_size, -+ uint8_t *read_buf, -+ uint32_t read_size); -+ - bool dc_submit_i2c( - struct dc *dc, - uint32_t link_index, -diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h -index 94f83cd..8d15046 100644 ---- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h -+++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h -@@ -433,7 +433,7 @@ struct dc_gamma { - struct dc_context *ctx; - - /* private to dc_surface.c */ -- atomic_t ref_count; -+ int ref_count; - }; - - /* Used by both ipp amd opp functions*/ -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c -index d3b61b9..88e266a 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c -@@ -602,90 +602,6 @@ static uint32_t dce110_get_pix_clk_dividers( - return pll_calc_error; - } - --static uint32_t dce110_get_pll_pixel_rate_in_hz( -- struct clock_source *cs, -- struct pixel_clk_params *pix_clk_params, -- struct pll_settings *pll_settings) --{ -- uint32_t inst = pix_clk_params->controller_id - CONTROLLER_ID_D0; -- struct dc *dc_core = cs->ctx->dc; -- struct dc_state *context = dc_core->current_state; -- struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[inst]; -- -- /* This function need separate to different DCE version, before separate, just use pixel clock */ -- return pipe_ctx->stream->phy_pix_clk; -- --} -- --static uint32_t dce110_get_dp_pixel_rate_from_combo_phy_pll( -- struct clock_source *cs, -- struct pixel_clk_params *pix_clk_params, -- struct pll_settings *pll_settings) --{ -- uint32_t inst = pix_clk_params->controller_id - CONTROLLER_ID_D0; -- struct dc *dc_core = cs->ctx->dc; -- struct dc_state *context = dc_core->current_state; -- struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[inst]; -- -- /* This function need separate to different DCE version, before separate, just use pixel clock */ -- return pipe_ctx->stream->phy_pix_clk; --} -- --static uint32_t dce110_get_d_to_pixel_rate_in_hz( -- struct clock_source *cs, -- struct pixel_clk_params *pix_clk_params, -- struct pll_settings *pll_settings) --{ -- uint32_t inst = pix_clk_params->controller_id - CONTROLLER_ID_D0; -- struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(cs); -- int dto_enabled = 0; -- struct fixed31_32 pix_rate; -- -- REG_GET(PIXEL_RATE_CNTL[inst], DP_DTO0_ENABLE, &dto_enabled); -- -- if (dto_enabled) { -- uint32_t phase = 0; -- uint32_t modulo = 0; -- REG_GET(PHASE[inst], DP_DTO0_PHASE, &phase); -- REG_GET(MODULO[inst], DP_DTO0_MODULO, &modulo); -- -- if (modulo == 0) { -- return 0; -- } -- -- pix_rate = dal_fixed31_32_from_int(clk_src->ref_freq_khz); -- pix_rate = dal_fixed31_32_mul_int(pix_rate, 1000); -- pix_rate = dal_fixed31_32_mul_int(pix_rate, phase); -- pix_rate = dal_fixed31_32_div_int(pix_rate, modulo); -- -- return dal_fixed31_32_round(pix_rate); -- } else { -- return dce110_get_dp_pixel_rate_from_combo_phy_pll(cs, pix_clk_params, pll_settings); -- } --} -- --static uint32_t dce110_get_pix_rate_in_hz( -- struct clock_source *cs, -- struct pixel_clk_params *pix_clk_params, -- struct pll_settings *pll_settings) --{ -- uint32_t pix_rate = 0; -- switch (pix_clk_params->signal_type) { -- case SIGNAL_TYPE_DISPLAY_PORT: -- case SIGNAL_TYPE_DISPLAY_PORT_MST: -- case SIGNAL_TYPE_EDP: -- case SIGNAL_TYPE_VIRTUAL: -- pix_rate = dce110_get_d_to_pixel_rate_in_hz(cs, pix_clk_params, pll_settings); -- break; -- case SIGNAL_TYPE_HDMI_TYPE_A: -- default: -- pix_rate = dce110_get_pll_pixel_rate_in_hz(cs, pix_clk_params, pll_settings); -- break; -- } -- -- return pix_rate; --} -- - static bool disable_spread_spectrum(struct dce110_clk_src *clk_src) - { - enum bp_result result; -@@ -1046,8 +962,7 @@ static bool dce110_clock_source_power_down( - static const struct clock_source_funcs dce110_clk_src_funcs = { - .cs_power_down = dce110_clock_source_power_down, - .program_pix_clk = dce110_program_pix_clk, -- .get_pix_clk_dividers = dce110_get_pix_clk_dividers, -- .get_pix_rate_in_hz = dce110_get_pix_rate_in_hz -+ .get_pix_clk_dividers = dce110_get_pix_clk_dividers - }; - - static void get_ss_info_from_atombios( -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.h b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.h -index c45e2f7..fc92388 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.h -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.h -@@ -55,8 +55,6 @@ - CS_SF(PHYPLLA_PIXCLK_RESYNC_CNTL, PHYPLLA_DCCG_DEEP_COLOR_CNTL, mask_sh),\ - CS_SF(PHYPLLA_PIXCLK_RESYNC_CNTL, PHYPLLA_PIXCLK_DOUBLE_RATE_ENABLE, mask_sh) - --#if defined(CONFIG_DRM_AMD_DC_DCN1_0) -- - #define CS_COMMON_REG_LIST_DCN1_0(index, pllid) \ - SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\ - SRII(PHASE, DP_DTO, 0),\ -@@ -73,13 +71,9 @@ - SRII(PIXEL_RATE_CNTL, OTG, 3) - - #define CS_COMMON_MASK_SH_LIST_DCN1_0(mask_sh)\ -- CS_SF(DP_DTO0_PHASE, DP_DTO0_PHASE, mask_sh),\ -- CS_SF(DP_DTO0_MODULO, DP_DTO0_MODULO, mask_sh),\ - CS_SF(PHYPLLA_PIXCLK_RESYNC_CNTL, PHYPLLA_DCCG_DEEP_COLOR_CNTL, mask_sh),\ - CS_SF(OTG0_PIXEL_RATE_CNTL, DP_DTO0_ENABLE, mask_sh) - --#endif -- - #define CS_REG_FIELD_LIST(type) \ - type PLL_REF_DIV_SRC; \ - type DCCG_DEEP_COLOR_CNTL1; \ -@@ -87,8 +81,6 @@ - type PHYPLLA_PIXCLK_DOUBLE_RATE_ENABLE; \ - type PLL_POST_DIV_PIXCLK; \ - type PLL_REF_DIV; \ -- type DP_DTO0_PHASE; \ -- type DP_DTO0_MODULO; \ - type DP_DTO0_ENABLE; - - struct dce110_clk_src_shift { -@@ -107,9 +99,9 @@ struct dce110_clk_src_regs { - /* below are for DTO. - * todo: should probably use different struct to not waste space - */ -- uint32_t PHASE[MAX_PIPES]; -- uint32_t MODULO[MAX_PIPES]; -- uint32_t PIXEL_RATE_CNTL[MAX_PIPES]; -+ uint32_t PHASE[4]; -+ uint32_t MODULO[4]; -+ uint32_t PIXEL_RATE_CNTL[4]; - }; - - struct dce110_clk_src { -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c -index 06d9a3e..a73228b 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c -@@ -29,12 +29,14 @@ - #include "fixed32_32.h" - #include "bios_parser_interface.h" - #include "dc.h" -+#include "core_dc.h" - #include "dce_abm.h" - #include "dmcu.h" - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) - #include "dcn_calcs.h" -+#include "core_dc.h" - #endif --#include "core_types.h" -+ - - - #define TO_DCE_CLOCKS(clocks)\ -@@ -325,14 +327,13 @@ static bool dce_clock_set_min_clocks_state( - return true; - } - --static int dce_set_clock( -+static void dce_set_clock( - struct display_clock *clk, - int requested_clk_khz) - { - struct dce_disp_clk *clk_dce = TO_DCE_CLOCKS(clk); - struct bp_pixel_clock_parameters pxl_clk_params = { 0 }; - struct dc_bios *bp = clk->ctx->dc_bios; -- int actual_clock = requested_clk_khz; - - /* Make sure requested clock isn't lower than minimum threshold*/ - if (requested_clk_khz > 0) -@@ -350,43 +351,39 @@ static int dce_set_clock( - /* Cache the fixed display clock*/ - clk_dce->dfs_bypass_disp_clk = - pxl_clk_params.dfs_bypass_display_clock; -- actual_clock = pxl_clk_params.dfs_bypass_display_clock; - } - - /* from power down, we need mark the clock state as ClocksStateNominal - * from HWReset, so when resume we will call pplib voltage regulator.*/ - if (requested_clk_khz == 0) - clk->cur_min_clks_state = DM_PP_CLOCKS_STATE_NOMINAL; -- return actual_clock; - } - --static int dce_psr_set_clock( -+static void dce_psr_set_clock( - struct display_clock *clk, - int requested_clk_khz) - { - struct dce_disp_clk *clk_dce = TO_DCE_CLOCKS(clk); - struct dc_context *ctx = clk_dce->base.ctx; -- struct dc *core_dc = ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(ctx->dc); - struct dmcu *dmcu = core_dc->res_pool->dmcu; -- int actual_clk_khz = requested_clk_khz; - -- actual_clk_khz = dce_set_clock(clk, requested_clk_khz); -+ dce_set_clock(clk, requested_clk_khz); - -- dmcu->funcs->set_psr_wait_loop(dmcu, actual_clk_khz / 1000 / 7); -- return actual_clk_khz; -+ dmcu->funcs->set_psr_wait_loop(dmcu, requested_clk_khz / 1000 / 7); - } - --static int dce112_set_clock( -+static void dce112_set_clock( - struct display_clock *clk, - int requested_clk_khz) - { - struct dce_disp_clk *clk_dce = TO_DCE_CLOCKS(clk); - struct bp_set_dce_clock_parameters dce_clk_params; - struct dc_bios *bp = clk->ctx->dc_bios; -- struct dc *core_dc = clk->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(clk->ctx->dc); - struct abm *abm = core_dc->res_pool->abm; - struct dmcu *dmcu = core_dc->res_pool->dmcu; -- int actual_clock = requested_clk_khz; -+ - /* Prepare to program display clock*/ - memset(&dce_clk_params, 0, sizeof(dce_clk_params)); - -@@ -400,7 +397,6 @@ static int dce112_set_clock( - dce_clk_params.clock_type = DCECLOCK_TYPE_DISPLAY_CLOCK; - - bp->funcs->set_dce_clock(bp, &dce_clk_params); -- actual_clock = dce_clk_params.target_clock_frequency; - - /* from power down, we need mark the clock state as ClocksStateNominal - * from HWReset, so when resume we will call pplib voltage regulator.*/ -@@ -417,11 +413,10 @@ static int dce112_set_clock( - - bp->funcs->set_dce_clock(bp, &dce_clk_params); - -- if (abm->funcs->is_dmcu_initialized(abm) && clk_dce->dfs_bypass_disp_clk != actual_clock) -+ if (abm->funcs->is_dmcu_initialized(abm)) - dmcu->funcs->set_psr_wait_loop(dmcu, -- actual_clock / 1000 / 7); -- clk_dce->dfs_bypass_disp_clk = actual_clock; -- return actual_clock; -+ requested_clk_khz / 1000 / 7); -+ - } - - static void dce_clock_read_integrated_info(struct dce_disp_clk *clk_dce) -@@ -620,7 +615,7 @@ static bool dce_apply_clock_voltage_request( - if (send_request) { - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) - if (clk->ctx->dce_version >= DCN_VERSION_1_0) { -- struct dc *core_dc = clk->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(clk->ctx->dc); - /*use dcfclk request voltage*/ - clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DCFCLK; - clock_voltage_req.clocks_in_khz = -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c -index 313f61b..92902f0 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c -@@ -103,7 +103,7 @@ static void dce_get_dmcu_psr_state(struct dmcu *dmcu, uint32_t *psr_state) - REG_UPDATE(DMCU_RAM_ACCESS_CTRL, IRAM_HOST_ACCESS_EN, 0); - } - --static void dce_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable, bool wait) -+static void dce_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable) - { - struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu); - unsigned int dmcu_max_retry_on_wait_reg_ready = 801; -@@ -127,18 +127,17 @@ static void dce_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable, bool wait) - - /* notifyDMCUMsg */ - REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1); -- if (wait == true) { -- for (retryCount = 0; retryCount <= 100; retryCount++) { -- dce_get_dmcu_psr_state(dmcu, &psr_state); -- if (enable) { -- if (psr_state != 0) -- break; -- } else { -- if (psr_state == 0) -- break; -- } -- dm_delay_in_microseconds(dmcu->ctx, 10); -+ -+ for (retryCount = 0; retryCount <= 100; retryCount++) { -+ dce_get_dmcu_psr_state(dmcu, &psr_state); -+ if (enable) { -+ if (psr_state != 0) -+ break; -+ } else { -+ if (psr_state == 0) -+ break; - } -+ dm_delay_in_microseconds(dmcu->ctx, 10); - } - } - -@@ -261,8 +260,6 @@ static void dce_psr_wait_loop( - { - struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu); - union dce_dmcu_psr_config_data_wait_loop_reg1 masterCmdData1; -- if (cached_wait_loop_number == wait_loop_number) -- return; - - /* waitDMCUReadyForCmd */ - REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 0, 1, 10000); -@@ -339,7 +336,7 @@ static void dcn10_get_dmcu_psr_state(struct dmcu *dmcu, uint32_t *psr_state) - REG_UPDATE(DMCU_RAM_ACCESS_CTRL, IRAM_HOST_ACCESS_EN, 0); - } - --static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable, bool wait) -+static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable) - { - struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu); - unsigned int dmcu_max_retry_on_wait_reg_ready = 801; -@@ -368,7 +365,6 @@ static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable, bool wait) - * Exit PSR may need to wait 1-2 frames to power up. Timeout after at - * least a few frames. Should never hit the max retry assert below. - */ -- if (wait == true) { - for (retryCount = 0; retryCount <= 1000; retryCount++) { - dcn10_get_dmcu_psr_state(dmcu, &psr_state); - if (enable) { -@@ -383,7 +379,6 @@ static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable, bool wait) - - /* assert if max retry hit */ - ASSERT(retryCount <= 1000); -- } - } - - static void dcn10_dmcu_setup_psr(struct dmcu *dmcu, -@@ -505,7 +500,7 @@ static void dcn10_psr_wait_loop( - { - struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu); - union dce_dmcu_psr_config_data_wait_loop_reg1 masterCmdData1; -- if (wait_loop_number != 0) { -+ - /* waitDMCUReadyForCmd */ - REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 0, 1, 10000); - -@@ -519,7 +514,6 @@ static void dcn10_psr_wait_loop( - - /* notifyDMCUMsg */ - REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1); -- } - } - - static void dcn10_get_psr_wait_loop(unsigned int *psr_wait_loop_number) -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.c b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.c -index d2e66b1..4894e17 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.c -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.c -@@ -26,7 +26,7 @@ - #include "dce_hwseq.h" - #include "reg_helper.h" - #include "hw_sequencer.h" --#include "core_types.h" -+#include "core_dc.h" - - #define CTX \ - hws->ctx -@@ -44,7 +44,7 @@ void dce_enable_fe_clock(struct dce_hwseq *hws, - DCFE_CLOCK_ENABLE, enable); - } - --void dce_pipe_control_lock(struct dc *dc, -+void dce_pipe_control_lock(struct core_dc *dc, - struct pipe_ctx *pipe, - bool lock) - { -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h -index 2d3a41f..9a97d8e 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h -@@ -206,20 +206,7 @@ - SR(D1VGA_CONTROL), \ - SR(D2VGA_CONTROL), \ - SR(D3VGA_CONTROL), \ -- SR(D4VGA_CONTROL), \ -- /* todo: get these from GVM instead of reading registers ourselves */\ -- MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32),\ -- MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32),\ -- MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32),\ -- MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32),\ -- MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32),\ -- MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32),\ -- MMHUB_SR(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32),\ -- MMHUB_SR(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32),\ -- MMHUB_SR(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB),\ -- MMHUB_SR(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB),\ -- MMHUB_SR(MC_VM_SYSTEM_APERTURE_LOW_ADDR),\ -- MMHUB_SR(MC_VM_SYSTEM_APERTURE_HIGH_ADDR) -+ SR(D4VGA_CONTROL) - - #define HWSEQ_DCN1_REG_LIST()\ - HWSEQ_DCN_REG_LIST(), \ -@@ -325,19 +312,6 @@ struct dce_hwseq_registers { - uint32_t D2VGA_CONTROL; - uint32_t D3VGA_CONTROL; - uint32_t D4VGA_CONTROL; -- /* MMHUB registers. read only. temporary hack */ -- uint32_t VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32; -- uint32_t VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32; -- uint32_t VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32; -- uint32_t VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32; -- uint32_t VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32; -- uint32_t VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32; -- uint32_t VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32; -- uint32_t VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32; -- uint32_t MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB; -- uint32_t MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB; -- uint32_t MC_VM_SYSTEM_APERTURE_LOW_ADDR; -- uint32_t MC_VM_SYSTEM_APERTURE_HIGH_ADDR; - }; - /* set field name */ - #define HWS_SF(blk_name, reg_name, field_name, post_fix)\ -@@ -458,17 +432,7 @@ struct dce_hwseq_registers { - HWS_SF(, DCHUBBUB_SDPIF_AGP_BASE, SDPIF_AGP_BASE, mask_sh), \ - HWS_SF(, DCHUBBUB_SDPIF_AGP_BOT, SDPIF_AGP_BOT, mask_sh), \ - HWS_SF(, DCHUBBUB_SDPIF_AGP_TOP, SDPIF_AGP_TOP, mask_sh), \ -- HWS_SF(DPP_TOP0_, DPP_CONTROL, DPPCLK_RATE_CONTROL, mask_sh), \ -- /* todo: get these from GVM instead of reading registers ourselves */\ -- HWS_SF(, VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, PAGE_DIRECTORY_ENTRY_HI32, mask_sh),\ -- HWS_SF(, VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, PAGE_DIRECTORY_ENTRY_LO32, mask_sh),\ -- HWS_SF(, VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, LOGICAL_PAGE_NUMBER_HI4, mask_sh),\ -- HWS_SF(, VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, LOGICAL_PAGE_NUMBER_LO32, mask_sh),\ -- HWS_SF(, VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32, PHYSICAL_PAGE_ADDR_HI4, mask_sh),\ -- HWS_SF(, VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32, PHYSICAL_PAGE_ADDR_LO32, mask_sh),\ -- HWS_SF(, MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, PHYSICAL_PAGE_NUMBER_MSB, mask_sh),\ -- HWS_SF(, MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, PHYSICAL_PAGE_NUMBER_LSB, mask_sh),\ -- HWS_SF(, MC_VM_SYSTEM_APERTURE_LOW_ADDR, LOGICAL_ADDR, mask_sh) -+ HWS_SF(DPP_TOP0_, DPP_CONTROL, DPPCLK_RATE_CONTROL, mask_sh) - - #define HWSEQ_REG_FIELD_LIST(type) \ - type DCFE_CLOCK_ENABLE; \ -@@ -487,18 +451,6 @@ struct dce_hwseq_registers { - type PIXEL_RATE_SOURCE; \ - type PHYPLL_PIXEL_RATE_SOURCE; \ - type PIXEL_RATE_PLL_SOURCE; \ -- /* todo: get these from GVM instead of reading registers ourselves */\ -- type PAGE_DIRECTORY_ENTRY_HI32;\ -- type PAGE_DIRECTORY_ENTRY_LO32;\ -- type LOGICAL_PAGE_NUMBER_HI4;\ -- type LOGICAL_PAGE_NUMBER_LO32;\ -- type PHYSICAL_PAGE_ADDR_HI4;\ -- type PHYSICAL_PAGE_ADDR_LO32;\ -- type PHYSICAL_PAGE_NUMBER_MSB;\ -- type PHYSICAL_PAGE_NUMBER_LSB;\ -- type LOGICAL_ADDR; \ -- type ENABLE_L1_TLB;\ -- type SYSTEM_ACCESS_MODE; - - #define HWSEQ_DCN_REG_FIELD_LIST(type) \ - type VUPDATE_NO_LOCK_EVENT_CLEAR; \ -@@ -576,7 +528,7 @@ enum blnd_mode { - void dce_enable_fe_clock(struct dce_hwseq *hwss, - unsigned int inst, bool enable); - --void dce_pipe_control_lock(struct dc *dc, -+void dce_pipe_control_lock(struct core_dc *dc, - struct pipe_ctx *pipe, - bool lock); - -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c -index 0ce94ed..7e9afab8 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c -@@ -744,7 +744,7 @@ void dce110_link_encoder_edp_backlight_control( - return; - } - -- if (!enable && !is_panel_backlight_on(enc110)) { -+ if (!enable && !is_panel_powered_on(enc110)) { - dm_logger_write(ctx->logger, LOG_HW_RESUME_S3, - "%s: panel already powered down. Do nothing.\n", - __func__); -@@ -887,9 +887,6 @@ static bool dce110_link_encoder_validate_hdmi_output( - crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) - return false; - -- if (!enc110->base.features.flags.bits.HDMI_6GB_EN && -- adjusted_pix_clk_khz >= 300000) -- return false; - return true; - } - -@@ -1011,7 +1008,6 @@ bool dce110_link_encoder_construct( - bp_cap_info.DP_HBR2_EN; - enc110->base.features.flags.bits.IS_HBR3_CAPABLE = - bp_cap_info.DP_HBR3_EN; -- enc110->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN; - } - - return true; -@@ -1292,8 +1288,6 @@ void dce110_link_encoder_disable_output( - /* OF_SKIP_POWER_DOWN_INACTIVE_ENCODER */ - return; - } -- if (enc110->base.connector.id == CONNECTOR_ID_EDP) -- dce110_link_encoder_edp_backlight_control(enc, false); - /* Power-down RX and disable GPU PHY should be paired. - * Disabling PHY without powering down RX may cause - * symbol lock loss, on which we will get DP Sink interrupt. */ -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c -index 83d9caa..6276697 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c -@@ -686,8 +686,6 @@ void dce_mem_input_construct( - dce_mi->shifts = mi_shift; - dce_mi->masks = mi_mask; - -- dce_mi->base.mpcc_id = 0xf; -- dce_mi->base.opp_id = 0xf; - } - - void dce112_mem_input_construct( -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_transform.h b/drivers/gpu/drm/amd/display/dc/dce/dce_transform.h -index 8e831d4..8632d8f 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_transform.h -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_transform.h -@@ -78,10 +78,6 @@ - SRI(SCL_UPDATE, SCL, id), \ - SRI(SCL_F_SHARP_CONTROL, SCL, id) - --#define XFM_COMMON_REG_LIST_DCE80(id) \ -- XFM_COMMON_REG_LIST_DCE_BASE(id), \ -- SRI(DCFE_MEM_LIGHT_SLEEP_CNTL, CRTC, id) -- - #define XFM_COMMON_REG_LIST_DCE100(id) \ - XFM_COMMON_REG_LIST_DCE_BASE(id), \ - SRI(DCFE_MEM_PWR_CTRL, CRTC, id), \ -@@ -161,12 +157,6 @@ - XFM_SF(SCL_UPDATE, SCL_COEF_UPDATE_COMPLETE, mask_sh), \ - XFM_SF(LB_DATA_FORMAT, ALPHA_EN, mask_sh) - --#define XFM_COMMON_MASK_SH_LIST_DCE80(mask_sh) \ -- XFM_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh), \ -- OPP_SF(DCFE_MEM_LIGHT_SLEEP_CNTL, REGAMMA_LUT_LIGHT_SLEEP_DIS, mask_sh),\ -- OPP_SF(DCFE_MEM_LIGHT_SLEEP_CNTL, DCP_LUT_LIGHT_SLEEP_DIS, mask_sh),\ -- OPP_SF(DCFE_MEM_LIGHT_SLEEP_CNTL, REGAMMA_LUT_MEM_PWR_STATE, mask_sh) -- - #define XFM_COMMON_MASK_SH_LIST_DCE110(mask_sh) \ - XFM_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh), \ - XFM_SF(DCFE_MEM_PWR_CTRL, SCL_COEFF_MEM_PWR_DIS, mask_sh), \ -@@ -206,17 +196,6 @@ - XFM_SF(DCP0_OUTPUT_CSC_C11_C12, OUTPUT_CSC_C11, mask_sh),\ - XFM_SF(DCP0_OUTPUT_CSC_C11_C12, OUTPUT_CSC_C12, mask_sh),\ - XFM_SF(DCP0_OUTPUT_CSC_CONTROL, OUTPUT_CSC_GRPH_MODE, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CNTLA_START_CNTL, REGAMMA_CNTLA_EXP_REGION_START, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CNTLA_START_CNTL, REGAMMA_CNTLA_EXP_REGION_START_SEGMENT, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CNTLA_SLOPE_CNTL, REGAMMA_CNTLA_EXP_REGION_LINEAR_SLOPE, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CNTLA_END_CNTL1, REGAMMA_CNTLA_EXP_REGION_END, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CNTLA_END_CNTL2, REGAMMA_CNTLA_EXP_REGION_END_BASE, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CNTLA_END_CNTL2, REGAMMA_CNTLA_EXP_REGION_END_SLOPE, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CNTLA_REGION_0_1, REGAMMA_CNTLA_EXP_REGION0_LUT_OFFSET, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CNTLA_REGION_0_1, REGAMMA_CNTLA_EXP_REGION0_NUM_SEGMENTS, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CNTLA_REGION_0_1, REGAMMA_CNTLA_EXP_REGION1_LUT_OFFSET, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CNTLA_REGION_0_1, REGAMMA_CNTLA_EXP_REGION1_NUM_SEGMENTS, mask_sh),\ -- XFM_SF(DCP0_REGAMMA_CONTROL, GRPH_REGAMMA_MODE, mask_sh),\ - XFM_SF(SCL0_SCL_MODE, SCL_MODE, mask_sh), \ - XFM_SF(SCL0_SCL_TAP_CONTROL, SCL_H_NUM_OF_TAPS, mask_sh), \ - XFM_SF(SCL0_SCL_TAP_CONTROL, SCL_V_NUM_OF_TAPS, mask_sh), \ -@@ -250,8 +229,6 @@ - XFM_SF(SCL0_SCL_UPDATE, SCL_COEF_UPDATE_COMPLETE, mask_sh), \ - XFM_SF(LB0_LB_DATA_FORMAT, ALPHA_EN, mask_sh), \ - XFM_SF(DCFE0_DCFE_MEM_PWR_CTRL, SCL_COEFF_MEM_PWR_DIS, mask_sh), \ -- XFM_SF(DCFE0_DCFE_MEM_PWR_CTRL, DCP_REGAMMA_MEM_PWR_DIS, mask_sh),\ -- XFM_SF(DCFE0_DCFE_MEM_PWR_CTRL, DCP_LUT_MEM_PWR_DIS, mask_sh),\ - XFM_SF(DCFE0_DCFE_MEM_PWR_STATUS, SCL_COEFF_MEM_PWR_STATE, mask_sh), \ - XFM_SF(SCL0_SCL_MODE, SCL_PSCL_EN, mask_sh) - -diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c -index 492ea60..c638f47 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c -+++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c -@@ -24,6 +24,7 @@ - */ - #include "dm_services.h" - #include "dc.h" -+#include "core_dc.h" - #include "core_types.h" - #include "hw_sequencer.h" - #include "dce100_hw_sequencer.h" -@@ -70,7 +71,7 @@ static const struct dce100_hw_seq_reg_offsets reg_offsets[] = { - /***************************PIPE_CONTROL***********************************/ - - static bool dce100_enable_display_power_gating( -- struct dc *dc, -+ struct core_dc *dc, - uint8_t controller_id, - struct dc_bios *dcb, - enum pipe_gating_control power_gating) -@@ -106,8 +107,8 @@ static bool dce100_enable_display_power_gating( - } - - static void dce100_pplib_apply_display_requirements( -- struct dc *dc, -- struct dc_state *context) -+ struct core_dc *dc, -+ struct validate_context *context) - { - struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg; - -@@ -126,15 +127,15 @@ static void dce100_pplib_apply_display_requirements( - } - - void dce100_set_bandwidth( -- struct dc *dc, -- struct dc_state *context, -+ struct core_dc *dc, -+ struct validate_context *context, - bool decrease_allowed) - { -- if (decrease_allowed || context->bw.dce.dispclk_khz > dc->current_state->bw.dce.dispclk_khz) { -+ if (decrease_allowed || context->bw.dce.dispclk_khz > dc->current_context->bw.dce.dispclk_khz) { - dc->res_pool->display_clock->funcs->set_clock( - dc->res_pool->display_clock, - context->bw.dce.dispclk_khz * 115 / 100); -- dc->current_state->bw.dce.dispclk_khz = context->bw.dce.dispclk_khz; -+ dc->current_context->bw.dce.dispclk_khz = context->bw.dce.dispclk_khz; - } - dce100_pplib_apply_display_requirements(dc, context); - } -@@ -142,7 +143,7 @@ void dce100_set_bandwidth( - - /**************************************************************************/ - --bool dce100_hw_sequencer_construct(struct dc *dc) -+bool dce100_hw_sequencer_construct(struct core_dc *dc) - { - dce110_hw_sequencer_construct(dc); - -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 770b5bb..24433f0 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 -@@ -28,14 +28,14 @@ - - #include "core_types.h" - --struct dc; --struct dc_state; -+struct core_dc; -+struct validate_context; - --bool dce100_hw_sequencer_construct(struct dc *dc); -+bool dce100_hw_sequencer_construct(struct core_dc *dc); - - void dce100_set_bandwidth( -- struct dc *dc, -- struct dc_state *context, -+ struct core_dc *dc, -+ struct validate_context *context, - bool decrease_allowed); - - #endif /* __DC_HWSS_DCE100_H__ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c -index ca6c7c2..46f0c71 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c -+++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c -@@ -652,29 +652,44 @@ static void destruct(struct dce110_resource_pool *pool) - } - - static enum dc_status build_mapped_resource( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream) -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context) - { - enum dc_status status = DC_OK; -- struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream); -+ uint8_t i, j; - -- if (!pipe_ctx) -- return DC_ERROR_UNEXPECTED; -+ for (i = 0; i < context->stream_count; i++) { -+ struct dc_stream_state *stream = context->streams[i]; -+ -+ if (old_context && resource_is_stream_unchanged(old_context, stream)) -+ continue; -+ -+ for (j = 0; j < MAX_PIPES; j++) { -+ struct pipe_ctx *pipe_ctx = -+ &context->res_ctx.pipe_ctx[j]; - -- status = dce110_resource_build_pipe_hw_param(pipe_ctx); -+ if (context->res_ctx.pipe_ctx[j].stream != stream) -+ continue; - -- if (status != DC_OK) -- return status; -+ status = dce110_resource_build_pipe_hw_param(pipe_ctx); - -- resource_build_info_frame(pipe_ctx); -+ if (status != DC_OK) -+ return status; -+ -+ resource_build_info_frame(pipe_ctx); -+ -+ /* do not need to validate non root pipes */ -+ break; -+ } -+ } - - return DC_OK; - } - - bool dce100_validate_bandwidth( -- struct dc *dc, -- struct dc_state *context) -+ const struct core_dc *dc, -+ struct validate_context *context) - { - /* TODO implement when needed but for now hardcode max value*/ - context->bw.dce.dispclk_khz = 681000; -@@ -684,18 +699,19 @@ bool dce100_validate_bandwidth( - } - - static bool dce100_validate_surface_sets( -- struct dc_state *context) -+ const struct dc_validation_set set[], -+ int set_count) - { - int i; - -- for (i = 0; i < context->stream_count; i++) { -- if (context->stream_status[i].plane_count == 0) -+ for (i = 0; i < set_count; i++) { -+ if (set[i].plane_count == 0) - continue; - -- if (context->stream_status[i].plane_count > 1) -+ if (set[i].plane_count > 1) - return false; - -- if (context->stream_status[i].plane_states[0]->format -+ if (set[i].plane_states[0]->format - >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) - return false; - } -@@ -703,38 +719,54 @@ static bool dce100_validate_surface_sets( - return true; - } - --enum dc_status dce100_validate_global( -- struct dc *dc, -- struct dc_state *context) -+enum dc_status dce100_validate_with_context( -+ const struct core_dc *dc, -+ const struct dc_validation_set set[], -+ int set_count, -+ struct validate_context *context, -+ struct validate_context *old_context) - { -- if (!dce100_validate_surface_sets(context)) -+ struct dc_context *dc_ctx = dc->ctx; -+ enum dc_status result = DC_ERROR_UNEXPECTED; -+ int i; -+ -+ if (!dce100_validate_surface_sets(set, set_count)) - return DC_FAIL_SURFACE_VALIDATE; - -- return DC_OK; --} -+ for (i = 0; i < set_count; i++) { -+ context->streams[i] = set[i].stream; -+ dc_stream_retain(context->streams[i]); -+ context->stream_count++; -+ } - --enum dc_status dce100_add_stream_to_ctx( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *dc_stream) --{ -- enum dc_status result = DC_ERROR_UNEXPECTED; -+ result = resource_map_pool_resources(dc, context, old_context); -+ -+ if (result == DC_OK) -+ result = resource_map_clock_resources(dc, context, old_context); - -- result = resource_map_pool_resources(dc, new_ctx, dc_stream); -+ if (!resource_validate_attach_surfaces(set, set_count, -+ old_context, context, dc->res_pool)) { -+ DC_ERROR("Failed to attach surface to stream!\n"); -+ return DC_FAIL_ATTACH_SURFACES; -+ } -+ -+ if (result == DC_OK) -+ result = build_mapped_resource(dc, context, old_context); - - if (result == DC_OK) -- result = resource_map_clock_resources(dc, new_ctx, dc_stream); -+ result = resource_build_scaling_params_for_context(dc, context); - - if (result == DC_OK) -- result = build_mapped_resource(dc, new_ctx, dc_stream); -+ if (!dce100_validate_bandwidth(dc, context)) -+ result = DC_FAIL_BANDWIDTH_VALIDATE; - - return result; - } - - enum dc_status dce100_validate_guaranteed( -- struct dc *dc, -+ const struct core_dc *dc, - struct dc_stream_state *dc_stream, -- struct dc_state *context) -+ struct validate_context *context) - { - enum dc_status result = DC_ERROR_UNEXPECTED; - -@@ -742,17 +774,17 @@ enum dc_status dce100_validate_guaranteed( - dc_stream_retain(context->streams[0]); - context->stream_count++; - -- result = resource_map_pool_resources(dc, context, dc_stream); -+ result = resource_map_pool_resources(dc, context, NULL); - - if (result == DC_OK) -- result = resource_map_clock_resources(dc, context, dc_stream); -+ result = resource_map_clock_resources(dc, context, NULL); - - if (result == DC_OK) -- result = build_mapped_resource(dc, context, dc_stream); -+ result = build_mapped_resource(dc, context, NULL); - - if (result == DC_OK) { - validate_guaranteed_copy_streams( -- context, dc->caps.max_streams); -+ context, dc->public.caps.max_streams); - result = resource_build_scaling_params_for_context(dc, context); - } - -@@ -784,16 +816,15 @@ enum dc_status dce100_validate_plane(const struct dc_plane_state *plane_state) - static const struct resource_funcs dce100_res_pool_funcs = { - .destroy = dce100_destroy_resource_pool, - .link_enc_create = dce100_link_encoder_create, -+ .validate_with_context = dce100_validate_with_context, - .validate_guaranteed = dce100_validate_guaranteed, - .validate_bandwidth = dce100_validate_bandwidth, - .validate_plane = dce100_validate_plane, -- .add_stream_to_ctx = dce100_add_stream_to_ctx, -- .validate_global = dce100_validate_global - }; - - static bool construct( - uint8_t num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct dce110_resource_pool *pool) - { - unsigned int i; -@@ -878,9 +909,9 @@ static bool construct( - *************************************************/ - pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE; - pool->base.pipe_count = res_cap.num_timing_generator; -- dc->caps.max_downscale_ratio = 200; -- dc->caps.i2c_speed_in_khz = 40; -- dc->caps.max_cursor_size = 128; -+ dc->public.caps.max_downscale_ratio = 200; -+ dc->public.caps.i2c_speed_in_khz = 40; -+ dc->public.caps.max_cursor_size = 128; - - for (i = 0; i < pool->base.pipe_count; i++) { - pool->base.timing_generators[i] = -@@ -927,7 +958,7 @@ static bool construct( - } - } - -- dc->caps.max_planes = pool->base.pipe_count; -+ dc->public.caps.max_planes = pool->base.pipe_count; - - if (!resource_construct(num_virtual_links, dc, &pool->base, - &res_create_funcs)) -@@ -947,7 +978,7 @@ static bool construct( - - struct resource_pool *dce100_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc) -+ struct core_dc *dc) - { - struct dce110_resource_pool *pool = - dm_alloc(sizeof(struct dce110_resource_pool)); -diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.h b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.h -index f52cae2..edc50ca 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.h -+++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.h -@@ -8,19 +8,14 @@ - #ifndef DCE100_RESOURCE_H_ - #define DCE100_RESOURCE_H_ - --struct dc; -+struct core_dc; - struct resource_pool; - struct dc_validation_set; - - struct resource_pool *dce100_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc); -+ struct core_dc *dc); - - enum dc_status dce100_validate_plane(const struct dc_plane_state *plane_state); - --enum dc_status dce100_add_stream_to_ctx( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *dc_stream); -- - #endif /* DCE100_RESOURCE_H_ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c -index f82c269..9759d8e 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c -+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c -@@ -115,7 +115,7 @@ static void wait_for_fbc_state_changed( - FBC_STATUS, - FBC_ENABLE_STATUS) == enabled) - break; -- msleep(10); -+ udelay(10); - counter++; - } - -@@ -124,13 +124,7 @@ static void wait_for_fbc_state_changed( - cp110->base.ctx->logger, LOG_WARNING, - "%s: wait counter exceeded, changes to HW not applied", - __func__); -- } else { -- dm_logger_write( -- cp110->base.ctx->logger, LOG_SYNC, -- "FBC status changed to %d", enabled); - } -- -- - } - - void dce110_compressor_power_up_fbc(struct compressor *compressor) -@@ -189,7 +183,7 @@ void dce110_compressor_enable_fbc( - (!dce110_compressor_is_fbc_enabled_in_hw(compressor, NULL))) { - - uint32_t addr; -- uint32_t value, misc_value; -+ uint32_t value; - - - addr = mmFBC_CNTL; -@@ -206,23 +200,9 @@ void dce110_compressor_enable_fbc( - compressor->attached_inst = params->inst; - cp110->offsets = reg_offsets[params->inst]; - -- /* Toggle it as there is bug in HW */ -+ /*Toggle it as there is bug in HW */ - set_reg_field_value(value, 0, FBC_CNTL, FBC_GRPH_COMP_EN); - dm_write_reg(compressor->ctx, addr, value); -- -- /* FBC usage with scatter & gather for dce110 */ -- misc_value = dm_read_reg(compressor->ctx, mmFBC_MISC); -- -- set_reg_field_value(misc_value, 1, -- FBC_MISC, FBC_INVALIDATE_ON_ERROR); -- set_reg_field_value(misc_value, 1, -- FBC_MISC, FBC_DECOMPRESS_ERROR_CLEAR); -- set_reg_field_value(misc_value, 0x14, -- FBC_MISC, FBC_SLOW_REQ_INTERVAL); -- -- dm_write_reg(compressor->ctx, mmFBC_MISC, misc_value); -- -- /* Enable FBC */ - set_reg_field_value(value, 1, FBC_CNTL, FBC_GRPH_COMP_EN); - dm_write_reg(compressor->ctx, addr, value); - -diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c -index b8043bd..e590f9d 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c -+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c -@@ -164,7 +164,7 @@ static void enable_display_pipe_clock_gating( - } - - static bool dce110_enable_display_power_gating( -- struct dc *dc, -+ struct core_dc *dc, - uint8_t controller_id, - struct dc_bios *dcb, - enum pipe_gating_control power_gating) -@@ -758,6 +758,8 @@ void dce110_disable_stream(struct pipe_ctx *pipe_ctx) - pipe_ctx->stream_res.stream_enc->funcs->hdmi_audio_disable( - pipe_ctx->stream_res.stream_enc); - -+ pipe_ctx->stream_res.audio = NULL; -+ - /* TODO: notify audio driver for if audio modes list changed - * add audio mode list change flag */ - /* dal_audio_disable_azalia_audio_jack_presence(stream->audio, -@@ -778,11 +780,9 @@ void dce110_disable_stream(struct pipe_ctx *pipe_ctx) - - - /* blank at encoder level */ -- if (dc_is_dp_signal(pipe_ctx->stream->signal)) { -- if (pipe_ctx->stream->sink->link->connector_signal == SIGNAL_TYPE_EDP) -- link->link_enc->funcs->backlight_control(link->link_enc, false); -+ if (dc_is_dp_signal(pipe_ctx->stream->signal)) - pipe_ctx->stream_res.stream_enc->funcs->dp_blank(pipe_ctx->stream_res.stream_enc); -- } -+ - link->link_enc->funcs->connect_dig_be_to_fe( - link->link_enc, - pipe_ctx->stream_res.stream_enc->id, -@@ -794,15 +794,12 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx, - struct dc_link_settings *link_settings) - { - struct encoder_unblank_param params = { { 0 } }; -- struct dc_link *link = pipe_ctx->stream->sink->link; - - /* only 3 items below are used by unblank */ - params.pixel_clk_khz = - pipe_ctx->stream->timing.pix_clk_khz; - params.link_settings.link_rate = link_settings->link_rate; - pipe_ctx->stream_res.stream_enc->funcs->dp_unblank(pipe_ctx->stream_res.stream_enc, ¶ms); -- if (link->connector_signal == SIGNAL_TYPE_EDP) -- link->link_enc->funcs->backlight_control(link->link_enc, true); - } - - -@@ -833,7 +830,6 @@ static enum audio_dto_source translate_to_dto_source(enum controller_id crtc_id) - } - - static void build_audio_output( -- struct dc_state *state, - const struct pipe_ctx *pipe_ctx, - struct audio_output *audio_output) - { -@@ -895,8 +891,8 @@ static void build_audio_output( - if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT || - pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { - audio_output->pll_info.dp_dto_source_clock_in_khz = -- state->dis_clk->funcs->get_dp_ref_clk_frequency( -- state->dis_clk); -+ pipe_ctx->dis_clk->funcs->get_dp_ref_clk_frequency( -+ pipe_ctx->dis_clk); - } - - audio_output->pll_info.feed_back_divider = -@@ -948,7 +944,7 @@ static void get_surface_visual_confirm_color(const struct pipe_ctx *pipe_ctx, - } - } - --static void program_scaler(const struct dc *dc, -+static void program_scaler(const struct core_dc *dc, - const struct pipe_ctx *pipe_ctx) - { - struct tg_color color = {0}; -@@ -959,7 +955,7 @@ static void program_scaler(const struct dc *dc, - return; - #endif - -- if (dc->debug.surface_visual_confirm) -+ if (dc->public.debug.surface_visual_confirm) - get_surface_visual_confirm_color(pipe_ctx, &color); - else - color_space_to_black_color(dc, -@@ -982,11 +978,11 @@ static void program_scaler(const struct dc *dc, - - static enum dc_status dce110_prog_pixclk_crtc_otg( - struct pipe_ctx *pipe_ctx, -- struct dc_state *context, -- struct dc *dc) -+ struct validate_context *context, -+ struct core_dc *dc) - { - struct dc_stream_state *stream = pipe_ctx->stream; -- struct pipe_ctx *pipe_ctx_old = &dc->current_state->res_ctx. -+ struct pipe_ctx *pipe_ctx_old = &dc->current_context->res_ctx. - pipe_ctx[pipe_ctx->pipe_idx]; - struct tg_color black_color = {0}; - -@@ -1038,11 +1034,11 @@ static enum dc_status dce110_prog_pixclk_crtc_otg( - - static enum dc_status apply_single_controller_ctx_to_hw( - struct pipe_ctx *pipe_ctx, -- struct dc_state *context, -- struct dc *dc) -+ struct validate_context *context, -+ struct core_dc *dc) - { - struct dc_stream_state *stream = pipe_ctx->stream; -- struct pipe_ctx *pipe_ctx_old = &dc->current_state->res_ctx. -+ struct pipe_ctx *pipe_ctx_old = &dc->current_context->res_ctx. - pipe_ctx[pipe_ctx->pipe_idx]; - - /* */ -@@ -1082,14 +1078,11 @@ static enum dc_status apply_single_controller_ctx_to_hw( - - - /*vbios crtc_source_selection and encoder_setup will override fmt_C*/ -- if (pipe_ctx->stream->signal != SIGNAL_TYPE_EDP && -- pipe_ctx->stream->signal != SIGNAL_TYPE_LVDS) { -- /*for embedded panel, don't override VBIOS's setting*/ -- pipe_ctx->stream_res.opp->funcs->opp_program_fmt( -+ pipe_ctx->stream_res.opp->funcs->opp_program_fmt( - pipe_ctx->stream_res.opp, - &stream->bit_depth_params, - &stream->clamping); -- } -+ - if (dc_is_dp_signal(pipe_ctx->stream->signal)) - pipe_ctx->stream_res.stream_enc->funcs->dp_set_stream_attribute( - pipe_ctx->stream_res.stream_enc, -@@ -1113,7 +1106,7 @@ static enum dc_status apply_single_controller_ctx_to_hw( - resource_build_info_frame(pipe_ctx); - dce110_update_info_frame(pipe_ctx); - if (!pipe_ctx_old->stream) { -- core_link_enable_stream(context, pipe_ctx); -+ core_link_enable_stream(pipe_ctx); - - - if (dc_is_dp_signal(pipe_ctx->stream->signal)) -@@ -1148,25 +1141,17 @@ static enum dc_status apply_single_controller_ctx_to_hw( - - /******************************************************************************/ - --static void power_down_encoders(struct dc *dc) -+static void power_down_encoders(struct core_dc *dc) - { - int i; -- enum connector_id connector_id; -- for (i = 0; i < dc->link_count; i++) { -- connector_id = dal_graphics_object_id_get_connector_id(dc->links[i]->link_id); -- if ((connector_id == CONNECTOR_ID_DISPLAY_PORT) || -- (connector_id == CONNECTOR_ID_EDP)) { -- -- if (!dc->links[i]->wa_flags.dp_keep_receiver_powered) -- dp_receiver_power_ctrl(dc->links[i], false); -- } - -+ for (i = 0; i < dc->link_count; i++) { - dc->links[i]->link_enc->funcs->disable_output( - dc->links[i]->link_enc, SIGNAL_TYPE_NONE); - } - } - --static void power_down_controllers(struct dc *dc) -+static void power_down_controllers(struct core_dc *dc) - { - int i; - -@@ -1176,7 +1161,7 @@ static void power_down_controllers(struct dc *dc) - } - } - --static void power_down_clock_sources(struct dc *dc) -+static void power_down_clock_sources(struct core_dc *dc) - { - int i; - -@@ -1191,7 +1176,7 @@ static void power_down_clock_sources(struct dc *dc) - } - } - --static void power_down_all_hw_blocks(struct dc *dc) -+static void power_down_all_hw_blocks(struct core_dc *dc) - { - power_down_encoders(dc); - -@@ -1206,7 +1191,7 @@ static void power_down_all_hw_blocks(struct dc *dc) - } - - static void disable_vga_and_power_gate_all_controllers( -- struct dc *dc) -+ struct core_dc *dc) - { - int i; - struct timing_generator *tg; -@@ -1234,7 +1219,7 @@ static void disable_vga_and_power_gate_all_controllers( - * 3. Enable power gating for controller - * 4. Set acc_mode_change bit (VBIOS will clear this bit when going to FSDOS) - */ --void dce110_enable_accelerated_mode(struct dc *dc) -+void dce110_enable_accelerated_mode(struct core_dc *dc) - { - power_down_all_hw_blocks(dc); - -@@ -1260,8 +1245,8 @@ static uint32_t compute_pstate_blackout_duration( - } - - void dce110_set_displaymarks( -- const struct dc *dc, -- struct dc_state *context) -+ const struct core_dc *dc, -+ struct validate_context *context) - { - uint8_t i, num_pipes; - unsigned int underlay_idx = dc->res_pool->underlay_pipe_index; -@@ -1274,7 +1259,7 @@ void dce110_set_displaymarks( - continue; - - total_dest_line_time_ns = compute_pstate_blackout_duration( -- dc->bw_vbios->blackout_duration, pipe_ctx->stream); -+ dc->bw_vbios.blackout_duration, pipe_ctx->stream); - pipe_ctx->plane_res.mi->funcs->mem_input_program_display_marks( - pipe_ctx->plane_res.mi, - context->bw.dce.nbp_state_change_wm_ns[num_pipes], -@@ -1326,7 +1311,7 @@ static void set_safe_displaymarks( - } - - static void switch_dp_clock_sources( -- const struct dc *dc, -+ const struct core_dc *dc, - struct resource_context *res_ctx) - { - uint8_t i; -@@ -1418,8 +1403,8 @@ static void set_static_screen_control(struct pipe_ctx **pipe_ctx, - * may read PLL register to get pixel clock - */ - static uint32_t get_max_pixel_clock_for_all_paths( -- struct dc *dc, -- struct dc_state *context, -+ struct core_dc *dc, -+ struct validate_context *context, - bool pre_mode_set) - { - uint32_t max_pix_clk = 0; -@@ -1459,40 +1444,48 @@ static uint32_t get_max_pixel_clock_for_all_paths( - * etc support for dcn1.0 - */ - static void apply_min_clocks( -- struct dc *dc, -- struct dc_state *context, -+ struct core_dc *dc, -+ struct validate_context *context, - enum dm_pp_clocks_state *clocks_state, - bool pre_mode_set) - { - struct state_dependent_clocks req_clocks = {0}; -+ struct pipe_ctx *pipe_ctx; -+ int i; -+ -+ for (i = 0; i < MAX_PIPES; i++) { -+ pipe_ctx = &context->res_ctx.pipe_ctx[i]; -+ if (pipe_ctx->dis_clk != NULL) -+ break; -+ } - - if (!pre_mode_set) { - /* set clock_state without verification */ -- if (context->dis_clk->funcs->set_min_clocks_state) { -- context->dis_clk->funcs->set_min_clocks_state( -- context->dis_clk, *clocks_state); -+ if (pipe_ctx->dis_clk->funcs->set_min_clocks_state) { -+ pipe_ctx->dis_clk->funcs->set_min_clocks_state( -+ pipe_ctx->dis_clk, *clocks_state); - return; - } - - /* TODO: This is incorrect. Figure out how to fix. */ -- context->dis_clk->funcs->apply_clock_voltage_request( -- context->dis_clk, -+ pipe_ctx->dis_clk->funcs->apply_clock_voltage_request( -+ pipe_ctx->dis_clk, - DM_PP_CLOCK_TYPE_DISPLAY_CLK, -- context->dis_clk->cur_clocks_value.dispclk_in_khz, -+ pipe_ctx->dis_clk->cur_clocks_value.dispclk_in_khz, - pre_mode_set, - false); - -- context->dis_clk->funcs->apply_clock_voltage_request( -- context->dis_clk, -+ pipe_ctx->dis_clk->funcs->apply_clock_voltage_request( -+ pipe_ctx->dis_clk, - DM_PP_CLOCK_TYPE_PIXELCLK, -- context->dis_clk->cur_clocks_value.max_pixelclk_in_khz, -+ pipe_ctx->dis_clk->cur_clocks_value.max_pixelclk_in_khz, - pre_mode_set, - false); - -- context->dis_clk->funcs->apply_clock_voltage_request( -- context->dis_clk, -+ pipe_ctx->dis_clk->funcs->apply_clock_voltage_request( -+ pipe_ctx->dis_clk, - DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, -- context->dis_clk->cur_clocks_value.max_non_dp_phyclk_in_khz, -+ pipe_ctx->dis_clk->cur_clocks_value.max_non_dp_phyclk_in_khz, - pre_mode_set, - false); - return; -@@ -1506,28 +1499,28 @@ static void apply_min_clocks( - req_clocks.pixel_clk_khz = get_max_pixel_clock_for_all_paths( - dc, context, true); - -- if (context->dis_clk->funcs->get_required_clocks_state) { -- *clocks_state = context->dis_clk->funcs->get_required_clocks_state( -- context->dis_clk, &req_clocks); -- context->dis_clk->funcs->set_min_clocks_state( -- context->dis_clk, *clocks_state); -+ if (pipe_ctx->dis_clk->funcs->get_required_clocks_state) { -+ *clocks_state = pipe_ctx->dis_clk->funcs->get_required_clocks_state( -+ pipe_ctx->dis_clk, &req_clocks); -+ pipe_ctx->dis_clk->funcs->set_min_clocks_state( -+ pipe_ctx->dis_clk, *clocks_state); - } else { -- context->dis_clk->funcs->apply_clock_voltage_request( -- context->dis_clk, -+ pipe_ctx->dis_clk->funcs->apply_clock_voltage_request( -+ pipe_ctx->dis_clk, - DM_PP_CLOCK_TYPE_DISPLAY_CLK, - req_clocks.display_clk_khz, - pre_mode_set, - false); - -- context->dis_clk->funcs->apply_clock_voltage_request( -- context->dis_clk, -+ pipe_ctx->dis_clk->funcs->apply_clock_voltage_request( -+ pipe_ctx->dis_clk, - DM_PP_CLOCK_TYPE_PIXELCLK, - req_clocks.pixel_clk_khz, - pre_mode_set, - false); - -- context->dis_clk->funcs->apply_clock_voltage_request( -- context->dis_clk, -+ pipe_ctx->dis_clk->funcs->apply_clock_voltage_request( -+ pipe_ctx->dis_clk, - DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, - req_clocks.pixel_clk_khz, - pre_mode_set, -@@ -1540,8 +1533,8 @@ static void apply_min_clocks( - /* - * Check if FBC can be enabled - */ --static enum dc_status validate_fbc(struct dc *dc, -- struct dc_state *context) -+static enum dc_status validate_fbc(struct core_dc *dc, -+ struct validate_context *context) - { - struct pipe_ctx *pipe_ctx = - &context->res_ctx.pipe_ctx[0]; -@@ -1570,8 +1563,8 @@ static enum dc_status validate_fbc(struct dc *dc, - /* - * Enable FBC - */ --static enum dc_status enable_fbc(struct dc *dc, -- struct dc_state *context) -+static enum dc_status enable_fbc(struct core_dc *dc, -+ struct validate_context *context) - { - enum dc_status status = validate_fbc(dc, context); - -@@ -1599,15 +1592,15 @@ static enum dc_status enable_fbc(struct dc *dc, - #endif - - static enum dc_status apply_ctx_to_hw_fpga( -- struct dc *dc, -- struct dc_state *context) -+ struct core_dc *dc, -+ struct validate_context *context) - { - enum dc_status status = DC_ERROR_UNEXPECTED; - int i; - - for (i = 0; i < MAX_PIPES; i++) { - struct pipe_ctx *pipe_ctx_old = -- &dc->current_state->res_ctx.pipe_ctx[i]; -+ &dc->current_context->res_ctx.pipe_ctx[i]; - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; - - if (pipe_ctx->stream == NULL) -@@ -1629,8 +1622,8 @@ static enum dc_status apply_ctx_to_hw_fpga( - } - - static void dce110_reset_hw_ctx_wrap( -- struct dc *dc, -- struct dc_state *context) -+ struct core_dc *dc, -+ struct validate_context *context) - { - int i; - -@@ -1638,7 +1631,7 @@ static void dce110_reset_hw_ctx_wrap( - /* look up the targets that have been removed since last commit */ - for (i = 0; i < MAX_PIPES; i++) { - struct pipe_ctx *pipe_ctx_old = -- &dc->current_state->res_ctx.pipe_ctx[i]; -+ &dc->current_context->res_ctx.pipe_ctx[i]; - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; - - /* Note: We need to disable output if clock sources change, -@@ -1660,9 +1653,9 @@ static void dce110_reset_hw_ctx_wrap( - } - pipe_ctx_old->stream_res.tg->funcs->disable_crtc(pipe_ctx_old->stream_res.tg); - pipe_ctx_old->plane_res.mi->funcs->free_mem_input( -- pipe_ctx_old->plane_res.mi, dc->current_state->stream_count); -+ pipe_ctx_old->plane_res.mi, dc->current_context->stream_count); - resource_unreference_clock_source( -- &dc->current_state->res_ctx, dc->res_pool, -+ &dc->current_context->res_ctx, dc->res_pool, - &pipe_ctx_old->clock_source); - - dc->hwss.power_down_front_end(dc, pipe_ctx_old->pipe_idx); -@@ -1674,8 +1667,8 @@ static void dce110_reset_hw_ctx_wrap( - - - enum dc_status dce110_apply_ctx_to_hw( -- struct dc *dc, -- struct dc_state *context) -+ struct core_dc *dc, -+ struct validate_context *context) - { - struct dc_bios *dcb = dc->ctx->dc_bios; - enum dc_status status; -@@ -1701,7 +1694,7 @@ enum dc_status dce110_apply_ctx_to_hw( - /* below is for real asic only */ - for (i = 0; i < dc->res_pool->pipe_count; i++) { - struct pipe_ctx *pipe_ctx_old = -- &dc->current_state->res_ctx.pipe_ctx[i]; -+ &dc->current_context->res_ctx.pipe_ctx[i]; - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; - - if (pipe_ctx->stream == NULL || pipe_ctx->top_pipe) -@@ -1731,31 +1724,31 @@ enum dc_status dce110_apply_ctx_to_hw( - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) - if (dc->ctx->dce_version >= DCN_VERSION_1_0) { - if (context->bw.dcn.calc_clk.fclk_khz -- > dc->current_state->bw.dcn.cur_clk.fclk_khz) { -+ > dc->current_context->bw.dcn.cur_clk.fclk_khz) { - struct dm_pp_clock_for_voltage_req clock; - - clock.clk_type = DM_PP_CLOCK_TYPE_FCLK; - clock.clocks_in_khz = context->bw.dcn.calc_clk.fclk_khz; - dm_pp_apply_clock_for_voltage_request(dc->ctx, &clock); -- dc->current_state->bw.dcn.cur_clk.fclk_khz = clock.clocks_in_khz; -+ dc->current_context->bw.dcn.cur_clk.fclk_khz = clock.clocks_in_khz; - context->bw.dcn.cur_clk.fclk_khz = clock.clocks_in_khz; - } - if (context->bw.dcn.calc_clk.dcfclk_khz -- > dc->current_state->bw.dcn.cur_clk.dcfclk_khz) { -+ > dc->current_context->bw.dcn.cur_clk.dcfclk_khz) { - struct dm_pp_clock_for_voltage_req clock; - - clock.clk_type = DM_PP_CLOCK_TYPE_DCFCLK; - clock.clocks_in_khz = context->bw.dcn.calc_clk.dcfclk_khz; - dm_pp_apply_clock_for_voltage_request(dc->ctx, &clock); -- dc->current_state->bw.dcn.cur_clk.dcfclk_khz = clock.clocks_in_khz; -+ dc->current_context->bw.dcn.cur_clk.dcfclk_khz = clock.clocks_in_khz; - context->bw.dcn.cur_clk.dcfclk_khz = clock.clocks_in_khz; - } - if (context->bw.dcn.calc_clk.dispclk_khz -- > dc->current_state->bw.dcn.cur_clk.dispclk_khz) { -+ > dc->current_context->bw.dcn.cur_clk.dispclk_khz) { - dc->res_pool->display_clock->funcs->set_clock( - dc->res_pool->display_clock, - context->bw.dcn.calc_clk.dispclk_khz); -- dc->current_state->bw.dcn.cur_clk.dispclk_khz = -+ dc->current_context->bw.dcn.cur_clk.dispclk_khz = - context->bw.dcn.calc_clk.dispclk_khz; - context->bw.dcn.cur_clk.dispclk_khz = - context->bw.dcn.calc_clk.dispclk_khz; -@@ -1763,7 +1756,7 @@ enum dc_status dce110_apply_ctx_to_hw( - } else - #endif - if (context->bw.dce.dispclk_khz -- > dc->current_state->bw.dce.dispclk_khz) { -+ > dc->current_context->bw.dce.dispclk_khz) { - dc->res_pool->display_clock->funcs->set_clock( - dc->res_pool->display_clock, - context->bw.dce.dispclk_khz * 115 / 100); -@@ -1802,7 +1795,7 @@ enum dc_status dce110_apply_ctx_to_hw( - if (pipe_ctx->stream_res.audio != NULL) { - struct audio_output audio_output; - -- build_audio_output(context, pipe_ctx, &audio_output); -+ build_audio_output(pipe_ctx, &audio_output); - - pipe_ctx->stream_res.audio->funcs->wall_dto_setup( - pipe_ctx->stream_res.audio, -@@ -1830,7 +1823,7 @@ enum dc_status dce110_apply_ctx_to_hw( - if (pipe_ctx->stream_res.audio != NULL) { - struct audio_output audio_output; - -- build_audio_output(context, pipe_ctx, &audio_output); -+ build_audio_output(pipe_ctx, &audio_output); - - pipe_ctx->stream_res.audio->funcs->wall_dto_setup( - pipe_ctx->stream_res.audio, -@@ -1844,7 +1837,7 @@ enum dc_status dce110_apply_ctx_to_hw( - - for (i = 0; i < dc->res_pool->pipe_count; i++) { - struct pipe_ctx *pipe_ctx_old = -- &dc->current_state->res_ctx.pipe_ctx[i]; -+ &dc->current_context->res_ctx.pipe_ctx[i]; - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; - - if (pipe_ctx->stream == NULL) -@@ -1864,7 +1857,7 @@ enum dc_status dce110_apply_ctx_to_hw( - - struct audio_output audio_output; - -- build_audio_output(context, pipe_ctx, &audio_output); -+ build_audio_output(pipe_ctx, &audio_output); - - if (dc_is_dp_signal(pipe_ctx->stream->signal)) - pipe_ctx->stream_res.stream_enc->funcs->dp_audio_setup( -@@ -1967,7 +1960,7 @@ static void set_default_colors(struct pipe_ctx *pipe_ctx) - * -------------------------------------------------| - * - ******************************************************************************/ --static void program_surface_visibility(const struct dc *dc, -+static void program_surface_visibility(const struct core_dc *dc, - struct pipe_ctx *pipe_ctx) - { - enum blnd_mode blender_mode = BLND_MODE_CURRENT_PIPE; -@@ -2040,7 +2033,7 @@ static void program_gamut_remap(struct pipe_ctx *pipe_ctx) - * TODO REMOVE, USE UPDATE INSTEAD - */ - static void set_plane_config( -- const struct dc *dc, -+ const struct core_dc *dc, - struct pipe_ctx *pipe_ctx, - struct resource_context *res_ctx) - { -@@ -2119,7 +2112,7 @@ static void set_plane_config( - if (mi->funcs->set_blank) - mi->funcs->set_blank(mi, pipe_ctx->plane_state->visible); - -- if (dc->config.gpu_vm_support) -+ if (dc->public.config.gpu_vm_support) - mi->funcs->mem_input_program_pte_vm( - pipe_ctx->plane_res.mi, - plane_state->format, -@@ -2127,7 +2120,7 @@ static void set_plane_config( - plane_state->rotation); - } - --static void update_plane_addr(const struct dc *dc, -+static void update_plane_addr(const struct core_dc *dc, - struct pipe_ctx *pipe_ctx) - { - struct dc_plane_state *plane_state = pipe_ctx->plane_state; -@@ -2165,7 +2158,7 @@ void dce110_update_pending_status(struct pipe_ctx *pipe_ctx) - } - } - --void dce110_power_down(struct dc *dc) -+void dce110_power_down(struct core_dc *dc) - { - power_down_all_hw_blocks(dc); - disable_vga_and_power_gate_all_controllers(dc); -@@ -2210,7 +2203,7 @@ static bool wait_for_reset_trigger_to_occur( - - /* Enable timing synchronization for a group of Timing Generators. */ - static void dce110_enable_timing_synchronization( -- struct dc *dc, -+ struct core_dc *dc, - int group_index, - int group_size, - struct pipe_ctx *grouped_pipes[]) -@@ -2259,7 +2252,7 @@ static void dce110_enable_timing_synchronization( - DC_SYNC_INFO("GSL: Set-up complete.\n"); - } - --static void init_hw(struct dc *dc) -+static void init_hw(struct core_dc *dc) - { - int i; - struct dc_bios *bp; -@@ -2323,7 +2316,7 @@ static void init_hw(struct dc *dc) - } - - void dce110_fill_display_configs( -- const struct dc_state *context, -+ const struct validate_context *context, - struct dm_pp_display_configuration *pp_display_cfg) - { - int j; -@@ -2371,7 +2364,7 @@ void dce110_fill_display_configs( - pp_display_cfg->display_count = num_cfgs; - } - --uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context) -+uint32_t dce110_get_min_vblank_time_us(const struct validate_context *context) - { - uint8_t j; - uint32_t min_vertical_blank_time = -1; -@@ -2396,7 +2389,7 @@ uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context) - } - - static int determine_sclk_from_bounding_box( -- const struct dc *dc, -+ const struct core_dc *dc, - int required_sclk) - { - int i; -@@ -2422,8 +2415,8 @@ static int determine_sclk_from_bounding_box( - } - - static void pplib_apply_display_requirements( -- struct dc *dc, -- struct dc_state *context) -+ struct core_dc *dc, -+ struct validate_context *context) - { - struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg; - -@@ -2476,24 +2469,24 @@ static void pplib_apply_display_requirements( - } - - static void dce110_set_bandwidth( -- struct dc *dc, -- struct dc_state *context, -+ struct core_dc *dc, -+ struct validate_context *context, - bool decrease_allowed) - { - dce110_set_displaymarks(dc, context); - -- if (decrease_allowed || context->bw.dce.dispclk_khz > dc->current_state->bw.dce.dispclk_khz) { -+ if (decrease_allowed || context->bw.dce.dispclk_khz > dc->current_context->bw.dce.dispclk_khz) { - dc->res_pool->display_clock->funcs->set_clock( - dc->res_pool->display_clock, - context->bw.dce.dispclk_khz * 115 / 100); -- dc->current_state->bw.dce.dispclk_khz = context->bw.dce.dispclk_khz; -+ dc->current_context->bw.dce.dispclk_khz = context->bw.dce.dispclk_khz; - } - - pplib_apply_display_requirements(dc, context); - } - - static void dce110_program_front_end_for_pipe( -- struct dc *dc, struct pipe_ctx *pipe_ctx) -+ struct core_dc *dc, struct pipe_ctx *pipe_ctx) - { - struct mem_input *mi = pipe_ctx->plane_res.mi; - struct pipe_ctx *old_pipe = NULL; -@@ -2504,8 +2497,8 @@ static void dce110_program_front_end_for_pipe( - - memset(&tbl_entry, 0, sizeof(tbl_entry)); - -- if (dc->current_state) -- old_pipe = &dc->current_state->res_ctx.pipe_ctx[pipe_ctx->pipe_idx]; -+ if (dc->current_context) -+ old_pipe = &dc->current_context->res_ctx.pipe_ctx[pipe_ctx->pipe_idx]; - - memset(&adjust, 0, sizeof(adjust)); - adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS; -@@ -2574,7 +2567,7 @@ static void dce110_program_front_end_for_pipe( - if (mi->funcs->set_blank) - mi->funcs->set_blank(mi, pipe_ctx->plane_state->visible); - -- if (dc->config.gpu_vm_support) -+ if (dc->public.config.gpu_vm_support) - mi->funcs->mem_input_program_pte_vm( - pipe_ctx->plane_res.mi, - plane_state->format, -@@ -2620,10 +2613,10 @@ static void dce110_program_front_end_for_pipe( - } - - static void dce110_apply_ctx_for_surface( -- struct dc *dc, -+ struct core_dc *dc, - const struct dc_stream_state *stream, - int num_planes, -- struct dc_state *context) -+ struct validate_context *context) - { - int i, be_idx; - -@@ -2650,10 +2643,10 @@ static void dce110_apply_ctx_for_surface( - } - } - --static void dce110_power_down_fe(struct dc *dc, int fe_idx) -+static void dce110_power_down_fe(struct core_dc *dc, int fe_idx) - { - /* Do not power down fe when stream is active on dce*/ -- if (dc->current_state->res_ctx.pipe_ctx[fe_idx].stream) -+ if (dc->current_context->res_ctx.pipe_ctx[fe_idx].stream) - return; - - dc->hwss.enable_display_power_gating( -@@ -2664,7 +2657,7 @@ static void dce110_power_down_fe(struct dc *dc, int fe_idx) - } - - static void dce110_wait_for_mpcc_disconnect( -- struct dc *dc, -+ struct core_dc *dc, - struct resource_pool *res_pool, - struct pipe_ctx *pipe_ctx) - { -@@ -2693,10 +2686,6 @@ static void program_csc_matrix(struct pipe_ctx *pipe_ctx, - } - } - --static void ready_shared_resources(struct dc *dc) {} -- --static void optimize_shared_resources(struct dc *dc) {} -- - static const struct hw_sequencer_funcs dce110_funcs = { - .program_gamut_remap = program_gamut_remap, - .program_csc_matrix = program_csc_matrix, -@@ -2727,13 +2716,10 @@ static const struct hw_sequencer_funcs dce110_funcs = { - .prog_pixclk_crtc_otg = dce110_prog_pixclk_crtc_otg, - .setup_stereo = NULL, - .set_avmute = dce110_set_avmute, -- .wait_for_mpcc_disconnect = dce110_wait_for_mpcc_disconnect, -- .ready_shared_resources = ready_shared_resources, -- .optimize_shared_resources = optimize_shared_resources, -- -+ .wait_for_mpcc_disconnect = dce110_wait_for_mpcc_disconnect - }; - --bool dce110_hw_sequencer_construct(struct dc *dc) -+bool dce110_hw_sequencer_construct(struct core_dc *dc) - { - dc->hwss = dce110_funcs; - -diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h -index baa20c1..89782ca 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h -+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h -@@ -29,21 +29,21 @@ - #include "core_types.h" - - #define GAMMA_HW_POINTS_NUM 256 --struct dc; --struct dc_state; -+struct core_dc; -+struct validate_context; - struct dm_pp_display_configuration; - --bool dce110_hw_sequencer_construct(struct dc *dc); -+bool dce110_hw_sequencer_construct(struct core_dc *dc); - - enum dc_status dce110_apply_ctx_to_hw( -- struct dc *dc, -- struct dc_state *context); -+ struct core_dc *dc, -+ struct validate_context *context); - --void dce110_set_display_clock(struct dc_state *context); -+void dce110_set_display_clock(struct validate_context *context); - - void dce110_set_displaymarks( -- const struct dc *dc, -- struct dc_state *context); -+ const struct core_dc *dc, -+ struct validate_context *context); - - void dce110_enable_stream(struct pipe_ctx *pipe_ctx); - -@@ -55,18 +55,17 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx, - void dce110_update_info_frame(struct pipe_ctx *pipe_ctx); - - void dce110_set_avmute(struct pipe_ctx *pipe_ctx, bool enable); --void dce110_enable_accelerated_mode(struct dc *dc); -+void dce110_enable_accelerated_mode(struct core_dc *dc); - --void dce110_power_down(struct dc *dc); -+void dce110_power_down(struct core_dc *dc); - - void dce110_update_pending_status(struct pipe_ctx *pipe_ctx); - - void dce110_fill_display_configs( -- const struct dc_state *context, -+ const struct validate_context *context, - struct dm_pp_display_configuration *pp_display_cfg); - --uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context); -+uint32_t dce110_get_min_vblank_time_us(const struct validate_context *context); - --void dp_receiver_power_ctrl(struct dc_link *link, bool on); - #endif /* __DC_HWSS_DCE110_H__ */ - -diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c -index 41bfddf..a7f30dc 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c -+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c -@@ -772,35 +772,50 @@ static bool is_surface_pixel_format_supported(struct pipe_ctx *pipe_ctx, unsigne - } - - static enum dc_status build_mapped_resource( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream) -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context) - { - enum dc_status status = DC_OK; -- struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream); -+ uint8_t i, j; -+ -+ for (i = 0; i < context->stream_count; i++) { -+ struct dc_stream_state *stream = context->streams[i]; - -- if (!pipe_ctx) -- return DC_ERROR_UNEXPECTED; -+ if (old_context && resource_is_stream_unchanged(old_context, stream)) -+ continue; - -- if (!is_surface_pixel_format_supported(pipe_ctx, -- dc->res_pool->underlay_pipe_index)) -- return DC_SURFACE_PIXEL_FORMAT_UNSUPPORTED; -+ for (j = 0; j < MAX_PIPES; j++) { -+ struct pipe_ctx *pipe_ctx = -+ &context->res_ctx.pipe_ctx[j]; - -- status = dce110_resource_build_pipe_hw_param(pipe_ctx); -+ if (context->res_ctx.pipe_ctx[j].stream != stream) -+ continue; - -- if (status != DC_OK) -- return status; -+ if (!is_surface_pixel_format_supported(pipe_ctx, -+ dc->res_pool->underlay_pipe_index)) -+ return DC_SURFACE_PIXEL_FORMAT_UNSUPPORTED; - -- /* TODO: validate audio ASIC caps, encoder */ -+ status = dce110_resource_build_pipe_hw_param(pipe_ctx); - -- resource_build_info_frame(pipe_ctx); -+ if (status != DC_OK) -+ return status; -+ -+ /* TODO: validate audio ASIC caps, encoder */ -+ -+ resource_build_info_frame(pipe_ctx); -+ -+ /* do not need to validate non root pipes */ -+ break; -+ } -+ } - - return DC_OK; - } - - static bool dce110_validate_bandwidth( -- struct dc *dc, -- struct dc_state *context) -+ const struct core_dc *dc, -+ struct validate_context *context) - { - bool result = false; - -@@ -811,8 +826,8 @@ static bool dce110_validate_bandwidth( - - if (bw_calcs( - dc->ctx, -- dc->bw_dceip, -- dc->bw_vbios, -+ &dc->bw_dceip, -+ &dc->bw_vbios, - context->res_ctx.pipe_ctx, - dc->res_pool->pipe_count, - &context->bw.dce)) -@@ -826,7 +841,7 @@ static bool dce110_validate_bandwidth( - context->streams[0]->timing.v_addressable, - context->streams[0]->timing.pix_clk_khz); - -- if (memcmp(&dc->current_state->bw.dce, -+ if (memcmp(&dc->current_context->bw.dce, - &context->bw.dce, sizeof(context->bw.dce))) { - struct log_entry log_entry; - dm_logger_open( -@@ -880,30 +895,31 @@ static bool dce110_validate_bandwidth( - } - - static bool dce110_validate_surface_sets( -- struct dc_state *context) -+ const struct dc_validation_set set[], -+ int set_count) - { - int i; - -- for (i = 0; i < context->stream_count; i++) { -- if (context->stream_status[i].plane_count == 0) -+ for (i = 0; i < set_count; i++) { -+ if (set[i].plane_count == 0) - continue; - -- if (context->stream_status[i].plane_count > 2) -+ if (set[i].plane_count > 2) - return false; - -- if (context->stream_status[i].plane_states[0]->format -+ if (set[i].plane_states[0]->format - >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) - return false; - -- if (context->stream_status[i].plane_count == 2) { -- if (context->stream_status[i].plane_states[1]->format -+ if (set[i].plane_count == 2) { -+ if (set[i].plane_states[1]->format - < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) - return false; -- if (context->stream_status[i].plane_states[1]->src_rect.width > 1920 -- || context->stream_status[i].plane_states[1]->src_rect.height > 1080) -+ if (set[i].plane_states[1]->src_rect.width > 1920 -+ || set[i].plane_states[1]->src_rect.height > 1080) - return false; - -- if (context->streams[i]->timing.pixel_encoding != PIXEL_ENCODING_RGB) -+ if (set[i].stream->timing.pixel_encoding != PIXEL_ENCODING_RGB) - return false; - } - } -@@ -911,39 +927,54 @@ static bool dce110_validate_surface_sets( - return true; - } - --enum dc_status dce110_validate_global( -- struct dc *dc, -- struct dc_state *context) -+static enum dc_status dce110_validate_with_context( -+ const struct core_dc *dc, -+ const struct dc_validation_set set[], -+ int set_count, -+ struct validate_context *context, -+ struct validate_context *old_context) - { -- if (!dce110_validate_surface_sets(context)) -+ struct dc_context *dc_ctx = dc->ctx; -+ enum dc_status result = DC_ERROR_UNEXPECTED; -+ int i; -+ -+ if (!dce110_validate_surface_sets(set, set_count)) - return DC_FAIL_SURFACE_VALIDATE; - -- return DC_OK; --} -+ for (i = 0; i < set_count; i++) { -+ context->streams[i] = set[i].stream; -+ dc_stream_retain(context->streams[i]); -+ context->stream_count++; -+ } - --static enum dc_status dce110_add_stream_to_ctx( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *dc_stream) --{ -- enum dc_status result = DC_ERROR_UNEXPECTED; -+ result = resource_map_pool_resources(dc, context, old_context); -+ -+ if (result == DC_OK) -+ result = resource_map_clock_resources(dc, context, old_context); - -- result = resource_map_pool_resources(dc, new_ctx, dc_stream); -+ if (!resource_validate_attach_surfaces(set, set_count, -+ old_context, context, dc->res_pool)) { -+ DC_ERROR("Failed to attach surface to stream!\n"); -+ return DC_FAIL_ATTACH_SURFACES; -+ } - - if (result == DC_OK) -- result = resource_map_clock_resources(dc, new_ctx, dc_stream); -+ result = build_mapped_resource(dc, context, old_context); - -+ if (result == DC_OK) -+ result = resource_build_scaling_params_for_context(dc, context); - - if (result == DC_OK) -- result = build_mapped_resource(dc, new_ctx, dc_stream); -+ if (!dce110_validate_bandwidth(dc, context)) -+ result = DC_FAIL_BANDWIDTH_VALIDATE; - - return result; - } - - static enum dc_status dce110_validate_guaranteed( -- struct dc *dc, -+ const struct core_dc *dc, - struct dc_stream_state *dc_stream, -- struct dc_state *context) -+ struct validate_context *context) - { - enum dc_status result = DC_ERROR_UNEXPECTED; - -@@ -951,17 +982,17 @@ static enum dc_status dce110_validate_guaranteed( - dc_stream_retain(context->streams[0]); - context->stream_count++; - -- result = resource_map_pool_resources(dc, context, dc_stream); -+ result = resource_map_pool_resources(dc, context, NULL); - - if (result == DC_OK) -- result = resource_map_clock_resources(dc, context, dc_stream); -+ result = resource_map_clock_resources(dc, context, NULL); - - if (result == DC_OK) -- result = build_mapped_resource(dc, context, dc_stream); -+ result = build_mapped_resource(dc, context, NULL); - - if (result == DC_OK) { - validate_guaranteed_copy_streams( -- context, dc->caps.max_streams); -+ context, dc->public.caps.max_streams); - result = resource_build_scaling_params_for_context(dc, context); - } - -@@ -973,11 +1004,11 @@ static enum dc_status dce110_validate_guaranteed( - } - - static struct pipe_ctx *dce110_acquire_underlay( -- struct dc_state *context, -+ struct validate_context *context, - const struct resource_pool *pool, - struct dc_stream_state *stream) - { -- struct dc *dc = stream->ctx->dc; -+ struct core_dc *dc = DC_TO_CORE(stream->ctx->dc); - struct resource_context *res_ctx = &context->res_ctx; - unsigned int underlay_idx = pool->underlay_pipe_index; - struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[underlay_idx]; -@@ -990,11 +1021,12 @@ static struct pipe_ctx *dce110_acquire_underlay( - /*pipe_ctx->plane_res.ipp = res_ctx->pool->ipps[underlay_idx];*/ - pipe_ctx->plane_res.xfm = pool->transforms[underlay_idx]; - pipe_ctx->stream_res.opp = pool->opps[underlay_idx]; -+ pipe_ctx->dis_clk = pool->display_clock; - pipe_ctx->pipe_idx = underlay_idx; - - pipe_ctx->stream = stream; - -- if (!dc->current_state->res_ctx.pipe_ctx[underlay_idx].stream) { -+ if (!dc->current_context->res_ctx.pipe_ctx[underlay_idx].stream) { - struct tg_color black_color = {0}; - struct dc_bios *dcb = dc->ctx->dc_bios; - -@@ -1046,11 +1078,10 @@ static void dce110_destroy_resource_pool(struct resource_pool **pool) - static const struct resource_funcs dce110_res_pool_funcs = { - .destroy = dce110_destroy_resource_pool, - .link_enc_create = dce110_link_encoder_create, -+ .validate_with_context = dce110_validate_with_context, - .validate_guaranteed = dce110_validate_guaranteed, - .validate_bandwidth = dce110_validate_bandwidth, - .acquire_idle_pipe_for_layer = dce110_acquire_underlay, -- .add_stream_to_ctx = dce110_add_stream_to_ctx, -- .validate_global = dce110_validate_global - }; - - static bool underlay_create(struct dc_context *ctx, struct resource_pool *pool) -@@ -1086,7 +1117,7 @@ static bool underlay_create(struct dc_context *ctx, struct resource_pool *pool) - return true; - } - --static void bw_calcs_data_update_from_pplib(struct dc *dc) -+static void bw_calcs_data_update_from_pplib(struct core_dc *dc) - { - struct dm_pp_clock_levels clks = {0}; - -@@ -1096,21 +1127,21 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) - DM_PP_CLOCK_TYPE_ENGINE_CLK, - &clks); - /* convert all the clock fro kHz to fix point mHz */ -- dc->bw_vbios->high_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.high_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels-1], 1000); -- dc->bw_vbios->mid1_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid1_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels/8], 1000); -- dc->bw_vbios->mid2_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid2_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels*2/8], 1000); -- dc->bw_vbios->mid3_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid3_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels*3/8], 1000); -- dc->bw_vbios->mid4_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid4_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels*4/8], 1000); -- dc->bw_vbios->mid5_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid5_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels*5/8], 1000); -- dc->bw_vbios->mid6_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid6_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels*6/8], 1000); -- dc->bw_vbios->low_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.low_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[0], 1000); - dc->sclk_lvls = clks; - -@@ -1119,11 +1150,11 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) - dc->ctx, - DM_PP_CLOCK_TYPE_DISPLAY_CLK, - &clks); -- dc->bw_vbios->high_voltage_max_dispclk = bw_frc_to_fixed( -+ dc->bw_vbios.high_voltage_max_dispclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels-1], 1000); -- dc->bw_vbios->mid_voltage_max_dispclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid_voltage_max_dispclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels>>1], 1000); -- dc->bw_vbios->low_voltage_max_dispclk = bw_frc_to_fixed( -+ dc->bw_vbios.low_voltage_max_dispclk = bw_frc_to_fixed( - clks.clocks_in_khz[0], 1000); - - /*do memory clock*/ -@@ -1132,12 +1163,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) - DM_PP_CLOCK_TYPE_MEMORY_CLK, - &clks); - -- dc->bw_vbios->low_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.low_yclk = bw_frc_to_fixed( - clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER, 1000); -- dc->bw_vbios->mid_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid_yclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER, - 1000); -- dc->bw_vbios->high_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.high_yclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER, - 1000); - } -@@ -1153,7 +1184,7 @@ const struct resource_caps *dce110_resource_cap( - - static bool construct( - uint8_t num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct dce110_resource_pool *pool, - struct hw_asic_id asic_id) - { -@@ -1175,9 +1206,9 @@ static bool construct( - pool->base.pipe_count = pool->base.res_cap->num_timing_generator; - pool->base.underlay_pipe_index = pool->base.pipe_count; - -- dc->caps.max_downscale_ratio = 150; -- dc->caps.i2c_speed_in_khz = 100; -- dc->caps.max_cursor_size = 128; -+ dc->public.caps.max_downscale_ratio = 150; -+ dc->public.caps.i2c_speed_in_khz = 100; -+ dc->public.caps.max_cursor_size = 128; - - /************************************************* - * Create resources * -@@ -1320,9 +1351,9 @@ static bool construct( - if (!dce110_hw_sequencer_construct(dc)) - goto res_create_fail; - -- dc->caps.max_planes = pool->base.pipe_count; -+ dc->public.caps.max_planes = pool->base.pipe_count; - -- bw_calcs_init(dc->bw_dceip, dc->bw_vbios, dc->ctx->asic_id); -+ bw_calcs_init(&dc->bw_dceip, &dc->bw_vbios, dc->ctx->asic_id); - - bw_calcs_data_update_from_pplib(dc); - -@@ -1335,7 +1366,7 @@ static bool construct( - - struct resource_pool *dce110_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct hw_asic_id asic_id) - { - struct dce110_resource_pool *pool = -diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.h -index 5bb692d..8e2e85d 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.h -+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.h -@@ -28,7 +28,7 @@ - - #include "core_types.h" - --struct dc; -+struct core_dc; - struct resource_pool; - - #define TO_DCE110_RES_POOL(pool)\ -@@ -42,7 +42,7 @@ enum dc_status dce110_resource_build_pipe_hw_param(struct pipe_ctx *pipe_ctx); - - struct resource_pool *dce110_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct hw_asic_id asic_id); - - #endif /* __DC_RESOURCE_DCE110_H__ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c -index 8816e09..204f613 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c -+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c -@@ -25,6 +25,7 @@ - - #include "dm_services.h" - #include "dc.h" -+#include "core_dc.h" - #include "core_types.h" - #include "dce112_hw_sequencer.h" - -@@ -111,7 +112,7 @@ static void dce112_init_pte(struct dc_context *ctx) - } - - static bool dce112_enable_display_power_gating( -- struct dc *dc, -+ struct core_dc *dc, - uint8_t controller_id, - struct dc_bios *dcb, - enum pipe_gating_control power_gating) -@@ -152,7 +153,7 @@ static bool dce112_enable_display_power_gating( - return false; - } - --bool dce112_hw_sequencer_construct(struct dc *dc) -+bool dce112_hw_sequencer_construct(struct core_dc *dc) - { - /* All registers used by dce11.2 match those in dce11 in offset and - * structure -diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.h -index 37bd60c..d96c582 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.h -+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.h -@@ -28,9 +28,9 @@ - - #include "core_types.h" - --struct dc; -+struct core_dc; - --bool dce112_hw_sequencer_construct(struct dc *dc); -+bool dce112_hw_sequencer_construct(struct core_dc *dc); - - #endif /* __DC_HWSS_DCE112_H__ */ - -diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c -index de6f71d..420434d 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c -+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c -@@ -723,29 +723,44 @@ static struct clock_source *find_matching_pll( - } - - static enum dc_status build_mapped_resource( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream) -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context) - { - enum dc_status status = DC_OK; -- struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream); -+ uint8_t i, j; - -- if (!pipe_ctx) -- return DC_ERROR_UNEXPECTED; -+ for (i = 0; i < context->stream_count; i++) { -+ struct dc_stream_state *stream = context->streams[i]; -+ -+ if (old_context && resource_is_stream_unchanged(old_context, stream)) -+ continue; -+ -+ for (j = 0; j < MAX_PIPES; j++) { -+ struct pipe_ctx *pipe_ctx = -+ &context->res_ctx.pipe_ctx[j]; -+ -+ if (context->res_ctx.pipe_ctx[j].stream != stream) -+ continue; - -- status = dce110_resource_build_pipe_hw_param(pipe_ctx); -+ status = dce110_resource_build_pipe_hw_param(pipe_ctx); - -- if (status != DC_OK) -- return status; -+ if (status != DC_OK) -+ return status; - -- resource_build_info_frame(pipe_ctx); -+ resource_build_info_frame(pipe_ctx); -+ -+ /* do not need to validate non root pipes */ -+ break; -+ } -+ } - - return DC_OK; - } - - bool dce112_validate_bandwidth( -- struct dc *dc, -- struct dc_state *context) -+ const struct core_dc *dc, -+ struct validate_context *context) - { - bool result = false; - -@@ -756,8 +771,8 @@ bool dce112_validate_bandwidth( - - if (bw_calcs( - dc->ctx, -- dc->bw_dceip, -- dc->bw_vbios, -+ &dc->bw_dceip, -+ &dc->bw_vbios, - context->res_ctx.pipe_ctx, - dc->res_pool->pipe_count, - &context->bw.dce)) -@@ -768,7 +783,7 @@ bool dce112_validate_bandwidth( - "%s: Bandwidth validation failed!", - __func__); - -- if (memcmp(&dc->current_state->bw.dce, -+ if (memcmp(&dc->current_context->bw.dce, - &context->bw.dce, sizeof(context->bw.dce))) { - struct log_entry log_entry; - dm_logger_open( -@@ -822,51 +837,65 @@ bool dce112_validate_bandwidth( - } - - enum dc_status resource_map_phy_clock_resources( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream) -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context) - { -+ uint8_t i, j; - - /* acquire new resources */ -- struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream( -- &context->res_ctx, stream); -+ for (i = 0; i < context->stream_count; i++) { -+ struct dc_stream_state *stream = context->streams[i]; - -- if (!pipe_ctx) -- return DC_ERROR_UNEXPECTED; -+ if (old_context && resource_is_stream_unchanged(old_context, stream)) -+ continue; - -- if (dc_is_dp_signal(pipe_ctx->stream->signal) -- || pipe_ctx->stream->signal == SIGNAL_TYPE_VIRTUAL) -- pipe_ctx->clock_source = -- dc->res_pool->dp_clock_source; -- else -- pipe_ctx->clock_source = find_matching_pll( -- &context->res_ctx, dc->res_pool, -- stream); -+ for (j = 0; j < MAX_PIPES; j++) { -+ struct pipe_ctx *pipe_ctx = -+ &context->res_ctx.pipe_ctx[j]; -+ -+ if (context->res_ctx.pipe_ctx[j].stream != stream) -+ continue; - -- if (pipe_ctx->clock_source == NULL) -- return DC_NO_CLOCK_SOURCE_RESOURCE; -+ if (dc_is_dp_signal(pipe_ctx->stream->signal) -+ || pipe_ctx->stream->signal == SIGNAL_TYPE_VIRTUAL) -+ pipe_ctx->clock_source = -+ dc->res_pool->dp_clock_source; -+ else -+ pipe_ctx->clock_source = find_matching_pll( -+ &context->res_ctx, dc->res_pool, -+ stream); - -- resource_reference_clock_source( -- &context->res_ctx, -- dc->res_pool, -- pipe_ctx->clock_source); -+ if (pipe_ctx->clock_source == NULL) -+ return DC_NO_CLOCK_SOURCE_RESOURCE; -+ -+ resource_reference_clock_source( -+ &context->res_ctx, -+ dc->res_pool, -+ pipe_ctx->clock_source); -+ -+ /* only one cs per stream regardless of mpo */ -+ break; -+ } -+ } - - return DC_OK; - } - - static bool dce112_validate_surface_sets( -- struct dc_state *context) -+ const struct dc_validation_set set[], -+ int set_count) - { - int i; - -- for (i = 0; i < context->stream_count; i++) { -- if (context->stream_status[i].plane_count == 0) -+ for (i = 0; i < set_count; i++) { -+ if (set[i].plane_count == 0) - continue; - -- if (context->stream_status[i].plane_count > 1) -+ if (set[i].plane_count > 1) - return false; - -- if (context->stream_status[i].plane_states[0]->format -+ if (set[i].plane_states[0]->format - >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) - return false; - } -@@ -874,29 +903,54 @@ static bool dce112_validate_surface_sets( - return true; - } - --enum dc_status dce112_add_stream_to_ctx( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *dc_stream) -+enum dc_status dce112_validate_with_context( -+ const struct core_dc *dc, -+ const struct dc_validation_set set[], -+ int set_count, -+ struct validate_context *context, -+ struct validate_context *old_context) - { -+ struct dc_context *dc_ctx = dc->ctx; - enum dc_status result = DC_ERROR_UNEXPECTED; -+ int i; - -- result = resource_map_pool_resources(dc, new_ctx, dc_stream); -+ if (!dce112_validate_surface_sets(set, set_count)) -+ return DC_FAIL_SURFACE_VALIDATE; -+ -+ for (i = 0; i < set_count; i++) { -+ context->streams[i] = set[i].stream; -+ dc_stream_retain(context->streams[i]); -+ context->stream_count++; -+ } -+ -+ result = resource_map_pool_resources(dc, context, old_context); - - if (result == DC_OK) -- result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream); -+ result = resource_map_phy_clock_resources(dc, context, old_context); - -+ if (!resource_validate_attach_surfaces(set, set_count, -+ old_context, context, dc->res_pool)) { -+ DC_ERROR("Failed to attach surface to stream!\n"); -+ return DC_FAIL_ATTACH_SURFACES; -+ } -+ -+ if (result == DC_OK) -+ result = build_mapped_resource(dc, context, old_context); -+ -+ if (result == DC_OK) -+ result = resource_build_scaling_params_for_context(dc, context); - - if (result == DC_OK) -- result = build_mapped_resource(dc, new_ctx, dc_stream); -+ if (!dce112_validate_bandwidth(dc, context)) -+ result = DC_FAIL_BANDWIDTH_VALIDATE; - - return result; - } - - enum dc_status dce112_validate_guaranteed( -- struct dc *dc, -+ const struct core_dc *dc, - struct dc_stream_state *stream, -- struct dc_state *context) -+ struct validate_context *context) - { - enum dc_status result = DC_ERROR_UNEXPECTED; - -@@ -904,17 +958,17 @@ enum dc_status dce112_validate_guaranteed( - dc_stream_retain(context->streams[0]); - context->stream_count++; - -- result = resource_map_pool_resources(dc, context, stream); -+ result = resource_map_pool_resources(dc, context, NULL); - - if (result == DC_OK) -- result = resource_map_phy_clock_resources(dc, context, stream); -+ result = resource_map_phy_clock_resources(dc, context, NULL); - - if (result == DC_OK) -- result = build_mapped_resource(dc, context, stream); -+ result = build_mapped_resource(dc, context, NULL); - - if (result == DC_OK) { - validate_guaranteed_copy_streams( -- context, dc->caps.max_streams); -+ context, dc->public.caps.max_streams); - result = resource_build_scaling_params_for_context(dc, context); - } - -@@ -925,16 +979,6 @@ enum dc_status dce112_validate_guaranteed( - return result; - } - --enum dc_status dce112_validate_global( -- struct dc *dc, -- struct dc_state *context) --{ -- if (!dce112_validate_surface_sets(context)) -- return DC_FAIL_SURFACE_VALIDATE; -- -- return DC_OK; --} -- - static void dce112_destroy_resource_pool(struct resource_pool **pool) - { - struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool); -@@ -947,14 +991,13 @@ static void dce112_destroy_resource_pool(struct resource_pool **pool) - static const struct resource_funcs dce112_res_pool_funcs = { - .destroy = dce112_destroy_resource_pool, - .link_enc_create = dce112_link_encoder_create, -+ .validate_with_context = dce112_validate_with_context, - .validate_guaranteed = dce112_validate_guaranteed, - .validate_bandwidth = dce112_validate_bandwidth, -- .validate_plane = dce100_validate_plane, -- .add_stream_to_ctx = dce112_add_stream_to_ctx, -- .validate_global = dce112_validate_global -+ .validate_plane = dce100_validate_plane - }; - --static void bw_calcs_data_update_from_pplib(struct dc *dc) -+static void bw_calcs_data_update_from_pplib(struct core_dc *dc) - { - struct dm_pp_clock_levels_with_latency eng_clks = {0}; - struct dm_pp_clock_levels_with_latency mem_clks = {0}; -@@ -975,21 +1018,21 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) - DM_PP_CLOCK_TYPE_ENGINE_CLK, - &clks); - /* convert all the clock fro kHz to fix point mHz */ -- dc->bw_vbios->high_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.high_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels-1], 1000); -- dc->bw_vbios->mid1_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid1_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels/8], 1000); -- dc->bw_vbios->mid2_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid2_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels*2/8], 1000); -- dc->bw_vbios->mid3_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid3_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels*3/8], 1000); -- dc->bw_vbios->mid4_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid4_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels*4/8], 1000); -- dc->bw_vbios->mid5_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid5_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels*5/8], 1000); -- dc->bw_vbios->mid6_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid6_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels*6/8], 1000); -- dc->bw_vbios->low_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.low_sclk = bw_frc_to_fixed( - clks.clocks_in_khz[0], 1000); - - /*do memory clock*/ -@@ -998,12 +1041,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) - DM_PP_CLOCK_TYPE_MEMORY_CLK, - &clks); - -- dc->bw_vbios->low_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.low_yclk = bw_frc_to_fixed( - clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER, 1000); -- dc->bw_vbios->mid_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid_yclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER, - 1000); -- dc->bw_vbios->high_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.high_yclk = bw_frc_to_fixed( - clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER, - 1000); - -@@ -1011,21 +1054,21 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) - } - - /* convert all the clock fro kHz to fix point mHz TODO: wloop data */ -- dc->bw_vbios->high_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.high_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels-1].clocks_in_khz, 1000); -- dc->bw_vbios->mid1_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid1_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels/8].clocks_in_khz, 1000); -- dc->bw_vbios->mid2_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid2_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels*2/8].clocks_in_khz, 1000); -- dc->bw_vbios->mid3_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid3_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz, 1000); -- dc->bw_vbios->mid4_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid4_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels*4/8].clocks_in_khz, 1000); -- dc->bw_vbios->mid5_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid5_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels*5/8].clocks_in_khz, 1000); -- dc->bw_vbios->mid6_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid6_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels*6/8].clocks_in_khz, 1000); -- dc->bw_vbios->low_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.low_sclk = bw_frc_to_fixed( - eng_clks.data[0].clocks_in_khz, 1000); - - /*do memory clock*/ -@@ -1039,12 +1082,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) - * ALSO always convert UMA clock (from PPLIB) to YCLK (HW formula): - * YCLK = UMACLK*m_memoryTypeMultiplier - */ -- dc->bw_vbios->low_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.low_yclk = bw_frc_to_fixed( - mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, 1000); -- dc->bw_vbios->mid_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid_yclk = bw_frc_to_fixed( - mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, - 1000); -- dc->bw_vbios->high_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.high_yclk = bw_frc_to_fixed( - mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, - 1000); - -@@ -1110,7 +1153,7 @@ const struct resource_caps *dce112_resource_cap( - - static bool construct( - uint8_t num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct dce110_resource_pool *pool) - { - unsigned int i; -@@ -1127,9 +1170,9 @@ static bool construct( - *************************************************/ - pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE; - pool->base.pipe_count = pool->base.res_cap->num_timing_generator; -- dc->caps.max_downscale_ratio = 200; -- dc->caps.i2c_speed_in_khz = 100; -- dc->caps.max_cursor_size = 128; -+ dc->public.caps.max_downscale_ratio = 200; -+ dc->public.caps.i2c_speed_in_khz = 100; -+ dc->public.caps.max_cursor_size = 128; - - /************************************************* - * Create resources * -@@ -1276,13 +1319,13 @@ static bool construct( - &res_create_funcs)) - goto res_create_fail; - -- dc->caps.max_planes = pool->base.pipe_count; -+ dc->public.caps.max_planes = pool->base.pipe_count; - - /* Create hardware sequencer */ - if (!dce112_hw_sequencer_construct(dc)) - goto res_create_fail; - -- bw_calcs_init(dc->bw_dceip, dc->bw_vbios, dc->ctx->asic_id); -+ bw_calcs_init(&dc->bw_dceip, &dc->bw_vbios, dc->ctx->asic_id); - - bw_calcs_data_update_from_pplib(dc); - -@@ -1295,7 +1338,7 @@ static bool construct( - - struct resource_pool *dce112_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc) -+ struct core_dc *dc) - { - struct dce110_resource_pool *pool = - dm_alloc(sizeof(struct dce110_resource_pool)); -diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h -index d5c19d3..feef559 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h -+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h -@@ -28,33 +28,28 @@ - - #include "core_types.h" - --struct dc; -+struct core_dc; - struct resource_pool; - - struct resource_pool *dce112_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc); -+ struct core_dc *dc); - - enum dc_status dce112_validate_with_context( -- struct dc *dc, -+ const struct core_dc *dc, - const struct dc_validation_set set[], - int set_count, -- struct dc_state *context, -- struct dc_state *old_context); -+ struct validate_context *context, -+ struct validate_context *old_context); - - enum dc_status dce112_validate_guaranteed( -- struct dc *dc, -+ const struct core_dc *dc, - struct dc_stream_state *dc_stream, -- struct dc_state *context); -+ struct validate_context *context); - - bool dce112_validate_bandwidth( -- struct dc *dc, -- struct dc_state *context); -- --enum dc_status dce112_add_stream_to_ctx( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *dc_stream); -+ const struct core_dc *dc, -+ struct validate_context *context); - - - #endif /* __DC_RESOURCE_DCE112_H__ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.c -index 56e3b12..91301b4 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.c -+++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.c -@@ -25,12 +25,14 @@ - - #include "dm_services.h" - #include "dc.h" -+#include "core_dc.h" - #include "core_types.h" - #include "dce120_hw_sequencer.h" - #include "dce/dce_hwseq.h" - - #include "dce110/dce110_hw_sequencer.h" - -+/* include DCE12.0 register header files */ - #include "vega10/DC/dce_12_0_offset.h" - #include "vega10/DC/dce_12_0_sh_mask.h" - #include "vega10/soc15ip.h" -@@ -147,7 +149,7 @@ static void dce120_init_pte(struct dc_context *ctx, uint8_t controller_id) - #endif - - static bool dce120_enable_display_power_gating( -- struct dc *dc, -+ struct core_dc *dc, - uint8_t controller_id, - struct dc_bios *dcb, - enum pipe_gating_control power_gating) -@@ -245,7 +247,7 @@ static void dce120_update_dchub( - - - --bool dce120_hw_sequencer_construct(struct dc *dc) -+bool dce120_hw_sequencer_construct(struct core_dc *dc) - { - /* All registers used by dce11.2 match those in dce11 in offset and - * structure -diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.h -index 6448a17..3402413 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.h -+++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.h -@@ -28,9 +28,9 @@ - - #include "core_types.h" - --struct dc; -+struct core_dc; - --bool dce120_hw_sequencer_construct(struct dc *dc); -+bool dce120_hw_sequencer_construct(struct core_dc *dc); - - #endif /* __DC_HWSS_DCE112_H__ */ - -diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c -index e5d2d98..d4e9627 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c -+++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c -@@ -410,7 +410,7 @@ void dce120_clock_source_destroy(struct clock_source **clk_src) - } - - --bool dce120_hw_sequencer_create(struct dc *dc) -+bool dce120_hw_sequencer_create(struct core_dc *dc) - { - /* All registers used by dce11.2 match those in dce11 in offset and - * structure -@@ -698,13 +698,13 @@ static void dce120_destroy_resource_pool(struct resource_pool **pool) - static const struct resource_funcs dce120_res_pool_funcs = { - .destroy = dce120_destroy_resource_pool, - .link_enc_create = dce120_link_encoder_create, -+ .validate_with_context = dce112_validate_with_context, - .validate_guaranteed = dce112_validate_guaranteed, - .validate_bandwidth = dce112_validate_bandwidth, -- .validate_plane = dce100_validate_plane, -- .add_stream_to_ctx = dce112_add_stream_to_ctx -+ .validate_plane = dce100_validate_plane - }; - --static void bw_calcs_data_update_from_pplib(struct dc *dc) -+static void bw_calcs_data_update_from_pplib(struct core_dc *dc) - { - struct dm_pp_clock_levels_with_latency eng_clks = {0}; - struct dm_pp_clock_levels_with_latency mem_clks = {0}; -@@ -729,21 +729,21 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) - } - - /* convert all the clock fro kHz to fix point mHz TODO: wloop data */ -- dc->bw_vbios->high_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.high_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels-1].clocks_in_khz, 1000); -- dc->bw_vbios->mid1_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid1_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels/8].clocks_in_khz, 1000); -- dc->bw_vbios->mid2_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid2_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels*2/8].clocks_in_khz, 1000); -- dc->bw_vbios->mid3_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid3_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz, 1000); -- dc->bw_vbios->mid4_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid4_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels*4/8].clocks_in_khz, 1000); -- dc->bw_vbios->mid5_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid5_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels*5/8].clocks_in_khz, 1000); -- dc->bw_vbios->mid6_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid6_sclk = bw_frc_to_fixed( - eng_clks.data[eng_clks.num_levels*6/8].clocks_in_khz, 1000); -- dc->bw_vbios->low_sclk = bw_frc_to_fixed( -+ dc->bw_vbios.low_sclk = bw_frc_to_fixed( - eng_clks.data[0].clocks_in_khz, 1000); - - /*do memory clock*/ -@@ -770,12 +770,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) - * ALSO always convert UMA clock (from PPLIB) to YCLK (HW formula): - * YCLK = UMACLK*m_memoryTypeMultiplier - */ -- dc->bw_vbios->low_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.low_yclk = bw_frc_to_fixed( - mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, 1000); -- dc->bw_vbios->mid_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.mid_yclk = bw_frc_to_fixed( - mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, - 1000); -- dc->bw_vbios->high_yclk = bw_frc_to_fixed( -+ dc->bw_vbios.high_yclk = bw_frc_to_fixed( - mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, - 1000); - -@@ -831,7 +831,7 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) - - static bool construct( - uint8_t num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct dce110_resource_pool *pool) - { - unsigned int i; -@@ -847,10 +847,10 @@ static bool construct( - pool->base.pipe_count = res_cap.num_timing_generator; - pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE; - -- dc->caps.max_downscale_ratio = 200; -- dc->caps.i2c_speed_in_khz = 100; -- dc->caps.max_cursor_size = 128; -- dc->debug = debug_defaults; -+ dc->public.caps.max_downscale_ratio = 200; -+ dc->public.caps.i2c_speed_in_khz = 100; -+ dc->public.caps.max_cursor_size = 128; -+ dc->public.debug = debug_defaults; - - /************************************************* - * Create resources * -@@ -982,9 +982,9 @@ static bool construct( - if (!dce120_hw_sequencer_create(dc)) - goto controller_create_fail; - -- dc->caps.max_planes = pool->base.pipe_count; -+ dc->public.caps.max_planes = pool->base.pipe_count; - -- bw_calcs_init(dc->bw_dceip, dc->bw_vbios, dc->ctx->asic_id); -+ bw_calcs_init(&dc->bw_dceip, &dc->bw_vbios, dc->ctx->asic_id); - - bw_calcs_data_update_from_pplib(dc); - -@@ -1003,7 +1003,7 @@ static bool construct( - - struct resource_pool *dce120_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc) -+ struct core_dc *dc) - { - struct dce110_resource_pool *pool = - dm_alloc(sizeof(struct dce110_resource_pool)); -diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.h b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.h -index 3d1f3cf0..038c78d 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.h -+++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.h -@@ -28,12 +28,12 @@ - - #include "core_types.h" - --struct dc; -+struct core_dc; - struct resource_pool; - - struct resource_pool *dce120_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc); -+ struct core_dc *dc); - - #endif /* __DC_RESOURCE_DCE120_H__ */ - -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 28fe382..4cba80f 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 -@@ -25,6 +25,7 @@ - - #include "dm_services.h" - #include "dc.h" -+#include "core_dc.h" - #include "core_types.h" - #include "dce80_hw_sequencer.h" - -@@ -71,7 +72,7 @@ static const struct dce80_hw_seq_reg_offsets reg_offsets[] = { - /***************************PIPE_CONTROL***********************************/ - - static bool dce80_enable_display_power_gating( -- struct dc *dc, -+ struct core_dc *dc, - uint8_t controller_id, - struct dc_bios *dcb, - enum pipe_gating_control power_gating) -@@ -106,7 +107,7 @@ static bool dce80_enable_display_power_gating( - return false; - } - --bool dce80_hw_sequencer_construct(struct dc *dc) -+bool dce80_hw_sequencer_construct(struct core_dc *dc) - { - dce110_hw_sequencer_construct(dc); - -diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.h -index 9d6dd05..7cc203f 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.h -+++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.h -@@ -28,9 +28,9 @@ - - #include "core_types.h" - --struct dc; -+struct core_dc; - --bool dce80_hw_sequencer_construct(struct dc *dc); -+bool dce80_hw_sequencer_construct(struct core_dc *dc); - - #endif /* __DC_HWSS_DCE80_H__ */ - -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 5453f02..132117e 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c -+++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c -@@ -187,7 +187,7 @@ static const struct dce_ipp_mask ipp_mask = { - - #define transform_regs(id)\ - [id] = {\ -- XFM_COMMON_REG_LIST_DCE80(id)\ -+ XFM_COMMON_REG_LIST_DCE_BASE(id)\ - } - - static const struct dce_transform_registers xfm_regs[] = { -@@ -200,11 +200,11 @@ static const struct dce_transform_registers xfm_regs[] = { - }; - - static const struct dce_transform_shift xfm_shift = { -- XFM_COMMON_MASK_SH_LIST_DCE80(__SHIFT) -+ XFM_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT) - }; - - static const struct dce_transform_mask xfm_mask = { -- XFM_COMMON_MASK_SH_LIST_DCE80(_MASK) -+ XFM_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) - }; - - #define aux_regs(id)\ -@@ -684,29 +684,44 @@ static void destruct(struct dce110_resource_pool *pool) - } - - static enum dc_status build_mapped_resource( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream) -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context) - { - enum dc_status status = DC_OK; -- struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream); -+ uint8_t i, j; - -- if (!pipe_ctx) -- return DC_ERROR_UNEXPECTED; -+ for (i = 0; i < context->stream_count; i++) { -+ struct dc_stream_state *stream = context->streams[i]; -+ -+ if (old_context && resource_is_stream_unchanged(old_context, stream)) -+ continue; -+ -+ for (j = 0; j < MAX_PIPES; j++) { -+ struct pipe_ctx *pipe_ctx = -+ &context->res_ctx.pipe_ctx[j]; - -- status = dce110_resource_build_pipe_hw_param(pipe_ctx); -+ if (context->res_ctx.pipe_ctx[j].stream != stream) -+ continue; - -- if (status != DC_OK) -- return status; -+ status = dce110_resource_build_pipe_hw_param(pipe_ctx); - -- resource_build_info_frame(pipe_ctx); -+ if (status != DC_OK) -+ return status; -+ -+ resource_build_info_frame(pipe_ctx); -+ -+ /* do not need to validate non root pipes */ -+ break; -+ } -+ } - - return DC_OK; - } - - bool dce80_validate_bandwidth( -- struct dc *dc, -- struct dc_state *context) -+ const struct core_dc *dc, -+ struct validate_context *context) - { - /* TODO implement when needed but for now hardcode max value*/ - context->bw.dce.dispclk_khz = 681000; -@@ -716,18 +731,19 @@ bool dce80_validate_bandwidth( - } - - static bool dce80_validate_surface_sets( -- struct dc_state *context) -+ const struct dc_validation_set set[], -+ int set_count) - { - int i; - -- for (i = 0; i < context->stream_count; i++) { -- if (context->stream_status[i].plane_count == 0) -+ for (i = 0; i < set_count; i++) { -+ if (set[i].plane_count == 0) - continue; - -- if (context->stream_status[i].plane_count > 1) -+ if (set[i].plane_count > 1) - return false; - -- if (context->stream_status[i].plane_states[0]->format -+ if (set[i].plane_states[0]->format - >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) - return false; - } -@@ -735,20 +751,53 @@ static bool dce80_validate_surface_sets( - return true; - } - --enum dc_status dce80_validate_global( -- struct dc *dc, -- struct dc_state *context) -+enum dc_status dce80_validate_with_context( -+ const struct core_dc *dc, -+ const struct dc_validation_set set[], -+ int set_count, -+ struct validate_context *context, -+ struct validate_context *old_context) - { -- if (!dce80_validate_surface_sets(context)) -+ struct dc_context *dc_ctx = dc->ctx; -+ enum dc_status result = DC_ERROR_UNEXPECTED; -+ int i; -+ -+ if (!dce80_validate_surface_sets(set, set_count)) - return DC_FAIL_SURFACE_VALIDATE; - -- return DC_OK; -+ for (i = 0; i < set_count; i++) { -+ context->streams[i] = set[i].stream; -+ dc_stream_retain(context->streams[i]); -+ context->stream_count++; -+ } -+ -+ result = resource_map_pool_resources(dc, context, old_context); -+ -+ if (result == DC_OK) -+ result = resource_map_clock_resources(dc, context, old_context); -+ -+ if (!resource_validate_attach_surfaces(set, set_count, -+ old_context, context, dc->res_pool)) { -+ DC_ERROR("Failed to attach surface to stream!\n"); -+ return DC_FAIL_ATTACH_SURFACES; -+ } -+ -+ if (result == DC_OK) -+ result = build_mapped_resource(dc, context, old_context); -+ -+ if (result == DC_OK) -+ result = resource_build_scaling_params_for_context(dc, context); -+ -+ if (result == DC_OK) -+ result = dce80_validate_bandwidth(dc, context); -+ -+ return result; - } - - enum dc_status dce80_validate_guaranteed( -- struct dc *dc, -+ const struct core_dc *dc, - struct dc_stream_state *dc_stream, -- struct dc_state *context) -+ struct validate_context *context) - { - enum dc_status result = DC_ERROR_UNEXPECTED; - -@@ -756,17 +805,17 @@ enum dc_status dce80_validate_guaranteed( - dc_stream_retain(context->streams[0]); - context->stream_count++; - -- result = resource_map_pool_resources(dc, context, dc_stream); -+ result = resource_map_pool_resources(dc, context, NULL); - - if (result == DC_OK) -- result = resource_map_clock_resources(dc, context, dc_stream); -+ result = resource_map_clock_resources(dc, context, NULL); - - if (result == DC_OK) -- result = build_mapped_resource(dc, context, dc_stream); -+ result = build_mapped_resource(dc, context, NULL); - - if (result == DC_OK) { - validate_guaranteed_copy_streams( -- context, dc->caps.max_streams); -+ context, dc->public.caps.max_streams); - result = resource_build_scaling_params_for_context(dc, context); - } - -@@ -788,16 +837,15 @@ static void dce80_destroy_resource_pool(struct resource_pool **pool) - static const struct resource_funcs dce80_res_pool_funcs = { - .destroy = dce80_destroy_resource_pool, - .link_enc_create = dce80_link_encoder_create, -+ .validate_with_context = dce80_validate_with_context, - .validate_guaranteed = dce80_validate_guaranteed, - .validate_bandwidth = dce80_validate_bandwidth, -- .validate_plane = dce100_validate_plane, -- .add_stream_to_ctx = dce100_add_stream_to_ctx, -- .validate_global = dce80_validate_global -+ .validate_plane = dce100_validate_plane - }; - - static bool dce80_construct( - uint8_t num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct dce110_resource_pool *pool) - { - unsigned int i; -@@ -817,9 +865,9 @@ static bool dce80_construct( - *************************************************/ - pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE; - pool->base.pipe_count = res_cap.num_timing_generator; -- dc->caps.max_downscale_ratio = 200; -- dc->caps.i2c_speed_in_khz = 40; -- dc->caps.max_cursor_size = 128; -+ dc->public.caps.max_downscale_ratio = 200; -+ dc->public.caps.i2c_speed_in_khz = 40; -+ dc->public.caps.max_cursor_size = 128; - - /************************************************* - * Create resources * -@@ -926,7 +974,7 @@ static bool dce80_construct( - } - } - -- dc->caps.max_planes = pool->base.pipe_count; -+ dc->public.caps.max_planes = pool->base.pipe_count; - - if (!resource_construct(num_virtual_links, dc, &pool->base, - &res_create_funcs)) -@@ -945,7 +993,7 @@ static bool dce80_construct( - - struct resource_pool *dce80_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc) -+ struct core_dc *dc) - { - struct dce110_resource_pool *pool = - dm_alloc(sizeof(struct dce110_resource_pool)); -@@ -962,7 +1010,7 @@ struct resource_pool *dce80_create_resource_pool( - - static bool dce81_construct( - uint8_t num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct dce110_resource_pool *pool) - { - unsigned int i; -@@ -982,9 +1030,9 @@ static bool dce81_construct( - *************************************************/ - pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE; - pool->base.pipe_count = res_cap_81.num_timing_generator; -- dc->caps.max_downscale_ratio = 200; -- dc->caps.i2c_speed_in_khz = 40; -- dc->caps.max_cursor_size = 128; -+ dc->public.caps.max_downscale_ratio = 200; -+ dc->public.caps.i2c_speed_in_khz = 40; -+ dc->public.caps.max_cursor_size = 128; - - /************************************************* - * Create resources * -@@ -1091,7 +1139,7 @@ static bool dce81_construct( - } - } - -- dc->caps.max_planes = pool->base.pipe_count; -+ dc->public.caps.max_planes = pool->base.pipe_count; - - if (!resource_construct(num_virtual_links, dc, &pool->base, - &res_create_funcs)) -@@ -1110,7 +1158,7 @@ static bool dce81_construct( - - struct resource_pool *dce81_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc) -+ struct core_dc *dc) - { - struct dce110_resource_pool *pool = - dm_alloc(sizeof(struct dce110_resource_pool)); -@@ -1127,7 +1175,7 @@ struct resource_pool *dce81_create_resource_pool( - - static bool dce83_construct( - uint8_t num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct dce110_resource_pool *pool) - { - unsigned int i; -@@ -1147,9 +1195,9 @@ static bool dce83_construct( - *************************************************/ - pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE; - pool->base.pipe_count = res_cap_83.num_timing_generator; -- dc->caps.max_downscale_ratio = 200; -- dc->caps.i2c_speed_in_khz = 40; -- dc->caps.max_cursor_size = 128; -+ dc->public.caps.max_downscale_ratio = 200; -+ dc->public.caps.i2c_speed_in_khz = 40; -+ dc->public.caps.max_cursor_size = 128; - - /************************************************* - * Create resources * -@@ -1252,7 +1300,7 @@ static bool dce83_construct( - } - } - -- dc->caps.max_planes = pool->base.pipe_count; -+ dc->public.caps.max_planes = pool->base.pipe_count; - - if (!resource_construct(num_virtual_links, dc, &pool->base, - &res_create_funcs)) -@@ -1271,7 +1319,7 @@ static bool dce83_construct( - - struct resource_pool *dce83_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc) -+ struct core_dc *dc) - { - struct dce110_resource_pool *pool = - dm_alloc(sizeof(struct dce110_resource_pool)); -diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.h b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.h -index eff31ab8..04f0cfe 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.h -+++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.h -@@ -28,20 +28,20 @@ - - #include "core_types.h" - --struct dc; -+struct core_dc; - struct resource_pool; - - struct resource_pool *dce80_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc); -+ struct core_dc *dc); - - struct resource_pool *dce81_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc); -+ struct core_dc *dc); - - struct resource_pool *dce83_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc); -+ struct core_dc *dc); - - #endif /* __DC_RESOURCE_DCE80_H__ */ - -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile -index 52b56d1..9ba1bfc 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile -@@ -3,8 +3,7 @@ - - DCN10 = dcn10_resource.o dcn10_ipp.o dcn10_hw_sequencer.o \ - dcn10_dpp.o dcn10_opp.o dcn10_timing_generator.o \ -- dcn10_mem_input.o dcn10_mpc.o dcn10_dwb.o \ -- dcn10_dpp_dscl.o dcn10_dpp_cm.o -+ dcn10_mem_input.o dcn10_mpc.o - - AMD_DAL_DCN10 = $(addprefix $(AMDDALPATH)/dc/dcn10/,$(DCN10)) - -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c -index 99caafb..e52e1f4 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c -@@ -27,6 +27,10 @@ - - #include "core_types.h" - -+#include "include/grph_object_id.h" -+#include "include/fixed31_32.h" -+#include "include/logger_interface.h" -+ - #include "reg_helper.h" - #include "dcn10_dpp.h" - #include "basics/conversion.h" -@@ -48,12 +52,6 @@ - #define FN(reg_name, field_name) \ - xfm->tf_shift->field_name, xfm->tf_mask->field_name - --enum pixel_format_description { -- PIXEL_FORMAT_FIXED = 0, -- PIXEL_FORMAT_FIXED16, -- PIXEL_FORMAT_FLOAT -- --}; - - enum dcn10_coef_filter_type_sel { - SCL_COEF_LUMA_VERT_FILTER = 0, -@@ -64,6 +62,22 @@ enum dcn10_coef_filter_type_sel { - SCL_COEF_ALPHA_HORZ_FILTER = 5 - }; - -+enum lb_memory_config { -+ /* Enable all 3 pieces of memory */ -+ LB_MEMORY_CONFIG_0 = 0, -+ -+ /* Enable only the first piece of memory */ -+ LB_MEMORY_CONFIG_1 = 1, -+ -+ /* Enable only the second piece of memory */ -+ LB_MEMORY_CONFIG_2 = 2, -+ -+ /* Only applicable in 4:2:0 mode, enable all 3 pieces of memory and the -+ * last piece of chroma memory used for the luma storage -+ */ -+ LB_MEMORY_CONFIG_3 = 3 -+}; -+ - enum dscl_autocal_mode { - AUTOCAL_MODE_OFF = 0, - -@@ -98,6 +112,514 @@ enum gamut_remap_select { - GAMUT_REMAP_COMB_COEFF - }; - -+static void dpp_set_overscan( -+ struct dcn10_dpp *xfm, -+ const struct scaler_data *data) -+{ -+ uint32_t left = data->recout.x; -+ uint32_t top = data->recout.y; -+ -+ int right = data->h_active - data->recout.x - data->recout.width; -+ int bottom = data->v_active - data->recout.y - data->recout.height; -+ -+ if (right < 0) { -+ BREAK_TO_DEBUGGER(); -+ right = 0; -+ } -+ if (bottom < 0) { -+ BREAK_TO_DEBUGGER(); -+ bottom = 0; -+ } -+ -+ REG_SET_2(DSCL_EXT_OVERSCAN_LEFT_RIGHT, 0, -+ EXT_OVERSCAN_LEFT, left, -+ EXT_OVERSCAN_RIGHT, right); -+ -+ REG_SET_2(DSCL_EXT_OVERSCAN_TOP_BOTTOM, 0, -+ EXT_OVERSCAN_BOTTOM, bottom, -+ EXT_OVERSCAN_TOP, top); -+} -+ -+static void dpp_set_otg_blank( -+ struct dcn10_dpp *xfm, const struct scaler_data *data) -+{ -+ uint32_t h_blank_start = data->h_active; -+ uint32_t h_blank_end = 0; -+ uint32_t v_blank_start = data->v_active; -+ uint32_t v_blank_end = 0; -+ -+ REG_SET_2(OTG_H_BLANK, 0, -+ OTG_H_BLANK_START, h_blank_start, -+ OTG_H_BLANK_END, h_blank_end); -+ -+ REG_SET_2(OTG_V_BLANK, 0, -+ OTG_V_BLANK_START, v_blank_start, -+ OTG_V_BLANK_END, v_blank_end); -+} -+ -+static enum dscl_mode_sel get_dscl_mode( -+ const struct scaler_data *data, bool dbg_always_scale) -+{ -+ const long long one = dal_fixed31_32_one.value; -+ bool ycbcr = false; -+ bool format420 = false; -+ -+ if (data->format == PIXEL_FORMAT_FP16) -+ return DSCL_MODE_DSCL_BYPASS; -+ -+ if (data->format >= PIXEL_FORMAT_VIDEO_BEGIN -+ && data->format <= PIXEL_FORMAT_VIDEO_END) -+ ycbcr = true; -+ -+ if (data->format == PIXEL_FORMAT_420BPP8 || -+ data->format == PIXEL_FORMAT_420BPP10) -+ format420 = true; -+ -+ if (data->ratios.horz.value == one -+ && data->ratios.vert.value == one -+ && data->ratios.horz_c.value == one -+ && data->ratios.vert_c.value == one -+ && !dbg_always_scale) -+ return DSCL_MODE_SCALING_444_BYPASS; -+ -+ if (!format420) { -+ if (ycbcr) -+ return DSCL_MODE_SCALING_444_YCBCR_ENABLE; -+ else -+ return DSCL_MODE_SCALING_444_RGB_ENABLE; -+ } -+ if (data->ratios.horz.value == one && data->ratios.vert.value == one) -+ return DSCL_MODE_SCALING_420_LUMA_BYPASS; -+ if (data->ratios.horz_c.value == one && data->ratios.vert_c.value == one) -+ return DSCL_MODE_SCALING_420_CHROMA_BYPASS; -+ -+ return DSCL_MODE_SCALING_420_YCBCR_ENABLE; -+} -+ -+static int get_pixel_depth_val(enum lb_pixel_depth depth) -+{ -+ if (depth == LB_PIXEL_DEPTH_30BPP) -+ return 0; /* 10 bpc */ -+ else if (depth == LB_PIXEL_DEPTH_24BPP) -+ return 1; /* 8 bpc */ -+ else if (depth == LB_PIXEL_DEPTH_18BPP) -+ return 2; /* 6 bpc */ -+ else if (depth == LB_PIXEL_DEPTH_36BPP) -+ return 3; /* 12 bpc */ -+ else { -+ ASSERT(0); -+ return -1; /* Unsupported */ -+ } -+} -+ -+static void dpp_set_lb( -+ struct dcn10_dpp *xfm, -+ const struct line_buffer_params *lb_params, -+ enum lb_memory_config mem_size_config) -+{ -+ uint32_t pixel_depth = get_pixel_depth_val(lb_params->depth); -+ uint32_t dyn_pix_depth = lb_params->dynamic_pixel_depth; -+ REG_SET_7(LB_DATA_FORMAT, 0, -+ PIXEL_DEPTH, pixel_depth, /* Pixel depth stored in LB */ -+ PIXEL_EXPAN_MODE, lb_params->pixel_expan_mode, /* Pixel expansion mode */ -+ PIXEL_REDUCE_MODE, 1, /* Pixel reduction mode: Rounding */ -+ DYNAMIC_PIXEL_DEPTH, dyn_pix_depth, /* Dynamic expansion pixel depth */ -+ DITHER_EN, 0, /* Dithering enable: Disabled */ -+ INTERLEAVE_EN, lb_params->interleave_en, /* Interleave source enable */ -+ ALPHA_EN, lb_params->alpha_en); /* Alpha enable */ -+ -+ REG_SET_2(LB_MEMORY_CTRL, 0, -+ MEMORY_CONFIG, mem_size_config, -+ LB_MAX_PARTITIONS, 63); -+} -+ -+static void dpp_set_scaler_filter( -+ struct dcn10_dpp *xfm, -+ uint32_t taps, -+ enum dcn10_coef_filter_type_sel filter_type, -+ const uint16_t *filter) -+{ -+ const int tap_pairs = (taps + 1) / 2; -+ int phase; -+ int pair; -+ uint16_t odd_coef, even_coef; -+ -+ REG_SET_3(SCL_COEF_RAM_TAP_SELECT, 0, -+ SCL_COEF_RAM_TAP_PAIR_IDX, 0, -+ SCL_COEF_RAM_PHASE, 0, -+ SCL_COEF_RAM_FILTER_TYPE, filter_type); -+ -+ for (phase = 0; phase < (NUM_PHASES / 2 + 1); phase++) { -+ for (pair = 0; pair < tap_pairs; pair++) { -+ even_coef = filter[phase * taps + 2 * pair]; -+ if ((pair * 2 + 1) < taps) -+ odd_coef = filter[phase * taps + 2 * pair + 1]; -+ else -+ odd_coef = 0; -+ -+ REG_SET_4(SCL_COEF_RAM_TAP_DATA, 0, -+ /* Even tap coefficient (bits 1:0 fixed to 0) */ -+ SCL_COEF_RAM_EVEN_TAP_COEF, even_coef, -+ /* Write/read control for even coefficient */ -+ SCL_COEF_RAM_EVEN_TAP_COEF_EN, 1, -+ /* Odd tap coefficient (bits 1:0 fixed to 0) */ -+ SCL_COEF_RAM_ODD_TAP_COEF, odd_coef, -+ /* Write/read control for odd coefficient */ -+ SCL_COEF_RAM_ODD_TAP_COEF_EN, 1); -+ } -+ } -+ -+} -+ -+#if 0 -+bool dpp_set_pixel_storage_depth( -+ struct dpp *xfm, -+ enum lb_pixel_depth depth, -+ const struct bit_depth_reduction_params *bit_depth_params) -+{ -+ struct dcn10_dpp *xfm110 = TO_DCN10_DPP(xfm); -+ bool ret = true; -+ uint32_t value; -+ enum dc_color_depth color_depth; -+ -+ value = dm_read_reg(xfm->ctx, LB_REG(mmLB_DATA_FORMAT)); -+ switch (depth) { -+ case LB_PIXEL_DEPTH_18BPP: -+ color_depth = COLOR_DEPTH_666; -+ set_reg_field_value(value, 2, LB_DATA_FORMAT, PIXEL_DEPTH); -+ set_reg_field_value(value, 1, LB_DATA_FORMAT, PIXEL_EXPAN_MODE); -+ break; -+ case LB_PIXEL_DEPTH_24BPP: -+ color_depth = COLOR_DEPTH_888; -+ set_reg_field_value(value, 1, LB_DATA_FORMAT, PIXEL_DEPTH); -+ set_reg_field_value(value, 1, LB_DATA_FORMAT, PIXEL_EXPAN_MODE); -+ break; -+ case LB_PIXEL_DEPTH_30BPP: -+ color_depth = COLOR_DEPTH_101010; -+ set_reg_field_value(value, 0, LB_DATA_FORMAT, PIXEL_DEPTH); -+ set_reg_field_value(value, 1, LB_DATA_FORMAT, PIXEL_EXPAN_MODE); -+ break; -+ case LB_PIXEL_DEPTH_36BPP: -+ color_depth = COLOR_DEPTH_121212; -+ set_reg_field_value(value, 3, LB_DATA_FORMAT, PIXEL_DEPTH); -+ set_reg_field_value(value, 0, LB_DATA_FORMAT, PIXEL_EXPAN_MODE); -+ break; -+ default: -+ ret = false; -+ break; -+ } -+ -+ if (ret == true) { -+ set_denormalization(xfm110, color_depth); -+ ret = program_bit_depth_reduction(xfm110, color_depth, -+ bit_depth_params); -+ -+ set_reg_field_value(value, 0, LB_DATA_FORMAT, ALPHA_EN); -+ dm_write_reg(xfm->ctx, LB_REG(mmLB_DATA_FORMAT), value); -+ if (!(xfm110->lb_pixel_depth_supported & depth)) { -+ /* We should use unsupported capabilities -+ * unless it is required by w/a -+ */ -+ dm_logger_write(xfm->ctx->logger, LOG_WARNING, -+ "%s: Capability not supported", -+ __func__); -+ } -+ } -+ -+ return ret; -+} -+#endif -+ -+static const uint16_t *get_filter_coeffs_64p(int taps, struct fixed31_32 ratio) -+{ -+ if (taps == 8) -+ return get_filter_8tap_64p(ratio); -+ else if (taps == 7) -+ return get_filter_7tap_64p(ratio); -+ else if (taps == 6) -+ return get_filter_6tap_64p(ratio); -+ else if (taps == 5) -+ return get_filter_5tap_64p(ratio); -+ else if (taps == 4) -+ return get_filter_4tap_64p(ratio); -+ else if (taps == 3) -+ return get_filter_3tap_64p(ratio); -+ else if (taps == 2) -+ return filter_2tap_64p; -+ else if (taps == 1) -+ return NULL; -+ else { -+ /* should never happen, bug */ -+ BREAK_TO_DEBUGGER(); -+ return NULL; -+ } -+} -+ -+static void dpp_set_scl_filter( -+ struct dcn10_dpp *xfm, -+ const struct scaler_data *scl_data, -+ bool chroma_coef_mode) -+{ -+ bool h_2tap_hardcode_coef_en = false; -+ bool v_2tap_hardcode_coef_en = false; -+ bool h_2tap_sharp_en = false; -+ bool v_2tap_sharp_en = false; -+ uint32_t h_2tap_sharp_factor = scl_data->sharpness.horz; -+ uint32_t v_2tap_sharp_factor = scl_data->sharpness.vert; -+ bool coef_ram_current; -+ const uint16_t *filter_h = NULL; -+ const uint16_t *filter_v = NULL; -+ const uint16_t *filter_h_c = NULL; -+ const uint16_t *filter_v_c = NULL; -+ -+ h_2tap_hardcode_coef_en = scl_data->taps.h_taps < 3 -+ && scl_data->taps.h_taps_c < 3 -+ && (scl_data->taps.h_taps > 1 || scl_data->taps.h_taps_c > 1); -+ v_2tap_hardcode_coef_en = scl_data->taps.v_taps < 3 -+ && scl_data->taps.v_taps_c < 3 -+ && (scl_data->taps.v_taps > 1 || scl_data->taps.v_taps_c > 1); -+ -+ h_2tap_sharp_en = h_2tap_hardcode_coef_en && h_2tap_sharp_factor != 0; -+ v_2tap_sharp_en = v_2tap_hardcode_coef_en && v_2tap_sharp_factor != 0; -+ -+ REG_UPDATE_6(DSCL_2TAP_CONTROL, -+ SCL_H_2TAP_HARDCODE_COEF_EN, h_2tap_hardcode_coef_en, -+ SCL_H_2TAP_SHARP_EN, h_2tap_sharp_en, -+ SCL_H_2TAP_SHARP_FACTOR, h_2tap_sharp_factor, -+ SCL_V_2TAP_HARDCODE_COEF_EN, v_2tap_hardcode_coef_en, -+ SCL_V_2TAP_SHARP_EN, v_2tap_sharp_en, -+ SCL_V_2TAP_SHARP_FACTOR, v_2tap_sharp_factor); -+ -+ if (!v_2tap_hardcode_coef_en || !h_2tap_hardcode_coef_en) { -+ bool filter_updated = false; -+ -+ filter_h = get_filter_coeffs_64p( -+ scl_data->taps.h_taps, scl_data->ratios.horz); -+ filter_v = get_filter_coeffs_64p( -+ scl_data->taps.v_taps, scl_data->ratios.vert); -+ -+ filter_updated = (filter_h && (filter_h != xfm->filter_h)) -+ || (filter_v && (filter_v != xfm->filter_v)); -+ -+ if (chroma_coef_mode) { -+ filter_h_c = get_filter_coeffs_64p( -+ scl_data->taps.h_taps_c, scl_data->ratios.horz_c); -+ filter_v_c = get_filter_coeffs_64p( -+ scl_data->taps.v_taps_c, scl_data->ratios.vert_c); -+ filter_updated = filter_updated || (filter_h_c && (filter_h_c != xfm->filter_h_c)) -+ || (filter_v_c && (filter_v_c != xfm->filter_v_c)); -+ } -+ -+ if (filter_updated) { -+ uint32_t scl_mode = REG_READ(SCL_MODE); -+ -+ if (!h_2tap_hardcode_coef_en && filter_h) { -+ dpp_set_scaler_filter( -+ xfm, scl_data->taps.h_taps, -+ SCL_COEF_LUMA_HORZ_FILTER, filter_h); -+ } -+ xfm->filter_h = filter_h; -+ if (!v_2tap_hardcode_coef_en && filter_v) { -+ dpp_set_scaler_filter( -+ xfm, scl_data->taps.v_taps, -+ SCL_COEF_LUMA_VERT_FILTER, filter_v); -+ } -+ xfm->filter_v = filter_v; -+ if (chroma_coef_mode) { -+ if (!h_2tap_hardcode_coef_en && filter_h_c) { -+ dpp_set_scaler_filter( -+ xfm, scl_data->taps.h_taps_c, -+ SCL_COEF_CHROMA_HORZ_FILTER, filter_h_c); -+ } -+ if (!v_2tap_hardcode_coef_en && filter_v_c) { -+ dpp_set_scaler_filter( -+ xfm, scl_data->taps.v_taps_c, -+ SCL_COEF_CHROMA_VERT_FILTER, filter_v_c); -+ } -+ } -+ xfm->filter_h_c = filter_h_c; -+ xfm->filter_v_c = filter_v_c; -+ -+ coef_ram_current = get_reg_field_value_ex( -+ scl_mode, xfm->tf_mask->SCL_COEF_RAM_SELECT_CURRENT, -+ xfm->tf_shift->SCL_COEF_RAM_SELECT_CURRENT); -+ -+ /* Swap coefficient RAM and set chroma coefficient mode */ -+ REG_SET_2(SCL_MODE, scl_mode, -+ SCL_COEF_RAM_SELECT, !coef_ram_current, -+ SCL_CHROMA_COEF_MODE, chroma_coef_mode); -+ } -+ } -+} -+ -+ -+static int get_lb_depth_bpc(enum lb_pixel_depth depth) -+{ -+ if (depth == LB_PIXEL_DEPTH_30BPP) -+ return 10; -+ else if (depth == LB_PIXEL_DEPTH_24BPP) -+ return 8; -+ else if (depth == LB_PIXEL_DEPTH_18BPP) -+ return 6; -+ else if (depth == LB_PIXEL_DEPTH_36BPP) -+ return 12; -+ else { -+ BREAK_TO_DEBUGGER(); -+ return -1; /* Unsupported */ -+ } -+} -+ -+static void calc_lb_num_partitions( -+ const struct scaler_data *scl_data, -+ enum lb_memory_config lb_config, -+ int *num_part_y, -+ int *num_part_c) -+{ -+ int line_size = scl_data->viewport.width < scl_data->recout.width ? -+ scl_data->viewport.width : scl_data->recout.width; -+ int line_size_c = scl_data->viewport_c.width < scl_data->recout.width ? -+ scl_data->viewport_c.width : scl_data->recout.width; -+ int lb_bpc = get_lb_depth_bpc(scl_data->lb_params.depth); -+ int memory_line_size_y = (line_size * lb_bpc + 71) / 72; /* +71 to ceil */ -+ int memory_line_size_c = (line_size_c * lb_bpc + 71) / 72; /* +71 to ceil */ -+ int memory_line_size_a = (line_size + 5) / 6; /* +5 to ceil */ -+ int lb_memory_size, lb_memory_size_c, lb_memory_size_a, num_partitions_a; -+ -+ if (lb_config == LB_MEMORY_CONFIG_1) { -+ lb_memory_size = 816; -+ lb_memory_size_c = 816; -+ lb_memory_size_a = 984; -+ } else if (lb_config == LB_MEMORY_CONFIG_2) { -+ lb_memory_size = 1088; -+ lb_memory_size_c = 1088; -+ lb_memory_size_a = 1312; -+ } else if (lb_config == LB_MEMORY_CONFIG_3) { -+ lb_memory_size = 816 + 1088 + 848 + 848 + 848; -+ lb_memory_size_c = 816 + 1088; -+ lb_memory_size_a = 984 + 1312 + 456; -+ } else { -+ lb_memory_size = 816 + 1088 + 848; -+ lb_memory_size_c = 816 + 1088 + 848; -+ lb_memory_size_a = 984 + 1312 + 456; -+ } -+ *num_part_y = lb_memory_size / memory_line_size_y; -+ *num_part_c = lb_memory_size_c / memory_line_size_c; -+ num_partitions_a = lb_memory_size_a / memory_line_size_a; -+ -+ if (scl_data->lb_params.alpha_en -+ && (num_partitions_a < *num_part_y)) -+ *num_part_y = num_partitions_a; -+ -+ if (*num_part_y > 64) -+ *num_part_y = 64; -+ if (*num_part_c > 64) -+ *num_part_c = 64; -+ -+} -+ -+static bool is_lb_conf_valid(int ceil_vratio, int num_partitions, int vtaps) -+{ -+ if (ceil_vratio > 2) -+ return vtaps <= (num_partitions - ceil_vratio + 2); -+ else -+ return vtaps <= num_partitions; -+} -+ -+/*find first match configuration which meets the min required lb size*/ -+static enum lb_memory_config find_lb_memory_config(const struct scaler_data *scl_data) -+{ -+ int num_part_y, num_part_c; -+ int vtaps = scl_data->taps.v_taps; -+ int vtaps_c = scl_data->taps.v_taps_c; -+ int ceil_vratio = dal_fixed31_32_ceil(scl_data->ratios.vert); -+ int ceil_vratio_c = dal_fixed31_32_ceil(scl_data->ratios.vert_c); -+ -+ calc_lb_num_partitions( -+ scl_data, LB_MEMORY_CONFIG_1, &num_part_y, &num_part_c); -+ -+ if (is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -+ && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)) -+ return LB_MEMORY_CONFIG_1; -+ -+ calc_lb_num_partitions( -+ scl_data, LB_MEMORY_CONFIG_2, &num_part_y, &num_part_c); -+ -+ if (is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -+ && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)) -+ return LB_MEMORY_CONFIG_2; -+ -+ if (scl_data->format == PIXEL_FORMAT_420BPP8 -+ || scl_data->format == PIXEL_FORMAT_420BPP10) { -+ calc_lb_num_partitions( -+ scl_data, LB_MEMORY_CONFIG_3, &num_part_y, &num_part_c); -+ -+ if (is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -+ && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)) -+ return LB_MEMORY_CONFIG_3; -+ } -+ -+ calc_lb_num_partitions( -+ scl_data, LB_MEMORY_CONFIG_0, &num_part_y, &num_part_c); -+ -+ /*Ensure we can support the requested number of vtaps*/ -+ ASSERT(is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -+ && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)); -+ -+ return LB_MEMORY_CONFIG_0; -+} -+ -+void dpp_set_scaler_auto_scale( -+ struct transform *xfm_base, -+ const struct scaler_data *scl_data) -+{ -+ enum lb_memory_config lb_config; -+ struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -+ enum dscl_mode_sel dscl_mode = get_dscl_mode( -+ scl_data, xfm_base->ctx->dc->debug.always_scale); -+ bool ycbcr = scl_data->format >= PIXEL_FORMAT_VIDEO_BEGIN -+ && scl_data->format <= PIXEL_FORMAT_VIDEO_END; -+ -+ dpp_set_overscan(xfm, scl_data); -+ -+ dpp_set_otg_blank(xfm, scl_data); -+ -+ REG_UPDATE(SCL_MODE, DSCL_MODE, dscl_mode); -+ -+ if (dscl_mode == DSCL_MODE_DSCL_BYPASS) -+ return; -+ -+ lb_config = find_lb_memory_config(scl_data); -+ dpp_set_lb(xfm, &scl_data->lb_params, lb_config); -+ -+ if (dscl_mode == DSCL_MODE_SCALING_444_BYPASS) -+ return; -+ -+ /* TODO: v_min */ -+ REG_SET_3(DSCL_AUTOCAL, 0, -+ AUTOCAL_MODE, AUTOCAL_MODE_AUTOSCALE, -+ AUTOCAL_NUM_PIPE, 0, -+ AUTOCAL_PIPE_ID, 0); -+ -+ /* Black offsets */ -+ if (ycbcr) -+ REG_SET_2(SCL_BLACK_OFFSET, 0, -+ SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -+ SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_CBCR); -+ else -+ -+ REG_SET_2(SCL_BLACK_OFFSET, 0, -+ SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -+ SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_RGB_Y); -+ -+ REG_SET_4(SCL_TAP_CONTROL, 0, -+ SCL_V_NUM_TAPS, scl_data->taps.v_taps - 1, -+ SCL_H_NUM_TAPS, scl_data->taps.h_taps - 1, -+ SCL_V_NUM_TAPS_C, scl_data->taps.v_taps_c - 1, -+ SCL_H_NUM_TAPS_C, scl_data->taps.h_taps_c - 1); -+ -+ dpp_set_scl_filter(xfm, scl_data, ycbcr); -+} -+ - /* Program gamut remap in bypass mode */ - void dpp_set_gamut_remap_bypass(struct dcn10_dpp *xfm) - { -@@ -106,10 +628,150 @@ void dpp_set_gamut_remap_bypass(struct dcn10_dpp *xfm) - /* Gamut remap in bypass */ - } - -+static void dpp_set_recout( -+ struct dcn10_dpp *xfm, const struct rect *recout) -+{ -+ REG_SET_2(RECOUT_START, 0, -+ /* First pixel of RECOUT */ -+ RECOUT_START_X, recout->x, -+ /* First line of RECOUT */ -+ RECOUT_START_Y, recout->y); -+ -+ REG_SET_2(RECOUT_SIZE, 0, -+ /* Number of RECOUT horizontal pixels */ -+ RECOUT_WIDTH, recout->width, -+ /* Number of RECOUT vertical lines */ -+ RECOUT_HEIGHT, recout->height -+ - xfm->base.ctx->dc->debug.surface_visual_confirm * 4 * -+ (xfm->base.inst + 1)); -+} -+ -+static void dpp_set_manual_ratio_init( -+ struct dcn10_dpp *xfm, const struct scaler_data *data) -+{ -+ uint32_t init_frac = 0; -+ uint32_t init_int = 0; -+ -+ REG_SET(SCL_HORZ_FILTER_SCALE_RATIO, 0, -+ SCL_H_SCALE_RATIO, dal_fixed31_32_u2d19(data->ratios.horz) << 5); -+ -+ REG_SET(SCL_VERT_FILTER_SCALE_RATIO, 0, -+ SCL_V_SCALE_RATIO, dal_fixed31_32_u2d19(data->ratios.vert) << 5); -+ -+ REG_SET(SCL_HORZ_FILTER_SCALE_RATIO_C, 0, -+ SCL_H_SCALE_RATIO_C, dal_fixed31_32_u2d19(data->ratios.horz_c) << 5); -+ -+ REG_SET(SCL_VERT_FILTER_SCALE_RATIO_C, 0, -+ SCL_V_SCALE_RATIO_C, dal_fixed31_32_u2d19(data->ratios.vert_c) << 5); -+ -+ /* -+ * 0.24 format for fraction, first five bits zeroed -+ */ -+ init_frac = dal_fixed31_32_u0d19(data->inits.h) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.h); -+ REG_SET_2(SCL_HORZ_FILTER_INIT, 0, -+ SCL_H_INIT_FRAC, init_frac, -+ SCL_H_INIT_INT, init_int); -+ -+ init_frac = dal_fixed31_32_u0d19(data->inits.h_c) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.h_c); -+ REG_SET_2(SCL_HORZ_FILTER_INIT_C, 0, -+ SCL_H_INIT_FRAC_C, init_frac, -+ SCL_H_INIT_INT_C, init_int); -+ -+ init_frac = dal_fixed31_32_u0d19(data->inits.v) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.v); -+ REG_SET_2(SCL_VERT_FILTER_INIT, 0, -+ SCL_V_INIT_FRAC, init_frac, -+ SCL_V_INIT_INT, init_int); -+ -+ init_frac = dal_fixed31_32_u0d19(data->inits.v_bot) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.v_bot); -+ REG_SET_2(SCL_VERT_FILTER_INIT_BOT, 0, -+ SCL_V_INIT_FRAC_BOT, init_frac, -+ SCL_V_INIT_INT_BOT, init_int); -+ -+ init_frac = dal_fixed31_32_u0d19(data->inits.v_c) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.v_c); -+ REG_SET_2(SCL_VERT_FILTER_INIT_C, 0, -+ SCL_V_INIT_FRAC_C, init_frac, -+ SCL_V_INIT_INT_C, init_int); -+ -+ init_frac = dal_fixed31_32_u0d19(data->inits.v_c_bot) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.v_c_bot); -+ REG_SET_2(SCL_VERT_FILTER_INIT_BOT_C, 0, -+ SCL_V_INIT_FRAC_BOT_C, init_frac, -+ SCL_V_INIT_INT_BOT_C, init_int); -+} -+ -+/* Main function to program scaler and line buffer in manual scaling mode */ -+static void dpp_set_scaler_manual_scale( -+ struct transform *xfm_base, -+ const struct scaler_data *scl_data) -+{ -+ enum lb_memory_config lb_config; -+ struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -+ enum dscl_mode_sel dscl_mode = get_dscl_mode( -+ scl_data, xfm_base->ctx->dc->debug.always_scale); -+ bool ycbcr = scl_data->format >= PIXEL_FORMAT_VIDEO_BEGIN -+ && scl_data->format <= PIXEL_FORMAT_VIDEO_END; -+ -+ /* Recout */ -+ dpp_set_recout(xfm, &scl_data->recout); -+ -+ /* MPC Size */ -+ REG_SET_2(MPC_SIZE, 0, -+ /* Number of horizontal pixels of MPC */ -+ MPC_WIDTH, scl_data->h_active, -+ /* Number of vertical lines of MPC */ -+ MPC_HEIGHT, scl_data->v_active); -+ -+ /* SCL mode */ -+ REG_UPDATE(SCL_MODE, DSCL_MODE, dscl_mode); -+ -+ if (dscl_mode == DSCL_MODE_DSCL_BYPASS) -+ return; -+ /* LB */ -+ lb_config = find_lb_memory_config(scl_data); -+ dpp_set_lb(xfm, &scl_data->lb_params, lb_config); -+ -+ if (dscl_mode == DSCL_MODE_SCALING_444_BYPASS) -+ return; -+ -+ /* Autocal off */ -+ REG_SET_3(DSCL_AUTOCAL, 0, -+ AUTOCAL_MODE, AUTOCAL_MODE_OFF, -+ AUTOCAL_NUM_PIPE, 0, -+ AUTOCAL_PIPE_ID, 0); -+ -+ /* Black offsets */ -+ if (ycbcr) -+ REG_SET_2(SCL_BLACK_OFFSET, 0, -+ SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -+ SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_CBCR); -+ else -+ -+ REG_SET_2(SCL_BLACK_OFFSET, 0, -+ SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -+ SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_RGB_Y); -+ -+ /* Manually calculate scale ratio and init values */ -+ dpp_set_manual_ratio_init(xfm, scl_data); -+ -+ /* HTaps/VTaps */ -+ REG_SET_4(SCL_TAP_CONTROL, 0, -+ SCL_V_NUM_TAPS, scl_data->taps.v_taps - 1, -+ SCL_H_NUM_TAPS, scl_data->taps.h_taps - 1, -+ SCL_V_NUM_TAPS_C, scl_data->taps.v_taps_c - 1, -+ SCL_H_NUM_TAPS_C, scl_data->taps.h_taps_c - 1); -+ -+ dpp_set_scl_filter(xfm, scl_data, ycbcr); -+} -+ - #define IDENTITY_RATIO(ratio) (dal_fixed31_32_u2d19(ratio) == (1 << 19)) - - --bool dpp_get_optimal_number_of_taps( -+static bool dpp_get_optimal_number_of_taps( - struct transform *xfm, - struct scaler_data *scl_data, - const struct scaling_taps *in_taps) -@@ -168,7 +830,7 @@ bool dpp_get_optimal_number_of_taps( - return true; - } - --void dpp_reset(struct transform *xfm_base) -+static void dpp_reset(struct transform *xfm_base) - { - struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); - -@@ -181,28 +843,690 @@ void dpp_reset(struct transform *xfm_base) - REG_SET(DSCL_CONTROL, 0, SCL_BOUNDARY_MODE, 0); - } - -+static void program_gamut_remap( -+ struct dcn10_dpp *xfm, -+ const uint16_t *regval, -+ enum gamut_remap_select select) -+{ -+ uint16_t selection = 0; - -+ if (regval == NULL || select == GAMUT_REMAP_BYPASS) { -+ REG_SET(CM_GAMUT_REMAP_CONTROL, 0, -+ CM_GAMUT_REMAP_MODE, 0); -+ return; -+ } -+ switch (select) { -+ case GAMUT_REMAP_COEFF: -+ selection = 1; -+ break; -+ case GAMUT_REMAP_COMA_COEFF: -+ selection = 2; -+ break; -+ case GAMUT_REMAP_COMB_COEFF: -+ selection = 3; -+ break; -+ default: -+ break; -+ } - --static bool dcn10_dpp_cm_set_regamma_pwl( -+ -+ if (select == GAMUT_REMAP_COEFF) { -+ -+ REG_SET_2(CM_GAMUT_REMAP_C11_C12, 0, -+ CM_GAMUT_REMAP_C11, regval[0], -+ CM_GAMUT_REMAP_C12, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_GAMUT_REMAP_C13_C14, 0, -+ CM_GAMUT_REMAP_C13, regval[0], -+ CM_GAMUT_REMAP_C14, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_GAMUT_REMAP_C21_C22, 0, -+ CM_GAMUT_REMAP_C21, regval[0], -+ CM_GAMUT_REMAP_C22, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_GAMUT_REMAP_C23_C24, 0, -+ CM_GAMUT_REMAP_C23, regval[0], -+ CM_GAMUT_REMAP_C24, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_GAMUT_REMAP_C31_C32, 0, -+ CM_GAMUT_REMAP_C31, regval[0], -+ CM_GAMUT_REMAP_C32, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_GAMUT_REMAP_C33_C34, 0, -+ CM_GAMUT_REMAP_C33, regval[0], -+ CM_GAMUT_REMAP_C34, regval[1]); -+ -+ } else if (select == GAMUT_REMAP_COMA_COEFF) { -+ REG_SET_2(CM_COMA_C11_C12, 0, -+ CM_COMA_C11, regval[0], -+ CM_COMA_C12, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C13_C14, 0, -+ CM_COMA_C13, regval[0], -+ CM_COMA_C14, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C21_C22, 0, -+ CM_COMA_C21, regval[0], -+ CM_COMA_C22, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C23_C24, 0, -+ CM_COMA_C23, regval[0], -+ CM_COMA_C24, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C31_C32, 0, -+ CM_COMA_C31, regval[0], -+ CM_COMA_C32, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C33_C34, 0, -+ CM_COMA_C33, regval[0], -+ CM_COMA_C34, regval[1]); -+ -+ } else { -+ REG_SET_2(CM_COMB_C11_C12, 0, -+ CM_COMB_C11, regval[0], -+ CM_COMB_C12, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMB_C13_C14, 0, -+ CM_COMB_C13, regval[0], -+ CM_COMB_C14, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMB_C21_C22, 0, -+ CM_COMB_C21, regval[0], -+ CM_COMB_C22, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMB_C23_C24, 0, -+ CM_COMB_C23, regval[0], -+ CM_COMB_C24, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMB_C31_C32, 0, -+ CM_COMB_C31, regval[0], -+ CM_COMB_C32, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMB_C33_C34, 0, -+ CM_COMB_C33, regval[0], -+ CM_COMB_C34, regval[1]); -+ } -+ -+ REG_SET( -+ CM_GAMUT_REMAP_CONTROL, 0, -+ CM_GAMUT_REMAP_MODE, selection); -+ -+} -+ -+static void dcn_dpp_set_gamut_remap( -+ struct transform *xfm, -+ const struct xfm_grph_csc_adjustment *adjust) -+{ -+ struct dcn10_dpp *dcn_xfm = TO_DCN10_DPP(xfm); -+ -+ if (adjust->gamut_adjust_type != GRAPHICS_GAMUT_ADJUST_TYPE_SW) -+ /* Bypass if type is bypass or hw */ -+ program_gamut_remap(dcn_xfm, NULL, GAMUT_REMAP_BYPASS); -+ else { -+ struct fixed31_32 arr_matrix[12]; -+ uint16_t arr_reg_val[12]; -+ -+ arr_matrix[0] = adjust->temperature_matrix[0]; -+ arr_matrix[1] = adjust->temperature_matrix[1]; -+ arr_matrix[2] = adjust->temperature_matrix[2]; -+ arr_matrix[3] = dal_fixed31_32_zero; -+ -+ arr_matrix[4] = adjust->temperature_matrix[3]; -+ arr_matrix[5] = adjust->temperature_matrix[4]; -+ arr_matrix[6] = adjust->temperature_matrix[5]; -+ arr_matrix[7] = dal_fixed31_32_zero; -+ -+ arr_matrix[8] = adjust->temperature_matrix[6]; -+ arr_matrix[9] = adjust->temperature_matrix[7]; -+ arr_matrix[10] = adjust->temperature_matrix[8]; -+ arr_matrix[11] = dal_fixed31_32_zero; -+ -+ convert_float_matrix( -+ arr_reg_val, arr_matrix, 12); -+ -+ program_gamut_remap(dcn_xfm, arr_reg_val, GAMUT_REMAP_COEFF); -+ } -+} -+ -+static void oppn10_set_output_csc_default( -+ struct transform *xfm_base, -+ const struct default_adjustment *default_adjust) -+{ -+ -+ struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -+ uint32_t ocsc_mode = 0; -+ -+ if (default_adjust != NULL) { -+ switch (default_adjust->out_color_space) { -+ case COLOR_SPACE_SRGB: -+ case COLOR_SPACE_2020_RGB_FULLRANGE: -+ ocsc_mode = 0; -+ break; -+ case COLOR_SPACE_SRGB_LIMITED: -+ case COLOR_SPACE_2020_RGB_LIMITEDRANGE: -+ ocsc_mode = 1; -+ break; -+ case COLOR_SPACE_YCBCR601: -+ case COLOR_SPACE_YCBCR601_LIMITED: -+ ocsc_mode = 2; -+ break; -+ case COLOR_SPACE_YCBCR709: -+ case COLOR_SPACE_YCBCR709_LIMITED: -+ case COLOR_SPACE_2020_YCBCR: -+ ocsc_mode = 3; -+ break; -+ case COLOR_SPACE_UNKNOWN: -+ default: -+ break; -+ } -+ } -+ -+ REG_SET(CM_OCSC_CONTROL, 0, CM_OCSC_MODE, ocsc_mode); -+ -+} -+ -+static void oppn10_program_color_matrix( -+ struct dcn10_dpp *xfm, -+ const struct out_csc_color_matrix *tbl_entry) -+{ -+ uint32_t mode; -+ -+ REG_GET(CM_OCSC_CONTROL, CM_OCSC_MODE, &mode); -+ -+ if (tbl_entry == NULL) { -+ BREAK_TO_DEBUGGER(); -+ return; -+ } -+ -+ if (mode == 4) { -+ /*R*/ -+ REG_SET_2(CM_OCSC_C11_C12, 0, -+ CM_OCSC_C11, tbl_entry->regval[0], -+ CM_OCSC_C12, tbl_entry->regval[1]); -+ -+ REG_SET_2(CM_OCSC_C13_C14, 0, -+ CM_OCSC_C13, tbl_entry->regval[2], -+ CM_OCSC_C14, tbl_entry->regval[3]); -+ -+ /*G*/ -+ REG_SET_2(CM_OCSC_C21_C22, 0, -+ CM_OCSC_C21, tbl_entry->regval[4], -+ CM_OCSC_C22, tbl_entry->regval[5]); -+ -+ REG_SET_2(CM_OCSC_C23_C24, 0, -+ CM_OCSC_C23, tbl_entry->regval[6], -+ CM_OCSC_C24, tbl_entry->regval[7]); -+ -+ /*B*/ -+ REG_SET_2(CM_OCSC_C31_C32, 0, -+ CM_OCSC_C31, tbl_entry->regval[8], -+ CM_OCSC_C32, tbl_entry->regval[9]); -+ -+ REG_SET_2(CM_OCSC_C33_C34, 0, -+ CM_OCSC_C33, tbl_entry->regval[10], -+ CM_OCSC_C34, tbl_entry->regval[11]); -+ } else { -+ /*R*/ -+ REG_SET_2(CM_COMB_C11_C12, 0, -+ CM_COMB_C11, tbl_entry->regval[0], -+ CM_COMB_C12, tbl_entry->regval[1]); -+ -+ REG_SET_2(CM_COMB_C13_C14, 0, -+ CM_COMB_C13, tbl_entry->regval[2], -+ CM_COMB_C14, tbl_entry->regval[3]); -+ -+ /*G*/ -+ REG_SET_2(CM_COMB_C21_C22, 0, -+ CM_COMB_C21, tbl_entry->regval[4], -+ CM_COMB_C22, tbl_entry->regval[5]); -+ -+ REG_SET_2(CM_COMB_C23_C24, 0, -+ CM_COMB_C23, tbl_entry->regval[6], -+ CM_COMB_C24, tbl_entry->regval[7]); -+ -+ /*B*/ -+ REG_SET_2(CM_COMB_C31_C32, 0, -+ CM_COMB_C31, tbl_entry->regval[8], -+ CM_COMB_C32, tbl_entry->regval[9]); -+ -+ REG_SET_2(CM_COMB_C33_C34, 0, -+ CM_COMB_C33, tbl_entry->regval[10], -+ CM_COMB_C34, tbl_entry->regval[11]); -+ } -+} -+ -+static void oppn10_set_output_csc_adjustment( -+ struct transform *xfm_base, -+ const struct out_csc_color_matrix *tbl_entry) -+{ -+ struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -+ //enum csc_color_mode config = CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC; -+ uint32_t ocsc_mode = 4; -+ -+ /** -+ *if (tbl_entry != NULL) { -+ * switch (tbl_entry->color_space) { -+ * case COLOR_SPACE_SRGB: -+ * case COLOR_SPACE_2020_RGB_FULLRANGE: -+ * ocsc_mode = 0; -+ * break; -+ * case COLOR_SPACE_SRGB_LIMITED: -+ * case COLOR_SPACE_2020_RGB_LIMITEDRANGE: -+ * ocsc_mode = 1; -+ * break; -+ * case COLOR_SPACE_YCBCR601: -+ * case COLOR_SPACE_YCBCR601_LIMITED: -+ * ocsc_mode = 2; -+ * break; -+ * case COLOR_SPACE_YCBCR709: -+ * case COLOR_SPACE_YCBCR709_LIMITED: -+ * case COLOR_SPACE_2020_YCBCR: -+ * ocsc_mode = 3; -+ * break; -+ * case COLOR_SPACE_UNKNOWN: -+ * default: -+ * break; -+ * } -+ *} -+ */ -+ -+ REG_SET(CM_OCSC_CONTROL, 0, CM_OCSC_MODE, ocsc_mode); -+ oppn10_program_color_matrix(xfm, tbl_entry); -+} -+ -+static void oppn10_power_on_regamma_lut( -+ struct transform *xfm_base, -+ bool power_on) -+{ -+ struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -+ REG_SET(CM_MEM_PWR_CTRL, 0, -+ RGAM_MEM_PWR_FORCE, power_on == true ? 0:1); -+ -+} -+ -+static void opp_program_regamma_lut( -+ struct transform *xfm_base, -+ const struct pwl_result_data *rgb, -+ uint32_t num) -+{ -+ uint32_t i; -+ struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -+ for (i = 0 ; i < num; i++) { -+ REG_SET(CM_RGAM_LUT_DATA, 0, CM_RGAM_LUT_DATA, rgb[i].red_reg); -+ REG_SET(CM_RGAM_LUT_DATA, 0, CM_RGAM_LUT_DATA, rgb[i].green_reg); -+ REG_SET(CM_RGAM_LUT_DATA, 0, CM_RGAM_LUT_DATA, rgb[i].blue_reg); -+ -+ REG_SET(CM_RGAM_LUT_DATA, 0, -+ CM_RGAM_LUT_DATA, rgb[i].delta_red_reg); -+ REG_SET(CM_RGAM_LUT_DATA, 0, -+ CM_RGAM_LUT_DATA, rgb[i].delta_green_reg); -+ REG_SET(CM_RGAM_LUT_DATA, 0, -+ CM_RGAM_LUT_DATA, rgb[i].delta_blue_reg); -+ -+ } -+ -+} -+ -+static void opp_configure_regamma_lut( -+ struct transform *xfm_base, -+ bool is_ram_a) -+{ -+ struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -+ -+ REG_UPDATE(CM_RGAM_LUT_WRITE_EN_MASK, -+ CM_RGAM_LUT_WRITE_EN_MASK, 7); -+ REG_UPDATE(CM_RGAM_LUT_WRITE_EN_MASK, -+ CM_RGAM_LUT_WRITE_SEL, is_ram_a == true ? 0:1); -+ REG_SET(CM_RGAM_LUT_INDEX, 0, CM_RGAM_LUT_INDEX, 0); -+} -+ -+/*program re gamma RAM A*/ -+static void opp_program_regamma_luta_settings( -+ struct transform *xfm_base, -+ const struct pwl_params *params) -+{ -+ const struct gamma_curve *curve; -+ struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -+ -+ REG_SET_2(CM_RGAM_RAMA_START_CNTL_B, 0, -+ CM_RGAM_RAMA_EXP_REGION_START_B, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_B, 0); -+ REG_SET_2(CM_RGAM_RAMA_START_CNTL_G, 0, -+ CM_RGAM_RAMA_EXP_REGION_START_G, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_G, 0); -+ REG_SET_2(CM_RGAM_RAMA_START_CNTL_R, 0, -+ CM_RGAM_RAMA_EXP_REGION_START_R, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_R, 0); -+ -+ REG_SET(CM_RGAM_RAMA_SLOPE_CNTL_B, 0, -+ CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B, params->arr_points[0].custom_float_slope); -+ REG_SET(CM_RGAM_RAMA_SLOPE_CNTL_G, 0, -+ CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G, params->arr_points[0].custom_float_slope); -+ REG_SET(CM_RGAM_RAMA_SLOPE_CNTL_R, 0, -+ CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_RGAM_RAMA_END_CNTL1_B, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_B, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMA_END_CNTL2_B, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_SLOPE_B, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMA_EXP_REGION_END_BASE_B, params->arr_points[1].custom_float_y); -+ -+ REG_SET(CM_RGAM_RAMA_END_CNTL1_G, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_G, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMA_END_CNTL2_G, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_SLOPE_G, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMA_EXP_REGION_END_BASE_G, params->arr_points[1].custom_float_y); -+ -+ REG_SET(CM_RGAM_RAMA_END_CNTL1_R, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_R, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMA_END_CNTL2_R, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_SLOPE_R, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMA_EXP_REGION_END_BASE_R, params->arr_points[1].custom_float_y); -+ -+ curve = params->arr_curve_points; -+ REG_SET_4(CM_RGAM_RAMA_REGION_0_1, 0, -+ CM_RGAM_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_2_3, 0, -+ CM_RGAM_RAMA_EXP_REGION2_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION2_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION3_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION3_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_4_5, 0, -+ CM_RGAM_RAMA_EXP_REGION4_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION4_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION5_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION5_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_6_7, 0, -+ CM_RGAM_RAMA_EXP_REGION6_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION6_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION7_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION7_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_8_9, 0, -+ CM_RGAM_RAMA_EXP_REGION8_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION8_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION9_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION9_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_10_11, 0, -+ CM_RGAM_RAMA_EXP_REGION10_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION10_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION11_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION11_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_12_13, 0, -+ CM_RGAM_RAMA_EXP_REGION12_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION12_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION13_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION13_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_14_15, 0, -+ CM_RGAM_RAMA_EXP_REGION14_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION14_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION15_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION15_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_16_17, 0, -+ CM_RGAM_RAMA_EXP_REGION16_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION16_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION17_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION17_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_18_19, 0, -+ CM_RGAM_RAMA_EXP_REGION18_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION18_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION19_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION19_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_20_21, 0, -+ CM_RGAM_RAMA_EXP_REGION20_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION20_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION21_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION21_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_22_23, 0, -+ CM_RGAM_RAMA_EXP_REGION22_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION22_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION23_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION23_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_24_25, 0, -+ CM_RGAM_RAMA_EXP_REGION24_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION24_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION25_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION25_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_26_27, 0, -+ CM_RGAM_RAMA_EXP_REGION26_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION26_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION27_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION27_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_28_29, 0, -+ CM_RGAM_RAMA_EXP_REGION28_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION28_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION29_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION29_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_30_31, 0, -+ CM_RGAM_RAMA_EXP_REGION30_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION30_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION31_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION31_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_32_33, 0, -+ CM_RGAM_RAMA_EXP_REGION32_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION32_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION33_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION33_NUM_SEGMENTS, curve[1].segments_num); -+} -+ -+/*program re gamma RAM B*/ -+static void opp_program_regamma_lutb_settings( -+ struct transform *xfm_base, -+ const struct pwl_params *params) -+{ -+ const struct gamma_curve *curve; -+ struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -+ -+ REG_SET_2(CM_RGAM_RAMB_START_CNTL_B, 0, -+ CM_RGAM_RAMB_EXP_REGION_START_B, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_B, 0); -+ REG_SET_2(CM_RGAM_RAMB_START_CNTL_G, 0, -+ CM_RGAM_RAMB_EXP_REGION_START_G, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_G, 0); -+ REG_SET_2(CM_RGAM_RAMB_START_CNTL_R, 0, -+ CM_RGAM_RAMB_EXP_REGION_START_R, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_R, 0); -+ -+ REG_SET(CM_RGAM_RAMB_SLOPE_CNTL_B, 0, -+ CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B, params->arr_points[0].custom_float_slope); -+ REG_SET(CM_RGAM_RAMB_SLOPE_CNTL_G, 0, -+ CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G, params->arr_points[0].custom_float_slope); -+ REG_SET(CM_RGAM_RAMB_SLOPE_CNTL_R, 0, -+ CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_RGAM_RAMB_END_CNTL1_B, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_B, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMB_END_CNTL2_B, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_SLOPE_B, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMB_EXP_REGION_END_BASE_B, params->arr_points[1].custom_float_y); -+ -+ REG_SET(CM_RGAM_RAMB_END_CNTL1_G, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_G, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMB_END_CNTL2_G, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_SLOPE_G, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMB_EXP_REGION_END_BASE_G, params->arr_points[1].custom_float_y); -+ -+ REG_SET(CM_RGAM_RAMB_END_CNTL1_R, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_R, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMB_END_CNTL2_R, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_SLOPE_R, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMB_EXP_REGION_END_BASE_R, params->arr_points[1].custom_float_y); -+ -+ curve = params->arr_curve_points; -+ REG_SET_4(CM_RGAM_RAMB_REGION_0_1, 0, -+ CM_RGAM_RAMB_EXP_REGION0_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION1_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_2_3, 0, -+ CM_RGAM_RAMB_EXP_REGION2_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION2_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION3_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION3_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_4_5, 0, -+ CM_RGAM_RAMB_EXP_REGION4_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION4_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION5_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION5_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_6_7, 0, -+ CM_RGAM_RAMB_EXP_REGION6_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION6_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION7_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION7_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_8_9, 0, -+ CM_RGAM_RAMB_EXP_REGION8_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION8_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION9_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION9_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_10_11, 0, -+ CM_RGAM_RAMB_EXP_REGION10_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION10_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION11_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION11_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_12_13, 0, -+ CM_RGAM_RAMB_EXP_REGION12_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION12_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION13_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION13_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_14_15, 0, -+ CM_RGAM_RAMB_EXP_REGION14_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION14_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION15_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION15_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_16_17, 0, -+ CM_RGAM_RAMB_EXP_REGION16_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION16_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION17_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION17_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_18_19, 0, -+ CM_RGAM_RAMB_EXP_REGION18_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION18_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION19_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION19_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_20_21, 0, -+ CM_RGAM_RAMB_EXP_REGION20_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION20_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION21_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION21_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_22_23, 0, -+ CM_RGAM_RAMB_EXP_REGION22_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION22_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION23_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION23_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_24_25, 0, -+ CM_RGAM_RAMB_EXP_REGION24_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION24_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION25_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION25_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_26_27, 0, -+ CM_RGAM_RAMB_EXP_REGION26_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION26_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION27_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION27_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_28_29, 0, -+ CM_RGAM_RAMB_EXP_REGION28_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION28_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION29_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION29_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_30_31, 0, -+ CM_RGAM_RAMB_EXP_REGION30_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION30_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION31_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION31_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_32_33, 0, -+ CM_RGAM_RAMB_EXP_REGION32_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION32_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION33_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION33_NUM_SEGMENTS, curve[1].segments_num); -+ -+} -+ -+static bool oppn10_set_regamma_pwl( - struct transform *xfm_base, const struct pwl_params *params) - { - struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); - -- dcn10_dpp_cm_power_on_regamma_lut(xfm_base, true); -- dcn10_dpp_cm_configure_regamma_lut(xfm_base, xfm->is_write_to_ram_a_safe); -+ oppn10_power_on_regamma_lut(xfm_base, true); -+ opp_configure_regamma_lut(xfm_base, xfm->is_write_to_ram_a_safe); - - if (xfm->is_write_to_ram_a_safe) -- dcn10_dpp_cm_program_regamma_luta_settings(xfm_base, params); -+ opp_program_regamma_luta_settings(xfm_base, params); - else -- dcn10_dpp_cm_program_regamma_lutb_settings(xfm_base, params); -+ opp_program_regamma_lutb_settings(xfm_base, params); - -- dcn10_dpp_cm_program_regamma_lut( -+ opp_program_regamma_lut( - xfm_base, params->rgb_resulted, params->hw_points_num); - - return true; - } - --static void dcn10_dpp_cm_set_regamma_mode( -+static void oppn10_set_regamma_mode( - struct transform *xfm_base, - enum opp_regamma mode) - { -@@ -235,167 +1559,22 @@ static void dcn10_dpp_cm_set_regamma_mode( - OBUF_H_2X_UPSCALE_EN, obuf_hupscale); - } - --static void ippn10_setup_format_flags(enum surface_pixel_format input_format,\ -- enum pixel_format_description *fmt) --{ -- -- if (input_format == SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F || -- input_format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F) -- *fmt = PIXEL_FORMAT_FLOAT; -- else if (input_format == SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616) -- *fmt = PIXEL_FORMAT_FIXED16; -- else -- *fmt = PIXEL_FORMAT_FIXED; --} -- --static void ippn10_set_degamma_format_float( -- struct transform *xfm_base, -- bool is_float) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- -- if (is_float) { -- REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, 3); -- REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, 1); -- } else { -- REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, 2); -- REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, 0); -- } --} -- --void ippn10_cnv_setup ( -- struct transform *xfm_base, -- enum surface_pixel_format input_format, -- enum expansion_mode mode, -- enum ipp_output_format cnv_out_format) --{ -- uint32_t pixel_format; -- uint32_t alpha_en; -- enum pixel_format_description fmt ; -- enum dc_color_space color_space; -- enum dcn10_input_csc_select select; -- bool is_float; -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- bool force_disable_cursor = false; -- -- ippn10_setup_format_flags(input_format, &fmt); -- alpha_en = 1; -- pixel_format = 0; -- color_space = COLOR_SPACE_SRGB; -- select = INPUT_CSC_SELECT_BYPASS; -- is_float = false; -- -- switch (fmt) { -- case PIXEL_FORMAT_FIXED: -- case PIXEL_FORMAT_FIXED16: -- /*when output is float then FORMAT_CONTROL__OUTPUT_FP=1*/ -- REG_SET_3(FORMAT_CONTROL, 0, -- CNVC_BYPASS, 0, -- FORMAT_EXPANSION_MODE, mode, -- OUTPUT_FP, 0); -- break; -- case PIXEL_FORMAT_FLOAT: -- REG_SET_3(FORMAT_CONTROL, 0, -- CNVC_BYPASS, 0, -- FORMAT_EXPANSION_MODE, mode, -- OUTPUT_FP, 1); -- is_float = true; -- break; -- default: -- -- break; -- } -- -- ippn10_set_degamma_format_float(xfm_base, is_float); -- -- switch (input_format) { -- case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555: -- pixel_format = 1; -- break; -- case SURFACE_PIXEL_FORMAT_GRPH_RGB565: -- pixel_format = 3; -- alpha_en = 0; -- break; -- case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: -- case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: -- pixel_format = 8; -- break; -- case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010: -- case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010: -- pixel_format = 10; -- break; -- case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr: -- force_disable_cursor = false; -- pixel_format = 65; -- color_space = COLOR_SPACE_YCBCR709; -- select = INPUT_CSC_SELECT_ICSC; -- break; -- case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb: -- force_disable_cursor = true; -- pixel_format = 64; -- color_space = COLOR_SPACE_YCBCR709; -- select = INPUT_CSC_SELECT_ICSC; -- break; -- case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr: -- force_disable_cursor = true; -- pixel_format = 67; -- color_space = COLOR_SPACE_YCBCR709; -- select = INPUT_CSC_SELECT_ICSC; -- break; -- case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb: -- force_disable_cursor = true; -- pixel_format = 66; -- color_space = COLOR_SPACE_YCBCR709; -- select = INPUT_CSC_SELECT_ICSC; -- break; -- case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: -- pixel_format = 22; -- break; -- case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: -- pixel_format = 24; -- break; -- case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: -- pixel_format = 25; -- break; -- default: -- break; -- } -- REG_SET(CNVC_SURFACE_PIXEL_FORMAT, 0, -- CNVC_SURFACE_PIXEL_FORMAT, pixel_format); -- REG_UPDATE(FORMAT_CONTROL, FORMAT_CONTROL__ALPHA_EN, alpha_en); -- -- ippn10_program_input_csc(xfm_base, color_space, select); -- -- if (force_disable_cursor) { -- REG_UPDATE(CURSOR_CONTROL, -- CURSOR_ENABLE, 0); -- REG_UPDATE(CURSOR0_CONTROL, -- CUR0_ENABLE, 0); -- } --} -- - static struct transform_funcs dcn10_dpp_funcs = { - .transform_reset = dpp_reset, -- .transform_set_scaler = dcn10_dpp_dscl_set_scaler_manual_scale, -+ .transform_set_scaler = dpp_set_scaler_manual_scale, - .transform_get_optimal_number_of_taps = dpp_get_optimal_number_of_taps, -- .transform_set_gamut_remap = dcn10_dpp_cm_set_gamut_remap, -- .opp_set_csc_adjustment = dcn10_dpp_cm_set_output_csc_adjustment, -- .opp_set_csc_default = dcn10_dpp_cm_set_output_csc_default, -- .opp_power_on_regamma_lut = dcn10_dpp_cm_power_on_regamma_lut, -- .opp_program_regamma_lut = dcn10_dpp_cm_program_regamma_lut, -- .opp_configure_regamma_lut = dcn10_dpp_cm_configure_regamma_lut, -- .opp_program_regamma_lutb_settings = dcn10_dpp_cm_program_regamma_lutb_settings, -- .opp_program_regamma_luta_settings = dcn10_dpp_cm_program_regamma_luta_settings, -- .opp_program_regamma_pwl = dcn10_dpp_cm_set_regamma_pwl, -- .opp_set_regamma_mode = dcn10_dpp_cm_set_regamma_mode, -- .ipp_set_degamma = ippn10_set_degamma, -- .ipp_program_input_lut = ippn10_program_input_lut, -- .ipp_program_degamma_pwl = ippn10_set_degamma_pwl, -- .ipp_setup = ippn10_cnv_setup, -- .ipp_full_bypass = ippn10_full_bypass, -+ .transform_set_gamut_remap = dcn_dpp_set_gamut_remap, -+ .opp_set_csc_adjustment = oppn10_set_output_csc_adjustment, -+ .opp_set_csc_default = oppn10_set_output_csc_default, -+ .opp_power_on_regamma_lut = oppn10_power_on_regamma_lut, -+ .opp_program_regamma_lut = opp_program_regamma_lut, -+ .opp_configure_regamma_lut = opp_configure_regamma_lut, -+ .opp_program_regamma_lutb_settings = opp_program_regamma_lutb_settings, -+ .opp_program_regamma_luta_settings = opp_program_regamma_luta_settings, -+ .opp_program_regamma_pwl = oppn10_set_regamma_pwl, -+ .opp_set_regamma_mode = oppn10_set_regamma_mode, - }; - -- - /*****************************************/ - /* Constructor, Destructor */ - /*****************************************/ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h -index 4bbd3b4..1c9d332 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h -@@ -37,13 +37,13 @@ - #define TF_SF(reg_name, field_name, post_fix)\ - .field_name = reg_name ## __ ## field_name ## post_fix - --//Used to resolve corner case --#define TF2_SF(reg_name, field_name, post_fix)\ -- .field_name = reg_name ## _ ## field_name ## post_fix -- - #define TF_REG_LIST_DCN(id) \ - SRI(CM_GAMUT_REMAP_CONTROL, CM, id),\ - SRI(CM_GAMUT_REMAP_C11_C12, CM, id),\ -+ SRI(CM_GAMUT_REMAP_C13_C14, CM, id),\ -+ SRI(CM_GAMUT_REMAP_C21_C22, CM, id),\ -+ SRI(CM_GAMUT_REMAP_C23_C24, CM, id),\ -+ SRI(CM_GAMUT_REMAP_C31_C32, CM, id),\ - SRI(CM_GAMUT_REMAP_C33_C34, CM, id),\ - SRI(DSCL_EXT_OVERSCAN_LEFT_RIGHT, DSCL, id), \ - SRI(DSCL_EXT_OVERSCAN_TOP_BOTTOM, DSCL, id), \ -@@ -72,58 +72,28 @@ - SRI(SCL_VERT_FILTER_INIT_BOT_C, DSCL, id), \ - SRI(RECOUT_START, DSCL, id), \ - SRI(RECOUT_SIZE, DSCL, id), \ -- SRI(OBUF_CONTROL, DSCL, id), \ -- SRI(CM_ICSC_CONTROL, CM, id), \ -- SRI(CM_ICSC_C11_C12, CM, id), \ -- SRI(CM_ICSC_C33_C34, CM, id), \ -- SRI(CM_DGAM_RAMB_START_CNTL_B, CM, id), \ -- SRI(CM_DGAM_RAMB_START_CNTL_G, CM, id), \ -- SRI(CM_DGAM_RAMB_START_CNTL_R, CM, id), \ -- SRI(CM_DGAM_RAMB_SLOPE_CNTL_B, CM, id), \ -- SRI(CM_DGAM_RAMB_SLOPE_CNTL_G, CM, id), \ -- SRI(CM_DGAM_RAMB_SLOPE_CNTL_R, CM, id), \ -- SRI(CM_DGAM_RAMB_END_CNTL1_B, CM, id), \ -- SRI(CM_DGAM_RAMB_END_CNTL2_B, CM, id), \ -- SRI(CM_DGAM_RAMB_END_CNTL1_G, CM, id), \ -- SRI(CM_DGAM_RAMB_END_CNTL2_G, CM, id), \ -- SRI(CM_DGAM_RAMB_END_CNTL1_R, CM, id), \ -- SRI(CM_DGAM_RAMB_END_CNTL2_R, CM, id), \ -- SRI(CM_DGAM_RAMB_REGION_0_1, CM, id), \ -- SRI(CM_DGAM_RAMB_REGION_14_15, CM, id), \ -- SRI(CM_DGAM_RAMA_START_CNTL_B, CM, id), \ -- SRI(CM_DGAM_RAMA_START_CNTL_G, CM, id), \ -- SRI(CM_DGAM_RAMA_START_CNTL_R, CM, id), \ -- SRI(CM_DGAM_RAMA_SLOPE_CNTL_B, CM, id), \ -- SRI(CM_DGAM_RAMA_SLOPE_CNTL_G, CM, id), \ -- SRI(CM_DGAM_RAMA_SLOPE_CNTL_R, CM, id), \ -- SRI(CM_DGAM_RAMA_END_CNTL1_B, CM, id), \ -- SRI(CM_DGAM_RAMA_END_CNTL2_B, CM, id), \ -- SRI(CM_DGAM_RAMA_END_CNTL1_G, CM, id), \ -- SRI(CM_DGAM_RAMA_END_CNTL2_G, CM, id), \ -- SRI(CM_DGAM_RAMA_END_CNTL1_R, CM, id), \ -- SRI(CM_DGAM_RAMA_END_CNTL2_R, CM, id), \ -- SRI(CM_DGAM_RAMA_REGION_0_1, CM, id), \ -- SRI(CM_DGAM_RAMA_REGION_14_15, CM, id), \ -- SRI(CM_MEM_PWR_CTRL, CM, id), \ -- SRI(CM_DGAM_LUT_WRITE_EN_MASK, CM, id), \ -- SRI(CM_DGAM_LUT_INDEX, CM, id), \ -- SRI(CM_DGAM_LUT_DATA, CM, id), \ -- SRI(CM_CONTROL, CM, id), \ -- SRI(CM_DGAM_CONTROL, CM, id), \ -- SRI(FORMAT_CONTROL, CNVC_CFG, id), \ -- SRI(CNVC_SURFACE_PIXEL_FORMAT, CNVC_CFG, id), \ -- SRI(CURSOR0_CONTROL, CNVC_CUR, id) -- -- -+ SRI(OBUF_CONTROL, DSCL, id) - - #define TF_REG_LIST_DCN10(id) \ - TF_REG_LIST_DCN(id), \ - SRI(CM_COMA_C11_C12, CM, id),\ -+ SRI(CM_COMA_C13_C14, CM, id),\ -+ SRI(CM_COMA_C21_C22, CM, id),\ -+ SRI(CM_COMA_C23_C24, CM, id),\ -+ SRI(CM_COMA_C31_C32, CM, id),\ - SRI(CM_COMA_C33_C34, CM, id),\ - SRI(CM_COMB_C11_C12, CM, id),\ -+ SRI(CM_COMB_C13_C14, CM, id),\ -+ SRI(CM_COMB_C21_C22, CM, id),\ -+ SRI(CM_COMB_C23_C24, CM, id),\ -+ SRI(CM_COMB_C31_C32, CM, id),\ - SRI(CM_COMB_C33_C34, CM, id),\ - SRI(CM_OCSC_CONTROL, CM, id), \ - SRI(CM_OCSC_C11_C12, CM, id), \ -+ SRI(CM_OCSC_C13_C14, CM, id), \ -+ SRI(CM_OCSC_C21_C22, CM, id), \ -+ SRI(CM_OCSC_C23_C24, CM, id), \ -+ SRI(CM_OCSC_C31_C32, CM, id), \ - SRI(CM_OCSC_C33_C34, CM, id), \ - SRI(CM_MEM_PWR_CTRL, CM, id), \ - SRI(CM_RGAM_LUT_DATA, CM, id), \ -@@ -142,6 +112,21 @@ - SRI(CM_RGAM_RAMB_END_CNTL1_R, CM, id), \ - SRI(CM_RGAM_RAMB_END_CNTL2_R, CM, id), \ - SRI(CM_RGAM_RAMB_REGION_0_1, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_2_3, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_4_5, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_6_7, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_8_9, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_10_11, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_12_13, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_14_15, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_16_17, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_18_19, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_20_21, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_22_23, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_24_25, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_26_27, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_28_29, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_30_31, CM, id), \ - SRI(CM_RGAM_RAMB_REGION_32_33, CM, id), \ - SRI(CM_RGAM_RAMA_START_CNTL_B, CM, id), \ - SRI(CM_RGAM_RAMA_START_CNTL_G, CM, id), \ -@@ -156,19 +141,37 @@ - SRI(CM_RGAM_RAMA_END_CNTL1_R, CM, id), \ - SRI(CM_RGAM_RAMA_END_CNTL2_R, CM, id), \ - SRI(CM_RGAM_RAMA_REGION_0_1, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_2_3, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_4_5, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_6_7, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_8_9, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_10_11, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_12_13, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_14_15, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_16_17, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_18_19, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_20_21, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_22_23, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_24_25, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_26_27, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_28_29, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_30_31, CM, id), \ - SRI(CM_RGAM_RAMA_REGION_32_33, CM, id), \ -- SRI(CM_RGAM_CONTROL, CM, id), \ -- SRI(CM_IGAM_CONTROL, CM, id), \ -- SRI(CM_IGAM_LUT_RW_CONTROL, CM, id), \ -- SRI(CM_IGAM_LUT_RW_INDEX, CM, id), \ -- SRI(CM_IGAM_LUT_SEQ_COLOR, CM, id), \ -- SRI(CURSOR_CONTROL, CURSOR, id) -+ SRI(CM_RGAM_CONTROL, CM, id) - - - #define TF_REG_LIST_SH_MASK_DCN(mask_sh)\ - TF_SF(CM0_CM_GAMUT_REMAP_CONTROL, CM_GAMUT_REMAP_MODE, mask_sh),\ - TF_SF(CM0_CM_GAMUT_REMAP_C11_C12, CM_GAMUT_REMAP_C11, mask_sh),\ - TF_SF(CM0_CM_GAMUT_REMAP_C11_C12, CM_GAMUT_REMAP_C12, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C13_C14, CM_GAMUT_REMAP_C13, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C13_C14, CM_GAMUT_REMAP_C14, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C21_C22, CM_GAMUT_REMAP_C21, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C21_C22, CM_GAMUT_REMAP_C22, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C23_C24, CM_GAMUT_REMAP_C23, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C23_C24, CM_GAMUT_REMAP_C24, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C31_C32, CM_GAMUT_REMAP_C31, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C31_C32, CM_GAMUT_REMAP_C32, mask_sh),\ - TF_SF(CM0_CM_GAMUT_REMAP_C33_C34, CM_GAMUT_REMAP_C33, mask_sh),\ - TF_SF(CM0_CM_GAMUT_REMAP_C33_C34, CM_GAMUT_REMAP_C34, mask_sh),\ - TF_SF(DSCL0_DSCL_EXT_OVERSCAN_LEFT_RIGHT, EXT_OVERSCAN_LEFT, mask_sh),\ -@@ -180,7 +183,7 @@ - TF_SF(DSCL0_OTG_V_BLANK, OTG_V_BLANK_START, mask_sh),\ - TF_SF(DSCL0_OTG_V_BLANK, OTG_V_BLANK_END, mask_sh),\ - TF_SF(DSCL0_LB_DATA_FORMAT, INTERLEAVE_EN, mask_sh),\ -- TF2_SF(DSCL0, LB_DATA_FORMAT__ALPHA_EN, mask_sh),\ -+ TF_SF(DSCL0_LB_DATA_FORMAT, ALPHA_EN, mask_sh),\ - TF_SF(DSCL0_LB_MEMORY_CTRL, MEMORY_CONFIG, mask_sh),\ - TF_SF(DSCL0_LB_MEMORY_CTRL, LB_MAX_PARTITIONS, mask_sh),\ - TF_SF(DSCL0_DSCL_AUTOCAL, AUTOCAL_MODE, mask_sh),\ -@@ -232,77 +235,7 @@ - TF_SF(DSCL0_SCL_VERT_FILTER_INIT_BOT_C, SCL_V_INIT_INT_BOT_C, mask_sh),\ - TF_SF(DSCL0_SCL_MODE, SCL_CHROMA_COEF_MODE, mask_sh),\ - TF_SF(DSCL0_SCL_MODE, SCL_COEF_RAM_SELECT_CURRENT, mask_sh), \ -- TF_SF(DSCL0_OBUF_CONTROL, OBUF_BYPASS, mask_sh), \ -- TF_SF(CM0_CM_ICSC_CONTROL, CM_ICSC_MODE, mask_sh), \ -- TF_SF(CM0_CM_ICSC_C11_C12, CM_ICSC_C11, mask_sh), \ -- TF_SF(CM0_CM_ICSC_C11_C12, CM_ICSC_C12, mask_sh), \ -- TF_SF(CM0_CM_ICSC_C33_C34, CM_ICSC_C33, mask_sh), \ -- TF_SF(CM0_CM_ICSC_C33_C34, CM_ICSC_C34, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_START_CNTL_B, CM_DGAM_RAMB_EXP_REGION_START_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_START_CNTL_B, CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_START_CNTL_G, CM_DGAM_RAMB_EXP_REGION_START_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_START_CNTL_G, CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_START_CNTL_R, CM_DGAM_RAMB_EXP_REGION_START_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_START_CNTL_R, CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_SLOPE_CNTL_B, CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_SLOPE_CNTL_G, CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_SLOPE_CNTL_R, CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_END_CNTL1_B, CM_DGAM_RAMB_EXP_REGION_END_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_END_CNTL2_B, CM_DGAM_RAMB_EXP_REGION_END_SLOPE_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_END_CNTL2_B, CM_DGAM_RAMB_EXP_REGION_END_BASE_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_END_CNTL1_G, CM_DGAM_RAMB_EXP_REGION_END_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_END_CNTL2_G, CM_DGAM_RAMB_EXP_REGION_END_SLOPE_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_END_CNTL2_G, CM_DGAM_RAMB_EXP_REGION_END_BASE_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_END_CNTL1_R, CM_DGAM_RAMB_EXP_REGION_END_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_END_CNTL2_R, CM_DGAM_RAMB_EXP_REGION_END_SLOPE_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_END_CNTL2_R, CM_DGAM_RAMB_EXP_REGION_END_BASE_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION0_LUT_OFFSET, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION0_NUM_SEGMENTS, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION1_LUT_OFFSET, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION1_NUM_SEGMENTS, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION14_LUT_OFFSET, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION14_NUM_SEGMENTS, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION15_LUT_OFFSET, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION15_NUM_SEGMENTS, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_START_CNTL_B, CM_DGAM_RAMA_EXP_REGION_START_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_START_CNTL_B, CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_START_CNTL_G, CM_DGAM_RAMA_EXP_REGION_START_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_START_CNTL_G, CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_START_CNTL_R, CM_DGAM_RAMA_EXP_REGION_START_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_START_CNTL_R, CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_SLOPE_CNTL_B, CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_SLOPE_CNTL_G, CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_SLOPE_CNTL_R, CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_END_CNTL1_B, CM_DGAM_RAMA_EXP_REGION_END_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_END_CNTL2_B, CM_DGAM_RAMA_EXP_REGION_END_SLOPE_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_END_CNTL2_B, CM_DGAM_RAMA_EXP_REGION_END_BASE_B, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_END_CNTL1_G, CM_DGAM_RAMA_EXP_REGION_END_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_END_CNTL2_G, CM_DGAM_RAMA_EXP_REGION_END_SLOPE_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_END_CNTL2_G, CM_DGAM_RAMA_EXP_REGION_END_BASE_G, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_END_CNTL1_R, CM_DGAM_RAMA_EXP_REGION_END_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_END_CNTL2_R, CM_DGAM_RAMA_EXP_REGION_END_SLOPE_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_END_CNTL2_R, CM_DGAM_RAMA_EXP_REGION_END_BASE_R, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION0_LUT_OFFSET, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION14_LUT_OFFSET, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION14_NUM_SEGMENTS, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION15_LUT_OFFSET, mask_sh), \ -- TF_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION15_NUM_SEGMENTS, mask_sh), \ -- TF_SF(CM0_CM_MEM_PWR_CTRL, SHARED_MEM_PWR_DIS, mask_sh), \ -- TF_SF(CM0_CM_DGAM_LUT_WRITE_EN_MASK, CM_DGAM_LUT_WRITE_EN_MASK, mask_sh), \ -- TF_SF(CM0_CM_DGAM_LUT_WRITE_EN_MASK, CM_DGAM_LUT_WRITE_SEL, mask_sh), \ -- TF_SF(CM0_CM_DGAM_LUT_INDEX, CM_DGAM_LUT_INDEX, mask_sh), \ -- TF_SF(CM0_CM_DGAM_LUT_DATA, CM_DGAM_LUT_DATA, mask_sh), \ -- TF_SF(CM0_CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, mask_sh), \ -- TF_SF(CNVC_CFG0_FORMAT_CONTROL, CNVC_BYPASS, mask_sh), \ -- TF2_SF(CNVC_CFG0, FORMAT_CONTROL__ALPHA_EN, mask_sh), \ -- TF_SF(CNVC_CFG0_FORMAT_CONTROL, FORMAT_EXPANSION_MODE, mask_sh), \ -- TF_SF(CNVC_CFG0_CNVC_SURFACE_PIXEL_FORMAT, CNVC_SURFACE_PIXEL_FORMAT, mask_sh), \ -- TF_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_MODE, mask_sh), \ -- TF_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_EXPANSION_MODE, mask_sh), \ -- TF_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_ENABLE, mask_sh) -+ TF_SF(DSCL0_OBUF_CONTROL, OBUF_BYPASS, mask_sh) - - #define TF_REG_LIST_SH_MASK_DCN10(mask_sh)\ - TF_REG_LIST_SH_MASK_DCN(mask_sh),\ -@@ -313,15 +246,39 @@ - TF_SF(DSCL0_LB_DATA_FORMAT, DITHER_EN, mask_sh),\ - TF_SF(CM0_CM_COMA_C11_C12, CM_COMA_C11, mask_sh),\ - TF_SF(CM0_CM_COMA_C11_C12, CM_COMA_C12, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C13_C14, CM_COMA_C13, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C13_C14, CM_COMA_C14, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C21_C22, CM_COMA_C21, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C21_C22, CM_COMA_C22, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C23_C24, CM_COMA_C23, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C23_C24, CM_COMA_C24, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C31_C32, CM_COMA_C31, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C31_C32, CM_COMA_C32, mask_sh),\ - TF_SF(CM0_CM_COMA_C33_C34, CM_COMA_C33, mask_sh),\ - TF_SF(CM0_CM_COMA_C33_C34, CM_COMA_C34, mask_sh),\ - TF_SF(CM0_CM_COMB_C11_C12, CM_COMB_C11, mask_sh),\ - TF_SF(CM0_CM_COMB_C11_C12, CM_COMB_C12, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C13_C14, CM_COMB_C13, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C13_C14, CM_COMB_C14, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C21_C22, CM_COMB_C21, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C21_C22, CM_COMB_C22, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C23_C24, CM_COMB_C23, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C23_C24, CM_COMB_C24, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C31_C32, CM_COMB_C31, mask_sh),\ - TF_SF(CM0_CM_COMB_C33_C34, CM_COMB_C33, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C31_C32, CM_COMB_C32, mask_sh),\ - TF_SF(CM0_CM_COMB_C33_C34, CM_COMB_C34, mask_sh),\ - TF_SF(CM0_CM_OCSC_CONTROL, CM_OCSC_MODE, mask_sh), \ - TF_SF(CM0_CM_OCSC_C11_C12, CM_OCSC_C11, mask_sh), \ - TF_SF(CM0_CM_OCSC_C11_C12, CM_OCSC_C12, mask_sh), \ -+ TF_SF(CM0_CM_OCSC_C13_C14, CM_OCSC_C13, mask_sh), \ -+ TF_SF(CM0_CM_OCSC_C13_C14, CM_OCSC_C14, mask_sh), \ -+ TF_SF(CM0_CM_OCSC_C21_C22, CM_OCSC_C21, mask_sh), \ -+ TF_SF(CM0_CM_OCSC_C21_C22, CM_OCSC_C22, mask_sh), \ -+ TF_SF(CM0_CM_OCSC_C23_C24, CM_OCSC_C23, mask_sh), \ -+ TF_SF(CM0_CM_OCSC_C23_C24, CM_OCSC_C24, mask_sh), \ -+ TF_SF(CM0_CM_OCSC_C31_C32, CM_OCSC_C31, mask_sh), \ -+ TF_SF(CM0_CM_OCSC_C31_C32, CM_OCSC_C32, mask_sh), \ - TF_SF(CM0_CM_OCSC_C33_C34, CM_OCSC_C33, mask_sh), \ - TF_SF(CM0_CM_OCSC_C33_C34, CM_OCSC_C34, mask_sh), \ - TF_SF(CM0_CM_MEM_PWR_CTRL, RGAM_MEM_PWR_FORCE, mask_sh), \ -@@ -351,6 +308,66 @@ - TF_SF(CM0_CM_RGAM_RAMB_REGION_0_1, CM_RGAM_RAMB_EXP_REGION0_NUM_SEGMENTS, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMB_REGION_0_1, CM_RGAM_RAMB_EXP_REGION1_LUT_OFFSET, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMB_REGION_0_1, CM_RGAM_RAMB_EXP_REGION1_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_2_3, CM_RGAM_RAMB_EXP_REGION2_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_2_3, CM_RGAM_RAMB_EXP_REGION2_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_2_3, CM_RGAM_RAMB_EXP_REGION3_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_2_3, CM_RGAM_RAMB_EXP_REGION3_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_4_5, CM_RGAM_RAMB_EXP_REGION4_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_4_5, CM_RGAM_RAMB_EXP_REGION4_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_4_5, CM_RGAM_RAMB_EXP_REGION5_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_4_5, CM_RGAM_RAMB_EXP_REGION5_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_6_7, CM_RGAM_RAMB_EXP_REGION6_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_6_7, CM_RGAM_RAMB_EXP_REGION6_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_6_7, CM_RGAM_RAMB_EXP_REGION7_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_6_7, CM_RGAM_RAMB_EXP_REGION7_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_8_9, CM_RGAM_RAMB_EXP_REGION8_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_8_9, CM_RGAM_RAMB_EXP_REGION8_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_8_9, CM_RGAM_RAMB_EXP_REGION9_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_8_9, CM_RGAM_RAMB_EXP_REGION9_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_10_11, CM_RGAM_RAMB_EXP_REGION10_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_10_11, CM_RGAM_RAMB_EXP_REGION10_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_10_11, CM_RGAM_RAMB_EXP_REGION11_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_10_11, CM_RGAM_RAMB_EXP_REGION11_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_12_13, CM_RGAM_RAMB_EXP_REGION12_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_12_13, CM_RGAM_RAMB_EXP_REGION12_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_12_13, CM_RGAM_RAMB_EXP_REGION13_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_12_13, CM_RGAM_RAMB_EXP_REGION13_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_14_15, CM_RGAM_RAMB_EXP_REGION14_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_14_15, CM_RGAM_RAMB_EXP_REGION14_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_14_15, CM_RGAM_RAMB_EXP_REGION15_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_14_15, CM_RGAM_RAMB_EXP_REGION15_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_16_17, CM_RGAM_RAMB_EXP_REGION16_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_16_17, CM_RGAM_RAMB_EXP_REGION16_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_16_17, CM_RGAM_RAMB_EXP_REGION17_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_16_17, CM_RGAM_RAMB_EXP_REGION17_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_18_19, CM_RGAM_RAMB_EXP_REGION18_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_18_19, CM_RGAM_RAMB_EXP_REGION18_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_18_19, CM_RGAM_RAMB_EXP_REGION19_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_18_19, CM_RGAM_RAMB_EXP_REGION19_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_20_21, CM_RGAM_RAMB_EXP_REGION20_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_20_21, CM_RGAM_RAMB_EXP_REGION20_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_20_21, CM_RGAM_RAMB_EXP_REGION21_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_20_21, CM_RGAM_RAMB_EXP_REGION21_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_22_23, CM_RGAM_RAMB_EXP_REGION22_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_22_23, CM_RGAM_RAMB_EXP_REGION22_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_22_23, CM_RGAM_RAMB_EXP_REGION23_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_22_23, CM_RGAM_RAMB_EXP_REGION23_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_24_25, CM_RGAM_RAMB_EXP_REGION24_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_24_25, CM_RGAM_RAMB_EXP_REGION24_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_24_25, CM_RGAM_RAMB_EXP_REGION25_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_24_25, CM_RGAM_RAMB_EXP_REGION25_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_26_27, CM_RGAM_RAMB_EXP_REGION26_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_26_27, CM_RGAM_RAMB_EXP_REGION26_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_26_27, CM_RGAM_RAMB_EXP_REGION27_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_26_27, CM_RGAM_RAMB_EXP_REGION27_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_28_29, CM_RGAM_RAMB_EXP_REGION28_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_28_29, CM_RGAM_RAMB_EXP_REGION28_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_28_29, CM_RGAM_RAMB_EXP_REGION29_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_28_29, CM_RGAM_RAMB_EXP_REGION29_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_30_31, CM_RGAM_RAMB_EXP_REGION30_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_30_31, CM_RGAM_RAMB_EXP_REGION30_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_30_31, CM_RGAM_RAMB_EXP_REGION31_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMB_REGION_30_31, CM_RGAM_RAMB_EXP_REGION31_NUM_SEGMENTS, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMB_REGION_32_33, CM_RGAM_RAMB_EXP_REGION32_LUT_OFFSET, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMB_REGION_32_33, CM_RGAM_RAMB_EXP_REGION32_NUM_SEGMENTS, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMB_REGION_32_33, CM_RGAM_RAMB_EXP_REGION33_LUT_OFFSET, mask_sh), \ -@@ -377,30 +394,73 @@ - TF_SF(CM0_CM_RGAM_RAMA_REGION_0_1, CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMA_REGION_0_1, CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMA_REGION_0_1, CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_2_3, CM_RGAM_RAMA_EXP_REGION2_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_2_3, CM_RGAM_RAMA_EXP_REGION2_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_2_3, CM_RGAM_RAMA_EXP_REGION3_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_2_3, CM_RGAM_RAMA_EXP_REGION3_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_4_5, CM_RGAM_RAMA_EXP_REGION4_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_4_5, CM_RGAM_RAMA_EXP_REGION4_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_4_5, CM_RGAM_RAMA_EXP_REGION5_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_4_5, CM_RGAM_RAMA_EXP_REGION5_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_6_7, CM_RGAM_RAMA_EXP_REGION6_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_6_7, CM_RGAM_RAMA_EXP_REGION6_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_6_7, CM_RGAM_RAMA_EXP_REGION7_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_6_7, CM_RGAM_RAMA_EXP_REGION7_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_8_9, CM_RGAM_RAMA_EXP_REGION8_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_8_9, CM_RGAM_RAMA_EXP_REGION8_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_8_9, CM_RGAM_RAMA_EXP_REGION9_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_8_9, CM_RGAM_RAMA_EXP_REGION9_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_10_11, CM_RGAM_RAMA_EXP_REGION10_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_10_11, CM_RGAM_RAMA_EXP_REGION10_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_10_11, CM_RGAM_RAMA_EXP_REGION11_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_10_11, CM_RGAM_RAMA_EXP_REGION11_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_12_13, CM_RGAM_RAMA_EXP_REGION12_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_12_13, CM_RGAM_RAMA_EXP_REGION12_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_12_13, CM_RGAM_RAMA_EXP_REGION13_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_12_13, CM_RGAM_RAMA_EXP_REGION13_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_14_15, CM_RGAM_RAMA_EXP_REGION14_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_14_15, CM_RGAM_RAMA_EXP_REGION14_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_14_15, CM_RGAM_RAMA_EXP_REGION15_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_14_15, CM_RGAM_RAMA_EXP_REGION15_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_16_17, CM_RGAM_RAMA_EXP_REGION16_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_16_17, CM_RGAM_RAMA_EXP_REGION16_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_16_17, CM_RGAM_RAMA_EXP_REGION17_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_16_17, CM_RGAM_RAMA_EXP_REGION17_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_18_19, CM_RGAM_RAMA_EXP_REGION18_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_18_19, CM_RGAM_RAMA_EXP_REGION18_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_18_19, CM_RGAM_RAMA_EXP_REGION19_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_18_19, CM_RGAM_RAMA_EXP_REGION19_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_20_21, CM_RGAM_RAMA_EXP_REGION20_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_20_21, CM_RGAM_RAMA_EXP_REGION20_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_20_21, CM_RGAM_RAMA_EXP_REGION21_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_20_21, CM_RGAM_RAMA_EXP_REGION21_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_22_23, CM_RGAM_RAMA_EXP_REGION22_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_22_23, CM_RGAM_RAMA_EXP_REGION22_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_22_23, CM_RGAM_RAMA_EXP_REGION23_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_22_23, CM_RGAM_RAMA_EXP_REGION23_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_24_25, CM_RGAM_RAMA_EXP_REGION24_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_24_25, CM_RGAM_RAMA_EXP_REGION24_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_24_25, CM_RGAM_RAMA_EXP_REGION25_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_24_25, CM_RGAM_RAMA_EXP_REGION25_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_26_27, CM_RGAM_RAMA_EXP_REGION26_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_26_27, CM_RGAM_RAMA_EXP_REGION26_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_26_27, CM_RGAM_RAMA_EXP_REGION27_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_26_27, CM_RGAM_RAMA_EXP_REGION27_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_28_29, CM_RGAM_RAMA_EXP_REGION28_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_28_29, CM_RGAM_RAMA_EXP_REGION28_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_28_29, CM_RGAM_RAMA_EXP_REGION29_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_28_29, CM_RGAM_RAMA_EXP_REGION29_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_30_31, CM_RGAM_RAMA_EXP_REGION30_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_30_31, CM_RGAM_RAMA_EXP_REGION30_NUM_SEGMENTS, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_30_31, CM_RGAM_RAMA_EXP_REGION31_LUT_OFFSET, mask_sh), \ -+ TF_SF(CM0_CM_RGAM_RAMA_REGION_30_31, CM_RGAM_RAMA_EXP_REGION31_NUM_SEGMENTS, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMA_REGION_32_33, CM_RGAM_RAMA_EXP_REGION32_LUT_OFFSET, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMA_REGION_32_33, CM_RGAM_RAMA_EXP_REGION32_NUM_SEGMENTS, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMA_REGION_32_33, CM_RGAM_RAMA_EXP_REGION33_LUT_OFFSET, mask_sh), \ - TF_SF(CM0_CM_RGAM_RAMA_REGION_32_33, CM_RGAM_RAMA_EXP_REGION33_NUM_SEGMENTS, mask_sh), \ - TF_SF(CM0_CM_RGAM_CONTROL, CM_RGAM_LUT_MODE, mask_sh), \ -- TF_SF(DSCL0_OBUF_CONTROL, OBUF_H_2X_UPSCALE_EN, mask_sh), \ -- TF_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, mask_sh), \ -- TF_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_LUT_FORMAT_R, mask_sh), \ -- TF_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_LUT_FORMAT_G, mask_sh), \ -- TF_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_LUT_FORMAT_B, mask_sh), \ -- TF_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, mask_sh), \ -- TF_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_DGAM_CONFIG_STATUS, mask_sh), \ -- TF_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_HOST_EN, mask_sh), \ -- TF_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_RW_MODE, mask_sh), \ -- TF_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_SEL, mask_sh), \ -- TF_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_WRITE_EN_MASK, mask_sh), \ -- TF_SF(CM0_CM_IGAM_LUT_RW_INDEX, CM_IGAM_LUT_RW_INDEX, mask_sh), \ -- TF_SF(CM0_CM_CONTROL, CM_BYPASS_EN, mask_sh), \ -- TF_SF(CM0_CM_IGAM_LUT_SEQ_COLOR, CM_IGAM_LUT_SEQ_COLOR, mask_sh), \ -- TF_SF(CNVC_CFG0_FORMAT_CONTROL, OUTPUT_FP, mask_sh), \ -- TF_SF(CURSOR0_CURSOR_CONTROL, CURSOR_MODE, mask_sh), \ -- TF_SF(CURSOR0_CURSOR_CONTROL, CURSOR_PITCH, mask_sh), \ -- TF_SF(CURSOR0_CURSOR_CONTROL, CURSOR_LINES_PER_CHUNK, mask_sh), \ -- TF_SF(CURSOR0_CURSOR_CONTROL, CURSOR_ENABLE, mask_sh) -+ TF_SF(DSCL0_OBUF_CONTROL, OBUF_H_2X_UPSCALE_EN, mask_sh) -+ - - #define TF_REG_FIELD_LIST(type) \ - type EXT_OVERSCAN_LEFT; \ -@@ -417,7 +477,7 @@ - type DYNAMIC_PIXEL_DEPTH; \ - type DITHER_EN; \ - type INTERLEAVE_EN; \ -- type LB_DATA_FORMAT__ALPHA_EN; \ -+ type ALPHA_EN; \ - type MEMORY_CONFIG; \ - type LB_MAX_PARTITIONS; \ - type AUTOCAL_MODE; \ -@@ -472,19 +532,51 @@ - type CM_GAMUT_REMAP_MODE; \ - type CM_GAMUT_REMAP_C11; \ - type CM_GAMUT_REMAP_C12; \ -+ type CM_GAMUT_REMAP_C13; \ -+ type CM_GAMUT_REMAP_C14; \ -+ type CM_GAMUT_REMAP_C21; \ -+ type CM_GAMUT_REMAP_C22; \ -+ type CM_GAMUT_REMAP_C23; \ -+ type CM_GAMUT_REMAP_C24; \ -+ type CM_GAMUT_REMAP_C31; \ -+ type CM_GAMUT_REMAP_C32; \ - type CM_GAMUT_REMAP_C33; \ - type CM_GAMUT_REMAP_C34; \ - type CM_COMA_C11; \ - type CM_COMA_C12; \ -+ type CM_COMA_C13; \ -+ type CM_COMA_C14; \ -+ type CM_COMA_C21; \ -+ type CM_COMA_C22; \ -+ type CM_COMA_C23; \ -+ type CM_COMA_C24; \ -+ type CM_COMA_C31; \ -+ type CM_COMA_C32; \ - type CM_COMA_C33; \ - type CM_COMA_C34; \ - type CM_COMB_C11; \ - type CM_COMB_C12; \ -+ type CM_COMB_C13; \ -+ type CM_COMB_C14; \ -+ type CM_COMB_C21; \ -+ type CM_COMB_C22; \ -+ type CM_COMB_C23; \ -+ type CM_COMB_C24; \ -+ type CM_COMB_C31; \ -+ type CM_COMB_C32; \ - type CM_COMB_C33; \ - type CM_COMB_C34; \ - type CM_OCSC_MODE; \ - type CM_OCSC_C11; \ - type CM_OCSC_C12; \ -+ type CM_OCSC_C13; \ -+ type CM_OCSC_C14; \ -+ type CM_OCSC_C21; \ -+ type CM_OCSC_C22; \ -+ type CM_OCSC_C23; \ -+ type CM_OCSC_C24; \ -+ type CM_OCSC_C31; \ -+ type CM_OCSC_C32; \ - type CM_OCSC_C33; \ - type CM_OCSC_C34; \ - type RGAM_MEM_PWR_FORCE; \ -@@ -514,6 +606,66 @@ - type CM_RGAM_RAMB_EXP_REGION0_NUM_SEGMENTS; \ - type CM_RGAM_RAMB_EXP_REGION1_LUT_OFFSET; \ - type CM_RGAM_RAMB_EXP_REGION1_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION2_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION2_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION3_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION3_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION4_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION4_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION5_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION5_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION6_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION6_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION7_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION7_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION8_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION8_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION9_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION9_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION10_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION10_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION11_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION11_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION12_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION12_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION13_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION13_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION14_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION14_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION15_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION15_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION16_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION16_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION17_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION17_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION18_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION18_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION19_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION19_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION20_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION20_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION21_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION21_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION22_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION22_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION23_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION23_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION24_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION24_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION25_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION25_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION26_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION26_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION27_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION27_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION28_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION28_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION29_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION29_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION30_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION30_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION31_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION31_NUM_SEGMENTS; \ - type CM_RGAM_RAMB_EXP_REGION32_LUT_OFFSET; \ - type CM_RGAM_RAMB_EXP_REGION32_NUM_SEGMENTS; \ - type CM_RGAM_RAMB_EXP_REGION33_LUT_OFFSET; \ -@@ -540,6 +692,66 @@ - type CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS; \ - type CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET; \ - type CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION2_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION2_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION3_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION3_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION4_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION4_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION5_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION5_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION6_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION6_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION7_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION7_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION8_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION8_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION9_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION9_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION10_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION10_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION11_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION11_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION12_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION12_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION13_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION13_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION14_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION14_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION15_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION15_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION16_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION16_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION17_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION17_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION18_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION18_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION19_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION19_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION20_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION20_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION21_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION21_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION22_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION22_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION23_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION23_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION24_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION24_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION25_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION25_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION26_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION26_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION27_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION27_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION28_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION28_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION29_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION29_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION30_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION30_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION31_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION31_NUM_SEGMENTS; \ - type CM_RGAM_RAMA_EXP_REGION32_LUT_OFFSET; \ - type CM_RGAM_RAMA_EXP_REGION32_NUM_SEGMENTS; \ - type CM_RGAM_RAMA_EXP_REGION33_LUT_OFFSET; \ -@@ -911,98 +1123,7 @@ - type CM_SHAPER_LUT_WRITE_EN_MASK; \ - type CM_SHAPER_LUT_WRITE_SEL; \ - type CM_SHAPER_LUT_INDEX; \ -- type CM_SHAPER_LUT_DATA; \ -- type CM_DGAM_CONFIG_STATUS; \ -- type CM_ICSC_MODE; \ -- type CM_ICSC_C11; \ -- type CM_ICSC_C12; \ -- type CM_ICSC_C33; \ -- type CM_ICSC_C34; \ -- type CM_DGAM_RAMB_EXP_REGION_START_B; \ -- type CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_B; \ -- type CM_DGAM_RAMB_EXP_REGION_START_G; \ -- type CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_G; \ -- type CM_DGAM_RAMB_EXP_REGION_START_R; \ -- type CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_R; \ -- type CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B; \ -- type CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G; \ -- type CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R; \ -- type CM_DGAM_RAMB_EXP_REGION_END_B; \ -- type CM_DGAM_RAMB_EXP_REGION_END_SLOPE_B; \ -- type CM_DGAM_RAMB_EXP_REGION_END_BASE_B; \ -- type CM_DGAM_RAMB_EXP_REGION_END_G; \ -- type CM_DGAM_RAMB_EXP_REGION_END_SLOPE_G; \ -- type CM_DGAM_RAMB_EXP_REGION_END_BASE_G; \ -- type CM_DGAM_RAMB_EXP_REGION_END_R; \ -- type CM_DGAM_RAMB_EXP_REGION_END_SLOPE_R; \ -- type CM_DGAM_RAMB_EXP_REGION_END_BASE_R; \ -- type CM_DGAM_RAMB_EXP_REGION0_LUT_OFFSET; \ -- type CM_DGAM_RAMB_EXP_REGION0_NUM_SEGMENTS; \ -- type CM_DGAM_RAMB_EXP_REGION1_LUT_OFFSET; \ -- type CM_DGAM_RAMB_EXP_REGION1_NUM_SEGMENTS; \ -- type CM_DGAM_RAMB_EXP_REGION14_LUT_OFFSET; \ -- type CM_DGAM_RAMB_EXP_REGION14_NUM_SEGMENTS; \ -- type CM_DGAM_RAMB_EXP_REGION15_LUT_OFFSET; \ -- type CM_DGAM_RAMB_EXP_REGION15_NUM_SEGMENTS; \ -- type CM_DGAM_RAMA_EXP_REGION_START_B; \ -- type CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_B; \ -- type CM_DGAM_RAMA_EXP_REGION_START_G; \ -- type CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_G; \ -- type CM_DGAM_RAMA_EXP_REGION_START_R; \ -- type CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_R; \ -- type CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B; \ -- type CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G; \ -- type CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R; \ -- type CM_DGAM_RAMA_EXP_REGION_END_B; \ -- type CM_DGAM_RAMA_EXP_REGION_END_SLOPE_B; \ -- type CM_DGAM_RAMA_EXP_REGION_END_BASE_B; \ -- type CM_DGAM_RAMA_EXP_REGION_END_G; \ -- type CM_DGAM_RAMA_EXP_REGION_END_SLOPE_G; \ -- type CM_DGAM_RAMA_EXP_REGION_END_BASE_G; \ -- type CM_DGAM_RAMA_EXP_REGION_END_R; \ -- type CM_DGAM_RAMA_EXP_REGION_END_SLOPE_R; \ -- type CM_DGAM_RAMA_EXP_REGION_END_BASE_R; \ -- type CM_DGAM_RAMA_EXP_REGION0_LUT_OFFSET; \ -- type CM_DGAM_RAMA_EXP_REGION0_NUM_SEGMENTS; \ -- type CM_DGAM_RAMA_EXP_REGION1_LUT_OFFSET; \ -- type CM_DGAM_RAMA_EXP_REGION1_NUM_SEGMENTS; \ -- type CM_DGAM_RAMA_EXP_REGION14_LUT_OFFSET; \ -- type CM_DGAM_RAMA_EXP_REGION14_NUM_SEGMENTS; \ -- type CM_DGAM_RAMA_EXP_REGION15_LUT_OFFSET; \ -- type CM_DGAM_RAMA_EXP_REGION15_NUM_SEGMENTS; \ -- type SHARED_MEM_PWR_DIS; \ -- type CM_IGAM_LUT_FORMAT_R; \ -- type CM_IGAM_LUT_FORMAT_G; \ -- type CM_IGAM_LUT_FORMAT_B; \ -- type CM_IGAM_LUT_HOST_EN; \ -- type CM_IGAM_LUT_RW_MODE; \ -- type CM_IGAM_LUT_WRITE_EN_MASK; \ -- type CM_IGAM_LUT_SEL; \ -- type CM_IGAM_LUT_SEQ_COLOR; \ -- type CM_IGAM_DGAM_CONFIG_STATUS; \ -- type CM_DGAM_LUT_WRITE_EN_MASK; \ -- type CM_DGAM_LUT_WRITE_SEL; \ -- type CM_DGAM_LUT_INDEX; \ -- type CM_DGAM_LUT_DATA; \ -- type CM_DGAM_LUT_MODE; \ -- type CM_IGAM_LUT_MODE; \ -- type CM_IGAM_INPUT_FORMAT; \ -- type CM_IGAM_LUT_RW_INDEX; \ -- type CM_BYPASS_EN; \ -- type FORMAT_EXPANSION_MODE; \ -- type CNVC_BYPASS; \ -- type OUTPUT_FP; \ -- type CNVC_SURFACE_PIXEL_FORMAT; \ -- type CURSOR_MODE; \ -- type CURSOR_PITCH; \ -- type CURSOR_LINES_PER_CHUNK; \ -- type CURSOR_ENABLE; \ -- type CUR0_MODE; \ -- type CUR0_EXPANSION_MODE; \ -- type CUR0_ENABLE; \ -- type CM_BYPASS; \ -- type FORMAT_CONTROL__ALPHA_EN -- -+ type CM_SHAPER_LUT_DATA - - - struct dcn_dpp_shift { -@@ -1046,13 +1167,29 @@ struct dcn_dpp_registers { - uint32_t RECOUT_SIZE; - uint32_t CM_GAMUT_REMAP_CONTROL; - uint32_t CM_GAMUT_REMAP_C11_C12; -+ uint32_t CM_GAMUT_REMAP_C13_C14; -+ uint32_t CM_GAMUT_REMAP_C21_C22; -+ uint32_t CM_GAMUT_REMAP_C23_C24; -+ uint32_t CM_GAMUT_REMAP_C31_C32; - uint32_t CM_GAMUT_REMAP_C33_C34; - uint32_t CM_COMA_C11_C12; -+ uint32_t CM_COMA_C13_C14; -+ uint32_t CM_COMA_C21_C22; -+ uint32_t CM_COMA_C23_C24; -+ uint32_t CM_COMA_C31_C32; - uint32_t CM_COMA_C33_C34; - uint32_t CM_COMB_C11_C12; -+ uint32_t CM_COMB_C13_C14; -+ uint32_t CM_COMB_C21_C22; -+ uint32_t CM_COMB_C23_C24; -+ uint32_t CM_COMB_C31_C32; - uint32_t CM_COMB_C33_C34; - uint32_t CM_OCSC_CONTROL; - uint32_t CM_OCSC_C11_C12; -+ uint32_t CM_OCSC_C13_C14; -+ uint32_t CM_OCSC_C21_C22; -+ uint32_t CM_OCSC_C23_C24; -+ uint32_t CM_OCSC_C31_C32; - uint32_t CM_OCSC_C33_C34; - uint32_t CM_MEM_PWR_CTRL; - uint32_t CM_RGAM_LUT_DATA; -@@ -1071,6 +1208,21 @@ struct dcn_dpp_registers { - uint32_t CM_RGAM_RAMB_END_CNTL1_R; - uint32_t CM_RGAM_RAMB_END_CNTL2_R; - uint32_t CM_RGAM_RAMB_REGION_0_1; -+ uint32_t CM_RGAM_RAMB_REGION_2_3; -+ uint32_t CM_RGAM_RAMB_REGION_4_5; -+ uint32_t CM_RGAM_RAMB_REGION_6_7; -+ uint32_t CM_RGAM_RAMB_REGION_8_9; -+ uint32_t CM_RGAM_RAMB_REGION_10_11; -+ uint32_t CM_RGAM_RAMB_REGION_12_13; -+ uint32_t CM_RGAM_RAMB_REGION_14_15; -+ uint32_t CM_RGAM_RAMB_REGION_16_17; -+ uint32_t CM_RGAM_RAMB_REGION_18_19; -+ uint32_t CM_RGAM_RAMB_REGION_20_21; -+ uint32_t CM_RGAM_RAMB_REGION_22_23; -+ uint32_t CM_RGAM_RAMB_REGION_24_25; -+ uint32_t CM_RGAM_RAMB_REGION_26_27; -+ uint32_t CM_RGAM_RAMB_REGION_28_29; -+ uint32_t CM_RGAM_RAMB_REGION_30_31; - uint32_t CM_RGAM_RAMB_REGION_32_33; - uint32_t CM_RGAM_RAMA_START_CNTL_B; - uint32_t CM_RGAM_RAMA_START_CNTL_G; -@@ -1085,6 +1237,21 @@ struct dcn_dpp_registers { - uint32_t CM_RGAM_RAMA_END_CNTL1_R; - uint32_t CM_RGAM_RAMA_END_CNTL2_R; - uint32_t CM_RGAM_RAMA_REGION_0_1; -+ uint32_t CM_RGAM_RAMA_REGION_2_3; -+ uint32_t CM_RGAM_RAMA_REGION_4_5; -+ uint32_t CM_RGAM_RAMA_REGION_6_7; -+ uint32_t CM_RGAM_RAMA_REGION_8_9; -+ uint32_t CM_RGAM_RAMA_REGION_10_11; -+ uint32_t CM_RGAM_RAMA_REGION_12_13; -+ uint32_t CM_RGAM_RAMA_REGION_14_15; -+ uint32_t CM_RGAM_RAMA_REGION_16_17; -+ uint32_t CM_RGAM_RAMA_REGION_18_19; -+ uint32_t CM_RGAM_RAMA_REGION_20_21; -+ uint32_t CM_RGAM_RAMA_REGION_22_23; -+ uint32_t CM_RGAM_RAMA_REGION_24_25; -+ uint32_t CM_RGAM_RAMA_REGION_26_27; -+ uint32_t CM_RGAM_RAMA_REGION_28_29; -+ uint32_t CM_RGAM_RAMA_REGION_30_31; - uint32_t CM_RGAM_RAMA_REGION_32_33; - uint32_t CM_RGAM_CONTROL; - uint32_t OBUF_CONTROL; -@@ -1199,50 +1366,8 @@ struct dcn_dpp_registers { - uint32_t CM_SHAPER_RAMA_REGION_32_33; - uint32_t CM_SHAPER_LUT_INDEX; - uint32_t CM_SHAPER_LUT_DATA; -- uint32_t CM_ICSC_CONTROL; -- uint32_t CM_ICSC_C11_C12; -- uint32_t CM_ICSC_C33_C34; -- uint32_t CM_DGAM_RAMB_START_CNTL_B; -- uint32_t CM_DGAM_RAMB_START_CNTL_G; -- uint32_t CM_DGAM_RAMB_START_CNTL_R; -- uint32_t CM_DGAM_RAMB_SLOPE_CNTL_B; -- uint32_t CM_DGAM_RAMB_SLOPE_CNTL_G; -- uint32_t CM_DGAM_RAMB_SLOPE_CNTL_R; -- uint32_t CM_DGAM_RAMB_END_CNTL1_B; -- uint32_t CM_DGAM_RAMB_END_CNTL2_B; -- uint32_t CM_DGAM_RAMB_END_CNTL1_G; -- uint32_t CM_DGAM_RAMB_END_CNTL2_G; -- uint32_t CM_DGAM_RAMB_END_CNTL1_R; -- uint32_t CM_DGAM_RAMB_END_CNTL2_R; -- uint32_t CM_DGAM_RAMB_REGION_0_1; -- uint32_t CM_DGAM_RAMB_REGION_14_15; -- uint32_t CM_DGAM_RAMA_START_CNTL_B; -- uint32_t CM_DGAM_RAMA_START_CNTL_G; -- uint32_t CM_DGAM_RAMA_START_CNTL_R; -- uint32_t CM_DGAM_RAMA_SLOPE_CNTL_B; -- uint32_t CM_DGAM_RAMA_SLOPE_CNTL_G; -- uint32_t CM_DGAM_RAMA_SLOPE_CNTL_R; -- uint32_t CM_DGAM_RAMA_END_CNTL1_B; -- uint32_t CM_DGAM_RAMA_END_CNTL2_B; -- uint32_t CM_DGAM_RAMA_END_CNTL1_G; -- uint32_t CM_DGAM_RAMA_END_CNTL2_G; -- uint32_t CM_DGAM_RAMA_END_CNTL1_R; -- uint32_t CM_DGAM_RAMA_END_CNTL2_R; -- uint32_t CM_DGAM_RAMA_REGION_0_1; -- uint32_t CM_DGAM_RAMA_REGION_14_15; -- uint32_t CM_DGAM_LUT_WRITE_EN_MASK; -- uint32_t CM_DGAM_LUT_INDEX; -- uint32_t CM_DGAM_LUT_DATA; -- uint32_t CM_CONTROL; -- uint32_t CM_DGAM_CONTROL; -- uint32_t CM_IGAM_CONTROL; -- uint32_t CM_IGAM_LUT_RW_CONTROL; -- uint32_t CM_IGAM_LUT_RW_INDEX; -- uint32_t CM_IGAM_LUT_SEQ_COLOR; -- uint32_t FORMAT_CONTROL; -- uint32_t CNVC_SURFACE_PIXEL_FORMAT; -- uint32_t CURSOR_CONTROL; -- uint32_t CURSOR0_CONTROL; -+ -+ - }; - - struct dcn10_dpp { -@@ -1261,106 +1386,6 @@ struct dcn10_dpp { - int lb_bits_per_entry; - bool is_write_to_ram_a_safe; - }; -- --enum dcn10_input_csc_select { -- INPUT_CSC_SELECT_BYPASS = 0, -- INPUT_CSC_SELECT_ICSC, -- INPUT_CSC_SELECT_COMA --}; -- --void ippn10_degamma_ram_select( -- struct transform *xfm_base, -- bool use_ram_a); -- --void ippn10_program_degamma_luta_settings( -- struct transform *xfm_base, -- const struct pwl_params *params); -- --void ippn10_program_degamma_lutb_settings( -- struct transform *xfm_base, -- const struct pwl_params *params); -- --void ippn10_program_degamma_lut( -- struct transform *xfm_base, -- const struct pwl_result_data *rgb, -- uint32_t num, -- bool is_ram_a); -- --void ippn10_power_on_degamma_lut( -- struct transform *xfm_base, -- bool power_on); -- --void ippn10_program_input_csc( -- struct transform *xfm_base, -- enum dc_color_space color_space, -- enum dcn10_input_csc_select select); -- --void ippn10_program_input_lut( -- struct transform *xfm_base, -- const struct dc_gamma *gamma); -- --void ippn10_full_bypass(struct transform *xfm_base); -- --void ippn10_set_degamma( -- struct transform *xfm_base, -- enum ipp_degamma_mode mode); -- --void ippn10_set_degamma_pwl(struct transform *xfm_base, -- const struct pwl_params *params); -- --bool dpp_get_optimal_number_of_taps( -- struct transform *xfm, -- struct scaler_data *scl_data, -- const struct scaling_taps *in_taps); -- --void dpp_reset(struct transform *xfm_base); -- --void dcn10_dpp_cm_program_regamma_lut( -- struct transform *xfm_base, -- const struct pwl_result_data *rgb, -- uint32_t num); -- --void dcn10_dpp_cm_power_on_regamma_lut( -- struct transform *xfm_base, -- bool power_on); -- --void dcn10_dpp_cm_configure_regamma_lut( -- struct transform *xfm_base, -- bool is_ram_a); -- --/*program re gamma RAM A*/ --void dcn10_dpp_cm_program_regamma_luta_settings( -- struct transform *xfm_base, -- const struct pwl_params *params); -- --/*program re gamma RAM B*/ --void dcn10_dpp_cm_program_regamma_lutb_settings( -- struct transform *xfm_base, -- const struct pwl_params *params); --void dcn10_dpp_cm_set_output_csc_adjustment( -- struct transform *xfm_base, -- const struct out_csc_color_matrix *tbl_entry); -- --void dcn10_dpp_cm_set_output_csc_default( -- struct transform *xfm_base, -- const struct default_adjustment *default_adjust); -- --void dcn10_dpp_cm_set_gamut_remap( -- struct transform *xfm, -- const struct xfm_grph_csc_adjustment *adjust); -- --void dcn10_dpp_dscl_set_scaler_manual_scale( -- struct transform *xfm_base, -- const struct scaler_data *scl_data); -- --void ippn10_cnv_setup ( -- struct transform *xfm_base, -- enum surface_pixel_format input_format, -- enum expansion_mode mode, -- enum ipp_output_format cnv_out_format); -- --void ippn10_full_bypass(struct transform *xfm_base); -- - bool dcn10_dpp_construct(struct dcn10_dpp *xfm110, - struct dc_context *ctx, - uint32_t inst, -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c -deleted file mode 100644 -index d698fcc..0000000 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c -+++ /dev/null -@@ -1,864 +0,0 @@ --/* -- * Copyright 2016 Advanced Micro Devices, Inc. -- * -- * Permission is hereby granted, free of charge, to any person obtaining a -- * copy of this software and associated documentation files (the "Software"), -- * to deal in the Software without restriction, including without limitation -- * the rights to use, copy, modify, merge, publish, distribute, sublicense, -- * and/or sell copies of the Software, and to permit persons to whom the -- * Software is furnished to do so, subject to the following conditions: -- * -- * The above copyright notice and this permission notice shall be included in -- * all copies or substantial portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR -- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -- * OTHER DEALINGS IN THE SOFTWARE. -- * -- * Authors: AMD -- * -- */ -- --#include "dm_services.h" -- --#include "core_types.h" -- --#include "reg_helper.h" --#include "dcn10_dpp.h" --#include "basics/conversion.h" -- --#define NUM_PHASES 64 --#define HORZ_MAX_TAPS 8 --#define VERT_MAX_TAPS 8 -- --#define BLACK_OFFSET_RGB_Y 0x0 --#define BLACK_OFFSET_CBCR 0x8000 -- --#define REG(reg)\ -- xfm->tf_regs->reg -- --#define CTX \ -- xfm->base.ctx -- --#undef FN --#define FN(reg_name, field_name) \ -- xfm->tf_shift->field_name, xfm->tf_mask->field_name -- --struct dcn10_input_csc_matrix { -- enum dc_color_space color_space; -- uint16_t regval[12]; --}; -- --enum dcn10_coef_filter_type_sel { -- SCL_COEF_LUMA_VERT_FILTER = 0, -- SCL_COEF_LUMA_HORZ_FILTER = 1, -- SCL_COEF_CHROMA_VERT_FILTER = 2, -- SCL_COEF_CHROMA_HORZ_FILTER = 3, -- SCL_COEF_ALPHA_VERT_FILTER = 4, -- SCL_COEF_ALPHA_HORZ_FILTER = 5 --}; -- --enum dscl_autocal_mode { -- AUTOCAL_MODE_OFF = 0, -- -- /* Autocal calculate the scaling ratio and initial phase and the -- * DSCL_MODE_SEL must be set to 1 -- */ -- AUTOCAL_MODE_AUTOSCALE = 1, -- /* Autocal perform auto centering without replication and the -- * DSCL_MODE_SEL must be set to 0 -- */ -- AUTOCAL_MODE_AUTOCENTER = 2, -- /* Autocal perform auto centering and auto replication and the -- * DSCL_MODE_SEL must be set to 0 -- */ -- AUTOCAL_MODE_AUTOREPLICATE = 3 --}; -- --enum dscl_mode_sel { -- DSCL_MODE_SCALING_444_BYPASS = 0, -- DSCL_MODE_SCALING_444_RGB_ENABLE = 1, -- DSCL_MODE_SCALING_444_YCBCR_ENABLE = 2, -- DSCL_MODE_SCALING_420_YCBCR_ENABLE = 3, -- DSCL_MODE_SCALING_420_LUMA_BYPASS = 4, -- DSCL_MODE_SCALING_420_CHROMA_BYPASS = 5, -- DSCL_MODE_DSCL_BYPASS = 6 --}; -- --enum gamut_remap_select { -- GAMUT_REMAP_BYPASS = 0, -- GAMUT_REMAP_COEFF, -- GAMUT_REMAP_COMA_COEFF, -- GAMUT_REMAP_COMB_COEFF --}; -- --static const struct dcn10_input_csc_matrix dcn10_input_csc_matrix[] = { -- {COLOR_SPACE_SRGB, -- {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} }, -- {COLOR_SPACE_SRGB_LIMITED, -- {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} }, -- {COLOR_SPACE_YCBCR601, -- {0x2cdd, 0x2000, 0, 0xe991, 0xe926, 0x2000, 0xf4fd, 0x10ef, -- 0, 0x2000, 0x38b4, 0xe3a6} }, -- {COLOR_SPACE_YCBCR601_LIMITED, -- {0x3353, 0x2568, 0, 0xe400, 0xe5dc, 0x2568, 0xf367, 0x1108, -- 0, 0x2568, 0x40de, 0xdd3a} }, -- {COLOR_SPACE_YCBCR709, -- {0x3265, 0x2000, 0, 0xe6ce, 0xf105, 0x2000, 0xfa01, 0xa7d, 0, -- 0x2000, 0x3b61, 0xe24f} }, -- -- {COLOR_SPACE_YCBCR709_LIMITED, -- {0x39a6, 0x2568, 0, 0xe0d6, 0xeedd, 0x2568, 0xf925, 0x9a8, 0, -- 0x2568, 0x43ee, 0xdbb2} } --}; -- --static void dpp_cm_program_color_registers( -- struct dcn10_dpp *xfm, -- const uint16_t *regval, -- uint32_t cm_reg_start, -- uint32_t cm_reg_end) --{ -- uint32_t reg_region_cur; -- unsigned int i = 0; -- --#undef REG --#define REG(reg) reg -- -- for (reg_region_cur = cm_reg_start; -- reg_region_cur <= cm_reg_end; -- reg_region_cur++) { -- -- const uint16_t *regval0 = &(regval[2 * i]); -- const uint16_t *regval1 = &(regval[(2 * i) + 1]); -- -- REG_SET_2(reg_region_cur, 0, -- CM_GAMUT_REMAP_C11, *regval0, -- CM_GAMUT_REMAP_C12, *regval1); -- -- i++; -- } -- --#undef REG --#define REG(reg)\ -- xfm->tf_regs->reg -- --} -- --static void program_gamut_remap( -- struct dcn10_dpp *xfm, -- const uint16_t *regval, -- enum gamut_remap_select select) --{ -- uint16_t selection = 0; -- -- if (regval == NULL || select == GAMUT_REMAP_BYPASS) { -- REG_SET(CM_GAMUT_REMAP_CONTROL, 0, -- CM_GAMUT_REMAP_MODE, 0); -- return; -- } -- switch (select) { -- case GAMUT_REMAP_COEFF: -- selection = 1; -- break; -- case GAMUT_REMAP_COMA_COEFF: -- selection = 2; -- break; -- case GAMUT_REMAP_COMB_COEFF: -- selection = 3; -- break; -- default: -- break; -- } -- -- -- if (select == GAMUT_REMAP_COEFF) { -- -- dpp_cm_program_color_registers( -- xfm, -- regval, -- REG(CM_GAMUT_REMAP_C11_C12), -- REG(CM_GAMUT_REMAP_C33_C34)); -- -- } else if (select == GAMUT_REMAP_COMA_COEFF) { -- -- dpp_cm_program_color_registers( -- xfm, -- regval, -- REG(CM_COMA_C11_C12), -- REG(CM_COMA_C33_C34)); -- -- } else { -- -- dpp_cm_program_color_registers( -- xfm, -- regval, -- REG(CM_COMB_C11_C12), -- REG(CM_COMB_C33_C34)); -- } -- -- REG_SET( -- CM_GAMUT_REMAP_CONTROL, 0, -- CM_GAMUT_REMAP_MODE, selection); -- --} -- --void dcn10_dpp_cm_set_gamut_remap( -- struct transform *xfm, -- const struct xfm_grph_csc_adjustment *adjust) --{ -- struct dcn10_dpp *dcn_xfm = TO_DCN10_DPP(xfm); -- -- if (adjust->gamut_adjust_type != GRAPHICS_GAMUT_ADJUST_TYPE_SW) -- /* Bypass if type is bypass or hw */ -- program_gamut_remap(dcn_xfm, NULL, GAMUT_REMAP_BYPASS); -- else { -- struct fixed31_32 arr_matrix[12]; -- uint16_t arr_reg_val[12]; -- -- arr_matrix[0] = adjust->temperature_matrix[0]; -- arr_matrix[1] = adjust->temperature_matrix[1]; -- arr_matrix[2] = adjust->temperature_matrix[2]; -- arr_matrix[3] = dal_fixed31_32_zero; -- -- arr_matrix[4] = adjust->temperature_matrix[3]; -- arr_matrix[5] = adjust->temperature_matrix[4]; -- arr_matrix[6] = adjust->temperature_matrix[5]; -- arr_matrix[7] = dal_fixed31_32_zero; -- -- arr_matrix[8] = adjust->temperature_matrix[6]; -- arr_matrix[9] = adjust->temperature_matrix[7]; -- arr_matrix[10] = adjust->temperature_matrix[8]; -- arr_matrix[11] = dal_fixed31_32_zero; -- -- convert_float_matrix( -- arr_reg_val, arr_matrix, 12); -- -- program_gamut_remap(dcn_xfm, arr_reg_val, GAMUT_REMAP_COEFF); -- } --} -- --void dcn10_dpp_cm_set_output_csc_default( -- struct transform *xfm_base, -- const struct default_adjustment *default_adjust) --{ -- -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- uint32_t ocsc_mode = 0; -- -- if (default_adjust != NULL) { -- switch (default_adjust->out_color_space) { -- case COLOR_SPACE_SRGB: -- case COLOR_SPACE_2020_RGB_FULLRANGE: -- ocsc_mode = 0; -- break; -- case COLOR_SPACE_SRGB_LIMITED: -- case COLOR_SPACE_2020_RGB_LIMITEDRANGE: -- ocsc_mode = 1; -- break; -- case COLOR_SPACE_YCBCR601: -- case COLOR_SPACE_YCBCR601_LIMITED: -- ocsc_mode = 2; -- break; -- case COLOR_SPACE_YCBCR709: -- case COLOR_SPACE_YCBCR709_LIMITED: -- case COLOR_SPACE_2020_YCBCR: -- ocsc_mode = 3; -- break; -- case COLOR_SPACE_UNKNOWN: -- default: -- break; -- } -- } -- -- REG_SET(CM_OCSC_CONTROL, 0, CM_OCSC_MODE, ocsc_mode); -- --} -- --static void dcn10_dpp_cm_program_color_matrix( -- struct dcn10_dpp *xfm, -- const struct out_csc_color_matrix *tbl_entry) --{ -- uint32_t mode; -- -- REG_GET(CM_OCSC_CONTROL, CM_OCSC_MODE, &mode); -- -- if (tbl_entry == NULL) { -- BREAK_TO_DEBUGGER(); -- return; -- } -- -- if (mode == 4) { -- -- dpp_cm_program_color_registers( -- xfm, -- tbl_entry->regval, -- REG(CM_OCSC_C11_C12), -- REG(CM_OCSC_C33_C34)); -- -- } else { -- -- dpp_cm_program_color_registers( -- xfm, -- tbl_entry->regval, -- REG(CM_COMB_C11_C12), -- REG(CM_COMB_C33_C34)); -- } --} -- --void dcn10_dpp_cm_set_output_csc_adjustment( -- struct transform *xfm_base, -- const struct out_csc_color_matrix *tbl_entry) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- //enum csc_color_mode config = CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC; -- uint32_t ocsc_mode = 4; -- -- /** -- *if (tbl_entry != NULL) { -- * switch (tbl_entry->color_space) { -- * case COLOR_SPACE_SRGB: -- * case COLOR_SPACE_2020_RGB_FULLRANGE: -- * ocsc_mode = 0; -- * break; -- * case COLOR_SPACE_SRGB_LIMITED: -- * case COLOR_SPACE_2020_RGB_LIMITEDRANGE: -- * ocsc_mode = 1; -- * break; -- * case COLOR_SPACE_YCBCR601: -- * case COLOR_SPACE_YCBCR601_LIMITED: -- * ocsc_mode = 2; -- * break; -- * case COLOR_SPACE_YCBCR709: -- * case COLOR_SPACE_YCBCR709_LIMITED: -- * case COLOR_SPACE_2020_YCBCR: -- * ocsc_mode = 3; -- * break; -- * case COLOR_SPACE_UNKNOWN: -- * default: -- * break; -- * } -- *} -- */ -- -- REG_SET(CM_OCSC_CONTROL, 0, CM_OCSC_MODE, ocsc_mode); -- dcn10_dpp_cm_program_color_matrix(xfm, tbl_entry); --} -- --void dcn10_dpp_cm_power_on_regamma_lut( -- struct transform *xfm_base, -- bool power_on) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- REG_SET(CM_MEM_PWR_CTRL, 0, -- RGAM_MEM_PWR_FORCE, power_on == true ? 0:1); -- --} -- --void dcn10_dpp_cm_program_regamma_lut( -- struct transform *xfm_base, -- const struct pwl_result_data *rgb, -- uint32_t num) --{ -- uint32_t i; -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- for (i = 0 ; i < num; i++) { -- REG_SET(CM_RGAM_LUT_DATA, 0, CM_RGAM_LUT_DATA, rgb[i].red_reg); -- REG_SET(CM_RGAM_LUT_DATA, 0, CM_RGAM_LUT_DATA, rgb[i].green_reg); -- REG_SET(CM_RGAM_LUT_DATA, 0, CM_RGAM_LUT_DATA, rgb[i].blue_reg); -- -- REG_SET(CM_RGAM_LUT_DATA, 0, -- CM_RGAM_LUT_DATA, rgb[i].delta_red_reg); -- REG_SET(CM_RGAM_LUT_DATA, 0, -- CM_RGAM_LUT_DATA, rgb[i].delta_green_reg); -- REG_SET(CM_RGAM_LUT_DATA, 0, -- CM_RGAM_LUT_DATA, rgb[i].delta_blue_reg); -- -- } -- --} -- --void dcn10_dpp_cm_configure_regamma_lut( -- struct transform *xfm_base, -- bool is_ram_a) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- -- REG_UPDATE(CM_RGAM_LUT_WRITE_EN_MASK, -- CM_RGAM_LUT_WRITE_EN_MASK, 7); -- REG_UPDATE(CM_RGAM_LUT_WRITE_EN_MASK, -- CM_RGAM_LUT_WRITE_SEL, is_ram_a == true ? 0:1); -- REG_SET(CM_RGAM_LUT_INDEX, 0, CM_RGAM_LUT_INDEX, 0); --} -- --struct cm_gam_ram_reg { -- uint32_t start_cntl_b; -- uint32_t start_cntl_g; -- uint32_t start_cntl_r; -- uint32_t start_slope_cntl_b; -- uint32_t start_slope_cntl_g; -- uint32_t start_slope_cntl_r; -- uint32_t start_end_cntl1_b; -- uint32_t start_end_cntl2_b; -- uint32_t start_end_cntl1_g; -- uint32_t start_end_cntl2_g; -- uint32_t start_end_cntl1_r; -- uint32_t start_end_cntl2_r; -- uint32_t region_start; -- uint32_t region_end; --}; -- --static void dpp_cm_program_region_lut( -- struct transform *xfm_base, -- const struct pwl_params *params, -- const struct cm_gam_ram_reg *reg) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- uint32_t reg_region_cur; -- unsigned int i = 0; -- --#undef REG --#define REG(reg) reg -- -- REG_SET_2(reg->start_cntl_b, 0, -- CM_RGAM_RAMA_EXP_REGION_START_B, params->arr_points[0].custom_float_x, -- CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_B, 0); -- REG_SET_2(reg->start_cntl_g, 0, -- CM_RGAM_RAMA_EXP_REGION_START_G, params->arr_points[0].custom_float_x, -- CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_G, 0); -- REG_SET_2(reg->start_cntl_r, 0, -- CM_RGAM_RAMA_EXP_REGION_START_R, params->arr_points[0].custom_float_x, -- CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_R, 0); -- -- REG_SET(reg->start_slope_cntl_b, 0, -- CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B, params->arr_points[0].custom_float_slope); -- REG_SET(reg->start_slope_cntl_g, 0, -- CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G, params->arr_points[0].custom_float_slope); -- REG_SET(reg->start_slope_cntl_r, 0, -- CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R, params->arr_points[0].custom_float_slope); -- -- REG_SET(reg->start_end_cntl1_b, 0, -- CM_RGAM_RAMA_EXP_REGION_END_B, params->arr_points[1].custom_float_x); -- REG_SET_2(reg->start_end_cntl2_b, 0, -- CM_RGAM_RAMA_EXP_REGION_END_SLOPE_B, params->arr_points[1].custom_float_slope, -- CM_RGAM_RAMA_EXP_REGION_END_BASE_B, params->arr_points[1].custom_float_y); -- -- REG_SET(reg->start_end_cntl1_g, 0, -- CM_RGAM_RAMA_EXP_REGION_END_G, params->arr_points[1].custom_float_x); -- REG_SET_2(reg->start_end_cntl2_g, 0, -- CM_RGAM_RAMA_EXP_REGION_END_SLOPE_G, params->arr_points[1].custom_float_slope, -- CM_RGAM_RAMA_EXP_REGION_END_BASE_G, params->arr_points[1].custom_float_y); -- -- REG_SET(reg->start_end_cntl1_r, 0, -- CM_RGAM_RAMA_EXP_REGION_END_R, params->arr_points[1].custom_float_x); -- REG_SET_2(reg->start_end_cntl2_r, 0, -- CM_RGAM_RAMA_EXP_REGION_END_SLOPE_R, params->arr_points[1].custom_float_slope, -- CM_RGAM_RAMA_EXP_REGION_END_BASE_R, params->arr_points[1].custom_float_y); -- -- for (reg_region_cur = reg->region_start; -- reg_region_cur <= reg->region_end; -- reg_region_cur++) { -- -- const struct gamma_curve *curve0 = &(params->arr_curve_points[2 * i]); -- const struct gamma_curve *curve1 = &(params->arr_curve_points[(2 * i) + 1]); -- -- REG_SET_4(reg_region_cur, 0, -- CM_RGAM_RAMA_EXP_REGION0_LUT_OFFSET, curve0->offset, -- CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, curve0->segments_num, -- CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET, curve1->offset, -- CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, curve1->segments_num); -- -- i++; -- } -- --#undef REG --#define REG(reg)\ -- xfm->tf_regs->reg -- --} -- -- -- --/*program re gamma RAM A*/ --void dcn10_dpp_cm_program_regamma_luta_settings( -- struct transform *xfm_base, -- const struct pwl_params *params) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- struct cm_gam_ram_reg gam_regs; -- -- gam_regs.start_cntl_b = REG(CM_RGAM_RAMA_START_CNTL_B); -- gam_regs.start_cntl_g = REG(CM_RGAM_RAMA_START_CNTL_G); -- gam_regs.start_cntl_r = REG(CM_RGAM_RAMA_START_CNTL_R); -- gam_regs.start_slope_cntl_b = REG(CM_RGAM_RAMA_SLOPE_CNTL_B); -- gam_regs.start_slope_cntl_g = REG(CM_RGAM_RAMA_SLOPE_CNTL_G); -- gam_regs.start_slope_cntl_r = REG(CM_RGAM_RAMA_SLOPE_CNTL_R); -- gam_regs.start_end_cntl1_b = REG(CM_RGAM_RAMA_END_CNTL1_B); -- gam_regs.start_end_cntl2_b = REG(CM_RGAM_RAMA_END_CNTL2_B); -- gam_regs.start_end_cntl1_g = REG(CM_RGAM_RAMA_END_CNTL1_G); -- gam_regs.start_end_cntl2_g = REG(CM_RGAM_RAMA_END_CNTL2_G); -- gam_regs.start_end_cntl1_r = REG(CM_RGAM_RAMA_END_CNTL1_R); -- gam_regs.start_end_cntl2_r = REG(CM_RGAM_RAMA_END_CNTL2_R); -- gam_regs.region_start = REG(CM_RGAM_RAMA_REGION_0_1); -- gam_regs.region_end = REG(CM_RGAM_RAMA_REGION_32_33); -- -- dpp_cm_program_region_lut(xfm_base, params, &gam_regs); -- --} -- --/*program re gamma RAM B*/ --void dcn10_dpp_cm_program_regamma_lutb_settings( -- struct transform *xfm_base, -- const struct pwl_params *params) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- struct cm_gam_ram_reg gam_regs; -- -- gam_regs.start_cntl_b = REG(CM_RGAM_RAMB_START_CNTL_B); -- gam_regs.start_cntl_g = REG(CM_RGAM_RAMB_START_CNTL_G); -- gam_regs.start_cntl_r = REG(CM_RGAM_RAMB_START_CNTL_R); -- gam_regs.start_slope_cntl_b = REG(CM_RGAM_RAMB_SLOPE_CNTL_B); -- gam_regs.start_slope_cntl_g = REG(CM_RGAM_RAMB_SLOPE_CNTL_G); -- gam_regs.start_slope_cntl_r = REG(CM_RGAM_RAMB_SLOPE_CNTL_R); -- gam_regs.start_end_cntl1_b = REG(CM_RGAM_RAMB_END_CNTL1_B); -- gam_regs.start_end_cntl2_b = REG(CM_RGAM_RAMB_END_CNTL2_B); -- gam_regs.start_end_cntl1_g = REG(CM_RGAM_RAMB_END_CNTL1_G); -- gam_regs.start_end_cntl2_g = REG(CM_RGAM_RAMB_END_CNTL2_G); -- gam_regs.start_end_cntl1_r = REG(CM_RGAM_RAMB_END_CNTL1_R); -- gam_regs.start_end_cntl2_r = REG(CM_RGAM_RAMB_END_CNTL2_R); -- gam_regs.region_start = REG(CM_RGAM_RAMB_REGION_0_1); -- gam_regs.region_end = REG(CM_RGAM_RAMB_REGION_32_33); -- -- dpp_cm_program_region_lut(xfm_base, params, &gam_regs); --} -- --void ippn10_program_input_csc( -- struct transform *xfm_base, -- enum dc_color_space color_space, -- enum dcn10_input_csc_select select) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- int i; -- int arr_size = sizeof(dcn10_input_csc_matrix)/sizeof(struct dcn10_input_csc_matrix); -- const uint16_t *regval = NULL; -- uint32_t selection = 1; -- -- if (select == INPUT_CSC_SELECT_BYPASS) { -- REG_SET(CM_ICSC_CONTROL, 0, CM_ICSC_MODE, 0); -- return; -- } -- -- for (i = 0; i < arr_size; i++) -- if (dcn10_input_csc_matrix[i].color_space == color_space) { -- regval = dcn10_input_csc_matrix[i].regval; -- break; -- } -- -- if (regval == NULL) { -- BREAK_TO_DEBUGGER(); -- return; -- } -- -- if (select == INPUT_CSC_SELECT_COMA) -- selection = 2; -- REG_SET(CM_ICSC_CONTROL, 0, -- CM_ICSC_MODE, selection); -- -- if (select == INPUT_CSC_SELECT_ICSC) { -- -- dpp_cm_program_color_registers( -- xfm, -- regval, -- REG(CM_ICSC_C11_C12), -- REG(CM_ICSC_C33_C34)); -- } else { -- -- dpp_cm_program_color_registers( -- xfm, -- regval, -- REG(CM_COMA_C11_C12), -- REG(CM_COMA_C33_C34)); -- } --} -- --/*program de gamma RAM B*/ --void ippn10_program_degamma_lutb_settings( -- struct transform *xfm_base, -- const struct pwl_params *params) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- struct cm_gam_ram_reg gam_regs; -- -- gam_regs.start_cntl_b = REG(CM_DGAM_RAMB_START_CNTL_B); -- gam_regs.start_cntl_g = REG(CM_DGAM_RAMB_START_CNTL_G); -- gam_regs.start_cntl_r = REG(CM_DGAM_RAMB_START_CNTL_R); -- gam_regs.start_slope_cntl_b = REG(CM_DGAM_RAMB_SLOPE_CNTL_B); -- gam_regs.start_slope_cntl_g = REG(CM_DGAM_RAMB_SLOPE_CNTL_G); -- gam_regs.start_slope_cntl_r = REG(CM_DGAM_RAMB_SLOPE_CNTL_R); -- gam_regs.start_end_cntl1_b = REG(CM_DGAM_RAMB_END_CNTL1_B); -- gam_regs.start_end_cntl2_b = REG(CM_DGAM_RAMB_END_CNTL2_B); -- gam_regs.start_end_cntl1_g = REG(CM_DGAM_RAMB_END_CNTL1_G); -- gam_regs.start_end_cntl2_g = REG(CM_DGAM_RAMB_END_CNTL2_G); -- gam_regs.start_end_cntl1_r = REG(CM_DGAM_RAMB_END_CNTL1_R); -- gam_regs.start_end_cntl2_r = REG(CM_DGAM_RAMB_END_CNTL2_R); -- gam_regs.region_start = REG(CM_DGAM_RAMB_REGION_0_1); -- gam_regs.region_end = REG(CM_DGAM_RAMB_REGION_14_15); -- -- dpp_cm_program_region_lut(xfm_base, params, &gam_regs); --} -- --/*program de gamma RAM A*/ --void ippn10_program_degamma_luta_settings( -- struct transform *xfm_base, -- const struct pwl_params *params) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- struct cm_gam_ram_reg gam_regs; -- -- gam_regs.start_cntl_b = REG(CM_DGAM_RAMA_START_CNTL_B); -- gam_regs.start_cntl_g = REG(CM_DGAM_RAMA_START_CNTL_G); -- gam_regs.start_cntl_r = REG(CM_DGAM_RAMA_START_CNTL_R); -- gam_regs.start_slope_cntl_b = REG(CM_DGAM_RAMA_SLOPE_CNTL_B); -- gam_regs.start_slope_cntl_g = REG(CM_DGAM_RAMA_SLOPE_CNTL_G); -- gam_regs.start_slope_cntl_r = REG(CM_DGAM_RAMA_SLOPE_CNTL_R); -- gam_regs.start_end_cntl1_b = REG(CM_DGAM_RAMA_END_CNTL1_B); -- gam_regs.start_end_cntl2_b = REG(CM_DGAM_RAMA_END_CNTL2_B); -- gam_regs.start_end_cntl1_g = REG(CM_DGAM_RAMA_END_CNTL1_G); -- gam_regs.start_end_cntl2_g = REG(CM_DGAM_RAMA_END_CNTL2_G); -- gam_regs.start_end_cntl1_r = REG(CM_DGAM_RAMA_END_CNTL1_R); -- gam_regs.start_end_cntl2_r = REG(CM_DGAM_RAMA_END_CNTL2_R); -- gam_regs.region_start = REG(CM_DGAM_RAMA_REGION_0_1); -- gam_regs.region_end = REG(CM_DGAM_RAMA_REGION_14_15); -- -- dpp_cm_program_region_lut(xfm_base, params, &gam_regs); --} -- --void ippn10_power_on_degamma_lut( -- struct transform *xfm_base, -- bool power_on) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- -- REG_SET(CM_MEM_PWR_CTRL, 0, -- SHARED_MEM_PWR_DIS, power_on == true ? 0:1); -- --} -- --static void ippn10_enable_cm_block( -- struct transform *xfm_base) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- -- REG_UPDATE(CM_CONTROL, CM_BYPASS_EN, 0); --} -- --void ippn10_set_degamma( -- struct transform *xfm_base, -- enum ipp_degamma_mode mode) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- ippn10_enable_cm_block(xfm_base); -- -- switch (mode) { -- case IPP_DEGAMMA_MODE_BYPASS: -- /* Setting de gamma bypass for now */ -- REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 0); -- break; -- case IPP_DEGAMMA_MODE_HW_sRGB: -- REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 1); -- break; -- case IPP_DEGAMMA_MODE_HW_xvYCC: -- REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 2); -- break; -- default: -- BREAK_TO_DEBUGGER(); -- break; -- } --} -- --void ippn10_degamma_ram_select( -- struct transform *xfm_base, -- bool use_ram_a) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- -- if (use_ram_a) -- REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 3); -- else -- REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 4); -- --} -- --static bool ippn10_degamma_ram_inuse( -- struct transform *xfm_base, -- bool *ram_a_inuse) --{ -- bool ret = false; -- uint32_t status_reg = 0; -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- -- REG_GET(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_DGAM_CONFIG_STATUS, -- &status_reg); -- -- if (status_reg == 9) { -- *ram_a_inuse = true; -- ret = true; -- } else if (status_reg == 10) { -- *ram_a_inuse = false; -- ret = true; -- } -- return ret; --} -- --void ippn10_program_degamma_lut( -- struct transform *xfm_base, -- const struct pwl_result_data *rgb, -- uint32_t num, -- bool is_ram_a) --{ -- uint32_t i; -- -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_HOST_EN, 0); -- REG_UPDATE(CM_DGAM_LUT_WRITE_EN_MASK, -- CM_DGAM_LUT_WRITE_EN_MASK, 7); -- REG_UPDATE(CM_DGAM_LUT_WRITE_EN_MASK, CM_DGAM_LUT_WRITE_SEL, -- is_ram_a == true ? 0:1); -- -- REG_SET(CM_DGAM_LUT_INDEX, 0, CM_DGAM_LUT_INDEX, 0); -- for (i = 0 ; i < num; i++) { -- REG_SET(CM_DGAM_LUT_DATA, 0, CM_DGAM_LUT_DATA, rgb[i].red_reg); -- REG_SET(CM_DGAM_LUT_DATA, 0, CM_DGAM_LUT_DATA, rgb[i].green_reg); -- REG_SET(CM_DGAM_LUT_DATA, 0, CM_DGAM_LUT_DATA, rgb[i].blue_reg); -- -- REG_SET(CM_DGAM_LUT_DATA, 0, -- CM_DGAM_LUT_DATA, rgb[i].delta_red_reg); -- REG_SET(CM_DGAM_LUT_DATA, 0, -- CM_DGAM_LUT_DATA, rgb[i].delta_green_reg); -- REG_SET(CM_DGAM_LUT_DATA, 0, -- CM_DGAM_LUT_DATA, rgb[i].delta_blue_reg); -- } --} -- --void ippn10_set_degamma_pwl(struct transform *xfm_base, -- const struct pwl_params *params) --{ -- bool is_ram_a = true; -- -- ippn10_power_on_degamma_lut(xfm_base, true); -- ippn10_enable_cm_block(xfm_base); -- ippn10_degamma_ram_inuse(xfm_base, &is_ram_a); -- if (is_ram_a == true) -- ippn10_program_degamma_lutb_settings(xfm_base, params); -- else -- ippn10_program_degamma_luta_settings(xfm_base, params); -- -- ippn10_program_degamma_lut(xfm_base, params->rgb_resulted, -- params->hw_points_num, !is_ram_a); -- ippn10_degamma_ram_select(xfm_base, !is_ram_a); --} -- --void ippn10_full_bypass(struct transform *xfm_base) --{ -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- -- /* Input pixel format: ARGB8888 */ -- REG_SET(CNVC_SURFACE_PIXEL_FORMAT, 0, -- CNVC_SURFACE_PIXEL_FORMAT, 0x8); -- -- /* Zero expansion */ -- REG_SET_3(FORMAT_CONTROL, 0, -- CNVC_BYPASS, 0, -- FORMAT_CONTROL__ALPHA_EN, 0, -- FORMAT_EXPANSION_MODE, 0); -- -- /* COLOR_KEYER_CONTROL.COLOR_KEYER_EN = 0 this should be default */ -- REG_SET(CM_CONTROL, 0, CM_BYPASS_EN, 1); -- -- /* Setting degamma bypass for now */ -- REG_SET(CM_DGAM_CONTROL, 0, CM_DGAM_LUT_MODE, 0); -- REG_SET(CM_IGAM_CONTROL, 0, CM_IGAM_LUT_MODE, 0); --} -- --static bool ippn10_ingamma_ram_inuse(struct transform *xfm_base, -- bool *ram_a_inuse) --{ -- bool in_use = false; -- uint32_t status_reg = 0; -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- -- REG_GET(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_DGAM_CONFIG_STATUS, -- &status_reg); -- -- // 1 => IGAM_RAMA, 3 => IGAM_RAMA & DGAM_ROMA, 4 => IGAM_RAMA & DGAM_ROMB -- if (status_reg == 1 || status_reg == 3 || status_reg == 4) { -- *ram_a_inuse = true; -- in_use = true; -- // 2 => IGAM_RAMB, 5 => IGAM_RAMB & DGAM_ROMA, 6 => IGAM_RAMB & DGAM_ROMB -- } else if (status_reg == 2 || status_reg == 5 || status_reg == 6) { -- *ram_a_inuse = false; -- in_use = true; -- } -- return in_use; --} -- --/* -- * Input gamma LUT currently supports 256 values only. This means input color -- * can have a maximum of 8 bits per channel (= 256 possible values) in order to -- * have a one-to-one mapping with the LUT. Truncation will occur with color -- * values greater than 8 bits. -- * -- * In the future, this function should support additional input gamma methods, -- * such as piecewise linear mapping, and input gamma bypass. -- */ --void ippn10_program_input_lut( -- struct transform *xfm_base, -- const struct dc_gamma *gamma) --{ -- int i; -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- bool rama_occupied = false; -- uint32_t ram_num; -- // Power on LUT memory. -- REG_SET(CM_MEM_PWR_CTRL, 0, SHARED_MEM_PWR_DIS, 1); -- ippn10_enable_cm_block(xfm_base); -- // Determine whether to use RAM A or RAM B -- ippn10_ingamma_ram_inuse(xfm_base, &rama_occupied); -- if (!rama_occupied) -- REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_SEL, 0); -- else -- REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_SEL, 1); -- // RW mode is 256-entry LUT -- REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_RW_MODE, 0); -- // IGAM Input format should be 8 bits per channel. -- REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, 0); -- // Do not mask any R,G,B values -- REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_WRITE_EN_MASK, 7); -- // LUT-256, unsigned, integer, new u0.12 format -- REG_UPDATE_3( -- CM_IGAM_CONTROL, -- CM_IGAM_LUT_FORMAT_R, 3, -- CM_IGAM_LUT_FORMAT_G, 3, -- CM_IGAM_LUT_FORMAT_B, 3); -- // Start at index 0 of IGAM LUT -- REG_UPDATE(CM_IGAM_LUT_RW_INDEX, CM_IGAM_LUT_RW_INDEX, 0); -- for (i = 0; i < gamma->num_entries; i++) { -- REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR, -- dal_fixed31_32_round( -- gamma->entries.red[i])); -- REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR, -- dal_fixed31_32_round( -- gamma->entries.green[i])); -- REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR, -- dal_fixed31_32_round( -- gamma->entries.blue[i])); -- } -- // Power off LUT memory -- REG_SET(CM_MEM_PWR_CTRL, 0, SHARED_MEM_PWR_DIS, 0); -- // Enable IGAM LUT on ram we just wrote to. 2 => RAMA, 3 => RAMB -- REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, rama_occupied ? 3 : 2); -- REG_GET(CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, &ram_num); --} -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c -deleted file mode 100644 -index b62cb38..0000000 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c -+++ /dev/null -@@ -1,710 +0,0 @@ --/* -- * Copyright 2016 Advanced Micro Devices, Inc. -- * -- * Permission is hereby granted, free of charge, to any person obtaining a -- * copy of this software and associated documentation files (the "Software"), -- * to deal in the Software without restriction, including without limitation -- * the rights to use, copy, modify, merge, publish, distribute, sublicense, -- * and/or sell copies of the Software, and to permit persons to whom the -- * Software is furnished to do so, subject to the following conditions: -- * -- * The above copyright notice and this permission notice shall be included in -- * all copies or substantial portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR -- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -- * OTHER DEALINGS IN THE SOFTWARE. -- * -- * Authors: AMD -- * -- */ -- --#include "dm_services.h" -- --#include "core_types.h" -- --#include "reg_helper.h" --#include "dcn10_dpp.h" --#include "basics/conversion.h" -- --#define NUM_PHASES 64 --#define HORZ_MAX_TAPS 8 --#define VERT_MAX_TAPS 8 -- --#define BLACK_OFFSET_RGB_Y 0x0 --#define BLACK_OFFSET_CBCR 0x8000 -- --#define REG(reg)\ -- xfm->tf_regs->reg -- --#define CTX \ -- xfm->base.ctx -- --#undef FN --#define FN(reg_name, field_name) \ -- xfm->tf_shift->field_name, xfm->tf_mask->field_name -- --enum dcn10_coef_filter_type_sel { -- SCL_COEF_LUMA_VERT_FILTER = 0, -- SCL_COEF_LUMA_HORZ_FILTER = 1, -- SCL_COEF_CHROMA_VERT_FILTER = 2, -- SCL_COEF_CHROMA_HORZ_FILTER = 3, -- SCL_COEF_ALPHA_VERT_FILTER = 4, -- SCL_COEF_ALPHA_HORZ_FILTER = 5 --}; -- --enum lb_memory_config { -- /* Enable all 3 pieces of memory */ -- LB_MEMORY_CONFIG_0 = 0, -- -- /* Enable only the first piece of memory */ -- LB_MEMORY_CONFIG_1 = 1, -- -- /* Enable only the second piece of memory */ -- LB_MEMORY_CONFIG_2 = 2, -- -- /* Only applicable in 4:2:0 mode, enable all 3 pieces of memory and the -- * last piece of chroma memory used for the luma storage -- */ -- LB_MEMORY_CONFIG_3 = 3 --}; -- --enum dscl_autocal_mode { -- AUTOCAL_MODE_OFF = 0, -- -- /* Autocal calculate the scaling ratio and initial phase and the -- * DSCL_MODE_SEL must be set to 1 -- */ -- AUTOCAL_MODE_AUTOSCALE = 1, -- /* Autocal perform auto centering without replication and the -- * DSCL_MODE_SEL must be set to 0 -- */ -- AUTOCAL_MODE_AUTOCENTER = 2, -- /* Autocal perform auto centering and auto replication and the -- * DSCL_MODE_SEL must be set to 0 -- */ -- AUTOCAL_MODE_AUTOREPLICATE = 3 --}; -- --enum dscl_mode_sel { -- DSCL_MODE_SCALING_444_BYPASS = 0, -- DSCL_MODE_SCALING_444_RGB_ENABLE = 1, -- DSCL_MODE_SCALING_444_YCBCR_ENABLE = 2, -- DSCL_MODE_SCALING_420_YCBCR_ENABLE = 3, -- DSCL_MODE_SCALING_420_LUMA_BYPASS = 4, -- DSCL_MODE_SCALING_420_CHROMA_BYPASS = 5, -- DSCL_MODE_DSCL_BYPASS = 6 --}; -- --static void dpp_set_overscan( -- struct dcn10_dpp *xfm, -- const struct scaler_data *data) --{ -- uint32_t left = data->recout.x; -- uint32_t top = data->recout.y; -- -- int right = data->h_active - data->recout.x - data->recout.width; -- int bottom = data->v_active - data->recout.y - data->recout.height; -- -- if (right < 0) { -- BREAK_TO_DEBUGGER(); -- right = 0; -- } -- if (bottom < 0) { -- BREAK_TO_DEBUGGER(); -- bottom = 0; -- } -- -- REG_SET_2(DSCL_EXT_OVERSCAN_LEFT_RIGHT, 0, -- EXT_OVERSCAN_LEFT, left, -- EXT_OVERSCAN_RIGHT, right); -- -- REG_SET_2(DSCL_EXT_OVERSCAN_TOP_BOTTOM, 0, -- EXT_OVERSCAN_BOTTOM, bottom, -- EXT_OVERSCAN_TOP, top); --} -- --static void dpp_set_otg_blank( -- struct dcn10_dpp *xfm, const struct scaler_data *data) --{ -- uint32_t h_blank_start = data->h_active; -- uint32_t h_blank_end = 0; -- uint32_t v_blank_start = data->v_active; -- uint32_t v_blank_end = 0; -- -- REG_SET_2(OTG_H_BLANK, 0, -- OTG_H_BLANK_START, h_blank_start, -- OTG_H_BLANK_END, h_blank_end); -- -- REG_SET_2(OTG_V_BLANK, 0, -- OTG_V_BLANK_START, v_blank_start, -- OTG_V_BLANK_END, v_blank_end); --} -- --static int get_pixel_depth_val(enum lb_pixel_depth depth) --{ -- if (depth == LB_PIXEL_DEPTH_30BPP) -- return 0; /* 10 bpc */ -- else if (depth == LB_PIXEL_DEPTH_24BPP) -- return 1; /* 8 bpc */ -- else if (depth == LB_PIXEL_DEPTH_18BPP) -- return 2; /* 6 bpc */ -- else if (depth == LB_PIXEL_DEPTH_36BPP) -- return 3; /* 12 bpc */ -- else { -- ASSERT(0); -- return -1; /* Unsupported */ -- } --} -- --static enum dscl_mode_sel get_dscl_mode( -- const struct scaler_data *data, bool dbg_always_scale) --{ -- const long long one = dal_fixed31_32_one.value; -- bool ycbcr = false; -- bool format420 = false; -- -- if (data->format == PIXEL_FORMAT_FP16) -- return DSCL_MODE_DSCL_BYPASS; -- -- if (data->format >= PIXEL_FORMAT_VIDEO_BEGIN -- && data->format <= PIXEL_FORMAT_VIDEO_END) -- ycbcr = true; -- -- if (data->format == PIXEL_FORMAT_420BPP8 || -- data->format == PIXEL_FORMAT_420BPP10) -- format420 = true; -- -- if (data->ratios.horz.value == one -- && data->ratios.vert.value == one -- && data->ratios.horz_c.value == one -- && data->ratios.vert_c.value == one -- && !dbg_always_scale) -- return DSCL_MODE_SCALING_444_BYPASS; -- -- if (!format420) { -- if (ycbcr) -- return DSCL_MODE_SCALING_444_YCBCR_ENABLE; -- else -- return DSCL_MODE_SCALING_444_RGB_ENABLE; -- } -- if (data->ratios.horz.value == one && data->ratios.vert.value == one) -- return DSCL_MODE_SCALING_420_LUMA_BYPASS; -- if (data->ratios.horz_c.value == one && data->ratios.vert_c.value == one) -- return DSCL_MODE_SCALING_420_CHROMA_BYPASS; -- -- return DSCL_MODE_SCALING_420_YCBCR_ENABLE; --} -- --static void dpp_set_lb( -- struct dcn10_dpp *xfm, -- const struct line_buffer_params *lb_params, -- enum lb_memory_config mem_size_config) --{ -- uint32_t pixel_depth = get_pixel_depth_val(lb_params->depth); -- uint32_t dyn_pix_depth = lb_params->dynamic_pixel_depth; -- -- /* LB */ -- if (xfm->tf_mask->PIXEL_DEPTH) { -- REG_SET_7(LB_DATA_FORMAT, 0, -- PIXEL_DEPTH, pixel_depth, /* Pixel depth stored in LB */ -- PIXEL_EXPAN_MODE, lb_params->pixel_expan_mode, /* Pixel expansion mode */ -- PIXEL_REDUCE_MODE, 1, /* Pixel reduction mode: Rounding */ -- DYNAMIC_PIXEL_DEPTH, dyn_pix_depth, /* Dynamic expansion pixel depth */ -- DITHER_EN, 0, /* Dithering enable: Disabled */ -- INTERLEAVE_EN, lb_params->interleave_en, /* Interleave source enable */ -- LB_DATA_FORMAT__ALPHA_EN, lb_params->alpha_en); /* Alpha enable */ -- } -- -- REG_SET_2(LB_MEMORY_CTRL, 0, -- MEMORY_CONFIG, mem_size_config, -- LB_MAX_PARTITIONS, 63); --} -- --static const uint16_t *get_filter_coeffs_64p(int taps, struct fixed31_32 ratio) --{ -- if (taps == 8) -- return get_filter_8tap_64p(ratio); -- else if (taps == 7) -- return get_filter_7tap_64p(ratio); -- else if (taps == 6) -- return get_filter_6tap_64p(ratio); -- else if (taps == 5) -- return get_filter_5tap_64p(ratio); -- else if (taps == 4) -- return get_filter_4tap_64p(ratio); -- else if (taps == 3) -- return get_filter_3tap_64p(ratio); -- else if (taps == 2) -- return filter_2tap_64p; -- else if (taps == 1) -- return NULL; -- else { -- /* should never happen, bug */ -- BREAK_TO_DEBUGGER(); -- return NULL; -- } --} -- --static void dpp_set_scaler_filter( -- struct dcn10_dpp *xfm, -- uint32_t taps, -- enum dcn10_coef_filter_type_sel filter_type, -- const uint16_t *filter) --{ -- const int tap_pairs = (taps + 1) / 2; -- int phase; -- int pair; -- uint16_t odd_coef, even_coef; -- -- REG_SET_3(SCL_COEF_RAM_TAP_SELECT, 0, -- SCL_COEF_RAM_TAP_PAIR_IDX, 0, -- SCL_COEF_RAM_PHASE, 0, -- SCL_COEF_RAM_FILTER_TYPE, filter_type); -- -- for (phase = 0; phase < (NUM_PHASES / 2 + 1); phase++) { -- for (pair = 0; pair < tap_pairs; pair++) { -- even_coef = filter[phase * taps + 2 * pair]; -- if ((pair * 2 + 1) < taps) -- odd_coef = filter[phase * taps + 2 * pair + 1]; -- else -- odd_coef = 0; -- -- REG_SET_4(SCL_COEF_RAM_TAP_DATA, 0, -- /* Even tap coefficient (bits 1:0 fixed to 0) */ -- SCL_COEF_RAM_EVEN_TAP_COEF, even_coef, -- /* Write/read control for even coefficient */ -- SCL_COEF_RAM_EVEN_TAP_COEF_EN, 1, -- /* Odd tap coefficient (bits 1:0 fixed to 0) */ -- SCL_COEF_RAM_ODD_TAP_COEF, odd_coef, -- /* Write/read control for odd coefficient */ -- SCL_COEF_RAM_ODD_TAP_COEF_EN, 1); -- } -- } -- --} -- --static void dpp_set_scl_filter( -- struct dcn10_dpp *xfm, -- const struct scaler_data *scl_data, -- bool chroma_coef_mode) --{ -- bool h_2tap_hardcode_coef_en = false; -- bool v_2tap_hardcode_coef_en = false; -- bool h_2tap_sharp_en = false; -- bool v_2tap_sharp_en = false; -- uint32_t h_2tap_sharp_factor = scl_data->sharpness.horz; -- uint32_t v_2tap_sharp_factor = scl_data->sharpness.vert; -- bool coef_ram_current; -- const uint16_t *filter_h = NULL; -- const uint16_t *filter_v = NULL; -- const uint16_t *filter_h_c = NULL; -- const uint16_t *filter_v_c = NULL; -- -- h_2tap_hardcode_coef_en = scl_data->taps.h_taps < 3 -- && scl_data->taps.h_taps_c < 3 -- && (scl_data->taps.h_taps > 1 || scl_data->taps.h_taps_c > 1); -- v_2tap_hardcode_coef_en = scl_data->taps.v_taps < 3 -- && scl_data->taps.v_taps_c < 3 -- && (scl_data->taps.v_taps > 1 || scl_data->taps.v_taps_c > 1); -- -- h_2tap_sharp_en = h_2tap_hardcode_coef_en && h_2tap_sharp_factor != 0; -- v_2tap_sharp_en = v_2tap_hardcode_coef_en && v_2tap_sharp_factor != 0; -- -- REG_UPDATE_6(DSCL_2TAP_CONTROL, -- SCL_H_2TAP_HARDCODE_COEF_EN, h_2tap_hardcode_coef_en, -- SCL_H_2TAP_SHARP_EN, h_2tap_sharp_en, -- SCL_H_2TAP_SHARP_FACTOR, h_2tap_sharp_factor, -- SCL_V_2TAP_HARDCODE_COEF_EN, v_2tap_hardcode_coef_en, -- SCL_V_2TAP_SHARP_EN, v_2tap_sharp_en, -- SCL_V_2TAP_SHARP_FACTOR, v_2tap_sharp_factor); -- -- if (!v_2tap_hardcode_coef_en || !h_2tap_hardcode_coef_en) { -- bool filter_updated = false; -- -- filter_h = get_filter_coeffs_64p( -- scl_data->taps.h_taps, scl_data->ratios.horz); -- filter_v = get_filter_coeffs_64p( -- scl_data->taps.v_taps, scl_data->ratios.vert); -- -- filter_updated = (filter_h && (filter_h != xfm->filter_h)) -- || (filter_v && (filter_v != xfm->filter_v)); -- -- if (chroma_coef_mode) { -- filter_h_c = get_filter_coeffs_64p( -- scl_data->taps.h_taps_c, scl_data->ratios.horz_c); -- filter_v_c = get_filter_coeffs_64p( -- scl_data->taps.v_taps_c, scl_data->ratios.vert_c); -- filter_updated = filter_updated || (filter_h_c && (filter_h_c != xfm->filter_h_c)) -- || (filter_v_c && (filter_v_c != xfm->filter_v_c)); -- } -- -- if (filter_updated) { -- uint32_t scl_mode = REG_READ(SCL_MODE); -- -- if (!h_2tap_hardcode_coef_en && filter_h) { -- dpp_set_scaler_filter( -- xfm, scl_data->taps.h_taps, -- SCL_COEF_LUMA_HORZ_FILTER, filter_h); -- } -- xfm->filter_h = filter_h; -- if (!v_2tap_hardcode_coef_en && filter_v) { -- dpp_set_scaler_filter( -- xfm, scl_data->taps.v_taps, -- SCL_COEF_LUMA_VERT_FILTER, filter_v); -- } -- xfm->filter_v = filter_v; -- if (chroma_coef_mode) { -- if (!h_2tap_hardcode_coef_en && filter_h_c) { -- dpp_set_scaler_filter( -- xfm, scl_data->taps.h_taps_c, -- SCL_COEF_CHROMA_HORZ_FILTER, filter_h_c); -- } -- if (!v_2tap_hardcode_coef_en && filter_v_c) { -- dpp_set_scaler_filter( -- xfm, scl_data->taps.v_taps_c, -- SCL_COEF_CHROMA_VERT_FILTER, filter_v_c); -- } -- } -- xfm->filter_h_c = filter_h_c; -- xfm->filter_v_c = filter_v_c; -- -- coef_ram_current = get_reg_field_value_ex( -- scl_mode, xfm->tf_mask->SCL_COEF_RAM_SELECT_CURRENT, -- xfm->tf_shift->SCL_COEF_RAM_SELECT_CURRENT); -- -- /* Swap coefficient RAM and set chroma coefficient mode */ -- REG_SET_2(SCL_MODE, scl_mode, -- SCL_COEF_RAM_SELECT, !coef_ram_current, -- SCL_CHROMA_COEF_MODE, chroma_coef_mode); -- } -- } --} -- --static int get_lb_depth_bpc(enum lb_pixel_depth depth) --{ -- if (depth == LB_PIXEL_DEPTH_30BPP) -- return 10; -- else if (depth == LB_PIXEL_DEPTH_24BPP) -- return 8; -- else if (depth == LB_PIXEL_DEPTH_18BPP) -- return 6; -- else if (depth == LB_PIXEL_DEPTH_36BPP) -- return 12; -- else { -- BREAK_TO_DEBUGGER(); -- return -1; /* Unsupported */ -- } --} -- --static void calc_lb_num_partitions( -- const struct scaler_data *scl_data, -- enum lb_memory_config lb_config, -- int *num_part_y, -- int *num_part_c) --{ -- int line_size = scl_data->viewport.width < scl_data->recout.width ? -- scl_data->viewport.width : scl_data->recout.width; -- int line_size_c = scl_data->viewport_c.width < scl_data->recout.width ? -- scl_data->viewport_c.width : scl_data->recout.width; -- int lb_bpc = get_lb_depth_bpc(scl_data->lb_params.depth); -- int memory_line_size_y = (line_size * lb_bpc + 71) / 72; /* +71 to ceil */ -- int memory_line_size_c = (line_size_c * lb_bpc + 71) / 72; /* +71 to ceil */ -- int memory_line_size_a = (line_size + 5) / 6; /* +5 to ceil */ -- int lb_memory_size, lb_memory_size_c, lb_memory_size_a, num_partitions_a; -- -- if (lb_config == LB_MEMORY_CONFIG_1) { -- lb_memory_size = 816; -- lb_memory_size_c = 816; -- lb_memory_size_a = 984; -- } else if (lb_config == LB_MEMORY_CONFIG_2) { -- lb_memory_size = 1088; -- lb_memory_size_c = 1088; -- lb_memory_size_a = 1312; -- } else if (lb_config == LB_MEMORY_CONFIG_3) { -- lb_memory_size = 816 + 1088 + 848 + 848 + 848; -- lb_memory_size_c = 816 + 1088; -- lb_memory_size_a = 984 + 1312 + 456; -- } else { -- lb_memory_size = 816 + 1088 + 848; -- lb_memory_size_c = 816 + 1088 + 848; -- lb_memory_size_a = 984 + 1312 + 456; -- } -- *num_part_y = lb_memory_size / memory_line_size_y; -- *num_part_c = lb_memory_size_c / memory_line_size_c; -- num_partitions_a = lb_memory_size_a / memory_line_size_a; -- -- if (scl_data->lb_params.alpha_en -- && (num_partitions_a < *num_part_y)) -- *num_part_y = num_partitions_a; -- -- if (*num_part_y > 64) -- *num_part_y = 64; -- if (*num_part_c > 64) -- *num_part_c = 64; -- --} -- --static bool is_lb_conf_valid(int ceil_vratio, int num_partitions, int vtaps) --{ -- if (ceil_vratio > 2) -- return vtaps <= (num_partitions - ceil_vratio + 2); -- else -- return vtaps <= num_partitions; --} -- --/*find first match configuration which meets the min required lb size*/ --static enum lb_memory_config dpp10_find_lb_memory_config( -- const struct scaler_data *scl_data) --{ -- int num_part_y, num_part_c; -- int vtaps = scl_data->taps.v_taps; -- int vtaps_c = scl_data->taps.v_taps_c; -- int ceil_vratio = dal_fixed31_32_ceil(scl_data->ratios.vert); -- int ceil_vratio_c = dal_fixed31_32_ceil(scl_data->ratios.vert_c); -- -- calc_lb_num_partitions( -- scl_data, LB_MEMORY_CONFIG_1, &num_part_y, &num_part_c); -- -- if (is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -- && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)) -- return LB_MEMORY_CONFIG_1; -- -- calc_lb_num_partitions( -- scl_data, LB_MEMORY_CONFIG_2, &num_part_y, &num_part_c); -- -- if (is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -- && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)) -- return LB_MEMORY_CONFIG_2; -- -- if (scl_data->format == PIXEL_FORMAT_420BPP8 -- || scl_data->format == PIXEL_FORMAT_420BPP10) { -- calc_lb_num_partitions( -- scl_data, LB_MEMORY_CONFIG_3, &num_part_y, &num_part_c); -- -- if (is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -- && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)) -- return LB_MEMORY_CONFIG_3; -- } -- -- calc_lb_num_partitions( -- scl_data, LB_MEMORY_CONFIG_0, &num_part_y, &num_part_c); -- -- /*Ensure we can support the requested number of vtaps*/ -- ASSERT(is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -- && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)); -- -- return LB_MEMORY_CONFIG_0; --} -- --/*find first match configuration which meets the min required lb size*/ --static enum lb_memory_config find_lb_memory_config(struct dcn10_dpp *xfm, -- const struct scaler_data *scl_data) --{ -- enum lb_memory_config mem_cfg = LB_MEMORY_CONFIG_0; -- -- if (xfm->tf_mask->PIXEL_DEPTH) { -- mem_cfg = dpp10_find_lb_memory_config(scl_data); -- } -- return mem_cfg; --} -- --void dpp_set_scaler_auto_scale( -- struct transform *xfm_base, -- const struct scaler_data *scl_data) --{ -- enum lb_memory_config lb_config; -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- enum dscl_mode_sel dscl_mode = get_dscl_mode( -- scl_data, xfm_base->ctx->dc->debug.always_scale); -- bool ycbcr = scl_data->format >= PIXEL_FORMAT_VIDEO_BEGIN -- && scl_data->format <= PIXEL_FORMAT_VIDEO_END; -- -- dpp_set_overscan(xfm, scl_data); -- -- dpp_set_otg_blank(xfm, scl_data); -- -- REG_UPDATE(SCL_MODE, DSCL_MODE, dscl_mode); -- -- if (dscl_mode == DSCL_MODE_DSCL_BYPASS) -- return; -- -- lb_config = find_lb_memory_config(xfm, scl_data); -- dpp_set_lb(xfm, &scl_data->lb_params, lb_config); -- -- if (dscl_mode == DSCL_MODE_SCALING_444_BYPASS) -- return; -- -- /* TODO: v_min */ -- REG_SET_3(DSCL_AUTOCAL, 0, -- AUTOCAL_MODE, AUTOCAL_MODE_AUTOSCALE, -- AUTOCAL_NUM_PIPE, 0, -- AUTOCAL_PIPE_ID, 0); -- -- /* Black offsets */ -- if (ycbcr) -- REG_SET_2(SCL_BLACK_OFFSET, 0, -- SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -- SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_CBCR); -- else -- -- REG_SET_2(SCL_BLACK_OFFSET, 0, -- SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -- SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_RGB_Y); -- -- REG_SET_4(SCL_TAP_CONTROL, 0, -- SCL_V_NUM_TAPS, scl_data->taps.v_taps - 1, -- SCL_H_NUM_TAPS, scl_data->taps.h_taps - 1, -- SCL_V_NUM_TAPS_C, scl_data->taps.v_taps_c - 1, -- SCL_H_NUM_TAPS_C, scl_data->taps.h_taps_c - 1); -- -- dpp_set_scl_filter(xfm, scl_data, ycbcr); --} -- -- --static void dpp_set_manual_ratio_init( -- struct dcn10_dpp *xfm, const struct scaler_data *data) --{ -- uint32_t init_frac = 0; -- uint32_t init_int = 0; -- -- REG_SET(SCL_HORZ_FILTER_SCALE_RATIO, 0, -- SCL_H_SCALE_RATIO, dal_fixed31_32_u2d19(data->ratios.horz) << 5); -- -- REG_SET(SCL_VERT_FILTER_SCALE_RATIO, 0, -- SCL_V_SCALE_RATIO, dal_fixed31_32_u2d19(data->ratios.vert) << 5); -- -- REG_SET(SCL_HORZ_FILTER_SCALE_RATIO_C, 0, -- SCL_H_SCALE_RATIO_C, dal_fixed31_32_u2d19(data->ratios.horz_c) << 5); -- -- REG_SET(SCL_VERT_FILTER_SCALE_RATIO_C, 0, -- SCL_V_SCALE_RATIO_C, dal_fixed31_32_u2d19(data->ratios.vert_c) << 5); -- -- /* -- * 0.24 format for fraction, first five bits zeroed -- */ -- init_frac = dal_fixed31_32_u0d19(data->inits.h) << 5; -- init_int = dal_fixed31_32_floor(data->inits.h); -- REG_SET_2(SCL_HORZ_FILTER_INIT, 0, -- SCL_H_INIT_FRAC, init_frac, -- SCL_H_INIT_INT, init_int); -- -- init_frac = dal_fixed31_32_u0d19(data->inits.h_c) << 5; -- init_int = dal_fixed31_32_floor(data->inits.h_c); -- REG_SET_2(SCL_HORZ_FILTER_INIT_C, 0, -- SCL_H_INIT_FRAC_C, init_frac, -- SCL_H_INIT_INT_C, init_int); -- -- init_frac = dal_fixed31_32_u0d19(data->inits.v) << 5; -- init_int = dal_fixed31_32_floor(data->inits.v); -- REG_SET_2(SCL_VERT_FILTER_INIT, 0, -- SCL_V_INIT_FRAC, init_frac, -- SCL_V_INIT_INT, init_int); -- -- init_frac = dal_fixed31_32_u0d19(data->inits.v_bot) << 5; -- init_int = dal_fixed31_32_floor(data->inits.v_bot); -- REG_SET_2(SCL_VERT_FILTER_INIT_BOT, 0, -- SCL_V_INIT_FRAC_BOT, init_frac, -- SCL_V_INIT_INT_BOT, init_int); -- -- init_frac = dal_fixed31_32_u0d19(data->inits.v_c) << 5; -- init_int = dal_fixed31_32_floor(data->inits.v_c); -- REG_SET_2(SCL_VERT_FILTER_INIT_C, 0, -- SCL_V_INIT_FRAC_C, init_frac, -- SCL_V_INIT_INT_C, init_int); -- -- init_frac = dal_fixed31_32_u0d19(data->inits.v_c_bot) << 5; -- init_int = dal_fixed31_32_floor(data->inits.v_c_bot); -- REG_SET_2(SCL_VERT_FILTER_INIT_BOT_C, 0, -- SCL_V_INIT_FRAC_BOT_C, init_frac, -- SCL_V_INIT_INT_BOT_C, init_int); --} -- -- -- --static void dpp_set_recout( -- struct dcn10_dpp *xfm, const struct rect *recout) --{ -- REG_SET_2(RECOUT_START, 0, -- /* First pixel of RECOUT */ -- RECOUT_START_X, recout->x, -- /* First line of RECOUT */ -- RECOUT_START_Y, recout->y); -- -- REG_SET_2(RECOUT_SIZE, 0, -- /* Number of RECOUT horizontal pixels */ -- RECOUT_WIDTH, recout->width, -- /* Number of RECOUT vertical lines */ -- RECOUT_HEIGHT, recout->height -- - xfm->base.ctx->dc->debug.surface_visual_confirm * 4 * -- (xfm->base.inst + 1)); --} -- --/* Main function to program scaler and line buffer in manual scaling mode */ --void dcn10_dpp_dscl_set_scaler_manual_scale( -- struct transform *xfm_base, -- const struct scaler_data *scl_data) --{ -- enum lb_memory_config lb_config; -- struct dcn10_dpp *xfm = TO_DCN10_DPP(xfm_base); -- enum dscl_mode_sel dscl_mode = get_dscl_mode( -- scl_data, xfm_base->ctx->dc->debug.always_scale); -- bool ycbcr = scl_data->format >= PIXEL_FORMAT_VIDEO_BEGIN -- && scl_data->format <= PIXEL_FORMAT_VIDEO_END; -- -- /* Recout */ -- dpp_set_recout(xfm, &scl_data->recout); -- -- /* MPC Size */ -- REG_SET_2(MPC_SIZE, 0, -- /* Number of horizontal pixels of MPC */ -- MPC_WIDTH, scl_data->h_active, -- /* Number of vertical lines of MPC */ -- MPC_HEIGHT, scl_data->v_active); -- -- /* SCL mode */ -- REG_UPDATE(SCL_MODE, DSCL_MODE, dscl_mode); -- -- if (dscl_mode == DSCL_MODE_DSCL_BYPASS) -- return; -- -- /* LB */ -- lb_config = find_lb_memory_config(xfm, scl_data); -- dpp_set_lb(xfm, &scl_data->lb_params, lb_config); -- -- if (dscl_mode == DSCL_MODE_SCALING_444_BYPASS) -- return; -- -- /* Autocal off */ -- REG_SET_3(DSCL_AUTOCAL, 0, -- AUTOCAL_MODE, AUTOCAL_MODE_OFF, -- AUTOCAL_NUM_PIPE, 0, -- AUTOCAL_PIPE_ID, 0); -- -- /* Black offsets */ -- if (ycbcr) -- REG_SET_2(SCL_BLACK_OFFSET, 0, -- SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -- SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_CBCR); -- else -- -- REG_SET_2(SCL_BLACK_OFFSET, 0, -- SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -- SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_RGB_Y); -- -- /* Manually calculate scale ratio and init values */ -- dpp_set_manual_ratio_init(xfm, scl_data); -- -- /* HTaps/VTaps */ -- REG_SET_4(SCL_TAP_CONTROL, 0, -- SCL_V_NUM_TAPS, scl_data->taps.v_taps - 1, -- SCL_H_NUM_TAPS, scl_data->taps.h_taps - 1, -- SCL_V_NUM_TAPS_C, scl_data->taps.v_taps_c - 1, -- SCL_H_NUM_TAPS_C, scl_data->taps.h_taps_c - 1); -- -- dpp_set_scl_filter(xfm, scl_data, ycbcr); --} -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.c -deleted file mode 100644 -index 684241c..0000000 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.c -+++ /dev/null -@@ -1,651 +0,0 @@ --/* -- * Copyright 2012-17 Advanced Micro Devices, Inc. -- * -- * Permission is hereby granted, free of charge, to any person obtaining a -- * copy of this software and associated documentation files (the "Software"), -- * to deal in the Software without restriction, including without limitation -- * the rights to use, copy, modify, merge, publish, distribute, sublicense, -- * and/or sell copies of the Software, and to permit persons to whom the -- * Software is furnished to do so, subject to the following conditions: -- * -- * The above copyright notice and this permission notice shall be included in -- * all copies or substantial portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR -- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -- * OTHER DEALINGS IN THE SOFTWARE. -- * -- * Authors: AMD -- * -- */ -- --#if defined(CONFIG_DRM_AMD_DC_DCN1_0) -- --#include "reg_helper.h" --#include "resource.h" --#include "dwb.h" --#include "dcn10_dwb.h" --#include "vega10/soc15ip.h" --#include "raven1/DCN/dcn_1_0_offset.h" --#include "raven1/DCN/dcn_1_0_sh_mask.h" -- --/* DCN */ --#define BASE_INNER(seg) \ -- DCE_BASE__INST0_SEG ## seg -- --#define BASE(seg) \ -- BASE_INNER(seg) -- --#define SR(reg_name)\ -- .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + \ -- mm ## reg_name -- --#define SRI(reg_name, block, id)\ -- .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \ -- mm ## block ## id ## _ ## reg_name -- -- --#define SRII(reg_name, block, id)\ -- .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \ -- mm ## block ## id ## _ ## reg_name -- --#define SF(reg_name, field_name, post_fix)\ -- .field_name = reg_name ## __ ## field_name ## post_fix -- --#define REG(reg)\ -- dwbc10->dwbc_regs->reg -- --#define CTX \ -- dwbc10->base.ctx -- --#undef FN --#define FN(reg_name, field_name) \ -- dwbc10->dwbc_shift->field_name, dwbc10->dwbc_mask->field_name -- --#define TO_DCN10_DWBC(dwbc_base) \ -- container_of(dwbc_base, struct dcn10_dwbc, base) -- --#define DWBC_COMMON_REG_LIST_DCN1_0(inst) \ -- SRI(WB_ENABLE, CNV, inst),\ -- SRI(WB_EC_CONFIG, CNV, inst),\ -- SRI(CNV_MODE, CNV, inst),\ -- SRI(WB_SOFT_RESET, CNV, inst),\ -- SRI(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_PITCH, MCIF_WB, inst),\ -- SRI(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB, inst),\ -- SRI(MCIF_WB_SCLK_CHANGE, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_1_ADDR_Y_OFFSET, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_1_ADDR_C, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_1_ADDR_C_OFFSET, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_2_ADDR_Y_OFFSET, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_2_ADDR_C, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_2_ADDR_C_OFFSET, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_3_ADDR_Y_OFFSET, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_3_ADDR_C, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_3_ADDR_C_OFFSET, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_4_ADDR_Y_OFFSET, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_4_ADDR_C, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_4_ADDR_C_OFFSET, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB, inst),\ -- SRI(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, MCIF_WB, inst),\ -- SRI(MCIF_WB_NB_PSTATE_CONTROL, MCIF_WB, inst),\ -- SRI(MCIF_WB_WATERMARK, MCIF_WB, inst),\ -- SRI(MCIF_WB_WARM_UP_CNTL, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB, inst),\ -- SRI(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB, inst),\ -- .DWB_SOURCE_SELECT = mmDWB_SOURCE_SELECT\ -- --#define DWBC_COMMON_MASK_SH_LIST_DCN1_0(mask_sh) \ -- SF(CNV0_WB_ENABLE, WB_ENABLE, mask_sh),\ -- SF(CNV0_WB_EC_CONFIG, DISPCLK_R_WB_GATE_DIS, mask_sh),\ -- SF(CNV0_WB_EC_CONFIG, DISPCLK_G_WB_GATE_DIS, mask_sh),\ -- SF(CNV0_WB_EC_CONFIG, DISPCLK_G_WBSCL_GATE_DIS, mask_sh),\ -- SF(CNV0_WB_EC_CONFIG, WB_LB_LS_DIS, mask_sh),\ -- SF(CNV0_WB_EC_CONFIG, WB_LUT_LS_DIS, mask_sh),\ -- SF(CNV0_CNV_MODE, CNV_WINDOW_CROP_EN, mask_sh),\ -- SF(CNV0_CNV_MODE, CNV_STEREO_TYPE, mask_sh),\ -- SF(CNV0_CNV_MODE, CNV_INTERLACED_MODE, mask_sh),\ -- SF(CNV0_CNV_MODE, CNV_EYE_SELECTION, mask_sh),\ -- SF(CNV0_CNV_MODE, CNV_STEREO_POLARITY, mask_sh),\ -- SF(CNV0_CNV_MODE, CNV_INTERLACED_FIELD_ORDER, mask_sh),\ -- SF(CNV0_CNV_MODE, CNV_STEREO_SPLIT, mask_sh),\ -- SF(CNV0_CNV_MODE, CNV_NEW_CONTENT, mask_sh),\ -- SF(CNV0_CNV_MODE, CNV_FRAME_CAPTURE_EN, mask_sh),\ -- SF(CNV0_WB_SOFT_RESET, WB_SOFT_RESET, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_ENABLE, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUF_DUALSIZE_REQ, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_INT_EN, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_INT_ACK, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_SLICE_INT_EN, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_OVERRUN_INT_EN, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_LOCK, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_P_VMID, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUF_ADDR_FENCE_EN, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_PITCH, MCIF_WB_BUF_LUMA_PITCH, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_PITCH, MCIF_WB_BUF_CHROMA_PITCH, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_CLIENT_ARBITRATION_SLICE, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_TIME_PER_PIXEL, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_SCLK_CHANGE, WM_CHANGE_ACK_FORCE_ON, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_SCLK_CHANGE, MCIF_WB_CLI_WATERMARK_MASK, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_1_ADDR_Y, MCIF_WB_BUF_1_ADDR_Y, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_1_ADDR_Y_OFFSET, MCIF_WB_BUF_1_ADDR_Y_OFFSET, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_1_ADDR_C, MCIF_WB_BUF_1_ADDR_C, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_1_ADDR_C_OFFSET, MCIF_WB_BUF_1_ADDR_C_OFFSET, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_2_ADDR_Y, MCIF_WB_BUF_2_ADDR_Y, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_2_ADDR_Y_OFFSET, MCIF_WB_BUF_2_ADDR_Y_OFFSET, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_2_ADDR_C, MCIF_WB_BUF_2_ADDR_C, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_2_ADDR_C_OFFSET, MCIF_WB_BUF_2_ADDR_C_OFFSET, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_3_ADDR_Y, MCIF_WB_BUF_3_ADDR_Y, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_3_ADDR_Y_OFFSET, MCIF_WB_BUF_3_ADDR_Y_OFFSET, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_3_ADDR_C, MCIF_WB_BUF_3_ADDR_C, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_3_ADDR_C_OFFSET, MCIF_WB_BUF_3_ADDR_C_OFFSET, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_4_ADDR_Y, MCIF_WB_BUF_4_ADDR_Y, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_4_ADDR_Y_OFFSET, MCIF_WB_BUF_4_ADDR_Y_OFFSET, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_4_ADDR_C, MCIF_WB_BUF_4_ADDR_C, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_4_ADDR_C_OFFSET, MCIF_WB_BUF_4_ADDR_C_OFFSET, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_VCE_LOCK_IGNORE, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_VCE_INT_EN, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_VCE_INT_ACK, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_VCE_SLICE_INT_EN, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_VCE_LOCK, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_SLICE_SIZE, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_REFRESH_WATERMARK, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_URGENT_DURING_REQUEST, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_FORCE_ON, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_ALLOW_FOR_URGENT, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_WATERMARK_MASK, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_WARM_UP_CNTL, MCIF_WB_PITCH_SIZE_WARMUP, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_LUMA_SIZE, MCIF_WB_BUF_LUMA_SIZE, mask_sh),\ -- SF(MCIF_WB0_MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB_BUF_CHROMA_SIZE, mask_sh),\ -- SF(DWB_SOURCE_SELECT, OPTC_DWB0_SOURCE_SELECT, mask_sh),\ -- SF(DWB_SOURCE_SELECT, OPTC_DWB1_SOURCE_SELECT, mask_sh) -- --#define DWBC_REG_FIELD_LIST(type) \ -- type WB_ENABLE;\ -- type DISPCLK_R_WB_GATE_DIS;\ -- type DISPCLK_G_WB_GATE_DIS;\ -- type DISPCLK_G_WBSCL_GATE_DIS;\ -- type WB_LB_LS_DIS;\ -- type WB_LB_SD_DIS;\ -- type WB_LUT_LS_DIS;\ -- type CNV_WINDOW_CROP_EN;\ -- type CNV_STEREO_TYPE;\ -- type CNV_INTERLACED_MODE;\ -- type CNV_EYE_SELECTION;\ -- type CNV_STEREO_POLARITY;\ -- type CNV_INTERLACED_FIELD_ORDER;\ -- type CNV_STEREO_SPLIT;\ -- type CNV_NEW_CONTENT;\ -- type CNV_FRAME_CAPTURE_EN;\ -- type WB_SOFT_RESET;\ -- type MCIF_WB_BUFMGR_ENABLE;\ -- type MCIF_WB_BUF_DUALSIZE_REQ;\ -- type MCIF_WB_BUFMGR_SW_INT_EN;\ -- type MCIF_WB_BUFMGR_SW_INT_ACK;\ -- type MCIF_WB_BUFMGR_SW_SLICE_INT_EN;\ -- type MCIF_WB_BUFMGR_SW_OVERRUN_INT_EN;\ -- type MCIF_WB_BUFMGR_SW_LOCK;\ -- type MCIF_WB_P_VMID;\ -- type MCIF_WB_BUF_ADDR_FENCE_EN;\ -- type MCIF_WB_BUF_LUMA_PITCH;\ -- type MCIF_WB_BUF_CHROMA_PITCH;\ -- type MCIF_WB_CLIENT_ARBITRATION_SLICE;\ -- type MCIF_WB_TIME_PER_PIXEL;\ -- type WM_CHANGE_ACK_FORCE_ON;\ -- type MCIF_WB_CLI_WATERMARK_MASK;\ -- type MCIF_WB_BUF_1_ADDR_Y;\ -- type MCIF_WB_BUF_1_ADDR_Y_OFFSET;\ -- type MCIF_WB_BUF_1_ADDR_C;\ -- type MCIF_WB_BUF_1_ADDR_C_OFFSET;\ -- type MCIF_WB_BUF_2_ADDR_Y;\ -- type MCIF_WB_BUF_2_ADDR_Y_OFFSET;\ -- type MCIF_WB_BUF_2_ADDR_C;\ -- type MCIF_WB_BUF_2_ADDR_C_OFFSET;\ -- type MCIF_WB_BUF_3_ADDR_Y;\ -- type MCIF_WB_BUF_3_ADDR_Y_OFFSET;\ -- type MCIF_WB_BUF_3_ADDR_C;\ -- type MCIF_WB_BUF_3_ADDR_C_OFFSET;\ -- type MCIF_WB_BUF_4_ADDR_Y;\ -- type MCIF_WB_BUF_4_ADDR_Y_OFFSET;\ -- type MCIF_WB_BUF_4_ADDR_C;\ -- type MCIF_WB_BUF_4_ADDR_C_OFFSET;\ -- type MCIF_WB_BUFMGR_VCE_LOCK_IGNORE;\ -- type MCIF_WB_BUFMGR_VCE_INT_EN;\ -- type MCIF_WB_BUFMGR_VCE_INT_ACK;\ -- type MCIF_WB_BUFMGR_VCE_SLICE_INT_EN;\ -- type MCIF_WB_BUFMGR_VCE_LOCK;\ -- type MCIF_WB_BUFMGR_SLICE_SIZE;\ -- type NB_PSTATE_CHANGE_REFRESH_WATERMARK;\ -- type NB_PSTATE_CHANGE_URGENT_DURING_REQUEST;\ -- type NB_PSTATE_CHANGE_FORCE_ON;\ -- type NB_PSTATE_ALLOW_FOR_URGENT;\ -- type NB_PSTATE_CHANGE_WATERMARK_MASK;\ -- type MCIF_WB_CLI_WATERMARK;\ -- type MCIF_WB_CLI_CLOCK_GATER_OVERRIDE;\ -- type MCIF_WB_PITCH_SIZE_WARMUP;\ -- type MCIF_WB_BUF_LUMA_SIZE;\ -- type MCIF_WB_BUF_CHROMA_SIZE;\ -- type OPTC_DWB0_SOURCE_SELECT;\ -- type OPTC_DWB1_SOURCE_SELECT;\ -- --struct dcn10_dwbc_registers { -- uint32_t WB_ENABLE; -- uint32_t WB_EC_CONFIG; -- uint32_t CNV_MODE; -- uint32_t WB_SOFT_RESET; -- uint32_t MCIF_WB_BUFMGR_SW_CONTROL; -- uint32_t MCIF_WB_BUF_PITCH; -- uint32_t MCIF_WB_ARBITRATION_CONTROL; -- uint32_t MCIF_WB_SCLK_CHANGE; -- uint32_t MCIF_WB_BUF_1_ADDR_Y; -- uint32_t MCIF_WB_BUF_1_ADDR_Y_OFFSET; -- uint32_t MCIF_WB_BUF_1_ADDR_C; -- uint32_t MCIF_WB_BUF_1_ADDR_C_OFFSET; -- uint32_t MCIF_WB_BUF_2_ADDR_Y; -- uint32_t MCIF_WB_BUF_2_ADDR_Y_OFFSET; -- uint32_t MCIF_WB_BUF_2_ADDR_C; -- uint32_t MCIF_WB_BUF_2_ADDR_C_OFFSET; -- uint32_t MCIF_WB_BUF_3_ADDR_Y; -- uint32_t MCIF_WB_BUF_3_ADDR_Y_OFFSET; -- uint32_t MCIF_WB_BUF_3_ADDR_C; -- uint32_t MCIF_WB_BUF_3_ADDR_C_OFFSET; -- uint32_t MCIF_WB_BUF_4_ADDR_Y; -- uint32_t MCIF_WB_BUF_4_ADDR_Y_OFFSET; -- uint32_t MCIF_WB_BUF_4_ADDR_C; -- uint32_t MCIF_WB_BUF_4_ADDR_C_OFFSET; -- uint32_t MCIF_WB_BUFMGR_VCE_CONTROL; -- uint32_t MCIF_WB_NB_PSTATE_LATENCY_WATERMARK; -- uint32_t MCIF_WB_NB_PSTATE_CONTROL; -- uint32_t MCIF_WB_WATERMARK; -- uint32_t MCIF_WB_WARM_UP_CNTL; -- uint32_t MCIF_WB_BUF_LUMA_SIZE; -- uint32_t MCIF_WB_BUF_CHROMA_SIZE; -- uint32_t DWB_SOURCE_SELECT; --}; --struct dcn10_dwbc_mask { -- DWBC_REG_FIELD_LIST(uint32_t) --}; --struct dcn10_dwbc_shift { -- DWBC_REG_FIELD_LIST(uint8_t) --}; --struct dcn10_dwbc { -- struct dwbc base; -- const struct dcn10_dwbc_registers *dwbc_regs; -- const struct dcn10_dwbc_shift *dwbc_shift; -- const struct dcn10_dwbc_mask *dwbc_mask; --}; -- --#define dwbc_regs(id)\ --[id] = {\ -- DWBC_COMMON_REG_LIST_DCN1_0(id),\ --} -- --static const struct dcn10_dwbc_registers dwbc10_regs[] = { -- dwbc_regs(0), -- dwbc_regs(1), --}; -- --static const struct dcn10_dwbc_shift dwbc10_shift = { -- DWBC_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT) --}; -- --static const struct dcn10_dwbc_mask dwbc10_mask = { -- DWBC_COMMON_MASK_SH_LIST_DCN1_0(_MASK) --}; -- -- --static bool get_caps(struct dwbc *dwbc, struct dwb_caps *caps) --{ -- if (caps) { -- caps->adapter_id = 0; /* we only support 1 adapter currently */ -- caps->hw_version = DCN_VERSION_1_0; -- caps->num_pipes = 2; -- memset(&caps->reserved, 0, sizeof(caps->reserved)); -- memset(&caps->reserved2, 0, sizeof(caps->reserved2)); -- caps->sw_version = dwb_ver_1_0; -- caps->caps.support_dwb = true; -- caps->caps.support_ogam = false; -- caps->caps.support_wbscl = true; -- caps->caps.support_ocsc = false; -- return true; -- } else { -- return false; -- } --} -- --static bool enable(struct dwbc *dwbc) --{ -- struct dcn10_dwbc *dwbc10 = TO_DCN10_DWBC(dwbc); -- -- /* disable first. */ -- dwbc->funcs->disable(dwbc); -- -- /* disable power gating */ -- REG_UPDATE_5(WB_EC_CONFIG, DISPCLK_R_WB_GATE_DIS, 1, -- DISPCLK_G_WB_GATE_DIS, 1, DISPCLK_G_WBSCL_GATE_DIS, 1, -- WB_LB_LS_DIS, 1, WB_LUT_LS_DIS, 1); -- -- REG_UPDATE(WB_ENABLE, WB_ENABLE, 1); -- -- /* lock buffer0~buffer3 */ -- REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_LOCK, 0xf); -- -- /* buffer address for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB_BUF_1_ADDR_Y, (dwbc->config.basic_settings.luma_address[0] & 0xffffffff)); --/* REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB_BUF_1_ADDR_Y_HIGH, (dwbc->config.basic_settings.luma_address[0] >> 32)); */ -- /* right eye sub-buffer address offset for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y_OFFSET, MCIF_WB_BUF_1_ADDR_Y_OFFSET, 0); -- -- /* buffer address for Chroma in planar mode (unused in packing mode) */ -- REG_UPDATE(MCIF_WB_BUF_1_ADDR_C, MCIF_WB_BUF_1_ADDR_C, (dwbc->config.basic_settings.chroma_address[0] & 0xffffffff)); --/* REG_UPDATE(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB_BUF_1_ADDR_C_HIGH, (dwbc->config.basic_settings.chroma_address[0] >> 32)); */ -- /* right eye offset for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_1_ADDR_C_OFFSET, MCIF_WB_BUF_1_ADDR_C_OFFSET, 0); -- -- /* buffer address for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB_BUF_2_ADDR_Y, (dwbc->config.basic_settings.luma_address[1] & 0xffffffff)); --/* REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB_BUF_2_ADDR_Y_HIGH, (dwbc->config.basic_settings.luma_address[1] >> 32)); */ -- /* right eye sub-buffer address offset for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y_OFFSET, MCIF_WB_BUF_2_ADDR_Y_OFFSET, 0); -- -- /* buffer address for Chroma in planar mode (unused in packing mode) */ -- REG_UPDATE(MCIF_WB_BUF_2_ADDR_C, MCIF_WB_BUF_2_ADDR_C, (dwbc->config.basic_settings.chroma_address[1] & 0xffffffff)); --/* REG_UPDATE(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB_BUF_2_ADDR_C_HIGH, (dwbc->config.basic_settings.chroma_address[1] >> 32)); */ -- /* right eye offset for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_2_ADDR_C_OFFSET, MCIF_WB_BUF_2_ADDR_C_OFFSET, 0); -- -- /* buffer address for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB_BUF_3_ADDR_Y, (dwbc->config.basic_settings.luma_address[2] & 0xffffffff)); --/* REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB_BUF_3_ADDR_Y_HIGH, (dwbc->config.basic_settings.luma_address[2] >> 32)); */ -- /* right eye sub-buffer address offset for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y_OFFSET, MCIF_WB_BUF_3_ADDR_Y_OFFSET, 0); -- -- /* buffer address for Chroma in planar mode (unused in packing mode) */ -- REG_UPDATE(MCIF_WB_BUF_3_ADDR_C, MCIF_WB_BUF_3_ADDR_C, (dwbc->config.basic_settings.chroma_address[2] & 0xffffffff)); --/* REG_UPDATE(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB_BUF_3_ADDR_C_HIGH, (dwbc->config.basic_settings.chroma_address[2] >> 32)); */ -- /* right eye offset for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_3_ADDR_C_OFFSET, MCIF_WB_BUF_3_ADDR_C_OFFSET, 0); -- -- /* buffer address for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB_BUF_4_ADDR_Y, (dwbc->config.basic_settings.luma_address[3] & 0xffffffff)); --/* REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB_BUF_4_ADDR_Y_HIGH, (dwbc->config.basic_settings.luma_address[3] >> 32)); */ -- /* right eye sub-buffer address offset for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y_OFFSET, MCIF_WB_BUF_4_ADDR_Y_OFFSET, 0); -- -- /* buffer address for Chroma in planar mode (unused in packing mode) */ -- REG_UPDATE(MCIF_WB_BUF_4_ADDR_C, MCIF_WB_BUF_4_ADDR_C, (dwbc->config.basic_settings.chroma_address[3] & 0xffffffff)); --/* REG_UPDATE(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB_BUF_4_ADDR_C_HIGH, (dwbc->config.basic_settings.chroma_address[3] >> 32)); */ -- /* right eye offset for packing mode or Luma in planar mode */ -- REG_UPDATE(MCIF_WB_BUF_4_ADDR_C_OFFSET, MCIF_WB_BUF_4_ADDR_C_OFFSET, 0); -- -- /* setup luma & chroma size */ -- REG_UPDATE(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB_BUF_LUMA_SIZE, dwbc->config.basic_settings.luma_pitch * dwbc->config.basic_settings.dest_height); /* should be enough to contain a whole frame Luma data, same for stereo mode */ -- REG_UPDATE(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB_BUF_CHROMA_SIZE, dwbc->config.basic_settings.chroma_pitch * dwbc->config.basic_settings.dest_height); /* should be enough to contain a whole frame Luma data, same for stereo mode */ -- -- /* enable address fence */ -- REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUF_ADDR_FENCE_EN, 1); -- -- /* setup pitch */ -- REG_UPDATE_2(MCIF_WB_BUF_PITCH, MCIF_WB_BUF_LUMA_PITCH, dwbc->config.basic_settings.luma_pitch, -- MCIF_WB_BUF_CHROMA_PITCH, dwbc->config.basic_settings.chroma_pitch); -- -- /* Set pitch for MC cache warm up mode */ -- /* Pitch is 256 bytes aligned. The default pitch is 4K */ -- REG_UPDATE(MCIF_WB_WARM_UP_CNTL, MCIF_WB_PITCH_SIZE_WARMUP, 0x10); /* default is 0x10 */ -- -- /* Programmed by the video driver based on the CRTC timing (for DWB) */ -- REG_UPDATE(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_TIME_PER_PIXEL, 0); -- -- /* Programming dwb watermark */ -- /* Watermark to generate urgent in MCIF_WB_CLI, value is determined by MCIF_WB_CLI_WATERMARK_MASK. */ -- /* Program in ns. A formula will be provided in the pseudo code to calculate the value. */ -- REG_UPDATE(MCIF_WB_SCLK_CHANGE, MCIF_WB_CLI_WATERMARK_MASK, 0x0); -- REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, 0xffff); /* urgent_watermarkA */ -- REG_UPDATE(MCIF_WB_SCLK_CHANGE, MCIF_WB_CLI_WATERMARK_MASK, 0x1); -- REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, 0xffff); /* urgent_watermarkB */ -- REG_UPDATE(MCIF_WB_SCLK_CHANGE, MCIF_WB_CLI_WATERMARK_MASK, 0x2); -- REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, 0xffff); /* urgent_watermarkC */ -- REG_UPDATE(MCIF_WB_SCLK_CHANGE, MCIF_WB_CLI_WATERMARK_MASK, 0x3); -- REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, 0xffff); /* urgent_watermarkD */ -- -- /* Programming nb pstate watermark */ -- REG_UPDATE(MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x0); -- REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_REFRESH_WATERMARK, 0xffff); /* nbp_state_change_watermarkA */ -- REG_UPDATE(MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x1); -- REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_REFRESH_WATERMARK, 0xffff); /* nbp_state_change_watermarkB */ -- REG_UPDATE(MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x2); -- REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_REFRESH_WATERMARK, 0xffff); /* nbp_state_change_watermarkC */ -- REG_UPDATE(MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x3); -- REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_REFRESH_WATERMARK, 0xffff); /* nbp_state_change_watermarkD */ -- -- /* buf_lh_capability = (buffer_size / byte_per_pixel)*time_per_pixel; //client buffer latency hiding capability */ -- /* if (MCIF_WB_CLI_WATERMARK * 2 < buf_lh_capability) //factor '2' can be adjusted if better value is identified during bringup/debug */ -- /* MULTI_LEVEL_QOS_CTRL.MAX_SCALED_TIME_TO_URGENT = MCIF_WB_CLI_WATERMARK * 2; */ -- /* else */ -- /* MULTI_LEVEL_QOS_CTRL.MAX_SCALED_TIME_TO_URGENT = buf_lh_capability; //ensure QoS can be fully mapped to [0:15] region in any scenario */ -- -- REG_UPDATE(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_SLICE_SIZE, 31); -- -- /* Set arbitration unit for Luma/Chroma */ -- /* arb_unit=2 should be chosen for more efficiency */ -- REG_UPDATE(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_CLIENT_ARBITRATION_SLICE, 2); /* Arbitration size, 0: 512 bytes 1: 1024 bytes 2: 2048 Bytes */ -- -- /* Program VMID, don't support virtual mode, won't set VMID */ -- /* REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_P_VMID, pVmid); */ -- -- if (dwbc->config.basic_settings.input_pipe_select == dwb_pipe0) { -- REG_UPDATE(DWB_SOURCE_SELECT, OPTC_DWB0_SOURCE_SELECT, dwbc->config.basic_settings.input_src_select - dwb_src_otg0); -- } else if (dwbc->config.basic_settings.input_pipe_select == dwb_pipe1) { -- REG_UPDATE(DWB_SOURCE_SELECT, OPTC_DWB1_SOURCE_SELECT, dwbc->config.basic_settings.input_src_select - dwb_src_otg0); -- } -- -- /* Set interrupt mask */ -- REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_INT_EN, 0); /* Disable interrupt to SW. (the default value is 0.) */ -- REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_SLICE_INT_EN, 0); /* Disable slice complete interrupt to SW.(the default value is 0.) */ -- REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_OVERRUN_INT_EN, 0); /* Disable frame buffer overrun interrupt to SW. (the default value is 0.) */ -- -- REG_UPDATE(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_VCE_INT_EN, 1); /* Enable interrupt to VCE */ -- REG_UPDATE(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_VCE_SLICE_INT_EN, 0); /* Disable slice complete interrupt to VCE. */ -- -- /* ////////////////// */ -- /* Enable Mcifwb */ -- REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_ENABLE, 1); /* Start working */ -- -- /* unlock sw lock. */ -- REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_LOCK, 0); -- -- dwbc->status.enabled = true; -- -- return true; --} -- --static bool disable(struct dwbc *dwbc) --{ -- struct dcn10_dwbc *dwbc10 = TO_DCN10_DWBC(dwbc); -- -- /* disable CNV */ -- REG_UPDATE(CNV_MODE, CNV_FRAME_CAPTURE_EN, 0); -- -- /* disable WB */ -- REG_UPDATE(WB_ENABLE, WB_ENABLE, 0); -- -- /* soft reset */ -- REG_UPDATE(WB_SOFT_RESET, WB_SOFT_RESET, 1); -- REG_UPDATE(WB_SOFT_RESET, WB_SOFT_RESET, 0); -- -- /* enable power gating */ -- REG_UPDATE_5(WB_EC_CONFIG, DISPCLK_R_WB_GATE_DIS, 0, -- DISPCLK_G_WB_GATE_DIS, 0, DISPCLK_G_WBSCL_GATE_DIS, 0, -- WB_LB_LS_DIS, 0, WB_LUT_LS_DIS, 0); -- -- /* disable buffer manager */ -- REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_ENABLE, 0); -- -- dwbc->status.enabled = false; -- -- return true; --} -- --static bool get_status(struct dwbc *dwbc, struct dwb_status *status) --{ -- if (status) { -- memcpy(status, &dwbc->status, sizeof(struct dwb_status)); -- return true; -- } else { -- return false; -- } --} -- --static bool dump_frame(struct dwbc *dwbc, struct dwb_frame_info *frame_info, -- unsigned char *luma_buffer, unsigned char *chroma_buffer, -- unsigned char *dest_luma_buffer, unsigned char *dest_chroma_buffer) --{ -- struct dcn10_dwbc *dwbc10 = TO_DCN10_DWBC(dwbc); -- -- REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_LOCK, 0xf); -- -- memcpy(dest_luma_buffer, luma_buffer, dwbc->config.basic_settings.luma_pitch * dwbc->config.basic_settings.dest_height); -- memcpy(dest_chroma_buffer, chroma_buffer, dwbc->config.basic_settings.chroma_pitch * dwbc->config.basic_settings.dest_height / 2); -- -- REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_LOCK, 0x0); -- -- frame_info->format = dwbc->config.advanced_settings.out_format; -- frame_info->width = dwbc->config.basic_settings.dest_width; -- frame_info->height = dwbc->config.basic_settings.dest_height; -- frame_info->luma_pitch = dwbc->config.basic_settings.luma_pitch; -- frame_info->chroma_pitch = dwbc->config.basic_settings.chroma_pitch; -- frame_info->size = dwbc->config.basic_settings.dest_height * (dwbc->config.basic_settings.luma_pitch + dwbc->config.basic_settings.chroma_pitch); -- -- return true; --} -- --static bool set_basic_settings(struct dwbc *dwbc, -- const struct dwb_basic_settings *basic_settings) --{ -- if (basic_settings) { -- memcpy(&dwbc->config.basic_settings, basic_settings, sizeof(struct dwb_basic_settings)); -- return true; -- } else { -- return false; -- } --} -- --static bool get_basic_settings(struct dwbc *dwbc, -- struct dwb_basic_settings *basic_settings) --{ -- if (basic_settings) { -- memcpy(basic_settings, &dwbc->config.basic_settings, sizeof(struct dwb_basic_settings)); -- return true; -- } else { -- return false; -- } --} -- --static bool set_advanced_settings(struct dwbc *dwbc, -- const struct dwb_advanced_settings *advanced_settings) --{ -- if (advanced_settings) { -- if (advanced_settings->uFlag & sf_output_format) { -- dwbc->config.advanced_settings.uFlag |= sf_output_format; -- dwbc->config.advanced_settings.out_format = advanced_settings->out_format; -- } -- -- if (advanced_settings->uFlag & sf_capture_rate) { -- dwbc->config.advanced_settings.uFlag |= sf_capture_rate; -- dwbc->config.advanced_settings.capture_rate = advanced_settings->capture_rate; -- } -- -- return true; -- } else { -- return false; -- } --} -- --static bool get_advanced_settings(struct dwbc *dwbc, -- struct dwb_advanced_settings *advanced_settings) --{ -- if (advanced_settings) { -- memcpy(advanced_settings, &dwbc->config.advanced_settings, sizeof(struct dwb_advanced_settings)); -- return true; -- } else { -- return false; -- } --} -- --static bool reset_advanced_settings(struct dwbc *dwbc) --{ -- dwbc->config.advanced_settings.uFlag = 0; -- dwbc->config.advanced_settings.out_format = dwb_scaler_mode_bypass444; -- dwbc->config.advanced_settings.capture_rate = dwb_capture_rate_0; -- -- return true; --} -- --const struct dwbc_funcs dcn10_dwbc_funcs = { -- .get_caps = get_caps, -- .enable = enable, -- .disable = disable, -- .get_status = get_status, -- .dump_frame = dump_frame, -- .set_basic_settings = set_basic_settings, -- .get_basic_settings = get_basic_settings, -- .set_advanced_settings = set_advanced_settings, -- .get_advanced_settings = get_advanced_settings, -- .reset_advanced_settings = reset_advanced_settings, --}; -- --static void dcn10_dwbc_construct(struct dcn10_dwbc *dwbc10, -- struct dc_context *ctx, -- const struct dcn10_dwbc_registers *dwbc_regs, -- const struct dcn10_dwbc_shift *dwbc_shift, -- const struct dcn10_dwbc_mask *dwbc_mask, -- int inst) --{ -- dwbc10->base.ctx = ctx; -- -- dwbc10->base.inst = inst; -- dwbc10->base.funcs = &dcn10_dwbc_funcs; -- -- dwbc10->dwbc_regs = dwbc_regs; -- dwbc10->dwbc_shift = dwbc_shift; -- dwbc10->dwbc_mask = dwbc_mask; --} -- --bool dcn10_dwbc_create(struct dc_context *ctx, struct resource_pool *pool) --{ -- int i; -- uint32_t pipe_count = pool->res_cap->num_dwb; -- -- ASSERT(pipe_count > 0); -- -- for (i = 0; i < pipe_count; i++) { -- struct dcn10_dwbc *dwbc10 = dm_alloc(sizeof(struct dcn10_dwbc)); -- -- if (!dwbc10) -- return false; -- -- dcn10_dwbc_construct(dwbc10, ctx, -- &dwbc10_regs[i], -- &dwbc10_shift, -- &dwbc10_mask, -- i); -- -- pool->dwbc[i] = &dwbc10->base; -- if (pool->dwbc[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dm_error("DC: failed to create dwbc10!\n"); -- return false; -- } -- } -- return true; --} --#endif -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.h -deleted file mode 100644 -index cf530ae..0000000 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.h -+++ /dev/null -@@ -1,32 +0,0 @@ --/* Copyright 2012-17 Advanced Micro Devices, Inc. -- * -- * Permission is hereby granted, free of charge, to any person obtaining a -- * copy of this software and associated documentation files (the "Software"), -- * to deal in the Software without restriction, including without limitation -- * the rights to use, copy, modify, merge, publish, distribute, sublicense, -- * and/or sell copies of the Software, and to permit persons to whom the -- * Software is furnished to do so, subject to the following conditions: -- * -- * The above copyright notice and this permission notice shall be included in -- * all copies or substantial portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR -- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -- * OTHER DEALINGS IN THE SOFTWARE. -- * -- * Authors: AMD -- * -- */ --#ifndef __DC_DWBC_DCN10_H__ --#define __DC_DWBC_DCN10_H__ -- --#if defined(CONFIG_DRM_AMD_DC_DCN1_0) -- --bool dcn10_dwbc_create(struct dc_context *ctx, struct resource_pool *pool); --#endif -- --#endif -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 7ea2744..7b943e1 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 -@@ -32,13 +32,15 @@ - #include "dce/dce_hwseq.h" - #include "abm.h" - #include "dcn10/dcn10_mem_input.h" --#include "dcn10/dcn10_timing_generator.h" - #include "dcn10/dcn10_dpp.h" - #include "dcn10/dcn10_mpc.h" - #include "timing_generator.h" - #include "opp.h" - #include "ipp.h" - #include "mpc.h" -+#include "raven1/DCN/dcn_1_0_offset.h" -+#include "raven1/DCN/dcn_1_0_sh_mask.h" -+#include "vega10/soc15ip.h" - #include "reg_helper.h" - - #define CTX \ -@@ -50,7 +52,7 @@ - #define FN(reg_name, field_name) \ - hws->shifts->field_name, hws->masks->field_name - --static void log_mpc_crc(struct dc *dc) -+static void log_mpc_crc(struct core_dc *dc) - { - struct dc_context *dc_ctx = dc->ctx; - struct dce_hwseq *hws = dc->hwseq; -@@ -128,7 +130,7 @@ static void dcn10_hubbub_wm_read_state(struct dce_hwseq *hws, - s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D); - } - --static void dcn10_log_hubbub_state(struct dc *dc) -+static void dcn10_log_hubbub_state(struct core_dc *dc) - { - struct dc_context *dc_ctx = dc->ctx; - struct dcn_hubbub_wm wm; -@@ -155,7 +157,7 @@ static void dcn10_log_hubbub_state(struct dc *dc) - DTN_INFO("\n"); - } - --static void dcn10_log_hw_state(struct dc *dc) -+static void dcn10_log_hw_state(struct core_dc *dc) - { - struct dc_context *dc_ctx = dc->ctx; - struct resource_pool *pool = dc->res_pool; -@@ -198,38 +200,6 @@ static void dcn10_log_hw_state(struct dc *dc) - } - DTN_INFO("\n"); - -- DTN_INFO("OTG:\t v_bs \t v_be \t v_ss \t v_se \t vpol \t vmax \t vmin \t " -- "h_bs \t h_be \t h_ss \t h_se \t hpol \t htot \t vtot \t underflow\n"); -- -- for (i = 0; i < pool->pipe_count; i++) { -- struct timing_generator *tg = pool->timing_generators[i]; -- struct dcn_otg_state s; -- -- tgn10_read_otg_state(DCN10TG_FROM_TG(tg), &s); -- -- DTN_INFO("[%d]:\t %d \t %d \t %d \t %d \t " -- "%d \t %d \t %d \t %d \t %d \t %d \t " -- "%d \t %d \t %d \t %d \t %d \t ", -- i, -- s.v_blank_start, -- s.v_blank_end, -- s.v_sync_a_start, -- s.v_sync_a_end, -- s.v_sync_a_pol, -- s.v_total_max, -- s.v_total_min, -- s.h_blank_start, -- s.h_blank_end, -- s.h_sync_a_start, -- s.h_sync_a_end, -- s.h_sync_a_pol, -- s.h_total, -- s.v_total, -- s.underflow_occurred_status); -- DTN_INFO("\n"); -- } -- DTN_INFO("\n"); -- - log_mpc_crc(dc); - - DTN_INFO_END(); -@@ -303,7 +273,7 @@ static void verify_allow_pstate_change_high( - forced_pstate_allow = true; - - if (should_log_hw_state) { -- dcn10_log_hw_state(hws->ctx->dc); -+ dcn10_log_hw_state(DC_TO_CORE(hws->ctx->dc)); - } - - BREAK_TO_DEBUGGER(); -@@ -772,61 +742,11 @@ static void power_on_plane( - hubp_pg_control(hws, plane_id, true); - REG_SET(DC_IP_REQUEST_CNTL, 0, - IP_REQUEST_EN, 0); -- dm_logger_write(hws->ctx->logger, LOG_DEBUG, -+ dm_logger_write(hws->ctx->logger, LOG_DC, - "Un-gated front end for pipe %d\n", plane_id); - } - --static void undo_DEGVIDCN10_253_wa(struct dc *dc) --{ -- struct dce_hwseq *hws = dc->hwseq; -- struct mem_input *mi = dc->res_pool->mis[0]; -- int pwr_status = 0; -- -- REG_GET(DOMAIN0_PG_STATUS, DOMAIN0_PGFSM_PWR_STATUS, &pwr_status); -- /* Don't need to blank if hubp is power gated*/ -- if (pwr_status == 2) -- return; -- -- mi->funcs->set_blank(mi, true); -- -- REG_SET(DC_IP_REQUEST_CNTL, 0, -- IP_REQUEST_EN, 1); -- -- hubp_pg_control(hws, 0, false); -- REG_SET(DC_IP_REQUEST_CNTL, 0, -- IP_REQUEST_EN, 0); --} -- --static void ready_shared_resources(struct dc *dc) --{ -- if (dc->current_state->stream_count == 0 && -- !dc->debug.disable_stutter) -- undo_DEGVIDCN10_253_wa(dc); --} -- --static void apply_DEGVIDCN10_253_wa(struct dc *dc) --{ -- struct dce_hwseq *hws = dc->hwseq; -- struct mem_input *mi = dc->res_pool->mis[0]; -- -- REG_SET(DC_IP_REQUEST_CNTL, 0, -- IP_REQUEST_EN, 1); -- -- hubp_pg_control(hws, 0, true); -- REG_SET(DC_IP_REQUEST_CNTL, 0, -- IP_REQUEST_EN, 0); -- -- mi->funcs->set_hubp_blank_en(mi, false); --} -- --static void optimize_shared_resources(struct dc *dc) --{ -- if (dc->current_state->stream_count == 0 && -- !dc->debug.disable_stutter) -- apply_DEGVIDCN10_253_wa(dc); --} -- --static void bios_golden_init(struct dc *dc) -+static void bios_golden_init(struct core_dc *dc) - { - struct dc_bios *bp = dc->ctx->dc_bios; - int i; -@@ -842,7 +762,7 @@ static void bios_golden_init(struct dc *dc) - } - } - --static void dcn10_init_hw(struct dc *dc) -+static void dcn10_init_hw(struct core_dc *dc) - { - int i; - struct abm *abm = dc->res_pool->abm; -@@ -853,7 +773,7 @@ static void dcn10_init_hw(struct dc *dc) - REG_UPDATE(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, 1); - REG_WRITE(DIO_MEM_PWR_CTRL, 0); - -- if (!dc->debug.disable_clock_gate) { -+ if (!dc->public.debug.disable_clock_gate) { - /* enable all DCN clock gating */ - REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0); - -@@ -910,7 +830,7 @@ static void dcn10_init_hw(struct dc *dc) - /* power AFMT HDMI memory TODO: may move to dis/en output save power*/ - REG_WRITE(DIO_MEM_PWR_CTRL, 0); - -- if (!dc->debug.disable_clock_gate) { -+ if (!dc->public.debug.disable_clock_gate) { - /* enable all DCN clock gating */ - REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0); - -@@ -924,8 +844,8 @@ static void dcn10_init_hw(struct dc *dc) - - static enum dc_status dcn10_prog_pixclk_crtc_otg( - struct pipe_ctx *pipe_ctx, -- struct dc_state *context, -- struct dc *dc) -+ struct validate_context *context, -+ struct core_dc *dc) - { - struct dc_stream_state *stream = pipe_ctx->stream; - enum dc_color_space color_space; -@@ -1012,9 +932,9 @@ static enum dc_status dcn10_prog_pixclk_crtc_otg( - } - - static void reset_back_end_for_pipe( -- struct dc *dc, -+ struct core_dc *dc, - struct pipe_ctx *pipe_ctx, -- struct dc_state *context) -+ struct validate_context *context) - { - int i; - -@@ -1046,20 +966,20 @@ static void reset_back_end_for_pipe( - &pipe_ctx->clock_source); - - for (i = 0; i < dc->res_pool->pipe_count; i++) -- if (&dc->current_state->res_ctx.pipe_ctx[i] == pipe_ctx) -+ if (&dc->current_context->res_ctx.pipe_ctx[i] == pipe_ctx) - break; - - if (i == dc->res_pool->pipe_count) - return; - - pipe_ctx->stream = NULL; -- dm_logger_write(dc->ctx->logger, LOG_DEBUG, -+ dm_logger_write(dc->ctx->logger, LOG_DC, - "Reset back end for pipe %d, tg:%d\n", - pipe_ctx->pipe_idx, pipe_ctx->stream_res.tg->inst); - } - - /* trigger HW to start disconnect plane from stream on the next vsync */ --static void plane_atomic_disconnect(struct dc *dc, -+static void plane_atomic_disconnect(struct core_dc *dc, - int fe_idx) - { - struct mem_input *mi = dc->res_pool->mis[fe_idx]; -@@ -1084,10 +1004,10 @@ static void plane_atomic_disconnect(struct dc *dc, - if (opp_id == dc->res_pool->pipe_count) - return; - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - mi->funcs->dcc_control(mi, false, false); -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - - mpc->funcs->remove(mpc, dc->res_pool->opps[opp_id], fe_idx); -@@ -1095,7 +1015,7 @@ static void plane_atomic_disconnect(struct dc *dc, - - /* disable HW used by plane. - * note: cannot disable until disconnect is complete */ --static void plane_atomic_disable(struct dc *dc, -+static void plane_atomic_disable(struct core_dc *dc, - int fe_idx) - { - struct dce_hwseq *hws = dc->hwseq; -@@ -1113,8 +1033,11 @@ static void plane_atomic_disable(struct dc *dc, - fe_idx);*/ - - mi->funcs->set_blank(mi, true); -+ /*todo: unhack this*/ -+ mi->opp_id = 0xf; -+ mi->mpcc_id = 0xf; - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - - REG_UPDATE(HUBP_CLK_CNTL[fe_idx], -@@ -1126,7 +1049,7 @@ static void plane_atomic_disable(struct dc *dc, - REG_UPDATE(OPP_PIPE_CONTROL[opp_id], - OPP_PIPE_CLOCK_EN, 0); - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - } - -@@ -1134,7 +1057,7 @@ static void plane_atomic_disable(struct dc *dc, - * kill power to plane hw - * note: cannot power down until plane is disable - */ --static void plane_atomic_power_down(struct dc *dc, int fe_idx) -+static void plane_atomic_power_down(struct core_dc *dc, int fe_idx) - { - struct dce_hwseq *hws = dc->hwseq; - struct transform *xfm = dc->res_pool->transforms[fe_idx]; -@@ -1146,16 +1069,16 @@ static void plane_atomic_power_down(struct dc *dc, int fe_idx) - xfm->funcs->transform_reset(xfm); - REG_SET(DC_IP_REQUEST_CNTL, 0, - IP_REQUEST_EN, 0); -- dm_logger_write(dc->ctx->logger, LOG_DEBUG, -+ dm_logger_write(dc->ctx->logger, LOG_DC, - "Power gated front end %d\n", fe_idx); - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - } - - - static void reset_front_end( -- struct dc *dc, -+ struct core_dc *dc, - int fe_idx) - { - struct dce_hwseq *hws = dc->hwseq; -@@ -1174,7 +1097,7 @@ static void reset_front_end( - REG_UPDATE(OTG_GLOBAL_SYNC_STATUS[tg->inst], VUPDATE_NO_LOCK_EVENT_CLEAR, 1); - tg->funcs->unlock(tg); - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(hws); - - if (tg->ctx->dce_environment != DCE_ENV_FPGA_MAXIMUS) -@@ -1189,7 +1112,7 @@ static void reset_front_end( - fe_idx); - } - --static void dcn10_power_down_fe(struct dc *dc, int fe_idx) -+static void dcn10_power_down_fe(struct core_dc *dc, int fe_idx) - { - struct dce_hwseq *hws = dc->hwseq; - struct transform *xfm = dc->res_pool->transforms[fe_idx]; -@@ -1203,23 +1126,23 @@ static void dcn10_power_down_fe(struct dc *dc, int fe_idx) - xfm->funcs->transform_reset(xfm); - REG_SET(DC_IP_REQUEST_CNTL, 0, - IP_REQUEST_EN, 0); -- dm_logger_write(dc->ctx->logger, LOG_DEBUG, -+ dm_logger_write(dc->ctx->logger, LOG_DC, - "Power gated front end %d\n", fe_idx); - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - } - - static void reset_hw_ctx_wrap( -- struct dc *dc, -- struct dc_state *context) -+ struct core_dc *dc, -+ struct validate_context *context) - { - int i; - - /* Reset Front End*/ - /* Lock*/ - for (i = 0; i < dc->res_pool->pipe_count; i++) { -- struct pipe_ctx *cur_pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i]; -+ struct pipe_ctx *cur_pipe_ctx = &dc->current_context->res_ctx.pipe_ctx[i]; - struct timing_generator *tg = cur_pipe_ctx->stream_res.tg; - - if (cur_pipe_ctx->stream) -@@ -1228,7 +1151,7 @@ static void reset_hw_ctx_wrap( - /* Disconnect*/ - for (i = dc->res_pool->pipe_count - 1; i >= 0 ; i--) { - struct pipe_ctx *pipe_ctx_old = -- &dc->current_state->res_ctx.pipe_ctx[i]; -+ &dc->current_context->res_ctx.pipe_ctx[i]; - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; - - if (!pipe_ctx->stream || -@@ -1240,7 +1163,7 @@ static void reset_hw_ctx_wrap( - } - /* Unlock*/ - for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) { -- struct pipe_ctx *cur_pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i]; -+ struct pipe_ctx *cur_pipe_ctx = &dc->current_context->res_ctx.pipe_ctx[i]; - struct timing_generator *tg = cur_pipe_ctx->stream_res.tg; - - if (cur_pipe_ctx->stream) -@@ -1250,7 +1173,7 @@ static void reset_hw_ctx_wrap( - /* Disable and Powerdown*/ - for (i = dc->res_pool->pipe_count - 1; i >= 0 ; i--) { - struct pipe_ctx *pipe_ctx_old = -- &dc->current_state->res_ctx.pipe_ctx[i]; -+ &dc->current_context->res_ctx.pipe_ctx[i]; - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; - - /*if (!pipe_ctx_old->stream) -@@ -1269,7 +1192,7 @@ static void reset_hw_ctx_wrap( - /* Reset Back End*/ - for (i = dc->res_pool->pipe_count - 1; i >= 0 ; i--) { - struct pipe_ctx *pipe_ctx_old = -- &dc->current_state->res_ctx.pipe_ctx[i]; -+ &dc->current_context->res_ctx.pipe_ctx[i]; - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; - - if (!pipe_ctx_old->stream) -@@ -1277,7 +1200,7 @@ static void reset_hw_ctx_wrap( - - if (!pipe_ctx->stream || - pipe_need_reprogram(pipe_ctx_old, pipe_ctx)) -- reset_back_end_for_pipe(dc, pipe_ctx_old, dc->current_state); -+ reset_back_end_for_pipe(dc, pipe_ctx_old, dc->current_context); - } - } - -@@ -1323,7 +1246,7 @@ static void toggle_watermark_change_req(struct dce_hwseq *hws) - DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, watermark_change_req); - } - --static void dcn10_update_plane_addr(const struct dc *dc, struct pipe_ctx *pipe_ctx) -+static void update_plane_addr(const struct core_dc *dc, struct pipe_ctx *pipe_ctx) - { - bool addr_patched = false; - PHYSICAL_ADDRESS_LOC addr; -@@ -1344,34 +1267,34 @@ static void dcn10_update_plane_addr(const struct dc *dc, struct pipe_ctx *pipe_c - static bool dcn10_set_input_transfer_func( - struct pipe_ctx *pipe_ctx, const struct dc_plane_state *plane_state) - { -- struct transform *xfm_base = pipe_ctx->plane_res.xfm; -+ struct input_pixel_processor *ipp = pipe_ctx->plane_res.ipp; - const struct dc_transfer_func *tf = NULL; - bool result = true; - -- if (xfm_base == NULL) -+ if (ipp == NULL) - return false; - - if (plane_state->in_transfer_func) - tf = plane_state->in_transfer_func; - - if (plane_state->gamma_correction && dce_use_lut(plane_state)) -- xfm_base->funcs->ipp_program_input_lut(xfm_base, -+ ipp->funcs->ipp_program_input_lut(ipp, - plane_state->gamma_correction); - - if (tf == NULL) -- xfm_base->funcs->ipp_set_degamma(xfm_base, IPP_DEGAMMA_MODE_BYPASS); -+ ipp->funcs->ipp_set_degamma(ipp, IPP_DEGAMMA_MODE_BYPASS); - else if (tf->type == TF_TYPE_PREDEFINED) { - switch (tf->tf) { - case TRANSFER_FUNCTION_SRGB: -- xfm_base->funcs->ipp_set_degamma(xfm_base, -+ ipp->funcs->ipp_set_degamma(ipp, - IPP_DEGAMMA_MODE_HW_sRGB); - break; - case TRANSFER_FUNCTION_BT709: -- xfm_base->funcs->ipp_set_degamma(xfm_base, -+ ipp->funcs->ipp_set_degamma(ipp, - IPP_DEGAMMA_MODE_HW_xvYCC); - break; - case TRANSFER_FUNCTION_LINEAR: -- xfm_base->funcs->ipp_set_degamma(xfm_base, -+ ipp->funcs->ipp_set_degamma(ipp, - IPP_DEGAMMA_MODE_BYPASS); - break; - case TRANSFER_FUNCTION_PQ: -@@ -1382,7 +1305,7 @@ static bool dcn10_set_input_transfer_func( - break; - } - } else if (tf->type == TF_TYPE_BYPASS) { -- xfm_base->funcs->ipp_set_degamma(xfm_base, IPP_DEGAMMA_MODE_BYPASS); -+ ipp->funcs->ipp_set_degamma(ipp, IPP_DEGAMMA_MODE_BYPASS); - } else { - /*TF_TYPE_DISTRIBUTED_POINTS*/ - result = false; -@@ -1734,7 +1657,7 @@ static bool dcn10_set_output_transfer_func( - } - - static void dcn10_pipe_control_lock( -- struct dc *dc, -+ struct core_dc *dc, - struct pipe_ctx *pipe, - bool lock) - { -@@ -1746,7 +1669,7 @@ static void dcn10_pipe_control_lock( - if (pipe->top_pipe) - return; - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - - if (lock) -@@ -1754,7 +1677,7 @@ static void dcn10_pipe_control_lock( - else - pipe->stream_res.tg->funcs->unlock(pipe->stream_res.tg); - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - } - -@@ -1796,7 +1719,7 @@ static bool wait_for_reset_trigger_to_occur( - } - - static void dcn10_enable_timing_synchronization( -- struct dc *dc, -+ struct core_dc *dc, - int group_index, - int group_size, - struct pipe_ctx *grouped_pipes[]) -@@ -1825,7 +1748,7 @@ static void dcn10_enable_timing_synchronization( - } - - static void print_rq_dlg_ttu( -- struct dc *core_dc, -+ struct core_dc *core_dc, - struct pipe_ctx *pipe_ctx) - { - dm_logger_write(core_dc->ctx->logger, LOG_BANDWIDTH_CALCS, -@@ -1947,14 +1870,14 @@ static void print_rq_dlg_ttu( - } - - static void dcn10_power_on_fe( -- struct dc *dc, -+ struct core_dc *dc, - struct pipe_ctx *pipe_ctx, -- struct dc_state *context) -+ struct validate_context *context) - { - struct dc_plane_state *plane_state = pipe_ctx->plane_state; - struct dce_hwseq *hws = dc->hwseq; - -- if (dc->debug.sanity_checks) { -+ if (dc->public.debug.sanity_checks) { - verify_allow_pstate_change_high(dc->hwseq); - } - -@@ -1971,7 +1894,7 @@ static void dcn10_power_on_fe( - /*TODO: REG_UPDATE(DENTIST_DISPCLK_CNTL, DENTIST_DPPCLK_WDIVIDER, 0x1f);*/ - - if (plane_state) { -- dm_logger_write(dc->ctx->logger, LOG_DEBUG, -+ dm_logger_write(dc->ctx->logger, LOG_DC, - "Pipe:%d 0x%x: addr hi:0x%x, " - "addr low:0x%x, " - "src: %d, %d, %d," -@@ -1989,7 +1912,7 @@ static void dcn10_power_on_fe( - plane_state->dst_rect.width, - plane_state->dst_rect.height); - -- dm_logger_write(dc->ctx->logger, LOG_DEBUG, -+ dm_logger_write(dc->ctx->logger, LOG_HW_SET_MODE, - "Pipe %d: width, height, x, y\n" - "viewport:%d, %d, %d, %d\n" - "recout: %d, %d, %d, %d\n", -@@ -2005,7 +1928,7 @@ static void dcn10_power_on_fe( - print_rq_dlg_ttu(dc, pipe_ctx); - } - -- if (dc->debug.sanity_checks) { -+ if (dc->public.debug.sanity_checks) { - verify_allow_pstate_change_high(dc->hwseq); - } - } -@@ -2160,101 +2083,14 @@ static void dcn10_get_surface_visual_confirm_color( - } - } - --static void mmhub_read_vm_system_aperture_settings(struct dcn10_mem_input *mi, -- struct vm_system_aperture_param *apt, -- struct dce_hwseq *hws) --{ -- PHYSICAL_ADDRESS_LOC physical_page_number; -- uint32_t logical_addr_low; -- uint32_t logical_addr_high; -- -- REG_GET(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, -- PHYSICAL_PAGE_NUMBER_MSB, &physical_page_number.high_part); -- REG_GET(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, -- PHYSICAL_PAGE_NUMBER_LSB, &physical_page_number.low_part); -- -- REG_GET(MC_VM_SYSTEM_APERTURE_LOW_ADDR, -- LOGICAL_ADDR, &logical_addr_low); -- -- REG_GET(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, -- LOGICAL_ADDR, &logical_addr_high); -- -- apt->sys_default.quad_part = physical_page_number.quad_part << 12; -- apt->sys_low.quad_part = (int64_t)logical_addr_low << 18; -- apt->sys_high.quad_part = (int64_t)logical_addr_high << 18; --} -- --/* Temporary read settings, future will get values from kmd directly */ --static void mmhub_read_vm_context0_settings(struct dcn10_mem_input *mi, -- struct vm_context0_param *vm0, -- struct dce_hwseq *hws) --{ -- PHYSICAL_ADDRESS_LOC fb_base; -- PHYSICAL_ADDRESS_LOC fb_offset; -- uint32_t fb_base_value; -- uint32_t fb_offset_value; -- -- REG_GET(DCHUBBUB_SDPIF_FB_BASE, SDPIF_FB_BASE, &fb_base_value); -- REG_GET(DCHUBBUB_SDPIF_FB_OFFSET, SDPIF_FB_OFFSET, &fb_offset_value); -- -- REG_GET(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, -- PAGE_DIRECTORY_ENTRY_HI32, &vm0->pte_base.high_part); -- REG_GET(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, -- PAGE_DIRECTORY_ENTRY_LO32, &vm0->pte_base.low_part); -- -- REG_GET(VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, -- LOGICAL_PAGE_NUMBER_HI4, &vm0->pte_start.high_part); -- REG_GET(VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, -- LOGICAL_PAGE_NUMBER_LO32, &vm0->pte_start.low_part); -- -- REG_GET(VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, -- LOGICAL_PAGE_NUMBER_HI4, &vm0->pte_end.high_part); -- REG_GET(VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, -- LOGICAL_PAGE_NUMBER_LO32, &vm0->pte_end.low_part); -- -- REG_GET(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32, -- PHYSICAL_PAGE_ADDR_HI4, &vm0->fault_default.high_part); -- REG_GET(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32, -- PHYSICAL_PAGE_ADDR_LO32, &vm0->fault_default.low_part); -- -- /* -- * The values in VM_CONTEXT0_PAGE_TABLE_BASE_ADDR is in UMA space. -- * Therefore we need to do -- * DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR = VM_CONTEXT0_PAGE_TABLE_BASE_ADDR -- * - DCHUBBUB_SDPIF_FB_OFFSET + DCHUBBUB_SDPIF_FB_BASE -- */ -- fb_base.quad_part = (uint64_t)fb_base_value << 24; -- fb_offset.quad_part = (uint64_t)fb_offset_value << 24; -- vm0->pte_base.quad_part += fb_base.quad_part; -- vm0->pte_base.quad_part -= fb_offset.quad_part; --} -- --static void dcn10_program_pte_vm(struct mem_input *mem_input, -- enum surface_pixel_format format, -- union dc_tiling_info *tiling_info, -- enum dc_rotation_angle rotation, -- struct dce_hwseq *hws) --{ -- struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -- struct vm_system_aperture_param apt = { {{ 0 } } }; -- struct vm_context0_param vm0 = { { { 0 } } }; -- -- -- mmhub_read_vm_system_aperture_settings(mi, &apt, hws); -- mmhub_read_vm_context0_settings(mi, &vm0, hws); -- -- mem_input->funcs->mem_input_set_vm_system_aperture_settings(mem_input, &apt); -- mem_input->funcs->mem_input_set_vm_context0_settings(mem_input, &vm0); --} -- - static void update_dchubp_dpp( -- struct dc *dc, -+ struct core_dc *dc, - struct pipe_ctx *pipe_ctx, -- struct dc_state *context) -+ struct validate_context *context) - { - struct dce_hwseq *hws = dc->hwseq; - struct mem_input *mi = pipe_ctx->plane_res.mi; -- struct transform *xfm = pipe_ctx->plane_res.xfm; -+ struct input_pixel_processor *ipp = pipe_ctx->plane_res.ipp; - struct dc_plane_state *plane_state = pipe_ctx->plane_state; - union plane_size size = plane_state->plane_size; - struct default_adjustment ocsc = {0}; -@@ -2269,7 +2105,7 @@ static void update_dchubp_dpp( - pipe_ctx->pipe_idx, - pipe_ctx->stream_res.pix_clk_params.requested_pix_clk, - context->bw.dcn.calc_clk.dppclk_div); -- dc->current_state->bw.dcn.cur_clk.dppclk_div = -+ dc->current_context->bw.dcn.cur_clk.dppclk_div = - context->bw.dcn.calc_clk.dppclk_div; - context->bw.dcn.cur_clk.dppclk_div = context->bw.dcn.calc_clk.dppclk_div; - -@@ -2279,7 +2115,7 @@ static void update_dchubp_dpp( - */ - REG_UPDATE(DCHUBP_CNTL[pipe_ctx->pipe_idx], HUBP_VTG_SEL, pipe_ctx->stream_res.tg->inst); - -- dc->hwss.update_plane_addr(dc, pipe_ctx); -+ update_plane_addr(dc, pipe_ctx); - - mi->funcs->mem_input_setup( - mi, -@@ -2290,16 +2126,14 @@ static void update_dchubp_dpp( - - size.grph.surface_size = pipe_ctx->plane_res.scl_data.viewport; - -- if (dc->config.gpu_vm_support) -- dcn10_program_pte_vm( -+ if (dc->public.config.gpu_vm_support) -+ mi->funcs->mem_input_program_pte_vm( - pipe_ctx->plane_res.mi, - plane_state->format, - &plane_state->tiling_info, -- plane_state->rotation, -- hws -- ); -+ plane_state->rotation); - -- xfm->funcs->ipp_setup(xfm, -+ ipp->funcs->ipp_setup(ipp, - plane_state->format, - 1, - IPP_OUTPUT_FORMAT_12_BIT_FIX); -@@ -2308,7 +2142,7 @@ static void update_dchubp_dpp( - mpcc_cfg.opp = pipe_ctx->stream_res.opp; - for (top_pipe = pipe_ctx->top_pipe; top_pipe; top_pipe = top_pipe->top_pipe) - mpcc_cfg.z_index++; -- if (dc->debug.surface_visual_confirm) -+ if (dc->public.debug.surface_visual_confirm) - dcn10_get_surface_visual_confirm_color( - pipe_ctx, &mpcc_cfg.black_color); - else -@@ -2348,15 +2182,14 @@ static void update_dchubp_dpp( - &plane_state->dcc, - plane_state->horizontal_mirror); - -- if (is_pipe_tree_visible(pipe_ctx)) -- mi->funcs->set_blank(mi, false); -+ mi->funcs->set_blank(mi, !is_pipe_tree_visible(pipe_ctx)); - } - - - static void program_all_pipe_in_tree( -- struct dc *dc, -+ struct core_dc *dc, - struct pipe_ctx *pipe_ctx, -- struct dc_state *context) -+ struct validate_context *context) - { - unsigned int ref_clk_mhz = dc->res_pool->ref_clock_inKhz/1000; - -@@ -2368,7 +2201,7 @@ static void program_all_pipe_in_tree( - /* watermark is for all pipes */ - program_watermarks(dc->hwseq, &context->bw.dcn.watermarks, ref_clk_mhz); - -- if (dc->debug.sanity_checks) { -+ if (dc->public.debug.sanity_checks) { - /* pstate stuck check after watermark update */ - verify_allow_pstate_change_high(dc->hwseq); - } -@@ -2403,18 +2236,18 @@ static void program_all_pipe_in_tree( - update_dchubp_dpp(dc, pipe_ctx, context); - } - -- if (dc->debug.sanity_checks) { -+ if (dc->public.debug.sanity_checks) { - /* pstate stuck check after each pipe is programmed */ - verify_allow_pstate_change_high(dc->hwseq); - } - -- if (pipe_ctx->bottom_pipe != NULL && pipe_ctx->bottom_pipe != pipe_ctx) -+ if (pipe_ctx->bottom_pipe != NULL) - program_all_pipe_in_tree(dc, pipe_ctx->bottom_pipe, context); - } - - static void dcn10_pplib_apply_display_requirements( -- struct dc *dc, -- struct dc_state *context) -+ struct core_dc *dc, -+ struct validate_context *context) - { - struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg; - -@@ -2440,14 +2273,14 @@ static void dcn10_pplib_apply_display_requirements( - } - - static void dcn10_apply_ctx_for_surface( -- struct dc *dc, -+ struct core_dc *dc, - const struct dc_stream_state *stream, - int num_planes, -- struct dc_state *context) -+ struct validate_context *context) - { - int i, be_idx; - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - - be_idx = -1; -@@ -2463,12 +2296,10 @@ static void dcn10_apply_ctx_for_surface( - if (num_planes == 0) { - for (i = dc->res_pool->pipe_count - 1; i >= 0 ; i--) { - struct pipe_ctx *old_pipe_ctx = -- &dc->current_state->res_ctx.pipe_ctx[i]; -+ &dc->current_context->res_ctx.pipe_ctx[i]; - -- if (old_pipe_ctx->stream_res.tg && old_pipe_ctx->stream_res.tg->inst == be_idx) { -- old_pipe_ctx->stream_res.tg->funcs->set_blank(old_pipe_ctx->stream_res.tg, true); -+ if (old_pipe_ctx->stream_res.tg && old_pipe_ctx->stream_res.tg->inst == be_idx) - dcn10_power_down_fe(dc, old_pipe_ctx->pipe_idx); -- } - } - return; - } -@@ -2477,7 +2308,7 @@ static void dcn10_apply_ctx_for_surface( - for (i = 0; i < dc->res_pool->pipe_count; i++) { - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; - struct pipe_ctx *old_pipe_ctx = -- &dc->current_state->res_ctx.pipe_ctx[i]; -+ &dc->current_context->res_ctx.pipe_ctx[i]; - - if (!pipe_ctx->plane_state && !old_pipe_ctx->plane_state) - continue; -@@ -2520,7 +2351,7 @@ static void dcn10_apply_ctx_for_surface( - "[debug_mpo: apply_ctx disconnect pending on mpcc %d]\n", - old_pipe_ctx->mpcc->inst);*/ - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - - old_pipe_ctx->top_pipe = NULL; -@@ -2591,21 +2422,18 @@ static void dcn10_apply_ctx_for_surface( - context->bw.dcn.watermarks.d.pte_meta_urgent_ns - ); - -- if (dc->debug.sanity_checks) -+ if (dc->public.debug.sanity_checks) - verify_allow_pstate_change_high(dc->hwseq); - } - - static void dcn10_set_bandwidth( -- struct dc *dc, -- struct dc_state *context, -+ struct core_dc *dc, -+ struct validate_context *context, - bool decrease_allowed) - { -- struct pp_smu_display_requirement_rv *smu_req_cur = -- &dc->res_pool->pp_smu_req; -- struct pp_smu_display_requirement_rv smu_req = *smu_req_cur; -- struct pp_smu_funcs_rv *pp_smu = dc->res_pool->pp_smu; -+ struct dm_pp_clock_for_voltage_req clock; - -- if (dc->debug.sanity_checks) { -+ if (dc->public.debug.sanity_checks) { - verify_allow_pstate_change_high(dc->hwseq); - } - -@@ -2613,55 +2441,54 @@ static void dcn10_set_bandwidth( - return; - - if (decrease_allowed || context->bw.dcn.calc_clk.dispclk_khz -- > dc->current_state->bw.dcn.cur_clk.dispclk_khz) { -+ > dc->current_context->bw.dcn.cur_clk.dispclk_khz) { - dc->res_pool->display_clock->funcs->set_clock( - dc->res_pool->display_clock, - context->bw.dcn.calc_clk.dispclk_khz); -- dc->current_state->bw.dcn.cur_clk.dispclk_khz = -+ dc->current_context->bw.dcn.cur_clk.dispclk_khz = - context->bw.dcn.calc_clk.dispclk_khz; - } - if (decrease_allowed || context->bw.dcn.calc_clk.dcfclk_khz -- > dc->current_state->bw.dcn.cur_clk.dcfclk_khz) { -- smu_req.hard_min_dcefclk_khz = -- context->bw.dcn.calc_clk.dcfclk_khz; -+ > dc->current_context->bw.dcn.cur_clk.dcfclk_khz) { -+ clock.clk_type = DM_PP_CLOCK_TYPE_DCFCLK; -+ clock.clocks_in_khz = context->bw.dcn.calc_clk.dcfclk_khz; -+ dm_pp_apply_clock_for_voltage_request(dc->ctx, &clock); -+ dc->current_context->bw.dcn.cur_clk.dcfclk_khz = clock.clocks_in_khz; -+ context->bw.dcn.cur_clk.dcfclk_khz = clock.clocks_in_khz; - } - if (decrease_allowed || context->bw.dcn.calc_clk.fclk_khz -- > dc->current_state->bw.dcn.cur_clk.fclk_khz) { -- smu_req.hard_min_fclk_khz = context->bw.dcn.calc_clk.fclk_khz; -+ > dc->current_context->bw.dcn.cur_clk.fclk_khz) { -+ clock.clk_type = DM_PP_CLOCK_TYPE_FCLK; -+ clock.clocks_in_khz = context->bw.dcn.calc_clk.fclk_khz; -+ dm_pp_apply_clock_for_voltage_request(dc->ctx, &clock); -+ dc->current_context->bw.dcn.calc_clk.fclk_khz = clock.clocks_in_khz; -+ context->bw.dcn.cur_clk.fclk_khz = clock.clocks_in_khz; - } - if (decrease_allowed || context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz -- > dc->current_state->bw.dcn.cur_clk.dcfclk_deep_sleep_khz) { -- dc->current_state->bw.dcn.calc_clk.dcfclk_deep_sleep_khz = -+ > dc->current_context->bw.dcn.cur_clk.dcfclk_deep_sleep_khz) { -+ dc->current_context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz = - context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz; - context->bw.dcn.cur_clk.dcfclk_deep_sleep_khz = - context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz; - } -- -- smu_req.display_count = context->stream_count; -- -- if (pp_smu->set_display_requirement) -- pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req); -- -- *smu_req_cur = smu_req; -- - /* Decrease in freq is increase in period so opposite comparison for dram_ccm */ - if (decrease_allowed || context->bw.dcn.calc_clk.dram_ccm_us -- < dc->current_state->bw.dcn.cur_clk.dram_ccm_us) { -- dc->current_state->bw.dcn.calc_clk.dram_ccm_us = -+ < dc->current_context->bw.dcn.cur_clk.dram_ccm_us) { -+ dc->current_context->bw.dcn.calc_clk.dram_ccm_us = - context->bw.dcn.calc_clk.dram_ccm_us; - context->bw.dcn.cur_clk.dram_ccm_us = - context->bw.dcn.calc_clk.dram_ccm_us; - } - if (decrease_allowed || context->bw.dcn.calc_clk.min_active_dram_ccm_us -- < dc->current_state->bw.dcn.cur_clk.min_active_dram_ccm_us) { -- dc->current_state->bw.dcn.calc_clk.min_active_dram_ccm_us = -+ < dc->current_context->bw.dcn.cur_clk.min_active_dram_ccm_us) { -+ dc->current_context->bw.dcn.calc_clk.min_active_dram_ccm_us = - context->bw.dcn.calc_clk.min_active_dram_ccm_us; - context->bw.dcn.cur_clk.min_active_dram_ccm_us = - context->bw.dcn.calc_clk.min_active_dram_ccm_us; - } - dcn10_pplib_apply_display_requirements(dc, context); - -- if (dc->debug.sanity_checks) { -+ if (dc->public.debug.sanity_checks) { - verify_allow_pstate_change_high(dc->hwseq); - } - -@@ -2714,7 +2541,7 @@ static void set_static_screen_control(struct pipe_ctx **pipe_ctx, - } - - static void set_plane_config( -- const struct dc *dc, -+ const struct core_dc *dc, - struct pipe_ctx *pipe_ctx, - struct resource_context *res_ctx) - { -@@ -2759,7 +2586,7 @@ static void dcn10_config_stereo_parameters( - return; - } - --static void dcn10_setup_stereo(struct pipe_ctx *pipe_ctx, struct dc *dc) -+static void dcn10_setup_stereo(struct pipe_ctx *pipe_ctx, struct core_dc *dc) - { - struct crtc_stereo_flags flags = { 0 }; - struct dc_stream_state *stream = pipe_ctx->stream; -@@ -2780,13 +2607,13 @@ static void dcn10_setup_stereo(struct pipe_ctx *pipe_ctx, struct dc *dc) - } - - static void dcn10_wait_for_mpcc_disconnect( -- struct dc *dc, -+ struct core_dc *dc, - struct resource_pool *res_pool, - struct pipe_ctx *pipe_ctx) - { - int i; - -- if (dc->debug.sanity_checks) { -+ if (dc->public.debug.sanity_checks) { - verify_allow_pstate_change_high(dc->hwseq); - } - -@@ -2804,14 +2631,14 @@ static void dcn10_wait_for_mpcc_disconnect( - } - } - -- if (dc->debug.sanity_checks) { -+ if (dc->public.debug.sanity_checks) { - verify_allow_pstate_change_high(dc->hwseq); - } - - } - - static bool dcn10_dummy_display_power_gating( -- struct dc *dc, -+ struct core_dc *dc, - uint8_t controller_id, - struct dc_bios *dcb, - enum pipe_gating_control power_gating) -@@ -2825,7 +2652,7 @@ void dcn10_update_pending_status(struct pipe_ctx *pipe_ctx) - struct timing_generator *tg = pipe_ctx->stream_res.tg; - - if (plane_state->ctx->dc->debug.sanity_checks) { -- struct dc *dc = plane_state->ctx->dc; -+ struct core_dc *dc = DC_TO_CORE(plane_state->ctx->dc); - - verify_allow_pstate_change_high(dc->hwseq); - } -@@ -2837,6 +2664,14 @@ void dcn10_update_pending_status(struct pipe_ctx *pipe_ctx) - pipe_ctx->plane_res.mi->funcs->mem_input_is_flip_pending( - pipe_ctx->plane_res.mi); - -+ /* DCN we read INUSE address in MI, do we still need this wa? */ -+ if (plane_state->status.is_flip_pending && -+ !plane_state->visible) { -+ pipe_ctx->plane_res.mi->current_address = -+ pipe_ctx->plane_res.mi->request_address; -+ BREAK_TO_DEBUGGER(); -+ } -+ - plane_state->status.current_address = pipe_ctx->plane_res.mi->current_address; - if (pipe_ctx->plane_res.mi->current_address.type == PLN_ADDR_TYPE_GRPH_STEREO && - tg->funcs->is_stereo_left_eye) { -@@ -2845,8 +2680,6 @@ void dcn10_update_pending_status(struct pipe_ctx *pipe_ctx) - } - } - -- -- - static const struct hw_sequencer_funcs dcn10_funcs = { - .program_gamut_remap = program_gamut_remap, - .program_csc_matrix = program_csc_matrix, -@@ -2854,7 +2687,7 @@ static const struct hw_sequencer_funcs dcn10_funcs = { - .apply_ctx_to_hw = dce110_apply_ctx_to_hw, - .apply_ctx_for_surface = dcn10_apply_ctx_for_surface, - .set_plane_config = set_plane_config, -- .update_plane_addr = dcn10_update_plane_addr, -+ .update_plane_addr = update_plane_addr, - .update_dchub = dcn10_update_dchub, - .update_pending_status = dcn10_update_pending_status, - .set_input_transfer_func = dcn10_set_input_transfer_func, -@@ -2879,13 +2712,11 @@ static const struct hw_sequencer_funcs dcn10_funcs = { - .setup_stereo = dcn10_setup_stereo, - .set_avmute = dce110_set_avmute, - .log_hw_state = dcn10_log_hw_state, -- .wait_for_mpcc_disconnect = dcn10_wait_for_mpcc_disconnect, -- .ready_shared_resources = ready_shared_resources, -- .optimize_shared_resources = optimize_shared_resources, -+ .wait_for_mpcc_disconnect = dcn10_wait_for_mpcc_disconnect - }; - - --void dcn10_hw_sequencer_construct(struct dc *dc) -+void dcn10_hw_sequencer_construct(struct core_dc *dc) - { - dc->hwss = dcn10_funcs; - } -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h -index ca53dc1..28218dc 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h -@@ -28,11 +28,11 @@ - - #include "core_types.h" - --struct dc; -+struct core_dc; - --void dcn10_hw_sequencer_construct(struct dc *dc); -+void dcn10_hw_sequencer_construct(struct core_dc *dc); - extern void fill_display_configs( -- const struct dc_state *context, -+ const struct validate_context *context, - struct dm_pp_display_configuration *pp_display_cfg); - - #endif /* __DC_HWSS_DCN10_H__ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c -index 5edc4b7..8ee8305 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c -@@ -37,6 +37,436 @@ - #define CTX \ - ippn10->base.ctx - -+ -+struct dcn10_input_csc_matrix { -+ enum dc_color_space color_space; -+ uint32_t regval[12]; -+}; -+ -+static const struct dcn10_input_csc_matrix dcn10_input_csc_matrix[] = { -+ {COLOR_SPACE_SRGB, -+ {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} }, -+ {COLOR_SPACE_SRGB_LIMITED, -+ {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} }, -+ {COLOR_SPACE_YCBCR601, -+ {0x2cdd, 0x2000, 0, 0xe991, 0xe926, 0x2000, 0xf4fd, 0x10ef, -+ 0, 0x2000, 0x38b4, 0xe3a6} }, -+ {COLOR_SPACE_YCBCR601_LIMITED, -+ {0x3353, 0x2568, 0, 0xe400, 0xe5dc, 0x2568, 0xf367, 0x1108, -+ 0, 0x2568, 0x40de, 0xdd3a} }, -+ {COLOR_SPACE_YCBCR709, -+ {0x3265, 0x2000, 0, 0xe6ce, 0xf105, 0x2000, 0xfa01, 0xa7d, 0, -+ 0x2000, 0x3b61, 0xe24f} }, -+ -+ {COLOR_SPACE_YCBCR709_LIMITED, -+ {0x39a6, 0x2568, 0, 0xe0d6, 0xeedd, 0x2568, 0xf925, 0x9a8, 0, -+ 0x2568, 0x43ee, 0xdbb2} } -+}; -+ -+enum dcn10_input_csc_select { -+ INPUT_CSC_SELECT_BYPASS = 0, -+ INPUT_CSC_SELECT_ICSC, -+ INPUT_CSC_SELECT_COMA -+}; -+ -+static void ippn10_program_input_csc( -+ struct input_pixel_processor *ipp, -+ enum dc_color_space color_space, -+ enum dcn10_input_csc_select select) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ int i; -+ int arr_size = sizeof(dcn10_input_csc_matrix)/sizeof(struct dcn10_input_csc_matrix); -+ const uint32_t *regval = NULL; -+ uint32_t selection = 1; -+ -+ if (select == INPUT_CSC_SELECT_BYPASS) { -+ REG_SET(CM_ICSC_CONTROL, 0, CM_ICSC_MODE, 0); -+ return; -+ } -+ -+ for (i = 0; i < arr_size; i++) -+ if (dcn10_input_csc_matrix[i].color_space == color_space) { -+ regval = dcn10_input_csc_matrix[i].regval; -+ break; -+ } -+ -+ if (regval == NULL) { -+ BREAK_TO_DEBUGGER(); -+ return; -+ } -+ -+ if (select == INPUT_CSC_SELECT_COMA) -+ selection = 2; -+ REG_SET(CM_ICSC_CONTROL, 0, -+ CM_ICSC_MODE, selection); -+ -+ if (select == INPUT_CSC_SELECT_ICSC) { -+ /*R*/ -+ REG_SET_2(CM_ICSC_C11_C12, 0, -+ CM_ICSC_C11, regval[0], -+ CM_ICSC_C12, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_ICSC_C13_C14, 0, -+ CM_ICSC_C13, regval[0], -+ CM_ICSC_C14, regval[1]); -+ /*G*/ -+ regval += 2; -+ REG_SET_2(CM_ICSC_C21_C22, 0, -+ CM_ICSC_C21, regval[0], -+ CM_ICSC_C22, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_ICSC_C23_C24, 0, -+ CM_ICSC_C23, regval[0], -+ CM_ICSC_C24, regval[1]); -+ /*B*/ -+ regval += 2; -+ REG_SET_2(CM_ICSC_C31_C32, 0, -+ CM_ICSC_C31, regval[0], -+ CM_ICSC_C32, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_ICSC_C33_C34, 0, -+ CM_ICSC_C33, regval[0], -+ CM_ICSC_C34, regval[1]); -+ } else { -+ /*R*/ -+ REG_SET_2(CM_COMA_C11_C12, 0, -+ CM_COMA_C11, regval[0], -+ CM_COMA_C12, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C13_C14, 0, -+ CM_COMA_C13, regval[0], -+ CM_COMA_C14, regval[1]); -+ /*G*/ -+ regval += 2; -+ REG_SET_2(CM_COMA_C21_C22, 0, -+ CM_COMA_C21, regval[0], -+ CM_COMA_C22, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C23_C24, 0, -+ CM_COMA_C23, regval[0], -+ CM_COMA_C24, regval[1]); -+ /*B*/ -+ regval += 2; -+ REG_SET_2(CM_COMA_C31_C32, 0, -+ CM_COMA_C31, regval[0], -+ CM_COMA_C32, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C33_C34, 0, -+ CM_COMA_C33, regval[0], -+ CM_COMA_C34, regval[1]); -+ } -+} -+ -+/*program de gamma RAM B*/ -+static void ippn10_program_degamma_lutb_settings( -+ struct input_pixel_processor *ipp, -+ const struct pwl_params *params) -+{ -+ const struct gamma_curve *curve; -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ REG_SET_2(CM_DGAM_RAMB_START_CNTL_B, 0, -+ CM_DGAM_RAMB_EXP_REGION_START_B, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_B, 0); -+ -+ REG_SET_2(CM_DGAM_RAMB_START_CNTL_G, 0, -+ CM_DGAM_RAMB_EXP_REGION_START_G, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_G, 0); -+ -+ REG_SET_2(CM_DGAM_RAMB_START_CNTL_R, 0, -+ CM_DGAM_RAMB_EXP_REGION_START_R, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_R, 0); -+ -+ REG_SET(CM_DGAM_RAMB_SLOPE_CNTL_B, 0, -+ CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMB_SLOPE_CNTL_G, 0, -+ CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMB_SLOPE_CNTL_R, 0, -+ CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMB_END_CNTL1_B, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_B, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMB_END_CNTL2_B, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_SLOPE_B, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMB_EXP_REGION_END_BASE_B, params->arr_points[2].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMB_END_CNTL1_G, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_G, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMB_END_CNTL2_G, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_SLOPE_G, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMB_EXP_REGION_END_BASE_G, params->arr_points[2].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMB_END_CNTL1_R, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_R, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMB_END_CNTL2_R, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_SLOPE_R, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMB_EXP_REGION_END_BASE_R, params->arr_points[2].custom_float_slope); -+ -+ curve = params->arr_curve_points; -+ REG_SET_4(CM_DGAM_RAMB_REGION_0_1, 0, -+ CM_DGAM_RAMB_EXP_REGION0_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION1_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_2_3, 0, -+ CM_DGAM_RAMB_EXP_REGION2_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION2_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION3_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION3_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_4_5, 0, -+ CM_DGAM_RAMB_EXP_REGION4_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION4_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION5_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION5_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_6_7, 0, -+ CM_DGAM_RAMB_EXP_REGION6_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION6_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION7_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION7_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_8_9, 0, -+ CM_DGAM_RAMB_EXP_REGION8_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION8_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION9_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION9_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_10_11, 0, -+ CM_DGAM_RAMB_EXP_REGION10_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION10_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION11_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION11_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_12_13, 0, -+ CM_DGAM_RAMB_EXP_REGION12_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION12_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION13_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION13_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_14_15, 0, -+ CM_DGAM_RAMB_EXP_REGION14_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION14_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION15_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION15_NUM_SEGMENTS, curve[1].segments_num); -+} -+ -+/*program de gamma RAM A*/ -+static void ippn10_program_degamma_luta_settings( -+ struct input_pixel_processor *ipp, -+ const struct pwl_params *params) -+{ -+ const struct gamma_curve *curve; -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ REG_SET_2(CM_DGAM_RAMA_START_CNTL_B, 0, -+ CM_DGAM_RAMA_EXP_REGION_START_B, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_B, 0); -+ -+ REG_SET_2(CM_DGAM_RAMA_START_CNTL_G, 0, -+ CM_DGAM_RAMA_EXP_REGION_START_G, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_G, 0); -+ -+ REG_SET_2(CM_DGAM_RAMA_START_CNTL_R, 0, -+ CM_DGAM_RAMA_EXP_REGION_START_R, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_R, 0); -+ -+ REG_SET(CM_DGAM_RAMA_SLOPE_CNTL_B, 0, -+ CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMA_SLOPE_CNTL_G, 0, -+ CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMA_SLOPE_CNTL_R, 0, -+ CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMA_END_CNTL1_B, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_B, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMA_END_CNTL2_B, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_SLOPE_B, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMA_EXP_REGION_END_BASE_B, params->arr_points[2].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMA_END_CNTL1_G, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_G, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMA_END_CNTL2_G, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_SLOPE_G, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMA_EXP_REGION_END_BASE_G, params->arr_points[2].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMA_END_CNTL1_R, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_R, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMA_END_CNTL2_R, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_SLOPE_R, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMA_EXP_REGION_END_BASE_R, params->arr_points[2].custom_float_slope); -+ -+ curve = params->arr_curve_points; -+ REG_SET_4(CM_DGAM_RAMA_REGION_0_1, 0, -+ CM_DGAM_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_2_3, 0, -+ CM_DGAM_RAMA_EXP_REGION2_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION2_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION3_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION3_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_4_5, 0, -+ CM_DGAM_RAMA_EXP_REGION4_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION4_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION5_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION5_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_6_7, 0, -+ CM_DGAM_RAMA_EXP_REGION6_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION6_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION7_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION7_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_8_9, 0, -+ CM_DGAM_RAMA_EXP_REGION8_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION8_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION9_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION9_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_10_11, 0, -+ CM_DGAM_RAMA_EXP_REGION10_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION10_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION11_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION11_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_12_13, 0, -+ CM_DGAM_RAMA_EXP_REGION12_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION12_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION13_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION13_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_14_15, 0, -+ CM_DGAM_RAMA_EXP_REGION14_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION14_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION15_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION15_NUM_SEGMENTS, curve[1].segments_num); -+} -+ -+static void ippn10_power_on_degamma_lut( -+ struct input_pixel_processor *ipp, -+ bool power_on) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ REG_SET(CM_MEM_PWR_CTRL, 0, -+ SHARED_MEM_PWR_DIS, power_on == true ? 0:1); -+ -+} -+ -+static void ippn10_program_degamma_lut( -+ struct input_pixel_processor *ipp, -+ const struct pwl_result_data *rgb, -+ uint32_t num, -+ bool is_ram_a) -+{ -+ uint32_t i; -+ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_HOST_EN, 0); -+ REG_UPDATE(CM_DGAM_LUT_WRITE_EN_MASK, -+ CM_DGAM_LUT_WRITE_EN_MASK, 7); -+ REG_UPDATE(CM_DGAM_LUT_WRITE_EN_MASK, CM_DGAM_LUT_WRITE_SEL, -+ is_ram_a == true ? 0:1); -+ -+ REG_SET(CM_DGAM_LUT_INDEX, 0, CM_DGAM_LUT_INDEX, 0); -+ for (i = 0 ; i < num; i++) { -+ REG_SET(CM_DGAM_LUT_DATA, 0, CM_DGAM_LUT_DATA, rgb[i].red_reg); -+ REG_SET(CM_DGAM_LUT_DATA, 0, CM_DGAM_LUT_DATA, rgb[i].green_reg); -+ REG_SET(CM_DGAM_LUT_DATA, 0, CM_DGAM_LUT_DATA, rgb[i].blue_reg); -+ -+ REG_SET(CM_DGAM_LUT_DATA, 0, -+ CM_DGAM_LUT_DATA, rgb[i].delta_red_reg); -+ REG_SET(CM_DGAM_LUT_DATA, 0, -+ CM_DGAM_LUT_DATA, rgb[i].delta_green_reg); -+ REG_SET(CM_DGAM_LUT_DATA, 0, -+ CM_DGAM_LUT_DATA, rgb[i].delta_blue_reg); -+ } -+} -+ -+static void ippn10_enable_cm_block( -+ struct input_pixel_processor *ipp) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ REG_UPDATE(CM_CONTROL, CM_BYPASS_EN, 0); -+} -+ -+static void ippn10_full_bypass(struct input_pixel_processor *ipp) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ /* Input pixel format: ARGB8888 */ -+ REG_SET(CNVC_SURFACE_PIXEL_FORMAT, 0, -+ CNVC_SURFACE_PIXEL_FORMAT, 0x8); -+ -+ /* Zero expansion */ -+ REG_SET_3(FORMAT_CONTROL, 0, -+ CNVC_BYPASS, 0, -+ ALPHA_EN, 0, -+ FORMAT_EXPANSION_MODE, 0); -+ -+ /* COLOR_KEYER_CONTROL.COLOR_KEYER_EN = 0 this should be default */ -+ REG_SET(CM_CONTROL, 0, CM_BYPASS_EN, 1); -+ -+ /* Setting degamma bypass for now */ -+ REG_SET(CM_DGAM_CONTROL, 0, CM_DGAM_LUT_MODE, 0); -+ REG_SET(CM_IGAM_CONTROL, 0, CM_IGAM_LUT_MODE, 0); -+} -+ -+static void ippn10_set_degamma( -+ struct input_pixel_processor *ipp, -+ enum ipp_degamma_mode mode) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ ippn10_enable_cm_block(ipp); -+ -+ switch (mode) { -+ case IPP_DEGAMMA_MODE_BYPASS: -+ /* Setting de gamma bypass for now */ -+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 0); -+ break; -+ case IPP_DEGAMMA_MODE_HW_sRGB: -+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 1); -+ break; -+ case IPP_DEGAMMA_MODE_HW_xvYCC: -+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 2); -+ break; -+ default: -+ BREAK_TO_DEBUGGER(); -+ break; -+ } -+} -+ - static bool ippn10_cursor_program_control( - struct dcn10_ipp *ippn10, - bool pixel_data_invert, -@@ -221,6 +651,283 @@ static void ippn10_cursor_set_position( - /* TODO Handle surface pixel formats other than 4:4:4 */ - } - -+enum pixel_format_description { -+ PIXEL_FORMAT_FIXED = 0, -+ PIXEL_FORMAT_FIXED16, -+ PIXEL_FORMAT_FLOAT -+ -+}; -+ -+static void ippn10_setup_format_flags(enum surface_pixel_format input_format,\ -+ enum pixel_format_description *fmt) -+{ -+ -+ if (input_format == SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F || -+ input_format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F) -+ *fmt = PIXEL_FORMAT_FLOAT; -+ else if (input_format == SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616) -+ *fmt = PIXEL_FORMAT_FIXED16; -+ else -+ *fmt = PIXEL_FORMAT_FIXED; -+} -+ -+static void ippn10_set_degamma_format_float(struct input_pixel_processor *ipp, -+ bool is_float) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ if (is_float) { -+ REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, 3); -+ REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, 1); -+ } else { -+ REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, 2); -+ REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, 0); -+ } -+} -+ -+ -+static void ippn10_cnv_setup ( -+ struct input_pixel_processor *ipp, -+ enum surface_pixel_format input_format, -+ enum expansion_mode mode, -+ enum ipp_output_format cnv_out_format) -+{ -+ uint32_t pixel_format; -+ uint32_t alpha_en; -+ enum pixel_format_description fmt ; -+ enum dc_color_space color_space; -+ enum dcn10_input_csc_select select; -+ bool is_float; -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ bool force_disable_cursor = false; -+ -+ ippn10_setup_format_flags(input_format, &fmt); -+ alpha_en = 1; -+ pixel_format = 0; -+ color_space = COLOR_SPACE_SRGB; -+ select = INPUT_CSC_SELECT_BYPASS; -+ is_float = false; -+ -+ switch (fmt) { -+ case PIXEL_FORMAT_FIXED: -+ case PIXEL_FORMAT_FIXED16: -+ /*when output is float then FORMAT_CONTROL__OUTPUT_FP=1*/ -+ REG_SET_3(FORMAT_CONTROL, 0, -+ CNVC_BYPASS, 0, -+ FORMAT_EXPANSION_MODE, mode, -+ OUTPUT_FP, 0); -+ break; -+ case PIXEL_FORMAT_FLOAT: -+ REG_SET_3(FORMAT_CONTROL, 0, -+ CNVC_BYPASS, 0, -+ FORMAT_EXPANSION_MODE, mode, -+ OUTPUT_FP, 1); -+ is_float = true; -+ break; -+ default: -+ -+ break; -+ } -+ -+ ippn10_set_degamma_format_float(ipp, is_float); -+ -+ switch (input_format) { -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555: -+ pixel_format = 1; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_RGB565: -+ pixel_format = 3; -+ alpha_en = 0; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: -+ pixel_format = 8; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010: -+ pixel_format = 10; -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr: -+ force_disable_cursor = false; -+ pixel_format = 65; -+ color_space = COLOR_SPACE_YCBCR709; -+ select = INPUT_CSC_SELECT_ICSC; -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb: -+ force_disable_cursor = true; -+ pixel_format = 64; -+ color_space = COLOR_SPACE_YCBCR709; -+ select = INPUT_CSC_SELECT_ICSC; -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr: -+ force_disable_cursor = true; -+ pixel_format = 67; -+ color_space = COLOR_SPACE_YCBCR709; -+ select = INPUT_CSC_SELECT_ICSC; -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb: -+ force_disable_cursor = true; -+ pixel_format = 66; -+ color_space = COLOR_SPACE_YCBCR709; -+ select = INPUT_CSC_SELECT_ICSC; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: -+ pixel_format = 22; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: -+ pixel_format = 24; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: -+ pixel_format = 25; -+ break; -+ default: -+ break; -+ } -+ REG_SET(CNVC_SURFACE_PIXEL_FORMAT, 0, -+ CNVC_SURFACE_PIXEL_FORMAT, pixel_format); -+ REG_UPDATE(FORMAT_CONTROL, ALPHA_EN, alpha_en); -+ -+ ippn10_program_input_csc(ipp, color_space, select); -+ -+ if (force_disable_cursor) { -+ REG_UPDATE(CURSOR_CONTROL, -+ CURSOR_ENABLE, 0); -+ REG_UPDATE(CURSOR0_CONTROL, -+ CUR0_ENABLE, 0); -+ } -+} -+ -+ -+static bool ippn10_degamma_ram_inuse(struct input_pixel_processor *ipp, -+ bool *ram_a_inuse) -+{ -+ bool ret = false; -+ uint32_t status_reg = 0; -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ REG_GET(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_DGAM_CONFIG_STATUS, -+ &status_reg); -+ -+ if (status_reg == 9) { -+ *ram_a_inuse = true; -+ ret = true; -+ } else if (status_reg == 10) { -+ *ram_a_inuse = false; -+ ret = true; -+ } -+ return ret; -+} -+ -+static bool ippn10_ingamma_ram_inuse(struct input_pixel_processor *ipp, -+ bool *ram_a_inuse) -+{ -+ bool in_use = false; -+ uint32_t status_reg = 0; -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ REG_GET(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_DGAM_CONFIG_STATUS, -+ &status_reg); -+ -+ // 1 => IGAM_RAMA, 3 => IGAM_RAMA & DGAM_ROMA, 4 => IGAM_RAMA & DGAM_ROMB -+ if (status_reg == 1 || status_reg == 3 || status_reg == 4) { -+ *ram_a_inuse = true; -+ in_use = true; -+ // 2 => IGAM_RAMB, 5 => IGAM_RAMB & DGAM_ROMA, 6 => IGAM_RAMB & DGAM_ROMB -+ } else if (status_reg == 2 || status_reg == 5 || status_reg == 6) { -+ *ram_a_inuse = false; -+ in_use = true; -+ } -+ return in_use; -+} -+ -+static void ippn10_degamma_ram_select(struct input_pixel_processor *ipp, -+ bool use_ram_a) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ if (use_ram_a) -+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 3); -+ else -+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 4); -+ -+} -+ -+static void ippn10_set_degamma_pwl(struct input_pixel_processor *ipp, -+ const struct pwl_params *params) -+{ -+ bool is_ram_a = true; -+ -+ ippn10_power_on_degamma_lut(ipp, true); -+ ippn10_enable_cm_block(ipp); -+ ippn10_degamma_ram_inuse(ipp, &is_ram_a); -+ if (is_ram_a == true) -+ ippn10_program_degamma_lutb_settings(ipp, params); -+ else -+ ippn10_program_degamma_luta_settings(ipp, params); -+ -+ ippn10_program_degamma_lut(ipp, params->rgb_resulted, -+ params->hw_points_num, !is_ram_a); -+ ippn10_degamma_ram_select(ipp, !is_ram_a); -+} -+ -+/* -+ * Input gamma LUT currently supports 256 values only. This means input color -+ * can have a maximum of 8 bits per channel (= 256 possible values) in order to -+ * have a one-to-one mapping with the LUT. Truncation will occur with color -+ * values greater than 8 bits. -+ * -+ * In the future, this function should support additional input gamma methods, -+ * such as piecewise linear mapping, and input gamma bypass. -+ */ -+static void ippn10_program_input_lut( -+ struct input_pixel_processor *ipp, -+ const struct dc_gamma *gamma) -+{ -+ int i; -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ bool rama_occupied = false; -+ uint32_t ram_num; -+ // Power on LUT memory. -+ REG_SET(CM_MEM_PWR_CTRL, 0, SHARED_MEM_PWR_DIS, 1); -+ ippn10_enable_cm_block(ipp); -+ // Determine whether to use RAM A or RAM B -+ ippn10_ingamma_ram_inuse(ipp, &rama_occupied); -+ if (!rama_occupied) -+ REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_SEL, 0); -+ else -+ REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_SEL, 1); -+ // RW mode is 256-entry LUT -+ REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_RW_MODE, 0); -+ // IGAM Input format should be 8 bits per channel. -+ REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, 0); -+ // Do not mask any R,G,B values -+ REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_WRITE_EN_MASK, 7); -+ // LUT-256, unsigned, integer, new u0.12 format -+ REG_UPDATE_3( -+ CM_IGAM_CONTROL, -+ CM_IGAM_LUT_FORMAT_R, 3, -+ CM_IGAM_LUT_FORMAT_G, 3, -+ CM_IGAM_LUT_FORMAT_B, 3); -+ // Start at index 0 of IGAM LUT -+ REG_UPDATE(CM_IGAM_LUT_RW_INDEX, CM_IGAM_LUT_RW_INDEX, 0); -+ for (i = 0; i < gamma->num_entries; i++) { -+ REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR, -+ dal_fixed31_32_round( -+ gamma->entries.red[i])); -+ REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR, -+ dal_fixed31_32_round( -+ gamma->entries.green[i])); -+ REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR, -+ dal_fixed31_32_round( -+ gamma->entries.blue[i])); -+ } -+ // Power off LUT memory -+ REG_SET(CM_MEM_PWR_CTRL, 0, SHARED_MEM_PWR_DIS, 0); -+ // Enable IGAM LUT on ram we just wrote to. 2 => RAMA, 3 => RAMB -+ REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, rama_occupied ? 3 : 2); -+ REG_GET(CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, &ram_num); -+} -+ - /*****************************************/ - /* Constructor, Destructor */ - /*****************************************/ -@@ -234,11 +941,11 @@ static void dcn10_ipp_destroy(struct input_pixel_processor **ipp) - static const struct ipp_funcs dcn10_ipp_funcs = { - .ipp_cursor_set_attributes = ippn10_cursor_set_attributes, - .ipp_cursor_set_position = ippn10_cursor_set_position, -- .ipp_set_degamma = NULL, -- .ipp_program_input_lut = NULL, -- .ipp_full_bypass = NULL, -- .ipp_setup = NULL, -- .ipp_program_degamma_pwl = NULL, -+ .ipp_set_degamma = ippn10_set_degamma, -+ .ipp_program_input_lut = ippn10_program_input_lut, -+ .ipp_full_bypass = ippn10_full_bypass, -+ .ipp_setup = ippn10_cnv_setup, -+ .ipp_program_degamma_pwl = ippn10_set_degamma_pwl, - .ipp_destroy = dcn10_ipp_destroy - }; - -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h -index e4f2928..69db441 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h -@@ -32,6 +32,59 @@ - container_of(ipp, struct dcn10_ipp, base) - - #define IPP_REG_LIST_DCN(id) \ -+ SRI(CM_ICSC_CONTROL, CM, id), \ -+ SRI(CM_ICSC_C11_C12, CM, id), \ -+ SRI(CM_ICSC_C13_C14, CM, id), \ -+ SRI(CM_ICSC_C21_C22, CM, id), \ -+ SRI(CM_ICSC_C23_C24, CM, id), \ -+ SRI(CM_ICSC_C31_C32, CM, id), \ -+ SRI(CM_ICSC_C33_C34, CM, id), \ -+ SRI(CM_DGAM_RAMB_START_CNTL_B, CM, id), \ -+ SRI(CM_DGAM_RAMB_START_CNTL_G, CM, id), \ -+ SRI(CM_DGAM_RAMB_START_CNTL_R, CM, id), \ -+ SRI(CM_DGAM_RAMB_SLOPE_CNTL_B, CM, id), \ -+ SRI(CM_DGAM_RAMB_SLOPE_CNTL_G, CM, id), \ -+ SRI(CM_DGAM_RAMB_SLOPE_CNTL_R, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL1_B, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL2_B, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL1_G, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL2_G, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL1_R, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL2_R, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_0_1, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_2_3, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_4_5, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_6_7, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_8_9, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_10_11, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_12_13, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_14_15, CM, id), \ -+ SRI(CM_DGAM_RAMA_START_CNTL_B, CM, id), \ -+ SRI(CM_DGAM_RAMA_START_CNTL_G, CM, id), \ -+ SRI(CM_DGAM_RAMA_START_CNTL_R, CM, id), \ -+ SRI(CM_DGAM_RAMA_SLOPE_CNTL_B, CM, id), \ -+ SRI(CM_DGAM_RAMA_SLOPE_CNTL_G, CM, id), \ -+ SRI(CM_DGAM_RAMA_SLOPE_CNTL_R, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL1_B, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL2_B, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL1_G, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL2_G, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL1_R, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL2_R, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_0_1, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_2_3, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_4_5, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_6_7, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_8_9, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_10_11, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_12_13, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_14_15, CM, id), \ -+ SRI(CM_MEM_PWR_CTRL, CM, id), \ -+ SRI(CM_DGAM_LUT_WRITE_EN_MASK, CM, id), \ -+ SRI(CM_DGAM_LUT_INDEX, CM, id), \ -+ SRI(CM_DGAM_LUT_DATA, CM, id), \ -+ SRI(CM_CONTROL, CM, id), \ -+ SRI(CM_DGAM_CONTROL, CM, id), \ - SRI(FORMAT_CONTROL, CNVC_CFG, id), \ - SRI(DPP_CONTROL, DPP_TOP, id), \ - SRI(CNVC_SURFACE_PIXEL_FORMAT, CNVC_CFG, id), \ -@@ -42,6 +95,16 @@ - #define IPP_REG_LIST_DCN10(id) \ - IPP_REG_LIST_DCN(id), \ - SRI(CURSOR_SETTINS, HUBPREQ, id), \ -+ SRI(CM_IGAM_CONTROL, CM, id), \ -+ SRI(CM_COMA_C11_C12, CM, id), \ -+ SRI(CM_COMA_C13_C14, CM, id), \ -+ SRI(CM_COMA_C21_C22, CM, id), \ -+ SRI(CM_COMA_C23_C24, CM, id), \ -+ SRI(CM_COMA_C31_C32, CM, id), \ -+ SRI(CM_COMA_C33_C34, CM, id), \ -+ SRI(CM_IGAM_LUT_RW_CONTROL, CM, id), \ -+ SRI(CM_IGAM_LUT_RW_INDEX, CM, id), \ -+ SRI(CM_IGAM_LUT_SEQ_COLOR, CM, id), \ - SRI(CURSOR_SURFACE_ADDRESS_HIGH, CURSOR, id), \ - SRI(CURSOR_SURFACE_ADDRESS, CURSOR, id), \ - SRI(CURSOR_SIZE, CURSOR, id), \ -@@ -54,10 +117,129 @@ - .field_name = reg_name ## __ ## field_name ## post_fix - - #define IPP_MASK_SH_LIST_DCN(mask_sh) \ -+ IPP_SF(CM0_CM_ICSC_CONTROL, CM_ICSC_MODE, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C11_C12, CM_ICSC_C11, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C11_C12, CM_ICSC_C12, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C13_C14, CM_ICSC_C13, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C13_C14, CM_ICSC_C14, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C21_C22, CM_ICSC_C21, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C21_C22, CM_ICSC_C22, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C23_C24, CM_ICSC_C23, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C23_C24, CM_ICSC_C24, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C31_C32, CM_ICSC_C31, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C31_C32, CM_ICSC_C32, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C33_C34, CM_ICSC_C33, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C33_C34, CM_ICSC_C34, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_B, CM_DGAM_RAMB_EXP_REGION_START_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_B, CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_G, CM_DGAM_RAMB_EXP_REGION_START_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_G, CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_R, CM_DGAM_RAMB_EXP_REGION_START_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_R, CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_SLOPE_CNTL_B, CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_SLOPE_CNTL_G, CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_SLOPE_CNTL_R, CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL1_B, CM_DGAM_RAMB_EXP_REGION_END_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_B, CM_DGAM_RAMB_EXP_REGION_END_SLOPE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_B, CM_DGAM_RAMB_EXP_REGION_END_BASE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL1_G, CM_DGAM_RAMB_EXP_REGION_END_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_G, CM_DGAM_RAMB_EXP_REGION_END_SLOPE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_G, CM_DGAM_RAMB_EXP_REGION_END_BASE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL1_R, CM_DGAM_RAMB_EXP_REGION_END_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_R, CM_DGAM_RAMB_EXP_REGION_END_SLOPE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_R, CM_DGAM_RAMB_EXP_REGION_END_BASE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION0_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION0_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION1_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION1_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_2_3, CM_DGAM_RAMB_EXP_REGION2_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_2_3, CM_DGAM_RAMB_EXP_REGION2_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_2_3, CM_DGAM_RAMB_EXP_REGION3_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_2_3, CM_DGAM_RAMB_EXP_REGION3_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_4_5, CM_DGAM_RAMB_EXP_REGION4_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_4_5, CM_DGAM_RAMB_EXP_REGION4_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_4_5, CM_DGAM_RAMB_EXP_REGION5_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_4_5, CM_DGAM_RAMB_EXP_REGION5_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_6_7, CM_DGAM_RAMB_EXP_REGION6_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_6_7, CM_DGAM_RAMB_EXP_REGION6_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_6_7, CM_DGAM_RAMB_EXP_REGION7_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_6_7, CM_DGAM_RAMB_EXP_REGION7_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_8_9, CM_DGAM_RAMB_EXP_REGION8_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_8_9, CM_DGAM_RAMB_EXP_REGION8_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_8_9, CM_DGAM_RAMB_EXP_REGION9_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_8_9, CM_DGAM_RAMB_EXP_REGION9_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_10_11, CM_DGAM_RAMB_EXP_REGION10_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_10_11, CM_DGAM_RAMB_EXP_REGION10_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_10_11, CM_DGAM_RAMB_EXP_REGION11_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_10_11, CM_DGAM_RAMB_EXP_REGION11_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_12_13, CM_DGAM_RAMB_EXP_REGION12_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_12_13, CM_DGAM_RAMB_EXP_REGION12_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_12_13, CM_DGAM_RAMB_EXP_REGION13_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_12_13, CM_DGAM_RAMB_EXP_REGION13_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION14_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION14_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION15_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION15_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_B, CM_DGAM_RAMA_EXP_REGION_START_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_B, CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_G, CM_DGAM_RAMA_EXP_REGION_START_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_G, CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_R, CM_DGAM_RAMA_EXP_REGION_START_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_R, CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_SLOPE_CNTL_B, CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_SLOPE_CNTL_G, CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_SLOPE_CNTL_R, CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL1_B, CM_DGAM_RAMA_EXP_REGION_END_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_B, CM_DGAM_RAMA_EXP_REGION_END_SLOPE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_B, CM_DGAM_RAMA_EXP_REGION_END_BASE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL1_G, CM_DGAM_RAMA_EXP_REGION_END_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_G, CM_DGAM_RAMA_EXP_REGION_END_SLOPE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_G, CM_DGAM_RAMA_EXP_REGION_END_BASE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL1_R, CM_DGAM_RAMA_EXP_REGION_END_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_R, CM_DGAM_RAMA_EXP_REGION_END_SLOPE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_R, CM_DGAM_RAMA_EXP_REGION_END_BASE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION0_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_2_3, CM_DGAM_RAMA_EXP_REGION2_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_2_3, CM_DGAM_RAMA_EXP_REGION2_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_2_3, CM_DGAM_RAMA_EXP_REGION3_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_2_3, CM_DGAM_RAMA_EXP_REGION3_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_4_5, CM_DGAM_RAMA_EXP_REGION4_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_4_5, CM_DGAM_RAMA_EXP_REGION4_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_4_5, CM_DGAM_RAMA_EXP_REGION5_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_4_5, CM_DGAM_RAMA_EXP_REGION5_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_6_7, CM_DGAM_RAMA_EXP_REGION6_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_6_7, CM_DGAM_RAMA_EXP_REGION6_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_6_7, CM_DGAM_RAMA_EXP_REGION7_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_6_7, CM_DGAM_RAMA_EXP_REGION7_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_8_9, CM_DGAM_RAMA_EXP_REGION8_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_8_9, CM_DGAM_RAMA_EXP_REGION8_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_8_9, CM_DGAM_RAMA_EXP_REGION9_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_8_9, CM_DGAM_RAMA_EXP_REGION9_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_10_11, CM_DGAM_RAMA_EXP_REGION10_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_10_11, CM_DGAM_RAMA_EXP_REGION10_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_10_11, CM_DGAM_RAMA_EXP_REGION11_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_10_11, CM_DGAM_RAMA_EXP_REGION11_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_12_13, CM_DGAM_RAMA_EXP_REGION12_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_12_13, CM_DGAM_RAMA_EXP_REGION12_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_12_13, CM_DGAM_RAMA_EXP_REGION13_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_12_13, CM_DGAM_RAMA_EXP_REGION13_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION14_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION14_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION15_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION15_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_MEM_PWR_CTRL, SHARED_MEM_PWR_DIS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_LUT_WRITE_EN_MASK, CM_DGAM_LUT_WRITE_EN_MASK, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_LUT_WRITE_EN_MASK, CM_DGAM_LUT_WRITE_SEL, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_LUT_INDEX, CM_DGAM_LUT_INDEX, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_LUT_DATA, CM_DGAM_LUT_DATA, mask_sh), \ - IPP_SF(CNVC_CFG0_CNVC_SURFACE_PIXEL_FORMAT, CNVC_SURFACE_PIXEL_FORMAT, mask_sh), \ - IPP_SF(CNVC_CFG0_FORMAT_CONTROL, CNVC_BYPASS, mask_sh), \ - IPP_SF(CNVC_CFG0_FORMAT_CONTROL, ALPHA_EN, mask_sh), \ - IPP_SF(CNVC_CFG0_FORMAT_CONTROL, FORMAT_EXPANSION_MODE, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, mask_sh), \ - IPP_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_MODE, mask_sh), \ - IPP_SF(CNVC_CUR0_CURSOR0_COLOR0, CUR0_COLOR0, mask_sh), \ - IPP_SF(CNVC_CUR0_CURSOR0_COLOR1, CUR0_COLOR1, mask_sh), \ -@@ -68,6 +250,26 @@ - IPP_MASK_SH_LIST_DCN(mask_sh),\ - IPP_SF(HUBPREQ0_CURSOR_SETTINS, CURSOR0_DST_Y_OFFSET, mask_sh), \ - IPP_SF(HUBPREQ0_CURSOR_SETTINS, CURSOR0_CHUNK_HDL_ADJUST, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C11_C12, CM_COMA_C11, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C11_C12, CM_COMA_C12, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C13_C14, CM_COMA_C13, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C13_C14, CM_COMA_C14, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C21_C22, CM_COMA_C21, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C21_C22, CM_COMA_C22, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C23_C24, CM_COMA_C23, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C23_C24, CM_COMA_C24, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C31_C32, CM_COMA_C31, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C31_C32, CM_COMA_C32, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C33_C34, CM_COMA_C33, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C33_C34, CM_COMA_C34, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_DGAM_CONFIG_STATUS, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_HOST_EN, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_RW_MODE, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_SEL, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_WRITE_EN_MASK, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_LUT_RW_INDEX, CM_IGAM_LUT_RW_INDEX, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_LUT_SEQ_COLOR, CM_IGAM_LUT_SEQ_COLOR, mask_sh), \ -+ IPP_SF(CM0_CM_CONTROL, CM_BYPASS_EN, mask_sh), \ - IPP_SF(CURSOR0_CURSOR_SURFACE_ADDRESS_HIGH, CURSOR_SURFACE_ADDRESS_HIGH, mask_sh), \ - IPP_SF(CURSOR0_CURSOR_SURFACE_ADDRESS, CURSOR_SURFACE_ADDRESS, mask_sh), \ - IPP_SF(CURSOR0_CURSOR_SIZE, CURSOR_WIDTH, mask_sh), \ -@@ -81,13 +283,163 @@ - IPP_SF(CURSOR0_CURSOR_HOT_SPOT, CURSOR_HOT_SPOT_X, mask_sh), \ - IPP_SF(CURSOR0_CURSOR_HOT_SPOT, CURSOR_HOT_SPOT_Y, mask_sh), \ - IPP_SF(CURSOR0_CURSOR_DST_OFFSET, CURSOR_DST_X_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_LUT_FORMAT_R, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_LUT_FORMAT_G, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_LUT_FORMAT_B, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, mask_sh), \ - IPP_SF(CNVC_CFG0_FORMAT_CONTROL, OUTPUT_FP, mask_sh) - - #define IPP_DCN10_REG_FIELD_LIST(type) \ -+ type CM_DGAM_CONFIG_STATUS; \ -+ type CM_ICSC_MODE; \ -+ type CM_ICSC_C11; \ -+ type CM_ICSC_C12; \ -+ type CM_ICSC_C13; \ -+ type CM_ICSC_C14; \ -+ type CM_ICSC_C21; \ -+ type CM_ICSC_C22; \ -+ type CM_ICSC_C23; \ -+ type CM_ICSC_C24; \ -+ type CM_ICSC_C31; \ -+ type CM_ICSC_C32; \ -+ type CM_ICSC_C33; \ -+ type CM_ICSC_C34; \ -+ type CM_COMA_C11; \ -+ type CM_COMA_C12; \ -+ type CM_COMA_C13; \ -+ type CM_COMA_C14; \ -+ type CM_COMA_C21; \ -+ type CM_COMA_C22; \ -+ type CM_COMA_C23; \ -+ type CM_COMA_C24; \ -+ type CM_COMA_C31; \ -+ type CM_COMA_C32; \ -+ type CM_COMA_C33; \ -+ type CM_COMA_C34; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_R; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_R; \ -+ type CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_SLOPE_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_BASE_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_SLOPE_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_BASE_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_R; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_SLOPE_R; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_BASE_R; \ -+ type CM_DGAM_RAMB_EXP_REGION0_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION0_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION1_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION1_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION2_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION2_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION3_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION3_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION4_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION4_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION5_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION5_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION6_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION6_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION7_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION7_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION8_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION8_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION9_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION9_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION10_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION10_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION11_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION11_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION12_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION12_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION13_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION13_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION14_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION14_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION15_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION15_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_R; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_R; \ -+ type CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_SLOPE_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_BASE_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_SLOPE_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_BASE_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_R; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_SLOPE_R; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_BASE_R; \ -+ type CM_DGAM_RAMA_EXP_REGION0_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION0_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION1_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION1_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION2_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION2_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION3_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION3_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION4_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION4_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION5_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION5_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION6_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION6_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION7_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION7_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION8_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION8_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION9_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION9_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION10_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION10_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION11_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION11_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION12_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION12_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION13_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION13_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION14_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION14_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION15_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION15_NUM_SEGMENTS; \ -+ type SHARED_MEM_PWR_DIS; \ -+ type CM_IGAM_LUT_FORMAT_R; \ -+ type CM_IGAM_LUT_FORMAT_G; \ -+ type CM_IGAM_LUT_FORMAT_B; \ -+ type CM_IGAM_LUT_HOST_EN; \ -+ type CM_IGAM_LUT_RW_INDEX; \ -+ type CM_IGAM_LUT_RW_MODE; \ -+ type CM_IGAM_LUT_WRITE_EN_MASK; \ -+ type CM_IGAM_LUT_SEL; \ -+ type CM_IGAM_LUT_SEQ_COLOR; \ -+ type CM_IGAM_DGAM_CONFIG_STATUS; \ -+ type CM_DGAM_LUT_WRITE_EN_MASK; \ -+ type CM_DGAM_LUT_WRITE_SEL; \ -+ type CM_DGAM_LUT_INDEX; \ -+ type CM_DGAM_LUT_DATA; \ -+ type CM_BYPASS_EN; \ -+ type CM_BYPASS; \ - type CNVC_SURFACE_PIXEL_FORMAT; \ - type CNVC_BYPASS; \ - type ALPHA_EN; \ - type FORMAT_EXPANSION_MODE; \ -+ type CM_DGAM_LUT_MODE; \ -+ type CM_IGAM_LUT_MODE; \ - type CURSOR0_DST_Y_OFFSET; \ - type CURSOR0_CHUNK_HDL_ADJUST; \ - type CUR0_MODE; \ -@@ -108,6 +460,7 @@ - type CURSOR_HOT_SPOT_X; \ - type CURSOR_HOT_SPOT_Y; \ - type CURSOR_DST_X_OFFSET; \ -+ type CM_IGAM_INPUT_FORMAT; \ - type OUTPUT_FP - - struct dcn10_ipp_shift { -@@ -119,6 +472,69 @@ struct dcn10_ipp_mask { - }; - - struct dcn10_ipp_registers { -+ uint32_t CM_ICSC_CONTROL; -+ uint32_t CM_ICSC_C11_C12; -+ uint32_t CM_ICSC_C13_C14; -+ uint32_t CM_ICSC_C21_C22; -+ uint32_t CM_ICSC_C23_C24; -+ uint32_t CM_ICSC_C31_C32; -+ uint32_t CM_ICSC_C33_C34; -+ uint32_t CM_COMA_C11_C12; -+ uint32_t CM_COMA_C13_C14; -+ uint32_t CM_COMA_C21_C22; -+ uint32_t CM_COMA_C23_C24; -+ uint32_t CM_COMA_C31_C32; -+ uint32_t CM_COMA_C33_C34; -+ uint32_t CM_DGAM_RAMB_START_CNTL_B; -+ uint32_t CM_DGAM_RAMB_START_CNTL_G; -+ uint32_t CM_DGAM_RAMB_START_CNTL_R; -+ uint32_t CM_DGAM_RAMB_SLOPE_CNTL_B; -+ uint32_t CM_DGAM_RAMB_SLOPE_CNTL_G; -+ uint32_t CM_DGAM_RAMB_SLOPE_CNTL_R; -+ uint32_t CM_DGAM_RAMB_END_CNTL1_B; -+ uint32_t CM_DGAM_RAMB_END_CNTL2_B; -+ uint32_t CM_DGAM_RAMB_END_CNTL1_G; -+ uint32_t CM_DGAM_RAMB_END_CNTL2_G; -+ uint32_t CM_DGAM_RAMB_END_CNTL1_R; -+ uint32_t CM_DGAM_RAMB_END_CNTL2_R; -+ uint32_t CM_DGAM_RAMB_REGION_0_1; -+ uint32_t CM_DGAM_RAMB_REGION_2_3; -+ uint32_t CM_DGAM_RAMB_REGION_4_5; -+ uint32_t CM_DGAM_RAMB_REGION_6_7; -+ uint32_t CM_DGAM_RAMB_REGION_8_9; -+ uint32_t CM_DGAM_RAMB_REGION_10_11; -+ uint32_t CM_DGAM_RAMB_REGION_12_13; -+ uint32_t CM_DGAM_RAMB_REGION_14_15; -+ uint32_t CM_DGAM_RAMA_START_CNTL_B; -+ uint32_t CM_DGAM_RAMA_START_CNTL_G; -+ uint32_t CM_DGAM_RAMA_START_CNTL_R; -+ uint32_t CM_DGAM_RAMA_SLOPE_CNTL_B; -+ uint32_t CM_DGAM_RAMA_SLOPE_CNTL_G; -+ uint32_t CM_DGAM_RAMA_SLOPE_CNTL_R; -+ uint32_t CM_DGAM_RAMA_END_CNTL1_B; -+ uint32_t CM_DGAM_RAMA_END_CNTL2_B; -+ uint32_t CM_DGAM_RAMA_END_CNTL1_G; -+ uint32_t CM_DGAM_RAMA_END_CNTL2_G; -+ uint32_t CM_DGAM_RAMA_END_CNTL1_R; -+ uint32_t CM_DGAM_RAMA_END_CNTL2_R; -+ uint32_t CM_DGAM_RAMA_REGION_0_1; -+ uint32_t CM_DGAM_RAMA_REGION_2_3; -+ uint32_t CM_DGAM_RAMA_REGION_4_5; -+ uint32_t CM_DGAM_RAMA_REGION_6_7; -+ uint32_t CM_DGAM_RAMA_REGION_8_9; -+ uint32_t CM_DGAM_RAMA_REGION_10_11; -+ uint32_t CM_DGAM_RAMA_REGION_12_13; -+ uint32_t CM_DGAM_RAMA_REGION_14_15; -+ uint32_t CM_MEM_PWR_CTRL; -+ uint32_t CM_IGAM_LUT_RW_CONTROL; -+ uint32_t CM_IGAM_LUT_RW_INDEX; -+ uint32_t CM_IGAM_LUT_SEQ_COLOR; -+ uint32_t CM_DGAM_LUT_WRITE_EN_MASK; -+ uint32_t CM_DGAM_LUT_INDEX; -+ uint32_t CM_DGAM_LUT_DATA; -+ uint32_t CM_CONTROL; -+ uint32_t CM_DGAM_CONTROL; -+ uint32_t CM_IGAM_CONTROL; - uint32_t DPP_CONTROL; - uint32_t CURSOR_SETTINS; - uint32_t CURSOR_SETTINGS; -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.c -index 9008cd0..f36585d 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.c -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.c -@@ -51,19 +51,12 @@ static void min10_set_blank(struct mem_input *mem_input, bool blank) - REG_WAIT(DCHUBP_CNTL, - HUBP_NO_OUTSTANDING_REQ, 1, - 1, 200); -+ /*todo: unhack this - mem_input->mpcc_id = 0xf; -- mem_input->opp_id = 0xf; -+ mem_input->opp_id = 0xf;*/ - } - } - --static void min10_set_hubp_blank_en(struct mem_input *mem_input, bool blank) --{ -- struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -- uint32_t blank_en = blank ? 1 : 0; -- -- REG_UPDATE(DCHUBP_CNTL, HUBP_BLANK_EN, blank_en); --} -- - static void min10_vready_workaround(struct mem_input *mem_input, - struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest) - { -@@ -632,10 +625,38 @@ static bool min10_is_flip_pending(struct mem_input *mem_input) - return false; - } - --static void min10_set_vm_system_aperture_settings(struct mem_input *mem_input, -+struct vm_system_aperture_param { -+ PHYSICAL_ADDRESS_LOC sys_default; -+ PHYSICAL_ADDRESS_LOC sys_low; -+ PHYSICAL_ADDRESS_LOC sys_high; -+}; -+ -+static void min10_read_vm_system_aperture_settings(struct dcn10_mem_input *mi, -+ struct vm_system_aperture_param *apt) -+{ -+ PHYSICAL_ADDRESS_LOC physical_page_number; -+ uint32_t logical_addr_low; -+ uint32_t logical_addr_high; -+ -+ REG_GET(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, -+ PHYSICAL_PAGE_NUMBER_MSB, &physical_page_number.high_part); -+ REG_GET(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, -+ PHYSICAL_PAGE_NUMBER_LSB, &physical_page_number.low_part); -+ -+ REG_GET(MC_VM_SYSTEM_APERTURE_LOW_ADDR, -+ LOGICAL_ADDR, &logical_addr_low); -+ -+ REG_GET(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, -+ LOGICAL_ADDR, &logical_addr_high); -+ -+ apt->sys_default.quad_part = physical_page_number.quad_part << 12; -+ apt->sys_low.quad_part = (int64_t)logical_addr_low << 18; -+ apt->sys_high.quad_part = (int64_t)logical_addr_high << 18; -+} -+ -+static void min10_set_vm_system_aperture_settings(struct dcn10_mem_input *mi, - struct vm_system_aperture_param *apt) - { -- struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); - PHYSICAL_ADDRESS_LOC mc_vm_apt_default; - PHYSICAL_ADDRESS_LOC mc_vm_apt_low; - PHYSICAL_ADDRESS_LOC mc_vm_apt_high; -@@ -661,10 +682,60 @@ static void min10_set_vm_system_aperture_settings(struct mem_input *mem_input, - MC_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, mc_vm_apt_high.low_part); - } - --static void min10_set_vm_context0_settings(struct mem_input *mem_input, -+struct vm_context0_param { -+ PHYSICAL_ADDRESS_LOC pte_base; -+ PHYSICAL_ADDRESS_LOC pte_start; -+ PHYSICAL_ADDRESS_LOC pte_end; -+ PHYSICAL_ADDRESS_LOC fault_default; -+}; -+ -+/* Temporary read settings, future will get values from kmd directly */ -+static void min10_read_vm_context0_settings(struct dcn10_mem_input *mi, -+ struct vm_context0_param *vm0) -+{ -+ PHYSICAL_ADDRESS_LOC fb_base; -+ PHYSICAL_ADDRESS_LOC fb_offset; -+ uint32_t fb_base_value; -+ uint32_t fb_offset_value; -+ -+ REG_GET(DCHUBBUB_SDPIF_FB_BASE, SDPIF_FB_BASE, &fb_base_value); -+ REG_GET(DCHUBBUB_SDPIF_FB_OFFSET, SDPIF_FB_OFFSET, &fb_offset_value); -+ -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, -+ PAGE_DIRECTORY_ENTRY_HI32, &vm0->pte_base.high_part); -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, -+ PAGE_DIRECTORY_ENTRY_LO32, &vm0->pte_base.low_part); -+ -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, -+ LOGICAL_PAGE_NUMBER_HI4, &vm0->pte_start.high_part); -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, -+ LOGICAL_PAGE_NUMBER_LO32, &vm0->pte_start.low_part); -+ -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, -+ LOGICAL_PAGE_NUMBER_HI4, &vm0->pte_end.high_part); -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, -+ LOGICAL_PAGE_NUMBER_LO32, &vm0->pte_end.low_part); -+ -+ REG_GET(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32, -+ PHYSICAL_PAGE_ADDR_HI4, &vm0->fault_default.high_part); -+ REG_GET(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32, -+ PHYSICAL_PAGE_ADDR_LO32, &vm0->fault_default.low_part); -+ -+ /* -+ * The values in VM_CONTEXT0_PAGE_TABLE_BASE_ADDR is in UMA space. -+ * Therefore we need to do -+ * DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR = VM_CONTEXT0_PAGE_TABLE_BASE_ADDR -+ * - DCHUBBUB_SDPIF_FB_OFFSET + DCHUBBUB_SDPIF_FB_BASE -+ */ -+ fb_base.quad_part = (uint64_t)fb_base_value << 24; -+ fb_offset.quad_part = (uint64_t)fb_offset_value << 24; -+ vm0->pte_base.quad_part += fb_base.quad_part; -+ vm0->pte_base.quad_part -= fb_offset.quad_part; -+} -+ -+static void min10_set_vm_context0_settings(struct dcn10_mem_input *mi, - const struct vm_context0_param *vm0) - { -- struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); - /* pte base */ - REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB, 0, - VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB, vm0->pte_base.high_part); -@@ -689,6 +760,23 @@ static void min10_set_vm_context0_settings(struct mem_input *mem_input, - /* VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_SYSTEM, 0 */ - REG_SET(DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB, 0, - VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB, vm0->fault_default.low_part); -+} -+ -+static void min10_program_pte_vm(struct mem_input *mem_input, -+ enum surface_pixel_format format, -+ union dc_tiling_info *tiling_info, -+ enum dc_rotation_angle rotation) -+{ -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ struct vm_system_aperture_param apt = { {{ 0 } } }; -+ struct vm_context0_param vm0 = { { { 0 } } }; -+ -+ -+ min10_read_vm_system_aperture_settings(mi, &apt); -+ min10_read_vm_context0_settings(mi, &vm0); -+ -+ min10_set_vm_system_aperture_settings(mi, &apt); -+ min10_set_vm_context0_settings(mi, &vm0); - - /* control: enable VM PTE*/ - REG_SET_2(DCN_VM_MX_L1_TLB_CNTL, 0, -@@ -774,12 +862,10 @@ static struct mem_input_funcs dcn10_mem_input_funcs = { - min10_program_surface_config, - .mem_input_is_flip_pending = min10_is_flip_pending, - .mem_input_setup = min10_setup, -- .mem_input_set_vm_system_aperture_settings = min10_set_vm_system_aperture_settings, -- .mem_input_set_vm_context0_settings = min10_set_vm_context0_settings, -+ .mem_input_program_pte_vm = min10_program_pte_vm, - .set_blank = min10_set_blank, - .dcc_control = min10_dcc_control, - .mem_program_viewport = min_set_viewport, -- .set_hubp_blank_en = min10_set_hubp_blank_en, - }; - - /*****************************************/ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.h -index acee051..b3ec16c 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.h -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.h -@@ -97,7 +97,20 @@ - SRI(DCN_SURF0_TTU_CNTL1, HUBPREQ, id),\ - SRI(DCN_SURF1_TTU_CNTL0, HUBPREQ, id),\ - SRI(DCN_SURF1_TTU_CNTL1, HUBPREQ, id),\ -- SRI(DCN_VM_MX_L1_TLB_CNTL, HUBPREQ, id) -+ SRI(DCN_VM_MX_L1_TLB_CNTL, HUBPREQ, id),\ -+ /* todo: get these from GVM instead of reading registers ourselves */\ -+ MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32),\ -+ MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32),\ -+ MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32),\ -+ MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32),\ -+ MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32),\ -+ MMHUB_SR(VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32),\ -+ MMHUB_SR(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32),\ -+ MMHUB_SR(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32),\ -+ MMHUB_SR(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB),\ -+ MMHUB_SR(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB),\ -+ MMHUB_SR(MC_VM_SYSTEM_APERTURE_LOW_ADDR),\ -+ MMHUB_SR(MC_VM_SYSTEM_APERTURE_HIGH_ADDR) - - #define MI_REG_LIST_DCN10(id)\ - MI_REG_LIST_DCN(id),\ -@@ -215,6 +228,20 @@ struct dcn_mi_registers { - uint32_t DCN_VM_AGP_BASE; - uint32_t DCN_VM_AGP_BOT; - uint32_t DCN_VM_AGP_TOP; -+ -+ /* GC registers. read only. temporary hack */ -+ uint32_t VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32; -+ uint32_t VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32; -+ uint32_t VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32; -+ uint32_t VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32; -+ uint32_t VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32; -+ uint32_t VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32; -+ uint32_t VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32; -+ uint32_t VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32; -+ uint32_t MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB; -+ uint32_t MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB; -+ uint32_t MC_VM_SYSTEM_APERTURE_LOW_ADDR; -+ uint32_t MC_VM_SYSTEM_APERTURE_HIGH_ADDR; - }; - - #define MI_SF(reg_name, field_name, post_fix)\ -@@ -360,7 +387,17 @@ struct dcn_mi_registers { - MI_SF(DCHUBBUB_SDPIF_FB_OFFSET, SDPIF_FB_OFFSET, mask_sh),\ - MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, MC_VM_SYSTEM_APERTURE_DEFAULT_SYSTEM, mask_sh),\ - MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, mask_sh),\ -- MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, mask_sh) -+ MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, mask_sh),\ -+ /* todo: get these from GVM instead of reading registers ourselves */\ -+ MI_SF(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, PAGE_DIRECTORY_ENTRY_HI32, mask_sh),\ -+ MI_SF(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, PAGE_DIRECTORY_ENTRY_LO32, mask_sh),\ -+ MI_SF(VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, LOGICAL_PAGE_NUMBER_HI4, mask_sh),\ -+ MI_SF(VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, LOGICAL_PAGE_NUMBER_LO32, mask_sh),\ -+ MI_SF(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32, PHYSICAL_PAGE_ADDR_HI4, mask_sh),\ -+ MI_SF(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32, PHYSICAL_PAGE_ADDR_LO32, mask_sh),\ -+ MI_SF(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, PHYSICAL_PAGE_NUMBER_MSB, mask_sh),\ -+ MI_SF(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, PHYSICAL_PAGE_NUMBER_LSB, mask_sh),\ -+ MI_SF(MC_VM_SYSTEM_APERTURE_LOW_ADDR, LOGICAL_ADDR, mask_sh) - - #define DCN_MI_REG_FIELD_LIST(type) \ - type HUBP_BLANK_EN;\ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c -index 082b39a..52f2f2d 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c -@@ -127,18 +127,10 @@ static void mpc10_mpcc_remove( - for (z_idx = 0; z_idx < opp->mpc_tree.num_pipes; z_idx++) - if (opp->mpc_tree.dpp[z_idx] == dpp_id) - break; -- - if (z_idx == opp->mpc_tree.num_pipes) { -- /* In case of resume from S3/S4, remove mpcc from bios left over */ -- REG_SET(MPCC_OPP_ID[dpp_id], 0, -- MPCC_OPP_ID, 0xf); -- REG_SET(MPCC_TOP_SEL[dpp_id], 0, -- MPCC_TOP_SEL, 0xf); -- REG_SET(MPCC_BOT_SEL[dpp_id], 0, -- MPCC_BOT_SEL, 0xf); -+ ASSERT(0); - return; - } -- - mpcc_id = opp->mpc_tree.mpcc[z_idx]; - - REG_SET(MPCC_OPP_ID[mpcc_id], 0, -@@ -237,9 +229,9 @@ static void mpc10_mpcc_add(struct mpc *mpc, struct mpcc_cfg *cfg) - mpc10_set_bg_color(mpc10, &cfg->black_color, mpcc_id); - - mpc10->mpcc_in_use_mask |= 1 << mpcc_id; -- for (z_idx = cfg->opp->mpc_tree.num_pipes; z_idx > cfg->z_index; z_idx--) { -- cfg->opp->mpc_tree.dpp[z_idx] = cfg->opp->mpc_tree.dpp[z_idx - 1]; -- cfg->opp->mpc_tree.mpcc[z_idx] = cfg->opp->mpc_tree.mpcc[z_idx - 1]; -+ for (z_idx = cfg->z_index; z_idx < cfg->opp->mpc_tree.num_pipes; z_idx++) { -+ cfg->opp->mpc_tree.dpp[z_idx + 1] = cfg->opp->mpc_tree.dpp[z_idx]; -+ cfg->opp->mpc_tree.mpcc[z_idx + 1] = cfg->opp->mpc_tree.mpcc[z_idx]; - } - cfg->opp->mpc_tree.dpp[cfg->z_index] = cfg->mi->inst; - cfg->opp->mpc_tree.mpcc[cfg->z_index] = mpcc_id; -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c -index fff86ad..6006fb4 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c -@@ -32,7 +32,6 @@ - - #include "dcn10/dcn10_ipp.h" - #include "dcn10/dcn10_mpc.h" --#include "dcn10/dcn10_dwb.h" - #include "irq/dcn10/irq_service_dcn10.h" - #include "dcn10/dcn10_dpp.h" - #include "dcn10/dcn10_timing_generator.h" -@@ -48,7 +47,6 @@ - #include "dce/dce_hwseq.h" - #include "../virtual/virtual_stream_encoder.h" - #include "dce110/dce110_resource.h" --#include "dce112/dce112_resource.h" - - #include "vega10/soc15ip.h" - -@@ -412,7 +410,6 @@ static const struct resource_caps res_cap = { - .num_audio = 4, - .num_stream_encoder = 4, - .num_pll = 4, -- .num_dwb = 2, - }; - - static const struct dc_debug debug_defaults_drv = { -@@ -422,10 +419,6 @@ static const struct dc_debug debug_defaults_drv = { - .force_abm_enable = false, - .timing_trace = false, - .clock_trace = true, -- /* spread sheet doesn't handle taps_c is one properly, -- * need to enable scaler for video surface to pass -- * bandwidth validation.*/ -- .always_scale = true, - .disable_pplib_clock_request = true, - .disable_pplib_wm_range = false, - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) -@@ -439,7 +432,6 @@ static const struct dc_debug debug_defaults_diags = { - .force_abm_enable = false, - .timing_trace = true, - .clock_trace = true, -- .disable_stutter = true, - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) - .disable_pplib_clock_request = true, - .disable_pplib_wm_range = true, -@@ -684,17 +676,6 @@ void dcn10_clock_source_destroy(struct clock_source **clk_src) - *clk_src = NULL; - } - --static struct pp_smu_funcs_rv *dcn10_pp_smu_create(struct dc_context *ctx) --{ -- struct pp_smu_funcs_rv *pp_smu = dm_alloc(sizeof(*pp_smu)); -- -- if (!pp_smu) -- return pp_smu; -- -- dm_pp_get_funcs_rv(ctx, pp_smu); -- return pp_smu; --} -- - static void destruct(struct dcn10_resource_pool *pool) - { - unsigned int i; -@@ -748,11 +729,6 @@ static void destruct(struct dcn10_resource_pool *pool) - dce_aud_destroy(&pool->base.audios[i]); - } - -- for (i = 0; i < pool->base.res_cap->num_dwb; i++) { -- dm_free(pool->base.dwbc[i]); -- pool->base.dwbc[i] = NULL; -- } -- - for (i = 0; i < pool->base.clk_src_count; i++) { - if (pool->base.clock_sources[i] != NULL) { - dcn10_clock_source_destroy(&pool->base.clock_sources[i]); -@@ -773,8 +749,6 @@ static void destruct(struct dcn10_resource_pool *pool) - - if (pool->base.display_clock != NULL) - dce_disp_clk_destroy(&pool->base.display_clock); -- -- dm_free(pool->base.pp_smu); - } - - static struct mem_input *dcn10_mem_input_create( -@@ -849,17 +823,19 @@ static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx) - } - - static enum dc_status build_mapped_resource( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream) -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context) - { - enum dc_status status = DC_OK; -- struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream); -+ uint8_t i, j; -+ -+ for (i = 0; i < context->stream_count; i++) { -+ struct dc_stream_state *stream = context->streams[i]; - -- /*TODO Seems unneeded anymore */ -- /* if (old_context && resource_is_stream_unchanged(old_context, stream)) { -+ if (old_context && resource_is_stream_unchanged(old_context, stream)) { - if (stream != NULL && old_context->streams[i] != NULL) { -- todo: shouldn't have to copy missing parameter here -+ /* todo: shouldn't have to copy missing parameter here */ - resource_build_bit_depth_reduction_params(stream, - &stream->bit_depth_params); - stream->clamping.pixel_encoding = -@@ -872,42 +848,76 @@ static enum dc_status build_mapped_resource( - continue; - } - } -- */ - -- if (!pipe_ctx) -- return DC_ERROR_UNEXPECTED; -+ for (j = 0; j < dc->res_pool->pipe_count ; j++) { -+ struct pipe_ctx *pipe_ctx = -+ &context->res_ctx.pipe_ctx[j]; -+ -+ if (context->res_ctx.pipe_ctx[j].stream != stream) -+ continue; -+ -+ status = build_pipe_hw_param(pipe_ctx); - -- status = build_pipe_hw_param(pipe_ctx); -+ if (status != DC_OK) -+ return status; - -- if (status != DC_OK) -- return status; -+ /* do not need to validate non root pipes */ -+ break; -+ } -+ } - - return DC_OK; - } - --enum dc_status dcn10_add_stream_to_ctx( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *dc_stream) -+enum dc_status dcn10_validate_with_context( -+ const struct core_dc *dc, -+ const struct dc_validation_set set[], -+ int set_count, -+ struct validate_context *context, -+ struct validate_context *old_context) - { -- enum dc_status result = DC_ERROR_UNEXPECTED; -+ enum dc_status result = DC_OK; -+ int i; - -- result = resource_map_pool_resources(dc, new_ctx, dc_stream); -+ if (set_count == 0) -+ return result; - -- if (result == DC_OK) -- result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream); -+ for (i = 0; i < set_count; i++) { -+ context->streams[i] = set[i].stream; -+ dc_stream_retain(context->streams[i]); -+ context->stream_count++; -+ } - -+ result = resource_map_pool_resources(dc, context, old_context); -+ if (result != DC_OK) -+ return result; - -- if (result == DC_OK) -- result = build_mapped_resource(dc, new_ctx, dc_stream); -+ result = resource_map_phy_clock_resources(dc, context, old_context); -+ if (result != DC_OK) -+ return result; -+ -+ result = build_mapped_resource(dc, context, old_context); -+ if (result != DC_OK) -+ return result; -+ -+ if (!resource_validate_attach_surfaces(set, set_count, -+ old_context, context, dc->res_pool)) -+ return DC_FAIL_ATTACH_SURFACES; -+ -+ result = resource_build_scaling_params_for_context(dc, context); -+ if (result != DC_OK) -+ return result; -+ -+ if (!dcn_validate_bandwidth(dc, context)) -+ return DC_FAIL_BANDWIDTH_VALIDATE; - - return result; - } - - enum dc_status dcn10_validate_guaranteed( -- struct dc *dc, -+ const struct core_dc *dc, - struct dc_stream_state *dc_stream, -- struct dc_state *context) -+ struct validate_context *context) - { - enum dc_status result = DC_ERROR_UNEXPECTED; - -@@ -915,17 +925,17 @@ enum dc_status dcn10_validate_guaranteed( - dc_stream_retain(context->streams[0]); - context->stream_count++; - -- result = resource_map_pool_resources(dc, context, dc_stream); -+ result = resource_map_pool_resources(dc, context, NULL); - - if (result == DC_OK) -- result = resource_map_phy_clock_resources(dc, context, dc_stream); -+ result = resource_map_phy_clock_resources(dc, context, NULL); - - if (result == DC_OK) -- result = build_mapped_resource(dc, context, dc_stream); -+ result = build_mapped_resource(dc, context, NULL); - - if (result == DC_OK) { - validate_guaranteed_copy_streams( -- context, dc->caps.max_streams); -+ context, dc->public.caps.max_streams); - result = resource_build_scaling_params_for_context(dc, context); - } - if (result == DC_OK && !dcn_validate_bandwidth(dc, context)) -@@ -935,7 +945,7 @@ enum dc_status dcn10_validate_guaranteed( - } - - static struct pipe_ctx *dcn10_acquire_idle_pipe_for_layer( -- struct dc_state *context, -+ struct validate_context *context, - const struct resource_pool *pool, - struct dc_stream_state *stream) - { -@@ -1201,15 +1211,15 @@ static struct dc_cap_funcs cap_funcs = { - static struct resource_funcs dcn10_res_pool_funcs = { - .destroy = dcn10_destroy_resource_pool, - .link_enc_create = dcn10_link_encoder_create, -+ .validate_with_context = dcn10_validate_with_context, - .validate_guaranteed = dcn10_validate_guaranteed, - .validate_bandwidth = dcn_validate_bandwidth, - .acquire_idle_pipe_for_layer = dcn10_acquire_idle_pipe_for_layer, -- .add_stream_to_ctx = dcn10_add_stream_to_ctx - }; - - static bool construct( - uint8_t num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct dcn10_resource_pool *pool) - { - int i; -@@ -1232,16 +1242,16 @@ static bool construct( - - /* TODO: Hardcode to correct number of functional controllers */ - pool->base.pipe_count = 4; -- dc->caps.max_downscale_ratio = 200; -- dc->caps.i2c_speed_in_khz = 100; -- dc->caps.max_cursor_size = 256; -+ dc->public.caps.max_downscale_ratio = 200; -+ dc->public.caps.i2c_speed_in_khz = 100; -+ dc->public.caps.max_cursor_size = 256; - -- dc->caps.max_slave_planes = 1; -+ dc->public.caps.max_slave_planes = 1; - - if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV) -- dc->debug = debug_defaults_drv; -+ dc->public.debug = debug_defaults_drv; - else -- dc->debug = debug_defaults_diags; -+ dc->public.debug = debug_defaults_diags; - - /************************************************* - * Create resources * -@@ -1310,40 +1320,36 @@ static bool construct( - } - - dml_init_instance(&dc->dml, DML_PROJECT_RAVEN1); -- memcpy(dc->dcn_ip, &dcn10_ip_defaults, sizeof(dcn10_ip_defaults)); -- memcpy(dc->dcn_soc, &dcn10_soc_defaults, sizeof(dcn10_soc_defaults)); -+ dc->dcn_ip = dcn10_ip_defaults; -+ dc->dcn_soc = dcn10_soc_defaults; - - if (ASICREV_IS_RV1_F0(dc->ctx->asic_id.hw_internal_rev)) { -- dc->dcn_soc->urgent_latency = 3; -- dc->debug.disable_dmcu = true; -- dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 41.60f; -+ dc->dcn_soc.urgent_latency = 3; -+ dc->public.debug.disable_dmcu = true; -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9 = 41.60f; - } - - -- dc->dcn_soc->number_of_channels = dc->ctx->asic_id.vram_width / ddr4_dram_width; -- ASSERT(dc->dcn_soc->number_of_channels < 3); -- if (dc->dcn_soc->number_of_channels == 0)/*old sbios bug*/ -- dc->dcn_soc->number_of_channels = 2; -+ dc->dcn_soc.number_of_channels = dc->ctx->asic_id.vram_width / ddr4_dram_width; -+ ASSERT(dc->dcn_soc.number_of_channels < 3); -+ if (dc->dcn_soc.number_of_channels == 0)/*old sbios bug*/ -+ dc->dcn_soc.number_of_channels = 2; - -- if (dc->dcn_soc->number_of_channels == 1) { -- dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 19.2f; -- dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 = 17.066f; -- dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 = 14.933f; -- dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 = 12.8f; -+ if (dc->dcn_soc.number_of_channels == 1) { -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9 = 19.2f; -+ dc->dcn_soc.fabric_and_dram_bandwidth_vnom0p8 = 17.066f; -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmid0p72 = 14.933f; -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmin0p65 = 12.8f; - if (ASICREV_IS_RV1_F0(dc->ctx->asic_id.hw_internal_rev)) { -- dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 20.80f; -+ dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9 = 20.80f; - } - } - -- pool->base.pp_smu = dcn10_pp_smu_create(ctx); -- -- if (!dc->debug.disable_pplib_clock_request) -+ if (!dc->public.debug.disable_pplib_clock_request) - dcn_bw_update_from_pplib(dc); - dcn_bw_sync_calcs_and_dml(dc); -- if (!dc->debug.disable_pplib_wm_range) { -- dc->res_pool = &pool->base; -+ if (!dc->public.debug.disable_pplib_wm_range) - dcn_bw_notify_pplib_of_wm_ranges(dc); -- } - - { - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) -@@ -1404,21 +1410,15 @@ static bool construct( - goto mpc_create_fail; - } - --#if defined(CONFIG_DRM_AMD_DC_DCN1_0) -- if (!dcn10_dwbc_create(ctx, &pool->base)) { -- goto dwbc_create_fail; -- } --#endif -- - if (!resource_construct(num_virtual_links, dc, &pool->base, - (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? - &res_create_funcs : &res_create_maximus_funcs))) - goto res_create_fail; - - dcn10_hw_sequencer_construct(dc); -- dc->caps.max_planes = pool->base.pipe_count; -+ dc->public.caps.max_planes = pool->base.pipe_count; - -- dc->cap_funcs = cap_funcs; -+ dc->public.cap_funcs = cap_funcs; - - return true; - -@@ -1432,7 +1432,6 @@ static bool construct( - irqs_create_fail: - res_create_fail: - clock_source_create_fail: --dwbc_create_fail: - - destruct(pool); - -@@ -1441,7 +1440,7 @@ static bool construct( - - struct resource_pool *dcn10_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc) -+ struct core_dc *dc) - { - struct dcn10_resource_pool *pool = - dm_alloc(sizeof(struct dcn10_resource_pool)); -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.h -index 8f71225..5f84dbd 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.h -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.h -@@ -31,7 +31,7 @@ - #define TO_DCN10_RES_POOL(pool)\ - container_of(pool, struct dcn10_resource_pool, base) - --struct dc; -+struct core_dc; - struct resource_pool; - struct _vcs_dpi_display_pipe_params_st; - -@@ -40,7 +40,7 @@ struct dcn10_resource_pool { - }; - struct resource_pool *dcn10_create_resource_pool( - uint8_t num_virtual_links, -- struct dc *dc); -+ struct core_dc *dc); - - - #endif /* __DC_RESOURCE_DCN10_H__ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.c -index 15f1f44..941e012 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.c -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.c -@@ -118,7 +118,6 @@ static void tgn10_program_timing( - uint32_t start_point = 0; - uint32_t field_num = 0; - uint32_t h_div_2; -- uint32_t vertial_line_start; - - struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); - -@@ -213,12 +212,6 @@ static void tgn10_program_timing( - OTG_V_BLANK_START, asic_blank_start, - OTG_V_BLANK_END, asic_blank_end); - -- /* Use OTG_VERTICAL_INTERRUPT2 replace VUPDATE interrupt, -- * program the reg for interrupt postition. -- */ -- vertial_line_start = asic_blank_end - tg->dlg_otg_param.vstartup_start + 1; -- REG_SET(OTG_VERTICAL_INTERRUPT2_POSITION, 0, -- OTG_VERTICAL_INTERRUPT2_LINE_START, vertial_line_start); - - /* v_sync polarity */ - v_sync_polarity = patched_crtc_timing.flags.VSYNC_POSITIVE_POLARITY ? -@@ -1097,48 +1090,6 @@ static bool tgn10_is_stereo_left_eye(struct timing_generator *tg) - return ret; - } - --void tgn10_read_otg_state(struct dcn10_timing_generator *tgn10, -- struct dcn_otg_state *s) --{ -- REG_GET_2(OTG_V_BLANK_START_END, -- OTG_V_BLANK_START, &s->v_blank_start, -- OTG_V_BLANK_END, &s->v_blank_end); -- -- REG_GET(OTG_V_SYNC_A_CNTL, -- OTG_V_SYNC_A_POL, &s->v_sync_a_pol); -- -- REG_GET(OTG_V_TOTAL, -- OTG_V_TOTAL, &s->v_total); -- -- REG_GET(OTG_V_TOTAL_MAX, -- OTG_V_TOTAL_MAX, &s->v_total_max); -- -- REG_GET(OTG_V_TOTAL_MIN, -- OTG_V_TOTAL_MIN, &s->v_total_min); -- -- REG_GET_2(OTG_V_SYNC_A, -- OTG_V_SYNC_A_START, &s->v_sync_a_start, -- OTG_V_SYNC_A_END, &s->v_sync_a_end); -- -- REG_GET_2(OTG_H_BLANK_START_END, -- OTG_H_BLANK_START, &s->h_blank_start, -- OTG_H_BLANK_END, &s->h_blank_end); -- -- REG_GET_2(OTG_H_SYNC_A, -- OTG_H_SYNC_A_START, &s->h_sync_a_start, -- OTG_H_SYNC_A_END, &s->h_sync_a_end); -- -- REG_GET(OTG_H_SYNC_A_CNTL, -- OTG_H_SYNC_A_POL, &s->h_sync_a_pol); -- -- REG_GET(OTG_H_TOTAL, -- OTG_H_TOTAL, &s->h_total); -- -- REG_GET(OPTC_INPUT_GLOBAL_CONTROL, -- OPTC_UNDERFLOW_OCCURRED_STATUS, &s->underflow_occurred_status); --} -- -- - static struct timing_generator_funcs dcn10_tg_funcs = { - .validate_timing = tgn10_validate_timing, - .program_timing = tgn10_program_timing, -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.h -index 38d3dcf..747e821 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.h -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.h -@@ -65,10 +65,8 @@ - SRI(OTG_NOM_VERT_POSITION, OTG, inst),\ - SRI(OTG_BLACK_COLOR, OTG, inst),\ - SRI(OTG_CLOCK_CONTROL, OTG, inst),\ -- SRI(OTG_VERTICAL_INTERRUPT2_POSITION, OTG, inst),\ - SRI(OPTC_INPUT_CLOCK_CONTROL, ODM, inst),\ - SRI(OPTC_DATA_SOURCE_SELECT, ODM, inst),\ -- SRI(OPTC_INPUT_GLOBAL_CONTROL, ODM, inst),\ - SRI(OPPBUF_CONTROL, OPPBUF, inst),\ - SRI(OPPBUF_3D_PARAMETERS_0, OPPBUF, inst),\ - SRI(CONTROL, VTG, inst),\ -@@ -121,10 +119,8 @@ struct dcn_tg_registers { - uint32_t OTG_TEST_PATTERN_CONTROL; - uint32_t OTG_TEST_PATTERN_COLOR; - uint32_t OTG_CLOCK_CONTROL; -- uint32_t OTG_VERTICAL_INTERRUPT2_POSITION; - uint32_t OPTC_INPUT_CLOCK_CONTROL; - uint32_t OPTC_DATA_SOURCE_SELECT; -- uint32_t OPTC_INPUT_GLOBAL_CONTROL; - uint32_t OPPBUF_CONTROL; - uint32_t OPPBUF_3D_PARAMETERS_0; - uint32_t CONTROL; -@@ -205,11 +201,9 @@ struct dcn_tg_registers { - SF(OTG0_OTG_CLOCK_CONTROL, OTG_CLOCK_EN, mask_sh),\ - SF(OTG0_OTG_CLOCK_CONTROL, OTG_CLOCK_ON, mask_sh),\ - SF(OTG0_OTG_CLOCK_CONTROL, OTG_CLOCK_GATE_DIS, mask_sh),\ -- SF(OTG0_OTG_VERTICAL_INTERRUPT2_POSITION, OTG_VERTICAL_INTERRUPT2_LINE_START, mask_sh),\ - SF(ODM0_OPTC_INPUT_CLOCK_CONTROL, OPTC_INPUT_CLK_EN, mask_sh),\ - SF(ODM0_OPTC_INPUT_CLOCK_CONTROL, OPTC_INPUT_CLK_ON, mask_sh),\ - SF(ODM0_OPTC_INPUT_CLOCK_CONTROL, OPTC_INPUT_CLK_GATE_DIS, mask_sh),\ -- SF(ODM0_OPTC_INPUT_GLOBAL_CONTROL, OPTC_UNDERFLOW_OCCURRED_STATUS, mask_sh),\ - SF(OPPBUF0_OPPBUF_CONTROL, OPPBUF_ACTIVE_WIDTH, mask_sh),\ - SF(OPPBUF0_OPPBUF_3D_PARAMETERS_0, OPPBUF_3D_VACT_SPACE1_SIZE, mask_sh),\ - SF(VTG0_CONTROL, VTG0_ENABLE, mask_sh),\ -@@ -311,13 +305,11 @@ struct dcn_tg_registers { - type OTG_CLOCK_EN;\ - type OTG_CLOCK_ON;\ - type OTG_CLOCK_GATE_DIS;\ -- type OTG_VERTICAL_INTERRUPT2_LINE_START;\ - type OPTC_INPUT_CLK_EN;\ - type OPTC_INPUT_CLK_ON;\ - type OPTC_INPUT_CLK_GATE_DIS;\ - type OPTC_SRC_SEL;\ - type OPTC_SEG0_SRC_SEL;\ -- type OPTC_UNDERFLOW_OCCURRED_STATUS;\ - type OPPBUF_ACTIVE_WIDTH;\ - type OPPBUF_3D_VACT_SPACE1_SIZE;\ - type VTG0_ENABLE;\ -@@ -354,25 +346,4 @@ struct dcn10_timing_generator { - - void dcn10_timing_generator_init(struct dcn10_timing_generator *tg); - --struct dcn_otg_state { -- uint32_t v_blank_start; -- uint32_t v_blank_end; -- uint32_t v_sync_a_pol; -- uint32_t v_total; -- uint32_t v_total_max; -- uint32_t v_total_min; -- uint32_t v_sync_a_start; -- uint32_t v_sync_a_end; -- uint32_t h_blank_start; -- uint32_t h_blank_end; -- uint32_t h_sync_a_start; -- uint32_t h_sync_a_end; -- uint32_t h_sync_a_pol; -- uint32_t h_total; -- uint32_t underflow_occurred_status; --}; -- --void tgn10_read_otg_state(struct dcn10_timing_generator *tgn10, -- struct dcn_otg_state *s); -- - #endif /* __DC_TIMING_GENERATOR_DCN10_H__ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dm_helpers.h b/drivers/gpu/drm/amd/display/dc/dm_helpers.h -index ab88f07..3901032 100644 ---- a/drivers/gpu/drm/amd/display/dc/dm_helpers.h -+++ b/drivers/gpu/drm/amd/display/dc/dm_helpers.h -@@ -96,6 +96,11 @@ bool dm_helpers_submit_i2c( - const struct dc_link *link, - struct i2c_command *cmd); - -+ -+ -+ -+ -+ - enum dc_edid_status dm_helpers_read_local_edid( - struct dc_context *ctx, - struct dc_link *link, -diff --git a/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h b/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h -deleted file mode 100644 -index bbfa832..0000000 ---- a/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h -+++ /dev/null -@@ -1,131 +0,0 @@ --/* -- * Copyright 2017 Advanced Micro Devices, Inc. -- * -- * Permission is hereby granted, free of charge, to any person obtaining a -- * copy of this software and associated documentation files (the "Software"), -- * to deal in the Software without restriction, including without limitation -- * the rights to use, copy, modify, merge, publish, distribute, sublicense, -- * and/or sell copies of the Software, and to permit persons to whom the -- * Software is furnished to do so, subject to the following conditions: -- * -- * The above copyright notice and this permission notice shall be included in -- * all copies or substantial portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR -- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -- * OTHER DEALINGS IN THE SOFTWARE. -- * -- * Authors: AMD -- * -- */ -- --#ifndef DM_PP_SMU_IF__H --#define DM_PP_SMU_IF__H -- --/* -- * interface to PPLIB/SMU to setup clocks and pstate requirements on SoC -- */ -- -- --struct pp_smu { -- struct dc_context *ctx; --}; -- --enum wm_set_id { -- WM_A, -- WM_B, -- WM_C, -- WM_D, -- WM_COUNT, --}; -- --struct pp_smu_wm_set_range { -- enum wm_set_id wm_inst; -- uint32_t min_fill_clk_khz; -- uint32_t max_fill_clk_khz; -- uint32_t min_drain_clk_khz; -- uint32_t max_drain_clk_khz; --}; -- --struct pp_smu_wm_range_sets { -- uint32_t num_reader_wm_sets; -- struct pp_smu_wm_set_range reader_wm_sets[WM_COUNT]; -- -- uint32_t num_writer_wm_sets; -- struct pp_smu_wm_set_range writer_wm_sets[WM_COUNT]; --}; -- --struct pp_smu_display_requirement_rv { -- /* PPSMC_MSG_SetDisplayCount: count -- * 0 triggers S0i2 optimization -- */ -- unsigned int display_count; -- -- /* PPSMC_MSG_SetHardMinFclkByFreq: khz -- * FCLK will vary with DPM, but never below requested hard min -- */ -- unsigned int hard_min_fclk_khz; -- -- /* PPSMC_MSG_SetHardMinDcefclkByFreq: khz -- * fixed clock at requested freq, either from FCH bypass or DFS -- */ -- unsigned int hard_min_dcefclk_khz; -- -- /* PPSMC_MSG_SetMinDeepSleepDcefclk: mhz -- * when DF is in cstate, dcf clock is further divided down -- * to just above given frequency -- */ -- unsigned int min_deep_sleep_dcefclk_mhz; --}; -- --struct pp_smu_funcs_rv { -- struct pp_smu pp_smu; -- -- void (*set_display_requirement)(struct pp_smu *pp, -- struct pp_smu_display_requirement_rv *req); -- -- /* which SMU message? are reader and writer WM separate SMU msg? */ -- void (*set_wm_ranges)(struct pp_smu *pp, -- struct pp_smu_wm_range_sets *ranges); -- --}; -- --#if 0 --struct pp_smu_funcs_rv { -- -- /* PPSMC_MSG_SetDisplayCount -- * 0 triggers S0i2 optimization -- */ -- void (*set_display_count)(struct pp_smu *pp, int count); -- -- /* PPSMC_MSG_SetHardMinFclkByFreq -- * FCLK will vary with DPM, but never below requested hard min -- */ -- void (*set_hard_min_fclk_by_freq)(struct pp_smu *pp, int khz); -- -- /* PPSMC_MSG_SetHardMinDcefclkByFreq -- * fixed clock at requested freq, either from FCH bypass or DFS -- */ -- void (*set_hard_min_dcefclk_by_freq)(struct pp_smu *pp, int khz); -- -- /* PPSMC_MSG_SetMinDeepSleepDcefclk -- * when DF is in cstate, dcf clock is further divided down -- * to just above given frequency -- */ -- void (*set_min_deep_sleep_dcefclk)(struct pp_smu *pp, int mhz); -- -- /* todo: aesthetic -- * watermark range table -- */ -- -- /* todo: functional/feature -- * PPSMC_MSG_SetHardMinSocclkByFreq: required to support DWB -- */ --}; --#endif -- --#endif /* DM_PP_SMU_IF__H */ -diff --git a/drivers/gpu/drm/amd/display/dc/dm_services.h b/drivers/gpu/drm/amd/display/dc/dm_services.h -index 8ab0af6..a7d661d 100644 ---- a/drivers/gpu/drm/amd/display/dc/dm_services.h -+++ b/drivers/gpu/drm/amd/display/dc/dm_services.h -@@ -75,9 +75,7 @@ - BREAK_TO_DEBUGGER(); \ - } while (0) - --#if defined(CONFIG_DRM_AMD_DC_DCN1_0) - #include <asm/fpu/api.h> --#endif - - #define dm_alloc(size) kzalloc(size, GFP_KERNEL) - #define dm_realloc(ptr, size) krealloc(ptr, size, GFP_KERNEL) -@@ -339,8 +337,9 @@ bool dm_pp_notify_wm_clock_changes( - const struct dc_context *ctx, - struct dm_pp_wm_sets_with_clock_ranges *wm_with_clock_ranges); - --void dm_pp_get_funcs_rv(struct dc_context *ctx, -- struct pp_smu_funcs_rv *funcs); -+bool dm_pp_notify_wm_clock_changes_soc15( -+ const struct dc_context *ctx, -+ struct dm_pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges); - - /* DAL calls this function to notify PP about completion of Mode Set. - * For PP it means that current DCE clocks are those which were returned -diff --git a/drivers/gpu/drm/amd/display/dc/dm_services_types.h b/drivers/gpu/drm/amd/display/dc/dm_services_types.h -index fa26cf4..4c04ec5 100644 ---- a/drivers/gpu/drm/amd/display/dc/dm_services_types.h -+++ b/drivers/gpu/drm/amd/display/dc/dm_services_types.h -@@ -29,8 +29,6 @@ - #include "os_types.h" - #include "dc_types.h" - --#include "dm_pp_smu.h" -- - struct dm_pp_clock_range { - int min_khz; - int max_khz; -diff --git a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c -index 3c9608c..667660f 100644 ---- a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c -+++ b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c -@@ -69,12 +69,6 @@ bool dal_aux_engine_acquire( - struct aux_engine *aux_engine = FROM_ENGINE(engine); - - enum gpio_result result; -- if (aux_engine->funcs->is_engine_available) { -- /*check whether SW could use the engine*/ -- if (!aux_engine->funcs->is_engine_available(aux_engine)) { -- return false; -- } -- } - - result = dal_ddc_open(ddc, GPIO_MODE_HARDWARE, - GPIO_DDC_CONFIG_TYPE_MODE_AUX); -diff --git a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.h b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.h -index 40b2028..b5d6c79 100644 ---- a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.h -+++ b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.h -@@ -86,8 +86,6 @@ struct aux_engine_funcs { - enum aux_channel_operation_result (*get_channel_status)( - struct aux_engine *engine, - uint8_t *returned_bytes); -- bool (*is_engine_available) ( -- struct aux_engine *engine); - }; - - struct aux_engine { -diff --git a/drivers/gpu/drm/amd/display/dc/i2caux/dce110/aux_engine_dce110.c b/drivers/gpu/drm/amd/display/dc/i2caux/dce110/aux_engine_dce110.c -index 98ce0fe..f49fd1a 100644 ---- a/drivers/gpu/drm/amd/display/dc/i2caux/dce110/aux_engine_dce110.c -+++ b/drivers/gpu/drm/amd/display/dc/i2caux/dce110/aux_engine_dce110.c -@@ -93,36 +93,15 @@ static void destroy( - } - - #define SW_CAN_ACCESS_AUX 1 --#define DMCU_CAN_ACCESS_AUX 2 - --static bool is_engine_available( -- struct aux_engine *engine) --{ -- struct aux_engine_dce110 *aux110 = FROM_AUX_ENGINE(engine); -- -- uint32_t value = REG_READ(AUX_ARB_CONTROL); -- uint32_t field = get_reg_field_value( -- value, -- AUX_ARB_CONTROL, -- AUX_REG_RW_CNTL_STATUS); -- -- return (field != DMCU_CAN_ACCESS_AUX); --} - static bool acquire_engine( - struct aux_engine *engine) - { - struct aux_engine_dce110 *aux110 = FROM_AUX_ENGINE(engine); - -- uint32_t value = REG_READ(AUX_ARB_CONTROL); -- uint32_t field = get_reg_field_value( -- value, -- AUX_ARB_CONTROL, -- AUX_REG_RW_CNTL_STATUS); -- if (field == DMCU_CAN_ACCESS_AUX) -- return false; - /* enable AUX before request SW to access AUX */ -- value = REG_READ(AUX_CONTROL); -- field = get_reg_field_value(value, -+ uint32_t value = REG_READ(AUX_CONTROL); -+ uint32_t field = get_reg_field_value(value, - AUX_CONTROL, - AUX_EN); - -@@ -416,7 +395,6 @@ static const struct aux_engine_funcs aux_engine_funcs = { - .submit_channel_request = submit_channel_request, - .process_channel_reply = process_channel_reply, - .get_channel_status = get_channel_status, -- .is_engine_available = is_engine_available, - }; - - static const struct engine_funcs engine_funcs = { -@@ -447,10 +425,6 @@ static bool construct( - static void destruct( - struct aux_engine_dce110 *engine) - { -- struct aux_engine_dce110 *aux110 = engine; --/*temp w/a, to do*/ -- REG_UPDATE(AUX_ARB_CONTROL, AUX_DMCU_DONE_USING_AUX_REG, 1); -- REG_UPDATE(AUX_ARB_CONTROL, AUX_SW_DONE_USING_AUX_REG, 1); - dal_aux_engine_destruct(&engine->base); - } - -diff --git a/drivers/gpu/drm/amd/display/dc/inc/clock_source.h b/drivers/gpu/drm/amd/display/dc/inc/clock_source.h -index ebcf67b..47ef904 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/clock_source.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/clock_source.h -@@ -166,10 +166,6 @@ struct clock_source_funcs { - struct clock_source *, - struct pixel_clk_params *, - struct pll_settings *); -- uint32_t (*get_pix_rate_in_hz)( -- struct clock_source *, -- struct pixel_clk_params *, -- struct pll_settings *); - }; - - struct clock_source { -diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_dc.h b/drivers/gpu/drm/amd/display/dc/inc/core_dc.h -new file mode 100644 -index 0000000..408ed3a ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/inc/core_dc.h -@@ -0,0 +1,59 @@ -+/* -+ * core_dc.h -+ * -+ * Created on: Nov 13, 2015 -+ * Author: yonsun -+ */ -+ -+#ifndef __CORE_DC_H__ -+#define __CORE_DC_H__ -+ -+#include "core_types.h" -+#include "hw_sequencer.h" -+#include "compressor.h" -+ -+#define DC_TO_CORE(dc)\ -+ container_of(dc, struct core_dc, public) -+ -+struct core_dc { -+ struct dc public; -+ struct dc_context *ctx; -+ -+ uint8_t link_count; -+ struct dc_link *links[MAX_PIPES * 2]; -+ -+ struct validate_context *current_context; -+ struct resource_pool *res_pool; -+ -+ /*Power State*/ -+ enum dc_video_power_state previous_power_state; -+ enum dc_video_power_state current_power_state; -+ -+ /* Display Engine Clock levels */ -+ struct dm_pp_clock_levels sclk_lvls; -+ -+ /* Inputs into BW and WM calculations. */ -+ struct bw_calcs_dceip bw_dceip; -+ struct bw_calcs_vbios bw_vbios; -+#ifdef CONFIG_DRM_AMD_DC_DCN1_0 -+ struct dcn_soc_bounding_box dcn_soc; -+ struct dcn_ip_params dcn_ip; -+ struct display_mode_lib dml; -+#endif -+ -+ /* HW functions */ -+ struct hw_sequencer_funcs hwss; -+ struct dce_hwseq *hwseq; -+ -+ /* temp store of dm_pp_display_configuration -+ * to compare to see if display config changed -+ */ -+ struct dm_pp_display_configuration prev_display_config; -+ -+ /* FBC compressor */ -+#ifdef ENABLE_FBC -+ struct compressor *fbc_compressor; -+#endif -+}; -+ -+#endif /* __CORE_DC_H__ */ -diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h -index 915d5c1..b300562 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h -@@ -32,10 +32,7 @@ - #include "ddc_service_types.h" - #include "dc_bios_types.h" - #include "mem_input.h" --#if defined(CONFIG_DRM_AMD_DC_DCN1_0) - #include "mpc.h" --#endif --#include "dwb.h" - - #define MAX_CLOCK_SOURCES 7 - -@@ -48,12 +45,11 @@ void enable_surface_flip_reporting(struct dc_plane_state *plane_state, - #include "clock_source.h" - #include "audio.h" - #include "hw_sequencer_types.h" --#include "dm_pp_smu.h" - - - /************ link *****************/ - struct link_init_data { -- const struct dc *dc; -+ const struct core_dc *dc; - struct dc_context *ctx; /* TODO: remove 'dal' when DC is complete. */ - uint32_t connector_index; /* this will be mapped to the HPD pins */ - uint32_t link_index; /* this is mapped to DAL display_index -@@ -70,9 +66,7 @@ enum dc_status dc_link_validate_mode_timing( - - void core_link_resume(struct dc_link *link); - --void core_link_enable_stream( -- struct dc_state *state, -- struct pipe_ctx *pipe_ctx); -+void core_link_enable_stream(struct pipe_ctx *pipe_ctx); - - void core_link_disable_stream(struct pipe_ctx *pipe_ctx); - -@@ -82,38 +76,34 @@ void core_link_set_avmute(struct pipe_ctx *pipe_ctx, bool enable); - #include "transform.h" - - struct resource_pool; --struct dc_state; -+struct validate_context; - struct resource_context; - - struct resource_funcs { - void (*destroy)(struct resource_pool **pool); - struct link_encoder *(*link_enc_create)( - const struct encoder_init_data *init); -+ enum dc_status (*validate_with_context)( -+ const struct core_dc *dc, -+ const struct dc_validation_set set[], -+ int set_count, -+ struct validate_context *context, -+ struct validate_context *old_context); - - enum dc_status (*validate_guaranteed)( -- struct dc *dc, -+ const struct core_dc *dc, - struct dc_stream_state *stream, -- struct dc_state *context); -+ struct validate_context *context); - - bool (*validate_bandwidth)( -- struct dc *dc, -- struct dc_state *context); -- -- enum dc_status (*validate_global)( -- struct dc *dc, -- struct dc_state *context); -+ const struct core_dc *dc, -+ struct validate_context *context); - - struct pipe_ctx *(*acquire_idle_pipe_for_layer)( -- struct dc_state *context, -+ struct validate_context *context, - const struct resource_pool *pool, - struct dc_stream_state *stream); -- - enum dc_status (*validate_plane)(const struct dc_plane_state *plane_state); -- -- enum dc_status (*add_stream_to_ctx)( -- struct dc *dc, -- struct dc_state *new_ctx, -- struct dc_stream_state *dc_stream); - }; - - struct audio_support{ -@@ -131,12 +121,9 @@ struct resource_pool { - struct output_pixel_processor *opps[MAX_PIPES]; - struct timing_generator *timing_generators[MAX_PIPES]; - struct stream_encoder *stream_enc[MAX_PIPES * 2]; -- -+#ifdef CONFIG_DRM_AMD_DC_DCN1_0 - struct mpc *mpc; -- struct pp_smu_funcs_rv *pp_smu; -- struct pp_smu_display_requirement_rv pp_smu_req; -- -- struct dwbc *dwbc[MAX_DWB_PIPES]; -+#endif - - unsigned int pipe_count; - unsigned int underlay_pipe_index; -@@ -190,6 +177,7 @@ struct pipe_ctx { - struct plane_resource plane_res; - struct stream_resource stream_res; - -+ struct display_clock *dis_clk; - struct clock_source *clock_source; - - struct pll_settings pll_settings; -@@ -205,7 +193,6 @@ struct pipe_ctx { - struct _vcs_dpi_display_rq_regs_st rq_regs; - struct _vcs_dpi_display_pipe_dest_params_st pipe_dlg_param; - #endif -- struct dwbc *dwbc; - }; - - struct resource_context { -@@ -232,6 +219,7 @@ struct dce_bw_output { - int blackout_recovery_time_us; - }; - -+#ifdef CONFIG_DRM_AMD_DC_DCN1_0 - struct dcn_bw_clocks { - int dispclk_khz; - bool dppclk_div; -@@ -247,13 +235,16 @@ struct dcn_bw_output { - struct dcn_bw_clocks calc_clk; - struct dcn_watermark_set watermarks; - }; -+#endif - - union bw_context { -+#ifdef CONFIG_DRM_AMD_DC_DCN1_0 - struct dcn_bw_output dcn; -+#endif - struct dce_bw_output dce; - }; - --struct dc_state { -+struct validate_context { - struct dc_stream_state *streams[MAX_PIPES]; - struct dc_stream_status stream_status[MAX_PIPES]; - uint8_t stream_count; -@@ -269,9 +260,7 @@ struct dc_state { - struct dcn_bw_internal_vars dcn_bw_vars; - #endif - -- struct display_clock *dis_clk; -- -- atomic_t ref_count; -+ int ref_count; - }; - - #endif /* _CORE_TYPES_H_ */ -diff --git a/drivers/gpu/drm/amd/display/dc/inc/dce_calcs.h b/drivers/gpu/drm/amd/display/dc/inc/dce_calcs.h -index ae2399f..36c48f7 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/dce_calcs.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/dce_calcs.h -@@ -33,8 +33,8 @@ - #include "bw_fixed.h" - - struct pipe_ctx; --struct dc; --struct dc_state; -+struct core_dc; -+struct validate_context; - struct dce_bw_output; - - enum bw_calcs_version { -diff --git a/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h b/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h -index 1e231f6..7e8abcd 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h -@@ -34,8 +34,8 @@ - #include "display_clock.h" - #include "../dml/display_mode_lib.h" - --struct dc; --struct dc_state; -+struct core_dc; -+struct validate_context; - - /******************************************************************************* - * DCN data structures. -@@ -620,16 +620,16 @@ struct dcn_ip_params { - extern const struct dcn_ip_params dcn10_ip_defaults; - - bool dcn_validate_bandwidth( -- struct dc *dc, -- struct dc_state *context); -+ const struct core_dc *dc, -+ struct validate_context *context); - - unsigned int dcn_find_dcfclk_suits_all( -- const struct dc *dc, -+ const struct core_dc *dc, - struct clocks_value *clocks); - --void dcn_bw_update_from_pplib(struct dc *dc); --void dcn_bw_notify_pplib_of_wm_ranges(struct dc *dc); --void dcn_bw_sync_calcs_and_dml(struct dc *dc); -+void dcn_bw_update_from_pplib(struct core_dc *dc); -+void dcn_bw_notify_pplib_of_wm_ranges(struct core_dc *dc); -+void dcn_bw_sync_calcs_and_dml(struct core_dc *dc); - - #endif /* __DCN_CALCS_H__ */ - -diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h b/drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h -index f5f69cd..879c3db 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h -@@ -62,7 +62,7 @@ struct display_clock { - }; - - struct display_clock_funcs { -- int (*set_clock)(struct display_clock *disp_clk, -+ void (*set_clock)(struct display_clock *disp_clk, - int requested_clock_khz); - - enum dm_pp_clocks_state (*get_required_clocks_state)( -diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h -index 0574c29..e34b259 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h -@@ -37,7 +37,7 @@ struct dmcu_funcs { - unsigned int start_offset, - const char *src, - unsigned int bytes); -- void (*set_psr_enable)(struct dmcu *dmcu, bool enable, bool wait); -+ void (*set_psr_enable)(struct dmcu *dmcu, bool enable); - void (*setup_psr)(struct dmcu *dmcu, - struct dc_link *link, - struct psr_context *psr_context); -diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dwb.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dwb.h -deleted file mode 100644 -index 82347ba..0000000 ---- a/drivers/gpu/drm/amd/display/dc/inc/hw/dwb.h -+++ /dev/null -@@ -1,193 +0,0 @@ --/* Copyright 2012-17 Advanced Micro Devices, Inc. -- * -- * Permission is hereby granted, free of charge, to any person obtaining a -- * copy of this software and associated documentation files (the "Software"), -- * to deal in the Software without restriction, including without limitation -- * the rights to use, copy, modify, merge, publish, distribute, sublicense, -- * and/or sell copies of the Software, and to permit persons to whom the -- * Software is furnished to do so, subject to the following conditions: -- * -- * The above copyright notice and this permission notice shall be included in -- * all copies or substantial portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR -- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -- * OTHER DEALINGS IN THE SOFTWARE. -- * -- * Authors: AMD -- * -- */ -- --#ifndef __DC_DWBC_H__ --#define __DC_DWBC_H__ -- --#include "dc_hw_types.h" -- --#define MAX_DWB_PIPES 3 -- --enum dce_version; -- --enum dwb_sw_version { -- dwb_ver_1_0 = 1, --}; -- --enum dwb_source { -- dwb_src_scl = 0, /* for DCE7x/9x, DCN won't support. */ -- dwb_src_blnd, /* for DCE7x/9x */ -- dwb_src_fmt, /* for DCE7x/9x */ --#if defined(CONFIG_DRM_AMD_DC_DCN1_0) -- dwb_src_otg0 = 0x100, /* for DCN1.x, register: mmDWB_SOURCE_SELECT */ -- dwb_src_otg1, /* for DCN1.x */ -- dwb_src_otg2, /* for DCN1.x */ -- dwb_src_otg3, /* for DCN1.x */ --#endif --}; -- --#if defined(CONFIG_DRM_AMD_DC_DCN1_0) --/* DCN1.x supports 2 pipes */ --#endif --enum dwb_pipe { -- dwb_pipe0 = 0, --#if defined(CONFIG_DRM_AMD_DC_DCN1_0) -- dwb_pipe1, --#endif -- dwb_pipe_max_num, --}; -- --enum setting_flags { -- sf_pipe = 0x00000001, -- sf_output_format = 0x00000002, -- sf_capture_rate = 0x00000004, -- sf_all = 0xffffffff, --}; -- --enum dwb_capture_rate { -- -- dwb_capture_rate_0 = 0, /* Every frame is captured. */ -- dwb_capture_rate_1 = 1, /* Every other frame is captured. */ -- dwb_capture_rate_2 = 2, /* Every 3rd frame is captured. */ -- dwb_capture_rate_3 = 3, /* Every 4th frame is captured. */ --}; -- --enum dwb_scaler_mode { -- dwb_scaler_mode_bypass444 = 0, -- dwb_scaler_mode_rgb444 = 1, -- dwb_scaler_mode_yuv444 = 2, -- dwb_scaler_mode_yuv420 = 3 --}; -- --struct dwb_caps { -- enum dce_version hw_version; /* DCN engine version. */ -- enum dwb_sw_version sw_version; /* DWB sw implementation version. */ -- unsigned int reserved[6]; /* Reserved for future use, MUST BE 0. */ -- unsigned int adapter_id; -- unsigned int num_pipes; /* number of DWB pipes */ -- struct { -- unsigned int support_dwb :1; -- unsigned int support_ogam :1; -- unsigned int support_wbscl :1; -- unsigned int support_ocsc :1; -- } caps; -- unsigned int reserved2[10]; /* Reserved for future use, MUST BE 0. */ --}; -- --struct dwb_status { -- bool enabled; -- /* Reserved ========================================================================= */ -- unsigned int reserved[8]; /* Reserved fields */ --}; -- --struct dwb_basic_settings { -- /* General DWB related input parameters ============================================= */ -- enum dwb_source input_src_select; /* Select input source: (DCE) 0: SCL; 1: BLND; 2: FMT; (DCN) OTG* or MPC* */ -- enum dwb_pipe input_pipe_select; /* Select input pipe: 0: PIPE0; 1: PIPE1; 2: PIPE2 */ -- -- /* CNV: WND Related parameters ====================================================== */ -- unsigned int capture_rate; /* Captures once every (capture_rate+1) frames */ -- -- /* CNV: CSC Related parameters ====================================================== */ -- unsigned int start_x; /* Horizontal window start position */ -- unsigned int start_y; /* Vertical window start position */ -- unsigned int src_width; /* Width of window captured within source window */ -- unsigned int src_height; /* Height of window captured within source window */ -- -- /* SISCL Related parameters ========================================================= */ -- unsigned int dest_width; /* Destination width */ -- unsigned int dest_height; /* Destination height */ -- -- /* MCIF bufer parameters ========================================================= */ -- unsigned long long luma_address[4]; -- unsigned long long chroma_address[4]; -- unsigned int luma_pitch; -- unsigned int chroma_pitch; -- unsigned int slice_lines; -- -- /* Reserved ========================================================================= */ -- unsigned int reserved[8]; /* Reserved fields */ -- --}; -- --struct dwb_advanced_settings { -- enum setting_flags uFlag; -- enum dwb_pipe pipe; /* default = DWB_PIPE_ALL */ -- enum dwb_scaler_mode out_format; /* default = DWBScalerMode_YUV420 */ -- enum dwb_capture_rate capture_rate; /* default = Every frame is captured */ -- unsigned int reserved[64]; /* reserved for future use, must be 0 */ --}; -- --/* / - dwb_frame_info is the info of the dumping data */ --struct dwb_frame_info { -- unsigned int size; -- unsigned int width; -- unsigned int height; -- unsigned int luma_pitch; -- unsigned int chroma_pitch; -- enum dwb_scaler_mode format; --}; -- --struct dwbc_cfg { -- struct dwb_basic_settings basic_settings; -- struct dwb_advanced_settings advanced_settings; --}; -- --struct dwbc { -- const struct dwbc_funcs *funcs; -- struct dc_context *ctx; -- struct dwbc_cfg config; -- struct dwb_status status; -- int inst; --}; -- --struct dwbc_funcs { -- bool (*get_caps)(struct dwbc *dwbc, struct dwb_caps *caps); -- -- bool (*enable)(struct dwbc *dwbc); -- -- bool (*disable)(struct dwbc *dwbc); -- -- bool (*get_status)(struct dwbc *dwbc, struct dwb_status *status); -- -- bool (*dump_frame)(struct dwbc *dwbc, struct dwb_frame_info *frame_info, -- unsigned char *luma_buffer, unsigned char *chroma_buffer, -- unsigned char *dest_luma_buffer, unsigned char *dest_chroma_buffer); -- -- bool (*set_basic_settings)(struct dwbc *dwbc, -- const struct dwb_basic_settings *basic_settings); -- -- bool (*get_basic_settings)(struct dwbc *dwbc, -- struct dwb_basic_settings *basic_settings); -- -- bool (*set_advanced_settings)(struct dwbc *dwbc, -- const struct dwb_advanced_settings *advanced_settings); -- -- bool (*get_advanced_settings)(struct dwbc *dwbc, -- struct dwb_advanced_settings *advanced_settings); -- -- bool (*reset_advanced_settings)(struct dwbc *dwbc); --}; -- --#endif -diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h b/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h -index 9602f26..589bdda 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h -@@ -98,24 +98,6 @@ enum graphics_csc_adjust_type { - GRAPHICS_CSC_ADJUST_TYPE_SW /*use adjustments */ - }; - --enum ipp_degamma_mode { -- IPP_DEGAMMA_MODE_BYPASS, -- IPP_DEGAMMA_MODE_HW_sRGB, -- IPP_DEGAMMA_MODE_HW_xvYCC, -- IPP_DEGAMMA_MODE_USER_PWL --}; -- --enum ipp_output_format { -- IPP_OUTPUT_FORMAT_12_BIT_FIX, -- IPP_OUTPUT_FORMAT_16_BIT_BYPASS, -- IPP_OUTPUT_FORMAT_FLOAT --}; -- --enum expansion_mode { -- EXPANSION_MODE_DYNAMIC, -- EXPANSION_MODE_ZERO --}; -- - struct default_adjustment { - enum lb_pixel_depth lb_color_depth; - enum dc_color_space out_color_space; -diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h -index 7ebfdc1..0f952e5 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h -@@ -54,7 +54,12 @@ struct ipp_prescale_params { - uint16_t scale; - }; - -- -+enum ipp_degamma_mode { -+ IPP_DEGAMMA_MODE_BYPASS, -+ IPP_DEGAMMA_MODE_HW_sRGB, -+ IPP_DEGAMMA_MODE_HW_xvYCC, -+ IPP_DEGAMMA_MODE_USER_PWL -+}; - - enum ovl_color_space { - OVL_COLOR_SPACE_UNKNOWN = 0, -@@ -63,6 +68,16 @@ enum ovl_color_space { - OVL_COLOR_SPACE_YUV709 - }; - -+enum expansion_mode { -+ EXPANSION_MODE_DYNAMIC, -+ EXPANSION_MODE_ZERO -+}; -+ -+enum ipp_output_format { -+ IPP_OUTPUT_FORMAT_12_BIT_FIX, -+ IPP_OUTPUT_FORMAT_16_BIT_BYPASS, -+ IPP_OUTPUT_FORMAT_FLOAT -+}; - - struct ipp_funcs { - -diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h b/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h -index 961bbcc..38e4070 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h -@@ -37,7 +37,6 @@ struct encoder_feature_support { - uint32_t IS_TPS3_CAPABLE:1; - uint32_t IS_TPS4_CAPABLE:1; - uint32_t IS_YCBCR_CAPABLE:1; -- uint32_t HDMI_6GB_EN:1; - } bits; - uint32_t raw; - } flags; -diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h b/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h -index 6cef9ad..a02f18a 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h -@@ -30,7 +30,6 @@ - - #include "dml/display_mode_structs.h" - --struct dchub_init_data; - struct cstate_pstate_watermarks_st { - uint32_t cstate_exit_ns; - uint32_t cstate_enter_plus_exit_ns; -@@ -74,19 +73,6 @@ struct mem_input { - struct stutter_modes stutter_mode; - }; - --struct vm_system_aperture_param { -- PHYSICAL_ADDRESS_LOC sys_default; -- PHYSICAL_ADDRESS_LOC sys_low; -- PHYSICAL_ADDRESS_LOC sys_high; --}; -- --struct vm_context0_param { -- PHYSICAL_ADDRESS_LOC pte_base; -- PHYSICAL_ADDRESS_LOC pte_start; -- PHYSICAL_ADDRESS_LOC pte_end; -- PHYSICAL_ADDRESS_LOC fault_default; --}; -- - struct mem_input_funcs { - void (*mem_input_setup)( - struct mem_input *mem_input, -@@ -138,14 +124,6 @@ struct mem_input_funcs { - union dc_tiling_info *tiling_info, - enum dc_rotation_angle rotation); - -- void (*mem_input_set_vm_system_aperture_settings)( -- struct mem_input *mem_input, -- struct vm_system_aperture_param *apt); -- -- void (*mem_input_set_vm_context0_settings)( -- struct mem_input *mem_input, -- const struct vm_context0_param *vm0); -- - void (*mem_input_program_surface_config)( - struct mem_input *mem_input, - enum surface_pixel_format format, -@@ -161,8 +139,6 @@ struct mem_input_funcs { - struct dchub_init_data *dh_data); - - void (*set_blank)(struct mem_input *mi, bool blank); -- void (*set_hubp_blank_en)(struct mem_input *mi, bool blank); -- - }; - - #endif -diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/transform.h b/drivers/gpu/drm/amd/display/dc/inc/hw/transform.h -index 623042d..f3d6675 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/hw/transform.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/transform.h -@@ -219,26 +219,6 @@ struct transform_funcs { - void (*opp_set_regamma_mode)( - struct transform *xfm_base, - enum opp_regamma mode); -- -- void (*ipp_set_degamma)( -- struct transform *xfm_base, -- enum ipp_degamma_mode mode); -- -- void (*ipp_program_input_lut)( -- struct transform *xfm_base, -- const struct dc_gamma *gamma); -- -- void (*ipp_program_degamma_pwl)(struct transform *xfm_base, -- const struct pwl_params *params); -- -- void (*ipp_setup)( -- struct transform *xfm_base, -- enum surface_pixel_format input_format, -- enum expansion_mode mode, -- enum ipp_output_format cnv_out_format); -- -- void (*ipp_full_bypass)(struct transform *xfm_base); -- - }; - - extern const uint16_t filter_2tap_16p[18]; -diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h -index aae7629..7689e37 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h -@@ -25,10 +25,8 @@ - - #ifndef __DC_HW_SEQUENCER_H__ - #define __DC_HW_SEQUENCER_H__ --#include "dc_types.h" --#include "clock_source.h" --#include "inc/hw/timing_generator.h" --#include "core_status.h" -+#include "core_types.h" -+#include "timing_generator.h" - - enum pipe_gating_control { - PIPE_GATING_CONTROL_DISABLE = 0, -@@ -48,31 +46,25 @@ struct dce_hwseq { - struct dce_hwseq_wa wa; - }; - --struct pipe_ctx; --struct dc_state; --struct dchub_init_data; --struct dc_static_screen_events; --struct resource_pool; --struct resource_context; - - struct hw_sequencer_funcs { - -- void (*init_hw)(struct dc *dc); -+ void (*init_hw)(struct core_dc *dc); - - enum dc_status (*apply_ctx_to_hw)( -- struct dc *dc, struct dc_state *context); -+ struct core_dc *dc, struct validate_context *context); - - void (*reset_hw_ctx_wrap)( -- struct dc *dc, struct dc_state *context); -+ struct core_dc *dc, struct validate_context *context); - - void (*apply_ctx_for_surface)( -- struct dc *dc, -+ struct core_dc *dc, - const struct dc_stream_state *stream, - int num_planes, -- struct dc_state *context); -+ struct validate_context *context); - - void (*set_plane_config)( -- const struct dc *dc, -+ const struct core_dc *dc, - struct pipe_ctx *pipe_ctx, - struct resource_context *res_ctx); - -@@ -85,7 +77,7 @@ struct hw_sequencer_funcs { - uint16_t *matrix); - - void (*update_plane_addr)( -- const struct dc *dc, -+ const struct core_dc *dc, - struct pipe_ctx *pipe_ctx); - - void (*update_dchub)( -@@ -103,12 +95,12 @@ struct hw_sequencer_funcs { - struct pipe_ctx *pipe_ctx, - const struct dc_stream_state *stream); - -- void (*power_down)(struct dc *dc); -+ void (*power_down)(struct core_dc *dc); - -- void (*enable_accelerated_mode)(struct dc *dc); -+ void (*enable_accelerated_mode)(struct core_dc *dc); - - void (*enable_timing_synchronization)( -- struct dc *dc, -+ struct core_dc *dc, - int group_index, - int group_size, - struct pipe_ctx *grouped_pipes[]); -@@ -118,16 +110,16 @@ struct hw_sequencer_funcs { - bool clock_gating); - - bool (*enable_display_power_gating)( -- struct dc *dc, -+ struct core_dc *dc, - uint8_t controller_id, - struct dc_bios *dcb, - enum pipe_gating_control power_gating); - -- void (*power_down_front_end)(struct dc *dc, int fe_idx); -+ void (*power_down_front_end)(struct core_dc *dc, int fe_idx); - -- void (*power_on_front_end)(struct dc *dc, -+ void (*power_on_front_end)(struct core_dc *dc, - struct pipe_ctx *pipe, -- struct dc_state *context); -+ struct validate_context *context); - - void (*update_info_frame)(struct pipe_ctx *pipe_ctx); - -@@ -139,13 +131,13 @@ struct hw_sequencer_funcs { - struct dc_link_settings *link_settings); - - void (*pipe_control_lock)( -- struct dc *dc, -+ struct core_dc *dc, - struct pipe_ctx *pipe, - bool lock); - - void (*set_bandwidth)( -- struct dc *dc, -- struct dc_state *context, -+ struct core_dc *dc, -+ struct validate_context *context, - bool decrease_allowed); - - void (*set_drr)(struct pipe_ctx **pipe_ctx, int num_pipes, -@@ -159,27 +151,24 @@ struct hw_sequencer_funcs { - - enum dc_status (*prog_pixclk_crtc_otg)( - struct pipe_ctx *pipe_ctx, -- struct dc_state *context, -- struct dc *dc); -+ struct validate_context *context, -+ struct core_dc *dc); - - void (*setup_stereo)( - struct pipe_ctx *pipe_ctx, -- struct dc *dc); -+ struct core_dc *dc); - - void (*set_avmute)(struct pipe_ctx *pipe_ctx, bool enable); - -- void (*log_hw_state)(struct dc *dc); -+ void (*log_hw_state)(struct core_dc *dc); - -- void (*wait_for_mpcc_disconnect)(struct dc *dc, -+ void (*wait_for_mpcc_disconnect)(struct core_dc *dc, - struct resource_pool *res_pool, - struct pipe_ctx *pipe_ctx); -- -- void (*ready_shared_resources)(struct dc *dc); -- void (*optimize_shared_resources)(struct dc *dc); - }; - - void color_space_to_black_color( -- const struct dc *dc, -+ const struct core_dc *dc, - enum dc_color_space colorspace, - struct tg_color *black_color); - -diff --git a/drivers/gpu/drm/amd/display/dc/inc/resource.h b/drivers/gpu/drm/amd/display/dc/inc/resource.h -index 41437da..7f30d99 100644 ---- a/drivers/gpu/drm/amd/display/dc/inc/resource.h -+++ b/drivers/gpu/drm/amd/display/dc/inc/resource.h -@@ -27,8 +27,8 @@ - - #include "core_types.h" - #include "core_status.h" -+#include "core_dc.h" - #include "dal_asic_id.h" --#include "dm_pp_smu.h" - - /* TODO unhardcode, 4 for CZ*/ - #define MEMORY_TYPE_MULTIPLIER 4 -@@ -67,28 +67,28 @@ struct resource_create_funcs { - - bool resource_construct( - unsigned int num_virtual_links, -- struct dc *dc, -+ struct core_dc *dc, - struct resource_pool *pool, - const struct resource_create_funcs *create_funcs); - - struct resource_pool *dc_create_resource_pool( -- struct dc *dc, -+ struct core_dc *dc, - int num_virtual_links, - enum dce_version dc_version, - struct hw_asic_id asic_id); - --void dc_destroy_resource_pool(struct dc *dc); -+void dc_destroy_resource_pool(struct core_dc *dc); - - enum dc_status resource_map_pool_resources( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream); -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context); - - bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx); - - enum dc_status resource_build_scaling_params_for_context( -- const struct dc *dc, -- struct dc_state *context); -+ const struct core_dc *dc, -+ struct validate_context *context); - - void resource_build_info_frame(struct pipe_ctx *pipe_ctx); - -@@ -122,7 +122,7 @@ bool resource_attach_surfaces_to_context( - struct dc_plane_state *const *plane_state, - int surface_count, - struct dc_stream_state *dc_stream, -- struct dc_state *context, -+ struct validate_context *context, - const struct resource_pool *pool); - - struct pipe_ctx *find_idle_secondary_pipe( -@@ -130,32 +130,32 @@ struct pipe_ctx *find_idle_secondary_pipe( - const struct resource_pool *pool); - - bool resource_is_stream_unchanged( -- struct dc_state *old_context, struct dc_stream_state *stream); -+ struct validate_context *old_context, struct dc_stream_state *stream); - - bool resource_validate_attach_surfaces( - const struct dc_validation_set set[], - int set_count, -- const struct dc_state *old_context, -- struct dc_state *context, -+ const struct validate_context *old_context, -+ struct validate_context *context, - const struct resource_pool *pool); - - void validate_guaranteed_copy_streams( -- struct dc_state *context, -+ struct validate_context *context, - int max_streams); - - void resource_validate_ctx_update_pointer_after_copy( -- const struct dc_state *src_ctx, -- struct dc_state *dst_ctx); -+ const struct validate_context *src_ctx, -+ struct validate_context *dst_ctx); - - enum dc_status resource_map_clock_resources( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream); -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context); - - enum dc_status resource_map_phy_clock_resources( -- const struct dc *dc, -- struct dc_state *context, -- struct dc_stream_state *stream); -+ const struct core_dc *dc, -+ struct validate_context *context, -+ struct validate_context *old_context); - - bool pipe_need_reprogram( - struct pipe_ctx *pipe_ctx_old, -diff --git a/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.c b/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.c -index 7cce284..24e47eb 100644 ---- a/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.c -+++ b/drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.c -@@ -34,8 +34,8 @@ - - #include "ivsrcid/ivsrcid_vislands30.h" - --#include "dc.h" --#include "core_types.h" -+#include "core_dc.h" -+ - static bool hpd_ack( - struct irq_service *irq_service, - const struct irq_source_info *info) -@@ -206,7 +206,7 @@ bool dce110_vblank_set( - bool enable) - { - struct dc_context *dc_ctx = irq_service->ctx; -- struct dc *core_dc = irq_service->ctx->dc; -+ struct core_dc *core_dc = DC_TO_CORE(irq_service->ctx->dc); - enum dc_irq_source dal_irq_src = dc_interrupt_to_irq_source( - irq_service->ctx->dc, - info->src_id, -@@ -214,7 +214,7 @@ bool dce110_vblank_set( - uint8_t pipe_offset = dal_irq_src - IRQ_TYPE_VBLANK; - - struct timing_generator *tg = -- core_dc->current_state->res_ctx.pipe_ctx[pipe_offset].stream_res.tg; -+ core_dc->current_context->res_ctx.pipe_ctx[pipe_offset].stream_res.tg; - - if (enable) { - if (!tg->funcs->arm_vert_intr(tg, 2)) { -diff --git a/drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.c b/drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.c -index f458ef8..7e8cb22 100644 ---- a/drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.c -+++ b/drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.c -@@ -36,6 +36,7 @@ - #include "ivsrcid/ivsrcid_vislands30.h" - - #include "dc_types.h" -+#include "inc/core_dc.h" - - static bool hpd_ack( - struct irq_service *irq_service, -diff --git a/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h b/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h -index 92fe00f..6cdbf84 100644 ---- a/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h -+++ b/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h -@@ -65,7 +65,6 @@ enum dal_device_type { - struct device_id { - enum dal_device_type device_type:16; - uint32_t enum_id:16; /* 1 based enum */ -- uint16_t raw_device_tag; - }; - - struct graphics_object_i2c_info { -@@ -265,20 +264,6 @@ struct transmitter_configuration { - #define NUMBER_OF_DISP_CLK_VOLTAGE 4 - #define NUMBER_OF_AVAILABLE_SCLK 5 - --struct i2c_reg_info { -- unsigned char i2c_reg_index; -- unsigned char i2c_reg_val; --}; -- --struct ext_hdmi_settings { -- unsigned char slv_addr; -- unsigned char reg_num; -- struct i2c_reg_info reg_settings[9]; -- unsigned char reg_num_6g; -- struct i2c_reg_info reg_settings_6g[3]; --}; -- -- - /* V6 */ - struct integrated_info { - struct clock_voltage_caps { -@@ -306,8 +291,6 @@ struct integrated_info { - struct graphics_object_id ext_encoder_obj_id; - /* XBAR mapping of the PHY channels */ - union ddi_channel_mapping channel_mapping; -- -- unsigned short caps; - } path[MAX_NUMBER_OF_EXT_DISPLAY_PATH]; - - uint8_t gu_id[NUMBER_OF_UCHAR_FOR_GUID]; -@@ -374,27 +357,6 @@ struct integrated_info { - uint32_t lvds_pwr_off_seq_blon_to_vary_bl_in_4ms; - uint32_t lvds_reserved1; - uint32_t lvds_bit_depth_control_val; -- //Start from V9 -- unsigned char dp0_ext_hdmi_slv_addr; -- unsigned char dp0_ext_hdmi_reg_num; -- struct i2c_reg_info dp0_ext_hdmi_reg_settings[9]; -- unsigned char dp0_ext_hdmi_6g_reg_num; -- struct i2c_reg_info dp0_ext_hdmi_6g_reg_settings[3]; -- unsigned char dp1_ext_hdmi_slv_addr; -- unsigned char dp1_ext_hdmi_reg_num; -- struct i2c_reg_info dp1_ext_hdmi_reg_settings[9]; -- unsigned char dp1_ext_hdmi_6g_reg_num; -- struct i2c_reg_info dp1_ext_hdmi_6g_reg_settings[3]; -- unsigned char dp2_ext_hdmi_slv_addr; -- unsigned char dp2_ext_hdmi_reg_num; -- struct i2c_reg_info dp2_ext_hdmi_reg_settings[9]; -- unsigned char dp2_ext_hdmi_6g_reg_num; -- struct i2c_reg_info dp2_ext_hdmi_6g_reg_settings[3]; -- unsigned char dp3_ext_hdmi_slv_addr; -- unsigned char dp3_ext_hdmi_reg_num; -- struct i2c_reg_info dp3_ext_hdmi_reg_settings[9]; -- unsigned char dp3_ext_hdmi_6g_reg_num; -- struct i2c_reg_info dp3_ext_hdmi_6g_reg_settings[3]; - }; - - /** -diff --git a/drivers/gpu/drm/amd/display/include/logger_interface.h b/drivers/gpu/drm/amd/display/include/logger_interface.h -index 6641e80..beb7909 100644 ---- a/drivers/gpu/drm/amd/display/include/logger_interface.h -+++ b/drivers/gpu/drm/amd/display/include/logger_interface.h -@@ -32,7 +32,7 @@ struct dc_context; - struct dc_link; - struct dc_surface_update; - struct resource_context; --struct dc_state; -+struct validate_context; - - /* - * -@@ -76,24 +76,24 @@ void logger_write(struct dal_logger *logger, - void *paralist); - - void pre_surface_trace( -- struct dc *dc, -+ const struct dc *dc, - const struct dc_plane_state *const *plane_states, - int surface_count); - - void update_surface_trace( -- struct dc *dc, -+ const struct dc *dc, - const struct dc_surface_update *updates, - int surface_count); - --void post_surface_trace(struct dc *dc); -+void post_surface_trace(const struct dc *dc); - - void context_timing_trace( -- struct dc *dc, -+ const struct dc *dc, - struct resource_context *res_ctx); - - void context_clock_trace( -- struct dc *dc, -- struct dc_state *context); -+ const struct dc *dc, -+ struct validate_context *context); - - /* Any function which is empty or have incomplete implementation should be - * marked by this macro. -diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c -index 52350d0..f0a3e43 100644 ---- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c -+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c -@@ -27,6 +27,7 @@ - #include "dc.h" - #include "mod_freesync.h" - #include "core_types.h" -+#include "core_dc.h" - - #define MOD_FREESYNC_MAX_CONCURRENT_STREAMS 32 - -@@ -145,6 +146,7 @@ struct mod_freesync *mod_freesync_create(struct dc *dc) - struct core_freesync *core_freesync = - dm_alloc(sizeof(struct core_freesync)); - -+ struct core_dc *core_dc = DC_TO_CORE(dc); - - struct persistent_data_flag flag; - -@@ -175,19 +177,19 @@ struct mod_freesync *mod_freesync_create(struct dc *dc) - /* Create initial module folder in registry for freesync enable data */ - flag.save_per_edid = true; - flag.save_per_link = false; -- dm_write_persistent_data(dc->ctx, NULL, FREESYNC_REGISTRY_NAME, -+ dm_write_persistent_data(core_dc->ctx, NULL, FREESYNC_REGISTRY_NAME, - NULL, NULL, 0, &flag); - flag.save_per_edid = false; - flag.save_per_link = false; - -- if (dm_read_persistent_data(dc->ctx, NULL, NULL, -+ if (dm_read_persistent_data(core_dc->ctx, NULL, NULL, - FREESYNC_NO_STATIC_FOR_INTERNAL_REGKEY, - &data, sizeof(data), &flag)) { - core_freesync->opts.drr_internal_supported = - (data & 1) ? false : true; - } - -- if (dm_read_persistent_data(dc->ctx, NULL, NULL, -+ if (dm_read_persistent_data(core_dc->ctx, NULL, NULL, - FREESYNC_NO_STATIC_FOR_EXTERNAL_DP_REGKEY, - &data, sizeof(data), &flag)) { - core_freesync->opts.drr_external_supported = -@@ -244,7 +246,7 @@ static unsigned int map_index_from_stream(struct core_freesync *core_freesync, - bool mod_freesync_add_stream(struct mod_freesync *mod_freesync, - struct dc_stream_state *stream, struct mod_freesync_caps *caps) - { -- struct dc *dc = NULL; -+ struct core_dc *core_dc = NULL; - struct core_freesync *core_freesync = NULL; - int persistent_freesync_enable = 0; - struct persistent_data_flag flag; -@@ -255,7 +257,7 @@ bool mod_freesync_add_stream(struct mod_freesync *mod_freesync, - return false; - - core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync); -- dc = core_freesync->dc; -+ core_dc = DC_TO_CORE(core_freesync->dc); - - flag.save_per_edid = true; - flag.save_per_link = false; -@@ -286,7 +288,7 @@ bool mod_freesync_add_stream(struct mod_freesync *mod_freesync, - static_ramp.ramp_is_active = false; - - /* get persistent data from registry */ -- if (dm_read_persistent_data(dc->ctx, stream->sink, -+ if (dm_read_persistent_data(core_dc->ctx, stream->sink, - FREESYNC_REGISTRY_NAME, - "userenable", &persistent_freesync_enable, - sizeof(int), &flag)) { -@@ -969,14 +971,14 @@ bool mod_freesync_set_user_enable(struct mod_freesync *mod_freesync, - unsigned int stream_index, map_index; - int persistent_data = 0; - struct persistent_data_flag flag; -- struct dc *dc = NULL; -+ struct core_dc *core_dc = NULL; - struct core_freesync *core_freesync = NULL; - - if (mod_freesync == NULL) - return false; - - core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync); -- dc = core_freesync->dc; -+ core_dc = DC_TO_CORE(core_freesync->dc); - - flag.save_per_edid = true; - flag.save_per_link = false; -@@ -1000,7 +1002,7 @@ bool mod_freesync_set_user_enable(struct mod_freesync *mod_freesync, - enable_for_video) - persistent_data = persistent_data | 4; - -- dm_write_persistent_data(dc->ctx, -+ dm_write_persistent_data(core_dc->ctx, - streams[stream_index]->sink, - FREESYNC_REGISTRY_NAME, - "userenable", --- -2.7.4 - |