From mboxrd@z Thu Jan 1 00:00:00 1970 From: robin.murphy@arm.com (Robin Murphy) Date: Thu, 10 Dec 2015 11:46:30 +0000 Subject: [PATCH v5 2/4] drm: Add support for ARM's HDLCD controller. In-Reply-To: <20151208165241.GN972@e106497-lin.cambridge.arm.com> References: <1449490265-6752-1-git-send-email-Liviu.Dudau@arm.com> <1449490265-6752-3-git-send-email-Liviu.Dudau@arm.com> <56670477.5000301@arm.com> <20151208165241.GN972@e106497-lin.cambridge.arm.com> Message-ID: <56696616.20805@arm.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 08/12/15 16:52, Liviu Dudau wrote: > On Tue, Dec 08, 2015 at 04:25:27PM +0000, Robin Murphy wrote: >> Hi Liviu, >> >> On 07/12/15 12:11, Liviu Dudau wrote: >>> The HDLCD controller is a display controller that supports resolutions >>> up to 4096x4096 pixels. It is present on various development boards >>> produced by ARM Ltd and emulated by the latest Fast Models from the >>> company. >>> >>> Cc: David Airlie >>> Cc: Robin Murphy >> >> I've given this a spin on my Juno, and the first thing of note is this: >> >> hdlcd 7ff60000.hdlcd: master bind failed: -517 >> hdlcd 7ff50000.hdlcd: master bind failed: -517 >> scpi_protocol scpi: SCP Protocol 1.0 Firmware 1.9.0 version >> [drm] found ARM HDLCD version r0p0 >> tda998x 0-0070: Falling back to first CRTC >> usb 1-1: new high-speed USB device number 2 using ehci-platform >> tda998x 0-0070: found TDA19988 >> hdlcd 7ff60000.hdlcd: bound 0-0070 (ops tda998x_ops) >> [drm] Supports vblank timestamp caching Rev 2 (21.10.2013). >> [drm] No driver support for vblank timestamp query. >> ------------[ cut here ]------------ >> WARNING: at drivers/gpu/drm/drm_atomic_helper.c:682 >> Modules linked in: >> >> CPU: 2 PID: 98 Comm: kworker/u12:3 Tainted: G W 4.4.0-rc2+ #846 >> Hardware name: ARM Juno development board (r1) (DT) >> Workqueue: deferwq deferred_probe_work_func >> task: fffffe007ecb3700 ti: fffffe09409c8000 task.ti: fffffe09409c8000 >> PC is at drm_atomic_helper_update_legacy_modeset_state+0x1e8/0x1f0 >> LR is at drm_atomic_helper_commit_modeset_disables+0x1a8/0x388 >> pc : [] lr : [] pstate: 20000045 >> sp : fffffe09409cb560 >> x29: fffffe09409cb560 x28: fffffe0940bf2800 >> x27: fffffe0940070000 x26: 0000000000000001 >> x25: fffffe0000be4b50 x24: fffffe00007ae820 >> x23: fffffe0000be4b50 x22: fffffe0940bd1000 >> x21: fffffe0940bd1000 x20: 0000000000000000 >> x19: fffffe0940968000 x18: fffffe0940c8091c >> x17: 0000000000000007 x16: 0000000000000001 >> x15: fffffe0940c8016f x14: 0000003c00000000 >> x13: 0000000000000000 x12: 000004c9000004b4 >> x11: 000004b1000004c9 x10: 000004b0000004b0 >> x9 : 00000000000006f4 x8 : 000006a400000654 >> x7 : 000006f400000640 x6 : fffffe0940966480 >> x5 : fffffe0940968200 x4 : 0000000000000001 >> x3 : fffffe0940966a80 x2 : 0000000000000000 >> x1 : fffffe0940bd0900 x0 : fffffe0940bd0960 >> >> ---[ end trace bdb6af69b29bf7ea ]--- >> Call trace: >> [] >> drm_atomic_helper_update_legacy_modeset_state+0x1e8/0x1f0 >> [] drm_atomic_helper_commit_modeset_disables+0x1a8/0x388 >> [] drm_atomic_helper_commit+0xd8/0x140 >> [] hdlcd_atomic_commit+0x10/0x18 >> [] drm_atomic_commit+0x40/0x70 >> [] restore_fbdev_mode+0x270/0x2b0 >> [] drm_fb_helper_restore_fbdev_mode_unlocked+0x34/0x90 >> [] drm_fb_helper_set_par+0x2c/0x60 >> [] fbcon_init+0x4d0/0x520 >> [] visual_init+0xac/0x108 >> [] do_bind_con_driver+0x1d4/0x3e8 >> [] do_take_over_console+0x174/0x1e8 >> [] do_fbcon_takeover+0x74/0x100 >> [] fbcon_event_notify+0x77c/0x7d8 >> [] notifier_call_chain+0x50/0x90 >> [] __blocking_notifier_call_chain+0x4c/0x90 >> [] blocking_notifier_call_chain+0x14/0x20 >> [] fb_notifier_call_chain+0x1c/0x28 >> [] register_framebuffer+0x1c0/0x2b8 >> [] drm_fb_helper_initial_config+0x284/0x3e8 >> [] drm_fbdev_cma_init+0x94/0x148 >> [] hdlcd_drm_bind+0x1d4/0x418 >> [] try_to_bring_up_master.part.2+0xc8/0x110 >> [] component_add+0x90/0x108 >> [] tda998x_probe+0x18/0x20 >> [] i2c_device_probe+0x164/0x228 >> [] driver_probe_device+0x1ec/0x2f0 >> [] __device_attach_driver+0x90/0xd8 >> [] bus_for_each_drv+0x58/0x98 >> [] __device_attach+0xc4/0x148 >> [] device_initial_probe+0x10/0x18 >> [] bus_probe_device+0x94/0xa0 >> [] deferred_probe_work_func+0x70/0xa8 >> [] process_one_work+0x138/0x378 >> [] worker_thread+0x124/0x498 >> [] kthread+0xdc/0xf0 >> [] ret_from_fork+0x10/0x50 >> Console: switching to colour frame buffer device 150x100 >> >> which for reference, is the first one in that function: >> >> ... >> /* clear out existing links and update dpms */ >> for_each_connector_in_state(old_state, connector, old_conn_state, i) { >> if (connector->encoder) { >> WARN_ON(!connector->encoder->crtc); >> ... >> >> That's on 4.4-rc2 with this series plus the 3 tda998x patches from Russell's >> patch system applied. Is there something else I'm missing or does this need >> looking at (could it be related to that initial probe deferral)? > > Yeah, you also need Thierry Reding's patch to not set the connector->encoder in > drivers. > > http://lists.freedesktop.org/archives/dri-devel/2015-November/094576.html Ah, right, I don't think that one was specifically called out anywhere, but it does indeed make the splat go away, thanks! >> >>> Signed-off-by: Liviu Dudau >>> Acked-by: Daniel Vetter >>> --- >>> drivers/gpu/drm/Kconfig | 2 + >>> drivers/gpu/drm/Makefile | 1 + >>> drivers/gpu/drm/arm/Kconfig | 29 ++ >>> drivers/gpu/drm/arm/Makefile | 2 + >>> drivers/gpu/drm/arm/hdlcd_crtc.c | 329 ++++++++++++++++++++++ >>> drivers/gpu/drm/arm/hdlcd_drv.c | 580 +++++++++++++++++++++++++++++++++++++++ >>> drivers/gpu/drm/arm/hdlcd_drv.h | 42 +++ >>> drivers/gpu/drm/arm/hdlcd_regs.h | 87 ++++++ >>> 8 files changed, 1072 insertions(+) >>> create mode 100644 drivers/gpu/drm/arm/Kconfig >>> create mode 100644 drivers/gpu/drm/arm/Makefile >>> create mode 100644 drivers/gpu/drm/arm/hdlcd_crtc.c >>> create mode 100644 drivers/gpu/drm/arm/hdlcd_drv.c >>> create mode 100644 drivers/gpu/drm/arm/hdlcd_drv.h >>> create mode 100644 drivers/gpu/drm/arm/hdlcd_regs.h >> >> [...] >> >>> +static int hdlcd_set_pxl_fmt(struct drm_crtc *crtc) >>> +{ >>> + unsigned int btpp, default_color = 0x00000000; >>> + struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc); >>> + uint32_t pixel_format; >>> + struct simplefb_format *format = NULL; >>> + int i; >>> + >>> +#ifdef CONFIG_DRM_HDLCD_SHOW_UNDERRUN >>> + default_color = 0x00ff0000; /* show underruns in red */ >>> +#endif >>> + >>> + pixel_format = crtc->primary->state->fb->pixel_format; >>> + >>> + for (i = 0; i < ARRAY_SIZE(supported_formats); i++) { >>> + if (supported_formats[i].fourcc == pixel_format) >>> + format = &supported_formats[i]; >>> + } >>> + >>> + if (WARN_ON(!format)) { >>> + return 0; >>> + } >> >> nit: unnecessary braces. >> >>> + /* HDLCD uses 'bytes per pixel', zero means 1 byte */ >>> + btpp = (format->bits_per_pixel + 7) / 8; >>> + hdlcd_write(hdlcd, HDLCD_REG_PIXEL_FORMAT, (btpp - 1) << 3); >>> + >>> + /* >>> + * The format of the HDLCD_REG__SELECT register is: >>> + * - bits[23:16] - default value for that color component >>> + * - bits[11:8] - number of bits to extract for each color component >>> + * - bits[4:0] - index of the lowest bit to extract >>> + * >>> + * The default color value is used when bits[11:8] are zero, when the >>> + * pixel is outside the visible frame area or when there is a >>> + * buffer underrun. >>> + */ >>> + hdlcd_write(hdlcd, HDLCD_REG_RED_SELECT, default_color | >>> + format->red.offset | (format->red.length & 0xf) << 8); >>> + hdlcd_write(hdlcd, HDLCD_REG_GREEN_SELECT, default_color | >>> + format->green.offset | (format->green.length & 0xf) << 8); >>> + hdlcd_write(hdlcd, HDLCD_REG_BLUE_SELECT, default_color | >>> + format->blue.offset | (format->blue.length & 0xf) << 8); >> >> These would seem to be putting bits 23:16 from default_color into the >> default field of every register, and indeed underruns show up as a very >> white-looking shade of red for me ;) > > Ooops, I better change that. Could you tell me how you trigger underruns > in your setup? I cheat and put the SMMU into a state where it won't allow anything through at all, so it's the ultimate 'underrun'. >> >>> + return 0; >>> +} >> >> [...] >> >>> +static void hdlcd_fb_output_poll_changed(struct drm_device *drm) >>> +{ >>> + struct hdlcd_drm_private *hdlcd = drm->dev_private; >>> + >>> + if (hdlcd->fbdev) { >>> + drm_fbdev_cma_hotplug_event(hdlcd->fbdev); >>> + } >> >> nit: braces. >> >>> +} >> >> [...] >> >>> +static irqreturn_t hdlcd_irq(int irq, void *arg) >>> +{ >>> + struct drm_device *drm = arg; >>> + struct hdlcd_drm_private *hdlcd = drm->dev_private; >>> + unsigned long irq_status; >>> + >>> + irq_status = hdlcd_read(hdlcd, HDLCD_REG_INT_STATUS); >>> + >>> +#ifdef CONFIG_DEBUG_FS >>> + if (irq_status & HDLCD_INTERRUPT_UNDERRUN) { >>> + atomic_inc(&hdlcd->buffer_underrun_count); >>> + } >>> + if (irq_status & HDLCD_INTERRUPT_DMA_END) { >>> + atomic_inc(&hdlcd->dma_end_count); >>> + } >>> + if (irq_status & HDLCD_INTERRUPT_BUS_ERROR) { >>> + atomic_inc(&hdlcd->bus_error_count); >>> + } >>> + if (irq_status & HDLCD_INTERRUPT_VSYNC) { >>> + atomic_inc(&hdlcd->vsync_count); >>> + } >> >> nit: braces again (it's only because I'm too lazy to remove the newbie >> checkpatch commit hook, and a manual merge of this into my SMMU dev tree >> made that throw a fit) >> >>> +#endif >>> + if (irq_status & HDLCD_INTERRUPT_VSYNC) { >>> + bool events_sent = false; >>> + unsigned long flags; >>> + struct drm_pending_vblank_event *e, *t; >>> + >>> + drm_crtc_handle_vblank(&hdlcd->crtc); >>> + >>> + spin_lock_irqsave(&drm->event_lock, flags); >>> + list_for_each_entry_safe(e, t, &hdlcd->event_list, base.link) { >>> + list_del(&e->base.link); >>> + drm_crtc_send_vblank_event(&hdlcd->crtc, e); >>> + events_sent = true; >>> + } >>> + if (events_sent) >>> + drm_crtc_vblank_put(&hdlcd->crtc); >>> + spin_unlock_irqrestore(&drm->event_lock, flags); >>> + } >>> + >>> + /* acknowledge interrupt(s) */ >>> + hdlcd_write(hdlcd, HDLCD_REG_INT_CLEAR, irq_status); >>> + >>> + return IRQ_HANDLED; >>> +} >> >> Other than that though, it seems to do the job. I get a usable framebuffer >> console and can boot to an X desktop with at least the ancient 1600x1200 DVI >> monitor I have handy - the 1920x1080 HDMI one seems to get recognised OK but >> the monitor itself doesn't like the signal and just locks up until I unplug >> it, although I know that's more of a clock driver/firmware issue. > > I have a TV that does the same. Yes, the SCPI clock that was picked for this > resolution is a standard one, but I bet that these monitors are slightly out > of spec. At least my TV lists two options for 1080p: one with 145MHz pixel > clock and another with 145.382MHz. But Linux decides to go interlaced anyway, > so I can't test without a hack in tda998x_drv.c. Yeah, the fact that it goes unresponsive by continually trying to sync with the signal rather than just giving up and displaying the 'out of range' message suggests that's the case. Oddly, that one did used to work fine with the old hard-coded SCP clock. Oh well. Robin. > Thanks for testing this. > > Best regards, > Liviu > >> >> Robin. >> > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Robin Murphy Subject: Re: [PATCH v5 2/4] drm: Add support for ARM's HDLCD controller. Date: Thu, 10 Dec 2015 11:46:30 +0000 Message-ID: <56696616.20805@arm.com> References: <1449490265-6752-1-git-send-email-Liviu.Dudau@arm.com> <1449490265-6752-3-git-send-email-Liviu.Dudau@arm.com> <56670477.5000301@arm.com> <20151208165241.GN972@e106497-lin.cambridge.arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20151208165241.GN972@e106497-lin.cambridge.arm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Liviu Dudau Cc: Jon Medhurst , Mark Rutland , Punit Agrawal , Arnd Bergmann , Pawel Moll , Ian Campbell , Catalin Marinas , Kumar Gala , Will Deacon , Greg Kroah-Hartman , DRI devel , LKML , devicetree , Rob Herring , Sudeep Holla , Russell King , Andrew Morton , LAKML List-Id: devicetree@vger.kernel.org T24gMDgvMTIvMTUgMTY6NTIsIExpdml1IER1ZGF1IHdyb3RlOgo+IE9uIFR1ZSwgRGVjIDA4LCAy MDE1IGF0IDA0OjI1OjI3UE0gKzAwMDAsIFJvYmluIE11cnBoeSB3cm90ZToKPj4gSGkgTGl2aXUs Cj4+Cj4+IE9uIDA3LzEyLzE1IDEyOjExLCBMaXZpdSBEdWRhdSB3cm90ZToKPj4+IFRoZSBIRExD RCBjb250cm9sbGVyIGlzIGEgZGlzcGxheSBjb250cm9sbGVyIHRoYXQgc3VwcG9ydHMgcmVzb2x1 dGlvbnMKPj4+IHVwIHRvIDQwOTZ4NDA5NiBwaXhlbHMuIEl0IGlzIHByZXNlbnQgb24gdmFyaW91 cyBkZXZlbG9wbWVudCBib2FyZHMKPj4+IHByb2R1Y2VkIGJ5IEFSTSBMdGQgYW5kIGVtdWxhdGVk IGJ5IHRoZSBsYXRlc3QgRmFzdCBNb2RlbHMgZnJvbSB0aGUKPj4+IGNvbXBhbnkuCj4+Pgo+Pj4g Q2M6IERhdmlkIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KPj4+IENjOiBSb2JpbiBNdXJwaHkg PHJvYmluLm11cnBoeUBhcm0uY29tPgo+Pgo+PiBJJ3ZlIGdpdmVuIHRoaXMgYSBzcGluIG9uIG15 IEp1bm8sIGFuZCB0aGUgZmlyc3QgdGhpbmcgb2Ygbm90ZSBpcyB0aGlzOgo+Pgo+PiBoZGxjZCA3 ZmY2MDAwMC5oZGxjZDogbWFzdGVyIGJpbmQgZmFpbGVkOiAtNTE3Cj4+IGhkbGNkIDdmZjUwMDAw LmhkbGNkOiBtYXN0ZXIgYmluZCBmYWlsZWQ6IC01MTcKPj4gc2NwaV9wcm90b2NvbCBzY3BpOiBT Q1AgUHJvdG9jb2wgMS4wIEZpcm13YXJlIDEuOS4wIHZlcnNpb24KPj4gW2RybV0gZm91bmQgQVJN IEhETENEIHZlcnNpb24gcjBwMAo+PiB0ZGE5OTh4IDAtMDA3MDogRmFsbGluZyBiYWNrIHRvIGZp cnN0IENSVEMKPj4gdXNiIDEtMTogbmV3IGhpZ2gtc3BlZWQgVVNCIGRldmljZSBudW1iZXIgMiB1 c2luZyBlaGNpLXBsYXRmb3JtCj4+IHRkYTk5OHggMC0wMDcwOiBmb3VuZCBUREExOTk4OAo+PiBo ZGxjZCA3ZmY2MDAwMC5oZGxjZDogYm91bmQgMC0wMDcwIChvcHMgdGRhOTk4eF9vcHMpCj4+IFtk cm1dIFN1cHBvcnRzIHZibGFuayB0aW1lc3RhbXAgY2FjaGluZyBSZXYgMiAoMjEuMTAuMjAxMyku Cj4+IFtkcm1dIE5vIGRyaXZlciBzdXBwb3J0IGZvciB2YmxhbmsgdGltZXN0YW1wIHF1ZXJ5Lgo+ PiAtLS0tLS0tLS0tLS1bIGN1dCBoZXJlIF0tLS0tLS0tLS0tLS0KPj4gV0FSTklORzogYXQgZHJp dmVycy9ncHUvZHJtL2RybV9hdG9taWNfaGVscGVyLmM6NjgyCj4+IE1vZHVsZXMgbGlua2VkIGlu Ogo+Pgo+PiBDUFU6IDIgUElEOiA5OCBDb21tOiBrd29ya2VyL3UxMjozIFRhaW50ZWQ6IEcgICAg ICAgIFcgICAgICAgNC40LjAtcmMyKyAjODQ2Cj4+IEhhcmR3YXJlIG5hbWU6IEFSTSBKdW5vIGRl dmVsb3BtZW50IGJvYXJkIChyMSkgKERUKQo+PiBXb3JrcXVldWU6IGRlZmVyd3EgZGVmZXJyZWRf cHJvYmVfd29ya19mdW5jCj4+IHRhc2s6IGZmZmZmZTAwN2VjYjM3MDAgdGk6IGZmZmZmZTA5NDA5 YzgwMDAgdGFzay50aTogZmZmZmZlMDk0MDljODAwMAo+PiBQQyBpcyBhdCBkcm1fYXRvbWljX2hl bHBlcl91cGRhdGVfbGVnYWN5X21vZGVzZXRfc3RhdGUrMHgxZTgvMHgxZjAKPj4gTFIgaXMgYXQg ZHJtX2F0b21pY19oZWxwZXJfY29tbWl0X21vZGVzZXRfZGlzYWJsZXMrMHgxYTgvMHgzODgKPj4g cGMgOiBbPGZmZmZmZTAwMDA0YTQ0Njg+XSBsciA6IFs8ZmZmZmZlMDAwMDRhNTliOD5dIHBzdGF0 ZTogMjAwMDAwNDUKPj4gc3AgOiBmZmZmZmUwOTQwOWNiNTYwCj4+IHgyOTogZmZmZmZlMDk0MDlj YjU2MCB4Mjg6IGZmZmZmZTA5NDBiZjI4MDAKPj4geDI3OiBmZmZmZmUwOTQwMDcwMDAwIHgyNjog MDAwMDAwMDAwMDAwMDAwMQo+PiB4MjU6IGZmZmZmZTAwMDBiZTRiNTAgeDI0OiBmZmZmZmUwMDAw N2FlODIwCj4+IHgyMzogZmZmZmZlMDAwMGJlNGI1MCB4MjI6IGZmZmZmZTA5NDBiZDEwMDAKPj4g eDIxOiBmZmZmZmUwOTQwYmQxMDAwIHgyMDogMDAwMDAwMDAwMDAwMDAwMAo+PiB4MTk6IGZmZmZm ZTA5NDA5NjgwMDAgeDE4OiBmZmZmZmUwOTQwYzgwOTFjCj4+IHgxNzogMDAwMDAwMDAwMDAwMDAw NyB4MTY6IDAwMDAwMDAwMDAwMDAwMDEKPj4geDE1OiBmZmZmZmUwOTQwYzgwMTZmIHgxNDogMDAw MDAwM2MwMDAwMDAwMAo+PiB4MTM6IDAwMDAwMDAwMDAwMDAwMDAgeDEyOiAwMDAwMDRjOTAwMDAw NGI0Cj4+IHgxMTogMDAwMDA0YjEwMDAwMDRjOSB4MTA6IDAwMDAwNGIwMDAwMDA0YjAKPj4geDkg OiAwMDAwMDAwMDAwMDAwNmY0IHg4IDogMDAwMDA2YTQwMDAwMDY1NAo+PiB4NyA6IDAwMDAwNmY0 MDAwMDA2NDAgeDYgOiBmZmZmZmUwOTQwOTY2NDgwCj4+IHg1IDogZmZmZmZlMDk0MDk2ODIwMCB4 NCA6IDAwMDAwMDAwMDAwMDAwMDEKPj4geDMgOiBmZmZmZmUwOTQwOTY2YTgwIHgyIDogMDAwMDAw MDAwMDAwMDAwMAo+PiB4MSA6IGZmZmZmZTA5NDBiZDA5MDAgeDAgOiBmZmZmZmUwOTQwYmQwOTYw Cj4+Cj4+IC0tLVsgZW5kIHRyYWNlIGJkYjZhZjY5YjI5YmY3ZWEgXS0tLQo+PiBDYWxsIHRyYWNl Ogo+PiBbPGZmZmZmZTAwMDA0YTQ0Njg+XQo+PiBkcm1fYXRvbWljX2hlbHBlcl91cGRhdGVfbGVn YWN5X21vZGVzZXRfc3RhdGUrMHgxZTgvMHgxZjAKPj4gWzxmZmZmZmUwMDAwNGE1OWI4Pl0gZHJt X2F0b21pY19oZWxwZXJfY29tbWl0X21vZGVzZXRfZGlzYWJsZXMrMHgxYTgvMHgzODgKPj4gWzxm ZmZmZmUwMDAwNGE1YzcwPl0gZHJtX2F0b21pY19oZWxwZXJfY29tbWl0KzB4ZDgvMHgxNDAKPj4g WzxmZmZmZmUwMDAwNGNjY2UwPl0gaGRsY2RfYXRvbWljX2NvbW1pdCsweDEwLzB4MTgKPj4gWzxm ZmZmZmUwMDAwNGM5ZWY4Pl0gZHJtX2F0b21pY19jb21taXQrMHg0MC8weDcwCj4+IFs8ZmZmZmZl MDAwMDRhNjliMD5dIHJlc3RvcmVfZmJkZXZfbW9kZSsweDI3MC8weDJiMAo+PiBbPGZmZmZmZTAw MDA0YThkNjQ+XSBkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZCsweDM0 LzB4OTAKPj4gWzxmZmZmZmUwMDAwNGE4ZGVjPl0gZHJtX2ZiX2hlbHBlcl9zZXRfcGFyKzB4MmMv MHg2MAo+PiBbPGZmZmZmZTAwMDA0MmYwMTA+XSBmYmNvbl9pbml0KzB4NGQwLzB4NTIwCj4+IFs8 ZmZmZmZlMDAwMDQ2ZWM5Yz5dIHZpc3VhbF9pbml0KzB4YWMvMHgxMDgKPj4gWzxmZmZmZmUwMDAw NDcwNjBjPl0gZG9fYmluZF9jb25fZHJpdmVyKzB4MWQ0LzB4M2U4Cj4+IFs8ZmZmZmZlMDAwMDQ3 MGMxND5dIGRvX3Rha2Vfb3Zlcl9jb25zb2xlKzB4MTc0LzB4MWU4Cj4+IFs8ZmZmZmZlMDAwMDQy YzM4Yz5dIGRvX2ZiY29uX3Rha2VvdmVyKzB4NzQvMHgxMDAKPj4gWzxmZmZmZmUwMDAwNDMxM2I0 Pl0gZmJjb25fZXZlbnRfbm90aWZ5KzB4NzdjLzB4N2Q4Cj4+IFs8ZmZmZmZlMDAwMDBkYzcwMD5d IG5vdGlmaWVyX2NhbGxfY2hhaW4rMHg1MC8weDkwCj4+IFs8ZmZmZmZlMDAwMDBkY2FkYz5dIF9f YmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbisweDRjLzB4OTAKPj4gWzxmZmZmZmUwMDAwMGRj YjM0Pl0gYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbisweDE0LzB4MjAKPj4gWzxmZmZmZmUw MDAwNDM1MjA0Pl0gZmJfbm90aWZpZXJfY2FsbF9jaGFpbisweDFjLzB4MjgKPj4gWzxmZmZmZmUw MDAwNDM3MDEwPl0gcmVnaXN0ZXJfZnJhbWVidWZmZXIrMHgxYzAvMHgyYjgKPj4gWzxmZmZmZmUw MDAwNGE5MGE0Pl0gZHJtX2ZiX2hlbHBlcl9pbml0aWFsX2NvbmZpZysweDI4NC8weDNlOAo+PiBb PGZmZmZmZTAwMDA0YTk5MWM+XSBkcm1fZmJkZXZfY21hX2luaXQrMHg5NC8weDE0OAo+PiBbPGZm ZmZmZTAwMDA0Y2NmYzQ+XSBoZGxjZF9kcm1fYmluZCsweDFkNC8weDQxOAo+PiBbPGZmZmZmZTAw MDA0ZDE1ZjA+XSB0cnlfdG9fYnJpbmdfdXBfbWFzdGVyLnBhcnQuMisweGM4LzB4MTEwCj4+IFs8 ZmZmZmZlMDAwMDRkMTgyMD5dIGNvbXBvbmVudF9hZGQrMHg5MC8weDEwOAo+PiBbPGZmZmZmZTAw MDA0Y2U2YTg+XSB0ZGE5OTh4X3Byb2JlKzB4MTgvMHgyMAo+PiBbPGZmZmZmZTAwMDA1YTZkMjQ+ XSBpMmNfZGV2aWNlX3Byb2JlKzB4MTY0LzB4MjI4Cj4+IFs8ZmZmZmZlMDAwMDRkNjk4Yz5dIGRy aXZlcl9wcm9iZV9kZXZpY2UrMHgxZWMvMHgyZjAKPj4gWzxmZmZmZmUwMDAwNGQ2YmMwPl0gX19k ZXZpY2VfYXR0YWNoX2RyaXZlcisweDkwLzB4ZDgKPj4gWzxmZmZmZmUwMDAwNGQ0Yjg4Pl0gYnVz X2Zvcl9lYWNoX2RydisweDU4LzB4OTgKPj4gWzxmZmZmZmUwMDAwNGQ2NmU0Pl0gX19kZXZpY2Vf YXR0YWNoKzB4YzQvMHgxNDgKPj4gWzxmZmZmZmUwMDAwNGQ2YzU4Pl0gZGV2aWNlX2luaXRpYWxf cHJvYmUrMHgxMC8weDE4Cj4+IFs8ZmZmZmZlMDAwMDRkNWI5Yz5dIGJ1c19wcm9iZV9kZXZpY2Ur MHg5NC8weGEwCj4+IFs8ZmZmZmZlMDAwMDRkNjAyMD5dIGRlZmVycmVkX3Byb2JlX3dvcmtfZnVu YysweDcwLzB4YTgKPj4gWzxmZmZmZmUwMDAwMGQ1YjcwPl0gcHJvY2Vzc19vbmVfd29yaysweDEz OC8weDM3OAo+PiBbPGZmZmZmZTAwMDAwZDVlZDQ+XSB3b3JrZXJfdGhyZWFkKzB4MTI0LzB4NDk4 Cj4+IFs8ZmZmZmZlMDAwMDBkYmI1ND5dIGt0aHJlYWQrMHhkYy8weGYwCj4+IFs8ZmZmZmZlMDAw MDA5Mzk4MD5dIHJldF9mcm9tX2ZvcmsrMHgxMC8weDUwCj4+IENvbnNvbGU6IHN3aXRjaGluZyB0 byBjb2xvdXIgZnJhbWUgYnVmZmVyIGRldmljZSAxNTB4MTAwCj4+Cj4+IHdoaWNoIGZvciByZWZl cmVuY2UsIGlzIHRoZSBmaXJzdCBvbmUgaW4gdGhhdCBmdW5jdGlvbjoKPj4KPj4gCS4uLgo+PiAJ LyogY2xlYXIgb3V0IGV4aXN0aW5nIGxpbmtzIGFuZCB1cGRhdGUgZHBtcyAqLwo+PiAJZm9yX2Vh Y2hfY29ubmVjdG9yX2luX3N0YXRlKG9sZF9zdGF0ZSwgY29ubmVjdG9yLCBvbGRfY29ubl9zdGF0 ZSwgaSkgewo+PiAJCWlmIChjb25uZWN0b3ItPmVuY29kZXIpIHsKPj4gCQkJV0FSTl9PTighY29u bmVjdG9yLT5lbmNvZGVyLT5jcnRjKTsKPj4gCQkJLi4uCj4+Cj4+IFRoYXQncyBvbiA0LjQtcmMy IHdpdGggdGhpcyBzZXJpZXMgcGx1cyB0aGUgMyB0ZGE5OTh4IHBhdGNoZXMgZnJvbSBSdXNzZWxs J3MKPj4gcGF0Y2ggc3lzdGVtIGFwcGxpZWQuIElzIHRoZXJlIHNvbWV0aGluZyBlbHNlIEknbSBt aXNzaW5nIG9yIGRvZXMgdGhpcyBuZWVkCj4+IGxvb2tpbmcgYXQgKGNvdWxkIGl0IGJlIHJlbGF0 ZWQgdG8gdGhhdCBpbml0aWFsIHByb2JlIGRlZmVycmFsKT8KPgo+IFllYWgsIHlvdSBhbHNvIG5l ZWQgVGhpZXJyeSBSZWRpbmcncyBwYXRjaCB0byBub3Qgc2V0IHRoZSBjb25uZWN0b3ItPmVuY29k ZXIgaW4KPiBkcml2ZXJzLgo+Cj4gaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZl cy9kcmktZGV2ZWwvMjAxNS1Ob3ZlbWJlci8wOTQ1NzYuaHRtbAoKQWgsIHJpZ2h0LCBJIGRvbid0 IHRoaW5rIHRoYXQgb25lIHdhcyBzcGVjaWZpY2FsbHkgY2FsbGVkIG91dCBhbnl3aGVyZSwgCmJ1 dCBpdCBkb2VzIGluZGVlZCBtYWtlIHRoZSBzcGxhdCBnbyBhd2F5LCB0aGFua3MhCgo+Pgo+Pj4g U2lnbmVkLW9mZi1ieTogTGl2aXUgRHVkYXUgPExpdml1LkR1ZGF1QGFybS5jb20+Cj4+PiBBY2tl ZC1ieTogRGFuaWVsIFZldHRlciA8ZGFuaWVsLnZldHRlckBmZndsbC5jaD4KPj4+IC0tLQo+Pj4g ICBkcml2ZXJzL2dwdS9kcm0vS2NvbmZpZyAgICAgICAgICB8ICAgMiArCj4+PiAgIGRyaXZlcnMv Z3B1L2RybS9NYWtlZmlsZSAgICAgICAgIHwgICAxICsKPj4+ICAgZHJpdmVycy9ncHUvZHJtL2Fy bS9LY29uZmlnICAgICAgfCAgMjkgKysKPj4+ICAgZHJpdmVycy9ncHUvZHJtL2FybS9NYWtlZmls ZSAgICAgfCAgIDIgKwo+Pj4gICBkcml2ZXJzL2dwdS9kcm0vYXJtL2hkbGNkX2NydGMuYyB8IDMy OSArKysrKysrKysrKysrKysrKysrKysrCj4+PiAgIGRyaXZlcnMvZ3B1L2RybS9hcm0vaGRsY2Rf ZHJ2LmMgIHwgNTgwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+Pj4g ICBkcml2ZXJzL2dwdS9kcm0vYXJtL2hkbGNkX2Rydi5oICB8ICA0MiArKysKPj4+ICAgZHJpdmVy cy9ncHUvZHJtL2FybS9oZGxjZF9yZWdzLmggfCAgODcgKysrKysrCj4+PiAgIDggZmlsZXMgY2hh bmdlZCwgMTA3MiBpbnNlcnRpb25zKCspCj4+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vYXJtL0tjb25maWcKPj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1 L2RybS9hcm0vTWFrZWZpbGUKPj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2Ry bS9hcm0vaGRsY2RfY3J0Yy5jCj4+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9k cm0vYXJtL2hkbGNkX2Rydi5jCj4+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9k cm0vYXJtL2hkbGNkX2Rydi5oCj4+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9k cm0vYXJtL2hkbGNkX3JlZ3MuaAo+Pgo+PiBbLi4uXQo+Pgo+Pj4gK3N0YXRpYyBpbnQgaGRsY2Rf c2V0X3B4bF9mbXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQo+Pj4gK3sKPj4+ICsJdW5zaWduZWQg aW50IGJ0cHAsIGRlZmF1bHRfY29sb3IgPSAweDAwMDAwMDAwOwo+Pj4gKwlzdHJ1Y3QgaGRsY2Rf ZHJtX3ByaXZhdGUgKmhkbGNkID0gY3J0Y190b19oZGxjZF9wcml2KGNydGMpOwo+Pj4gKwl1aW50 MzJfdCBwaXhlbF9mb3JtYXQ7Cj4+PiArCXN0cnVjdCBzaW1wbGVmYl9mb3JtYXQgKmZvcm1hdCA9 IE5VTEw7Cj4+PiArCWludCBpOwo+Pj4gKwo+Pj4gKyNpZmRlZiBDT05GSUdfRFJNX0hETENEX1NI T1dfVU5ERVJSVU4KPj4+ICsJZGVmYXVsdF9jb2xvciA9IDB4MDBmZjAwMDA7CS8qIHNob3cgdW5k ZXJydW5zIGluIHJlZCAqLwo+Pj4gKyNlbmRpZgo+Pj4gKwo+Pj4gKwlwaXhlbF9mb3JtYXQgPSBj cnRjLT5wcmltYXJ5LT5zdGF0ZS0+ZmItPnBpeGVsX2Zvcm1hdDsKPj4+ICsKPj4+ICsJZm9yIChp ID0gMDsgaSA8IEFSUkFZX1NJWkUoc3VwcG9ydGVkX2Zvcm1hdHMpOyBpKyspIHsKPj4+ICsJCWlm IChzdXBwb3J0ZWRfZm9ybWF0c1tpXS5mb3VyY2MgPT0gcGl4ZWxfZm9ybWF0KQo+Pj4gKwkJCWZv cm1hdCA9ICZzdXBwb3J0ZWRfZm9ybWF0c1tpXTsKPj4+ICsJfQo+Pj4gKwo+Pj4gKwlpZiAoV0FS Tl9PTighZm9ybWF0KSkgewo+Pj4gKwkJcmV0dXJuIDA7Cj4+PiArCX0KPj4KPj4gbml0OiB1bm5l Y2Vzc2FyeSBicmFjZXMuCj4+Cj4+PiArCS8qIEhETENEIHVzZXMgJ2J5dGVzIHBlciBwaXhlbCcs IHplcm8gbWVhbnMgMSBieXRlICovCj4+PiArCWJ0cHAgPSAoZm9ybWF0LT5iaXRzX3Blcl9waXhl bCArIDcpIC8gODsKPj4+ICsJaGRsY2Rfd3JpdGUoaGRsY2QsIEhETENEX1JFR19QSVhFTF9GT1JN QVQsIChidHBwIC0gMSkgPDwgMyk7Cj4+PiArCj4+PiArCS8qCj4+PiArCSAqIFRoZSBmb3JtYXQg b2YgdGhlIEhETENEX1JFR188Y29sb3I+X1NFTEVDVCByZWdpc3RlciBpczoKPj4+ICsJICogICAt IGJpdHNbMjM6MTZdIC0gZGVmYXVsdCB2YWx1ZSBmb3IgdGhhdCBjb2xvciBjb21wb25lbnQKPj4+ ICsJICogICAtIGJpdHNbMTE6OF0gIC0gbnVtYmVyIG9mIGJpdHMgdG8gZXh0cmFjdCBmb3IgZWFj aCBjb2xvciBjb21wb25lbnQKPj4+ICsJICogICAtIGJpdHNbNDowXSAgIC0gaW5kZXggb2YgdGhl IGxvd2VzdCBiaXQgdG8gZXh0cmFjdAo+Pj4gKwkgKgo+Pj4gKwkgKiBUaGUgZGVmYXVsdCBjb2xv ciB2YWx1ZSBpcyB1c2VkIHdoZW4gYml0c1sxMTo4XSBhcmUgemVybywgd2hlbiB0aGUKPj4+ICsJ ICogcGl4ZWwgaXMgb3V0c2lkZSB0aGUgdmlzaWJsZSBmcmFtZSBhcmVhIG9yIHdoZW4gdGhlcmUg aXMgYQo+Pj4gKwkgKiBidWZmZXIgdW5kZXJydW4uCj4+PiArCSAqLwo+Pj4gKwloZGxjZF93cml0 ZShoZGxjZCwgSERMQ0RfUkVHX1JFRF9TRUxFQ1QsIGRlZmF1bHRfY29sb3IgfAo+Pj4gKwkJZm9y bWF0LT5yZWQub2Zmc2V0IHwgKGZvcm1hdC0+cmVkLmxlbmd0aCAmIDB4ZikgPDwgOCk7Cj4+PiAr CWhkbGNkX3dyaXRlKGhkbGNkLCBIRExDRF9SRUdfR1JFRU5fU0VMRUNULCBkZWZhdWx0X2NvbG9y IHwKPj4+ICsJCWZvcm1hdC0+Z3JlZW4ub2Zmc2V0IHwgKGZvcm1hdC0+Z3JlZW4ubGVuZ3RoICYg MHhmKSA8PCA4KTsKPj4+ICsJaGRsY2Rfd3JpdGUoaGRsY2QsIEhETENEX1JFR19CTFVFX1NFTEVD VCwgZGVmYXVsdF9jb2xvciB8Cj4+PiArCQlmb3JtYXQtPmJsdWUub2Zmc2V0IHwgKGZvcm1hdC0+ Ymx1ZS5sZW5ndGggJiAweGYpIDw8IDgpOwo+Pgo+PiBUaGVzZSB3b3VsZCBzZWVtIHRvIGJlIHB1 dHRpbmcgYml0cyAyMzoxNiBmcm9tIGRlZmF1bHRfY29sb3IgaW50byB0aGUKPj4gZGVmYXVsdCBm aWVsZCBvZiBldmVyeSByZWdpc3RlciwgYW5kIGluZGVlZCB1bmRlcnJ1bnMgc2hvdyB1cCBhcyBh IHZlcnkKPj4gd2hpdGUtbG9va2luZyBzaGFkZSBvZiByZWQgZm9yIG1lIDspCj4KPiBPb29wcywg SSBiZXR0ZXIgY2hhbmdlIHRoYXQuIENvdWxkIHlvdSB0ZWxsIG1lIGhvdyB5b3UgdHJpZ2dlciB1 bmRlcnJ1bnMKPiBpbiB5b3VyIHNldHVwPwoKSSBjaGVhdCBhbmQgcHV0IHRoZSBTTU1VIGludG8g YSBzdGF0ZSB3aGVyZSBpdCB3b24ndCBhbGxvdyBhbnl0aGluZyAKdGhyb3VnaCBhdCBhbGwsIHNv IGl0J3MgdGhlIHVsdGltYXRlICd1bmRlcnJ1bicuCgo+Pgo+Pj4gKwlyZXR1cm4gMDsKPj4+ICt9 Cj4+Cj4+IFsuLi5dCj4+Cj4+PiArc3RhdGljIHZvaWQgaGRsY2RfZmJfb3V0cHV0X3BvbGxfY2hh bmdlZChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKQo+Pj4gK3sKPj4+ICsJc3RydWN0IGhkbGNkX2Ry bV9wcml2YXRlICpoZGxjZCA9IGRybS0+ZGV2X3ByaXZhdGU7Cj4+PiArCj4+PiArCWlmIChoZGxj ZC0+ZmJkZXYpIHsKPj4+ICsJCWRybV9mYmRldl9jbWFfaG90cGx1Z19ldmVudChoZGxjZC0+ZmJk ZXYpOwo+Pj4gKwl9Cj4+Cj4+IG5pdDogYnJhY2VzLgo+Pgo+Pj4gK30KPj4KPj4gWy4uLl0KPj4K Pj4+ICtzdGF0aWMgaXJxcmV0dXJuX3QgaGRsY2RfaXJxKGludCBpcnEsIHZvaWQgKmFyZykKPj4+ ICt7Cj4+PiArCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBhcmc7Cj4+PiArCXN0cnVjdCBoZGxj ZF9kcm1fcHJpdmF0ZSAqaGRsY2QgPSBkcm0tPmRldl9wcml2YXRlOwo+Pj4gKwl1bnNpZ25lZCBs b25nIGlycV9zdGF0dXM7Cj4+PiArCj4+PiArCWlycV9zdGF0dXMgPSBoZGxjZF9yZWFkKGhkbGNk LCBIRExDRF9SRUdfSU5UX1NUQVRVUyk7Cj4+PiArCj4+PiArI2lmZGVmIENPTkZJR19ERUJVR19G Uwo+Pj4gKwlpZiAoaXJxX3N0YXR1cyAmIEhETENEX0lOVEVSUlVQVF9VTkRFUlJVTikgewo+Pj4g KwkJYXRvbWljX2luYygmaGRsY2QtPmJ1ZmZlcl91bmRlcnJ1bl9jb3VudCk7Cj4+PiArCX0KPj4+ ICsJaWYgKGlycV9zdGF0dXMgJiBIRExDRF9JTlRFUlJVUFRfRE1BX0VORCkgewo+Pj4gKwkJYXRv bWljX2luYygmaGRsY2QtPmRtYV9lbmRfY291bnQpOwo+Pj4gKwl9Cj4+PiArCWlmIChpcnFfc3Rh dHVzICYgSERMQ0RfSU5URVJSVVBUX0JVU19FUlJPUikgewo+Pj4gKwkJYXRvbWljX2luYygmaGRs Y2QtPmJ1c19lcnJvcl9jb3VudCk7Cj4+PiArCX0KPj4+ICsJaWYgKGlycV9zdGF0dXMgJiBIRExD RF9JTlRFUlJVUFRfVlNZTkMpIHsKPj4+ICsJCWF0b21pY19pbmMoJmhkbGNkLT52c3luY19jb3Vu dCk7Cj4+PiArCX0KPj4KPj4gbml0OiBicmFjZXMgYWdhaW4gKGl0J3Mgb25seSBiZWNhdXNlIEkn bSB0b28gbGF6eSB0byByZW1vdmUgdGhlIG5ld2JpZQo+PiBjaGVja3BhdGNoIGNvbW1pdCBob29r LCBhbmQgYSBtYW51YWwgbWVyZ2Ugb2YgdGhpcyBpbnRvIG15IFNNTVUgZGV2IHRyZWUKPj4gbWFk ZSB0aGF0IHRocm93IGEgZml0KQo+Pgo+Pj4gKyNlbmRpZgo+Pj4gKwlpZiAoaXJxX3N0YXR1cyAm IEhETENEX0lOVEVSUlVQVF9WU1lOQykgewo+Pj4gKwkJYm9vbCBldmVudHNfc2VudCA9IGZhbHNl Owo+Pj4gKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4+ICsJCXN0cnVjdCBkcm1fcGVuZGluZ192 YmxhbmtfZXZlbnQJKmUsICp0Owo+Pj4gKwo+Pj4gKwkJZHJtX2NydGNfaGFuZGxlX3ZibGFuaygm aGRsY2QtPmNydGMpOwo+Pj4gKwo+Pj4gKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRybS0+ZXZlbnRf bG9jaywgZmxhZ3MpOwo+Pj4gKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIHQsICZoZGxj ZC0+ZXZlbnRfbGlzdCwgYmFzZS5saW5rKSB7Cj4+PiArCQkJbGlzdF9kZWwoJmUtPmJhc2UubGlu ayk7Cj4+PiArCQkJZHJtX2NydGNfc2VuZF92YmxhbmtfZXZlbnQoJmhkbGNkLT5jcnRjLCBlKTsK Pj4+ICsJCQlldmVudHNfc2VudCA9IHRydWU7Cj4+PiArCQl9Cj4+PiArCQlpZiAoZXZlbnRzX3Nl bnQpCj4+PiArCQkJZHJtX2NydGNfdmJsYW5rX3B1dCgmaGRsY2QtPmNydGMpOwo+Pj4gKwkJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmZHJtLT5ldmVudF9sb2NrLCBmbGFncyk7Cj4+PiArCX0KPj4+ ICsKPj4+ICsJLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0KHMpICovCj4+PiArCWhkbGNkX3dyaXRl KGhkbGNkLCBIRExDRF9SRUdfSU5UX0NMRUFSLCBpcnFfc3RhdHVzKTsKPj4+ICsKPj4+ICsJcmV0 dXJuIElSUV9IQU5ETEVEOwo+Pj4gK30KPj4KPj4gT3RoZXIgdGhhbiB0aGF0IHRob3VnaCwgaXQg c2VlbXMgdG8gZG8gdGhlIGpvYi4gSSBnZXQgYSB1c2FibGUgZnJhbWVidWZmZXIKPj4gY29uc29s ZSBhbmQgY2FuIGJvb3QgdG8gYW4gWCBkZXNrdG9wIHdpdGggYXQgbGVhc3QgdGhlIGFuY2llbnQg MTYwMHgxMjAwIERWSQo+PiBtb25pdG9yIEkgaGF2ZSBoYW5keSAtIHRoZSAxOTIweDEwODAgSERN SSBvbmUgc2VlbXMgdG8gZ2V0IHJlY29nbmlzZWQgT0sgYnV0Cj4+IHRoZSBtb25pdG9yIGl0c2Vs ZiBkb2Vzbid0IGxpa2UgdGhlIHNpZ25hbCBhbmQganVzdCBsb2NrcyB1cCB1bnRpbCBJIHVucGx1 Zwo+PiBpdCwgYWx0aG91Z2ggSSBrbm93IHRoYXQncyBtb3JlIG9mIGEgY2xvY2sgZHJpdmVyL2Zp cm13YXJlIGlzc3VlLgo+Cj4gSSBoYXZlIGEgVFYgdGhhdCBkb2VzIHRoZSBzYW1lLiBZZXMsIHRo ZSBTQ1BJIGNsb2NrIHRoYXQgd2FzIHBpY2tlZCBmb3IgdGhpcwo+IHJlc29sdXRpb24gaXMgYSBz dGFuZGFyZCBvbmUsIGJ1dCBJIGJldCB0aGF0IHRoZXNlIG1vbml0b3JzIGFyZSBzbGlnaHRseSBv dXQKPiBvZiBzcGVjLiBBdCBsZWFzdCBteSBUViBsaXN0cyB0d28gb3B0aW9ucyBmb3IgMTA4MHA6 IG9uZSB3aXRoIDE0NU1IeiBwaXhlbAo+IGNsb2NrIGFuZCBhbm90aGVyIHdpdGggMTQ1LjM4Mk1I ei4gQnV0IExpbnV4IGRlY2lkZXMgdG8gZ28gaW50ZXJsYWNlZCBhbnl3YXksCj4gc28gSSBjYW4n dCB0ZXN0IHdpdGhvdXQgYSBoYWNrIGluIHRkYTk5OHhfZHJ2LmMuCgpZZWFoLCB0aGUgZmFjdCB0 aGF0IGl0IGdvZXMgdW5yZXNwb25zaXZlIGJ5IGNvbnRpbnVhbGx5IHRyeWluZyB0byBzeW5jIAp3 aXRoIHRoZSBzaWduYWwgcmF0aGVyIHRoYW4ganVzdCBnaXZpbmcgdXAgYW5kIGRpc3BsYXlpbmcg dGhlICdvdXQgb2YgCnJhbmdlJyBtZXNzYWdlIHN1Z2dlc3RzIHRoYXQncyB0aGUgY2FzZS4gT2Rk bHksIHRoYXQgb25lIGRpZCB1c2VkIHRvIAp3b3JrIGZpbmUgd2l0aCB0aGUgb2xkIGhhcmQtY29k ZWQgU0NQIGNsb2NrLiBPaCB3ZWxsLgoKUm9iaW4uCgo+IFRoYW5rcyBmb3IgdGVzdGluZyB0aGlz Lgo+Cj4gQmVzdCByZWdhcmRzLAo+IExpdml1Cj4KPj4KPj4gUm9iaW4uCj4+Cj4KCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5n IGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMuZnJlZWRl c2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752875AbbLJLqn (ORCPT ); Thu, 10 Dec 2015 06:46:43 -0500 Received: from eu-smtp-delivery-143.mimecast.com ([146.101.78.143]:21574 "EHLO eu-smtp-delivery-143.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751393AbbLJLql convert rfc822-to-8bit (ORCPT ); Thu, 10 Dec 2015 06:46:41 -0500 From: Robin Murphy Subject: Re: [PATCH v5 2/4] drm: Add support for ARM's HDLCD controller. To: Liviu Dudau References: <1449490265-6752-1-git-send-email-Liviu.Dudau@arm.com> <1449490265-6752-3-git-send-email-Liviu.Dudau@arm.com> <56670477.5000301@arm.com> <20151208165241.GN972@e106497-lin.cambridge.arm.com> Cc: David Airlie , Catalin Marinas , Will Deacon , Rob Herring , Sudeep Holla , Jon Medhurst , Mark Rutland , Ian Campbell , Kumar Gala , Rob Herring , Russell King , Pawel Moll , Arnd Bergmann , Olof Johansson , Punit Agrawal , DRI devel , devicetree , Greg Kroah-Hartman , Andrew Morton , LAKML , LKML Message-ID: <56696616.20805@arm.com> Date: Thu, 10 Dec 2015 11:46:30 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0 MIME-Version: 1.0 In-Reply-To: <20151208165241.GN972@e106497-lin.cambridge.arm.com> X-OriginalArrivalTime: 10 Dec 2015 11:46:35.0718 (UTC) FILETIME=[6C3AEE60:01D13340] X-MC-Unique: YuyQdCJUSIub1vs3pLnmwQ-1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 08/12/15 16:52, Liviu Dudau wrote: > On Tue, Dec 08, 2015 at 04:25:27PM +0000, Robin Murphy wrote: >> Hi Liviu, >> >> On 07/12/15 12:11, Liviu Dudau wrote: >>> The HDLCD controller is a display controller that supports resolutions >>> up to 4096x4096 pixels. It is present on various development boards >>> produced by ARM Ltd and emulated by the latest Fast Models from the >>> company. >>> >>> Cc: David Airlie >>> Cc: Robin Murphy >> >> I've given this a spin on my Juno, and the first thing of note is this: >> >> hdlcd 7ff60000.hdlcd: master bind failed: -517 >> hdlcd 7ff50000.hdlcd: master bind failed: -517 >> scpi_protocol scpi: SCP Protocol 1.0 Firmware 1.9.0 version >> [drm] found ARM HDLCD version r0p0 >> tda998x 0-0070: Falling back to first CRTC >> usb 1-1: new high-speed USB device number 2 using ehci-platform >> tda998x 0-0070: found TDA19988 >> hdlcd 7ff60000.hdlcd: bound 0-0070 (ops tda998x_ops) >> [drm] Supports vblank timestamp caching Rev 2 (21.10.2013). >> [drm] No driver support for vblank timestamp query. >> ------------[ cut here ]------------ >> WARNING: at drivers/gpu/drm/drm_atomic_helper.c:682 >> Modules linked in: >> >> CPU: 2 PID: 98 Comm: kworker/u12:3 Tainted: G W 4.4.0-rc2+ #846 >> Hardware name: ARM Juno development board (r1) (DT) >> Workqueue: deferwq deferred_probe_work_func >> task: fffffe007ecb3700 ti: fffffe09409c8000 task.ti: fffffe09409c8000 >> PC is at drm_atomic_helper_update_legacy_modeset_state+0x1e8/0x1f0 >> LR is at drm_atomic_helper_commit_modeset_disables+0x1a8/0x388 >> pc : [] lr : [] pstate: 20000045 >> sp : fffffe09409cb560 >> x29: fffffe09409cb560 x28: fffffe0940bf2800 >> x27: fffffe0940070000 x26: 0000000000000001 >> x25: fffffe0000be4b50 x24: fffffe00007ae820 >> x23: fffffe0000be4b50 x22: fffffe0940bd1000 >> x21: fffffe0940bd1000 x20: 0000000000000000 >> x19: fffffe0940968000 x18: fffffe0940c8091c >> x17: 0000000000000007 x16: 0000000000000001 >> x15: fffffe0940c8016f x14: 0000003c00000000 >> x13: 0000000000000000 x12: 000004c9000004b4 >> x11: 000004b1000004c9 x10: 000004b0000004b0 >> x9 : 00000000000006f4 x8 : 000006a400000654 >> x7 : 000006f400000640 x6 : fffffe0940966480 >> x5 : fffffe0940968200 x4 : 0000000000000001 >> x3 : fffffe0940966a80 x2 : 0000000000000000 >> x1 : fffffe0940bd0900 x0 : fffffe0940bd0960 >> >> ---[ end trace bdb6af69b29bf7ea ]--- >> Call trace: >> [] >> drm_atomic_helper_update_legacy_modeset_state+0x1e8/0x1f0 >> [] drm_atomic_helper_commit_modeset_disables+0x1a8/0x388 >> [] drm_atomic_helper_commit+0xd8/0x140 >> [] hdlcd_atomic_commit+0x10/0x18 >> [] drm_atomic_commit+0x40/0x70 >> [] restore_fbdev_mode+0x270/0x2b0 >> [] drm_fb_helper_restore_fbdev_mode_unlocked+0x34/0x90 >> [] drm_fb_helper_set_par+0x2c/0x60 >> [] fbcon_init+0x4d0/0x520 >> [] visual_init+0xac/0x108 >> [] do_bind_con_driver+0x1d4/0x3e8 >> [] do_take_over_console+0x174/0x1e8 >> [] do_fbcon_takeover+0x74/0x100 >> [] fbcon_event_notify+0x77c/0x7d8 >> [] notifier_call_chain+0x50/0x90 >> [] __blocking_notifier_call_chain+0x4c/0x90 >> [] blocking_notifier_call_chain+0x14/0x20 >> [] fb_notifier_call_chain+0x1c/0x28 >> [] register_framebuffer+0x1c0/0x2b8 >> [] drm_fb_helper_initial_config+0x284/0x3e8 >> [] drm_fbdev_cma_init+0x94/0x148 >> [] hdlcd_drm_bind+0x1d4/0x418 >> [] try_to_bring_up_master.part.2+0xc8/0x110 >> [] component_add+0x90/0x108 >> [] tda998x_probe+0x18/0x20 >> [] i2c_device_probe+0x164/0x228 >> [] driver_probe_device+0x1ec/0x2f0 >> [] __device_attach_driver+0x90/0xd8 >> [] bus_for_each_drv+0x58/0x98 >> [] __device_attach+0xc4/0x148 >> [] device_initial_probe+0x10/0x18 >> [] bus_probe_device+0x94/0xa0 >> [] deferred_probe_work_func+0x70/0xa8 >> [] process_one_work+0x138/0x378 >> [] worker_thread+0x124/0x498 >> [] kthread+0xdc/0xf0 >> [] ret_from_fork+0x10/0x50 >> Console: switching to colour frame buffer device 150x100 >> >> which for reference, is the first one in that function: >> >> ... >> /* clear out existing links and update dpms */ >> for_each_connector_in_state(old_state, connector, old_conn_state, i) { >> if (connector->encoder) { >> WARN_ON(!connector->encoder->crtc); >> ... >> >> That's on 4.4-rc2 with this series plus the 3 tda998x patches from Russell's >> patch system applied. Is there something else I'm missing or does this need >> looking at (could it be related to that initial probe deferral)? > > Yeah, you also need Thierry Reding's patch to not set the connector->encoder in > drivers. > > http://lists.freedesktop.org/archives/dri-devel/2015-November/094576.html Ah, right, I don't think that one was specifically called out anywhere, but it does indeed make the splat go away, thanks! >> >>> Signed-off-by: Liviu Dudau >>> Acked-by: Daniel Vetter >>> --- >>> drivers/gpu/drm/Kconfig | 2 + >>> drivers/gpu/drm/Makefile | 1 + >>> drivers/gpu/drm/arm/Kconfig | 29 ++ >>> drivers/gpu/drm/arm/Makefile | 2 + >>> drivers/gpu/drm/arm/hdlcd_crtc.c | 329 ++++++++++++++++++++++ >>> drivers/gpu/drm/arm/hdlcd_drv.c | 580 +++++++++++++++++++++++++++++++++++++++ >>> drivers/gpu/drm/arm/hdlcd_drv.h | 42 +++ >>> drivers/gpu/drm/arm/hdlcd_regs.h | 87 ++++++ >>> 8 files changed, 1072 insertions(+) >>> create mode 100644 drivers/gpu/drm/arm/Kconfig >>> create mode 100644 drivers/gpu/drm/arm/Makefile >>> create mode 100644 drivers/gpu/drm/arm/hdlcd_crtc.c >>> create mode 100644 drivers/gpu/drm/arm/hdlcd_drv.c >>> create mode 100644 drivers/gpu/drm/arm/hdlcd_drv.h >>> create mode 100644 drivers/gpu/drm/arm/hdlcd_regs.h >> >> [...] >> >>> +static int hdlcd_set_pxl_fmt(struct drm_crtc *crtc) >>> +{ >>> + unsigned int btpp, default_color = 0x00000000; >>> + struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc); >>> + uint32_t pixel_format; >>> + struct simplefb_format *format = NULL; >>> + int i; >>> + >>> +#ifdef CONFIG_DRM_HDLCD_SHOW_UNDERRUN >>> + default_color = 0x00ff0000; /* show underruns in red */ >>> +#endif >>> + >>> + pixel_format = crtc->primary->state->fb->pixel_format; >>> + >>> + for (i = 0; i < ARRAY_SIZE(supported_formats); i++) { >>> + if (supported_formats[i].fourcc == pixel_format) >>> + format = &supported_formats[i]; >>> + } >>> + >>> + if (WARN_ON(!format)) { >>> + return 0; >>> + } >> >> nit: unnecessary braces. >> >>> + /* HDLCD uses 'bytes per pixel', zero means 1 byte */ >>> + btpp = (format->bits_per_pixel + 7) / 8; >>> + hdlcd_write(hdlcd, HDLCD_REG_PIXEL_FORMAT, (btpp - 1) << 3); >>> + >>> + /* >>> + * The format of the HDLCD_REG__SELECT register is: >>> + * - bits[23:16] - default value for that color component >>> + * - bits[11:8] - number of bits to extract for each color component >>> + * - bits[4:0] - index of the lowest bit to extract >>> + * >>> + * The default color value is used when bits[11:8] are zero, when the >>> + * pixel is outside the visible frame area or when there is a >>> + * buffer underrun. >>> + */ >>> + hdlcd_write(hdlcd, HDLCD_REG_RED_SELECT, default_color | >>> + format->red.offset | (format->red.length & 0xf) << 8); >>> + hdlcd_write(hdlcd, HDLCD_REG_GREEN_SELECT, default_color | >>> + format->green.offset | (format->green.length & 0xf) << 8); >>> + hdlcd_write(hdlcd, HDLCD_REG_BLUE_SELECT, default_color | >>> + format->blue.offset | (format->blue.length & 0xf) << 8); >> >> These would seem to be putting bits 23:16 from default_color into the >> default field of every register, and indeed underruns show up as a very >> white-looking shade of red for me ;) > > Ooops, I better change that. Could you tell me how you trigger underruns > in your setup? I cheat and put the SMMU into a state where it won't allow anything through at all, so it's the ultimate 'underrun'. >> >>> + return 0; >>> +} >> >> [...] >> >>> +static void hdlcd_fb_output_poll_changed(struct drm_device *drm) >>> +{ >>> + struct hdlcd_drm_private *hdlcd = drm->dev_private; >>> + >>> + if (hdlcd->fbdev) { >>> + drm_fbdev_cma_hotplug_event(hdlcd->fbdev); >>> + } >> >> nit: braces. >> >>> +} >> >> [...] >> >>> +static irqreturn_t hdlcd_irq(int irq, void *arg) >>> +{ >>> + struct drm_device *drm = arg; >>> + struct hdlcd_drm_private *hdlcd = drm->dev_private; >>> + unsigned long irq_status; >>> + >>> + irq_status = hdlcd_read(hdlcd, HDLCD_REG_INT_STATUS); >>> + >>> +#ifdef CONFIG_DEBUG_FS >>> + if (irq_status & HDLCD_INTERRUPT_UNDERRUN) { >>> + atomic_inc(&hdlcd->buffer_underrun_count); >>> + } >>> + if (irq_status & HDLCD_INTERRUPT_DMA_END) { >>> + atomic_inc(&hdlcd->dma_end_count); >>> + } >>> + if (irq_status & HDLCD_INTERRUPT_BUS_ERROR) { >>> + atomic_inc(&hdlcd->bus_error_count); >>> + } >>> + if (irq_status & HDLCD_INTERRUPT_VSYNC) { >>> + atomic_inc(&hdlcd->vsync_count); >>> + } >> >> nit: braces again (it's only because I'm too lazy to remove the newbie >> checkpatch commit hook, and a manual merge of this into my SMMU dev tree >> made that throw a fit) >> >>> +#endif >>> + if (irq_status & HDLCD_INTERRUPT_VSYNC) { >>> + bool events_sent = false; >>> + unsigned long flags; >>> + struct drm_pending_vblank_event *e, *t; >>> + >>> + drm_crtc_handle_vblank(&hdlcd->crtc); >>> + >>> + spin_lock_irqsave(&drm->event_lock, flags); >>> + list_for_each_entry_safe(e, t, &hdlcd->event_list, base.link) { >>> + list_del(&e->base.link); >>> + drm_crtc_send_vblank_event(&hdlcd->crtc, e); >>> + events_sent = true; >>> + } >>> + if (events_sent) >>> + drm_crtc_vblank_put(&hdlcd->crtc); >>> + spin_unlock_irqrestore(&drm->event_lock, flags); >>> + } >>> + >>> + /* acknowledge interrupt(s) */ >>> + hdlcd_write(hdlcd, HDLCD_REG_INT_CLEAR, irq_status); >>> + >>> + return IRQ_HANDLED; >>> +} >> >> Other than that though, it seems to do the job. I get a usable framebuffer >> console and can boot to an X desktop with at least the ancient 1600x1200 DVI >> monitor I have handy - the 1920x1080 HDMI one seems to get recognised OK but >> the monitor itself doesn't like the signal and just locks up until I unplug >> it, although I know that's more of a clock driver/firmware issue. > > I have a TV that does the same. Yes, the SCPI clock that was picked for this > resolution is a standard one, but I bet that these monitors are slightly out > of spec. At least my TV lists two options for 1080p: one with 145MHz pixel > clock and another with 145.382MHz. But Linux decides to go interlaced anyway, > so I can't test without a hack in tda998x_drv.c. Yeah, the fact that it goes unresponsive by continually trying to sync with the signal rather than just giving up and displaying the 'out of range' message suggests that's the case. Oddly, that one did used to work fine with the old hard-coded SCP clock. Oh well. Robin. > Thanks for testing this. > > Best regards, > Liviu > >> >> Robin. >> >