From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752207AbeEKQk1 (ORCPT ); Fri, 11 May 2018 12:40:27 -0400 Received: from mail-qk0-f194.google.com ([209.85.220.194]:38529 "EHLO mail-qk0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750950AbeEKQkY (ORCPT ); Fri, 11 May 2018 12:40:24 -0400 X-Google-Smtp-Source: AB8JxZpMnoMYQMuIoHyFWTEXIItvukpeksp1H4EIMc7zFE3dTA47TocOmDnIjMsksfNYhDJFMeGofETopVAFolCI02E= MIME-Version: 1.0 In-Reply-To: <1525861364-26323-1-git-send-email-hl@rock-chips.com> References: <1525861364-26323-1-git-send-email-hl@rock-chips.com> From: Enric Balletbo Serra Date: Fri, 11 May 2018 18:40:22 +0200 Message-ID: Subject: Re: [PATCH v2 1/4] drm/rockchip: add transfer function for cdn-dp To: Lin Huang Cc: Sean Paul , David Airlie , Chris Zhong , Doug Anderson , Brian Norris , "open list:ARM/Rockchip SoC..." , =?UTF-8?Q?Heiko_St=C3=BCbner?= , daniel.vetter@intel.com, jani.nikula@linux.intel.com, dri-devel , Linux ARM , linux-kernel Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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/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) > +/* > + * Returns the number of bytes transferred on success, or a negative error > + * code on failure. -ETIMEDOUT is returned if mailbox message not send success; nit: -ETIMEDOUT is returned if mailbox message was not sent successfully. > + */ > +ssize_t cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len) > { > u8 msg[5], reg[5]; > int ret; > @@ -247,24 +251,40 @@ int cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len) > goto err_dpcd_read; > > ret = cdn_dp_mailbox_read_receive(dp, data, len); > + if (!ret) > + return len; > > err_dpcd_read: > + DRM_DEV_ERROR(dp->dev, "dpcd read failed: %d\n", ret); > return ret; > } > > -int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value) > +#define CDN_AUX_HEADER_SIZE 5 > +#define CDN_AUX_MSG_SIZE 20 > +/* > + * Returns the number of bytes transferred on success, or a negative error > + * code on failure. -ETIMEDOUT is returned if mailbox message not send success; > + * -EINVAL is return if get the wrong data size after message send. nit: -ETIMEDOUT is returned if mailbox message was not sent successfully; -EINVAL is returned if you get the wrong data size after the message is sent. > + */ > +ssize_t cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len) > { > - u8 msg[6], reg[5]; > + u8 msg[CDN_AUX_MSG_SIZE + CDN_AUX_HEADER_SIZE]; > + u8 reg[CDN_AUX_HEADER_SIZE]; > int ret; > > - msg[0] = 0; > - msg[1] = 1; > + if (WARN_ON(len > CDN_AUX_MSG_SIZE) || WARN_ON(len <= 0)) > + return -EINVAL; > + > + msg[0] = (len >> 8) & 0xff; > + msg[1] = len & 0xff; > msg[2] = (addr >> 16) & 0xff; > msg[3] = (addr >> 8) & 0xff; > msg[4] = addr & 0xff; > - msg[5] = value; > + > + memcpy(msg + CDN_AUX_HEADER_SIZE, data, len); > + > ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_DPCD, > - sizeof(msg), msg); > + CDN_AUX_HEADER_SIZE + len, msg); > if (ret) > goto err_dpcd_write; > > @@ -277,8 +297,12 @@ int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value) > if (ret) > goto err_dpcd_write; > > - if (addr != (reg[2] << 16 | reg[3] << 8 | reg[4])) > + if ((len != (reg[0] << 8 | reg[1])) || > + (addr != (reg[2] << 16 | reg[3] << 8 | reg[4]))) { > ret = -EINVAL; > + } else { > + return len; > + } > > err_dpcd_write: > if (ret) > @@ -286,6 +310,33 @@ int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value) > return ret; > } > > +int cdn_dp_get_aux_status(struct cdn_dp_device *dp) > +{ > + u8 status; > + int ret; > + > + ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, > + DPTX_GET_LAST_AUX_STAUS, 0, NULL); > + if (ret) > + goto err_get_hpd; > + > + ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, > + DPTX_GET_LAST_AUX_STAUS, > + sizeof(status)); > + if (ret) > + goto err_get_hpd; > + > + ret = cdn_dp_mailbox_read_receive(dp, &status, sizeof(status)); > + if (ret) > + goto err_get_hpd; > + > + return status; > + > +err_get_hpd: > + DRM_DEV_ERROR(dp->dev, "get aux status failed: %d\n", ret); > + return ret; > +} > + > int cdn_dp_load_firmware(struct cdn_dp_device *dp, const u32 *i_mem, > u32 i_size, const u32 *d_mem, u32 d_size) > { > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.h b/drivers/gpu/drm/rockchip/cdn-dp-reg.h > index c4bbb4a83..6580b11 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-reg.h > +++ b/drivers/gpu/drm/rockchip/cdn-dp-reg.h > @@ -328,6 +328,13 @@ > #define GENERAL_BUS_SETTINGS 0x03 > #define GENERAL_TEST_ACCESS 0x04 > > +/* AUX status*/ > +#define AUX_STATUS_ACK 0 > +#define AUX_STATUS_NACK 1 > +#define AUX_STATUS_DEFER 2 > +#define AUX_STATUS_SINK_ERROR 3 > +#define AUX_STATUS_BUS_ERROR 4 > + > #define DPTX_SET_POWER_MNG 0x00 > #define DPTX_SET_HOST_CAPABILITIES 0x01 > #define DPTX_GET_EDID 0x02 > @@ -469,8 +476,11 @@ int cdn_dp_set_host_cap(struct cdn_dp_device *dp, u8 lanes, bool flip); > int cdn_dp_event_config(struct cdn_dp_device *dp); > u32 cdn_dp_get_event(struct cdn_dp_device *dp); > int cdn_dp_get_hpd_status(struct cdn_dp_device *dp); > -int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value); > -int cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len); > +ssize_t cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, > + u8 *data, u16 len); > +ssize_t cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, > + u8 *data, u16 len); > +int cdn_dp_get_aux_status(struct cdn_dp_device *dp); > int cdn_dp_get_edid_block(void *dp, u8 *edid, > unsigned int block, size_t length); > int cdn_dp_train_link(struct cdn_dp_device *dp); > -- > 2.7.4 > Apart from the two nits, the patch looks good to me and works. Reviewed-by: Enric Balletbo i Serra Thanks, Enric From mboxrd@z Thu Jan 1 00:00:00 1970 From: Enric Balletbo Serra Subject: Re: [PATCH v2 1/4] drm/rockchip: add transfer function for cdn-dp Date: Fri, 11 May 2018 18:40:22 +0200 Message-ID: References: <1525861364-26323-1-git-send-email-hl@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1525861364-26323-1-git-send-email-hl@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Lin Huang Cc: David Airlie , Brian Norris , Doug Anderson , linux-kernel , "open list:ARM/Rockchip SoC..." , dri-devel , Chris Zhong , daniel.vetter@intel.com, Linux ARM List-Id: linux-rockchip.vger.kernel.org SGkgTGluLAoKMjAxOC0wNS0wOSAxMjoyMiBHTVQrMDI6MDAgTGluIEh1YW5nIDxobEByb2NrLWNo aXBzLmNvbT46Cj4gRnJvbTogQ2hyaXMgWmhvbmcgPHp5d0Byb2NrLWNoaXBzLmNvbT4KPgo+IFdl IG1heSBzdXBwb3J0IHRyYWluaW5nIG91dHNpZGUgZmlybXdhcmUsIHNvIHdlIG5lZWQgc3VwcG9y dAo+IGRwY2QgcmVhZC93cml0ZSB0byBnZXQgdGhlIG1lc3NhZ2Ugb3IgZG8gc29tZSBzZXR0aW5n IHdpdGgKPiBkaXNwbGF5Lgo+Cj4gU2lnbmVkLW9mZi1ieTogQ2hyaXMgWmhvbmcgPHp5d0Byb2Nr LWNoaXBzLmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBMaW4gSHVhbmcgPGhsQHJvY2stY2hpcHMuY29t Pgo+IC0tLQo+Cj4gQ2hhbmdlcyBpbiB2MjoKPiAtIHVwZGF0ZSBwYXRjaCBmb2xsb3dpbmcgRW5y aWMgc3VnZ2VzdAo+Cj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtY29yZS5jIHwg NTUgKysrKysrKysrKysrKysrKysrKysrKysrLS0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2No aXAvY2RuLWRwLWNvcmUuaCB8ICAxICsKPiAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2Nkbi1k cC1yZWcuYyAgfCA2NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tCj4gIGRyaXZl cnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtcmVnLmggIHwgMTQgKysrKysrLQo+ICA0IGZpbGVz IGNoYW5nZWQsIDEyMCBpbnNlcnRpb25zKCspLCAxNyBkZWxldGlvbnMoLSkKPgo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvY2RuLWRwLWNvcmUuYyBiL2RyaXZlcnMvZ3B1 L2RybS9yb2NrY2hpcC9jZG4tZHAtY29yZS5jCj4gaW5kZXggYzZmYmRjZC4uY2NlNjRjMSAxMDA2 NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvY2RuLWRwLWNvcmUuYwo+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtY29yZS5jCj4gQEAgLTE3Niw4ICsxNzYs OCBAQCBzdGF0aWMgaW50IGNkbl9kcF9nZXRfc2lua19jb3VudChzdHJ1Y3QgY2RuX2RwX2Rldmlj ZSAqZHAsIHU4ICpzaW5rX2NvdW50KQo+ICAgICAgICAgdTggdmFsdWU7Cj4KPiAgICAgICAgICpz aW5rX2NvdW50ID0gMDsKPiAtICAgICAgIHJldCA9IGNkbl9kcF9kcGNkX3JlYWQoZHAsIERQX1NJ TktfQ09VTlQsICZ2YWx1ZSwgMSk7Cj4gLSAgICAgICBpZiAocmV0KQo+ICsgICAgICAgcmV0ID0g ZHJtX2RwX2RwY2RfcmVhZCgmZHAtPmF1eCwgRFBfU0lOS19DT1VOVCwgJnZhbHVlLCAxKTsKPiAr ICAgICAgIGlmIChyZXQgPCAwKQo+ICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+Cj4gICAg ICAgICAqc2lua19jb3VudCA9IERQX0dFVF9TSU5LX0NPVU5UKHZhbHVlKTsKPiBAQCAtMzc0LDkg KzM3NCw5IEBAIHN0YXRpYyBpbnQgY2RuX2RwX2dldF9zaW5rX2NhcGFiaWxpdHkoc3RydWN0IGNk bl9kcF9kZXZpY2UgKmRwKQo+ICAgICAgICAgaWYgKCFjZG5fZHBfY2hlY2tfc2lua19jb25uZWN0 aW9uKGRwKSkKPiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Cj4KPiAtICAgICAgIHJl dCA9IGNkbl9kcF9kcGNkX3JlYWQoZHAsIERQX0RQQ0RfUkVWLCBkcC0+ZHBjZCwKPiAtICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgRFBfUkVDRUlWRVJfQ0FQX1NJWkUpOwo+IC0gICAgICAg aWYgKHJldCkgewo+ICsgICAgICAgcmV0ID0gZHJtX2RwX2RwY2RfcmVhZCgmZHAtPmF1eCwgRFBf RFBDRF9SRVYsIGRwLT5kcGNkLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXpl b2YoZHAtPmRwY2QpKTsKPiArICAgICAgIGlmIChyZXQgPCAwKSB7Cj4gICAgICAgICAgICAgICAg IERSTV9ERVZfRVJST1IoZHAtPmRldiwgIkZhaWxlZCB0byBnZXQgY2FwcyAlZFxuIiwgcmV0KTsK PiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiAgICAgICAgIH0KPiBAQCAtNTgyLDggKzU4 Miw4IEBAIHN0YXRpYyBib29sIGNkbl9kcF9jaGVja19saW5rX3N0YXR1cyhzdHJ1Y3QgY2RuX2Rw X2RldmljZSAqZHApCj4gICAgICAgICBpZiAoIXBvcnQgfHwgIWRwLT5saW5rLnJhdGUgfHwgIWRw LT5saW5rLm51bV9sYW5lcykKPiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+Cj4gLSAg ICAgICBpZiAoY2RuX2RwX2RwY2RfcmVhZChkcCwgRFBfTEFORTBfMV9TVEFUVVMsIGxpbmtfc3Rh dHVzLAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRFBfTElOS19TVEFUVVNfU0laRSkp IHsKPiArICAgICAgIGlmIChkcm1fZHBfZHBjZF9yZWFkX2xpbmtfc3RhdHVzKCZkcC0+YXV4LCBs aW5rX3N0YXR1cykgIT0KPiArICAgICAgICAgICBEUF9MSU5LX1NUQVRVU19TSVpFKSB7Cj4gICAg ICAgICAgICAgICAgIERSTV9FUlJPUigiRmFpbGVkIHRvIGdldCBsaW5rIHN0YXR1c1xuIik7Cj4g ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPiAgICAgICAgIH0KPiBAQCAtMTAxMiw2ICsx MDEyLDQwIEBAIHN0YXRpYyBpbnQgY2RuX2RwX3BkX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9j ayAqbmIsCj4gICAgICAgICByZXR1cm4gTk9USUZZX0RPTkU7Cj4gIH0KPgo+ICtzdGF0aWMgc3Np emVfdCBjZG5fZHBfYXV4X3RyYW5zZmVyKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2RwX2F1eF9tc2cgKm1zZykK PiArewo+ICsgICAgICAgc3RydWN0IGNkbl9kcF9kZXZpY2UgKmRwID0gY29udGFpbmVyX29mKGF1 eCwgc3RydWN0IGNkbl9kcF9kZXZpY2UsIGF1eCk7Cj4gKyAgICAgICBpbnQgcmV0Owo+ICsgICAg ICAgdTggc3RhdHVzOwo+ICsKPiArICAgICAgIHN3aXRjaCAobXNnLT5yZXF1ZXN0ICYgfkRQX0FV WF9JMkNfTU9UKSB7Cj4gKyAgICAgICBjYXNlIERQX0FVWF9OQVRJVkVfV1JJVEU6Cj4gKyAgICAg ICBjYXNlIERQX0FVWF9JMkNfV1JJVEU6Cj4gKyAgICAgICBjYXNlIERQX0FVWF9JMkNfV1JJVEVf U1RBVFVTX1VQREFURToKPiArICAgICAgICAgICAgICAgcmV0ID0gY2RuX2RwX2RwY2Rfd3JpdGUo ZHAsIG1zZy0+YWRkcmVzcywgbXNnLT5idWZmZXIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG1zZy0+c2l6ZSk7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsg ICAgICAgY2FzZSBEUF9BVVhfTkFUSVZFX1JFQUQ6Cj4gKyAgICAgICBjYXNlIERQX0FVWF9JMkNf UkVBRDoKPiArICAgICAgICAgICAgICAgcmV0ID0gY2RuX2RwX2RwY2RfcmVhZChkcCwgbXNnLT5h ZGRyZXNzLCBtc2ctPmJ1ZmZlciwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBtc2ctPnNpemUpOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGRlZmF1 bHQ6Cj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ICsgICAgICAgfQo+ICsKPiAr ICAgICAgIHN0YXR1cyA9IGNkbl9kcF9nZXRfYXV4X3N0YXR1cyhkcCk7Cj4gKyAgICAgICBpZiAo c3RhdHVzID09IEFVWF9TVEFUVVNfQUNLKQo+ICsgICAgICAgICAgICAgICBtc2ctPnJlcGx5ID0g RFBfQVVYX05BVElWRV9SRVBMWV9BQ0s7Cj4gKyAgICAgICBlbHNlIGlmIChzdGF0dXMgPT0gQVVY X1NUQVRVU19OQUNLKQo+ICsgICAgICAgICAgICAgICBtc2ctPnJlcGx5ID0gRFBfQVVYX05BVElW RV9SRVBMWV9OQUNLOwo+ICsgICAgICAgZWxzZSBpZiAoc3RhdHVzID09IEFVWF9TVEFUVVNfREVG RVIpCj4gKyAgICAgICAgICAgICAgIG1zZy0+cmVwbHkgPSBEUF9BVVhfTkFUSVZFX1JFUExZX0RF RkVSOwo+ICsKPiArICAgICAgIHJldHVybiByZXQ7Cj4gK30KPiArCj4gIHN0YXRpYyBpbnQgY2Ru X2RwX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQg KmRhdGEpCj4gIHsKPiAgICAgICAgIHN0cnVjdCBjZG5fZHBfZGV2aWNlICpkcCA9IGRldl9nZXRf ZHJ2ZGF0YShkZXYpOwo+IEBAIC0xMDMwLDYgKzEwNjQsMTMgQEAgc3RhdGljIGludCBjZG5fZHBf YmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0 YSkKPiAgICAgICAgIGRwLT5hY3RpdmUgPSBmYWxzZTsKPiAgICAgICAgIGRwLT5hY3RpdmVfcG9y dCA9IC0xOwo+ICAgICAgICAgZHAtPmZ3X2xvYWRlZCA9IGZhbHNlOwo+ICsgICAgICAgZHAtPmF1 eC5uYW1lID0gIkRQLUFVWCI7Cj4gKyAgICAgICBkcC0+YXV4LnRyYW5zZmVyID0gY2RuX2RwX2F1 eF90cmFuc2ZlcjsKPiArICAgICAgIGRwLT5hdXguZGV2ID0gZGV2Owo+ICsKPiArICAgICAgIHJl dCA9IGRybV9kcF9hdXhfcmVnaXN0ZXIoJmRwLT5hdXgpOwo+ICsgICAgICAgaWYgKHJldCkKPiAr ICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPgo+ICAgICAgICAgSU5JVF9XT1JLKCZkcC0+ZXZl bnRfd29yaywgY2RuX2RwX3BkX2V2ZW50X3dvcmspOwo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtY29yZS5oIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L2Nkbi1kcC1jb3JlLmgKPiBpbmRleCBmNTdlMjk2Li40NjE1OWIyIDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtY29yZS5oCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL3JvY2tjaGlwL2Nkbi1kcC1jb3JlLmgKPiBAQCAtNzgsNiArNzgsNyBAQCBzdHJ1Y3QgY2Ru X2RwX2RldmljZSB7Cj4gICAgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdWRpb19wZGV2 Owo+ICAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGV2ZW50X3dvcms7Cj4gICAgICAgICBzdHJ1 Y3QgZWRpZCAqZWRpZDsKPiArICAgICAgIHN0cnVjdCBkcm1fZHBfYXV4IGF1eDsKPgo+ICAgICAg ICAgc3RydWN0IG11dGV4IGxvY2s7Cj4gICAgICAgICBib29sIGNvbm5lY3RlZDsKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2Nkbi1kcC1yZWcuYyBiL2RyaXZlcnMvZ3B1 L2RybS9yb2NrY2hpcC9jZG4tZHAtcmVnLmMKPiBpbmRleCBlYjMwNDJjLi5hZmRmZGEwIDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtcmVnLmMKPiArKysgYi9k cml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvY2RuLWRwLXJlZy5jCj4gQEAgLTIyMSw3ICsyMjEsMTEg QEAgc3RhdGljIGludCBjZG5fZHBfcmVnX3dyaXRlX2JpdChzdHJ1Y3QgY2RuX2RwX2RldmljZSAq ZHAsIHUxNiBhZGRyLAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9m KGZpZWxkKSwgZmllbGQpOwo+ICB9Cj4KPiAtaW50IGNkbl9kcF9kcGNkX3JlYWQoc3RydWN0IGNk bl9kcF9kZXZpY2UgKmRwLCB1MzIgYWRkciwgdTggKmRhdGEsIHUxNiBsZW4pCj4gKy8qCj4gKyAq IFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBvbiBzdWNjZXNzLCBvciBh IG5lZ2F0aXZlIGVycm9yCj4gKyAqIGNvZGUgb24gZmFpbHVyZS4gLUVUSU1FRE9VVCBpcyByZXR1 cm5lZCBpZiBtYWlsYm94IG1lc3NhZ2Ugbm90IHNlbmQgc3VjY2VzczsKCm5pdDogIC1FVElNRURP VVQgaXMgcmV0dXJuZWQgaWYgbWFpbGJveCBtZXNzYWdlIHdhcyBub3Qgc2VudCBzdWNjZXNzZnVs bHkuCgo+ICsgKi8KPiArc3NpemVfdCBjZG5fZHBfZHBjZF9yZWFkKHN0cnVjdCBjZG5fZHBfZGV2 aWNlICpkcCwgdTMyIGFkZHIsIHU4ICpkYXRhLCB1MTYgbGVuKQo+ICB7Cj4gICAgICAgICB1OCBt c2dbNV0sIHJlZ1s1XTsKPiAgICAgICAgIGludCByZXQ7Cj4gQEAgLTI0NywyNCArMjUxLDQwIEBA IGludCBjZG5fZHBfZHBjZF9yZWFkKHN0cnVjdCBjZG5fZHBfZGV2aWNlICpkcCwgdTMyIGFkZHIs IHU4ICpkYXRhLCB1MTYgbGVuKQo+ICAgICAgICAgICAgICAgICBnb3RvIGVycl9kcGNkX3JlYWQ7 Cj4KPiAgICAgICAgIHJldCA9IGNkbl9kcF9tYWlsYm94X3JlYWRfcmVjZWl2ZShkcCwgZGF0YSwg bGVuKTsKPiArICAgICAgIGlmICghcmV0KQo+ICsgICAgICAgICAgICAgICByZXR1cm4gbGVuOwo+ Cj4gIGVycl9kcGNkX3JlYWQ6Cj4gKyAgICAgICBEUk1fREVWX0VSUk9SKGRwLT5kZXYsICJkcGNk IHJlYWQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKPiAgICAgICAgIHJldHVybiByZXQ7Cj4gIH0KPgo+ IC1pbnQgY2RuX2RwX2RwY2Rfd3JpdGUoc3RydWN0IGNkbl9kcF9kZXZpY2UgKmRwLCB1MzIgYWRk ciwgdTggdmFsdWUpCj4gKyNkZWZpbmUgQ0ROX0FVWF9IRUFERVJfU0laRSAgICA1Cj4gKyNkZWZp bmUgQ0ROX0FVWF9NU0dfU0laRSAgICAgICAyMAo+ICsvKgo+ICsgKiBSZXR1cm5zIHRoZSBudW1i ZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvcgo+ ICsgKiBjb2RlIG9uIGZhaWx1cmUuIC1FVElNRURPVVQgaXMgcmV0dXJuZWQgaWYgbWFpbGJveCBt ZXNzYWdlIG5vdCBzZW5kIHN1Y2Nlc3M7Cj4gKyAqIC1FSU5WQUwgaXMgcmV0dXJuIGlmIGdldCB0 aGUgd3JvbmcgZGF0YSBzaXplIGFmdGVyIG1lc3NhZ2Ugc2VuZC4KCm5pdDoKCi1FVElNRURPVVQg aXMgcmV0dXJuZWQgaWYgbWFpbGJveCBtZXNzYWdlIHdhcyBub3Qgc2VudCBzdWNjZXNzZnVsbHk7 Ci1FSU5WQUwgaXMgcmV0dXJuZWQgaWYgeW91IGdldCB0aGUgd3JvbmcgZGF0YSBzaXplIGFmdGVy IHRoZSBtZXNzYWdlCmlzIHNlbnQuCgo+ICsgKi8KPiArc3NpemVfdCBjZG5fZHBfZHBjZF93cml0 ZShzdHJ1Y3QgY2RuX2RwX2RldmljZSAqZHAsIHUzMiBhZGRyLCB1OCAqZGF0YSwgdTE2IGxlbikK PiAgewo+IC0gICAgICAgdTggbXNnWzZdLCByZWdbNV07Cj4gKyAgICAgICB1OCBtc2dbQ0ROX0FV WF9NU0dfU0laRSArIENETl9BVVhfSEVBREVSX1NJWkVdOwo+ICsgICAgICAgdTggcmVnW0NETl9B VVhfSEVBREVSX1NJWkVdOwo+ICAgICAgICAgaW50IHJldDsKPgo+IC0gICAgICAgbXNnWzBdID0g MDsKPiAtICAgICAgIG1zZ1sxXSA9IDE7Cj4gKyAgICAgICBpZiAoV0FSTl9PTihsZW4gPiBDRE5f QVVYX01TR19TSVpFKSB8fCBXQVJOX09OKGxlbiA8PSAwKSkKPiArICAgICAgICAgICAgICAgcmV0 dXJuIC1FSU5WQUw7Cj4gKwo+ICsgICAgICAgbXNnWzBdID0gKGxlbiA+PiA4KSAmIDB4ZmY7Cj4g KyAgICAgICBtc2dbMV0gPSBsZW4gJiAweGZmOwo+ICAgICAgICAgbXNnWzJdID0gKGFkZHIgPj4g MTYpICYgMHhmZjsKPiAgICAgICAgIG1zZ1szXSA9IChhZGRyID4+IDgpICYgMHhmZjsKPiAgICAg ICAgIG1zZ1s0XSA9IGFkZHIgJiAweGZmOwo+IC0gICAgICAgbXNnWzVdID0gdmFsdWU7Cj4gKwo+ ICsgICAgICAgbWVtY3B5KG1zZyArIENETl9BVVhfSEVBREVSX1NJWkUsIGRhdGEsIGxlbik7Cj4g Kwo+ICAgICAgICAgcmV0ID0gY2RuX2RwX21haWxib3hfc2VuZChkcCwgTUJfTU9EVUxFX0lEX0RQ X1RYLCBEUFRYX1dSSVRFX0RQQ0QsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHNpemVvZihtc2cpLCBtc2cpOwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBD RE5fQVVYX0hFQURFUl9TSVpFICsgbGVuLCBtc2cpOwo+ICAgICAgICAgaWYgKHJldCkKPiAgICAg ICAgICAgICAgICAgZ290byBlcnJfZHBjZF93cml0ZTsKPgo+IEBAIC0yNzcsOCArMjk3LDEyIEBA IGludCBjZG5fZHBfZHBjZF93cml0ZShzdHJ1Y3QgY2RuX2RwX2RldmljZSAqZHAsIHUzMiBhZGRy LCB1OCB2YWx1ZSkKPiAgICAgICAgIGlmIChyZXQpCj4gICAgICAgICAgICAgICAgIGdvdG8gZXJy X2RwY2Rfd3JpdGU7Cj4KPiAtICAgICAgIGlmIChhZGRyICE9IChyZWdbMl0gPDwgMTYgfCByZWdb M10gPDwgOCB8IHJlZ1s0XSkpCj4gKyAgICAgICBpZiAoKGxlbiAhPSAocmVnWzBdIDw8IDggfCBy ZWdbMV0pKSB8fAo+ICsgICAgICAgICAgIChhZGRyICE9IChyZWdbMl0gPDwgMTYgfCByZWdbM10g PDwgOCB8IHJlZ1s0XSkpKSB7Cj4gICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7Cj4gKyAg ICAgICB9IGVsc2Ugewo+ICsgICAgICAgICAgICAgICByZXR1cm4gbGVuOwo+ICsgICAgICAgfQo+ Cj4gIGVycl9kcGNkX3dyaXRlOgo+ICAgICAgICAgaWYgKHJldCkKPiBAQCAtMjg2LDYgKzMxMCwz MyBAQCBpbnQgY2RuX2RwX2RwY2Rfd3JpdGUoc3RydWN0IGNkbl9kcF9kZXZpY2UgKmRwLCB1MzIg YWRkciwgdTggdmFsdWUpCj4gICAgICAgICByZXR1cm4gcmV0Owo+ICB9Cj4KPiAraW50IGNkbl9k cF9nZXRfYXV4X3N0YXR1cyhzdHJ1Y3QgY2RuX2RwX2RldmljZSAqZHApCj4gK3sKPiArICAgICAg IHU4IHN0YXR1czsKPiArICAgICAgIGludCByZXQ7Cj4gKwo+ICsgICAgICAgcmV0ID0gY2RuX2Rw X21haWxib3hfc2VuZChkcCwgTUJfTU9EVUxFX0lEX0RQX1RYLAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBEUFRYX0dFVF9MQVNUX0FVWF9TVEFVUywgMCwgTlVMTCk7Cj4gKyAg ICAgICBpZiAocmV0KQo+ICsgICAgICAgICAgICAgICBnb3RvIGVycl9nZXRfaHBkOwo+ICsKPiAr ICAgICAgIHJldCA9IGNkbl9kcF9tYWlsYm94X3ZhbGlkYXRlX3JlY2VpdmUoZHAsIE1CX01PRFVM RV9JRF9EUF9UWCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgRFBUWF9HRVRfTEFTVF9BVVhfU1RBVVMsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHNpemVvZihzdGF0dXMpKTsKPiArICAgICAgIGlmIChyZXQpCj4g KyAgICAgICAgICAgICAgIGdvdG8gZXJyX2dldF9ocGQ7Cj4gKwo+ICsgICAgICAgcmV0ID0gY2Ru X2RwX21haWxib3hfcmVhZF9yZWNlaXZlKGRwLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7Cj4g KyAgICAgICBpZiAocmV0KQo+ICsgICAgICAgICAgICAgICBnb3RvIGVycl9nZXRfaHBkOwo+ICsK PiArICAgICAgIHJldHVybiBzdGF0dXM7Cj4gKwo+ICtlcnJfZ2V0X2hwZDoKPiArICAgICAgIERS TV9ERVZfRVJST1IoZHAtPmRldiwgImdldCBhdXggc3RhdHVzIGZhaWxlZDogJWRcbiIsIHJldCk7 Cj4gKyAgICAgICByZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICBpbnQgY2RuX2RwX2xvYWRfZmlybXdh cmUoc3RydWN0IGNkbl9kcF9kZXZpY2UgKmRwLCBjb25zdCB1MzIgKmlfbWVtLAo+ICAgICAgICAg ICAgICAgICAgICAgICAgICB1MzIgaV9zaXplLCBjb25zdCB1MzIgKmRfbWVtLCB1MzIgZF9zaXpl KQo+ICB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtcmVn LmggYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvY2RuLWRwLXJlZy5oCj4gaW5kZXggYzRiYmI0 YTgzLi42NTgwYjExIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4t ZHAtcmVnLmgKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvY2RuLWRwLXJlZy5oCj4g QEAgLTMyOCw2ICszMjgsMTMgQEAKPiAgI2RlZmluZSBHRU5FUkFMX0JVU19TRVRUSU5HUyAgICAg ICAgICAgIDB4MDMKPiAgI2RlZmluZSBHRU5FUkFMX1RFU1RfQUNDRVNTICAgICAgICAgICAgIDB4 MDQKPgo+ICsvKiBBVVggc3RhdHVzKi8KPiArI2RlZmluZSBBVVhfU1RBVFVTX0FDSyAgICAgICAg ICAgICAgICAgMAo+ICsjZGVmaW5lIEFVWF9TVEFUVVNfTkFDSyAgICAgICAgICAgICAgICAgICAg ICAgIDEKPiArI2RlZmluZSBBVVhfU1RBVFVTX0RFRkVSICAgICAgICAgICAgICAgICAgICAgICAy Cj4gKyNkZWZpbmUgQVVYX1NUQVRVU19TSU5LX0VSUk9SICAgICAgICAgIDMKPiArI2RlZmluZSBB VVhfU1RBVFVTX0JVU19FUlJPUiAgICAgICAgICAgNAo+ICsKPiAgI2RlZmluZSBEUFRYX1NFVF9Q T1dFUl9NTkcgICAgICAgICAgICAgICAgICAgICAweDAwCj4gICNkZWZpbmUgRFBUWF9TRVRfSE9T VF9DQVBBQklMSVRJRVMgICAgICAgICAgICAgMHgwMQo+ICAjZGVmaW5lIERQVFhfR0VUX0VESUQg ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKPiBAQCAtNDY5LDggKzQ3NiwxMSBAQCBpbnQg Y2RuX2RwX3NldF9ob3N0X2NhcChzdHJ1Y3QgY2RuX2RwX2RldmljZSAqZHAsIHU4IGxhbmVzLCBi b29sIGZsaXApOwo+ICBpbnQgY2RuX2RwX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgY2RuX2RwX2Rldmlj ZSAqZHApOwo+ICB1MzIgY2RuX2RwX2dldF9ldmVudChzdHJ1Y3QgY2RuX2RwX2RldmljZSAqZHAp Owo+ICBpbnQgY2RuX2RwX2dldF9ocGRfc3RhdHVzKHN0cnVjdCBjZG5fZHBfZGV2aWNlICpkcCk7 Cj4gLWludCBjZG5fZHBfZHBjZF93cml0ZShzdHJ1Y3QgY2RuX2RwX2RldmljZSAqZHAsIHUzMiBh ZGRyLCB1OCB2YWx1ZSk7Cj4gLWludCBjZG5fZHBfZHBjZF9yZWFkKHN0cnVjdCBjZG5fZHBfZGV2 aWNlICpkcCwgdTMyIGFkZHIsIHU4ICpkYXRhLCB1MTYgbGVuKTsKPiArc3NpemVfdCBjZG5fZHBf ZHBjZF93cml0ZShzdHJ1Y3QgY2RuX2RwX2RldmljZSAqZHAsIHUzMiBhZGRyLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgdTggKmRhdGEsIHUxNiBsZW4pOwo+ICtzc2l6ZV90IGNkbl9kcF9k cGNkX3JlYWQoc3RydWN0IGNkbl9kcF9kZXZpY2UgKmRwLCB1MzIgYWRkciwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgdTggKmRhdGEsIHUxNiBsZW4pOwo+ICtpbnQgY2RuX2RwX2dldF9hdXhf c3RhdHVzKHN0cnVjdCBjZG5fZHBfZGV2aWNlICpkcCk7Cj4gIGludCBjZG5fZHBfZ2V0X2VkaWRf YmxvY2sodm9pZCAqZHAsIHU4ICplZGlkLAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5z aWduZWQgaW50IGJsb2NrLCBzaXplX3QgbGVuZ3RoKTsKPiAgaW50IGNkbl9kcF90cmFpbl9saW5r KHN0cnVjdCBjZG5fZHBfZGV2aWNlICpkcCk7Cj4gLS0KPiAyLjcuNAo+CgpBcGFydCBmcm9tIHRo ZSB0d28gbml0cywgdGhlIHBhdGNoIGxvb2tzIGdvb2QgdG8gbWUgYW5kIHdvcmtzLgoKUmV2aWV3 ZWQtYnk6IEVucmljIEJhbGxldGJvIGkgU2VycmEgPGVucmljLmJhbGxldGJvQGNvbGxhYm9yYS5j b20+CgpUaGFua3MsCiBFbnJpYwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVz a3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9k cmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: eballetbo@gmail.com (Enric Balletbo Serra) Date: Fri, 11 May 2018 18:40:22 +0200 Subject: [PATCH v2 1/4] drm/rockchip: add transfer function for cdn-dp In-Reply-To: <1525861364-26323-1-git-send-email-hl@rock-chips.com> References: <1525861364-26323-1-git-send-email-hl@rock-chips.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org 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/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) > +/* > + * Returns the number of bytes transferred on success, or a negative error > + * code on failure. -ETIMEDOUT is returned if mailbox message not send success; nit: -ETIMEDOUT is returned if mailbox message was not sent successfully. > + */ > +ssize_t cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len) > { > u8 msg[5], reg[5]; > int ret; > @@ -247,24 +251,40 @@ int cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len) > goto err_dpcd_read; > > ret = cdn_dp_mailbox_read_receive(dp, data, len); > + if (!ret) > + return len; > > err_dpcd_read: > + DRM_DEV_ERROR(dp->dev, "dpcd read failed: %d\n", ret); > return ret; > } > > -int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value) > +#define CDN_AUX_HEADER_SIZE 5 > +#define CDN_AUX_MSG_SIZE 20 > +/* > + * Returns the number of bytes transferred on success, or a negative error > + * code on failure. -ETIMEDOUT is returned if mailbox message not send success; > + * -EINVAL is return if get the wrong data size after message send. nit: -ETIMEDOUT is returned if mailbox message was not sent successfully; -EINVAL is returned if you get the wrong data size after the message is sent. > + */ > +ssize_t cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len) > { > - u8 msg[6], reg[5]; > + u8 msg[CDN_AUX_MSG_SIZE + CDN_AUX_HEADER_SIZE]; > + u8 reg[CDN_AUX_HEADER_SIZE]; > int ret; > > - msg[0] = 0; > - msg[1] = 1; > + if (WARN_ON(len > CDN_AUX_MSG_SIZE) || WARN_ON(len <= 0)) > + return -EINVAL; > + > + msg[0] = (len >> 8) & 0xff; > + msg[1] = len & 0xff; > msg[2] = (addr >> 16) & 0xff; > msg[3] = (addr >> 8) & 0xff; > msg[4] = addr & 0xff; > - msg[5] = value; > + > + memcpy(msg + CDN_AUX_HEADER_SIZE, data, len); > + > ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_DPCD, > - sizeof(msg), msg); > + CDN_AUX_HEADER_SIZE + len, msg); > if (ret) > goto err_dpcd_write; > > @@ -277,8 +297,12 @@ int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value) > if (ret) > goto err_dpcd_write; > > - if (addr != (reg[2] << 16 | reg[3] << 8 | reg[4])) > + if ((len != (reg[0] << 8 | reg[1])) || > + (addr != (reg[2] << 16 | reg[3] << 8 | reg[4]))) { > ret = -EINVAL; > + } else { > + return len; > + } > > err_dpcd_write: > if (ret) > @@ -286,6 +310,33 @@ int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value) > return ret; > } > > +int cdn_dp_get_aux_status(struct cdn_dp_device *dp) > +{ > + u8 status; > + int ret; > + > + ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, > + DPTX_GET_LAST_AUX_STAUS, 0, NULL); > + if (ret) > + goto err_get_hpd; > + > + ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX, > + DPTX_GET_LAST_AUX_STAUS, > + sizeof(status)); > + if (ret) > + goto err_get_hpd; > + > + ret = cdn_dp_mailbox_read_receive(dp, &status, sizeof(status)); > + if (ret) > + goto err_get_hpd; > + > + return status; > + > +err_get_hpd: > + DRM_DEV_ERROR(dp->dev, "get aux status failed: %d\n", ret); > + return ret; > +} > + > int cdn_dp_load_firmware(struct cdn_dp_device *dp, const u32 *i_mem, > u32 i_size, const u32 *d_mem, u32 d_size) > { > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.h b/drivers/gpu/drm/rockchip/cdn-dp-reg.h > index c4bbb4a83..6580b11 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-reg.h > +++ b/drivers/gpu/drm/rockchip/cdn-dp-reg.h > @@ -328,6 +328,13 @@ > #define GENERAL_BUS_SETTINGS 0x03 > #define GENERAL_TEST_ACCESS 0x04 > > +/* AUX status*/ > +#define AUX_STATUS_ACK 0 > +#define AUX_STATUS_NACK 1 > +#define AUX_STATUS_DEFER 2 > +#define AUX_STATUS_SINK_ERROR 3 > +#define AUX_STATUS_BUS_ERROR 4 > + > #define DPTX_SET_POWER_MNG 0x00 > #define DPTX_SET_HOST_CAPABILITIES 0x01 > #define DPTX_GET_EDID 0x02 > @@ -469,8 +476,11 @@ int cdn_dp_set_host_cap(struct cdn_dp_device *dp, u8 lanes, bool flip); > int cdn_dp_event_config(struct cdn_dp_device *dp); > u32 cdn_dp_get_event(struct cdn_dp_device *dp); > int cdn_dp_get_hpd_status(struct cdn_dp_device *dp); > -int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value); > -int cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len); > +ssize_t cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, > + u8 *data, u16 len); > +ssize_t cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, > + u8 *data, u16 len); > +int cdn_dp_get_aux_status(struct cdn_dp_device *dp); > int cdn_dp_get_edid_block(void *dp, u8 *edid, > unsigned int block, size_t length); > int cdn_dp_train_link(struct cdn_dp_device *dp); > -- > 2.7.4 > Apart from the two nits, the patch looks good to me and works. Reviewed-by: Enric Balletbo i Serra Thanks, Enric