From mboxrd@z Thu Jan 1 00:00:00 1970 From: seanpaul@chromium.org (Sean Paul) Date: Thu, 10 Nov 2016 16:53:32 -0500 Subject: [PATCH v6 4/9] drm/hisilicon/hibmc: Add plane for DE In-Reply-To: <1477639682-22520-5-git-send-email-zourongrong@gmail.com> References: <1477639682-22520-1-git-send-email-zourongrong@gmail.com> <1477639682-22520-5-git-send-email-zourongrong@gmail.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Fri, Oct 28, 2016 at 3:27 AM, Rongrong Zou wrote: > Add plane funcs and helper funcs for DE. > > Signed-off-by: Rongrong Zou > --- > drivers/gpu/drm/hisilicon/hibmc/Kconfig | 1 + > drivers/gpu/drm/hisilicon/hibmc/Makefile | 2 +- > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c | 170 ++++++++++++++++++++++++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h | 29 ++++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 51 ++++++- > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 5 + > drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c | 6 + > 7 files changed, 261 insertions(+), 3 deletions(-) > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h > > diff --git a/drivers/gpu/drm/hisilicon/hibmc/Kconfig b/drivers/gpu/drm/hisilicon/hibmc/Kconfig > index bcb8c18..380622a 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/Kconfig > +++ b/drivers/gpu/drm/hisilicon/hibmc/Kconfig > @@ -1,6 +1,7 @@ > config DRM_HISI_HIBMC > tristate "DRM Support for Hisilicon Hibmc" > depends on DRM && PCI > + select DRM_KMS_HELPER > select DRM_TTM > > help > diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile b/drivers/gpu/drm/hisilicon/hibmc/Makefile > index 810a37e..72e107e 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/Makefile > +++ b/drivers/gpu/drm/hisilicon/hibmc/Makefile > @@ -1,5 +1,5 @@ > ccflags-y := -Iinclude/drm > -hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_fbdev.o hibmc_drm_power.o hibmc_ttm.o > +hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_de.o hibmc_drm_fbdev.o hibmc_drm_power.o hibmc_ttm.o > > obj-$(CONFIG_DRM_HISI_HIBMC) +=hibmc-drm.o > #obj-y += hibmc-drm.o > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c > new file mode 100644 > index 0000000..9c1a68c > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c > @@ -0,0 +1,170 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + */ > + > +#include > +#include > +#include > +#include > + > +#include "hibmc_drm_drv.h" > +#include "hibmc_drm_regs.h" > +#include "hibmc_drm_power.h" > + > +/* ---------------------------------------------------------------------- */ Remove > + > +static int hibmc_plane_atomic_check(struct drm_plane *plane, > + struct drm_plane_state *state) > +{ > + struct drm_framebuffer *fb = state->fb; > + struct drm_crtc *crtc = state->crtc; > + struct drm_crtc_state *crtc_state; > + u32 src_x = state->src_x >> 16; > + u32 src_y = state->src_y >> 16; > + u32 src_w = state->src_w >> 16; > + u32 src_h = state->src_h >> 16; > + int crtc_x = state->crtc_x; > + int crtc_y = state->crtc_y; > + u32 crtc_w = state->crtc_w; > + u32 crtc_h = state->crtc_h; I don't think you gain anything with the crtc_* vars > + > + if (!crtc || !fb) > + return 0; > + > + crtc_state = drm_atomic_get_crtc_state(state->state, crtc); > + if (IS_ERR(crtc_state)) > + return PTR_ERR(crtc_state); > + > + if (src_w != crtc_w || src_h != crtc_h) { > + DRM_ERROR("Scale not support!!!\n"); I like the enthusiasm, but I think DRM_DEBUG_ATOMIC would be better > + return -EINVAL; > + } > + > + if (src_x + src_w > fb->width || > + src_y + src_h > fb->height) These should be already covered in drm_atomic_plane_check > + return -EINVAL; > + > + if (crtc_x < 0 || crtc_y < 0) Print DRM_DEBUG_ATOMIC message here > + return -EINVAL; > + > + if (crtc_x + crtc_w > crtc_state->adjusted_mode.hdisplay || > + crtc_y + crtc_h > crtc_state->adjusted_mode.vdisplay) DRM_DEBUG_ATOMIC here too > + return -EINVAL; > + > + return 0; > +} > + > +static void hibmc_plane_atomic_update(struct drm_plane *plane, > + struct drm_plane_state *old_state) > +{ > + struct drm_plane_state *state = plane->state; > + u32 reg; > + int ret; > + u64 gpu_addr = 0; > + unsigned int line_l; > + struct hibmc_drm_device *hidev = > + (struct hibmc_drm_device *)plane->dev->dev_private; > + nit: extra line > + struct hibmc_framebuffer *hibmc_fb; > + struct hibmc_bo *bo; > + > + hibmc_fb = to_hibmc_framebuffer(state->fb); > + bo = gem_to_hibmc_bo(hibmc_fb->obj); > + ret = ttm_bo_reserve(&bo->bo, true, false, NULL); > + if (ret) Print error > + return; > + > + hibmc_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr); Check return value > + if (ret) { > + ttm_bo_unreserve(&bo->bo); > + return; > + } > + > + ttm_bo_unreserve(&bo->bo); Move this up before the conditional so you don't have to call it in both branches > + > + writel(gpu_addr, hidev->mmio + HIBMC_CRT_FB_ADDRESS); > + > + reg = state->fb->width * (state->fb->bits_per_pixel >> 3); > + /* now line_pad is 16 */ > + reg = PADDING(16, reg); > + > + line_l = state->fb->width * state->fb->bits_per_pixel / 8; above, you >> 3. here you / 8, pick one? > + line_l = PADDING(16, line_l); > + writel((HIBMC_CRT_FB_WIDTH_WIDTH(reg) & HIBMC_CRT_FB_WIDTH_WIDTH_MASK) | > + (HIBMC_CRT_FB_WIDTH_OFFS(line_l) & HIBMC_CRT_FB_WIDTH_OFFS_MASK), > + hidev->mmio + HIBMC_CRT_FB_WIDTH); > + > + /* SET PIXEL FORMAT */ > + reg = readl(hidev->mmio + HIBMC_CRT_DISP_CTL); > + reg = reg & ~HIBMC_CRT_DISP_CTL_FORMAT_MASK; > + reg = reg | (HIBMC_CRT_DISP_CTL_FORMAT(state->fb->bits_per_pixel >> 4) & > + HIBMC_CRT_DISP_CTL_FORMAT_MASK); > + writel(reg, hidev->mmio + HIBMC_CRT_DISP_CTL); > +} > + > +static void hibmc_plane_atomic_disable(struct drm_plane *plane, > + struct drm_plane_state *old_state) > +{ > +} The caller checks for NULL, no need to stub > + > +static const u32 channel_formats1[] = { > + DRM_FORMAT_RGB565, DRM_FORMAT_BGR565, DRM_FORMAT_RGB888, > + DRM_FORMAT_BGR888, DRM_FORMAT_XRGB8888, DRM_FORMAT_XBGR8888, > + DRM_FORMAT_RGBA8888, DRM_FORMAT_BGRA8888, DRM_FORMAT_ARGB8888, > + DRM_FORMAT_ABGR8888 > +}; > + > +static struct drm_plane_funcs hibmc_plane_funcs = { > + .update_plane = drm_atomic_helper_update_plane, > + .disable_plane = drm_atomic_helper_disable_plane, > + .set_property = drm_atomic_helper_plane_set_property, > + .destroy = drm_plane_cleanup, > + .reset = drm_atomic_helper_plane_reset, > + .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, > + .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, > +}; > + > +static const struct drm_plane_helper_funcs hibmc_plane_helper_funcs = { > + .atomic_check = hibmc_plane_atomic_check, > + .atomic_update = hibmc_plane_atomic_update, > + .atomic_disable = hibmc_plane_atomic_disable, > +}; > + > +int hibmc_plane_init(struct hibmc_drm_device *hidev) > +{ > + struct drm_device *dev = hidev->dev; > + struct drm_plane *plane = &hidev->plane; > + int ret = 0; > + > + /* > + * plane init > + * TODO: Now only support primary plane, overlay planes > + * need to do. > + */ > + ret = drm_universal_plane_init(dev, plane, 1, &hibmc_plane_funcs, > + channel_formats1, > + ARRAY_SIZE(channel_formats1), > + DRM_PLANE_TYPE_PRIMARY, > + NULL); > + if (ret) { > + DRM_ERROR("fail to init plane!!!\n"); > + return ret; > + } > + > + drm_plane_helper_add(plane, &hibmc_plane_helper_funcs); > + return 0; > +} > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h > new file mode 100644 > index 0000000..4ce0d7b > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h > @@ -0,0 +1,29 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + */ > + > +#ifndef HIBMC_DRM_DE_H > +#define HIBMC_DRM_DE_H > + > +struct panel_pll { > + unsigned long M; > + unsigned long N; > + unsigned long OD; > + unsigned long POD; > +}; > + > +#endif > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > index 5ac7a7e..7d96583 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > @@ -18,6 +18,7 @@ > > #include > #include > +#include > > #include "hibmc_drm_drv.h" > #include "hibmc_drm_regs.h" > @@ -47,8 +48,8 @@ static void hibmc_disable_vblank(struct drm_device *dev, unsigned int pipe) > } > > static struct drm_driver hibmc_driver = { > - .driver_features = DRIVER_GEM, > - > + .driver_features = DRIVER_GEM | DRIVER_MODESET | > + DRIVER_ATOMIC, > .fops = &hibmc_fops, > .name = "hibmc", > .date = "20160828", > @@ -70,6 +71,7 @@ static int hibmc_pm_suspend(struct device *dev) > struct drm_device *drm_dev = pci_get_drvdata(pdev); > struct hibmc_drm_device *hidev = drm_dev->dev_private; > > + drm_kms_helper_poll_disable(drm_dev); > drm_fb_helper_set_suspend_unlocked(&hidev->fbdev->helper, 1); > > return 0; > @@ -81,7 +83,9 @@ static int hibmc_pm_resume(struct device *dev) > struct drm_device *drm_dev = pci_get_drvdata(pdev); > struct hibmc_drm_device *hidev = drm_dev->dev_private; > > + drm_helper_resume_force_mode(drm_dev); > drm_fb_helper_set_suspend_unlocked(&hidev->fbdev->helper, 0); > + drm_kms_helper_poll_enable(drm_dev); > > return 0; > } > @@ -91,6 +95,41 @@ static int hibmc_pm_resume(struct device *dev) > hibmc_pm_resume) > }; > > +static int hibmc_kms_init(struct hibmc_drm_device *hidev) > +{ > + int ret; > + > + drm_mode_config_init(hidev->dev); > + hidev->mode_config_initialized = true; > + > + hidev->dev->mode_config.min_width = 0; > + hidev->dev->mode_config.min_height = 0; > + hidev->dev->mode_config.max_width = 1920; > + hidev->dev->mode_config.max_height = 1440; > + > + hidev->dev->mode_config.fb_base = hidev->fb_base; > + hidev->dev->mode_config.preferred_depth = 24; > + hidev->dev->mode_config.prefer_shadow = 0; > + > + hidev->dev->mode_config.funcs = (void *)&hibmc_mode_funcs; > + > + ret = hibmc_plane_init(hidev); > + if (ret) { > + DRM_ERROR("fail to init plane!!!\n"); > + return ret; > + } > + > + return 0; > +} > + > +static void hibmc_kms_fini(struct hibmc_drm_device *hidev) > +{ > + if (hidev->mode_config_initialized) { > + drm_mode_config_cleanup(hidev->dev); > + hidev->mode_config_initialized = false; > + } > +} > + > static int hibmc_hw_config(struct hibmc_drm_device *hidev) > { > unsigned int reg; > @@ -183,6 +222,7 @@ static int hibmc_unload(struct drm_device *dev) > struct hibmc_drm_device *hidev = dev->dev_private; > > hibmc_fbdev_fini(hidev); > + hibmc_kms_fini(hidev); > hibmc_mm_fini(hidev); > hibmc_hw_fini(hidev); > dev->dev_private = NULL; > @@ -208,6 +248,13 @@ static int hibmc_load(struct drm_device *dev, unsigned long flags) > if (ret) > goto err; > > + ret = hibmc_kms_init(hidev); > + if (ret) > + goto err; > + > + /* reset all the states of crtc/plane/encoder/connector */ > + drm_mode_config_reset(dev); > + > ret = hibmc_fbdev_init(hidev); > if (ret) > goto err; > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > index a40e9a7..49e39d2 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > @@ -45,6 +45,8 @@ struct hibmc_drm_device { > > /* drm */ > struct drm_device *dev; > + struct drm_plane plane; > + bool mode_config_initialized; > > /* ttm */ > struct { > @@ -82,6 +84,7 @@ static inline struct hibmc_bo *gem_to_hibmc_bo(struct drm_gem_object *gem) > > #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT) > > +int hibmc_plane_init(struct hibmc_drm_device *hidev); > int hibmc_fbdev_init(struct hibmc_drm_device *hidev); > void hibmc_fbdev_fini(struct hibmc_drm_device *hidev); > > @@ -102,4 +105,6 @@ int hibmc_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev, > u32 handle, u64 *offset); > int hibmc_mmap(struct file *filp, struct vm_area_struct *vma); > > +extern const struct drm_mode_config_funcs hibmc_mode_funcs; > + > #endif > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c > index 9822f62..beb4d76 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c > @@ -554,3 +554,9 @@ struct hibmc_framebuffer * > } > return &hibmc_fb->fb; > } > + > +const struct drm_mode_config_funcs hibmc_mode_funcs = { > + .atomic_check = drm_atomic_helper_check, > + .atomic_commit = drm_atomic_helper_commit, > + .fb_create = hibmc_user_framebuffer_create, > +}; > -- > 1.9.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel at lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sean Paul Subject: Re: [PATCH v6 4/9] drm/hisilicon/hibmc: Add plane for DE Date: Thu, 10 Nov 2016 16:53:32 -0500 Message-ID: References: <1477639682-22520-1-git-send-email-zourongrong@gmail.com> <1477639682-22520-5-git-send-email-zourongrong@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-yb0-x22c.google.com (mail-yb0-x22c.google.com [IPv6:2607:f8b0:4002:c09::22c]) by gabe.freedesktop.org (Postfix) with ESMTPS id 70A7A6E100 for ; Thu, 10 Nov 2016 21:54:00 +0000 (UTC) Received: by mail-yb0-x22c.google.com with SMTP id a184so12852764ybb.0 for ; Thu, 10 Nov 2016 13:54:00 -0800 (PST) Received: from mail-yw0-f181.google.com (mail-yw0-f181.google.com. [209.85.161.181]) by smtp.gmail.com with ESMTPSA id x132sm2282381ywc.56.2016.11.10.13.53.55 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Nov 2016 13:53:56 -0800 (PST) Received: by mail-yw0-f181.google.com with SMTP id a10so33132831ywa.3 for ; Thu, 10 Nov 2016 13:53:55 -0800 (PST) In-Reply-To: <1477639682-22520-5-git-send-email-zourongrong@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Rongrong Zou Cc: Mark Rutland , shenhui@huawei.com, Tomeu Vizoso , Jonathan Corbet , catalin.marinas@arm.com, Emil Velikov , linuxarm@huawei.com, dri-devel , guohanjun@huawei.com, Will Deacon , lijianhua@huawei.com, Linux ARM Kernel , james.xiong@huawei.com List-Id: dri-devel@lists.freedesktop.org T24gRnJpLCBPY3QgMjgsIDIwMTYgYXQgMzoyNyBBTSwgUm9uZ3JvbmcgWm91IDx6b3Vyb25ncm9u Z0BnbWFpbC5jb20+IHdyb3RlOgo+IEFkZCBwbGFuZSBmdW5jcyBhbmQgaGVscGVyIGZ1bmNzIGZv ciBERS4KPgo+IFNpZ25lZC1vZmYtYnk6IFJvbmdyb25nIFpvdSA8em91cm9uZ3JvbmdAZ21haWwu Y29tPgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL0tjb25maWcgICAg ICAgICB8ICAgMSArCj4gIGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvTWFrZWZpbGUg ICAgICAgIHwgICAyICstCj4gIGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNf ZHJtX2RlLmMgIHwgMTcwICsrKysrKysrKysrKysrKysrKysrKysrKwo+ICBkcml2ZXJzL2dwdS9k cm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kZS5oICB8ICAyOSArKysrCj4gIGRyaXZlcnMv Z3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5jIHwgIDUxICsrKysrKy0KPiAg ZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmggfCAgIDUgKwo+ ICBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX3R0bS5jICAgICB8ICAgNiAr Cj4gIDcgZmlsZXMgY2hhbmdlZCwgMjYxIGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCj4g IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1j X2RybV9kZS5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29u L2hpYm1jL2hpYm1jX2RybV9kZS5oCj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2hp c2lsaWNvbi9oaWJtYy9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9L Y29uZmlnCj4gaW5kZXggYmNiOGMxOC4uMzgwNjIyYSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vaGlzaWxpY29uL2hpYm1jL0tjb25maWcKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaGlz aWxpY29uL2hpYm1jL0tjb25maWcKPiBAQCAtMSw2ICsxLDcgQEAKPiAgY29uZmlnIERSTV9ISVNJ X0hJQk1DCj4gICAgICAgICB0cmlzdGF0ZSAiRFJNIFN1cHBvcnQgZm9yIEhpc2lsaWNvbiBIaWJt YyIKPiAgICAgICAgIGRlcGVuZHMgb24gRFJNICYmIFBDSQo+ICsgICAgICAgc2VsZWN0IERSTV9L TVNfSEVMUEVSCj4gICAgICAgICBzZWxlY3QgRFJNX1RUTQo+Cj4gICAgICAgICBoZWxwCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvTWFrZWZpbGUgYi9kcml2 ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL01ha2VmaWxlCj4gaW5kZXggODEwYTM3ZS4uNzJl MTA3ZSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL01ha2Vm aWxlCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9NYWtlZmlsZQo+IEBA IC0xLDUgKzEsNSBAQAo+ICBjY2ZsYWdzLXkgOj0gLUlpbmNsdWRlL2RybQo+IC1oaWJtYy1kcm0t eSA6PSBoaWJtY19kcm1fZHJ2Lm8gaGlibWNfZHJtX2ZiZGV2Lm8gaGlibWNfZHJtX3Bvd2VyLm8g aGlibWNfdHRtLm8KPiAraGlibWMtZHJtLXkgOj0gaGlibWNfZHJtX2Rydi5vIGhpYm1jX2RybV9k ZS5vIGhpYm1jX2RybV9mYmRldi5vIGhpYm1jX2RybV9wb3dlci5vIGhpYm1jX3R0bS5vCj4KPiAg b2JqLSQoQ09ORklHX0RSTV9ISVNJX0hJQk1DKSAgICs9aGlibWMtZHJtLm8KPiAgI29iai15ICs9 IGhpYm1jLWRybS5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGli bWMvaGlibWNfZHJtX2RlLmMgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1j X2RybV9kZS5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi45YzFhNjhj Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMv aGlibWNfZHJtX2RlLmMKPiBAQCAtMCwwICsxLDE3MCBAQAo+ICsvKiBIaXNpbGljb24gSGlibWMg U29DIGRybSBkcml2ZXIKPiArICoKPiArICogQmFzZWQgb24gdGhlIGJvY2hzIGRybSBkcml2ZXIu Cj4gKyAqCj4gKyAqIENvcHlyaWdodCAoYykgMjAxNiBIdWF3ZWkgTGltaXRlZC4KPiArICoKPiAr ICogQXV0aG9yOgo+ICsgKiAgICAgUm9uZ3JvbmcgWm91IDx6b3Vyb25ncm9uZ0BodWF3ZWkuY29t Pgo+ICsgKiAgICAgUm9uZ3JvbmcgWm91IDx6b3Vyb25ncm9uZ0BnbWFpbC5jb20+Cj4gKyAqICAg ICBKaWFuaHVhIExpIDxsaWppYW5odWFAaHVhd2VpLmNvbT4KPiArICoKPiArICogVGhpcyBwcm9n cmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2Rp ZnkKPiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcyBwdWJsaXNoZWQgYnkKPiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPiArICogKGF0IHlvdXIgb3B0aW9u KSBhbnkgbGF0ZXIgdmVyc2lvbi4KPiArICoKPiArICovCj4gKwo+ICsjaW5jbHVkZSA8ZHJtL2Ry bV9hdG9taWMuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBlci5oPgo+ICsjaW5j bHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgo+ICsjaW5jbHVkZSA8ZHJtL2RybV9wbGFuZV9o ZWxwZXIuaD4KPiArCj4gKyNpbmNsdWRlICJoaWJtY19kcm1fZHJ2LmgiCj4gKyNpbmNsdWRlICJo aWJtY19kcm1fcmVncy5oIgo+ICsjaW5jbHVkZSAiaGlibWNfZHJtX3Bvd2VyLmgiCj4gKwo+ICsv KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tICovCgpSZW1vdmUKCj4gKwo+ICtzdGF0aWMgaW50IGhpYm1jX3BsYW5l X2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpzdGF0ZSkKPiArewo+ ICsgICAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBzdGF0ZS0+ZmI7Cj4gKyAgICAg ICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBzdGF0ZS0+Y3J0YzsKPiArICAgICAgIHN0cnVjdCBk cm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKPiArICAgICAgIHUzMiBzcmNfeCA9IHN0YXRlLT5z cmNfeCA+PiAxNjsKPiArICAgICAgIHUzMiBzcmNfeSA9IHN0YXRlLT5zcmNfeSA+PiAxNjsKPiAr ICAgICAgIHUzMiBzcmNfdyA9IHN0YXRlLT5zcmNfdyA+PiAxNjsKPiArICAgICAgIHUzMiBzcmNf aCA9IHN0YXRlLT5zcmNfaCA+PiAxNjsKPiArICAgICAgIGludCBjcnRjX3ggPSBzdGF0ZS0+Y3J0 Y194Owo+ICsgICAgICAgaW50IGNydGNfeSA9IHN0YXRlLT5jcnRjX3k7Cj4gKyAgICAgICB1MzIg Y3J0Y193ID0gc3RhdGUtPmNydGNfdzsKPiArICAgICAgIHUzMiBjcnRjX2ggPSBzdGF0ZS0+Y3J0 Y19oOwoKSSBkb24ndCB0aGluayB5b3UgZ2FpbiBhbnl0aGluZyB3aXRoIHRoZSBjcnRjXyogdmFy cwoKPiArCj4gKyAgICAgICBpZiAoIWNydGMgfHwgIWZiKQo+ICsgICAgICAgICAgICAgICByZXR1 cm4gMDsKPiArCj4gKyAgICAgICBjcnRjX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY3J0Y19zdGF0 ZShzdGF0ZS0+c3RhdGUsIGNydGMpOwo+ICsgICAgICAgaWYgKElTX0VSUihjcnRjX3N0YXRlKSkK PiArICAgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIoY3J0Y19zdGF0ZSk7Cj4gKwo+ICsgICAg ICAgaWYgKHNyY193ICE9IGNydGNfdyB8fCBzcmNfaCAhPSBjcnRjX2gpIHsKPiArICAgICAgICAg ICAgICAgRFJNX0VSUk9SKCJTY2FsZSBub3Qgc3VwcG9ydCEhIVxuIik7CgpJIGxpa2UgdGhlIGVu dGh1c2lhc20sIGJ1dCBJIHRoaW5rIERSTV9ERUJVR19BVE9NSUMgd291bGQgYmUgYmV0dGVyCgo+ ICsgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiArICAgICAgIH0KPiArCj4gKyAgICAg ICBpZiAoc3JjX3ggKyBzcmNfdyA+IGZiLT53aWR0aCB8fAo+ICsgICAgICAgICAgIHNyY195ICsg c3JjX2ggPiBmYi0+aGVpZ2h0KQoKVGhlc2Ugc2hvdWxkIGJlIGFscmVhZHkgY292ZXJlZCBpbiBk cm1fYXRvbWljX3BsYW5lX2NoZWNrCgo+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsK PiArCj4gKyAgICAgICBpZiAoY3J0Y194IDwgMCB8fCBjcnRjX3kgPCAwKQoKUHJpbnQgRFJNX0RF QlVHX0FUT01JQyBtZXNzYWdlIGhlcmUKCj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFM Owo+ICsKPiArICAgICAgIGlmIChjcnRjX3ggKyBjcnRjX3cgPiBjcnRjX3N0YXRlLT5hZGp1c3Rl ZF9tb2RlLmhkaXNwbGF5IHx8Cj4gKyAgICAgICAgICAgY3J0Y195ICsgY3J0Y19oID4gY3J0Y19z dGF0ZS0+YWRqdXN0ZWRfbW9kZS52ZGlzcGxheSkKCkRSTV9ERUJVR19BVE9NSUMgaGVyZSB0b28K Cj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ICsKPiArICAgICAgIHJldHVybiAw Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBoaWJtY19wbGFuZV9hdG9taWNfdXBkYXRlKHN0cnVj dCBkcm1fcGxhbmUgKnBsYW5lLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqb2xkX3N0YXRlKQo+ICt7Cj4gKyAgICAgICBzdHJ1 Y3QgZHJtX3BsYW5lX3N0YXRlICAqc3RhdGUgID0gcGxhbmUtPnN0YXRlOwo+ICsgICAgICAgdTMy IHJlZzsKPiArICAgICAgIGludCByZXQ7Cj4gKyAgICAgICB1NjQgZ3B1X2FkZHIgPSAwOwo+ICsg ICAgICAgdW5zaWduZWQgaW50IGxpbmVfbDsKPiArICAgICAgIHN0cnVjdCBoaWJtY19kcm1fZGV2 aWNlICpoaWRldiA9Cj4gKyAgICAgICAgICAgICAgIChzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAq KXBsYW5lLT5kZXYtPmRldl9wcml2YXRlOwo+ICsKCm5pdDogZXh0cmEgbGluZQoKPiArICAgICAg IHN0cnVjdCBoaWJtY19mcmFtZWJ1ZmZlciAqaGlibWNfZmI7Cj4gKyAgICAgICBzdHJ1Y3QgaGli bWNfYm8gKmJvOwo+ICsKPiArICAgICAgIGhpYm1jX2ZiID0gdG9faGlibWNfZnJhbWVidWZmZXIo c3RhdGUtPmZiKTsKPiArICAgICAgIGJvID0gZ2VtX3RvX2hpYm1jX2JvKGhpYm1jX2ZiLT5vYmop Owo+ICsgICAgICAgcmV0ID0gdHRtX2JvX3Jlc2VydmUoJmJvLT5ibywgdHJ1ZSwgZmFsc2UsIE5V TEwpOwo+ICsgICAgICAgaWYgKHJldCkKClByaW50IGVycm9yCgo+ICsgICAgICAgICAgICAgICBy ZXR1cm47Cj4gKwo+ICsgICAgICAgaGlibWNfYm9fcGluKGJvLCBUVE1fUExfRkxBR19WUkFNLCAm Z3B1X2FkZHIpOwoKQ2hlY2sgcmV0dXJuIHZhbHVlCgo+ICsgICAgICAgaWYgKHJldCkgewo+ICsg ICAgICAgICAgICAgICB0dG1fYm9fdW5yZXNlcnZlKCZiby0+Ym8pOwo+ICsgICAgICAgICAgICAg ICByZXR1cm47Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgdHRtX2JvX3VucmVzZXJ2ZSgmYm8t PmJvKTsKCk1vdmUgdGhpcyB1cCBiZWZvcmUgdGhlIGNvbmRpdGlvbmFsIHNvIHlvdSBkb24ndCBo YXZlIHRvIGNhbGwgaXQgaW4KYm90aCBicmFuY2hlcwoKPiArCj4gKyAgICAgICB3cml0ZWwoZ3B1 X2FkZHIsIGhpZGV2LT5tbWlvICsgSElCTUNfQ1JUX0ZCX0FERFJFU1MpOwo+ICsKPiArICAgICAg IHJlZyA9IHN0YXRlLT5mYi0+d2lkdGggKiAoc3RhdGUtPmZiLT5iaXRzX3Blcl9waXhlbCA+PiAz KTsKPiArICAgICAgIC8qIG5vdyBsaW5lX3BhZCBpcyAxNiAqLwo+ICsgICAgICAgcmVnID0gUEFE RElORygxNiwgcmVnKTsKPiArCj4gKyAgICAgICBsaW5lX2wgPSBzdGF0ZS0+ZmItPndpZHRoICog c3RhdGUtPmZiLT5iaXRzX3Blcl9waXhlbCAvIDg7CgphYm92ZSwgeW91ID4+IDMuIGhlcmUgeW91 IC8gOCwgcGljayBvbmU/Cgo+ICsgICAgICAgbGluZV9sID0gUEFERElORygxNiwgbGluZV9sKTsK PiArICAgICAgIHdyaXRlbCgoSElCTUNfQ1JUX0ZCX1dJRFRIX1dJRFRIKHJlZykgJiBISUJNQ19D UlRfRkJfV0lEVEhfV0lEVEhfTUFTSykgfAo+ICsgICAgICAgICAgICAgIChISUJNQ19DUlRfRkJf V0lEVEhfT0ZGUyhsaW5lX2wpICYgSElCTUNfQ1JUX0ZCX1dJRFRIX09GRlNfTUFTSyksCj4gKyAg ICAgICAgICAgICAgaGlkZXYtPm1taW8gKyBISUJNQ19DUlRfRkJfV0lEVEgpOwo+ICsKPiArICAg ICAgIC8qIFNFVCBQSVhFTCBGT1JNQVQgKi8KPiArICAgICAgIHJlZyA9IHJlYWRsKGhpZGV2LT5t bWlvICsgSElCTUNfQ1JUX0RJU1BfQ1RMKTsKPiArICAgICAgIHJlZyA9IHJlZyAmIH5ISUJNQ19D UlRfRElTUF9DVExfRk9STUFUX01BU0s7Cj4gKyAgICAgICByZWcgPSByZWcgfCAoSElCTUNfQ1JU X0RJU1BfQ1RMX0ZPUk1BVChzdGF0ZS0+ZmItPmJpdHNfcGVyX3BpeGVsID4+IDQpICYKPiArICAg ICAgICAgICAgICAgICAgICBISUJNQ19DUlRfRElTUF9DVExfRk9STUFUX01BU0spOwo+ICsgICAg ICAgd3JpdGVsKHJlZywgaGlkZXYtPm1taW8gKyBISUJNQ19DUlRfRElTUF9DVEwpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBoaWJtY19wbGFuZV9hdG9taWNfZGlzYWJsZShzdHJ1Y3QgZHJtX3Bs YW5lICpwbGFuZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1 Y3QgZHJtX3BsYW5lX3N0YXRlICpvbGRfc3RhdGUpCj4gK3sKPiArfQoKVGhlIGNhbGxlciBjaGVj a3MgZm9yIE5VTEwsIG5vIG5lZWQgdG8gc3R1YgoKPiArCj4gK3N0YXRpYyBjb25zdCB1MzIgY2hh bm5lbF9mb3JtYXRzMVtdID0gewo+ICsgICAgICAgRFJNX0ZPUk1BVF9SR0I1NjUsIERSTV9GT1JN QVRfQkdSNTY1LCBEUk1fRk9STUFUX1JHQjg4OCwKPiArICAgICAgIERSTV9GT1JNQVRfQkdSODg4 LCBEUk1fRk9STUFUX1hSR0I4ODg4LCBEUk1fRk9STUFUX1hCR1I4ODg4LAo+ICsgICAgICAgRFJN X0ZPUk1BVF9SR0JBODg4OCwgRFJNX0ZPUk1BVF9CR1JBODg4OCwgRFJNX0ZPUk1BVF9BUkdCODg4 OCwKPiArICAgICAgIERSTV9GT1JNQVRfQUJHUjg4ODgKPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1 Y3QgZHJtX3BsYW5lX2Z1bmNzIGhpYm1jX3BsYW5lX2Z1bmNzID0gewo+ICsgICAgICAgLnVwZGF0 ZV9wbGFuZSAgID0gZHJtX2F0b21pY19oZWxwZXJfdXBkYXRlX3BsYW5lLAo+ICsgICAgICAgLmRp c2FibGVfcGxhbmUgID0gZHJtX2F0b21pY19oZWxwZXJfZGlzYWJsZV9wbGFuZSwKPiArICAgICAg IC5zZXRfcHJvcGVydHkgPSBkcm1fYXRvbWljX2hlbHBlcl9wbGFuZV9zZXRfcHJvcGVydHksCj4g KyAgICAgICAuZGVzdHJveSA9IGRybV9wbGFuZV9jbGVhbnVwLAo+ICsgICAgICAgLnJlc2V0ID0g ZHJtX2F0b21pY19oZWxwZXJfcGxhbmVfcmVzZXQsCj4gKyAgICAgICAuYXRvbWljX2R1cGxpY2F0 ZV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX3BsYW5lX2R1cGxpY2F0ZV9zdGF0ZSwKPiArICAg ICAgIC5hdG9taWNfZGVzdHJveV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX3BsYW5lX2Rlc3Ry b3lfc3RhdGUsCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wbGFuZV9oZWxw ZXJfZnVuY3MgaGlibWNfcGxhbmVfaGVscGVyX2Z1bmNzID0gewo+ICsgICAgICAgLmF0b21pY19j aGVjayA9IGhpYm1jX3BsYW5lX2F0b21pY19jaGVjaywKPiArICAgICAgIC5hdG9taWNfdXBkYXRl ID0gaGlibWNfcGxhbmVfYXRvbWljX3VwZGF0ZSwKPiArICAgICAgIC5hdG9taWNfZGlzYWJsZSA9 IGhpYm1jX3BsYW5lX2F0b21pY19kaXNhYmxlLAo+ICt9Owo+ICsKPiAraW50IGhpYm1jX3BsYW5l X2luaXQoc3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhpZGV2KQo+ICt7Cj4gKyAgICAgICBzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2ID0gaGlkZXYtPmRldjsKPiArICAgICAgIHN0cnVjdCBkcm1fcGxh bmUgKnBsYW5lID0gJmhpZGV2LT5wbGFuZTsKPiArICAgICAgIGludCByZXQgPSAwOwo+ICsKPiAr ICAgICAgIC8qCj4gKyAgICAgICAgKiBwbGFuZSBpbml0Cj4gKyAgICAgICAgKiBUT0RPOiBOb3cg b25seSBzdXBwb3J0IHByaW1hcnkgcGxhbmUsIG92ZXJsYXkgcGxhbmVzCj4gKyAgICAgICAgKiBu ZWVkIHRvIGRvLgo+ICsgICAgICAgICovCj4gKyAgICAgICByZXQgPSBkcm1fdW5pdmVyc2FsX3Bs YW5lX2luaXQoZGV2LCBwbGFuZSwgMSwgJmhpYm1jX3BsYW5lX2Z1bmNzLAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfZm9ybWF0czEsCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShjaGFubmVsX2Zvcm1hdHMx KSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUk1fUExBTkVfVFlQ RV9QUklNQVJZLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwp Owo+ICsgICAgICAgaWYgKHJldCkgewo+ICsgICAgICAgICAgICAgICBEUk1fRVJST1IoImZhaWwg dG8gaW5pdCBwbGFuZSEhIVxuIik7Cj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gKyAg ICAgICB9Cj4gKwo+ICsgICAgICAgZHJtX3BsYW5lX2hlbHBlcl9hZGQocGxhbmUsICZoaWJtY19w bGFuZV9oZWxwZXJfZnVuY3MpOwo+ICsgICAgICAgcmV0dXJuIDA7Cj4gK30KPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZGUuaCBiL2RyaXZl cnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2RlLmgKPiBuZXcgZmlsZSBtb2Rl IDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjRjZTBkN2IKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZGUuaAo+IEBAIC0wLDAg KzEsMjkgQEAKPiArLyogSGlzaWxpY29uIEhpYm1jIFNvQyBkcm0gZHJpdmVyCj4gKyAqCj4gKyAq IEJhc2VkIG9uIHRoZSBib2NocyBkcm0gZHJpdmVyLgo+ICsgKgo+ICsgKiBDb3B5cmlnaHQgKGMp IDIwMTYgSHVhd2VpIExpbWl0ZWQuCj4gKyAqCj4gKyAqIEF1dGhvcjoKPiArICogICAgIFJvbmdy b25nIFpvdSA8em91cm9uZ3JvbmdAaHVhd2VpLmNvbT4KPiArICogICAgIFJvbmdyb25nIFpvdSA8 em91cm9uZ3JvbmdAZ21haWwuY29tPgo+ICsgKiAgICAgSmlhbmh1YSBMaSA8bGlqaWFuaHVhQGh1 YXdlaS5jb20+Cj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cj4gKyAq IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp Y2Vuc2UsIG9yCj4gKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4gKyAq Cj4gKyAqLwo+ICsKPiArI2lmbmRlZiBISUJNQ19EUk1fREVfSAo+ICsjZGVmaW5lIEhJQk1DX0RS TV9ERV9ICj4gKwo+ICtzdHJ1Y3QgcGFuZWxfcGxsIHsKPiArICAgICAgIHVuc2lnbmVkIGxvbmcg TTsKPiArICAgICAgIHVuc2lnbmVkIGxvbmcgTjsKPiArICAgICAgIHVuc2lnbmVkIGxvbmcgT0Q7 Cj4gKyAgICAgICB1bnNpZ25lZCBsb25nIFBPRDsKPiArfTsKPiArCj4gKyNlbmRpZgo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuYyBi L2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5jCj4gaW5kZXgg NWFjN2E3ZS4uN2Q5NjU4MyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29u L2hpYm1jL2hpYm1jX2RybV9kcnYuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24v aGlibWMvaGlibWNfZHJtX2Rydi5jCj4gQEAgLTE4LDYgKzE4LDcgQEAKPgo+ICAjaW5jbHVkZSA8 bGludXgvbW9kdWxlLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Cj4gKyNpbmNsdWRl IDxkcm0vZHJtX2NydGNfaGVscGVyLmg+Cj4KPiAgI2luY2x1ZGUgImhpYm1jX2RybV9kcnYuaCIK PiAgI2luY2x1ZGUgImhpYm1jX2RybV9yZWdzLmgiCj4gQEAgLTQ3LDggKzQ4LDggQEAgc3RhdGlj IHZvaWQgaGlibWNfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWdu ZWQgaW50IHBpcGUpCj4gIH0KPgo+ICBzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgaGlibWNfZHJp dmVyID0gewo+IC0gICAgICAgLmRyaXZlcl9mZWF0dXJlcyAgICAgICAgPSBEUklWRVJfR0VNLAo+ IC0KPiArICAgICAgIC5kcml2ZXJfZmVhdHVyZXMgICAgICAgID0gRFJJVkVSX0dFTSB8IERSSVZF Ul9NT0RFU0VUIHwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJJVkVSX0FU T01JQywKPiAgICAgICAgIC5mb3BzICAgICAgICAgICAgICAgICAgID0gJmhpYm1jX2ZvcHMsCj4g ICAgICAgICAubmFtZSAgICAgICAgICAgICAgICAgICA9ICJoaWJtYyIsCj4gICAgICAgICAuZGF0 ZSAgICAgICAgICAgICAgICAgICA9ICIyMDE2MDgyOCIsCj4gQEAgLTcwLDYgKzcxLDcgQEAgc3Rh dGljIGludCBoaWJtY19wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKPiAgICAgICAgIHN0 cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwo+ICAgICAg ICAgc3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhpZGV2ID0gZHJtX2Rldi0+ZGV2X3ByaXZhdGU7 Cj4KPiArICAgICAgIGRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZShkcm1fZGV2KTsKPiAgICAg ICAgIGRybV9mYl9oZWxwZXJfc2V0X3N1c3BlbmRfdW5sb2NrZWQoJmhpZGV2LT5mYmRldi0+aGVs cGVyLCAxKTsKPgo+ICAgICAgICAgcmV0dXJuIDA7Cj4gQEAgLTgxLDcgKzgzLDkgQEAgc3RhdGlj IGludCBoaWJtY19wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQo+ICAgICAgICAgc3RydWN0 IGRybV9kZXZpY2UgKmRybV9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Cj4gICAgICAgICBz dHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYgPSBkcm1fZGV2LT5kZXZfcHJpdmF0ZTsKPgo+ ICsgICAgICAgZHJtX2hlbHBlcl9yZXN1bWVfZm9yY2VfbW9kZShkcm1fZGV2KTsKPiAgICAgICAg IGRybV9mYl9oZWxwZXJfc2V0X3N1c3BlbmRfdW5sb2NrZWQoJmhpZGV2LT5mYmRldi0+aGVscGVy LCAwKTsKPiArICAgICAgIGRybV9rbXNfaGVscGVyX3BvbGxfZW5hYmxlKGRybV9kZXYpOwo+Cj4g ICAgICAgICByZXR1cm4gMDsKPiAgfQo+IEBAIC05MSw2ICs5NSw0MSBAQCBzdGF0aWMgaW50IGhp Ym1jX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBoaWJtY19wbV9yZXN1bWUpCj4gIH07Cj4KPiArc3RhdGljIGludCBoaWJtY19r bXNfaW5pdChzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYpCj4gK3sKPiArICAgICAgIGlu dCByZXQ7Cj4gKwo+ICsgICAgICAgZHJtX21vZGVfY29uZmlnX2luaXQoaGlkZXYtPmRldik7Cj4g KyAgICAgICBoaWRldi0+bW9kZV9jb25maWdfaW5pdGlhbGl6ZWQgPSB0cnVlOwo+ICsKPiArICAg ICAgIGhpZGV2LT5kZXYtPm1vZGVfY29uZmlnLm1pbl93aWR0aCA9IDA7Cj4gKyAgICAgICBoaWRl di0+ZGV2LT5tb2RlX2NvbmZpZy5taW5faGVpZ2h0ID0gMDsKPiArICAgICAgIGhpZGV2LT5kZXYt Pm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDE5MjA7Cj4gKyAgICAgICBoaWRldi0+ZGV2LT5tb2Rl X2NvbmZpZy5tYXhfaGVpZ2h0ID0gMTQ0MDsKPiArCj4gKyAgICAgICBoaWRldi0+ZGV2LT5tb2Rl X2NvbmZpZy5mYl9iYXNlID0gaGlkZXYtPmZiX2Jhc2U7Cj4gKyAgICAgICBoaWRldi0+ZGV2LT5t b2RlX2NvbmZpZy5wcmVmZXJyZWRfZGVwdGggPSAyNDsKPiArICAgICAgIGhpZGV2LT5kZXYtPm1v ZGVfY29uZmlnLnByZWZlcl9zaGFkb3cgPSAwOwo+ICsKPiArICAgICAgIGhpZGV2LT5kZXYtPm1v ZGVfY29uZmlnLmZ1bmNzID0gKHZvaWQgKikmaGlibWNfbW9kZV9mdW5jczsKPiArCj4gKyAgICAg ICByZXQgPSBoaWJtY19wbGFuZV9pbml0KGhpZGV2KTsKPiArICAgICAgIGlmIChyZXQpIHsKPiAr ICAgICAgICAgICAgICAgRFJNX0VSUk9SKCJmYWlsIHRvIGluaXQgcGxhbmUhISFcbiIpOwo+ICsg ICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBoaWJtY19rbXNfZmluaShzdHJ1Y3QgaGlibWNf ZHJtX2RldmljZSAqaGlkZXYpCj4gK3sKPiArICAgICAgIGlmIChoaWRldi0+bW9kZV9jb25maWdf aW5pdGlhbGl6ZWQpIHsKPiArICAgICAgICAgICAgICAgZHJtX21vZGVfY29uZmlnX2NsZWFudXAo aGlkZXYtPmRldik7Cj4gKyAgICAgICAgICAgICAgIGhpZGV2LT5tb2RlX2NvbmZpZ19pbml0aWFs aXplZCA9IGZhbHNlOwo+ICsgICAgICAgfQo+ICt9Cj4gKwo+ICBzdGF0aWMgaW50IGhpYm1jX2h3 X2NvbmZpZyhzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYpCj4gIHsKPiAgICAgICAgIHVu c2lnbmVkIGludCByZWc7Cj4gQEAgLTE4Myw2ICsyMjIsNyBAQCBzdGF0aWMgaW50IGhpYm1jX3Vu bG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ICAgICAgICAgc3RydWN0IGhpYm1jX2RybV9k ZXZpY2UgKmhpZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKPgo+ICAgICAgICAgaGlibWNfZmJkZXZf ZmluaShoaWRldik7Cj4gKyAgICAgICBoaWJtY19rbXNfZmluaShoaWRldik7Cj4gICAgICAgICBo aWJtY19tbV9maW5pKGhpZGV2KTsKPiAgICAgICAgIGhpYm1jX2h3X2ZpbmkoaGlkZXYpOwo+ICAg ICAgICAgZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7Cj4gQEAgLTIwOCw2ICsyNDgsMTMgQEAgc3Rh dGljIGludCBoaWJtY19sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcg ZmxhZ3MpCj4gICAgICAgICBpZiAocmV0KQo+ICAgICAgICAgICAgICAgICBnb3RvIGVycjsKPgo+ ICsgICAgICAgcmV0ID0gaGlibWNfa21zX2luaXQoaGlkZXYpOwo+ICsgICAgICAgaWYgKHJldCkK PiArICAgICAgICAgICAgICAgZ290byBlcnI7Cj4gKwo+ICsgICAgICAgLyogcmVzZXQgYWxsIHRo ZSBzdGF0ZXMgb2YgY3J0Yy9wbGFuZS9lbmNvZGVyL2Nvbm5lY3RvciAqLwo+ICsgICAgICAgZHJt X21vZGVfY29uZmlnX3Jlc2V0KGRldik7Cj4gKwo+ICAgICAgICAgcmV0ID0gaGlibWNfZmJkZXZf aW5pdChoaWRldik7Cj4gICAgICAgICBpZiAocmV0KQo+ICAgICAgICAgICAgICAgICBnb3RvIGVy cjsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19k cm1fZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYu aAo+IGluZGV4IGE0MGU5YTcuLjQ5ZTM5ZDIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmgKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v aGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuaAo+IEBAIC00NSw2ICs0NSw4IEBAIHN0cnVj dCBoaWJtY19kcm1fZGV2aWNlIHsKPgo+ICAgICAgICAgLyogZHJtICovCj4gICAgICAgICBzdHJ1 Y3QgZHJtX2RldmljZSAgKmRldjsKPiArICAgICAgIHN0cnVjdCBkcm1fcGxhbmUgcGxhbmU7Cj4g KyAgICAgICBib29sIG1vZGVfY29uZmlnX2luaXRpYWxpemVkOwo+Cj4gICAgICAgICAvKiB0dG0g Ki8KPiAgICAgICAgIHN0cnVjdCB7Cj4gQEAgLTgyLDYgKzg0LDcgQEAgc3RhdGljIGlubGluZSBz dHJ1Y3QgaGlibWNfYm8gKmdlbV90b19oaWJtY19ibyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdl bSkKPgo+ICAjZGVmaW5lIERSTV9GSUxFX1BBR0VfT0ZGU0VUICgweDEwMDAwMDAwMFVMTCA+PiBQ QUdFX1NISUZUKQo+Cj4gK2ludCBoaWJtY19wbGFuZV9pbml0KHN0cnVjdCBoaWJtY19kcm1fZGV2 aWNlICpoaWRldik7Cj4gIGludCBoaWJtY19mYmRldl9pbml0KHN0cnVjdCBoaWJtY19kcm1fZGV2 aWNlICpoaWRldik7Cj4gIHZvaWQgaGlibWNfZmJkZXZfZmluaShzdHJ1Y3QgaGlibWNfZHJtX2Rl dmljZSAqaGlkZXYpOwo+Cj4gQEAgLTEwMiw0ICsxMDUsNiBAQCBpbnQgaGlibWNfZHVtYl9tbWFw X29mZnNldChzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGhhbmRsZSwgdTY0ICpvZmZzZXQpOwo+ICBp bnQgaGlibWNfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2 bWEpOwo+Cj4gK2V4dGVybiBjb25zdCBzdHJ1Y3QgZHJtX21vZGVfY29uZmlnX2Z1bmNzIGhpYm1j X21vZGVfZnVuY3M7Cj4gKwo+ICAjZW5kaWYKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2hpc2lsaWNvbi9oaWJtYy9oaWJtY190dG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24v aGlibWMvaGlibWNfdHRtLmMKPiBpbmRleCA5ODIyZjYyLi5iZWI0ZDc2IDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfdHRtLmMKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX3R0bS5jCj4gQEAgLTU1NCwzICs1NTQs OSBAQCBzdHJ1Y3QgaGlibWNfZnJhbWVidWZmZXIgKgo+ICAgICAgICAgfQo+ICAgICAgICAgcmV0 dXJuICZoaWJtY19mYi0+ZmI7Cj4gIH0KPiArCj4gK2NvbnN0IHN0cnVjdCBkcm1fbW9kZV9jb25m aWdfZnVuY3MgaGlibWNfbW9kZV9mdW5jcyA9IHsKPiArICAgICAgIC5hdG9taWNfY2hlY2sgPSBk cm1fYXRvbWljX2hlbHBlcl9jaGVjaywKPiArICAgICAgIC5hdG9taWNfY29tbWl0ID0gZHJtX2F0 b21pY19oZWxwZXJfY29tbWl0LAo+ICsgICAgICAgLmZiX2NyZWF0ZSA9IGhpYm1jX3VzZXJfZnJh bWVidWZmZXJfY3JlYXRlLAo+ICt9Owo+IC0tCj4gMS45LjEKPgo+Cj4gX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBsaW51eC1hcm0ta2VybmVsIG1haWxp bmcgbGlzdAo+IGxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwo+IGh0dHA6Ly9s aXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbApfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFp bGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK