drm/amd/display/amdgpu_dm: Make amdgpu_dm_register_backlight_device() take an amdgpu_...
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / display / amdgpu_dm / amdgpu_dm.c
index 79ae01a..aee7950 100644 (file)
@@ -41,6 +41,8 @@
 #include "dpcd_defs.h"
 #include "link/protocols/link_dpcd.h"
 #include "link_service_types.h"
+#include "link/protocols/link_dp_capability.h"
+#include "link/protocols/link_ddc.h"
 
 #include "vid.h"
 #include "amdgpu.h"
 #include "amdgpu_dm.h"
 #include "amdgpu_dm_plane.h"
 #include "amdgpu_dm_crtc.h"
-#ifdef CONFIG_DRM_AMD_DC_HDCP
 #include "amdgpu_dm_hdcp.h"
 #include <drm/display/drm_hdcp_helper.h>
-#endif
 #include "amdgpu_pm.h"
 #include "amdgpu_atombios.h"
 
@@ -342,12 +342,52 @@ static inline bool is_dc_timing_adjust_needed(struct dm_crtc_state *old_state,
 {
        if (new_state->freesync_config.state ==  VRR_STATE_ACTIVE_FIXED)
                return true;
-       else if (amdgpu_dm_vrr_active(old_state) != amdgpu_dm_vrr_active(new_state))
+       else if (amdgpu_dm_crtc_vrr_active(old_state) != amdgpu_dm_crtc_vrr_active(new_state))
                return true;
        else
                return false;
 }
 
+static inline void reverse_planes_order(struct dc_surface_update *array_of_surface_update,
+                                       int planes_count)
+{
+       int i, j;
+
+       for (i = 0, j = planes_count - 1; i < j; i++, j--)
+               swap(array_of_surface_update[i], array_of_surface_update[j]);
+}
+
+/**
+ * update_planes_and_stream_adapter() - Send planes to be updated in DC
+ *
+ * DC has a generic way to update planes and stream via
+ * dc_update_planes_and_stream function; however, DM might need some
+ * adjustments and preparation before calling it. This function is a wrapper
+ * for the dc_update_planes_and_stream that does any required configuration
+ * before passing control to DC.
+ */
+static inline bool update_planes_and_stream_adapter(struct dc *dc,
+                                                   int update_type,
+                                                   int planes_count,
+                                                   struct dc_stream_state *stream,
+                                                   struct dc_stream_update *stream_update,
+                                                   struct dc_surface_update *array_of_surface_update)
+{
+       reverse_planes_order(array_of_surface_update, planes_count);
+
+       /*
+        * Previous frame finished and HW is ready for optimization.
+        */
+       if (update_type == UPDATE_TYPE_FAST)
+               dc_post_update_surfaces_to_stream(dc);
+
+       return dc_update_planes_and_stream(dc,
+                                          array_of_surface_update,
+                                          planes_count,
+                                          stream,
+                                          stream_update);
+}
+
 /**
  * dm_pflip_high_irq() - Handle pageflip interrupt
  * @interrupt_params: ignored
@@ -392,7 +432,7 @@ static void dm_pflip_high_irq(void *interrupt_params)
 
        WARN_ON(!e);
 
-       vrr_active = amdgpu_dm_vrr_active_irq(amdgpu_crtc);
+       vrr_active = amdgpu_dm_crtc_vrr_active_irq(amdgpu_crtc);
 
        /* Fixed refresh rate, or VRR scanout position outside front-porch? */
        if (!vrr_active ||
@@ -466,7 +506,7 @@ static void dm_vupdate_high_irq(void *interrupt_params)
        acrtc = get_crtc_by_otg_inst(adev, irq_params->irq_src - IRQ_TYPE_VUPDATE);
 
        if (acrtc) {
-               vrr_active = amdgpu_dm_vrr_active_irq(acrtc);
+               vrr_active = amdgpu_dm_crtc_vrr_active_irq(acrtc);
                drm_dev = acrtc->base.dev;
                vblank = &drm_dev->vblank[acrtc->base.index];
                previous_timestamp = atomic64_read(&irq_params->previous_timestamp);
@@ -490,7 +530,7 @@ static void dm_vupdate_high_irq(void *interrupt_params)
                 * if a pageflip happened inside front-porch.
                 */
                if (vrr_active) {
-                       dm_crtc_handle_vblank(acrtc);
+                       amdgpu_dm_crtc_handle_vblank(acrtc);
 
                        /* BTR processing for pre-DCE12 ASICs */
                        if (acrtc->dm_irq_params.stream &&
@@ -530,7 +570,7 @@ static void dm_crtc_high_irq(void *interrupt_params)
        if (!acrtc)
                return;
 
-       vrr_active = amdgpu_dm_vrr_active_irq(acrtc);
+       vrr_active = amdgpu_dm_crtc_vrr_active_irq(acrtc);
 
        DC_LOG_VBLANK("crtc:%d, vupdate-vrr:%d, planes:%d\n", acrtc->crtc_id,
                      vrr_active, acrtc->dm_irq_params.active_planes);
@@ -542,7 +582,7 @@ static void dm_crtc_high_irq(void *interrupt_params)
         * to dm_vupdate_high_irq after end of front-porch.
         */
        if (!vrr_active)
-               dm_crtc_handle_vblank(acrtc);
+               amdgpu_dm_crtc_handle_vblank(acrtc);
 
        /**
         * Following stuff must happen at start of vblank, for crc
@@ -673,7 +713,14 @@ static void dmub_hpd_callback(struct amdgpu_device *adev,
        drm_for_each_connector_iter(connector, &iter) {
                aconnector = to_amdgpu_dm_connector(connector);
                if (link && aconnector->dc_link == link) {
-                       DRM_INFO("DMUB HPD callback: link_index=%u\n", link_index);
+                       if (notify->type == DMUB_NOTIFICATION_HPD)
+                               DRM_INFO("DMUB HPD callback: link_index=%u\n", link_index);
+                       else if (notify->type == DMUB_NOTIFICATION_HPD_IRQ)
+                               DRM_INFO("DMUB HPD IRQ callback: link_index=%u\n", link_index);
+                       else
+                               DRM_WARN("DMUB Unknown HPD callback type %d, link_index=%u\n",
+                                               notify->type, link_index);
+
                        hpd_aconnector = aconnector;
                        break;
                }
@@ -773,15 +820,14 @@ static void dm_dmub_outbox1_low_irq(void *interrupt_params)
                                        DRM_ERROR("Failed to allocate dmub_hpd_wrk");
                                        return;
                                }
-                               dmub_hpd_wrk->dmub_notify = kzalloc(sizeof(struct dmub_notification), GFP_ATOMIC);
+                               dmub_hpd_wrk->dmub_notify = kmemdup(&notify, sizeof(struct dmub_notification),
+                                                                   GFP_ATOMIC);
                                if (!dmub_hpd_wrk->dmub_notify) {
                                        kfree(dmub_hpd_wrk);
                                        DRM_ERROR("Failed to allocate dmub_hpd_wrk->dmub_notify");
                                        return;
                                }
                                INIT_WORK(&dmub_hpd_wrk->handle_hpd_work, dm_handle_hpd_work);
-                               if (dmub_hpd_wrk->dmub_notify)
-                                       memcpy(dmub_hpd_wrk->dmub_notify, &notify, sizeof(struct dmub_notification));
                                dmub_hpd_wrk->adev = adev;
                                if (notify.type == DMUB_NOTIFICATION_HPD) {
                                        plink = adev->dm.dc->links[notify.link_index];
@@ -1486,9 +1532,7 @@ static void retrieve_dmi_info(struct amdgpu_display_manager *dm)
 static int amdgpu_dm_init(struct amdgpu_device *adev)
 {
        struct dc_init_data init_data;
-#ifdef CONFIG_DRM_AMD_DC_HDCP
        struct dc_callback_init init_params;
-#endif
        int r;
 
        adev->dm.ddev = adev_to_drm(adev);
@@ -1496,9 +1540,7 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
 
        /* Zero all the fields */
        memset(&init_data, 0, sizeof(init_data));
-#ifdef CONFIG_DRM_AMD_DC_HDCP
        memset(&init_params, 0, sizeof(init_params));
-#endif
 
        mutex_init(&adev->dm.dpia_aux_lock);
        mutex_init(&adev->dm.dc_lock);
@@ -1724,7 +1766,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
                        DRM_ERROR("amdgpu: failed to initialize vblank_workqueue.\n");
        }
 
-#ifdef CONFIG_DRM_AMD_DC_HDCP
        if (adev->dm.dc->caps.max_links > 0 && adev->family >= AMDGPU_FAMILY_RV) {
                adev->dm.hdcp_workqueue = hdcp_create_workqueue(adev, &init_params.cp_psp, adev->dm.dc);
 
@@ -1735,7 +1776,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
 
                dc_init_callbacks(adev->dm.dc, &init_params);
        }
-#endif
 #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
        adev->dm.secure_display_ctxs = amdgpu_dm_crtc_secure_display_create_contexts(adev);
        if (!adev->dm.secure_display_ctxs) {
@@ -1842,7 +1882,6 @@ static void amdgpu_dm_fini(struct amdgpu_device *adev)
                adev->dm.secure_display_ctxs = NULL;
        }
 #endif
-#ifdef CONFIG_DRM_AMD_DC_HDCP
        if (adev->dm.hdcp_workqueue) {
                hdcp_destroy(&adev->dev->kobj, adev->dm.hdcp_workqueue);
                adev->dm.hdcp_workqueue = NULL;
@@ -1850,7 +1889,6 @@ static void amdgpu_dm_fini(struct amdgpu_device *adev)
 
        if (adev->dm.dc)
                dc_deinit_callbacks(adev->dm.dc);
-#endif
 
        dc_dmub_srv_destroy(&adev->dm.dc->ctx->dmub_srv);
 
@@ -2271,7 +2309,7 @@ static int dm_late_init(void *handle)
                struct dc_link *edp_links[MAX_NUM_EDP];
                int edp_num;
 
-               get_edp_links(adev->dm.dc, edp_links, &edp_num);
+               dc_get_edp_links(adev->dm.dc, edp_links, &edp_num);
                for (i = 0; i < edp_num; i++) {
                        if (!dmub_init_abm_config(adev->dm.dc->res_pool, params, i))
                                return -EINVAL;
@@ -2302,6 +2340,14 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
                if (suspend) {
                        drm_dp_mst_topology_mgr_suspend(mgr);
                } else {
+                       /* if extended timeout is supported in hardware,
+                        * default to LTTPR timeout (3.2ms) first as a W/A for DP link layer
+                        * CTS 4.2.1.1 regression introduced by CTS specs requirement update.
+                        */
+                       try_to_configure_aux_timeout(aconnector->dc_link->ddc, LINK_AUX_DEFAULT_LTTPR_TIMEOUT_PERIOD);
+                       if (!dp_is_lttpr_present(aconnector->dc_link))
+                               try_to_configure_aux_timeout(aconnector->dc_link->ddc, LINK_AUX_DEFAULT_TIMEOUT_PERIOD);
+
                        ret = drm_dp_mst_topology_mgr_resume(mgr, true);
                        if (ret < 0) {
                                dm_helpers_dp_mst_stop_top_mgr(aconnector->dc_link->ctx,
@@ -2439,11 +2485,11 @@ static void dm_gpureset_toggle_interrupts(struct amdgpu_device *adev,
                                         enable ? "enable" : "disable");
 
                        if (enable) {
-                               rc = dm_enable_vblank(&acrtc->base);
+                               rc = amdgpu_dm_crtc_enable_vblank(&acrtc->base);
                                if (rc)
                                        DRM_WARN("Failed to enable vblank interrupts\n");
                        } else {
-                               dm_disable_vblank(&acrtc->base);
+                               amdgpu_dm_crtc_disable_vblank(&acrtc->base);
                        }
 
                }
@@ -2486,7 +2532,7 @@ static enum dc_status amdgpu_dm_commit_zero_streams(struct dc *dc)
                        goto fail;
        }
 
-       res = dc_commit_state(dc, context);
+       res = dc_commit_streams(dc, context->streams, context->stream_count);
 
 fail:
        dc_release_state(context);
@@ -2672,10 +2718,13 @@ static void dm_gpureset_commit_state(struct dc_state *dc_state,
                        bundle->surface_updates[m].surface->force_full_update =
                                true;
                }
-               dc_commit_updates_for_stream(
-                       dm->dc, bundle->surface_updates,
-                       dc_state->stream_status->plane_count,
-                       dc_state->streams[k], &bundle->stream_update, dc_state);
+
+               update_planes_and_stream_adapter(dm->dc,
+                                        UPDATE_TYPE_FULL,
+                                        dc_state->stream_status->plane_count,
+                                        dc_state->streams[k],
+                                        &bundle->stream_update,
+                                        bundle->surface_updates);
        }
 
 cleanup:
@@ -2745,7 +2794,7 @@ static int dm_resume(void *handle)
                        dc_enable_dmub_outbox(adev->dm.dc);
                }
 
-               WARN_ON(!dc_commit_state(dm->dc, dc_state));
+               WARN_ON(!dc_commit_streams(dm->dc, dc_state->streams, dc_state->stream_count));
 
                dm_gpureset_commit_state(dm->cached_dc_state, dm);
 
@@ -2913,7 +2962,7 @@ const struct amdgpu_ip_block_version dm_ip_block =
 
 static const struct drm_mode_config_funcs amdgpu_dm_mode_funcs = {
        .fb_create = amdgpu_display_user_framebuffer_create,
-       .get_format_info = amd_get_format_info,
+       .get_format_info = amdgpu_dm_plane_get_format_info,
        .atomic_check = amdgpu_dm_atomic_check,
        .atomic_commit = drm_atomic_helper_commit,
 };
@@ -2926,30 +2975,18 @@ static struct drm_mode_config_helper_funcs amdgpu_dm_mode_config_helperfuncs = {
 static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
 {
        struct amdgpu_dm_backlight_caps *caps;
-       struct amdgpu_display_manager *dm;
        struct drm_connector *conn_base;
        struct amdgpu_device *adev;
-       struct dc_link *link = NULL;
        struct drm_luminance_range_info *luminance_range;
-       int i;
-
-       if (!aconnector || !aconnector->dc_link)
-               return;
 
-       link = aconnector->dc_link;
-       if (link->connector_signal != SIGNAL_TYPE_EDP)
+       if (aconnector->bl_idx == -1 ||
+           aconnector->dc_link->connector_signal != SIGNAL_TYPE_EDP)
                return;
 
        conn_base = &aconnector->base;
        adev = drm_to_adev(conn_base->dev);
-       dm = &adev->dm;
-       for (i = 0; i < dm->num_of_edps; i++) {
-               if (link == dm->backlight_link[i])
-                       break;
-       }
-       if (i >= dm->num_of_edps)
-               return;
-       caps = &dm->backlight_caps[i];
+
+       caps = &adev->dm.backlight_caps[aconnector->bl_idx];
        caps->ext_caps = &aconnector->dc_link->dpcd_sink_ext_caps;
        caps->aux_support = false;
 
@@ -2964,8 +3001,14 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
                caps->aux_support = true;
 
        luminance_range = &conn_base->display_info.luminance_range;
-       caps->aux_min_input_signal = luminance_range->min_luminance;
-       caps->aux_max_input_signal = luminance_range->max_luminance;
+
+       if (luminance_range->max_luminance) {
+               caps->aux_min_input_signal = luminance_range->min_luminance;
+               caps->aux_max_input_signal = luminance_range->max_luminance;
+       } else {
+               caps->aux_min_input_signal = 0;
+               caps->aux_max_input_signal = 512;
+       }
 }
 
 void amdgpu_dm_update_connector_after_detect(
@@ -3101,11 +3144,9 @@ void amdgpu_dm_update_connector_after_detect(
                aconnector->edid = NULL;
                kfree(aconnector->timing_requested);
                aconnector->timing_requested = NULL;
-#ifdef CONFIG_DRM_AMD_DC_HDCP
                /* Set CP to DESIRED if it was ENABLED, so we can re-enable it again on hotplug */
                if (connector->state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED)
                        connector->state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
-#endif
        }
 
        mutex_unlock(&dev->mode_config.mutex);
@@ -3122,9 +3163,7 @@ static void handle_hpd_irq_helper(struct amdgpu_dm_connector *aconnector)
        struct drm_device *dev = connector->dev;
        enum dc_connection_type new_connection_type = dc_connection_none;
        struct amdgpu_device *adev = drm_to_adev(dev);
-#ifdef CONFIG_DRM_AMD_DC_HDCP
        struct dm_connector_state *dm_con_state = to_dm_connector_state(connector->state);
-#endif
        bool ret = false;
 
        if (adev->dm.disable_hpd_irq)
@@ -3136,12 +3175,10 @@ static void handle_hpd_irq_helper(struct amdgpu_dm_connector *aconnector)
         */
        mutex_lock(&aconnector->hpd_lock);
 
-#ifdef CONFIG_DRM_AMD_DC_HDCP
        if (adev->dm.hdcp_workqueue) {
                hdcp_reset_display(adev->dm.hdcp_workqueue, aconnector->dc_link->link_index);
                dm_con_state->update_hdcp = true;
        }
-#endif
        if (aconnector->fake_enable)
                aconnector->fake_enable = false;
 
@@ -3388,12 +3425,10 @@ out:
                        }
                }
        }
-#ifdef CONFIG_DRM_AMD_DC_HDCP
        if (hpd_irq_data.bytes.device_service_irq.bits.CP_IRQ) {
                if (adev->dm.hdcp_workqueue)
                        hdcp_handle_cpirq(adev->dm.hdcp_workqueue,  aconnector->base.index);
        }
-#endif
 
        if (dc_link->type != dc_connection_mst_branch)
                drm_dp_cec_irq(&aconnector->dm_dp_aux.aux);
@@ -4142,16 +4177,15 @@ static const struct backlight_ops amdgpu_dm_backlight_ops = {
 };
 
 static void
-amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm)
+amdgpu_dm_register_backlight_device(struct amdgpu_dm_connector *aconnector)
 {
-       char bl_name[16];
+       struct drm_device *drm = aconnector->base.dev;
+       struct amdgpu_display_manager *dm = &drm_to_adev(drm)->dm;
        struct backlight_properties props = { 0 };
-
-       amdgpu_dm_update_backlight_caps(dm, dm->num_of_edps);
-       dm->brightness[dm->num_of_edps] = AMDGPU_MAX_BL_LEVEL;
+       char bl_name[16];
 
        if (!acpi_video_backlight_use_native()) {
-               drm_info(adev_to_drm(dm->adev), "Skipping amdgpu DM backlight registration\n");
+               drm_info(drm, "Skipping amdgpu DM backlight registration\n");
                /* Try registering an ACPI video backlight device instead. */
                acpi_video_register_backlight();
                return;
@@ -4162,17 +4196,16 @@ amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm)
        props.type = BACKLIGHT_RAW;
 
        snprintf(bl_name, sizeof(bl_name), "amdgpu_bl%d",
-                adev_to_drm(dm->adev)->primary->index + dm->num_of_edps);
+                drm->primary->index + aconnector->bl_idx);
 
-       dm->backlight_dev[dm->num_of_edps] = backlight_device_register(bl_name,
-                                                                      adev_to_drm(dm->adev)->dev,
-                                                                      dm,
-                                                                      &amdgpu_dm_backlight_ops,
-                                                                      &props);
+       dm->backlight_dev[aconnector->bl_idx] =
+               backlight_device_register(bl_name, drm->dev, dm,
+                                         &amdgpu_dm_backlight_ops, &props);
 
-       if (IS_ERR(dm->backlight_dev[dm->num_of_edps]))
+       if (IS_ERR(dm->backlight_dev[aconnector->bl_idx])) {
                DRM_ERROR("DM: Backlight registration failed!\n");
-       else
+               dm->backlight_dev[aconnector->bl_idx] = NULL;
+       } else
                DRM_DEBUG_DRIVER("DM: Registered Backlight device: %s\n", bl_name);
 }
 
@@ -4217,24 +4250,36 @@ static int initialize_plane(struct amdgpu_display_manager *dm,
 }
 
 
-static void register_backlight_device(struct amdgpu_display_manager *dm,
-                                     struct dc_link *link)
+static void setup_backlight_device(struct amdgpu_display_manager *dm,
+                                  struct amdgpu_dm_connector *aconnector)
 {
-       if ((link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) &&
-           link->type != dc_connection_none) {
-               /*
-                * Event if registration failed, we should continue with
-                * DM initialization because not having a backlight control
-                * is better then a black screen.
-                */
-               if (!dm->backlight_dev[dm->num_of_edps])
-                       amdgpu_dm_register_backlight_device(dm);
+       struct dc_link *link = aconnector->dc_link;
+       int bl_idx = dm->num_of_edps;
 
-               if (dm->backlight_dev[dm->num_of_edps]) {
-                       dm->backlight_link[dm->num_of_edps] = link;
-                       dm->num_of_edps++;
-               }
+       if (!(link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) ||
+           link->type == dc_connection_none)
+               return;
+
+       if (dm->num_of_edps >= AMDGPU_DM_MAX_NUM_EDP) {
+               drm_warn(adev_to_drm(dm->adev), "Too much eDP connections, skipping backlight setup for additional eDPs\n");
+               return;
        }
+
+       aconnector->bl_idx = bl_idx;
+
+       amdgpu_dm_update_backlight_caps(dm, bl_idx);
+       dm->brightness[bl_idx] = AMDGPU_MAX_BL_LEVEL;
+
+       amdgpu_dm_register_backlight_device(aconnector);
+       if (!dm->backlight_dev[bl_idx]) {
+               aconnector->bl_idx = -1;
+               return;
+       }
+
+       dm->backlight_link[bl_idx] = link;
+       dm->num_of_edps++;
+
+       update_connector_ext_caps(aconnector);
 }
 
 static void amdgpu_set_panel_orientation(struct drm_connector *connector);
@@ -4310,9 +4355,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
                if (plane->type != DC_PLANE_TYPE_DCN_UNIVERSAL)
                        continue;
 
-               if (!plane->blends_with_above || !plane->blends_with_below)
-                       continue;
-
                if (!plane->pixel_format_support.argb8888)
                        continue;
 
@@ -4417,10 +4459,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
 
                        if (ret) {
                                amdgpu_dm_update_connector_after_detect(aconnector);
-                               register_backlight_device(dm, link);
-
-                               if (dm->num_of_edps)
-                                       update_connector_ext_caps(aconnector);
+                               setup_backlight_device(dm, aconnector);
 
                                if (psr_feature_enabled)
                                        amdgpu_dm_set_psr_caps(link);
@@ -4937,7 +4976,7 @@ fill_dc_plane_info_and_addr(struct amdgpu_device *adev,
        if (ret)
                return ret;
 
-       ret = fill_plane_buffer_attributes(adev, afb, plane_info->format,
+       ret = amdgpu_dm_plane_fill_plane_buffer_attributes(adev, afb, plane_info->format,
                                           plane_info->rotation, tiling_flags,
                                           &plane_info->tiling_info,
                                           &plane_info->plane_size,
@@ -4946,7 +4985,7 @@ fill_dc_plane_info_and_addr(struct amdgpu_device *adev,
        if (ret)
                return ret;
 
-       fill_blending_from_plane_state(
+       amdgpu_dm_plane_fill_blending_from_plane_state(
                plane_state, &plane_info->per_pixel_alpha, &plane_info->pre_multiplied_alpha,
                &plane_info->global_alpha, &plane_info->global_alpha_value);
 
@@ -4965,7 +5004,7 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev,
        int ret;
        bool force_disable_dcc = false;
 
-       ret = fill_dc_scaling_info(adev, plane_state, &scaling_info);
+       ret = amdgpu_dm_plane_fill_dc_scaling_info(adev, plane_state, &scaling_info);
        if (ret)
                return ret;
 
@@ -5095,9 +5134,9 @@ static void fill_dc_dirty_rects(struct drm_plane *plane,
 
                for (; flip_addrs->dirty_rect_count < num_clips; clips++)
                        fill_dc_dirty_rect(new_plane_state->plane,
-                                          &dirty_rects[i], clips->x1,
-                                          clips->y1, clips->x2 - clips->x1,
-                                          clips->y2 - clips->y1,
+                                          &dirty_rects[flip_addrs->dirty_rect_count],
+                                          clips->x1, clips->y1,
+                                          clips->x2 - clips->x1, clips->y2 - clips->y1,
                                           &flip_addrs->dirty_rect_count,
                                           false);
                return;
@@ -5743,7 +5782,6 @@ static bool is_freesync_video_mode(const struct drm_display_mode *mode,
                return true;
 }
 
-#if defined(CONFIG_DRM_AMD_DC_DCN)
 static void update_dsc_caps(struct amdgpu_dm_connector *aconnector,
                            struct dc_sink *sink, struct dc_stream_state *stream,
                            struct dsc_dec_dpcd_caps *dsc_caps)
@@ -5774,6 +5812,10 @@ static void apply_dsc_policy_for_edp(struct amdgpu_dm_connector *aconnector,
        struct dc *dc = sink->ctx->dc;
        struct dc_dsc_bw_range bw_range = {0};
        struct dc_dsc_config dsc_cfg = {0};
+       struct dc_dsc_config_options dsc_options = {0};
+
+       dc_dsc_get_default_config_option(dc, &dsc_options);
+       dsc_options.max_target_bpp_limit_override_x16 = max_dsc_target_bpp_limit_override * 16;
 
        verified_link_cap = dc_link_get_link_cap(stream->link);
        link_bw_in_kbps = dc_link_bandwidth_kbps(stream->link, verified_link_cap);
@@ -5796,8 +5838,7 @@ static void apply_dsc_policy_for_edp(struct amdgpu_dm_connector *aconnector,
                if (bw_range.max_kbps < link_bw_in_kbps) {
                        if (dc_dsc_compute_config(dc->res_pool->dscs[0],
                                        dsc_caps,
-                                       dc->debug.dsc_min_slice_height_override,
-                                       max_dsc_target_bpp_limit_override,
+                                       &dsc_options,
                                        0,
                                        &stream->timing,
                                        &dsc_cfg)) {
@@ -5811,8 +5852,7 @@ static void apply_dsc_policy_for_edp(struct amdgpu_dm_connector *aconnector,
 
        if (dc_dsc_compute_config(dc->res_pool->dscs[0],
                                dsc_caps,
-                               dc->debug.dsc_min_slice_height_override,
-                               max_dsc_target_bpp_limit_override,
+                               &dsc_options,
                                link_bw_in_kbps,
                                &stream->timing,
                                &dsc_cfg)) {
@@ -5833,6 +5873,10 @@ static void apply_dsc_policy_for_stream(struct amdgpu_dm_connector *aconnector,
        u32 dsc_max_supported_bw_in_kbps;
        u32 max_dsc_target_bpp_limit_override =
                drm_connector->display_info.max_dsc_bpp;
+       struct dc_dsc_config_options dsc_options = {0};
+
+       dc_dsc_get_default_config_option(dc, &dsc_options);
+       dsc_options.max_target_bpp_limit_override_x16 = max_dsc_target_bpp_limit_override * 16;
 
        link_bandwidth_kbps = dc_link_bandwidth_kbps(aconnector->dc_link,
                                                        dc_link_get_link_cap(aconnector->dc_link));
@@ -5851,8 +5895,7 @@ static void apply_dsc_policy_for_stream(struct amdgpu_dm_connector *aconnector,
                if (sink->link->dpcd_caps.dongle_type == DISPLAY_DONGLE_NONE) {
                        if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0],
                                                dsc_caps,
-                                               aconnector->dc_link->ctx->dc->debug.dsc_min_slice_height_override,
-                                               max_dsc_target_bpp_limit_override,
+                                               &dsc_options,
                                                link_bandwidth_kbps,
                                                &stream->timing,
                                                &stream->timing.dsc_cfg)) {
@@ -5869,8 +5912,7 @@ static void apply_dsc_policy_for_stream(struct amdgpu_dm_connector *aconnector,
                                        dsc_max_supported_bw_in_kbps > 0)
                                if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0],
                                                dsc_caps,
-                                               aconnector->dc_link->ctx->dc->debug.dsc_min_slice_height_override,
-                                               max_dsc_target_bpp_limit_override,
+                                               &dsc_options,
                                                dsc_max_supported_bw_in_kbps,
                                                &stream->timing,
                                                &stream->timing.dsc_cfg)) {
@@ -5894,7 +5936,6 @@ static void apply_dsc_policy_for_stream(struct amdgpu_dm_connector *aconnector,
        if (stream->timing.flags.DSC && aconnector->dsc_settings.dsc_bits_per_pixel)
                stream->timing.dsc_cfg.bits_per_pixel = aconnector->dsc_settings.dsc_bits_per_pixel;
 }
-#endif /* CONFIG_DRM_AMD_DC_DCN */
 
 static struct dc_stream_state *
 create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
@@ -5917,9 +5958,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
        int mode_refresh;
        int preferred_refresh = 0;
        enum color_transfer_func tf = TRANSFER_FUNC_UNKNOWN;
-#if defined(CONFIG_DRM_AMD_DC_DCN)
        struct dsc_dec_dpcd_caps dsc_caps;
-#endif
 
        struct dc_sink *sink = NULL;
 
@@ -6018,12 +6057,10 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
                stream->timing = *aconnector->timing_requested;
        }
 
-#if defined(CONFIG_DRM_AMD_DC_DCN)
        /* SST DSC determination policy */
        update_dsc_caps(aconnector, sink, stream, &dsc_caps);
        if (aconnector->dsc_settings.dsc_force_enable != DSC_CLK_FORCE_DISABLE && dsc_caps.is_dsc_supported)
                apply_dsc_policy_for_stream(aconnector, sink, stream, &dsc_caps);
-#endif
 
        update_stream_scaling_settings(&mode, dm_state, stream);
 
@@ -6198,10 +6235,8 @@ static void amdgpu_dm_connector_unregister(struct drm_connector *connector)
 static void amdgpu_dm_connector_destroy(struct drm_connector *connector)
 {
        struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
-       const struct dc_link *link = aconnector->dc_link;
        struct amdgpu_device *adev = drm_to_adev(connector->dev);
        struct amdgpu_display_manager *dm = &adev->dm;
-       int i;
 
        /*
         * Call only if mst_mgr was initialized before since it's not done
@@ -6210,11 +6245,9 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector)
        if (aconnector->mst_mgr.dev)
                drm_dp_mst_topology_mgr_destroy(&aconnector->mst_mgr);
 
-       for (i = 0; i < dm->num_of_edps; i++) {
-               if ((link == dm->backlight_link[i]) && dm->backlight_dev[i]) {
-                       backlight_device_unregister(dm->backlight_dev[i]);
-                       dm->backlight_dev[i] = NULL;
-               }
+       if (aconnector->bl_idx != -1) {
+               backlight_device_unregister(dm->backlight_dev[aconnector->bl_idx]);
+               dm->backlight_dev[aconnector->bl_idx] = NULL;
        }
 
        if (aconnector->dc_em_sink)
@@ -6749,7 +6782,6 @@ const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs = {
        .atomic_check = dm_encoder_helper_atomic_check
 };
 
-#if defined(CONFIG_DRM_AMD_DC_DCN)
 static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state,
                                            struct dc_state *dc_state,
                                            struct dsc_mst_fairness_vars *vars)
@@ -6823,7 +6855,6 @@ static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state,
        }
        return 0;
 }
-#endif
 
 static int to_drm_connector_type(enum signal_type st)
 {
@@ -7148,12 +7179,18 @@ static int amdgpu_dm_connector_get_modes(struct drm_connector *connector)
                        to_amdgpu_dm_connector(connector);
        struct drm_encoder *encoder;
        struct edid *edid = amdgpu_dm_connector->edid;
+       struct dc_link_settings *verified_link_cap =
+                       &amdgpu_dm_connector->dc_link->verified_link_cap;
+       const struct dc *dc = amdgpu_dm_connector->dc_link->dc;
 
        encoder = amdgpu_dm_connector_to_encoder(connector);
 
        if (!drm_edid_is_valid(edid)) {
                amdgpu_dm_connector->num_modes =
                                drm_add_modes_noedid(connector, 640, 480);
+               if (dc->link_srv->dp_get_encoding_format(verified_link_cap) == DP_128b_132b_ENCODING)
+                       amdgpu_dm_connector->num_modes +=
+                               drm_add_modes_noedid(connector, 1920, 1080);
        } else {
                amdgpu_dm_connector_ddc_get_modes(connector, edid);
                amdgpu_dm_connector_add_common_modes(encoder, connector);
@@ -7180,6 +7217,7 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
                aconnector->base.funcs->reset(&aconnector->base);
 
        aconnector->connector_id = link_index;
+       aconnector->bl_idx = -1;
        aconnector->dc_link = link;
        aconnector->base.interlace_allowed = false;
        aconnector->base.doublescan_allowed = false;
@@ -7234,7 +7272,6 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
        if (!aconnector->mst_root)
                drm_connector_attach_max_bpc_property(&aconnector->base, 8, 16);
 
-       /* This defaults to the max in the range, but we want 8bpc for non-edp. */
        aconnector->base.state->max_bpc = 16;
        aconnector->base.state->max_requested_bpc = aconnector->base.state->max_bpc;
 
@@ -7252,10 +7289,8 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
                if (!aconnector->mst_root)
                        drm_connector_attach_vrr_capable_property(&aconnector->base);
 
-#ifdef CONFIG_DRM_AMD_DC_HDCP
                if (adev->dm.hdcp_workqueue)
                        drm_connector_attach_content_protection_property(&aconnector->base, true);
-#endif
        }
 }
 
@@ -7517,7 +7552,6 @@ is_scaling_state_different(const struct dm_connector_state *dm_state,
        return false;
 }
 
-#ifdef CONFIG_DRM_AMD_DC_HDCP
 static bool is_content_protection_different(struct drm_crtc_state *new_crtc_state,
                                            struct drm_crtc_state *old_crtc_state,
                                            struct drm_connector_state *new_conn_state,
@@ -7637,7 +7671,6 @@ static bool is_content_protection_different(struct drm_crtc_state *new_crtc_stat
        pr_debug("[HDCP_DM] DESIRED->ENABLED %s :false\n", __func__);
        return false;
 }
-#endif
 
 static void remove_stream(struct amdgpu_device *adev,
                          struct amdgpu_crtc *acrtc,
@@ -7706,7 +7739,7 @@ static void update_freesync_state_on_stream(
                        &vrr_params);
 
                if (adev->family < AMDGPU_FAMILY_AI &&
-                   amdgpu_dm_vrr_active(new_crtc_state)) {
+                   amdgpu_dm_crtc_vrr_active(new_crtc_state)) {
                        mod_freesync_handle_v_update(dm->freesync_module,
                                                     new_stream, &vrr_params);
 
@@ -7824,8 +7857,8 @@ static void update_stream_irq_parameters(
 static void amdgpu_dm_handle_vrr_transition(struct dm_crtc_state *old_state,
                                            struct dm_crtc_state *new_state)
 {
-       bool old_vrr_active = amdgpu_dm_vrr_active(old_state);
-       bool new_vrr_active = amdgpu_dm_vrr_active(new_state);
+       bool old_vrr_active = amdgpu_dm_crtc_vrr_active(old_state);
+       bool new_vrr_active = amdgpu_dm_crtc_vrr_active(new_state);
 
        if (!old_vrr_active && new_vrr_active) {
                /* Transition VRR inactive -> active:
@@ -7836,7 +7869,7 @@ static void amdgpu_dm_handle_vrr_transition(struct dm_crtc_state *old_state,
                 * We also need vupdate irq for the actual core vblank handling
                 * at end of vblank.
                 */
-               WARN_ON(dm_set_vupdate_irq(new_state->base.crtc, true) != 0);
+               WARN_ON(amdgpu_dm_crtc_set_vupdate_irq(new_state->base.crtc, true) != 0);
                WARN_ON(drm_crtc_vblank_get(new_state->base.crtc) != 0);
                DRM_DEBUG_DRIVER("%s: crtc=%u VRR off->on: Get vblank ref\n",
                                 __func__, new_state->base.crtc->base.id);
@@ -7844,7 +7877,7 @@ static void amdgpu_dm_handle_vrr_transition(struct dm_crtc_state *old_state,
                /* Transition VRR active -> inactive:
                 * Allow vblank irq disable again for fixed refresh rate.
                 */
-               WARN_ON(dm_set_vupdate_irq(new_state->base.crtc, false) != 0);
+               WARN_ON(amdgpu_dm_crtc_set_vupdate_irq(new_state->base.crtc, false) != 0);
                drm_crtc_vblank_put(new_state->base.crtc);
                DRM_DEBUG_DRIVER("%s: crtc=%u VRR on->off: Drop vblank ref\n",
                                 __func__, new_state->base.crtc->base.id);
@@ -7863,7 +7896,7 @@ static void amdgpu_dm_commit_cursors(struct drm_atomic_state *state)
         */
        for_each_old_plane_in_state(state, plane, old_plane_state, i)
                if (plane->type == DRM_PLANE_TYPE_CURSOR)
-                       handle_cursor_update(plane, old_plane_state);
+                       amdgpu_dm_plane_handle_cursor_update(plane, old_plane_state);
 }
 
 static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
@@ -7886,7 +7919,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
        int planes_count = 0, vpos, hpos;
        unsigned long flags;
        u32 target_vblank, last_flip_vblank;
-       bool vrr_active = amdgpu_dm_vrr_active(acrtc_state);
+       bool vrr_active = amdgpu_dm_crtc_vrr_active(acrtc_state);
        bool cursor_update = false;
        bool pflip_present = false;
        bool dirty_rects_changed = false;
@@ -7948,7 +7981,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
                        bundle->surface_updates[planes_count].gamut_remap_matrix = &dc_plane->gamut_remap_matrix;
                }
 
-               fill_dc_scaling_info(dm->adev, new_plane_state,
+               amdgpu_dm_plane_fill_dc_scaling_info(dm->adev, new_plane_state,
                                     &bundle->scaling_infos[planes_count]);
 
                bundle->surface_updates[planes_count].scaling_info =
@@ -8168,12 +8201,12 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
                                acrtc_state->stream->link->psr_settings.psr_allow_active)
                        amdgpu_dm_psr_disable(acrtc_state->stream);
 
-               dc_commit_updates_for_stream(dm->dc,
-                                                    bundle->surface_updates,
-                                                    planes_count,
-                                                    acrtc_state->stream,
-                                                    &bundle->stream_update,
-                                                    dc_state);
+               update_planes_and_stream_adapter(dm->dc,
+                                        acrtc_state->update_type,
+                                        planes_count,
+                                        acrtc_state->stream,
+                                        &bundle->stream_update,
+                                        bundle->surface_updates);
 
                /**
                 * Enable or disable the interrupts on the backend.
@@ -8436,7 +8469,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
                 * aconnector as needed
                 */
 
-               if (modeset_required(new_crtc_state, dm_new_crtc_state->stream, dm_old_crtc_state->stream)) {
+               if (amdgpu_dm_crtc_modeset_required(new_crtc_state, dm_new_crtc_state->stream, dm_old_crtc_state->stream)) {
 
                        DRM_DEBUG_ATOMIC("Atomic commit: SET crtc id %d: [%p]\n", acrtc->crtc_id, acrtc);
 
@@ -8491,7 +8524,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 
                dm_enable_per_frame_crtc_master_sync(dc_state);
                mutex_lock(&dm->dc_lock);
-               WARN_ON(!dc_commit_state(dm->dc, dc_state));
+               WARN_ON(!dc_commit_streams(dm->dc, dc_state->streams, dc_state->stream_count));
 
                /* Allow idle optimization when vblank count is 0 for display off */
                if (dm->active_vblank_irq_count == 0)
@@ -8517,7 +8550,6 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
                                acrtc->otg_inst = status->primary_otg_inst;
                }
        }
-#ifdef CONFIG_DRM_AMD_DC_HDCP
        for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
                struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
                struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
@@ -8628,7 +8660,6 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
                                new_con_state->hdcp_content_type, enable_encryption);
                }
        }
-#endif
 
        /* Handle connector state changes */
        for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
@@ -8705,12 +8736,11 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 
 
                mutex_lock(&dm->dc_lock);
-               dc_commit_updates_for_stream(dm->dc,
-                                                    dummy_updates,
-                                                    status->plane_count,
-                                                    dm_new_crtc_state->stream,
-                                                    &stream_update,
-                                                    dc_state);
+               dc_update_planes_and_stream(dm->dc,
+                                           dummy_updates,
+                                           status->plane_count,
+                                           dm_new_crtc_state->stream,
+                                           &stream_update);
                mutex_unlock(&dm->dc_lock);
        }
 
@@ -9264,7 +9294,7 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,
                if (modereset_required(new_crtc_state))
                        goto skip_modeset;
 
-               if (modeset_required(new_crtc_state, new_stream,
+               if (amdgpu_dm_crtc_modeset_required(new_crtc_state, new_stream,
                                     dm_old_crtc_state->stream)) {
 
                        WARN_ON(dm_new_crtc_state->stream);
@@ -9615,7 +9645,7 @@ static int dm_update_plane_state(struct dc *dc,
                if (!needs_reset)
                        return 0;
 
-               ret = dm_plane_helper_check_state(new_plane_state, new_crtc_state);
+               ret = amdgpu_dm_plane_helper_check_state(new_plane_state, new_crtc_state);
                if (ret)
                        return ret;
 
@@ -9761,7 +9791,6 @@ static int dm_check_crtc_cursor(struct drm_atomic_state *state,
        return 0;
 }
 
-#if defined(CONFIG_DRM_AMD_DC_DCN)
 static int add_affected_mst_dsc_crtcs(struct drm_atomic_state *state, struct drm_crtc *crtc)
 {
        struct drm_connector *connector;
@@ -9787,7 +9816,6 @@ static int add_affected_mst_dsc_crtcs(struct drm_atomic_state *state, struct drm
 
        return drm_dp_mst_add_affected_dsc_crtcs(state, &aconnector->mst_root->mst_mgr);
 }
-#endif
 
 /**
  * amdgpu_dm_atomic_check() - Atomic check implementation for AMDgpu DM.
@@ -9831,11 +9859,9 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
        bool lock_and_validation_needed = false;
        bool is_top_most_overlay = true;
        struct dm_crtc_state *dm_old_crtc_state, *dm_new_crtc_state;
-#if defined(CONFIG_DRM_AMD_DC_DCN)
        struct drm_dp_mst_topology_mgr *mgr;
        struct drm_dp_mst_topology_state *mst_state;
        struct dsc_mst_fairness_vars vars[MAX_PIPES];
-#endif
 
        trace_amdgpu_dm_atomic_check_begin(state);
 
@@ -9866,7 +9892,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                        new_crtc_state->connectors_changed = true;
        }
 
-#if defined(CONFIG_DRM_AMD_DC_DCN)
        if (dc_resource_is_dsc_encoding_supported(dc)) {
                for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
                        if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
@@ -9878,7 +9903,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                        }
                }
        }
-#endif
        for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
                dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
 
@@ -10016,13 +10040,11 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                }
        }
 
-#if defined(CONFIG_DRM_AMD_DC_DCN)
        if (dc_resource_is_dsc_encoding_supported(dc)) {
                ret = pre_validate_dsc(state, &dm_state, vars);
                if (ret != 0)
                        goto fail;
        }
-#endif
 
        /* Run this here since we want to validate the streams we created */
        ret = drm_atomic_helper_check_planes(dev, state);
@@ -10088,7 +10110,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                lock_and_validation_needed = true;
        }
 
-#if defined(CONFIG_DRM_AMD_DC_DCN)
        /* set the slot info for each mst_state based on the link encoding format */
        for_each_new_mst_mgr_in_state(state, mgr, mst_state, i) {
                struct amdgpu_dm_connector *aconnector;
@@ -10108,7 +10129,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                }
                drm_connector_list_iter_end(&iter);
        }
-#endif
 
        /**
         * Streams and planes are reset when there are changes that affect
@@ -10136,7 +10156,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                        goto fail;
                }
 
-#if defined(CONFIG_DRM_AMD_DC_DCN)
                ret = compute_mst_dsc_configs_for_state(state, dm_state->context, vars);
                if (ret) {
                        DRM_DEBUG_DRIVER("compute_mst_dsc_configs_for_state() failed\n");
@@ -10148,7 +10167,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                        DRM_DEBUG_DRIVER("dm_update_mst_vcpi_slots_for_dsc() failed\n");
                        goto fail;
                }
-#endif
 
                /*
                 * Perform validation of MST topology in the state: