Loading drivers/gpu/drm/msm/dp/dp_catalog.c +22 −5 Original line number Diff line number Diff line Loading @@ -715,6 +715,8 @@ static void dp_catalog_ctrl_state_ctrl(struct dp_catalog_ctrl *ctrl, u32 state) io_data = catalog->io.dp_link; dp_write(catalog, io_data, DP_STATE_CTRL, state); /* make sure to change the hw state */ wmb(); } static void dp_catalog_ctrl_config_ctrl(struct dp_catalog_ctrl *ctrl) Loading Loading @@ -745,7 +747,7 @@ static void dp_catalog_panel_config_ctrl(struct dp_catalog_panel *panel, { struct dp_catalog_private *catalog; struct dp_io_data *io_data; u32 strm_reg_off = 0; u32 strm_reg_off = 0, mainlink_ctrl; if (!panel) { pr_err("invalid input\n"); Loading @@ -766,6 +768,18 @@ static void dp_catalog_panel_config_ctrl(struct dp_catalog_panel *panel, pr_debug("DP_CONFIGURATION_CTRL=0x%x\n", cfg); dp_write(catalog, io_data, DP_CONFIGURATION_CTRL + strm_reg_off, cfg); mainlink_ctrl = dp_read(catalog, io_data, DP_MAINLINK_CTRL); if (panel->stream_id == DP_STREAM_0) io_data = catalog->io.dp_p0; else if (panel->stream_id == DP_STREAM_1) io_data = catalog->io.dp_p1; if (mainlink_ctrl & BIT(8)) dp_write(catalog, io_data, MMSS_DP_ASYNC_FIFO_CONFIG, 0x01); else dp_write(catalog, io_data, MMSS_DP_ASYNC_FIFO_CONFIG, 0x00); } static void dp_catalog_ctrl_lane_mapping(struct dp_catalog_ctrl *ctrl) Loading Loading @@ -860,6 +874,7 @@ static void dp_catalog_panel_config_msa(struct dp_catalog_panel *panel, struct dp_catalog_private *catalog; struct dp_io_data *io_data; u32 strm_reg_off = 0; u32 mvid_reg_off = 0, nvid_reg_off = 0; if (!panel) { pr_err("invalid input\n"); Loading Loading @@ -917,12 +932,14 @@ static void dp_catalog_panel_config_msa(struct dp_catalog_panel *panel, io_data = catalog->io.dp_link; if (panel->stream_id == DP_STREAM_1) strm_reg_off = DP1_SOFTWARE_MVID - DP_SOFTWARE_MVID; if (panel->stream_id == DP_STREAM_1) { mvid_reg_off = DP1_SOFTWARE_MVID - DP_SOFTWARE_MVID; nvid_reg_off = DP1_SOFTWARE_NVID - DP_SOFTWARE_NVID; } pr_debug("mvid=0x%x, nvid=0x%x\n", mvid, nvid); dp_write(catalog, io_data, DP_SOFTWARE_MVID + strm_reg_off, mvid); dp_write(catalog, io_data, DP_SOFTWARE_NVID + strm_reg_off, nvid); dp_write(catalog, io_data, DP_SOFTWARE_MVID + mvid_reg_off, mvid); dp_write(catalog, io_data, DP_SOFTWARE_NVID + nvid_reg_off, nvid); } static void dp_catalog_ctrl_set_pattern(struct dp_catalog_ctrl *ctrl, Loading drivers/gpu/drm/msm/dp/dp_ctrl.c +3 −1 Original line number Diff line number Diff line Loading @@ -143,7 +143,7 @@ static void dp_ctrl_push_idle(struct dp_ctrl *dp_ctrl, enum dp_stream_id strm) trigger_idle: reinit_completion(&ctrl->idle_comp); dp_ctrl_state_ctrl(ctrl, ST_PUSH_IDLE); dp_ctrl_state_ctrl(ctrl, state); if (!wait_for_completion_timeout(&ctrl->idle_comp, idle_pattern_completion_timeout_ms)) Loading Loading @@ -847,6 +847,8 @@ static int dp_ctrl_mst_stream_setup(struct dp_ctrl_private *ctrl, DP_MST_DEBUG("mst stream channel allocation\n"); panel->hw_cfg(panel); ctrl->catalog->channel_alloc(ctrl->catalog, panel->stream_id, panel->channel_start_slot, Loading drivers/gpu/drm/msm/dp/dp_display.c +2 −4 Original line number Diff line number Diff line Loading @@ -559,8 +559,6 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) goto notify; } dp_display_process_mst_hpd_high(dp); edid = dp->panel->edid_ctrl->edid; dp->audio_supported = drm_detect_monitor_audio(edid); Loading @@ -569,6 +567,8 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) dp->panel->handle_sink_request(dp->panel); dp->dp_display.max_pclk_khz = dp->parser->max_pclk_khz; dp_display_process_mst_hpd_high(dp); notify: dp_display_send_hpd_notification(dp, true); Loading Loading @@ -1212,8 +1212,6 @@ static int dp_display_stream_enable(struct dp_display_private *dp, { int rc = 0; dp_panel->hw_cfg(dp_panel); rc = dp->ctrl->stream_on(dp->ctrl, dp_panel); if (dp->debug->tpg_state) Loading drivers/gpu/drm/msm/dp/dp_mst_drm.c +32 −12 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ #include <drm/drm_atomic.h> #include <drm/drm_crtc.h> #include <drm/drm_dp_mst_helper.h> #include <drm/drm_dp_mst_helper.h> #include "msm_drv.h" #include "msm_kms.h" Loading Loading @@ -493,9 +492,10 @@ static int dp_mst_connector_get_modes(struct drm_connector *connector, struct dp_display *dp_display = display; struct dp_mst_private *mst = dp_display->dp_mst_prv_info; struct edid *edid; int rc; int rc = 0; edid = drm_dp_mst_get_edid(connector, &mst->mst_mgr, c_conn->mst_port); if (edid) rc = dp_display->mst_connector_update_edid(dp_display, connector, edid); Loading Loading @@ -660,6 +660,15 @@ static int dp_mst_connector_config_hdr(struct drm_connector *connector, return rc; } static void dp_mst_connector_pre_destroy(struct drm_connector *connector, void *display) { struct dp_display *dp_display = display; DP_MST_DEBUG("enter:\n"); dp_display->mst_connector_uninstall(dp_display, connector); DP_MST_DEBUG("exit:\n"); } /* DRM MST callbacks */ Loading @@ -677,6 +686,7 @@ dp_mst_add_connector(struct drm_dp_mst_topology_mgr *mgr, .atomic_best_encoder = dp_mst_atomic_best_encoder, .atomic_check = dp_mst_connector_atomic_check, .config_hdr = dp_mst_connector_config_hdr, .pre_destroy = dp_mst_connector_pre_destroy, }; struct dp_mst_private *dp_mst; struct drm_device *dev; Loading Loading @@ -746,17 +756,12 @@ static void dp_mst_register_connector(struct drm_connector *connector) static void dp_mst_destroy_connector(struct drm_dp_mst_topology_mgr *mgr, struct drm_connector *connector) { struct dp_mst_private *mst = container_of(mgr, struct dp_mst_private, mst_mgr); struct dp_display *dp_display = mst->dp_display; DP_MST_DEBUG("enter\n"); DP_MST_DEBUG("destroy mst connector:%d\n", connector->base.id); dp_display->mst_connector_uninstall(dp_display, connector); sde_connector_destroy(connector); drm_connector_unregister(connector); drm_connector_unreference(connector); } static void dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) Loading @@ -764,8 +769,14 @@ static void dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) struct dp_mst_private *mst = container_of(mgr, struct dp_mst_private, mst_mgr); struct drm_device *dev = mst->dp_display->drm_dev; char event_string[] = "MST_HOTPLUG=1"; char *envp[2]; envp[0] = event_string; envp[1] = NULL; kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE, envp); drm_kms_helper_hotplug_event(dev); DP_MST_DEBUG("mst hot plug event\n"); } Loading @@ -788,6 +799,7 @@ static void dp_mst_display_hpd_irq(void *dp_display) struct dp_display *dp = dp_display; struct dp_mst_private *mst = dp->dp_mst_prv_info; u8 esi[14], idx; unsigned int esi_res = DP_SINK_COUNT_ESI + 1; bool handled; rc = drm_dp_dpcd_read(mst->caps.drm_aux, DP_SINK_COUNT_ESI, Loading @@ -802,6 +814,14 @@ static void dp_mst_display_hpd_irq(void *dp_display) rc = drm_dp_mst_hpd_irq(&mst->mst_mgr, esi, &handled); /* ack the request */ if (handled) { rc = drm_dp_dpcd_write(mst->caps.drm_aux, esi_res, &esi[1], 3); if (rc != 3) pr_err("dpcd esi_res failed. rlen=%d\n", rc); } DP_MST_DEBUG("mst display hpd_irq handled:%d rc:%d\n", handled, rc); } Loading drivers/gpu/drm/msm/dp/dp_panel.c +5 −0 Original line number Diff line number Diff line Loading @@ -1482,6 +1482,11 @@ static void dp_panel_config_misc(struct dp_panel *dp_panel) static bool dp_panel_use_fixed_nvid(struct dp_panel *dp_panel) { u8 *dpcd = dp_panel->dpcd; struct sde_connector *c_conn = to_sde_connector(dp_panel->connector); /* use fixe mvid and nvid for MST streams */ if (c_conn->mst_port) return true; /* * For better interop experience, used a fixed NVID=0x8000 Loading Loading
drivers/gpu/drm/msm/dp/dp_catalog.c +22 −5 Original line number Diff line number Diff line Loading @@ -715,6 +715,8 @@ static void dp_catalog_ctrl_state_ctrl(struct dp_catalog_ctrl *ctrl, u32 state) io_data = catalog->io.dp_link; dp_write(catalog, io_data, DP_STATE_CTRL, state); /* make sure to change the hw state */ wmb(); } static void dp_catalog_ctrl_config_ctrl(struct dp_catalog_ctrl *ctrl) Loading Loading @@ -745,7 +747,7 @@ static void dp_catalog_panel_config_ctrl(struct dp_catalog_panel *panel, { struct dp_catalog_private *catalog; struct dp_io_data *io_data; u32 strm_reg_off = 0; u32 strm_reg_off = 0, mainlink_ctrl; if (!panel) { pr_err("invalid input\n"); Loading @@ -766,6 +768,18 @@ static void dp_catalog_panel_config_ctrl(struct dp_catalog_panel *panel, pr_debug("DP_CONFIGURATION_CTRL=0x%x\n", cfg); dp_write(catalog, io_data, DP_CONFIGURATION_CTRL + strm_reg_off, cfg); mainlink_ctrl = dp_read(catalog, io_data, DP_MAINLINK_CTRL); if (panel->stream_id == DP_STREAM_0) io_data = catalog->io.dp_p0; else if (panel->stream_id == DP_STREAM_1) io_data = catalog->io.dp_p1; if (mainlink_ctrl & BIT(8)) dp_write(catalog, io_data, MMSS_DP_ASYNC_FIFO_CONFIG, 0x01); else dp_write(catalog, io_data, MMSS_DP_ASYNC_FIFO_CONFIG, 0x00); } static void dp_catalog_ctrl_lane_mapping(struct dp_catalog_ctrl *ctrl) Loading Loading @@ -860,6 +874,7 @@ static void dp_catalog_panel_config_msa(struct dp_catalog_panel *panel, struct dp_catalog_private *catalog; struct dp_io_data *io_data; u32 strm_reg_off = 0; u32 mvid_reg_off = 0, nvid_reg_off = 0; if (!panel) { pr_err("invalid input\n"); Loading Loading @@ -917,12 +932,14 @@ static void dp_catalog_panel_config_msa(struct dp_catalog_panel *panel, io_data = catalog->io.dp_link; if (panel->stream_id == DP_STREAM_1) strm_reg_off = DP1_SOFTWARE_MVID - DP_SOFTWARE_MVID; if (panel->stream_id == DP_STREAM_1) { mvid_reg_off = DP1_SOFTWARE_MVID - DP_SOFTWARE_MVID; nvid_reg_off = DP1_SOFTWARE_NVID - DP_SOFTWARE_NVID; } pr_debug("mvid=0x%x, nvid=0x%x\n", mvid, nvid); dp_write(catalog, io_data, DP_SOFTWARE_MVID + strm_reg_off, mvid); dp_write(catalog, io_data, DP_SOFTWARE_NVID + strm_reg_off, nvid); dp_write(catalog, io_data, DP_SOFTWARE_MVID + mvid_reg_off, mvid); dp_write(catalog, io_data, DP_SOFTWARE_NVID + nvid_reg_off, nvid); } static void dp_catalog_ctrl_set_pattern(struct dp_catalog_ctrl *ctrl, Loading
drivers/gpu/drm/msm/dp/dp_ctrl.c +3 −1 Original line number Diff line number Diff line Loading @@ -143,7 +143,7 @@ static void dp_ctrl_push_idle(struct dp_ctrl *dp_ctrl, enum dp_stream_id strm) trigger_idle: reinit_completion(&ctrl->idle_comp); dp_ctrl_state_ctrl(ctrl, ST_PUSH_IDLE); dp_ctrl_state_ctrl(ctrl, state); if (!wait_for_completion_timeout(&ctrl->idle_comp, idle_pattern_completion_timeout_ms)) Loading Loading @@ -847,6 +847,8 @@ static int dp_ctrl_mst_stream_setup(struct dp_ctrl_private *ctrl, DP_MST_DEBUG("mst stream channel allocation\n"); panel->hw_cfg(panel); ctrl->catalog->channel_alloc(ctrl->catalog, panel->stream_id, panel->channel_start_slot, Loading
drivers/gpu/drm/msm/dp/dp_display.c +2 −4 Original line number Diff line number Diff line Loading @@ -559,8 +559,6 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) goto notify; } dp_display_process_mst_hpd_high(dp); edid = dp->panel->edid_ctrl->edid; dp->audio_supported = drm_detect_monitor_audio(edid); Loading @@ -569,6 +567,8 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) dp->panel->handle_sink_request(dp->panel); dp->dp_display.max_pclk_khz = dp->parser->max_pclk_khz; dp_display_process_mst_hpd_high(dp); notify: dp_display_send_hpd_notification(dp, true); Loading Loading @@ -1212,8 +1212,6 @@ static int dp_display_stream_enable(struct dp_display_private *dp, { int rc = 0; dp_panel->hw_cfg(dp_panel); rc = dp->ctrl->stream_on(dp->ctrl, dp_panel); if (dp->debug->tpg_state) Loading
drivers/gpu/drm/msm/dp/dp_mst_drm.c +32 −12 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ #include <drm/drm_atomic.h> #include <drm/drm_crtc.h> #include <drm/drm_dp_mst_helper.h> #include <drm/drm_dp_mst_helper.h> #include "msm_drv.h" #include "msm_kms.h" Loading Loading @@ -493,9 +492,10 @@ static int dp_mst_connector_get_modes(struct drm_connector *connector, struct dp_display *dp_display = display; struct dp_mst_private *mst = dp_display->dp_mst_prv_info; struct edid *edid; int rc; int rc = 0; edid = drm_dp_mst_get_edid(connector, &mst->mst_mgr, c_conn->mst_port); if (edid) rc = dp_display->mst_connector_update_edid(dp_display, connector, edid); Loading Loading @@ -660,6 +660,15 @@ static int dp_mst_connector_config_hdr(struct drm_connector *connector, return rc; } static void dp_mst_connector_pre_destroy(struct drm_connector *connector, void *display) { struct dp_display *dp_display = display; DP_MST_DEBUG("enter:\n"); dp_display->mst_connector_uninstall(dp_display, connector); DP_MST_DEBUG("exit:\n"); } /* DRM MST callbacks */ Loading @@ -677,6 +686,7 @@ dp_mst_add_connector(struct drm_dp_mst_topology_mgr *mgr, .atomic_best_encoder = dp_mst_atomic_best_encoder, .atomic_check = dp_mst_connector_atomic_check, .config_hdr = dp_mst_connector_config_hdr, .pre_destroy = dp_mst_connector_pre_destroy, }; struct dp_mst_private *dp_mst; struct drm_device *dev; Loading Loading @@ -746,17 +756,12 @@ static void dp_mst_register_connector(struct drm_connector *connector) static void dp_mst_destroy_connector(struct drm_dp_mst_topology_mgr *mgr, struct drm_connector *connector) { struct dp_mst_private *mst = container_of(mgr, struct dp_mst_private, mst_mgr); struct dp_display *dp_display = mst->dp_display; DP_MST_DEBUG("enter\n"); DP_MST_DEBUG("destroy mst connector:%d\n", connector->base.id); dp_display->mst_connector_uninstall(dp_display, connector); sde_connector_destroy(connector); drm_connector_unregister(connector); drm_connector_unreference(connector); } static void dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) Loading @@ -764,8 +769,14 @@ static void dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) struct dp_mst_private *mst = container_of(mgr, struct dp_mst_private, mst_mgr); struct drm_device *dev = mst->dp_display->drm_dev; char event_string[] = "MST_HOTPLUG=1"; char *envp[2]; envp[0] = event_string; envp[1] = NULL; kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE, envp); drm_kms_helper_hotplug_event(dev); DP_MST_DEBUG("mst hot plug event\n"); } Loading @@ -788,6 +799,7 @@ static void dp_mst_display_hpd_irq(void *dp_display) struct dp_display *dp = dp_display; struct dp_mst_private *mst = dp->dp_mst_prv_info; u8 esi[14], idx; unsigned int esi_res = DP_SINK_COUNT_ESI + 1; bool handled; rc = drm_dp_dpcd_read(mst->caps.drm_aux, DP_SINK_COUNT_ESI, Loading @@ -802,6 +814,14 @@ static void dp_mst_display_hpd_irq(void *dp_display) rc = drm_dp_mst_hpd_irq(&mst->mst_mgr, esi, &handled); /* ack the request */ if (handled) { rc = drm_dp_dpcd_write(mst->caps.drm_aux, esi_res, &esi[1], 3); if (rc != 3) pr_err("dpcd esi_res failed. rlen=%d\n", rc); } DP_MST_DEBUG("mst display hpd_irq handled:%d rc:%d\n", handled, rc); } Loading
drivers/gpu/drm/msm/dp/dp_panel.c +5 −0 Original line number Diff line number Diff line Loading @@ -1482,6 +1482,11 @@ static void dp_panel_config_misc(struct dp_panel *dp_panel) static bool dp_panel_use_fixed_nvid(struct dp_panel *dp_panel) { u8 *dpcd = dp_panel->dpcd; struct sde_connector *c_conn = to_sde_connector(dp_panel->connector); /* use fixe mvid and nvid for MST streams */ if (c_conn->mst_port) return true; /* * For better interop experience, used a fixed NVID=0x8000 Loading