Message ID | 20241205-dp_mst-v1-36-f8618d42a99a@quicinc.com |
---|---|
State | New |
Headers | show |
Series | None | expand |
On Thu, Dec 05, 2024 at 08:32:07PM -0800, Abhinav Kumar wrote: > From: Yongxing Mou <quic_yongmou@quicinc.com> > > Propagate the hpd state changes to dp mst module so that it please fix upcase. > can be synchronized with the cable connect/disconnect. It doesn't propagate HPD state. Instead it updates MST state when the device is plugged / unplugged. > > Signed-off-by: Yongxing Mou <quic_yongmou@quicinc.com> > Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com> > --- > drivers/gpu/drm/msm/dp/dp_display.c | 20 ++++++++++++++++++++ > drivers/gpu/drm/msm/dp/dp_mst_drm.c | 18 ++++++++++++++++++ > drivers/gpu/drm/msm/dp/dp_mst_drm.h | 1 + > 3 files changed, 39 insertions(+) > > diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c > index 97f8228042773f51f23a9d39fc009de0798059d7..80df79a7c2077d49184cdeb7b801bf0699ff4ece 100644 > --- a/drivers/gpu/drm/msm/dp/dp_display.c > +++ b/drivers/gpu/drm/msm/dp/dp_display.c > @@ -26,6 +26,7 @@ > #include "dp_drm.h" > #include "dp_audio.h" > #include "dp_debug.h" > +#include "dp_mst_drm.h" > > static bool psr_enabled = false; > module_param(psr_enabled, bool, 0); > @@ -409,6 +410,17 @@ static void msm_dp_display_mst_init(struct msm_dp_display_private *dp) > msm_dp->mst_active = true; > } > > +static void msm_dp_display_set_mst_mgr_state(struct msm_dp_display_private *dp, > + bool state) > +{ > + if (!dp->msm_dp_display.mst_active) > + return; > + > + msm_dp_mst_display_set_mgr_state(&dp->msm_dp_display, state); > + > + drm_dbg_dp(dp->drm_dev, "mst_mgr_state: %d\n", state); > +} > + > static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp) > { > struct drm_connector *connector = dp->msm_dp_display.connector; > @@ -455,6 +467,8 @@ static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp) > goto end; > } > > + msm_dp_display_set_mst_mgr_state(dp, true); > + > msm_dp_add_event(dp, EV_USER_NOTIFICATION, true, 0); > > end: > @@ -521,6 +535,12 @@ static int msm_dp_display_usbpd_configure_cb(struct device *dev) > static int msm_dp_display_notify_disconnect(struct device *dev) > { > struct msm_dp_display_private *dp = dev_get_dp_display_private(dev); > + struct msm_dp *dp_display = &dp->msm_dp_display; > + > + if (dp_display->mst_active) { > + msm_dp_mst_display_set_mgr_state(&dp->msm_dp_display, false); > + dp_display->mst_active = false; > + } > > msm_dp_add_event(dp, EV_USER_NOTIFICATION, false, 0); > > diff --git a/drivers/gpu/drm/msm/dp/dp_mst_drm.c b/drivers/gpu/drm/msm/dp/dp_mst_drm.c > index 313eb63b9a35cbbb36db2d7d8f0a85e4441f2998..1149af71d01f99ba5326870fa69e30ae081d6101 100644 > --- a/drivers/gpu/drm/msm/dp/dp_mst_drm.c > +++ b/drivers/gpu/drm/msm/dp/dp_mst_drm.c > @@ -1043,6 +1043,24 @@ msm_dp_mst_add_connector(struct drm_dp_mst_topology_mgr *mgr, > return &mst_connector->connector; > } > > +int msm_dp_mst_display_set_mgr_state(struct msm_dp *dp_display, bool state) > +{ > + int rc; > + struct msm_dp_mst *mst = dp_display->msm_dp_mst; > + > + if (state) > + mst->mst_session_hpd_state = state; Where is mst_session_hpd_state cleared? > + > + rc = drm_dp_mst_topology_mgr_set_mst(&mst->mst_mgr, state); > + if (rc < 0) { > + DRM_ERROR("failed to set topology mgr state to %d. rc %d\n", > + state, rc); > + } > + > + drm_dbg_dp(dp_display->drm_dev, "dp_mst_display_set_mgr_state state:%d\n", state); > + return rc; > +} > + > static const struct drm_dp_mst_topology_cbs msm_dp_mst_drm_cbs = { > .add_connector = msm_dp_mst_add_connector, > }; > diff --git a/drivers/gpu/drm/msm/dp/dp_mst_drm.h b/drivers/gpu/drm/msm/dp/dp_mst_drm.h > index b1adb8a61115d4809107553809206bb2ed3c6c3d..b89913ef7b343d449e0003f56b96df049fa36e89 100644 > --- a/drivers/gpu/drm/msm/dp/dp_mst_drm.h > +++ b/drivers/gpu/drm/msm/dp/dp_mst_drm.h > @@ -105,5 +105,6 @@ int msm_dp_mst_init(struct msm_dp *dp_display, u32 max_streams, > u32 max_dpcd_transaction_bytes, struct drm_dp_aux *drm_aux); > > void msm_dp_mst_display_hpd_irq(struct msm_dp *dp_display); > +int msm_dp_mst_display_set_mgr_state(struct msm_dp *dp_display, bool state); > > #endif /* _DP_MST_DRM_H_ */ > > -- > 2.34.1 >
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index 97f8228042773f51f23a9d39fc009de0798059d7..80df79a7c2077d49184cdeb7b801bf0699ff4ece 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -26,6 +26,7 @@ #include "dp_drm.h" #include "dp_audio.h" #include "dp_debug.h" +#include "dp_mst_drm.h" static bool psr_enabled = false; module_param(psr_enabled, bool, 0); @@ -409,6 +410,17 @@ static void msm_dp_display_mst_init(struct msm_dp_display_private *dp) msm_dp->mst_active = true; } +static void msm_dp_display_set_mst_mgr_state(struct msm_dp_display_private *dp, + bool state) +{ + if (!dp->msm_dp_display.mst_active) + return; + + msm_dp_mst_display_set_mgr_state(&dp->msm_dp_display, state); + + drm_dbg_dp(dp->drm_dev, "mst_mgr_state: %d\n", state); +} + static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp) { struct drm_connector *connector = dp->msm_dp_display.connector; @@ -455,6 +467,8 @@ static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp) goto end; } + msm_dp_display_set_mst_mgr_state(dp, true); + msm_dp_add_event(dp, EV_USER_NOTIFICATION, true, 0); end: @@ -521,6 +535,12 @@ static int msm_dp_display_usbpd_configure_cb(struct device *dev) static int msm_dp_display_notify_disconnect(struct device *dev) { struct msm_dp_display_private *dp = dev_get_dp_display_private(dev); + struct msm_dp *dp_display = &dp->msm_dp_display; + + if (dp_display->mst_active) { + msm_dp_mst_display_set_mgr_state(&dp->msm_dp_display, false); + dp_display->mst_active = false; + } msm_dp_add_event(dp, EV_USER_NOTIFICATION, false, 0); diff --git a/drivers/gpu/drm/msm/dp/dp_mst_drm.c b/drivers/gpu/drm/msm/dp/dp_mst_drm.c index 313eb63b9a35cbbb36db2d7d8f0a85e4441f2998..1149af71d01f99ba5326870fa69e30ae081d6101 100644 --- a/drivers/gpu/drm/msm/dp/dp_mst_drm.c +++ b/drivers/gpu/drm/msm/dp/dp_mst_drm.c @@ -1043,6 +1043,24 @@ msm_dp_mst_add_connector(struct drm_dp_mst_topology_mgr *mgr, return &mst_connector->connector; } +int msm_dp_mst_display_set_mgr_state(struct msm_dp *dp_display, bool state) +{ + int rc; + struct msm_dp_mst *mst = dp_display->msm_dp_mst; + + if (state) + mst->mst_session_hpd_state = state; + + rc = drm_dp_mst_topology_mgr_set_mst(&mst->mst_mgr, state); + if (rc < 0) { + DRM_ERROR("failed to set topology mgr state to %d. rc %d\n", + state, rc); + } + + drm_dbg_dp(dp_display->drm_dev, "dp_mst_display_set_mgr_state state:%d\n", state); + return rc; +} + static const struct drm_dp_mst_topology_cbs msm_dp_mst_drm_cbs = { .add_connector = msm_dp_mst_add_connector, }; diff --git a/drivers/gpu/drm/msm/dp/dp_mst_drm.h b/drivers/gpu/drm/msm/dp/dp_mst_drm.h index b1adb8a61115d4809107553809206bb2ed3c6c3d..b89913ef7b343d449e0003f56b96df049fa36e89 100644 --- a/drivers/gpu/drm/msm/dp/dp_mst_drm.h +++ b/drivers/gpu/drm/msm/dp/dp_mst_drm.h @@ -105,5 +105,6 @@ int msm_dp_mst_init(struct msm_dp *dp_display, u32 max_streams, u32 max_dpcd_transaction_bytes, struct drm_dp_aux *drm_aux); void msm_dp_mst_display_hpd_irq(struct msm_dp *dp_display); +int msm_dp_mst_display_set_mgr_state(struct msm_dp *dp_display, bool state); #endif /* _DP_MST_DRM_H_ */