mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	drm/display: dp-mst-topology: use new DCPD access helpers
Switch drm_dp_mst_topology.c to use new set of DPCD read / write helpers. Reviewed-by: Lyude Paul <lyude@redhat.com> Acked-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Link: https://lore.kernel.org/r/20250324-drm-rework-dpcd-access-v4-5-e80ff89593df@oss.qualcomm.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
This commit is contained in:
		
							parent
							
								
									97f3793988
								
							
						
					
					
						commit
						2554da0de3
					
				
					 1 changed files with 51 additions and 54 deletions
				
			
		| 
						 | 
				
			
			@ -2201,15 +2201,12 @@ static int drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, guid_t *guid)
 | 
			
		|||
						     mstb->port_parent,
 | 
			
		||||
						     DP_GUID, sizeof(buf), buf);
 | 
			
		||||
		} else {
 | 
			
		||||
			ret = drm_dp_dpcd_write(mstb->mgr->aux,
 | 
			
		||||
						DP_GUID, buf, sizeof(buf));
 | 
			
		||||
			ret = drm_dp_dpcd_write_data(mstb->mgr->aux,
 | 
			
		||||
						     DP_GUID, buf, sizeof(buf));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ret < 16 && ret > 0)
 | 
			
		||||
		return -EPROTO;
 | 
			
		||||
 | 
			
		||||
	return ret == 16 ? 0 : ret;
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb,
 | 
			
		||||
| 
						 | 
				
			
			@ -2744,14 +2741,13 @@ static int drm_dp_send_sideband_msg(struct drm_dp_mst_topology_mgr *mgr,
 | 
			
		|||
	do {
 | 
			
		||||
		tosend = min3(mgr->max_dpcd_transaction_bytes, 16, total);
 | 
			
		||||
 | 
			
		||||
		ret = drm_dp_dpcd_write(mgr->aux, regbase + offset,
 | 
			
		||||
					&msg[offset],
 | 
			
		||||
					tosend);
 | 
			
		||||
		if (ret != tosend) {
 | 
			
		||||
			if (ret == -EIO && retries < 5) {
 | 
			
		||||
				retries++;
 | 
			
		||||
				goto retry;
 | 
			
		||||
			}
 | 
			
		||||
		ret = drm_dp_dpcd_write_data(mgr->aux, regbase + offset,
 | 
			
		||||
					     &msg[offset],
 | 
			
		||||
					     tosend);
 | 
			
		||||
		if (ret == -EIO && retries < 5) {
 | 
			
		||||
			retries++;
 | 
			
		||||
			goto retry;
 | 
			
		||||
		} else if (ret < 0) {
 | 
			
		||||
			drm_dbg_kms(mgr->dev, "failed to dpcd write %d %d\n", tosend, ret);
 | 
			
		||||
 | 
			
		||||
			return -EIO;
 | 
			
		||||
| 
						 | 
				
			
			@ -3624,7 +3620,7 @@ enum drm_dp_mst_mode drm_dp_read_mst_cap(struct drm_dp_aux *aux,
 | 
			
		|||
	if (dpcd[DP_DPCD_REV] < DP_DPCD_REV_12)
 | 
			
		||||
		return DRM_DP_SST;
 | 
			
		||||
 | 
			
		||||
	if (drm_dp_dpcd_readb(aux, DP_MSTM_CAP, &mstm_cap) != 1)
 | 
			
		||||
	if (drm_dp_dpcd_read_byte(aux, DP_MSTM_CAP, &mstm_cap) < 0)
 | 
			
		||||
		return DRM_DP_SST;
 | 
			
		||||
 | 
			
		||||
	if (mstm_cap & DP_MST_CAP)
 | 
			
		||||
| 
						 | 
				
			
			@ -3679,10 +3675,10 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms
 | 
			
		|||
		mgr->mst_primary = mstb;
 | 
			
		||||
		drm_dp_mst_topology_get_mstb(mgr->mst_primary);
 | 
			
		||||
 | 
			
		||||
		ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
 | 
			
		||||
					 DP_MST_EN |
 | 
			
		||||
					 DP_UP_REQ_EN |
 | 
			
		||||
					 DP_UPSTREAM_IS_SRC);
 | 
			
		||||
		ret = drm_dp_dpcd_write_byte(mgr->aux, DP_MSTM_CTRL,
 | 
			
		||||
					     DP_MST_EN |
 | 
			
		||||
					     DP_UP_REQ_EN |
 | 
			
		||||
					     DP_UPSTREAM_IS_SRC);
 | 
			
		||||
		if (ret < 0)
 | 
			
		||||
			goto out_unlock;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3697,7 +3693,7 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms
 | 
			
		|||
		mstb = mgr->mst_primary;
 | 
			
		||||
		mgr->mst_primary = NULL;
 | 
			
		||||
		/* this can fail if the device is gone */
 | 
			
		||||
		drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0);
 | 
			
		||||
		drm_dp_dpcd_write_byte(mgr->aux, DP_MSTM_CTRL, 0);
 | 
			
		||||
		ret = 0;
 | 
			
		||||
		mgr->payload_id_table_cleared = false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3763,8 +3759,8 @@ EXPORT_SYMBOL(drm_dp_mst_topology_queue_probe);
 | 
			
		|||
void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr)
 | 
			
		||||
{
 | 
			
		||||
	mutex_lock(&mgr->lock);
 | 
			
		||||
	drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
 | 
			
		||||
			   DP_MST_EN | DP_UPSTREAM_IS_SRC);
 | 
			
		||||
	drm_dp_dpcd_write_byte(mgr->aux, DP_MSTM_CTRL,
 | 
			
		||||
			       DP_MST_EN | DP_UPSTREAM_IS_SRC);
 | 
			
		||||
	mutex_unlock(&mgr->lock);
 | 
			
		||||
	flush_work(&mgr->up_req_work);
 | 
			
		||||
	flush_work(&mgr->work);
 | 
			
		||||
| 
						 | 
				
			
			@ -3813,18 +3809,18 @@ int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr,
 | 
			
		|||
		goto out_fail;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
 | 
			
		||||
				 DP_MST_EN |
 | 
			
		||||
				 DP_UP_REQ_EN |
 | 
			
		||||
				 DP_UPSTREAM_IS_SRC);
 | 
			
		||||
	ret = drm_dp_dpcd_write_byte(mgr->aux, DP_MSTM_CTRL,
 | 
			
		||||
				     DP_MST_EN |
 | 
			
		||||
				     DP_UP_REQ_EN |
 | 
			
		||||
				     DP_UPSTREAM_IS_SRC);
 | 
			
		||||
	if (ret < 0) {
 | 
			
		||||
		drm_dbg_kms(mgr->dev, "mst write failed - undocked during suspend?\n");
 | 
			
		||||
		goto out_fail;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Some hubs forget their guids after they resume */
 | 
			
		||||
	ret = drm_dp_dpcd_read(mgr->aux, DP_GUID, buf, sizeof(buf));
 | 
			
		||||
	if (ret != sizeof(buf)) {
 | 
			
		||||
	ret = drm_dp_dpcd_read_data(mgr->aux, DP_GUID, buf, sizeof(buf));
 | 
			
		||||
	if (ret < 0) {
 | 
			
		||||
		drm_dbg_kms(mgr->dev, "dpcd read failed - undocked during suspend?\n");
 | 
			
		||||
		goto out_fail;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -3883,8 +3879,8 @@ drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up,
 | 
			
		|||
		*mstb = NULL;
 | 
			
		||||
 | 
			
		||||
	len = min(mgr->max_dpcd_transaction_bytes, 16);
 | 
			
		||||
	ret = drm_dp_dpcd_read(mgr->aux, basereg, replyblock, len);
 | 
			
		||||
	if (ret != len) {
 | 
			
		||||
	ret = drm_dp_dpcd_read_data(mgr->aux, basereg, replyblock, len);
 | 
			
		||||
	if (ret < 0) {
 | 
			
		||||
		drm_dbg_kms(mgr->dev, "failed to read DPCD down rep %d %d\n", len, ret);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -3922,9 +3918,9 @@ drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up,
 | 
			
		|||
	curreply = len;
 | 
			
		||||
	while (replylen > 0) {
 | 
			
		||||
		len = min3(replylen, mgr->max_dpcd_transaction_bytes, 16);
 | 
			
		||||
		ret = drm_dp_dpcd_read(mgr->aux, basereg + curreply,
 | 
			
		||||
				    replyblock, len);
 | 
			
		||||
		if (ret != len) {
 | 
			
		||||
		ret = drm_dp_dpcd_read_data(mgr->aux, basereg + curreply,
 | 
			
		||||
					    replyblock, len);
 | 
			
		||||
		if (ret < 0) {
 | 
			
		||||
			drm_dbg_kms(mgr->dev, "failed to read a chunk (len %d, ret %d)\n",
 | 
			
		||||
				    len, ret);
 | 
			
		||||
			return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -4873,9 +4869,9 @@ static bool dump_dp_payload_table(struct drm_dp_mst_topology_mgr *mgr,
 | 
			
		|||
	int i;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < DP_PAYLOAD_TABLE_SIZE; i += 16) {
 | 
			
		||||
		if (drm_dp_dpcd_read(mgr->aux,
 | 
			
		||||
				     DP_PAYLOAD_TABLE_UPDATE_STATUS + i,
 | 
			
		||||
				     &buf[i], 16) != 16)
 | 
			
		||||
		if (drm_dp_dpcd_read_data(mgr->aux,
 | 
			
		||||
					  DP_PAYLOAD_TABLE_UPDATE_STATUS + i,
 | 
			
		||||
					  &buf[i], 16) < 0)
 | 
			
		||||
			return false;
 | 
			
		||||
	}
 | 
			
		||||
	return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -4964,23 +4960,24 @@ void drm_dp_mst_dump_topology(struct seq_file *m,
 | 
			
		|||
		}
 | 
			
		||||
		seq_printf(m, "dpcd: %*ph\n", DP_RECEIVER_CAP_SIZE, buf);
 | 
			
		||||
 | 
			
		||||
		ret = drm_dp_dpcd_read(mgr->aux, DP_FAUX_CAP, buf, 2);
 | 
			
		||||
		if (ret != 2) {
 | 
			
		||||
		ret = drm_dp_dpcd_read_data(mgr->aux, DP_FAUX_CAP, buf, 2);
 | 
			
		||||
		if (ret < 0) {
 | 
			
		||||
			seq_printf(m, "faux/mst read failed\n");
 | 
			
		||||
			goto out;
 | 
			
		||||
		}
 | 
			
		||||
		seq_printf(m, "faux/mst: %*ph\n", 2, buf);
 | 
			
		||||
 | 
			
		||||
		ret = drm_dp_dpcd_read(mgr->aux, DP_MSTM_CTRL, buf, 1);
 | 
			
		||||
		if (ret != 1) {
 | 
			
		||||
		ret = drm_dp_dpcd_read_data(mgr->aux, DP_MSTM_CTRL, buf, 1);
 | 
			
		||||
		if (ret < 0) {
 | 
			
		||||
			seq_printf(m, "mst ctrl read failed\n");
 | 
			
		||||
			goto out;
 | 
			
		||||
		}
 | 
			
		||||
		seq_printf(m, "mst ctrl: %*ph\n", 1, buf);
 | 
			
		||||
 | 
			
		||||
		/* dump the standard OUI branch header */
 | 
			
		||||
		ret = drm_dp_dpcd_read(mgr->aux, DP_BRANCH_OUI, buf, DP_BRANCH_OUI_HEADER_SIZE);
 | 
			
		||||
		if (ret != DP_BRANCH_OUI_HEADER_SIZE) {
 | 
			
		||||
		ret = drm_dp_dpcd_read_data(mgr->aux, DP_BRANCH_OUI, buf,
 | 
			
		||||
					    DP_BRANCH_OUI_HEADER_SIZE);
 | 
			
		||||
		if (ret < 0) {
 | 
			
		||||
			seq_printf(m, "branch oui read failed\n");
 | 
			
		||||
			goto out;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -6104,14 +6101,14 @@ struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port)
 | 
			
		|||
 | 
			
		||||
	/* DP-to-DP peer device */
 | 
			
		||||
	if (drm_dp_mst_is_virtual_dpcd(immediate_upstream_port)) {
 | 
			
		||||
		if (drm_dp_dpcd_read(&port->aux,
 | 
			
		||||
				     DP_DSC_SUPPORT, &endpoint_dsc, 1) != 1)
 | 
			
		||||
		if (drm_dp_dpcd_read_data(&port->aux,
 | 
			
		||||
					  DP_DSC_SUPPORT, &endpoint_dsc, 1) < 0)
 | 
			
		||||
			return NULL;
 | 
			
		||||
		if (drm_dp_dpcd_read(&port->aux,
 | 
			
		||||
				     DP_FEC_CAPABILITY, &endpoint_fec, 1) != 1)
 | 
			
		||||
		if (drm_dp_dpcd_read_data(&port->aux,
 | 
			
		||||
					  DP_FEC_CAPABILITY, &endpoint_fec, 1) < 0)
 | 
			
		||||
			return NULL;
 | 
			
		||||
		if (drm_dp_dpcd_read(&immediate_upstream_port->aux,
 | 
			
		||||
				     DP_DSC_SUPPORT, &upstream_dsc, 1) != 1)
 | 
			
		||||
		if (drm_dp_dpcd_read_data(&immediate_upstream_port->aux,
 | 
			
		||||
					  DP_DSC_SUPPORT, &upstream_dsc, 1) < 0)
 | 
			
		||||
			return NULL;
 | 
			
		||||
 | 
			
		||||
		/* Enpoint decompression with DP-to-DP peer device */
 | 
			
		||||
| 
						 | 
				
			
			@ -6149,8 +6146,8 @@ struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port)
 | 
			
		|||
	if (drm_dp_has_quirk(&desc, DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD)) {
 | 
			
		||||
		u8 dpcd_ext[DP_RECEIVER_CAP_SIZE];
 | 
			
		||||
 | 
			
		||||
		if (drm_dp_dpcd_read(immediate_upstream_aux,
 | 
			
		||||
				     DP_DSC_SUPPORT, &upstream_dsc, 1) != 1)
 | 
			
		||||
		if (drm_dp_dpcd_read_data(immediate_upstream_aux,
 | 
			
		||||
					  DP_DSC_SUPPORT, &upstream_dsc, 1) < 0)
 | 
			
		||||
			return NULL;
 | 
			
		||||
 | 
			
		||||
		if (!(upstream_dsc & DP_DSC_DECOMPRESSION_IS_SUPPORTED))
 | 
			
		||||
| 
						 | 
				
			
			@ -6172,11 +6169,11 @@ struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port)
 | 
			
		|||
	 * therefore the endpoint needs to be
 | 
			
		||||
	 * both DSC and FEC capable.
 | 
			
		||||
	 */
 | 
			
		||||
	if (drm_dp_dpcd_read(&port->aux,
 | 
			
		||||
	   DP_DSC_SUPPORT, &endpoint_dsc, 1) != 1)
 | 
			
		||||
	if (drm_dp_dpcd_read_data(&port->aux,
 | 
			
		||||
				  DP_DSC_SUPPORT, &endpoint_dsc, 1) < 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	if (drm_dp_dpcd_read(&port->aux,
 | 
			
		||||
	   DP_FEC_CAPABILITY, &endpoint_fec, 1) != 1)
 | 
			
		||||
	if (drm_dp_dpcd_read_data(&port->aux,
 | 
			
		||||
				  DP_FEC_CAPABILITY, &endpoint_fec, 1) < 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	if ((endpoint_dsc & DP_DSC_DECOMPRESSION_IS_SUPPORTED) &&
 | 
			
		||||
	   (endpoint_fec & DP_FEC_CAPABLE))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue