Re: [PATCH v2 1/4] drm/rockchip: add transfer function for cdn-dp
Hi Lin, 2018-05-09 12:22 GMT+02:00 Lin Huang : > From: Chris Zhong > > We may support training outside firmware, so we need support > dpcd read/write to get the message or do some setting with > display. > > Signed-off-by: Chris Zhong > Signed-off-by: Lin Huang > --- > > Changes in v2: > - update patch following Enric suggest > > drivers/gpu/drm/rockchip/cdn-dp-core.c | 55 > drivers/gpu/drm/rockchip/cdn-dp-core.h | 1 + > drivers/gpu/drm/rockchip/cdn-dp-reg.c | 67 > ++ > drivers/gpu/drm/rockchip/cdn-dp-reg.h | 14 ++- > 4 files changed, 120 insertions(+), 17 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c > b/drivers/gpu/drm/rockchip/cdn-dp-core.c > index c6fbdcd..cce64c1 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c > +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c > @@ -176,8 +176,8 @@ static int cdn_dp_get_sink_count(struct cdn_dp_device > *dp, u8 *sink_count) > u8 value; > > *sink_count = 0; > - ret = cdn_dp_dpcd_read(dp, DP_SINK_COUNT, &value, 1); > - if (ret) > + ret = drm_dp_dpcd_read(&dp->aux, DP_SINK_COUNT, &value, 1); > + if (ret < 0) > return ret; > > *sink_count = DP_GET_SINK_COUNT(value); > @@ -374,9 +374,9 @@ static int cdn_dp_get_sink_capability(struct > cdn_dp_device *dp) > if (!cdn_dp_check_sink_connection(dp)) > return -ENODEV; > > - ret = cdn_dp_dpcd_read(dp, DP_DPCD_REV, dp->dpcd, > - DP_RECEIVER_CAP_SIZE); > - if (ret) { > + ret = drm_dp_dpcd_read(&dp->aux, DP_DPCD_REV, dp->dpcd, > + sizeof(dp->dpcd)); > + if (ret < 0) { > DRM_DEV_ERROR(dp->dev, "Failed to get caps %d\n", ret); > return ret; > } > @@ -582,8 +582,8 @@ static bool cdn_dp_check_link_status(struct cdn_dp_device > *dp) > if (!port || !dp->link.rate || !dp->link.num_lanes) > return false; > > - if (cdn_dp_dpcd_read(dp, DP_LANE0_1_STATUS, link_status, > -DP_LINK_STATUS_SIZE)) { > + if (drm_dp_dpcd_read_link_status(&dp->aux, link_status) != > + DP_LINK_STATUS_SIZE) { > DRM_ERROR("Failed to get link status\n"); > return false; > } > @@ -1012,6 +1012,40 @@ static int cdn_dp_pd_event(struct notifier_block *nb, > return NOTIFY_DONE; > } > > +static ssize_t cdn_dp_aux_transfer(struct drm_dp_aux *aux, > + struct drm_dp_aux_msg *msg) > +{ > + struct cdn_dp_device *dp = container_of(aux, struct cdn_dp_device, > aux); > + int ret; > + u8 status; > + > + switch (msg->request & ~DP_AUX_I2C_MOT) { > + case DP_AUX_NATIVE_WRITE: > + case DP_AUX_I2C_WRITE: > + case DP_AUX_I2C_WRITE_STATUS_UPDATE: > + ret = cdn_dp_dpcd_write(dp, msg->address, msg->buffer, > + msg->size); > + break; > + case DP_AUX_NATIVE_READ: > + case DP_AUX_I2C_READ: > + ret = cdn_dp_dpcd_read(dp, msg->address, msg->buffer, > + msg->size); > + break; > + default: > + return -EINVAL; > + } > + > + status = cdn_dp_get_aux_status(dp); > + if (status == AUX_STATUS_ACK) > + msg->reply = DP_AUX_NATIVE_REPLY_ACK; > + else if (status == AUX_STATUS_NACK) > + msg->reply = DP_AUX_NATIVE_REPLY_NACK; > + else if (status == AUX_STATUS_DEFER) > + msg->reply = DP_AUX_NATIVE_REPLY_DEFER; > + > + return ret; > +} > + > static int cdn_dp_bind(struct device *dev, struct device *master, void *data) > { > struct cdn_dp_device *dp = dev_get_drvdata(dev); > @@ -1030,6 +1064,13 @@ static int cdn_dp_bind(struct device *dev, struct > device *master, void *data) > dp->active = false; > dp->active_port = -1; > dp->fw_loaded = false; > + dp->aux.name = "DP-AUX"; > + dp->aux.transfer = cdn_dp_aux_transfer; > + dp->aux.dev = dev; > + > + ret = drm_dp_aux_register(&dp->aux); > + if (ret) > + return ret; > > INIT_WORK(&dp->event_work, cdn_dp_pd_event_work); > > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.h > b/drivers/gpu/drm/rockchip/cdn-dp-core.h > index f57e296..46159b2 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-core.h > +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.h > @@ -78,6 +78,7 @@ struct cdn_dp_device { > struct platform_device *audio_pdev; > struct work_struct event_work; > struct edid *edid; > + struct drm_dp_aux aux; > > struct mutex lock; > bool connected; > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.c > b/drivers/gpu/drm/rockchip/cdn-dp-reg.c > index eb3042c..afdfda0 100644 > --- a/drivers/gpu/drm/rockchip
Re: [PATCH v2 1/4] drm/rockchip: add transfer function for cdn-dp
On Wed, May 09, 2018 at 06:22:41PM +0800, Lin Huang wrote: > From: Chris Zhong > > We may support training outside firmware, so we need support > dpcd read/write to get the message or do some setting with > display. > > Signed-off-by: Chris Zhong > Signed-off-by: Lin Huang FTR, I've already done one pass at [1]. All of those nits look fixed, so Reviewed-by: Sean Paul [1]- https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/985572 > --- > > Changes in v2: > - update patch following Enric suggest > > drivers/gpu/drm/rockchip/cdn-dp-core.c | 55 > drivers/gpu/drm/rockchip/cdn-dp-core.h | 1 + > drivers/gpu/drm/rockchip/cdn-dp-reg.c | 67 > ++ > drivers/gpu/drm/rockchip/cdn-dp-reg.h | 14 ++- > 4 files changed, 120 insertions(+), 17 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c > b/drivers/gpu/drm/rockchip/cdn-dp-core.c > index c6fbdcd..cce64c1 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c > +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c > @@ -176,8 +176,8 @@ static int cdn_dp_get_sink_count(struct cdn_dp_device > *dp, u8 *sink_count) > u8 value; > > *sink_count = 0; > - ret = cdn_dp_dpcd_read(dp, DP_SINK_COUNT, &value, 1); > - if (ret) > + ret = drm_dp_dpcd_read(&dp->aux, DP_SINK_COUNT, &value, 1); > + if (ret < 0) > return ret; > > *sink_count = DP_GET_SINK_COUNT(value); > @@ -374,9 +374,9 @@ static int cdn_dp_get_sink_capability(struct > cdn_dp_device *dp) > if (!cdn_dp_check_sink_connection(dp)) > return -ENODEV; > > - ret = cdn_dp_dpcd_read(dp, DP_DPCD_REV, dp->dpcd, > -DP_RECEIVER_CAP_SIZE); > - if (ret) { > + ret = drm_dp_dpcd_read(&dp->aux, DP_DPCD_REV, dp->dpcd, > +sizeof(dp->dpcd)); > + if (ret < 0) { > DRM_DEV_ERROR(dp->dev, "Failed to get caps %d\n", ret); > return ret; > } > @@ -582,8 +582,8 @@ static bool cdn_dp_check_link_status(struct cdn_dp_device > *dp) > if (!port || !dp->link.rate || !dp->link.num_lanes) > return false; > > - if (cdn_dp_dpcd_read(dp, DP_LANE0_1_STATUS, link_status, > - DP_LINK_STATUS_SIZE)) { > + if (drm_dp_dpcd_read_link_status(&dp->aux, link_status) != > + DP_LINK_STATUS_SIZE) { > DRM_ERROR("Failed to get link status\n"); > return false; > } > @@ -1012,6 +1012,40 @@ static int cdn_dp_pd_event(struct notifier_block *nb, > return NOTIFY_DONE; > } > > +static ssize_t cdn_dp_aux_transfer(struct drm_dp_aux *aux, > +struct drm_dp_aux_msg *msg) > +{ > + struct cdn_dp_device *dp = container_of(aux, struct cdn_dp_device, aux); > + int ret; > + u8 status; > + > + switch (msg->request & ~DP_AUX_I2C_MOT) { > + case DP_AUX_NATIVE_WRITE: > + case DP_AUX_I2C_WRITE: > + case DP_AUX_I2C_WRITE_STATUS_UPDATE: > + ret = cdn_dp_dpcd_write(dp, msg->address, msg->buffer, > + msg->size); > + break; > + case DP_AUX_NATIVE_READ: > + case DP_AUX_I2C_READ: > + ret = cdn_dp_dpcd_read(dp, msg->address, msg->buffer, > +msg->size); > + break; > + default: > + return -EINVAL; > + } > + > + status = cdn_dp_get_aux_status(dp); > + if (status == AUX_STATUS_ACK) > + msg->reply = DP_AUX_NATIVE_REPLY_ACK; > + else if (status == AUX_STATUS_NACK) > + msg->reply = DP_AUX_NATIVE_REPLY_NACK; > + else if (status == AUX_STATUS_DEFER) > + msg->reply = DP_AUX_NATIVE_REPLY_DEFER; > + > + return ret; > +} > + > static int cdn_dp_bind(struct device *dev, struct device *master, void *data) > { > struct cdn_dp_device *dp = dev_get_drvdata(dev); > @@ -1030,6 +1064,13 @@ static int cdn_dp_bind(struct device *dev, struct > device *master, void *data) > dp->active = false; > dp->active_port = -1; > dp->fw_loaded = false; > + dp->aux.name = "DP-AUX"; > + dp->aux.transfer = cdn_dp_aux_transfer; > + dp->aux.dev = dev; > + > + ret = drm_dp_aux_register(&dp->aux); > + if (ret) > + return ret; > > INIT_WORK(&dp->event_work, cdn_dp_pd_event_work); > > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.h > b/drivers/gpu/drm/rockchip/cdn-dp-core.h > index f57e296..46159b2 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-core.h > +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.h > @@ -78,6 +78,7 @@ struct cdn_dp_device { > struct platform_device *audio_pdev; > struct work_struct event_work; > struct edid *edid; > + struct drm_dp_aux aux; > > struct mutex lock; > bool connected; > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.c > b/drivers/gpu/drm/rockchip/cdn
[PATCH v2 1/4] drm/rockchip: add transfer function for cdn-dp
From: Chris Zhong We may support training outside firmware, so we need support dpcd read/write to get the message or do some setting with display. Signed-off-by: Chris Zhong Signed-off-by: Lin Huang --- Changes in v2: - update patch following Enric suggest drivers/gpu/drm/rockchip/cdn-dp-core.c | 55 drivers/gpu/drm/rockchip/cdn-dp-core.h | 1 + drivers/gpu/drm/rockchip/cdn-dp-reg.c | 67 ++ drivers/gpu/drm/rockchip/cdn-dp-reg.h | 14 ++- 4 files changed, 120 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c index c6fbdcd..cce64c1 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c @@ -176,8 +176,8 @@ static int cdn_dp_get_sink_count(struct cdn_dp_device *dp, u8 *sink_count) u8 value; *sink_count = 0; - ret = cdn_dp_dpcd_read(dp, DP_SINK_COUNT, &value, 1); - if (ret) + ret = drm_dp_dpcd_read(&dp->aux, DP_SINK_COUNT, &value, 1); + if (ret < 0) return ret; *sink_count = DP_GET_SINK_COUNT(value); @@ -374,9 +374,9 @@ static int cdn_dp_get_sink_capability(struct cdn_dp_device *dp) if (!cdn_dp_check_sink_connection(dp)) return -ENODEV; - ret = cdn_dp_dpcd_read(dp, DP_DPCD_REV, dp->dpcd, - DP_RECEIVER_CAP_SIZE); - if (ret) { + ret = drm_dp_dpcd_read(&dp->aux, DP_DPCD_REV, dp->dpcd, + sizeof(dp->dpcd)); + if (ret < 0) { DRM_DEV_ERROR(dp->dev, "Failed to get caps %d\n", ret); return ret; } @@ -582,8 +582,8 @@ static bool cdn_dp_check_link_status(struct cdn_dp_device *dp) if (!port || !dp->link.rate || !dp->link.num_lanes) return false; - if (cdn_dp_dpcd_read(dp, DP_LANE0_1_STATUS, link_status, -DP_LINK_STATUS_SIZE)) { + if (drm_dp_dpcd_read_link_status(&dp->aux, link_status) != + DP_LINK_STATUS_SIZE) { DRM_ERROR("Failed to get link status\n"); return false; } @@ -1012,6 +1012,40 @@ static int cdn_dp_pd_event(struct notifier_block *nb, return NOTIFY_DONE; } +static ssize_t cdn_dp_aux_transfer(struct drm_dp_aux *aux, + struct drm_dp_aux_msg *msg) +{ + struct cdn_dp_device *dp = container_of(aux, struct cdn_dp_device, aux); + int ret; + u8 status; + + switch (msg->request & ~DP_AUX_I2C_MOT) { + case DP_AUX_NATIVE_WRITE: + case DP_AUX_I2C_WRITE: + case DP_AUX_I2C_WRITE_STATUS_UPDATE: + ret = cdn_dp_dpcd_write(dp, msg->address, msg->buffer, + msg->size); + break; + case DP_AUX_NATIVE_READ: + case DP_AUX_I2C_READ: + ret = cdn_dp_dpcd_read(dp, msg->address, msg->buffer, + msg->size); + break; + default: + return -EINVAL; + } + + status = cdn_dp_get_aux_status(dp); + if (status == AUX_STATUS_ACK) + msg->reply = DP_AUX_NATIVE_REPLY_ACK; + else if (status == AUX_STATUS_NACK) + msg->reply = DP_AUX_NATIVE_REPLY_NACK; + else if (status == AUX_STATUS_DEFER) + msg->reply = DP_AUX_NATIVE_REPLY_DEFER; + + return ret; +} + static int cdn_dp_bind(struct device *dev, struct device *master, void *data) { struct cdn_dp_device *dp = dev_get_drvdata(dev); @@ -1030,6 +1064,13 @@ static int cdn_dp_bind(struct device *dev, struct device *master, void *data) dp->active = false; dp->active_port = -1; dp->fw_loaded = false; + dp->aux.name = "DP-AUX"; + dp->aux.transfer = cdn_dp_aux_transfer; + dp->aux.dev = dev; + + ret = drm_dp_aux_register(&dp->aux); + if (ret) + return ret; INIT_WORK(&dp->event_work, cdn_dp_pd_event_work); diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.h b/drivers/gpu/drm/rockchip/cdn-dp-core.h index f57e296..46159b2 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.h +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.h @@ -78,6 +78,7 @@ struct cdn_dp_device { struct platform_device *audio_pdev; struct work_struct event_work; struct edid *edid; + struct drm_dp_aux aux; struct mutex lock; bool connected; diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.c b/drivers/gpu/drm/rockchip/cdn-dp-reg.c index eb3042c..afdfda0 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-reg.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-reg.c @@ -221,7 +221,11 @@ static int cdn_dp_reg_write_bit(struct cdn_dp_device *dp, u16 addr, sizeof(field), field); } -int cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len) +/* + * Return