From mboxrd@z Thu Jan 1 00:00:00 1970 From: seanpaul@chromium.org (Sean Paul) Date: Fri, 11 Nov 2016 08:27:18 -0500 Subject: [PATCH v6 3/9] drm/hisilicon/hibmc: Add support for frame buffer In-Reply-To: <5825C496.5070905@huawei.com> References: <1477639682-22520-1-git-send-email-zourongrong@gmail.com> <1477639682-22520-4-git-send-email-zourongrong@gmail.com> <5825C496.5070905@huawei.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Fri, Nov 11, 2016 at 8:16 AM, Rongrong Zou wrote: > ? 2016/11/11 2:30, Sean Paul ??: >> >> On Fri, Oct 28, 2016 at 3:27 AM, Rongrong Zou >> wrote: >>> >>> Add support for fbdev and kms fb management. >>> >>> Signed-off-by: Rongrong Zou >>> --- >>> drivers/gpu/drm/hisilicon/hibmc/Makefile | 2 +- >>> drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 17 ++ >>> drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 24 ++ >>> drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c | 255 >>> ++++++++++++++++++++++ >>> drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c | 66 ++++++ >>> 5 files changed, 363 insertions(+), 1 deletion(-) >>> create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c >>> >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile >>> b/drivers/gpu/drm/hisilicon/hibmc/Makefile >>> index d5c40b8..810a37e 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_power.o hibmc_ttm.o >>> +hibmc-drm-y := hibmc_drm_drv.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_drv.c >>> b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c >>> index 81f4301..5ac7a7e 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c >>> @@ -66,11 +66,23 @@ static void hibmc_disable_vblank(struct drm_device >>> *dev, unsigned int pipe) >>> >>> static int hibmc_pm_suspend(struct device *dev) >>> { >>> + struct pci_dev *pdev = to_pci_dev(dev); >>> + struct drm_device *drm_dev = pci_get_drvdata(pdev); >>> + struct hibmc_drm_device *hidev = drm_dev->dev_private; >>> + >>> + drm_fb_helper_set_suspend_unlocked(&hidev->fbdev->helper, 1); >>> + >> >> >> We have atomic helpers for suspend/resume now. Please use those. > > > drm_atomic_helper_suspend/resume()? > Correct > >> >>> return 0; >>> } >>> >>> static int hibmc_pm_resume(struct device *dev) >>> { >>> + struct pci_dev *pdev = to_pci_dev(dev); >>> + struct drm_device *drm_dev = pci_get_drvdata(pdev); >>> + struct hibmc_drm_device *hidev = drm_dev->dev_private; >>> + >>> + drm_fb_helper_set_suspend_unlocked(&hidev->fbdev->helper, 0); >>> + >>> return 0; >>> } >>> >>> @@ -170,6 +182,7 @@ static int hibmc_unload(struct drm_device *dev) >>> { >>> struct hibmc_drm_device *hidev = dev->dev_private; >>> >>> + hibmc_fbdev_fini(hidev); >>> hibmc_mm_fini(hidev); >>> hibmc_hw_fini(hidev); >>> dev->dev_private = NULL; >>> @@ -195,6 +208,10 @@ static int hibmc_load(struct drm_device *dev, >>> unsigned long flags) >>> if (ret) >>> goto err; >>> >>> + ret = hibmc_fbdev_init(hidev); >>> + if (ret) >>> + goto err; >>> + >>> return 0; >>> >>> err: >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> index db8d80e..a40e9a7 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> @@ -20,9 +20,22 @@ >>> #define HIBMC_DRM_DRV_H >>> >>> #include >>> +#include >>> #include >>> #include >>> >>> +struct hibmc_framebuffer { >>> + struct drm_framebuffer fb; >>> + struct drm_gem_object *obj; >>> + bool is_fbdev_fb; >>> +}; >>> + >>> +struct hibmc_fbdev { >>> + struct drm_fb_helper helper; >>> + struct hibmc_framebuffer *fb; >>> + int size; >>> +}; >>> + >>> struct hibmc_drm_device { >>> /* hw */ >>> void __iomem *mmio; >>> @@ -41,9 +54,13 @@ struct hibmc_drm_device { >>> bool initialized; >>> } ttm; >>> >>> + /* fbdev */ >>> + struct hibmc_fbdev *fbdev; >>> bool mm_inited; >>> }; >>> >>> +#define to_hibmc_framebuffer(x) container_of(x, struct >>> hibmc_framebuffer, fb) >>> + >>> struct hibmc_bo { >>> struct ttm_buffer_object bo; >>> struct ttm_placement placement; >>> @@ -65,8 +82,15 @@ static inline struct hibmc_bo *gem_to_hibmc_bo(struct >>> drm_gem_object *gem) >>> >>> #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT) >>> >>> +int hibmc_fbdev_init(struct hibmc_drm_device *hidev); >>> +void hibmc_fbdev_fini(struct hibmc_drm_device *hidev); >>> + >>> int hibmc_gem_create(struct drm_device *dev, u32 size, bool iskernel, >>> struct drm_gem_object **obj); >>> +struct hibmc_framebuffer * >>> +hibmc_framebuffer_init(struct drm_device *dev, >>> + const struct drm_mode_fb_cmd2 *mode_cmd, >>> + struct drm_gem_object *obj); >>> >>> int hibmc_mm_init(struct hibmc_drm_device *hibmc); >>> void hibmc_mm_fini(struct hibmc_drm_device *hibmc); >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c >>> b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c >>> new file mode 100644 >>> index 0000000..630124b >>> --- /dev/null >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c >>> @@ -0,0 +1,255 @@ >>> +/* 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 "hibmc_drm_drv.h" >>> + >>> +/* >>> ---------------------------------------------------------------------- */ >> >> >> Please remove > > > will do that, thanks. > > >> >>> + >>> +static int hibmcfb_create_object( >>> + struct hibmc_drm_device *hidev, >>> + const struct drm_mode_fb_cmd2 *mode_cmd, >>> + struct drm_gem_object **gobj_p) >>> +{ >>> + struct drm_gem_object *gobj; >>> + struct drm_device *dev = hidev->dev; >>> + u32 size; >>> + int ret = 0; >>> + >>> + size = mode_cmd->pitches[0] * mode_cmd->height; >>> + ret = hibmc_gem_create(dev, size, true, &gobj); >>> + if (ret) >>> + return ret; >>> + >>> + *gobj_p = gobj; >>> + return ret; >>> +} >>> + >>> +static struct fb_ops hibmc_drm_fb_ops = { >>> + .owner = THIS_MODULE, >>> + .fb_check_var = drm_fb_helper_check_var, >>> + .fb_set_par = drm_fb_helper_set_par, >>> + .fb_fillrect = drm_fb_helper_sys_fillrect, >>> + .fb_copyarea = drm_fb_helper_sys_copyarea, >>> + .fb_imageblit = drm_fb_helper_sys_imageblit, >>> + .fb_pan_display = drm_fb_helper_pan_display, >>> + .fb_blank = drm_fb_helper_blank, >>> + .fb_setcmap = drm_fb_helper_setcmap, >>> +}; >>> + >>> +static int hibmc_drm_fb_create(struct drm_fb_helper *helper, >>> + struct drm_fb_helper_surface_size *sizes) >>> +{ >>> + struct hibmc_fbdev *hi_fbdev = >>> + container_of(helper, struct hibmc_fbdev, helper); >>> + struct hibmc_drm_device *hidev = >>> + (struct hibmc_drm_device *)helper->dev->dev_private; >>> + struct fb_info *info; >>> + struct hibmc_framebuffer *hibmc_fb; >>> + struct drm_framebuffer *fb; >>> + struct drm_mode_fb_cmd2 mode_cmd; >>> + struct drm_gem_object *gobj = NULL; >>> + int ret = 0; >>> + size_t size; >>> + unsigned int bytes_per_pixel; >>> + struct hibmc_bo *bo = NULL; >>> + >>> + DRM_DEBUG_DRIVER("surface width(%d), height(%d) and bpp(%d)\n", >>> + sizes->surface_width, sizes->surface_height, >>> + sizes->surface_bpp); >>> + sizes->surface_depth = 32; >>> + >>> + bytes_per_pixel = DIV_ROUND_UP(sizes->surface_bpp, 8); >>> + >>> + mode_cmd.width = sizes->surface_width; >>> + mode_cmd.height = sizes->surface_height; >>> + mode_cmd.pitches[0] = mode_cmd.width * bytes_per_pixel; >>> + mode_cmd.pixel_format = >>> drm_mode_legacy_fb_format(sizes->surface_bpp, >>> + >>> sizes->surface_depth); >>> + >>> + size = roundup(mode_cmd.pitches[0] * mode_cmd.height, PAGE_SIZE); >> >> >> It's somewhat curious that you used ALIGN in the previous patch and >> roundup here. But anyways, I think PAGE_ALIGN would be the most >> appropriate thing to do here. > > > agreed, thanks. > >> >>> + >>> + ret = hibmcfb_create_object(hidev, &mode_cmd, &gobj); >>> + if (ret) { >>> + DRM_ERROR("failed to create fbcon backing object %d\r\n", >> >> ret); >> >> \r, yikes!!! > > > will delete it, thanks. > >> >>> + return -ENOMEM; >>> + } >>> + >>> + bo = gem_to_hibmc_bo(gobj); >>> + >>> + ret = ttm_bo_reserve(&bo->bo, true, false, NULL); >>> + if (ret) >> >> >> Print error here? > > > will do. > >> >> How about cleaning up gobj? > > > you are right, > >> >>> + return ret; >>> + >>> + ret = hibmc_bo_pin(bo, TTM_PL_FLAG_VRAM, NULL); >>> + if (ret) { >>> + DRM_ERROR("failed to pin fbcon\n"); >> >> >> Print ret >> >> ttm_bo_unreserve? It seems like you're missing clean-up in all of the >> error paths in this function. Can you please make sure everything is >> tidied up? > > > ok, thanks. > >> >>> + return ret; >>> + } >>> + >>> + ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.num_pages, &bo->kmap); >>> + >> >> >> nit: extra space > > > do you mean extra line? > yes, apologies. >> >>> + if (ret) { >>> + DRM_ERROR("failed to kmap fbcon\n"); >> >> >> Print ret > > > ok, thanks. > >> >>> + ttm_bo_unreserve(&bo->bo); >>> + return ret; >>> + } >>> + >>> + ttm_bo_unreserve(&bo->bo); >> >> >> Move this between ttm_bo_kmap and if (ret), then remove it from inside >> the conditional. > > > This is fine with me, thanks. > >> >>> + >>> + info = drm_fb_helper_alloc_fbi(helper); >>> + if (IS_ERR(info)) >> >> >> Print error > > > ok, thanks. > >> >>> + return PTR_ERR(info); >>> + >>> + info->par = hi_fbdev; >>> + >>> + hibmc_fb = hibmc_framebuffer_init(hidev->dev, &mode_cmd, gobj); >>> + if (IS_ERR(hibmc_fb)) { >>> + drm_fb_helper_release_fbi(helper); >>> + return PTR_ERR(hibmc_fb); >>> + } >>> + >>> + hi_fbdev->fb = hibmc_fb; >>> + hidev->fbdev->size = size; >>> + fb = &hibmc_fb->fb; >> >> >> The fb variable isn't necessary, and really, the hibmc_fb doesn't >> really help either, it just masks what's actually happening IMO. > > > i will clean the two variables. > > >> >>> + if (!fb) { >>> + DRM_INFO("fb is NULL\n"); >>> + return -EINVAL; >>> + } >>> + >>> + hi_fbdev->helper.fb = fb; >>> + >>> + strcpy(info->fix.id, "hibmcdrmfb"); >>> + >>> + info->flags = FBINFO_DEFAULT; >>> + info->fbops = &hibmc_drm_fb_ops; >>> + >>> + drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth); >>> + drm_fb_helper_fill_var(info, &hidev->fbdev->helper, >>> sizes->fb_width, >>> + sizes->fb_height); >>> + >>> + info->screen_base = bo->kmap.virtual; >>> + info->screen_size = size; >>> + >>> + info->fix.smem_start = bo->bo.mem.bus.offset + >>> bo->bo.mem.bus.base; >>> + info->fix.smem_len = size; >>> + >>> + return 0; >>> +} >>> + >>> +static void hibmc_fbdev_destroy(struct hibmc_fbdev *fbdev) >>> +{ >>> + struct hibmc_framebuffer *gfb = fbdev->fb; >>> + struct drm_fb_helper *fbh = &fbdev->helper; >>> + >>> + DRM_DEBUG_DRIVER("hibmc_fbdev_destroy\n"); >> >> >> Not useful > > > ok, will remove. > > >> >>> + >>> + drm_fb_helper_unregister_fbi(fbh); >>> + drm_fb_helper_release_fbi(fbh); >>> + >>> + drm_fb_helper_fini(fbh); >>> + >>> + if (gfb) >>> + drm_framebuffer_unreference(&gfb->fb); >>> + >>> + kfree(fbdev); >>> +} >>> + >>> +static const struct drm_fb_helper_funcs hibmc_fbdev_helper_funcs = { >>> + .fb_probe = hibmc_drm_fb_create, >>> +}; >>> + >>> +int hibmc_fbdev_init(struct hibmc_drm_device *hidev) >>> +{ >>> + int ret; >>> + struct fb_var_screeninfo *var; >>> + struct fb_fix_screeninfo *fix; >>> + struct hibmc_fbdev *hifbdev; >>> + >>> + hifbdev = kzalloc(sizeof(*hifbdev), GFP_KERNEL); >> >> >> devm_kzalloc? > > > sounds good, so there need no kfree at hibmc_fbdev_destroy(), > thanks. > yep, exactly >> >>> + if (!hifbdev) >>> + return -ENOMEM; >>> + >>> + hidev->fbdev = hifbdev; >>> + drm_fb_helper_prepare(hidev->dev, &hifbdev->helper, >>> + &hibmc_fbdev_helper_funcs); >>> + >>> + /* Now just one crtc and one channel */ >>> + ret = drm_fb_helper_init(hidev->dev, >>> + &hifbdev->helper, 1, 1); >>> + >> >> >> nit: extra line > > > ok, thanks. > > >> >>> + if (ret) >>> + return ret; >>> + >>> + ret = drm_fb_helper_single_add_all_connectors(&hifbdev->helper); >>> + if (ret) >>> + goto fini; >>> + >>> + ret = drm_fb_helper_initial_config(&hifbdev->helper, 16); >>> + if (ret) >>> + goto fini; >>> + >>> + var = &hifbdev->helper.fbdev->var; >>> + fix = &hifbdev->helper.fbdev->fix; >>> + >>> + DRM_DEBUG("Member of info->var is :\n" >>> + "xres=%d\n" >>> + "yres=%d\n" >>> + "xres_virtual=%d\n" >>> + "yres_virtual=%d\n" >>> + "xoffset=%d\n" >>> + "yoffset=%d\n" >>> + "bits_per_pixel=%d\n" >>> + "...\n", var->xres, var->yres, var->xres_virtual, >>> + var->yres_virtual, var->xoffset, var->yoffset, >>> + var->bits_per_pixel); >>> + DRM_DEBUG("Member of info->fix is :\n" >>> + "smem_start=%lx\n" >>> + "smem_len=%d\n" >>> + "type=%d\n" >>> + "type_aux=%d\n" >>> + "visual=%d\n" >>> + "xpanstep=%d\n" >>> + "ypanstep=%d\n" >>> + "ywrapstep=%d\n" >>> + "line_length=%d\n" >>> + "accel=%d\n" >>> + "capabilities=%d\n" >>> + "...\n", fix->smem_start, fix->smem_len, fix->type, >>> + fix->type_aux, fix->visual, fix->xpanstep, >>> + fix->ypanstep, fix->ywrapstep, fix->line_length, >>> + fix->accel, fix->capabilities); >> >> >> You've been using DRM_DEBUG_DRIVER elsewhere, you should probably use >> it here, too. > > > ok, thanks. > > >> >>> + >>> + return 0; >>> + >>> +fini: >>> + drm_fb_helper_fini(&hifbdev->helper); >>> + return ret; >>> +} >>> + >>> +void hibmc_fbdev_fini(struct hibmc_drm_device *hidev) >>> +{ >>> + if (!hidev->fbdev) >>> + return; >>> + >>> + hibmc_fbdev_destroy(hidev->fbdev); >>> + hidev->fbdev = NULL; >>> +} >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c >>> b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c >>> index 0802ebd..9822f62 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c >>> @@ -488,3 +488,69 @@ int hibmc_dumb_mmap_offset(struct drm_file *file, >>> struct drm_device *dev, >>> drm_gem_object_unreference_unlocked(obj); >>> return 0; >>> } >>> + >>> +/* >>> ---------------------------------------------------------------------- */ >>> + >> >> >> Please remove > > > will do. > >> >>> +static void hibmc_user_framebuffer_destroy(struct drm_framebuffer *fb) >>> +{ >>> + struct hibmc_framebuffer *hibmc_fb = to_hibmc_framebuffer(fb); >>> + >>> + drm_gem_object_unreference_unlocked(hibmc_fb->obj); >>> + drm_framebuffer_cleanup(fb); >>> + kfree(hibmc_fb); >>> +} >>> + >>> +static const struct drm_framebuffer_funcs hibmc_fb_funcs = { >>> + .destroy = hibmc_user_framebuffer_destroy, >>> +}; >>> + >>> +struct hibmc_framebuffer * >>> +hibmc_framebuffer_init(struct drm_device *dev, >>> + const struct drm_mode_fb_cmd2 *mode_cmd, >>> + struct drm_gem_object *obj) >>> +{ >>> + struct hibmc_framebuffer *hibmc_fb; >>> + int ret; >>> + >>> + hibmc_fb = kzalloc(sizeof(*hibmc_fb), GFP_KERNEL); >>> + if (!hibmc_fb) >> >> >> Print error > > > ok, thanks. > > Regards, > Rongrong. > >> >>> + return ERR_PTR(-ENOMEM); >>> + >>> + drm_helper_mode_fill_fb_struct(&hibmc_fb->fb, mode_cmd); >>> + hibmc_fb->obj = obj; >>> + ret = drm_framebuffer_init(dev, &hibmc_fb->fb, &hibmc_fb_funcs); >>> + if (ret) { >>> + DRM_ERROR("drm_framebuffer_init failed: %d\n", ret); >>> + kfree(hibmc_fb); >>> + return ERR_PTR(ret); >>> + } >>> + >>> + return hibmc_fb; >>> +} >>> + >>> +static struct drm_framebuffer * >>> +hibmc_user_framebuffer_create(struct drm_device *dev, >>> + struct drm_file *filp, >>> + const struct drm_mode_fb_cmd2 *mode_cmd) >>> +{ >>> + struct drm_gem_object *obj; >>> + struct hibmc_framebuffer *hibmc_fb; >>> + >>> + DRM_DEBUG_DRIVER("%dx%d, format %c%c%c%c\n", >>> + mode_cmd->width, mode_cmd->height, >>> + (mode_cmd->pixel_format) & 0xff, >>> + (mode_cmd->pixel_format >> 8) & 0xff, >>> + (mode_cmd->pixel_format >> 16) & 0xff, >>> + (mode_cmd->pixel_format >> 24) & 0xff); >>> + >>> + obj = drm_gem_object_lookup(filp, mode_cmd->handles[0]); >>> + if (!obj) >>> + return ERR_PTR(-ENOENT); >>> + >>> + hibmc_fb = hibmc_framebuffer_init(dev, mode_cmd, obj); >>> + if (IS_ERR(hibmc_fb)) { >>> + drm_gem_object_unreference_unlocked(obj); >>> + return ERR_PTR((long)hibmc_fb); >>> + } >>> + return &hibmc_fb->fb; >>> +} >>> -- >>> 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 >> >> . >> > > _______________________________________________ > 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 3/9] drm/hisilicon/hibmc: Add support for frame buffer Date: Fri, 11 Nov 2016 08:27:18 -0500 Message-ID: References: <1477639682-22520-1-git-send-email-zourongrong@gmail.com> <1477639682-22520-4-git-send-email-zourongrong@gmail.com> <5825C496.5070905@huawei.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-yw0-x22e.google.com (mail-yw0-x22e.google.com [IPv6:2607:f8b0:4002:c05::22e]) by gabe.freedesktop.org (Postfix) with ESMTPS id 072196E8EF for ; Fri, 11 Nov 2016 13:27:42 +0000 (UTC) Received: by mail-yw0-x22e.google.com with SMTP id a10so10822805ywa.3 for ; Fri, 11 Nov 2016 05:27:41 -0800 (PST) Received: from mail-yb0-f175.google.com (mail-yb0-f175.google.com. [209.85.213.175]) by smtp.gmail.com with ESMTPSA id k14sm378817ywi.11.2016.11.11.05.27.39 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Nov 2016 05:27:39 -0800 (PST) Received: by mail-yb0-f175.google.com with SMTP id d128so4932610ybh.2 for ; Fri, 11 Nov 2016 05:27:39 -0800 (PST) In-Reply-To: <5825C496.5070905@huawei.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 , lijianhua@huawei.com, Will Deacon , Tomeu Vizoso , Jonathan Corbet , catalin.marinas@arm.com, Emil Velikov , linuxarm@huawei.com, dri-devel , james.xiong@huawei.com, shenhui@huawei.com, Rongrong Zou , Linux ARM Kernel List-Id: dri-devel@lists.freedesktop.org T24gRnJpLCBOb3YgMTEsIDIwMTYgYXQgODoxNiBBTSwgUm9uZ3JvbmcgWm91IDx6b3Vyb25ncm9u Z0BodWF3ZWkuY29tPiB3cm90ZToKPiDlnKggMjAxNi8xMS8xMSAyOjMwLCBTZWFuIFBhdWwg5YaZ 6YGTOgo+Pgo+PiBPbiBGcmksIE9jdCAyOCwgMjAxNiBhdCAzOjI3IEFNLCBSb25ncm9uZyBab3Ug PHpvdXJvbmdyb25nQGdtYWlsLmNvbT4KPj4gd3JvdGU6Cj4+Pgo+Pj4gQWRkIHN1cHBvcnQgZm9y IGZiZGV2IGFuZCBrbXMgZmIgbWFuYWdlbWVudC4KPj4+Cj4+PiBTaWduZWQtb2ZmLWJ5OiBSb25n cm9uZyBab3UgPHpvdXJvbmdyb25nQGdtYWlsLmNvbT4KPj4+IC0tLQo+Pj4gICBkcml2ZXJzL2dw dS9kcm0vaGlzaWxpY29uL2hpYm1jL01ha2VmaWxlICAgICAgICAgIHwgICAyICstCj4+PiAgIGRy aXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5jICAgfCAgMTcgKysK Pj4+ICAgZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmggICB8 ICAyNCArKwo+Pj4gICBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9m YmRldi5jIHwgMjU1Cj4+PiArKysrKysrKysrKysrKysrKysrKysrCj4+PiAgIGRyaXZlcnMvZ3B1 L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfdHRtLmMgICAgICAgfCAgNjYgKysrKysrCj4+PiAg IDUgZmlsZXMgY2hhbmdlZCwgMzYzIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKPj4+ICAg Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNf ZHJtX2ZiZGV2LmMKPj4+Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNv bi9oaWJtYy9NYWtlZmlsZQo+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL01h a2VmaWxlCj4+PiBpbmRleCBkNWM0MGI4Li44MTBhMzdlIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9NYWtlZmlsZQo+Pj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL2hpc2lsaWNvbi9oaWJtYy9NYWtlZmlsZQo+Pj4gQEAgLTEsNSArMSw1IEBACj4+PiAgIGNj ZmxhZ3MteSA6PSAtSWluY2x1ZGUvZHJtCj4+PiAtaGlibWMtZHJtLXkgOj0gaGlibWNfZHJtX2Ry di5vIGhpYm1jX2RybV9wb3dlci5vIGhpYm1jX3R0bS5vCj4+PiAraGlibWMtZHJtLXkgOj0gaGli bWNfZHJtX2Rydi5vIGhpYm1jX2RybV9mYmRldi5vIGhpYm1jX2RybV9wb3dlci5vCj4+PiBoaWJt Y190dG0ubwo+Pj4KPj4+ICAgb2JqLSQoQ09ORklHX0RSTV9ISVNJX0hJQk1DKSAgICs9aGlibWMt ZHJtLm8KPj4+ICAgI29iai15ICs9IGhpYm1jLWRybS5vCj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmMKPj4+IGIvZHJpdmVycy9n cHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmMKPj4+IGluZGV4IDgxZjQzMDEu LjVhYzdhN2UgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1j L2hpYm1jX2RybV9kcnYuYwo+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJt Yy9oaWJtY19kcm1fZHJ2LmMKPj4+IEBAIC02NiwxMSArNjYsMjMgQEAgc3RhdGljIHZvaWQgaGli bWNfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UKPj4+ICpkZXYsIHVuc2lnbmVkIGlu dCBwaXBlKQo+Pj4KPj4+ICAgc3RhdGljIGludCBoaWJtY19wbV9zdXNwZW5kKHN0cnVjdCBkZXZp Y2UgKmRldikKPj4+ICAgewo+Pj4gKyAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3Bj aV9kZXYoZGV2KTsKPj4+ICsgICAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYgPSBwY2lf Z2V0X2RydmRhdGEocGRldik7Cj4+PiArICAgICAgIHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpo aWRldiA9IGRybV9kZXYtPmRldl9wcml2YXRlOwo+Pj4gKwo+Pj4gKyAgICAgICBkcm1fZmJfaGVs cGVyX3NldF9zdXNwZW5kX3VubG9ja2VkKCZoaWRldi0+ZmJkZXYtPmhlbHBlciwgMSk7Cj4+PiAr Cj4+Cj4+Cj4+IFdlIGhhdmUgYXRvbWljIGhlbHBlcnMgZm9yIHN1c3BlbmQvcmVzdW1lIG5vdy4g UGxlYXNlIHVzZSB0aG9zZS4KPgo+Cj4gZHJtX2F0b21pY19oZWxwZXJfc3VzcGVuZC9yZXN1bWUo KT8KPgoKQ29ycmVjdAoKPgo+Pgo+Pj4gICAgICAgICAgcmV0dXJuIDA7Cj4+PiAgIH0KPj4+Cj4+ PiAgIHN0YXRpYyBpbnQgaGlibWNfcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPj4+ICAg ewo+Pj4gKyAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKPj4+ ICsgICAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRl dik7Cj4+PiArICAgICAgIHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRldiA9IGRybV9kZXYt PmRldl9wcml2YXRlOwo+Pj4gKwo+Pj4gKyAgICAgICBkcm1fZmJfaGVscGVyX3NldF9zdXNwZW5k X3VubG9ja2VkKCZoaWRldi0+ZmJkZXYtPmhlbHBlciwgMCk7Cj4+PiArCj4+PiAgICAgICAgICBy ZXR1cm4gMDsKPj4+ICAgfQo+Pj4KPj4+IEBAIC0xNzAsNiArMTgyLDcgQEAgc3RhdGljIGludCBo aWJtY191bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKPj4+ICAgewo+Pj4gICAgICAgICAg c3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhpZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKPj4+Cj4+ PiArICAgICAgIGhpYm1jX2ZiZGV2X2ZpbmkoaGlkZXYpOwo+Pj4gICAgICAgICAgaGlibWNfbW1f ZmluaShoaWRldik7Cj4+PiAgICAgICAgICBoaWJtY19od19maW5pKGhpZGV2KTsKPj4+ICAgICAg ICAgIGRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwo+Pj4gQEAgLTE5NSw2ICsyMDgsMTAgQEAgc3Rh dGljIGludCBoaWJtY19sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4+PiB1bnNpZ25lZCBs b25nIGZsYWdzKQo+Pj4gICAgICAgICAgaWYgKHJldCkKPj4+ICAgICAgICAgICAgICAgICAgZ290 byBlcnI7Cj4+Pgo+Pj4gKyAgICAgICByZXQgPSBoaWJtY19mYmRldl9pbml0KGhpZGV2KTsKPj4+ ICsgICAgICAgaWYgKHJldCkKPj4+ICsgICAgICAgICAgICAgICBnb3RvIGVycjsKPj4+ICsKPj4+ ICAgICAgICAgIHJldHVybiAwOwo+Pj4KPj4+ICAgZXJyOgo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5oCj4+PiBiL2RyaXZlcnMv Z3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5oCj4+PiBpbmRleCBkYjhkODBl Li5hNDBlOWE3IDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJt Yy9oaWJtY19kcm1fZHJ2LmgKPj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGli bWMvaGlibWNfZHJtX2Rydi5oCj4+PiBAQCAtMjAsOSArMjAsMjIgQEAKPj4+ICAgI2RlZmluZSBI SUJNQ19EUk1fRFJWX0gKPj4+Cj4+PiAgICNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+Pj4gKyNpbmNs dWRlIDxkcm0vZHJtX2ZiX2hlbHBlci5oPgo+Pj4gICAjaW5jbHVkZSA8ZHJtL3R0bS90dG1fYm9f ZHJpdmVyLmg+Cj4+PiAgICNpbmNsdWRlIDxkcm0vZHJtX2dlbS5oPgo+Pj4KPj4+ICtzdHJ1Y3Qg aGlibWNfZnJhbWVidWZmZXIgewo+Pj4gKyAgICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyIGZi Owo+Pj4gKyAgICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKPj4+ICsgICAgICAgYm9v bCBpc19mYmRldl9mYjsKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0cnVjdCBoaWJtY19mYmRldiB7Cj4+ PiArICAgICAgIHN0cnVjdCBkcm1fZmJfaGVscGVyIGhlbHBlcjsKPj4+ICsgICAgICAgc3RydWN0 IGhpYm1jX2ZyYW1lYnVmZmVyICpmYjsKPj4+ICsgICAgICAgaW50IHNpemU7Cj4+PiArfTsKPj4+ ICsKPj4+ICAgc3RydWN0IGhpYm1jX2RybV9kZXZpY2Ugewo+Pj4gICAgICAgICAgLyogaHcgKi8K Pj4+ICAgICAgICAgIHZvaWQgX19pb21lbSAgICptbWlvOwo+Pj4gQEAgLTQxLDkgKzU0LDEzIEBA IHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlIHsKPj4+ICAgICAgICAgICAgICAgICAgYm9vbCBpbml0 aWFsaXplZDsKPj4+ICAgICAgICAgIH0gdHRtOwo+Pj4KPj4+ICsgICAgICAgLyogZmJkZXYgKi8K Pj4+ICsgICAgICAgc3RydWN0IGhpYm1jX2ZiZGV2ICpmYmRldjsKPj4+ICAgICAgICAgIGJvb2wg bW1faW5pdGVkOwo+Pj4gICB9Owo+Pj4KPj4+ICsjZGVmaW5lIHRvX2hpYm1jX2ZyYW1lYnVmZmVy KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QKPj4+IGhpYm1jX2ZyYW1lYnVmZmVyLCBmYikKPj4+ ICsKPj4+ICAgc3RydWN0IGhpYm1jX2JvIHsKPj4+ICAgICAgICAgIHN0cnVjdCB0dG1fYnVmZmVy X29iamVjdCBibzsKPj4+ICAgICAgICAgIHN0cnVjdCB0dG1fcGxhY2VtZW50IHBsYWNlbWVudDsK Pj4+IEBAIC02NSw4ICs4MiwxNSBAQCBzdGF0aWMgaW5saW5lIHN0cnVjdCBoaWJtY19ibyAqZ2Vt X3RvX2hpYm1jX2JvKHN0cnVjdAo+Pj4gZHJtX2dlbV9vYmplY3QgKmdlbSkKPj4+Cj4+PiAgICNk ZWZpbmUgRFJNX0ZJTEVfUEFHRV9PRkZTRVQgKDB4MTAwMDAwMDAwVUxMID4+IFBBR0VfU0hJRlQp Cj4+Pgo+Pj4gK2ludCBoaWJtY19mYmRldl9pbml0KHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpo aWRldik7Cj4+PiArdm9pZCBoaWJtY19mYmRldl9maW5pKHN0cnVjdCBoaWJtY19kcm1fZGV2aWNl ICpoaWRldik7Cj4+PiArCj4+PiAgIGludCBoaWJtY19nZW1fY3JlYXRlKHN0cnVjdCBkcm1fZGV2 aWNlICpkZXYsIHUzMiBzaXplLCBib29sIGlza2VybmVsLAo+Pj4gICAgICAgICAgICAgICAgICAg ICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKm9iaik7Cj4+PiArc3RydWN0IGhpYm1jX2ZyYW1l YnVmZmVyICoKPj4+ICtoaWJtY19mcmFtZWJ1ZmZlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYsCj4+PiArICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkcm1fbW9kZV9mYl9j bWQyICptb2RlX2NtZCwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9nZW1f b2JqZWN0ICpvYmopOwo+Pj4KPj4+ICAgaW50IGhpYm1jX21tX2luaXQoc3RydWN0IGhpYm1jX2Ry bV9kZXZpY2UgKmhpYm1jKTsKPj4+ICAgdm9pZCBoaWJtY19tbV9maW5pKHN0cnVjdCBoaWJtY19k cm1fZGV2aWNlICpoaWJtYyk7Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2hpc2ls aWNvbi9oaWJtYy9oaWJtY19kcm1fZmJkZXYuYwo+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxp Y29uL2hpYm1jL2hpYm1jX2RybV9mYmRldi5jCj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4g aW5kZXggMDAwMDAwMC4uNjMwMTI0Ygo+Pj4gLS0tIC9kZXYvbnVsbAo+Pj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZmJkZXYuYwo+Pj4gQEAgLTAsMCAr MSwyNTUgQEAKPj4+ICsvKiBIaXNpbGljb24gSGlibWMgU29DIGRybSBkcml2ZXIKPj4+ICsgKgo+ Pj4gKyAqIEJhc2VkIG9uIHRoZSBib2NocyBkcm0gZHJpdmVyLgo+Pj4gKyAqCj4+PiArICogQ29w eXJpZ2h0IChjKSAyMDE2IEh1YXdlaSBMaW1pdGVkLgo+Pj4gKyAqCj4+PiArICogQXV0aG9yOgo+ Pj4gKyAqICAgICBSb25ncm9uZyBab3UgPHpvdXJvbmdyb25nQGh1YXdlaS5jb20+Cj4+PiArICog ICAgIFJvbmdyb25nIFpvdSA8em91cm9uZ3JvbmdAZ21haWwuY29tPgo+Pj4gKyAqICAgICBKaWFu aHVhIExpIDxsaWppYW5odWFAaHVhd2VpLmNvbT4KPj4+ICsgKgo+Pj4gKyAqIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 Cj4+PiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcyBwdWJsaXNoZWQgYnkKPj4+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u OyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgo+Pj4gKyAqIChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4+PiArICoKPj4+ICsgKi8KPj4+ICsKPj4+ICsjaW5j bHVkZSA8ZHJtL2RybV9jcnRjLmg+Cj4+PiArI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIu aD4KPj4+ICsjaW5jbHVkZSA8ZHJtL2RybV9mYl9oZWxwZXIuaD4KPj4+ICsKPj4+ICsjaW5jbHVk ZSAiaGlibWNfZHJtX2Rydi5oIgo+Pj4gKwo+Pj4gKy8qCj4+PiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCj4+ Cj4+Cj4+IFBsZWFzZSByZW1vdmUKPgo+Cj4gd2lsbCBkbyB0aGF0LCB0aGFua3MuCj4KPgo+Pgo+ Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgaGlibWNmYl9jcmVhdGVfb2JqZWN0KAo+Pj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYsCj4+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkcm1fbW9kZV9m Yl9jbWQyICptb2RlX2NtZCwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ry dWN0IGRybV9nZW1fb2JqZWN0ICoqZ29ial9wKQo+Pj4gK3sKPj4+ICsgICAgICAgc3RydWN0IGRy bV9nZW1fb2JqZWN0ICpnb2JqOwo+Pj4gKyAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0g aGlkZXYtPmRldjsKPj4+ICsgICAgICAgdTMyIHNpemU7Cj4+PiArICAgICAgIGludCByZXQgPSAw Owo+Pj4gKwo+Pj4gKyAgICAgICBzaXplID0gbW9kZV9jbWQtPnBpdGNoZXNbMF0gKiBtb2RlX2Nt ZC0+aGVpZ2h0Owo+Pj4gKyAgICAgICByZXQgPSBoaWJtY19nZW1fY3JlYXRlKGRldiwgc2l6ZSwg dHJ1ZSwgJmdvYmopOwo+Pj4gKyAgICAgICBpZiAocmV0KQo+Pj4gKyAgICAgICAgICAgICAgIHJl dHVybiByZXQ7Cj4+PiArCj4+PiArICAgICAgICpnb2JqX3AgPSBnb2JqOwo+Pj4gKyAgICAgICBy ZXR1cm4gcmV0Owo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3RydWN0IGZiX29wcyBoaWJtY19k cm1fZmJfb3BzID0gewo+Pj4gKyAgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKPj4+ICsgICAg ICAgLmZiX2NoZWNrX3ZhciA9IGRybV9mYl9oZWxwZXJfY2hlY2tfdmFyLAo+Pj4gKyAgICAgICAu ZmJfc2V0X3BhciA9IGRybV9mYl9oZWxwZXJfc2V0X3BhciwKPj4+ICsgICAgICAgLmZiX2ZpbGxy ZWN0ID0gZHJtX2ZiX2hlbHBlcl9zeXNfZmlsbHJlY3QsCj4+PiArICAgICAgIC5mYl9jb3B5YXJl YSA9IGRybV9mYl9oZWxwZXJfc3lzX2NvcHlhcmVhLAo+Pj4gKyAgICAgICAuZmJfaW1hZ2VibGl0 ID0gZHJtX2ZiX2hlbHBlcl9zeXNfaW1hZ2VibGl0LAo+Pj4gKyAgICAgICAuZmJfcGFuX2Rpc3Bs YXkgPSBkcm1fZmJfaGVscGVyX3Bhbl9kaXNwbGF5LAo+Pj4gKyAgICAgICAuZmJfYmxhbmsgPSBk cm1fZmJfaGVscGVyX2JsYW5rLAo+Pj4gKyAgICAgICAuZmJfc2V0Y21hcCA9IGRybV9mYl9oZWxw ZXJfc2V0Y21hcCwKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgaGlibWNfZHJtX2ZiX2Ny ZWF0ZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAo+Pj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHN0cnVjdCBkcm1fZmJfaGVscGVyX3N1cmZhY2Vfc2l6ZSAqc2l6ZXMpCj4+ PiArewo+Pj4gKyAgICAgICBzdHJ1Y3QgaGlibWNfZmJkZXYgKmhpX2ZiZGV2ID0KPj4+ICsgICAg ICAgICAgICAgICBjb250YWluZXJfb2YoaGVscGVyLCBzdHJ1Y3QgaGlibWNfZmJkZXYsIGhlbHBl cik7Cj4+PiArICAgICAgIHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRldiA9Cj4+PiArICAg ICAgICAgICAgICAgKHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICopaGVscGVyLT5kZXYtPmRldl9w cml2YXRlOwo+Pj4gKyAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKPj4+ICsgICAgICAgc3Ry dWN0IGhpYm1jX2ZyYW1lYnVmZmVyICpoaWJtY19mYjsKPj4+ICsgICAgICAgc3RydWN0IGRybV9m cmFtZWJ1ZmZlciAqZmI7Cj4+PiArICAgICAgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQyIG1vZGVf Y21kOwo+Pj4gKyAgICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdvYmogPSBOVUxMOwo+Pj4g KyAgICAgICBpbnQgcmV0ID0gMDsKPj4+ICsgICAgICAgc2l6ZV90IHNpemU7Cj4+PiArICAgICAg IHVuc2lnbmVkIGludCBieXRlc19wZXJfcGl4ZWw7Cj4+PiArICAgICAgIHN0cnVjdCBoaWJtY19i byAqYm8gPSBOVUxMOwo+Pj4gKwo+Pj4gKyAgICAgICBEUk1fREVCVUdfRFJJVkVSKCJzdXJmYWNl IHdpZHRoKCVkKSwgaGVpZ2h0KCVkKSBhbmQgYnBwKCVkKVxuIiwKPj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICBzaXplcy0+c3VyZmFjZV93aWR0aCwgc2l6ZXMtPnN1cmZhY2VfaGVpZ2h0LAo+ Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzLT5zdXJmYWNlX2JwcCk7Cj4+PiArICAg ICAgIHNpemVzLT5zdXJmYWNlX2RlcHRoID0gMzI7Cj4+PiArCj4+PiArICAgICAgIGJ5dGVzX3Bl cl9waXhlbCA9IERJVl9ST1VORF9VUChzaXplcy0+c3VyZmFjZV9icHAsIDgpOwo+Pj4gKwo+Pj4g KyAgICAgICBtb2RlX2NtZC53aWR0aCA9IHNpemVzLT5zdXJmYWNlX3dpZHRoOwo+Pj4gKyAgICAg ICBtb2RlX2NtZC5oZWlnaHQgPSBzaXplcy0+c3VyZmFjZV9oZWlnaHQ7Cj4+PiArICAgICAgIG1v ZGVfY21kLnBpdGNoZXNbMF0gPSBtb2RlX2NtZC53aWR0aCAqIGJ5dGVzX3Blcl9waXhlbDsKPj4+ ICsgICAgICAgbW9kZV9jbWQucGl4ZWxfZm9ybWF0ID0KPj4+IGRybV9tb2RlX2xlZ2FjeV9mYl9m b3JtYXQoc2l6ZXMtPnN1cmZhY2VfYnBwLAo+Pj4gKwo+Pj4gc2l6ZXMtPnN1cmZhY2VfZGVwdGgp Owo+Pj4gKwo+Pj4gKyAgICAgICBzaXplID0gcm91bmR1cChtb2RlX2NtZC5waXRjaGVzWzBdICog bW9kZV9jbWQuaGVpZ2h0LCBQQUdFX1NJWkUpOwo+Pgo+Pgo+PiBJdCdzIHNvbWV3aGF0IGN1cmlv dXMgdGhhdCB5b3UgdXNlZCBBTElHTiBpbiB0aGUgcHJldmlvdXMgcGF0Y2ggYW5kCj4+IHJvdW5k dXAgaGVyZS4gQnV0IGFueXdheXMsIEkgdGhpbmsgUEFHRV9BTElHTiB3b3VsZCBiZSB0aGUgbW9z dAo+PiBhcHByb3ByaWF0ZSB0aGluZyB0byBkbyBoZXJlLgo+Cj4KPiBhZ3JlZWQsIHRoYW5rcy4K Pgo+Pgo+Pj4gKwo+Pj4gKyAgICAgICByZXQgPSBoaWJtY2ZiX2NyZWF0ZV9vYmplY3QoaGlkZXYs ICZtb2RlX2NtZCwgJmdvYmopOwo+Pj4gKyAgICAgICBpZiAocmV0KSB7Cj4+PiArICAgICAgICAg ICAgICAgRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGZiY29uIGJhY2tpbmcgb2JqZWN0ICVk XHJcbiIsCj4+Cj4+IHJldCk7Cj4+Cj4+IFxyLCB5aWtlcyEhIQo+Cj4KPiB3aWxsIGRlbGV0ZSBp dCwgdGhhbmtzLgo+Cj4+Cj4+PiArICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4+PiAr ICAgICAgIH0KPj4+ICsKPj4+ICsgICAgICAgYm8gPSBnZW1fdG9faGlibWNfYm8oZ29iaik7Cj4+ PiArCj4+PiArICAgICAgIHJldCA9IHR0bV9ib19yZXNlcnZlKCZiby0+Ym8sIHRydWUsIGZhbHNl LCBOVUxMKTsKPj4+ICsgICAgICAgaWYgKHJldCkKPj4KPj4KPj4gUHJpbnQgZXJyb3IgaGVyZT8K Pgo+Cj4gd2lsbCBkby4KPgo+Pgo+PiBIb3cgYWJvdXQgY2xlYW5pbmcgdXAgZ29iaj8KPgo+Cj4g eW91IGFyZSByaWdodCwKPgo+Pgo+Pj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiAr Cj4+PiArICAgICAgIHJldCA9IGhpYm1jX2JvX3BpbihibywgVFRNX1BMX0ZMQUdfVlJBTSwgTlVM TCk7Cj4+PiArICAgICAgIGlmIChyZXQpIHsKPj4+ICsgICAgICAgICAgICAgICBEUk1fRVJST1Io ImZhaWxlZCB0byBwaW4gZmJjb25cbiIpOwo+Pgo+Pgo+PiBQcmludCByZXQKPj4KPj4gdHRtX2Jv X3VucmVzZXJ2ZT8gSXQgc2VlbXMgbGlrZSB5b3UncmUgbWlzc2luZyBjbGVhbi11cCBpbiBhbGwg b2YgdGhlCj4+IGVycm9yIHBhdGhzIGluIHRoaXMgZnVuY3Rpb24uIENhbiB5b3UgcGxlYXNlIG1h a2Ugc3VyZSBldmVyeXRoaW5nIGlzCj4+IHRpZGllZCB1cD8KPgo+Cj4gb2ssIHRoYW5rcy4KPgo+ Pgo+Pj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiArICAgICAgIH0KPj4+ICsKPj4+ ICsgICAgICAgcmV0ID0gdHRtX2JvX2ttYXAoJmJvLT5ibywgMCwgYm8tPmJvLm51bV9wYWdlcywg JmJvLT5rbWFwKTsKPj4+ICsKPj4KPj4KPj4gbml0OiBleHRyYSBzcGFjZQo+Cj4KPiBkbyB5b3Ug bWVhbiBleHRyYSBsaW5lPwo+Cgp5ZXMsIGFwb2xvZ2llcy4KCj4+Cj4+PiArICAgICAgIGlmIChy ZXQpIHsKPj4+ICsgICAgICAgICAgICAgICBEUk1fRVJST1IoImZhaWxlZCB0byBrbWFwIGZiY29u XG4iKTsKPj4KPj4KPj4gUHJpbnQgcmV0Cj4KPgo+IG9rLCB0aGFua3MuCj4KPj4KPj4+ICsgICAg ICAgICAgICAgICB0dG1fYm9fdW5yZXNlcnZlKCZiby0+Ym8pOwo+Pj4gKyAgICAgICAgICAgICAg IHJldHVybiByZXQ7Cj4+PiArICAgICAgIH0KPj4+ICsKPj4+ICsgICAgICAgdHRtX2JvX3VucmVz ZXJ2ZSgmYm8tPmJvKTsKPj4KPj4KPj4gTW92ZSB0aGlzIGJldHdlZW4gdHRtX2JvX2ttYXAgYW5k IGlmIChyZXQpLCB0aGVuIHJlbW92ZSBpdCBmcm9tIGluc2lkZQo+PiB0aGUgY29uZGl0aW9uYWwu Cj4KPgo+IFRoaXMgaXMgZmluZSB3aXRoIG1lLCB0aGFua3MuCj4KPj4KPj4+ICsKPj4+ICsgICAg ICAgaW5mbyA9IGRybV9mYl9oZWxwZXJfYWxsb2NfZmJpKGhlbHBlcik7Cj4+PiArICAgICAgIGlm IChJU19FUlIoaW5mbykpCj4+Cj4+Cj4+IFByaW50IGVycm9yCj4KPgo+IG9rLCB0aGFua3MuCj4K Pj4KPj4+ICsgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihpbmZvKTsKPj4+ICsKPj4+ICsg ICAgICAgaW5mby0+cGFyID0gaGlfZmJkZXY7Cj4+PiArCj4+PiArICAgICAgIGhpYm1jX2ZiID0g aGlibWNfZnJhbWVidWZmZXJfaW5pdChoaWRldi0+ZGV2LCAmbW9kZV9jbWQsIGdvYmopOwo+Pj4g KyAgICAgICBpZiAoSVNfRVJSKGhpYm1jX2ZiKSkgewo+Pj4gKyAgICAgICAgICAgICAgIGRybV9m Yl9oZWxwZXJfcmVsZWFzZV9mYmkoaGVscGVyKTsKPj4+ICsgICAgICAgICAgICAgICByZXR1cm4g UFRSX0VSUihoaWJtY19mYik7Cj4+PiArICAgICAgIH0KPj4+ICsKPj4+ICsgICAgICAgaGlfZmJk ZXYtPmZiID0gaGlibWNfZmI7Cj4+PiArICAgICAgIGhpZGV2LT5mYmRldi0+c2l6ZSA9IHNpemU7 Cj4+PiArICAgICAgIGZiID0gJmhpYm1jX2ZiLT5mYjsKPj4KPj4KPj4gVGhlIGZiIHZhcmlhYmxl IGlzbid0IG5lY2Vzc2FyeSwgYW5kIHJlYWxseSwgdGhlIGhpYm1jX2ZiIGRvZXNuJ3QKPj4gcmVh bGx5IGhlbHAgZWl0aGVyLCBpdCBqdXN0IG1hc2tzIHdoYXQncyBhY3R1YWxseSBoYXBwZW5pbmcg SU1PLgo+Cj4KPiBpIHdpbGwgY2xlYW4gdGhlIHR3byB2YXJpYWJsZXMuCj4KPgo+Pgo+Pj4gKyAg ICAgICBpZiAoIWZiKSB7Cj4+PiArICAgICAgICAgICAgICAgRFJNX0lORk8oImZiIGlzIE5VTExc biIpOwo+Pj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+Pj4gKyAgICAgICB9Cj4+ PiArCj4+PiArICAgICAgIGhpX2ZiZGV2LT5oZWxwZXIuZmIgPSBmYjsKPj4+ICsKPj4+ICsgICAg ICAgc3RyY3B5KGluZm8tPmZpeC5pZCwgImhpYm1jZHJtZmIiKTsKPj4+ICsKPj4+ICsgICAgICAg aW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVDsKPj4+ICsgICAgICAgaW5mby0+ZmJvcHMgPSAm aGlibWNfZHJtX2ZiX29wczsKPj4+ICsKPj4+ICsgICAgICAgZHJtX2ZiX2hlbHBlcl9maWxsX2Zp eChpbmZvLCBmYi0+cGl0Y2hlc1swXSwgZmItPmRlcHRoKTsKPj4+ICsgICAgICAgZHJtX2ZiX2hl bHBlcl9maWxsX3ZhcihpbmZvLCAmaGlkZXYtPmZiZGV2LT5oZWxwZXIsCj4+PiBzaXplcy0+ZmJf d2lkdGgsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZXMtPmZiX2hlaWdo dCk7Cj4+PiArCj4+PiArICAgICAgIGluZm8tPnNjcmVlbl9iYXNlID0gYm8tPmttYXAudmlydHVh bDsKPj4+ICsgICAgICAgaW5mby0+c2NyZWVuX3NpemUgPSBzaXplOwo+Pj4gKwo+Pj4gKyAgICAg ICBpbmZvLT5maXguc21lbV9zdGFydCA9IGJvLT5iby5tZW0uYnVzLm9mZnNldCArCj4+PiBiby0+ Ym8ubWVtLmJ1cy5iYXNlOwo+Pj4gKyAgICAgICBpbmZvLT5maXguc21lbV9sZW4gPSBzaXplOwo+ Pj4gKwo+Pj4gKyAgICAgICByZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQg aGlibWNfZmJkZXZfZGVzdHJveShzdHJ1Y3QgaGlibWNfZmJkZXYgKmZiZGV2KQo+Pj4gK3sKPj4+ ICsgICAgICAgc3RydWN0IGhpYm1jX2ZyYW1lYnVmZmVyICpnZmIgPSBmYmRldi0+ZmI7Cj4+PiAr ICAgICAgIHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYmggPSAmZmJkZXYtPmhlbHBlcjsKPj4+ICsK Pj4+ICsgICAgICAgRFJNX0RFQlVHX0RSSVZFUigiaGlibWNfZmJkZXZfZGVzdHJveVxuIik7Cj4+ Cj4+Cj4+IE5vdCB1c2VmdWwKPgo+Cj4gb2ssIHdpbGwgcmVtb3ZlLgo+Cj4KPj4KPj4+ICsKPj4+ ICsgICAgICAgZHJtX2ZiX2hlbHBlcl91bnJlZ2lzdGVyX2ZiaShmYmgpOwo+Pj4gKyAgICAgICBk cm1fZmJfaGVscGVyX3JlbGVhc2VfZmJpKGZiaCk7Cj4+PiArCj4+PiArICAgICAgIGRybV9mYl9o ZWxwZXJfZmluaShmYmgpOwo+Pj4gKwo+Pj4gKyAgICAgICBpZiAoZ2ZiKQo+Pj4gKyAgICAgICAg ICAgICAgIGRybV9mcmFtZWJ1ZmZlcl91bnJlZmVyZW5jZSgmZ2ZiLT5mYik7Cj4+PiArCj4+PiAr ICAgICAgIGtmcmVlKGZiZGV2KTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGNvbnN0IHN0cnVj dCBkcm1fZmJfaGVscGVyX2Z1bmNzIGhpYm1jX2ZiZGV2X2hlbHBlcl9mdW5jcyA9IHsKPj4+ICsg ICAgICAgLmZiX3Byb2JlID0gaGlibWNfZHJtX2ZiX2NyZWF0ZSwKPj4+ICt9Owo+Pj4gKwo+Pj4g K2ludCBoaWJtY19mYmRldl9pbml0KHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRldikKPj4+ ICt7Cj4+PiArICAgICAgIGludCByZXQ7Cj4+PiArICAgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVu aW5mbyAqdmFyOwo+Pj4gKyAgICAgICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeDsKPj4+ ICsgICAgICAgc3RydWN0IGhpYm1jX2ZiZGV2ICpoaWZiZGV2Owo+Pj4gKwo+Pj4gKyAgICAgICBo aWZiZGV2ID0ga3phbGxvYyhzaXplb2YoKmhpZmJkZXYpLCBHRlBfS0VSTkVMKTsKPj4KPj4KPj4g ZGV2bV9remFsbG9jPwo+Cj4KPiBzb3VuZHMgZ29vZCwgc28gdGhlcmUgbmVlZCBubyBrZnJlZSBh dCBoaWJtY19mYmRldl9kZXN0cm95KCksCj4gdGhhbmtzLgo+Cgp5ZXAsIGV4YWN0bHkKCj4+Cj4+ PiArICAgICAgIGlmICghaGlmYmRldikKPj4+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVOT01F TTsKPj4+ICsKPj4+ICsgICAgICAgaGlkZXYtPmZiZGV2ID0gaGlmYmRldjsKPj4+ICsgICAgICAg ZHJtX2ZiX2hlbHBlcl9wcmVwYXJlKGhpZGV2LT5kZXYsICZoaWZiZGV2LT5oZWxwZXIsCj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlibWNfZmJkZXZfaGVscGVyX2Z1bmNzKTsK Pj4+ICsKPj4+ICsgICAgICAgLyogTm93IGp1c3Qgb25lIGNydGMgYW5kIG9uZSBjaGFubmVsICov Cj4+PiArICAgICAgIHJldCA9IGRybV9mYl9oZWxwZXJfaW5pdChoaWRldi0+ZGV2LAo+Pj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpZmJkZXYtPmhlbHBlciwgMSwgMSk7Cj4+ PiArCj4+Cj4+Cj4+IG5pdDogZXh0cmEgbGluZQo+Cj4KPiBvaywgdGhhbmtzLgo+Cj4KPj4KPj4+ ICsgICAgICAgaWYgKHJldCkKPj4+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gKwo+ Pj4gKyAgICAgICByZXQgPSBkcm1fZmJfaGVscGVyX3NpbmdsZV9hZGRfYWxsX2Nvbm5lY3RvcnMo JmhpZmJkZXYtPmhlbHBlcik7Cj4+PiArICAgICAgIGlmIChyZXQpCj4+PiArICAgICAgICAgICAg ICAgZ290byBmaW5pOwo+Pj4gKwo+Pj4gKyAgICAgICByZXQgPSBkcm1fZmJfaGVscGVyX2luaXRp YWxfY29uZmlnKCZoaWZiZGV2LT5oZWxwZXIsIDE2KTsKPj4+ICsgICAgICAgaWYgKHJldCkKPj4+ ICsgICAgICAgICAgICAgICBnb3RvIGZpbmk7Cj4+PiArCj4+PiArICAgICAgIHZhciA9ICZoaWZi ZGV2LT5oZWxwZXIuZmJkZXYtPnZhcjsKPj4+ICsgICAgICAgZml4ID0gJmhpZmJkZXYtPmhlbHBl ci5mYmRldi0+Zml4Owo+Pj4gKwo+Pj4gKyAgICAgICBEUk1fREVCVUcoIk1lbWJlciBvZiBpbmZv LT52YXIgaXMgOlxuIgo+Pj4gKyAgICAgICAgICAgICAgICAieHJlcz0lZFxuIgo+Pj4gKyAgICAg ICAgICAgICAgICAieXJlcz0lZFxuIgo+Pj4gKyAgICAgICAgICAgICAgICAieHJlc192aXJ0dWFs PSVkXG4iCj4+PiArICAgICAgICAgICAgICAgICJ5cmVzX3ZpcnR1YWw9JWRcbiIKPj4+ICsgICAg ICAgICAgICAgICAgInhvZmZzZXQ9JWRcbiIKPj4+ICsgICAgICAgICAgICAgICAgInlvZmZzZXQ9 JWRcbiIKPj4+ICsgICAgICAgICAgICAgICAgImJpdHNfcGVyX3BpeGVsPSVkXG4iCj4+PiArICAg ICAgICAgICAgICAgICIuLi5cbiIsIHZhci0+eHJlcywgdmFyLT55cmVzLCB2YXItPnhyZXNfdmly dHVhbCwKPj4+ICsgICAgICAgICAgICAgICAgdmFyLT55cmVzX3ZpcnR1YWwsIHZhci0+eG9mZnNl dCwgdmFyLT55b2Zmc2V0LAo+Pj4gKyAgICAgICAgICAgICAgICB2YXItPmJpdHNfcGVyX3BpeGVs KTsKPj4+ICsgICAgICAgRFJNX0RFQlVHKCJNZW1iZXIgb2YgaW5mby0+Zml4IGlzIDpcbiIKPj4+ ICsgICAgICAgICAgICAgICAgInNtZW1fc3RhcnQ9JWx4XG4iCj4+PiArICAgICAgICAgICAgICAg ICJzbWVtX2xlbj0lZFxuIgo+Pj4gKyAgICAgICAgICAgICAgICAidHlwZT0lZFxuIgo+Pj4gKyAg ICAgICAgICAgICAgICAidHlwZV9hdXg9JWRcbiIKPj4+ICsgICAgICAgICAgICAgICAgInZpc3Vh bD0lZFxuIgo+Pj4gKyAgICAgICAgICAgICAgICAieHBhbnN0ZXA9JWRcbiIKPj4+ICsgICAgICAg ICAgICAgICAgInlwYW5zdGVwPSVkXG4iCj4+PiArICAgICAgICAgICAgICAgICJ5d3JhcHN0ZXA9 JWRcbiIKPj4+ICsgICAgICAgICAgICAgICAgImxpbmVfbGVuZ3RoPSVkXG4iCj4+PiArICAgICAg ICAgICAgICAgICJhY2NlbD0lZFxuIgo+Pj4gKyAgICAgICAgICAgICAgICAiY2FwYWJpbGl0aWVz PSVkXG4iCj4+PiArICAgICAgICAgICAgICAgICIuLi5cbiIsIGZpeC0+c21lbV9zdGFydCwgZml4 LT5zbWVtX2xlbiwgZml4LT50eXBlLAo+Pj4gKyAgICAgICAgICAgICAgICBmaXgtPnR5cGVfYXV4 LCBmaXgtPnZpc3VhbCwgZml4LT54cGFuc3RlcCwKPj4+ICsgICAgICAgICAgICAgICAgZml4LT55 cGFuc3RlcCwgZml4LT55d3JhcHN0ZXAsIGZpeC0+bGluZV9sZW5ndGgsCj4+PiArICAgICAgICAg ICAgICAgIGZpeC0+YWNjZWwsIGZpeC0+Y2FwYWJpbGl0aWVzKTsKPj4KPj4KPj4gWW91J3ZlIGJl ZW4gdXNpbmcgRFJNX0RFQlVHX0RSSVZFUiBlbHNld2hlcmUsIHlvdSBzaG91bGQgcHJvYmFibHkg dXNlCj4+IGl0IGhlcmUsIHRvby4KPgo+Cj4gb2ssIHRoYW5rcy4KPgo+Cj4+Cj4+PiArCj4+PiAr ICAgICAgIHJldHVybiAwOwo+Pj4gKwo+Pj4gK2Zpbmk6Cj4+PiArICAgICAgIGRybV9mYl9oZWxw ZXJfZmluaSgmaGlmYmRldi0+aGVscGVyKTsKPj4+ICsgICAgICAgcmV0dXJuIHJldDsKPj4+ICt9 Cj4+PiArCj4+PiArdm9pZCBoaWJtY19mYmRldl9maW5pKHN0cnVjdCBoaWJtY19kcm1fZGV2aWNl ICpoaWRldikKPj4+ICt7Cj4+PiArICAgICAgIGlmICghaGlkZXYtPmZiZGV2KQo+Pj4gKyAgICAg ICAgICAgICAgIHJldHVybjsKPj4+ICsKPj4+ICsgICAgICAgaGlibWNfZmJkZXZfZGVzdHJveSho aWRldi0+ZmJkZXYpOwo+Pj4gKyAgICAgICBoaWRldi0+ZmJkZXYgPSBOVUxMOwo+Pj4gK30KPj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX3R0bS5j Cj4+PiBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfdHRtLmMKPj4+IGlu ZGV4IDA4MDJlYmQuLjk4MjJmNjIgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaGlz aWxpY29uL2hpYm1jL2hpYm1jX3R0bS5jCj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxp Y29uL2hpYm1jL2hpYm1jX3R0bS5jCj4+PiBAQCAtNDg4LDMgKzQ4OCw2OSBAQCBpbnQgaGlibWNf ZHVtYl9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCj4+PiBzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LAo+Pj4gICAgICAgICAgZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2Nr ZWQob2JqKTsKPj4+ICAgICAgICAgIHJldHVybiAwOwo+Pj4gICB9Cj4+PiArCj4+PiArLyoKPj4+ IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0gKi8KPj4+ICsKPj4KPj4KPj4gUGxlYXNlIHJlbW92ZQo+Cj4KPiB3aWxs IGRvLgo+Cj4+Cj4+PiArc3RhdGljIHZvaWQgaGlibWNfdXNlcl9mcmFtZWJ1ZmZlcl9kZXN0cm95 KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQo+Pj4gK3sKPj4+ICsgICAgICAgc3RydWN0IGhp Ym1jX2ZyYW1lYnVmZmVyICpoaWJtY19mYiA9IHRvX2hpYm1jX2ZyYW1lYnVmZmVyKGZiKTsKPj4+ ICsKPj4+ICsgICAgICAgZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoaGlibWNf ZmItPm9iaik7Cj4+PiArICAgICAgIGRybV9mcmFtZWJ1ZmZlcl9jbGVhbnVwKGZiKTsKPj4+ICsg ICAgICAga2ZyZWUoaGlibWNfZmIpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IGRybV9mcmFtZWJ1ZmZlcl9mdW5jcyBoaWJtY19mYl9mdW5jcyA9IHsKPj4+ICsgICAgICAg LmRlc3Ryb3kgPSBoaWJtY191c2VyX2ZyYW1lYnVmZmVyX2Rlc3Ryb3ksCj4+PiArfTsKPj4+ICsK Pj4+ICtzdHJ1Y3QgaGlibWNfZnJhbWVidWZmZXIgKgo+Pj4gK2hpYm1jX2ZyYW1lYnVmZmVyX2lu aXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgY29u c3Qgc3RydWN0IGRybV9tb2RlX2ZiX2NtZDIgKm1vZGVfY21kLAo+Pj4gKyAgICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKPj4+ICt7Cj4+PiArICAgICAgIHN0 cnVjdCBoaWJtY19mcmFtZWJ1ZmZlciAqaGlibWNfZmI7Cj4+PiArICAgICAgIGludCByZXQ7Cj4+ PiArCj4+PiArICAgICAgIGhpYm1jX2ZiID0ga3phbGxvYyhzaXplb2YoKmhpYm1jX2ZiKSwgR0ZQ X0tFUk5FTCk7Cj4+PiArICAgICAgIGlmICghaGlibWNfZmIpCj4+Cj4+Cj4+IFByaW50IGVycm9y Cj4KPgo+IG9rLCB0aGFua3MuCj4KPiBSZWdhcmRzLAo+IFJvbmdyb25nLgo+Cj4+Cj4+PiArICAg ICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4+PiArCj4+PiArICAgICAgIGRy bV9oZWxwZXJfbW9kZV9maWxsX2ZiX3N0cnVjdCgmaGlibWNfZmItPmZiLCBtb2RlX2NtZCk7Cj4+ PiArICAgICAgIGhpYm1jX2ZiLT5vYmogPSBvYmo7Cj4+PiArICAgICAgIHJldCA9IGRybV9mcmFt ZWJ1ZmZlcl9pbml0KGRldiwgJmhpYm1jX2ZiLT5mYiwgJmhpYm1jX2ZiX2Z1bmNzKTsKPj4+ICsg ICAgICAgaWYgKHJldCkgewo+Pj4gKyAgICAgICAgICAgICAgIERSTV9FUlJPUigiZHJtX2ZyYW1l YnVmZmVyX2luaXQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKPj4+ICsgICAgICAgICAgICAgICBrZnJl ZShoaWJtY19mYik7Cj4+PiArICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIocmV0KTsKPj4+ ICsgICAgICAgfQo+Pj4gKwo+Pj4gKyAgICAgICByZXR1cm4gaGlibWNfZmI7Cj4+PiArfQo+Pj4g Kwo+Pj4gK3N0YXRpYyBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICoKPj4+ICtoaWJtY191c2VyX2Zy YW1lYnVmZmVyX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAo+Pj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxwLAo+Pj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRybV9tb2RlX2ZiX2NtZDIgKm1vZGVfY21k KQo+Pj4gK3sKPj4+ICsgICAgICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Cj4+PiArICAg ICAgIHN0cnVjdCBoaWJtY19mcmFtZWJ1ZmZlciAqaGlibWNfZmI7Cj4+PiArCj4+PiArICAgICAg IERSTV9ERUJVR19EUklWRVIoIiVkeCVkLCBmb3JtYXQgJWMlYyVjJWNcbiIsCj4+PiArICAgICAg ICAgICAgICAgICAgICAgICAgbW9kZV9jbWQtPndpZHRoLCBtb2RlX2NtZC0+aGVpZ2h0LAo+Pj4g KyAgICAgICAgICAgICAgICAgICAgICAgIChtb2RlX2NtZC0+cGl4ZWxfZm9ybWF0KSAmIDB4ZmYs Cj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGVfY21kLT5waXhlbF9mb3JtYXQgPj4g OCkgICYgMHhmZiwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAobW9kZV9jbWQtPnBpeGVs X2Zvcm1hdCA+PiAxNikgJiAweGZmLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgIChtb2Rl X2NtZC0+cGl4ZWxfZm9ybWF0ID4+IDI0KSAmIDB4ZmYpOwo+Pj4gKwo+Pj4gKyAgICAgICBvYmog PSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZmlscCwgbW9kZV9jbWQtPmhhbmRsZXNbMF0pOwo+Pj4g KyAgICAgICBpZiAoIW9iaikKPj4+ICsgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUUigtRU5P RU5UKTsKPj4+ICsKPj4+ICsgICAgICAgaGlibWNfZmIgPSBoaWJtY19mcmFtZWJ1ZmZlcl9pbml0 KGRldiwgbW9kZV9jbWQsIG9iaik7Cj4+PiArICAgICAgIGlmIChJU19FUlIoaGlibWNfZmIpKSB7 Cj4+PiArICAgICAgICAgICAgICAgZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQo b2JqKTsKPj4+ICsgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUUigobG9uZyloaWJtY19mYik7 Cj4+PiArICAgICAgIH0KPj4+ICsgICAgICAgcmV0dXJuICZoaWJtY19mYi0+ZmI7Cj4+PiArfQo+ Pj4gLS0KPj4+IDEuOS4xCj4+Pgo+Pj4KPj4+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCj4+PiBsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAo+Pj4g bGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCj4+PiBodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwKPj4KPj4gX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPj4gbGludXhhcm0gbWFp bGluZyBsaXN0Cj4+IGxpbnV4YXJtQGh1YXdlaS5jb20KPj4gaHR0cDovL3JuZC1vcGVuZXVsZXIu aHVhd2VpLmNvbS9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4YXJtCj4+Cj4+IC4KPj4KPgo+IF9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gbGludXgtYXJtLWtl cm5lbCBtYWlsaW5nIGxpc3QKPiBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcK PiBodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1r ZXJuZWwKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJp LWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBz Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==