From mboxrd@z Thu Jan 1 00:00:00 1970 From: zourongrong@huawei.com (Rongrong Zou) Date: Sat, 12 Nov 2016 13:11:52 +0800 Subject: [PATCH v6 4/9] drm/hisilicon/hibmc: Add plane for DE In-Reply-To: References: <1477639682-22520-1-git-send-email-zourongrong@gmail.com> <1477639682-22520-5-git-send-email-zourongrong@gmail.com> Message-ID: <5826A498.4000002@huawei.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org ? 2016/11/11 5:53, Sean Paul ??: > 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 ok, will do, thanks. > >> + >> +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 It would work well, but looks redundant and not simple enough, will delete them, thanks. > >> + >> + 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 I'm sorry, can you explain why here should be an DRM_DEBUG_ATOMIC, when this condition is hit, it is really an error and atomic_commit will abort with failure. > >> + 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 understood, thanks. > >> + return -EINVAL; >> + >> + if (crtc_x < 0 || crtc_y < 0) > > Print DRM_DEBUG_ATOMIC message here agreed. thanks. > >> + 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 ditto. > >> + 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 will delete, thanks. >> + 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 agreed, thanks. > >> + return; >> + >> + hibmc_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr); > > Check return value ok, thanks. > >> + 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 understood, thanks. > >> + >> + 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? i prefer /8 because it is more readable to human, although it is less effective in executing. > >> + 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 thanks for pointing it out, will remove. Regards, Rongrong. > >> + >> +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 > _______________________________________________ > linuxarm mailing list > linuxarm at huawei.com > http://rnd-openeuler.huawei.com/mailman/listinfo/linuxarm > > . > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rongrong Zou Subject: Re: [PATCH v6 4/9] drm/hisilicon/hibmc: Add plane for DE Date: Sat, 12 Nov 2016 13:11:52 +0800 Message-ID: <5826A498.4000002@huawei.com> 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"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: Sean Paul , Rongrong Zou Cc: Mark Rutland , Archit , shenhui@huawei.com, Tomeu Vizoso , Jonathan Corbet , Dave Airlie , catalin.marinas@arm.com, Emil Velikov , linuxarm@huawei.com, dri-devel , Xinliang Liu , james.xiong@huawei.com, Daniel Stone , Daniel Vetter , Will Deacon , lijianhua@huawei.com, Linux ARM Kernel , Benjamin Gaignard List-Id: dri-devel@lists.freedesktop.org 5ZyoIDIwMTYvMTEvMTEgNTo1MywgU2VhbiBQYXVsIOWGmemBkzoKPiBPbiBGcmksIE9jdCAyOCwg MjAxNiBhdCAzOjI3IEFNLCBSb25ncm9uZyBab3UgPHpvdXJvbmdyb25nQGdtYWlsLmNvbT4gd3Jv dGU6Cj4+IEFkZCBwbGFuZSBmdW5jcyBhbmQgaGVscGVyIGZ1bmNzIGZvciBERS4KPj4KPj4gU2ln bmVkLW9mZi1ieTogUm9uZ3JvbmcgWm91IDx6b3Vyb25ncm9uZ0BnbWFpbC5jb20+Cj4+IC0tLQo+ PiAgIGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvS2NvbmZpZyAgICAgICAgIHwgICAx ICsKPj4gICBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL01ha2VmaWxlICAgICAgICB8 ICAgMiArLQo+PiAgIGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rl LmMgIHwgMTcwICsrKysrKysrKysrKysrKysrKysrKysrKwo+PiAgIGRyaXZlcnMvZ3B1L2RybS9o aXNpbGljb24vaGlibWMvaGlibWNfZHJtX2RlLmggIHwgIDI5ICsrKysKPj4gICBkcml2ZXJzL2dw dS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuYyB8ICA1MSArKysrKystCj4+ICAg ZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmggfCAgIDUgKwo+ PiAgIGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfdHRtLmMgICAgIHwgICA2 ICsKPj4gICA3IGZpbGVzIGNoYW5nZWQsIDI2MSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygt KQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1j L2hpYm1jX2RybV9kZS5jCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9o aXNpbGljb24vaGlibWMvaGlibWNfZHJtX2RlLmgKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9oaXNpbGljb24vaGlibWMvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGlj b24vaGlibWMvS2NvbmZpZwo+PiBpbmRleCBiY2I4YzE4Li4zODA2MjJhIDEwMDY0NAo+PiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL0tjb25maWcKPj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9LY29uZmlnCj4+IEBAIC0xLDYgKzEsNyBAQAo+PiAg IGNvbmZpZyBEUk1fSElTSV9ISUJNQwo+PiAgICAgICAgICB0cmlzdGF0ZSAiRFJNIFN1cHBvcnQg Zm9yIEhpc2lsaWNvbiBIaWJtYyIKPj4gICAgICAgICAgZGVwZW5kcyBvbiBEUk0gJiYgUENJCj4+ ICsgICAgICAgc2VsZWN0IERSTV9LTVNfSEVMUEVSCj4+ICAgICAgICAgIHNlbGVjdCBEUk1fVFRN Cj4+Cj4+ICAgICAgICAgIGhlbHAKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9oaXNp bGljb24vaGlibWMvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL01h a2VmaWxlCj4+IGluZGV4IDgxMGEzN2UuLjcyZTEwN2UgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMv Z3B1L2RybS9oaXNpbGljb24vaGlibWMvTWFrZWZpbGUKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L2hpc2lsaWNvbi9oaWJtYy9NYWtlZmlsZQo+PiBAQCAtMSw1ICsxLDUgQEAKPj4gICBjY2ZsYWdz LXkgOj0gLUlpbmNsdWRlL2RybQo+PiAtaGlibWMtZHJtLXkgOj0gaGlibWNfZHJtX2Rydi5vIGhp Ym1jX2RybV9mYmRldi5vIGhpYm1jX2RybV9wb3dlci5vIGhpYm1jX3R0bS5vCj4+ICtoaWJtYy1k cm0teSA6PSBoaWJtY19kcm1fZHJ2Lm8gaGlibWNfZHJtX2RlLm8gaGlibWNfZHJtX2ZiZGV2Lm8g aGlibWNfZHJtX3Bvd2VyLm8gaGlibWNfdHRtLm8KPj4KPj4gICBvYmotJChDT05GSUdfRFJNX0hJ U0lfSElCTUMpICAgKz1oaWJtYy1kcm0ubwo+PiAgICNvYmoteSArPSBoaWJtYy1kcm0ubwo+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZGUu YyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2RlLmMKPj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMC4uOWMxYTY4Ywo+PiAtLS0gL2Rldi9u dWxsCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rl LmMKPj4gQEAgLTAsMCArMSwxNzAgQEAKPj4gKy8qIEhpc2lsaWNvbiBIaWJtYyBTb0MgZHJtIGRy aXZlcgo+PiArICoKPj4gKyAqIEJhc2VkIG9uIHRoZSBib2NocyBkcm0gZHJpdmVyLgo+PiArICoK Pj4gKyAqIENvcHlyaWdodCAoYykgMjAxNiBIdWF3ZWkgTGltaXRlZC4KPj4gKyAqCj4+ICsgKiBB dXRob3I6Cj4+ICsgKiAgICAgUm9uZ3JvbmcgWm91IDx6b3Vyb25ncm9uZ0BodWF3ZWkuY29tPgo+ PiArICogICAgIFJvbmdyb25nIFpvdSA8em91cm9uZ3JvbmdAZ21haWwuY29tPgo+PiArICogICAg IEppYW5odWEgTGkgPGxpamlhbmh1YUBodWF3ZWkuY29tPgo+PiArICoKPj4gKyAqIFRoaXMgcHJv Z3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5Cj4+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo+PiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPj4gKyAqIChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4+ICsgKgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRl IDxkcm0vZHJtX2F0b21pYy5oPgo+PiArI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBlci5o Pgo+PiArI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KPj4gKyNpbmNsdWRlIDxkcm0v ZHJtX3BsYW5lX2hlbHBlci5oPgo+PiArCj4+ICsjaW5jbHVkZSAiaGlibWNfZHJtX2Rydi5oIgo+ PiArI2luY2x1ZGUgImhpYm1jX2RybV9yZWdzLmgiCj4+ICsjaW5jbHVkZSAiaGlibWNfZHJtX3Bv d2VyLmgiCj4+ICsKPj4gKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KPgo+IFJlbW92ZQoKb2ssIHdpbGwg ZG8sIHRoYW5rcy4KCj4KPj4gKwo+PiArc3RhdGljIGludCBoaWJtY19wbGFuZV9hdG9taWNfY2hl Y2soc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHN0cnVjdCBkcm1fcGxhbmVfc3RhdGUgKnN0YXRlKQo+PiArewo+PiArICAgICAg IHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gc3RhdGUtPmZiOwo+PiArICAgICAgIHN0cnVj dCBkcm1fY3J0YyAqY3J0YyA9IHN0YXRlLT5jcnRjOwo+PiArICAgICAgIHN0cnVjdCBkcm1fY3J0 Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKPj4gKyAgICAgICB1MzIgc3JjX3ggPSBzdGF0ZS0+c3JjX3gg Pj4gMTY7Cj4+ICsgICAgICAgdTMyIHNyY195ID0gc3RhdGUtPnNyY195ID4+IDE2Owo+PiArICAg ICAgIHUzMiBzcmNfdyA9IHN0YXRlLT5zcmNfdyA+PiAxNjsKPj4gKyAgICAgICB1MzIgc3JjX2gg PSBzdGF0ZS0+c3JjX2ggPj4gMTY7Cj4+ICsgICAgICAgaW50IGNydGNfeCA9IHN0YXRlLT5jcnRj X3g7Cj4+ICsgICAgICAgaW50IGNydGNfeSA9IHN0YXRlLT5jcnRjX3k7Cj4+ICsgICAgICAgdTMy IGNydGNfdyA9IHN0YXRlLT5jcnRjX3c7Cj4+ICsgICAgICAgdTMyIGNydGNfaCA9IHN0YXRlLT5j cnRjX2g7Cj4KPiBJIGRvbid0IHRoaW5rIHlvdSBnYWluIGFueXRoaW5nIHdpdGggdGhlIGNydGNf KiB2YXJzCgpJdCB3b3VsZCB3b3JrIHdlbGwsIGJ1dCBsb29rcyByZWR1bmRhbnQgYW5kIG5vdCBz aW1wbGUgZW5vdWdoLAp3aWxsIGRlbGV0ZSB0aGVtLCB0aGFua3MuCgo+Cj4+ICsKPj4gKyAgICAg ICBpZiAoIWNydGMgfHwgIWZiKQo+PiArICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4+ICsKPj4g KyAgICAgICBjcnRjX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY3J0Y19zdGF0ZShzdGF0ZS0+c3Rh dGUsIGNydGMpOwo+PiArICAgICAgIGlmIChJU19FUlIoY3J0Y19zdGF0ZSkpCj4+ICsgICAgICAg ICAgICAgICByZXR1cm4gUFRSX0VSUihjcnRjX3N0YXRlKTsKPj4gKwo+PiArICAgICAgIGlmIChz cmNfdyAhPSBjcnRjX3cgfHwgc3JjX2ggIT0gY3J0Y19oKSB7Cj4+ICsgICAgICAgICAgICAgICBE Uk1fRVJST1IoIlNjYWxlIG5vdCBzdXBwb3J0ISEhXG4iKTsKPgo+IEkgbGlrZSB0aGUgZW50aHVz aWFzbSwgYnV0IEkgdGhpbmsgRFJNX0RFQlVHX0FUT01JQyB3b3VsZCBiZSBiZXR0ZXIKCkknbSBz b3JyeSwgY2FuIHlvdSBleHBsYWluIHdoeSBoZXJlIHNob3VsZCBiZSBhbiBEUk1fREVCVUdfQVRP TUlDLAp3aGVuIHRoaXMgY29uZGl0aW9uIGlzIGhpdCwgaXQgaXMgcmVhbGx5IGFuIGVycm9yIGFu ZCBhdG9taWNfY29tbWl0IHdpbGwKYWJvcnQgd2l0aCBmYWlsdXJlLgoKPgo+PiArICAgICAgICAg ICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+ICsgICAgICAgfQo+PiArCj4+ICsgICAgICAgaWYgKHNy Y194ICsgc3JjX3cgPiBmYi0+d2lkdGggfHwKPj4gKyAgICAgICAgICAgc3JjX3kgKyBzcmNfaCA+ IGZiLT5oZWlnaHQpCj4KPiBUaGVzZSBzaG91bGQgYmUgYWxyZWFkeSBjb3ZlcmVkIGluIGRybV9h dG9taWNfcGxhbmVfY2hlY2sKCnVuZGVyc3Rvb2QsIHRoYW5rcy4KCj4KPj4gKyAgICAgICAgICAg ICAgIHJldHVybiAtRUlOVkFMOwo+PiArCj4+ICsgICAgICAgaWYgKGNydGNfeCA8IDAgfHwgY3J0 Y195IDwgMCkKPgo+IFByaW50IERSTV9ERUJVR19BVE9NSUMgbWVzc2FnZSBoZXJlCgphZ3JlZWQu IHRoYW5rcy4KCj4KPj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+PiArCj4+ICsg ICAgICAgaWYgKGNydGNfeCArIGNydGNfdyA+IGNydGNfc3RhdGUtPmFkanVzdGVkX21vZGUuaGRp c3BsYXkgfHwKPj4gKyAgICAgICAgICAgY3J0Y195ICsgY3J0Y19oID4gY3J0Y19zdGF0ZS0+YWRq dXN0ZWRfbW9kZS52ZGlzcGxheSkKPgo+IERSTV9ERUJVR19BVE9NSUMgaGVyZSB0b28KCmRpdHRv LgoKPgo+PiArICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+ICsKPj4gKyAgICAgICBy ZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgaGlibWNfcGxhbmVfYXRvbWljX3Vw ZGF0ZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpvbGRfc3RhdGUpCj4+ICt7Cj4+ ICsgICAgICAgc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAgKnN0YXRlICA9IHBsYW5lLT5zdGF0ZTsK Pj4gKyAgICAgICB1MzIgcmVnOwo+PiArICAgICAgIGludCByZXQ7Cj4+ICsgICAgICAgdTY0IGdw dV9hZGRyID0gMDsKPj4gKyAgICAgICB1bnNpZ25lZCBpbnQgbGluZV9sOwo+PiArICAgICAgIHN0 cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRldiA9Cj4+ICsgICAgICAgICAgICAgICAoc3RydWN0 IGhpYm1jX2RybV9kZXZpY2UgKilwbGFuZS0+ZGV2LT5kZXZfcHJpdmF0ZTsKPj4gKwo+Cj4gbml0 OiBleHRyYSBsaW5lCgp3aWxsIGRlbGV0ZSwgdGhhbmtzLgoKPj4gKyAgICAgICBzdHJ1Y3QgaGli bWNfZnJhbWVidWZmZXIgKmhpYm1jX2ZiOwo+PiArICAgICAgIHN0cnVjdCBoaWJtY19ibyAqYm87 Cj4+ICsKPj4gKyAgICAgICBoaWJtY19mYiA9IHRvX2hpYm1jX2ZyYW1lYnVmZmVyKHN0YXRlLT5m Yik7Cj4+ICsgICAgICAgYm8gPSBnZW1fdG9faGlibWNfYm8oaGlibWNfZmItPm9iaik7Cj4+ICsg ICAgICAgcmV0ID0gdHRtX2JvX3Jlc2VydmUoJmJvLT5ibywgdHJ1ZSwgZmFsc2UsIE5VTEwpOwo+ PiArICAgICAgIGlmIChyZXQpCj4KPiBQcmludCBlcnJvcgoKYWdyZWVkLCB0aGFua3MuCgo+Cj4+ ICsgICAgICAgICAgICAgICByZXR1cm47Cj4+ICsKPj4gKyAgICAgICBoaWJtY19ib19waW4oYm8s IFRUTV9QTF9GTEFHX1ZSQU0sICZncHVfYWRkcik7Cj4KPiBDaGVjayByZXR1cm4gdmFsdWUKCm9r LCB0aGFua3MuCgo+Cj4+ICsgICAgICAgaWYgKHJldCkgewo+PiArICAgICAgICAgICAgICAgdHRt X2JvX3VucmVzZXJ2ZSgmYm8tPmJvKTsKPj4gKyAgICAgICAgICAgICAgIHJldHVybjsKPj4gKyAg ICAgICB9Cj4+ICsKPj4gKyAgICAgICB0dG1fYm9fdW5yZXNlcnZlKCZiby0+Ym8pOwo+Cj4gTW92 ZSB0aGlzIHVwIGJlZm9yZSB0aGUgY29uZGl0aW9uYWwgc28geW91IGRvbid0IGhhdmUgdG8gY2Fs bCBpdCBpbgo+IGJvdGggYnJhbmNoZXMKCnVuZGVyc3Rvb2QsIHRoYW5rcy4KCj4KPj4gKwo+PiAr ICAgICAgIHdyaXRlbChncHVfYWRkciwgaGlkZXYtPm1taW8gKyBISUJNQ19DUlRfRkJfQUREUkVT Uyk7Cj4+ICsKPj4gKyAgICAgICByZWcgPSBzdGF0ZS0+ZmItPndpZHRoICogKHN0YXRlLT5mYi0+ Yml0c19wZXJfcGl4ZWwgPj4gMyk7Cj4+ICsgICAgICAgLyogbm93IGxpbmVfcGFkIGlzIDE2ICov Cj4+ICsgICAgICAgcmVnID0gUEFERElORygxNiwgcmVnKTsKPj4gKwo+PiArICAgICAgIGxpbmVf bCA9IHN0YXRlLT5mYi0+d2lkdGggKiBzdGF0ZS0+ZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKPgo+ IGFib3ZlLCB5b3UgPj4gMy4gaGVyZSB5b3UgLyA4LCBwaWNrIG9uZT8KCmkgcHJlZmVyIC84IGJl Y2F1c2UgaXQgaXMgbW9yZSByZWFkYWJsZSB0byBodW1hbiwgYWx0aG91Z2ggaXQgaXMgbGVzcyBl ZmZlY3RpdmUKaW4gZXhlY3V0aW5nLgoKPgo+PiArICAgICAgIGxpbmVfbCA9IFBBRERJTkcoMTYs IGxpbmVfbCk7Cj4+ICsgICAgICAgd3JpdGVsKChISUJNQ19DUlRfRkJfV0lEVEhfV0lEVEgocmVn KSAmIEhJQk1DX0NSVF9GQl9XSURUSF9XSURUSF9NQVNLKSB8Cj4+ICsgICAgICAgICAgICAgIChI SUJNQ19DUlRfRkJfV0lEVEhfT0ZGUyhsaW5lX2wpICYgSElCTUNfQ1JUX0ZCX1dJRFRIX09GRlNf TUFTSyksCj4+ICsgICAgICAgICAgICAgIGhpZGV2LT5tbWlvICsgSElCTUNfQ1JUX0ZCX1dJRFRI KTsKPj4gKwo+PiArICAgICAgIC8qIFNFVCBQSVhFTCBGT1JNQVQgKi8KPj4gKyAgICAgICByZWcg PSByZWFkbChoaWRldi0+bW1pbyArIEhJQk1DX0NSVF9ESVNQX0NUTCk7Cj4+ICsgICAgICAgcmVn ID0gcmVnICYgfkhJQk1DX0NSVF9ESVNQX0NUTF9GT1JNQVRfTUFTSzsKPj4gKyAgICAgICByZWcg PSByZWcgfCAoSElCTUNfQ1JUX0RJU1BfQ1RMX0ZPUk1BVChzdGF0ZS0+ZmItPmJpdHNfcGVyX3Bp eGVsID4+IDQpICYKPj4gKyAgICAgICAgICAgICAgICAgICAgSElCTUNfQ1JUX0RJU1BfQ1RMX0ZP Uk1BVF9NQVNLKTsKPj4gKyAgICAgICB3cml0ZWwocmVnLCBoaWRldi0+bW1pbyArIEhJQk1DX0NS VF9ESVNQX0NUTCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGhpYm1jX3BsYW5lX2F0b21p Y19kaXNhYmxlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpvbGRfc3RhdGUpCj4+ ICt7Cj4+ICt9Cj4KPiBUaGUgY2FsbGVyIGNoZWNrcyBmb3IgTlVMTCwgbm8gbmVlZCB0byBzdHVi Cgp0aGFua3MgZm9yIHBvaW50aW5nIGl0IG91dCwKd2lsbCByZW1vdmUuCgpSZWdhcmRzLApSb25n cm9uZy4KCj4KPj4gKwo+PiArc3RhdGljIGNvbnN0IHUzMiBjaGFubmVsX2Zvcm1hdHMxW10gPSB7 Cj4+ICsgICAgICAgRFJNX0ZPUk1BVF9SR0I1NjUsIERSTV9GT1JNQVRfQkdSNTY1LCBEUk1fRk9S TUFUX1JHQjg4OCwKPj4gKyAgICAgICBEUk1fRk9STUFUX0JHUjg4OCwgRFJNX0ZPUk1BVF9YUkdC ODg4OCwgRFJNX0ZPUk1BVF9YQkdSODg4OCwKPj4gKyAgICAgICBEUk1fRk9STUFUX1JHQkE4ODg4 LCBEUk1fRk9STUFUX0JHUkE4ODg4LCBEUk1fRk9STUFUX0FSR0I4ODg4LAo+PiArICAgICAgIERS TV9GT1JNQVRfQUJHUjg4ODgKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgZHJtX3BsYW5l X2Z1bmNzIGhpYm1jX3BsYW5lX2Z1bmNzID0gewo+PiArICAgICAgIC51cGRhdGVfcGxhbmUgICA9 IGRybV9hdG9taWNfaGVscGVyX3VwZGF0ZV9wbGFuZSwKPj4gKyAgICAgICAuZGlzYWJsZV9wbGFu ZSAgPSBkcm1fYXRvbWljX2hlbHBlcl9kaXNhYmxlX3BsYW5lLAo+PiArICAgICAgIC5zZXRfcHJv cGVydHkgPSBkcm1fYXRvbWljX2hlbHBlcl9wbGFuZV9zZXRfcHJvcGVydHksCj4+ICsgICAgICAg LmRlc3Ryb3kgPSBkcm1fcGxhbmVfY2xlYW51cCwKPj4gKyAgICAgICAucmVzZXQgPSBkcm1fYXRv bWljX2hlbHBlcl9wbGFuZV9yZXNldCwKPj4gKyAgICAgICAuYXRvbWljX2R1cGxpY2F0ZV9zdGF0 ZSA9IGRybV9hdG9taWNfaGVscGVyX3BsYW5lX2R1cGxpY2F0ZV9zdGF0ZSwKPj4gKyAgICAgICAu YXRvbWljX2Rlc3Ryb3lfc3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9wbGFuZV9kZXN0cm95X3N0 YXRlLAo+PiArfTsKPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcGxhbmVfaGVscGVy X2Z1bmNzIGhpYm1jX3BsYW5lX2hlbHBlcl9mdW5jcyA9IHsKPj4gKyAgICAgICAuYXRvbWljX2No ZWNrID0gaGlibWNfcGxhbmVfYXRvbWljX2NoZWNrLAo+PiArICAgICAgIC5hdG9taWNfdXBkYXRl ID0gaGlibWNfcGxhbmVfYXRvbWljX3VwZGF0ZSwKPj4gKyAgICAgICAuYXRvbWljX2Rpc2FibGUg PSBoaWJtY19wbGFuZV9hdG9taWNfZGlzYWJsZSwKPj4gK307Cj4+ICsKPj4gK2ludCBoaWJtY19w bGFuZV9pbml0KHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRldikKPj4gK3sKPj4gKyAgICAg ICBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaGlkZXYtPmRldjsKPj4gKyAgICAgICBzdHJ1Y3Qg ZHJtX3BsYW5lICpwbGFuZSA9ICZoaWRldi0+cGxhbmU7Cj4+ICsgICAgICAgaW50IHJldCA9IDA7 Cj4+ICsKPj4gKyAgICAgICAvKgo+PiArICAgICAgICAqIHBsYW5lIGluaXQKPj4gKyAgICAgICAg KiBUT0RPOiBOb3cgb25seSBzdXBwb3J0IHByaW1hcnkgcGxhbmUsIG92ZXJsYXkgcGxhbmVzCj4+ ICsgICAgICAgICogbmVlZCB0byBkby4KPj4gKyAgICAgICAgKi8KPj4gKyAgICAgICByZXQgPSBk cm1fdW5pdmVyc2FsX3BsYW5lX2luaXQoZGV2LCBwbGFuZSwgMSwgJmhpYm1jX3BsYW5lX2Z1bmNz LAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2Zvcm1h dHMxLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpF KGNoYW5uZWxfZm9ybWF0czEpLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBEUk1fUExBTkVfVFlQRV9QUklNQVJZLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBOVUxMKTsKPj4gKyAgICAgICBpZiAocmV0KSB7Cj4+ICsgICAgICAgICAg ICAgICBEUk1fRVJST1IoImZhaWwgdG8gaW5pdCBwbGFuZSEhIVxuIik7Cj4+ICsgICAgICAgICAg ICAgICByZXR1cm4gcmV0Owo+PiArICAgICAgIH0KPj4gKwo+PiArICAgICAgIGRybV9wbGFuZV9o ZWxwZXJfYWRkKHBsYW5lLCAmaGlibWNfcGxhbmVfaGVscGVyX2Z1bmNzKTsKPj4gKyAgICAgICBy ZXR1cm4gMDsKPj4gK30KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24v aGlibWMvaGlibWNfZHJtX2RlLmggYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hp Ym1jX2RybV9kZS5oCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAuLjRj ZTBkN2IKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29u L2hpYm1jL2hpYm1jX2RybV9kZS5oCj4+IEBAIC0wLDAgKzEsMjkgQEAKPj4gKy8qIEhpc2lsaWNv biBIaWJtYyBTb0MgZHJtIGRyaXZlcgo+PiArICoKPj4gKyAqIEJhc2VkIG9uIHRoZSBib2NocyBk cm0gZHJpdmVyLgo+PiArICoKPj4gKyAqIENvcHlyaWdodCAoYykgMjAxNiBIdWF3ZWkgTGltaXRl ZC4KPj4gKyAqCj4+ICsgKiBBdXRob3I6Cj4+ICsgKiAgICAgUm9uZ3JvbmcgWm91IDx6b3Vyb25n cm9uZ0BodWF3ZWkuY29tPgo+PiArICogICAgIFJvbmdyb25nIFpvdSA8em91cm9uZ3JvbmdAZ21h aWwuY29tPgo+PiArICogICAgIEppYW5odWEgTGkgPGxpamlhbmh1YUBodWF3ZWkuY29tPgo+PiAr ICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo+PiArICogdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IK Pj4gKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4+ICsgKgo+PiArICov Cj4+ICsKPj4gKyNpZm5kZWYgSElCTUNfRFJNX0RFX0gKPj4gKyNkZWZpbmUgSElCTUNfRFJNX0RF X0gKPj4gKwo+PiArc3RydWN0IHBhbmVsX3BsbCB7Cj4+ICsgICAgICAgdW5zaWduZWQgbG9uZyBN Owo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgTjsKPj4gKyAgICAgICB1bnNpZ25lZCBsb25nIE9E Owo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgUE9EOwo+PiArfTsKPj4gKwo+PiArI2VuZGlmCj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9k cnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5jCj4+ IGluZGV4IDVhYzdhN2UuLjdkOTY1ODMgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9o aXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5jCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9o aXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5jCj4+IEBAIC0xOCw2ICsxOCw3IEBACj4+Cj4+ ICAgI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+PiAgICNpbmNsdWRlIDxsaW51eC9jb25zb2xl Lmg+Cj4+ICsjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgo+Pgo+PiAgICNpbmNsdWRl ICJoaWJtY19kcm1fZHJ2LmgiCj4+ICAgI2luY2x1ZGUgImhpYm1jX2RybV9yZWdzLmgiCj4+IEBA IC00Nyw4ICs0OCw4IEBAIHN0YXRpYyB2b2lkIGhpYm1jX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBk cm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlKQo+PiAgIH0KPj4KPj4gICBzdGF0aWMg c3RydWN0IGRybV9kcml2ZXIgaGlibWNfZHJpdmVyID0gewo+PiAtICAgICAgIC5kcml2ZXJfZmVh dHVyZXMgICAgICAgID0gRFJJVkVSX0dFTSwKPj4gLQo+PiArICAgICAgIC5kcml2ZXJfZmVhdHVy ZXMgICAgICAgID0gRFJJVkVSX0dFTSB8IERSSVZFUl9NT0RFU0VUIHwKPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIERSSVZFUl9BVE9NSUMsCj4+ICAgICAgICAgIC5mb3BzICAg ICAgICAgICAgICAgICAgID0gJmhpYm1jX2ZvcHMsCj4+ICAgICAgICAgIC5uYW1lICAgICAgICAg ICAgICAgICAgID0gImhpYm1jIiwKPj4gICAgICAgICAgLmRhdGUgICAgICAgICAgICAgICAgICAg PSAiMjAxNjA4MjgiLAo+PiBAQCAtNzAsNiArNzEsNyBAQCBzdGF0aWMgaW50IGhpYm1jX3BtX3N1 c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+PiAgICAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAq ZHJtX2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKPj4gICAgICAgICAgc3RydWN0IGhpYm1j X2RybV9kZXZpY2UgKmhpZGV2ID0gZHJtX2Rldi0+ZGV2X3ByaXZhdGU7Cj4+Cj4+ICsgICAgICAg ZHJtX2ttc19oZWxwZXJfcG9sbF9kaXNhYmxlKGRybV9kZXYpOwo+PiAgICAgICAgICBkcm1fZmJf aGVscGVyX3NldF9zdXNwZW5kX3VubG9ja2VkKCZoaWRldi0+ZmJkZXYtPmhlbHBlciwgMSk7Cj4+ Cj4+ICAgICAgICAgIHJldHVybiAwOwo+PiBAQCAtODEsNyArODMsOSBAQCBzdGF0aWMgaW50IGhp Ym1jX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+ICAgICAgICAgIHN0cnVjdCBkcm1f ZGV2aWNlICpkcm1fZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwo+PiAgICAgICAgICBzdHJ1 Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYgPSBkcm1fZGV2LT5kZXZfcHJpdmF0ZTsKPj4KPj4g KyAgICAgICBkcm1faGVscGVyX3Jlc3VtZV9mb3JjZV9tb2RlKGRybV9kZXYpOwo+PiAgICAgICAg ICBkcm1fZmJfaGVscGVyX3NldF9zdXNwZW5kX3VubG9ja2VkKCZoaWRldi0+ZmJkZXYtPmhlbHBl ciwgMCk7Cj4+ICsgICAgICAgZHJtX2ttc19oZWxwZXJfcG9sbF9lbmFibGUoZHJtX2Rldik7Cj4+ Cj4+ICAgICAgICAgIHJldHVybiAwOwo+PiAgIH0KPj4gQEAgLTkxLDYgKzk1LDQxIEBAIHN0YXRp YyBpbnQgaGlibWNfcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPj4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaGlibWNfcG1fcmVzdW1lKQo+PiAgIH07Cj4+Cj4+ICtzdGF0 aWMgaW50IGhpYm1jX2ttc19pbml0KHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRldikKPj4g K3sKPj4gKyAgICAgICBpbnQgcmV0Owo+PiArCj4+ICsgICAgICAgZHJtX21vZGVfY29uZmlnX2lu aXQoaGlkZXYtPmRldik7Cj4+ICsgICAgICAgaGlkZXYtPm1vZGVfY29uZmlnX2luaXRpYWxpemVk ID0gdHJ1ZTsKPj4gKwo+PiArICAgICAgIGhpZGV2LT5kZXYtPm1vZGVfY29uZmlnLm1pbl93aWR0 aCA9IDA7Cj4+ICsgICAgICAgaGlkZXYtPmRldi0+bW9kZV9jb25maWcubWluX2hlaWdodCA9IDA7 Cj4+ICsgICAgICAgaGlkZXYtPmRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gMTkyMDsKPj4g KyAgICAgICBoaWRldi0+ZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gMTQ0MDsKPj4gKwo+ PiArICAgICAgIGhpZGV2LT5kZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgPSBoaWRldi0+ZmJfYmFz ZTsKPj4gKyAgICAgICBoaWRldi0+ZGV2LT5tb2RlX2NvbmZpZy5wcmVmZXJyZWRfZGVwdGggPSAy NDsKPj4gKyAgICAgICBoaWRldi0+ZGV2LT5tb2RlX2NvbmZpZy5wcmVmZXJfc2hhZG93ID0gMDsK Pj4gKwo+PiArICAgICAgIGhpZGV2LT5kZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gKHZvaWQgKikm aGlibWNfbW9kZV9mdW5jczsKPj4gKwo+PiArICAgICAgIHJldCA9IGhpYm1jX3BsYW5lX2luaXQo aGlkZXYpOwo+PiArICAgICAgIGlmIChyZXQpIHsKPj4gKyAgICAgICAgICAgICAgIERSTV9FUlJP UigiZmFpbCB0byBpbml0IHBsYW5lISEhXG4iKTsKPj4gKyAgICAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4+ICsgICAgICAgfQo+PiArCj4+ICsgICAgICAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4g K3N0YXRpYyB2b2lkIGhpYm1jX2ttc19maW5pKHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRl dikKPj4gK3sKPj4gKyAgICAgICBpZiAoaGlkZXYtPm1vZGVfY29uZmlnX2luaXRpYWxpemVkKSB7 Cj4+ICsgICAgICAgICAgICAgICBkcm1fbW9kZV9jb25maWdfY2xlYW51cChoaWRldi0+ZGV2KTsK Pj4gKyAgICAgICAgICAgICAgIGhpZGV2LT5tb2RlX2NvbmZpZ19pbml0aWFsaXplZCA9IGZhbHNl Owo+PiArICAgICAgIH0KPj4gK30KPj4gKwo+PiAgIHN0YXRpYyBpbnQgaGlibWNfaHdfY29uZmln KHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRldikKPj4gICB7Cj4+ICAgICAgICAgIHVuc2ln bmVkIGludCByZWc7Cj4+IEBAIC0xODMsNiArMjIyLDcgQEAgc3RhdGljIGludCBoaWJtY191bmxv YWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKPj4gICAgICAgICAgc3RydWN0IGhpYm1jX2RybV9k ZXZpY2UgKmhpZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKPj4KPj4gICAgICAgICAgaGlibWNfZmJk ZXZfZmluaShoaWRldik7Cj4+ICsgICAgICAgaGlibWNfa21zX2ZpbmkoaGlkZXYpOwo+PiAgICAg ICAgICBoaWJtY19tbV9maW5pKGhpZGV2KTsKPj4gICAgICAgICAgaGlibWNfaHdfZmluaShoaWRl dik7Cj4+ICAgICAgICAgIGRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwo+PiBAQCAtMjA4LDYgKzI0 OCwxMyBAQCBzdGF0aWMgaW50IGhpYm1jX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5z aWduZWQgbG9uZyBmbGFncykKPj4gICAgICAgICAgaWYgKHJldCkKPj4gICAgICAgICAgICAgICAg ICBnb3RvIGVycjsKPj4KPj4gKyAgICAgICByZXQgPSBoaWJtY19rbXNfaW5pdChoaWRldik7Cj4+ ICsgICAgICAgaWYgKHJldCkKPj4gKyAgICAgICAgICAgICAgIGdvdG8gZXJyOwo+PiArCj4+ICsg ICAgICAgLyogcmVzZXQgYWxsIHRoZSBzdGF0ZXMgb2YgY3J0Yy9wbGFuZS9lbmNvZGVyL2Nvbm5l Y3RvciAqLwo+PiArICAgICAgIGRybV9tb2RlX2NvbmZpZ19yZXNldChkZXYpOwo+PiArCj4+ICAg ICAgICAgIHJldCA9IGhpYm1jX2ZiZGV2X2luaXQoaGlkZXYpOwo+PiAgICAgICAgICBpZiAocmV0 KQo+PiAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0v aGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuaAo+PiBpbmRleCBhNDBlOWE3Li40OWUzOWQy IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2Ry bV9kcnYuaAo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2Ry bV9kcnYuaAo+PiBAQCAtNDUsNiArNDUsOCBAQCBzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSB7Cj4+ Cj4+ICAgICAgICAgIC8qIGRybSAqLwo+PiAgICAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAgKmRl djsKPj4gKyAgICAgICBzdHJ1Y3QgZHJtX3BsYW5lIHBsYW5lOwo+PiArICAgICAgIGJvb2wgbW9k ZV9jb25maWdfaW5pdGlhbGl6ZWQ7Cj4+Cj4+ICAgICAgICAgIC8qIHR0bSAqLwo+PiAgICAgICAg ICBzdHJ1Y3Qgewo+PiBAQCAtODIsNiArODQsNyBAQCBzdGF0aWMgaW5saW5lIHN0cnVjdCBoaWJt Y19ibyAqZ2VtX3RvX2hpYm1jX2JvKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtKQo+Pgo+PiAg ICNkZWZpbmUgRFJNX0ZJTEVfUEFHRV9PRkZTRVQgKDB4MTAwMDAwMDAwVUxMID4+IFBBR0VfU0hJ RlQpCj4+Cj4+ICtpbnQgaGlibWNfcGxhbmVfaW5pdChzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAq aGlkZXYpOwo+PiAgIGludCBoaWJtY19mYmRldl9pbml0KHN0cnVjdCBoaWJtY19kcm1fZGV2aWNl ICpoaWRldik7Cj4+ICAgdm9pZCBoaWJtY19mYmRldl9maW5pKHN0cnVjdCBoaWJtY19kcm1fZGV2 aWNlICpoaWRldik7Cj4+Cj4+IEBAIC0xMDIsNCArMTA1LDYgQEAgaW50IGhpYm1jX2R1bWJfbW1h cF9vZmZzZXQoc3RydWN0IGRybV9maWxlICpmaWxlLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAo+ PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGhhbmRsZSwgdTY0ICpvZmZzZXQpOwo+ PiAgIGludCBoaWJtY19tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1 Y3QgKnZtYSk7Cj4+Cj4+ICtleHRlcm4gY29uc3Qgc3RydWN0IGRybV9tb2RlX2NvbmZpZ19mdW5j cyBoaWJtY19tb2RlX2Z1bmNzOwo+PiArCj4+ICAgI2VuZGlmCj4+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX3R0bS5jIGIvZHJpdmVycy9ncHUvZHJt L2hpc2lsaWNvbi9oaWJtYy9oaWJtY190dG0uYwo+PiBpbmRleCA5ODIyZjYyLi5iZWI0ZDc2IDEw MDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX3R0bS5j Cj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfdHRtLmMKPj4g QEAgLTU1NCwzICs1NTQsOSBAQCBzdHJ1Y3QgaGlibWNfZnJhbWVidWZmZXIgKgo+PiAgICAgICAg ICB9Cj4+ICAgICAgICAgIHJldHVybiAmaGlibWNfZmItPmZiOwo+PiAgIH0KPj4gKwo+PiArY29u c3Qgc3RydWN0IGRybV9tb2RlX2NvbmZpZ19mdW5jcyBoaWJtY19tb2RlX2Z1bmNzID0gewo+PiAr ICAgICAgIC5hdG9taWNfY2hlY2sgPSBkcm1fYXRvbWljX2hlbHBlcl9jaGVjaywKPj4gKyAgICAg ICAuYXRvbWljX2NvbW1pdCA9IGRybV9hdG9taWNfaGVscGVyX2NvbW1pdCwKPj4gKyAgICAgICAu ZmJfY3JlYXRlID0gaGlibWNfdXNlcl9mcmFtZWJ1ZmZlcl9jcmVhdGUsCj4+ICt9Owo+PiAtLQo+ PiAxLjkuMQo+Pgo+Pgo+PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwo+PiBsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAo+PiBsaW51eC1hcm0ta2Vy bmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPj4gaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCj4gX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KPiBsaW51eGFybSBtYWlsaW5nIGxpc3QKPiBsaW51eGFy bUBodWF3ZWkuY29tCj4gaHR0cDovL3JuZC1vcGVuZXVsZXIuaHVhd2VpLmNvbS9tYWlsbWFuL2xp c3RpbmZvL2xpbnV4YXJtCj4KPiAuCj4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1r ZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK