Message ID | 20250117-drm-rework-dpcd-access-v1-6-7fc020e04dbc@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | drm/display: dp: add new DPCD access functions | expand |
Reviewed-by: Lyude Paul <lyude@redhat.com> On Fri, 2025-01-17 at 10:56 +0200, Dmitry Baryshkov wrote: > Switch drm_dp_mst_topology.c to use new set of DPCD read / write helpers. > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > --- > drivers/gpu/drm/display/drm_dp_mst_topology.c | 105 +++++++++++++------------- > 1 file changed, 51 insertions(+), 54 deletions(-) > > diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c > index f8db5be53a33e87e94b864ba48151354e091f5aa..1bd9fc0007d214f461ea5476c9f04bb5167e5af0 100644 > --- a/drivers/gpu/drm/display/drm_dp_mst_topology.c > +++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c > @@ -2189,15 +2189,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, > @@ -2733,14 +2730,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; > @@ -3618,7 +3614,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) > @@ -3673,10 +3669,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; > > @@ -3691,7 +3687,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; > > @@ -3757,8 +3753,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); > @@ -3807,18 +3803,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; > } > @@ -3877,8 +3873,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; > } > @@ -3916,9 +3912,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; > @@ -4867,9 +4863,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; > @@ -4958,23 +4954,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; > } > @@ -6098,14 +6095,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 */ > @@ -6143,8 +6140,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)) > @@ -6166,11 +6163,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)) >
diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c index f8db5be53a33e87e94b864ba48151354e091f5aa..1bd9fc0007d214f461ea5476c9f04bb5167e5af0 100644 --- a/drivers/gpu/drm/display/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c @@ -2189,15 +2189,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, @@ -2733,14 +2730,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; @@ -3618,7 +3614,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) @@ -3673,10 +3669,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; @@ -3691,7 +3687,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; @@ -3757,8 +3753,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); @@ -3807,18 +3803,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; } @@ -3877,8 +3873,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; } @@ -3916,9 +3912,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; @@ -4867,9 +4863,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; @@ -4958,23 +4954,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; } @@ -6098,14 +6095,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 */ @@ -6143,8 +6140,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)) @@ -6166,11 +6163,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))
Switch drm_dp_mst_topology.c to use new set of DPCD read / write helpers. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> --- drivers/gpu/drm/display/drm_dp_mst_topology.c | 105 +++++++++++++------------- 1 file changed, 51 insertions(+), 54 deletions(-)