From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 63FBBC282DA for ; Wed, 17 Apr 2019 07:57:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1EF2920821 for ; Wed, 17 Apr 2019 07:57:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731493AbfDQH5F (ORCPT ); Wed, 17 Apr 2019 03:57:05 -0400 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:46209 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726895AbfDQHzE (ORCPT ); Wed, 17 Apr 2019 03:55:04 -0400 X-Originating-IP: 90.88.160.238 Received: from localhost (aaubervilliers-681-1-42-238.w90-88.abo.wanadoo.fr [90.88.160.238]) (Authenticated sender: maxime.ripard@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 3DD56E0004; Wed, 17 Apr 2019 07:55:00 +0000 (UTC) From: Maxime Ripard To: Daniel Vetter , David Airlie , Maarten Lankhorst , Sean Paul , Maxime Ripard , Mauro Carvalho Chehab Cc: Sakari Ailus , Hans Verkuil , Laurent Pinchart , Thomas Petazzoni , Paul Kocialkowski , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Emil Velikov Subject: [PATCH 03/20] drm/fourcc: Pass the format_info pointer to drm_format_plane_cpp Date: Wed, 17 Apr 2019 09:54:29 +0200 Message-Id: <35c8b9939b2e306684463f91b1f491a8a162ba9c.1555487650.git-series.maxime.ripard@bootlin.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org So far, the drm_format_plane_cpp function was operating on the format's fourcc and was doing a lookup to retrieve the drm_format_info structure and return the cpp. However, this is inefficient since in most cases, we will have the drm_format_info pointer already available so we shouldn't have to perform a new lookup. Some drm_fourcc functions also already operate on the drm_format_info pointer for that reason, so the API is quite inconsistent there. Let's follow the latter pattern and remove the extra lookup while being a bit more consistent. In order to be extra consistent, also rename that function to drm_format_info_plane_cpp and to a static function in the header to match the current policy. Reviewed-by: Emil Velikov Signed-off-by: Maxime Ripard --- drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 4 +++- drivers/gpu/drm/arm/malidp_hw.c | 3 ++- drivers/gpu/drm/arm/malidp_planes.c | 2 +- drivers/gpu/drm/drm_client.c | 3 ++- drivers/gpu/drm/drm_fb_helper.c | 2 +- drivers/gpu/drm/drm_format_helper.c | 4 ++-- drivers/gpu/drm/drm_fourcc.c | 20 -------------------- drivers/gpu/drm/i915/intel_sprite.c | 3 ++- drivers/gpu/drm/mediatek/mtk_drm_fb.c | 2 +- drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c | 3 ++- drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c | 2 +- drivers/gpu/drm/msm/msm_fb.c | 2 +- drivers/gpu/drm/radeon/radeon_fb.c | 4 +++- drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 2 +- drivers/gpu/drm/stm/ltdc.c | 2 +- drivers/gpu/drm/tegra/fb.c | 2 +- drivers/gpu/drm/zte/zx_plane.c | 2 +- include/drm/drm_fourcc.h | 18 +++++++++++++++++- 18 files changed, 42 insertions(+), 38 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c index e47609218839..06e73a343724 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c @@ -121,6 +121,8 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev, struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **gobj_p) { + const struct drm_format_info *info = drm_get_format_info(dev, + mode_cmd); struct amdgpu_device *adev = rfbdev->adev; struct drm_gem_object *gobj = NULL; struct amdgpu_bo *abo = NULL; @@ -131,7 +133,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev, int height = mode_cmd->height; u32 cpp; - cpp = drm_format_plane_cpp(mode_cmd->pixel_format, 0); + cpp = drm_format_info_plane_cpp(info, 0); /* need to align pitch with crtc limits */ mode_cmd->pitches[0] = amdgpu_align_pitch(adev, mode_cmd->width, cpp, diff --git a/drivers/gpu/drm/arm/malidp_hw.c b/drivers/gpu/drm/arm/malidp_hw.c index 8df12e9a33bb..1c9e869f4c52 100644 --- a/drivers/gpu/drm/arm/malidp_hw.c +++ b/drivers/gpu/drm/arm/malidp_hw.c @@ -382,7 +382,8 @@ static void malidp500_modeset(struct malidp_hw_device *hwdev, struct videomode * int malidp_format_get_bpp(u32 fmt) { - int bpp = drm_format_plane_cpp(fmt, 0) * 8; + const struct drm_format_info *info = drm_format_info(fmt); + int bpp = drm_format_info_plane_cpp(info, 0) * 8; if (bpp == 0) { switch (fmt) { diff --git a/drivers/gpu/drm/arm/malidp_planes.c b/drivers/gpu/drm/arm/malidp_planes.c index 8f89813d08c1..361c02988375 100644 --- a/drivers/gpu/drm/arm/malidp_planes.c +++ b/drivers/gpu/drm/arm/malidp_planes.c @@ -227,7 +227,7 @@ bool malidp_format_mod_supported(struct drm_device *drm, if (modifier & AFBC_SPLIT) { if (!info->is_yuv) { - if (drm_format_plane_cpp(format, 0) <= 2) { + if (drm_format_info_plane_cpp(info, 0) <= 2) { DRM_DEBUG_KMS("RGB formats <= 16bpp are not supported with SPLIT\n"); return false; } diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c index f20d1dda3961..169d8eeaa662 100644 --- a/drivers/gpu/drm/drm_client.c +++ b/drivers/gpu/drm/drm_client.c @@ -243,6 +243,7 @@ static void drm_client_buffer_delete(struct drm_client_buffer *buffer) static struct drm_client_buffer * drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format) { + const struct drm_format_info *info = drm_format_info(format); struct drm_mode_create_dumb dumb_args = { }; struct drm_device *dev = client->dev; struct drm_client_buffer *buffer; @@ -258,7 +259,7 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u dumb_args.width = width; dumb_args.height = height; - dumb_args.bpp = drm_format_plane_cpp(format, 0) * 8; + dumb_args.bpp = drm_format_info_plane_cpp(info, 0) * 8; ret = drm_mode_create_dumb(dev, &dumb_args, client->file); if (ret) goto err_delete; diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 4de4b9d59d49..4fcbb9caaf68 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -767,7 +767,7 @@ static void drm_fb_helper_dirty_blit_real(struct drm_fb_helper *fb_helper, struct drm_clip_rect *clip) { struct drm_framebuffer *fb = fb_helper->fb; - unsigned int cpp = drm_format_plane_cpp(fb->format->format, 0); + unsigned int cpp = drm_format_info_plane_cpp(fb->format, 0); size_t offset = clip->y1 * fb->pitches[0] + clip->x1 * cpp; void *src = fb_helper->fbdev->screen_buffer + offset; void *dst = fb_helper->buffer->vaddr + offset; diff --git a/drivers/gpu/drm/drm_format_helper.c b/drivers/gpu/drm/drm_format_helper.c index da388012df2a..14d85eb1989d 100644 --- a/drivers/gpu/drm/drm_format_helper.c +++ b/drivers/gpu/drm/drm_format_helper.c @@ -36,7 +36,7 @@ static unsigned int clip_offset(struct drm_rect *clip, void drm_fb_memcpy(void *dst, void *vaddr, struct drm_framebuffer *fb, struct drm_rect *clip) { - unsigned int cpp = drm_format_plane_cpp(fb->format->format, 0); + unsigned int cpp = drm_format_info_plane_cpp(fb->format, 0); size_t len = (clip->x2 - clip->x1) * cpp; unsigned int y, lines = clip->y2 - clip->y1; @@ -63,7 +63,7 @@ void drm_fb_memcpy_dstclip(void __iomem *dst, void *vaddr, struct drm_framebuffer *fb, struct drm_rect *clip) { - unsigned int cpp = drm_format_plane_cpp(fb->format->format, 0); + unsigned int cpp = drm_format_info_plane_cpp(fb->format, 0); unsigned int offset = clip_offset(clip, fb->pitches[0], cpp); size_t len = (clip->x2 - clip->x1) * cpp; unsigned int y, lines = clip->y2 - clip->y1; diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c index e4a2c8372c8b..5f63fc74e265 100644 --- a/drivers/gpu/drm/drm_fourcc.c +++ b/drivers/gpu/drm/drm_fourcc.c @@ -333,26 +333,6 @@ drm_get_format_info(struct drm_device *dev, EXPORT_SYMBOL(drm_get_format_info); /** - * drm_format_plane_cpp - determine the bytes per pixel value - * @format: pixel format (DRM_FORMAT_*) - * @plane: plane index - * - * Returns: - * The bytes per pixel value for the specified plane. - */ -int drm_format_plane_cpp(uint32_t format, int plane) -{ - const struct drm_format_info *info; - - info = drm_format_info(format); - if (!info || plane >= info->num_planes) - return 0; - - return info->cpp[plane]; -} -EXPORT_SYMBOL(drm_format_plane_cpp); - -/** * drm_format_plane_width - width of the plane given the first plane * @width: width of the first plane * @format: pixel format diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index 2913e89280d7..e35601b1f878 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c @@ -325,7 +325,8 @@ skl_plane_max_stride(struct intel_plane *plane, u32 pixel_format, u64 modifier, unsigned int rotation) { - int cpp = drm_format_plane_cpp(pixel_format, 0); + const struct drm_format_info *info = drm_format_info(pixel_format); + int cpp = drm_format_info_plane_cpp(info, 0); /* * "The stride in bytes must not exceed the diff --git a/drivers/gpu/drm/mediatek/mtk_drm_fb.c b/drivers/gpu/drm/mediatek/mtk_drm_fb.c index 68fdef8b12bd..0d5334a5a9a7 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_fb.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_fb.c @@ -104,7 +104,7 @@ struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev, if (!gem) return ERR_PTR(-ENOENT); - bpp = drm_format_plane_cpp(cmd->pixel_format, 0); + bpp = drm_format_info_plane_cpp(info, 0); size = (height - 1) * cmd->pitches[0] + width * bpp; size += cmd->offsets[0]; diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c index b0cf63c4e3d7..a565dccaba3a 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c @@ -782,6 +782,7 @@ static void get_roi(struct drm_crtc *crtc, uint32_t *roi_w, uint32_t *roi_h) static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc) { + const struct drm_format_info *info = drm_format_info(DRM_FORMAT_ARGB8888); struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); struct mdp5_kms *mdp5_kms = get_kms(crtc); @@ -800,7 +801,7 @@ static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc) width = mdp5_crtc->cursor.width; height = mdp5_crtc->cursor.height; - stride = width * drm_format_plane_cpp(DRM_FORMAT_ARGB8888, 0); + stride = width * drm_format_info_plane_cpp(info, 0); get_roi(crtc, &roi_w, &roi_h); diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c index b30b2f4efc60..1ca294694597 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c @@ -158,7 +158,7 @@ uint32_t mdp5_smp_calculate(struct mdp5_smp *smp, for (i = 0; i < nplanes; i++) { int n, fetch_stride, cpp; - cpp = drm_format_plane_cpp(fmt, i); + cpp = drm_format_info_plane_cpp(info, i); fetch_stride = width * cpp / (i ? hsub : 1); n = DIV_ROUND_UP(fetch_stride * nlines, smp->blk_size); diff --git a/drivers/gpu/drm/msm/msm_fb.c b/drivers/gpu/drm/msm/msm_fb.c index f69c0afd6ec6..29e45f2144b5 100644 --- a/drivers/gpu/drm/msm/msm_fb.c +++ b/drivers/gpu/drm/msm/msm_fb.c @@ -181,7 +181,7 @@ static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev, unsigned int min_size; min_size = (height - 1) * mode_cmd->pitches[i] - + width * drm_format_plane_cpp(mode_cmd->pixel_format, i) + + width * drm_format_info_plane_cpp(info, i) + mode_cmd->offsets[i]; if (bos[i]->size < min_size) { diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 1298b84cb1c7..dbf596fc4339 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c @@ -125,6 +125,7 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev, struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **gobj_p) { + const struct drm_format_info *info; struct radeon_device *rdev = rfbdev->rdev; struct drm_gem_object *gobj = NULL; struct radeon_bo *rbo = NULL; @@ -135,7 +136,8 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev, int height = mode_cmd->height; u32 cpp; - cpp = drm_format_plane_cpp(mode_cmd->pixel_format, 0); + info = drm_get_format_info(rdev->ddev, mode_cmd); + cpp = drm_format_info_plane_cpp(info, 0); /* need to align pitch with crtc limits */ mode_cmd->pitches[0] = radeon_align_pitch(rdev, mode_cmd->width, cpp, diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c index c318fae28581..57873c99ae29 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c @@ -98,7 +98,7 @@ rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, min_size = (height - 1) * mode_cmd->pitches[i] + mode_cmd->offsets[i] + - width * drm_format_plane_cpp(mode_cmd->pixel_format, i); + width * drm_format_info_plane_cpp(info, i); if (obj->size < min_size) { drm_gem_object_put_unlocked(obj); diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c index 32fd6a3b37fb..6bb3cd3a1a01 100644 --- a/drivers/gpu/drm/stm/ltdc.c +++ b/drivers/gpu/drm/stm/ltdc.c @@ -779,7 +779,7 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, /* Configures the color frame buffer pitch in bytes & line length */ pitch_in_bytes = fb->pitches[0]; - line_length = drm_format_plane_cpp(fb->format->format, 0) * + line_length = drm_format_info_plane_cpp(fb->format, 0) * (x1 - x0 + 1) + (ldev->caps.bus_width >> 3) - 1; val = ((pitch_in_bytes << 16) | line_length); reg_update_bits(ldev->regs, LTDC_L1CFBLR + lofs, diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c index 94fb75089d87..d1042196a30f 100644 --- a/drivers/gpu/drm/tegra/fb.c +++ b/drivers/gpu/drm/tegra/fb.c @@ -149,7 +149,7 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm, goto unreference; } - bpp = drm_format_plane_cpp(cmd->pixel_format, i); + bpp = drm_format_info_plane_cpp(info, i); size = (height - 1) * cmd->pitches[i] + width * bpp + cmd->offsets[i]; diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c index c6a8be444300..d97a4dff515d 100644 --- a/drivers/gpu/drm/zte/zx_plane.c +++ b/drivers/gpu/drm/zte/zx_plane.c @@ -222,7 +222,7 @@ static void zx_vl_plane_atomic_update(struct drm_plane *plane, cma_obj = drm_fb_cma_get_gem_obj(fb, i); paddr = cma_obj->paddr + fb->offsets[i]; paddr += src_y * fb->pitches[i]; - paddr += src_x * drm_format_plane_cpp(format, i); + paddr += src_x * drm_format_info_plane_cpp(fb->format, i); zx_writel(paddr_reg, paddr); paddr_reg += 4; } diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h index eeec449d6c6a..6b5a82b31bc4 100644 --- a/include/drm/drm_fourcc.h +++ b/include/drm/drm_fourcc.h @@ -260,6 +260,23 @@ drm_format_info_is_yuv_sampling_444(const struct drm_format_info *info) return info->is_yuv && info->hsub == 1 && info->vsub == 1; } +/** + * drm_format_info_plane_cpp - determine the bytes per pixel value + * @format: pixel format info + * @plane: plane index + * + * Returns: + * The bytes per pixel value for the specified plane. + */ +static inline +int drm_format_info_plane_cpp(const struct drm_format_info *info, int plane) +{ + if (!info || plane >= info->num_planes) + return 0; + + return info->cpp[plane]; +} + const struct drm_format_info *__drm_format_info(u32 format); const struct drm_format_info *drm_format_info(u32 format); const struct drm_format_info * @@ -268,7 +285,6 @@ drm_get_format_info(struct drm_device *dev, uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth); uint32_t drm_driver_legacy_fb_format(struct drm_device *dev, uint32_t bpp, uint32_t depth); -int drm_format_plane_cpp(uint32_t format, int plane); int drm_format_plane_width(int width, uint32_t format, int plane); int drm_format_plane_height(int height, uint32_t format, int plane); unsigned int drm_format_info_block_width(const struct drm_format_info *info, -- git-series 0.9.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maxime Ripard Subject: [PATCH 03/20] drm/fourcc: Pass the format_info pointer to drm_format_plane_cpp Date: Wed, 17 Apr 2019 09:54:29 +0200 Message-ID: <35c8b9939b2e306684463f91b1f491a8a162ba9c.1555487650.git-series.maxime.ripard@bootlin.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [217.70.183.196]) by gabe.freedesktop.org (Postfix) with ESMTPS id A065789E50 for ; Wed, 17 Apr 2019 07:55:03 +0000 (UTC) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter , David Airlie , Maarten Lankhorst , Sean Paul , Maxime Ripard , Mauro Carvalho Chehab Cc: Sakari Ailus , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Paul Kocialkowski , Hans Verkuil , Laurent Pinchart , Thomas Petazzoni , Emil Velikov , linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org U28gZmFyLCB0aGUgZHJtX2Zvcm1hdF9wbGFuZV9jcHAgZnVuY3Rpb24gd2FzIG9wZXJhdGluZyBv biB0aGUgZm9ybWF0J3MKZm91cmNjIGFuZCB3YXMgZG9pbmcgYSBsb29rdXAgdG8gcmV0cmlldmUg dGhlIGRybV9mb3JtYXRfaW5mbyBzdHJ1Y3R1cmUgYW5kCnJldHVybiB0aGUgY3BwLgoKSG93ZXZl ciwgdGhpcyBpcyBpbmVmZmljaWVudCBzaW5jZSBpbiBtb3N0IGNhc2VzLCB3ZSB3aWxsIGhhdmUg dGhlCmRybV9mb3JtYXRfaW5mbyBwb2ludGVyIGFscmVhZHkgYXZhaWxhYmxlIHNvIHdlIHNob3Vs ZG4ndCBoYXZlIHRvIHBlcmZvcm0gYQpuZXcgbG9va3VwLiBTb21lIGRybV9mb3VyY2MgZnVuY3Rp b25zIGFsc28gYWxyZWFkeSBvcGVyYXRlIG9uIHRoZQpkcm1fZm9ybWF0X2luZm8gcG9pbnRlciBm b3IgdGhhdCByZWFzb24sIHNvIHRoZSBBUEkgaXMgcXVpdGUgaW5jb25zaXN0ZW50CnRoZXJlLgoK TGV0J3MgZm9sbG93IHRoZSBsYXR0ZXIgcGF0dGVybiBhbmQgcmVtb3ZlIHRoZSBleHRyYSBsb29r dXAgd2hpbGUgYmVpbmcgYQpiaXQgbW9yZSBjb25zaXN0ZW50LiBJbiBvcmRlciB0byBiZSBleHRy YSBjb25zaXN0ZW50LCBhbHNvIHJlbmFtZSB0aGF0CmZ1bmN0aW9uIHRvIGRybV9mb3JtYXRfaW5m b19wbGFuZV9jcHAgYW5kIHRvIGEgc3RhdGljIGZ1bmN0aW9uIGluIHRoZQpoZWFkZXIgdG8gbWF0 Y2ggdGhlIGN1cnJlbnQgcG9saWN5LgoKUmV2aWV3ZWQtYnk6IEVtaWwgVmVsaWtvdiA8ZW1pbC52 ZWxpa292QGNvbGxhYm9yYS5jb20+ClNpZ25lZC1vZmYtYnk6IE1heGltZSBSaXBhcmQgPG1heGlt ZS5yaXBhcmRAYm9vdGxpbi5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1k Z3B1X2ZiLmMgICAgIHwgIDQgKysrLQogZHJpdmVycy9ncHUvZHJtL2FybS9tYWxpZHBfaHcuYyAg ICAgICAgICAgIHwgIDMgKystCiBkcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9wbGFuZXMuYyAg ICAgICAgfCAgMiArLQogZHJpdmVycy9ncHUvZHJtL2RybV9jbGllbnQuYyAgICAgICAgICAgICAg IHwgIDMgKystCiBkcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jICAgICAgICAgICAgfCAg MiArLQogZHJpdmVycy9ncHUvZHJtL2RybV9mb3JtYXRfaGVscGVyLmMgICAgICAgIHwgIDQgKyst LQogZHJpdmVycy9ncHUvZHJtL2RybV9mb3VyY2MuYyAgICAgICAgICAgICAgIHwgMjAgLS0tLS0t LS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nwcml0ZS5jICAgICAg ICB8ICAzICsrLQogZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZmIuYyAgICAgIHwg IDIgKy0KIGRyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfY3J0Yy5jICB8ICAzICsr LQogZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDUvbWRwNV9zbXAuYyAgIHwgIDIgKy0KIGRy aXZlcnMvZ3B1L2RybS9tc20vbXNtX2ZiLmMgICAgICAgICAgICAgICB8ICAyICstCiBkcml2ZXJz L2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYi5jICAgICAgICAgfCAgNCArKystCiBkcml2ZXJzL2dw dS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2ZiLmMgfCAgMiArLQogZHJpdmVycy9ncHUvZHJt L3N0bS9sdGRjLmMgICAgICAgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvZ3B1L2RybS90ZWdy YS9mYi5jICAgICAgICAgICAgICAgICB8ICAyICstCiBkcml2ZXJzL2dwdS9kcm0venRlL3p4X3Bs YW5lLmMgICAgICAgICAgICAgfCAgMiArLQogaW5jbHVkZS9kcm0vZHJtX2ZvdXJjYy5oICAgICAg ICAgICAgICAgICAgIHwgMTggKysrKysrKysrKysrKysrKystCiAxOCBmaWxlcyBjaGFuZ2VkLCA0 MiBpbnNlcnRpb25zKCspLCAzOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1 L2FtZGdwdV9mYi5jCmluZGV4IGU0NzYwOTIxODgzOS4uMDZlNzNhMzQzNzI0IDEwMDY0NAotLS0g YS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZmIuYworKysgYi9kcml2ZXJzL2dw dS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZmIuYwpAQCAtMTIxLDYgKzEyMSw4IEBAIHN0YXRpYyBp bnQgYW1kZ3B1ZmJfY3JlYXRlX3Bpbm5lZF9vYmplY3Qoc3RydWN0IGFtZGdwdV9mYmRldiAqcmZi ZGV2LAogCQkJCQkgc3RydWN0IGRybV9tb2RlX2ZiX2NtZDIgKm1vZGVfY21kLAogCQkJCQkgc3Ry dWN0IGRybV9nZW1fb2JqZWN0ICoqZ29ial9wKQogeworCWNvbnN0IHN0cnVjdCBkcm1fZm9ybWF0 X2luZm8gKmluZm8gPSBkcm1fZ2V0X2Zvcm1hdF9pbmZvKGRldiwKKwkJCQkJCQkJIG1vZGVfY21k KTsKIAlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IHJmYmRldi0+YWRldjsKIAlzdHJ1Y3Qg ZHJtX2dlbV9vYmplY3QgKmdvYmogPSBOVUxMOwogCXN0cnVjdCBhbWRncHVfYm8gKmFibyA9IE5V TEw7CkBAIC0xMzEsNyArMTMzLDcgQEAgc3RhdGljIGludCBhbWRncHVmYl9jcmVhdGVfcGlubmVk X29iamVjdChzdHJ1Y3QgYW1kZ3B1X2ZiZGV2ICpyZmJkZXYsCiAJaW50IGhlaWdodCA9IG1vZGVf Y21kLT5oZWlnaHQ7CiAJdTMyIGNwcDsKIAotCWNwcCA9IGRybV9mb3JtYXRfcGxhbmVfY3BwKG1v ZGVfY21kLT5waXhlbF9mb3JtYXQsIDApOworCWNwcCA9IGRybV9mb3JtYXRfaW5mb19wbGFuZV9j cHAoaW5mbywgMCk7CiAKIAkvKiBuZWVkIHRvIGFsaWduIHBpdGNoIHdpdGggY3J0YyBsaW1pdHMg Ki8KIAltb2RlX2NtZC0+cGl0Y2hlc1swXSA9IGFtZGdwdV9hbGlnbl9waXRjaChhZGV2LCBtb2Rl X2NtZC0+d2lkdGgsIGNwcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRw X2h3LmMgYi9kcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9ody5jCmluZGV4IDhkZjEyZTlhMzNi Yi4uMWM5ZTg2OWY0YzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9o dy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2h3LmMKQEAgLTM4Miw3ICszODIs OCBAQCBzdGF0aWMgdm9pZCBtYWxpZHA1MDBfbW9kZXNldChzdHJ1Y3QgbWFsaWRwX2h3X2Rldmlj ZSAqaHdkZXYsIHN0cnVjdCB2aWRlb21vZGUgKgogCiBpbnQgbWFsaWRwX2Zvcm1hdF9nZXRfYnBw KHUzMiBmbXQpCiB7Ci0JaW50IGJwcCA9IGRybV9mb3JtYXRfcGxhbmVfY3BwKGZtdCwgMCkgKiA4 OworCWNvbnN0IHN0cnVjdCBkcm1fZm9ybWF0X2luZm8gKmluZm8gPSBkcm1fZm9ybWF0X2luZm8o Zm10KTsKKwlpbnQgYnBwID0gZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2NwcChpbmZvLCAwKSAqIDg7 CiAKIAlpZiAoYnBwID09IDApIHsKIAkJc3dpdGNoIChmbXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9hcm0vbWFsaWRwX3BsYW5lcy5jIGIvZHJpdmVycy9ncHUvZHJtL2FybS9tYWxp ZHBfcGxhbmVzLmMKaW5kZXggOGY4OTgxM2QwOGMxLi4zNjFjMDI5ODgzNzUgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX3BsYW5lcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9hcm0vbWFsaWRwX3BsYW5lcy5jCkBAIC0yMjcsNyArMjI3LDcgQEAgYm9vbCBtYWxpZHBfZm9y bWF0X21vZF9zdXBwb3J0ZWQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKIAogCWlmIChtb2RpZmll ciAmIEFGQkNfU1BMSVQpIHsKIAkJaWYgKCFpbmZvLT5pc195dXYpIHsKLQkJCWlmIChkcm1fZm9y bWF0X3BsYW5lX2NwcChmb3JtYXQsIDApIDw9IDIpIHsKKwkJCWlmIChkcm1fZm9ybWF0X2luZm9f cGxhbmVfY3BwKGluZm8sIDApIDw9IDIpIHsKIAkJCQlEUk1fREVCVUdfS01TKCJSR0IgZm9ybWF0 cyA8PSAxNmJwcCBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIFNQTElUXG4iKTsKIAkJCQlyZXR1cm4g ZmFsc2U7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NsaWVudC5jIGIv ZHJpdmVycy9ncHUvZHJtL2RybV9jbGllbnQuYwppbmRleCBmMjBkMWRkYTM5NjEuLjE2OWQ4ZWVh YTY2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jbGllbnQuYworKysgYi9kcml2 ZXJzL2dwdS9kcm0vZHJtX2NsaWVudC5jCkBAIC0yNDMsNiArMjQzLDcgQEAgc3RhdGljIHZvaWQg ZHJtX2NsaWVudF9idWZmZXJfZGVsZXRlKHN0cnVjdCBkcm1fY2xpZW50X2J1ZmZlciAqYnVmZmVy KQogc3RhdGljIHN0cnVjdCBkcm1fY2xpZW50X2J1ZmZlciAqCiBkcm1fY2xpZW50X2J1ZmZlcl9j cmVhdGUoc3RydWN0IGRybV9jbGllbnRfZGV2ICpjbGllbnQsIHUzMiB3aWR0aCwgdTMyIGhlaWdo dCwgdTMyIGZvcm1hdCkKIHsKKwljb25zdCBzdHJ1Y3QgZHJtX2Zvcm1hdF9pbmZvICppbmZvID0g ZHJtX2Zvcm1hdF9pbmZvKGZvcm1hdCk7CiAJc3RydWN0IGRybV9tb2RlX2NyZWF0ZV9kdW1iIGR1 bWJfYXJncyA9IHsgfTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2xpZW50LT5kZXY7CiAJ c3RydWN0IGRybV9jbGllbnRfYnVmZmVyICpidWZmZXI7CkBAIC0yNTgsNyArMjU5LDcgQEAgZHJt X2NsaWVudF9idWZmZXJfY3JlYXRlKHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50LCB1MzIg d2lkdGgsIHUzMiBoZWlnaHQsIHUKIAogCWR1bWJfYXJncy53aWR0aCA9IHdpZHRoOwogCWR1bWJf YXJncy5oZWlnaHQgPSBoZWlnaHQ7Ci0JZHVtYl9hcmdzLmJwcCA9IGRybV9mb3JtYXRfcGxhbmVf Y3BwKGZvcm1hdCwgMCkgKiA4OworCWR1bWJfYXJncy5icHAgPSBkcm1fZm9ybWF0X2luZm9fcGxh bmVfY3BwKGluZm8sIDApICogODsKIAlyZXQgPSBkcm1fbW9kZV9jcmVhdGVfZHVtYihkZXYsICZk dW1iX2FyZ3MsIGNsaWVudC0+ZmlsZSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfZGVsZXRlOwpk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1 L2RybS9kcm1fZmJfaGVscGVyLmMKaW5kZXggNGRlNGI5ZDU5ZDQ5Li40ZmNiYjljYWFmNjggMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKKysrIGIvZHJpdmVycy9n cHUvZHJtL2RybV9mYl9oZWxwZXIuYwpAQCAtNzY3LDcgKzc2Nyw3IEBAIHN0YXRpYyB2b2lkIGRy bV9mYl9oZWxwZXJfZGlydHlfYmxpdF9yZWFsKHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxw ZXIsCiAJCQkJCSAgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXApCiB7CiAJc3RydWN0IGRybV9m cmFtZWJ1ZmZlciAqZmIgPSBmYl9oZWxwZXItPmZiOwotCXVuc2lnbmVkIGludCBjcHAgPSBkcm1f Zm9ybWF0X3BsYW5lX2NwcChmYi0+Zm9ybWF0LT5mb3JtYXQsIDApOworCXVuc2lnbmVkIGludCBj cHAgPSBkcm1fZm9ybWF0X2luZm9fcGxhbmVfY3BwKGZiLT5mb3JtYXQsIDApOwogCXNpemVfdCBv ZmZzZXQgPSBjbGlwLT55MSAqIGZiLT5waXRjaGVzWzBdICsgY2xpcC0+eDEgKiBjcHA7CiAJdm9p ZCAqc3JjID0gZmJfaGVscGVyLT5mYmRldi0+c2NyZWVuX2J1ZmZlciArIG9mZnNldDsKIAl2b2lk ICpkc3QgPSBmYl9oZWxwZXItPmJ1ZmZlci0+dmFkZHIgKyBvZmZzZXQ7CmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vZHJtX2Zvcm1hdF9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1f Zm9ybWF0X2hlbHBlci5jCmluZGV4IGRhMzg4MDEyZGYyYS4uMTRkODVlYjE5ODlkIDEwMDY0NAot LS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2Zvcm1hdF9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dw dS9kcm0vZHJtX2Zvcm1hdF9oZWxwZXIuYwpAQCAtMzYsNyArMzYsNyBAQCBzdGF0aWMgdW5zaWdu ZWQgaW50IGNsaXBfb2Zmc2V0KHN0cnVjdCBkcm1fcmVjdCAqY2xpcCwKIHZvaWQgZHJtX2ZiX21l bWNweSh2b2lkICpkc3QsIHZvaWQgKnZhZGRyLCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwK IAkJICAgc3RydWN0IGRybV9yZWN0ICpjbGlwKQogewotCXVuc2lnbmVkIGludCBjcHAgPSBkcm1f Zm9ybWF0X3BsYW5lX2NwcChmYi0+Zm9ybWF0LT5mb3JtYXQsIDApOworCXVuc2lnbmVkIGludCBj cHAgPSBkcm1fZm9ybWF0X2luZm9fcGxhbmVfY3BwKGZiLT5mb3JtYXQsIDApOwogCXNpemVfdCBs ZW4gPSAoY2xpcC0+eDIgLSBjbGlwLT54MSkgKiBjcHA7CiAJdW5zaWduZWQgaW50IHksIGxpbmVz ID0gY2xpcC0+eTIgLSBjbGlwLT55MTsKIApAQCAtNjMsNyArNjMsNyBAQCB2b2lkIGRybV9mYl9t ZW1jcHlfZHN0Y2xpcCh2b2lkIF9faW9tZW0gKmRzdCwgdm9pZCAqdmFkZHIsCiAJCQkgICBzdHJ1 Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKIAkJCSAgIHN0cnVjdCBkcm1fcmVjdCAqY2xpcCkKIHsK LQl1bnNpZ25lZCBpbnQgY3BwID0gZHJtX2Zvcm1hdF9wbGFuZV9jcHAoZmItPmZvcm1hdC0+Zm9y bWF0LCAwKTsKKwl1bnNpZ25lZCBpbnQgY3BwID0gZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2NwcChm Yi0+Zm9ybWF0LCAwKTsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gY2xpcF9vZmZzZXQoY2xpcCwg ZmItPnBpdGNoZXNbMF0sIGNwcCk7CiAJc2l6ZV90IGxlbiA9IChjbGlwLT54MiAtIGNsaXAtPngx KSAqIGNwcDsKIAl1bnNpZ25lZCBpbnQgeSwgbGluZXMgPSBjbGlwLT55MiAtIGNsaXAtPnkxOwpk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3VyY2MuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9kcm1fZm91cmNjLmMKaW5kZXggZTRhMmM4MzcyYzhiLi41ZjYzZmM3NGUyNjUgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm91cmNjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2Ry bV9mb3VyY2MuYwpAQCAtMzMzLDI2ICszMzMsNiBAQCBkcm1fZ2V0X2Zvcm1hdF9pbmZvKHN0cnVj dCBkcm1fZGV2aWNlICpkZXYsCiBFWFBPUlRfU1lNQk9MKGRybV9nZXRfZm9ybWF0X2luZm8pOwog CiAvKioKLSAqIGRybV9mb3JtYXRfcGxhbmVfY3BwIC0gZGV0ZXJtaW5lIHRoZSBieXRlcyBwZXIg cGl4ZWwgdmFsdWUKLSAqIEBmb3JtYXQ6IHBpeGVsIGZvcm1hdCAoRFJNX0ZPUk1BVF8qKQotICog QHBsYW5lOiBwbGFuZSBpbmRleAotICoKLSAqIFJldHVybnM6Ci0gKiBUaGUgYnl0ZXMgcGVyIHBp eGVsIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHBsYW5lLgotICovCi1pbnQgZHJtX2Zvcm1hdF9w bGFuZV9jcHAodWludDMyX3QgZm9ybWF0LCBpbnQgcGxhbmUpCi17Ci0JY29uc3Qgc3RydWN0IGRy bV9mb3JtYXRfaW5mbyAqaW5mbzsKLQotCWluZm8gPSBkcm1fZm9ybWF0X2luZm8oZm9ybWF0KTsK LQlpZiAoIWluZm8gfHwgcGxhbmUgPj0gaW5mby0+bnVtX3BsYW5lcykKLQkJcmV0dXJuIDA7Ci0K LQlyZXR1cm4gaW5mby0+Y3BwW3BsYW5lXTsKLX0KLUVYUE9SVF9TWU1CT0woZHJtX2Zvcm1hdF9w bGFuZV9jcHApOwotCi0vKioKICAqIGRybV9mb3JtYXRfcGxhbmVfd2lkdGggLSB3aWR0aCBvZiB0 aGUgcGxhbmUgZ2l2ZW4gdGhlIGZpcnN0IHBsYW5lCiAgKiBAd2lkdGg6IHdpZHRoIG9mIHRoZSBm aXJzdCBwbGFuZQogICogQGZvcm1hdDogcGl4ZWwgZm9ybWF0CmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVs X3Nwcml0ZS5jCmluZGV4IDI5MTNlODkyODBkNy4uZTM1NjAxYjFmODc4IDEwMDY0NAotLS0gYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pbnRlbF9zcHJpdGUuYwpAQCAtMzI1LDcgKzMyNSw4IEBAIHNrbF9wbGFuZV9tYXhfc3Ry aWRlKHN0cnVjdCBpbnRlbF9wbGFuZSAqcGxhbmUsCiAJCSAgICAgdTMyIHBpeGVsX2Zvcm1hdCwg dTY0IG1vZGlmaWVyLAogCQkgICAgIHVuc2lnbmVkIGludCByb3RhdGlvbikKIHsKLQlpbnQgY3Bw ID0gZHJtX2Zvcm1hdF9wbGFuZV9jcHAocGl4ZWxfZm9ybWF0LCAwKTsKKwljb25zdCBzdHJ1Y3Qg ZHJtX2Zvcm1hdF9pbmZvICppbmZvID0gZHJtX2Zvcm1hdF9pbmZvKHBpeGVsX2Zvcm1hdCk7CisJ aW50IGNwcCA9IGRybV9mb3JtYXRfaW5mb19wbGFuZV9jcHAoaW5mbywgMCk7CiAKIAkvKgogCSAq ICJUaGUgc3RyaWRlIGluIGJ5dGVzIG11c3Qgbm90IGV4Y2VlZCB0aGUKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vbWVk aWF0ZWsvbXRrX2RybV9mYi5jCmluZGV4IDY4ZmRlZjhiMTJiZC4uMGQ1MzM0YTVhOWE3IDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9mYi5jCisrKyBiL2RyaXZl cnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2ZiLmMKQEAgLTEwNCw3ICsxMDQsNyBAQCBzdHJ1 Y3QgZHJtX2ZyYW1lYnVmZmVyICptdGtfZHJtX21vZGVfZmJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2 aWNlICpkZXYsCiAJaWYgKCFnZW0pCiAJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCi0JYnBw ID0gZHJtX2Zvcm1hdF9wbGFuZV9jcHAoY21kLT5waXhlbF9mb3JtYXQsIDApOworCWJwcCA9IGRy bV9mb3JtYXRfaW5mb19wbGFuZV9jcHAoaW5mbywgMCk7CiAJc2l6ZSA9IChoZWlnaHQgLSAxKSAq IGNtZC0+cGl0Y2hlc1swXSArIHdpZHRoICogYnBwOwogCXNpemUgKz0gY21kLT5vZmZzZXRzWzBd OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNS9tZHA1X2NydGMu YyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfY3J0Yy5jCmluZGV4IGIwY2Y2 M2M0ZTNkNy4uYTU2NWRjY2FiYTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rp c3AvbWRwNS9tZHA1X2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNS9t ZHA1X2NydGMuYwpAQCAtNzgyLDYgKzc4Miw3IEBAIHN0YXRpYyB2b2lkIGdldF9yb2koc3RydWN0 IGRybV9jcnRjICpjcnRjLCB1aW50MzJfdCAqcm9pX3csIHVpbnQzMl90ICpyb2lfaCkKIAogc3Rh dGljIHZvaWQgbWRwNV9jcnRjX3Jlc3RvcmVfY3Vyc29yKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykK IHsKKwljb25zdCBzdHJ1Y3QgZHJtX2Zvcm1hdF9pbmZvICppbmZvID0gZHJtX2Zvcm1hdF9pbmZv KERSTV9GT1JNQVRfQVJHQjg4ODgpOwogCXN0cnVjdCBtZHA1X2NydGNfc3RhdGUgKm1kcDVfY3N0 YXRlID0gdG9fbWRwNV9jcnRjX3N0YXRlKGNydGMtPnN0YXRlKTsKIAlzdHJ1Y3QgbWRwNV9jcnRj ICptZHA1X2NydGMgPSB0b19tZHA1X2NydGMoY3J0Yyk7CiAJc3RydWN0IG1kcDVfa21zICptZHA1 X2ttcyA9IGdldF9rbXMoY3J0Yyk7CkBAIC04MDAsNyArODAxLDcgQEAgc3RhdGljIHZvaWQgbWRw NV9jcnRjX3Jlc3RvcmVfY3Vyc29yKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIAl3aWR0aCA9IG1k cDVfY3J0Yy0+Y3Vyc29yLndpZHRoOwogCWhlaWdodCA9IG1kcDVfY3J0Yy0+Y3Vyc29yLmhlaWdo dDsKIAotCXN0cmlkZSA9IHdpZHRoICogZHJtX2Zvcm1hdF9wbGFuZV9jcHAoRFJNX0ZPUk1BVF9B UkdCODg4OCwgMCk7CisJc3RyaWRlID0gd2lkdGggKiBkcm1fZm9ybWF0X2luZm9fcGxhbmVfY3Bw KGluZm8sIDApOwogCiAJZ2V0X3JvaShjcnRjLCAmcm9pX3csICZyb2lfaCk7CiAKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfc21wLmMgYi9kcml2ZXJzL2dw dS9kcm0vbXNtL2Rpc3AvbWRwNS9tZHA1X3NtcC5jCmluZGV4IGIzMGIyZjRlZmM2MC4uMWNhMjk0 Njk0NTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNS9tZHA1X3Nt cC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfc21wLmMKQEAgLTE1 OCw3ICsxNTgsNyBAQCB1aW50MzJfdCBtZHA1X3NtcF9jYWxjdWxhdGUoc3RydWN0IG1kcDVfc21w ICpzbXAsCiAJZm9yIChpID0gMDsgaSA8IG5wbGFuZXM7IGkrKykgewogCQlpbnQgbiwgZmV0Y2hf c3RyaWRlLCBjcHA7CiAKLQkJY3BwID0gZHJtX2Zvcm1hdF9wbGFuZV9jcHAoZm10LCBpKTsKKwkJ Y3BwID0gZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2NwcChpbmZvLCBpKTsKIAkJZmV0Y2hfc3RyaWRl ID0gd2lkdGggKiBjcHAgLyAoaSA/IGhzdWIgOiAxKTsKIAogCQluID0gRElWX1JPVU5EX1VQKGZl dGNoX3N0cmlkZSAqIG5saW5lcywgc21wLT5ibGtfc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vbXNtL21zbV9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZmIuYwppbmRl eCBmNjljMGFmZDZlYzYuLjI5ZTQ1ZjIxNDRiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJt L21zbS9tc21fZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9mYi5jCkBAIC0xODEs NyArMTgxLDcgQEAgc3RhdGljIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm1zbV9mcmFtZWJ1ZmZl cl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCXVuc2lnbmVkIGludCBtaW5fc2l6ZTsK IAogCQltaW5fc2l6ZSA9IChoZWlnaHQgLSAxKSAqIG1vZGVfY21kLT5waXRjaGVzW2ldCi0JCQkg KyB3aWR0aCAqIGRybV9mb3JtYXRfcGxhbmVfY3BwKG1vZGVfY21kLT5waXhlbF9mb3JtYXQsIGkp CisJCQkgKyB3aWR0aCAqIGRybV9mb3JtYXRfaW5mb19wbGFuZV9jcHAoaW5mbywgaSkKIAkJCSAr IG1vZGVfY21kLT5vZmZzZXRzW2ldOwogCiAJCWlmIChib3NbaV0tPnNpemUgPCBtaW5fc2l6ZSkg ewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmIuYyBiL2RyaXZl cnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZiLmMKaW5kZXggMTI5OGI4NGNiMWM3Li5kYmY1OTZm YzQzMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZiLmMKKysr IGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmIuYwpAQCAtMTI1LDYgKzEyNSw3IEBA IHN0YXRpYyBpbnQgcmFkZW9uZmJfY3JlYXRlX3Bpbm5lZF9vYmplY3Qoc3RydWN0IHJhZGVvbl9m YmRldiAqcmZiZGV2LAogCQkJCQkgc3RydWN0IGRybV9tb2RlX2ZiX2NtZDIgKm1vZGVfY21kLAog CQkJCQkgc3RydWN0IGRybV9nZW1fb2JqZWN0ICoqZ29ial9wKQogeworCWNvbnN0IHN0cnVjdCBk cm1fZm9ybWF0X2luZm8gKmluZm87CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSByZmJk ZXYtPnJkZXY7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnb2JqID0gTlVMTDsKIAlzdHJ1Y3Qg cmFkZW9uX2JvICpyYm8gPSBOVUxMOwpAQCAtMTM1LDcgKzEzNiw4IEBAIHN0YXRpYyBpbnQgcmFk ZW9uZmJfY3JlYXRlX3Bpbm5lZF9vYmplY3Qoc3RydWN0IHJhZGVvbl9mYmRldiAqcmZiZGV2LAog CWludCBoZWlnaHQgPSBtb2RlX2NtZC0+aGVpZ2h0OwogCXUzMiBjcHA7CiAKLQljcHAgPSBkcm1f Zm9ybWF0X3BsYW5lX2NwcChtb2RlX2NtZC0+cGl4ZWxfZm9ybWF0LCAwKTsKKwlpbmZvID0gZHJt X2dldF9mb3JtYXRfaW5mbyhyZGV2LT5kZGV2LCBtb2RlX2NtZCk7CisJY3BwID0gZHJtX2Zvcm1h dF9pbmZvX3BsYW5lX2NwcChpbmZvLCAwKTsKIAogCS8qIG5lZWQgdG8gYWxpZ24gcGl0Y2ggd2l0 aCBjcnRjIGxpbWl0cyAqLwogCW1vZGVfY21kLT5waXRjaGVzWzBdID0gcmFkZW9uX2FsaWduX3Bp dGNoKHJkZXYsIG1vZGVfY21kLT53aWR0aCwgY3BwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L3JvY2tjaGlwX2RybV9mYi5jCmluZGV4IGMzMThmYWUyODU4MS4uNTc4NzNjOTlhZTI5IDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2ZiLmMKKysrIGIv ZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9mYi5jCkBAIC05OCw3ICs5OCw3 IEBAIHJvY2tjaGlwX3VzZXJfZmJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVj dCBkcm1fZmlsZSAqZmlsZV9wcml2LAogCiAJCW1pbl9zaXplID0gKGhlaWdodCAtIDEpICogbW9k ZV9jbWQtPnBpdGNoZXNbaV0gKwogCQkJbW9kZV9jbWQtPm9mZnNldHNbaV0gKwotCQkJd2lkdGgg KiBkcm1fZm9ybWF0X3BsYW5lX2NwcChtb2RlX2NtZC0+cGl4ZWxfZm9ybWF0LCBpKTsKKwkJCXdp ZHRoICogZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2NwcChpbmZvLCBpKTsKIAogCQlpZiAob2JqLT5z aXplIDwgbWluX3NpemUpIHsKIAkJCWRybV9nZW1fb2JqZWN0X3B1dF91bmxvY2tlZChvYmopOwpk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3N0bS9sdGRjLmMgYi9kcml2ZXJzL2dwdS9kcm0v c3RtL2x0ZGMuYwppbmRleCAzMmZkNmEzYjM3ZmIuLjZiYjNjZDNhMWEwMSAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL3N0bS9sdGRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3N0bS9sdGRj LmMKQEAgLTc3OSw3ICs3NzksNyBAQCBzdGF0aWMgdm9pZCBsdGRjX3BsYW5lX2F0b21pY191cGRh dGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCiAKIAkvKiBDb25maWd1cmVzIHRoZSBjb2xvciBm cmFtZSBidWZmZXIgcGl0Y2ggaW4gYnl0ZXMgJiBsaW5lIGxlbmd0aCAqLwogCXBpdGNoX2luX2J5 dGVzID0gZmItPnBpdGNoZXNbMF07Ci0JbGluZV9sZW5ndGggPSBkcm1fZm9ybWF0X3BsYW5lX2Nw cChmYi0+Zm9ybWF0LT5mb3JtYXQsIDApICoKKwlsaW5lX2xlbmd0aCA9IGRybV9mb3JtYXRfaW5m b19wbGFuZV9jcHAoZmItPmZvcm1hdCwgMCkgKgogCQkgICAgICAoeDEgLSB4MCArIDEpICsgKGxk ZXYtPmNhcHMuYnVzX3dpZHRoID4+IDMpIC0gMTsKIAl2YWwgPSAoKHBpdGNoX2luX2J5dGVzIDw8 IDE2KSB8IGxpbmVfbGVuZ3RoKTsKIAlyZWdfdXBkYXRlX2JpdHMobGRldi0+cmVncywgTFREQ19M MUNGQkxSICsgbG9mcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9mYi5jIGIv ZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2ZiLmMKaW5kZXggOTRmYjc1MDg5ZDg3Li5kMTA0MjE5NmEz MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9mYi5jCisrKyBiL2RyaXZlcnMv Z3B1L2RybS90ZWdyYS9mYi5jCkBAIC0xNDksNyArMTQ5LDcgQEAgc3RydWN0IGRybV9mcmFtZWJ1 ZmZlciAqdGVncmFfZmJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCiAJCQlnb3RvIHVu cmVmZXJlbmNlOwogCQl9CiAKLQkJYnBwID0gZHJtX2Zvcm1hdF9wbGFuZV9jcHAoY21kLT5waXhl bF9mb3JtYXQsIGkpOworCQlicHAgPSBkcm1fZm9ybWF0X2luZm9fcGxhbmVfY3BwKGluZm8sIGkp OwogCiAJCXNpemUgPSAoaGVpZ2h0IC0gMSkgKiBjbWQtPnBpdGNoZXNbaV0gKwogCQkgICAgICAg d2lkdGggKiBicHAgKyBjbWQtPm9mZnNldHNbaV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0venRlL3p4X3BsYW5lLmMgYi9kcml2ZXJzL2dwdS9kcm0venRlL3p4X3BsYW5lLmMKaW5kZXgg YzZhOGJlNDQ0MzAwLi5kOTdhNGRmZjUxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS96 dGUvenhfcGxhbmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0venRlL3p4X3BsYW5lLmMKQEAgLTIy Miw3ICsyMjIsNyBAQCBzdGF0aWMgdm9pZCB6eF92bF9wbGFuZV9hdG9taWNfdXBkYXRlKHN0cnVj dCBkcm1fcGxhbmUgKnBsYW5lLAogCQljbWFfb2JqID0gZHJtX2ZiX2NtYV9nZXRfZ2VtX29iaihm YiwgaSk7CiAJCXBhZGRyID0gY21hX29iai0+cGFkZHIgKyBmYi0+b2Zmc2V0c1tpXTsKIAkJcGFk ZHIgKz0gc3JjX3kgKiBmYi0+cGl0Y2hlc1tpXTsKLQkJcGFkZHIgKz0gc3JjX3ggKiBkcm1fZm9y bWF0X3BsYW5lX2NwcChmb3JtYXQsIGkpOworCQlwYWRkciArPSBzcmNfeCAqIGRybV9mb3JtYXRf aW5mb19wbGFuZV9jcHAoZmItPmZvcm1hdCwgaSk7CiAJCXp4X3dyaXRlbChwYWRkcl9yZWcsIHBh ZGRyKTsKIAkJcGFkZHJfcmVnICs9IDQ7CiAJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJt X2ZvdXJjYy5oIGIvaW5jbHVkZS9kcm0vZHJtX2ZvdXJjYy5oCmluZGV4IGVlZWM0NDlkNmM2YS4u NmI1YTgyYjMxYmM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fZm91cmNjLmgKKysrIGIv aW5jbHVkZS9kcm0vZHJtX2ZvdXJjYy5oCkBAIC0yNjAsNiArMjYwLDIzIEBAIGRybV9mb3JtYXRf aW5mb19pc195dXZfc2FtcGxpbmdfNDQ0KGNvbnN0IHN0cnVjdCBkcm1fZm9ybWF0X2luZm8gKmlu Zm8pCiAJcmV0dXJuIGluZm8tPmlzX3l1diAmJiBpbmZvLT5oc3ViID09IDEgJiYgaW5mby0+dnN1 YiA9PSAxOwogfQogCisvKioKKyAqIGRybV9mb3JtYXRfaW5mb19wbGFuZV9jcHAgLSBkZXRlcm1p bmUgdGhlIGJ5dGVzIHBlciBwaXhlbCB2YWx1ZQorICogQGZvcm1hdDogcGl4ZWwgZm9ybWF0IGlu Zm8KKyAqIEBwbGFuZTogcGxhbmUgaW5kZXgKKyAqCisgKiBSZXR1cm5zOgorICogVGhlIGJ5dGVz IHBlciBwaXhlbCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBwbGFuZS4KKyAqLworc3RhdGljIGlu bGluZQoraW50IGRybV9mb3JtYXRfaW5mb19wbGFuZV9jcHAoY29uc3Qgc3RydWN0IGRybV9mb3Jt YXRfaW5mbyAqaW5mbywgaW50IHBsYW5lKQoreworCWlmICghaW5mbyB8fCBwbGFuZSA+PSBpbmZv LT5udW1fcGxhbmVzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBpbmZvLT5jcHBbcGxhbmVdOwor fQorCiBjb25zdCBzdHJ1Y3QgZHJtX2Zvcm1hdF9pbmZvICpfX2RybV9mb3JtYXRfaW5mbyh1MzIg Zm9ybWF0KTsKIGNvbnN0IHN0cnVjdCBkcm1fZm9ybWF0X2luZm8gKmRybV9mb3JtYXRfaW5mbyh1 MzIgZm9ybWF0KTsKIGNvbnN0IHN0cnVjdCBkcm1fZm9ybWF0X2luZm8gKgpAQCAtMjY4LDcgKzI4 NSw2IEBAIGRybV9nZXRfZm9ybWF0X2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIHVpbnQz Ml90IGRybV9tb2RlX2xlZ2FjeV9mYl9mb3JtYXQodWludDMyX3QgYnBwLCB1aW50MzJfdCBkZXB0 aCk7CiB1aW50MzJfdCBkcm1fZHJpdmVyX2xlZ2FjeV9mYl9mb3JtYXQoc3RydWN0IGRybV9kZXZp Y2UgKmRldiwKIAkJCQkgICAgIHVpbnQzMl90IGJwcCwgdWludDMyX3QgZGVwdGgpOwotaW50IGRy bV9mb3JtYXRfcGxhbmVfY3BwKHVpbnQzMl90IGZvcm1hdCwgaW50IHBsYW5lKTsKIGludCBkcm1f Zm9ybWF0X3BsYW5lX3dpZHRoKGludCB3aWR0aCwgdWludDMyX3QgZm9ybWF0LCBpbnQgcGxhbmUp OwogaW50IGRybV9mb3JtYXRfcGxhbmVfaGVpZ2h0KGludCBoZWlnaHQsIHVpbnQzMl90IGZvcm1h dCwgaW50IHBsYW5lKTsKIHVuc2lnbmVkIGludCBkcm1fZm9ybWF0X2luZm9fYmxvY2tfd2lkdGgo Y29uc3Qgc3RydWN0IGRybV9mb3JtYXRfaW5mbyAqaW5mbywKLS0gCmdpdC1zZXJpZXMgMC45LjEK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs