diff options
Diffstat (limited to 'drivers/gpu/drm/drm_dp_mst_topology.c')
| -rw-r--r-- | drivers/gpu/drm/drm_dp_mst_topology.c | 42 | 
1 files changed, 33 insertions, 9 deletions
| diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index 86d13d6bc463..571da0c2f39f 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -3355,6 +3355,10 @@ static int drm_dp_destroy_payload_step2(struct drm_dp_mst_topology_mgr *mgr,  /**   * drm_dp_update_payload_part1() - Execute payload update part 1   * @mgr: manager to use. + * @start_slot: this is the cur slot + * + * NOTE: start_slot is a temporary workaround for non-atomic drivers, + * this will be removed when non-atomic mst helpers are moved out of the helper   *   * This iterates over all proposed virtual channels, and tries to   * allocate space in the link for them. For 0->slots transitions, @@ -3365,12 +3369,12 @@ static int drm_dp_destroy_payload_step2(struct drm_dp_mst_topology_mgr *mgr,   * after calling this the driver should generate ACT and payload   * packets.   */ -int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr) +int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr, int start_slot)  {  	struct drm_dp_payload req_payload;  	struct drm_dp_mst_port *port;  	int i, j; -	int cur_slots = 1; +	int cur_slots = start_slot;  	bool skip;  	mutex_lock(&mgr->payload_lock); @@ -4334,10 +4338,6 @@ static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr,  {  	int ret; -	/* max. time slots - one slot for MTP header */ -	if (slots > 63) -		return -ENOSPC; -  	vcpi->pbn = pbn;  	vcpi->aligned_pbn = slots * mgr->pbn_div;  	vcpi->num_slots = slots; @@ -4510,6 +4510,27 @@ int drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state,  EXPORT_SYMBOL(drm_dp_atomic_release_vcpi_slots);  /** + * drm_dp_mst_update_slots() - updates the slot info depending on the DP ecoding format + * @mst_state: mst_state to update + * @link_encoding_cap: the ecoding format on the link + */ +void drm_dp_mst_update_slots(struct drm_dp_mst_topology_state *mst_state, uint8_t link_encoding_cap) +{ +	if (link_encoding_cap == DP_CAP_ANSI_128B132B) { +		mst_state->total_avail_slots = 64; +		mst_state->start_slot = 0; +	} else { +		mst_state->total_avail_slots = 63; +		mst_state->start_slot = 1; +	} + +	DRM_DEBUG_KMS("%s encoding format on mst_state 0x%p\n", +		      (link_encoding_cap == DP_CAP_ANSI_128B132B) ? "128b/132b":"8b/10b", +		      mst_state); +} +EXPORT_SYMBOL(drm_dp_mst_update_slots); + +/**   * drm_dp_mst_allocate_vcpi() - Allocate a virtual channel   * @mgr: manager for this port   * @port: port to allocate a virtual channel for. @@ -4540,7 +4561,7 @@ bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,  	ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn, slots);  	if (ret) { -		drm_dbg_kms(mgr->dev, "failed to init vcpi slots=%d max=63 ret=%d\n", +		drm_dbg_kms(mgr->dev, "failed to init vcpi slots=%d ret=%d\n",  			    DIV_ROUND_UP(pbn, mgr->pbn_div), ret);  		drm_dp_mst_topology_put_port(port);  		goto out; @@ -5228,7 +5249,7 @@ drm_dp_mst_atomic_check_vcpi_alloc_limit(struct drm_dp_mst_topology_mgr *mgr,  					 struct drm_dp_mst_topology_state *mst_state)  {  	struct drm_dp_vcpi_allocation *vcpi; -	int avail_slots = 63, payload_count = 0; +	int avail_slots = mst_state->total_avail_slots, payload_count = 0;  	list_for_each_entry(vcpi, &mst_state->vcpis, next) {  		/* Releasing VCPI is always OK-even if the port is gone */ @@ -5257,7 +5278,7 @@ drm_dp_mst_atomic_check_vcpi_alloc_limit(struct drm_dp_mst_topology_mgr *mgr,  		}  	}  	drm_dbg_atomic(mgr->dev, "[MST MGR:%p] mst state %p VCPI avail=%d used=%d\n", -		       mgr, mst_state, avail_slots, 63 - avail_slots); +		       mgr, mst_state, avail_slots, mst_state->total_avail_slots - avail_slots);  	return 0;  } @@ -5534,6 +5555,9 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,  	if (mst_state == NULL)  		return -ENOMEM; +	mst_state->total_avail_slots = 63; +	mst_state->start_slot = 1; +  	mst_state->mgr = mgr;  	INIT_LIST_HEAD(&mst_state->vcpis); |