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 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8304BC53219 for ; Tue, 28 Jul 2026 14:35:05 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 13E7110E581; Tue, 28 Jul 2026 14:35:05 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=arm.com header.i=@arm.com header.b="SQe+uOOk"; dkim-atps=neutral Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by gabe.freedesktop.org (Postfix) with ESMTP id 2222210E581 for ; Tue, 28 Jul 2026 14:35:03 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 94A3D175D for ; Tue, 28 Jul 2026 07:34:58 -0700 (PDT) Received: from [10.2.11.34] (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 53B7B3F66F for ; Tue, 28 Jul 2026 07:35:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1785249302; bh=Inv7KrlemkdgK5E3nHXTAHNRQzVGjk/0dJV4TgUWtLg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=SQe+uOOkk06kK8NLMc6HbGRofOBpvQoEX8bXWyZESzmV29CqJED+Av5+d2GVYQ/uF RynYLqG4BcpnbjG7QuRBkLUmfruQQSHpoAVucdwtmihU2E9+0rRAyB0AfYvtgt7aRQ ULdyYenpAW4Ll0Q8gFyL8b/QdxzI413WD7xHoSHA= Date: Tue, 28 Jul 2026 15:34:00 +0100 From: Liviu Dudau To: =?utf-8?Q?Adri=C3=A1n?= Larumbe Cc: Alex Deucher , Christian =?utf-8?B?S8O2bmln?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Lucas Stach , Russell King , Christian Gmeiner , Jianmin Lv , Qianhai Wu , Huacai Chen , Mingcong Bai , Xi Ruoyao , Icenowy Zheng , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Lyude Paul , Danilo Krummrich , Boris Brezillon , Steven Price , Sandy Huang , Heiko =?utf-8?Q?St=C3=BCbner?= , Andy Yan , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Zack Rusin , Broadcom internal kernel review list , Matthew Brost , Thomas =?utf-8?Q?Hellstr=C3=B6m?= , Rodrigo Vivi , Oleksandr Andrushchenko , Sumit Semwal , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, etnaviv@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, nouveau@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-tegra@vger.kernel.org, intel-xe@lists.freedesktop.org, xen-devel@lists.xenproject.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org Subject: Re: [PATCH] drm/gem: Move pages_to_sg helper into drm_gem.c Message-ID: References: <20260724-get_pages-v1-1-b10e5d65628e@collabora.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20260724-get_pages-v1-1-b10e5d65628e@collabora.com> X-BeenThere: amd-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces@lists.freedesktop.org Sender: "amd-gfx" On Fri, Jul 24, 2026 at 01:08:58PM +0100, Adrián Larumbe wrote: > None of the semantics of the function tell of it being a PRIME-exclusive > entry point. In fact, most drivers seem to be using it to translate a list > of pages into an sg table that can be used for GPU mapping later on, rather > than just for sharing an object's pages with another driver. > > Move it across files and rename accordingly. > > Signed-off-by: Adrián Larumbe > --- > drm_prime_pages_to_sg() has no real dependency on PRIME/dma-buf interfaces. > It is a generic helper that converts a page array into a scatter/gather > table via dma_map_sg_attrs. Nothing in its implementation touches struct > dma_buf or import/export logic. > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 6 ++--- > drivers/gpu/drm/drm_gem.c | 35 ++++++++++++++++++++++++++ > drivers/gpu/drm/drm_gem_shmem_helper.c | 2 +- > drivers/gpu/drm/drm_prime.c | 38 ----------------------------- > drivers/gpu/drm/etnaviv/etnaviv_gem.c | 3 +-- > drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 3 ++- > drivers/gpu/drm/loongson/lsdc_gem.c | 3 +-- > drivers/gpu/drm/msm/msm_gem.c | 2 +- > drivers/gpu/drm/msm/msm_gem_prime.c | 2 +- > drivers/gpu/drm/nouveau/nouveau_prime.c | 4 +-- > drivers/gpu/drm/panthor/panthor_gem.c | 6 ++--- For Panthor and the general rename: Reviewed-by: Liviu Dudau Best regards, Liviu > drivers/gpu/drm/radeon/radeon_prime.c | 5 ++-- > drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 6 ++--- > drivers/gpu/drm/tegra/gem.c | 4 +-- > drivers/gpu/drm/vmwgfx/vmwgfx_gem.c | 4 +-- > drivers/gpu/drm/xe/xe_dma_buf.c | 6 ++--- > drivers/gpu/drm/xen/xen_drm_front_gem.c | 2 +- > include/drm/drm_gem.h | 5 +++- > include/drm/drm_prime.h | 2 -- > 19 files changed, 68 insertions(+), 70 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c > index b33c300e26e2..c9a98aec7eb6 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c > @@ -203,9 +203,9 @@ static struct sg_table *amdgpu_dma_buf_map(struct dma_buf_attachment *attach, > > switch (bo->tbo.resource->mem_type) { > case TTM_PL_TT: > - sgt = drm_prime_pages_to_sg(obj->dev, > - bo->tbo.ttm->pages, > - bo->tbo.ttm->num_pages); > + sgt = drm_pages_to_sg(obj->dev, > + bo->tbo.ttm->pages, > + bo->tbo.ttm->num_pages); > if (IS_ERR(sgt)) > return sgt; > > diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c > index 018df97d590d..22c8a3b5f667 100644 > --- a/drivers/gpu/drm/drm_gem.c > +++ b/drivers/gpu/drm/drm_gem.c > @@ -780,6 +780,41 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages, > } > EXPORT_SYMBOL(drm_gem_put_pages); > > +/** > + * drm_pages_to_sg - converts a page array into an sg list > + * @dev: DRM device > + * @pages: pointer to the array of page pointers to convert > + * @nr_pages: length of the page vector > + * > + * This helper creates an sg table object from a set of pages. > + * This is useful for implementing &drm_gem_object_funcs.get_sg_table. > + */ > +struct sg_table *drm_pages_to_sg(struct drm_device *dev, > + struct page **pages, unsigned int nr_pages) > +{ > + struct sg_table *sg; > + size_t max_segment = 0; > + int err; > + > + sg = kmalloc_obj(struct sg_table); > + if (!sg) > + return ERR_PTR(-ENOMEM); > + > + if (dev) > + max_segment = dma_max_mapping_size(drm_dev_dma_dev(dev)); > + if (max_segment == 0) > + max_segment = UINT_MAX; > + err = sg_alloc_table_from_pages_segment(sg, pages, nr_pages, 0, > + (unsigned long)nr_pages << PAGE_SHIFT, > + max_segment, GFP_KERNEL); > + if (err) { > + kfree(sg); > + sg = ERR_PTR(err); > + } > + return sg; > +} > +EXPORT_SYMBOL(drm_pages_to_sg); > + > static int objects_lookup(struct drm_file *filp, u32 *handle, int count, > struct drm_gem_object **objs) > { > diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c > index 22ec52e2ffb8..144d088a477f 100644 > --- a/drivers/gpu/drm/drm_gem_shmem_helper.c > +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c > @@ -825,7 +825,7 @@ struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_shmem_object *shmem) > > drm_WARN_ON(obj->dev, drm_gem_is_imported(obj)); > > - return drm_prime_pages_to_sg(obj->dev, shmem->pages, obj->size >> PAGE_SHIFT); > + return drm_pages_to_sg(obj->dev, shmem->pages, obj->size >> PAGE_SHIFT); > } > EXPORT_SYMBOL_GPL(drm_gem_shmem_get_sg_table); > > diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c > index 9b44c78cd77f..54539a8929c1 100644 > --- a/drivers/gpu/drm/drm_prime.c > +++ b/drivers/gpu/drm/drm_prime.c > @@ -835,44 +835,6 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops = { > .vunmap = drm_gem_dmabuf_vunmap, > }; > > -/** > - * drm_prime_pages_to_sg - converts a page array into an sg list > - * @dev: DRM device > - * @pages: pointer to the array of page pointers to convert > - * @nr_pages: length of the page vector > - * > - * This helper creates an sg table object from a set of pages > - * the driver is responsible for mapping the pages into the > - * importers address space for use with dma_buf itself. > - * > - * This is useful for implementing &drm_gem_object_funcs.get_sg_table. > - */ > -struct sg_table *drm_prime_pages_to_sg(struct drm_device *dev, > - struct page **pages, unsigned int nr_pages) > -{ > - struct sg_table *sg; > - size_t max_segment = 0; > - int err; > - > - sg = kmalloc_obj(struct sg_table); > - if (!sg) > - return ERR_PTR(-ENOMEM); > - > - if (dev) > - max_segment = dma_max_mapping_size(drm_dev_dma_dev(dev)); > - if (max_segment == 0) > - max_segment = UINT_MAX; > - err = sg_alloc_table_from_pages_segment(sg, pages, nr_pages, 0, > - (unsigned long)nr_pages << PAGE_SHIFT, > - max_segment, GFP_KERNEL); > - if (err) { > - kfree(sg); > - sg = ERR_PTR(err); > - } > - return sg; > -} > -EXPORT_SYMBOL(drm_prime_pages_to_sg); > - > /** > * drm_prime_get_contiguous_size - returns the contiguous size of the buffer > * @sgt: sg_table describing the buffer to check > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c > index b0436a1e103f..a8e8614f8210 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c > @@ -3,7 +3,6 @@ > * Copyright (C) 2015-2018 Etnaviv Project > */ > > -#include > #include > #include > #include > @@ -104,7 +103,7 @@ struct page **etnaviv_gem_get_pages(struct etnaviv_gem_object *etnaviv_obj) > unsigned int npages = etnaviv_obj->base.size >> PAGE_SHIFT; > struct sg_table *sgt; > > - sgt = drm_prime_pages_to_sg(dev, etnaviv_obj->pages, npages); > + sgt = drm_pages_to_sg(dev, etnaviv_obj->pages, npages); > if (IS_ERR(sgt)) { > dev_err(dev->dev, "failed to allocate sgt: %ld\n", > PTR_ERR(sgt)); > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c > index 6757ae6ec304..f44484325ddb 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c > @@ -3,6 +3,7 @@ > * Copyright (C) 2014-2018 Etnaviv Project > */ > > +#include > #include > #include > #include > @@ -22,7 +23,7 @@ struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj) > if (WARN_ON(!etnaviv_obj->pages)) /* should have already pinned! */ > return ERR_PTR(-EINVAL); > > - return drm_prime_pages_to_sg(obj->dev, etnaviv_obj->pages, npages); > + return drm_pages_to_sg(obj->dev, etnaviv_obj->pages, npages); > } > > int etnaviv_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map) > diff --git a/drivers/gpu/drm/loongson/lsdc_gem.c b/drivers/gpu/drm/loongson/lsdc_gem.c > index 2fb03487c983..37160228244c 100644 > --- a/drivers/gpu/drm/loongson/lsdc_gem.c > +++ b/drivers/gpu/drm/loongson/lsdc_gem.c > @@ -9,7 +9,6 @@ > #include > #include > #include > -#include > #include > > #include "lsdc_drv.h" > @@ -51,7 +50,7 @@ static struct sg_table *lsdc_gem_prime_get_sg_table(struct drm_gem_object *obj) > return ERR_PTR(-ENOMEM); > } > > - return drm_prime_pages_to_sg(obj->dev, tt->pages, tt->num_pages); > + return drm_pages_to_sg(obj->dev, tt->pages, tt->num_pages); > } > > static void lsdc_gem_object_free(struct drm_gem_object *obj) > diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c > index efd3d3c9a449..7e3418290c22 100644 > --- a/drivers/gpu/drm/msm/msm_gem.c > +++ b/drivers/gpu/drm/msm/msm_gem.c > @@ -207,7 +207,7 @@ static struct page **get_pages(struct drm_gem_object *obj) > > msm_obj->pages = p; > > - msm_obj->sgt = drm_prime_pages_to_sg(obj->dev, p, npages); > + msm_obj->sgt = drm_pages_to_sg(obj->dev, p, npages); > if (IS_ERR(msm_obj->sgt)) { > void *ptr = ERR_CAST(msm_obj->sgt); > > diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c b/drivers/gpu/drm/msm/msm_gem_prime.c > index 036d34c674d9..d25393a9e549 100644 > --- a/drivers/gpu/drm/msm/msm_gem_prime.c > +++ b/drivers/gpu/drm/msm/msm_gem_prime.c > @@ -23,7 +23,7 @@ struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj) > if (WARN_ON(!msm_obj->pages)) /* should have already pinned! */ > return ERR_PTR(-ENOMEM); > > - return drm_prime_pages_to_sg(obj->dev, msm_obj->pages, npages); > + return drm_pages_to_sg(obj->dev, msm_obj->pages, npages); > } > > int msm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map) > diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c > index caab60fc62f6..b95f2f07df74 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_prime.c > +++ b/drivers/gpu/drm/nouveau/nouveau_prime.c > @@ -32,8 +32,8 @@ struct sg_table *nouveau_gem_prime_get_sg_table(struct drm_gem_object *obj) > { > struct nouveau_bo *nvbo = nouveau_gem_object(obj); > > - return drm_prime_pages_to_sg(obj->dev, nvbo->bo.ttm->pages, > - nvbo->bo.ttm->num_pages); > + return drm_pages_to_sg(obj->dev, nvbo->bo.ttm->pages, > + nvbo->bo.ttm->num_pages); > } > > struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev, > diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c > index 9855df738194..ec530d254fa4 100644 > --- a/drivers/gpu/drm/panthor/panthor_gem.c > +++ b/drivers/gpu/drm/panthor/panthor_gem.c > @@ -321,8 +321,8 @@ panthor_gem_dev_map_get_sgt_locked(struct panthor_gem_object *bo) > if (ret) > return ERR_PTR(ret); > > - sgt = drm_prime_pages_to_sg(bo->base.dev, bo->backing.pages, > - bo->base.size >> PAGE_SHIFT); > + sgt = drm_pages_to_sg(bo->base.dev, bo->backing.pages, > + bo->base.size >> PAGE_SHIFT); > if (IS_ERR(sgt)) > return sgt; > > @@ -702,7 +702,7 @@ static struct sg_table *panthor_gem_get_sg_table(struct drm_gem_object *obj) > drm_WARN_ON_ONCE(obj->dev, !bo->backing.pages); > drm_WARN_ON_ONCE(obj->dev, !refcount_read(&bo->backing.pin_count)); > > - return drm_prime_pages_to_sg(obj->dev, bo->backing.pages, obj->size >> PAGE_SHIFT); > + return drm_pages_to_sg(obj->dev, bo->backing.pages, obj->size >> PAGE_SHIFT); > } > > static int panthor_gem_vmap_locked(struct drm_gem_object *obj, > diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c > index a77881f035e7..4cfc4282a59c 100644 > --- a/drivers/gpu/drm/radeon/radeon_prime.c > +++ b/drivers/gpu/drm/radeon/radeon_prime.c > @@ -26,6 +26,7 @@ > > #include > > +#include > #include > #include > > @@ -38,8 +39,8 @@ struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj) > { > struct radeon_bo *bo = gem_to_radeon_bo(obj); > > - return drm_prime_pages_to_sg(obj->dev, bo->tbo.ttm->pages, > - bo->tbo.ttm->num_pages); > + return drm_pages_to_sg(obj->dev, bo->tbo.ttm->pages, > + bo->tbo.ttm->num_pages); > } > > struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev, > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > index b188539dca0b..7897da0becf4 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > @@ -89,8 +89,8 @@ static int rockchip_gem_get_pages(struct rockchip_gem_object *rk_obj) > > rk_obj->num_pages = rk_obj->base.size >> PAGE_SHIFT; > > - rk_obj->sgt = drm_prime_pages_to_sg(rk_obj->base.dev, > - rk_obj->pages, rk_obj->num_pages); > + rk_obj->sgt = drm_pages_to_sg(rk_obj->base.dev, > + rk_obj->pages, rk_obj->num_pages); > if (IS_ERR(rk_obj->sgt)) { > ret = PTR_ERR(rk_obj->sgt); > goto err_put_pages; > @@ -432,7 +432,7 @@ struct sg_table *rockchip_gem_prime_get_sg_table(struct drm_gem_object *obj) > int ret; > > if (rk_obj->pages) > - return drm_prime_pages_to_sg(obj->dev, rk_obj->pages, rk_obj->num_pages); > + return drm_pages_to_sg(obj->dev, rk_obj->pages, rk_obj->num_pages); > > sgt = kzalloc_obj(*sgt); > if (!sgt) > diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c > index 436394e04812..701af672b4e5 100644 > --- a/drivers/gpu/drm/tegra/gem.c > +++ b/drivers/gpu/drm/tegra/gem.c > @@ -17,7 +17,7 @@ > > #include > #include > -#include > +#include > > #include "drm.h" > #include "gem.h" > @@ -352,7 +352,7 @@ static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo) > > bo->num_pages = bo->gem.size >> PAGE_SHIFT; > > - bo->sgt = drm_prime_pages_to_sg(bo->gem.dev, bo->pages, bo->num_pages); > + bo->sgt = drm_pages_to_sg(bo->gem.dev, bo->pages, bo->num_pages); > if (IS_ERR(bo->sgt)) { > err = PTR_ERR(bo->sgt); > goto put_pages; > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c > index 39f8c46550c2..c9e7f2e3668c 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c > @@ -28,7 +28,7 @@ > #include "vmwgfx_bo.h" > #include "vmwgfx_drv.h" > > -#include "drm/drm_prime.h" > +#include "drm/drm_gem.h" > #include "drm/drm_gem_ttm_helper.h" > > #include > @@ -76,7 +76,7 @@ static struct sg_table *vmw_gem_object_get_sg_table(struct drm_gem_object *obj) > if (vmw_tt->vsgt.sgt) > return vmw_tt->vsgt.sgt; > > - return drm_prime_pages_to_sg(obj->dev, vmw_tt->dma_ttm.pages, vmw_tt->dma_ttm.num_pages); > + return drm_pages_to_sg(obj->dev, vmw_tt->dma_ttm.pages, vmw_tt->dma_ttm.num_pages); > } > > static int vmw_gem_vmap(struct drm_gem_object *obj, struct iosys_map *map) > diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c > index 8a920e58245c..f0fe80706b79 100644 > --- a/drivers/gpu/drm/xe/xe_dma_buf.c > +++ b/drivers/gpu/drm/xe/xe_dma_buf.c > @@ -118,9 +118,9 @@ static struct sg_table *xe_dma_buf_map(struct dma_buf_attachment *attach, > > switch (bo->ttm.resource->mem_type) { > case XE_PL_TT: > - sgt = drm_prime_pages_to_sg(obj->dev, > - bo->ttm.ttm->pages, > - obj->size >> PAGE_SHIFT); > + sgt = drm_pages_to_sg(obj->dev, > + bo->ttm.ttm->pages, > + obj->size >> PAGE_SHIFT); > if (IS_ERR(sgt)) > return sgt; > > diff --git a/drivers/gpu/drm/xen/xen_drm_front_gem.c b/drivers/gpu/drm/xen/xen_drm_front_gem.c > index eec4c1da3f9e..a4a7c7f2c91c 100644 > --- a/drivers/gpu/drm/xen/xen_drm_front_gem.c > +++ b/drivers/gpu/drm/xen/xen_drm_front_gem.c > @@ -236,7 +236,7 @@ struct sg_table *xen_drm_front_gem_get_sg_table(struct drm_gem_object *gem_obj) > if (!xen_obj->pages) > return ERR_PTR(-ENOMEM); > > - return drm_prime_pages_to_sg(gem_obj->dev, > + return drm_pages_to_sg(gem_obj->dev, > xen_obj->pages, xen_obj->num_pages); > } > > diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h > index 885244e375d3..7b9cc6335689 100644 > --- a/include/drm/drm_gem.h > +++ b/include/drm/drm_gem.h > @@ -155,7 +155,7 @@ struct drm_gem_object_funcs { > * here cannot be used for sg tables pointing at driver private memory > * ranges. > * > - * See also drm_prime_pages_to_sg(). > + * See also drm_pages_to_sg(). > */ > struct sg_table *(*get_sg_table)(struct drm_gem_object *obj); > > @@ -589,6 +589,9 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj); > void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages, > bool dirty, bool accessed); > > +struct sg_table *drm_pages_to_sg(struct drm_device *dev, > + struct page **pages, unsigned int nr_pages); > + > void drm_gem_lock(struct drm_gem_object *obj); > void drm_gem_unlock(struct drm_gem_object *obj); > > diff --git a/include/drm/drm_prime.h b/include/drm/drm_prime.h > index f50f862f0d8b..603e16a40ae7 100644 > --- a/include/drm/drm_prime.h > +++ b/include/drm/drm_prime.h > @@ -92,8 +92,6 @@ void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, struct iosys_map *map); > int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); > int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma); > > -struct sg_table *drm_prime_pages_to_sg(struct drm_device *dev, > - struct page **pages, unsigned int nr_pages); > struct dma_buf *drm_gem_prime_export(struct drm_gem_object *obj, > int flags); > > > --- > base-commit: 48dd37d1fef33fbf42f1d6887c61e242fd21d00d > change-id: 20260724-get_pages-e2e91c53eaa3 > > Best regards, > -- > Adrián Larumbe > -- ==================== | I would like to | | fix the world, | | but they're not | | giving me the | \ source code! / --------------- ¯\_(ツ)_/¯ 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 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DEC2DC53219 for ; Tue, 28 Jul 2026 14:35:14 +0000 (UTC) Received: from kara.freedesktop.org (unknown [131.252.210.166]) by gabe.freedesktop.org (Postfix) with ESMTPS id BB22210E935; Tue, 28 Jul 2026 14:35:14 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=arm.com header.i=@arm.com header.b="QhC+SiQj"; dkim-atps=neutral Received: from kara.freedesktop.org (localhost [127.0.0.1]) by kara.freedesktop.org (Postfix) with ESMTP id 7713047462; Tue, 28 Jul 2026 14:19:30 +0000 (UTC) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=lists.freedesktop.org; s=20240201; t=1785248370; b=xb0hJs5PYQwMEjsKBaT7xP/SCwqziXj63n4S5P8oC1DkhVMS1krED2ZMbO7WhKKvg3UwG ms8E2pHkjgBRgZUoCD/rx829QQ11LEiSIENrrhYvAy3zxGbsvV01wqjQN+XPKmX0CeYNHQx 2nEsvX2P1zPKZvvrjEpUNh3bdZrjqD0QQViVI1T5oyBOmyYukYqnR147g3kM04xw3CrKT+n vsXTwAqIdIsPMxWOCdVrx1yumP9ketEqc4EZ9MLuvs4FgdbvXgRJL+V/Arq01aLI6Sq6uY1 y10K+GicxNR53xd1pttqGnlYujml2+5wt0PGzKziTlrg95eWFqIknl9Az4ng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=lists.freedesktop.org; s=20240201; t=1785248370; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=lIVO8RWHC771tztrJbg2FXQHUB5T+4WHSj9p4Pq4h/Y=; b=EwbsyD3CW9daqkasST/Q73eT8GWDY8Q5odmx6sKulnq2z3BgQ7vNwu3AcDBr5enwpfnX9 NgaB86JTAMnL6Au1tSYSvy4/QRcA5250bEW4Kgik+kIE82c2hDsI2aYDQ6tIvwYpYEMtYDf fgxXRg7e/AeRsBKmgPnQFuqTUqrobsXT+K5mJcnQWYbST6580qo0RWP4KQvwkqAGHfmCpVq koIkv2BsKqVrvX5m4dASElJpPefYLg7GDTMNfRyeyafG/n0zW2HIf4PhS8c6VLbM9U2gRc9 o2rVTCQfO/QpPY5otCB50FEKT4GlaiIPwjDXkLKUDmUWAhoWBmEzZ5NSuRmA== ARC-Authentication-Results: i=1; mail.freedesktop.org; dkim=pass header.d=arm.com; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=arm.com policy.dmarc=none Authentication-Results: mail.freedesktop.org; dkim=pass header.d=arm.com; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=arm.com policy.dmarc=none Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by kara.freedesktop.org (Postfix) with ESMTPS id 9B5634745C for ; Tue, 28 Jul 2026 14:19:27 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by gabe.freedesktop.org (Postfix) with ESMTP id 917E210E91E for ; Tue, 28 Jul 2026 14:35:11 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 0A680175D for ; Tue, 28 Jul 2026 07:35:07 -0700 (PDT) Received: from [10.2.11.34] (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id B030F3F66F for ; Tue, 28 Jul 2026 07:35:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1785249311; bh=Inv7KrlemkdgK5E3nHXTAHNRQzVGjk/0dJV4TgUWtLg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=QhC+SiQjVawuTAhUC6EIPYMKKV2MwBJm5E1kLbcd6Hzg0J+eVZT9f5ibuc6piv+L9 lx4fQ2U1aXogaQKD5NWqQ+kgdMFDIG12ZxNLWk22FyJaYI+98YdCqZToYUxfVWYYR1 PWjKk2qYQ8iW2vstM5gr1hUJW/IroutawuEEt3qw= Date: Tue, 28 Jul 2026 15:34:00 +0100 From: Liviu Dudau To: =?utf-8?Q?Adri=C3=A1n?= Larumbe Subject: Re: [PATCH] drm/gem: Move pages_to_sg helper into drm_gem.c Message-ID: References: <20260724-get_pages-v1-1-b10e5d65628e@collabora.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20260724-get_pages-v1-1-b10e5d65628e@collabora.com> Message-ID-Hash: 66QHBZSP2LXVVM5EKZ5G67DHGIEURQJ2 X-Message-ID-Hash: 66QHBZSP2LXVVM5EKZ5G67DHGIEURQJ2 X-MailFrom: liviu.dudau@arm.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Alex Deucher , Christian =?utf-8?B?S8O2bmln?= , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Lucas Stach , Russell King , Christian Gmeiner , Jianmin Lv , Qianhai Wu , Huacai Chen , Mingcong Bai , Xi Ruoyao , Icenowy Zheng , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Danilo Krummrich , Boris Brezillon , Steven Price , Sandy Huang , Heiko =?utf-8?Q?St=C3=BCbner?= , Andy Yan , Thierry Reding , Mikko Perttunen , Zack Rusin , Broadcom internal kernel review list , Matthew Brost , Thomas =?utf-8?Q?Hellstr=C3=B6m?= , Rodrigo Vivi , Oleksandr Andrushchenko , Sumit Semwal , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, etnaviv@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, nouveau@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-tegra@vger.kernel.org, intel-xe@lists.freedesktop.org, xen-devel@lists.xenproject.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org X-Mailman-Version: 3.3.8 Precedence: list List-Id: Nouveau development list Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On Fri, Jul 24, 2026 at 01:08:58PM +0100, Adrián Larumbe wrote: > None of the semantics of the function tell of it being a PRIME-exclusive > entry point. In fact, most drivers seem to be using it to translate a list > of pages into an sg table that can be used for GPU mapping later on, rather > than just for sharing an object's pages with another driver. > > Move it across files and rename accordingly. > > Signed-off-by: Adrián Larumbe > --- > drm_prime_pages_to_sg() has no real dependency on PRIME/dma-buf interfaces. > It is a generic helper that converts a page array into a scatter/gather > table via dma_map_sg_attrs. Nothing in its implementation touches struct > dma_buf or import/export logic. > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 6 ++--- > drivers/gpu/drm/drm_gem.c | 35 ++++++++++++++++++++++++++ > drivers/gpu/drm/drm_gem_shmem_helper.c | 2 +- > drivers/gpu/drm/drm_prime.c | 38 ----------------------------- > drivers/gpu/drm/etnaviv/etnaviv_gem.c | 3 +-- > drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 3 ++- > drivers/gpu/drm/loongson/lsdc_gem.c | 3 +-- > drivers/gpu/drm/msm/msm_gem.c | 2 +- > drivers/gpu/drm/msm/msm_gem_prime.c | 2 +- > drivers/gpu/drm/nouveau/nouveau_prime.c | 4 +-- > drivers/gpu/drm/panthor/panthor_gem.c | 6 ++--- For Panthor and the general rename: Reviewed-by: Liviu Dudau Best regards, Liviu > drivers/gpu/drm/radeon/radeon_prime.c | 5 ++-- > drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 6 ++--- > drivers/gpu/drm/tegra/gem.c | 4 +-- > drivers/gpu/drm/vmwgfx/vmwgfx_gem.c | 4 +-- > drivers/gpu/drm/xe/xe_dma_buf.c | 6 ++--- > drivers/gpu/drm/xen/xen_drm_front_gem.c | 2 +- > include/drm/drm_gem.h | 5 +++- > include/drm/drm_prime.h | 2 -- > 19 files changed, 68 insertions(+), 70 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c > index b33c300e26e2..c9a98aec7eb6 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c > @@ -203,9 +203,9 @@ static struct sg_table *amdgpu_dma_buf_map(struct dma_buf_attachment *attach, > > switch (bo->tbo.resource->mem_type) { > case TTM_PL_TT: > - sgt = drm_prime_pages_to_sg(obj->dev, > - bo->tbo.ttm->pages, > - bo->tbo.ttm->num_pages); > + sgt = drm_pages_to_sg(obj->dev, > + bo->tbo.ttm->pages, > + bo->tbo.ttm->num_pages); > if (IS_ERR(sgt)) > return sgt; > > diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c > index 018df97d590d..22c8a3b5f667 100644 > --- a/drivers/gpu/drm/drm_gem.c > +++ b/drivers/gpu/drm/drm_gem.c > @@ -780,6 +780,41 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages, > } > EXPORT_SYMBOL(drm_gem_put_pages); > > +/** > + * drm_pages_to_sg - converts a page array into an sg list > + * @dev: DRM device > + * @pages: pointer to the array of page pointers to convert > + * @nr_pages: length of the page vector > + * > + * This helper creates an sg table object from a set of pages. > + * This is useful for implementing &drm_gem_object_funcs.get_sg_table. > + */ > +struct sg_table *drm_pages_to_sg(struct drm_device *dev, > + struct page **pages, unsigned int nr_pages) > +{ > + struct sg_table *sg; > + size_t max_segment = 0; > + int err; > + > + sg = kmalloc_obj(struct sg_table); > + if (!sg) > + return ERR_PTR(-ENOMEM); > + > + if (dev) > + max_segment = dma_max_mapping_size(drm_dev_dma_dev(dev)); > + if (max_segment == 0) > + max_segment = UINT_MAX; > + err = sg_alloc_table_from_pages_segment(sg, pages, nr_pages, 0, > + (unsigned long)nr_pages << PAGE_SHIFT, > + max_segment, GFP_KERNEL); > + if (err) { > + kfree(sg); > + sg = ERR_PTR(err); > + } > + return sg; > +} > +EXPORT_SYMBOL(drm_pages_to_sg); > + > static int objects_lookup(struct drm_file *filp, u32 *handle, int count, > struct drm_gem_object **objs) > { > diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c > index 22ec52e2ffb8..144d088a477f 100644 > --- a/drivers/gpu/drm/drm_gem_shmem_helper.c > +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c > @@ -825,7 +825,7 @@ struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_shmem_object *shmem) > > drm_WARN_ON(obj->dev, drm_gem_is_imported(obj)); > > - return drm_prime_pages_to_sg(obj->dev, shmem->pages, obj->size >> PAGE_SHIFT); > + return drm_pages_to_sg(obj->dev, shmem->pages, obj->size >> PAGE_SHIFT); > } > EXPORT_SYMBOL_GPL(drm_gem_shmem_get_sg_table); > > diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c > index 9b44c78cd77f..54539a8929c1 100644 > --- a/drivers/gpu/drm/drm_prime.c > +++ b/drivers/gpu/drm/drm_prime.c > @@ -835,44 +835,6 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops = { > .vunmap = drm_gem_dmabuf_vunmap, > }; > > -/** > - * drm_prime_pages_to_sg - converts a page array into an sg list > - * @dev: DRM device > - * @pages: pointer to the array of page pointers to convert > - * @nr_pages: length of the page vector > - * > - * This helper creates an sg table object from a set of pages > - * the driver is responsible for mapping the pages into the > - * importers address space for use with dma_buf itself. > - * > - * This is useful for implementing &drm_gem_object_funcs.get_sg_table. > - */ > -struct sg_table *drm_prime_pages_to_sg(struct drm_device *dev, > - struct page **pages, unsigned int nr_pages) > -{ > - struct sg_table *sg; > - size_t max_segment = 0; > - int err; > - > - sg = kmalloc_obj(struct sg_table); > - if (!sg) > - return ERR_PTR(-ENOMEM); > - > - if (dev) > - max_segment = dma_max_mapping_size(drm_dev_dma_dev(dev)); > - if (max_segment == 0) > - max_segment = UINT_MAX; > - err = sg_alloc_table_from_pages_segment(sg, pages, nr_pages, 0, > - (unsigned long)nr_pages << PAGE_SHIFT, > - max_segment, GFP_KERNEL); > - if (err) { > - kfree(sg); > - sg = ERR_PTR(err); > - } > - return sg; > -} > -EXPORT_SYMBOL(drm_prime_pages_to_sg); > - > /** > * drm_prime_get_contiguous_size - returns the contiguous size of the buffer > * @sgt: sg_table describing the buffer to check > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c > index b0436a1e103f..a8e8614f8210 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c > @@ -3,7 +3,6 @@ > * Copyright (C) 2015-2018 Etnaviv Project > */ > > -#include > #include > #include > #include > @@ -104,7 +103,7 @@ struct page **etnaviv_gem_get_pages(struct etnaviv_gem_object *etnaviv_obj) > unsigned int npages = etnaviv_obj->base.size >> PAGE_SHIFT; > struct sg_table *sgt; > > - sgt = drm_prime_pages_to_sg(dev, etnaviv_obj->pages, npages); > + sgt = drm_pages_to_sg(dev, etnaviv_obj->pages, npages); > if (IS_ERR(sgt)) { > dev_err(dev->dev, "failed to allocate sgt: %ld\n", > PTR_ERR(sgt)); > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c > index 6757ae6ec304..f44484325ddb 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c > @@ -3,6 +3,7 @@ > * Copyright (C) 2014-2018 Etnaviv Project > */ > > +#include > #include > #include > #include > @@ -22,7 +23,7 @@ struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj) > if (WARN_ON(!etnaviv_obj->pages)) /* should have already pinned! */ > return ERR_PTR(-EINVAL); > > - return drm_prime_pages_to_sg(obj->dev, etnaviv_obj->pages, npages); > + return drm_pages_to_sg(obj->dev, etnaviv_obj->pages, npages); > } > > int etnaviv_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map) > diff --git a/drivers/gpu/drm/loongson/lsdc_gem.c b/drivers/gpu/drm/loongson/lsdc_gem.c > index 2fb03487c983..37160228244c 100644 > --- a/drivers/gpu/drm/loongson/lsdc_gem.c > +++ b/drivers/gpu/drm/loongson/lsdc_gem.c > @@ -9,7 +9,6 @@ > #include > #include > #include > -#include > #include > > #include "lsdc_drv.h" > @@ -51,7 +50,7 @@ static struct sg_table *lsdc_gem_prime_get_sg_table(struct drm_gem_object *obj) > return ERR_PTR(-ENOMEM); > } > > - return drm_prime_pages_to_sg(obj->dev, tt->pages, tt->num_pages); > + return drm_pages_to_sg(obj->dev, tt->pages, tt->num_pages); > } > > static void lsdc_gem_object_free(struct drm_gem_object *obj) > diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c > index efd3d3c9a449..7e3418290c22 100644 > --- a/drivers/gpu/drm/msm/msm_gem.c > +++ b/drivers/gpu/drm/msm/msm_gem.c > @@ -207,7 +207,7 @@ static struct page **get_pages(struct drm_gem_object *obj) > > msm_obj->pages = p; > > - msm_obj->sgt = drm_prime_pages_to_sg(obj->dev, p, npages); > + msm_obj->sgt = drm_pages_to_sg(obj->dev, p, npages); > if (IS_ERR(msm_obj->sgt)) { > void *ptr = ERR_CAST(msm_obj->sgt); > > diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c b/drivers/gpu/drm/msm/msm_gem_prime.c > index 036d34c674d9..d25393a9e549 100644 > --- a/drivers/gpu/drm/msm/msm_gem_prime.c > +++ b/drivers/gpu/drm/msm/msm_gem_prime.c > @@ -23,7 +23,7 @@ struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj) > if (WARN_ON(!msm_obj->pages)) /* should have already pinned! */ > return ERR_PTR(-ENOMEM); > > - return drm_prime_pages_to_sg(obj->dev, msm_obj->pages, npages); > + return drm_pages_to_sg(obj->dev, msm_obj->pages, npages); > } > > int msm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map) > diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c > index caab60fc62f6..b95f2f07df74 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_prime.c > +++ b/drivers/gpu/drm/nouveau/nouveau_prime.c > @@ -32,8 +32,8 @@ struct sg_table *nouveau_gem_prime_get_sg_table(struct drm_gem_object *obj) > { > struct nouveau_bo *nvbo = nouveau_gem_object(obj); > > - return drm_prime_pages_to_sg(obj->dev, nvbo->bo.ttm->pages, > - nvbo->bo.ttm->num_pages); > + return drm_pages_to_sg(obj->dev, nvbo->bo.ttm->pages, > + nvbo->bo.ttm->num_pages); > } > > struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev, > diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c > index 9855df738194..ec530d254fa4 100644 > --- a/drivers/gpu/drm/panthor/panthor_gem.c > +++ b/drivers/gpu/drm/panthor/panthor_gem.c > @@ -321,8 +321,8 @@ panthor_gem_dev_map_get_sgt_locked(struct panthor_gem_object *bo) > if (ret) > return ERR_PTR(ret); > > - sgt = drm_prime_pages_to_sg(bo->base.dev, bo->backing.pages, > - bo->base.size >> PAGE_SHIFT); > + sgt = drm_pages_to_sg(bo->base.dev, bo->backing.pages, > + bo->base.size >> PAGE_SHIFT); > if (IS_ERR(sgt)) > return sgt; > > @@ -702,7 +702,7 @@ static struct sg_table *panthor_gem_get_sg_table(struct drm_gem_object *obj) > drm_WARN_ON_ONCE(obj->dev, !bo->backing.pages); > drm_WARN_ON_ONCE(obj->dev, !refcount_read(&bo->backing.pin_count)); > > - return drm_prime_pages_to_sg(obj->dev, bo->backing.pages, obj->size >> PAGE_SHIFT); > + return drm_pages_to_sg(obj->dev, bo->backing.pages, obj->size >> PAGE_SHIFT); > } > > static int panthor_gem_vmap_locked(struct drm_gem_object *obj, > diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c > index a77881f035e7..4cfc4282a59c 100644 > --- a/drivers/gpu/drm/radeon/radeon_prime.c > +++ b/drivers/gpu/drm/radeon/radeon_prime.c > @@ -26,6 +26,7 @@ > > #include > > +#include > #include > #include > > @@ -38,8 +39,8 @@ struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj) > { > struct radeon_bo *bo = gem_to_radeon_bo(obj); > > - return drm_prime_pages_to_sg(obj->dev, bo->tbo.ttm->pages, > - bo->tbo.ttm->num_pages); > + return drm_pages_to_sg(obj->dev, bo->tbo.ttm->pages, > + bo->tbo.ttm->num_pages); > } > > struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev, > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > index b188539dca0b..7897da0becf4 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > @@ -89,8 +89,8 @@ static int rockchip_gem_get_pages(struct rockchip_gem_object *rk_obj) > > rk_obj->num_pages = rk_obj->base.size >> PAGE_SHIFT; > > - rk_obj->sgt = drm_prime_pages_to_sg(rk_obj->base.dev, > - rk_obj->pages, rk_obj->num_pages); > + rk_obj->sgt = drm_pages_to_sg(rk_obj->base.dev, > + rk_obj->pages, rk_obj->num_pages); > if (IS_ERR(rk_obj->sgt)) { > ret = PTR_ERR(rk_obj->sgt); > goto err_put_pages; > @@ -432,7 +432,7 @@ struct sg_table *rockchip_gem_prime_get_sg_table(struct drm_gem_object *obj) > int ret; > > if (rk_obj->pages) > - return drm_prime_pages_to_sg(obj->dev, rk_obj->pages, rk_obj->num_pages); > + return drm_pages_to_sg(obj->dev, rk_obj->pages, rk_obj->num_pages); > > sgt = kzalloc_obj(*sgt); > if (!sgt) > diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c > index 436394e04812..701af672b4e5 100644 > --- a/drivers/gpu/drm/tegra/gem.c > +++ b/drivers/gpu/drm/tegra/gem.c > @@ -17,7 +17,7 @@ > > #include > #include > -#include > +#include > > #include "drm.h" > #include "gem.h" > @@ -352,7 +352,7 @@ static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo) > > bo->num_pages = bo->gem.size >> PAGE_SHIFT; > > - bo->sgt = drm_prime_pages_to_sg(bo->gem.dev, bo->pages, bo->num_pages); > + bo->sgt = drm_pages_to_sg(bo->gem.dev, bo->pages, bo->num_pages); > if (IS_ERR(bo->sgt)) { > err = PTR_ERR(bo->sgt); > goto put_pages; > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c > index 39f8c46550c2..c9e7f2e3668c 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c > @@ -28,7 +28,7 @@ > #include "vmwgfx_bo.h" > #include "vmwgfx_drv.h" > > -#include "drm/drm_prime.h" > +#include "drm/drm_gem.h" > #include "drm/drm_gem_ttm_helper.h" > > #include > @@ -76,7 +76,7 @@ static struct sg_table *vmw_gem_object_get_sg_table(struct drm_gem_object *obj) > if (vmw_tt->vsgt.sgt) > return vmw_tt->vsgt.sgt; > > - return drm_prime_pages_to_sg(obj->dev, vmw_tt->dma_ttm.pages, vmw_tt->dma_ttm.num_pages); > + return drm_pages_to_sg(obj->dev, vmw_tt->dma_ttm.pages, vmw_tt->dma_ttm.num_pages); > } > > static int vmw_gem_vmap(struct drm_gem_object *obj, struct iosys_map *map) > diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c > index 8a920e58245c..f0fe80706b79 100644 > --- a/drivers/gpu/drm/xe/xe_dma_buf.c > +++ b/drivers/gpu/drm/xe/xe_dma_buf.c > @@ -118,9 +118,9 @@ static struct sg_table *xe_dma_buf_map(struct dma_buf_attachment *attach, > > switch (bo->ttm.resource->mem_type) { > case XE_PL_TT: > - sgt = drm_prime_pages_to_sg(obj->dev, > - bo->ttm.ttm->pages, > - obj->size >> PAGE_SHIFT); > + sgt = drm_pages_to_sg(obj->dev, > + bo->ttm.ttm->pages, > + obj->size >> PAGE_SHIFT); > if (IS_ERR(sgt)) > return sgt; > > diff --git a/drivers/gpu/drm/xen/xen_drm_front_gem.c b/drivers/gpu/drm/xen/xen_drm_front_gem.c > index eec4c1da3f9e..a4a7c7f2c91c 100644 > --- a/drivers/gpu/drm/xen/xen_drm_front_gem.c > +++ b/drivers/gpu/drm/xen/xen_drm_front_gem.c > @@ -236,7 +236,7 @@ struct sg_table *xen_drm_front_gem_get_sg_table(struct drm_gem_object *gem_obj) > if (!xen_obj->pages) > return ERR_PTR(-ENOMEM); > > - return drm_prime_pages_to_sg(gem_obj->dev, > + return drm_pages_to_sg(gem_obj->dev, > xen_obj->pages, xen_obj->num_pages); > } > > diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h > index 885244e375d3..7b9cc6335689 100644 > --- a/include/drm/drm_gem.h > +++ b/include/drm/drm_gem.h > @@ -155,7 +155,7 @@ struct drm_gem_object_funcs { > * here cannot be used for sg tables pointing at driver private memory > * ranges. > * > - * See also drm_prime_pages_to_sg(). > + * See also drm_pages_to_sg(). > */ > struct sg_table *(*get_sg_table)(struct drm_gem_object *obj); > > @@ -589,6 +589,9 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj); > void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages, > bool dirty, bool accessed); > > +struct sg_table *drm_pages_to_sg(struct drm_device *dev, > + struct page **pages, unsigned int nr_pages); > + > void drm_gem_lock(struct drm_gem_object *obj); > void drm_gem_unlock(struct drm_gem_object *obj); > > diff --git a/include/drm/drm_prime.h b/include/drm/drm_prime.h > index f50f862f0d8b..603e16a40ae7 100644 > --- a/include/drm/drm_prime.h > +++ b/include/drm/drm_prime.h > @@ -92,8 +92,6 @@ void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, struct iosys_map *map); > int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); > int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma); > > -struct sg_table *drm_prime_pages_to_sg(struct drm_device *dev, > - struct page **pages, unsigned int nr_pages); > struct dma_buf *drm_gem_prime_export(struct drm_gem_object *obj, > int flags); > > > --- > base-commit: 48dd37d1fef33fbf42f1d6887c61e242fd21d00d > change-id: 20260724-get_pages-e2e91c53eaa3 > > Best regards, > -- > Adrián Larumbe > -- ==================== | I would like to | | fix the world, | | but they're not | | giving me the | \ source code! / --------------- ¯\_(ツ)_/¯ 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3379FC53219 for ; Tue, 28 Jul 2026 14:35:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=R1avwdFQQH7loNB1ufGUF9Hyu/agxccjpY1PDNDlDbk=; b=vIJ9u1M8rAHAVA LoCsNh0r8a1kHBXH3HhOxCy6uVKOtUZRYD6X3WAm88jC8gMSZq3AX6LzZM6T5yGe4Oho715+rLtd5 skYPmeDRIDGVd2/S1jgAnugKBczLcnldel40BdlOV4WV1VZymytQrBn1mKlbRvEkfnzUBGG+PMN1G ehkh6Asp3X+7qh9QLSv7wxphaITPx+lXlM1iqzKpVXNSIBYhmpLovEYZ0SHLleMcZNFsKCewo8YFi TNb5qerWpzHl9vaSlR5WWcxIFjeKFh+4TWK8ihRqesp+MWbxX+tSoMLFIRU5IsT6n4gAKDWlPk5E7 Jy6z4KtJHJ6IECgeqzvg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1woitv-00000005WAy-2zpU; Tue, 28 Jul 2026 14:35:23 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1woito-00000005W8W-25am for linux-rockchip@lists.infradead.org; Tue, 28 Jul 2026 14:35:22 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 607C9175D for ; Tue, 28 Jul 2026 07:35:08 -0700 (PDT) Received: from [10.2.11.34] (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 236543F66F for ; Tue, 28 Jul 2026 07:35:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1785249312; bh=Inv7KrlemkdgK5E3nHXTAHNRQzVGjk/0dJV4TgUWtLg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=X9SFQKDqKdiAJJpYGpeAQhsdUiK8udq6P1syVxbE4WSmEuCa5FgiKswWq+PLunxXo v6nkaJbmskWwG8OVuZO2q2+/TLI5HIAUmF86SBVjbMwrqJIsHZTTHPCX+tTNStgyEY +4aTUOqnuY0kCpJOZwdgUoPq3xP6lMiBHmCthp7A= Date: Tue, 28 Jul 2026 15:34:00 +0100 From: Liviu Dudau To: =?utf-8?Q?Adri=C3=A1n?= Larumbe Cc: Alex Deucher , Christian =?utf-8?B?S8O2bmln?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Lucas Stach , Russell King , Christian Gmeiner , Jianmin Lv , Qianhai Wu , Huacai Chen , Mingcong Bai , Xi Ruoyao , Icenowy Zheng , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Lyude Paul , Danilo Krummrich , Boris Brezillon , Steven Price , Sandy Huang , Heiko =?utf-8?Q?St=C3=BCbner?= , Andy Yan , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Zack Rusin , Broadcom internal kernel review list , Matthew Brost , Thomas =?utf-8?Q?Hellstr=C3=B6m?= , Rodrigo Vivi , Oleksandr Andrushchenko , Sumit Semwal , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, etnaviv@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, nouveau@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-tegra@vger.kernel.org, intel-xe@lists.freedesktop.org, xen-devel@lists.xenproject.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org Subject: Re: [PATCH] drm/gem: Move pages_to_sg helper into drm_gem.c Message-ID: References: <20260724-get_pages-v1-1-b10e5d65628e@collabora.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20260724-get_pages-v1-1-b10e5d65628e@collabora.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260728_073516_626133_9C18A23F X-CRM114-Status: GOOD ( 33.25 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org T24gRnJpLCBKdWwgMjQsIDIwMjYgYXQgMDE6MDg6NThQTSArMDEwMCwgQWRyacOhbiBMYXJ1bWJl IHdyb3RlOgo+IE5vbmUgb2YgdGhlIHNlbWFudGljcyBvZiB0aGUgZnVuY3Rpb24gdGVsbCBvZiBp dCBiZWluZyBhIFBSSU1FLWV4Y2x1c2l2ZQo+IGVudHJ5IHBvaW50LiBJbiBmYWN0LCBtb3N0IGRy aXZlcnMgc2VlbSB0byBiZSB1c2luZyBpdCB0byB0cmFuc2xhdGUgYSBsaXN0Cj4gb2YgcGFnZXMg aW50byBhbiBzZyB0YWJsZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBHUFUgbWFwcGluZyBsYXRlciBv biwgcmF0aGVyCj4gdGhhbiBqdXN0IGZvciBzaGFyaW5nIGFuIG9iamVjdCdzIHBhZ2VzIHdpdGgg YW5vdGhlciBkcml2ZXIuCj4gCj4gTW92ZSBpdCBhY3Jvc3MgZmlsZXMgYW5kIHJlbmFtZSBhY2Nv cmRpbmdseS4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBBZHJpw6FuIExhcnVtYmUgPGFkcmlhbi5sYXJ1 bWJlQGNvbGxhYm9yYS5jb20+Cj4gLS0tCj4gZHJtX3ByaW1lX3BhZ2VzX3RvX3NnKCkgaGFzIG5v IHJlYWwgZGVwZW5kZW5jeSBvbiBQUklNRS9kbWEtYnVmIGludGVyZmFjZXMuCj4gSXQgaXMgYSBn ZW5lcmljIGhlbHBlciB0aGF0IGNvbnZlcnRzIGEgcGFnZSBhcnJheSBpbnRvIGEgc2NhdHRlci9n YXRoZXIKPiB0YWJsZSB2aWEgZG1hX21hcF9zZ19hdHRycy4gTm90aGluZyBpbiBpdHMgaW1wbGVt ZW50YXRpb24gdG91Y2hlcyBzdHJ1Y3QKPiBkbWFfYnVmIG9yIGltcG9ydC9leHBvcnQgbG9naWMu Cj4gLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9kbWFfYnVmLmMgfCAg NiArKy0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jICAgICAgICAgICAgICAgICAgIHwg MzUgKysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgZHJpdmVycy9ncHUvZHJtL2RybV9nZW1f c2htZW1faGVscGVyLmMgICAgICB8ICAyICstCj4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fcHJpbWUu YyAgICAgICAgICAgICAgICAgfCAzOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICBk cml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dlbS5jICAgICAgIHwgIDMgKy0tCj4gIGRy aXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ2VtX3ByaW1lLmMgfCAgMyArKy0KPiAgZHJp dmVycy9ncHUvZHJtL2xvb25nc29uL2xzZGNfZ2VtLmMgICAgICAgICB8ICAzICstLQo+ICBkcml2 ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uYyAgICAgICAgICAgICAgIHwgIDIgKy0KPiAgZHJpdmVy cy9ncHUvZHJtL21zbS9tc21fZ2VtX3ByaW1lLmMgICAgICAgICB8ICAyICstCj4gIGRyaXZlcnMv Z3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcHJpbWUuYyAgICAgfCAgNCArLS0KPiAgZHJpdmVycy9n cHUvZHJtL3BhbnRob3IvcGFudGhvcl9nZW0uYyAgICAgICB8ICA2ICsrLS0tCgpGb3IgUGFudGhv ciBhbmQgdGhlIGdlbmVyYWwgcmVuYW1lOgoKUmV2aWV3ZWQtYnk6IExpdml1IER1ZGF1IDxsaXZp dS5kdWRhdUBhcm0uY29tPgoKQmVzdCByZWdhcmRzLApMaXZpdQoKPiAgZHJpdmVycy9ncHUvZHJt L3JhZGVvbi9yYWRlb25fcHJpbWUuYyAgICAgICB8ICA1ICsrLS0KPiAgZHJpdmVycy9ncHUvZHJt L3JvY2tjaGlwL3JvY2tjaGlwX2RybV9nZW0uYyB8ICA2ICsrLS0tCj4gIGRyaXZlcnMvZ3B1L2Ry bS90ZWdyYS9nZW0uYyAgICAgICAgICAgICAgICAgfCAgNCArLS0KPiAgZHJpdmVycy9ncHUvZHJt L3Ztd2dmeC92bXdnZnhfZ2VtLmMgICAgICAgICB8ICA0ICstLQo+ICBkcml2ZXJzL2dwdS9kcm0v eGUveGVfZG1hX2J1Zi5jICAgICAgICAgICAgIHwgIDYgKystLS0KPiAgZHJpdmVycy9ncHUvZHJt L3hlbi94ZW5fZHJtX2Zyb250X2dlbS5jICAgICB8ICAyICstCj4gIGluY2x1ZGUvZHJtL2RybV9n ZW0uaCAgICAgICAgICAgICAgICAgICAgICAgfCAgNSArKystCj4gIGluY2x1ZGUvZHJtL2RybV9w cmltZS5oICAgICAgICAgICAgICAgICAgICAgfCAgMiAtLQo+ICAxOSBmaWxlcyBjaGFuZ2VkLCA2 OCBpbnNlcnRpb25zKCspLCA3MCBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RtYV9idWYuYyBiL2RyaXZlcnMvZ3B1L2RybS9h bWQvYW1kZ3B1L2FtZGdwdV9kbWFfYnVmLmMKPiBpbmRleCBiMzNjMzAwZTI2ZTIuLmM5YTk4YWVj N2ViNiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZG1h X2J1Zi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RtYV9idWYu Ywo+IEBAIC0yMDMsOSArMjAzLDkgQEAgc3RhdGljIHN0cnVjdCBzZ190YWJsZSAqYW1kZ3B1X2Rt YV9idWZfbWFwKHN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaCwKPiAgCj4gIAlzd2l0 Y2ggKGJvLT50Ym8ucmVzb3VyY2UtPm1lbV90eXBlKSB7Cj4gIAljYXNlIFRUTV9QTF9UVDoKPiAt CQlzZ3QgPSBkcm1fcHJpbWVfcGFnZXNfdG9fc2cob2JqLT5kZXYsCj4gLQkJCQkJICAgIGJvLT50 Ym8udHRtLT5wYWdlcywKPiAtCQkJCQkgICAgYm8tPnRiby50dG0tPm51bV9wYWdlcyk7Cj4gKwkJ c2d0ID0gZHJtX3BhZ2VzX3RvX3NnKG9iai0+ZGV2LAo+ICsJCQkJICAgICAgYm8tPnRiby50dG0t PnBhZ2VzLAo+ICsJCQkJICAgICAgYm8tPnRiby50dG0tPm51bV9wYWdlcyk7Cj4gIAkJaWYgKElT X0VSUihzZ3QpKQo+ICAJCQlyZXR1cm4gc2d0Owo+ICAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2RybV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKPiBpbmRleCAwMThk Zjk3ZDU5MGQuLjIyYzhhM2I1ZjY2NyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJt X2dlbS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYwo+IEBAIC03ODAsNiArNzgw LDQxIEBAIHZvaWQgZHJtX2dlbV9wdXRfcGFnZXMoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmos IHN0cnVjdCBwYWdlICoqcGFnZXMsCj4gIH0KPiAgRVhQT1JUX1NZTUJPTChkcm1fZ2VtX3B1dF9w YWdlcyk7Cj4gIAo+ICsvKioKPiArICogZHJtX3BhZ2VzX3RvX3NnIC0gY29udmVydHMgYSBwYWdl IGFycmF5IGludG8gYW4gc2cgbGlzdAo+ICsgKiBAZGV2OiBEUk0gZGV2aWNlCj4gKyAqIEBwYWdl czogcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgcGFnZSBwb2ludGVycyB0byBjb252ZXJ0Cj4gKyAq IEBucl9wYWdlczogbGVuZ3RoIG9mIHRoZSBwYWdlIHZlY3Rvcgo+ICsgKgo+ICsgKiBUaGlzIGhl bHBlciBjcmVhdGVzIGFuIHNnIHRhYmxlIG9iamVjdCBmcm9tIGEgc2V0IG9mIHBhZ2VzLgo+ICsg KiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nICZkcm1fZ2VtX29iamVjdF9mdW5jcy5n ZXRfc2dfdGFibGUuCj4gKyAqLwo+ICtzdHJ1Y3Qgc2dfdGFibGUgKmRybV9wYWdlc190b19zZyhz dHJ1Y3QgZHJtX2RldmljZSAqZGV2LAo+ICsJCQkJIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2ln bmVkIGludCBucl9wYWdlcykKPiArewo+ICsJc3RydWN0IHNnX3RhYmxlICpzZzsKPiArCXNpemVf dCBtYXhfc2VnbWVudCA9IDA7Cj4gKwlpbnQgZXJyOwo+ICsKPiArCXNnID0ga21hbGxvY19vYmoo c3RydWN0IHNnX3RhYmxlKTsKPiArCWlmICghc2cpCj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01F TSk7Cj4gKwo+ICsJaWYgKGRldikKPiArCQltYXhfc2VnbWVudCA9IGRtYV9tYXhfbWFwcGluZ19z aXplKGRybV9kZXZfZG1hX2RldihkZXYpKTsKPiArCWlmIChtYXhfc2VnbWVudCA9PSAwKQo+ICsJ CW1heF9zZWdtZW50ID0gVUlOVF9NQVg7Cj4gKwllcnIgPSBzZ19hbGxvY190YWJsZV9mcm9tX3Bh Z2VzX3NlZ21lbnQoc2csIHBhZ2VzLCBucl9wYWdlcywgMCwKPiArCQkJCQkJKHVuc2lnbmVkIGxv bmcpbnJfcGFnZXMgPDwgUEFHRV9TSElGVCwKPiArCQkJCQkJbWF4X3NlZ21lbnQsIEdGUF9LRVJO RUwpOwo+ICsJaWYgKGVycikgewo+ICsJCWtmcmVlKHNnKTsKPiArCQlzZyA9IEVSUl9QVFIoZXJy KTsKPiArCX0KPiArCXJldHVybiBzZzsKPiArfQo+ICtFWFBPUlRfU1lNQk9MKGRybV9wYWdlc190 b19zZyk7Cj4gKwo+ICBzdGF0aWMgaW50IG9iamVjdHNfbG9va3VwKHN0cnVjdCBkcm1fZmlsZSAq ZmlscCwgdTMyICpoYW5kbGUsIGludCBjb3VudCwKPiAgCQkJICBzdHJ1Y3QgZHJtX2dlbV9vYmpl Y3QgKipvYmpzKQo+ICB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtX3No bWVtX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nZW1fc2htZW1faGVscGVyLmMKPiBp bmRleCAyMmVjNTJlMmZmYjguLjE0NGQwODhhNDc3ZiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vZHJtX2dlbV9zaG1lbV9oZWxwZXIuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1f Z2VtX3NobWVtX2hlbHBlci5jCj4gQEAgLTgyNSw3ICs4MjUsNyBAQCBzdHJ1Y3Qgc2dfdGFibGUg KmRybV9nZW1fc2htZW1fZ2V0X3NnX3RhYmxlKHN0cnVjdCBkcm1fZ2VtX3NobWVtX29iamVjdCAq c2htZW0pCj4gIAo+ICAJZHJtX1dBUk5fT04ob2JqLT5kZXYsIGRybV9nZW1faXNfaW1wb3J0ZWQo b2JqKSk7Cj4gIAo+IC0JcmV0dXJuIGRybV9wcmltZV9wYWdlc190b19zZyhvYmotPmRldiwgc2ht ZW0tPnBhZ2VzLCBvYmotPnNpemUgPj4gUEFHRV9TSElGVCk7Cj4gKwlyZXR1cm4gZHJtX3BhZ2Vz X3RvX3NnKG9iai0+ZGV2LCBzaG1lbS0+cGFnZXMsIG9iai0+c2l6ZSA+PiBQQUdFX1NISUZUKTsK PiAgfQo+ICBFWFBPUlRfU1lNQk9MX0dQTChkcm1fZ2VtX3NobWVtX2dldF9zZ190YWJsZSk7Cj4g IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ByaW1lLmMgYi9kcml2ZXJzL2dw dS9kcm0vZHJtX3ByaW1lLmMKPiBpbmRleCA5YjQ0Yzc4Y2Q3N2YuLjU0NTM5YTg5MjljMSAxMDA2 NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ByaW1lLmMKPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vZHJtX3ByaW1lLmMKPiBAQCAtODM1LDQ0ICs4MzUsNiBAQCBzdGF0aWMgY29uc3Qgc3Ry dWN0IGRtYV9idWZfb3BzIGRybV9nZW1fcHJpbWVfZG1hYnVmX29wcyA9ICB7Cj4gIAkudnVubWFw ID0gZHJtX2dlbV9kbWFidWZfdnVubWFwLAo+ICB9Owo+ICAKPiAtLyoqCj4gLSAqIGRybV9wcmlt ZV9wYWdlc190b19zZyAtIGNvbnZlcnRzIGEgcGFnZSBhcnJheSBpbnRvIGFuIHNnIGxpc3QKPiAt ICogQGRldjogRFJNIGRldmljZQo+IC0gKiBAcGFnZXM6IHBvaW50ZXIgdG8gdGhlIGFycmF5IG9m IHBhZ2UgcG9pbnRlcnMgdG8gY29udmVydAo+IC0gKiBAbnJfcGFnZXM6IGxlbmd0aCBvZiB0aGUg cGFnZSB2ZWN0b3IKPiAtICoKPiAtICogVGhpcyBoZWxwZXIgY3JlYXRlcyBhbiBzZyB0YWJsZSBv YmplY3QgZnJvbSBhIHNldCBvZiBwYWdlcwo+IC0gKiB0aGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxl IGZvciBtYXBwaW5nIHRoZSBwYWdlcyBpbnRvIHRoZQo+IC0gKiBpbXBvcnRlcnMgYWRkcmVzcyBz cGFjZSBmb3IgdXNlIHdpdGggZG1hX2J1ZiBpdHNlbGYuCj4gLSAqCj4gLSAqIFRoaXMgaXMgdXNl ZnVsIGZvciBpbXBsZW1lbnRpbmcgJmRybV9nZW1fb2JqZWN0X2Z1bmNzLmdldF9zZ190YWJsZS4K PiAtICovCj4gLXN0cnVjdCBzZ190YWJsZSAqZHJtX3ByaW1lX3BhZ2VzX3RvX3NnKHN0cnVjdCBk cm1fZGV2aWNlICpkZXYsCj4gLQkJCQkgICAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWdu ZWQgaW50IG5yX3BhZ2VzKQo+IC17Cj4gLQlzdHJ1Y3Qgc2dfdGFibGUgKnNnOwo+IC0Jc2l6ZV90 IG1heF9zZWdtZW50ID0gMDsKPiAtCWludCBlcnI7Cj4gLQo+IC0Jc2cgPSBrbWFsbG9jX29iaihz dHJ1Y3Qgc2dfdGFibGUpOwo+IC0JaWYgKCFzZykKPiAtCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVN KTsKPiAtCj4gLQlpZiAoZGV2KQo+IC0JCW1heF9zZWdtZW50ID0gZG1hX21heF9tYXBwaW5nX3Np emUoZHJtX2Rldl9kbWFfZGV2KGRldikpOwo+IC0JaWYgKG1heF9zZWdtZW50ID09IDApCj4gLQkJ bWF4X3NlZ21lbnQgPSBVSU5UX01BWDsKPiAtCWVyciA9IHNnX2FsbG9jX3RhYmxlX2Zyb21fcGFn ZXNfc2VnbWVudChzZywgcGFnZXMsIG5yX3BhZ2VzLCAwLAo+IC0JCQkJCQkodW5zaWduZWQgbG9u Zylucl9wYWdlcyA8PCBQQUdFX1NISUZULAo+IC0JCQkJCQltYXhfc2VnbWVudCwgR0ZQX0tFUk5F TCk7Cj4gLQlpZiAoZXJyKSB7Cj4gLQkJa2ZyZWUoc2cpOwo+IC0JCXNnID0gRVJSX1BUUihlcnIp Owo+IC0JfQo+IC0JcmV0dXJuIHNnOwo+IC19Cj4gLUVYUE9SVF9TWU1CT0woZHJtX3ByaW1lX3Bh Z2VzX3RvX3NnKTsKPiAtCj4gIC8qKgo+ICAgKiBkcm1fcHJpbWVfZ2V0X2NvbnRpZ3VvdXNfc2l6 ZSAtIHJldHVybnMgdGhlIGNvbnRpZ3VvdXMgc2l6ZSBvZiB0aGUgYnVmZmVyCj4gICAqIEBzZ3Q6 IHNnX3RhYmxlIGRlc2NyaWJpbmcgdGhlIGJ1ZmZlciB0byBjaGVjawo+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2V0 bmF2aXYvZXRuYXZpdl9nZW0uYwo+IGluZGV4IGIwNDM2YTFlMTAzZi4uYThlODYxNGY4MjEwIDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ2VtLmMKPiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dlbS5jCj4gQEAgLTMsNyArMyw2IEBA Cj4gICAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE4IEV0bmF2aXYgUHJvamVjdAo+ICAgKi8KPiAg Cj4gLSNpbmNsdWRlIDxkcm0vZHJtX3ByaW1lLmg+Cj4gICNpbmNsdWRlIDxkcm0vZHJtX3ByaW50 Lmg+Cj4gICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgo+ICAjaW5jbHVkZSA8bGludXgv c2htZW1fZnMuaD4KPiBAQCAtMTA0LDcgKzEwMyw3IEBAIHN0cnVjdCBwYWdlICoqZXRuYXZpdl9n ZW1fZ2V0X3BhZ2VzKHN0cnVjdCBldG5hdml2X2dlbV9vYmplY3QgKmV0bmF2aXZfb2JqKQo+ICAJ CXVuc2lnbmVkIGludCBucGFnZXMgPSBldG5hdml2X29iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJ RlQ7Cj4gIAkJc3RydWN0IHNnX3RhYmxlICpzZ3Q7Cj4gIAo+IC0JCXNndCA9IGRybV9wcmltZV9w YWdlc190b19zZyhkZXYsIGV0bmF2aXZfb2JqLT5wYWdlcywgbnBhZ2VzKTsKPiArCQlzZ3QgPSBk cm1fcGFnZXNfdG9fc2coZGV2LCBldG5hdml2X29iai0+cGFnZXMsIG5wYWdlcyk7Cj4gIAkJaWYg KElTX0VSUihzZ3QpKSB7Cj4gIAkJCWRldl9lcnIoZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2Nh dGUgc2d0OiAlbGRcbiIsCj4gIAkJCQlQVFJfRVJSKHNndCkpOwo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dlbV9wcmltZS5jIGIvZHJpdmVycy9ncHUvZHJt L2V0bmF2aXYvZXRuYXZpdl9nZW1fcHJpbWUuYwo+IGluZGV4IDY3NTdhZTZlYzMwNC4uZjQ0NDg0 MzI1ZGRiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ2Vt X3ByaW1lLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dlbV9wcmlt ZS5jCj4gQEAgLTMsNiArMyw3IEBACj4gICAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE4IEV0bmF2 aXYgUHJvamVjdAo+ICAgKi8KPiAgCj4gKyNpbmNsdWRlIDxkcm0vZHJtX2dlbS5oPgo+ICAjaW5j bHVkZSA8ZHJtL2RybV9wcmltZS5oPgo+ICAjaW5jbHVkZSA8bGludXgvZG1hLWJ1Zi5oPgo+ICAj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gQEAgLTIyLDcgKzIzLDcgQEAgc3RydWN0IHNnX3Rh YmxlICpldG5hdml2X2dlbV9wcmltZV9nZXRfc2dfdGFibGUoc3RydWN0IGRybV9nZW1fb2JqZWN0 ICpvYmopCj4gIAlpZiAoV0FSTl9PTighZXRuYXZpdl9vYmotPnBhZ2VzKSkgIC8qIHNob3VsZCBo YXZlIGFscmVhZHkgcGlubmVkISAqLwo+ICAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwo+ICAK PiAtCXJldHVybiBkcm1fcHJpbWVfcGFnZXNfdG9fc2cob2JqLT5kZXYsIGV0bmF2aXZfb2JqLT5w YWdlcywgbnBhZ2VzKTsKPiArCXJldHVybiBkcm1fcGFnZXNfdG9fc2cob2JqLT5kZXYsIGV0bmF2 aXZfb2JqLT5wYWdlcywgbnBhZ2VzKTsKPiAgfQo+ICAKPiAgaW50IGV0bmF2aXZfZ2VtX3ByaW1l X3ZtYXAoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHN0cnVjdCBpb3N5c19tYXAgKm1hcCkK PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2xvb25nc29uL2xzZGNfZ2VtLmMgYi9kcml2 ZXJzL2dwdS9kcm0vbG9vbmdzb24vbHNkY19nZW0uYwo+IGluZGV4IDJmYjAzNDg3Yzk4My4uMzcx NjAyMjgyNDRjIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9sb29uZ3Nvbi9sc2RjX2dl bS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2xvb25nc29uL2xzZGNfZ2VtLmMKPiBAQCAtOSw3 ICs5LDYgQEAKPiAgI2luY2x1ZGUgPGRybS9kcm1fZHVtYl9idWZmZXJzLmg+Cj4gICNpbmNsdWRl IDxkcm0vZHJtX2ZpbGUuaD4KPiAgI2luY2x1ZGUgPGRybS9kcm1fZ2VtLmg+Cj4gLSNpbmNsdWRl IDxkcm0vZHJtX3ByaW1lLmg+Cj4gICNpbmNsdWRlIDxkcm0vZHJtX3ByaW50Lmg+Cj4gIAo+ICAj aW5jbHVkZSAibHNkY19kcnYuaCIKPiBAQCAtNTEsNyArNTAsNyBAQCBzdGF0aWMgc3RydWN0IHNn X3RhYmxlICpsc2RjX2dlbV9wcmltZV9nZXRfc2dfdGFibGUoc3RydWN0IGRybV9nZW1fb2JqZWN0 ICpvYmopCj4gIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gIAl9Cj4gIAo+IC0JcmV0dXJu IGRybV9wcmltZV9wYWdlc190b19zZyhvYmotPmRldiwgdHQtPnBhZ2VzLCB0dC0+bnVtX3BhZ2Vz KTsKPiArCXJldHVybiBkcm1fcGFnZXNfdG9fc2cob2JqLT5kZXYsIHR0LT5wYWdlcywgdHQtPm51 bV9wYWdlcyk7Cj4gIH0KPiAgCj4gIHN0YXRpYyB2b2lkIGxzZGNfZ2VtX29iamVjdF9mcmVlKHN0 cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v bXNtL21zbV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbS5jCj4gaW5kZXggZWZk M2QzYzlhNDQ5Li43ZTM0MTgyOTBjMjIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL21z bS9tc21fZ2VtLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uYwo+IEBAIC0y MDcsNyArMjA3LDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICoqZ2V0X3BhZ2VzKHN0cnVjdCBkcm1f Z2VtX29iamVjdCAqb2JqKQo+ICAKPiAgCQltc21fb2JqLT5wYWdlcyA9IHA7Cj4gIAo+IC0JCW1z bV9vYmotPnNndCA9IGRybV9wcmltZV9wYWdlc190b19zZyhvYmotPmRldiwgcCwgbnBhZ2VzKTsK PiArCQltc21fb2JqLT5zZ3QgPSBkcm1fcGFnZXNfdG9fc2cob2JqLT5kZXYsIHAsIG5wYWdlcyk7 Cj4gIAkJaWYgKElTX0VSUihtc21fb2JqLT5zZ3QpKSB7Cj4gIAkJCXZvaWQgKnB0ciA9IEVSUl9D QVNUKG1zbV9vYmotPnNndCk7Cj4gIAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNt L21zbV9nZW1fcHJpbWUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbV9wcmltZS5jCj4g aW5kZXggMDM2ZDM0YzY3NGQ5Li5kMjUzOTNhOWU1NDkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9n cHUvZHJtL21zbS9tc21fZ2VtX3ByaW1lLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21z bV9nZW1fcHJpbWUuYwo+IEBAIC0yMyw3ICsyMyw3IEBAIHN0cnVjdCBzZ190YWJsZSAqbXNtX2dl bV9wcmltZV9nZXRfc2dfdGFibGUoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCj4gIAlpZiAo V0FSTl9PTighbXNtX29iai0+cGFnZXMpKSAgLyogc2hvdWxkIGhhdmUgYWxyZWFkeSBwaW5uZWQh ICovCj4gIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gIAo+IC0JcmV0dXJuIGRybV9wcmlt ZV9wYWdlc190b19zZyhvYmotPmRldiwgbXNtX29iai0+cGFnZXMsIG5wYWdlcyk7Cj4gKwlyZXR1 cm4gZHJtX3BhZ2VzX3RvX3NnKG9iai0+ZGV2LCBtc21fb2JqLT5wYWdlcywgbnBhZ2VzKTsKPiAg fQo+ICAKPiAgaW50IG1zbV9nZW1fcHJpbWVfdm1hcChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9i aiwgc3RydWN0IGlvc3lzX21hcCAqbWFwKQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v bm91dmVhdS9ub3V2ZWF1X3ByaW1lLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1 X3ByaW1lLmMKPiBpbmRleCBjYWFiNjBmYzYyZjYuLmI5NWYyZjA3ZGY3NCAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ByaW1lLmMKPiArKysgYi9kcml2ZXJz L2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ByaW1lLmMKPiBAQCAtMzIsOCArMzIsOCBAQCBzdHJ1 Y3Qgc2dfdGFibGUgKm5vdXZlYXVfZ2VtX3ByaW1lX2dldF9zZ190YWJsZShzdHJ1Y3QgZHJtX2dl bV9vYmplY3QgKm9iaikKPiAgewo+ICAJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1 X2dlbV9vYmplY3Qob2JqKTsKPiAgCj4gLQlyZXR1cm4gZHJtX3ByaW1lX3BhZ2VzX3RvX3NnKG9i ai0+ZGV2LCBudmJvLT5iby50dG0tPnBhZ2VzLAo+IC0JCQkJICAgICBudmJvLT5iby50dG0tPm51 bV9wYWdlcyk7Cj4gKwlyZXR1cm4gZHJtX3BhZ2VzX3RvX3NnKG9iai0+ZGV2LCBudmJvLT5iby50 dG0tPnBhZ2VzLAo+ICsJCQkgICAgICAgbnZiby0+Ym8udHRtLT5udW1fcGFnZXMpOwo+ICB9Cj4g IAo+ICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm5vdXZlYXVfZ2VtX3ByaW1lX2ltcG9ydF9zZ190 YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vcGFudGhvci9wYW50aG9yX2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL3BhbnRob3IvcGFudGhv cl9nZW0uYwo+IGluZGV4IDk4NTVkZjczODE5NC4uZWM1MzBkMjU0ZmE0IDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9wYW50aG9yL3BhbnRob3JfZ2VtLmMKPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vcGFudGhvci9wYW50aG9yX2dlbS5jCj4gQEAgLTMyMSw4ICszMjEsOCBAQCBwYW50aG9y X2dlbV9kZXZfbWFwX2dldF9zZ3RfbG9ja2VkKHN0cnVjdCBwYW50aG9yX2dlbV9vYmplY3QgKmJv KQo+ICAJaWYgKHJldCkKPiAgCQlyZXR1cm4gRVJSX1BUUihyZXQpOwo+ICAKPiAtCXNndCA9IGRy bV9wcmltZV9wYWdlc190b19zZyhiby0+YmFzZS5kZXYsIGJvLT5iYWNraW5nLnBhZ2VzLAo+IC0J CQkJICAgIGJvLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVCk7Cj4gKwlzZ3QgPSBkcm1fcGFnZXNf dG9fc2coYm8tPmJhc2UuZGV2LCBiby0+YmFja2luZy5wYWdlcywKPiArCQkJICAgICAgYm8tPmJh c2Uuc2l6ZSA+PiBQQUdFX1NISUZUKTsKPiAgCWlmIChJU19FUlIoc2d0KSkKPiAgCQlyZXR1cm4g c2d0Owo+ICAKPiBAQCAtNzAyLDcgKzcwMiw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKnBh bnRob3JfZ2VtX2dldF9zZ190YWJsZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKPiAgCWRy bV9XQVJOX09OX09OQ0Uob2JqLT5kZXYsICFiby0+YmFja2luZy5wYWdlcyk7Cj4gIAlkcm1fV0FS Tl9PTl9PTkNFKG9iai0+ZGV2LCAhcmVmY291bnRfcmVhZCgmYm8tPmJhY2tpbmcucGluX2NvdW50 KSk7Cj4gIAo+IC0JcmV0dXJuIGRybV9wcmltZV9wYWdlc190b19zZyhvYmotPmRldiwgYm8tPmJh Y2tpbmcucGFnZXMsIG9iai0+c2l6ZSA+PiBQQUdFX1NISUZUKTsKPiArCXJldHVybiBkcm1fcGFn ZXNfdG9fc2cob2JqLT5kZXYsIGJvLT5iYWNraW5nLnBhZ2VzLCBvYmotPnNpemUgPj4gUEFHRV9T SElGVCk7Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQgcGFudGhvcl9nZW1fdm1hcF9sb2NrZWQoc3Ry dWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9y YWRlb24vcmFkZW9uX3ByaW1lLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wcmlt ZS5jCj4gaW5kZXggYTc3ODgxZjAzNWU3Li40Y2ZjNDI4MmE1OWMgMTAwNjQ0Cj4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcHJpbWUuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9yYWRlb24vcmFkZW9uX3ByaW1lLmMKPiBAQCAtMjYsNiArMjYsNyBAQAo+ICAKPiAgI2luY2x1 ZGUgPGxpbnV4L2RtYS1idWYuaD4KPiAgCj4gKyNpbmNsdWRlIDxkcm0vZHJtX2dlbS5oPgo+ICAj aW5jbHVkZSA8ZHJtL2RybV9wcmltZS5oPgo+ICAjaW5jbHVkZSA8ZHJtL3JhZGVvbl9kcm0uaD4K PiAgCj4gQEAgLTM4LDggKzM5LDggQEAgc3RydWN0IHNnX3RhYmxlICpyYWRlb25fZ2VtX3ByaW1l X2dldF9zZ190YWJsZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKPiAgewo+ICAJc3RydWN0 IHJhZGVvbl9ibyAqYm8gPSBnZW1fdG9fcmFkZW9uX2JvKG9iaik7Cj4gIAo+IC0JcmV0dXJuIGRy bV9wcmltZV9wYWdlc190b19zZyhvYmotPmRldiwgYm8tPnRiby50dG0tPnBhZ2VzLAo+IC0JCQkJ ICAgICBiby0+dGJvLnR0bS0+bnVtX3BhZ2VzKTsKPiArCXJldHVybiBkcm1fcGFnZXNfdG9fc2co b2JqLT5kZXYsIGJvLT50Ym8udHRtLT5wYWdlcywKPiArCQkJICAgICAgIGJvLT50Ym8udHRtLT5u dW1fcGFnZXMpOwo+ICB9Cj4gIAo+ICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKnJhZGVvbl9nZW1f cHJpbWVfaW1wb3J0X3NnX3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZ2VtLmMgYi9kcml2ZXJz L2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2dlbS5jCj4gaW5kZXggYjE4ODUzOWRjYTBi Li43ODk3ZGEwYmVjZjQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3Jv Y2tjaGlwX2RybV9nZW0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hp cF9kcm1fZ2VtLmMKPiBAQCAtODksOCArODksOCBAQCBzdGF0aWMgaW50IHJvY2tjaGlwX2dlbV9n ZXRfcGFnZXMoc3RydWN0IHJvY2tjaGlwX2dlbV9vYmplY3QgKnJrX29iaikKPiAgCj4gIAlya19v YmotPm51bV9wYWdlcyA9IHJrX29iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQ7Cj4gIAo+IC0J cmtfb2JqLT5zZ3QgPSBkcm1fcHJpbWVfcGFnZXNfdG9fc2cocmtfb2JqLT5iYXNlLmRldiwKPiAt CQkJCQkgICAgcmtfb2JqLT5wYWdlcywgcmtfb2JqLT5udW1fcGFnZXMpOwo+ICsJcmtfb2JqLT5z Z3QgPSBkcm1fcGFnZXNfdG9fc2cocmtfb2JqLT5iYXNlLmRldiwKPiArCQkJCSAgICAgIHJrX29i ai0+cGFnZXMsIHJrX29iai0+bnVtX3BhZ2VzKTsKPiAgCWlmIChJU19FUlIocmtfb2JqLT5zZ3Qp KSB7Cj4gIAkJcmV0ID0gUFRSX0VSUihya19vYmotPnNndCk7Cj4gIAkJZ290byBlcnJfcHV0X3Bh Z2VzOwo+IEBAIC00MzIsNyArNDMyLDcgQEAgc3RydWN0IHNnX3RhYmxlICpyb2NrY2hpcF9nZW1f cHJpbWVfZ2V0X3NnX3RhYmxlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQo+ICAJaW50IHJl dDsKPiAgCj4gIAlpZiAocmtfb2JqLT5wYWdlcykKPiAtCQlyZXR1cm4gZHJtX3ByaW1lX3BhZ2Vz X3RvX3NnKG9iai0+ZGV2LCBya19vYmotPnBhZ2VzLCBya19vYmotPm51bV9wYWdlcyk7Cj4gKwkJ cmV0dXJuIGRybV9wYWdlc190b19zZyhvYmotPmRldiwgcmtfb2JqLT5wYWdlcywgcmtfb2JqLT5u dW1fcGFnZXMpOwo+ICAKPiAgCXNndCA9IGt6YWxsb2Nfb2JqKCpzZ3QpOwo+ICAJaWYgKCFzZ3Qp Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9nZW0uYyBiL2RyaXZlcnMvZ3B1 L2RybS90ZWdyYS9nZW0uYwo+IGluZGV4IDQzNjM5NGUwNDgxMi4uNzAxYWY2NzJiNGU1IDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9nZW0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1 L2RybS90ZWdyYS9nZW0uYwo+IEBAIC0xNyw3ICsxNyw3IEBACj4gIAo+ICAjaW5jbHVkZSA8ZHJt L2RybV9kcnYuaD4KPiAgI2luY2x1ZGUgPGRybS9kcm1fZHVtYl9idWZmZXJzLmg+Cj4gLSNpbmNs dWRlIDxkcm0vZHJtX3ByaW1lLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2dlbS5oPgo+ICAKPiAg I2luY2x1ZGUgImRybS5oIgo+ICAjaW5jbHVkZSAiZ2VtLmgiCj4gQEAgLTM1Miw3ICszNTIsNyBA QCBzdGF0aWMgaW50IHRlZ3JhX2JvX2dldF9wYWdlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCBz dHJ1Y3QgdGVncmFfYm8gKmJvKQo+ICAKPiAgCWJvLT5udW1fcGFnZXMgPSBiby0+Z2VtLnNpemUg Pj4gUEFHRV9TSElGVDsKPiAgCj4gLQliby0+c2d0ID0gZHJtX3ByaW1lX3BhZ2VzX3RvX3NnKGJv LT5nZW0uZGV2LCBiby0+cGFnZXMsIGJvLT5udW1fcGFnZXMpOwo+ICsJYm8tPnNndCA9IGRybV9w YWdlc190b19zZyhiby0+Z2VtLmRldiwgYm8tPnBhZ2VzLCBiby0+bnVtX3BhZ2VzKTsKPiAgCWlm IChJU19FUlIoYm8tPnNndCkpIHsKPiAgCQllcnIgPSBQVFJfRVJSKGJvLT5zZ3QpOwo+ICAJCWdv dG8gcHV0X3BhZ2VzOwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dm eF9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2dlbS5jCj4gaW5kZXggMzlm OGM0NjU1MGMyLi5jOWU3ZjJlMzY2OGMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Zt d2dmeC92bXdnZnhfZ2VtLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9n ZW0uYwo+IEBAIC0yOCw3ICsyOCw3IEBACj4gICNpbmNsdWRlICJ2bXdnZnhfYm8uaCIKPiAgI2lu Y2x1ZGUgInZtd2dmeF9kcnYuaCIKPiAgCj4gLSNpbmNsdWRlICJkcm0vZHJtX3ByaW1lLmgiCj4g KyNpbmNsdWRlICJkcm0vZHJtX2dlbS5oIgo+ICAjaW5jbHVkZSAiZHJtL2RybV9nZW1fdHRtX2hl bHBlci5oIgo+ICAKPiAgI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KPiBAQCAtNzYsNyArNzYs NyBAQCBzdGF0aWMgc3RydWN0IHNnX3RhYmxlICp2bXdfZ2VtX29iamVjdF9nZXRfc2dfdGFibGUo c3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCj4gIAlpZiAodm13X3R0LT52c2d0LnNndCkKPiAg CQlyZXR1cm4gdm13X3R0LT52c2d0LnNndDsKPiAgCj4gLQlyZXR1cm4gZHJtX3ByaW1lX3BhZ2Vz X3RvX3NnKG9iai0+ZGV2LCB2bXdfdHQtPmRtYV90dG0ucGFnZXMsIHZtd190dC0+ZG1hX3R0bS5u dW1fcGFnZXMpOwo+ICsJcmV0dXJuIGRybV9wYWdlc190b19zZyhvYmotPmRldiwgdm13X3R0LT5k bWFfdHRtLnBhZ2VzLCB2bXdfdHQtPmRtYV90dG0ubnVtX3BhZ2VzKTsKPiAgfQo+ICAKPiAgc3Rh dGljIGludCB2bXdfZ2VtX3ZtYXAoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHN0cnVjdCBp b3N5c19tYXAgKm1hcCkKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3hlL3hlX2RtYV9i dWYuYyBiL2RyaXZlcnMvZ3B1L2RybS94ZS94ZV9kbWFfYnVmLmMKPiBpbmRleCA4YTkyMGU1ODI0 NWMuLmYwZmU4MDcwNmI3OSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0veGUveGVfZG1h X2J1Zi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3hlL3hlX2RtYV9idWYuYwo+IEBAIC0xMTgs OSArMTE4LDkgQEAgc3RhdGljIHN0cnVjdCBzZ190YWJsZSAqeGVfZG1hX2J1Zl9tYXAoc3RydWN0 IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNoLAo+ICAKPiAgCXN3aXRjaCAoYm8tPnR0bS5yZXNv dXJjZS0+bWVtX3R5cGUpIHsKPiAgCWNhc2UgWEVfUExfVFQ6Cj4gLQkJc2d0ID0gZHJtX3ByaW1l X3BhZ2VzX3RvX3NnKG9iai0+ZGV2LAo+IC0JCQkJCSAgICBiby0+dHRtLnR0bS0+cGFnZXMsCj4g LQkJCQkJICAgIG9iai0+c2l6ZSA+PiBQQUdFX1NISUZUKTsKPiArCQlzZ3QgPSBkcm1fcGFnZXNf dG9fc2cob2JqLT5kZXYsCj4gKwkJCQkgICAgICBiby0+dHRtLnR0bS0+cGFnZXMsCj4gKwkJCQkg ICAgICBvYmotPnNpemUgPj4gUEFHRV9TSElGVCk7Cj4gIAkJaWYgKElTX0VSUihzZ3QpKQo+ICAJ CQlyZXR1cm4gc2d0Owo+ICAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5f ZHJtX2Zyb250X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250X2dlbS5j Cj4gaW5kZXggZWVjNGMxZGEzZjllLi5hNGE3YzdmMmM5MWMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250X2dlbS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L3hlbi94ZW5fZHJtX2Zyb250X2dlbS5jCj4gQEAgLTIzNiw3ICsyMzYsNyBAQCBzdHJ1Y3Qgc2df dGFibGUgKnhlbl9kcm1fZnJvbnRfZ2VtX2dldF9zZ190YWJsZShzdHJ1Y3QgZHJtX2dlbV9vYmpl Y3QgKmdlbV9vYmopCj4gIAlpZiAoIXhlbl9vYmotPnBhZ2VzKQo+ICAJCXJldHVybiBFUlJfUFRS KC1FTk9NRU0pOwo+ICAKPiAtCXJldHVybiBkcm1fcHJpbWVfcGFnZXNfdG9fc2coZ2VtX29iai0+ ZGV2LAo+ICsJcmV0dXJuIGRybV9wYWdlc190b19zZyhnZW1fb2JqLT5kZXYsCj4gIAkJCQkgICAg IHhlbl9vYmotPnBhZ2VzLCB4ZW5fb2JqLT5udW1fcGFnZXMpOwo+ICB9Cj4gIAo+IGRpZmYgLS1n aXQgYS9pbmNsdWRlL2RybS9kcm1fZ2VtLmggYi9pbmNsdWRlL2RybS9kcm1fZ2VtLmgKPiBpbmRl eCA4ODUyNDRlMzc1ZDMuLjdiOWNjNjMzNTY4OSAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2RybS9k cm1fZ2VtLmgKPiArKysgYi9pbmNsdWRlL2RybS9kcm1fZ2VtLmgKPiBAQCAtMTU1LDcgKzE1NSw3 IEBAIHN0cnVjdCBkcm1fZ2VtX29iamVjdF9mdW5jcyB7Cj4gIAkgKiBoZXJlIGNhbm5vdCBiZSB1 c2VkIGZvciBzZyB0YWJsZXMgcG9pbnRpbmcgYXQgZHJpdmVyIHByaXZhdGUgbWVtb3J5Cj4gIAkg KiByYW5nZXMuCj4gIAkgKgo+IC0JICogU2VlIGFsc28gZHJtX3ByaW1lX3BhZ2VzX3RvX3NnKCku Cj4gKwkgKiBTZWUgYWxzbyBkcm1fcGFnZXNfdG9fc2coKS4KPiAgCSAqLwo+ICAJc3RydWN0IHNn X3RhYmxlICooKmdldF9zZ190YWJsZSkoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwo+ICAK PiBAQCAtNTg5LDYgKzU4OSw5IEBAIHN0cnVjdCBwYWdlICoqZHJtX2dlbV9nZXRfcGFnZXMoc3Ry dWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwo+ICB2b2lkIGRybV9nZW1fcHV0X3BhZ2VzKHN0cnVj dCBkcm1fZ2VtX29iamVjdCAqb2JqLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAo+ICAJCWJvb2wgZGly dHksIGJvb2wgYWNjZXNzZWQpOwo+ICAKPiArc3RydWN0IHNnX3RhYmxlICpkcm1fcGFnZXNfdG9f c2coc3RydWN0IGRybV9kZXZpY2UgKmRldiwKPiArCQkJCSBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1 bnNpZ25lZCBpbnQgbnJfcGFnZXMpOwo+ICsKPiAgdm9pZCBkcm1fZ2VtX2xvY2soc3RydWN0IGRy bV9nZW1fb2JqZWN0ICpvYmopOwo+ICB2b2lkIGRybV9nZW1fdW5sb2NrKHN0cnVjdCBkcm1fZ2Vt X29iamVjdCAqb2JqKTsKPiAgCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9wcmltZS5o IGIvaW5jbHVkZS9kcm0vZHJtX3ByaW1lLmgKPiBpbmRleCBmNTBmODYyZjBkOGIuLjYwM2UxNmE0 MGFlNyAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2RybS9kcm1fcHJpbWUuaAo+ICsrKyBiL2luY2x1 ZGUvZHJtL2RybV9wcmltZS5oCj4gQEAgLTkyLDggKzkyLDYgQEAgdm9pZCBkcm1fZ2VtX2RtYWJ1 Zl92dW5tYXAoc3RydWN0IGRtYV9idWYgKmRtYV9idWYsIHN0cnVjdCBpb3N5c19tYXAgKm1hcCk7 Cj4gIGludCBkcm1fZ2VtX3ByaW1lX21tYXAoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHN0 cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKPiAgaW50IGRybV9nZW1fZG1hYnVmX21tYXAoc3Ry dWN0IGRtYV9idWYgKmRtYV9idWYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKPiAgCj4g LXN0cnVjdCBzZ190YWJsZSAqZHJtX3ByaW1lX3BhZ2VzX3RvX3NnKHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYsCj4gLQkJCQkgICAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IG5y X3BhZ2VzKTsKPiAgc3RydWN0IGRtYV9idWYgKmRybV9nZW1fcHJpbWVfZXhwb3J0KHN0cnVjdCBk cm1fZ2VtX29iamVjdCAqb2JqLAo+ICAJCQkJICAgICBpbnQgZmxhZ3MpOwo+ICAKPiAKPiAtLS0K PiBiYXNlLWNvbW1pdDogNDhkZDM3ZDFmZWYzM2ZiZjQyZjFkNjg4N2M2MWUyNDJmZDIxZDAwZAo+ IGNoYW5nZS1pZDogMjAyNjA3MjQtZ2V0X3BhZ2VzLWUyZTkxYzUzZWFhMwo+IAo+IEJlc3QgcmVn YXJkcywKPiAtLSAgCj4gQWRyacOhbiBMYXJ1bWJlIDxhZHJpYW4ubGFydW1iZUBjb2xsYWJvcmEu Y29tPgo+IAoKLS0gCj09PT09PT09PT09PT09PT09PT09CnwgSSB3b3VsZCBsaWtlIHRvIHwKfCBm aXggdGhlIHdvcmxkLCAgfAp8IGJ1dCB0aGV5J3JlIG5vdCB8CnwgZ2l2aW5nIG1lIHRoZSAgIHwK IFwgc291cmNlIGNvZGUhICAvCiAgLS0tLS0tLS0tLS0tLS0tCiAgICDCr1xfKOODhClfL8KvCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1yb2Nr Y2hpcCBtYWlsaW5nIGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJvY2tjaGlwCg==