summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSankeerth Billakanti <sbillaka@codeaurora.org>2020-05-10 12:34:59 +0530
committerSankeerth Billakanti <sbillaka@codeaurora.org>2020-05-10 12:39:20 +0530
commit6b9e2bb30dc3d1b8f0de5a0c97144fc0048bef04 (patch)
treecc856eb0984de874f7883545ba7d10263c5fbee7
parent80b2c9374cb0c5ce77bd8cc306b685b5ab4ab9af (diff)
downloaddisplay-drivers-6b9e2bb30dc3d1b8f0de5a0c97144fc0048bef04.tar.gz
disp: msm: dp: add enc availability check in mode_valid
Add encoder availability check in mode_valid. This is a rollback in commit 2446602565ec ("drm/msm/dp: add private state to dp_mst_bridge") where active_enc_cnt is removed. Change-Id: Ia6d4aaef53b537dbe641919496bbd351c3099a85 Signed-off-by: Xiaowen Wu <wxiaowen@codeaurora.org> Signed-off-by: Sankeerth Billakanti <sbillaka@codeaurora.org>
-rw-r--r--msm/dp/dp_mst_drm.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/msm/dp/dp_mst_drm.c b/msm/dp/dp_mst_drm.c
index 66c01db2..508e1034 100644
--- a/msm/dp/dp_mst_drm.c
+++ b/msm/dp/dp_mst_drm.c
@@ -78,7 +78,6 @@ struct dp_drm_mst_fw_helper_ops {
struct drm_dp_mst_port *port);
void (*deallocate_vcpi)(struct drm_dp_mst_topology_mgr *mgr,
struct drm_dp_mst_port *port);
- int (*get_avail_slots)(struct drm_dp_mst_topology_mgr *mgr);
};
struct dp_mst_sim_port_data {
@@ -548,11 +547,6 @@ static void dp_mst_sim_handle_hpd_irq(void *dp_display,
}
}
-static int _dp_mst_get_avail_slots(struct drm_dp_mst_topology_mgr *mgr)
-{
- return to_dp_mst_topology_state(mgr->base.state)->avail_slots;
-}
-
static void _dp_mst_get_vcpi_info(
struct drm_dp_mst_topology_mgr *mgr,
int vcpi, int *start_slot, int *num_slots)
@@ -618,7 +612,6 @@ static const struct dp_drm_mst_fw_helper_ops drm_dp_mst_fw_helper_ops = {
.atomic_release_vcpi_slots = drm_dp_atomic_release_vcpi_slots,
.reset_vcpi_slots = drm_dp_mst_reset_vcpi_slots,
.deallocate_vcpi = drm_dp_mst_deallocate_vcpi,
- .get_avail_slots = _dp_mst_get_avail_slots,
};
static const struct dp_drm_mst_fw_helper_ops drm_dp_sim_mst_fw_helper_ops = {
@@ -636,7 +629,6 @@ static const struct dp_drm_mst_fw_helper_ops drm_dp_sim_mst_fw_helper_ops = {
.atomic_release_vcpi_slots = drm_dp_atomic_release_vcpi_slots,
.reset_vcpi_slots = drm_dp_mst_reset_vcpi_slots,
.deallocate_vcpi = drm_dp_mst_deallocate_vcpi,
- .get_avail_slots = _dp_mst_get_avail_slots,
};
/* DP MST Bridge OPs */
@@ -1289,6 +1281,9 @@ enum drm_mode_status dp_mst_connector_mode_valid(
struct dp_display_mode dp_mode;
uint16_t available_pbn, required_pbn;
int available_slots, required_slots;
+ struct dp_mst_bridge_state *dp_bridge_state;
+ int i, slots_in_use = 0, active_enc_cnt = 0;
+ const u32 tot_slots = 63;
if (!connector || !mode || !display) {
DP_ERR("invalid input\n");
@@ -1299,8 +1294,23 @@ enum drm_mode_status dp_mst_connector_mode_valid(
c_conn = to_sde_connector(connector);
mst_port = c_conn->mst_port;
- available_pbn = mst_port->available_pbn;
- available_slots = mst->mst_fw_cbs->get_avail_slots(&mst->mst_mgr);
+ /* dp bridge state is protected by drm_mode_config.connection_mutex */
+ for (i = 0; i < MAX_DP_MST_DRM_BRIDGES; i++) {
+ dp_bridge_state = to_dp_mst_bridge_state(&mst->mst_bridge[i]);
+ if (dp_bridge_state->connector &&
+ dp_bridge_state->connector != connector) {
+ active_enc_cnt++;
+ slots_in_use += dp_bridge_state->num_slots;
+ }
+ }
+
+ if (active_enc_cnt < DP_STREAM_MAX) {
+ available_pbn = mst_port->available_pbn;
+ available_slots = tot_slots - slots_in_use;
+ } else {
+ pr_debug("all mst streams are active\n");
+ return MODE_BAD;
+ }
dp_display->convert_to_dp_mode(dp_display, c_conn->drv_panel,
mode, &dp_mode);