From 65f1c136ea418f14801e99e76befa5c2a9b73445 Mon Sep 17 00:00:00 2001 From: Sudarsan Ramesh Date: Mon, 8 Feb 2021 14:53:30 -0500 Subject: [PATCH] disp: msm: dp: change the detect callback to detect_ctx The connector detect function is currently implemented as a callback from the framework, and creates a context before calling the detect_port_ctx MST callback. This change updates the callflow so that the framework calls the new detect_ctx function in the MST case. This removes the need for creating a new context before calling further downstream functions. In addition, references to the mst_connector_get_info function were replaced by connector_get_info to avoid redundancy. Change-Id: I224d09e77fad4b6925a42b1bc912a05e3e4d060a Signed-off-by: Sudarsan Ramesh --- msm/dp/dp_display.c | 6 +++- msm/dp/dp_mst_drm.c | 67 ++++++++++------------------------------- msm/sde/sde_connector.c | 21 ++++++++----- msm/sde/sde_connector.h | 13 ++++++++ 4 files changed, 47 insertions(+), 60 deletions(-) diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c index 2dbc677b66..4e51e045d0 100644 --- a/msm/dp/dp_display.c +++ b/msm/dp/dp_display.c @@ -816,16 +816,20 @@ static bool dp_display_send_hpd_event(struct dp_display_private *dp) char name[HPD_STRING_SIZE], status[HPD_STRING_SIZE], bpp[HPD_STRING_SIZE], pattern[HPD_STRING_SIZE]; char *envp[5]; + struct dp_display *display; int rc = 0; connector = dp->dp_display.base_connector; + display = &dp->dp_display; if (!connector) { DP_ERR("connector not set\n"); return false; } - connector->status = connector->funcs->detect(connector, false); + connector->status = display->is_sst_connected ? connector_status_connected : + connector_status_disconnected; + if (dp->cached_connector_status == connector->status) { DP_DEBUG("connector status (%d) unchanged, skipping uevent\n", dp->cached_connector_status); diff --git a/msm/dp/dp_mst_drm.c b/msm/dp/dp_mst_drm.c index abb71b8fb8..59c89c5c64 100644 --- a/msm/dp/dp_mst_drm.c +++ b/msm/dp/dp_mst_drm.c @@ -889,42 +889,33 @@ void dp_mst_drm_bridge_deinit(void *display) /* DP MST Connector OPs */ -static enum drm_connector_status -dp_mst_connector_detect(struct drm_connector *connector, bool force, +static int +dp_mst_connector_detect(struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx, + bool force, void *display) { struct sde_connector *c_conn = to_sde_connector(connector); struct dp_display *dp_display = c_conn->display; struct dp_mst_private *mst = dp_display->dp_mst_prv_info; struct dp_panel *dp_panel; - struct drm_modeset_acquire_ctx ctx; enum drm_connector_status status; DP_MST_DEBUG("enter:\n"); SDE_EVT32_EXTERNAL(SDE_EVTLOG_FUNC_ENTRY); - if (!c_conn->drv_panel || !c_conn->mst_port) { - DP_DEBUG("conn %d is invalid\n"); - return connector_status_disconnected; - } - dp_panel = c_conn->drv_panel; if (dp_panel->mst_hide) return connector_status_disconnected; - drm_modeset_acquire_init(&ctx, 0); - status = mst->mst_fw_cbs->detect_port_ctx(connector, - &ctx, &mst->mst_mgr, c_conn->mst_port); + ctx, &mst->mst_mgr, c_conn->mst_port); DP_MST_INFO("conn:%d status:%d\n", connector->base.id, status); SDE_EVT32_EXTERNAL(SDE_EVTLOG_FUNC_EXIT, connector->base.id, status); - drm_modeset_drop_locks(&ctx); - drm_modeset_acquire_fini(&ctx); - - return status; + return (int)status; } void dp_mst_clear_edid_cache(void *dp_display) { @@ -1086,34 +1077,6 @@ enum drm_mode_status dp_mst_connector_mode_valid( return dp_display->validate_mode(dp_display, dp_panel, mode, avail_res); } -int dp_mst_connector_get_info(struct drm_connector *connector, - struct msm_display_info *info, - void *display) -{ - int rc; - enum drm_connector_status status = connector_status_unknown; - - DP_MST_DEBUG("enter:\n"); - SDE_EVT32_EXTERNAL(SDE_EVTLOG_FUNC_ENTRY, connector->base.id); - - rc = dp_connector_get_info(connector, info, display); - - if (!rc) { - status = dp_mst_connector_detect(connector, false, display); - - if (status == connector_status_connected) - info->is_connected = true; - else - info->is_connected = false; - } - - DP_MST_INFO("mst connector:%d status:%d, rc:%d\n", - connector->base.id, status, rc); - SDE_EVT32_EXTERNAL(SDE_EVTLOG_FUNC_EXIT, connector->base.id); - - return rc; -} - int dp_mst_connector_get_mode_info(struct drm_connector *connector, const struct drm_display_mode *drm_mode, struct msm_sub_mode *sub_mode, @@ -1399,10 +1362,10 @@ dp_mst_add_connector(struct drm_dp_mst_topology_mgr *mgr, { static const struct sde_connector_ops dp_mst_connector_ops = { .post_init = dp_mst_connector_post_init, - .detect = dp_mst_connector_detect, + .detect_ctx = dp_mst_connector_detect, .get_modes = dp_mst_connector_get_modes, .mode_valid = dp_mst_connector_mode_valid, - .get_info = dp_mst_connector_get_info, + .get_info = dp_connector_get_info, .get_mode_info = dp_mst_connector_get_mode_info, .atomic_best_encoder = dp_mst_atomic_best_encoder, .atomic_check = dp_mst_connector_atomic_check, @@ -1477,8 +1440,10 @@ dp_mst_add_connector(struct drm_dp_mst_topology_mgr *mgr, return connector; } -static enum drm_connector_status -dp_mst_fixed_connector_detect(struct drm_connector *connector, bool force, +static int +dp_mst_fixed_connector_detect(struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx, + bool force, void *display) { struct dp_display *dp_display = display; @@ -1492,10 +1457,10 @@ dp_mst_fixed_connector_detect(struct drm_connector *connector, bool force, if (!mst->mst_bridge[i].fixed_port_added) break; - return dp_mst_connector_detect(connector, force, display); + return dp_mst_connector_detect(connector, ctx, force, display); } - return connector_status_disconnected; + return (int)connector_status_disconnected; } static struct drm_encoder * @@ -1672,10 +1637,10 @@ dp_mst_drm_fixed_connector_init(struct dp_display *dp_display, { static const struct sde_connector_ops dp_mst_connector_ops = { .post_init = dp_mst_connector_post_init, - .detect = dp_mst_fixed_connector_detect, + .detect_ctx = dp_mst_fixed_connector_detect, .get_modes = dp_mst_connector_get_modes, .mode_valid = dp_mst_connector_mode_valid, - .get_info = dp_mst_connector_get_info, + .get_info = dp_connector_get_info, .get_mode_info = dp_mst_connector_get_mode_info, .atomic_best_encoder = dp_mst_fixed_atomic_best_encoder, .atomic_check = dp_mst_connector_atomic_check, diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index 951511f55d..cf35ff0b87 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -1823,8 +1823,10 @@ static void sde_connector_update_colorspace(struct drm_connector *connector) SDE_ERROR("failed to set colorspace property for connector\n"); } -static enum drm_connector_status -sde_connector_detect(struct drm_connector *connector, bool force) +static int +sde_connector_detect_ctx(struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx, + bool force) { enum drm_connector_status status = connector_status_unknown; struct sde_connector *c_conn; @@ -1836,12 +1838,14 @@ sde_connector_detect(struct drm_connector *connector, bool force) c_conn = to_sde_connector(connector); - if (c_conn->ops.detect) - status = c_conn->ops.detect(connector, - force, - c_conn->display); + if (c_conn->ops.detect_ctx) + status = c_conn->ops.detect_ctx(connector, ctx, force, c_conn->display); + else if (c_conn->ops.detect) + status = c_conn->ops.detect(connector, force, c_conn->display); - return status; + SDE_DEBUG("connector id: %d, connection status: %d\n", connector->base.id, status); + + return (int)status; } int sde_connector_get_dpms(struct drm_connector *connector) @@ -2423,7 +2427,6 @@ static int sde_connector_fill_modes(struct drm_connector *connector, static const struct drm_connector_funcs sde_connector_ops = { .reset = sde_connector_atomic_reset, - .detect = sde_connector_detect, .destroy = sde_connector_destroy, .fill_modes = sde_connector_fill_modes, .atomic_duplicate_state = sde_connector_atomic_duplicate_state, @@ -2689,6 +2692,7 @@ static void sde_connector_check_status_work(struct work_struct *work) static const struct drm_connector_helper_funcs sde_connector_helper_ops = { .get_modes = sde_connector_get_modes, + .detect_ctx = sde_connector_detect_ctx, .mode_valid = sde_connector_mode_valid, .best_encoder = sde_connector_best_encoder, .atomic_check = sde_connector_atomic_check, @@ -2696,6 +2700,7 @@ static const struct drm_connector_helper_funcs sde_connector_helper_ops = { static const struct drm_connector_helper_funcs sde_connector_helper_ops_v2 = { .get_modes = sde_connector_get_modes, + .detect_ctx = sde_connector_detect_ctx, .mode_valid = sde_connector_mode_valid, .best_encoder = sde_connector_best_encoder, .atomic_best_encoder = sde_connector_atomic_best_encoder, diff --git a/msm/sde/sde_connector.h b/msm/sde/sde_connector.h index 72d9c20931..4f374b2e35 100644 --- a/msm/sde/sde_connector.h +++ b/msm/sde/sde_connector.h @@ -60,6 +60,19 @@ struct sde_connector_ops { bool force, void *display); + /** + * detect_ctx - determine if connector is connected + * @connector: Pointer to drm connector structure + * @ctx: Pointer to drm modeset acquire context structure + * @force: Force detect setting from drm framework + * @display: Pointer to private display handle + * Returns: Connector 'is connected' status + */ + int (*detect_ctx)(struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx, + bool force, + void *display); + /** * get_modes - add drm modes via drm_mode_probed_add() * @connector: Pointer to drm connector structure