Browse Source

disp: msm: enable DP MST compilation

Enable compilation of DP MST feature. Also ported drm mst implementation to
use updated API definitions. Changes to the API include; removal of hotplug
callback; separate refcounting for topology and memory allocation in mst
port; pass the entire port instead of slot count in
atomic_release_vcpi_slots API.

Change-Id: I951c2978339229ea7e124c2addc114ea5d3cbb3d
Signed-off-by: Rajkumar Subbiah <[email protected]>
Rajkumar Subbiah 5 years ago
parent
commit
e56293e396

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 10 - 9
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 \
 

+ 28 - 32
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)