diff --git a/config/gki_lahainadisp.conf b/config/gki_lahainadisp.conf index 55d89af4f6b8..fb7a9807d1a3 100644 --- a/config/gki_lahainadisp.conf +++ b/config/gki_lahainadisp.conf @@ -3,6 +3,7 @@ export CONFIG_DRM_MSM_SDE=y export CONFIG_SYNC_FILE=y export CONFIG_DRM_MSM_DSI=y export CONFIG_DRM_MSM_DP=y +export CONFIG_DRM_MSM_DP_MST=y export CONFIG_DSI_PARSER=y export CONFIG_QCOM_MDSS_PLL=y export CONFIG_DRM_SDE_WB=y diff --git a/config/gki_lahainadispconf.h b/config/gki_lahainadispconf.h index 50ddaab91895..6d7c15822995 100644 --- a/config/gki_lahainadispconf.h +++ b/config/gki_lahainadispconf.h @@ -8,6 +8,7 @@ #define CONFIG_SYNC_FILE 1 #define CONFIG_DRM_MSM_DSI 1 #define CONFIG_DRM_MSM_DP 1 +#define CONFIG_DRM_MSM_DP_MST 1 #define CONFIG_DSI_PARSER 1 #define CONFIG_DRM_SDE_WB 1 #define CONFIG_DRM_MSM_REGISTER_LOGGING 1 diff --git a/config/lahainadisp.conf b/config/lahainadisp.conf index 69feb2be18af..402e1b9f1c73 100644 --- a/config/lahainadisp.conf +++ b/config/lahainadisp.conf @@ -1,6 +1,7 @@ export CONFIG_DRM_MSM=y export CONFIG_DRM_MSM_SDE=y export CONFIG_DRM_MSM_DP=y +export CONFIG_DRM_MSM_DP_MST=y export CONFIG_SYNC_FILE=y export CONFIG_DRM_MSM_DSI=y export CONFIG_DSI_PARSER=y diff --git a/config/lahainadispconf.h b/config/lahainadispconf.h index 1bc2400fba4b..d9555c47d6e3 100644 --- a/config/lahainadispconf.h +++ b/config/lahainadispconf.h @@ -5,6 +5,7 @@ #define CONFIG_DRM_MSM 1 #define CONFIG_DRM_MSM_DP 1 +#define CONFIG_DRM_MSM_DP_MST 1 #define CONFIG_DRM_MSM_SDE 1 #define CONFIG_SYNC_FILE 1 #define CONFIG_DRM_MSM_DSI 1 diff --git a/msm/Makefile b/msm/Makefile index 56a242934114..cbaf7cdf1361 100644 --- a/msm/Makefile +++ b/msm/Makefile @@ -26,10 +26,11 @@ msm_drm-$(CONFIG_DRM_MSM_DP) += dp/dp_altmode.o \ sde_hdcp_1x.o \ sde_hdcp_2x.o \ dp/dp_pll.o \ - dp/dp_pll_5nm.o \ + dp/dp_pll_5nm.o -msm_drm-$(CONFIG_DRM_MSM_DP_MST) += dp/dp_mst_drm.o \ -msm_drm-$(CONFIG_DRM_MSM_DP_USBPD_LEGACY) += dp/dp_usbpd.o \ +msm_drm-$(CONFIG_DRM_MSM_DP_MST) += dp/dp_mst_drm.o + +msm_drm-$(CONFIG_DRM_MSM_DP_USBPD_LEGACY) += dp/dp_usbpd.o msm_drm-$(CONFIG_DRM_MSM_SDE) += sde/sde_crtc.o \ sde/sde_encoder.o \ @@ -79,17 +80,17 @@ msm_drm-$(CONFIG_DRM_MSM_SDE) += sde/sde_crtc.o \ sde/sde_hw_qdss.o \ sde_dsc_helper.o \ sde_vdc_helper.o \ - sde/sde_hw_rc.o \ + sde/sde_hw_rc.o msm_drm-$(CONFIG_DEBUG_FS) += sde_dbg.o \ sde_dbg_evtlog.o \ msm_drm-$(CONFIG_DRM_SDE_WB) += sde/sde_wb.o \ - sde/sde_encoder_phys_wb.o \ + sde/sde_encoder_phys_wb.o msm_drm-$(CONFIG_DRM_SDE_RSC) += sde_rsc.o \ sde_rsc_hw.o \ - sde_rsc_hw_v3.o \ + sde_rsc_hw_v3.o msm_drm-$(CONFIG_DRM_MSM_DSI) += dsi/dsi_phy.o \ dsi/dsi_pwr.o \ @@ -113,9 +114,9 @@ msm_drm-$(CONFIG_DRM_MSM_DSI) += dsi/dsi_phy.o \ dsi/dsi_display.o \ dsi/dsi_panel.o \ dsi/dsi_clk_manager.o \ - dsi/dsi_display_test.o \ + dsi/dsi_display_test.o -msm_drm-$(CONFIG_DSI_PARSER) += dsi/dsi_parser.o \ +msm_drm-$(CONFIG_DSI_PARSER) += dsi/dsi_parser.o msm_drm-$(CONFIG_DRM_MSM) += \ msm_atomic.o \ @@ -126,7 +127,7 @@ msm_drm-$(CONFIG_DRM_MSM) += \ msm_gem_prime.o \ msm_gem_vma.o \ msm_smmu.o \ - msm_prop.o \ + msm_prop.o msm_drm-$(CONFIG_HDCP_QSEECOM) += ../hdcp/msm_hdcp.o \ diff --git a/msm/dp/dp_mst_drm.c b/msm/dp/dp_mst_drm.c index 007853ecf324..61a9cd7d8ba8 100644 --- a/msm/dp/dp_mst_drm.c +++ b/msm/dp/dp_mst_drm.c @@ -71,7 +71,7 @@ struct dp_drm_mst_fw_helper_ops { bool mst_state); int (*atomic_release_vcpi_slots)(struct drm_atomic_state *state, struct drm_dp_mst_topology_mgr *mgr, - int slots); + struct drm_dp_mst_port *port); void (*get_vcpi_info)(struct drm_dp_mst_topology_mgr *mgr, int vcpi, int *start_slot, int *num_slots); void (*reset_vcpi_slots)(struct drm_dp_mst_topology_mgr *mgr, @@ -158,10 +158,26 @@ struct dp_mst_encoder_info_cache { struct dp_mst_private dp_mst; struct dp_mst_encoder_info_cache dp_mst_enc_cache; +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[] = "HOTPLUG=1"; + char *envp[2]; + + envp[0] = event_string; + envp[1] = NULL; + + kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE, envp); + + DP_MST_INFO_LOG("mst hot plug event\n"); +} + static void dp_mst_sim_destroy_port(struct kref *ref) { struct drm_dp_mst_port *port = container_of(ref, - struct drm_dp_mst_port, kref); + struct drm_dp_mst_port, topology_kref); struct drm_dp_mst_topology_mgr *mgr = port->mgr; if (port->cached_edid) @@ -169,7 +185,7 @@ static void dp_mst_sim_destroy_port(struct kref *ref) if (port->connector) { mutex_lock(&mgr->destroy_connector_lock); - kref_get(&port->parent->kref); + kref_get(&port->parent->topology_kref); list_add(&port->next, &mgr->destroy_connector_list); mutex_unlock(&mgr->destroy_connector_lock); schedule_work(&mgr->destroy_connector_work); @@ -191,7 +207,7 @@ static void dp_mst_sim_add_port(struct dp_mst_private *mst, port = kzalloc(sizeof(*port), GFP_KERNEL); if (!port) return; - kref_init(&port->kref); + kref_init(&port->topology_kref); port->parent = mstb; port->port_num = port_msg->port_number; port->mgr = mstb->mgr; @@ -208,7 +224,7 @@ static void dp_mst_sim_add_port(struct dp_mst_private *mst, port->num_sdp_stream_sinks = port_msg->num_sdp_stream_sinks; mutex_lock(&mstb->mgr->lock); - kref_get(&port->kref); + kref_get(&port->topology_kref); list_add(&port->next, &mstb->ports); mutex_unlock(&mstb->mgr->lock); @@ -223,14 +239,14 @@ static void dp_mst_sim_add_port(struct dp_mst_private *mst, mutex_lock(&mstb->mgr->lock); list_del(&port->next); mutex_unlock(&mstb->mgr->lock); - kref_put(&port->kref, dp_mst_sim_destroy_port); + kref_put(&port->topology_kref, dp_mst_sim_destroy_port); goto put_port; } (*mstb->mgr->cbs->register_connector)(port->connector); } put_port: - kref_put(&port->kref, dp_mst_sim_destroy_port); + kref_put(&port->topology_kref, dp_mst_sim_destroy_port); } static void dp_mst_sim_link_probe_work(struct work_struct *work) @@ -271,7 +287,7 @@ static void dp_mst_sim_link_probe_work(struct work_struct *work) dp_mst_sim_add_port(mst, &port_data); } - mst->mst_mgr.cbs->hotplug(&mst->mst_mgr); + dp_mst_hotplug(&mst->mst_mgr); DP_MST_DEBUG("completed\n"); } @@ -493,7 +509,7 @@ static void dp_mst_sim_handle_hpd_irq(void *dp_display, } } - kref_put(&port->kref, dp_mst_sim_destroy_port); + kref_put(&port->topology_kref, dp_mst_sim_destroy_port); } } @@ -1400,7 +1416,7 @@ static int dp_mst_connector_atomic_check(struct drm_connector *connector, struct dp_mst_bridge *bridge = NULL; struct dp_display *dp_display = display; struct dp_mst_private *mst = dp_display->dp_mst_prv_info; - struct sde_connector *c_conn; + struct sde_connector *c_conn = to_sde_connector(connector); struct dp_display_mode dp_mode; DP_MST_DEBUG("enter:\n"); @@ -1446,7 +1462,7 @@ static int dp_mst_connector_atomic_check(struct drm_connector *connector, slots = bridge->num_slots; if (drm_atomic_crtc_needs_modeset(crtc_state) && slots > 0) { rc = mst->mst_fw_cbs->atomic_release_vcpi_slots(state, - &mst->mst_mgr, slots); + &mst->mst_mgr, c_conn->mst_port); if (rc) { DP_ERR("failed releasing %d vcpi slots rc:%d\n", slots, rc); @@ -1461,8 +1477,6 @@ mode_set: crtc_state = drm_atomic_get_new_crtc_state(state, new_conn_state->crtc); if (drm_atomic_crtc_needs_modeset(crtc_state) && crtc_state->active) { - c_conn = to_sde_connector(connector); - dp_display->convert_to_dp_mode(dp_display, c_conn->drv_panel, &crtc_state->mode, &dp_mode); @@ -1904,26 +1918,10 @@ dp_mst_drm_fixed_connector_init(struct dp_display *dp_display, return connector; } -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); - - DP_MST_INFO_LOG("mst hot plug event\n"); -} - static void dp_mst_hpd_event_notify(struct dp_mst_private *mst, bool hpd_status) { struct drm_device *dev = mst->dp_display->drm_dev; - char event_string[] = "MST_HOTPLUG=1"; + char event_string[] = "HOTPLUG=1"; char status[HPD_STRING_SIZE]; char *envp[3]; @@ -2071,14 +2069,12 @@ static const struct drm_dp_mst_topology_cbs dp_mst_drm_cbs = { .add_connector = dp_mst_add_connector, .register_connector = dp_mst_register_connector, .destroy_connector = dp_mst_destroy_connector, - .hotplug = dp_mst_hotplug, }; static const struct drm_dp_mst_topology_cbs dp_mst_fixed_drm_cbs = { .add_connector = dp_mst_add_fixed_connector, .register_connector = dp_mst_register_fixed_connector, .destroy_connector = dp_mst_destroy_fixed_connector, - .hotplug = dp_mst_hotplug, }; static void dp_mst_sim_init(struct dp_mst_private *mst)