From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753284AbeEKPBu (ORCPT ); Fri, 11 May 2018 11:01:50 -0400 Received: from mail-yb0-f194.google.com ([209.85.213.194]:45929 "EHLO mail-yb0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752997AbeEKPBt (ORCPT ); Fri, 11 May 2018 11:01:49 -0400 X-Google-Smtp-Source: AB8JxZqDgJsUjKEcJLYlFEBMoSDMcgZcdI3Y+ZrTnIatAZiPnZxv/DNLIZYBdIa2DDAyH5Dc6En+9g== Date: Fri, 11 May 2018 11:01:47 -0400 From: Sean Paul To: Lin Huang Cc: seanpaul@chromium.org, airlied@linux.ie, zyw@rock-chips.com, dianders@chromium.org, briannorris@chromium.org, linux-rockchip@lists.infradead.org, heiko@sntech.de, daniel.vetter@intel.com, jani.nikula@linux.intel.com, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, eballetbo@gmail.com Subject: Re: [PATCH v2 4/4] drm/rockchip: support dp training outside dp firmware Message-ID: <20180511150147.GQ33053@art_vandelay> References: <1525861364-26323-1-git-send-email-hl@rock-chips.com> <1525861364-26323-4-git-send-email-hl@rock-chips.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1525861364-26323-4-git-send-email-hl@rock-chips.com> User-Agent: Mutt/1.9.2 (2017-12-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, May 09, 2018 at 06:22:44PM +0800, Lin Huang wrote: > DP firmware uses fixed phy config values to do training, but some > boards need to adjust these values to fit for their unique hardware > design. So if the phy is using custom config values, do software > link training instead of relying on firmware, if software training > fail, keep firmware training as a fallback if sw training fails. > > Signed-off-by: Chris Zhong > Signed-off-by: Lin Huang FTR, I've previously reviewed this patch at https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/985573 > --- > Changes in v2: > - update patch following Enric suggest > > drivers/gpu/drm/rockchip/Makefile | 3 +- > drivers/gpu/drm/rockchip/cdn-dp-core.c | 24 +- > drivers/gpu/drm/rockchip/cdn-dp-core.h | 2 + > drivers/gpu/drm/rockchip/cdn-dp-link-training.c | 391 ++++++++++++++++++++++++ > drivers/gpu/drm/rockchip/cdn-dp-reg.c | 34 ++- > drivers/gpu/drm/rockchip/cdn-dp-reg.h | 38 ++- > 6 files changed, 479 insertions(+), 13 deletions(-) > create mode 100644 drivers/gpu/drm/rockchip/cdn-dp-link-training.c > /snip > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.h b/drivers/gpu/drm/rockchip/cdn-dp-core.h > index 46159b2..c6050ab 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-core.h > +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.h > @@ -84,6 +84,7 @@ struct cdn_dp_device { > bool connected; > bool active; > bool suspended; > + bool sw_training_success; Can you change this to use_fw_training instead? So it will be false if sw training succeeds, and true if sw training fails and needs to fallback to fw. > > const struct firmware *fw; /* cdn dp firmware */ > unsigned int fw_version; /* cdn fw version */ > @@ -106,6 +107,7 @@ struct cdn_dp_device { > u8 ports; > u8 lanes; > int active_port; > + u8 train_set[4]; > > u8 dpcd[DP_RECEIVER_CAP_SIZE]; > bool sink_has_audio; /snip > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.c b/drivers/gpu/drm/rockchip/cdn-dp-reg.c > index afdfda0..bd0aed5 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-reg.c > +++ b/drivers/gpu/drm/rockchip/cdn-dp-reg.c > @@ -17,7 +17,9 @@ > #include > #include > #include > +#include > #include > +#include > > #include "cdn-dp-core.h" > #include "cdn-dp-reg.h" > @@ -189,7 +191,7 @@ static int cdn_dp_mailbox_send(struct cdn_dp_device *dp, u8 module_id, > return 0; > } > > -static int cdn_dp_reg_write(struct cdn_dp_device *dp, u16 addr, u32 val) > +int cdn_dp_reg_write(struct cdn_dp_device *dp, u16 addr, u32 val) > { > u8 msg[6]; > > @@ -606,7 +608,35 @@ static int cdn_dp_get_training_status(struct cdn_dp_device *dp) > int cdn_dp_train_link(struct cdn_dp_device *dp) > { > int ret; > + struct cdn_dp_port *port = dp->port[dp->active_port]; > + struct rockchip_typec_phy *tcphy = phy_get_drvdata(port->phy); > > + /* > + * DP firmware uses fixed phy config values to do training, but some > + * boards need to adjust these values to fit for their unique hardware > + * design. So if the phy is using custom config values, do software > + * link training instead of relying on firmware, if software training > + * fail, keep firmware training as a fallback if sw training fails. > + */ > + if (tcphy->need_software_training) { As discussed in the downstream review, I'd rather default to sw training and fallback to fw training if we must. > + ret = cdn_dp_software_train_link(dp); > + if (ret) { > + DRM_DEV_ERROR(dp->dev, > + "Failed to do software training %d\n", ret); > + goto do_fw_training; > + } > + ret = cdn_dp_reg_write(dp, SOURCE_HDTX_CAR, 0xf); > + if (ret) { > + DRM_DEV_ERROR(dp->dev, > + "Failed to write SOURCE_HDTX_CAR register %d\n", ret); > + goto do_fw_training; > + } > + dp->sw_training_success = true; > + return 0; > + } > + > +do_fw_training: > + dp->sw_training_success = false; Can you please add a DRM_DEBUG_KMS log message here? > ret = cdn_dp_training_start(dp); > if (ret) { > DRM_DEV_ERROR(dp->dev, "Failed to start training %d\n", ret); > @@ -621,7 +651,7 @@ int cdn_dp_train_link(struct cdn_dp_device *dp) > > DRM_DEV_DEBUG_KMS(dp->dev, "rate:0x%x, lanes:%d\n", dp->link.rate, > dp->link.num_lanes); > - return ret; > + return 0; > } > > int cdn_dp_set_video_status(struct cdn_dp_device *dp, int active) > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.h b/drivers/gpu/drm/rockchip/cdn-dp-reg.h > index 6580b11..3420771 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-reg.h > +++ b/drivers/gpu/drm/rockchip/cdn-dp-reg.h > @@ -137,7 +137,7 @@ > #define HPD_EVENT_MASK 0x211c > #define HPD_EVENT_DET 0x2120 > > -/* dpyx framer addr */ > +/* dptx framer addr */ > #define DP_FRAMER_GLOBAL_CONFIG 0x2200 > #define DP_SW_RESET 0x2204 > #define DP_FRAMER_TU 0x2208 > @@ -431,6 +431,40 @@ > /* Reference cycles when using lane clock as reference */ > #define LANE_REF_CYC 0x8000 > > +/* register CM_VID_CTRL */ > +#define LANE_VID_REF_CYC(x) (((x) & (BIT(24) - 1)) << 0) > +#define NMVID_MEAS_TOLERANCE(x) (((x) & 0xf) << 24) > + > +/* register DP_TX_PHY_CONFIG_REG */ > +#define DP_TX_PHY_TRAINING_ENABLE(x) ((x) & 1) > +#define DP_TX_PHY_TRAINING_TYPE_PRBS7 (0 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_TPS1 (1 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_TPS2 (2 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_TPS3 (3 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_TPS4 (4 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_PLTPAT (5 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_D10_2 (6 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_HBR2CPAT (8 << 1) > +#define DP_TX_PHY_TRAINING_PATTERN(x) ((x) << 1) > +#define DP_TX_PHY_SCRAMBLER_BYPASS(x) (((x) & 1) << 5) > +#define DP_TX_PHY_ENCODER_BYPASS(x) (((x) & 1) << 6) > +#define DP_TX_PHY_SKEW_BYPASS(x) (((x) & 1) << 7) > +#define DP_TX_PHY_DISPARITY_RST(x) (((x) & 1) << 8) > +#define DP_TX_PHY_LANE0_SKEW(x) (((x) & 7) << 9) > +#define DP_TX_PHY_LANE1_SKEW(x) (((x) & 7) << 12) > +#define DP_TX_PHY_LANE2_SKEW(x) (((x) & 7) << 15) > +#define DP_TX_PHY_LANE3_SKEW(x) (((x) & 7) << 18) > +#define DP_TX_PHY_10BIT_ENABLE(x) (((x) & 1) << 21) > + > +/* register DP_FRAMER_GLOBAL_CONFIG */ > +#define NUM_LANES(x) ((x) & 3) > +#define SST_MODE (0 << 2) > +#define RG_EN (0 << 4) > +#define GLOBAL_EN BIT(3) > +#define NO_VIDEO BIT(5) > +#define ENC_RST_DIS BIT(6) > +#define WR_VHSYNC_FALL BIT(7) > + > enum voltage_swing_level { > VOLTAGE_LEVEL_0, > VOLTAGE_LEVEL_1, > @@ -476,6 +510,7 @@ 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_reg_write(struct cdn_dp_device *dp, u16 addr, u32 val); > 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, > @@ -489,4 +524,5 @@ int cdn_dp_config_video(struct cdn_dp_device *dp); > int cdn_dp_audio_stop(struct cdn_dp_device *dp, struct audio_info *audio); > int cdn_dp_audio_mute(struct cdn_dp_device *dp, bool enable); > int cdn_dp_audio_config(struct cdn_dp_device *dp, struct audio_info *audio); > +int cdn_dp_software_train_link(struct cdn_dp_device *dp); > #endif /* _CDN_DP_REG_H */ > -- > 2.7.4 > -- Sean Paul, Software Engineer, Google / Chromium OS From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sean Paul Subject: Re: [PATCH v2 4/4] drm/rockchip: support dp training outside dp firmware Date: Fri, 11 May 2018 11:01:47 -0400 Message-ID: <20180511150147.GQ33053@art_vandelay> References: <1525861364-26323-1-git-send-email-hl@rock-chips.com> <1525861364-26323-4-git-send-email-hl@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <1525861364-26323-4-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: airlied@linux.ie, briannorris@chromium.org, dianders@chromium.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org, zyw@rock-chips.com, daniel.vetter@intel.com, linux-arm-kernel@lists.infradead.org List-Id: linux-rockchip.vger.kernel.org T24gV2VkLCBNYXkgMDksIDIwMTggYXQgMDY6MjI6NDRQTSArMDgwMCwgTGluIEh1YW5nIHdyb3Rl Ogo+IERQIGZpcm13YXJlIHVzZXMgZml4ZWQgcGh5IGNvbmZpZyB2YWx1ZXMgdG8gZG8gdHJhaW5p bmcsIGJ1dCBzb21lCj4gYm9hcmRzIG5lZWQgdG8gYWRqdXN0IHRoZXNlIHZhbHVlcyB0byBmaXQg Zm9yIHRoZWlyIHVuaXF1ZSBoYXJkd2FyZQo+IGRlc2lnbi4gU28gaWYgdGhlIHBoeSBpcyB1c2lu ZyBjdXN0b20gY29uZmlnIHZhbHVlcywgZG8gc29mdHdhcmUKPiBsaW5rIHRyYWluaW5nIGluc3Rl YWQgb2YgcmVseWluZyBvbiBmaXJtd2FyZSwgaWYgc29mdHdhcmUgdHJhaW5pbmcKPiBmYWlsLCBr ZWVwIGZpcm13YXJlIHRyYWluaW5nIGFzIGEgZmFsbGJhY2sgaWYgc3cgdHJhaW5pbmcgZmFpbHMu Cj4gCj4gU2lnbmVkLW9mZi1ieTogQ2hyaXMgWmhvbmcgPHp5d0Byb2NrLWNoaXBzLmNvbT4KPiBT aWduZWQtb2ZmLWJ5OiBMaW4gSHVhbmcgPGhsQHJvY2stY2hpcHMuY29tPgoKRlRSLCBJJ3ZlIHBy ZXZpb3VzbHkgcmV2aWV3ZWQgdGhpcyBwYXRjaCBhdApodHRwczovL2Nocm9taXVtLXJldmlldy5n b29nbGVzb3VyY2UuY29tL2MvY2hyb21pdW1vcy90aGlyZF9wYXJ0eS9rZXJuZWwvKy85ODU1NzMK Cj4gLS0tCj4gQ2hhbmdlcyBpbiB2MjoKPiAtIHVwZGF0ZSBwYXRjaCBmb2xsb3dpbmcgRW5yaWMg c3VnZ2VzdAo+IAo+ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvTWFrZWZpbGUgICAgICAgICAg ICAgICB8ICAgMyArLQo+ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvY2RuLWRwLWNvcmUuYyAg ICAgICAgICB8ICAyNCArLQo+ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvY2RuLWRwLWNvcmUu aCAgICAgICAgICB8ICAgMiArCj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtbGlu ay10cmFpbmluZy5jIHwgMzkxICsrKysrKysrKysrKysrKysrKysrKysrKwo+ICBkcml2ZXJzL2dw dS9kcm0vcm9ja2NoaXAvY2RuLWRwLXJlZy5jICAgICAgICAgICB8ICAzNCArKy0KPiAgZHJpdmVy cy9ncHUvZHJtL3JvY2tjaGlwL2Nkbi1kcC1yZWcuaCAgICAgICAgICAgfCAgMzggKystCj4gIDYg ZmlsZXMgY2hhbmdlZCwgNDc5IGluc2VydGlvbnMoKyksIDEzIGRlbGV0aW9ucygtKQo+ICBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2Nkbi1kcC1saW5rLXRyYWlu aW5nLmMKPiAKCi9zbmlwCgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAv Y2RuLWRwLWNvcmUuaCBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtY29yZS5oCj4g aW5kZXggNDYxNTliMi4uYzYwNTBhYiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9j a2NoaXAvY2RuLWRwLWNvcmUuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4t ZHAtY29yZS5oCj4gQEAgLTg0LDYgKzg0LDcgQEAgc3RydWN0IGNkbl9kcF9kZXZpY2Ugewo+ICAJ Ym9vbCBjb25uZWN0ZWQ7Cj4gIAlib29sIGFjdGl2ZTsKPiAgCWJvb2wgc3VzcGVuZGVkOwo+ICsJ Ym9vbCBzd190cmFpbmluZ19zdWNjZXNzOwoKQ2FuIHlvdSBjaGFuZ2UgdGhpcyB0byB1c2VfZndf dHJhaW5pbmcgaW5zdGVhZD8gU28gaXQgd2lsbCBiZSBmYWxzZSBpZiBzdwp0cmFpbmluZyBzdWNj ZWVkcywgYW5kIHRydWUgaWYgc3cgdHJhaW5pbmcgZmFpbHMgYW5kIG5lZWRzIHRvIGZhbGxiYWNr IHRvIGZ3LgoKPiAgCj4gIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwkvKiBjZG4gZHAgZmly bXdhcmUgKi8KPiAgCXVuc2lnbmVkIGludCBmd192ZXJzaW9uOwkvKiBjZG4gZncgdmVyc2lvbiAq Lwo+IEBAIC0xMDYsNiArMTA3LDcgQEAgc3RydWN0IGNkbl9kcF9kZXZpY2Ugewo+ICAJdTggcG9y dHM7Cj4gIAl1OCBsYW5lczsKPiAgCWludCBhY3RpdmVfcG9ydDsKPiArCXU4IHRyYWluX3NldFs0 XTsKPiAgCj4gIAl1OCBkcGNkW0RQX1JFQ0VJVkVSX0NBUF9TSVpFXTsKPiAgCWJvb2wgc2lua19o YXNfYXVkaW87Cgovc25pcAoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L2Nkbi1kcC1yZWcuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtcmVnLmMKPiBp bmRleCBhZmRmZGEwLi5iZDBhZWQ1IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2Nr Y2hpcC9jZG4tZHAtcmVnLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvY2RuLWRw LXJlZy5jCj4gQEAgLTE3LDcgKzE3LDkgQEAKPiAgI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4g ICNpbmNsdWRlIDxsaW51eC9pby5oPgo+ICAjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4gKyNp bmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+Cj4gICNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgo+ICsj aW5jbHVkZSA8c29jL3JvY2tjaGlwL3JvY2tjaGlwX3BoeV90eXBlYy5oPgo+ICAKPiAgI2luY2x1 ZGUgImNkbi1kcC1jb3JlLmgiCj4gICNpbmNsdWRlICJjZG4tZHAtcmVnLmgiCj4gQEAgLTE4OSw3 ICsxOTEsNyBAQCBzdGF0aWMgaW50IGNkbl9kcF9tYWlsYm94X3NlbmQoc3RydWN0IGNkbl9kcF9k ZXZpY2UgKmRwLCB1OCBtb2R1bGVfaWQsCj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAKPiAtc3RhdGlj IGludCBjZG5fZHBfcmVnX3dyaXRlKHN0cnVjdCBjZG5fZHBfZGV2aWNlICpkcCwgdTE2IGFkZHIs IHUzMiB2YWwpCj4gK2ludCBjZG5fZHBfcmVnX3dyaXRlKHN0cnVjdCBjZG5fZHBfZGV2aWNlICpk cCwgdTE2IGFkZHIsIHUzMiB2YWwpCj4gIHsKPiAgCXU4IG1zZ1s2XTsKPiAgCj4gQEAgLTYwNiw3 ICs2MDgsMzUgQEAgc3RhdGljIGludCBjZG5fZHBfZ2V0X3RyYWluaW5nX3N0YXR1cyhzdHJ1Y3Qg Y2RuX2RwX2RldmljZSAqZHApCj4gIGludCBjZG5fZHBfdHJhaW5fbGluayhzdHJ1Y3QgY2RuX2Rw X2RldmljZSAqZHApCj4gIHsKPiAgCWludCByZXQ7Cj4gKwlzdHJ1Y3QgY2RuX2RwX3BvcnQgKnBv cnQgPSBkcC0+cG9ydFtkcC0+YWN0aXZlX3BvcnRdOwo+ICsJc3RydWN0IHJvY2tjaGlwX3R5cGVj X3BoeSAqdGNwaHkgPSBwaHlfZ2V0X2RydmRhdGEocG9ydC0+cGh5KTsKPiAgCj4gKwkvKgo+ICsJ ICogRFAgZmlybXdhcmUgdXNlcyBmaXhlZCBwaHkgY29uZmlnIHZhbHVlcyB0byBkbyB0cmFpbmlu ZywgYnV0IHNvbWUKPiArCSAqIGJvYXJkcyBuZWVkIHRvIGFkanVzdCB0aGVzZSB2YWx1ZXMgdG8g Zml0IGZvciB0aGVpciB1bmlxdWUgaGFyZHdhcmUKPiArCSAqIGRlc2lnbi4gU28gaWYgdGhlIHBo eSBpcyB1c2luZyBjdXN0b20gY29uZmlnIHZhbHVlcywgZG8gc29mdHdhcmUKPiArCSAqIGxpbmsg dHJhaW5pbmcgaW5zdGVhZCBvZiByZWx5aW5nIG9uIGZpcm13YXJlLCBpZiBzb2Z0d2FyZSB0cmFp bmluZwo+ICsJICogZmFpbCwga2VlcCBmaXJtd2FyZSB0cmFpbmluZyBhcyBhIGZhbGxiYWNrIGlm IHN3IHRyYWluaW5nIGZhaWxzLgo+ICsJICovCj4gKwlpZiAodGNwaHktPm5lZWRfc29mdHdhcmVf dHJhaW5pbmcpIHsKCkFzIGRpc2N1c3NlZCBpbiB0aGUgZG93bnN0cmVhbSByZXZpZXcsIEknZCBy YXRoZXIgZGVmYXVsdCB0byBzdyB0cmFpbmluZyBhbmQKZmFsbGJhY2sgdG8gZncgdHJhaW5pbmcg aWYgd2UgbXVzdC4KCj4gKwkJcmV0ID0gY2RuX2RwX3NvZnR3YXJlX3RyYWluX2xpbmsoZHApOwo+ ICsJCWlmIChyZXQpIHsKPiArCQkJRFJNX0RFVl9FUlJPUihkcC0+ZGV2LAo+ICsJCQkJIkZhaWxl ZCB0byBkbyBzb2Z0d2FyZSB0cmFpbmluZyAlZFxuIiwgcmV0KTsKPiArCQkJZ290byBkb19md190 cmFpbmluZzsKPiArCQl9Cj4gKwkJcmV0ID0gY2RuX2RwX3JlZ193cml0ZShkcCwgU09VUkNFX0hE VFhfQ0FSLCAweGYpOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJRFJNX0RFVl9FUlJPUihkcC0+ZGV2 LAo+ICsJCQkiRmFpbGVkIHRvIHdyaXRlIFNPVVJDRV9IRFRYX0NBUiByZWdpc3RlciAlZFxuIiwg cmV0KTsKPiArCQkJZ290byBkb19md190cmFpbmluZzsKPiArCQl9Cj4gKwkJZHAtPnN3X3RyYWlu aW5nX3N1Y2Nlc3MgPSB0cnVlOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArZG9fZndfdHJh aW5pbmc6Cj4gKwlkcC0+c3dfdHJhaW5pbmdfc3VjY2VzcyA9IGZhbHNlOwoKQ2FuIHlvdSBwbGVh c2UgYWRkIGEgRFJNX0RFQlVHX0tNUyBsb2cgbWVzc2FnZSBoZXJlPwoKPiAgCXJldCA9IGNkbl9k cF90cmFpbmluZ19zdGFydChkcCk7Cj4gIAlpZiAocmV0KSB7Cj4gIAkJRFJNX0RFVl9FUlJPUihk cC0+ZGV2LCAiRmFpbGVkIHRvIHN0YXJ0IHRyYWluaW5nICVkXG4iLCByZXQpOwo+IEBAIC02MjEs NyArNjUxLDcgQEAgaW50IGNkbl9kcF90cmFpbl9saW5rKHN0cnVjdCBjZG5fZHBfZGV2aWNlICpk cCkKPiAgCj4gIAlEUk1fREVWX0RFQlVHX0tNUyhkcC0+ZGV2LCAicmF0ZToweCV4LCBsYW5lczol ZFxuIiwgZHAtPmxpbmsucmF0ZSwKPiAgCQkJICBkcC0+bGluay5udW1fbGFuZXMpOwo+IC0JcmV0 dXJuIHJldDsKPiArCXJldHVybiAwOwo+ICB9Cj4gIAo+ICBpbnQgY2RuX2RwX3NldF92aWRlb19z dGF0dXMoc3RydWN0IGNkbl9kcF9kZXZpY2UgKmRwLCBpbnQgYWN0aXZlKQo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvY2RuLWRwLXJlZy5oIGIvZHJpdmVycy9ncHUvZHJt L3JvY2tjaGlwL2Nkbi1kcC1yZWcuaAo+IGluZGV4IDY1ODBiMTEuLjM0MjA3NzEgMTAwNjQ0Cj4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2Nkbi1kcC1yZWcuaAo+ICsrKyBiL2RyaXZl cnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtcmVnLmgKPiBAQCAtMTM3LDcgKzEzNyw3IEBACj4g ICNkZWZpbmUgSFBEX0VWRU5UX01BU0sJCQkweDIxMWMKPiAgI2RlZmluZSBIUERfRVZFTlRfREVU CQkJMHgyMTIwCj4gIAo+IC0vKiBkcHl4IGZyYW1lciBhZGRyICovCj4gKy8qIGRwdHggZnJhbWVy IGFkZHIgKi8KPiAgI2RlZmluZSBEUF9GUkFNRVJfR0xPQkFMX0NPTkZJRwkJMHgyMjAwCj4gICNk ZWZpbmUgRFBfU1dfUkVTRVQJCQkweDIyMDQKPiAgI2RlZmluZSBEUF9GUkFNRVJfVFUJCQkweDIy MDgKPiBAQCAtNDMxLDYgKzQzMSw0MCBAQAo+ICAvKiBSZWZlcmVuY2UgY3ljbGVzIHdoZW4gdXNp bmcgbGFuZSBjbG9jayBhcyByZWZlcmVuY2UgKi8KPiAgI2RlZmluZSBMQU5FX1JFRl9DWUMJCQkJ MHg4MDAwCj4gIAo+ICsvKiByZWdpc3RlciBDTV9WSURfQ1RSTCAqLwo+ICsjZGVmaW5lIExBTkVf VklEX1JFRl9DWUMoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgKEJJVCgyNCkgLSAxKSkg PDwgMCkKPiArI2RlZmluZSBOTVZJRF9NRUFTX1RPTEVSQU5DRSh4KSAgICAgICAgICAgICAgICAg ICAgICAgICgoKHgpICYgMHhmKSA8PCAyNCkKPiArCj4gKy8qIHJlZ2lzdGVyIERQX1RYX1BIWV9D T05GSUdfUkVHICovCj4gKyNkZWZpbmUgRFBfVFhfUEhZX1RSQUlOSU5HX0VOQUJMRSh4KSAgICAg ICAgICAgKCh4KSAmIDEpCj4gKyNkZWZpbmUgRFBfVFhfUEhZX1RSQUlOSU5HX1RZUEVfUFJCUzcg ICAgICAgICAgKDAgPDwgMSkKPiArI2RlZmluZSBEUF9UWF9QSFlfVFJBSU5JTkdfVFlQRV9UUFMx ICAgICAgICAgICAoMSA8PCAxKQo+ICsjZGVmaW5lIERQX1RYX1BIWV9UUkFJTklOR19UWVBFX1RQ UzIgICAgICAgICAgICgyIDw8IDEpCj4gKyNkZWZpbmUgRFBfVFhfUEhZX1RSQUlOSU5HX1RZUEVf VFBTMyAgICAgICAgICAgKDMgPDwgMSkKPiArI2RlZmluZSBEUF9UWF9QSFlfVFJBSU5JTkdfVFlQ RV9UUFM0ICAgICAgICAgICAoNCA8PCAxKQo+ICsjZGVmaW5lIERQX1RYX1BIWV9UUkFJTklOR19U WVBFX1BMVFBBVCAgICAgICAgICg1IDw8IDEpCj4gKyNkZWZpbmUgRFBfVFhfUEhZX1RSQUlOSU5H X1RZUEVfRDEwXzIgICAgICAgICAgKDYgPDwgMSkKPiArI2RlZmluZSBEUF9UWF9QSFlfVFJBSU5J TkdfVFlQRV9IQlIyQ1BBVCAgICAgICAoOCA8PCAxKQo+ICsjZGVmaW5lIERQX1RYX1BIWV9UUkFJ TklOR19QQVRURVJOKHgpICAgICAgICAgICgoeCkgPDwgMSkKPiArI2RlZmluZSBEUF9UWF9QSFlf U0NSQU1CTEVSX0JZUEFTUyh4KSAgICAgICAgICAoKCh4KSAmIDEpIDw8IDUpCj4gKyNkZWZpbmUg RFBfVFhfUEhZX0VOQ09ERVJfQllQQVNTKHgpICAgICAgICAgICAgKCgoeCkgJiAxKSA8PCA2KQo+ ICsjZGVmaW5lIERQX1RYX1BIWV9TS0VXX0JZUEFTUyh4KSAgICAgICAgICAgICAgICgoKHgpICYg MSkgPDwgNykKPiArI2RlZmluZSBEUF9UWF9QSFlfRElTUEFSSVRZX1JTVCh4KSAgICAgICAgICAg ICAoKCh4KSAmIDEpIDw8IDgpCj4gKyNkZWZpbmUgRFBfVFhfUEhZX0xBTkUwX1NLRVcoeCkgICAg ICAgICAgICAgICAgKCgoeCkgJiA3KSA8PCA5KQo+ICsjZGVmaW5lIERQX1RYX1BIWV9MQU5FMV9T S0VXKHgpICAgICAgICAgICAgICAgICgoKHgpICYgNykgPDwgMTIpCj4gKyNkZWZpbmUgRFBfVFhf UEhZX0xBTkUyX1NLRVcoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiA3KSA8PCAxNSkKPiArI2Rl ZmluZSBEUF9UWF9QSFlfTEFORTNfU0tFVyh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDcpIDw8 IDE4KQo+ICsjZGVmaW5lIERQX1RYX1BIWV8xMEJJVF9FTkFCTEUoeCkgICAgICAgICAgICAgICgo KHgpICYgMSkgPDwgMjEpCj4gKwo+ICsvKiByZWdpc3RlciBEUF9GUkFNRVJfR0xPQkFMX0NPTkZJ RyAqLwo+ICsjZGVmaW5lIE5VTV9MQU5FUyh4KSAgICAgICAgICAgKCh4KSAmIDMpCj4gKyNkZWZp bmUgU1NUX01PREUgICAgICAgICAgICAgICAoMCA8PCAyKQo+ICsjZGVmaW5lIFJHX0VOICAgICAg ICAgICAgICAgICAgKDAgPDwgNCkKPiArI2RlZmluZSBHTE9CQUxfRU4gICAgICAgICAgICAgIEJJ VCgzKQo+ICsjZGVmaW5lIE5PX1ZJREVPICAgICAgICAgICAgICAgQklUKDUpCj4gKyNkZWZpbmUg RU5DX1JTVF9ESVMgICAgICAgICAgICBCSVQoNikKPiArI2RlZmluZSBXUl9WSFNZTkNfRkFMTCAg ICAgICAgIEJJVCg3KQo+ICsKPiAgZW51bSB2b2x0YWdlX3N3aW5nX2xldmVsIHsKPiAgCVZPTFRB R0VfTEVWRUxfMCwKPiAgCVZPTFRBR0VfTEVWRUxfMSwKPiBAQCAtNDc2LDYgKzUxMCw3IEBAIGlu dCBjZG5fZHBfc2V0X2hvc3RfY2FwKHN0cnVjdCBjZG5fZHBfZGV2aWNlICpkcCwgdTggbGFuZXMs IGJvb2wgZmxpcCk7Cj4gIGludCBjZG5fZHBfZXZlbnRfY29uZmlnKHN0cnVjdCBjZG5fZHBfZGV2 aWNlICpkcCk7Cj4gIHUzMiBjZG5fZHBfZ2V0X2V2ZW50KHN0cnVjdCBjZG5fZHBfZGV2aWNlICpk cCk7Cj4gIGludCBjZG5fZHBfZ2V0X2hwZF9zdGF0dXMoc3RydWN0IGNkbl9kcF9kZXZpY2UgKmRw KTsKPiAraW50IGNkbl9kcF9yZWdfd3JpdGUoc3RydWN0IGNkbl9kcF9kZXZpY2UgKmRwLCB1MTYg YWRkciwgdTMyIHZhbCk7Cj4gIHNzaXplX3QgY2RuX2RwX2RwY2Rfd3JpdGUoc3RydWN0IGNkbl9k cF9kZXZpY2UgKmRwLCB1MzIgYWRkciwKPiAgCQkJICB1OCAqZGF0YSwgdTE2IGxlbik7Cj4gIHNz aXplX3QgY2RuX2RwX2RwY2RfcmVhZChzdHJ1Y3QgY2RuX2RwX2RldmljZSAqZHAsIHUzMiBhZGRy LAo+IEBAIC00ODksNCArNTI0LDUgQEAgaW50IGNkbl9kcF9jb25maWdfdmlkZW8oc3RydWN0IGNk bl9kcF9kZXZpY2UgKmRwKTsKPiAgaW50IGNkbl9kcF9hdWRpb19zdG9wKHN0cnVjdCBjZG5fZHBf ZGV2aWNlICpkcCwgc3RydWN0IGF1ZGlvX2luZm8gKmF1ZGlvKTsKPiAgaW50IGNkbl9kcF9hdWRp b19tdXRlKHN0cnVjdCBjZG5fZHBfZGV2aWNlICpkcCwgYm9vbCBlbmFibGUpOwo+ICBpbnQgY2Ru X2RwX2F1ZGlvX2NvbmZpZyhzdHJ1Y3QgY2RuX2RwX2RldmljZSAqZHAsIHN0cnVjdCBhdWRpb19p bmZvICphdWRpbyk7Cj4gK2ludCBjZG5fZHBfc29mdHdhcmVfdHJhaW5fbGluayhzdHJ1Y3QgY2Ru X2RwX2RldmljZSAqZHApOwo+ICAjZW5kaWYgLyogX0NETl9EUF9SRUdfSCAqLwo+IC0tIAo+IDIu Ny40Cj4gCgotLSAKU2VhbiBQYXVsLCBTb2Z0d2FyZSBFbmdpbmVlciwgR29vZ2xlIC8gQ2hyb21p dW0gT1MKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJp LWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBz Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: seanpaul@chromium.org (Sean Paul) Date: Fri, 11 May 2018 11:01:47 -0400 Subject: [PATCH v2 4/4] drm/rockchip: support dp training outside dp firmware In-Reply-To: <1525861364-26323-4-git-send-email-hl@rock-chips.com> References: <1525861364-26323-1-git-send-email-hl@rock-chips.com> <1525861364-26323-4-git-send-email-hl@rock-chips.com> Message-ID: <20180511150147.GQ33053@art_vandelay> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wed, May 09, 2018 at 06:22:44PM +0800, Lin Huang wrote: > DP firmware uses fixed phy config values to do training, but some > boards need to adjust these values to fit for their unique hardware > design. So if the phy is using custom config values, do software > link training instead of relying on firmware, if software training > fail, keep firmware training as a fallback if sw training fails. > > Signed-off-by: Chris Zhong > Signed-off-by: Lin Huang FTR, I've previously reviewed this patch at https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/985573 > --- > Changes in v2: > - update patch following Enric suggest > > drivers/gpu/drm/rockchip/Makefile | 3 +- > drivers/gpu/drm/rockchip/cdn-dp-core.c | 24 +- > drivers/gpu/drm/rockchip/cdn-dp-core.h | 2 + > drivers/gpu/drm/rockchip/cdn-dp-link-training.c | 391 ++++++++++++++++++++++++ > drivers/gpu/drm/rockchip/cdn-dp-reg.c | 34 ++- > drivers/gpu/drm/rockchip/cdn-dp-reg.h | 38 ++- > 6 files changed, 479 insertions(+), 13 deletions(-) > create mode 100644 drivers/gpu/drm/rockchip/cdn-dp-link-training.c > /snip > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.h b/drivers/gpu/drm/rockchip/cdn-dp-core.h > index 46159b2..c6050ab 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-core.h > +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.h > @@ -84,6 +84,7 @@ struct cdn_dp_device { > bool connected; > bool active; > bool suspended; > + bool sw_training_success; Can you change this to use_fw_training instead? So it will be false if sw training succeeds, and true if sw training fails and needs to fallback to fw. > > const struct firmware *fw; /* cdn dp firmware */ > unsigned int fw_version; /* cdn fw version */ > @@ -106,6 +107,7 @@ struct cdn_dp_device { > u8 ports; > u8 lanes; > int active_port; > + u8 train_set[4]; > > u8 dpcd[DP_RECEIVER_CAP_SIZE]; > bool sink_has_audio; /snip > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.c b/drivers/gpu/drm/rockchip/cdn-dp-reg.c > index afdfda0..bd0aed5 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-reg.c > +++ b/drivers/gpu/drm/rockchip/cdn-dp-reg.c > @@ -17,7 +17,9 @@ > #include > #include > #include > +#include > #include > +#include > > #include "cdn-dp-core.h" > #include "cdn-dp-reg.h" > @@ -189,7 +191,7 @@ static int cdn_dp_mailbox_send(struct cdn_dp_device *dp, u8 module_id, > return 0; > } > > -static int cdn_dp_reg_write(struct cdn_dp_device *dp, u16 addr, u32 val) > +int cdn_dp_reg_write(struct cdn_dp_device *dp, u16 addr, u32 val) > { > u8 msg[6]; > > @@ -606,7 +608,35 @@ static int cdn_dp_get_training_status(struct cdn_dp_device *dp) > int cdn_dp_train_link(struct cdn_dp_device *dp) > { > int ret; > + struct cdn_dp_port *port = dp->port[dp->active_port]; > + struct rockchip_typec_phy *tcphy = phy_get_drvdata(port->phy); > > + /* > + * DP firmware uses fixed phy config values to do training, but some > + * boards need to adjust these values to fit for their unique hardware > + * design. So if the phy is using custom config values, do software > + * link training instead of relying on firmware, if software training > + * fail, keep firmware training as a fallback if sw training fails. > + */ > + if (tcphy->need_software_training) { As discussed in the downstream review, I'd rather default to sw training and fallback to fw training if we must. > + ret = cdn_dp_software_train_link(dp); > + if (ret) { > + DRM_DEV_ERROR(dp->dev, > + "Failed to do software training %d\n", ret); > + goto do_fw_training; > + } > + ret = cdn_dp_reg_write(dp, SOURCE_HDTX_CAR, 0xf); > + if (ret) { > + DRM_DEV_ERROR(dp->dev, > + "Failed to write SOURCE_HDTX_CAR register %d\n", ret); > + goto do_fw_training; > + } > + dp->sw_training_success = true; > + return 0; > + } > + > +do_fw_training: > + dp->sw_training_success = false; Can you please add a DRM_DEBUG_KMS log message here? > ret = cdn_dp_training_start(dp); > if (ret) { > DRM_DEV_ERROR(dp->dev, "Failed to start training %d\n", ret); > @@ -621,7 +651,7 @@ int cdn_dp_train_link(struct cdn_dp_device *dp) > > DRM_DEV_DEBUG_KMS(dp->dev, "rate:0x%x, lanes:%d\n", dp->link.rate, > dp->link.num_lanes); > - return ret; > + return 0; > } > > int cdn_dp_set_video_status(struct cdn_dp_device *dp, int active) > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-reg.h b/drivers/gpu/drm/rockchip/cdn-dp-reg.h > index 6580b11..3420771 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-reg.h > +++ b/drivers/gpu/drm/rockchip/cdn-dp-reg.h > @@ -137,7 +137,7 @@ > #define HPD_EVENT_MASK 0x211c > #define HPD_EVENT_DET 0x2120 > > -/* dpyx framer addr */ > +/* dptx framer addr */ > #define DP_FRAMER_GLOBAL_CONFIG 0x2200 > #define DP_SW_RESET 0x2204 > #define DP_FRAMER_TU 0x2208 > @@ -431,6 +431,40 @@ > /* Reference cycles when using lane clock as reference */ > #define LANE_REF_CYC 0x8000 > > +/* register CM_VID_CTRL */ > +#define LANE_VID_REF_CYC(x) (((x) & (BIT(24) - 1)) << 0) > +#define NMVID_MEAS_TOLERANCE(x) (((x) & 0xf) << 24) > + > +/* register DP_TX_PHY_CONFIG_REG */ > +#define DP_TX_PHY_TRAINING_ENABLE(x) ((x) & 1) > +#define DP_TX_PHY_TRAINING_TYPE_PRBS7 (0 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_TPS1 (1 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_TPS2 (2 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_TPS3 (3 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_TPS4 (4 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_PLTPAT (5 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_D10_2 (6 << 1) > +#define DP_TX_PHY_TRAINING_TYPE_HBR2CPAT (8 << 1) > +#define DP_TX_PHY_TRAINING_PATTERN(x) ((x) << 1) > +#define DP_TX_PHY_SCRAMBLER_BYPASS(x) (((x) & 1) << 5) > +#define DP_TX_PHY_ENCODER_BYPASS(x) (((x) & 1) << 6) > +#define DP_TX_PHY_SKEW_BYPASS(x) (((x) & 1) << 7) > +#define DP_TX_PHY_DISPARITY_RST(x) (((x) & 1) << 8) > +#define DP_TX_PHY_LANE0_SKEW(x) (((x) & 7) << 9) > +#define DP_TX_PHY_LANE1_SKEW(x) (((x) & 7) << 12) > +#define DP_TX_PHY_LANE2_SKEW(x) (((x) & 7) << 15) > +#define DP_TX_PHY_LANE3_SKEW(x) (((x) & 7) << 18) > +#define DP_TX_PHY_10BIT_ENABLE(x) (((x) & 1) << 21) > + > +/* register DP_FRAMER_GLOBAL_CONFIG */ > +#define NUM_LANES(x) ((x) & 3) > +#define SST_MODE (0 << 2) > +#define RG_EN (0 << 4) > +#define GLOBAL_EN BIT(3) > +#define NO_VIDEO BIT(5) > +#define ENC_RST_DIS BIT(6) > +#define WR_VHSYNC_FALL BIT(7) > + > enum voltage_swing_level { > VOLTAGE_LEVEL_0, > VOLTAGE_LEVEL_1, > @@ -476,6 +510,7 @@ 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_reg_write(struct cdn_dp_device *dp, u16 addr, u32 val); > 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, > @@ -489,4 +524,5 @@ int cdn_dp_config_video(struct cdn_dp_device *dp); > int cdn_dp_audio_stop(struct cdn_dp_device *dp, struct audio_info *audio); > int cdn_dp_audio_mute(struct cdn_dp_device *dp, bool enable); > int cdn_dp_audio_config(struct cdn_dp_device *dp, struct audio_info *audio); > +int cdn_dp_software_train_link(struct cdn_dp_device *dp); > #endif /* _CDN_DP_REG_H */ > -- > 2.7.4 > -- Sean Paul, Software Engineer, Google / Chromium OS