From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751962AbcDRJ0M (ORCPT ); Mon, 18 Apr 2016 05:26:12 -0400 Received: from dougal.metanate.com ([90.155.101.14]:45483 "EHLO metanate.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751515AbcDRJ0K (ORCPT ); Mon, 18 Apr 2016 05:26:10 -0400 Date: Mon, 18 Apr 2016 10:25:38 +0100 From: John Keeping To: Mark Yao Cc: David Airlie , Heiko Stuebner , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] drm/rockchip: get rid of rockchip_drm_crtc_mode_config Message-ID: <20160418102538.0ed730ca.john@metanate.com> In-Reply-To: <1460948611-32259-1-git-send-email-mark.yao@rock-chips.com> References: <1460948611-32259-1-git-send-email-mark.yao@rock-chips.com> Organization: Metanate Ltd X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Mark, On Mon, 18 Apr 2016 11:03:31 +0800, Mark Yao wrote: > We need to take care of the vop status when use > rockchip_drm_crtc_mode_config, if vop is disabled, > the function would failed, that is terrible. > > Save connector type and output mode on drm_display_mode->private_flags > at encoder mode_fixup, then we can configure the type and mode safely > on crtc mode_set. Since Rockchip is atomic, shouldn't this be using atomic_check hooks and a subclassed crtc_state structure? > Signed-off-by: Mark Yao > --- > drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 37 +++++++--------- > drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 44 ++++++++++--------- > drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 5 +-- > drivers/gpu/drm/rockchip/inno_hdmi.c | 5 +-- > drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 2 - > drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 51 +++++++++-------------- > drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 6 +++ > 7 files changed, 69 insertions(+), 81 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > index a1d94d8..0344e52 100644 > --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > @@ -97,7 +97,21 @@ rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder, > const struct drm_display_mode *mode, > struct drm_display_mode *adjusted_mode) > { > - /* do nothing */ > + /* > + * FIXME(Yakir): driver should configure the CRTC output video > + * mode with the display information which indicated the monitor > + * support colorimetry. > + * > + * But don't know why the CRTC driver seems could only output the > + * RGBaaa rightly. For example, if connect the "innolux,n116bge" > + * eDP screen, EDID would indicated that screen only accepted the > + * 6bpc mode. But if I configure CRTC to RGB666 output, then eDP > + * screen would show a blue picture (RGB888 show a green picture). > + * But if I configure CTRC to RGBaaa, and eDP driver still keep > + * RGB666 input video mode, then screen would works prefect. > + */ > + adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(eDP, AAAA); > + > return true; > } > > @@ -114,27 +128,6 @@ static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder) > int ret; > u32 val; > > - /* > - * FIXME(Yakir): driver should configure the CRTC output video > - * mode with the display information which indicated the monitor > - * support colorimetry. > - * > - * But don't know why the CRTC driver seems could only output the > - * RGBaaa rightly. For example, if connect the "innolux,n116bge" > - * eDP screen, EDID would indicated that screen only accepted the > - * 6bpc mode. But if I configure CRTC to RGB666 output, then eDP > - * screen would show a blue picture (RGB888 show a green picture). > - * But if I configure CTRC to RGBaaa, and eDP driver still keep > - * RGB666 input video mode, then screen would works prefect. > - */ > - ret = rockchip_drm_crtc_mode_config(encoder->crtc, > - DRM_MODE_CONNECTOR_eDP, > - ROCKCHIP_OUT_MODE_AAAA); > - if (ret < 0) { > - dev_err(dp->dev, "Could not set crtc mode config (%d)\n", ret); > - return; > - } > - > ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); > if (ret < 0) > return; > diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > index 7975158..49c4c72 100644 > --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > @@ -875,11 +875,34 @@ static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder) > clk_disable_unprepare(dsi->pclk); > } > > +static bool dw_mipi_dsi_encoder_mode_fixup(struct drm_encoder *encoder, > + const struct drm_display_mode *mode, > + struct drm_display_mode *adjusted_mode) > +{ > + struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder); > + > + switch (dsi->format) { > + case MIPI_DSI_FMT_RGB888: > + adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(DSI, P888); > + break; > + case MIPI_DSI_FMT_RGB666: > + adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(DSI, P666); > + break; > + case MIPI_DSI_FMT_RGB565: > + adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(DSI, P565); > + break; > + default: > + WARN_ON(1); > + return false; > + } > + > + return true; > +} > + > static void dw_mipi_dsi_encoder_commit(struct drm_encoder *encoder) > { > struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder); > int mux = drm_of_encoder_active_endpoint_id(dsi->dev->of_node, encoder); > - u32 interface_pix_fmt; > u32 val; > > if (clk_prepare_enable(dsi->pclk)) { > @@ -895,24 +918,6 @@ static void dw_mipi_dsi_encoder_commit(struct drm_encoder *encoder) > > clk_disable_unprepare(dsi->pclk); > > - switch (dsi->format) { > - case MIPI_DSI_FMT_RGB888: > - interface_pix_fmt = ROCKCHIP_OUT_MODE_P888; > - break; > - case MIPI_DSI_FMT_RGB666: > - interface_pix_fmt = ROCKCHIP_OUT_MODE_P666; > - break; > - case MIPI_DSI_FMT_RGB565: > - interface_pix_fmt = ROCKCHIP_OUT_MODE_P565; > - break; > - default: > - WARN_ON(1); > - return; > - } > - > - rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_DSI, > - interface_pix_fmt); > - > if (mux) > val = DSI0_SEL_VOP_LIT | (DSI0_SEL_VOP_LIT << 16); > else > @@ -924,6 +929,7 @@ static void dw_mipi_dsi_encoder_commit(struct drm_encoder *encoder) > > static struct drm_encoder_helper_funcs > dw_mipi_dsi_encoder_helper_funcs = { > + .mode_fixup = dw_mipi_dsi_encoder_mode_fixup, > .commit = dw_mipi_dsi_encoder_commit, > .mode_set = dw_mipi_dsi_encoder_mode_set, > .disable = dw_mipi_dsi_encoder_disable, > diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > index d5cfef7..a72af30 100644 > --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > @@ -186,6 +186,8 @@ dw_hdmi_rockchip_encoder_mode_fixup(struct drm_encoder *encoder, > const struct drm_display_mode *mode, > struct drm_display_mode *adj_mode) > { > + adj_mode->private_flags = ROCKCHIP_DSP_MODE(HDMIA, AAAA); > + > return true; > } > > @@ -201,9 +203,6 @@ static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder) > u32 val; > int mux; > > - rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_HDMIA, > - ROCKCHIP_OUT_MODE_AAAA); > - > mux = drm_of_encoder_active_endpoint_id(hdmi->dev->of_node, encoder); > if (mux) > val = HDMI_SEL_VOP_LIT | (HDMI_SEL_VOP_LIT << 16); > diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c > index 10d62ff..ef6ad91 100644 > --- a/drivers/gpu/drm/rockchip/inno_hdmi.c > +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c > @@ -500,9 +500,6 @@ static void inno_hdmi_encoder_enable(struct drm_encoder *encoder) > { > struct inno_hdmi *hdmi = to_inno_hdmi(encoder); > > - rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_HDMIA, > - ROCKCHIP_OUT_MODE_P888); > - > inno_hdmi_set_pwr_mode(hdmi, NORMAL); > } > > @@ -517,6 +514,8 @@ static bool inno_hdmi_encoder_mode_fixup(struct drm_encoder *encoder, > const struct drm_display_mode *mode, > struct drm_display_mode *adj_mode) > { > + adj_mode->private_flags = ROCKCHIP_DSP_MODE(HDMIA, P888); > + > return true; > } > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > index 00d17d7..683210b 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > @@ -68,8 +68,6 @@ void rockchip_drm_atomic_work(struct work_struct *work); > int rockchip_register_crtc_funcs(struct drm_crtc *crtc, > const struct rockchip_crtc_funcs *crtc_funcs); > void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc); > -int rockchip_drm_crtc_mode_config(struct drm_crtc *crtc, int connector_type, > - int out_mode); > int rockchip_drm_dma_attach_device(struct drm_device *drm_dev, > struct device *dev); > void rockchip_drm_dma_detach_device(struct drm_device *drm_dev, > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > index a619f12..1a611cf 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > @@ -818,38 +818,6 @@ static const struct drm_plane_funcs vop_plane_funcs = { > .atomic_destroy_state = vop_atomic_plane_destroy_state, > }; > > -int rockchip_drm_crtc_mode_config(struct drm_crtc *crtc, > - int connector_type, > - int out_mode) > -{ > - struct vop *vop = to_vop(crtc); > - > - if (WARN_ON(!vop->is_enabled)) > - return -EINVAL; > - > - switch (connector_type) { > - case DRM_MODE_CONNECTOR_LVDS: > - VOP_CTRL_SET(vop, rgb_en, 1); > - break; > - case DRM_MODE_CONNECTOR_eDP: > - VOP_CTRL_SET(vop, edp_en, 1); > - break; > - case DRM_MODE_CONNECTOR_HDMIA: > - VOP_CTRL_SET(vop, hdmi_en, 1); > - break; > - case DRM_MODE_CONNECTOR_DSI: > - VOP_CTRL_SET(vop, mipi_en, 1); > - break; > - default: > - DRM_ERROR("unsupport connector_type[%d]\n", connector_type); > - return -EINVAL; > - }; > - VOP_CTRL_SET(vop, out_mode, out_mode); > - > - return 0; > -} > -EXPORT_SYMBOL_GPL(rockchip_drm_crtc_mode_config); > - > static int vop_crtc_enable_vblank(struct drm_crtc *crtc) > { > struct vop *vop = to_vop(crtc); > @@ -943,6 +911,8 @@ static void vop_crtc_enable(struct drm_crtc *crtc) > u16 vact_st = adjusted_mode->vtotal - adjusted_mode->vsync_start; > u16 vact_end = vact_st + vdisplay; > uint32_t val; > + int type = ROCKCHIP_OUT_MODE_TYPE(adjusted_mode->private_flags); > + int out_mode = ROCKCHIP_OUT_MODE(adjusted_mode->private_flags); > > vop_enable(crtc); > /* > @@ -985,6 +955,23 @@ static void vop_crtc_enable(struct drm_crtc *crtc) > val |= (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : 1; > val |= (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : (1 << 1); > VOP_CTRL_SET(vop, pin_pol, val); > + switch (type) { > + case DRM_MODE_CONNECTOR_LVDS: > + VOP_CTRL_SET(vop, rgb_en, 1); > + break; > + case DRM_MODE_CONNECTOR_eDP: > + VOP_CTRL_SET(vop, edp_en, 1); > + break; > + case DRM_MODE_CONNECTOR_HDMIA: > + VOP_CTRL_SET(vop, hdmi_en, 1); > + break; > + case DRM_MODE_CONNECTOR_DSI: > + VOP_CTRL_SET(vop, mipi_en, 1); > + break; > + default: > + DRM_ERROR("unsupport connector_type[%d]\n", type); > + } > + VOP_CTRL_SET(vop, out_mode, out_mode); > > VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len); > val = hact_st << 16; > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h > index 071ff0b..4c63a66 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h > @@ -183,6 +183,12 @@ struct vop_data { > /* for use special outface */ > #define ROCKCHIP_OUT_MODE_AAAA 15 > > +#define ROCKCHIP_OUT_MODE_TYPE(x) ((x) >> 16) > +#define ROCKCHIP_OUT_MODE(x) ((x) & 0xffff) > +#define ROCKCHIP_DSP_MODE(type, mode) \ > + ((DRM_MODE_CONNECTOR_##type << 16) | \ > + (ROCKCHIP_OUT_MODE_##mode & 0xffff)) > + > enum alpha_mode { > ALPHA_STRAIGHT, > ALPHA_INVERSE, From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Keeping Subject: Re: [PATCH] drm/rockchip: get rid of rockchip_drm_crtc_mode_config Date: Mon, 18 Apr 2016 10:25:38 +0100 Message-ID: <20160418102538.0ed730ca.john@metanate.com> References: <1460948611-32259-1-git-send-email-mark.yao@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1460948611-32259-1-git-send-email-mark.yao@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: Mark Yao Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org List-Id: linux-rockchip.vger.kernel.org SGkgTWFyaywKCk9uIE1vbiwgMTggQXByIDIwMTYgMTE6MDM6MzEgKzA4MDAsIE1hcmsgWWFvIHdy b3RlOgoKPiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiB0aGUgdm9wIHN0YXR1cyB3aGVuIHVzZQo+ IHJvY2tjaGlwX2RybV9jcnRjX21vZGVfY29uZmlnLCBpZiB2b3AgaXMgZGlzYWJsZWQsCj4gdGhl IGZ1bmN0aW9uIHdvdWxkIGZhaWxlZCwgdGhhdCBpcyB0ZXJyaWJsZS4KPiAKPiBTYXZlIGNvbm5l Y3RvciB0eXBlIGFuZCBvdXRwdXQgbW9kZSBvbiBkcm1fZGlzcGxheV9tb2RlLT5wcml2YXRlX2Zs YWdzCj4gYXQgZW5jb2RlciBtb2RlX2ZpeHVwLCB0aGVuIHdlIGNhbiBjb25maWd1cmUgdGhlIHR5 cGUgYW5kIG1vZGUgc2FmZWx5Cj4gb24gY3J0YyBtb2RlX3NldC4KClNpbmNlIFJvY2tjaGlwIGlz IGF0b21pYywgc2hvdWxkbid0IHRoaXMgYmUgdXNpbmcgYXRvbWljX2NoZWNrIGhvb2tzIGFuZAph IHN1YmNsYXNzZWQgY3J0Y19zdGF0ZSBzdHJ1Y3R1cmU/Cgo+IFNpZ25lZC1vZmYtYnk6IE1hcmsg WWFvIDxtYXJrLnlhb0Byb2NrLWNoaXBzLmNvbT4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJtL3Jv Y2tjaGlwL2FuYWxvZ2l4X2RwLXJvY2tjaGlwLmMgfCAgIDM3ICsrKysrKystLS0tLS0tLS0KPiAg ZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3LW1pcGktZHNpLmMgICAgICAgICAgfCAgIDQ0ICsr KysrKysrKystLS0tLS0tLS0KPiAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3X2hkbWktcm9j a2NoaXAuYyAgICAgfCAgICA1ICstLQo+ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvaW5ub19o ZG1pLmMgICAgICAgICAgICB8ICAgIDUgKy0tCj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9y b2NrY2hpcF9kcm1fZHJ2LmggICAgIHwgICAgMiAtCj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hp cC9yb2NrY2hpcF9kcm1fdm9wLmMgICAgIHwgICA1MSArKysrKysrKystLS0tLS0tLS0tLS0tLQo+ ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5oICAgICB8ICAgIDYg KysrCj4gIDcgZmlsZXMgY2hhbmdlZCwgNjkgaW5zZXJ0aW9ucygrKSwgODEgZGVsZXRpb25zKC0p Cj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9hbmFsb2dpeF9kcC1y b2NrY2hpcC5jIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2FuYWxvZ2l4X2RwLXJvY2tjaGlw LmMKPiBpbmRleCBhMWQ5NGQ4Li4wMzQ0ZTUyIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2Ry bS9yb2NrY2hpcC9hbmFsb2dpeF9kcC1yb2NrY2hpcC5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L3JvY2tjaGlwL2FuYWxvZ2l4X2RwLXJvY2tjaGlwLmMKPiBAQCAtOTcsNyArOTcsMjEgQEAgcm9j a2NoaXBfZHBfZHJtX2VuY29kZXJfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29k ZXIsCj4gIAkJCQkgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiAgCQkJ CSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQo+ICB7Cj4gLQkvKiBk byBub3RoaW5nICovCj4gKwkvKgo+ICsJICogRklYTUUoWWFraXIpOiBkcml2ZXIgc2hvdWxkIGNv bmZpZ3VyZSB0aGUgQ1JUQyBvdXRwdXQgdmlkZW8KPiArCSAqIG1vZGUgd2l0aCB0aGUgZGlzcGxh eSBpbmZvcm1hdGlvbiB3aGljaCBpbmRpY2F0ZWQgdGhlIG1vbml0b3IKPiArCSAqIHN1cHBvcnQg Y29sb3JpbWV0cnkuCj4gKwkgKgo+ICsJICogQnV0IGRvbid0IGtub3cgd2h5IHRoZSBDUlRDIGRy aXZlciBzZWVtcyBjb3VsZCBvbmx5IG91dHB1dCB0aGUKPiArCSAqIFJHQmFhYSByaWdodGx5LiBG b3IgZXhhbXBsZSwgaWYgY29ubmVjdCB0aGUgImlubm9sdXgsbjExNmJnZSIKPiArCSAqIGVEUCBz Y3JlZW4sIEVESUQgd291bGQgaW5kaWNhdGVkIHRoYXQgc2NyZWVuIG9ubHkgYWNjZXB0ZWQgdGhl Cj4gKwkgKiA2YnBjIG1vZGUuIEJ1dCBpZiBJIGNvbmZpZ3VyZSBDUlRDIHRvIFJHQjY2NiBvdXRw dXQsIHRoZW4gZURQCj4gKwkgKiBzY3JlZW4gd291bGQgc2hvdyBhIGJsdWUgcGljdHVyZSAoUkdC ODg4IHNob3cgYSBncmVlbiBwaWN0dXJlKS4KPiArCSAqIEJ1dCBpZiBJIGNvbmZpZ3VyZSBDVFJD IHRvIFJHQmFhYSwgYW5kIGVEUCBkcml2ZXIgc3RpbGwga2VlcAo+ICsJICogUkdCNjY2IGlucHV0 IHZpZGVvIG1vZGUsIHRoZW4gc2NyZWVuIHdvdWxkIHdvcmtzIHByZWZlY3QuCj4gKwkgKi8KPiAr CWFkanVzdGVkX21vZGUtPnByaXZhdGVfZmxhZ3MgPSBST0NLQ0hJUF9EU1BfTU9ERShlRFAsIEFB QUEpOwo+ICsKPiAgCXJldHVybiB0cnVlOwo+ICB9Cj4gIAo+IEBAIC0xMTQsMjcgKzEyOCw2IEBA IHN0YXRpYyB2b2lkIHJvY2tjaGlwX2RwX2RybV9lbmNvZGVyX2VuYWJsZShzdHJ1Y3QgZHJtX2Vu Y29kZXIgKmVuY29kZXIpCj4gIAlpbnQgcmV0Owo+ICAJdTMyIHZhbDsKPiAgCj4gLQkvKgo+IC0J ICogRklYTUUoWWFraXIpOiBkcml2ZXIgc2hvdWxkIGNvbmZpZ3VyZSB0aGUgQ1JUQyBvdXRwdXQg dmlkZW8KPiAtCSAqIG1vZGUgd2l0aCB0aGUgZGlzcGxheSBpbmZvcm1hdGlvbiB3aGljaCBpbmRp Y2F0ZWQgdGhlIG1vbml0b3IKPiAtCSAqIHN1cHBvcnQgY29sb3JpbWV0cnkuCj4gLQkgKgo+IC0J ICogQnV0IGRvbid0IGtub3cgd2h5IHRoZSBDUlRDIGRyaXZlciBzZWVtcyBjb3VsZCBvbmx5IG91 dHB1dCB0aGUKPiAtCSAqIFJHQmFhYSByaWdodGx5LiBGb3IgZXhhbXBsZSwgaWYgY29ubmVjdCB0 aGUgImlubm9sdXgsbjExNmJnZSIKPiAtCSAqIGVEUCBzY3JlZW4sIEVESUQgd291bGQgaW5kaWNh dGVkIHRoYXQgc2NyZWVuIG9ubHkgYWNjZXB0ZWQgdGhlCj4gLQkgKiA2YnBjIG1vZGUuIEJ1dCBp ZiBJIGNvbmZpZ3VyZSBDUlRDIHRvIFJHQjY2NiBvdXRwdXQsIHRoZW4gZURQCj4gLQkgKiBzY3Jl ZW4gd291bGQgc2hvdyBhIGJsdWUgcGljdHVyZSAoUkdCODg4IHNob3cgYSBncmVlbiBwaWN0dXJl KS4KPiAtCSAqIEJ1dCBpZiBJIGNvbmZpZ3VyZSBDVFJDIHRvIFJHQmFhYSwgYW5kIGVEUCBkcml2 ZXIgc3RpbGwga2VlcAo+IC0JICogUkdCNjY2IGlucHV0IHZpZGVvIG1vZGUsIHRoZW4gc2NyZWVu IHdvdWxkIHdvcmtzIHByZWZlY3QuCj4gLQkgKi8KPiAtCXJldCA9IHJvY2tjaGlwX2RybV9jcnRj X21vZGVfY29uZmlnKGVuY29kZXItPmNydGMsCj4gLQkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RP Ul9lRFAsCj4gLQkJCQkJICAgIFJPQ0tDSElQX09VVF9NT0RFX0FBQUEpOwo+IC0JaWYgKHJldCA8 IDApIHsKPiAtCQlkZXZfZXJyKGRwLT5kZXYsICJDb3VsZCBub3Qgc2V0IGNydGMgbW9kZSBjb25m aWcgKCVkKVxuIiwgcmV0KTsKPiAtCQlyZXR1cm47Cj4gLQl9Cj4gLQo+ICAJcmV0ID0gZHJtX29m X2VuY29kZXJfYWN0aXZlX2VuZHBvaW50X2lkKGRwLT5kZXYtPm9mX25vZGUsIGVuY29kZXIpOwo+ ICAJaWYgKHJldCA8IDApCj4gIAkJcmV0dXJuOwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vcm9ja2NoaXAvZHctbWlwaS1kc2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9kdy1t aXBpLWRzaS5jCj4gaW5kZXggNzk3NTE1OC4uNDljNGM3MiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L2dwdS9kcm0vcm9ja2NoaXAvZHctbWlwaS1kc2kuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9y b2NrY2hpcC9kdy1taXBpLWRzaS5jCj4gQEAgLTg3NSwxMSArODc1LDM0IEBAIHN0YXRpYyB2b2lk IGR3X21pcGlfZHNpX2VuY29kZXJfZGlzYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIp Cj4gIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZHNpLT5wY2xrKTsKPiAgfQo+ICAKPiArc3RhdGlj IGJvb2wgZHdfbWlwaV9kc2lfZW5jb2Rlcl9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAq ZW5jb2RlciwKPiArCQkJCQljb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiAr CQkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKPiArewo+ICsJc3Ry dWN0IGR3X21pcGlfZHNpICpkc2kgPSBlbmNvZGVyX3RvX2RzaShlbmNvZGVyKTsKPiArCj4gKwlz d2l0Y2ggKGRzaS0+Zm9ybWF0KSB7Cj4gKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I4ODg6Cj4gKwkJ YWRqdXN0ZWRfbW9kZS0+cHJpdmF0ZV9mbGFncyA9IFJPQ0tDSElQX0RTUF9NT0RFKERTSSwgUDg4 OCk7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I2NjY6Cj4gKwkJYWRqdXN0 ZWRfbW9kZS0+cHJpdmF0ZV9mbGFncyA9IFJPQ0tDSElQX0RTUF9NT0RFKERTSSwgUDY2Nik7Cj4g KwkJYnJlYWs7Cj4gKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I1NjU6Cj4gKwkJYWRqdXN0ZWRfbW9k ZS0+cHJpdmF0ZV9mbGFncyA9IFJPQ0tDSElQX0RTUF9NT0RFKERTSSwgUDU2NSk7Cj4gKwkJYnJl YWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCVdBUk5fT04oMSk7Cj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsJ fQo+ICsKPiArCXJldHVybiB0cnVlOwo+ICt9Cj4gKwo+ICBzdGF0aWMgdm9pZCBkd19taXBpX2Rz aV9lbmNvZGVyX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCj4gIHsKPiAgCXN0 cnVjdCBkd19taXBpX2RzaSAqZHNpID0gZW5jb2Rlcl90b19kc2koZW5jb2Rlcik7Cj4gIAlpbnQg bXV4ID0gZHJtX29mX2VuY29kZXJfYWN0aXZlX2VuZHBvaW50X2lkKGRzaS0+ZGV2LT5vZl9ub2Rl LCBlbmNvZGVyKTsKPiAtCXUzMiBpbnRlcmZhY2VfcGl4X2ZtdDsKPiAgCXUzMiB2YWw7Cj4gIAo+ ICAJaWYgKGNsa19wcmVwYXJlX2VuYWJsZShkc2ktPnBjbGspKSB7Cj4gQEAgLTg5NSwyNCArOTE4 LDYgQEAgc3RhdGljIHZvaWQgZHdfbWlwaV9kc2lfZW5jb2Rlcl9jb21taXQoc3RydWN0IGRybV9l bmNvZGVyICplbmNvZGVyKQo+ICAKPiAgCWNsa19kaXNhYmxlX3VucHJlcGFyZShkc2ktPnBjbGsp Owo+ICAKPiAtCXN3aXRjaCAoZHNpLT5mb3JtYXQpIHsKPiAtCWNhc2UgTUlQSV9EU0lfRk1UX1JH Qjg4ODoKPiAtCQlpbnRlcmZhY2VfcGl4X2ZtdCA9IFJPQ0tDSElQX09VVF9NT0RFX1A4ODg7Cj4g LQkJYnJlYWs7Cj4gLQljYXNlIE1JUElfRFNJX0ZNVF9SR0I2NjY6Cj4gLQkJaW50ZXJmYWNlX3Bp eF9mbXQgPSBST0NLQ0hJUF9PVVRfTU9ERV9QNjY2Owo+IC0JCWJyZWFrOwo+IC0JY2FzZSBNSVBJ X0RTSV9GTVRfUkdCNTY1Ogo+IC0JCWludGVyZmFjZV9waXhfZm10ID0gUk9DS0NISVBfT1VUX01P REVfUDU2NTsKPiAtCQlicmVhazsKPiAtCWRlZmF1bHQ6Cj4gLQkJV0FSTl9PTigxKTsKPiAtCQly ZXR1cm47Cj4gLQl9Cj4gLQo+IC0Jcm9ja2NoaXBfZHJtX2NydGNfbW9kZV9jb25maWcoZW5jb2Rl ci0+Y3J0YywgRFJNX01PREVfQ09OTkVDVE9SX0RTSSwKPiAtCQkJCSAgICAgIGludGVyZmFjZV9w aXhfZm10KTsKPiAtCj4gIAlpZiAobXV4KQo+ICAJCXZhbCA9IERTSTBfU0VMX1ZPUF9MSVQgfCAo RFNJMF9TRUxfVk9QX0xJVCA8PCAxNik7Cj4gIAllbHNlCj4gQEAgLTkyNCw2ICs5MjksNyBAQCBz dGF0aWMgdm9pZCBkd19taXBpX2RzaV9lbmNvZGVyX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIg KmVuY29kZXIpCj4gIAo+ICBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcwo+ ICBkd19taXBpX2RzaV9lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKPiArCS5tb2RlX2ZpeHVwID0g ZHdfbWlwaV9kc2lfZW5jb2Rlcl9tb2RlX2ZpeHVwLAo+ICAJLmNvbW1pdCA9IGR3X21pcGlfZHNp X2VuY29kZXJfY29tbWl0LAo+ICAJLm1vZGVfc2V0ID0gZHdfbWlwaV9kc2lfZW5jb2Rlcl9tb2Rl X3NldCwKPiAgCS5kaXNhYmxlID0gZHdfbWlwaV9kc2lfZW5jb2Rlcl9kaXNhYmxlLAo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvZHdfaGRtaS1yb2NrY2hpcC5jIGIvZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3X2hkbWktcm9ja2NoaXAuYwo+IGluZGV4IGQ1Y2ZlZjcu LmE3MmFmMzAgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3X2hkbWkt cm9ja2NoaXAuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9kd19oZG1pLXJvY2tj aGlwLmMKPiBAQCAtMTg2LDYgKzE4Niw4IEBAIGR3X2hkbWlfcm9ja2NoaXBfZW5jb2Rlcl9tb2Rl X2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKPiAgCQkJCSAgICBjb25zdCBzdHJ1 Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiAgCQkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlf bW9kZSAqYWRqX21vZGUpCj4gIHsKPiArCWFkal9tb2RlLT5wcml2YXRlX2ZsYWdzID0gUk9DS0NI SVBfRFNQX01PREUoSERNSUEsIEFBQUEpOwo+ICsKPiAgCXJldHVybiB0cnVlOwo+ICB9Cj4gIAo+ IEBAIC0yMDEsOSArMjAzLDYgQEAgc3RhdGljIHZvaWQgZHdfaGRtaV9yb2NrY2hpcF9lbmNvZGVy X2VuYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCj4gIAl1MzIgdmFsOwo+ICAJaW50 IG11eDsKPiAgCj4gLQlyb2NrY2hpcF9kcm1fY3J0Y19tb2RlX2NvbmZpZyhlbmNvZGVyLT5jcnRj LCBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEsCj4gLQkJCQkgICAgICBST0NLQ0hJUF9PVVRfTU9E RV9BQUFBKTsKPiAtCj4gIAltdXggPSBkcm1fb2ZfZW5jb2Rlcl9hY3RpdmVfZW5kcG9pbnRfaWQo aGRtaS0+ZGV2LT5vZl9ub2RlLCBlbmNvZGVyKTsKPiAgCWlmIChtdXgpCj4gIAkJdmFsID0gSERN SV9TRUxfVk9QX0xJVCB8IChIRE1JX1NFTF9WT1BfTElUIDw8IDE2KTsKPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL3Jv Y2tjaGlwL2lubm9faGRtaS5jCj4gaW5kZXggMTBkNjJmZi4uZWY2YWQ5MSAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvaW5ub19oZG1pLmMKPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vcm9ja2NoaXAvaW5ub19oZG1pLmMKPiBAQCAtNTAwLDkgKzUwMCw2IEBAIHN0YXRpYyB2 b2lkIGlubm9faGRtaV9lbmNvZGVyX2VuYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIp Cj4gIHsKPiAgCXN0cnVjdCBpbm5vX2hkbWkgKmhkbWkgPSB0b19pbm5vX2hkbWkoZW5jb2Rlcik7 Cj4gIAo+IC0Jcm9ja2NoaXBfZHJtX2NydGNfbW9kZV9jb25maWcoZW5jb2Rlci0+Y3J0YywgRFJN X01PREVfQ09OTkVDVE9SX0hETUlBLAo+IC0JCQkJICAgICAgUk9DS0NISVBfT1VUX01PREVfUDg4 OCk7Cj4gLQo+ICAJaW5ub19oZG1pX3NldF9wd3JfbW9kZShoZG1pLCBOT1JNQUwpOwo+ICB9Cj4g IAo+IEBAIC01MTcsNiArNTE0LDggQEAgc3RhdGljIGJvb2wgaW5ub19oZG1pX2VuY29kZXJfbW9k ZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCj4gIAkJCQkJIGNvbnN0IHN0cnVj dCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAo+ICAJCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k ZSAqYWRqX21vZGUpCj4gIHsKPiArCWFkal9tb2RlLT5wcml2YXRlX2ZsYWdzID0gUk9DS0NISVBf RFNQX01PREUoSERNSUEsIFA4ODgpOwo+ICsKPiAgCXJldHVybiB0cnVlOwo+ICB9Cj4gIAo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5oIGIv ZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuaAo+IGluZGV4IDAwZDE3 ZDcuLjY4MzIxMGIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tj aGlwX2RybV9kcnYuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9k cm1fZHJ2LmgKPiBAQCAtNjgsOCArNjgsNiBAQCB2b2lkIHJvY2tjaGlwX2RybV9hdG9taWNfd29y ayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwo+ICBpbnQgcm9ja2NoaXBfcmVnaXN0ZXJfY3J0 Y19mdW5jcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCj4gIAkJCQkgY29uc3Qgc3RydWN0IHJvY2tj aGlwX2NydGNfZnVuY3MgKmNydGNfZnVuY3MpOwo+ICB2b2lkIHJvY2tjaGlwX3VucmVnaXN0ZXJf Y3J0Y19mdW5jcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwo+IC1pbnQgcm9ja2NoaXBfZHJtX2Ny dGNfbW9kZV9jb25maWcoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgY29ubmVjdG9yX3R5cGUs Cj4gLQkJCQkgIGludCBvdXRfbW9kZSk7Cj4gIGludCByb2NrY2hpcF9kcm1fZG1hX2F0dGFjaF9k ZXZpY2Uoc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsCj4gIAkJCQkgICBzdHJ1Y3QgZGV2aWNl ICpkZXYpOwo+ICB2b2lkIHJvY2tjaGlwX2RybV9kbWFfZGV0YWNoX2RldmljZShzdHJ1Y3QgZHJt X2RldmljZSAqZHJtX2RldiwKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L3JvY2tjaGlwX2RybV92b3AuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9k cm1fdm9wLmMKPiBpbmRleCBhNjE5ZjEyLi4xYTYxMWNmIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv Z3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmMKPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5jCj4gQEAgLTgxOCwzOCArODE4LDYgQEAgc3Rh dGljIGNvbnN0IHN0cnVjdCBkcm1fcGxhbmVfZnVuY3Mgdm9wX3BsYW5lX2Z1bmNzID0gewo+ICAJ LmF0b21pY19kZXN0cm95X3N0YXRlID0gdm9wX2F0b21pY19wbGFuZV9kZXN0cm95X3N0YXRlLAo+ ICB9Owo+ICAKPiAtaW50IHJvY2tjaGlwX2RybV9jcnRjX21vZGVfY29uZmlnKHN0cnVjdCBkcm1f Y3J0YyAqY3J0YywKPiAtCQkJCSAgaW50IGNvbm5lY3Rvcl90eXBlLAo+IC0JCQkJICBpbnQgb3V0 X21vZGUpCj4gLXsKPiAtCXN0cnVjdCB2b3AgKnZvcCA9IHRvX3ZvcChjcnRjKTsKPiAtCj4gLQlp ZiAoV0FSTl9PTighdm9wLT5pc19lbmFibGVkKSkKPiAtCQlyZXR1cm4gLUVJTlZBTDsKPiAtCj4g LQlzd2l0Y2ggKGNvbm5lY3Rvcl90eXBlKSB7Cj4gLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9M VkRTOgo+IC0JCVZPUF9DVFJMX1NFVCh2b3AsIHJnYl9lbiwgMSk7Cj4gLQkJYnJlYWs7Cj4gLQlj YXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9lRFA6Cj4gLQkJVk9QX0NUUkxfU0VUKHZvcCwgZWRwX2Vu LCAxKTsKPiAtCQlicmVhazsKPiAtCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBOgo+IC0J CVZPUF9DVFJMX1NFVCh2b3AsIGhkbWlfZW4sIDEpOwo+IC0JCWJyZWFrOwo+IC0JY2FzZSBEUk1f TU9ERV9DT05ORUNUT1JfRFNJOgo+IC0JCVZPUF9DVFJMX1NFVCh2b3AsIG1pcGlfZW4sIDEpOwo+ IC0JCWJyZWFrOwo+IC0JZGVmYXVsdDoKPiAtCQlEUk1fRVJST1IoInVuc3VwcG9ydCBjb25uZWN0 b3JfdHlwZVslZF1cbiIsIGNvbm5lY3Rvcl90eXBlKTsKPiAtCQlyZXR1cm4gLUVJTlZBTDsKPiAt CX07Cj4gLQlWT1BfQ1RSTF9TRVQodm9wLCBvdXRfbW9kZSwgb3V0X21vZGUpOwo+IC0KPiAtCXJl dHVybiAwOwo+IC19Cj4gLUVYUE9SVF9TWU1CT0xfR1BMKHJvY2tjaGlwX2RybV9jcnRjX21vZGVf Y29uZmlnKTsKPiAtCj4gIHN0YXRpYyBpbnQgdm9wX2NydGNfZW5hYmxlX3ZibGFuayhzdHJ1Y3Qg ZHJtX2NydGMgKmNydGMpCj4gIHsKPiAgCXN0cnVjdCB2b3AgKnZvcCA9IHRvX3ZvcChjcnRjKTsK PiBAQCAtOTQzLDYgKzkxMSw4IEBAIHN0YXRpYyB2b2lkIHZvcF9jcnRjX2VuYWJsZShzdHJ1Y3Qg ZHJtX2NydGMgKmNydGMpCj4gIAl1MTYgdmFjdF9zdCA9IGFkanVzdGVkX21vZGUtPnZ0b3RhbCAt IGFkanVzdGVkX21vZGUtPnZzeW5jX3N0YXJ0Owo+ICAJdTE2IHZhY3RfZW5kID0gdmFjdF9zdCAr IHZkaXNwbGF5Owo+ICAJdWludDMyX3QgdmFsOwo+ICsJaW50IHR5cGUgPSBST0NLQ0hJUF9PVVRf TU9ERV9UWVBFKGFkanVzdGVkX21vZGUtPnByaXZhdGVfZmxhZ3MpOwo+ICsJaW50IG91dF9tb2Rl ID0gUk9DS0NISVBfT1VUX01PREUoYWRqdXN0ZWRfbW9kZS0+cHJpdmF0ZV9mbGFncyk7Cj4gIAo+ ICAJdm9wX2VuYWJsZShjcnRjKTsKPiAgCS8qCj4gQEAgLTk4NSw2ICs5NTUsMjMgQEAgc3RhdGlj IHZvaWQgdm9wX2NydGNfZW5hYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPiAgCXZhbCB8PSAo YWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05IU1lOQykgPyAwIDogMTsKPiAg CXZhbCB8PSAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05WU1lOQykgPyAw IDogKDEgPDwgMSk7Cj4gIAlWT1BfQ1RSTF9TRVQodm9wLCBwaW5fcG9sLCB2YWwpOwo+ICsJc3dp dGNoICh0eXBlKSB7Cj4gKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOgo+ICsJCVZPUF9D VFJMX1NFVCh2b3AsIHJnYl9lbiwgMSk7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIERSTV9NT0RFX0NP Tk5FQ1RPUl9lRFA6Cj4gKwkJVk9QX0NUUkxfU0VUKHZvcCwgZWRwX2VuLCAxKTsKPiArCQlicmVh azsKPiArCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBOgo+ICsJCVZPUF9DVFJMX1NFVCh2 b3AsIGhkbWlfZW4sIDEpOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1Jf RFNJOgo+ICsJCVZPUF9DVFJMX1NFVCh2b3AsIG1pcGlfZW4sIDEpOwo+ICsJCWJyZWFrOwo+ICsJ ZGVmYXVsdDoKPiArCQlEUk1fRVJST1IoInVuc3VwcG9ydCBjb25uZWN0b3JfdHlwZVslZF1cbiIs IHR5cGUpOwo+ICsJfQo+ICsJVk9QX0NUUkxfU0VUKHZvcCwgb3V0X21vZGUsIG91dF9tb2RlKTsK PiAgCj4gIAlWT1BfQ1RSTF9TRVQodm9wLCBodG90YWxfcHcsIChodG90YWwgPDwgMTYpIHwgaHN5 bmNfbGVuKTsKPiAgCXZhbCA9IGhhY3Rfc3QgPDwgMTY7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmggYi9kcml2ZXJzL2dwdS9kcm0vcm9j a2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5oCj4gaW5kZXggMDcxZmYwYi4uNGM2M2E2NiAxMDA2NDQK PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5oCj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV92b3AuaAo+IEBAIC0xODMs NiArMTgzLDEyIEBAIHN0cnVjdCB2b3BfZGF0YSB7Cj4gIC8qIGZvciB1c2Ugc3BlY2lhbCBvdXRm YWNlICovCj4gICNkZWZpbmUgUk9DS0NISVBfT1VUX01PREVfQUFBQQkxNQo+ICAKPiArI2RlZmlu ZSBST0NLQ0hJUF9PVVRfTU9ERV9UWVBFKHgpCSgoeCkgPj4gMTYpCj4gKyNkZWZpbmUgUk9DS0NI SVBfT1VUX01PREUoeCkJCSgoeCkgJiAweGZmZmYpCj4gKyNkZWZpbmUgUk9DS0NISVBfRFNQX01P REUodHlwZSwgbW9kZSkgXAo+ICsJCSgoRFJNX01PREVfQ09OTkVDVE9SXyMjdHlwZSA8PCAxNikg fCBcCj4gKwkJIChST0NLQ0hJUF9PVVRfTU9ERV8jI21vZGUgJiAweGZmZmYpKQo+ICsKPiAgZW51 bSBhbHBoYV9tb2RlIHsKPiAgCUFMUEhBX1NUUkFJR0hULAo+ICAJQUxQSEFfSU5WRVJTRSwKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1h aWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: john@metanate.com (John Keeping) Date: Mon, 18 Apr 2016 10:25:38 +0100 Subject: [PATCH] drm/rockchip: get rid of rockchip_drm_crtc_mode_config In-Reply-To: <1460948611-32259-1-git-send-email-mark.yao@rock-chips.com> References: <1460948611-32259-1-git-send-email-mark.yao@rock-chips.com> Message-ID: <20160418102538.0ed730ca.john@metanate.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Mark, On Mon, 18 Apr 2016 11:03:31 +0800, Mark Yao wrote: > We need to take care of the vop status when use > rockchip_drm_crtc_mode_config, if vop is disabled, > the function would failed, that is terrible. > > Save connector type and output mode on drm_display_mode->private_flags > at encoder mode_fixup, then we can configure the type and mode safely > on crtc mode_set. Since Rockchip is atomic, shouldn't this be using atomic_check hooks and a subclassed crtc_state structure? > Signed-off-by: Mark Yao > --- > drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 37 +++++++--------- > drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 44 ++++++++++--------- > drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 5 +-- > drivers/gpu/drm/rockchip/inno_hdmi.c | 5 +-- > drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 2 - > drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 51 +++++++++-------------- > drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 6 +++ > 7 files changed, 69 insertions(+), 81 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > index a1d94d8..0344e52 100644 > --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > @@ -97,7 +97,21 @@ rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder, > const struct drm_display_mode *mode, > struct drm_display_mode *adjusted_mode) > { > - /* do nothing */ > + /* > + * FIXME(Yakir): driver should configure the CRTC output video > + * mode with the display information which indicated the monitor > + * support colorimetry. > + * > + * But don't know why the CRTC driver seems could only output the > + * RGBaaa rightly. For example, if connect the "innolux,n116bge" > + * eDP screen, EDID would indicated that screen only accepted the > + * 6bpc mode. But if I configure CRTC to RGB666 output, then eDP > + * screen would show a blue picture (RGB888 show a green picture). > + * But if I configure CTRC to RGBaaa, and eDP driver still keep > + * RGB666 input video mode, then screen would works prefect. > + */ > + adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(eDP, AAAA); > + > return true; > } > > @@ -114,27 +128,6 @@ static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder) > int ret; > u32 val; > > - /* > - * FIXME(Yakir): driver should configure the CRTC output video > - * mode with the display information which indicated the monitor > - * support colorimetry. > - * > - * But don't know why the CRTC driver seems could only output the > - * RGBaaa rightly. For example, if connect the "innolux,n116bge" > - * eDP screen, EDID would indicated that screen only accepted the > - * 6bpc mode. But if I configure CRTC to RGB666 output, then eDP > - * screen would show a blue picture (RGB888 show a green picture). > - * But if I configure CTRC to RGBaaa, and eDP driver still keep > - * RGB666 input video mode, then screen would works prefect. > - */ > - ret = rockchip_drm_crtc_mode_config(encoder->crtc, > - DRM_MODE_CONNECTOR_eDP, > - ROCKCHIP_OUT_MODE_AAAA); > - if (ret < 0) { > - dev_err(dp->dev, "Could not set crtc mode config (%d)\n", ret); > - return; > - } > - > ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); > if (ret < 0) > return; > diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > index 7975158..49c4c72 100644 > --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > @@ -875,11 +875,34 @@ static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder) > clk_disable_unprepare(dsi->pclk); > } > > +static bool dw_mipi_dsi_encoder_mode_fixup(struct drm_encoder *encoder, > + const struct drm_display_mode *mode, > + struct drm_display_mode *adjusted_mode) > +{ > + struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder); > + > + switch (dsi->format) { > + case MIPI_DSI_FMT_RGB888: > + adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(DSI, P888); > + break; > + case MIPI_DSI_FMT_RGB666: > + adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(DSI, P666); > + break; > + case MIPI_DSI_FMT_RGB565: > + adjusted_mode->private_flags = ROCKCHIP_DSP_MODE(DSI, P565); > + break; > + default: > + WARN_ON(1); > + return false; > + } > + > + return true; > +} > + > static void dw_mipi_dsi_encoder_commit(struct drm_encoder *encoder) > { > struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder); > int mux = drm_of_encoder_active_endpoint_id(dsi->dev->of_node, encoder); > - u32 interface_pix_fmt; > u32 val; > > if (clk_prepare_enable(dsi->pclk)) { > @@ -895,24 +918,6 @@ static void dw_mipi_dsi_encoder_commit(struct drm_encoder *encoder) > > clk_disable_unprepare(dsi->pclk); > > - switch (dsi->format) { > - case MIPI_DSI_FMT_RGB888: > - interface_pix_fmt = ROCKCHIP_OUT_MODE_P888; > - break; > - case MIPI_DSI_FMT_RGB666: > - interface_pix_fmt = ROCKCHIP_OUT_MODE_P666; > - break; > - case MIPI_DSI_FMT_RGB565: > - interface_pix_fmt = ROCKCHIP_OUT_MODE_P565; > - break; > - default: > - WARN_ON(1); > - return; > - } > - > - rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_DSI, > - interface_pix_fmt); > - > if (mux) > val = DSI0_SEL_VOP_LIT | (DSI0_SEL_VOP_LIT << 16); > else > @@ -924,6 +929,7 @@ static void dw_mipi_dsi_encoder_commit(struct drm_encoder *encoder) > > static struct drm_encoder_helper_funcs > dw_mipi_dsi_encoder_helper_funcs = { > + .mode_fixup = dw_mipi_dsi_encoder_mode_fixup, > .commit = dw_mipi_dsi_encoder_commit, > .mode_set = dw_mipi_dsi_encoder_mode_set, > .disable = dw_mipi_dsi_encoder_disable, > diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > index d5cfef7..a72af30 100644 > --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > @@ -186,6 +186,8 @@ dw_hdmi_rockchip_encoder_mode_fixup(struct drm_encoder *encoder, > const struct drm_display_mode *mode, > struct drm_display_mode *adj_mode) > { > + adj_mode->private_flags = ROCKCHIP_DSP_MODE(HDMIA, AAAA); > + > return true; > } > > @@ -201,9 +203,6 @@ static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder) > u32 val; > int mux; > > - rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_HDMIA, > - ROCKCHIP_OUT_MODE_AAAA); > - > mux = drm_of_encoder_active_endpoint_id(hdmi->dev->of_node, encoder); > if (mux) > val = HDMI_SEL_VOP_LIT | (HDMI_SEL_VOP_LIT << 16); > diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c > index 10d62ff..ef6ad91 100644 > --- a/drivers/gpu/drm/rockchip/inno_hdmi.c > +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c > @@ -500,9 +500,6 @@ static void inno_hdmi_encoder_enable(struct drm_encoder *encoder) > { > struct inno_hdmi *hdmi = to_inno_hdmi(encoder); > > - rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_HDMIA, > - ROCKCHIP_OUT_MODE_P888); > - > inno_hdmi_set_pwr_mode(hdmi, NORMAL); > } > > @@ -517,6 +514,8 @@ static bool inno_hdmi_encoder_mode_fixup(struct drm_encoder *encoder, > const struct drm_display_mode *mode, > struct drm_display_mode *adj_mode) > { > + adj_mode->private_flags = ROCKCHIP_DSP_MODE(HDMIA, P888); > + > return true; > } > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > index 00d17d7..683210b 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > @@ -68,8 +68,6 @@ void rockchip_drm_atomic_work(struct work_struct *work); > int rockchip_register_crtc_funcs(struct drm_crtc *crtc, > const struct rockchip_crtc_funcs *crtc_funcs); > void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc); > -int rockchip_drm_crtc_mode_config(struct drm_crtc *crtc, int connector_type, > - int out_mode); > int rockchip_drm_dma_attach_device(struct drm_device *drm_dev, > struct device *dev); > void rockchip_drm_dma_detach_device(struct drm_device *drm_dev, > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > index a619f12..1a611cf 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > @@ -818,38 +818,6 @@ static const struct drm_plane_funcs vop_plane_funcs = { > .atomic_destroy_state = vop_atomic_plane_destroy_state, > }; > > -int rockchip_drm_crtc_mode_config(struct drm_crtc *crtc, > - int connector_type, > - int out_mode) > -{ > - struct vop *vop = to_vop(crtc); > - > - if (WARN_ON(!vop->is_enabled)) > - return -EINVAL; > - > - switch (connector_type) { > - case DRM_MODE_CONNECTOR_LVDS: > - VOP_CTRL_SET(vop, rgb_en, 1); > - break; > - case DRM_MODE_CONNECTOR_eDP: > - VOP_CTRL_SET(vop, edp_en, 1); > - break; > - case DRM_MODE_CONNECTOR_HDMIA: > - VOP_CTRL_SET(vop, hdmi_en, 1); > - break; > - case DRM_MODE_CONNECTOR_DSI: > - VOP_CTRL_SET(vop, mipi_en, 1); > - break; > - default: > - DRM_ERROR("unsupport connector_type[%d]\n", connector_type); > - return -EINVAL; > - }; > - VOP_CTRL_SET(vop, out_mode, out_mode); > - > - return 0; > -} > -EXPORT_SYMBOL_GPL(rockchip_drm_crtc_mode_config); > - > static int vop_crtc_enable_vblank(struct drm_crtc *crtc) > { > struct vop *vop = to_vop(crtc); > @@ -943,6 +911,8 @@ static void vop_crtc_enable(struct drm_crtc *crtc) > u16 vact_st = adjusted_mode->vtotal - adjusted_mode->vsync_start; > u16 vact_end = vact_st + vdisplay; > uint32_t val; > + int type = ROCKCHIP_OUT_MODE_TYPE(adjusted_mode->private_flags); > + int out_mode = ROCKCHIP_OUT_MODE(adjusted_mode->private_flags); > > vop_enable(crtc); > /* > @@ -985,6 +955,23 @@ static void vop_crtc_enable(struct drm_crtc *crtc) > val |= (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : 1; > val |= (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : (1 << 1); > VOP_CTRL_SET(vop, pin_pol, val); > + switch (type) { > + case DRM_MODE_CONNECTOR_LVDS: > + VOP_CTRL_SET(vop, rgb_en, 1); > + break; > + case DRM_MODE_CONNECTOR_eDP: > + VOP_CTRL_SET(vop, edp_en, 1); > + break; > + case DRM_MODE_CONNECTOR_HDMIA: > + VOP_CTRL_SET(vop, hdmi_en, 1); > + break; > + case DRM_MODE_CONNECTOR_DSI: > + VOP_CTRL_SET(vop, mipi_en, 1); > + break; > + default: > + DRM_ERROR("unsupport connector_type[%d]\n", type); > + } > + VOP_CTRL_SET(vop, out_mode, out_mode); > > VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len); > val = hact_st << 16; > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h > index 071ff0b..4c63a66 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h > @@ -183,6 +183,12 @@ struct vop_data { > /* for use special outface */ > #define ROCKCHIP_OUT_MODE_AAAA 15 > > +#define ROCKCHIP_OUT_MODE_TYPE(x) ((x) >> 16) > +#define ROCKCHIP_OUT_MODE(x) ((x) & 0xffff) > +#define ROCKCHIP_DSP_MODE(type, mode) \ > + ((DRM_MODE_CONNECTOR_##type << 16) | \ > + (ROCKCHIP_OUT_MODE_##mode & 0xffff)) > + > enum alpha_mode { > ALPHA_STRAIGHT, > ALPHA_INVERSE,