From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="iNGU+BIb" Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2074.outbound.protection.outlook.com [40.107.223.74]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6C928172A; Fri, 8 Dec 2023 08:05:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=k8y+chYTX0drw0dcfgOkJc76qs8JLZ8UbkNI69ySmEFbwYR7bOhYNRFvb5M9nBLwmxcVIujJJalK5+HPi5FWe+5qHicSY0eKlHf3QgY0kEVVhNcPw87qdn7IaYehM/5a5bH7fEWwfef1NPYn/suhA2mIp7NmFWKZOQEccZRUrrusWVRO9upi/9+VGcu0rm/nLvIcpSLS7euPIeojA92Vz1JQW6X+59g7NMqgjBvxXywuCamoLaa78yhSm3feZYqsg6QjHePo987MVlBogJepj8QfSjLbnx45qdKh7AonAa8HLr4SZ3eyCBHUYaInxE2o//ENjLeircn3nAPnam77bQ== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4CNFOIbWMnLa5Q3eLGZ8e2nxptN/EP+IlWwWaFQXx3M=; b=RgGdjaMdvIv++R/YmIifHmU6XpF9G2GUFBmbWJe5GC54fpqZlAsdlVO2BD3wjiGQmGTcBbLg8xoiG6xpMuJMinX42I1GnPkwdhmDFKfE6PNf98jEtmLpXUrb0BeuHLMozN9ROkYwndBlTWkDdnQOws/Cw+Ib6ZpAl+lNJocZzwowvZZpNrbNloOLOlKdbQ4Fs55+bdEmeTUDWo/o6+xI7N5ceZ9R886FuA4EwPRpv3yh71j1XzdFpo7xOCUqIsNp5OtNm/H5gFbyuYTt1RPNCOtkRN5WTvtRfZ+WVmGYIcPC0xWhgXJCODCuNuypVjUVHDO77Lj4SUQILr2+/ZR1eg== 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=4CNFOIbWMnLa5Q3eLGZ8e2nxptN/EP+IlWwWaFQXx3M=; b=iNGU+BIbgj9KX+UZRA8KtH4kKyI3EFJz9knwNug7HbQeRIl9NFZLTkD6zMrvNRZTHu2q3JXFNrGCq9k23Awd7N7Ux3lCECmEv4cBct0jEANgF0AxRvdsgHQe20DOmDxRmlUCUlJu1rs3IEBZaHtd+SNNdFG8JX4CzOES1nQ/8ys= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com; Received: from BY5PR12MB3683.namprd12.prod.outlook.com (2603:10b6:a03:1a5::16) by MN2PR12MB4224.namprd12.prod.outlook.com (2603:10b6:208:1dd::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.28; Fri, 8 Dec 2023 16:05:55 +0000 Received: from BY5PR12MB3683.namprd12.prod.outlook.com ([fe80::dacc:66a0:6923:a5e]) by BY5PR12MB3683.namprd12.prod.outlook.com ([fe80::dacc:66a0:6923:a5e%4]) with mapi id 15.20.7068.028; Fri, 8 Dec 2023 16:05:55 +0000 Message-ID: Date: Fri, 8 Dec 2023 10:05:51 -0600 User-Agent: Mozilla Thunderbird Beta Subject: Re: [PATCH v7 3/4] remoteproc: zynqmp: add pm domains support Content-Language: en-US To: Mathieu Poirier Cc: andersson@kernel.org, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, michal.simek@amd.com, ben.levinsky@amd.com, linux-remoteproc@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org References: <20231117174238.1876655-1-tanmay.shah@amd.com> <20231117174238.1876655-4-tanmay.shah@amd.com> <93487d3c-c324-4b9b-8b25-0b4ea52237b4@amd.com> <2e24d9be-be10-4f80-b3af-c3e0ed003e7b@amd.com> From: Tanmay Shah In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-ClientProxiedBy: SA0PR11CA0005.namprd11.prod.outlook.com (2603:10b6:806:d3::10) To BY5PR12MB3683.namprd12.prod.outlook.com (2603:10b6:a03:1a5::16) Precedence: bulk X-Mailing-List: linux-remoteproc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BY5PR12MB3683:EE_|MN2PR12MB4224:EE_ X-MS-Office365-Filtering-Correlation-Id: a9dc855e-9922-464a-38df-08dbf8078ee0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 673t2pHmvOB1u6aqJ/jMCNlpYYrWawo+xfEMjUow+GnmmJtVte9lpedRuvObsNoKWnHl7NHAaPf0M1mXM8W97VzzDlxnAjFwi0JawqAaEwjPhJ25QxOWeHH+YyvUapTvrDUNNEpRydrmbLO7WMFSMlid90Qf+FvaYmjJ3SJ8JTgr+PC/9HMR3YJo1eU/coMEapn3UocvuDS3uFIppxqnXv/l05QRaUlilroI9T9mtHBLXBfH3DWJ4EDtZwJIaVnDsirgQgl0CD54DMg2eLZVymhw4lq53rJ94Nf63vovO1wS3d5oFwLSgjdRTagY0WtjyYFKgDucWwRvHYFX9Tv+GcMNbQS8H5oAu8Jv+ONYJf19iXLtMuR1lar1rPLPgHCP6khXt8hanj/LjTC+YF9rpDR9veuCQw9f380vwoSaNAYIZjA8sD+H155xKHmK/r23xvs8oMShBljA9teY2/If/PKNatS6/hNXZM6S7VFPVD0HY37rXCUgOyzKOmWQYSlhfDbJtxle+iH3qO5QwrUw4yYRBX6LpGlUtu5Wkitd4jsAVfDWrIDaf7DU8JP2uA/RHS2jT25etdLufsrSEKAO3j0YvBNFiLPwQthU8NCYk0ihGVZlzrokpCh437Nqx1ultLRm+11mP+zu65kz0sK07A== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BY5PR12MB3683.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(39860400002)(396003)(366004)(376002)(136003)(346002)(230922051799003)(451199024)(1800799012)(186009)(64100799003)(6512007)(26005)(2616005)(53546011)(6486002)(478600001)(6506007)(6666004)(83380400001)(2906002)(30864003)(44832011)(5660300002)(41300700001)(66476007)(66556008)(66946007)(4326008)(8676002)(8936002)(316002)(6916009)(38100700002)(31696002)(86362001)(36756003)(66899024)(31686004)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cU9iZDRiY0pXV2tGZW9UVW8wSG9ra2tLbmhCNk5XVkx4RHRXbVhjeGJ0c0dS?= =?utf-8?B?ako3NW1pRlpRNTRwUllqZDlhM3hvdmxiSmhkVUxUMDJISVY2clpscTZBUk5n?= =?utf-8?B?OUh1dkVHWG5PdU5WeGRDNFh6WTUxcno2alFjSXlwUXRyRzcrVllPUnl1TWk1?= =?utf-8?B?YVpmbzVQYkU2OTRnZWVpV1huQXpQZmUzYXBoTS9IcnFtZkFyWVIrTmJ5LzRw?= =?utf-8?B?VlIreVJ4WTIvOHNsbTRjQm55WjdmTlV6bzhBNWVjY0RjcVliS2Q0NjVYRjdo?= =?utf-8?B?Um53MWZQZVg5eUtpbjRyOTN1eVR0Q1BBVFc5SGgzait3NFhBVzgzOUxvaEV4?= =?utf-8?B?cmNpN3dtcmwzK2FXVjFmNkFaNHpYMGlIam5mQ2hsdTVVMFNMRkRFOHJFTWRN?= =?utf-8?B?N0xqSXBnK2w4dCtzTnZ3WTlMUnhmQ1Z0K25PQlc5YzI3RzlpWFY1d1FrT2Vq?= =?utf-8?B?RVF5UE8rTWpXZS9US2tIbjJJYjVIZitYVmkxWjNYTWhQNHAzcVRNUHBhZnc0?= =?utf-8?B?OVZRV1lWRDdXblF2ckhJZkdYVWw4YVErZ05uK216R25TOExPS0cwOVFoengx?= =?utf-8?B?ejRFQzUxaGJVOTZxMTg0TG1aL0p3ZHlzWnE4ZzNXTURDYTN6bE9Pa1NjcEhl?= =?utf-8?B?Q2gwbDZoY3dkb3Z3d2hDaklQbUlmazJlejJZeXlhRW5UaGorK05SWG1Lbnp2?= =?utf-8?B?aUU5WHA5M2FER2k2U0NHbjJlMktZUlpCdStyWjFPaDBQMkFPdjY4djdxalph?= =?utf-8?B?K3lML0cyaWsxVldRUE03a2toSjdUeVVKREkrRHJML2lKRmFSbDB6Zk91cEw2?= =?utf-8?B?NDJFcDBXRUlBZmhJT3ZiN0UrbnZLR3V2eGk3Zmo4Yk1pbEVlRGpZNzZLMXR6?= =?utf-8?B?RGJRMmVmS1Rjb0R3YURSSXVUQThjSk5IV1puK1VYajAwWTl5Uy9PUGRTYjRU?= =?utf-8?B?T2JyZWNwVXpWTUIvckxiSStuZExYNlI4cWV6aFMxV3dtV2FNZVV5ck1HQUJZ?= =?utf-8?B?TkZFblcrdnNRRUZjWk9nd0RPbU13TjFzZ3gzRUpPYy9hY2FXc3N0NHNxUGYr?= =?utf-8?B?Rks3V05NZitwRzdkQUtDQldpUU5NN2pyWHhBbjg0MG53SFNzQUZDN21wL0lM?= =?utf-8?B?dmVXSTVSTmV4MnNzTzVVaWhmNVhqajJ6NU1MRkFOU2FKOW8xSWYwbUkwTmNS?= =?utf-8?B?dUIrbGxOR2ZtMkxKd0RZWHQ3T2dWQm81QVJITHY5UzNYYStJUldzanU1RHJB?= =?utf-8?B?VXZjUEZ4cFVySWs5cEJhZDNmdlZwM3RpeUVFRlFmbDdXb1A1aTUzOVRyRmFt?= =?utf-8?B?blFNWTdxNU1YaG9kaHRzQWJsS0R6Y1IvQ29US01aR1FLdFFROE5ISlRJdVVX?= =?utf-8?B?MzZ1UU9Ud0o5WXI5Q2hBd2VEaFd5d1I1bTZzOWIzZGJLcWtlVmlwdmlvRENR?= =?utf-8?B?dGJNSXdoLzhSc0o4VEJ0N08rTklGQm9XV1BsMi9ROFg3UTB1blJpc0QxYXNB?= =?utf-8?B?UWNHNER0SlpxWTNzZDl6ZFh3Y1RuRDFnOUttNUlKNXJVdHZlK0YvdVg3MWFq?= =?utf-8?B?ck9MTGNaQ2RZY3A0Rm5hNGdtTCtrZEJHZGlaOG1sNk00QzBJck9qWWFBb1Rh?= =?utf-8?B?RWpNQVg1TmI0c1NkRUpCL244OElteWZESzRIRG43NWp2M3lNNFd4OUhyenNl?= =?utf-8?B?anpFaGYySDY3VWNwRWNsaW5Naks4c1RPaW9nT2RxenN0bjg3S2VhcSsxa0wr?= =?utf-8?B?enNaUFRKclBmOTBSVHhkZjZaK003cWxGYlUxazVWVU5ZWU9yZTA3a29VRlVC?= =?utf-8?B?QUt3c2JsRWh2T2NvcTk2UTR5SE1Cajh6elpYWDdaMDRHM1BoMERUMVR0OFh2?= =?utf-8?B?eGEyb3RPbnE4OXVqaTVnakNOV3loL3I4Y3I0clJiTktiSnhZdzZXTm8vZyt4?= =?utf-8?B?d2NRVXFRT0JsQ0kzV2t3Q1NaczFXclVwS0FjaW9PM1c2Skh5Q2M3ekZmYWlT?= =?utf-8?B?ZGkxeU1zWTlDODgxTTZObnBNRzFWUVpPWENnbkhHV0kzUTVPd2Q1Qi9tT3VY?= =?utf-8?B?bFRHSWdiV25uSWVrY2t4TjZhZzhXZ25kei9jRWVXTmxUUXB5RmtyTGx2YUN0?= =?utf-8?Q?V3UYjfF/nAPhVDqjBIi+xNJSl?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: a9dc855e-9922-464a-38df-08dbf8078ee0 X-MS-Exchange-CrossTenant-AuthSource: BY5PR12MB3683.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Dec 2023 16:05:55.0178 (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: 9zFopFNSf0k0zm7meYrdCUc4/AtFeXGu7T9PhxW8EahDoaqOs/3SRdiwnAiBPp/a X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB4224 On 12/8/23 9:51 AM, Mathieu Poirier wrote: > On Wed, Dec 06, 2023 at 12:06:45PM -0600, Tanmay Shah wrote: > > > > On 12/6/23 9:43 AM, Mathieu Poirier wrote: > > > On Fri, 1 Dec 2023 at 11:10, Tanmay Shah wrote: > > > > > > > > > > > > On 11/29/23 11:10 AM, Mathieu Poirier wrote: > > > > > On Mon, Nov 27, 2023 at 10:33:05AM -0600, Tanmay Shah wrote: > > > > > > > > > > > > On 11/23/23 12:11 PM, Mathieu Poirier wrote: > > > > > > > On Wed, Nov 22, 2023 at 03:00:36PM -0600, Tanmay Shah wrote: > > > > > > > > Hi Mathieu, > > > > > > > > > > > > > > > > Please find my comments below. > > > > > > > > > > > > > > > > On 11/21/23 4:59 PM, Mathieu Poirier wrote: > > > > > > > > > Hi, > > > > > > > > > > > > > > > > > > On Fri, Nov 17, 2023 at 09:42:37AM -0800, Tanmay Shah wrote: > > > > > > > > > > Use TCM pm domains extracted from device-tree > > > > > > > > > > to power on/off TCM using general pm domain framework. > > > > > > > > > > > > > > > > > > > > Signed-off-by: Tanmay Shah > > > > > > > > > > --- > > > > > > > > > > > > > > > > > > > > Changes in v7: > > > > > > > > > > - %s/pm_dev1/pm_dev_core0/r > > > > > > > > > > - %s/pm_dev_link1/pm_dev_core0_link/r > > > > > > > > > > - %s/pm_dev2/pm_dev_core1/r > > > > > > > > > > - %s/pm_dev_link2/pm_dev_core1_link/r > > > > > > > > > > - remove pm_domain_id check to move next patch > > > > > > > > > > - add comment about how 1st entry in pm domain list is used > > > > > > > > > > - fix loop when jump to fail_add_pm_domains loop > > > > > > > > > > > > > > > > > > > > drivers/remoteproc/xlnx_r5_remoteproc.c | 215 +++++++++++++++++++++++- > > > > > > > > > > 1 file changed, 212 insertions(+), 3 deletions(-) > > > > > > > > > > > > > > > > > > > > diff --git a/drivers/remoteproc/xlnx_r5_remoteproc.c b/drivers/remoteproc/xlnx_r5_remoteproc.c > > > > > > > > > > index 4395edea9a64..22bccc5075a0 100644 > > > > > > > > > > --- a/drivers/remoteproc/xlnx_r5_remoteproc.c > > > > > > > > > > +++ b/drivers/remoteproc/xlnx_r5_remoteproc.c > > > > > > > > > > @@ -16,6 +16,7 @@ > > > > > > > > > > #include > > > > > > > > > > #include > > > > > > > > > > #include > > > > > > > > > > +#include > > > > > > > > > > > > > > > > > > > > #include "remoteproc_internal.h" > > > > > > > > > > > > > > > > > > > > @@ -102,6 +103,12 @@ static const struct mem_bank_data zynqmp_tcm_banks_lockstep[] = { > > > > > > > > > > * @rproc: rproc handle > > > > > > > > > > * @pm_domain_id: RPU CPU power domain id > > > > > > > > > > * @ipi: pointer to mailbox information > > > > > > > > > > + * @num_pm_dev: number of tcm pm domain devices for this core > > > > > > > > > > + * @pm_dev_core0: pm domain virtual devices for power domain framework > > > > > > > > > > + * @pm_dev_core0_link: pm domain device links after registration > > > > > > > > > > + * @pm_dev_core1: used only in lockstep mode. second core's pm domain virtual devices > > > > > > > > > > + * @pm_dev_core1_link: used only in lockstep mode. second core's pm device links after > > > > > > > > > > + * registration > > > > > > > > > > */ > > > > > > > > > > struct zynqmp_r5_core { > > > > > > > > > > struct device *dev; > > > > > > > > > > @@ -111,6 +118,11 @@ struct zynqmp_r5_core { > > > > > > > > > > struct rproc *rproc; > > > > > > > > > > u32 pm_domain_id; > > > > > > > > > > struct mbox_info *ipi; > > > > > > > > > > + int num_pm_dev; > > > > > > > > > > + struct device **pm_dev_core0; > > > > > > > > > > + struct device_link **pm_dev_core0_link; > > > > > > > > > > + struct device **pm_dev_core1; > > > > > > > > > > + struct device_link **pm_dev_core1_link; > > > > > > > > > > }; > > > > > > > > > > > > > > > > > > > > /** > > > > > > > > > > @@ -651,7 +663,8 @@ static int add_tcm_carveout_lockstep_mode(struct rproc *rproc) > > > > > > > > > > ZYNQMP_PM_CAPABILITY_ACCESS, 0, > > > > > > > > > > ZYNQMP_PM_REQUEST_ACK_BLOCKING); > > > > > > > > > > if (ret < 0) { > > > > > > > > > > - dev_err(dev, "failed to turn on TCM 0x%x", pm_domain_id); > > > > > > > > > > + dev_err(dev, "failed to turn on TCM 0x%x", > > > > > > > > > > + pm_domain_id); > > > > > > > > > > > > > > > > > > Spurious change, you should have caught that. > > > > > > > > > > > > > > > > Ack, need to observe changes more closely before sending them. > > > > > > > > > > > > > > > > > > > > > > > > > > > goto release_tcm_lockstep; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > @@ -758,6 +771,189 @@ static int zynqmp_r5_parse_fw(struct rproc *rproc, const struct firmware *fw) > > > > > > > > > > return ret; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > +static void zynqmp_r5_remove_pm_domains(struct rproc *rproc) > > > > > > > > > > +{ > > > > > > > > > > + struct zynqmp_r5_core *r5_core = rproc->priv; > > > > > > > > > > + struct device *dev = r5_core->dev; > > > > > > > > > > + struct zynqmp_r5_cluster *cluster; > > > > > > > > > > + int i; > > > > > > > > > > + > > > > > > > > > > + cluster = platform_get_drvdata(to_platform_device(dev->parent)); > > > > > > > > > > + > > > > > > > > > > + for (i = 1; i < r5_core->num_pm_dev; i++) { > > > > > > > > > > + device_link_del(r5_core->pm_dev_core0_link[i]); > > > > > > > > > > + dev_pm_domain_detach(r5_core->pm_dev_core0[i], false); > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + kfree(r5_core->pm_dev_core0); > > > > > > > > > > + r5_core->pm_dev_core0 = NULL; > > > > > > > > > > + kfree(r5_core->pm_dev_core0_link); > > > > > > > > > > + r5_core->pm_dev_core0_link = NULL; > > > > > > > > > > + > > > > > > > > > > + if (cluster->mode == SPLIT_MODE) { > > > > > > > > > > + r5_core->num_pm_dev = 0; > > > > > > > > > > + return; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + for (i = 1; i < r5_core->num_pm_dev; i++) { > > > > > > > > > > + device_link_del(r5_core->pm_dev_core1_link[i]); > > > > > > > > > > + dev_pm_domain_detach(r5_core->pm_dev_core1[i], false); > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + kfree(r5_core->pm_dev_core1); > > > > > > > > > > + r5_core->pm_dev_core1 = NULL; > > > > > > > > > > + kfree(r5_core->pm_dev_core1_link); > > > > > > > > > > + r5_core->pm_dev_core1_link = NULL; > > > > > > > > > > + r5_core->num_pm_dev = 0; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > +static int zynqmp_r5_add_pm_domains(struct rproc *rproc) > > > > > > > > > > +{ > > > > > > > > > > + struct zynqmp_r5_core *r5_core = rproc->priv; > > > > > > > > > > + struct device *dev = r5_core->dev, *dev2; > > > > > > > > > > + struct zynqmp_r5_cluster *cluster; > > > > > > > > > > + struct platform_device *pdev; > > > > > > > > > > + struct device_node *np; > > > > > > > > > > + int i, j, num_pm_dev, ret; > > > > > > > > > > + > > > > > > > > > > + cluster = dev_get_drvdata(dev->parent); > > > > > > > > > > + > > > > > > > > > > + /* get number of power-domains */ > > > > > > > > > > + num_pm_dev = of_count_phandle_with_args(r5_core->np, "power-domains", > > > > > > > > > > + "#power-domain-cells"); > > > > > > > > > > + > > > > > > > > > > + if (num_pm_dev <= 0) > > > > > > > > > > + return -EINVAL; > > > > > > > > > > + > > > > > > > > > > + r5_core->pm_dev_core0 = kcalloc(num_pm_dev, > > > > > > > > > > + sizeof(struct device *), > > > > > > > > > > + GFP_KERNEL); > > > > > > > > > > + if (!r5_core->pm_dev_core0) > > > > > > > > > > + ret = -ENOMEM; > > > > > > > > > > + > > > > > > > > > > + r5_core->pm_dev_core0_link = kcalloc(num_pm_dev, > > > > > > > > > > + sizeof(struct device_link *), > > > > > > > > > > + GFP_KERNEL); > > > > > > > > > > + if (!r5_core->pm_dev_core0_link) { > > > > > > > > > > + kfree(r5_core->pm_dev_core0); > > > > > > > > > > + r5_core->pm_dev_core0 = NULL; > > > > > > > > > > + return -ENOMEM; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + r5_core->num_pm_dev = num_pm_dev; > > > > > > > > > > + > > > > > > > > > > + /* > > > > > > > > > > + * start from 2nd entry in power-domains property list as > > > > > > > > > > + * for zynqmp we only add TCM power domains and not core's power domain. > > > > > > > > > > + * 1st entry is used to configure r5 operation mode. > > > > > > > > > > > > > > > > > > You are still not saying _where_ ->pm_dev_core0[0] gets added. > > > > > > > > > > > > > > > > So, pm_dev_core0[0] isn't really need to be added for zynqmp platform, as firmware starts it with call, > > > > > > > > > > > > > > > > zynqmp_pm_request_wake during rproc_start callback. I will document this in next > > > > > > > > > > > > > > > > > > > > > > That is exactly what I am looking for. That way people don't have to go through > > > > > > > the entire driver trying to figure out what is happening with pm_dev_core[0]. > > > > > > > > > > > > > > I'm also not sure about the power-up order. Logically the TCMs should be > > > > > > > powered up before the R5 in order to put code in them. The R5s are powered in > > > > > > > zynqmp_r5_rproc_start() but I am unclear as to where in the boot sequence the > > > > > > > TCMs are powered - can you expand on that? > > > > > > > > > > > > > > > > > > Sure. Following is call sequece > > > > > > > > > > > > zynqmp_r5_rproc_prepare > > > > > > > > > > > > zynqmp_r5_add_pm_domains -> Here TCM is powered on when device_link_add is called via zynqmp-pm-domains.c driver. > > > > > > > > > > > > . . . > > > > > > > > > > > > zynqmp_r5_rproc_start -> load firmware and Starts RPU > > > > > > > > > > > > So what you mentioned is correct, TCM is being powerd-on before we load firmware and start RPU. > > > > > > > > > > > > > > > > > > > > > > > > > > > revision. For new platforms pm_dev_core0[0] will be added in future. > > > > > > > > > > > > > > Now I'm really confused - what do you mean by "pm_dev_core0[0] will be added in > > > > > > > future"? > > > > > > > > > > > > > > > > > > ZynqMP platform has platform management firmware running on microblaze. > > > > > > > > > > > > This firmware design does not expect R5 pm domains to be requested explicitly. > > > > > > > > > > > > This means, during zynqmp_r5_rproc_start when "zynqmp_pm_request_wake" is called, > > > > > > > > > > > > firmware powers on R5. So, pm_dev_core[0] is not really used for ZynqMP. > > > > > > > > > > > > However, this design was changed for new platforms i.e. "versal" and onwards. > > > > > > > > > > > > Firmware of new platform expects pm domains to be requested explicitly for R5 cores before > > > > > > > > > > > > waking them up. > > > > > > > > > > > > That means, pm_dev_core[0] for R5 cores on new platform (Versal) needs to be used same as TCM. > > > > > > > > > > > > Then, we should wake it up on r5_core. > > > > > > > > > > > > To summarize: > > > > > > > > > > > > For zynqmp only following call needed to start R5: > > > > > > > > > > > > zynqmp_pm_request_wake > > > > > > > > > > > > For "versal" and onwards we need two calls to start R5: > > > > > > > > > > > > "device_link_add" and zynqmp_pm_request_wake > > > > > > > > > > > > So, in future pm_core_dev[0] will be used. > > > > > > > > > > > > > > > > Thanks for the clarification on both front. The problem here is that we are > > > > > keeping R5 power domain information in two different places, i.e > > > > > zynqmp_r5_core::pm_domain_id and zynqmp_r5_core::pm_dev_core0[0]. > > > > > > > > > > Please see if you can retreive the power domain ID from > > > > > zynqmp_r5_core::pm_dev_core0[0]. That way you can get the power domain ID when > > > > > calling zynqmp_pm_request_wake() and zynqmp_pm_force_pwrdwn() and get rid of > > > > > zynqmp_r5_core::pm_domain_id. > > > > > > > > Hi Mathieu, > > > > > > > > I looked into this. Probably I can't retrieve pm_domain_id from pm_dev_core0[0], > > > > > > > > However, I can retrieve it from device-tree when calling zynqmp_pm_request_wake > > > > > > > > and zynqmp_pm_force_pwrdwn. > > > > > > > > zynqmp_r5_core::pm_domain_id is caching that value during probe, and use it during > > > > rest of the driver lifecycle. > > > > > > > > I am okay either way, (keeping it as it is, or get it from device-tree). Let me know your > > > > > > > > preference. > > > > > > > > > > Humm... Then I suggest to simply get rid of the device linking to > > > deal with the TCMs' power management. From where I stand it provides > > > more confusion than benefits, and that is without considering the > > > extra complexity. > > > > > > Do you mean to get rid of pm_dev_core0[1], and pm_dev_core0[2] as well ? > > > > Yes > > > If yes, its preferred to use pm_domain framework to power-on/off TCM. > > > > That is when the pm runtime subsystem is used extensively but it isn't > the case here. In this scenario using device linking is adding a lot of > complexity for something that could be done in a single line of code. Ok fair point, please give me sometime to explore more. I don't mind getting rid of pm domain framework usage. For some reason, if we must use it, we can always introduce it later. I just want to make sure if we don't use pm domains framework, then remoteproc works for future platforms as well. I will get back to you as need to do more testing after removing pm domains framework. Thanks, Tanmay > > If we want to get rid of zynqmp_r5_core::pm_domain_id, I will do what's done in > > > > __genpd_dev_pm_attach API where, pm_domain_id is retrieved using of_node of pm_dev_core0[*] device. > > > >     ret = of_parse_phandle_with_args(dev->of_node, "power-domains", > >                             "#power-domain-cells", index, &pd_args); > > That is what I asked for in my previous email, i.e use ->pm_dev_core0[0] to > retrieve the domain ID. > > > > > However, Its preferred to use pm_domain framework when power-domains are available in device-tree. > > > > Let  me know. > > > > Thanks, > > > > Tanmay > > > > > > > > Thanks, > > > > > > > > Tanmay > > > > > > > > > > > > > > > > > > > > > > > > > > I hope this meets expectations. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > + */ > > > > > > > > > > + for (i = 1; i < r5_core->num_pm_dev; i++) { > > > > > > > > > > + r5_core->pm_dev_core0[i] = dev_pm_domain_attach_by_id(dev, i); > > > > > > > > > > + if (IS_ERR_OR_NULL(r5_core->pm_dev_core0[i])) { > > > > > > > > > > > > > > > > > > Here IS_ERR_OR_NULL() is used while two if conditions for NULL and an error > > > > > > > > > code are used in the loop for the lockstep mode. Please pick one heuristic and > > > > > > > > > stick with it. I have no preference on which one. > > > > > > > > > > > > > > > > Ok, I think IS_ERR_OR_NULL is more cleaner, I will address it in next revision. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > + dev_dbg(dev, "failed to attach pm domain %d, ret=%ld\n", i, > > > > > > > > > > + PTR_ERR(r5_core->pm_dev_core0[i])); > > > > > > > > > > + ret = -EINVAL; > > > > > > > > > > + goto fail_add_pm_domains; > > > > > > > > > > + } > > > > > > > > > > + r5_core->pm_dev_core0_link[i] = device_link_add(dev, > > > > > > > > > > + r5_core->pm_dev_core0[i], > > > > > > > > > > + DL_FLAG_STATELESS | > > > > > > > > > > + DL_FLAG_RPM_ACTIVE | > > > > > > > > > > + DL_FLAG_PM_RUNTIME); > > > > > > > > > > + if (!r5_core->pm_dev_core0_link[i]) { > > > > > > > > > > + dev_pm_domain_detach(r5_core->pm_dev_core0[i], true); > > > > > > > > > > + r5_core->pm_dev_core0[i] = NULL; > > > > > > > > > > + ret = -EINVAL; > > > > > > > > > > + goto fail_add_pm_domains; > > > > > > > > > > + } > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + if (cluster->mode == SPLIT_MODE) > > > > > > > > > > + return 0; > > > > > > > > > > + > > > > > > > > > > + r5_core->pm_dev_core1 = kcalloc(num_pm_dev, > > > > > > > > > > + sizeof(struct device *), > > > > > > > > > > + GFP_KERNEL); > > > > > > > > > > + if (!r5_core->pm_dev_core1) { > > > > > > > > > > + ret = -ENOMEM; > > > > > > > > > > + goto fail_add_pm_domains; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + r5_core->pm_dev_core1_link = kcalloc(num_pm_dev, > > > > > > > > > > + sizeof(struct device_link *), > > > > > > > > > > + GFP_KERNEL); > > > > > > > > > > + if (!r5_core->pm_dev_core1_link) { > > > > > > > > > > + kfree(r5_core->pm_dev_core1); > > > > > > > > > > + r5_core->pm_dev_core1 = NULL; > > > > > > > > > > + ret = -ENOMEM; > > > > > > > > > > + goto fail_add_pm_domains; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + /* get second core's device to detach its power-domains */ > > > > > > > > > > + np = of_get_next_child(cluster->dev->of_node, of_node_get(dev->of_node)); > > > > > > > > > > + > > > > > > > > > > + pdev = of_find_device_by_node(np); > > > > > > > > > > + if (!pdev) { > > > > > > > > > > + dev_err(cluster->dev, "core1 platform device not available\n"); > > > > > > > > > > + kfree(r5_core->pm_dev_core1); > > > > > > > > > > + kfree(r5_core->pm_dev_core1_link); > > > > > > > > > > + r5_core->pm_dev_core1 = NULL; > > > > > > > > > > + r5_core->pm_dev_core1_link = NULL; > > > > > > > > > > + ret = -EINVAL; > > > > > > > > > > + goto fail_add_pm_domains; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + dev2 = &pdev->dev; > > > > > > > > > > + > > > > > > > > > > + /* for zynqmp we only add TCM power domains and not core's power domain */ > > > > > > > > > > + for (j = 1; j < r5_core->num_pm_dev; j++) { > > > > > > > > > > + r5_core->pm_dev_core1[j] = dev_pm_domain_attach_by_id(dev2, j); > > > > > > > > > > + if (!r5_core->pm_dev_core1[j]) { > > > > > > > > > > + dev_dbg(dev, "can't attach to pm domain %d\n", j); > > > > > > > > > > + ret = -EINVAL; > > > > > > > > > > + goto fail_add_pm_domains_lockstep; > > > > > > > > > > + } else if (IS_ERR(r5_core->pm_dev_core1[j])) { > > > > > > > > > > + dev_dbg(dev, "can't attach to pm domain %d\n", j); > > > > > > > > > > + ret = PTR_ERR(r5_core->pm_dev_core1[j]); > > > > > > > > > > + goto fail_add_pm_domains_lockstep; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > + r5_core->pm_dev_core1_link[j] = device_link_add(dev, > > > > > > > > > > + r5_core->pm_dev_core1[j], > > > > > > > > > > + DL_FLAG_STATELESS | > > > > > > > > > > + DL_FLAG_RPM_ACTIVE | > > > > > > > > > > + DL_FLAG_PM_RUNTIME); > > > > > > > > > > + if (!r5_core->pm_dev_core1_link[j]) { > > > > > > > > > > + dev_pm_domain_detach(r5_core->pm_dev_core1[j], true); > > > > > > > > > > + r5_core->pm_dev_core1[j] = NULL; > > > > > > > > > > + ret = -ENODEV; > > > > > > > > > > + goto fail_add_pm_domains_lockstep; > > > > > > > > > > + } > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > +fail_add_pm_domains_lockstep: > > > > > > > > > > + while (--j >= 0) { > > > > > > > > > > + device_link_del(r5_core->pm_dev_core1_link[j]); > > > > > > > > > > + dev_pm_domain_detach(r5_core->pm_dev_core1[j], true); > > > > > > > > > > + } > > > > > > > > > > + kfree(r5_core->pm_dev_core1); > > > > > > > > > > + r5_core->pm_dev_core1 = NULL; > > > > > > > > > > + kfree(r5_core->pm_dev_core1_link); > > > > > > > > > > + r5_core->pm_dev_core1_link = NULL; > > > > > > > > > > + > > > > > > > > > > +fail_add_pm_domains: > > > > > > > > > > + while (--i >= 0) { > > > > > > > > > > + device_link_del(r5_core->pm_dev_core0_link[i]); > > > > > > > > > > + dev_pm_domain_detach(r5_core->pm_dev_core0[i], true); > > > > > > > > > > + } > > > > > > > > > > + kfree(r5_core->pm_dev_core0); > > > > > > > > > > + r5_core->pm_dev_core0 = NULL; > > > > > > > > > > + kfree(r5_core->pm_dev_core0_link); > > > > > > > > > > + r5_core->pm_dev_core0_link = NULL; > > > > > > > > > > + > > > > > > > > > > > > > > > > > > The error path is much cleaner and readable now. > > > > > > > > > > > > > > > > > > I will continue tomorrow. > > > > > > > > > > > > > > > > > > Mathieu > > > > > > > > > > > > > > > > > > > + return ret; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > /** > > > > > > > > > > * zynqmp_r5_rproc_prepare() > > > > > > > > > > * adds carveouts for TCM bank and reserved memory regions > > > > > > > > > > @@ -770,19 +966,30 @@ static int zynqmp_r5_rproc_prepare(struct rproc *rproc) > > > > > > > > > > { > > > > > > > > > > int ret; > > > > > > > > > > > > > > > > > > > > + ret = zynqmp_r5_add_pm_domains(rproc); > > > > > > > > > > + if (ret) { > > > > > > > > > > + dev_err(&rproc->dev, "failed to add pm domains\n"); > > > > > > > > > > + return ret; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > ret = add_tcm_banks(rproc); > > > > > > > > > > if (ret) { > > > > > > > > > > dev_err(&rproc->dev, "failed to get TCM banks, err %d\n", ret); > > > > > > > > > > - return ret; > > > > > > > > > > + goto fail_prepare; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > ret = add_mem_regions_carveout(rproc); > > > > > > > > > > if (ret) { > > > > > > > > > > dev_err(&rproc->dev, "failed to get reserve mem regions %d\n", ret); > > > > > > > > > > - return ret; > > > > > > > > > > + goto fail_prepare; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > return 0; > > > > > > > > > > + > > > > > > > > > > +fail_prepare: > > > > > > > > > > + zynqmp_r5_remove_pm_domains(rproc); > > > > > > > > > > + > > > > > > > > > > + return ret; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > /** > > > > > > > > > > @@ -801,6 +1008,8 @@ static int zynqmp_r5_rproc_unprepare(struct rproc *rproc) > > > > > > > > > > > > > > > > > > > > r5_core = rproc->priv; > > > > > > > > > > > > > > > > > > > > + zynqmp_r5_remove_pm_domains(rproc); > > > > > > > > > > + > > > > > > > > > > for (i = 0; i < r5_core->tcm_bank_count; i++) { > > > > > > > > > > pm_domain_id = r5_core->tcm_banks[i]->pm_domain_id; > > > > > > > > > > if (zynqmp_pm_release_node(pm_domain_id)) > > > > > > > > > > -- > > > > > > > > > > 2.25.1 > > > > > > > > > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1AC2BC4167B for ; Fri, 8 Dec 2023 16:06:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:In-Reply-To:From: References:Cc:To:Subject:Date:Message-ID:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=7noP1RtLSXgvXpGZ0kVo03NDNxVgOafpGFv0JDWfm50=; b=t+CGvVU2ciVlZr9GaF6OytHnX5 A8HHIFicA2pMae+oP8ue0tneYGOwUmlVnlS10tmSwY9G8IlIRRE1LHK09arLurLwBaW1DjSe55Qdz jB/pYUB9PeBVFs6myI2j1754pqB3rhSJKdAODWhLq3oGwaztPMeU16rJxWUqXP7EdZYl+drsLbsdR D2VLIYmbrZiEOc5Cd3t51OffmQTI1mmjEK3hnS2prCmQ4FNkYm713fy9gl51TvH8CUqY5oY8YA79V mAo0H1HMdTt3aOmmPCfg0DzgngAddbhKFTlTy20Q28IHj0blx4FCKM4BAjS7CdOGE2Lb1heWXMb1X RM1zb5VA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rBdMg-00Fyar-1W; Fri, 08 Dec 2023 16:06:10 +0000 Received: from mail-mw2nam04on20627.outbound.protection.outlook.com ([2a01:111:f400:7e8c::627] helo=NAM04-MW2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rBdMb-00FyZc-1f for linux-arm-kernel@lists.infradead.org; Fri, 08 Dec 2023 16:06:09 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=k8y+chYTX0drw0dcfgOkJc76qs8JLZ8UbkNI69ySmEFbwYR7bOhYNRFvb5M9nBLwmxcVIujJJalK5+HPi5FWe+5qHicSY0eKlHf3QgY0kEVVhNcPw87qdn7IaYehM/5a5bH7fEWwfef1NPYn/suhA2mIp7NmFWKZOQEccZRUrrusWVRO9upi/9+VGcu0rm/nLvIcpSLS7euPIeojA92Vz1JQW6X+59g7NMqgjBvxXywuCamoLaa78yhSm3feZYqsg6QjHePo987MVlBogJepj8QfSjLbnx45qdKh7AonAa8HLr4SZ3eyCBHUYaInxE2o//ENjLeircn3nAPnam77bQ== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4CNFOIbWMnLa5Q3eLGZ8e2nxptN/EP+IlWwWaFQXx3M=; b=RgGdjaMdvIv++R/YmIifHmU6XpF9G2GUFBmbWJe5GC54fpqZlAsdlVO2BD3wjiGQmGTcBbLg8xoiG6xpMuJMinX42I1GnPkwdhmDFKfE6PNf98jEtmLpXUrb0BeuHLMozN9ROkYwndBlTWkDdnQOws/Cw+Ib6ZpAl+lNJocZzwowvZZpNrbNloOLOlKdbQ4Fs55+bdEmeTUDWo/o6+xI7N5ceZ9R886FuA4EwPRpv3yh71j1XzdFpo7xOCUqIsNp5OtNm/H5gFbyuYTt1RPNCOtkRN5WTvtRfZ+WVmGYIcPC0xWhgXJCODCuNuypVjUVHDO77Lj4SUQILr2+/ZR1eg== 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=4CNFOIbWMnLa5Q3eLGZ8e2nxptN/EP+IlWwWaFQXx3M=; b=iNGU+BIbgj9KX+UZRA8KtH4kKyI3EFJz9knwNug7HbQeRIl9NFZLTkD6zMrvNRZTHu2q3JXFNrGCq9k23Awd7N7Ux3lCECmEv4cBct0jEANgF0AxRvdsgHQe20DOmDxRmlUCUlJu1rs3IEBZaHtd+SNNdFG8JX4CzOES1nQ/8ys= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com; Received: from BY5PR12MB3683.namprd12.prod.outlook.com (2603:10b6:a03:1a5::16) by MN2PR12MB4224.namprd12.prod.outlook.com (2603:10b6:208:1dd::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.28; Fri, 8 Dec 2023 16:05:55 +0000 Received: from BY5PR12MB3683.namprd12.prod.outlook.com ([fe80::dacc:66a0:6923:a5e]) by BY5PR12MB3683.namprd12.prod.outlook.com ([fe80::dacc:66a0:6923:a5e%4]) with mapi id 15.20.7068.028; Fri, 8 Dec 2023 16:05:55 +0000 Message-ID: Date: Fri, 8 Dec 2023 10:05:51 -0600 User-Agent: Mozilla Thunderbird Beta Subject: Re: [PATCH v7 3/4] remoteproc: zynqmp: add pm domains support Content-Language: en-US To: Mathieu Poirier Cc: andersson@kernel.org, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, michal.simek@amd.com, ben.levinsky@amd.com, linux-remoteproc@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org References: <20231117174238.1876655-1-tanmay.shah@amd.com> <20231117174238.1876655-4-tanmay.shah@amd.com> <93487d3c-c324-4b9b-8b25-0b4ea52237b4@amd.com> <2e24d9be-be10-4f80-b3af-c3e0ed003e7b@amd.com> From: Tanmay Shah In-Reply-To: X-ClientProxiedBy: SA0PR11CA0005.namprd11.prod.outlook.com (2603:10b6:806:d3::10) To BY5PR12MB3683.namprd12.prod.outlook.com (2603:10b6:a03:1a5::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BY5PR12MB3683:EE_|MN2PR12MB4224:EE_ X-MS-Office365-Filtering-Correlation-Id: a9dc855e-9922-464a-38df-08dbf8078ee0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 673t2pHmvOB1u6aqJ/jMCNlpYYrWawo+xfEMjUow+GnmmJtVte9lpedRuvObsNoKWnHl7NHAaPf0M1mXM8W97VzzDlxnAjFwi0JawqAaEwjPhJ25QxOWeHH+YyvUapTvrDUNNEpRydrmbLO7WMFSMlid90Qf+FvaYmjJ3SJ8JTgr+PC/9HMR3YJo1eU/coMEapn3UocvuDS3uFIppxqnXv/l05QRaUlilroI9T9mtHBLXBfH3DWJ4EDtZwJIaVnDsirgQgl0CD54DMg2eLZVymhw4lq53rJ94Nf63vovO1wS3d5oFwLSgjdRTagY0WtjyYFKgDucWwRvHYFX9Tv+GcMNbQS8H5oAu8Jv+ONYJf19iXLtMuR1lar1rPLPgHCP6khXt8hanj/LjTC+YF9rpDR9veuCQw9f380vwoSaNAYIZjA8sD+H155xKHmK/r23xvs8oMShBljA9teY2/If/PKNatS6/hNXZM6S7VFPVD0HY37rXCUgOyzKOmWQYSlhfDbJtxle+iH3qO5QwrUw4yYRBX6LpGlUtu5Wkitd4jsAVfDWrIDaf7DU8JP2uA/RHS2jT25etdLufsrSEKAO3j0YvBNFiLPwQthU8NCYk0ihGVZlzrokpCh437Nqx1ultLRm+11mP+zu65kz0sK07A== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BY5PR12MB3683.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(39860400002)(396003)(366004)(376002)(136003)(346002)(230922051799003)(451199024)(1800799012)(186009)(64100799003)(6512007)(26005)(2616005)(53546011)(6486002)(478600001)(6506007)(6666004)(83380400001)(2906002)(30864003)(44832011)(5660300002)(41300700001)(66476007)(66556008)(66946007)(4326008)(8676002)(8936002)(316002)(6916009)(38100700002)(31696002)(86362001)(36756003)(66899024)(31686004)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cU9iZDRiY0pXV2tGZW9UVW8wSG9ra2tLbmhCNk5XVkx4RHRXbVhjeGJ0c0dS?= =?utf-8?B?ako3NW1pRlpRNTRwUllqZDlhM3hvdmxiSmhkVUxUMDJISVY2clpscTZBUk5n?= =?utf-8?B?OUh1dkVHWG5PdU5WeGRDNFh6WTUxcno2alFjSXlwUXRyRzcrVllPUnl1TWk1?= =?utf-8?B?YVpmbzVQYkU2OTRnZWVpV1huQXpQZmUzYXBoTS9IcnFtZkFyWVIrTmJ5LzRw?= =?utf-8?B?VlIreVJ4WTIvOHNsbTRjQm55WjdmTlV6bzhBNWVjY0RjcVliS2Q0NjVYRjdo?= =?utf-8?B?Um53MWZQZVg5eUtpbjRyOTN1eVR0Q1BBVFc5SGgzait3NFhBVzgzOUxvaEV4?= =?utf-8?B?cmNpN3dtcmwzK2FXVjFmNkFaNHpYMGlIam5mQ2hsdTVVMFNMRkRFOHJFTWRN?= =?utf-8?B?N0xqSXBnK2w4dCtzTnZ3WTlMUnhmQ1Z0K25PQlc5YzI3RzlpWFY1d1FrT2Vq?= =?utf-8?B?RVF5UE8rTWpXZS9US2tIbjJJYjVIZitYVmkxWjNYTWhQNHAzcVRNUHBhZnc0?= =?utf-8?B?OVZRV1lWRDdXblF2ckhJZkdYVWw4YVErZ05uK216R25TOExPS0cwOVFoengx?= =?utf-8?B?ejRFQzUxaGJVOTZxMTg0TG1aL0p3ZHlzWnE4ZzNXTURDYTN6bE9Pa1NjcEhl?= =?utf-8?B?Q2gwbDZoY3dkb3Z3d2hDaklQbUlmazJlejJZeXlhRW5UaGorK05SWG1Lbnp2?= =?utf-8?B?aUU5WHA5M2FER2k2U0NHbjJlMktZUlpCdStyWjFPaDBQMkFPdjY4djdxalph?= =?utf-8?B?K3lML0cyaWsxVldRUE03a2toSjdUeVVKREkrRHJML2lKRmFSbDB6Zk91cEw2?= =?utf-8?B?NDJFcDBXRUlBZmhJT3ZiN0UrbnZLR3V2eGk3Zmo4Yk1pbEVlRGpZNzZLMXR6?= =?utf-8?B?RGJRMmVmS1Rjb0R3YURSSXVUQThjSk5IV1puK1VYajAwWTl5Uy9PUGRTYjRU?= =?utf-8?B?T2JyZWNwVXpWTUIvckxiSStuZExYNlI4cWV6aFMxV3dtV2FNZVV5ck1HQUJZ?= =?utf-8?B?TkZFblcrdnNRRUZjWk9nd0RPbU13TjFzZ3gzRUpPYy9hY2FXc3N0NHNxUGYr?= =?utf-8?B?Rks3V05NZitwRzdkQUtDQldpUU5NN2pyWHhBbjg0MG53SFNzQUZDN21wL0lM?= =?utf-8?B?dmVXSTVSTmV4MnNzTzVVaWhmNVhqajJ6NU1MRkFOU2FKOW8xSWYwbUkwTmNS?= =?utf-8?B?dUIrbGxOR2ZtMkxKd0RZWHQ3T2dWQm81QVJITHY5UzNYYStJUldzanU1RHJB?= =?utf-8?B?VXZjUEZ4cFVySWs5cEJhZDNmdlZwM3RpeUVFRlFmbDdXb1A1aTUzOVRyRmFt?= =?utf-8?B?blFNWTdxNU1YaG9kaHRzQWJsS0R6Y1IvQ29US01aR1FLdFFROE5ISlRJdVVX?= =?utf-8?B?MzZ1UU9Ud0o5WXI5Q2hBd2VEaFd5d1I1bTZzOWIzZGJLcWtlVmlwdmlvRENR?= =?utf-8?B?dGJNSXdoLzhSc0o4VEJ0N08rTklGQm9XV1BsMi9ROFg3UTB1blJpc0QxYXNB?= =?utf-8?B?UWNHNER0SlpxWTNzZDl6ZFh3Y1RuRDFnOUttNUlKNXJVdHZlK0YvdVg3MWFq?= =?utf-8?B?ck9MTGNaQ2RZY3A0Rm5hNGdtTCtrZEJHZGlaOG1sNk00QzBJck9qWWFBb1Rh?= =?utf-8?B?RWpNQVg1TmI0c1NkRUpCL244OElteWZESzRIRG43NWp2M3lNNFd4OUhyenNl?= =?utf-8?B?anpFaGYySDY3VWNwRWNsaW5Naks4c1RPaW9nT2RxenN0bjg3S2VhcSsxa0wr?= =?utf-8?B?enNaUFRKclBmOTBSVHhkZjZaK003cWxGYlUxazVWVU5ZWU9yZTA3a29VRlVC?= =?utf-8?B?QUt3c2JsRWh2T2NvcTk2UTR5SE1Cajh6elpYWDdaMDRHM1BoMERUMVR0OFh2?= =?utf-8?B?eGEyb3RPbnE4OXVqaTVnakNOV3loL3I4Y3I0clJiTktiSnhZdzZXTm8vZyt4?= =?utf-8?B?d2NRVXFRT0JsQ0kzV2t3Q1NaczFXclVwS0FjaW9PM1c2Skh5Q2M3ekZmYWlT?= =?utf-8?B?ZGkxeU1zWTlDODgxTTZObnBNRzFWUVpPWENnbkhHV0kzUTVPd2Q1Qi9tT3VY?= =?utf-8?B?bFRHSWdiV25uSWVrY2t4TjZhZzhXZ25kei9jRWVXTmxUUXB5RmtyTGx2YUN0?= =?utf-8?Q?V3UYjfF/nAPhVDqjBIi+xNJSl?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: a9dc855e-9922-464a-38df-08dbf8078ee0 X-MS-Exchange-CrossTenant-AuthSource: BY5PR12MB3683.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Dec 2023 16:05:55.0178 (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: 9zFopFNSf0k0zm7meYrdCUc4/AtFeXGu7T9PhxW8EahDoaqOs/3SRdiwnAiBPp/a X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB4224 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231208_080606_144198_DBA4A71C X-CRM114-Status: GOOD ( 31.47 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Ck9uIDEyLzgvMjMgOTo1MSBBTSwgTWF0aGlldSBQb2lyaWVyIHdyb3RlOgo+IE9uIFdlZCwgRGVj IDA2LCAyMDIzIGF0IDEyOjA2OjQ1UE0gLTA2MDAsIFRhbm1heSBTaGFoIHdyb3RlOgo+ID4gCj4g PiBPbiAxMi82LzIzIDk6NDMgQU0sIE1hdGhpZXUgUG9pcmllciB3cm90ZToKPiA+ID4gT24gRnJp LCAxIERlYyAyMDIzIGF0IDExOjEwLCBUYW5tYXkgU2hhaCA8dGFubWF5LnNoYWhAYW1kLmNvbT4g d3JvdGU6Cj4gPiA+ID4KPiA+ID4gPgo+ID4gPiA+IE9uIDExLzI5LzIzIDExOjEwIEFNLCBNYXRo aWV1IFBvaXJpZXIgd3JvdGU6Cj4gPiA+ID4gPiBPbiBNb24sIE5vdiAyNywgMjAyMyBhdCAxMDoz MzowNUFNIC0wNjAwLCBUYW5tYXkgU2hhaCB3cm90ZToKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4g T24gMTEvMjMvMjMgMTI6MTEgUE0sIE1hdGhpZXUgUG9pcmllciB3cm90ZToKPiA+ID4gPiA+ID4g PiBPbiBXZWQsIE5vdiAyMiwgMjAyMyBhdCAwMzowMDozNlBNIC0wNjAwLCBUYW5tYXkgU2hhaCB3 cm90ZToKPiA+ID4gPiA+ID4gPiA+IEhpIE1hdGhpZXUsCj4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ ID4gPiA+ID4gUGxlYXNlIGZpbmQgbXkgY29tbWVudHMgYmVsb3cuCj4gPiA+ID4gPiA+ID4gPgo+ ID4gPiA+ID4gPiA+ID4gT24gMTEvMjEvMjMgNDo1OSBQTSwgTWF0aGlldSBQb2lyaWVyIHdyb3Rl Ogo+ID4gPiA+ID4gPiA+ID4gPiBIaSwKPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ ID4gT24gRnJpLCBOb3YgMTcsIDIwMjMgYXQgMDk6NDI6MzdBTSAtMDgwMCwgVGFubWF5IFNoYWgg d3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+ID4gVXNlIFRDTSBwbSBkb21haW5zIGV4dHJhY3RlZCBm cm9tIGRldmljZS10cmVlCj4gPiA+ID4gPiA+ID4gPiA+ID4gdG8gcG93ZXIgb24vb2ZmIFRDTSB1 c2luZyBnZW5lcmFsIHBtIGRvbWFpbiBmcmFtZXdvcmsuCj4gPiA+ID4gPiA+ID4gPiA+ID4KPiA+ ID4gPiA+ID4gPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBUYW5tYXkgU2hhaCA8dGFubWF5LnNoYWhA YW1kLmNvbT4KPiA+ID4gPiA+ID4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4g PiA+ID4gPiA+ID4gPiA+IENoYW5nZXMgaW4gdjc6Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAtICVz L3BtX2RldjEvcG1fZGV2X2NvcmUwL3IKPiA+ID4gPiA+ID4gPiA+ID4gPiAgIC0gJXMvcG1fZGV2 X2xpbmsxL3BtX2Rldl9jb3JlMF9saW5rL3IKPiA+ID4gPiA+ID4gPiA+ID4gPiAgIC0gJXMvcG1f ZGV2Mi9wbV9kZXZfY29yZTEvcgo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgLSAlcy9wbV9kZXZfbGlu azIvcG1fZGV2X2NvcmUxX2xpbmsvcgo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgLSByZW1vdmUgcG1f ZG9tYWluX2lkIGNoZWNrIHRvIG1vdmUgbmV4dCBwYXRjaAo+ID4gPiA+ID4gPiA+ID4gPiA+ICAg LSBhZGQgY29tbWVudCBhYm91dCBob3cgMXN0IGVudHJ5IGluIHBtIGRvbWFpbiBsaXN0IGlzIHVz ZWQKPiA+ID4gPiA+ID4gPiA+ID4gPiAgIC0gZml4IGxvb3Agd2hlbiBqdW1wIHRvIGZhaWxfYWRk X3BtX2RvbWFpbnMgbG9vcAo+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+ID4g IGRyaXZlcnMvcmVtb3RlcHJvYy94bG54X3I1X3JlbW90ZXByb2MuYyB8IDIxNSArKysrKysrKysr KysrKysrKysrKysrKy0KPiA+ID4gPiA+ID4gPiA+ID4gPiAgMSBmaWxlIGNoYW5nZWQsIDIxMiBp bnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQo+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4g PiA+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy94bG54X3I1X3JlbW90 ZXByb2MuYyBiL2RyaXZlcnMvcmVtb3RlcHJvYy94bG54X3I1X3JlbW90ZXByb2MuYwo+ID4gPiA+ ID4gPiA+ID4gPiA+IGluZGV4IDQzOTVlZGVhOWE2NC4uMjJiY2NjNTA3NWEwIDEwMDY0NAo+ID4g PiA+ID4gPiA+ID4gPiA+IC0tLSBhL2RyaXZlcnMvcmVtb3RlcHJvYy94bG54X3I1X3JlbW90ZXBy b2MuYwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy94bG54X3I1 X3JlbW90ZXByb2MuYwo+ID4gPiA+ID4gPiA+ID4gPiA+IEBAIC0xNiw2ICsxNiw3IEBACj4gPiA+ ID4gPiA+ID4gPiA+ID4gICNpbmNsdWRlIDxsaW51eC9vZl9yZXNlcnZlZF9tZW0uaD4KPiA+ID4g PiA+ID4gPiA+ID4gPiAgI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ID4gPiA+ ID4gPiA+ID4gPiA+ICAjaW5jbHVkZSA8bGludXgvcmVtb3RlcHJvYy5oPgo+ID4gPiA+ID4gPiA+ ID4gPiA+ICsjaW5jbHVkZSA8bGludXgvcG1fZG9tYWluLmg+Cj4gPiA+ID4gPiA+ID4gPiA+ID4K PiA+ID4gPiA+ID4gPiA+ID4gPiAgI2luY2x1ZGUgInJlbW90ZXByb2NfaW50ZXJuYWwuaCIKPiA+ ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+IEBAIC0xMDIsNiArMTAzLDEyIEBA IHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWVtX2JhbmtfZGF0YSB6eW5xbXBfdGNtX2JhbmtzX2xvY2tz dGVwW10gPSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAqIEBycHJvYzogcnByb2MgaGFuZGxlCj4g PiA+ID4gPiA+ID4gPiA+ID4gICAqIEBwbV9kb21haW5faWQ6IFJQVSBDUFUgcG93ZXIgZG9tYWlu IGlkCj4gPiA+ID4gPiA+ID4gPiA+ID4gICAqIEBpcGk6IHBvaW50ZXIgdG8gbWFpbGJveCBpbmZv cm1hdGlvbgo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgKiBAbnVtX3BtX2RldjogbnVtYmVyIG9mIHRj bSBwbSBkb21haW4gZGV2aWNlcyBmb3IgdGhpcyBjb3JlCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAq IEBwbV9kZXZfY29yZTA6IHBtIGRvbWFpbiB2aXJ0dWFsIGRldmljZXMgZm9yIHBvd2VyIGRvbWFp biBmcmFtZXdvcmsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICogQHBtX2Rldl9jb3JlMF9saW5rOiBw bSBkb21haW4gZGV2aWNlIGxpbmtzIGFmdGVyIHJlZ2lzdHJhdGlvbgo+ID4gPiA+ID4gPiA+ID4g PiA+ICsgKiBAcG1fZGV2X2NvcmUxOiB1c2VkIG9ubHkgaW4gbG9ja3N0ZXAgbW9kZS4gc2Vjb25k IGNvcmUncyBwbSBkb21haW4gdmlydHVhbCBkZXZpY2VzCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAq IEBwbV9kZXZfY29yZTFfbGluazogdXNlZCBvbmx5IGluIGxvY2tzdGVwIG1vZGUuIHNlY29uZCBj b3JlJ3MgcG0gZGV2aWNlIGxpbmtzIGFmdGVyCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAqIHJlZ2lz dHJhdGlvbgo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgKi8KPiA+ID4gPiA+ID4gPiA+ID4gPiAgc3Ry dWN0IHp5bnFtcF9yNV9jb3JlIHsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgc3RydWN0IGRldmlj ZSAqZGV2Owo+ID4gPiA+ID4gPiA+ID4gPiA+IEBAIC0xMTEsNiArMTE4LDExIEBAIHN0cnVjdCB6 eW5xbXBfcjVfY29yZSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgIHN0cnVjdCBycHJvYyAqcnBy b2M7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgIHUzMiBwbV9kb21haW5faWQ7Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gICAgIHN0cnVjdCBtYm94X2luZm8gKmlwaTsKPiA+ID4gPiA+ID4gPiA+ID4gPiAr ICAgaW50IG51bV9wbV9kZXY7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIHN0cnVjdCBkZXZpY2Ug KipwbV9kZXZfY29yZTA7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIHN0cnVjdCBkZXZpY2VfbGlu ayAqKnBtX2Rldl9jb3JlMF9saW5rOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICBzdHJ1Y3QgZGV2 aWNlICoqcG1fZGV2X2NvcmUxOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICBzdHJ1Y3QgZGV2aWNl X2xpbmsgKipwbV9kZXZfY29yZTFfbGluazsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgfTsKPiA+ID4g PiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+ICAvKioKPiA+ID4gPiA+ID4gPiA+ID4g PiBAQCAtNjUxLDcgKzY2Myw4IEBAIHN0YXRpYyBpbnQgYWRkX3RjbV9jYXJ2ZW91dF9sb2Nrc3Rl cF9tb2RlKHN0cnVjdCBycHJvYyAqcnByb2MpCj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaWU5RTVBfUE1fQ0FQQUJJTElUWV9BQ0NF U1MsIDAsCj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBaWU5RTVBfUE1fUkVRVUVTVF9BQ0tfQkxPQ0tJTkcpOwo+ID4gPiA+ID4gPiA+ ID4gPiA+ICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLSAg ICAgICAgICAgICAgICAgICBkZXZfZXJyKGRldiwgImZhaWxlZCB0byB0dXJuIG9uIFRDTSAweCV4 IiwgcG1fZG9tYWluX2lkKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAg IGRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHR1cm4gb24gVENNIDB4JXgiLAo+ID4gPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBwbV9kb21haW5faWQpOwo+ID4gPiA+ ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiBTcHVyaW91cyBjaGFuZ2UsIHlvdSBzaG91bGQg aGF2ZSBjYXVnaHQgdGhhdC4KPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiBBY2ssIG5l ZWQgdG8gb2JzZXJ2ZSBjaGFuZ2VzIG1vcmUgY2xvc2VseSBiZWZvcmUgc2VuZGluZyB0aGVtLgo+ ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAg ICAgICAgICAgICAgICAgIGdvdG8gcmVsZWFzZV90Y21fbG9ja3N0ZXA7Cj4gPiA+ID4gPiA+ID4g PiA+ID4gICAgICAgICAgICAgfQo+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+ ID4gQEAgLTc1OCw2ICs3NzEsMTg5IEBAIHN0YXRpYyBpbnQgenlucW1wX3I1X3BhcnNlX2Z3KHN0 cnVjdCBycHJvYyAqcnByb2MsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCj4gPiA+ID4gPiA+ ID4gPiA+ID4gICAgIHJldHVybiByZXQ7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gIH0KPiA+ID4gPiA+ ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+ICtzdGF0aWMgdm9pZCB6eW5xbXBfcjVfcmVt b3ZlX3BtX2RvbWFpbnMoc3RydWN0IHJwcm9jICpycHJvYykKPiA+ID4gPiA+ID4gPiA+ID4gPiAr ewo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICBzdHJ1Y3QgenlucW1wX3I1X2NvcmUgKnI1X2NvcmUg PSBycHJvYy0+cHJpdjsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgc3RydWN0IGRldmljZSAqZGV2 ID0gcjVfY29yZS0+ZGV2Owo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICBzdHJ1Y3QgenlucW1wX3I1 X2NsdXN0ZXIgKmNsdXN0ZXI7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIGludCBpOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgY2x1c3RlciA9IHBsYXRmb3Jt X2dldF9kcnZkYXRhKHRvX3BsYXRmb3JtX2RldmljZShkZXYtPnBhcmVudCkpOwo+ID4gPiA+ID4g PiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgZm9yIChpID0gMTsgaSA8IHI1X2Nv cmUtPm51bV9wbV9kZXY7IGkrKykgewo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgIGRl dmljZV9saW5rX2RlbChyNV9jb3JlLT5wbV9kZXZfY29yZTBfbGlua1tpXSk7Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICAgICAgZGV2X3BtX2RvbWFpbl9kZXRhY2gocjVfY29yZS0+cG1fZGV2 X2NvcmUwW2ldLCBmYWxzZSk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIH0KPiA+ID4gPiA+ID4g PiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIGtmcmVlKHI1X2NvcmUtPnBtX2Rldl9j b3JlMCk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIHI1X2NvcmUtPnBtX2Rldl9jb3JlMCA9IE5V TEw7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIGtmcmVlKHI1X2NvcmUtPnBtX2Rldl9jb3JlMF9s aW5rKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgcjVfY29yZS0+cG1fZGV2X2NvcmUwX2xpbmsg PSBOVUxMOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgaWYg KGNsdXN0ZXItPm1vZGUgPT0gU1BMSVRfTU9ERSkgewo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgICAgIHI1X2NvcmUtPm51bV9wbV9kZXYgPSAwOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgICAgIHJldHVybjsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgfQo+ID4gPiA+ID4gPiA+ID4g PiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgZm9yIChpID0gMTsgaSA8IHI1X2NvcmUtPm51 bV9wbV9kZXY7IGkrKykgewo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgIGRldmljZV9s aW5rX2RlbChyNV9jb3JlLT5wbV9kZXZfY29yZTFfbGlua1tpXSk7Cj4gPiA+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICAgICAgZGV2X3BtX2RvbWFpbl9kZXRhY2gocjVfY29yZS0+cG1fZGV2X2NvcmUx W2ldLCBmYWxzZSk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIH0KPiA+ID4gPiA+ID4gPiA+ID4g PiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIGtmcmVlKHI1X2NvcmUtPnBtX2Rldl9jb3JlMSk7 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIHI1X2NvcmUtPnBtX2Rldl9jb3JlMSA9IE5VTEw7Cj4g PiA+ID4gPiA+ID4gPiA+ID4gKyAgIGtmcmVlKHI1X2NvcmUtPnBtX2Rldl9jb3JlMV9saW5rKTsK PiA+ID4gPiA+ID4gPiA+ID4gPiArICAgcjVfY29yZS0+cG1fZGV2X2NvcmUxX2xpbmsgPSBOVUxM Owo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICByNV9jb3JlLT5udW1fcG1fZGV2ID0gMDsKPiA+ID4g PiA+ID4gPiA+ID4gPiArfQo+ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4g PiArc3RhdGljIGludCB6eW5xbXBfcjVfYWRkX3BtX2RvbWFpbnMoc3RydWN0IHJwcm9jICpycHJv YykKPiA+ID4gPiA+ID4gPiA+ID4gPiArewo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICBzdHJ1Y3Qg enlucW1wX3I1X2NvcmUgKnI1X2NvcmUgPSBycHJvYy0+cHJpdjsKPiA+ID4gPiA+ID4gPiA+ID4g PiArICAgc3RydWN0IGRldmljZSAqZGV2ID0gcjVfY29yZS0+ZGV2LCAqZGV2MjsKPiA+ID4gPiA+ ID4gPiA+ID4gPiArICAgc3RydWN0IHp5bnFtcF9yNV9jbHVzdGVyICpjbHVzdGVyOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2Owo+ID4gPiA+ID4g PiA+ID4gPiA+ICsgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsgICBpbnQgaSwgaiwgbnVtX3BtX2RldiwgcmV0Owo+ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ ID4gPiA+ID4gPiA+ID4gPiArICAgY2x1c3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVu dCk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAvKiBnZXQg bnVtYmVyIG9mIHBvd2VyLWRvbWFpbnMgKi8KPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgbnVtX3Bt X2RldiA9IG9mX2NvdW50X3BoYW5kbGVfd2l0aF9hcmdzKHI1X2NvcmUtPm5wLCAicG93ZXItZG9t YWlucyIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAiI3Bvd2VyLWRvbWFpbi1jZWxscyIpOwo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgaWYgKG51bV9wbV9kZXYgPD0gMCkKPiA+ID4gPiA+ ID4gPiA+ID4gPiArICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiA+ID4gPiA+ID4gPiA+ID4g PiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIHI1X2NvcmUtPnBtX2Rldl9jb3JlMCA9IGtjYWxs b2MobnVtX3BtX2RldiwKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGRldmljZSAqKSwKPiA+ID4gPiA+ID4gPiA+ID4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKTsKPiA+ID4g PiA+ID4gPiA+ID4gPiArICAgaWYgKCFyNV9jb3JlLT5wbV9kZXZfY29yZTApCj4gPiA+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICAgICAgcmV0ID0gLUVOT01FTTsKPiA+ID4gPiA+ID4gPiA+ID4gPiAr Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIHI1X2NvcmUtPnBtX2Rldl9jb3JlMF9saW5rID0ga2Nh bGxvYyhudW1fcG1fZGV2LAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBkZXZpY2VfbGluayAqKSwKPiA+ID4g PiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdG UF9LRVJORUwpOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICBpZiAoIXI1X2NvcmUtPnBtX2Rldl9j b3JlMF9saW5rKSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAga2ZyZWUocjVfY29y ZS0+cG1fZGV2X2NvcmUwKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICByNV9jb3Jl LT5wbV9kZXZfY29yZTAgPSBOVUxMOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgIHJl dHVybiAtRU5PTUVNOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICByNV9jb3JlLT5udW1fcG1fZGV2ID0gbnVtX3Bt X2RldjsKPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIC8qCj4g PiA+ID4gPiA+ID4gPiA+ID4gKyAgICAqIHN0YXJ0IGZyb20gMm5kIGVudHJ5IGluIHBvd2VyLWRv bWFpbnMgcHJvcGVydHkgbGlzdCBhcwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgKiBmb3Igenlu cW1wIHdlIG9ubHkgYWRkIFRDTSBwb3dlciBkb21haW5zIGFuZCBub3QgY29yZSdzIHBvd2VyIGRv bWFpbi4KPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICogMXN0IGVudHJ5IGlzIHVzZWQgdG8gY29u ZmlndXJlIHI1IG9wZXJhdGlvbiBtb2RlLgo+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ ID4gPiBZb3UgYXJlIHN0aWxsIG5vdCBzYXlpbmcgX3doZXJlXyAtPnBtX2Rldl9jb3JlMFswXSBn ZXRzIGFkZGVkLgo+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+IFNvLCBwbV9kZXZfY29y ZTBbMF0gaXNuJ3QgcmVhbGx5IG5lZWQgdG8gYmUgYWRkZWQgZm9yIHp5bnFtcCBwbGF0Zm9ybSwg YXMgZmlybXdhcmUgc3RhcnRzIGl0IHdpdGggY2FsbCwKPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4g PiA+ID4gPiB6eW5xbXBfcG1fcmVxdWVzdF93YWtlIGR1cmluZyBycHJvY19zdGFydCBjYWxsYmFj ay4gSSB3aWxsIGRvY3VtZW50IHRoaXMgaW4gbmV4dAo+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ ID4gPgo+ID4gPiA+ID4gPiA+IFRoYXQgaXMgZXhhY3RseSB3aGF0IEkgYW0gbG9va2luZyBmb3Iu ICBUaGF0IHdheSBwZW9wbGUgZG9uJ3QgaGF2ZSB0byBnbyB0aHJvdWdoCj4gPiA+ID4gPiA+ID4g dGhlIGVudGlyZSBkcml2ZXIgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgd2hhdCBpcyBoYXBwZW5pbmcg d2l0aCBwbV9kZXZfY29yZVswXS4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IEknbSBhbHNv IG5vdCBzdXJlIGFib3V0IHRoZSBwb3dlci11cCBvcmRlci4gIExvZ2ljYWxseSB0aGUgVENNcyBz aG91bGQgYmUKPiA+ID4gPiA+ID4gPiBwb3dlcmVkIHVwIGJlZm9yZSB0aGUgUjUgaW4gb3JkZXIg dG8gcHV0IGNvZGUgaW4gdGhlbS4gIFRoZSBSNXMgYXJlIHBvd2VyZWQgaW4KPiA+ID4gPiA+ID4g PiB6eW5xbXBfcjVfcnByb2Nfc3RhcnQoKSBidXQgSSBhbSB1bmNsZWFyIGFzIHRvIHdoZXJlIGlu IHRoZSBib290IHNlcXVlbmNlIHRoZQo+ID4gPiA+ID4gPiA+IFRDTXMgYXJlIHBvd2VyZWQgLSBj YW4geW91IGV4cGFuZCBvbiB0aGF0Pwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4g PiBTdXJlLiBGb2xsb3dpbmcgaXMgY2FsbCBzZXF1ZWNlCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ IHp5bnFtcF9yNV9ycHJvY19wcmVwYXJlCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IHp5bnFtcF9y NV9hZGRfcG1fZG9tYWlucyAtPiBIZXJlIFRDTSBpcyBwb3dlcmVkIG9uIHdoZW4gZGV2aWNlX2xp bmtfYWRkIGlzIGNhbGxlZCB2aWEgenlucW1wLXBtLWRvbWFpbnMuYyBkcml2ZXIuCj4gPiA+ID4g PiA+Cj4gPiA+ID4gPiA+IC4gLiAuCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IHp5bnFtcF9yNV9y cHJvY19zdGFydCAtPiBsb2FkIGZpcm13YXJlIGFuZCBTdGFydHMgUlBVCj4gPiA+ID4gPiA+Cj4g PiA+ID4gPiA+IFNvIHdoYXQgeW91IG1lbnRpb25lZCBpcyBjb3JyZWN0LCBUQ00gaXMgYmVpbmcg cG93ZXJkLW9uIGJlZm9yZSB3ZSBsb2FkIGZpcm13YXJlIGFuZCBzdGFydCBSUFUuCj4gPiA+ID4g PiA+Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+IHJldmlzaW9uLiBG b3IgbmV3IHBsYXRmb3JtcyBwbV9kZXZfY29yZTBbMF0gd2lsbCBiZSBhZGRlZCBpbiBmdXR1cmUu Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBOb3cgSSdtIHJlYWxseSBjb25mdXNlZCAtIHdo YXQgZG8geW91IG1lYW4gYnkgInBtX2Rldl9jb3JlMFswXSB3aWxsIGJlIGFkZGVkIGluCj4gPiA+ ID4gPiA+ID4gZnV0dXJlIj8KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gWnlu cU1QIHBsYXRmb3JtIGhhcyBwbGF0Zm9ybSBtYW5hZ2VtZW50IGZpcm13YXJlIHJ1bm5pbmcgb24g bWljcm9ibGF6ZS4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gVGhpcyBmaXJtd2FyZSBkZXNpZ24g ZG9lcyBub3QgZXhwZWN0IFI1IHBtIGRvbWFpbnMgdG8gYmUgcmVxdWVzdGVkIGV4cGxpY2l0bHku Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IFRoaXMgbWVhbnMsIGR1cmluZyB6eW5xbXBfcjVfcnBy b2Nfc3RhcnQgd2hlbiAienlucW1wX3BtX3JlcXVlc3Rfd2FrZSIgaXMgY2FsbGVkLAo+ID4gPiA+ ID4gPgo+ID4gPiA+ID4gPiBmaXJtd2FyZSBwb3dlcnMgb24gUjUuIFNvLCBwbV9kZXZfY29yZVsw XSBpcyBub3QgcmVhbGx5IHVzZWQgZm9yIFp5bnFNUC4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4g SG93ZXZlciwgdGhpcyBkZXNpZ24gd2FzIGNoYW5nZWQgZm9yIG5ldyBwbGF0Zm9ybXMgaS5lLiAi dmVyc2FsIiBhbmQgb253YXJkcy4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gRmlybXdhcmUgb2Yg bmV3IHBsYXRmb3JtIGV4cGVjdHMgcG0gZG9tYWlucyB0byBiZSByZXF1ZXN0ZWQgZXhwbGljaXRs eSBmb3IgUjUgY29yZXMgYmVmb3JlCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IHdha2luZyB0aGVt IHVwLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBUaGF0IG1lYW5zLCBwbV9kZXZfY29yZVswXSBm b3IgUjUgY29yZXMgb24gbmV3IHBsYXRmb3JtIChWZXJzYWwpIG5lZWRzIHRvIGJlIHVzZWQgc2Ft ZSBhcyBUQ00uCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IFRoZW4sIHdlIHNob3VsZCB3YWtlIGl0 IHVwIG9uIHI1X2NvcmUuCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IFRvIHN1bW1hcml6ZToKPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gRm9yIHp5bnFtcCBvbmx5IGZvbGxvd2luZyBjYWxsIG5lZWRl ZCB0byBzdGFydCBSNToKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4genlucW1wX3BtX3JlcXVlc3Rf d2FrZQo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBGb3IgInZlcnNhbCIgYW5kIG9ud2FyZHMgd2Ug bmVlZCB0d28gY2FsbHMgdG8gc3RhcnQgUjU6Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ICJkZXZp Y2VfbGlua19hZGQiIGFuZCB6eW5xbXBfcG1fcmVxdWVzdF93YWtlCj4gPiA+ID4gPiA+Cj4gPiA+ ID4gPiA+IFNvLCBpbiBmdXR1cmUgcG1fY29yZV9kZXZbMF0gd2lsbCBiZSB1c2VkLgo+ID4gPiA+ ID4gPgo+ID4gPiA+ID4KPiA+ID4gPiA+IFRoYW5rcyBmb3IgdGhlIGNsYXJpZmljYXRpb24gb24g Ym90aCBmcm9udC4gIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB3ZSBhcmUKPiA+ID4gPiA+IGtl ZXBpbmcgUjUgcG93ZXIgZG9tYWluIGluZm9ybWF0aW9uIGluIHR3byBkaWZmZXJlbnQgcGxhY2Vz LCBpLmUKPiA+ID4gPiA+IHp5bnFtcF9yNV9jb3JlOjpwbV9kb21haW5faWQgYW5kIHp5bnFtcF9y NV9jb3JlOjpwbV9kZXZfY29yZTBbMF0uCj4gPiA+ID4gPgo+ID4gPiA+ID4gUGxlYXNlIHNlZSBp ZiB5b3UgY2FuIHJldHJlaXZlIHRoZSBwb3dlciBkb21haW4gSUQgZnJvbQo+ID4gPiA+ID4genlu cW1wX3I1X2NvcmU6OnBtX2Rldl9jb3JlMFswXS4gIFRoYXQgd2F5IHlvdSBjYW4gZ2V0IHRoZSBw b3dlciBkb21haW4gSUQgd2hlbgo+ID4gPiA+ID4gY2FsbGluZyB6eW5xbXBfcG1fcmVxdWVzdF93 YWtlKCkgYW5kIHp5bnFtcF9wbV9mb3JjZV9wd3Jkd24oKSBhbmQgZ2V0IHJpZCBvZgo+ID4gPiA+ ID4genlucW1wX3I1X2NvcmU6OnBtX2RvbWFpbl9pZC4KPiA+ID4gPgo+ID4gPiA+IEhpIE1hdGhp ZXUsCj4gPiA+ID4KPiA+ID4gPiBJIGxvb2tlZCBpbnRvIHRoaXMuIFByb2JhYmx5IEkgY2FuJ3Qg cmV0cmlldmUgcG1fZG9tYWluX2lkIGZyb20gcG1fZGV2X2NvcmUwWzBdLAo+ID4gPiA+Cj4gPiA+ ID4gSG93ZXZlciwgSSBjYW4gcmV0cmlldmUgaXQgZnJvbSBkZXZpY2UtdHJlZSB3aGVuIGNhbGxp bmcgenlucW1wX3BtX3JlcXVlc3Rfd2FrZQo+ID4gPiA+Cj4gPiA+ID4gYW5kIHp5bnFtcF9wbV9m b3JjZV9wd3Jkd24uCj4gPiA+ID4KPiA+ID4gPiB6eW5xbXBfcjVfY29yZTo6cG1fZG9tYWluX2lk IGlzIGNhY2hpbmcgdGhhdCB2YWx1ZSBkdXJpbmcgcHJvYmUsIGFuZCB1c2UgaXQgZHVyaW5nCj4g PiA+ID4gcmVzdCBvZiB0aGUgZHJpdmVyIGxpZmVjeWNsZS4KPiA+ID4gPgo+ID4gPiA+IEkgYW0g b2theSBlaXRoZXIgd2F5LCAoa2VlcGluZyBpdCBhcyBpdCBpcywgb3IgZ2V0IGl0IGZyb20gZGV2 aWNlLXRyZWUpLiBMZXQgbWUga25vdyB5b3VyCj4gPiA+ID4KPiA+ID4gPiBwcmVmZXJlbmNlLgo+ ID4gPiA+Cj4gPiA+Cj4gPiA+IEh1bW0uLi4gIFRoZW4gSSBzdWdnZXN0IHRvIHNpbXBseSBnZXQg cmlkIG9mIHRoZSBkZXZpY2UgbGlua2luZyB0bwo+ID4gPiBkZWFsIHdpdGggdGhlIFRDTXMnIHBv d2VyIG1hbmFnZW1lbnQuICBGcm9tIHdoZXJlIEkgc3RhbmQgaXQgcHJvdmlkZXMKPiA+ID4gbW9y ZSBjb25mdXNpb24gdGhhbiBiZW5lZml0cywgYW5kIHRoYXQgaXMgd2l0aG91dCBjb25zaWRlcmlu ZyB0aGUKPiA+ID4gZXh0cmEgY29tcGxleGl0eS4KPiA+IAo+ID4gCj4gPiBEbyB5b3UgbWVhbiB0 byBnZXQgcmlkIG9mIHBtX2Rldl9jb3JlMFsxXSwgYW5kIHBtX2Rldl9jb3JlMFsyXSBhcyB3ZWxs ID8KPiA+Cj4KPiBZZXMKPgo+ID4gSWYgeWVzLCBpdHMgcHJlZmVycmVkIHRvIHVzZSBwbV9kb21h aW4gZnJhbWV3b3JrIHRvIHBvd2VyLW9uL29mZiBUQ00uCj4gPiAKPgo+IFRoYXQgaXMgd2hlbiB0 aGUgcG0gcnVudGltZSBzdWJzeXN0ZW0gaXMgdXNlZCBleHRlbnNpdmVseSBidXQgaXQgaXNuJ3QK PiB0aGUgY2FzZSBoZXJlLiAgSW4gdGhpcyBzY2VuYXJpbyB1c2luZyBkZXZpY2UgbGlua2luZyBp cyBhZGRpbmcgYSBsb3Qgb2YKPiBjb21wbGV4aXR5IGZvciBzb21ldGhpbmcgdGhhdCBjb3VsZCBi ZSBkb25lIGluIGEgc2luZ2xlIGxpbmUgb2YgY29kZS4gICAKCk9rIGZhaXIgcG9pbnQsIHBsZWFz ZSBnaXZlIG1lIHNvbWV0aW1lIHRvIGV4cGxvcmUgbW9yZS4KCkkgZG9uJ3QgbWluZCBnZXR0aW5n IHJpZCBvZiBwbSBkb21haW4gZnJhbWV3b3JrIHVzYWdlLiBGb3Igc29tZSByZWFzb24sIGlmIHdl IG11c3QgdXNlIGl0LAoKd2UgY2FuIGFsd2F5cyBpbnRyb2R1Y2UgaXQgbGF0ZXIuCgpJIGp1c3Qg d2FudCB0byBtYWtlIHN1cmUgaWYgd2UgZG9uJ3QgdXNlIHBtIGRvbWFpbnMgZnJhbWV3b3JrLCB0 aGVuIHJlbW90ZXByb2Mgd29ya3MgZm9yCgpmdXR1cmUgcGxhdGZvcm1zIGFzIHdlbGwuIEkgd2ls bCBnZXQgYmFjayB0byB5b3UgYXMgbmVlZCB0byBkbyBtb3JlIHRlc3RpbmcgYWZ0ZXIgcmVtb3Zp bmcgcG0gZG9tYWlucyBmcmFtZXdvcmsuCgpUaGFua3MsCgpUYW5tYXkKCgo+ID4gSWYgd2Ugd2Fu dCB0byBnZXQgcmlkIG9mIHp5bnFtcF9yNV9jb3JlOjpwbV9kb21haW5faWQsIEkgd2lsbCBkbyB3 aGF0J3MgZG9uZSBpbgo+ID4gCj4gPiBfX2dlbnBkX2Rldl9wbV9hdHRhY2ggQVBJIHdoZXJlLCBw bV9kb21haW5faWQgaXMgcmV0cmlldmVkIHVzaW5nIG9mX25vZGUgb2YgcG1fZGV2X2NvcmUwWypd IGRldmljZS4KPiA+IAo+ID4gwqDCoMKgIHJldCA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdz KGRldi0+b2Zfbm9kZSwgInBvd2VyLWRvbWFpbnMiLAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICIjcG93ZXItZG9tYWluLWNlbGxzIiwg aW5kZXgsICZwZF9hcmdzKTsKPgo+IFRoYXQgaXMgd2hhdCBJIGFza2VkIGZvciBpbiBteSBwcmV2 aW91cyBlbWFpbCwgaS5lIHVzZSAtPnBtX2Rldl9jb3JlMFswXSB0bwo+IHJldHJpZXZlIHRoZSBk b21haW4gSUQuCj4KPiA+IAo+ID4gSG93ZXZlciwgSXRzIHByZWZlcnJlZCB0byB1c2UgcG1fZG9t YWluIGZyYW1ld29yayB3aGVuIHBvd2VyLWRvbWFpbnMgYXJlIGF2YWlsYWJsZSBpbiBkZXZpY2Ut dHJlZS4KPiA+IAo+ID4gTGV0wqAgbWUga25vdy4KPiA+IAo+ID4gVGhhbmtzLAo+ID4gCj4gPiBU YW5tYXkKPiA+IAo+ID4gCj4gPiA+ID4gVGhhbmtzLAo+ID4gPiA+Cj4gPiA+ID4gVGFubWF5Cj4g PiA+ID4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiBJIGhvcGUg dGhpcyBtZWV0cyBleHBlY3RhdGlvbnMuCj4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4K PiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICovCj4gPiA+ID4gPiA+ ID4gPiA+ID4gKyAgIGZvciAoaSA9IDE7IGkgPCByNV9jb3JlLT5udW1fcG1fZGV2OyBpKyspIHsK PiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICByNV9jb3JlLT5wbV9kZXZfY29yZTBbaV0g PSBkZXZfcG1fZG9tYWluX2F0dGFjaF9ieV9pZChkZXYsIGkpOwo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgICAgIGlmIChJU19FUlJfT1JfTlVMTChyNV9jb3JlLT5wbV9kZXZfY29yZTBbaV0p KSB7Cj4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+IEhlcmUgSVNfRVJSX09SX05V TEwoKSBpcyB1c2VkIHdoaWxlIHR3byBpZiBjb25kaXRpb25zIGZvciBOVUxMIGFuZCBhbiBlcnJv cgo+ID4gPiA+ID4gPiA+ID4gPiBjb2RlIGFyZSB1c2VkIGluIHRoZSBsb29wIGZvciB0aGUgbG9j a3N0ZXAgbW9kZS4gIFBsZWFzZSBwaWNrIG9uZSBoZXVyaXN0aWMgYW5kCj4gPiA+ID4gPiA+ID4g PiA+IHN0aWNrIHdpdGggaXQuICBJIGhhdmUgbm8gcHJlZmVyZW5jZSBvbiB3aGljaCBvbmUuCj4g PiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gT2ssIEkgdGhpbmsgSVNfRVJSX09SX05VTEwg aXMgbW9yZSBjbGVhbmVyLCBJIHdpbGwgYWRkcmVzcyBpdCBpbiBuZXh0IHJldmlzaW9uLgo+ID4g PiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICBkZXZfZGJnKGRldiwgImZhaWxlZCB0byBhdHRh Y2ggcG0gZG9tYWluICVkLCByZXQ9JWxkXG4iLCBpLAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICBQVFJfRVJSKHI1X2NvcmUtPnBtX2Rldl9jb3JlMFtpXSkp Owo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsK PiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbF9hZGRfcG1f ZG9tYWluczsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4g PiA+ID4gKyAgICAgICAgICAgcjVfY29yZS0+cG1fZGV2X2NvcmUwX2xpbmtbaV0gPSBkZXZpY2Vf bGlua19hZGQoZGV2LAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI1X2NvcmUtPnBtX2Rldl9jb3Jl MFtpXSwKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETF9GTEFHX1NUQVRFTEVTUyB8Cj4gPiA+ID4g PiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgRExfRkxBR19SUE1fQUNUSVZFIHwKPiA+ID4gPiA+ID4gPiA+ID4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBETF9GTEFHX1BNX1JVTlRJTUUpOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgIGlm ICghcjVfY29yZS0+cG1fZGV2X2NvcmUwX2xpbmtbaV0pIHsKPiA+ID4gPiA+ID4gPiA+ID4gPiAr ICAgICAgICAgICAgICAgICAgIGRldl9wbV9kb21haW5fZGV0YWNoKHI1X2NvcmUtPnBtX2Rldl9j b3JlMFtpXSwgdHJ1ZSk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICBy NV9jb3JlLT5wbV9kZXZfY29yZTBbaV0gPSBOVUxMOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAg ICAgICAgICAgICAgIGdvdG8gZmFpbF9hZGRfcG1fZG9tYWluczsKPiA+ID4gPiA+ID4gPiA+ID4g PiArICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIH0KPiA+ID4gPiA+ID4gPiA+ ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIGlmIChjbHVzdGVyLT5tb2RlID09IFNQTElU X01PREUpCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgcmV0dXJuIDA7Cj4gPiA+ID4g PiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICByNV9jb3JlLT5wbV9kZXZfY29y ZTEgPSBrY2FsbG9jKG51bV9wbV9kZXYsCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBkZXZpY2UgKiksCj4gPiA+ID4g PiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5F TCk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIGlmICghcjVfY29yZS0+cG1fZGV2X2NvcmUxKSB7 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgcmV0ID0gLUVOT01FTTsKPiA+ID4gPiA+ ID4gPiA+ID4gPiArICAgICAgICAgICBnb3RvIGZhaWxfYWRkX3BtX2RvbWFpbnM7Cj4gPiA+ID4g PiA+ID4gPiA+ID4gKyAgIH0KPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ ID4gKyAgIHI1X2NvcmUtPnBtX2Rldl9jb3JlMV9saW5rID0ga2NhbGxvYyhudW1fcG1fZGV2LAo+ ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc2l6ZW9mKHN0cnVjdCBkZXZpY2VfbGluayAqKSwKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICBpZiAoIXI1X2NvcmUtPnBtX2Rldl9jb3JlMV9saW5rKSB7Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAga2ZyZWUocjVfY29yZS0+cG1fZGV2X2NvcmUxKTsK PiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICByNV9jb3JlLT5wbV9kZXZfY29yZTEgPSBO VUxMOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgIHJldCA9IC1FTk9NRU07Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgZ290byBmYWlsX2FkZF9wbV9kb21haW5zOwo+ID4g PiA+ID4gPiA+ID4gPiA+ICsgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ ID4gPiA+ICsgICAvKiBnZXQgc2Vjb25kIGNvcmUncyBkZXZpY2UgdG8gZGV0YWNoIGl0cyBwb3dl ci1kb21haW5zICovCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIG5wID0gb2ZfZ2V0X25leHRfY2hp bGQoY2x1c3Rlci0+ZGV2LT5vZl9ub2RlLCBvZl9ub2RlX2dldChkZXYtPm9mX25vZGUpKTsKPiA+ ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIHBkZXYgPSBvZl9maW5k X2RldmljZV9ieV9ub2RlKG5wKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgaWYgKCFwZGV2KSB7 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgZGV2X2VycihjbHVzdGVyLT5kZXYsICJj b3JlMSBwbGF0Zm9ybSBkZXZpY2Ugbm90IGF2YWlsYWJsZVxuIik7Cj4gPiA+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICAgICAga2ZyZWUocjVfY29yZS0+cG1fZGV2X2NvcmUxKTsKPiA+ID4gPiA+ID4g PiA+ID4gPiArICAgICAgICAgICBrZnJlZShyNV9jb3JlLT5wbV9kZXZfY29yZTFfbGluayk7Cj4g PiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgcjVfY29yZS0+cG1fZGV2X2NvcmUxID0gTlVM TDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICByNV9jb3JlLT5wbV9kZXZfY29yZTFf bGluayA9IE5VTEw7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgcmV0ID0gLUVJTlZB TDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICBnb3RvIGZhaWxfYWRkX3BtX2RvbWFp bnM7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIH0KPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ ID4gPiA+ID4gPiA+ID4gKyAgIGRldjIgPSAmcGRldi0+ZGV2Owo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgLyogZm9yIHp5bnFtcCB3ZSBvbmx5IGFkZCBUQ00g cG93ZXIgZG9tYWlucyBhbmQgbm90IGNvcmUncyBwb3dlciBkb21haW4gKi8KPiA+ID4gPiA+ID4g PiA+ID4gPiArICAgZm9yIChqID0gMTsgaiA8IHI1X2NvcmUtPm51bV9wbV9kZXY7IGorKykgewo+ ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgIHI1X2NvcmUtPnBtX2Rldl9jb3JlMVtqXSA9 IGRldl9wbV9kb21haW5fYXR0YWNoX2J5X2lkKGRldjIsIGopOwo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgICAgIGlmICghcjVfY29yZS0+cG1fZGV2X2NvcmUxW2pdKSB7Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICBkZXZfZGJnKGRldiwgImNhbid0IGF0dGFjaCB0 byBwbSBkb21haW4gJWRcbiIsIGopOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAg ICAgICAgcmV0ID0gLUVJTlZBTDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAg ICAgIGdvdG8gZmFpbF9hZGRfcG1fZG9tYWluc19sb2Nrc3RlcDsKPiA+ID4gPiA+ID4gPiA+ID4g PiArICAgICAgICAgICB9IGVsc2UgaWYgKElTX0VSUihyNV9jb3JlLT5wbV9kZXZfY29yZTFbal0p KSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICBkZXZfZGJnKGRldiwg ImNhbid0IGF0dGFjaCB0byBwbSBkb21haW4gJWRcbiIsIGopOwo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgICAgICAgICAgICAgcmV0ID0gUFRSX0VSUihyNV9jb3JlLT5wbV9kZXZfY29yZTFb al0pOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX2Fk ZF9wbV9kb21haW5zX2xvY2tzdGVwOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgIH0K PiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgcjVf Y29yZS0+cG1fZGV2X2NvcmUxX2xpbmtbal0gPSBkZXZpY2VfbGlua19hZGQoZGV2LAo+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHI1X2NvcmUtPnBtX2Rldl9jb3JlMVtqXSwKPiA+ID4gPiA+ID4gPiA+ ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBETF9GTEFHX1NUQVRFTEVTUyB8Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRExfRkxB R19SUE1fQUNUSVZFIHwKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETF9GTEFHX1BNX1JVTlRJTUUp Owo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgIGlmICghcjVfY29yZS0+cG1fZGV2X2Nv cmUxX2xpbmtbal0pIHsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgIGRl dl9wbV9kb21haW5fZGV0YWNoKHI1X2NvcmUtPnBtX2Rldl9jb3JlMVtqXSwgdHJ1ZSk7Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICByNV9jb3JlLT5wbV9kZXZfY29yZTFb al0gPSBOVUxMOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgcmV0ID0g LUVOT0RFVjsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgIGdvdG8gZmFp bF9hZGRfcG1fZG9tYWluc19sb2Nrc3RlcDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAg ICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIH0KPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ ID4gPiA+ID4gPiA+ID4gK2ZhaWxfYWRkX3BtX2RvbWFpbnNfbG9ja3N0ZXA6Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gKyAgIHdoaWxlICgtLWogPj0gMCkgewo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgICAgIGRldmljZV9saW5rX2RlbChyNV9jb3JlLT5wbV9kZXZfY29yZTFfbGlua1tqXSk7Cj4g PiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgZGV2X3BtX2RvbWFpbl9kZXRhY2gocjVfY29y ZS0+cG1fZGV2X2NvcmUxW2pdLCB0cnVlKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgfQo+ID4g PiA+ID4gPiA+ID4gPiA+ICsgICBrZnJlZShyNV9jb3JlLT5wbV9kZXZfY29yZTEpOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICByNV9jb3JlLT5wbV9kZXZfY29yZTEgPSBOVUxMOwo+ID4gPiA+ID4g PiA+ID4gPiA+ICsgICBrZnJlZShyNV9jb3JlLT5wbV9kZXZfY29yZTFfbGluayk7Cj4gPiA+ID4g PiA+ID4gPiA+ID4gKyAgIHI1X2NvcmUtPnBtX2Rldl9jb3JlMV9saW5rID0gTlVMTDsKPiA+ID4g PiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gK2ZhaWxfYWRkX3BtX2RvbWFpbnM6 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIHdoaWxlICgtLWkgPj0gMCkgewo+ID4gPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgICAgIGRldmljZV9saW5rX2RlbChyNV9jb3JlLT5wbV9kZXZfY29yZTBf bGlua1tpXSk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgZGV2X3BtX2RvbWFpbl9k ZXRhY2gocjVfY29yZS0+cG1fZGV2X2NvcmUwW2ldLCB0cnVlKTsKPiA+ID4gPiA+ID4gPiA+ID4g PiArICAgfQo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICBrZnJlZShyNV9jb3JlLT5wbV9kZXZfY29y ZTApOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICByNV9jb3JlLT5wbV9kZXZfY29yZTAgPSBOVUxM Owo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICBrZnJlZShyNV9jb3JlLT5wbV9kZXZfY29yZTBfbGlu ayk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgIHI1X2NvcmUtPnBtX2Rldl9jb3JlMF9saW5rID0g TlVMTDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ID4gPiA+IFRoZSBlcnJvciBwYXRoIGlzIG11Y2ggY2xlYW5lciBhbmQgcmVhZGFibGUgbm93Lgo+ ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiBJIHdpbGwgY29udGludWUgdG9tb3Jy b3cuCj4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+IE1hdGhpZXUKPiA+ID4gPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgcmV0dXJuIHJldDsKPiA+ID4gPiA+ID4g PiA+ID4gPiArfQo+ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgLyoq Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAqIHp5bnFtcF9yNV9ycHJvY19wcmVwYXJlKCkKPiA+ID4g PiA+ID4gPiA+ID4gPiAgICogYWRkcyBjYXJ2ZW91dHMgZm9yIFRDTSBiYW5rIGFuZCByZXNlcnZl ZCBtZW1vcnkgcmVnaW9ucwo+ID4gPiA+ID4gPiA+ID4gPiA+IEBAIC03NzAsMTkgKzk2NiwzMCBA QCBzdGF0aWMgaW50IHp5bnFtcF9yNV9ycHJvY19wcmVwYXJlKHN0cnVjdCBycHJvYyAqcnByb2Mp Cj4gPiA+ID4gPiA+ID4gPiA+ID4gIHsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgaW50IHJldDsK PiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICByZXQgPSB6eW5xbXBf cjVfYWRkX3BtX2RvbWFpbnMocnByb2MpOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICBpZiAocmV0 KSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgZGV2X2VycigmcnByb2MtPmRldiwg ImZhaWxlZCB0byBhZGQgcG0gZG9tYWluc1xuIik7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICAgICAgcmV0dXJuIHJldDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgfQo+ID4gPiA+ID4gPiA+ ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgcmV0ID0gYWRkX3RjbV9iYW5rcyhycHJv Yyk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgIGlmIChyZXQpIHsKPiA+ID4gPiA+ID4gPiA+ID4g PiAgICAgICAgICAgICBkZXZfZXJyKCZycHJvYy0+ZGV2LCAiZmFpbGVkIHRvIGdldCBUQ00gYmFu a3MsIGVyciAlZFxuIiwgcmV0KTsKPiA+ID4gPiA+ID4gPiA+ID4gPiAtICAgICAgICAgICByZXR1 cm4gcmV0Owo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgIGdvdG8gZmFpbF9wcmVwYXJl Owo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ ID4gPiA+ID4gPiAgICAgcmV0ID0gYWRkX21lbV9yZWdpb25zX2NhcnZlb3V0KHJwcm9jKTsKPiA+ ID4gPiA+ID4gPiA+ID4gPiAgICAgaWYgKHJldCkgewo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAg ICAgICAgIGRldl9lcnIoJnJwcm9jLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHJlc2VydmUgbWVtIHJl Z2lvbnMgJWRcbiIsIHJldCk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLSAgICAgICAgICAgcmV0dXJu IHJldDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICBnb3RvIGZhaWxfcHJlcGFyZTsK PiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgfQo+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gICAgIHJldHVybiAwOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4g PiA+ID4gPiArZmFpbF9wcmVwYXJlOgo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICB6eW5xbXBfcjVf cmVtb3ZlX3BtX2RvbWFpbnMocnByb2MpOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ ID4gPiA+ID4gPiArICAgcmV0dXJuIHJldDsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgfQo+ID4gPiA+ ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+ID4gIC8qKgo+ID4gPiA+ID4gPiA+ID4gPiA+ IEBAIC04MDEsNiArMTAwOCw4IEBAIHN0YXRpYyBpbnQgenlucW1wX3I1X3Jwcm9jX3VucHJlcGFy ZShzdHJ1Y3QgcnByb2MgKnJwcm9jKQo+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4g PiA+ID4gICAgIHI1X2NvcmUgPSBycHJvYy0+cHJpdjsKPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4g PiA+ID4gPiA+ID4gPiA+ICsgICB6eW5xbXBfcjVfcmVtb3ZlX3BtX2RvbWFpbnMocnByb2MpOwo+ ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgZm9yIChpID0gMDsg aSA8IHI1X2NvcmUtPnRjbV9iYW5rX2NvdW50OyBpKyspIHsKPiA+ID4gPiA+ID4gPiA+ID4gPiAg ICAgICAgICAgICBwbV9kb21haW5faWQgPSByNV9jb3JlLT50Y21fYmFua3NbaV0tPnBtX2RvbWFp bl9pZDsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgICBpZiAoenlucW1wX3BtX3JlbGVh c2Vfbm9kZShwbV9kb21haW5faWQpKQo+ID4gPiA+ID4gPiA+ID4gPiA+IC0tCj4gPiA+ID4gPiA+ ID4gPiA+ID4gMi4yNS4xCj4gPiA+ID4gPiA+ID4gPiA+ID4KCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0 CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK