From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 96B9BC76195 for ; Sun, 21 Jul 2019 10:26:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6F338208C0 for ; Sun, 21 Jul 2019 10:26:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726402AbfGUK0z (ORCPT ); Sun, 21 Jul 2019 06:26:55 -0400 Received: from honk.sigxcpu.org ([24.134.29.49]:57598 "EHLO honk.sigxcpu.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726131AbfGUK0y (ORCPT ); Sun, 21 Jul 2019 06:26:54 -0400 Received: from localhost (localhost [127.0.0.1]) by honk.sigxcpu.org (Postfix) with ESMTP id D9795FB03; Sun, 21 Jul 2019 12:26:50 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at honk.sigxcpu.org Received: from honk.sigxcpu.org ([127.0.0.1]) by localhost (honk.sigxcpu.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8DykkjfOyHTt; Sun, 21 Jul 2019 12:26:48 +0200 (CEST) Received: by bogon.sigxcpu.org (Postfix, from userid 1000) id 1510B41113; Sun, 21 Jul 2019 12:26:48 +0200 (CEST) Date: Sun, 21 Jul 2019 12:26:48 +0200 From: Guido =?iso-8859-1?Q?G=FCnther?= To: Robert Chiras Cc: Marek Vasut , Stefan Agner , David Airlie , Daniel Vetter , Rob Herring , Mark Rutland , Shawn Guo , Sascha Hauer , Fabio Estevam , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, NXP Linux Team , Pengutronix Kernel Team , linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 01/10] drm/mxsfb: Update mxsfb to support a bridge Message-ID: <20190721102647.GA999@bogon.m.sigxcpu.org> References: <1561555938-21595-1-git-send-email-robert.chiras@nxp.com> <1561555938-21595-2-git-send-email-robert.chiras@nxp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1561555938-21595-2-git-send-email-robert.chiras@nxp.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Robert, On Wed, Jun 26, 2019 at 04:32:09PM +0300, Robert Chiras wrote: > Currently, the MXSFB DRM driver only supports a panel. But, its output > display signal can also be redirected to another encoder, like a DSI > controller. In this case, that DSI controller may act like a drm_bridge. > In order support this use-case too, this patch adds support for > drm_bridge in mxsfb. > > Signed-off-by: Robert Chiras > --- > drivers/gpu/drm/mxsfb/mxsfb_crtc.c | 46 +++++++++++++++++++++++++++++++++++--- > drivers/gpu/drm/mxsfb/mxsfb_drv.c | 46 +++++++++++++++++++++++++++++++++----- > drivers/gpu/drm/mxsfb/mxsfb_drv.h | 4 +++- > drivers/gpu/drm/mxsfb/mxsfb_out.c | 26 +++++++++++---------- > drivers/gpu/drm/mxsfb/mxsfb_regs.h | 15 +++++++++++++ > 5 files changed, 116 insertions(+), 21 deletions(-) > > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c > index 93f4133..14bde024 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c > +++ b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c > @@ -93,8 +93,11 @@ static void mxsfb_set_bus_fmt(struct mxsfb_drm_private *mxsfb) > > reg = readl(mxsfb->base + LCDC_CTRL); > > - if (mxsfb->connector.display_info.num_bus_formats) > - bus_format = mxsfb->connector.display_info.bus_formats[0]; > + if (mxsfb->connector->display_info.num_bus_formats) > + bus_format = mxsfb->connector->display_info.bus_formats[0]; > + > + DRM_DEV_DEBUG_DRIVER(drm->dev, "Using bus_format: 0x%08X\n", > + bus_format); > > reg &= ~CTRL_BUS_WIDTH_MASK; > switch (bus_format) { > @@ -122,6 +125,9 @@ static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb) > clk_prepare_enable(mxsfb->clk_disp_axi); > clk_prepare_enable(mxsfb->clk); > > + writel(CTRL2_OUTSTANDING_REQS__REQ_16, > + mxsfb->base + LCDC_V4_CTRL2 + REG_SET); > + > /* If it was disabled, re-enable the mode again */ > writel(CTRL_DOTCLK_MODE, mxsfb->base + LCDC_CTRL + REG_SET); > > @@ -131,12 +137,15 @@ static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb) > writel(reg, mxsfb->base + LCDC_VDCTRL4); > > writel(CTRL_RUN, mxsfb->base + LCDC_CTRL + REG_SET); > + writel(CTRL1_RECOVERY_ON_UNDERFLOW, mxsfb->base + LCDC_CTRL1 + REG_SET); > } > > static void mxsfb_disable_controller(struct mxsfb_drm_private *mxsfb) > { > u32 reg; > > + writel(CTRL_RUN, mxsfb->base + LCDC_CTRL + REG_CLR); > + > /* > * Even if we disable the controller here, it will still continue > * until its FIFOs are running out of data > @@ -202,8 +211,9 @@ static dma_addr_t mxsfb_get_fb_paddr(struct mxsfb_drm_private *mxsfb) > > static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb) > { > + struct drm_device *drm = mxsfb->pipe.crtc.dev; > struct drm_display_mode *m = &mxsfb->pipe.crtc.state->adjusted_mode; > - const u32 bus_flags = mxsfb->connector.display_info.bus_flags; > + const u32 bus_flags = mxsfb->connector->display_info.bus_flags; > u32 vdctrl0, vsync_pulse_len, hsync_pulse_len; > int err; > > @@ -227,6 +237,13 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb) > > clk_set_rate(mxsfb->clk, m->crtc_clock * 1000); > > + DRM_DEV_DEBUG_DRIVER(drm->dev, "Pixel clock: %dkHz (actual: %dkHz)\n", > + m->crtc_clock, > + (int)(clk_get_rate(mxsfb->clk) / 1000)); > + DRM_DEV_DEBUG_DRIVER(drm->dev, "Connector bus_flags: 0x%08X\n", > + bus_flags); > + DRM_DEV_DEBUG_DRIVER(drm->dev, "Mode flags: 0x%08X\n", m->flags); > + > writel(TRANSFER_COUNT_SET_VCOUNT(m->crtc_vdisplay) | > TRANSFER_COUNT_SET_HCOUNT(m->crtc_hdisplay), > mxsfb->base + mxsfb->devdata->transfer_count); > @@ -279,6 +296,7 @@ void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsfb) > dma_addr_t paddr; > > mxsfb_enable_axi_clk(mxsfb); > + writel(0, mxsfb->base + LCDC_CTRL); > mxsfb_crtc_mode_set_nofb(mxsfb); > > /* Write cur_buf as well to avoid an initial corrupt frame */ > @@ -302,6 +320,8 @@ void mxsfb_plane_atomic_update(struct mxsfb_drm_private *mxsfb, > { > struct drm_simple_display_pipe *pipe = &mxsfb->pipe; > struct drm_crtc *crtc = &pipe->crtc; > + struct drm_framebuffer *fb = pipe->plane.state->fb; > + struct drm_framebuffer *old_fb = old_state->fb; > struct drm_pending_vblank_event *event; > dma_addr_t paddr; > > @@ -324,4 +344,24 @@ void mxsfb_plane_atomic_update(struct mxsfb_drm_private *mxsfb, > writel(paddr, mxsfb->base + mxsfb->devdata->next_buf); > mxsfb_disable_axi_clk(mxsfb); > } > + > + if (!fb || !old_fb) > + return; > + > + /* > + * TODO: Currently, we only support pixel format change, but we need > + * also to care about size changes too > + */ > + if (old_fb->format->format != fb->format->format) { > + struct drm_format_name_buf old_fmt_buf; > + struct drm_format_name_buf new_fmt_buf; > + > + DRM_DEV_DEBUG_DRIVER(crtc->dev->dev, > + "Switching pixel format: %s -> %s\n", > + drm_get_format_name(old_fb->format->format, > + &old_fmt_buf), > + drm_get_format_name(fb->format->format, > + &new_fmt_buf)); > + mxsfb_set_pixel_fmt(mxsfb, true); This assumes mxsfb_set_pixel_fmt has two arguments which is being introduced in the following commit. With that fixed: Tested-by: Guido Günther Cheers, -- Guido > + } > } > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c > index 6fafc90..0d171e9 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c > +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c > @@ -98,9 +98,25 @@ static void mxsfb_pipe_enable(struct drm_simple_display_pipe *pipe, > struct drm_crtc_state *crtc_state, > struct drm_plane_state *plane_state) > { > + struct drm_connector *connector; > struct mxsfb_drm_private *mxsfb = drm_pipe_to_mxsfb_drm_private(pipe); > struct drm_device *drm = pipe->plane.dev; > > + if (!mxsfb->connector) { > + list_for_each_entry(connector, > + &drm->mode_config.connector_list, > + head) > + if (connector->encoder == &mxsfb->pipe.encoder) { > + mxsfb->connector = connector; > + break; > + } > + } > + > + if (!mxsfb->connector) { > + dev_warn(drm->dev, "No connector attached, using default\n"); > + mxsfb->connector = &mxsfb->panel_connector; > + } > + > pm_runtime_get_sync(drm->dev); > drm_panel_prepare(mxsfb->panel); > mxsfb_crtc_enable(mxsfb); > @@ -126,6 +142,9 @@ static void mxsfb_pipe_disable(struct drm_simple_display_pipe *pipe) > drm_crtc_send_vblank_event(crtc, event); > } > spin_unlock_irq(&drm->event_lock); > + > + if (mxsfb->connector != &mxsfb->panel_connector) > + mxsfb->connector = NULL; > } > > static void mxsfb_pipe_update(struct drm_simple_display_pipe *pipe, > @@ -223,16 +242,33 @@ static int mxsfb_load(struct drm_device *drm, unsigned long flags) > > ret = drm_simple_display_pipe_init(drm, &mxsfb->pipe, &mxsfb_funcs, > mxsfb_formats, ARRAY_SIZE(mxsfb_formats), NULL, > - &mxsfb->connector); > + mxsfb->connector); > if (ret < 0) { > dev_err(drm->dev, "Cannot setup simple display pipe\n"); > goto err_vblank; > } > > - ret = drm_panel_attach(mxsfb->panel, &mxsfb->connector); > - if (ret) { > - dev_err(drm->dev, "Cannot connect panel\n"); > - goto err_vblank; > + /* > + * Attach panel only if there is one. > + * If there is no panel attach, it must be a bridge. In this case, we > + * need a reference to its connector for a proper initialization. > + * We will do this check in pipe->enable(), since the connector won't > + * be attached to an encoder until then. > + */ > + > + if (mxsfb->panel) { > + ret = drm_panel_attach(mxsfb->panel, mxsfb->connector); > + if (ret) { > + dev_err(drm->dev, "Cannot connect panel\n"); > + goto err_vblank; > + } > + } else if (mxsfb->bridge) { > + ret = drm_simple_display_pipe_attach_bridge(&mxsfb->pipe, > + mxsfb->bridge); > + if (ret) { > + dev_err(drm->dev, "Cannot connect bridge\n"); > + goto err_vblank; > + } > } > > drm->mode_config.min_width = MXSFB_MIN_XRES; > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.h b/drivers/gpu/drm/mxsfb/mxsfb_drv.h > index d975300..0b65b51 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.h > +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.h > @@ -27,8 +27,10 @@ struct mxsfb_drm_private { > struct clk *clk_disp_axi; > > struct drm_simple_display_pipe pipe; > - struct drm_connector connector; > + struct drm_connector panel_connector; > + struct drm_connector *connector; > struct drm_panel *panel; > + struct drm_bridge *bridge; > }; > > int mxsfb_setup_crtc(struct drm_device *dev); > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_out.c b/drivers/gpu/drm/mxsfb/mxsfb_out.c > index 91e76f9..b9acf2b 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_out.c > +++ b/drivers/gpu/drm/mxsfb/mxsfb_out.c > @@ -22,7 +22,8 @@ > static struct mxsfb_drm_private * > drm_connector_to_mxsfb_drm_private(struct drm_connector *connector) > { > - return container_of(connector, struct mxsfb_drm_private, connector); > + return container_of(connector, struct mxsfb_drm_private, > + panel_connector); > } > > static int mxsfb_panel_get_modes(struct drm_connector *connector) > @@ -77,22 +78,23 @@ static const struct drm_connector_funcs mxsfb_panel_connector_funcs = { > int mxsfb_create_output(struct drm_device *drm) > { > struct mxsfb_drm_private *mxsfb = drm->dev_private; > - struct drm_panel *panel; > int ret; > > - ret = drm_of_find_panel_or_bridge(drm->dev->of_node, 0, 0, &panel, NULL); > + ret = drm_of_find_panel_or_bridge(drm->dev->of_node, 0, 0, > + &mxsfb->panel, &mxsfb->bridge); > if (ret) > return ret; > > - mxsfb->connector.dpms = DRM_MODE_DPMS_OFF; > - mxsfb->connector.polled = 0; > - drm_connector_helper_add(&mxsfb->connector, > - &mxsfb_panel_connector_helper_funcs); > - ret = drm_connector_init(drm, &mxsfb->connector, > - &mxsfb_panel_connector_funcs, > - DRM_MODE_CONNECTOR_Unknown); > - if (!ret) > - mxsfb->panel = panel; > + if (mxsfb->panel) { > + mxsfb->connector = &mxsfb->panel_connector; > + mxsfb->connector->dpms = DRM_MODE_DPMS_OFF; > + mxsfb->connector->polled = 0; > + drm_connector_helper_add(mxsfb->connector, > + &mxsfb_panel_connector_helper_funcs); > + ret = drm_connector_init(drm, mxsfb->connector, > + &mxsfb_panel_connector_funcs, > + DRM_MODE_CONNECTOR_Unknown); > + } > > return ret; > } > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_regs.h b/drivers/gpu/drm/mxsfb/mxsfb_regs.h > index 932d7ea..71426aa 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_regs.h > +++ b/drivers/gpu/drm/mxsfb/mxsfb_regs.h > @@ -14,19 +14,31 @@ > > #define LCDC_CTRL 0x00 > #define LCDC_CTRL1 0x10 > +#define LCDC_V4_CTRL2 0x20 > #define LCDC_V3_TRANSFER_COUNT 0x20 > #define LCDC_V4_TRANSFER_COUNT 0x30 > #define LCDC_V4_CUR_BUF 0x40 > #define LCDC_V4_NEXT_BUF 0x50 > #define LCDC_V3_CUR_BUF 0x30 > #define LCDC_V3_NEXT_BUF 0x40 > +#define LCDC_TIMING 0x60 > #define LCDC_VDCTRL0 0x70 > #define LCDC_VDCTRL1 0x80 > #define LCDC_VDCTRL2 0x90 > #define LCDC_VDCTRL3 0xa0 > #define LCDC_VDCTRL4 0xb0 > +#define LCDC_DVICTRL0 0xc0 > +#define LCDC_DVICTRL1 0xd0 > +#define LCDC_DVICTRL2 0xe0 > +#define LCDC_DVICTRL3 0xf0 > +#define LCDC_DVICTRL4 0x100 > +#define LCDC_V4_DATA 0x180 > +#define LCDC_V3_DATA 0x1b0 > #define LCDC_V4_DEBUG0 0x1d0 > #define LCDC_V3_DEBUG0 0x1f0 > +#define LCDC_AS_CTRL 0x210 > +#define LCDC_AS_BUF 0x220 > +#define LCDC_AS_NEXT_BUF 0x230 > > #define CTRL_SFTRST (1 << 31) > #define CTRL_CLKGATE (1 << 30) > @@ -45,12 +57,15 @@ > #define CTRL_DF24 (1 << 1) > #define CTRL_RUN (1 << 0) > > +#define CTRL1_RECOVERY_ON_UNDERFLOW (1 << 24) > #define CTRL1_FIFO_CLEAR (1 << 21) > #define CTRL1_SET_BYTE_PACKAGING(x) (((x) & 0xf) << 16) > #define CTRL1_GET_BYTE_PACKAGING(x) (((x) >> 16) & 0xf) > #define CTRL1_CUR_FRAME_DONE_IRQ_EN (1 << 13) > #define CTRL1_CUR_FRAME_DONE_IRQ (1 << 9) > > +#define CTRL2_OUTSTANDING_REQS__REQ_16 (4 << 21) > + > #define TRANSFER_COUNT_SET_VCOUNT(x) (((x) & 0xffff) << 16) > #define TRANSFER_COUNT_GET_VCOUNT(x) (((x) >> 16) & 0xffff) > #define TRANSFER_COUNT_SET_HCOUNT(x) ((x) & 0xffff) > -- > 2.7.4 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Guido =?iso-8859-1?Q?G=FCnther?= Subject: Re: [PATCH 01/10] drm/mxsfb: Update mxsfb to support a bridge Date: Sun, 21 Jul 2019 12:26:48 +0200 Message-ID: <20190721102647.GA999@bogon.m.sigxcpu.org> References: <1561555938-21595-1-git-send-email-robert.chiras@nxp.com> <1561555938-21595-2-git-send-email-robert.chiras@nxp.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <1561555938-21595-2-git-send-email-robert.chiras@nxp.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Robert Chiras Cc: Marek Vasut , Mark Rutland , Pengutronix Kernel Team , devicetree@vger.kernel.org, David Airlie , linux-kernel@vger.kernel.org, Rob Herring , dri-devel@lists.freedesktop.org, Shawn Guo , linux-arm-kernel@lists.infradead.org, NXP Linux Team List-Id: devicetree@vger.kernel.org SGkgUm9iZXJ0LApPbiBXZWQsIEp1biAyNiwgMjAxOSBhdCAwNDozMjowOVBNICswMzAwLCBSb2Jl cnQgQ2hpcmFzIHdyb3RlOgo+IEN1cnJlbnRseSwgdGhlIE1YU0ZCIERSTSBkcml2ZXIgb25seSBz dXBwb3J0cyBhIHBhbmVsLiBCdXQsIGl0cyBvdXRwdXQKPiBkaXNwbGF5IHNpZ25hbCBjYW4gYWxz byBiZSByZWRpcmVjdGVkIHRvIGFub3RoZXIgZW5jb2RlciwgbGlrZSBhIERTSQo+IGNvbnRyb2xs ZXIuIEluIHRoaXMgY2FzZSwgdGhhdCBEU0kgY29udHJvbGxlciBtYXkgYWN0IGxpa2UgYSBkcm1f YnJpZGdlLgo+IEluIG9yZGVyIHN1cHBvcnQgdGhpcyB1c2UtY2FzZSB0b28sIHRoaXMgcGF0Y2gg YWRkcyBzdXBwb3J0IGZvcgo+IGRybV9icmlkZ2UgaW4gbXhzZmIuCj4gCj4gU2lnbmVkLW9mZi1i eTogUm9iZXJ0IENoaXJhcyA8cm9iZXJ0LmNoaXJhc0BueHAuY29tPgo+IC0tLQo+ICBkcml2ZXJz L2dwdS9kcm0vbXhzZmIvbXhzZmJfY3J0Yy5jIHwgNDYgKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKystLS0KPiAgZHJpdmVycy9ncHUvZHJtL214c2ZiL214c2ZiX2Rydi5jICB8IDQ2 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tCj4gIGRyaXZlcnMvZ3B1L2Ry bS9teHNmYi9teHNmYl9kcnYuaCAgfCAgNCArKystCj4gIGRyaXZlcnMvZ3B1L2RybS9teHNmYi9t eHNmYl9vdXQuYyAgfCAyNiArKysrKysrKysrKy0tLS0tLS0tLS0KPiAgZHJpdmVycy9ncHUvZHJt L214c2ZiL214c2ZiX3JlZ3MuaCB8IDE1ICsrKysrKysrKysrKysKPiAgNSBmaWxlcyBjaGFuZ2Vk LCAxMTYgaW5zZXJ0aW9ucygrKSwgMjEgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9teHNmYi9teHNmYl9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXhzZmIv bXhzZmJfY3J0Yy5jCj4gaW5kZXggOTNmNDEzMy4uMTRiZGUwMjQgMTAwNjQ0Cj4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL214c2ZiL214c2ZiX2NydGMuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9t eHNmYi9teHNmYl9jcnRjLmMKPiBAQCAtOTMsOCArOTMsMTEgQEAgc3RhdGljIHZvaWQgbXhzZmJf c2V0X2J1c19mbXQoc3RydWN0IG14c2ZiX2RybV9wcml2YXRlICpteHNmYikKPiAgCj4gIAlyZWcg PSByZWFkbChteHNmYi0+YmFzZSArIExDRENfQ1RSTCk7Cj4gIAo+IC0JaWYgKG14c2ZiLT5jb25u ZWN0b3IuZGlzcGxheV9pbmZvLm51bV9idXNfZm9ybWF0cykKPiAtCQlidXNfZm9ybWF0ID0gbXhz ZmItPmNvbm5lY3Rvci5kaXNwbGF5X2luZm8uYnVzX2Zvcm1hdHNbMF07Cj4gKwlpZiAobXhzZmIt PmNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLm51bV9idXNfZm9ybWF0cykKPiArCQlidXNfZm9ybWF0 ID0gbXhzZmItPmNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJ1c19mb3JtYXRzWzBdOwo+ICsKPiAr CURSTV9ERVZfREVCVUdfRFJJVkVSKGRybS0+ZGV2LCAiVXNpbmcgYnVzX2Zvcm1hdDogMHglMDhY XG4iLAo+ICsJCQkgICAgIGJ1c19mb3JtYXQpOwo+ICAKPiAgCXJlZyAmPSB+Q1RSTF9CVVNfV0lE VEhfTUFTSzsKPiAgCXN3aXRjaCAoYnVzX2Zvcm1hdCkgewo+IEBAIC0xMjIsNiArMTI1LDkgQEAg c3RhdGljIHZvaWQgbXhzZmJfZW5hYmxlX2NvbnRyb2xsZXIoc3RydWN0IG14c2ZiX2RybV9wcml2 YXRlICpteHNmYikKPiAgCQljbGtfcHJlcGFyZV9lbmFibGUobXhzZmItPmNsa19kaXNwX2F4aSk7 Cj4gIAljbGtfcHJlcGFyZV9lbmFibGUobXhzZmItPmNsayk7Cj4gIAo+ICsJd3JpdGVsKENUUkwy X09VVFNUQU5ESU5HX1JFUVNfX1JFUV8xNiwKPiArCSAgICAgICBteHNmYi0+YmFzZSArIExDRENf VjRfQ1RSTDIgKyBSRUdfU0VUKTsKPiArCj4gIAkvKiBJZiBpdCB3YXMgZGlzYWJsZWQsIHJlLWVu YWJsZSB0aGUgbW9kZSBhZ2FpbiAqLwo+ICAJd3JpdGVsKENUUkxfRE9UQ0xLX01PREUsIG14c2Zi LT5iYXNlICsgTENEQ19DVFJMICsgUkVHX1NFVCk7Cj4gIAo+IEBAIC0xMzEsMTIgKzEzNywxNSBA QCBzdGF0aWMgdm9pZCBteHNmYl9lbmFibGVfY29udHJvbGxlcihzdHJ1Y3QgbXhzZmJfZHJtX3By aXZhdGUgKm14c2ZiKQo+ICAJd3JpdGVsKHJlZywgbXhzZmItPmJhc2UgKyBMQ0RDX1ZEQ1RSTDQp Owo+ICAKPiAgCXdyaXRlbChDVFJMX1JVTiwgbXhzZmItPmJhc2UgKyBMQ0RDX0NUUkwgKyBSRUdf U0VUKTsKPiArCXdyaXRlbChDVFJMMV9SRUNPVkVSWV9PTl9VTkRFUkZMT1csIG14c2ZiLT5iYXNl ICsgTENEQ19DVFJMMSArIFJFR19TRVQpOwo+ICB9Cj4gIAo+ICBzdGF0aWMgdm9pZCBteHNmYl9k aXNhYmxlX2NvbnRyb2xsZXIoc3RydWN0IG14c2ZiX2RybV9wcml2YXRlICpteHNmYikKPiAgewo+ ICAJdTMyIHJlZzsKPiAgCj4gKwl3cml0ZWwoQ1RSTF9SVU4sIG14c2ZiLT5iYXNlICsgTENEQ19D VFJMICsgUkVHX0NMUik7Cj4gKwo+ICAJLyoKPiAgCSAqIEV2ZW4gaWYgd2UgZGlzYWJsZSB0aGUg Y29udHJvbGxlciBoZXJlLCBpdCB3aWxsIHN0aWxsIGNvbnRpbnVlCj4gIAkgKiB1bnRpbCBpdHMg RklGT3MgYXJlIHJ1bm5pbmcgb3V0IG9mIGRhdGEKPiBAQCAtMjAyLDggKzIxMSw5IEBAIHN0YXRp YyBkbWFfYWRkcl90IG14c2ZiX2dldF9mYl9wYWRkcihzdHJ1Y3QgbXhzZmJfZHJtX3ByaXZhdGUg Km14c2ZiKQo+ICAKPiAgc3RhdGljIHZvaWQgbXhzZmJfY3J0Y19tb2RlX3NldF9ub2ZiKHN0cnVj dCBteHNmYl9kcm1fcHJpdmF0ZSAqbXhzZmIpCj4gIHsKPiArCXN0cnVjdCBkcm1fZGV2aWNlICpk cm0gPSBteHNmYi0+cGlwZS5jcnRjLmRldjsKPiAgCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpt ID0gJm14c2ZiLT5waXBlLmNydGMuc3RhdGUtPmFkanVzdGVkX21vZGU7Cj4gLQljb25zdCB1MzIg YnVzX2ZsYWdzID0gbXhzZmItPmNvbm5lY3Rvci5kaXNwbGF5X2luZm8uYnVzX2ZsYWdzOwo+ICsJ Y29uc3QgdTMyIGJ1c19mbGFncyA9IG14c2ZiLT5jb25uZWN0b3ItPmRpc3BsYXlfaW5mby5idXNf ZmxhZ3M7Cj4gIAl1MzIgdmRjdHJsMCwgdnN5bmNfcHVsc2VfbGVuLCBoc3luY19wdWxzZV9sZW47 Cj4gIAlpbnQgZXJyOwo+ICAKPiBAQCAtMjI3LDYgKzIzNywxMyBAQCBzdGF0aWMgdm9pZCBteHNm Yl9jcnRjX21vZGVfc2V0X25vZmIoc3RydWN0IG14c2ZiX2RybV9wcml2YXRlICpteHNmYikKPiAg Cj4gIAljbGtfc2V0X3JhdGUobXhzZmItPmNsaywgbS0+Y3J0Y19jbG9jayAqIDEwMDApOwo+ICAK PiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRybS0+ZGV2LCAiUGl4ZWwgY2xvY2s6ICVka0h6IChh Y3R1YWw6ICVka0h6KVxuIiwKPiArCQkJICAgICBtLT5jcnRjX2Nsb2NrLAo+ICsJCQkgICAgIChp bnQpKGNsa19nZXRfcmF0ZShteHNmYi0+Y2xrKSAvIDEwMDApKTsKPiArCURSTV9ERVZfREVCVUdf RFJJVkVSKGRybS0+ZGV2LCAiQ29ubmVjdG9yIGJ1c19mbGFnczogMHglMDhYXG4iLAo+ICsJCQkg ICAgIGJ1c19mbGFncyk7Cj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkcm0tPmRldiwgIk1vZGUg ZmxhZ3M6IDB4JTA4WFxuIiwgbS0+ZmxhZ3MpOwo+ICsKPiAgCXdyaXRlbChUUkFOU0ZFUl9DT1VO VF9TRVRfVkNPVU5UKG0tPmNydGNfdmRpc3BsYXkpIHwKPiAgCSAgICAgICBUUkFOU0ZFUl9DT1VO VF9TRVRfSENPVU5UKG0tPmNydGNfaGRpc3BsYXkpLAo+ICAJICAgICAgIG14c2ZiLT5iYXNlICsg bXhzZmItPmRldmRhdGEtPnRyYW5zZmVyX2NvdW50KTsKPiBAQCAtMjc5LDYgKzI5Niw3IEBAIHZv aWQgbXhzZmJfY3J0Y19lbmFibGUoc3RydWN0IG14c2ZiX2RybV9wcml2YXRlICpteHNmYikKPiAg CWRtYV9hZGRyX3QgcGFkZHI7Cj4gIAo+ICAJbXhzZmJfZW5hYmxlX2F4aV9jbGsobXhzZmIpOwo+ ICsJd3JpdGVsKDAsIG14c2ZiLT5iYXNlICsgTENEQ19DVFJMKTsKPiAgCW14c2ZiX2NydGNfbW9k ZV9zZXRfbm9mYihteHNmYik7Cj4gIAo+ICAJLyogV3JpdGUgY3VyX2J1ZiBhcyB3ZWxsIHRvIGF2 b2lkIGFuIGluaXRpYWwgY29ycnVwdCBmcmFtZSAqLwo+IEBAIC0zMDIsNiArMzIwLDggQEAgdm9p ZCBteHNmYl9wbGFuZV9hdG9taWNfdXBkYXRlKHN0cnVjdCBteHNmYl9kcm1fcHJpdmF0ZSAqbXhz ZmIsCj4gIHsKPiAgCXN0cnVjdCBkcm1fc2ltcGxlX2Rpc3BsYXlfcGlwZSAqcGlwZSA9ICZteHNm Yi0+cGlwZTsKPiAgCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9ICZwaXBlLT5jcnRjOwo+ICsJc3Ry dWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBwaXBlLT5wbGFuZS5zdGF0ZS0+ZmI7Cj4gKwlzdHJ1 Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIgPSBvbGRfc3RhdGUtPmZiOwo+ICAJc3RydWN0IGRy bV9wZW5kaW5nX3ZibGFua19ldmVudCAqZXZlbnQ7Cj4gIAlkbWFfYWRkcl90IHBhZGRyOwo+ICAK PiBAQCAtMzI0LDQgKzM0NCwyNCBAQCB2b2lkIG14c2ZiX3BsYW5lX2F0b21pY191cGRhdGUoc3Ry dWN0IG14c2ZiX2RybV9wcml2YXRlICpteHNmYiwKPiAgCQl3cml0ZWwocGFkZHIsIG14c2ZiLT5i YXNlICsgbXhzZmItPmRldmRhdGEtPm5leHRfYnVmKTsKPiAgCQlteHNmYl9kaXNhYmxlX2F4aV9j bGsobXhzZmIpOwo+ICAJfQo+ICsKPiArCWlmICghZmIgfHwgIW9sZF9mYikKPiArCQlyZXR1cm47 Cj4gKwo+ICsJLyoKPiArCSAqIFRPRE86IEN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IHBpeGVs IGZvcm1hdCBjaGFuZ2UsIGJ1dCB3ZSBuZWVkCj4gKwkgKiBhbHNvIHRvIGNhcmUgYWJvdXQgc2l6 ZSBjaGFuZ2VzIHRvbwo+ICsJICovCj4gKwlpZiAob2xkX2ZiLT5mb3JtYXQtPmZvcm1hdCAhPSBm Yi0+Zm9ybWF0LT5mb3JtYXQpIHsKPiArCQlzdHJ1Y3QgZHJtX2Zvcm1hdF9uYW1lX2J1ZiBvbGRf Zm10X2J1ZjsKPiArCQlzdHJ1Y3QgZHJtX2Zvcm1hdF9uYW1lX2J1ZiBuZXdfZm10X2J1ZjsKPiAr Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoY3J0Yy0+ZGV2LT5kZXYsCj4gKwkJCQkgICAgICJT d2l0Y2hpbmcgcGl4ZWwgZm9ybWF0OiAlcyAtPiAlc1xuIiwKPiArCQkJCSAgICAgZHJtX2dldF9m b3JtYXRfbmFtZShvbGRfZmItPmZvcm1hdC0+Zm9ybWF0LAo+ICsJCQkJCQkJICZvbGRfZm10X2J1 ZiksCj4gKwkJCQkgICAgIGRybV9nZXRfZm9ybWF0X25hbWUoZmItPmZvcm1hdC0+Zm9ybWF0LAo+ ICsJCQkJCQkJICZuZXdfZm10X2J1ZikpOwo+ICsJCW14c2ZiX3NldF9waXhlbF9mbXQobXhzZmIs IHRydWUpOwoKVGhpcyBhc3N1bWVzIG14c2ZiX3NldF9waXhlbF9mbXQgaGFzIHR3byBhcmd1bWVu dHMgd2hpY2ggaXMgYmVpbmcgaW50cm9kdWNlZAppbiB0aGUgZm9sbG93aW5nIGNvbW1pdC4gV2l0 aCB0aGF0IGZpeGVkOgoKVGVzdGVkLWJ5OiBHdWlkbyBHw7xudGhlciA8YWd4QHNpZ3hjcHUub3Jn PiAKCkNoZWVycywKIC0tIEd1aWRvCgo+ICsJfQo+ICB9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9teHNmYi9teHNmYl9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9teHNmYi9teHNmYl9k cnYuYwo+IGluZGV4IDZmYWZjOTAuLjBkMTcxZTkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL214c2ZiL214c2ZiX2Rydi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL214c2ZiL214c2Zi X2Rydi5jCj4gQEAgLTk4LDkgKzk4LDI1IEBAIHN0YXRpYyB2b2lkIG14c2ZiX3BpcGVfZW5hYmxl KHN0cnVjdCBkcm1fc2ltcGxlX2Rpc3BsYXlfcGlwZSAqcGlwZSwKPiAgCQkJICAgICAgc3RydWN0 IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlLAo+ICAJCQkgICAgICBzdHJ1Y3QgZHJtX3BsYW5l X3N0YXRlICpwbGFuZV9zdGF0ZSkKPiAgewo+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5l Y3RvcjsKPiAgCXN0cnVjdCBteHNmYl9kcm1fcHJpdmF0ZSAqbXhzZmIgPSBkcm1fcGlwZV90b19t eHNmYl9kcm1fcHJpdmF0ZShwaXBlKTsKPiAgCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBwaXBl LT5wbGFuZS5kZXY7Cj4gIAo+ICsJaWYgKCFteHNmYi0+Y29ubmVjdG9yKSB7Cj4gKwkJbGlzdF9m b3JfZWFjaF9lbnRyeShjb25uZWN0b3IsCj4gKwkJCQkgICAgJmRybS0+bW9kZV9jb25maWcuY29u bmVjdG9yX2xpc3QsCj4gKwkJCQkgICAgaGVhZCkKPiArCQkJaWYgKGNvbm5lY3Rvci0+ZW5jb2Rl ciA9PSAmbXhzZmItPnBpcGUuZW5jb2Rlcikgewo+ICsJCQkJbXhzZmItPmNvbm5lY3RvciA9IGNv bm5lY3RvcjsKPiArCQkJCWJyZWFrOwo+ICsJCQl9Cj4gKwl9Cj4gKwo+ICsJaWYgKCFteHNmYi0+ Y29ubmVjdG9yKSB7Cj4gKwkJZGV2X3dhcm4oZHJtLT5kZXYsICJObyBjb25uZWN0b3IgYXR0YWNo ZWQsIHVzaW5nIGRlZmF1bHRcbiIpOwo+ICsJCW14c2ZiLT5jb25uZWN0b3IgPSAmbXhzZmItPnBh bmVsX2Nvbm5lY3RvcjsKPiArCX0KPiArCj4gIAlwbV9ydW50aW1lX2dldF9zeW5jKGRybS0+ZGV2 KTsKPiAgCWRybV9wYW5lbF9wcmVwYXJlKG14c2ZiLT5wYW5lbCk7Cj4gIAlteHNmYl9jcnRjX2Vu YWJsZShteHNmYik7Cj4gQEAgLTEyNiw2ICsxNDIsOSBAQCBzdGF0aWMgdm9pZCBteHNmYl9waXBl X2Rpc2FibGUoc3RydWN0IGRybV9zaW1wbGVfZGlzcGxheV9waXBlICpwaXBlKQo+ICAJCWRybV9j cnRjX3NlbmRfdmJsYW5rX2V2ZW50KGNydGMsIGV2ZW50KTsKPiAgCX0KPiAgCXNwaW5fdW5sb2Nr X2lycSgmZHJtLT5ldmVudF9sb2NrKTsKPiArCj4gKwlpZiAobXhzZmItPmNvbm5lY3RvciAhPSAm bXhzZmItPnBhbmVsX2Nvbm5lY3RvcikKPiArCQlteHNmYi0+Y29ubmVjdG9yID0gTlVMTDsKPiAg fQo+ICAKPiAgc3RhdGljIHZvaWQgbXhzZmJfcGlwZV91cGRhdGUoc3RydWN0IGRybV9zaW1wbGVf ZGlzcGxheV9waXBlICpwaXBlLAo+IEBAIC0yMjMsMTYgKzI0MiwzMyBAQCBzdGF0aWMgaW50IG14 c2ZiX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgdW5zaWduZWQgbG9uZyBmbGFncykKPiAg Cj4gIAlyZXQgPSBkcm1fc2ltcGxlX2Rpc3BsYXlfcGlwZV9pbml0KGRybSwgJm14c2ZiLT5waXBl LCAmbXhzZmJfZnVuY3MsCj4gIAkJCW14c2ZiX2Zvcm1hdHMsIEFSUkFZX1NJWkUobXhzZmJfZm9y bWF0cyksIE5VTEwsCj4gLQkJCSZteHNmYi0+Y29ubmVjdG9yKTsKPiArCQkJbXhzZmItPmNvbm5l Y3Rvcik7Cj4gIAlpZiAocmV0IDwgMCkgewo+ICAJCWRldl9lcnIoZHJtLT5kZXYsICJDYW5ub3Qg c2V0dXAgc2ltcGxlIGRpc3BsYXkgcGlwZVxuIik7Cj4gIAkJZ290byBlcnJfdmJsYW5rOwo+ICAJ fQo+ICAKPiAtCXJldCA9IGRybV9wYW5lbF9hdHRhY2gobXhzZmItPnBhbmVsLCAmbXhzZmItPmNv bm5lY3Rvcik7Cj4gLQlpZiAocmV0KSB7Cj4gLQkJZGV2X2Vycihkcm0tPmRldiwgIkNhbm5vdCBj b25uZWN0IHBhbmVsXG4iKTsKPiAtCQlnb3RvIGVycl92Ymxhbms7Cj4gKwkvKgo+ICsJICogQXR0 YWNoIHBhbmVsIG9ubHkgaWYgdGhlcmUgaXMgb25lLgo+ICsJICogSWYgdGhlcmUgaXMgbm8gcGFu ZWwgYXR0YWNoLCBpdCBtdXN0IGJlIGEgYnJpZGdlLiBJbiB0aGlzIGNhc2UsIHdlCj4gKwkgKiBu ZWVkIGEgcmVmZXJlbmNlIHRvIGl0cyBjb25uZWN0b3IgZm9yIGEgcHJvcGVyIGluaXRpYWxpemF0 aW9uLgo+ICsJICogV2Ugd2lsbCBkbyB0aGlzIGNoZWNrIGluIHBpcGUtPmVuYWJsZSgpLCBzaW5j ZSB0aGUgY29ubmVjdG9yIHdvbid0Cj4gKwkgKiBiZSBhdHRhY2hlZCB0byBhbiBlbmNvZGVyIHVu dGlsIHRoZW4uCj4gKwkgKi8KPiArCj4gKwlpZiAobXhzZmItPnBhbmVsKSB7Cj4gKwkJcmV0ID0g ZHJtX3BhbmVsX2F0dGFjaChteHNmYi0+cGFuZWwsIG14c2ZiLT5jb25uZWN0b3IpOwo+ICsJCWlm IChyZXQpIHsKPiArCQkJZGV2X2Vycihkcm0tPmRldiwgIkNhbm5vdCBjb25uZWN0IHBhbmVsXG4i KTsKPiArCQkJZ290byBlcnJfdmJsYW5rOwo+ICsJCX0KPiArCX0gZWxzZSBpZiAobXhzZmItPmJy aWRnZSkgewo+ICsJCXJldCA9IGRybV9zaW1wbGVfZGlzcGxheV9waXBlX2F0dGFjaF9icmlkZ2Uo Jm14c2ZiLT5waXBlLAo+ICsJCQkJCQkJICAgIG14c2ZiLT5icmlkZ2UpOwo+ICsJCWlmIChyZXQp IHsKPiArCQkJZGV2X2Vycihkcm0tPmRldiwgIkNhbm5vdCBjb25uZWN0IGJyaWRnZVxuIik7Cj4g KwkJCWdvdG8gZXJyX3ZibGFuazsKPiArCQl9Cj4gIAl9Cj4gIAo+ICAJZHJtLT5tb2RlX2NvbmZp Zy5taW5fd2lkdGgJPSBNWFNGQl9NSU5fWFJFUzsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL214c2ZiL214c2ZiX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL214c2ZiL214c2ZiX2Rydi5o Cj4gaW5kZXggZDk3NTMwMC4uMGI2NWI1MSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v bXhzZmIvbXhzZmJfZHJ2LmgKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXhzZmIvbXhzZmJfZHJ2 LmgKPiBAQCAtMjcsOCArMjcsMTAgQEAgc3RydWN0IG14c2ZiX2RybV9wcml2YXRlIHsKPiAgCXN0 cnVjdCBjbGsJCQkqY2xrX2Rpc3BfYXhpOwo+ICAKPiAgCXN0cnVjdCBkcm1fc2ltcGxlX2Rpc3Bs YXlfcGlwZQlwaXBlOwo+IC0Jc3RydWN0IGRybV9jb25uZWN0b3IJCWNvbm5lY3RvcjsKPiArCXN0 cnVjdCBkcm1fY29ubmVjdG9yCQlwYW5lbF9jb25uZWN0b3I7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5l Y3RvcgkJKmNvbm5lY3RvcjsKPiAgCXN0cnVjdCBkcm1fcGFuZWwJCSpwYW5lbDsKPiArCXN0cnVj dCBkcm1fYnJpZGdlCQkqYnJpZGdlOwo+ICB9Owo+ICAKPiAgaW50IG14c2ZiX3NldHVwX2NydGMo c3RydWN0IGRybV9kZXZpY2UgKmRldik7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9t eHNmYi9teHNmYl9vdXQuYyBiL2RyaXZlcnMvZ3B1L2RybS9teHNmYi9teHNmYl9vdXQuYwo+IGlu ZGV4IDkxZTc2ZjkuLmI5YWNmMmIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL214c2Zi L214c2ZiX291dC5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL214c2ZiL214c2ZiX291dC5jCj4g QEAgLTIyLDcgKzIyLDggQEAKPiAgc3RhdGljIHN0cnVjdCBteHNmYl9kcm1fcHJpdmF0ZSAqCj4g IGRybV9jb25uZWN0b3JfdG9fbXhzZmJfZHJtX3ByaXZhdGUoc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvcikKPiAgewo+IC0JcmV0dXJuIGNvbnRhaW5lcl9vZihjb25uZWN0b3IsIHN0cnVj dCBteHNmYl9kcm1fcHJpdmF0ZSwgY29ubmVjdG9yKTsKPiArCXJldHVybiBjb250YWluZXJfb2Yo Y29ubmVjdG9yLCBzdHJ1Y3QgbXhzZmJfZHJtX3ByaXZhdGUsCj4gKwkJCSAgICBwYW5lbF9jb25u ZWN0b3IpOwo+ICB9Cj4gIAo+ICBzdGF0aWMgaW50IG14c2ZiX3BhbmVsX2dldF9tb2RlcyhzdHJ1 Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+IEBAIC03NywyMiArNzgsMjMgQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIG14c2ZiX3BhbmVsX2Nvbm5lY3Rvcl9m dW5jcyA9IHsKPiAgaW50IG14c2ZiX2NyZWF0ZV9vdXRwdXQoc3RydWN0IGRybV9kZXZpY2UgKmRy bSkKPiAgewo+ICAJc3RydWN0IG14c2ZiX2RybV9wcml2YXRlICpteHNmYiA9IGRybS0+ZGV2X3By aXZhdGU7Cj4gLQlzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbDsKPiAgCWludCByZXQ7Cj4gIAo+IC0J cmV0ID0gZHJtX29mX2ZpbmRfcGFuZWxfb3JfYnJpZGdlKGRybS0+ZGV2LT5vZl9ub2RlLCAwLCAw LCAmcGFuZWwsIE5VTEwpOwo+ICsJcmV0ID0gZHJtX29mX2ZpbmRfcGFuZWxfb3JfYnJpZGdlKGRy bS0+ZGV2LT5vZl9ub2RlLCAwLCAwLAo+ICsJCQkJCSAgJm14c2ZiLT5wYW5lbCwgJm14c2ZiLT5i cmlkZ2UpOwo+ICAJaWYgKHJldCkKPiAgCQlyZXR1cm4gcmV0Owo+ICAKPiAtCW14c2ZiLT5jb25u ZWN0b3IuZHBtcyA9IERSTV9NT0RFX0RQTVNfT0ZGOwo+IC0JbXhzZmItPmNvbm5lY3Rvci5wb2xs ZWQgPSAwOwo+IC0JZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZteHNmYi0+Y29ubmVjdG9yLAo+ IC0JCQkmbXhzZmJfcGFuZWxfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7Cj4gLQlyZXQgPSBkcm1f Y29ubmVjdG9yX2luaXQoZHJtLCAmbXhzZmItPmNvbm5lY3RvciwKPiAtCQkJCSAmbXhzZmJfcGFu ZWxfY29ubmVjdG9yX2Z1bmNzLAo+IC0JCQkJIERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duKTsK PiAtCWlmICghcmV0KQo+IC0JCW14c2ZiLT5wYW5lbCA9IHBhbmVsOwo+ICsJaWYgKG14c2ZiLT5w YW5lbCkgewo+ICsJCW14c2ZiLT5jb25uZWN0b3IgPSAmbXhzZmItPnBhbmVsX2Nvbm5lY3RvcjsK PiArCQlteHNmYi0+Y29ubmVjdG9yLT5kcG1zID0gRFJNX01PREVfRFBNU19PRkY7Cj4gKwkJbXhz ZmItPmNvbm5lY3Rvci0+cG9sbGVkID0gMDsKPiArCQlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQo bXhzZmItPmNvbm5lY3RvciwKPiArCQkJCQkgJm14c2ZiX3BhbmVsX2Nvbm5lY3Rvcl9oZWxwZXJf ZnVuY3MpOwo+ICsJCXJldCA9IGRybV9jb25uZWN0b3JfaW5pdChkcm0sIG14c2ZiLT5jb25uZWN0 b3IsCj4gKwkJCQkJICZteHNmYl9wYW5lbF9jb25uZWN0b3JfZnVuY3MsCj4gKwkJCQkJIERSTV9N T0RFX0NPTk5FQ1RPUl9Vbmtub3duKTsKPiArCX0KPiAgCj4gIAlyZXR1cm4gcmV0Owo+ICB9Cj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9teHNmYi9teHNmYl9yZWdzLmggYi9kcml2ZXJz L2dwdS9kcm0vbXhzZmIvbXhzZmJfcmVncy5oCj4gaW5kZXggOTMyZDdlYS4uNzE0MjZhYSAxMDA2 NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXhzZmIvbXhzZmJfcmVncy5oCj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL214c2ZiL214c2ZiX3JlZ3MuaAo+IEBAIC0xNCwxOSArMTQsMzEgQEAKPiAg Cj4gICNkZWZpbmUgTENEQ19DVFJMCQkJMHgwMAo+ICAjZGVmaW5lIExDRENfQ1RSTDEJCQkweDEw Cj4gKyNkZWZpbmUgTENEQ19WNF9DVFJMMgkJCTB4MjAKPiAgI2RlZmluZSBMQ0RDX1YzX1RSQU5T RkVSX0NPVU5UCQkweDIwCj4gICNkZWZpbmUgTENEQ19WNF9UUkFOU0ZFUl9DT1VOVAkJMHgzMAo+ ICAjZGVmaW5lIExDRENfVjRfQ1VSX0JVRgkJCTB4NDAKPiAgI2RlZmluZSBMQ0RDX1Y0X05FWFRf QlVGCQkweDUwCj4gICNkZWZpbmUgTENEQ19WM19DVVJfQlVGCQkJMHgzMAo+ICAjZGVmaW5lIExD RENfVjNfTkVYVF9CVUYJCTB4NDAKPiArI2RlZmluZSBMQ0RDX1RJTUlORwkJCTB4NjAKPiAgI2Rl ZmluZSBMQ0RDX1ZEQ1RSTDAJCQkweDcwCj4gICNkZWZpbmUgTENEQ19WRENUUkwxCQkJMHg4MAo+ ICAjZGVmaW5lIExDRENfVkRDVFJMMgkJCTB4OTAKPiAgI2RlZmluZSBMQ0RDX1ZEQ1RSTDMJCQkw eGEwCj4gICNkZWZpbmUgTENEQ19WRENUUkw0CQkJMHhiMAo+ICsjZGVmaW5lIExDRENfRFZJQ1RS TDAJCQkweGMwCj4gKyNkZWZpbmUgTENEQ19EVklDVFJMMQkJCTB4ZDAKPiArI2RlZmluZSBMQ0RD X0RWSUNUUkwyCQkJMHhlMAo+ICsjZGVmaW5lIExDRENfRFZJQ1RSTDMJCQkweGYwCj4gKyNkZWZp bmUgTENEQ19EVklDVFJMNAkJCTB4MTAwCj4gKyNkZWZpbmUgTENEQ19WNF9EQVRBCQkJMHgxODAK PiArI2RlZmluZSBMQ0RDX1YzX0RBVEEJCQkweDFiMAo+ICAjZGVmaW5lIExDRENfVjRfREVCVUcw CQkJMHgxZDAKPiAgI2RlZmluZSBMQ0RDX1YzX0RFQlVHMAkJCTB4MWYwCj4gKyNkZWZpbmUgTENE Q19BU19DVFJMCQkJMHgyMTAKPiArI2RlZmluZSBMQ0RDX0FTX0JVRgkJCTB4MjIwCj4gKyNkZWZp bmUgTENEQ19BU19ORVhUX0JVRgkJMHgyMzAKPiAgCj4gICNkZWZpbmUgQ1RSTF9TRlRSU1QJCQko MSA8PCAzMSkKPiAgI2RlZmluZSBDVFJMX0NMS0dBVEUJCQkoMSA8PCAzMCkKPiBAQCAtNDUsMTIg KzU3LDE1IEBACj4gICNkZWZpbmUgQ1RSTF9ERjI0CQkJKDEgPDwgMSkKPiAgI2RlZmluZSBDVFJM X1JVTgkJCSgxIDw8IDApCj4gIAo+ICsjZGVmaW5lIENUUkwxX1JFQ09WRVJZX09OX1VOREVSRkxP VwkoMSA8PCAyNCkKPiAgI2RlZmluZSBDVFJMMV9GSUZPX0NMRUFSCQkoMSA8PCAyMSkKPiAgI2Rl ZmluZSBDVFJMMV9TRVRfQllURV9QQUNLQUdJTkcoeCkJKCgoeCkgJiAweGYpIDw8IDE2KQo+ICAj ZGVmaW5lIENUUkwxX0dFVF9CWVRFX1BBQ0tBR0lORyh4KQkoKCh4KSA+PiAxNikgJiAweGYpCj4g ICNkZWZpbmUgQ1RSTDFfQ1VSX0ZSQU1FX0RPTkVfSVJRX0VOCSgxIDw8IDEzKQo+ICAjZGVmaW5l IENUUkwxX0NVUl9GUkFNRV9ET05FX0lSUQkoMSA8PCA5KQo+ICAKPiArI2RlZmluZSBDVFJMMl9P VVRTVEFORElOR19SRVFTX19SRVFfMTYJCSg0IDw8IDIxKQo+ICsKPiAgI2RlZmluZSBUUkFOU0ZF Ul9DT1VOVF9TRVRfVkNPVU5UKHgpCSgoKHgpICYgMHhmZmZmKSA8PCAxNikKPiAgI2RlZmluZSBU UkFOU0ZFUl9DT1VOVF9HRVRfVkNPVU5UKHgpCSgoKHgpID4+IDE2KSAmIDB4ZmZmZikKPiAgI2Rl ZmluZSBUUkFOU0ZFUl9DT1VOVF9TRVRfSENPVU5UKHgpCSgoeCkgJiAweGZmZmYpCj4gLS0gCj4g Mi43LjQKPiAKPiAKPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwo+IGxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0Cj4gbGludXgtYXJtLWtlcm5lbEBs aXN0cy5pbmZyYWRlYWQub3JnCj4gaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1hcm0ta2VybmVsCj4gCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2RyaS1kZXZlbA== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B8170C76188 for ; Sun, 21 Jul 2019 10:27:08 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 79383208C0 for ; Sun, 21 Jul 2019 10:27:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="CrzwIayG" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 79383208C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sigxcpu.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=B7Ra1PdsE7sBJggJfYng8NO+CEVkpv9jKZPMcef1usU=; b=CrzwIayGFk3gpQ EGJLufs/SqPot0wqm7UORIJhjcWN4lvPT0mz6X5K5QwLO9miB5qs4q8ORGFTslrQim+bKzGO26aHy R36jrYwyDuVS8XilRwQpgqM+q7OdLUeHggydywJ+owyldQoqHBMZhYr4SQiAuThQh/K53hXHMDKYL Sz3fEcLm3lM9lZfHphVvCIXePsXKR+dIglIJUdu6Ct5Jk7ZXksrBGWAg6aEgWGKLRt8Ifid8XKHiS XkuBeZKTfbFKZFiMxRVzgy2I7r22M6KL7ENy4CyxJoQMO/LbyNbet2XDzmGEAqEW0xAImPHcrQLkz 68cwjgVGLWtrzlT5r1xg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hp93X-0006wJ-8H; Sun, 21 Jul 2019 10:27:03 +0000 Received: from honk.sigxcpu.org ([24.134.29.49]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hp93O-0006ua-Ge for linux-arm-kernel@lists.infradead.org; Sun, 21 Jul 2019 10:26:57 +0000 Received: from localhost (localhost [127.0.0.1]) by honk.sigxcpu.org (Postfix) with ESMTP id D9795FB03; Sun, 21 Jul 2019 12:26:50 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at honk.sigxcpu.org Received: from honk.sigxcpu.org ([127.0.0.1]) by localhost (honk.sigxcpu.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8DykkjfOyHTt; Sun, 21 Jul 2019 12:26:48 +0200 (CEST) Received: by bogon.sigxcpu.org (Postfix, from userid 1000) id 1510B41113; Sun, 21 Jul 2019 12:26:48 +0200 (CEST) Date: Sun, 21 Jul 2019 12:26:48 +0200 From: Guido =?iso-8859-1?Q?G=FCnther?= To: Robert Chiras Subject: Re: [PATCH 01/10] drm/mxsfb: Update mxsfb to support a bridge Message-ID: <20190721102647.GA999@bogon.m.sigxcpu.org> References: <1561555938-21595-1-git-send-email-robert.chiras@nxp.com> <1561555938-21595-2-git-send-email-robert.chiras@nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1561555938-21595-2-git-send-email-robert.chiras@nxp.com> User-Agent: Mutt/1.10.1 (2018-07-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190721_032654_863119_7260927E X-CRM114-Status: GOOD ( 29.19 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marek Vasut , Mark Rutland , Pengutronix Kernel Team , devicetree@vger.kernel.org, David Airlie , Fabio Estevam , Sascha Hauer , linux-kernel@vger.kernel.org, Stefan Agner , Rob Herring , dri-devel@lists.freedesktop.org, Daniel Vetter , Shawn Guo , linux-arm-kernel@lists.infradead.org, NXP Linux Team Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Robert, On Wed, Jun 26, 2019 at 04:32:09PM +0300, Robert Chiras wrote: > Currently, the MXSFB DRM driver only supports a panel. But, its output > display signal can also be redirected to another encoder, like a DSI > controller. In this case, that DSI controller may act like a drm_bridge. > In order support this use-case too, this patch adds support for > drm_bridge in mxsfb. > = > Signed-off-by: Robert Chiras > --- > drivers/gpu/drm/mxsfb/mxsfb_crtc.c | 46 ++++++++++++++++++++++++++++++++= +++--- > drivers/gpu/drm/mxsfb/mxsfb_drv.c | 46 ++++++++++++++++++++++++++++++++= +----- > drivers/gpu/drm/mxsfb/mxsfb_drv.h | 4 +++- > drivers/gpu/drm/mxsfb/mxsfb_out.c | 26 +++++++++++---------- > drivers/gpu/drm/mxsfb/mxsfb_regs.h | 15 +++++++++++++ > 5 files changed, 116 insertions(+), 21 deletions(-) > = > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c b/drivers/gpu/drm/mxsfb/m= xsfb_crtc.c > index 93f4133..14bde024 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c > +++ b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c > @@ -93,8 +93,11 @@ static void mxsfb_set_bus_fmt(struct mxsfb_drm_private= *mxsfb) > = > reg =3D readl(mxsfb->base + LCDC_CTRL); > = > - if (mxsfb->connector.display_info.num_bus_formats) > - bus_format =3D mxsfb->connector.display_info.bus_formats[0]; > + if (mxsfb->connector->display_info.num_bus_formats) > + bus_format =3D mxsfb->connector->display_info.bus_formats[0]; > + > + DRM_DEV_DEBUG_DRIVER(drm->dev, "Using bus_format: 0x%08X\n", > + bus_format); > = > reg &=3D ~CTRL_BUS_WIDTH_MASK; > switch (bus_format) { > @@ -122,6 +125,9 @@ static void mxsfb_enable_controller(struct mxsfb_drm_= private *mxsfb) > clk_prepare_enable(mxsfb->clk_disp_axi); > clk_prepare_enable(mxsfb->clk); > = > + writel(CTRL2_OUTSTANDING_REQS__REQ_16, > + mxsfb->base + LCDC_V4_CTRL2 + REG_SET); > + > /* If it was disabled, re-enable the mode again */ > writel(CTRL_DOTCLK_MODE, mxsfb->base + LCDC_CTRL + REG_SET); > = > @@ -131,12 +137,15 @@ static void mxsfb_enable_controller(struct mxsfb_dr= m_private *mxsfb) > writel(reg, mxsfb->base + LCDC_VDCTRL4); > = > writel(CTRL_RUN, mxsfb->base + LCDC_CTRL + REG_SET); > + writel(CTRL1_RECOVERY_ON_UNDERFLOW, mxsfb->base + LCDC_CTRL1 + REG_SET); > } > = > static void mxsfb_disable_controller(struct mxsfb_drm_private *mxsfb) > { > u32 reg; > = > + writel(CTRL_RUN, mxsfb->base + LCDC_CTRL + REG_CLR); > + > /* > * Even if we disable the controller here, it will still continue > * until its FIFOs are running out of data > @@ -202,8 +211,9 @@ static dma_addr_t mxsfb_get_fb_paddr(struct mxsfb_drm= _private *mxsfb) > = > static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb) > { > + struct drm_device *drm =3D mxsfb->pipe.crtc.dev; > struct drm_display_mode *m =3D &mxsfb->pipe.crtc.state->adjusted_mode; > - const u32 bus_flags =3D mxsfb->connector.display_info.bus_flags; > + const u32 bus_flags =3D mxsfb->connector->display_info.bus_flags; > u32 vdctrl0, vsync_pulse_len, hsync_pulse_len; > int err; > = > @@ -227,6 +237,13 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_dr= m_private *mxsfb) > = > clk_set_rate(mxsfb->clk, m->crtc_clock * 1000); > = > + DRM_DEV_DEBUG_DRIVER(drm->dev, "Pixel clock: %dkHz (actual: %dkHz)\n", > + m->crtc_clock, > + (int)(clk_get_rate(mxsfb->clk) / 1000)); > + DRM_DEV_DEBUG_DRIVER(drm->dev, "Connector bus_flags: 0x%08X\n", > + bus_flags); > + DRM_DEV_DEBUG_DRIVER(drm->dev, "Mode flags: 0x%08X\n", m->flags); > + > writel(TRANSFER_COUNT_SET_VCOUNT(m->crtc_vdisplay) | > TRANSFER_COUNT_SET_HCOUNT(m->crtc_hdisplay), > mxsfb->base + mxsfb->devdata->transfer_count); > @@ -279,6 +296,7 @@ void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsf= b) > dma_addr_t paddr; > = > mxsfb_enable_axi_clk(mxsfb); > + writel(0, mxsfb->base + LCDC_CTRL); > mxsfb_crtc_mode_set_nofb(mxsfb); > = > /* Write cur_buf as well to avoid an initial corrupt frame */ > @@ -302,6 +320,8 @@ void mxsfb_plane_atomic_update(struct mxsfb_drm_priva= te *mxsfb, > { > struct drm_simple_display_pipe *pipe =3D &mxsfb->pipe; > struct drm_crtc *crtc =3D &pipe->crtc; > + struct drm_framebuffer *fb =3D pipe->plane.state->fb; > + struct drm_framebuffer *old_fb =3D old_state->fb; > struct drm_pending_vblank_event *event; > dma_addr_t paddr; > = > @@ -324,4 +344,24 @@ void mxsfb_plane_atomic_update(struct mxsfb_drm_priv= ate *mxsfb, > writel(paddr, mxsfb->base + mxsfb->devdata->next_buf); > mxsfb_disable_axi_clk(mxsfb); > } > + > + if (!fb || !old_fb) > + return; > + > + /* > + * TODO: Currently, we only support pixel format change, but we need > + * also to care about size changes too > + */ > + if (old_fb->format->format !=3D fb->format->format) { > + struct drm_format_name_buf old_fmt_buf; > + struct drm_format_name_buf new_fmt_buf; > + > + DRM_DEV_DEBUG_DRIVER(crtc->dev->dev, > + "Switching pixel format: %s -> %s\n", > + drm_get_format_name(old_fb->format->format, > + &old_fmt_buf), > + drm_get_format_name(fb->format->format, > + &new_fmt_buf)); > + mxsfb_set_pixel_fmt(mxsfb, true); This assumes mxsfb_set_pixel_fmt has two arguments which is being introduced in the following commit. With that fixed: Tested-by: Guido G=FCnther = Cheers, -- Guido > + } > } > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mx= sfb_drv.c > index 6fafc90..0d171e9 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c > +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c > @@ -98,9 +98,25 @@ static void mxsfb_pipe_enable(struct drm_simple_displa= y_pipe *pipe, > struct drm_crtc_state *crtc_state, > struct drm_plane_state *plane_state) > { > + struct drm_connector *connector; > struct mxsfb_drm_private *mxsfb =3D drm_pipe_to_mxsfb_drm_private(pipe); > struct drm_device *drm =3D pipe->plane.dev; > = > + if (!mxsfb->connector) { > + list_for_each_entry(connector, > + &drm->mode_config.connector_list, > + head) > + if (connector->encoder =3D=3D &mxsfb->pipe.encoder) { > + mxsfb->connector =3D connector; > + break; > + } > + } > + > + if (!mxsfb->connector) { > + dev_warn(drm->dev, "No connector attached, using default\n"); > + mxsfb->connector =3D &mxsfb->panel_connector; > + } > + > pm_runtime_get_sync(drm->dev); > drm_panel_prepare(mxsfb->panel); > mxsfb_crtc_enable(mxsfb); > @@ -126,6 +142,9 @@ static void mxsfb_pipe_disable(struct drm_simple_disp= lay_pipe *pipe) > drm_crtc_send_vblank_event(crtc, event); > } > spin_unlock_irq(&drm->event_lock); > + > + if (mxsfb->connector !=3D &mxsfb->panel_connector) > + mxsfb->connector =3D NULL; > } > = > static void mxsfb_pipe_update(struct drm_simple_display_pipe *pipe, > @@ -223,16 +242,33 @@ static int mxsfb_load(struct drm_device *drm, unsig= ned long flags) > = > ret =3D drm_simple_display_pipe_init(drm, &mxsfb->pipe, &mxsfb_funcs, > mxsfb_formats, ARRAY_SIZE(mxsfb_formats), NULL, > - &mxsfb->connector); > + mxsfb->connector); > if (ret < 0) { > dev_err(drm->dev, "Cannot setup simple display pipe\n"); > goto err_vblank; > } > = > - ret =3D drm_panel_attach(mxsfb->panel, &mxsfb->connector); > - if (ret) { > - dev_err(drm->dev, "Cannot connect panel\n"); > - goto err_vblank; > + /* > + * Attach panel only if there is one. > + * If there is no panel attach, it must be a bridge. In this case, we > + * need a reference to its connector for a proper initialization. > + * We will do this check in pipe->enable(), since the connector won't > + * be attached to an encoder until then. > + */ > + > + if (mxsfb->panel) { > + ret =3D drm_panel_attach(mxsfb->panel, mxsfb->connector); > + if (ret) { > + dev_err(drm->dev, "Cannot connect panel\n"); > + goto err_vblank; > + } > + } else if (mxsfb->bridge) { > + ret =3D drm_simple_display_pipe_attach_bridge(&mxsfb->pipe, > + mxsfb->bridge); > + if (ret) { > + dev_err(drm->dev, "Cannot connect bridge\n"); > + goto err_vblank; > + } > } > = > drm->mode_config.min_width =3D MXSFB_MIN_XRES; > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.h b/drivers/gpu/drm/mxsfb/mx= sfb_drv.h > index d975300..0b65b51 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.h > +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.h > @@ -27,8 +27,10 @@ struct mxsfb_drm_private { > struct clk *clk_disp_axi; > = > struct drm_simple_display_pipe pipe; > - struct drm_connector connector; > + struct drm_connector panel_connector; > + struct drm_connector *connector; > struct drm_panel *panel; > + struct drm_bridge *bridge; > }; > = > int mxsfb_setup_crtc(struct drm_device *dev); > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_out.c b/drivers/gpu/drm/mxsfb/mx= sfb_out.c > index 91e76f9..b9acf2b 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_out.c > +++ b/drivers/gpu/drm/mxsfb/mxsfb_out.c > @@ -22,7 +22,8 @@ > static struct mxsfb_drm_private * > drm_connector_to_mxsfb_drm_private(struct drm_connector *connector) > { > - return container_of(connector, struct mxsfb_drm_private, connector); > + return container_of(connector, struct mxsfb_drm_private, > + panel_connector); > } > = > static int mxsfb_panel_get_modes(struct drm_connector *connector) > @@ -77,22 +78,23 @@ static const struct drm_connector_funcs mxsfb_panel_c= onnector_funcs =3D { > int mxsfb_create_output(struct drm_device *drm) > { > struct mxsfb_drm_private *mxsfb =3D drm->dev_private; > - struct drm_panel *panel; > int ret; > = > - ret =3D drm_of_find_panel_or_bridge(drm->dev->of_node, 0, 0, &panel, NU= LL); > + ret =3D drm_of_find_panel_or_bridge(drm->dev->of_node, 0, 0, > + &mxsfb->panel, &mxsfb->bridge); > if (ret) > return ret; > = > - mxsfb->connector.dpms =3D DRM_MODE_DPMS_OFF; > - mxsfb->connector.polled =3D 0; > - drm_connector_helper_add(&mxsfb->connector, > - &mxsfb_panel_connector_helper_funcs); > - ret =3D drm_connector_init(drm, &mxsfb->connector, > - &mxsfb_panel_connector_funcs, > - DRM_MODE_CONNECTOR_Unknown); > - if (!ret) > - mxsfb->panel =3D panel; > + if (mxsfb->panel) { > + mxsfb->connector =3D &mxsfb->panel_connector; > + mxsfb->connector->dpms =3D DRM_MODE_DPMS_OFF; > + mxsfb->connector->polled =3D 0; > + drm_connector_helper_add(mxsfb->connector, > + &mxsfb_panel_connector_helper_funcs); > + ret =3D drm_connector_init(drm, mxsfb->connector, > + &mxsfb_panel_connector_funcs, > + DRM_MODE_CONNECTOR_Unknown); > + } > = > return ret; > } > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_regs.h b/drivers/gpu/drm/mxsfb/m= xsfb_regs.h > index 932d7ea..71426aa 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_regs.h > +++ b/drivers/gpu/drm/mxsfb/mxsfb_regs.h > @@ -14,19 +14,31 @@ > = > #define LCDC_CTRL 0x00 > #define LCDC_CTRL1 0x10 > +#define LCDC_V4_CTRL2 0x20 > #define LCDC_V3_TRANSFER_COUNT 0x20 > #define LCDC_V4_TRANSFER_COUNT 0x30 > #define LCDC_V4_CUR_BUF 0x40 > #define LCDC_V4_NEXT_BUF 0x50 > #define LCDC_V3_CUR_BUF 0x30 > #define LCDC_V3_NEXT_BUF 0x40 > +#define LCDC_TIMING 0x60 > #define LCDC_VDCTRL0 0x70 > #define LCDC_VDCTRL1 0x80 > #define LCDC_VDCTRL2 0x90 > #define LCDC_VDCTRL3 0xa0 > #define LCDC_VDCTRL4 0xb0 > +#define LCDC_DVICTRL0 0xc0 > +#define LCDC_DVICTRL1 0xd0 > +#define LCDC_DVICTRL2 0xe0 > +#define LCDC_DVICTRL3 0xf0 > +#define LCDC_DVICTRL4 0x100 > +#define LCDC_V4_DATA 0x180 > +#define LCDC_V3_DATA 0x1b0 > #define LCDC_V4_DEBUG0 0x1d0 > #define LCDC_V3_DEBUG0 0x1f0 > +#define LCDC_AS_CTRL 0x210 > +#define LCDC_AS_BUF 0x220 > +#define LCDC_AS_NEXT_BUF 0x230 > = > #define CTRL_SFTRST (1 << 31) > #define CTRL_CLKGATE (1 << 30) > @@ -45,12 +57,15 @@ > #define CTRL_DF24 (1 << 1) > #define CTRL_RUN (1 << 0) > = > +#define CTRL1_RECOVERY_ON_UNDERFLOW (1 << 24) > #define CTRL1_FIFO_CLEAR (1 << 21) > #define CTRL1_SET_BYTE_PACKAGING(x) (((x) & 0xf) << 16) > #define CTRL1_GET_BYTE_PACKAGING(x) (((x) >> 16) & 0xf) > #define CTRL1_CUR_FRAME_DONE_IRQ_EN (1 << 13) > #define CTRL1_CUR_FRAME_DONE_IRQ (1 << 9) > = > +#define CTRL2_OUTSTANDING_REQS__REQ_16 (4 << 21) > + > #define TRANSFER_COUNT_SET_VCOUNT(x) (((x) & 0xffff) << 16) > #define TRANSFER_COUNT_GET_VCOUNT(x) (((x) >> 16) & 0xffff) > #define TRANSFER_COUNT_SET_HCOUNT(x) ((x) & 0xffff) > -- = > 2.7.4 > = > = > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > = _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel