On 25 January 2017 at 09:49, Dhinakaran Pandiyan <dhinakaran.pandiyan@xxxxxxxxx> wrote: > drm_dp_mst_allocate_vcpi() apart from setting up the vcpi structure, > also finds if there are enough slots available. This check is a duplicate > of that implemented in drm_dp_mst_find_vcpi_slots(). Let's move this check > out and reuse the existing drm_dp_mst_find_vcpi_slots() function to check > if there are enough vcpi slots before allocating them. > > This brings the check to one place. Additionally drivers that will use MST > state tracking for atomic modesets can use the atomic version of > find_vcpi_slots() and reuse drm_dp_mst_allocate_vcpi() > Also seem sane, at least for the core bits, Reviewed-by: Dave Airlie <airlied@xxxxxxxxxx> > Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@xxxxxxxxx> > --- > drivers/gpu/drm/drm_dp_mst_topology.c | 20 +++++++++----------- > drivers/gpu/drm/i915/intel_dp_mst.c | 4 ++-- > drivers/gpu/drm/nouveau/nv50_display.c | 3 ++- > drivers/gpu/drm/radeon/radeon_dp_mst.c | 4 +++- > include/drm/drm_dp_mst_helper.h | 2 +- > 5 files changed, 17 insertions(+), 16 deletions(-) > > diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c > index d9edd84..b871d4e 100644 > --- a/drivers/gpu/drm/drm_dp_mst_topology.c > +++ b/drivers/gpu/drm/drm_dp_mst_topology.c > @@ -2479,20 +2479,17 @@ int drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, > EXPORT_SYMBOL(drm_dp_find_vcpi_slots); > > static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr, > - struct drm_dp_vcpi *vcpi, int pbn) > + struct drm_dp_vcpi *vcpi, int pbn, int slots) > { > - int num_slots; > int ret; > > - num_slots = DIV_ROUND_UP(pbn, mgr->pbn_div); > - > /* max. time slots - one slot for MTP header */ > - if (num_slots > 63) > + if (slots > 63) > return -ENOSPC; > > vcpi->pbn = pbn; > - vcpi->aligned_pbn = num_slots * mgr->pbn_div; > - vcpi->num_slots = num_slots; > + vcpi->aligned_pbn = slots * mgr->pbn_div; > + vcpi->num_slots = slots; > > ret = drm_dp_mst_assign_payload_id(mgr, vcpi); > if (ret < 0) > @@ -2507,7 +2504,7 @@ static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr, > * @pbn: payload bandwidth number to request > * @slots: returned number of slots for this PBN. > */ > -bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int *slots) > +bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int slots) > { > int ret; > > @@ -2515,16 +2512,18 @@ bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp > if (!port) > return false; > > + if (slots < 0) > + return false; > + > if (port->vcpi.vcpi > 0) { > DRM_DEBUG_KMS("payload: vcpi %d already allocated for pbn %d - requested pbn %d\n", port->vcpi.vcpi, port->vcpi.pbn, pbn); > if (pbn == port->vcpi.pbn) { > - *slots = port->vcpi.num_slots; > drm_dp_put_port(port); > return true; > } > } > > - ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn); > + ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn, slots); > if (ret) { > DRM_DEBUG_KMS("failed to init vcpi slots=%d max=63 ret=%d\n", > DIV_ROUND_UP(pbn, mgr->pbn_div), ret); > @@ -2532,7 +2531,6 @@ bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp > } > DRM_DEBUG_KMS("initing vcpi for pbn=%d slots=%d\n", > pbn, port->vcpi.num_slots); > - *slots = port->vcpi.num_slots; > > drm_dp_put_port(port); > return true; > diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c > index 38e3ca2..f51574f 100644 > --- a/drivers/gpu/drm/i915/intel_dp_mst.c > +++ b/drivers/gpu/drm/i915/intel_dp_mst.c > @@ -147,7 +147,6 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder, > to_intel_connector(conn_state->connector); > int ret; > uint32_t temp; > - int slots; > > /* MST encoders are bound to a crtc, not to a connector, > * force the mapping here for get_hw_state. > @@ -177,7 +176,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder, > > ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr, > connector->port, > - pipe_config->pbn, &slots); > + pipe_config->pbn, > + pipe_config->dp_m_n.tu); > if (ret == false) { > DRM_ERROR("failed to allocate vcpi\n"); > return; > diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c > index 452da48..91a4875 100644 > --- a/drivers/gpu/drm/nouveau/nv50_display.c > +++ b/drivers/gpu/drm/nouveau/nv50_display.c > @@ -2959,7 +2959,8 @@ nv50_msto_enable(struct drm_encoder *encoder) > if (WARN_ON(!mstc)) > return; > > - r = drm_dp_mst_allocate_vcpi(&mstm->mgr, mstc->port, mstc->pbn, &slots); > + slots = drm_dp_find_vcpi_slots(&mstm->mgr, mstc->pbn); > + r = drm_dp_mst_allocate_vcpi(&mstm->mgr, mstc->port, mstc->pbn, slots); > WARN_ON(!r); > > if (mstm->outp->dcb->sorconf.link & 1) > diff --git a/drivers/gpu/drm/radeon/radeon_dp_mst.c b/drivers/gpu/drm/radeon/radeon_dp_mst.c > index 7d5ada3..6598306 100644 > --- a/drivers/gpu/drm/radeon/radeon_dp_mst.c > +++ b/drivers/gpu/drm/radeon/radeon_dp_mst.c > @@ -453,9 +453,11 @@ radeon_mst_encoder_dpms(struct drm_encoder *encoder, int mode) > DRM_DEBUG_KMS("dig encoder is %d %d %d\n", dig_enc->dig_encoder, > dig_enc->linkb, radeon_crtc->crtc_id); > > + slots = drm_dp_find_vcpi_slots(&radeon_connector->mst_port->mst_mgr, > + mst_enc->pbn); > ret = drm_dp_mst_allocate_vcpi(&radeon_connector->mst_port->mst_mgr, > radeon_connector->port, > - mst_enc->pbn, &slots); > + mst_enc->pbn, slots); > ret = drm_dp_update_payload_part1(&radeon_connector->mst_port->mst_mgr); > > radeon_dp_mst_set_be_cntl(primary, mst_enc, > diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h > index b0f4a09..98d3c73 100644 > --- a/include/drm/drm_dp_mst_helper.h > +++ b/include/drm/drm_dp_mst_helper.h > @@ -568,7 +568,7 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_ > int drm_dp_calc_pbn_mode(int clock, int bpp); > > > -bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int *slots); > +bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int slots); > > int drm_dp_mst_get_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port); > > -- > 2.7.4 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel