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=-17.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 BBE4CC43460 for ; Tue, 11 May 2021 13:58:57 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 65FE4613F7 for ; Tue, 11 May 2021 13:58:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 65FE4613F7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=amd.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 028006EA3A; Tue, 11 May 2021 13:58:55 +0000 (UTC) Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2078.outbound.protection.outlook.com [40.107.237.78]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9F6C46EA38; Tue, 11 May 2021 13:58:53 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fOxPnnVnIIyBgaLKXUMFB3nE+MBho6+yM95iBS7IVWOTBOV/f6KLpn31ETpalWEVLbVx6CmFI4frzJ/v6SpaNTwrRDP92Y9tWmImdsWB/CuzEhKPmAmNsGwHZ8Mx2/aWuM6RQ3IHx8OhWztGmvTOzdvPEH33YCCtMBJs1tEPaOIuBq6Qxz8rbGcgy8u3/W+HdTPX2B9SOQN/vR3wIyf37/WfTu2IdOjwYdxm2FDnE2ciMJFa1unaioXkHTD8h3X9M1BOwPHnRnVT6uSKTaiFo5Ag/f7Pfcfd9OHNlKtWhlD/WWsHE+qE7HDA+AZivksj58zA+c3UI+rNWPigSl6kpQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zFiM/md4/SL6UFFIP6mn/dta+AT1illttr676jaXNrc=; b=bep4Ndfc2f7qYnngujCQHa1m6knMOud+hNHc7NXhH9Q8DNUk91oeE/0wns5pg80Dj2tLBlqt1c8/826+zARiNbIV6jtI86/UDL02zf+mML6NZNlYi/0JVjNP4/PIzd8nUbjkg6gLiyJxLC55XUY3+mJxoe2WY06G9AduhSFTZDS/Ymho+7ajbj9Mg7MckwAj0dfJ1qaWIlnONq+M0If6Y8SKDVF7cddXMQBvIzgg9GtKtomvhyx1qpRtGXkdVSehHatlFR1Oj3J0ZzMyM9K9BkFcx5FEmp+j21B8+gh7KYR5vfVXDBFzyTbxvdmV0RyDcP4KtjNv8N43eCmxytvorA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zFiM/md4/SL6UFFIP6mn/dta+AT1illttr676jaXNrc=; b=SGhnADzmVl/q+ZNevn4rpHboYlfAB5JNJGwZE443i43vyJpIKHsyEWDkvJVdfF31WsgXsvW2srPXcfbofARsap+vwfgOjacLoGLCNZlS1rtB+M0j94HeuoTQlHSy+IcSvBe6cFGkDZflwyBydl16eMNW7Zu9zLDBkqDFGOlth0k= Authentication-Results: lists.freedesktop.org; dkim=none (message not signed) header.d=none; lists.freedesktop.org; dmarc=none action=none header.from=amd.com; Received: from MN2PR12MB3775.namprd12.prod.outlook.com (2603:10b6:208:159::19) by MN2PR12MB4207.namprd12.prod.outlook.com (2603:10b6:208:1d9::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4129.25; Tue, 11 May 2021 13:58:49 +0000 Received: from MN2PR12MB3775.namprd12.prod.outlook.com ([fe80::6d4d:4674:1cf6:8d34]) by MN2PR12MB3775.namprd12.prod.outlook.com ([fe80::6d4d:4674:1cf6:8d34%6]) with mapi id 15.20.4108.031; Tue, 11 May 2021 13:58:49 +0000 Subject: Re: [PATCH 6/7] drm/i915/ttm, drm/ttm: Introduce a TTM i915 gem object backend To: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org References: <20210511132525.377190-1-thomas.hellstrom@linux.intel.com> <20210511132525.377190-7-thomas.hellstrom@linux.intel.com> From: =?UTF-8?Q?Christian_K=c3=b6nig?= Message-ID: <8ac6bc5c-17c0-2ffd-7f8c-823ab3c8a858@amd.com> Date: Tue, 11 May 2021 15:58:41 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 In-Reply-To: <20210511132525.377190-7-thomas.hellstrom@linux.intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-Originating-IP: [2a02:908:1252:fb60:5935:8b67:3cdd:7cc1] X-ClientProxiedBy: PR3P189CA0088.EURP189.PROD.OUTLOOK.COM (2603:10a6:102:b4::33) To MN2PR12MB3775.namprd12.prod.outlook.com (2603:10b6:208:159::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [IPv6:2a02:908:1252:fb60:5935:8b67:3cdd:7cc1] (2a02:908:1252:fb60:5935:8b67:3cdd:7cc1) by PR3P189CA0088.EURP189.PROD.OUTLOOK.COM (2603:10a6:102:b4::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4108.25 via Frontend Transport; Tue, 11 May 2021 13:58:47 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b91d81cd-1ba0-4516-1544-08d91484e6b7 X-MS-TrafficTypeDiagnostic: MN2PR12MB4207: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ejc3FRVgmEJKu5IJ4yveg9qzKoMnUyKiTE1tbvkU5jsM2XKQsZoQkfP90u+reRV1pHZeXc5NRumIQnTjaSslfdPyaISsYX7FcGJy21Vk8pcramMz0HR7H4t3kPvVrHKgT/tEZeyRYBmNSaK3Y5vt4U9soWVhbvVFILoTWwbtJwiVnv3nrC0YwYG0q1YZudRGc8EE9MD71HNHZxnghzYQbUopBUgZ2IcerBM8rgf8yrQCP50HxSPtE2Lr5qK7Pkqz5eF+5s3b0Blz6emwbIg03sVLBy9qKC456wRogjqa1bM4d67kUJA/WnrpHNTRFMoKAqZnM9JmD2o9zOhmDTY7l9pCxnTlmxUEVLXWaLVIlX9hb72l8VfbzdxFwtNAn93PB1k2CB3vXkP/D4t8TarTQ6wlW2yJEVDP79zx4jouPGojT+RlUzUi8YvdDBGFrwpbSoF12zh5lnPYefzHwUe3w6ECme78eP3IVDUx0M0q75UtvSvuDPsb4MMwne/kViCB9nnLLjTXkpVN/sOCS7BBiwtu2IKIvbsgqml8A2Q7z8Chxu4m7GkKYgLp+Ev4bxo4D8mQ5M0T5mMHCISmrQz0ZZlPSwb6BNQH4F2r/ccgbAWVqk/rxlOOeNFEnxVH/GYiRmO1jp9oN/gdqibMOYAtuH2e27Ld4rzqr4CXD3IFtdvAPDrSHKPa3gCmNF2GeWJJ X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MN2PR12MB3775.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(396003)(376002)(136003)(39860400002)(346002)(31696002)(36756003)(86362001)(38100700002)(66574015)(83380400001)(6666004)(66476007)(66946007)(66556008)(2616005)(2906002)(316002)(6486002)(8676002)(478600001)(186003)(16526019)(30864003)(8936002)(5660300002)(31686004)(52116002)(43740500002)(45980500001)(579004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?utf-8?B?UDRpSEtGYjJHaU9ndCtxeHp5SVExVUsyTzRqcjJPMXFmMzg4MGc0aXp5SmYv?= =?utf-8?B?UXJJcVZ2b0xoRm1mV012VktsYjhqYnhaNXFkSlVObmFMbXd6bVRGS3djVXNN?= =?utf-8?B?Nk0zT2pEZ0J1SzNGN0JkeXRvNGhrQUg3aHRqdEFJcHY4cUlXaU54cTA1RXRT?= =?utf-8?B?SjFERitUSFRLNWJTNEhtdVl5ZlVhUmJoMWUvOGlHU0NpSWFMMDFlUjUyS09K?= =?utf-8?B?WmtENzNPa1I5QjVTL1pSQnU1WHJCbjlQZHgzT0F0S1VNZU9ZZVhJT3NKYU41?= =?utf-8?B?TjJldmNRd1BpaW1VY2VPYUowVGF0anUwTE5hT08zQXdoYzZ4YTNyU3VLeUpn?= =?utf-8?B?T1Vid0syYlk4TmRqbDBzS25BVFdrYVpyTlExUnJQN3IxQ2V0VDFWd0dCcUpB?= =?utf-8?B?YnREaEdHT0J0TUZrVmFPWCtwaWt0NkdDWEdiak1xZFAzeUFVclh6MlJiQlNN?= =?utf-8?B?czV3cCtMUDVqcFRsZG9iYlVPQlNrUlA5MXV1ajlLWmNCRVpLL1pjNHBFL3BN?= =?utf-8?B?SGl5ZjRnVDQ3elVZbW83M3AwOWZGOWNvbXlDVE1vM0VaS2Y5eThIVTBaVVI1?= =?utf-8?B?MU1WMFl1WGQ4ZzQ5SXN4elQ0SkhCV2lwSE9uMUZYdG04dmgxWmFRczg4cjhV?= =?utf-8?B?N1RFQmpnZDU5RnBkanJlc01DdXhBM0NuMlZUNEdDMDVzdW5YVnN6VVdncHIr?= =?utf-8?B?VGJnOEkxT1QreXluL0dJN3hVUXRxSFVCS2tpVEZFZW1sRXAwdTVDR2hJUkQv?= =?utf-8?B?dGFBZ1Z3VVZ4NWkwMGFXaGV1aCtCZHpEa0h4Mjh0U1hzUlB3aERYdXI4NkVH?= =?utf-8?B?SEk1YjFtYUNUOEN3UEdwcndOL3FPZWs3TmFoSlh3eHZCRzVpUnhJU3ROQ2o5?= =?utf-8?B?ZXJXcE9MS0w4VWJNMlFHNW5wUGtDM3M0YlIvSHhPWWZWeWNoMklHNllXYk5p?= =?utf-8?B?ZDFYQ1FTTHIzY3p1b3Z1UFJTNjR5NXNZK1R2eUlPS2pKVm83NU8wVFY0dWZt?= =?utf-8?B?YnRETjh2SzZJUkNobHI5MTF3WWJTTjRBZlNaWS9NRWlLOUtUVEZVTi9qSkZR?= =?utf-8?B?T2JrRkpIN2llYjlTQ2hhOG1VTVlkS25VUkFKT0ZCank0TmhsYUFGdUF4TEJy?= =?utf-8?B?RVptd2RlVEJjNWxBYkYrYmlCMkdtTVdwcjJmQWlCeml5SmFxWlo1c1RhZ042?= =?utf-8?B?cCtIVlMwSUdCMTJaMC9wU2c2MmpaVHhqcCtwS2RJQWRHU2tUWGRTckdIWVhP?= =?utf-8?B?a3RORGd3amptWXV0QUpqNVY5QStVQ1IyY3pWM2VpWklNbkJIUkJOc1JGSHBZ?= =?utf-8?B?R2lyaXRBMnl3K0k1azNYWFZYNFFISUZGL3N1YkhuVXYwQ3IyY3AwVWdzTnBC?= =?utf-8?B?cHZNWW15aWxqT3BLa2Q0Qll2UDZFYTg3dU9vRGpTM2E4YnkySFdqbUFBY1hv?= =?utf-8?B?aHgyTzlyY3QxUEdyRmZvYmNCNXhNUWxMYUo2RXBLWHRtOVByTUF5bHlRSEFQ?= =?utf-8?B?NUtFdzFnRjdtamptNU90T1VzYi9WTGpFWml0dWNPa1AvMnpCK2ovb0NyTTVO?= =?utf-8?B?c3pyTENXTFkxeVFJMFdyeHBMcFdNVHVPRDMrOWFrcTBxMTJudGkxSDZBQ05F?= =?utf-8?B?czRjMGdpQTd6bHI3YUhzMzU2c0lSRkhIWmZkSzhCSHQxbjdEb0NFb3RtWDdP?= =?utf-8?B?WThzTzFaVEM5OGwwVldheE1pcjhvOUZ3dGRTSCtIODR1WUYyUmNyVVlISWdT?= =?utf-8?B?aFhXRjNJMWhxZ0FhOWtIOGp5cGF3OUQwN09xSXFqTlUzOUswbXRnbUVFQWtX?= =?utf-8?B?WDE1UGN6UWxUWEZENUx6QjNCZkJoandyNWJDdG5ESjRSeXlnVnJuN3B4UHlR?= =?utf-8?Q?S/latXw/fsoaT?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: b91d81cd-1ba0-4516-1544-08d91484e6b7 X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3775.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 May 2021 13:58:49.2980 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: r1RmzmRlKUD6hJzTfwJqC3xJuGQf1kRshDZzPAnuUnCpIONlf1i5FVxNQruAF+w4 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB4207 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Am 11.05.21 um 15:25 schrieb Thomas Hellström: > Most logical place to introduce TTM buffer objects is as an i915 > gem object backend. We need to add some ops to account for added > functionality like delayed delete and LRU list manipulation. > > Initially we support only LMEM and SYSTEM memory, but SYSTEM > (which in this case means evicted LMEM objects) is not > visible to i915 GEM yet. The plan is to move the i915 gem system region > over to the TTM system memory type in upcoming patches. > > We set up GPU bindings directly both from LMEM and from the system region, > as there is no need to use the legacy TTM_TT memory type. We reserve > that for future porting of GGTT bindings to TTM. > > There are some changes to TTM to allow for purging system memory buffer > objects and to refuse swapping of some objects: Unfortunately i915 gem > still relies heavily on short-term object pinning, and we've chosen to > keep short-term-pinned buffer objects on the TTM LRU lists for now, > meaning that we need some sort of mechanism to tell TTM they are not > swappable. A longer term goal is to get rid of the short-term pinning. Well just use the eviction_valuable interface for this. In general please make separate patches for the TTM changes and for the i915 changes using them for easier review. Christian. > > Remove the old lmem backend. > > Cc: Christian König > Signed-off-by: Thomas Hellström > --- > drivers/gpu/drm/i915/Makefile | 1 + > drivers/gpu/drm/i915/gem/i915_gem_lmem.c | 83 --- > drivers/gpu/drm/i915/gem/i915_gem_lmem.h | 5 - > drivers/gpu/drm/i915/gem/i915_gem_object.c | 126 +++-- > drivers/gpu/drm/i915/gem/i915_gem_object.h | 9 + > .../gpu/drm/i915/gem/i915_gem_object_types.h | 18 + > drivers/gpu/drm/i915/gem/i915_gem_region.c | 6 +- > drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 534 ++++++++++++++++++ > drivers/gpu/drm/i915/gem/i915_gem_ttm.h | 48 ++ > drivers/gpu/drm/i915/gt/intel_region_lmem.c | 3 +- > drivers/gpu/drm/i915/i915_gem.c | 5 +- > drivers/gpu/drm/i915/intel_memory_region.c | 1 - > drivers/gpu/drm/i915/intel_memory_region.h | 1 - > drivers/gpu/drm/i915/intel_region_ttm.c | 5 +- > drivers/gpu/drm/i915/intel_region_ttm.h | 7 +- > drivers/gpu/drm/ttm/ttm_bo.c | 12 + > include/drm/ttm/ttm_device.h | 9 + > 17 files changed, 733 insertions(+), 140 deletions(-) > create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_ttm.c > create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_ttm.h > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index 958ccc1edfed..ef0d884a9e2d 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -155,6 +155,7 @@ gem-y += \ > gem/i915_gem_stolen.o \ > gem/i915_gem_throttle.o \ > gem/i915_gem_tiling.o \ > + gem/i915_gem_ttm.o \ > gem/i915_gem_ttm_bo_util.o \ > gem/i915_gem_userptr.o \ > gem/i915_gem_wait.o \ > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_lmem.c b/drivers/gpu/drm/i915/gem/i915_gem_lmem.c > index f42803ea48f2..2b8cd15de1d9 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_lmem.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_lmem.c > @@ -4,73 +4,10 @@ > */ > > #include "intel_memory_region.h" > -#include "intel_region_ttm.h" > #include "gem/i915_gem_region.h" > #include "gem/i915_gem_lmem.h" > #include "i915_drv.h" > > -static void lmem_put_pages(struct drm_i915_gem_object *obj, > - struct sg_table *pages) > -{ > - intel_region_ttm_node_free(obj->mm.region, obj->mm.st_mm_node); > - obj->mm.dirty = false; > - sg_free_table(pages); > - kfree(pages); > -} > - > -static int lmem_get_pages(struct drm_i915_gem_object *obj) > -{ > - unsigned int flags; > - struct sg_table *pages; > - > - flags = I915_ALLOC_MIN_PAGE_SIZE; > - if (obj->flags & I915_BO_ALLOC_CONTIGUOUS) > - flags |= I915_ALLOC_CONTIGUOUS; > - > - obj->mm.st_mm_node = intel_region_ttm_node_alloc(obj->mm.region, > - obj->base.size, > - flags); > - if (IS_ERR(obj->mm.st_mm_node)) > - return PTR_ERR(obj->mm.st_mm_node); > - > - /* Range manager is always contigous */ > - if (obj->mm.region->is_range_manager) > - obj->flags |= I915_BO_ALLOC_CONTIGUOUS; > - pages = intel_region_ttm_node_to_st(obj->mm.region, obj->mm.st_mm_node); > - if (IS_ERR(pages)) > - return PTR_ERR(pages); > - > - __i915_gem_object_set_pages(obj, pages, > - i915_sg_dma_page_sizes(pages->sgl)); > - > - if (obj->flags & I915_BO_ALLOC_CPU_CLEAR) { > - void __iomem *vaddr = > - i915_gem_object_lmem_io_map(obj, 0, obj->base.size); > - > - if (!vaddr) { > - struct sg_table *pages = > - __i915_gem_object_unset_pages(obj); > - > - if (!IS_ERR_OR_NULL(pages)) > - lmem_put_pages(obj, pages); > - } > - > - memset_io(vaddr, 0, obj->base.size); > - io_mapping_unmap(vaddr); > - } > - > - return 0; > -} > - > -const struct drm_i915_gem_object_ops i915_gem_lmem_obj_ops = { > - .name = "i915_gem_object_lmem", > - .flags = I915_GEM_OBJECT_HAS_IOMEM, > - > - .get_pages = lmem_get_pages, > - .put_pages = lmem_put_pages, > - .release = i915_gem_object_release_memory_region, > -}; > - > void __iomem * > i915_gem_object_lmem_io_map(struct drm_i915_gem_object *obj, > unsigned long n, > @@ -102,23 +39,3 @@ i915_gem_object_create_lmem(struct drm_i915_private *i915, > return i915_gem_object_create_region(i915->mm.regions[INTEL_REGION_LMEM], > size, flags); > } > - > -int __i915_gem_lmem_object_init(struct intel_memory_region *mem, > - struct drm_i915_gem_object *obj, > - resource_size_t size, > - unsigned int flags) > -{ > - static struct lock_class_key lock_class; > - struct drm_i915_private *i915 = mem->i915; > - > - drm_gem_private_object_init(&i915->drm, &obj->base, size); > - i915_gem_object_init(obj, &i915_gem_lmem_obj_ops, &lock_class, flags); > - > - obj->read_domains = I915_GEM_DOMAIN_WC | I915_GEM_DOMAIN_GTT; > - > - i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE); > - > - i915_gem_object_init_memory_region(obj, mem); > - > - return 0; > -} > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_lmem.h b/drivers/gpu/drm/i915/gem/i915_gem_lmem.h > index fac6bc5a5ebb..ea76fd11ccb0 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_lmem.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_lmem.h > @@ -26,9 +26,4 @@ i915_gem_object_create_lmem(struct drm_i915_private *i915, > resource_size_t size, > unsigned int flags); > > -int __i915_gem_lmem_object_init(struct intel_memory_region *mem, > - struct drm_i915_gem_object *obj, > - resource_size_t size, > - unsigned int flags); > - > #endif /* !__I915_GEM_LMEM_H */ > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c > index c8953e3f5c70..c53488f391dd 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c > @@ -172,7 +172,7 @@ static void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *f > } > } > > -static void __i915_gem_free_object_rcu(struct rcu_head *head) > +void __i915_gem_free_object_rcu(struct rcu_head *head) > { > struct drm_i915_gem_object *obj = > container_of(head, typeof(*obj), rcu); > @@ -208,59 +208,70 @@ static void __i915_gem_object_free_mmaps(struct drm_i915_gem_object *obj) > } > } > > -static void __i915_gem_free_objects(struct drm_i915_private *i915, > - struct llist_node *freed) > +void __i915_gem_free_object(struct drm_i915_gem_object *obj) > { > - struct drm_i915_gem_object *obj, *on; > + trace_i915_gem_object_destroy(obj); > > - llist_for_each_entry_safe(obj, on, freed, freed) { > - trace_i915_gem_object_destroy(obj); > + if (!list_empty(&obj->vma.list)) { > + struct i915_vma *vma; > + > + /* > + * Note that the vma keeps an object reference while > + * it is active, so it *should* not sleep while we > + * destroy it. Our debug code errs insits it *might*. > + * For the moment, play along. > + */ > + spin_lock(&obj->vma.lock); > + while ((vma = list_first_entry_or_null(&obj->vma.list, > + struct i915_vma, > + obj_link))) { > + GEM_BUG_ON(vma->obj != obj); > + spin_unlock(&obj->vma.lock); > > - if (!list_empty(&obj->vma.list)) { > - struct i915_vma *vma; > + __i915_vma_put(vma); > > - /* > - * Note that the vma keeps an object reference while > - * it is active, so it *should* not sleep while we > - * destroy it. Our debug code errs insits it *might*. > - * For the moment, play along. > - */ > spin_lock(&obj->vma.lock); > - while ((vma = list_first_entry_or_null(&obj->vma.list, > - struct i915_vma, > - obj_link))) { > - GEM_BUG_ON(vma->obj != obj); > - spin_unlock(&obj->vma.lock); > + } > + spin_unlock(&obj->vma.lock); > + } > > - __i915_vma_put(vma); > + __i915_gem_object_free_mmaps(obj); > > - spin_lock(&obj->vma.lock); > - } > - spin_unlock(&obj->vma.lock); > - } > + GEM_BUG_ON(!list_empty(&obj->lut_list)); > > - __i915_gem_object_free_mmaps(obj); > + atomic_set(&obj->mm.pages_pin_count, 0); > + __i915_gem_object_put_pages(obj); > + GEM_BUG_ON(i915_gem_object_has_pages(obj)); > + bitmap_free(obj->bit_17); > > - GEM_BUG_ON(!list_empty(&obj->lut_list)); > + if (obj->base.import_attach) > + drm_prime_gem_destroy(&obj->base, NULL); > > - atomic_set(&obj->mm.pages_pin_count, 0); > - __i915_gem_object_put_pages(obj); > - GEM_BUG_ON(i915_gem_object_has_pages(obj)); > - bitmap_free(obj->bit_17); > + drm_gem_free_mmap_offset(&obj->base); > > - if (obj->base.import_attach) > - drm_prime_gem_destroy(&obj->base, NULL); > + if (obj->ops->release) > + obj->ops->release(obj); > > - drm_gem_free_mmap_offset(&obj->base); > + if (obj->mm.n_placements > 1) > + kfree(obj->mm.placements); > > - if (obj->ops->release) > - obj->ops->release(obj); > + if (obj->resv_shared_from) > + i915_vm_resv_put(obj->resv_shared_from); > > - if (obj->mm.n_placements > 1) > - kfree(obj->mm.placements); > +} > + > +static void __i915_gem_free_objects(struct drm_i915_private *i915, > + struct llist_node *freed) > +{ > + struct drm_i915_gem_object *obj, *on; > > - if (obj->resv_shared_from) > - i915_vm_resv_put(obj->resv_shared_from); > + llist_for_each_entry_safe(obj, on, freed, freed) { > + might_sleep(); > + if (obj->ops->delayed_free) { > + obj->ops->delayed_free(obj); > + continue; > + } > + __i915_gem_free_object(obj); > > /* But keep the pointer alive for RCU-protected lookups */ > call_rcu(&obj->rcu, __i915_gem_free_object_rcu); > @@ -318,6 +329,7 @@ static void i915_gem_free_object(struct drm_gem_object *gem_obj) > * worker and performing frees directly from subsequent allocations for > * crude but effective memory throttling. > */ > + > if (llist_add(&obj->freed, &i915->mm.free_list)) > queue_work(i915->wq, &i915->mm.free_work); > } > @@ -410,6 +422,42 @@ int i915_gem_object_read_from_page(struct drm_i915_gem_object *obj, u64 offset, > return 0; > } > > +/** > + * i915_gem_object_evictable - Whether object is likely evictable after unbind. > + * @obj: The object to check > + * > + * This function checks whether the object is likely unvictable after unbind. > + * If the object is not locked when checking, the result is only advisory. > + * If the object is locked when checking, and the function returns true, > + * then an eviction should indeed be possible. But since unlocked vma > + * unpinning and unbinding is currently possible, the object can actually > + * become evictable even if this function returns false. > + * > + * Return: true if the object may be evictable. False otherwise. > + */ > +bool i915_gem_object_evictable(struct drm_i915_gem_object *obj) > +{ > + struct i915_vma *vma; > + int pin_count = atomic_read(&obj->mm.pages_pin_count); > + > + if (!pin_count) > + return true; > + > + spin_lock(&obj->vma.lock); > + list_for_each_entry(vma, &obj->vma.list, obj_link) { > + if (i915_vma_is_pinned(vma)) { > + spin_unlock(&obj->vma.lock); > + return false; > + } > + if (atomic_read(&vma->pages_count)) > + pin_count--; > + } > + spin_unlock(&obj->vma.lock); > + GEM_WARN_ON(pin_count < 0); > + > + return pin_count == 0; > +} > + > void i915_gem_init__objects(struct drm_i915_private *i915) > { > INIT_WORK(&i915->mm.free_work, __i915_gem_free_work); > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h > index 2ebd79537aea..ae5930e307d5 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h > @@ -200,6 +200,9 @@ static inline bool i915_gem_object_trylock(struct drm_i915_gem_object *obj) > > static inline void i915_gem_object_unlock(struct drm_i915_gem_object *obj) > { > + if (obj->ops->adjust_lru) > + obj->ops->adjust_lru(obj); > + > dma_resv_unlock(obj->base.resv); > } > > @@ -587,6 +590,12 @@ int i915_gem_object_read_from_page(struct drm_i915_gem_object *obj, u64 offset, > > bool i915_gem_object_is_shmem(const struct drm_i915_gem_object *obj); > > +void __i915_gem_free_object_rcu(struct rcu_head *head); > + > +void __i915_gem_free_object(struct drm_i915_gem_object *obj); > + > +bool i915_gem_object_evictable(struct drm_i915_gem_object *obj); > + > #ifdef CONFIG_MMU_NOTIFIER > static inline bool > i915_gem_object_is_userptr(struct drm_i915_gem_object *obj) > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h > index 98f69d8fd37d..b350765e1935 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h > @@ -63,6 +63,20 @@ struct drm_i915_gem_object_ops { > const struct drm_i915_gem_pwrite *arg); > > int (*dmabuf_export)(struct drm_i915_gem_object *obj); > + > + /** > + * adjust_lru - notify that the madvise value was updated > + * @obj: The gem object > + * > + * The madvise value may have been updated, or object was recently > + * referenced so act accordingly (Perhaps changing an LRU list etc). > + */ > + void (*adjust_lru)(struct drm_i915_gem_object *obj); > + > + /** > + * delayed_free - Override the default delayed free implementation > + */ > + void (*delayed_free)(struct drm_i915_gem_object *obj); > void (*release)(struct drm_i915_gem_object *obj); > > const char *name; /* friendly name for debug, e.g. lockdep classes */ > @@ -307,6 +321,10 @@ struct drm_i915_gem_object { > bool dirty:1; > } mm; > > + struct { > + struct sg_table *cached_io_st; > + } ttm; > + > /** Record of address bit 17 of each page at last unbind. */ > unsigned long *bit_17; > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_region.c b/drivers/gpu/drm/i915/gem/i915_gem_region.c > index f25e6646c5b7..d1f1840540dd 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_region.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_region.c > @@ -18,11 +18,7 @@ void i915_gem_object_init_memory_region(struct drm_i915_gem_object *obj, > > mutex_lock(&mem->objects.lock); > > - if (obj->flags & I915_BO_ALLOC_VOLATILE) > - list_add(&obj->mm.region_link, &mem->objects.purgeable); > - else > - list_add(&obj->mm.region_link, &mem->objects.list); > - > + list_add(&obj->mm.region_link, &mem->objects.list); > mutex_unlock(&mem->objects.lock); > } > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > new file mode 100644 > index 000000000000..e3718c3cb299 > --- /dev/null > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > @@ -0,0 +1,534 @@ > +// SPDX-License-Identifier: MIT > +/* > + * Copyright © 2021 Intel Corporation > + */ > + > +#include > +#include > + > +#include "i915_drv.h" > +#include "intel_memory_region.h" > +#include "intel_region_ttm.h" > + > +#include "gem/i915_gem_object.h" > +#include "gem/i915_gem_region.h" > +#include "gem/i915_gem_ttm.h" > +#include "gem/i915_gem_ttm_bo_util.h" > + > +#define I915_PL_LMEM0 TTM_PL_PRIV > +#define I915_PL_SYSTEM TTM_PL_SYSTEM > +#define I915_PL_STOLEN TTM_PL_VRAM > +#define I915_PL_GGTT TTM_PL_TT > + > +#define I915_TTM_PRIO_PURGE 0 > +#define I915_TTM_PRIO_NO_PAGES 1 > +#define I915_TTM_PRIO_HAS_PAGES 2 > + > +/** > + * struct i915_ttm_tt - TTM page vector with additional private information > + * @ttm: The base TTM page vector. > + * @dev: The struct device used for dma mapping and unmapping. > + * @cached_st: The cached scatter-gather table. > + * > + * Note that DMA may be going on right up to the point where the page- > + * vector is unpopulated in delayed destroy. Hence keep the > + * scatter-gather table mapped and cached up to that point. This is > + * different from the cached gem object io scatter-gather table which > + * doesn't have an associated dma mapping. > + */ > +struct i915_ttm_tt { > + struct ttm_tt ttm; > + struct device *dev; > + struct sg_table *cached_st; > +}; > + > +static const struct ttm_place lmem0_sys_placement_flags[] = { > + { > + .fpfn = 0, > + .lpfn = 0, > + .mem_type = I915_PL_LMEM0, > + .flags = 0, > + }, { > + .fpfn = 0, > + .lpfn = 0, > + .mem_type = I915_PL_SYSTEM, > + .flags = 0, > + } > +}; > + > +struct ttm_placement i915_lmem0_placement = { > + .num_placement = 1, > + .placement = &lmem0_sys_placement_flags[0], > + .num_busy_placement = 1, > + .busy_placement = &lmem0_sys_placement_flags[0], > +}; > + > +struct ttm_placement i915_lmem0_sys_placement = { > + .num_placement = 1, > + .placement = &lmem0_sys_placement_flags[0], > + .num_busy_placement = 2, > + .busy_placement = &lmem0_sys_placement_flags[0], > +}; > + > +struct ttm_placement i915_sys_placement = { > + .num_placement = 1, > + .placement = &lmem0_sys_placement_flags[1], > + .num_busy_placement = 1, > + .busy_placement = &lmem0_sys_placement_flags[1], > +}; > + > +static void i915_ttm_adjust_lru(struct drm_i915_gem_object *obj); > + > +static struct ttm_tt *i915_ttm_tt_create(struct ttm_buffer_object *bo, > + uint32_t page_flags) > +{ > + struct ttm_resource_manager *man = > + ttm_manager_type(bo->bdev, bo->mem.mem_type); > + struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo); > + struct i915_ttm_tt *i915_tt; > + int ret; > + > + i915_tt = kzalloc(sizeof(*i915_tt), GFP_KERNEL); > + if (!i915_tt) > + return NULL; > + > + if (obj->flags & I915_BO_ALLOC_CPU_CLEAR && > + man->use_tt) > + page_flags |= TTM_PAGE_FLAG_ZERO_ALLOC; > + > + ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, ttm_cached); > + if (ret) { > + kfree(i915_tt); > + return NULL; > + } > + > + i915_tt->dev = obj->base.dev->dev; > + > + return &i915_tt->ttm; > +} > + > +static void i915_ttm_tt_unpopulate(struct ttm_device *bdev, struct ttm_tt *ttm) > +{ > + struct i915_ttm_tt *i915_tt = container_of(ttm, typeof(*i915_tt), ttm); > + > + if (i915_tt->cached_st) { > + dma_unmap_sgtable(i915_tt->dev, i915_tt->cached_st, > + DMA_BIDIRECTIONAL, 0); > + sg_free_table(i915_tt->cached_st); > + kfree(i915_tt->cached_st); > + i915_tt->cached_st = NULL; > + } > + ttm_pool_free(&bdev->pool, ttm); > +} > + > +static void i915_ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *ttm) > +{ > + struct i915_ttm_tt *i915_tt = container_of(ttm, typeof(*i915_tt), ttm); > + > + ttm_tt_destroy_common(bdev, ttm); > + kfree(i915_tt); > +} > + > +static bool i915_ttm_eviction_valuable(struct ttm_buffer_object *bo, > + const struct ttm_place *place) > +{ > + struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo); > + > + /* Will do for now. Our pinned objects are still on TTM's LRU lists */ > + if (!i915_gem_object_evictable(obj)) > + return false; > + > + /* This isn't valid with a buddy allocator */ > + return ttm_bo_eviction_valuable(bo, place); > +} > + > +static void i915_ttm_evict_flags(struct ttm_buffer_object *bo, > + struct ttm_placement *placement) > +{ > + *placement = i915_sys_placement; > +} > + > +static int i915_ttm_move_notify(struct ttm_buffer_object *bo) > +{ > + struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo); > + int ret; > + > + ret = i915_gem_object_unbind(obj, I915_GEM_OBJECT_UNBIND_ACTIVE); > + if (ret) > + return ret; > + > + ret = __i915_gem_object_put_pages(obj); > + if (ret) > + return ret; > + > + return 0; > +} > + > +static void i915_ttm_free_cached_io_st(struct drm_i915_gem_object *obj) > +{ > + if (obj->ttm.cached_io_st) { > + sg_free_table(obj->ttm.cached_io_st); > + kfree(obj->ttm.cached_io_st); > + obj->ttm.cached_io_st = NULL; > + } > +} > + > +static void i915_ttm_purge(struct drm_i915_gem_object *obj) > +{ > + struct ttm_buffer_object *bo = i915_gem_to_ttm(obj); > + > + if (obj->mm.madv == __I915_MADV_PURGED) > + return; > + > + i915_ttm_free_cached_io_st(obj); > + > + ttm_resource_free(bo, &bo->mem); > + if (bo->ttm) > + ttm_bo_tt_destroy(bo); > + > + obj->mm.madv = __I915_MADV_PURGED; > +} > + > +static bool i915_ttm_swap_possible(struct ttm_buffer_object *bo) > +{ > + /* Will do for now. Our pinned objects are still on TTM's LRU lists */ > + return i915_gem_object_evictable(i915_ttm_to_gem(bo)); > +} > + > +static void i915_ttm_swap_notify(struct ttm_buffer_object *bo) > +{ > + struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo); > + int ret = i915_ttm_move_notify(bo); > + > + GEM_WARN_ON(ret); > + GEM_WARN_ON(obj->ttm.cached_io_st); > + if (!ret && obj->mm.madv != I915_MADV_WILLNEED) > + i915_ttm_purge(obj); > +} > + > +static void i915_ttm_delete_mem_notify(struct ttm_buffer_object *bo) > +{ > + struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo); > + > + if (likely(obj)) { > + /* This releases all gem object bindings to the backend. */ > + __i915_gem_free_object(obj); > + } > +} > + > +static struct intel_memory_region * > +i915_ttm_region(struct ttm_device *bdev, int ttm_mem_type) > +{ > + struct drm_i915_private *i915 = container_of(bdev, typeof(*i915), bdev); > + > + /* There's some room for optimization here... */ > + GEM_BUG_ON(ttm_mem_type != I915_PL_SYSTEM && > + ttm_mem_type < I915_PL_LMEM0); > + if (ttm_mem_type == I915_PL_SYSTEM) > + return intel_memory_region_lookup(i915, INTEL_MEMORY_SYSTEM, > + 0); > + > + return intel_memory_region_lookup(i915, INTEL_MEMORY_LOCAL, > + ttm_mem_type - I915_PL_LMEM0); > +} > + > +static struct sg_table *i915_ttm_tt_get_st(struct ttm_tt *ttm) > +{ > + struct i915_ttm_tt *i915_tt = container_of(ttm, typeof(*i915_tt), ttm); > + struct scatterlist *sg; > + struct sg_table *st; > + int ret; > + > + if (i915_tt->cached_st) > + return i915_tt->cached_st; > + > + st = kzalloc(sizeof(*st), GFP_KERNEL); > + if (!st) > + return ERR_PTR(-ENOMEM); > + > + sg = __sg_alloc_table_from_pages > + (st, ttm->pages, ttm->num_pages, 0, > + (unsigned long) ttm->num_pages << PAGE_SHIFT, > + i915_sg_segment_size(), NULL, 0, GFP_KERNEL); > + if (IS_ERR(sg)) { > + kfree(st); > + return ERR_CAST(sg); > + } > + > + ret = dma_map_sgtable(i915_tt->dev, st, DMA_BIDIRECTIONAL, 0); > + if (ret) { > + sg_free_table(st); > + kfree(st); > + return ERR_PTR(ret); > + } > + > + i915_tt->cached_st = st; > + return st; > +} > + > +static struct sg_table * > +i915_ttm_resource_get_st(struct drm_i915_gem_object *obj, > + struct ttm_resource *res) > +{ > + struct ttm_buffer_object *bo = i915_gem_to_ttm(obj); > + struct ttm_resource_manager *man = > + ttm_manager_type(bo->bdev, res->mem_type); > + struct sg_table *st; > + > + if (man->use_tt) > + return i915_ttm_tt_get_st(bo->ttm); > + > + st = kzalloc(sizeof(*st), GFP_KERNEL); > + if (!st) > + return ERR_PTR(-ENOMEM); > + > + st = intel_region_ttm_node_to_st(obj->mm.region, res->mm_node); > + if (IS_ERR(st)) > + return ERR_CAST(st); > + > + return st; > +} > + > +static int i915_ttm_move(struct ttm_buffer_object *bo, bool evict, > + struct ttm_operation_ctx *ctx, > + struct ttm_resource *new_mem, > + struct ttm_place *hop) > +{ > + struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo); > + struct ttm_resource_manager *new_man = > + ttm_manager_type(bo->bdev, new_mem->mem_type); > + struct ttm_resource_manager *old_man = > + ttm_manager_type(bo->bdev, bo->mem.mem_type); > + struct intel_memory_region *new_reg, *old_reg; > + union { > + struct i915_ttm_kmap_iter_tt tt; > + struct i915_ttm_kmap_iter_iomap io; > + } _new_iter, _old_iter; > + struct i915_ttm_kmap_iter *new_iter, *old_iter; > + struct sg_table *new_st; > + int ret; > + > + new_reg = i915_ttm_region(bo->bdev, new_mem->mem_type); > + old_reg = i915_ttm_region(bo->bdev, bo->mem.mem_type); > + GEM_BUG_ON(!new_reg || !old_reg); > + > + /* Sync for now. We could do the actual copy async. */ > + ret = ttm_bo_wait_ctx(bo, ctx); > + if (ret) > + return ret; > + > + ret = i915_ttm_move_notify(bo); > + if (ret) > + return ret; > + > + if (obj->mm.madv != I915_MADV_WILLNEED) { > + i915_ttm_purge(obj); > + ttm_resource_free(bo, new_mem); > + return 0; > + } > + > + /* Populate ttm with pages if needed. Typically system memory. */ > + if (new_man->use_tt && bo->ttm) { > + ret = ttm_tt_populate(bo->bdev, bo->ttm, ctx); > + if (ret) > + return ret; > + } > + > + new_st = i915_ttm_resource_get_st(obj, new_mem); > + if (IS_ERR(new_st)) > + return PTR_ERR(new_st); > + > + new_iter = new_man->use_tt ? > + i915_ttm_kmap_iter_tt_init(&_new_iter.tt, bo->ttm) : > + i915_ttm_kmap_iter_iomap_init(&_new_iter.io, &new_reg->iomap, > + new_st, new_reg->region.start); > + > + old_iter = old_man->use_tt ? > + i915_ttm_kmap_iter_tt_init(&_old_iter.tt, bo->ttm) : > + i915_ttm_kmap_iter_iomap_init(&_old_iter.io, &old_reg->iomap, > + obj->ttm.cached_io_st, > + old_reg->region.start); > + > + i915_ttm_move_memcpy(bo, new_mem, new_iter, old_iter); > + i915_ttm_free_cached_io_st(obj); > + > + if (!new_man->use_tt) > + obj->ttm.cached_io_st = new_st; > + > + return 0; > +} > + > +struct ttm_device_funcs i915_ttm_bo_driver = { > + .ttm_tt_create = i915_ttm_tt_create, > + .ttm_tt_unpopulate = i915_ttm_tt_unpopulate, > + .ttm_tt_destroy = i915_ttm_tt_destroy, > + .eviction_valuable = i915_ttm_eviction_valuable, > + .evict_flags = i915_ttm_evict_flags, > + .move = i915_ttm_move, > + .verify_access = NULL, > + .swap_possible = i915_ttm_swap_possible, > + .swap_notify = i915_ttm_swap_notify, > + .delete_mem_notify = i915_ttm_delete_mem_notify, > +}; > + > +static int i915_ttm_get_pages(struct drm_i915_gem_object *obj) > +{ > + struct ttm_buffer_object *bo = i915_gem_to_ttm(obj); > + struct ttm_operation_ctx ctx = { > + .interruptible = true, > + .no_wait_gpu = false, > + }; > + struct sg_table *st; > + int ret; > + > + /* Swap in. */ > + if (bo->ttm && (bo->ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) { > + ret = ttm_tt_populate(bo->bdev, bo->ttm, &ctx); > + if (ret) > + return ret; > + } > + > + /* Move to the requested placement. */ > + ret = ttm_bo_validate(bo, &i915_lmem0_placement, &ctx); > + if (ret) > + return ret; > + > + /* Object either has a page vector or is an iomem object */ > + st = bo->ttm ? i915_ttm_tt_get_st(bo->ttm) : obj->ttm.cached_io_st; > + if (IS_ERR(st)) > + return PTR_ERR(st); > + > + __i915_gem_object_set_pages(obj, st, i915_sg_dma_page_sizes(st->sgl)); > + > + i915_ttm_adjust_lru(obj); > + > + return ret; > +} > + > +static void i915_ttm_put_pages(struct drm_i915_gem_object *obj, > + struct sg_table *st) > +{ > + /* > + * We're currently not called from a shrinker, so put_pages() > + * typically means the object is about to destroyed, or called > + * from move_notify(). So just avoid doing much for now. > + * If the object is not destroyed next, The TTM eviction logic > + * and shrinkers will move it out if needed. > + */ > + > + i915_ttm_adjust_lru(obj); > +} > + > +static void i915_ttm_adjust_lru(struct drm_i915_gem_object *obj) > +{ > + struct ttm_buffer_object *bo = i915_gem_to_ttm(obj); > + > + /* > + * Don't manipulate the TTM LRUs while in TTM bo destruction. > + * We're called through i915_ttm_delete_mem_notify(). > + */ > + if (!kref_read(&bo->kref)) > + return; > + > + /* > + * Put on the correct LRU list depending on the MADV status > + */ > + spin_lock(&bo->bdev->lru_lock); > + if (obj->mm.madv != I915_MADV_WILLNEED) { > + bo->priority = I915_TTM_PRIO_PURGE; > + } else if (!i915_gem_object_has_pages(obj)) { > + if (bo->priority < I915_TTM_PRIO_HAS_PAGES) > + bo->priority = I915_TTM_PRIO_HAS_PAGES; > + } else { > + if (bo->priority > I915_TTM_PRIO_NO_PAGES) > + bo->priority = I915_TTM_PRIO_NO_PAGES; > + } > + > + ttm_bo_move_to_lru_tail(bo, &bo->mem, NULL); > + spin_unlock(&bo->bdev->lru_lock); > +} > + > +/* > + * TTM-backed gem object destruction requires some clarification. > + * Basically we have two possibilities here. We can either rely on the > + * i915 delayed destruction and put the TTM object when the object > + * is idle. This would be detected by TTM which would bypass the > + * TTM delayed destroy handling. The other approach is to put the TTM > + * object early and rely on the TTM destroyed handling, and then free > + * the leftover parts of the GEM object once TTM's destroyed list handling is > + * complete. For now, we rely on the latter for two reasons: > + * a) TTM can evict an object even when it's on the delayed destroy list, > + * which in theory allows for complete eviction. > + * b) There is work going on in TTM to allow freeing an object even when > + * it's not idle, and using the TTM destroyed list handling could help us > + * benefit from that. > + */ > +static void i915_ttm_delayed_free(struct drm_i915_gem_object *obj) > +{ > + ttm_bo_put(i915_gem_to_ttm(obj)); > +} > + > +static const struct drm_i915_gem_object_ops i915_gem_ttm_obj_ops = { > + .name = "i915_gem_object_ttm", > + .flags = I915_GEM_OBJECT_HAS_IOMEM, > + > + .get_pages = i915_ttm_get_pages, > + .put_pages = i915_ttm_put_pages, > + .truncate = i915_ttm_purge, > + .adjust_lru = i915_ttm_adjust_lru, > + .delayed_free = i915_ttm_delayed_free, > +}; > + > +void i915_ttm_bo_destroy(struct ttm_buffer_object *bo) > +{ > + struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo); > + > + i915_gem_object_release_memory_region(obj); > + call_rcu(&obj->rcu, __i915_gem_free_object_rcu); > +} > + > +/** > + * __i915_gem_ttm_object_init - Initialize a ttm-backed i915 gem object > + * @mem: The initial memory region for the object. > + * @obj: The gem object. > + * @size: Object size in bytes. > + * @flags: gem object flags. > + * > + * Return: 0 on success, negative error code on failure. > + */ > +int __i915_gem_ttm_object_init(struct intel_memory_region *mem, > + struct drm_i915_gem_object *obj, > + resource_size_t size, > + unsigned int flags) > +{ > + static struct lock_class_key lock_class; > + struct drm_i915_private *i915 = mem->i915; > + size_t alignment = 0; > + int ret; > + > + /* Adjust alignment to GPU- and CPU huge page sizes. */ > + > + if (mem->is_range_manager) { > + if (size >= SZ_1G) > + alignment = SZ_1G >> PAGE_SHIFT; > + else if (size >= SZ_2M) > + alignment = SZ_2M >> PAGE_SHIFT; > + else if (size >= SZ_64K) > + alignment = SZ_64K >> PAGE_SHIFT; > + } > + > + drm_gem_private_object_init(&i915->drm, &obj->base, size); > + i915_gem_object_init(obj, &i915_gem_ttm_obj_ops, &lock_class, flags); > + i915_gem_object_init_memory_region(obj, mem); > + i915_gem_object_make_unshrinkable(obj); > + > + ret = ttm_bo_init(&i915->bdev, i915_gem_to_ttm(obj), size, > + ttm_bo_type_kernel, &i915_sys_placement, alignment, > + true, NULL, NULL, i915_ttm_bo_destroy); > + > + obj->read_domains = I915_GEM_DOMAIN_WC | I915_GEM_DOMAIN_GTT; > + > + i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE); > + > + return 0; > +} > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.h b/drivers/gpu/drm/i915/gem/i915_gem_ttm.h > new file mode 100644 > index 000000000000..b8d3dcbb50df > --- /dev/null > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.h > @@ -0,0 +1,48 @@ > +/* SPDX-License-Identifier: MIT */ > +/* > + * Copyright © 2021 Intel Corporation > + */ > +#ifndef _I915_GEM_TTM_H_ > +#define _I915_GEM_TTM_H_ > + > +#include "gem/i915_gem_object_types.h" > + > +/** > + * i915_gem_to_ttm - Convert a struct drm_i915_gem_object to a > + * struct ttm_buffer_object. > + * @obj: Pointer to the gem object. > + * > + * Return: Pointer to the embedded struct ttm_buffer_object. > + */ > +static inline struct ttm_buffer_object * > +i915_gem_to_ttm(struct drm_i915_gem_object *obj) > +{ > + return &obj->__do_not_access; > +} > + > +/* > + * i915 ttm gem object destructor. Internal use only. > + */ > +void i915_ttm_bo_destroy(struct ttm_buffer_object *bo); > + > +/** > + * i915_ttm_to_gem - Convert a struct ttm_buffer_object to an embedding > + * struct drm_i915_gem_object. > + * > + * Return: Pointer to the embedding struct ttm_buffer_object, or NULL > + * if the object was not an i915 ttm object. > + */ > +static inline struct drm_i915_gem_object * > +i915_ttm_to_gem(struct ttm_buffer_object *bo) > +{ > + if (GEM_WARN_ON(bo->destroy != i915_ttm_bo_destroy)) > + return NULL; > + > + return container_of(bo, struct drm_i915_gem_object, __do_not_access); > +} > + > +int __i915_gem_ttm_object_init(struct intel_memory_region *mem, > + struct drm_i915_gem_object *obj, > + resource_size_t size, > + unsigned int flags); > +#endif > diff --git a/drivers/gpu/drm/i915/gt/intel_region_lmem.c b/drivers/gpu/drm/i915/gt/intel_region_lmem.c > index f7366b054f8e..4ae1f717a94c 100644 > --- a/drivers/gpu/drm/i915/gt/intel_region_lmem.c > +++ b/drivers/gpu/drm/i915/gt/intel_region_lmem.c > @@ -9,6 +9,7 @@ > #include "intel_region_ttm.h" > #include "gem/i915_gem_lmem.h" > #include "gem/i915_gem_region.h" > +#include "gem/i915_gem_ttm.h" > #include "intel_region_lmem.h" > > static int init_fake_lmem_bar(struct intel_memory_region *mem) > @@ -107,7 +108,7 @@ region_lmem_init(struct intel_memory_region *mem) > static const struct intel_memory_region_ops intel_region_lmem_ops = { > .init = region_lmem_init, > .release = region_lmem_release, > - .init_object = __i915_gem_lmem_object_init, > + .init_object = __i915_gem_ttm_object_init, > }; > > struct intel_memory_region * > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > index 180f6e9107d4..350283ab9a83 100644 > --- a/drivers/gpu/drm/i915/i915_gem.c > +++ b/drivers/gpu/drm/i915/i915_gem.c > @@ -1005,8 +1005,11 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data, > } > } > > - if (obj->mm.madv != __I915_MADV_PURGED) > + if (obj->mm.madv != __I915_MADV_PURGED) { > obj->mm.madv = args->madv; > + if (obj->ops->adjust_lru) > + obj->ops->adjust_lru(obj); > + } > > if (i915_gem_object_has_pages(obj)) { > struct list_head *list; > diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c > index 4092cc987679..bd27e897d4d0 100644 > --- a/drivers/gpu/drm/i915/intel_memory_region.c > +++ b/drivers/gpu/drm/i915/intel_memory_region.c > @@ -149,7 +149,6 @@ intel_memory_region_create(struct drm_i915_private *i915, > > mutex_init(&mem->objects.lock); > INIT_LIST_HEAD(&mem->objects.list); > - INIT_LIST_HEAD(&mem->objects.purgeable); > INIT_LIST_HEAD(&mem->reserved); > > mutex_init(&mem->mm_lock); > diff --git a/drivers/gpu/drm/i915/intel_memory_region.h b/drivers/gpu/drm/i915/intel_memory_region.h > index e69cde13daf2..7b5fa97c0b59 100644 > --- a/drivers/gpu/drm/i915/intel_memory_region.h > +++ b/drivers/gpu/drm/i915/intel_memory_region.h > @@ -100,7 +100,6 @@ struct intel_memory_region { > struct { > struct mutex lock; /* Protects access to objects */ > struct list_head list; > - struct list_head purgeable; > } objects; > > size_t chunk_size; > diff --git a/drivers/gpu/drm/i915/intel_region_ttm.c b/drivers/gpu/drm/i915/intel_region_ttm.c > index 3bd9caa60298..a74cae4602b5 100644 > --- a/drivers/gpu/drm/i915/intel_region_ttm.c > +++ b/drivers/gpu/drm/i915/intel_region_ttm.c > @@ -10,8 +10,7 @@ > > #include "intel_region_ttm.h" > > -/* A Zero-initialized driver for now. We don't have a TTM backend yet. */ > -static struct ttm_device_funcs i915_ttm_bo_driver; > +extern struct ttm_device_funcs i915_ttm_bo_driver; > > /** > * DOC: TTM support structure > @@ -198,6 +197,7 @@ struct sg_table *intel_region_ttm_node_to_st(struct intel_memory_region *mem, > return i915_sg_from_mm_node(node, mem->region.start); > } > > +#ifdef CONFIG_DRM_I915_SELFTEST > /** > * intel_region_ttm_node_alloc - Allocate memory resources from a region > * @mem: The memory region, > @@ -244,3 +244,4 @@ void *intel_region_ttm_node_alloc(struct intel_memory_region *mem, > ret = -ENXIO; > return ret ? ERR_PTR(ret) : res.mm_node; > } > +#endif > diff --git a/drivers/gpu/drm/i915/intel_region_ttm.h b/drivers/gpu/drm/i915/intel_region_ttm.h > index 40129f7e0317..9a5b0437d73f 100644 > --- a/drivers/gpu/drm/i915/intel_region_ttm.h > +++ b/drivers/gpu/drm/i915/intel_region_ttm.h > @@ -21,9 +21,12 @@ void intel_region_ttm_fini(struct intel_memory_region *mem); > struct sg_table *intel_region_ttm_node_to_st(struct intel_memory_region *mem, > void *node); > > +void intel_region_ttm_node_free(struct intel_memory_region *mem, > + void *node); > + > +#ifdef CONFIG_DRM_I915_SELFTEST > void *intel_region_ttm_node_alloc(struct intel_memory_region *mem, > resource_size_t size, > unsigned int flags); > -void intel_region_ttm_node_free(struct intel_memory_region *mem, > - void *node); > +#endif > #endif /* _INTEL_REGION_TTM_H_ */ > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c > index 4479c55aaa1d..74004d5cbfa2 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo.c > +++ b/drivers/gpu/drm/ttm/ttm_bo.c > @@ -1150,6 +1150,14 @@ int ttm_bo_swapout(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx, > return -EBUSY; > } > > + if (bo->bdev->funcs->swap_possible) { > + if (!bo->bdev->funcs->swap_possible(bo)) { > + if (locked) > + dma_resv_unlock(bo->base.resv); > + return -EBUSY; > + } > + } > + > if (bo->deleted) { > ttm_bo_cleanup_refs(bo, false, false, locked); > ttm_bo_put(bo); > @@ -1200,6 +1208,10 @@ int ttm_bo_swapout(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx, > if (bo->bdev->funcs->swap_notify) > bo->bdev->funcs->swap_notify(bo); > > + /* The call to swap_notify may have purged the bo */ > + if (!bo->ttm) > + goto out; > + > ret = ttm_tt_swapout(bo->bdev, bo->ttm, gfp_flags); > out: > > diff --git a/include/drm/ttm/ttm_device.h b/include/drm/ttm/ttm_device.h > index 7c8f87bd52d3..7c59d35e90f9 100644 > --- a/include/drm/ttm/ttm_device.h > +++ b/include/drm/ttm/ttm_device.h > @@ -181,6 +181,15 @@ struct ttm_device_funcs { > */ > void (*delete_mem_notify)(struct ttm_buffer_object *bo); > > + /** > + * struct ttm_bo_driver member swap_possible > + * > + * @bo: the buffer object to be evicted > + * > + * Check with the driver if it is possible to swap out a BO. > + */ > + bool (*swap_possible)(struct ttm_buffer_object *bo); > + > /** > * notify the driver that we're about to swap out this bo > */ 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=-15.1 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 CB21AC433B4 for ; Tue, 11 May 2021 13:58:55 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 58861613F7 for ; Tue, 11 May 2021 13:58:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 58861613F7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=amd.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CC5886EA38; Tue, 11 May 2021 13:58:54 +0000 (UTC) Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2078.outbound.protection.outlook.com [40.107.237.78]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9F6C46EA38; Tue, 11 May 2021 13:58:53 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fOxPnnVnIIyBgaLKXUMFB3nE+MBho6+yM95iBS7IVWOTBOV/f6KLpn31ETpalWEVLbVx6CmFI4frzJ/v6SpaNTwrRDP92Y9tWmImdsWB/CuzEhKPmAmNsGwHZ8Mx2/aWuM6RQ3IHx8OhWztGmvTOzdvPEH33YCCtMBJs1tEPaOIuBq6Qxz8rbGcgy8u3/W+HdTPX2B9SOQN/vR3wIyf37/WfTu2IdOjwYdxm2FDnE2ciMJFa1unaioXkHTD8h3X9M1BOwPHnRnVT6uSKTaiFo5Ag/f7Pfcfd9OHNlKtWhlD/WWsHE+qE7HDA+AZivksj58zA+c3UI+rNWPigSl6kpQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zFiM/md4/SL6UFFIP6mn/dta+AT1illttr676jaXNrc=; b=bep4Ndfc2f7qYnngujCQHa1m6knMOud+hNHc7NXhH9Q8DNUk91oeE/0wns5pg80Dj2tLBlqt1c8/826+zARiNbIV6jtI86/UDL02zf+mML6NZNlYi/0JVjNP4/PIzd8nUbjkg6gLiyJxLC55XUY3+mJxoe2WY06G9AduhSFTZDS/Ymho+7ajbj9Mg7MckwAj0dfJ1qaWIlnONq+M0If6Y8SKDVF7cddXMQBvIzgg9GtKtomvhyx1qpRtGXkdVSehHatlFR1Oj3J0ZzMyM9K9BkFcx5FEmp+j21B8+gh7KYR5vfVXDBFzyTbxvdmV0RyDcP4KtjNv8N43eCmxytvorA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zFiM/md4/SL6UFFIP6mn/dta+AT1illttr676jaXNrc=; b=SGhnADzmVl/q+ZNevn4rpHboYlfAB5JNJGwZE443i43vyJpIKHsyEWDkvJVdfF31WsgXsvW2srPXcfbofARsap+vwfgOjacLoGLCNZlS1rtB+M0j94HeuoTQlHSy+IcSvBe6cFGkDZflwyBydl16eMNW7Zu9zLDBkqDFGOlth0k= Authentication-Results: lists.freedesktop.org; dkim=none (message not signed) header.d=none; lists.freedesktop.org; dmarc=none action=none header.from=amd.com; Received: from MN2PR12MB3775.namprd12.prod.outlook.com (2603:10b6:208:159::19) by MN2PR12MB4207.namprd12.prod.outlook.com (2603:10b6:208:1d9::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4129.25; Tue, 11 May 2021 13:58:49 +0000 Received: from MN2PR12MB3775.namprd12.prod.outlook.com ([fe80::6d4d:4674:1cf6:8d34]) by MN2PR12MB3775.namprd12.prod.outlook.com ([fe80::6d4d:4674:1cf6:8d34%6]) with mapi id 15.20.4108.031; Tue, 11 May 2021 13:58:49 +0000 To: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org References: <20210511132525.377190-1-thomas.hellstrom@linux.intel.com> <20210511132525.377190-7-thomas.hellstrom@linux.intel.com> From: =?UTF-8?Q?Christian_K=c3=b6nig?= Message-ID: <8ac6bc5c-17c0-2ffd-7f8c-823ab3c8a858@amd.com> Date: Tue, 11 May 2021 15:58:41 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 In-Reply-To: <20210511132525.377190-7-thomas.hellstrom@linux.intel.com> Content-Language: en-US X-Originating-IP: [2a02:908:1252:fb60:5935:8b67:3cdd:7cc1] X-ClientProxiedBy: PR3P189CA0088.EURP189.PROD.OUTLOOK.COM (2603:10a6:102:b4::33) To MN2PR12MB3775.namprd12.prod.outlook.com (2603:10b6:208:159::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [IPv6:2a02:908:1252:fb60:5935:8b67:3cdd:7cc1] (2a02:908:1252:fb60:5935:8b67:3cdd:7cc1) by PR3P189CA0088.EURP189.PROD.OUTLOOK.COM (2603:10a6:102:b4::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4108.25 via Frontend Transport; Tue, 11 May 2021 13:58:47 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b91d81cd-1ba0-4516-1544-08d91484e6b7 X-MS-TrafficTypeDiagnostic: MN2PR12MB4207: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ejc3FRVgmEJKu5IJ4yveg9qzKoMnUyKiTE1tbvkU5jsM2XKQsZoQkfP90u+reRV1pHZeXc5NRumIQnTjaSslfdPyaISsYX7FcGJy21Vk8pcramMz0HR7H4t3kPvVrHKgT/tEZeyRYBmNSaK3Y5vt4U9soWVhbvVFILoTWwbtJwiVnv3nrC0YwYG0q1YZudRGc8EE9MD71HNHZxnghzYQbUopBUgZ2IcerBM8rgf8yrQCP50HxSPtE2Lr5qK7Pkqz5eF+5s3b0Blz6emwbIg03sVLBy9qKC456wRogjqa1bM4d67kUJA/WnrpHNTRFMoKAqZnM9JmD2o9zOhmDTY7l9pCxnTlmxUEVLXWaLVIlX9hb72l8VfbzdxFwtNAn93PB1k2CB3vXkP/D4t8TarTQ6wlW2yJEVDP79zx4jouPGojT+RlUzUi8YvdDBGFrwpbSoF12zh5lnPYefzHwUe3w6ECme78eP3IVDUx0M0q75UtvSvuDPsb4MMwne/kViCB9nnLLjTXkpVN/sOCS7BBiwtu2IKIvbsgqml8A2Q7z8Chxu4m7GkKYgLp+Ev4bxo4D8mQ5M0T5mMHCISmrQz0ZZlPSwb6BNQH4F2r/ccgbAWVqk/rxlOOeNFEnxVH/GYiRmO1jp9oN/gdqibMOYAtuH2e27Ld4rzqr4CXD3IFtdvAPDrSHKPa3gCmNF2GeWJJ X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MN2PR12MB3775.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(396003)(376002)(136003)(39860400002)(346002)(31696002)(36756003)(86362001)(38100700002)(66574015)(83380400001)(6666004)(66476007)(66946007)(66556008)(2616005)(2906002)(316002)(6486002)(8676002)(478600001)(186003)(16526019)(30864003)(8936002)(5660300002)(31686004)(52116002)(43740500002)(45980500001)(579004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?utf-8?B?UDRpSEtGYjJHaU9ndCtxeHp5SVExVUsyTzRqcjJPMXFmMzg4MGc0aXp5SmYv?= =?utf-8?B?UXJJcVZ2b0xoRm1mV012VktsYjhqYnhaNXFkSlVObmFMbXd6bVRGS3djVXNN?= =?utf-8?B?Nk0zT2pEZ0J1SzNGN0JkeXRvNGhrQUg3aHRqdEFJcHY4cUlXaU54cTA1RXRT?= =?utf-8?B?SjFERitUSFRLNWJTNEhtdVl5ZlVhUmJoMWUvOGlHU0NpSWFMMDFlUjUyS09K?= =?utf-8?B?WmtENzNPa1I5QjVTL1pSQnU1WHJCbjlQZHgzT0F0S1VNZU9ZZVhJT3NKYU41?= =?utf-8?B?TjJldmNRd1BpaW1VY2VPYUowVGF0anUwTE5hT08zQXdoYzZ4YTNyU3VLeUpn?= =?utf-8?B?T1Vid0syYlk4TmRqbDBzS25BVFdrYVpyTlExUnJQN3IxQ2V0VDFWd0dCcUpB?= =?utf-8?B?YnREaEdHT0J0TUZrVmFPWCtwaWt0NkdDWEdiak1xZFAzeUFVclh6MlJiQlNN?= =?utf-8?B?czV3cCtMUDVqcFRsZG9iYlVPQlNrUlA5MXV1ajlLWmNCRVpLL1pjNHBFL3BN?= =?utf-8?B?SGl5ZjRnVDQ3elVZbW83M3AwOWZGOWNvbXlDVE1vM0VaS2Y5eThIVTBaVVI1?= =?utf-8?B?MU1WMFl1WGQ4ZzQ5SXN4elQ0SkhCV2lwSE9uMUZYdG04dmgxWmFRczg4cjhV?= =?utf-8?B?N1RFQmpnZDU5RnBkanJlc01DdXhBM0NuMlZUNEdDMDVzdW5YVnN6VVdncHIr?= =?utf-8?B?VGJnOEkxT1QreXluL0dJN3hVUXRxSFVCS2tpVEZFZW1sRXAwdTVDR2hJUkQv?= =?utf-8?B?dGFBZ1Z3VVZ4NWkwMGFXaGV1aCtCZHpEa0h4Mjh0U1hzUlB3aERYdXI4NkVH?= =?utf-8?B?SEk1YjFtYUNUOEN3UEdwcndOL3FPZWs3TmFoSlh3eHZCRzVpUnhJU3ROQ2o5?= =?utf-8?B?ZXJXcE9MS0w4VWJNMlFHNW5wUGtDM3M0YlIvSHhPWWZWeWNoMklHNllXYk5p?= =?utf-8?B?ZDFYQ1FTTHIzY3p1b3Z1UFJTNjR5NXNZK1R2eUlPS2pKVm83NU8wVFY0dWZt?= =?utf-8?B?YnRETjh2SzZJUkNobHI5MTF3WWJTTjRBZlNaWS9NRWlLOUtUVEZVTi9qSkZR?= =?utf-8?B?T2JrRkpIN2llYjlTQ2hhOG1VTVlkS25VUkFKT0ZCank0TmhsYUFGdUF4TEJy?= =?utf-8?B?RVptd2RlVEJjNWxBYkYrYmlCMkdtTVdwcjJmQWlCeml5SmFxWlo1c1RhZ042?= =?utf-8?B?cCtIVlMwSUdCMTJaMC9wU2c2MmpaVHhqcCtwS2RJQWRHU2tUWGRTckdIWVhP?= =?utf-8?B?a3RORGd3amptWXV0QUpqNVY5QStVQ1IyY3pWM2VpWklNbkJIUkJOc1JGSHBZ?= =?utf-8?B?R2lyaXRBMnl3K0k1azNYWFZYNFFISUZGL3N1YkhuVXYwQ3IyY3AwVWdzTnBC?= =?utf-8?B?cHZNWW15aWxqT3BLa2Q0Qll2UDZFYTg3dU9vRGpTM2E4YnkySFdqbUFBY1hv?= =?utf-8?B?aHgyTzlyY3QxUEdyRmZvYmNCNXhNUWxMYUo2RXBLWHRtOVByTUF5bHlRSEFQ?= =?utf-8?B?NUtFdzFnRjdtamptNU90T1VzYi9WTGpFWml0dWNPa1AvMnpCK2ovb0NyTTVO?= =?utf-8?B?c3pyTENXTFkxeVFJMFdyeHBMcFdNVHVPRDMrOWFrcTBxMTJudGkxSDZBQ05F?= =?utf-8?B?czRjMGdpQTd6bHI3YUhzMzU2c0lSRkhIWmZkSzhCSHQxbjdEb0NFb3RtWDdP?= =?utf-8?B?WThzTzFaVEM5OGwwVldheE1pcjhvOUZ3dGRTSCtIODR1WUYyUmNyVVlISWdT?= =?utf-8?B?aFhXRjNJMWhxZ0FhOWtIOGp5cGF3OUQwN09xSXFqTlUzOUswbXRnbUVFQWtX?= =?utf-8?B?WDE1UGN6UWxUWEZENUx6QjNCZkJoandyNWJDdG5ESjRSeXlnVnJuN3B4UHlR?= =?utf-8?Q?S/latXw/fsoaT?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: b91d81cd-1ba0-4516-1544-08d91484e6b7 X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3775.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 May 2021 13:58:49.2980 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: r1RmzmRlKUD6hJzTfwJqC3xJuGQf1kRshDZzPAnuUnCpIONlf1i5FVxNQruAF+w4 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB4207 Subject: Re: [Intel-gfx] [PATCH 6/7] drm/i915/ttm, drm/ttm: Introduce a TTM i915 gem object backend X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" QW0gMTEuMDUuMjEgdW0gMTU6MjUgc2NocmllYiBUaG9tYXMgSGVsbHN0csO2bToKPiBNb3N0IGxv Z2ljYWwgcGxhY2UgdG8gaW50cm9kdWNlIFRUTSBidWZmZXIgb2JqZWN0cyBpcyBhcyBhbiBpOTE1 Cj4gZ2VtIG9iamVjdCBiYWNrZW5kLiBXZSBuZWVkIHRvIGFkZCBzb21lIG9wcyB0byBhY2NvdW50 IGZvciBhZGRlZAo+IGZ1bmN0aW9uYWxpdHkgbGlrZSBkZWxheWVkIGRlbGV0ZSBhbmQgTFJVIGxp c3QgbWFuaXB1bGF0aW9uLgo+Cj4gSW5pdGlhbGx5IHdlIHN1cHBvcnQgb25seSBMTUVNIGFuZCBT WVNURU0gbWVtb3J5LCBidXQgU1lTVEVNCj4gKHdoaWNoIGluIHRoaXMgY2FzZSBtZWFucyBldmlj dGVkIExNRU0gb2JqZWN0cykgaXMgbm90Cj4gdmlzaWJsZSB0byBpOTE1IEdFTSB5ZXQuIFRoZSBw bGFuIGlzIHRvIG1vdmUgdGhlIGk5MTUgZ2VtIHN5c3RlbSByZWdpb24KPiBvdmVyIHRvIHRoZSBU VE0gc3lzdGVtIG1lbW9yeSB0eXBlIGluIHVwY29taW5nIHBhdGNoZXMuCj4KPiBXZSBzZXQgdXAg R1BVIGJpbmRpbmdzIGRpcmVjdGx5IGJvdGggZnJvbSBMTUVNIGFuZCBmcm9tIHRoZSBzeXN0ZW0g cmVnaW9uLAo+IGFzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoZSBsZWdhY3kgVFRNX1RUIG1l bW9yeSB0eXBlLiBXZSByZXNlcnZlCj4gdGhhdCBmb3IgZnV0dXJlIHBvcnRpbmcgb2YgR0dUVCBi aW5kaW5ncyB0byBUVE0uCj4KPiBUaGVyZSBhcmUgc29tZSBjaGFuZ2VzIHRvIFRUTSB0byBhbGxv dyBmb3IgcHVyZ2luZyBzeXN0ZW0gbWVtb3J5IGJ1ZmZlcgo+IG9iamVjdHMgYW5kIHRvIHJlZnVz ZSBzd2FwcGluZyBvZiBzb21lIG9iamVjdHM6IFVuZm9ydHVuYXRlbHkgaTkxNSBnZW0KPiBzdGls bCByZWxpZXMgaGVhdmlseSBvbiBzaG9ydC10ZXJtIG9iamVjdCBwaW5uaW5nLCBhbmQgd2UndmUg Y2hvc2VuIHRvCj4ga2VlcCBzaG9ydC10ZXJtLXBpbm5lZCBidWZmZXIgb2JqZWN0cyBvbiB0aGUg VFRNIExSVSBsaXN0cyBmb3Igbm93LAo+IG1lYW5pbmcgdGhhdCB3ZSBuZWVkIHNvbWUgc29ydCBv ZiBtZWNoYW5pc20gdG8gdGVsbCBUVE0gdGhleSBhcmUgbm90Cj4gc3dhcHBhYmxlLiBBIGxvbmdl ciB0ZXJtIGdvYWwgaXMgdG8gZ2V0IHJpZCBvZiB0aGUgc2hvcnQtdGVybSBwaW5uaW5nLgoKV2Vs bCBqdXN0IHVzZSB0aGUgZXZpY3Rpb25fdmFsdWFibGUgaW50ZXJmYWNlIGZvciB0aGlzLgoKSW4g Z2VuZXJhbCBwbGVhc2UgbWFrZSBzZXBhcmF0ZSBwYXRjaGVzIGZvciB0aGUgVFRNIGNoYW5nZXMg YW5kIGZvciB0aGUgCmk5MTUgY2hhbmdlcyB1c2luZyB0aGVtIGZvciBlYXNpZXIgcmV2aWV3LgoK Q2hyaXN0aWFuLgoKPgo+IFJlbW92ZSB0aGUgb2xkIGxtZW0gYmFja2VuZC4KPgo+IENjOiBDaHJp c3RpYW4gS8O2bmlnIDxjaHJpc3RpYW4ua29lbmlnQGFtZC5jb20+Cj4gU2lnbmVkLW9mZi1ieTog VGhvbWFzIEhlbGxzdHLDtm0gPHRob21hcy5oZWxsc3Ryb21AbGludXguaW50ZWwuY29tPgo+IC0t LQo+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgICAgICAgICAgICAgICAgIHwgICAx ICsKPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9sbWVtLmMgICAgICB8ICA4 MyAtLS0KPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9sbWVtLmggICAgICB8 ICAgNSAtCj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMgICAg fCAxMjYgKysrLS0KPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3Qu aCAgICB8ICAgOSArCj4gICAuLi4vZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3RfdHlw ZXMuaCAgfCAgMTggKwo+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3JlZ2lv bi5jICAgIHwgICA2ICstCj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fdHRt LmMgICAgICAgfCA1MzQgKysrKysrKysrKysrKysrKysrCj4gICBkcml2ZXJzL2dwdS9kcm0vaTkx NS9nZW0vaTkxNV9nZW1fdHRtLmggICAgICAgfCAgNDggKysKPiAgIGRyaXZlcnMvZ3B1L2RybS9p OTE1L2d0L2ludGVsX3JlZ2lvbl9sbWVtLmMgICB8ICAgMyArLQo+ICAgZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9nZW0uYyAgICAgICAgICAgICAgIHwgICA1ICstCj4gICBkcml2ZXJzL2dwdS9k cm0vaTkxNS9pbnRlbF9tZW1vcnlfcmVnaW9uLmMgICAgfCAgIDEgLQo+ICAgZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfbWVtb3J5X3JlZ2lvbi5oICAgIHwgICAxIC0KPiAgIGRyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX3JlZ2lvbl90dG0uYyAgICAgICB8ICAgNSArLQo+ICAgZHJpdmVycy9n cHUvZHJtL2k5MTUvaW50ZWxfcmVnaW9uX3R0bS5oICAgICAgIHwgICA3ICstCj4gICBkcml2ZXJz L2dwdS9kcm0vdHRtL3R0bV9iby5jICAgICAgICAgICAgICAgICAgfCAgMTIgKwo+ICAgaW5jbHVk ZS9kcm0vdHRtL3R0bV9kZXZpY2UuaCAgICAgICAgICAgICAgICAgIHwgICA5ICsKPiAgIDE3IGZp bGVzIGNoYW5nZWQsIDczMyBpbnNlcnRpb25zKCspLCAxNDAgZGVsZXRpb25zKC0pCj4gICBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3R0bS5jCj4g ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3R0 bS5oCj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQo+IGluZGV4IDk1OGNjYzFlZGZlZC4uZWYwZDg4NGE5 ZTJkIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKPiBAQCAtMTU1LDYgKzE1NSw3IEBAIGdlbS15 ICs9IFwKPiAgIAlnZW0vaTkxNV9nZW1fc3RvbGVuLm8gXAo+ICAgCWdlbS9pOTE1X2dlbV90aHJv dHRsZS5vIFwKPiAgIAlnZW0vaTkxNV9nZW1fdGlsaW5nLm8gXAo+ICsJZ2VtL2k5MTVfZ2VtX3R0 bS5vIFwKPiAgIAlnZW0vaTkxNV9nZW1fdHRtX2JvX3V0aWwubyBcCj4gICAJZ2VtL2k5MTVfZ2Vt X3VzZXJwdHIubyBcCj4gICAJZ2VtL2k5MTVfZ2VtX3dhaXQubyBcCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9sbWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9nZW0vaTkxNV9nZW1fbG1lbS5jCj4gaW5kZXggZjQyODAzZWE0OGYyLi4yYjhjZDE1ZGUx ZDkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2xtZW0u Ywo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9sbWVtLmMKPiBAQCAt NCw3MyArNCwxMCBAQAo+ICAgICovCj4gICAKPiAgICNpbmNsdWRlICJpbnRlbF9tZW1vcnlfcmVn aW9uLmgiCj4gLSNpbmNsdWRlICJpbnRlbF9yZWdpb25fdHRtLmgiCj4gICAjaW5jbHVkZSAiZ2Vt L2k5MTVfZ2VtX3JlZ2lvbi5oIgo+ICAgI2luY2x1ZGUgImdlbS9pOTE1X2dlbV9sbWVtLmgiCj4g ICAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKPiAgIAo+IC1zdGF0aWMgdm9pZCBsbWVtX3B1dF9wYWdl cyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+IC0JCQkJICBzdHJ1Y3Qgc2dfdGFi bGUgKnBhZ2VzKQo+IC17Cj4gLQlpbnRlbF9yZWdpb25fdHRtX25vZGVfZnJlZShvYmotPm1tLnJl Z2lvbiwgb2JqLT5tbS5zdF9tbV9ub2RlKTsKPiAtCW9iai0+bW0uZGlydHkgPSBmYWxzZTsKPiAt CXNnX2ZyZWVfdGFibGUocGFnZXMpOwo+IC0Ja2ZyZWUocGFnZXMpOwo+IC19Cj4gLQo+IC1zdGF0 aWMgaW50IGxtZW1fZ2V0X3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCj4g LXsKPiAtCXVuc2lnbmVkIGludCBmbGFnczsKPiAtCXN0cnVjdCBzZ190YWJsZSAqcGFnZXM7Cj4g LQo+IC0JZmxhZ3MgPSBJOTE1X0FMTE9DX01JTl9QQUdFX1NJWkU7Cj4gLQlpZiAob2JqLT5mbGFn cyAmIEk5MTVfQk9fQUxMT0NfQ09OVElHVU9VUykKPiAtCQlmbGFncyB8PSBJOTE1X0FMTE9DX0NP TlRJR1VPVVM7Cj4gLQo+IC0Jb2JqLT5tbS5zdF9tbV9ub2RlID0gaW50ZWxfcmVnaW9uX3R0bV9u b2RlX2FsbG9jKG9iai0+bW0ucmVnaW9uLAo+IC0JCQkJCQkJIG9iai0+YmFzZS5zaXplLAo+IC0J CQkJCQkJIGZsYWdzKTsKPiAtCWlmIChJU19FUlIob2JqLT5tbS5zdF9tbV9ub2RlKSkKPiAtCQly ZXR1cm4gUFRSX0VSUihvYmotPm1tLnN0X21tX25vZGUpOwo+IC0KPiAtCS8qIFJhbmdlIG1hbmFn ZXIgaXMgYWx3YXlzIGNvbnRpZ291cyAqLwo+IC0JaWYgKG9iai0+bW0ucmVnaW9uLT5pc19yYW5n ZV9tYW5hZ2VyKQo+IC0JCW9iai0+ZmxhZ3MgfD0gSTkxNV9CT19BTExPQ19DT05USUdVT1VTOwo+ IC0JcGFnZXMgPSBpbnRlbF9yZWdpb25fdHRtX25vZGVfdG9fc3Qob2JqLT5tbS5yZWdpb24sIG9i ai0+bW0uc3RfbW1fbm9kZSk7Cj4gLQlpZiAoSVNfRVJSKHBhZ2VzKSkKPiAtCQlyZXR1cm4gUFRS X0VSUihwYWdlcyk7Cj4gLQo+IC0JX19pOTE1X2dlbV9vYmplY3Rfc2V0X3BhZ2VzKG9iaiwgcGFn ZXMsCj4gLQkJCQkgICAgaTkxNV9zZ19kbWFfcGFnZV9zaXplcyhwYWdlcy0+c2dsKSk7Cj4gLQo+ IC0JaWYgKG9iai0+ZmxhZ3MgJiBJOTE1X0JPX0FMTE9DX0NQVV9DTEVBUikgewo+IC0JCXZvaWQg X19pb21lbSAqdmFkZHIgPQo+IC0JCQlpOTE1X2dlbV9vYmplY3RfbG1lbV9pb19tYXAob2JqLCAw LCBvYmotPmJhc2Uuc2l6ZSk7Cj4gLQo+IC0JCWlmICghdmFkZHIpIHsKPiAtCQkJc3RydWN0IHNn X3RhYmxlICpwYWdlcyA9Cj4gLQkJCQlfX2k5MTVfZ2VtX29iamVjdF91bnNldF9wYWdlcyhvYmop Owo+IC0KPiAtCQkJaWYgKCFJU19FUlJfT1JfTlVMTChwYWdlcykpCj4gLQkJCQlsbWVtX3B1dF9w YWdlcyhvYmosIHBhZ2VzKTsKPiAtCQl9Cj4gLQo+IC0JCW1lbXNldF9pbyh2YWRkciwgMCwgb2Jq LT5iYXNlLnNpemUpOwo+IC0JCWlvX21hcHBpbmdfdW5tYXAodmFkZHIpOwo+IC0JfQo+IC0KPiAt CXJldHVybiAwOwo+IC19Cj4gLQo+IC1jb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdF9v cHMgaTkxNV9nZW1fbG1lbV9vYmpfb3BzID0gewo+IC0JLm5hbWUgPSAiaTkxNV9nZW1fb2JqZWN0 X2xtZW0iLAo+IC0JLmZsYWdzID0gSTkxNV9HRU1fT0JKRUNUX0hBU19JT01FTSwKPiAtCj4gLQku Z2V0X3BhZ2VzID0gbG1lbV9nZXRfcGFnZXMsCj4gLQkucHV0X3BhZ2VzID0gbG1lbV9wdXRfcGFn ZXMsCj4gLQkucmVsZWFzZSA9IGk5MTVfZ2VtX29iamVjdF9yZWxlYXNlX21lbW9yeV9yZWdpb24s Cj4gLX07Cj4gLQo+ICAgdm9pZCBfX2lvbWVtICoKPiAgIGk5MTVfZ2VtX29iamVjdF9sbWVtX2lv X21hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+ICAgCQkJICAgIHVuc2lnbmVk IGxvbmcgbiwKPiBAQCAtMTAyLDIzICszOSwzIEBAIGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfbG1l bShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKPiAgIAlyZXR1cm4gaTkxNV9nZW1fb2Jq ZWN0X2NyZWF0ZV9yZWdpb24oaTkxNS0+bW0ucmVnaW9uc1tJTlRFTF9SRUdJT05fTE1FTV0sCj4g ICAJCQkJCSAgICAgc2l6ZSwgZmxhZ3MpOwo+ICAgfQo+IC0KPiAtaW50IF9faTkxNV9nZW1fbG1l bV9vYmplY3RfaW5pdChzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAo+IC0JCQkJc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKPiAtCQkJCXJlc291cmNlX3NpemVfdCBzaXpl LAo+IC0JCQkJdW5zaWduZWQgaW50IGZsYWdzKQo+IC17Cj4gLQlzdGF0aWMgc3RydWN0IGxvY2tf Y2xhc3Nfa2V5IGxvY2tfY2xhc3M7Cj4gLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9 IG1lbS0+aTkxNTsKPiAtCj4gLQlkcm1fZ2VtX3ByaXZhdGVfb2JqZWN0X2luaXQoJmk5MTUtPmRy bSwgJm9iai0+YmFzZSwgc2l6ZSk7Cj4gLQlpOTE1X2dlbV9vYmplY3RfaW5pdChvYmosICZpOTE1 X2dlbV9sbWVtX29ial9vcHMsICZsb2NrX2NsYXNzLCBmbGFncyk7Cj4gLQo+IC0Jb2JqLT5yZWFk X2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fV0MgfCBJOTE1X0dFTV9ET01BSU5fR1RUOwo+IC0K PiAtCWk5MTVfZ2VtX29iamVjdF9zZXRfY2FjaGVfY29oZXJlbmN5KG9iaiwgSTkxNV9DQUNIRV9O T05FKTsKPiAtCj4gLQlpOTE1X2dlbV9vYmplY3RfaW5pdF9tZW1vcnlfcmVnaW9uKG9iaiwgbWVt KTsKPiAtCj4gLQlyZXR1cm4gMDsKPiAtfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9nZW0vaTkxNV9nZW1fbG1lbS5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVf Z2VtX2xtZW0uaAo+IGluZGV4IGZhYzZiYzVhNWViYi4uZWE3NmZkMTFjY2IwIDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9sbWVtLmgKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fbG1lbS5oCj4gQEAgLTI2LDkgKzI2LDQgQEAg aTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9sbWVtKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1 LAo+ICAgCQkJICAgIHJlc291cmNlX3NpemVfdCBzaXplLAo+ICAgCQkJICAgIHVuc2lnbmVkIGlu dCBmbGFncyk7Cj4gICAKPiAtaW50IF9faTkxNV9nZW1fbG1lbV9vYmplY3RfaW5pdChzdHJ1Y3Qg aW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAo+IC0JCQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iaiwKPiAtCQkJCXJlc291cmNlX3NpemVfdCBzaXplLAo+IC0JCQkJdW5zaWduZWQgaW50 IGZsYWdzKTsKPiAtCj4gICAjZW5kaWYgLyogIV9fSTkxNV9HRU1fTE1FTV9IICovCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuYyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuYwo+IGluZGV4IGM4OTUzZTNmNWM3 MC4uYzUzNDg4ZjM5MWRkIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9p OTE1X2dlbV9vYmplY3QuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dl bV9vYmplY3QuYwo+IEBAIC0xNzIsNyArMTcyLDcgQEAgc3RhdGljIHZvaWQgaTkxNV9nZW1fY2xv c2Vfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtLCBzdHJ1Y3QgZHJtX2ZpbGUgKmYK PiAgIAl9Cj4gICB9Cj4gICAKPiAtc3RhdGljIHZvaWQgX19pOTE1X2dlbV9mcmVlX29iamVjdF9y Y3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQo+ICt2b2lkIF9faTkxNV9nZW1fZnJlZV9vYmplY3Rf cmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKPiAgIHsKPiAgIAlzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqID0KPiAgIAkJY29udGFpbmVyX29mKGhlYWQsIHR5cGVvZigqb2JqKSwgcmN1 KTsKPiBAQCAtMjA4LDU5ICsyMDgsNzAgQEAgc3RhdGljIHZvaWQgX19pOTE1X2dlbV9vYmplY3Rf ZnJlZV9tbWFwcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+ICAgCX0KPiAgIH0K PiAgIAo+IC1zdGF0aWMgdm9pZCBfX2k5MTVfZ2VtX2ZyZWVfb2JqZWN0cyhzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSwKPiAtCQkJCSAgICBzdHJ1Y3QgbGxpc3Rfbm9kZSAqZnJlZWQpCj4g K3ZvaWQgX19pOTE1X2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqKQo+ICAgewo+IC0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgKm9uOwo+ICsJ dHJhY2VfaTkxNV9nZW1fb2JqZWN0X2Rlc3Ryb3kob2JqKTsKPiAgIAo+IC0JbGxpc3RfZm9yX2Vh Y2hfZW50cnlfc2FmZShvYmosIG9uLCBmcmVlZCwgZnJlZWQpIHsKPiAtCQl0cmFjZV9pOTE1X2dl bV9vYmplY3RfZGVzdHJveShvYmopOwo+ICsJaWYgKCFsaXN0X2VtcHR5KCZvYmotPnZtYS5saXN0 KSkgewo+ICsJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwo+ICsKPiArCQkvKgo+ICsJCSAqIE5vdGUg dGhhdCB0aGUgdm1hIGtlZXBzIGFuIG9iamVjdCByZWZlcmVuY2Ugd2hpbGUKPiArCQkgKiBpdCBp cyBhY3RpdmUsIHNvIGl0ICpzaG91bGQqIG5vdCBzbGVlcCB3aGlsZSB3ZQo+ICsJCSAqIGRlc3Ry b3kgaXQuIE91ciBkZWJ1ZyBjb2RlIGVycnMgaW5zaXRzIGl0ICptaWdodCouCj4gKwkJICogRm9y IHRoZSBtb21lbnQsIHBsYXkgYWxvbmcuCj4gKwkJICovCj4gKwkJc3Bpbl9sb2NrKCZvYmotPnZt YS5sb2NrKTsKPiArCQl3aGlsZSAoKHZtYSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmb2Jq LT52bWEubGlzdCwKPiArCQkJCQkJICAgICAgIHN0cnVjdCBpOTE1X3ZtYSwKPiArCQkJCQkJICAg ICAgIG9ial9saW5rKSkpIHsKPiArCQkJR0VNX0JVR19PTih2bWEtPm9iaiAhPSBvYmopOwo+ICsJ CQlzcGluX3VubG9jaygmb2JqLT52bWEubG9jayk7Cj4gICAKPiAtCQlpZiAoIWxpc3RfZW1wdHko Jm9iai0+dm1hLmxpc3QpKSB7Cj4gLQkJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwo+ICsJCQlfX2k5 MTVfdm1hX3B1dCh2bWEpOwo+ICAgCj4gLQkJCS8qCj4gLQkJCSAqIE5vdGUgdGhhdCB0aGUgdm1h IGtlZXBzIGFuIG9iamVjdCByZWZlcmVuY2Ugd2hpbGUKPiAtCQkJICogaXQgaXMgYWN0aXZlLCBz byBpdCAqc2hvdWxkKiBub3Qgc2xlZXAgd2hpbGUgd2UKPiAtCQkJICogZGVzdHJveSBpdC4gT3Vy IGRlYnVnIGNvZGUgZXJycyBpbnNpdHMgaXQgKm1pZ2h0Ki4KPiAtCQkJICogRm9yIHRoZSBtb21l bnQsIHBsYXkgYWxvbmcuCj4gLQkJCSAqLwo+ICAgCQkJc3Bpbl9sb2NrKCZvYmotPnZtYS5sb2Nr KTsKPiAtCQkJd2hpbGUgKCh2bWEgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJm9iai0+dm1h Lmxpc3QsCj4gLQkJCQkJCQkgICAgICAgc3RydWN0IGk5MTVfdm1hLAo+IC0JCQkJCQkJICAgICAg IG9ial9saW5rKSkpIHsKPiAtCQkJCUdFTV9CVUdfT04odm1hLT5vYmogIT0gb2JqKTsKPiAtCQkJ CXNwaW5fdW5sb2NrKCZvYmotPnZtYS5sb2NrKTsKPiArCQl9Cj4gKwkJc3Bpbl91bmxvY2soJm9i ai0+dm1hLmxvY2spOwo+ICsJfQo+ICAgCj4gLQkJCQlfX2k5MTVfdm1hX3B1dCh2bWEpOwo+ICsJ X19pOTE1X2dlbV9vYmplY3RfZnJlZV9tbWFwcyhvYmopOwo+ICAgCj4gLQkJCQlzcGluX2xvY2so Jm9iai0+dm1hLmxvY2spOwo+IC0JCQl9Cj4gLQkJCXNwaW5fdW5sb2NrKCZvYmotPnZtYS5sb2Nr KTsKPiAtCQl9Cj4gKwlHRU1fQlVHX09OKCFsaXN0X2VtcHR5KCZvYmotPmx1dF9saXN0KSk7Cj4g ICAKPiAtCQlfX2k5MTVfZ2VtX29iamVjdF9mcmVlX21tYXBzKG9iaik7Cj4gKwlhdG9taWNfc2V0 KCZvYmotPm1tLnBhZ2VzX3Bpbl9jb3VudCwgMCk7Cj4gKwlfX2k5MTVfZ2VtX29iamVjdF9wdXRf cGFnZXMob2JqKTsKPiArCUdFTV9CVUdfT04oaTkxNV9nZW1fb2JqZWN0X2hhc19wYWdlcyhvYmop KTsKPiArCWJpdG1hcF9mcmVlKG9iai0+Yml0XzE3KTsKPiAgIAo+IC0JCUdFTV9CVUdfT04oIWxp c3RfZW1wdHkoJm9iai0+bHV0X2xpc3QpKTsKPiArCWlmIChvYmotPmJhc2UuaW1wb3J0X2F0dGFj aCkKPiArCQlkcm1fcHJpbWVfZ2VtX2Rlc3Ryb3koJm9iai0+YmFzZSwgTlVMTCk7Cj4gICAKPiAt CQlhdG9taWNfc2V0KCZvYmotPm1tLnBhZ2VzX3Bpbl9jb3VudCwgMCk7Cj4gLQkJX19pOTE1X2dl bV9vYmplY3RfcHV0X3BhZ2VzKG9iaik7Cj4gLQkJR0VNX0JVR19PTihpOTE1X2dlbV9vYmplY3Rf aGFzX3BhZ2VzKG9iaikpOwo+IC0JCWJpdG1hcF9mcmVlKG9iai0+Yml0XzE3KTsKPiArCWRybV9n ZW1fZnJlZV9tbWFwX29mZnNldCgmb2JqLT5iYXNlKTsKPiAgIAo+IC0JCWlmIChvYmotPmJhc2Uu aW1wb3J0X2F0dGFjaCkKPiAtCQkJZHJtX3ByaW1lX2dlbV9kZXN0cm95KCZvYmotPmJhc2UsIE5V TEwpOwo+ICsJaWYgKG9iai0+b3BzLT5yZWxlYXNlKQo+ICsJCW9iai0+b3BzLT5yZWxlYXNlKG9i aik7Cj4gICAKPiAtCQlkcm1fZ2VtX2ZyZWVfbW1hcF9vZmZzZXQoJm9iai0+YmFzZSk7Cj4gKwlp ZiAob2JqLT5tbS5uX3BsYWNlbWVudHMgPiAxKQo+ICsJCWtmcmVlKG9iai0+bW0ucGxhY2VtZW50 cyk7Cj4gICAKPiAtCQlpZiAob2JqLT5vcHMtPnJlbGVhc2UpCj4gLQkJCW9iai0+b3BzLT5yZWxl YXNlKG9iaik7Cj4gKwlpZiAob2JqLT5yZXN2X3NoYXJlZF9mcm9tKQo+ICsJCWk5MTVfdm1fcmVz dl9wdXQob2JqLT5yZXN2X3NoYXJlZF9mcm9tKTsKPiAgIAo+IC0JCWlmIChvYmotPm1tLm5fcGxh Y2VtZW50cyA+IDEpCj4gLQkJCWtmcmVlKG9iai0+bW0ucGxhY2VtZW50cyk7Cj4gK30KPiArCj4g K3N0YXRpYyB2b2lkIF9faTkxNV9nZW1fZnJlZV9vYmplY3RzKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1LAo+ICsJCQkJICAgIHN0cnVjdCBsbGlzdF9ub2RlICpmcmVlZCkKPiArewo+ICsJ c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgKm9uOwo+ICAgCj4gLQkJaWYgKG9iai0+ cmVzdl9zaGFyZWRfZnJvbSkKPiAtCQkJaTkxNV92bV9yZXN2X3B1dChvYmotPnJlc3Zfc2hhcmVk X2Zyb20pOwo+ICsJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIG9uLCBmcmVlZCwgZnJl ZWQpIHsKPiArCQltaWdodF9zbGVlcCgpOwo+ICsJCWlmIChvYmotPm9wcy0+ZGVsYXllZF9mcmVl KSB7Cj4gKwkJCW9iai0+b3BzLT5kZWxheWVkX2ZyZWUob2JqKTsKPiArCQkJY29udGludWU7Cj4g KwkJfQo+ICsJCV9faTkxNV9nZW1fZnJlZV9vYmplY3Qob2JqKTsKPiAgIAo+ICAgCQkvKiBCdXQg a2VlcCB0aGUgcG9pbnRlciBhbGl2ZSBmb3IgUkNVLXByb3RlY3RlZCBsb29rdXBzICovCj4gICAJ CWNhbGxfcmN1KCZvYmotPnJjdSwgX19pOTE1X2dlbV9mcmVlX29iamVjdF9yY3UpOwo+IEBAIC0z MTgsNiArMzI5LDcgQEAgc3RhdGljIHZvaWQgaTkxNV9nZW1fZnJlZV9vYmplY3Qoc3RydWN0IGRy bV9nZW1fb2JqZWN0ICpnZW1fb2JqKQo+ICAgCSAqIHdvcmtlciBhbmQgcGVyZm9ybWluZyBmcmVl cyBkaXJlY3RseSBmcm9tIHN1YnNlcXVlbnQgYWxsb2NhdGlvbnMgZm9yCj4gICAJICogY3J1ZGUg YnV0IGVmZmVjdGl2ZSBtZW1vcnkgdGhyb3R0bGluZy4KPiAgIAkgKi8KPiArCj4gICAJaWYgKGxs aXN0X2FkZCgmb2JqLT5mcmVlZCwgJmk5MTUtPm1tLmZyZWVfbGlzdCkpCj4gICAJCXF1ZXVlX3dv cmsoaTkxNS0+d3EsICZpOTE1LT5tbS5mcmVlX3dvcmspOwo+ICAgfQo+IEBAIC00MTAsNiArNDIy LDQyIEBAIGludCBpOTE1X2dlbV9vYmplY3RfcmVhZF9mcm9tX3BhZ2Uoc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaiwgdTY0IG9mZnNldCwKPiAgIAlyZXR1cm4gMDsKPiAgIH0KPiAgIAo+ ICsvKioKPiArICogaTkxNV9nZW1fb2JqZWN0X2V2aWN0YWJsZSAtIFdoZXRoZXIgb2JqZWN0IGlz IGxpa2VseSBldmljdGFibGUgYWZ0ZXIgdW5iaW5kLgo+ICsgKiBAb2JqOiBUaGUgb2JqZWN0IHRv IGNoZWNrCj4gKyAqCj4gKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIG9iamVj dCBpcyBsaWtlbHkgdW52aWN0YWJsZSBhZnRlciB1bmJpbmQuCj4gKyAqIElmIHRoZSBvYmplY3Qg aXMgbm90IGxvY2tlZCB3aGVuIGNoZWNraW5nLCB0aGUgcmVzdWx0IGlzIG9ubHkgYWR2aXNvcnku Cj4gKyAqIElmIHRoZSBvYmplY3QgaXMgbG9ja2VkIHdoZW4gY2hlY2tpbmcsIGFuZCB0aGUgZnVu Y3Rpb24gcmV0dXJucyB0cnVlLAo+ICsgKiB0aGVuIGFuIGV2aWN0aW9uIHNob3VsZCBpbmRlZWQg YmUgcG9zc2libGUuIEJ1dCBzaW5jZSB1bmxvY2tlZCB2bWEKPiArICogdW5waW5uaW5nIGFuZCB1 bmJpbmRpbmcgaXMgY3VycmVudGx5IHBvc3NpYmxlLCB0aGUgb2JqZWN0IGNhbiBhY3R1YWxseQo+ ICsgKiBiZWNvbWUgZXZpY3RhYmxlIGV2ZW4gaWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNl Lgo+ICsgKgo+ICsgKiBSZXR1cm46IHRydWUgaWYgdGhlIG9iamVjdCBtYXkgYmUgZXZpY3RhYmxl LiBGYWxzZSBvdGhlcndpc2UuCj4gKyAqLwo+ICtib29sIGk5MTVfZ2VtX29iamVjdF9ldmljdGFi bGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKPiArewo+ICsJc3RydWN0IGk5MTVf dm1hICp2bWE7Cj4gKwlpbnQgcGluX2NvdW50ID0gYXRvbWljX3JlYWQoJm9iai0+bW0ucGFnZXNf cGluX2NvdW50KTsKPiArCj4gKwlpZiAoIXBpbl9jb3VudCkKPiArCQlyZXR1cm4gdHJ1ZTsKPiAr Cj4gKwlzcGluX2xvY2soJm9iai0+dm1hLmxvY2spOwo+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeSh2 bWEsICZvYmotPnZtYS5saXN0LCBvYmpfbGluaykgewo+ICsJCWlmIChpOTE1X3ZtYV9pc19waW5u ZWQodm1hKSkgewo+ICsJCQlzcGluX3VubG9jaygmb2JqLT52bWEubG9jayk7Cj4gKwkJCXJldHVy biBmYWxzZTsKPiArCQl9Cj4gKwkJaWYgKGF0b21pY19yZWFkKCZ2bWEtPnBhZ2VzX2NvdW50KSkK PiArCQkJcGluX2NvdW50LS07Cj4gKwl9Cj4gKwlzcGluX3VubG9jaygmb2JqLT52bWEubG9jayk7 Cj4gKwlHRU1fV0FSTl9PTihwaW5fY291bnQgPCAwKTsKPiArCj4gKwlyZXR1cm4gcGluX2NvdW50 ID09IDA7Cj4gK30KPiArCj4gICB2b2lkIGk5MTVfZ2VtX2luaXRfX29iamVjdHMoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUpCj4gICB7Cj4gICAJSU5JVF9XT1JLKCZpOTE1LT5tbS5mcmVl X3dvcmssIF9faTkxNV9nZW1fZnJlZV93b3JrKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2Vt L2k5MTVfZ2VtX29iamVjdC5oCj4gaW5kZXggMmViZDc5NTM3YWVhLi5hZTU5MzBlMzA3ZDUgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5oCj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5oCj4gQEAgLTIw MCw2ICsyMDAsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV9nZW1fb2JqZWN0X3RyeWxvY2so c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKPiAgIAo+ICAgc3RhdGljIGlubGluZSB2 b2lkIGk5MTVfZ2VtX29iamVjdF91bmxvY2soc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aikKPiAgIHsKPiArCWlmIChvYmotPm9wcy0+YWRqdXN0X2xydSkKPiArCQlvYmotPm9wcy0+YWRq dXN0X2xydShvYmopOwo+ICsKPiAgIAlkbWFfcmVzdl91bmxvY2sob2JqLT5iYXNlLnJlc3YpOwo+ ICAgfQo+ICAgCj4gQEAgLTU4Nyw2ICs1OTAsMTIgQEAgaW50IGk5MTVfZ2VtX29iamVjdF9yZWFk X2Zyb21fcGFnZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCB1NjQgb2Zmc2V0LAo+ ICAgCj4gICBib29sIGk5MTVfZ2VtX29iamVjdF9pc19zaG1lbShjb25zdCBzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqKTsKPiAgIAo+ICt2b2lkIF9faTkxNV9nZW1fZnJlZV9vYmplY3Rf cmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCk7Cj4gKwo+ICt2b2lkIF9faTkxNV9nZW1fZnJlZV9v YmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cj4gKwo+ICtib29sIGk5MTVf Z2VtX29iamVjdF9ldmljdGFibGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cj4g Kwo+ICAgI2lmZGVmIENPTkZJR19NTVVfTk9USUZJRVIKPiAgIHN0YXRpYyBpbmxpbmUgYm9vbAo+ ICAgaTkxNV9nZW1fb2JqZWN0X2lzX3VzZXJwdHIoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaikKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29i amVjdF90eXBlcy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdF90 eXBlcy5oCj4gaW5kZXggOThmNjlkOGZkMzdkLi5iMzUwNzY1ZTE5MzUgMTAwNjQ0Cj4gLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdF90eXBlcy5oCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdF90eXBlcy5oCj4gQEAgLTYz LDYgKzYzLDIwIEBAIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0X29wcyB7Cj4gICAJCSAgICAg IGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlICphcmcpOwo+ICAgCj4gICAJaW50ICgq ZG1hYnVmX2V4cG9ydCkoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cj4gKwo+ICsJ LyoqCj4gKwkgKiBhZGp1c3RfbHJ1IC0gbm90aWZ5IHRoYXQgdGhlIG1hZHZpc2UgdmFsdWUgd2Fz IHVwZGF0ZWQKPiArCSAqIEBvYmo6IFRoZSBnZW0gb2JqZWN0Cj4gKwkgKgo+ICsJICogVGhlIG1h ZHZpc2UgdmFsdWUgbWF5IGhhdmUgYmVlbiB1cGRhdGVkLCBvciBvYmplY3Qgd2FzIHJlY2VudGx5 Cj4gKwkgKiByZWZlcmVuY2VkIHNvIGFjdCBhY2NvcmRpbmdseSAoUGVyaGFwcyBjaGFuZ2luZyBh biBMUlUgbGlzdCBldGMpLgo+ICsJICovCj4gKwl2b2lkICgqYWRqdXN0X2xydSkoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cj4gKwo+ICsJLyoqCj4gKwkgKiBkZWxheWVkX2ZyZWUg LSBPdmVycmlkZSB0aGUgZGVmYXVsdCBkZWxheWVkIGZyZWUgaW1wbGVtZW50YXRpb24KPiArCSAq Lwo+ICsJdm9pZCAoKmRlbGF5ZWRfZnJlZSkoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aik7Cj4gICAJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmop Owo+ICAgCj4gICAJY29uc3QgY2hhciAqbmFtZTsgLyogZnJpZW5kbHkgbmFtZSBmb3IgZGVidWcs IGUuZy4gbG9ja2RlcCBjbGFzc2VzICovCj4gQEAgLTMwNyw2ICszMjEsMTAgQEAgc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3Qgewo+ICAgCQlib29sIGRpcnR5OjE7Cj4gICAJfSBtbTsKPiAgIAo+ ICsJc3RydWN0IHsKPiArCQlzdHJ1Y3Qgc2dfdGFibGUgKmNhY2hlZF9pb19zdDsKPiArCX0gdHRt Owo+ICsKPiAgIAkvKiogUmVjb3JkIG9mIGFkZHJlc3MgYml0IDE3IG9mIGVhY2ggcGFnZSBhdCBs YXN0IHVuYmluZC4gKi8KPiAgIAl1bnNpZ25lZCBsb25nICpiaXRfMTc7Cj4gICAKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3JlZ2lvbi5jIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3JlZ2lvbi5jCj4gaW5kZXggZjI1ZTY2NDZjNWI3 Li5kMWYxODQwNTQwZGQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5 MTVfZ2VtX3JlZ2lvbi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2Vt X3JlZ2lvbi5jCj4gQEAgLTE4LDExICsxOCw3IEBAIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2luaXRf bWVtb3J5X3JlZ2lvbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+ICAgCj4gICAJ bXV0ZXhfbG9jaygmbWVtLT5vYmplY3RzLmxvY2spOwo+ICAgCj4gLQlpZiAob2JqLT5mbGFncyAm IEk5MTVfQk9fQUxMT0NfVk9MQVRJTEUpCj4gLQkJbGlzdF9hZGQoJm9iai0+bW0ucmVnaW9uX2xp bmssICZtZW0tPm9iamVjdHMucHVyZ2VhYmxlKTsKPiAtCWVsc2UKPiAtCQlsaXN0X2FkZCgmb2Jq LT5tbS5yZWdpb25fbGluaywgJm1lbS0+b2JqZWN0cy5saXN0KTsKPiAtCj4gKwlsaXN0X2FkZCgm b2JqLT5tbS5yZWdpb25fbGluaywgJm1lbS0+b2JqZWN0cy5saXN0KTsKPiAgIAltdXRleF91bmxv Y2soJm1lbS0+b2JqZWN0cy5sb2NrKTsKPiAgIH0KPiAgIAo+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fdHRtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9n ZW0vaTkxNV9nZW1fdHRtLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAw MDAwMC4uZTM3MThjM2NiMjk5Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2dlbS9pOTE1X2dlbV90dG0uYwo+IEBAIC0wLDAgKzEsNTM0IEBACj4gKy8vIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBNSVQKPiArLyoKPiArICogQ29weXJpZ2h0IMKpIDIwMjEgSW50 ZWwgQ29ycG9yYXRpb24KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8ZHJtL3R0bS90dG1fYm9fZHJp dmVyLmg+Cj4gKyNpbmNsdWRlIDxkcm0vdHRtL3R0bV9wbGFjZW1lbnQuaD4KPiArCj4gKyNpbmNs dWRlICJpOTE1X2Rydi5oIgo+ICsjaW5jbHVkZSAiaW50ZWxfbWVtb3J5X3JlZ2lvbi5oIgo+ICsj aW5jbHVkZSAiaW50ZWxfcmVnaW9uX3R0bS5oIgo+ICsKPiArI2luY2x1ZGUgImdlbS9pOTE1X2dl bV9vYmplY3QuaCIKPiArI2luY2x1ZGUgImdlbS9pOTE1X2dlbV9yZWdpb24uaCIKPiArI2luY2x1 ZGUgImdlbS9pOTE1X2dlbV90dG0uaCIKPiArI2luY2x1ZGUgImdlbS9pOTE1X2dlbV90dG1fYm9f dXRpbC5oIgo+ICsKPiArI2RlZmluZSBJOTE1X1BMX0xNRU0wIFRUTV9QTF9QUklWCj4gKyNkZWZp bmUgSTkxNV9QTF9TWVNURU0gVFRNX1BMX1NZU1RFTQo+ICsjZGVmaW5lIEk5MTVfUExfU1RPTEVO IFRUTV9QTF9WUkFNCj4gKyNkZWZpbmUgSTkxNV9QTF9HR1RUIFRUTV9QTF9UVAo+ICsKPiArI2Rl ZmluZSBJOTE1X1RUTV9QUklPX1BVUkdFICAgICAwCj4gKyNkZWZpbmUgSTkxNV9UVE1fUFJJT19O T19QQUdFUyAgMQo+ICsjZGVmaW5lIEk5MTVfVFRNX1BSSU9fSEFTX1BBR0VTIDIKPiArCj4gKy8q Kgo+ICsgKiBzdHJ1Y3QgaTkxNV90dG1fdHQgLSBUVE0gcGFnZSB2ZWN0b3Igd2l0aCBhZGRpdGlv bmFsIHByaXZhdGUgaW5mb3JtYXRpb24KPiArICogQHR0bTogVGhlIGJhc2UgVFRNIHBhZ2UgdmVj dG9yLgo+ICsgKiBAZGV2OiBUaGUgc3RydWN0IGRldmljZSB1c2VkIGZvciBkbWEgbWFwcGluZyBh bmQgdW5tYXBwaW5nLgo+ICsgKiBAY2FjaGVkX3N0OiBUaGUgY2FjaGVkIHNjYXR0ZXItZ2F0aGVy IHRhYmxlLgo+ICsgKgo+ICsgKiBOb3RlIHRoYXQgRE1BIG1heSBiZSBnb2luZyBvbiByaWdodCB1 cCB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHBhZ2UtCj4gKyAqIHZlY3RvciBpcyB1bnBvcHVsYXRl ZCBpbiBkZWxheWVkIGRlc3Ryb3kuIEhlbmNlIGtlZXAgdGhlCj4gKyAqIHNjYXR0ZXItZ2F0aGVy IHRhYmxlIG1hcHBlZCBhbmQgY2FjaGVkIHVwIHRvIHRoYXQgcG9pbnQuIFRoaXMgaXMKPiArICog ZGlmZmVyZW50IGZyb20gdGhlIGNhY2hlZCBnZW0gb2JqZWN0IGlvIHNjYXR0ZXItZ2F0aGVyIHRh YmxlIHdoaWNoCj4gKyAqIGRvZXNuJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGRtYSBtYXBwaW5nLgo+ ICsgKi8KPiArc3RydWN0IGk5MTVfdHRtX3R0IHsKPiArCXN0cnVjdCB0dG1fdHQgdHRtOwo+ICsJ c3RydWN0IGRldmljZSAqZGV2Owo+ICsJc3RydWN0IHNnX3RhYmxlICpjYWNoZWRfc3Q7Cj4gK307 Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHR0bV9wbGFjZSBsbWVtMF9zeXNfcGxhY2VtZW50 X2ZsYWdzW10gPSB7Cj4gKwl7Cj4gKwkJLmZwZm4gPSAwLAo+ICsJCS5scGZuID0gMCwKPiArCQku bWVtX3R5cGUgPSBJOTE1X1BMX0xNRU0wLAo+ICsJCS5mbGFncyA9IDAsCj4gKwl9LCB7Cj4gKwkJ LmZwZm4gPSAwLAo+ICsJCS5scGZuID0gMCwKPiArCQkubWVtX3R5cGUgPSBJOTE1X1BMX1NZU1RF TSwKPiArCQkuZmxhZ3MgPSAwLAo+ICsJfQo+ICt9Owo+ICsKPiArc3RydWN0IHR0bV9wbGFjZW1l bnQgaTkxNV9sbWVtMF9wbGFjZW1lbnQgPSB7Cj4gKwkubnVtX3BsYWNlbWVudCA9IDEsCj4gKwku cGxhY2VtZW50ID0gJmxtZW0wX3N5c19wbGFjZW1lbnRfZmxhZ3NbMF0sCj4gKwkubnVtX2J1c3lf cGxhY2VtZW50ID0gMSwKPiArCS5idXN5X3BsYWNlbWVudCA9ICZsbWVtMF9zeXNfcGxhY2VtZW50 X2ZsYWdzWzBdLAo+ICt9Owo+ICsKPiArc3RydWN0IHR0bV9wbGFjZW1lbnQgaTkxNV9sbWVtMF9z eXNfcGxhY2VtZW50ID0gewo+ICsJLm51bV9wbGFjZW1lbnQgPSAxLAo+ICsJLnBsYWNlbWVudCA9 ICZsbWVtMF9zeXNfcGxhY2VtZW50X2ZsYWdzWzBdLAo+ICsJLm51bV9idXN5X3BsYWNlbWVudCA9 IDIsCj4gKwkuYnVzeV9wbGFjZW1lbnQgPSAmbG1lbTBfc3lzX3BsYWNlbWVudF9mbGFnc1swXSwK PiArfTsKPiArCj4gK3N0cnVjdCB0dG1fcGxhY2VtZW50IGk5MTVfc3lzX3BsYWNlbWVudCA9IHsK PiArCS5udW1fcGxhY2VtZW50ID0gMSwKPiArCS5wbGFjZW1lbnQgPSAmbG1lbTBfc3lzX3BsYWNl bWVudF9mbGFnc1sxXSwKPiArCS5udW1fYnVzeV9wbGFjZW1lbnQgPSAxLAo+ICsJLmJ1c3lfcGxh Y2VtZW50ID0gJmxtZW0wX3N5c19wbGFjZW1lbnRfZmxhZ3NbMV0sCj4gK307Cj4gKwo+ICtzdGF0 aWMgdm9pZCBpOTE1X3R0bV9hZGp1c3RfbHJ1KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpv YmopOwo+ICsKPiArc3RhdGljIHN0cnVjdCB0dG1fdHQgKmk5MTVfdHRtX3R0X2NyZWF0ZShzdHJ1 Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAo+ICsJCQkJCSB1aW50MzJfdCBwYWdlX2ZsYWdzKQo+ ICt7Cj4gKwlzdHJ1Y3QgdHRtX3Jlc291cmNlX21hbmFnZXIgKm1hbiA9Cj4gKwkJdHRtX21hbmFn ZXJfdHlwZShiby0+YmRldiwgYm8tPm1lbS5tZW1fdHlwZSk7Cj4gKwlzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqID0gaTkxNV90dG1fdG9fZ2VtKGJvKTsKPiArCXN0cnVjdCBpOTE1X3R0 bV90dCAqaTkxNV90dDsKPiArCWludCByZXQ7Cj4gKwo+ICsJaTkxNV90dCA9IGt6YWxsb2Moc2l6 ZW9mKCppOTE1X3R0KSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWk5MTVfdHQpCj4gKwkJcmV0dXJu IE5VTEw7Cj4gKwo+ICsJaWYgKG9iai0+ZmxhZ3MgJiBJOTE1X0JPX0FMTE9DX0NQVV9DTEVBUiAm Jgo+ICsJICAgIG1hbi0+dXNlX3R0KQo+ICsJCXBhZ2VfZmxhZ3MgfD0gVFRNX1BBR0VfRkxBR19a RVJPX0FMTE9DOwo+ICsKPiArCXJldCA9IHR0bV90dF9pbml0KCZpOTE1X3R0LT50dG0sIGJvLCBw YWdlX2ZsYWdzLCB0dG1fY2FjaGVkKTsKPiArCWlmIChyZXQpIHsKPiArCQlrZnJlZShpOTE1X3R0 KTsKPiArCQlyZXR1cm4gTlVMTDsKPiArCX0KPiArCj4gKwlpOTE1X3R0LT5kZXYgPSBvYmotPmJh c2UuZGV2LT5kZXY7Cj4gKwo+ICsJcmV0dXJuICZpOTE1X3R0LT50dG07Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGk5MTVfdHRtX3R0X3VucG9wdWxhdGUoc3RydWN0IHR0bV9kZXZpY2UgKmJkZXYs IHN0cnVjdCB0dG1fdHQgKnR0bSkKPiArewo+ICsJc3RydWN0IGk5MTVfdHRtX3R0ICppOTE1X3R0 ID0gY29udGFpbmVyX29mKHR0bSwgdHlwZW9mKCppOTE1X3R0KSwgdHRtKTsKPiArCj4gKwlpZiAo aTkxNV90dC0+Y2FjaGVkX3N0KSB7Cj4gKwkJZG1hX3VubWFwX3NndGFibGUoaTkxNV90dC0+ZGV2 LCBpOTE1X3R0LT5jYWNoZWRfc3QsCj4gKwkJCQkgIERNQV9CSURJUkVDVElPTkFMLCAwKTsKPiAr CQlzZ19mcmVlX3RhYmxlKGk5MTVfdHQtPmNhY2hlZF9zdCk7Cj4gKwkJa2ZyZWUoaTkxNV90dC0+ Y2FjaGVkX3N0KTsKPiArCQlpOTE1X3R0LT5jYWNoZWRfc3QgPSBOVUxMOwo+ICsJfQo+ICsJdHRt X3Bvb2xfZnJlZSgmYmRldi0+cG9vbCwgdHRtKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaTkx NV90dG1fdHRfZGVzdHJveShzdHJ1Y3QgdHRtX2RldmljZSAqYmRldiwgc3RydWN0IHR0bV90dCAq dHRtKQo+ICt7Cj4gKwlzdHJ1Y3QgaTkxNV90dG1fdHQgKmk5MTVfdHQgPSBjb250YWluZXJfb2Yo dHRtLCB0eXBlb2YoKmk5MTVfdHQpLCB0dG0pOwo+ICsKPiArCXR0bV90dF9kZXN0cm95X2NvbW1v bihiZGV2LCB0dG0pOwo+ICsJa2ZyZWUoaTkxNV90dCk7Cj4gK30KPiArCj4gK3N0YXRpYyBib29s IGk5MTVfdHRtX2V2aWN0aW9uX3ZhbHVhYmxlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8s Cj4gKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHR0bV9wbGFjZSAqcGxhY2UpCj4gK3sKPiArCXN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBpOTE1X3R0bV90b19nZW0oYm8pOwo+ICsK PiArCS8qIFdpbGwgZG8gZm9yIG5vdy4gT3VyIHBpbm5lZCBvYmplY3RzIGFyZSBzdGlsbCBvbiBU VE0ncyBMUlUgbGlzdHMgKi8KPiArCWlmICghaTkxNV9nZW1fb2JqZWN0X2V2aWN0YWJsZShvYmop KQo+ICsJCXJldHVybiBmYWxzZTsKPiArCj4gKwkvKiBUaGlzIGlzbid0IHZhbGlkIHdpdGggYSBi dWRkeSBhbGxvY2F0b3IgKi8KPiArCXJldHVybiB0dG1fYm9fZXZpY3Rpb25fdmFsdWFibGUoYm8s IHBsYWNlKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaTkxNV90dG1fZXZpY3RfZmxhZ3Moc3Ry dWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKPiArCQkJCSBzdHJ1Y3QgdHRtX3BsYWNlbWVudCAq cGxhY2VtZW50KQo+ICt7Cj4gKwkqcGxhY2VtZW50ID0gaTkxNV9zeXNfcGxhY2VtZW50Owo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IGk5MTVfdHRtX21vdmVfbm90aWZ5KHN0cnVjdCB0dG1fYnVmZmVy X29iamVjdCAqYm8pCj4gK3sKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBp OTE1X3R0bV90b19nZW0oYm8pOwo+ICsJaW50IHJldDsKPiArCj4gKwlyZXQgPSBpOTE1X2dlbV9v YmplY3RfdW5iaW5kKG9iaiwgSTkxNV9HRU1fT0JKRUNUX1VOQklORF9BQ1RJVkUpOwo+ICsJaWYg KHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCXJldCA9IF9faTkxNV9nZW1fb2JqZWN0X3B1 dF9wYWdlcyhvYmopOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpOTE1X3R0bV9mcmVlX2NhY2hlZF9pb19zdChz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+ICt7Cj4gKwlpZiAob2JqLT50dG0uY2Fj aGVkX2lvX3N0KSB7Cj4gKwkJc2dfZnJlZV90YWJsZShvYmotPnR0bS5jYWNoZWRfaW9fc3QpOwo+ ICsJCWtmcmVlKG9iai0+dHRtLmNhY2hlZF9pb19zdCk7Cj4gKwkJb2JqLT50dG0uY2FjaGVkX2lv X3N0ID0gTlVMTDsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaTkxNV90dG1fcHVyZ2Uo c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKPiArewo+ICsJc3RydWN0IHR0bV9idWZm ZXJfb2JqZWN0ICpibyA9IGk5MTVfZ2VtX3RvX3R0bShvYmopOwo+ICsKPiArCWlmIChvYmotPm1t Lm1hZHYgPT0gX19JOTE1X01BRFZfUFVSR0VEKQo+ICsJCXJldHVybjsKPiArCj4gKwlpOTE1X3R0 bV9mcmVlX2NhY2hlZF9pb19zdChvYmopOwo+ICsKPiArCXR0bV9yZXNvdXJjZV9mcmVlKGJvLCAm Ym8tPm1lbSk7Cj4gKwlpZiAoYm8tPnR0bSkKPiArCQl0dG1fYm9fdHRfZGVzdHJveShibyk7Cj4g Kwo+ICsJb2JqLT5tbS5tYWR2ID0gX19JOTE1X01BRFZfUFVSR0VEOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgYm9vbCBpOTE1X3R0bV9zd2FwX3Bvc3NpYmxlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAq Ym8pCj4gK3sKPiArCS8qIFdpbGwgZG8gZm9yIG5vdy4gT3VyIHBpbm5lZCBvYmplY3RzIGFyZSBz dGlsbCBvbiBUVE0ncyBMUlUgbGlzdHMgKi8KPiArCXJldHVybiBpOTE1X2dlbV9vYmplY3RfZXZp Y3RhYmxlKGk5MTVfdHRtX3RvX2dlbShibykpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpOTE1 X3R0bV9zd2FwX25vdGlmeShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQo+ICt7Cj4gKwlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gaTkxNV90dG1fdG9fZ2VtKGJvKTsKPiAr CWludCByZXQgPSBpOTE1X3R0bV9tb3ZlX25vdGlmeShibyk7Cj4gKwo+ICsJR0VNX1dBUk5fT04o cmV0KTsKPiArCUdFTV9XQVJOX09OKG9iai0+dHRtLmNhY2hlZF9pb19zdCk7Cj4gKwlpZiAoIXJl dCAmJiBvYmotPm1tLm1hZHYgIT0gSTkxNV9NQURWX1dJTExORUVEKQo+ICsJCWk5MTVfdHRtX3B1 cmdlKG9iaik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGk5MTVfdHRtX2RlbGV0ZV9tZW1fbm90 aWZ5KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCj4gK3sKPiArCXN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmogPSBpOTE1X3R0bV90b19nZW0oYm8pOwo+ICsKPiArCWlmIChsaWtl bHkob2JqKSkgewo+ICsJCS8qIFRoaXMgcmVsZWFzZXMgYWxsIGdlbSBvYmplY3QgYmluZGluZ3Mg dG8gdGhlIGJhY2tlbmQuICovCj4gKwkJX19pOTE1X2dlbV9mcmVlX29iamVjdChvYmopOwo+ICsJ fQo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKgo+ICtpOTE1 X3R0bV9yZWdpb24oc3RydWN0IHR0bV9kZXZpY2UgKmJkZXYsIGludCB0dG1fbWVtX3R5cGUpCj4g K3sKPiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gY29udGFpbmVyX29mKGJkZXYs IHR5cGVvZigqaTkxNSksIGJkZXYpOwo+ICsKPiArCS8qIFRoZXJlJ3Mgc29tZSByb29tIGZvciBv cHRpbWl6YXRpb24gaGVyZS4uLiAqLwo+ICsJR0VNX0JVR19PTih0dG1fbWVtX3R5cGUgIT0gSTkx NV9QTF9TWVNURU0gJiYKPiArCQkgICB0dG1fbWVtX3R5cGUgPCBJOTE1X1BMX0xNRU0wKTsKPiAr CWlmICh0dG1fbWVtX3R5cGUgPT0gSTkxNV9QTF9TWVNURU0pCj4gKwkJcmV0dXJuIGludGVsX21l bW9yeV9yZWdpb25fbG9va3VwKGk5MTUsIElOVEVMX01FTU9SWV9TWVNURU0sCj4gKwkJCQkJCSAg MCk7Cj4gKwo+ICsJcmV0dXJuIGludGVsX21lbW9yeV9yZWdpb25fbG9va3VwKGk5MTUsIElOVEVM X01FTU9SWV9MT0NBTCwKPiArCQkJCQkgIHR0bV9tZW1fdHlwZSAtIEk5MTVfUExfTE1FTTApOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IHNnX3RhYmxlICppOTE1X3R0bV90dF9nZXRfc3Qoc3Ry dWN0IHR0bV90dCAqdHRtKQo+ICt7Cj4gKwlzdHJ1Y3QgaTkxNV90dG1fdHQgKmk5MTVfdHQgPSBj b250YWluZXJfb2YodHRtLCB0eXBlb2YoKmk5MTVfdHQpLCB0dG0pOwo+ICsJc3RydWN0IHNjYXR0 ZXJsaXN0ICpzZzsKPiArCXN0cnVjdCBzZ190YWJsZSAqc3Q7Cj4gKwlpbnQgcmV0Owo+ICsKPiAr CWlmIChpOTE1X3R0LT5jYWNoZWRfc3QpCj4gKwkJcmV0dXJuIGk5MTVfdHQtPmNhY2hlZF9zdDsK PiArCj4gKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFz dCkKPiArCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKPiArCj4gKwlzZyA9IF9fc2dfYWxsb2Nf dGFibGVfZnJvbV9wYWdlcwo+ICsJCShzdCwgdHRtLT5wYWdlcywgdHRtLT5udW1fcGFnZXMsIDAs Cj4gKwkJICh1bnNpZ25lZCBsb25nKSB0dG0tPm51bV9wYWdlcyA8PCBQQUdFX1NISUZULAo+ICsJ CSBpOTE1X3NnX3NlZ21lbnRfc2l6ZSgpLCBOVUxMLCAwLCBHRlBfS0VSTkVMKTsKPiArCWlmIChJ U19FUlIoc2cpKSB7Cj4gKwkJa2ZyZWUoc3QpOwo+ICsJCXJldHVybiBFUlJfQ0FTVChzZyk7Cj4g Kwl9Cj4gKwo+ICsJcmV0ID0gZG1hX21hcF9zZ3RhYmxlKGk5MTVfdHQtPmRldiwgc3QsIERNQV9C SURJUkVDVElPTkFMLCAwKTsKPiArCWlmIChyZXQpIHsKPiArCQlzZ19mcmVlX3RhYmxlKHN0KTsK PiArCQlrZnJlZShzdCk7Cj4gKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKPiArCX0KPiArCj4gKwlp OTE1X3R0LT5jYWNoZWRfc3QgPSBzdDsKPiArCXJldHVybiBzdDsKPiArfQo+ICsKPiArc3RhdGlj IHN0cnVjdCBzZ190YWJsZSAqCj4gK2k5MTVfdHRtX3Jlc291cmNlX2dldF9zdChzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+ICsJCQkgc3RydWN0IHR0bV9yZXNvdXJjZSAqcmVzKQo+ ICt7Cj4gKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gaTkxNV9nZW1fdG9fdHRtKG9i aik7Cj4gKwlzdHJ1Y3QgdHRtX3Jlc291cmNlX21hbmFnZXIgKm1hbiA9Cj4gKwkJdHRtX21hbmFn ZXJfdHlwZShiby0+YmRldiwgcmVzLT5tZW1fdHlwZSk7Cj4gKwlzdHJ1Y3Qgc2dfdGFibGUgKnN0 Owo+ICsKPiArCWlmIChtYW4tPnVzZV90dCkKPiArCQlyZXR1cm4gaTkxNV90dG1fdHRfZ2V0X3N0 KGJvLT50dG0pOwo+ICsKPiArCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7 Cj4gKwlpZiAoIXN0KQo+ICsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwo+ICsKPiArCXN0ID0g aW50ZWxfcmVnaW9uX3R0bV9ub2RlX3RvX3N0KG9iai0+bW0ucmVnaW9uLCByZXMtPm1tX25vZGUp Owo+ICsJaWYgKElTX0VSUihzdCkpCj4gKwkJcmV0dXJuIEVSUl9DQVNUKHN0KTsKPiArCj4gKwly ZXR1cm4gc3Q7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaTkxNV90dG1fbW92ZShzdHJ1Y3QgdHRt X2J1ZmZlcl9vYmplY3QgKmJvLCBib29sIGV2aWN0LAo+ICsJCQkgc3RydWN0IHR0bV9vcGVyYXRp b25fY3R4ICpjdHgsCj4gKwkJCSBzdHJ1Y3QgdHRtX3Jlc291cmNlICpuZXdfbWVtLAo+ICsJCQkg c3RydWN0IHR0bV9wbGFjZSAqaG9wKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqID0gaTkxNV90dG1fdG9fZ2VtKGJvKTsKPiArCXN0cnVjdCB0dG1fcmVzb3VyY2VfbWFu YWdlciAqbmV3X21hbiA9Cj4gKwkJdHRtX21hbmFnZXJfdHlwZShiby0+YmRldiwgbmV3X21lbS0+ bWVtX3R5cGUpOwo+ICsJc3RydWN0IHR0bV9yZXNvdXJjZV9tYW5hZ2VyICpvbGRfbWFuID0KPiAr CQl0dG1fbWFuYWdlcl90eXBlKGJvLT5iZGV2LCBiby0+bWVtLm1lbV90eXBlKTsKPiArCXN0cnVj dCBpbnRlbF9tZW1vcnlfcmVnaW9uICpuZXdfcmVnLCAqb2xkX3JlZzsKPiArCXVuaW9uIHsKPiAr CQlzdHJ1Y3QgaTkxNV90dG1fa21hcF9pdGVyX3R0IHR0Owo+ICsJCXN0cnVjdCBpOTE1X3R0bV9r bWFwX2l0ZXJfaW9tYXAgaW87Cj4gKwl9IF9uZXdfaXRlciwgX29sZF9pdGVyOwo+ICsJc3RydWN0 IGk5MTVfdHRtX2ttYXBfaXRlciAqbmV3X2l0ZXIsICpvbGRfaXRlcjsKPiArCXN0cnVjdCBzZ190 YWJsZSAqbmV3X3N0Owo+ICsJaW50IHJldDsKPiArCj4gKwluZXdfcmVnID0gaTkxNV90dG1fcmVn aW9uKGJvLT5iZGV2LCBuZXdfbWVtLT5tZW1fdHlwZSk7Cj4gKwlvbGRfcmVnID0gaTkxNV90dG1f cmVnaW9uKGJvLT5iZGV2LCBiby0+bWVtLm1lbV90eXBlKTsKPiArCUdFTV9CVUdfT04oIW5ld19y ZWcgfHwgIW9sZF9yZWcpOwo+ICsKPiArCS8qIFN5bmMgZm9yIG5vdy4gV2UgY291bGQgZG8gdGhl IGFjdHVhbCBjb3B5IGFzeW5jLiAqLwo+ICsJcmV0ID0gdHRtX2JvX3dhaXRfY3R4KGJvLCBjdHgp Owo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCXJldCA9IGk5MTVfdHRtX21v dmVfbm90aWZ5KGJvKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlpZiAo b2JqLT5tbS5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCkgewo+ICsJCWk5MTVfdHRtX3B1cmdl KG9iaik7Cj4gKwkJdHRtX3Jlc291cmNlX2ZyZWUoYm8sIG5ld19tZW0pOwo+ICsJCXJldHVybiAw Owo+ICsJfQo+ICsKPiArCS8qIFBvcHVsYXRlIHR0bSB3aXRoIHBhZ2VzIGlmIG5lZWRlZC4gVHlw aWNhbGx5IHN5c3RlbSBtZW1vcnkuICovCj4gKwlpZiAobmV3X21hbi0+dXNlX3R0ICYmIGJvLT50 dG0pIHsKPiArCQlyZXQgPSB0dG1fdHRfcG9wdWxhdGUoYm8tPmJkZXYsIGJvLT50dG0sIGN0eCk7 Cj4gKwkJaWYgKHJldCkKPiArCQkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwluZXdfc3QgPSBp OTE1X3R0bV9yZXNvdXJjZV9nZXRfc3Qob2JqLCBuZXdfbWVtKTsKPiArCWlmIChJU19FUlIobmV3 X3N0KSkKPiArCQlyZXR1cm4gUFRSX0VSUihuZXdfc3QpOwo+ICsKPiArCW5ld19pdGVyID0gbmV3 X21hbi0+dXNlX3R0ID8KPiArCQlpOTE1X3R0bV9rbWFwX2l0ZXJfdHRfaW5pdCgmX25ld19pdGVy LnR0LCBiby0+dHRtKSA6Cj4gKwkJaTkxNV90dG1fa21hcF9pdGVyX2lvbWFwX2luaXQoJl9uZXdf aXRlci5pbywgJm5ld19yZWctPmlvbWFwLAo+ICsJCQkJCSAgICAgIG5ld19zdCwgbmV3X3JlZy0+ cmVnaW9uLnN0YXJ0KTsKPiArCj4gKwlvbGRfaXRlciA9IG9sZF9tYW4tPnVzZV90dCA/Cj4gKwkJ aTkxNV90dG1fa21hcF9pdGVyX3R0X2luaXQoJl9vbGRfaXRlci50dCwgYm8tPnR0bSkgOgo+ICsJ CWk5MTVfdHRtX2ttYXBfaXRlcl9pb21hcF9pbml0KCZfb2xkX2l0ZXIuaW8sICZvbGRfcmVnLT5p b21hcCwKPiArCQkJCQkgICAgICBvYmotPnR0bS5jYWNoZWRfaW9fc3QsCj4gKwkJCQkJICAgICAg b2xkX3JlZy0+cmVnaW9uLnN0YXJ0KTsKPiArCj4gKwlpOTE1X3R0bV9tb3ZlX21lbWNweShibywg bmV3X21lbSwgbmV3X2l0ZXIsIG9sZF9pdGVyKTsKPiArCWk5MTVfdHRtX2ZyZWVfY2FjaGVkX2lv X3N0KG9iaik7Cj4gKwo+ICsJaWYgKCFuZXdfbWFuLT51c2VfdHQpCj4gKwkJb2JqLT50dG0uY2Fj aGVkX2lvX3N0ID0gbmV3X3N0Owo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdHJ1Y3Qg dHRtX2RldmljZV9mdW5jcyBpOTE1X3R0bV9ib19kcml2ZXIgPSB7Cj4gKwkudHRtX3R0X2NyZWF0 ZSA9IGk5MTVfdHRtX3R0X2NyZWF0ZSwKPiArCS50dG1fdHRfdW5wb3B1bGF0ZSA9IGk5MTVfdHRt X3R0X3VucG9wdWxhdGUsCj4gKwkudHRtX3R0X2Rlc3Ryb3kgPSBpOTE1X3R0bV90dF9kZXN0cm95 LAo+ICsJLmV2aWN0aW9uX3ZhbHVhYmxlID0gaTkxNV90dG1fZXZpY3Rpb25fdmFsdWFibGUsCj4g KwkuZXZpY3RfZmxhZ3MgPSBpOTE1X3R0bV9ldmljdF9mbGFncywKPiArCS5tb3ZlID0gaTkxNV90 dG1fbW92ZSwKPiArCS52ZXJpZnlfYWNjZXNzID0gTlVMTCwKPiArCS5zd2FwX3Bvc3NpYmxlID0g aTkxNV90dG1fc3dhcF9wb3NzaWJsZSwKPiArCS5zd2FwX25vdGlmeSA9IGk5MTVfdHRtX3N3YXBf bm90aWZ5LAo+ICsJLmRlbGV0ZV9tZW1fbm90aWZ5ID0gaTkxNV90dG1fZGVsZXRlX21lbV9ub3Rp ZnksCj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IGk5MTVfdHRtX2dldF9wYWdlcyhzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+ICt7Cj4gKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3Qg KmJvID0gaTkxNV9nZW1fdG9fdHRtKG9iaik7Cj4gKwlzdHJ1Y3QgdHRtX29wZXJhdGlvbl9jdHgg Y3R4ID0gewo+ICsJCS5pbnRlcnJ1cHRpYmxlID0gdHJ1ZSwKPiArCQkubm9fd2FpdF9ncHUgPSBm YWxzZSwKPiArCX07Cj4gKwlzdHJ1Y3Qgc2dfdGFibGUgKnN0Owo+ICsJaW50IHJldDsKPiArCj4g KwkvKiBTd2FwIGluLiAqLwo+ICsJaWYgKGJvLT50dG0gJiYgKGJvLT50dG0tPnBhZ2VfZmxhZ3Mg JiBUVE1fUEFHRV9GTEFHX1NXQVBQRUQpKSB7Cj4gKwkJcmV0ID0gdHRtX3R0X3BvcHVsYXRlKGJv LT5iZGV2LCBiby0+dHRtLCAmY3R4KTsKPiArCQlpZiAocmV0KQo+ICsJCQlyZXR1cm4gcmV0Owo+ ICsJfQo+ICsKPiArCS8qIE1vdmUgdG8gdGhlIHJlcXVlc3RlZCBwbGFjZW1lbnQuICovCj4gKwly ZXQgPSB0dG1fYm9fdmFsaWRhdGUoYm8sICZpOTE1X2xtZW0wX3BsYWNlbWVudCwgJmN0eCk7Cj4g KwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJLyogT2JqZWN0IGVpdGhlciBoYXMg YSBwYWdlIHZlY3RvciBvciBpcyBhbiBpb21lbSBvYmplY3QgKi8KPiArCXN0ID0gYm8tPnR0bSA/ IGk5MTVfdHRtX3R0X2dldF9zdChiby0+dHRtKSA6IG9iai0+dHRtLmNhY2hlZF9pb19zdDsKPiAr CWlmIChJU19FUlIoc3QpKQo+ICsJCXJldHVybiBQVFJfRVJSKHN0KTsKPiArCj4gKwlfX2k5MTVf Z2VtX29iamVjdF9zZXRfcGFnZXMob2JqLCBzdCwgaTkxNV9zZ19kbWFfcGFnZV9zaXplcyhzdC0+ c2dsKSk7Cj4gKwo+ICsJaTkxNV90dG1fYWRqdXN0X2xydShvYmopOwo+ICsKPiArCXJldHVybiBy ZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGk5MTVfdHRtX3B1dF9wYWdlcyhzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+ICsJCQkgICAgICAgc3RydWN0IHNnX3RhYmxlICpzdCkK PiArewo+ICsJLyoKPiArCSAqIFdlJ3JlIGN1cnJlbnRseSBub3QgY2FsbGVkIGZyb20gYSBzaHJp bmtlciwgc28gcHV0X3BhZ2VzKCkKPiArCSAqIHR5cGljYWxseSBtZWFucyB0aGUgb2JqZWN0IGlz IGFib3V0IHRvIGRlc3Ryb3llZCwgb3IgY2FsbGVkCj4gKwkgKiBmcm9tIG1vdmVfbm90aWZ5KCku IFNvIGp1c3QgYXZvaWQgZG9pbmcgbXVjaCBmb3Igbm93Lgo+ICsJICogSWYgdGhlIG9iamVjdCBp cyBub3QgZGVzdHJveWVkIG5leHQsIFRoZSBUVE0gZXZpY3Rpb24gbG9naWMKPiArCSAqIGFuZCBz aHJpbmtlcnMgd2lsbCBtb3ZlIGl0IG91dCBpZiBuZWVkZWQuCj4gKwkgKi8KPiArCj4gKwlpOTE1 X3R0bV9hZGp1c3RfbHJ1KG9iaik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGk5MTVfdHRtX2Fk anVzdF9scnUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKPiArewo+ICsJc3RydWN0 IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IGk5MTVfZ2VtX3RvX3R0bShvYmopOwo+ICsKPiArCS8q Cj4gKwkgKiBEb24ndCBtYW5pcHVsYXRlIHRoZSBUVE0gTFJVcyB3aGlsZSBpbiBUVE0gYm8gZGVz dHJ1Y3Rpb24uCj4gKwkgKiBXZSdyZSBjYWxsZWQgdGhyb3VnaCBpOTE1X3R0bV9kZWxldGVfbWVt X25vdGlmeSgpLgo+ICsJICovCj4gKwlpZiAoIWtyZWZfcmVhZCgmYm8tPmtyZWYpKQo+ICsJCXJl dHVybjsKPiArCj4gKwkvKgo+ICsJICogUHV0IG9uIHRoZSBjb3JyZWN0IExSVSBsaXN0IGRlcGVu ZGluZyBvbiB0aGUgTUFEViBzdGF0dXMKPiArCSAqLwo+ICsJc3Bpbl9sb2NrKCZiby0+YmRldi0+ bHJ1X2xvY2spOwo+ICsJaWYgKG9iai0+bW0ubWFkdiAhPSBJOTE1X01BRFZfV0lMTE5FRUQpIHsK PiArCQliby0+cHJpb3JpdHkgPSBJOTE1X1RUTV9QUklPX1BVUkdFOwo+ICsJfSBlbHNlIGlmICgh aTkxNV9nZW1fb2JqZWN0X2hhc19wYWdlcyhvYmopKSB7Cj4gKwkJaWYgKGJvLT5wcmlvcml0eSA8 IEk5MTVfVFRNX1BSSU9fSEFTX1BBR0VTKQo+ICsJCQliby0+cHJpb3JpdHkgPSBJOTE1X1RUTV9Q UklPX0hBU19QQUdFUzsKPiArCX0gZWxzZSB7Cj4gKwkJaWYgKGJvLT5wcmlvcml0eSA+IEk5MTVf VFRNX1BSSU9fTk9fUEFHRVMpCj4gKwkJCWJvLT5wcmlvcml0eSA9IEk5MTVfVFRNX1BSSU9fTk9f UEFHRVM7Cj4gKwl9Cj4gKwo+ICsJdHRtX2JvX21vdmVfdG9fbHJ1X3RhaWwoYm8sICZiby0+bWVt LCBOVUxMKTsKPiArCXNwaW5fdW5sb2NrKCZiby0+YmRldi0+bHJ1X2xvY2spOwo+ICt9Cj4gKwo+ ICsvKgo+ICsgKiBUVE0tYmFja2VkIGdlbSBvYmplY3QgZGVzdHJ1Y3Rpb24gcmVxdWlyZXMgc29t ZSBjbGFyaWZpY2F0aW9uLgo+ICsgKiBCYXNpY2FsbHkgd2UgaGF2ZSB0d28gcG9zc2liaWxpdGll cyBoZXJlLiBXZSBjYW4gZWl0aGVyIHJlbHkgb24gdGhlCj4gKyAqIGk5MTUgZGVsYXllZCBkZXN0 cnVjdGlvbiBhbmQgcHV0IHRoZSBUVE0gb2JqZWN0IHdoZW4gdGhlIG9iamVjdAo+ICsgKiBpcyBp ZGxlLiBUaGlzIHdvdWxkIGJlIGRldGVjdGVkIGJ5IFRUTSB3aGljaCB3b3VsZCBieXBhc3MgdGhl Cj4gKyAqIFRUTSBkZWxheWVkIGRlc3Ryb3kgaGFuZGxpbmcuIFRoZSBvdGhlciBhcHByb2FjaCBp cyB0byBwdXQgdGhlIFRUTQo+ICsgKiBvYmplY3QgZWFybHkgYW5kIHJlbHkgb24gdGhlIFRUTSBk ZXN0cm95ZWQgaGFuZGxpbmcsIGFuZCB0aGVuIGZyZWUKPiArICogdGhlIGxlZnRvdmVyIHBhcnRz IG9mIHRoZSBHRU0gb2JqZWN0IG9uY2UgVFRNJ3MgZGVzdHJveWVkIGxpc3QgaGFuZGxpbmcgaXMK PiArICogY29tcGxldGUuIEZvciBub3csIHdlIHJlbHkgb24gdGhlIGxhdHRlciBmb3IgdHdvIHJl YXNvbnM6Cj4gKyAqIGEpIFRUTSBjYW4gZXZpY3QgYW4gb2JqZWN0IGV2ZW4gd2hlbiBpdCdzIG9u IHRoZSBkZWxheWVkIGRlc3Ryb3kgbGlzdCwKPiArICogd2hpY2ggaW4gdGhlb3J5IGFsbG93cyBm b3IgY29tcGxldGUgZXZpY3Rpb24uCj4gKyAqIGIpIFRoZXJlIGlzIHdvcmsgZ29pbmcgb24gaW4g VFRNIHRvIGFsbG93IGZyZWVpbmcgYW4gb2JqZWN0IGV2ZW4gd2hlbgo+ICsgKiBpdCdzIG5vdCBp ZGxlLCBhbmQgdXNpbmcgdGhlIFRUTSBkZXN0cm95ZWQgbGlzdCBoYW5kbGluZyBjb3VsZCBoZWxw IHVzCj4gKyAqIGJlbmVmaXQgZnJvbSB0aGF0Lgo+ICsgKi8KPiArc3RhdGljIHZvaWQgaTkxNV90 dG1fZGVsYXllZF9mcmVlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCj4gK3sKPiAr CXR0bV9ib19wdXQoaTkxNV9nZW1fdG9fdHRtKG9iaikpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29u c3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Rfb3BzIGk5MTVfZ2VtX3R0bV9vYmpfb3BzID0g ewo+ICsJLm5hbWUgPSAiaTkxNV9nZW1fb2JqZWN0X3R0bSIsCj4gKwkuZmxhZ3MgPSBJOTE1X0dF TV9PQkpFQ1RfSEFTX0lPTUVNLAo+ICsKPiArCS5nZXRfcGFnZXMgPSBpOTE1X3R0bV9nZXRfcGFn ZXMsCj4gKwkucHV0X3BhZ2VzID0gaTkxNV90dG1fcHV0X3BhZ2VzLAo+ICsJLnRydW5jYXRlID0g aTkxNV90dG1fcHVyZ2UsCj4gKwkuYWRqdXN0X2xydSA9IGk5MTVfdHRtX2FkanVzdF9scnUsCj4g KwkuZGVsYXllZF9mcmVlID0gaTkxNV90dG1fZGVsYXllZF9mcmVlLAo+ICt9Owo+ICsKPiArdm9p ZCBpOTE1X3R0bV9ib19kZXN0cm95KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCj4gK3sK PiArCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBpOTE1X3R0bV90b19nZW0oYm8p Owo+ICsKPiArCWk5MTVfZ2VtX29iamVjdF9yZWxlYXNlX21lbW9yeV9yZWdpb24ob2JqKTsKPiAr CWNhbGxfcmN1KCZvYmotPnJjdSwgX19pOTE1X2dlbV9mcmVlX29iamVjdF9yY3UpOwo+ICt9Cj4g Kwo+ICsvKioKPiArICogX19pOTE1X2dlbV90dG1fb2JqZWN0X2luaXQgLSBJbml0aWFsaXplIGEg dHRtLWJhY2tlZCBpOTE1IGdlbSBvYmplY3QKPiArICogQG1lbTogVGhlIGluaXRpYWwgbWVtb3J5 IHJlZ2lvbiBmb3IgdGhlIG9iamVjdC4KPiArICogQG9iajogVGhlIGdlbSBvYmplY3QuCj4gKyAq IEBzaXplOiBPYmplY3Qgc2l6ZSBpbiBieXRlcy4KPiArICogQGZsYWdzOiBnZW0gb2JqZWN0IGZs YWdzLgo+ICsgKgo+ICsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29k ZSBvbiBmYWlsdXJlLgo+ICsgKi8KPiAraW50IF9faTkxNV9nZW1fdHRtX29iamVjdF9pbml0KHN0 cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0sCj4gKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqLAo+ICsJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90IHNpemUsCj4g KwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCj4gK3sKPiArCXN0YXRpYyBzdHJ1Y3QgbG9j a19jbGFzc19rZXkgbG9ja19jbGFzczsKPiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1 ID0gbWVtLT5pOTE1Owo+ICsJc2l6ZV90IGFsaWdubWVudCA9IDA7Cj4gKwlpbnQgcmV0Owo+ICsK PiArCS8qIEFkanVzdCBhbGlnbm1lbnQgdG8gR1BVLSBhbmQgQ1BVIGh1Z2UgcGFnZSBzaXplcy4g Ki8KPiArCj4gKwlpZiAobWVtLT5pc19yYW5nZV9tYW5hZ2VyKSB7Cj4gKwkJaWYgKHNpemUgPj0g U1pfMUcpCj4gKwkJCWFsaWdubWVudCA9IFNaXzFHID4+IFBBR0VfU0hJRlQ7Cj4gKwkJZWxzZSBp ZiAoc2l6ZSA+PSBTWl8yTSkKPiArCQkJYWxpZ25tZW50ID0gU1pfMk0gPj4gUEFHRV9TSElGVDsK PiArCQllbHNlIGlmIChzaXplID49IFNaXzY0SykKPiArCQkJYWxpZ25tZW50ID0gU1pfNjRLID4+ IFBBR0VfU0hJRlQ7Cj4gKwl9Cj4gKwo+ICsJZHJtX2dlbV9wcml2YXRlX29iamVjdF9pbml0KCZp OTE1LT5kcm0sICZvYmotPmJhc2UsIHNpemUpOwo+ICsJaTkxNV9nZW1fb2JqZWN0X2luaXQob2Jq LCAmaTkxNV9nZW1fdHRtX29ial9vcHMsICZsb2NrX2NsYXNzLCBmbGFncyk7Cj4gKwlpOTE1X2dl bV9vYmplY3RfaW5pdF9tZW1vcnlfcmVnaW9uKG9iaiwgbWVtKTsKPiArCWk5MTVfZ2VtX29iamVj dF9tYWtlX3Vuc2hyaW5rYWJsZShvYmopOwo+ICsKPiArCXJldCA9IHR0bV9ib19pbml0KCZpOTE1 LT5iZGV2LCBpOTE1X2dlbV90b190dG0ob2JqKSwgc2l6ZSwKPiArCQkJICB0dG1fYm9fdHlwZV9r ZXJuZWwsICZpOTE1X3N5c19wbGFjZW1lbnQsIGFsaWdubWVudCwKPiArCQkJICB0cnVlLCBOVUxM LCBOVUxMLCBpOTE1X3R0bV9ib19kZXN0cm95KTsKPiArCj4gKwlvYmotPnJlYWRfZG9tYWlucyA9 IEk5MTVfR0VNX0RPTUFJTl9XQyB8IEk5MTVfR0VNX0RPTUFJTl9HVFQ7Cj4gKwo+ICsJaTkxNV9n ZW1fb2JqZWN0X3NldF9jYWNoZV9jb2hlcmVuY3kob2JqLCBJOTE1X0NBQ0hFX05PTkUpOwo+ICsK PiArCXJldHVybiAwOwo+ICt9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dl bS9pOTE1X2dlbV90dG0uaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV90dG0u aAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi5iOGQzZGNiYjUw ZGYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVf Z2VtX3R0bS5oCj4gQEAgLTAsMCArMSw0OCBAQAo+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmll cjogTUlUICovCj4gKy8qCj4gKyAqIENvcHlyaWdodCDCqSAyMDIxIEludGVsIENvcnBvcmF0aW9u Cj4gKyAqLwo+ICsjaWZuZGVmIF9JOTE1X0dFTV9UVE1fSF8KPiArI2RlZmluZSBfSTkxNV9HRU1f VFRNX0hfCj4gKwo+ICsjaW5jbHVkZSAiZ2VtL2k5MTVfZ2VtX29iamVjdF90eXBlcy5oIgo+ICsK PiArLyoqCj4gKyAqIGk5MTVfZ2VtX3RvX3R0bSAtIENvbnZlcnQgYSBzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCB0byBhCj4gKyAqIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdC4KPiArICogQG9i ajogUG9pbnRlciB0byB0aGUgZ2VtIG9iamVjdC4KPiArICoKPiArICogUmV0dXJuOiBQb2ludGVy IHRvIHRoZSBlbWJlZGRlZCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QuCj4gKyAqLwo+ICtzdGF0 aWMgaW5saW5lIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqCj4gK2k5MTVfZ2VtX3RvX3R0bShz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+ICt7Cj4gKwlyZXR1cm4gJm9iai0+X19k b19ub3RfYWNjZXNzOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBpOTE1IHR0bSBnZW0gb2JqZWN0IGRl c3RydWN0b3IuIEludGVybmFsIHVzZSBvbmx5Lgo+ICsgKi8KPiArdm9pZCBpOTE1X3R0bV9ib19k ZXN0cm95KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOwo+ICsKPiArLyoqCj4gKyAqIGk5 MTVfdHRtX3RvX2dlbSAtIENvbnZlcnQgYSBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgdG8gYW4g ZW1iZWRkaW5nCj4gKyAqIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0Lgo+ICsgKgo+ICsgKiBS ZXR1cm46IFBvaW50ZXIgdG8gdGhlIGVtYmVkZGluZyBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3Qs IG9yIE5VTEwKPiArICogaWYgdGhlIG9iamVjdCB3YXMgbm90IGFuIGk5MTUgdHRtIG9iamVjdC4K PiArICovCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgo+ICtp OTE1X3R0bV90b19nZW0oc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKPiArewo+ICsJaWYg KEdFTV9XQVJOX09OKGJvLT5kZXN0cm95ICE9IGk5MTVfdHRtX2JvX2Rlc3Ryb3kpKQo+ICsJCXJl dHVybiBOVUxMOwo+ICsKPiArCXJldHVybiBjb250YWluZXJfb2YoYm8sIHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0LCBfX2RvX25vdF9hY2Nlc3MpOwo+ICt9Cj4gKwo+ICtpbnQgX19pOTE1X2dl bV90dG1fb2JqZWN0X2luaXQoc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKm1lbSwKPiArCQkJ ICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCj4gKwkJCSAgICAgICByZXNv dXJjZV9zaXplX3Qgc2l6ZSwKPiArCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7Cj4gKyNl bmRpZgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9yZWdpb25f bG1lbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfcmVnaW9uX2xtZW0uYwo+IGlu ZGV4IGY3MzY2YjA1NGY4ZS4uNGFlMWY3MTdhOTRjIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2d0L2ludGVsX3JlZ2lvbl9sbWVtLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9ndC9pbnRlbF9yZWdpb25fbG1lbS5jCj4gQEAgLTksNiArOSw3IEBACj4gICAjaW5jbHVk ZSAiaW50ZWxfcmVnaW9uX3R0bS5oIgo+ICAgI2luY2x1ZGUgImdlbS9pOTE1X2dlbV9sbWVtLmgi Cj4gICAjaW5jbHVkZSAiZ2VtL2k5MTVfZ2VtX3JlZ2lvbi5oIgo+ICsjaW5jbHVkZSAiZ2VtL2k5 MTVfZ2VtX3R0bS5oIgo+ICAgI2luY2x1ZGUgImludGVsX3JlZ2lvbl9sbWVtLmgiCj4gICAKPiAg IHN0YXRpYyBpbnQgaW5pdF9mYWtlX2xtZW1fYmFyKHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9u ICptZW0pCj4gQEAgLTEwNyw3ICsxMDgsNyBAQCByZWdpb25fbG1lbV9pbml0KHN0cnVjdCBpbnRl bF9tZW1vcnlfcmVnaW9uICptZW0pCj4gICBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX21lbW9y eV9yZWdpb25fb3BzIGludGVsX3JlZ2lvbl9sbWVtX29wcyA9IHsKPiAgIAkuaW5pdCA9IHJlZ2lv bl9sbWVtX2luaXQsCj4gICAJLnJlbGVhc2UgPSByZWdpb25fbG1lbV9yZWxlYXNlLAo+IC0JLmlu aXRfb2JqZWN0ID0gX19pOTE1X2dlbV9sbWVtX29iamVjdF9pbml0LAo+ICsJLmluaXRfb2JqZWN0 ID0gX19pOTE1X2dlbV90dG1fb2JqZWN0X2luaXQsCj4gICB9Owo+ICAgCj4gICBzdHJ1Y3QgaW50 ZWxfbWVtb3J5X3JlZ2lvbiAqCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCj4gaW5kZXggMTgwZjZl OTEwN2Q0Li4zNTAyODNhYjlhODMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9nZW0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKPiBAQCAt MTAwNSw4ICsxMDA1LDExIEBAIGk5MTVfZ2VtX21hZHZpc2VfaW9jdGwoc3RydWN0IGRybV9kZXZp Y2UgKmRldiwgdm9pZCAqZGF0YSwKPiAgIAkJfQo+ICAgCX0KPiAgIAo+IC0JaWYgKG9iai0+bW0u bWFkdiAhPSBfX0k5MTVfTUFEVl9QVVJHRUQpCj4gKwlpZiAob2JqLT5tbS5tYWR2ICE9IF9fSTkx NV9NQURWX1BVUkdFRCkgewo+ICAgCQlvYmotPm1tLm1hZHYgPSBhcmdzLT5tYWR2Owo+ICsJCWlm IChvYmotPm9wcy0+YWRqdXN0X2xydSkKPiArCQkJb2JqLT5vcHMtPmFkanVzdF9scnUob2JqKTsK PiArCX0KPiAgIAo+ICAgCWlmIChpOTE1X2dlbV9vYmplY3RfaGFzX3BhZ2VzKG9iaikpIHsKPiAg IAkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2k5MTUvaW50ZWxfbWVtb3J5X3JlZ2lvbi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxf bWVtb3J5X3JlZ2lvbi5jCj4gaW5kZXggNDA5MmNjOTg3Njc5Li5iZDI3ZTg5N2Q0ZDAgMTAwNjQ0 Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbWVtb3J5X3JlZ2lvbi5jCj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbWVtb3J5X3JlZ2lvbi5jCj4gQEAgLTE0OSw3 ICsxNDksNiBAQCBpbnRlbF9tZW1vcnlfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqaTkxNSwKPiAgIAo+ICAgCW11dGV4X2luaXQoJm1lbS0+b2JqZWN0cy5sb2NrKTsKPiAg IAlJTklUX0xJU1RfSEVBRCgmbWVtLT5vYmplY3RzLmxpc3QpOwo+IC0JSU5JVF9MSVNUX0hFQUQo Jm1lbS0+b2JqZWN0cy5wdXJnZWFibGUpOwo+ICAgCUlOSVRfTElTVF9IRUFEKCZtZW0tPnJlc2Vy dmVkKTsKPiAgIAo+ICAgCW11dGV4X2luaXQoJm1lbS0+bW1fbG9jayk7Cj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21lbW9yeV9yZWdpb24uaCBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX21lbW9yeV9yZWdpb24uaAo+IGluZGV4IGU2OWNkZTEzZGFmMi4uN2I1 ZmE5N2MwYjU5IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21lbW9y eV9yZWdpb24uaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21lbW9yeV9yZWdp b24uaAo+IEBAIC0xMDAsNyArMTAwLDYgQEAgc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gewo+ ICAgCXN0cnVjdCB7Cj4gICAJCXN0cnVjdCBtdXRleCBsb2NrOyAvKiBQcm90ZWN0cyBhY2Nlc3Mg dG8gb2JqZWN0cyAqLwo+ICAgCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cj4gLQkJc3RydWN0IGxp c3RfaGVhZCBwdXJnZWFibGU7Cj4gICAJfSBvYmplY3RzOwo+ICAgCj4gICAJc2l6ZV90IGNodW5r X3NpemU7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JlZ2lvbl90 dG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JlZ2lvbl90dG0uYwo+IGluZGV4IDNi ZDljYWE2MDI5OC4uYTc0Y2FlNDYwMmI1IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX3JlZ2lvbl90dG0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVs X3JlZ2lvbl90dG0uYwo+IEBAIC0xMCw4ICsxMCw3IEBACj4gICAKPiAgICNpbmNsdWRlICJpbnRl bF9yZWdpb25fdHRtLmgiCj4gICAKPiAtLyogQSBaZXJvLWluaXRpYWxpemVkIGRyaXZlciBmb3Ig bm93LiBXZSBkb24ndCBoYXZlIGEgVFRNIGJhY2tlbmQgeWV0LiAqLwo+IC1zdGF0aWMgc3RydWN0 IHR0bV9kZXZpY2VfZnVuY3MgaTkxNV90dG1fYm9fZHJpdmVyOwo+ICtleHRlcm4gc3RydWN0IHR0 bV9kZXZpY2VfZnVuY3MgaTkxNV90dG1fYm9fZHJpdmVyOwo+ICAgCj4gICAvKioKPiAgICAqIERP QzogVFRNIHN1cHBvcnQgc3RydWN0dXJlCj4gQEAgLTE5OCw2ICsxOTcsNyBAQCBzdHJ1Y3Qgc2df dGFibGUgKmludGVsX3JlZ2lvbl90dG1fbm9kZV90b19zdChzdHJ1Y3QgaW50ZWxfbWVtb3J5X3Jl Z2lvbiAqbWVtLAo+ICAgCXJldHVybiBpOTE1X3NnX2Zyb21fbW1fbm9kZShub2RlLCBtZW0tPnJl Z2lvbi5zdGFydCk7Cj4gICB9Cj4gICAKPiArI2lmZGVmIENPTkZJR19EUk1fSTkxNV9TRUxGVEVT VAo+ICAgLyoqCj4gICAgKiBpbnRlbF9yZWdpb25fdHRtX25vZGVfYWxsb2MgLSBBbGxvY2F0ZSBt ZW1vcnkgcmVzb3VyY2VzIGZyb20gYSByZWdpb24KPiAgICAqIEBtZW06IFRoZSBtZW1vcnkgcmVn aW9uLAo+IEBAIC0yNDQsMyArMjQ0LDQgQEAgdm9pZCAqaW50ZWxfcmVnaW9uX3R0bV9ub2RlX2Fs bG9jKHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICptZW0sCj4gICAJCXJldCA9IC1FTlhJTzsK PiAgIAlyZXR1cm4gcmV0ID8gRVJSX1BUUihyZXQpIDogcmVzLm1tX25vZGU7Cj4gICB9Cj4gKyNl bmRpZgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yZWdpb25fdHRt LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yZWdpb25fdHRtLmgKPiBpbmRleCA0MDEy OWY3ZTAzMTcuLjlhNWIwNDM3ZDczZiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9yZWdpb25fdHRtLmgKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9y ZWdpb25fdHRtLmgKPiBAQCAtMjEsOSArMjEsMTIgQEAgdm9pZCBpbnRlbF9yZWdpb25fdHRtX2Zp bmkoc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKm1lbSk7Cj4gICBzdHJ1Y3Qgc2dfdGFibGUg KmludGVsX3JlZ2lvbl90dG1fbm9kZV90b19zdChzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAq bWVtLAo+ICAgCQkJCQkgICAgIHZvaWQgKm5vZGUpOwo+ICAgCj4gK3ZvaWQgaW50ZWxfcmVnaW9u X3R0bV9ub2RlX2ZyZWUoc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKm1lbSwKPiArCQkJCXZv aWQgKm5vZGUpOwo+ICsKPiArI2lmZGVmIENPTkZJR19EUk1fSTkxNV9TRUxGVEVTVAo+ICAgdm9p ZCAqaW50ZWxfcmVnaW9uX3R0bV9ub2RlX2FsbG9jKHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9u ICptZW0sCj4gICAJCQkJICByZXNvdXJjZV9zaXplX3Qgc2l6ZSwKPiAgIAkJCQkgIHVuc2lnbmVk IGludCBmbGFncyk7Cj4gLXZvaWQgaW50ZWxfcmVnaW9uX3R0bV9ub2RlX2ZyZWUoc3RydWN0IGlu dGVsX21lbW9yeV9yZWdpb24gKm1lbSwKPiAtCQkJCXZvaWQgKm5vZGUpOwo+ICsjZW5kaWYKPiAg ICNlbmRpZiAvKiBfSU5URUxfUkVHSU9OX1RUTV9IXyAqLwo+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vdHRtL3R0bV9iby5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYwo+IGlu ZGV4IDQ0NzljNTVhYWExZC4uNzQwMDRkNWNiZmEyIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1 L2RybS90dG0vdHRtX2JvLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCj4g QEAgLTExNTAsNiArMTE1MCwxNCBAQCBpbnQgdHRtX2JvX3N3YXBvdXQoc3RydWN0IHR0bV9idWZm ZXJfb2JqZWN0ICpibywgc3RydWN0IHR0bV9vcGVyYXRpb25fY3R4ICpjdHgsCj4gICAJCXJldHVy biAtRUJVU1k7Cj4gICAJfQo+ICAgCj4gKwlpZiAoYm8tPmJkZXYtPmZ1bmNzLT5zd2FwX3Bvc3Np YmxlKSB7Cj4gKwkJaWYgKCFiby0+YmRldi0+ZnVuY3MtPnN3YXBfcG9zc2libGUoYm8pKSB7Cj4g KwkJCWlmIChsb2NrZWQpCj4gKwkJCQlkbWFfcmVzdl91bmxvY2soYm8tPmJhc2UucmVzdik7Cj4g KwkJCXJldHVybiAtRUJVU1k7Cj4gKwkJfQo+ICsJfQo+ICsKPiAgIAlpZiAoYm8tPmRlbGV0ZWQp IHsKPiAgIAkJdHRtX2JvX2NsZWFudXBfcmVmcyhibywgZmFsc2UsIGZhbHNlLCBsb2NrZWQpOwo+ ICAgCQl0dG1fYm9fcHV0KGJvKTsKPiBAQCAtMTIwMCw2ICsxMjA4LDEwIEBAIGludCB0dG1fYm9f c3dhcG91dChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBzdHJ1Y3QgdHRtX29wZXJhdGlv bl9jdHggKmN0eCwKPiAgIAlpZiAoYm8tPmJkZXYtPmZ1bmNzLT5zd2FwX25vdGlmeSkKPiAgIAkJ Ym8tPmJkZXYtPmZ1bmNzLT5zd2FwX25vdGlmeShibyk7Cj4gICAKPiArCS8qIFRoZSBjYWxsIHRv IHN3YXBfbm90aWZ5IG1heSBoYXZlIHB1cmdlZCB0aGUgYm8gKi8KPiArCWlmICghYm8tPnR0bSkK PiArCQlnb3RvIG91dDsKPiArCj4gICAJcmV0ID0gdHRtX3R0X3N3YXBvdXQoYm8tPmJkZXYsIGJv LT50dG0sIGdmcF9mbGFncyk7Cj4gICBvdXQ6Cj4gICAKPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9k cm0vdHRtL3R0bV9kZXZpY2UuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fZGV2aWNlLmgKPiBpbmRl eCA3YzhmODdiZDUyZDMuLjdjNTlkMzVlOTBmOSAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2RybS90 dG0vdHRtX2RldmljZS5oCj4gKysrIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9kZXZpY2UuaAo+IEBA IC0xODEsNiArMTgxLDE1IEBAIHN0cnVjdCB0dG1fZGV2aWNlX2Z1bmNzIHsKPiAgIAkgKi8KPiAg IAl2b2lkICgqZGVsZXRlX21lbV9ub3RpZnkpKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8p Owo+ICAgCj4gKwkvKioKPiArCSAqIHN0cnVjdCB0dG1fYm9fZHJpdmVyIG1lbWJlciBzd2FwX3Bv c3NpYmxlCj4gKwkgKgo+ICsJICogQGJvOiB0aGUgYnVmZmVyIG9iamVjdCB0byBiZSBldmljdGVk Cj4gKwkgKgo+ICsJICogQ2hlY2sgd2l0aCB0aGUgZHJpdmVyIGlmIGl0IGlzIHBvc3NpYmxlIHRv IHN3YXAgb3V0IGEgQk8uCj4gKwkgKi8KPiArCWJvb2wgKCpzd2FwX3Bvc3NpYmxlKShzdHJ1Y3Qg dHRtX2J1ZmZlcl9vYmplY3QgKmJvKTsKPiArCj4gICAJLyoqCj4gICAJICogbm90aWZ5IHRoZSBk cml2ZXIgdGhhdCB3ZSdyZSBhYm91dCB0byBzd2FwIG91dCB0aGlzIGJvCj4gICAJICovCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFp bGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK