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 EB73BCA101F for ; Wed, 10 Sep 2025 06:13:07 +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:Content-ID:In-Reply-To: References:Message-ID:Date:Subject:CC:To:From:Reply-To:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=JwYhxuEhp7dNPAxbzXaA+ZvlMphZNRbE7Og7fjATYsQ=; b=H1rQcY5sn9VNAE dZQZrc/HhmI3cGMDpP90tCqD1j5SNjQzsvqaby4HDq35UkP1Ls1TJXqoLojtRNox6trljG2c0vjYT n6gdaoCRK+63l2o/ocve4eHHBPP4oxyYXHh5v7MKE/ur6GL2S1JCxUHxm11rpsJ1iDoCkluGNQYD4 WbZZuVIbtLcvutfEavalyI3qZUv+zYfkp4czWt/m6tWuOEJBLI1VF/aOtRvuRynxLK4OZ9l+OnEEZ eMrQz2AJq2oJ9f6iL4/Z4N55v5boWhQf0JOjYSmYf2B5WZVs0y+2jobgRi0MftRPCVcPhd6U5Clvf dD6o0HZcPShJBGDjE0Dw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uwE4p-0000000CG4e-2b3W; Wed, 10 Sep 2025 06:13:07 +0000 Received: from mail-bn8nam04on20628.outbound.protection.outlook.com ([2a01:111:f403:2408::628] helo=NAM04-BN8-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1uwE4l-0000000CG4N-357V for linux-i3c@lists.infradead.org; Wed, 10 Sep 2025 06:13:06 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UDfnCA7870Uc1MNXxvLF/52sXfx4PPm8pRYUhmkfdhbcKdwCwdZ3Spg2LEQnyISH7LKq0vEQ7UEaKPN9NRxNMZQmQgd/bZB8aODxf/UMNeYpKr4a519b6QYRub30dUlux3GGw7a3kKlyYgdYfsmWX21rolRtpYfPQzq5lPL2jmKlysXR/w7dvDRhrJuN/OZXfTtsk1x35AQL3Uh3P803lYqU3xLvN2tXHk/vw9RNYYwq4M7muUXg75PHZavvpsCVQG1uVBDcFbFb2tQpjBmQ1Ed/yo0ykFxSFj8CVxJXiwqP49woC2Yf7B0AiAbEANE3LQzoLL7cyrrVJGxtYFUpMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Wh4xsnRlcGGMr0sHdvXIl7zHXp9Ke2sGi1+3mrIw3S0=; b=ySIcL6ABJCOKjqhk4V6GsfTYN9tRiwdKzR83j0BvRUeWCiH74fmz9r5EbRKQUnVUJxsRINlwgb6W04CMPXtlwo6Q8w2fNqnKiyLnUKXpLIYJxktYYTCjmeTUhv0c3JEXJ7ZtsjrVi5ezIc21qxgtl6q8o+iDpH6veth6P7iaqApNeUkK5ncjMkk93xuIn/z+UDncSHDTuCdX8kVQJ1wxQs+kFGGoL2vtgnjBDieK4OIxnZvNAUPWm1axL9cefgy4ce6NGV4saBp1HJWZtZ+VLsf40BnRUSXK9i1ADVsfVUSAHRecFGRoK8pt3sFUb9hVUtwbuqm6rTr6QtrGGUkCcA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microchip.com; dmarc=pass action=none header.from=microchip.com; dkim=pass header.d=microchip.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchip.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Wh4xsnRlcGGMr0sHdvXIl7zHXp9Ke2sGi1+3mrIw3S0=; b=bJZeplbhhGcTJT/HBKhcViR/vtgdtcyiGGFxWClknNCi9FuXzooSbY86MecN8q3Qt21WqrJ+4JHobrvfZnXm/xUELo5G0TzknTWOUAxwVlCT8vZaQDFd+WNnmPmSAMEdnF21p8FhMk6UCe+ii+dWfMoCVP5TogV58913QrXENcF/L4ukzxiSjJROSgjMCNzHi2RNLpqrnNoAeGjQr27AohhLsRq+/EN4COoruTewXhJ6WMTM3fXHYvaj1mcHPK5SC2DOTjZWIA+Sx4u23M29cv3I8cWghqYn2Ig+7lGe5Ls0HnmsDXNqq9O3tEgNXKFvWx1fkfDRihWuOZy/CijDtA== Received: from DS0PR11MB6541.namprd11.prod.outlook.com (2603:10b6:8:d3::14) by CH3PR11MB7392.namprd11.prod.outlook.com (2603:10b6:610:145::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Wed, 10 Sep 2025 06:12:52 +0000 Received: from DS0PR11MB6541.namprd11.prod.outlook.com ([fe80::e268:87f2:3bd1:1347]) by DS0PR11MB6541.namprd11.prod.outlook.com ([fe80::e268:87f2:3bd1:1347%6]) with mapi id 15.20.9094.021; Wed, 10 Sep 2025 06:12:52 +0000 From: To: CC: , , , , , , , , Subject: Re: [PATCH 2/4] i3c: master: add Microchip SAMA7D65 I3C HCI master driver Thread-Topic: [PATCH 2/4] i3c: master: add Microchip SAMA7D65 I3C HCI master driver Thread-Index: AQHcIXrqGVMOWFOs9UayQYE6vyTQPbSLW8GAgACVJwA= Date: Wed, 10 Sep 2025 06:12:52 +0000 Message-ID: <3229da67-9d67-47ff-9f01-0d71bfabb6a6@microchip.com> References: <20250909111333.170016-1-durai.manickamkr@microchip.com> <20250909111333.170016-3-durai.manickamkr@microchip.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=microchip.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: DS0PR11MB6541:EE_|CH3PR11MB7392:EE_ x-ms-office365-filtering-correlation-id: cbd54c24-3c2d-493c-8a2d-08ddf0311359 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|376014|366016|1800799024|38070700021; x-microsoft-antispam-message-info: =?utf-8?B?c2I0MVVhNTluNUdVOHZSY1IvVzhrM2lSVUdIWTRZcGQ3UnlqbFRCUE9ZZitI?= =?utf-8?B?b1pDREM1TFc1SjZmbkZjZ3liTFVFS0tsSXFhRU1JZFdnOVNqSDlzSlV4dWd6?= =?utf-8?B?YUx3cmxGTzlTNTY3dFE4SGtHSEpjWHdIZ0ZWcldRZFhjMldEblN5SE9qcVk2?= =?utf-8?B?aDU3c2tpSVVNWEtaSGZLeVlSTDl6TWhobEN2UXpkelVhY2VtOXpHTElWS1pr?= =?utf-8?B?RUZtUVBXbU8wNVVLMWVnQmIxMGRNTERtb21STDJWL2xoYWg2ZTJKWmd2Nlgz?= =?utf-8?B?MmFUeFgxN3ByY0hXQVl2NDBmdUZoMHlXQjBBd0dDOXZXSU0yVVJOUCthTEtK?= =?utf-8?B?bW9lc09OSGV0ODhzbzdoTHRBdlJCbzhrRkZtL3c1UXdRY0tXaUZUVUprb2oy?= =?utf-8?B?ZEgxQ0NlOVpsMnJSaGZCNC9UUnc4WEFJMFhVSzhlb1ZzYlI5STZTaXpGWU5T?= =?utf-8?B?aUg2aEVwVWdGZW1PTFNCTU9IenJlYmJTYWJBNTBWUndGVjdSOURvbHpPcVY4?= =?utf-8?B?eDVGQ3hDRkpxQlU0VHUxd3haSzRiaWgrcXo1VG9VOHJuRXFWcWdIUEtubm9L?= =?utf-8?B?c2w0S1dSNVZSUnRJL1lMbmIvb2pmM2U1WkhJT0x1T3IxcitWeUNEck9hTGpH?= =?utf-8?B?cWJVMjNDcVpENk90Q1k2b0NFSk9HUkFUd0x6eERDcWhMcTBCYWpzZmUrY1hh?= =?utf-8?B?ZU1QUDdFYUR2dEs2Rjc3NW9HbjEzZ2J2MnNldjVUazNjWTBTam5XSzlHSzJ6?= =?utf-8?B?cnphYWJ1YlI0TzJKdWYycDlBZkFWMzNySkx0aTlwd00rM2JXRk1ZVjQ0clBJ?= =?utf-8?B?N2hXYTA2M2FQVG1kelVWSXFpcFJRTncyUFpvVDVNQm1DSlk1MjlnVEhURkZG?= =?utf-8?B?Slc2eHZsaHRETlhJK2NoZ2oxZm43SjI2TUsrUmhETXdHVTM3cEpCOVJ4VFVv?= =?utf-8?B?bFlWVUpDdmVnU0lKcXJwYUZLeUxDVWRLRXBnNWpwc0Q5OXdneTBaZkVRZElZ?= =?utf-8?B?ZitkaklUYkNkcDAwYXRGSngrK09UL2hxcU0zUXlKN2s5cWF1ancrd0cwRk8r?= =?utf-8?B?RGozaXowSCtETmttUXhSM3NpT3NCK2V6ejdZSzZpcE9oNTdWeVhlc2N6c3k5?= =?utf-8?B?UUtqbUV3QndMdDIvN1JSK1NNaEZjOGNsU0RDbGlwUlAveTJhUkxKU1R3TlQ1?= =?utf-8?B?SUF6WCsydUd1R3Rzb0dPTEswWE5XZzJrL3FUdDN1VVZkbWdjZGtRVGJRUTBJ?= =?utf-8?B?bEl6MUx6czZOYS8zd0xybzJ5SDkxYWVFRTVGcG1GWkdOL0RLY3k5QUgraldj?= =?utf-8?B?WHA2cUp5c3B0T21uVXR6d3duSkN3MHoyR2JrRlEzQnBIQ3Q3b2cwRzEzRllW?= =?utf-8?B?L2lESmFZVjF0Uk1weUN3b1pyRDkyU2xDMTBORERKTUdKTmQwMWhueEZoR1RH?= =?utf-8?B?RE5pWVdOSHk0WFo4SnRvdEtXMVNabEZFTTBZUnAyNzc5UHk3WjBpeVlVWEtE?= =?utf-8?B?elpML0IvTFhiS0RLUThrUEduYWYvTWhJeHFabXRzOStvQllQOTFZbUlBVlBz?= =?utf-8?B?STRweVRCSVNra0Y0S1NlT1VmdnBnOFRFb3dMbzdkMDM0QTc0S2hlcC9VODJJ?= =?utf-8?B?RWVUNnErUGppT08vMG1ZY01VVlpzNkZyUVhQdTFOZlZOT0xvVTFtQWFVZ1Fz?= =?utf-8?B?Q3hwZU1yK29FTUI1dHNGdFBrdEY5czJUZFhVSno5dnRnNTduMDZ6a0pGd09m?= =?utf-8?B?SGNPdVpKeWNDV2liNTRpWE9DU3lVdXNzcEEvTDFqMXZHV2pvTzdzdVFwMVc5?= =?utf-8?B?V1RPZmlnUElxczBuTGZyTHp1SEI5NTJGcDlsRmFBM21zVU5mRENpOEFrWHdE?= =?utf-8?B?L0prMHVYT3dpMjRDRmVQQllnUWwvamNFUHl1Si9EeFl0cHZkRGNSVkJseTA0?= =?utf-8?B?MWorUW1XS2JzcjA0VWQxMnVIUWZYNWFSaGM4Y1BXS2pGY1JtZ2NBV1JSMDZk?= =?utf-8?B?NVk2cEJIaEpBPT0=?= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB6541.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(38070700021);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?ZGpUSnJTTWdpdjh4ajVHRjcxcFlINjM5ZEZFaGY3eTNLMUlWdFdYVkRwd1pl?= =?utf-8?B?eHhlaVk0Q2VsMTBsdEovUzhTTUVsTlFDYnYxcERBeXVRQWYyOUV2d3VUbDQz?= =?utf-8?B?OE1mWVZYVG96OEFVSEVTVmJtcWpHSTdDK1A5dkhZUXVEbXRndEtiUHdWUkky?= =?utf-8?B?WnpQYm5RSnU3TGplVWtuR0FMRjhnT213U21kUzB5WFltRGFyT1c2NnQ3VWwr?= =?utf-8?B?c3NuRHRGK1NyVFBtUmxHaWlXSlgyWlhldS9zbVcyU3MySjN1M3ZJZDhYaXJF?= =?utf-8?B?TzJqc0UzaGU5WE1EK2ZUZkdoSlRQUHlKY3Y5cHh0RnFjL2hIdDdLc1daZitj?= =?utf-8?B?UzBuU3Z4OHFaUjJWUVorRXY4c0x5Q2ZyZWl4ZVZzQStzYW90SUxRT01YVW4y?= =?utf-8?B?ZWI5aEphdFpjcE1lMXhUdHUxNkRqb2h1V1o0bk9SdGNnSm1BS1hKcGh3MzJ1?= =?utf-8?B?TUR3SUd6ZXpacjd1ZWpLNkNPVmlTZVphRHJidFRTR0NYcGhld3RQR2lmRVor?= =?utf-8?B?N1F2U2N6TWwvZERZRHNzOWRZb2lPclRRV0NVdkxoMlh1WlNJNG5sY3lnTWNZ?= =?utf-8?B?aEZ1VWd6Y0Y1WXBHblhDQnJXZDFVcHpUcW4yZlJ6WTJwZkJwa0UwUWREdDJP?= =?utf-8?B?TmozQnFyK2hwOWZFeTNjSElZUlVaQ2JGOU1mMVFmdG9LN0VXNy9ZbWZ4dUNM?= =?utf-8?B?L015S3NwSVpLbU5iQmt1UWtSSmV6d1cwWDZoa0dtcWZndS9QelBmVEY1NlZn?= =?utf-8?B?dlJLaGloMnd2SGNmOHBjbnlaaGdMK1JIblV5WFBScmU5a01tVFU5RjNuV0RN?= =?utf-8?B?QTVZbUxraXNtTUVNVVZPR2R4UngwMmJhZTdQQ2lYamViSU5VM2Z3Q2xpa2ZR?= =?utf-8?B?Q1BJT2FEUFVRclJjeWlTb3FrWDNiNnpZZlJscEplSkZPTGp3UWlqREsrb3Js?= =?utf-8?B?NEZGaTdBenhzT1FIV2F5SGI4bzJHbnhZQ0RTTHB0L3gxSWtpcmFUUU82aEE5?= =?utf-8?B?K0Jrci81TitsUVhKclIyanZ1YkNqN0xtVE1mVEY3Q2FmZ1MwVHhWTFBnYW0z?= =?utf-8?B?M1NqTE04ZThVY3VrczlMaXhmL3Rsb0hmdE84b0dMU3Vmb3Znc3AwdzRyRUNs?= =?utf-8?B?WGwzQWhjZ25VRmNKLzhUdW5yam82SElZS20xRmZnLytvc3NsNjljZ05XUGUz?= =?utf-8?B?dllxNm9vNVdXRVNETzRHR2tkeHJoRmZrZW9LMWYxQWxuWU5URlJBSkdmSHc2?= =?utf-8?B?Z2xJSnhTK2N2U0t3cHR5ajRUbWFQNk9RTHpNbUs4Rlc2R0RFMXBocGFrcEk1?= =?utf-8?B?WjlUcDV0ZEhhV3VoKzByRndjOHY3UCtrVzZYMnJDc3Q0d0xMUUR2YXR0V25D?= =?utf-8?B?RWZDNXJTZXZPbVQrblhZbkJsT2U5ZnJ0dUVtYWpsYWZEREx0WFFXcVh6b05T?= =?utf-8?B?aEVjRlhXd2U3VGsvZWt3aE83Zlk0aDNwNEVhUFFYQzZuUkJJRThIR0hsVXJP?= =?utf-8?B?dWcyc2hwaDlrODBTdW51YVlhZXNmZmptNHU4TzJleHFyZkwrMHJFNW96M2I4?= =?utf-8?B?OXU3ZmxZUkwvdVdoWXRFSzZ2VTM4aFNpNVpkeGhBcUZkTyt0US8ySmZ6MWt5?= =?utf-8?B?SDh4d2tEOU5NWm4wSUpDY2hPalQyUWhnZ2ExZVpFR1c2Zm04MDRyUWtWUlFv?= =?utf-8?B?TE5VUXhrTkpkMjJnZHJSSFhxaXFBV3g4UGw1TkZnbm1IR0FRZzA4bEpheXls?= =?utf-8?B?RWM0TnFMSVUzMWZsdEVMRDNHTWx1azZjL2JuWHVkTjVqdEluZXNYM2pPb3FP?= =?utf-8?B?c2t2TG5oa3RYOHZybmRPOHM0cW82SHRFRjhRZnRYYTh5WUo2TGtHOUR4QUJK?= =?utf-8?B?Yyt1dlFwamtKTmdOTUtGR2x3Y2JpNVlZTUpBakxwaG9FdmRVUG5QME9RN3kz?= =?utf-8?B?dG16elpUY3BYODBGaVpuSTJGOGhTLzgzcFRtOGdlcEprSlZxUmZzdERVMldp?= =?utf-8?B?dmtCR0g5M3dJOWxyWFdsOTQ2OTh2SWU1TVVycE1ZZmpVV2F2dkdMbHVvMkJi?= =?utf-8?B?bzJnWW8yOWUvOG5YVE5ycHlvSVprN1BkWXlVSjNVTjZGQ3ZGT3dsSWpUU2Vw?= =?utf-8?B?bWNwYzhIU2xBdmVFcCs1UFo2MkpKeGZTeDBWVlZCSm5GVWxUblhJRVVCR0c5?= =?utf-8?B?VGc9PQ==?= Content-ID: <623AAB391A891A4692646E7B64C491FC@namprd11.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: microchip.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB6541.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: cbd54c24-3c2d-493c-8a2d-08ddf0311359 X-MS-Exchange-CrossTenant-originalarrivaltime: 10 Sep 2025 06:12:52.4720 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ilCbtb02MC9AsYha3/LUaIMIVyhojE7qQ9A2hJO2NQVB0l+GOA4lwsLKWpk1aOYlVyqgAvO+Yg/x3GkNDzOc7vlUg8aimGEbDVphFxeSQao= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR11MB7392 X-BeenThere: linux-i3c@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="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-i3c" Errors-To: linux-i3c-bounces+linux-i3c=archiver.kernel.org@lists.infradead.org On 10/09/25 02:48, Frank Li wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > On Tue, Sep 09, 2025 at 04:43:31PM +0530, Durai Manickam KR wrote: >> Add support for microchip SAMA7D65 I3C HCI master only IP. This >> hardware is an instance of the MIPI I3C HCI Controller implementing >> version 1.0 specification. This driver adds platform-specific >> support for SAMA7D65 SoC. Hi Frank, We have integrated the I3C HCI IP from synopsys. But the IP which we integrated into our SAMA7D65 SoC does not support DMA feature, Endianess check and few other interrupt status. So we have to introduce a microchip SoC specific macro to modify this driver. So we have below 2 approaches, 1. To introduce a Microchip SoC specific macro to add Microchip specific I3C changes to the existing driver. But in this approach, if suppose we have a changes in the i3c-hci driver, we have to adapt the changes to our IP also during every kernel updation and I donot know whether this is accepted by the i3c-hci driver maintainer. 2. Otherwise, creating a separate platform driver by reusing the existing i3c-hci driver. I raised a query few weeks back to decide which approach to proceed before sending this patch to upstream. But i have received comments like "its upto us to decide which is best way". I dont have much idea on which is best way to proceed and maintain.So, I have decided to go with approach 2. Could you share your idea on this? > why not reuse drivers/i3c/master/mipi-i3c-hci/core.c and create new one ? > > Frank > >> I3C in master mode supports up to 12.5MHz, SDR mode data transfer in >> mixed bus mode (I2C and I3C target devices on same i3c bus). It also >> supports IBI mechanism. >> >> Features tested and supported : >> Standard CCC commands. >> I3C SDR mode private transfers in PIO mode. >> I2C transfers in PIO mode. >> Pure bus mode and mixed bus mode. >> >> Signed-off-by: Durai Manickam KR >> --- >> drivers/i3c/master/Kconfig | 14 + >> drivers/i3c/master/Makefile | 1 + >> drivers/i3c/master/sama7d65-i3c-hci-master.c | 2705 ++++++++++++++++++ >> 3 files changed, 2720 insertions(+) >> create mode 100644 drivers/i3c/master/sama7d65-i3c-hci-master.c >> >> diff --git a/drivers/i3c/master/Kconfig b/drivers/i3c/master/Kconfig >> index 13df2944f2ec..8d0b033bfa3e 100644 >> --- a/drivers/i3c/master/Kconfig >> +++ b/drivers/i3c/master/Kconfig >> @@ -74,3 +74,17 @@ config RENESAS_I3C >> >> This driver can also be built as a module. If so, the module will be >> called renesas-i3c. >> + >> +config SAMA7D65_I3C_HCI_MASTER >> + tristate "Microchip SAMA7D65 I3C HCI Master driver" >> + depends on I3C >> + depends on HAS_IOMEM >> + depends on ARCH_AT91 >> + help >> + Support for Microchip SAMA7D65 I3C HCI Master Controller. >> + >> + This hardware is an instance of the MIPI I3C HCI controller. This >> + driver adds platform-specific support for SAMA7D65 SoC. >> + >> + This driver can also be built as a module. If so, the module will be >> + called sama7d65-i3c-hci-master. >> diff --git a/drivers/i3c/master/Makefile b/drivers/i3c/master/Makefile >> index aac74f3e3851..032c8c511f58 100644 >> --- a/drivers/i3c/master/Makefile >> +++ b/drivers/i3c/master/Makefile >> @@ -5,3 +5,4 @@ obj-$(CONFIG_AST2600_I3C_MASTER) += ast2600-i3c-master.o >> obj-$(CONFIG_SVC_I3C_MASTER) += svc-i3c-master.o >> obj-$(CONFIG_MIPI_I3C_HCI) += mipi-i3c-hci/ >> obj-$(CONFIG_RENESAS_I3C) += renesas-i3c.o >> +obj-$(CONFIG_SAMA7D65_I3C_HCI_MASTER) += sama7d65-i3c-hci-master.o >> diff --git a/drivers/i3c/master/sama7d65-i3c-hci-master.c b/drivers/i3c/master/sama7d65-i3c-hci-master.c >> new file mode 100644 >> index 000000000000..62189417f2af >> --- /dev/null >> +++ b/drivers/i3c/master/sama7d65-i3c-hci-master.c >> @@ -0,0 +1,2705 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +/* >> + * Copyright (C) 2025 Microchip Technology Inc. and its subsidiaries >> + * >> + * Author: Durai Manickam KR >> + * >> + * Microchip SAMA7D65 I3C HCI Master driver >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +/* >> + * Microchip Host Controller Capabilities and Operation Registers >> + */ >> + >> +#define MCHP_HCI_VERSION 0x00 /* HCI Version (in BCD) */ >> + >> +#define MCHP_HC_CONTROL 0x04 >> +#define MCHP_HC_CONTROL_BUS_ENABLE BIT(31) >> +#define MCHP_HC_CONTROL_RESUME BIT(30) >> +#define MCHP_HC_CONTROL_ABORT BIT(29) >> +#define MCHP_HC_CONTROL_HOT_JOIN_CTRL BIT(8) /* Hot-Join ACK/NACK Control */ >> +#define MCHP_HC_CONTROL_I2C_TARGET_PRESENT BIT(7) >> +#define MCHP_HC_CONTROL_IBA_INCLUDE BIT(0) /* Include I3C Broadcast Address */ >> + >> +#define MCHP_MASTER_DEVICE_ADDR 0x08 /* Master Device Address */ >> +#define MCHP_MASTER_DYNAMIC_ADDR_VALID BIT(31) /* Dynamic Address is Valid */ >> +#define MCHP_MASTER_DYNAMIC_ADDR(v) FIELD_PREP(GENMASK(22, 16), v) >> + >> +#define MCHP_HC_CAPABILITIES 0x0c >> +#define MCHP_HC_CAP_HDR_TS_EN BIT(7) >> +#define MCHP_HC_CAP_HDR_DDR_EN BIT(6) >> +#define MCHP_HC_CAP_NON_CURRENT_MASTER_CAP BIT(5) /* master handoff capable */ >> +#define MCHP_HC_CAP_AUTO_COMMAND BIT(3) >> +#define MCHP_HC_CAP_COMBO_COMMAND BIT(2) >> + >> +#define MCHP_RESET_CONTROL 0x10 >> +#define MCHP_IBI_QUEUE_RST BIT(5) >> +#define MCHP_RX_FIFO_RST BIT(4) >> +#define MCHP_TX_FIFO_RST BIT(3) >> +#define MCHP_RESP_QUEUE_RST BIT(2) >> +#define MCHP_CMD_QUEUE_RST BIT(1) >> +#define MCHP_SOFT_RST BIT(0) /* Core Reset */ >> + >> +#define MCHP_PRESENT_STATE 0x14 >> +#define MCHp_STATE_CURRENT_MASTER BIT(2) >> + >> +#define MCHP_INTR_STATUS 0x20 >> +#define MCHP_INTR_STATUS_ENABLE 0x24 >> +#define MCHP_INTR_SIGNAL_ENABLE 0x28 >> +#define MCHP_INTR_FORCE 0x2c >> +#define MCHP_INTR_HC_INTERNAL_ERR BIT(10) /* HC Internal Error */ >> + >> +#define MCHP_DAT_SECTION 0x30 /* Device Address Table */ >> +#define MCHP_DAT_TABLE_SIZE GENMASK(17, 12) >> +#define MCHP_DAT_TABLE_OFFSET GENMASK(11, 0) >> + >> +#define MCHP_DCT_SECTION 0x34 /* Device Characteristics Table */ >> +#define MCHP_DCT_TABLE_INDEX GENMASK(21, 19) >> +#define MCHP_DCT_TABLE_SIZE GENMASK(18, 12) >> +#define MCHP_DCT_TABLE_OFFSET GENMASK(11, 0) >> + >> +#define MCHP_RING_HEADERS_SECTION 0x38 >> +#define MCHP_RING_HEADERS_OFFSET GENMASK(15, 0) >> + >> +#define MCHP_PIO_SECTION 0x3c >> +#define MCHP_PIO_REGS_OFFSET GENMASK(15, 0) /* PIO Offset */ >> + >> +#define MCHP_EXT_CAPS_SECTION 0x40 >> +#define MCHP_EXT_CAPS_OFFSET GENMASK(15, 0) >> + >> +#define MCHP_IBI_NOTIFY_CTRL 0x58 /* IBI Notify Control */ >> +#define MCHP_IBI_NOTIFY_SIR_REJECTED BIT(3) /* Rejected Target Interrupt Request */ >> +#define MCHP_IBI_NOTIFY_MR_REJECTED BIT(1) /* Rejected Master Request Control */ >> +#define MCHP_IBI_NOTIFY_HJ_REJECTED BIT(0) /* Rejected Hot-Join Control */ >> + >> +#define DEV_CTX_BASE_LO 0x60 >> +#define DEV_CTX_BASE_HI 0x64 >> + >> +/* >> + * PIO Access Area >> + */ >> + >> +#define pio_reg_read(r) readl(hci->PIO_regs + (PIO_##r)) >> +#define pio_reg_write(r, v) writel(v, hci->PIO_regs + (PIO_##r)) >> + >> +#define PIO_MCHP_COMMAND_QUEUE_PORT 0x00 >> +#define PIO_MCHP_RESPONSE_QUEUE_PORT 0x04 >> +#define PIO_MCHP_XFER_DATA_PORT 0x08 >> +#define PIO_MCHP_IBI_PORT 0x0c >> + >> +#define PIO_MCHP_QUEUE_THLD_CTRL 0x10 >> +#define MCHP_QUEUE_IBI_STATUS_THLD GENMASK(31, 24) >> +#define MCHP_QUEUE_IBI_DATA_THLD GENMASK(23, 16) >> +#define MCHP_QUEUE_RESP_BUF_THLD GENMASK(15, 8) >> +#define MCHP_QUEUE_CMD_EMPTY_BUF_THLD GENMASK(7, 0) >> + >> +#define PIO_MCHP_DATA_BUFFER_THLD_CTRL 0x14 >> +#define MCHP_DATA_RX_START_THLD GENMASK(26, 24) >> +#define MCHP_DATA_TX_START_THLD GENMASK(18, 16) >> +#define MCHP_DATA_RX_BUF_THLD GENMASK(10, 8) >> +#define MCHP_DATA_TX_BUF_THLD GENMASK(2, 0) >> + >> +#define PIO_MCHP_QUEUE_SIZE 0x18 >> +#define MCHP_TX_DATA_BUFFER_SIZE GENMASK(31, 24) >> +#define MCHP_RX_DATA_BUFFER_SIZE GENMASK(23, 16) >> +#define MCHP_IBI_STATUS_SIZE GENMASK(15, 8) >> +#define MCHP_CR_QUEUE_SIZE GENMASK(7, 0) >> + >> +#define PIO_MCHP_INTR_STATUS 0x20 >> +#define PIO_MCHP_INTR_STATUS_ENABLE 0x24 >> +#define PIO_MCHP_INTR_SIGNAL_ENABLE 0x28 >> +#define PIO_MCHP_INTR_FORCE 0x2c >> +#define STAT_TRANSFER_BLOCKED BIT(25) >> +#define STAT_PERR_RESP_UFLOW BIT(24) >> +#define STAT_PERR_CMD_OFLOW BIT(23) >> +#define STAT_PERR_IBI_UFLOW BIT(22) >> +#define STAT_PERR_RX_UFLOW BIT(21) >> +#define STAT_PERR_TX_OFLOW BIT(20) >> +#define STAT_ERR_RESP_QUEUE_FULL BIT(19) >> +#define STAT_WARN_RESP_QUEUE_FULL BIT(18) >> +#define STAT_ERR_IBI_QUEUE_FULL BIT(17) >> +#define STAT_WARN_IBI_QUEUE_FULL BIT(16) >> +#define STAT_ERR_RX_DATA_FULL BIT(15) >> +#define STAT_WARN_RX_DATA_FULL BIT(14) >> +#define STAT_ERR_TX_DATA_EMPTY BIT(13) >> +#define STAT_WARN_TX_DATA_EMPTY BIT(12) >> +#define STAT_TRANSFER_ERR BIT(9) >> +#define STAT_WARN_INS_STOP_MODE BIT(7) >> +#define STAT_TRANSFER_ABORT BIT(5) >> +#define STAT_RESP_READY BIT(4) >> +#define STAT_CMD_QUEUE_READY BIT(3) >> +#define STAT_IBI_STATUS_THLD BIT(2) >> +#define STAT_RX_THLD BIT(1) >> +#define STAT_TX_THLD BIT(0) >> + >> +#define PIO_MCHP_QUEUE_CUR_STATUS 0x38 >> +#define MCHP_CUR_IBI_Q_LEVEL GENMASK(23, 16) >> +#define MCHP_CUR_RESP_Q_LEVEL GENMASK(15, 8) >> +#define MCHP_CUR_CMD_Q_EMPTY_LEVEL GENMASK(7, 0) >> + >> +#define PIO_MCHP_DATA_BUFFER_CUR_STATUS 0x3c >> +#define MCHP_CUR_RX_BUF_LVL GENMASK(15, 8) >> +#define MCHP_CUR_TX_BUF_LVL GENMASK(7, 0) >> + >> +/* >> + * Handy status bit combinations >> + */ >> + >> +#define STAT_LATENCY_WARNINGS (STAT_WARN_RESP_QUEUE_FULL | \ >> + STAT_WARN_IBI_QUEUE_FULL | \ >> + STAT_WARN_RX_DATA_FULL | \ >> + STAT_WARN_TX_DATA_EMPTY | \ >> + STAT_WARN_INS_STOP_MODE) >> + >> +#define STAT_LATENCY_ERRORS (STAT_ERR_RESP_QUEUE_FULL | \ >> + STAT_ERR_IBI_QUEUE_FULL | \ >> + STAT_ERR_RX_DATA_FULL | \ >> + STAT_ERR_TX_DATA_EMPTY) >> + >> +#define STAT_PROG_ERRORS (STAT_TRANSFER_BLOCKED | \ >> + STAT_PERR_RESP_UFLOW | \ >> + STAT_PERR_CMD_OFLOW | \ >> + STAT_PERR_IBI_UFLOW | \ >> + STAT_PERR_RX_UFLOW | \ >> + STAT_PERR_TX_OFLOW) >> + >> +#define STAT_ALL_ERRORS (STAT_TRANSFER_ABORT | \ >> + STAT_TRANSFER_ERR | \ >> + STAT_LATENCY_ERRORS | \ >> + STAT_PROG_ERRORS) >> + >> +/* >> + * Address Assignment Command >> + */ >> + >> +#define CMD_0_ATTR_A FIELD_PREP(CMD_0_ATTR, 0x2) >> + >> +#define CMD_A0_TOC W0_BIT_(31) >> +#define CMD_A0_ROC W0_BIT_(30) >> +#define CMD_A0_DEV_COUNT(v) FIELD_PREP(W0_MASK(29, 26), v) >> +#define CMD_A0_DEV_INDEX(v) FIELD_PREP(W0_MASK(20, 16), v) >> +#define CMD_A0_CMD(v) FIELD_PREP(W0_MASK(14, 7), v) >> +#define CMD_A0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v) >> + >> +/* >> + * Immediate Data Transfer Command >> + */ >> + >> +#define CMD_0_ATTR_I FIELD_PREP(CMD_0_ATTR, 0x1) >> + >> +#define CMD_I1_DATA_BYTE_4(v) FIELD_PREP(W1_MASK(63, 56), v) >> +#define CMD_I1_DATA_BYTE_3(v) FIELD_PREP(W1_MASK(55, 48), v) >> +#define CMD_I1_DATA_BYTE_2(v) FIELD_PREP(W1_MASK(47, 40), v) >> +#define CMD_I1_DATA_BYTE_1(v) FIELD_PREP(W1_MASK(39, 32), v) >> +#define CMD_I1_DEF_BYTE(v) FIELD_PREP(W1_MASK(39, 32), v) >> +#define CMD_I0_TOC W0_BIT_(31) >> +#define CMD_I0_ROC W0_BIT_(30) >> +#define CMD_I0_RNW W0_BIT_(29) >> +#define CMD_I0_MODE(v) FIELD_PREP(W0_MASK(28, 26), v) >> +#define CMD_I0_DTT(v) FIELD_PREP(W0_MASK(25, 23), v) >> +#define CMD_I0_DEV_INDEX(v) FIELD_PREP(W0_MASK(20, 16), v) >> +#define CMD_I0_CP W0_BIT_(15) >> +#define CMD_I0_CMD(v) FIELD_PREP(W0_MASK(14, 7), v) >> +#define CMD_I0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v) >> + >> +/* >> + * Regular Data Transfer Command >> + */ >> + >> +#define CMD_0_ATTR_R FIELD_PREP(CMD_0_ATTR, 0x0) >> + >> +#define CMD_R1_DATA_LENGTH(v) FIELD_PREP(W1_MASK(63, 48), v) >> +#define CMD_R1_DEF_BYTE(v) FIELD_PREP(W1_MASK(39, 32), v) >> +#define CMD_R0_TOC W0_BIT_(31) >> +#define CMD_R0_ROC W0_BIT_(30) >> +#define CMD_R0_RNW W0_BIT_(29) >> +#define CMD_R0_MODE(v) FIELD_PREP(W0_MASK(28, 26), v) >> +#define CMD_R0_DBP W0_BIT_(25) >> +#define CMD_R0_DEV_INDEX(v) FIELD_PREP(W0_MASK(20, 16), v) >> +#define CMD_R0_CP W0_BIT_(15) >> +#define CMD_R0_CMD(v) FIELD_PREP(W0_MASK(14, 7), v) >> +#define CMD_R0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v) >> + >> +/* >> + * Combo Transfer (Write + Write/Read) Command >> + */ >> + >> +#define CMD_0_ATTR_C FIELD_PREP(CMD_0_ATTR, 0x3) >> + >> +#define CMD_C1_DATA_LENGTH(v) FIELD_PREP(W1_MASK(63, 48), v) >> +#define CMD_C1_OFFSET(v) FIELD_PREP(W1_MASK(47, 32), v) >> +#define CMD_C0_TOC W0_BIT_(31) >> +#define CMD_C0_ROC W0_BIT_(30) >> +#define CMD_C0_RNW W0_BIT_(29) >> +#define CMD_C0_MODE(v) FIELD_PREP(W0_MASK(28, 26), v) >> +#define CMD_C0_16_BIT_SUBOFFSET W0_BIT_(25) >> +#define CMD_C0_FIRST_PHASE_MODE W0_BIT_(24) >> +#define CMD_C0_DATA_LENGTH_POSITION(v) FIELD_PREP(W0_MASK(23, 22), v) >> +#define CMD_C0_DEV_INDEX(v) FIELD_PREP(W0_MASK(20, 16), v) >> +#define CMD_C0_CP W0_BIT_(15) >> +#define CMD_C0_CMD(v) FIELD_PREP(W0_MASK(14, 7), v) >> +#define CMD_C0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v) >> + >> +/* >> + * Internal Control Command >> + */ >> + >> +#define CMD_0_ATTR_M FIELD_PREP(CMD_0_ATTR, 0x7) >> + >> +#define CMD_M1_VENDOR_SPECIFIC W1_MASK(63, 32) >> +#define CMD_M0_MIPI_RESERVED W0_MASK(31, 12) >> +#define CMD_M0_MIPI_CMD W0_MASK(11, 8) >> +#define CMD_M0_VENDOR_INFO_PRESENT W0_BIT_( 7) >> +#define CMD_M0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v) >> + >> +/* >> + * Device Address Table Structure >> + */ >> + >> +#define DAT_1_AUTOCMD_HDR_CODE W1_MASK(58, 51) >> +#define DAT_1_AUTOCMD_MODE W1_MASK(50, 48) >> +#define DAT_1_AUTOCMD_VALUE W1_MASK(47, 40) >> +#define DAT_1_AUTOCMD_MASK W1_MASK(39, 32) >> +/* DAT_0_I2C_DEVICE W0_BIT_(31) */ >> +#define DAT_0_DEV_NACK_RETRY_CNT W0_MASK(30, 29) >> +#define DAT_0_RING_ID W0_MASK(28, 26) >> +#define DAT_0_DYNADDR_PARITY W0_BIT_(23) >> +#define DAT_0_DYNAMIC_ADDRESS W0_MASK(22, 16) >> +#define DAT_0_TS W0_BIT_(15) >> +#define DAT_0_MR_REJECT W0_BIT_(14) >> +/* DAT_0_SIR_REJECT W0_BIT_(13) */ >> +/* DAT_0_IBI_PAYLOAD W0_BIT_(12) */ >> +#define DAT_0_STATIC_ADDRESS W0_MASK(6, 0) >> + >> +#define dat_w0_read(i) readl(hci->DAT_regs + (i) * 8) >> +#define dat_w1_read(i) readl(hci->DAT_regs + (i) * 8 + 4) >> +#define dat_w0_write(i, v) writel(v, hci->DAT_regs + (i) * 8) >> +#define dat_w1_write(i, v) writel(v, hci->DAT_regs + (i) * 8 + 4) >> + >> +/* Global DAT flags */ >> +#define DAT_0_I2C_DEVICE W0_BIT_(31) >> +#define DAT_0_SIR_REJECT W0_BIT_(13) >> +#define DAT_0_IBI_PAYLOAD W0_BIT_(12) >> + >> +/* 32-bit word aware bit and mask macros */ >> +#define W0_MASK(h, l) GENMASK((h) - 0, (l) - 0) >> +#define W1_MASK(h, l) GENMASK((h) - 32, (l) - 32) >> +#define W2_MASK(h, l) GENMASK((h) - 64, (l) - 64) >> +#define W3_MASK(h, l) GENMASK((h) - 96, (l) - 96) >> + >> +/* Same for single bit macros (trailing _ to align with W*_MASK width) */ >> +#define W0_BIT_(x) BIT((x) - 0) >> +#define W1_BIT_(x) BIT((x) - 32) >> +#define W2_BIT_(x) BIT((x) - 64) >> +#define W3_BIT_(x) BIT((x) - 96) >> + >> +#define reg_read(r) readl(hci->base_regs + (r)) >> +#define reg_write(r, v) writel(v, hci->base_regs + (r)) >> +#define reg_set(r, v) reg_write(r, reg_read(r) | (v)) >> +#define reg_clear(r, v) reg_write(r, reg_read(r) & ~(v)) >> + >> +/* >> + * Those bits are common to all descriptor formats and >> + * may be manipulated by the core code. >> + */ >> +#define CMD_0_TOC W0_BIT_(31) >> +#define CMD_0_ROC W0_BIT_(30) >> +#define CMD_0_ATTR W0_MASK(2, 0) >> + >> +/* >> + * Response Descriptor Structure >> + */ >> +#define RESP_STATUS(resp) FIELD_GET(GENMASK(31, 28), resp) >> +#define RESP_TID(resp) FIELD_GET(GENMASK(27, 24), resp) >> +#define RESP_DATA_LENGTH(resp) FIELD_GET(GENMASK(15, 0), resp) /* Response Data length as per Microchip IP */ >> +#define RESP_ERR_FIELD GENMASK(31, 28) >> + >> +/* >> + * IBI Status Descriptor bits >> + */ >> +#define MCHP_IBI_STS BIT(31) >> +#define MCHP_IBI_ERROR BIT(30) >> +#define MCHP_IBI_STATUS_TYPE BIT(29) >> +#define MCHP_IBI_HW_CONTEXT GENMASK(28, 26) >> +#define MCHP_IBI_TS BIT(25) >> +#define MCHP_IBI_LAST_STATUS BIT(24) >> +#define MCHP_IBI_CHUNKS GENMASK(23, 16) >> +#define MCHP_IBI_ID GENMASK(15, 8) >> +#define MCHP_IBI_TARGET_ADDR GENMASK(15, 9) >> +#define MCHP_IBI_TARGET_RNW BIT(8) >> +#define MCHP_IBI_DATA_LENGTH GENMASK(7, 0) >> + >> +/* >> + * Master Data Transfer Rate Table Mode ID values. >> + */ >> +#define XFERRATE_MODE_I3C 0x00 >> +#define XFERRATE_MODE_I2C 0x08 >> + >> +/* >> + * Master Data Transfer Rate Table Entry Bits Definitions >> + */ >> +#define XFERRATE_MODE_ID GENMASK(31, 28) >> +#define XFERRATE_RATE_ID GENMASK(22, 20) >> +#define XFERRATE_ACTUAL_RATE_KHZ GENMASK(19, 0) >> + >> +/* Extended Capability Header */ >> +#define CAP_HEADER_LENGTH GENMASK(23, 8) >> +#define CAP_HEADER_ID GENMASK(7, 0) >> +/*ext_caps.c END */ >> + >> +/* list of quirks */ >> +#define HCI_QUIRK_RAW_CCC BIT(1) /* CCC framing must be explicit */ >> +#define MCHP_HCI_QUIRK_PIO_MODE BIT(2) /* Set PIO mode for Microchip platforms */ >> +#define MCHP_HCI_QUIRK_OD_PP_TIMING BIT(3) /* Set OD and PP timings for Microchip platforms */ >> +#define MCHP_HCI_QUIRK_RESP_BUF_THLD BIT(4) /* Set resp buf thld to 0 for Microchip platforms */ >> + >> +/* Timing registers */ >> +#define MCHP_HCI_SCL_I3C_OD_TIMING 0x214 >> +#define MCHP_HCI_SCL_I3C_PP_TIMING 0x218 >> +#define MCHP_HCI_SDA_HOLD_SWITCH_DLY_TIMING 0x230 >> + >> +/* Timing values to configure 9MHz frequency */ >> +#define MCHP_SCL_I3C_OD_TIMING 0x00cf00cf /* check and update correct values later */ >> +#define MCHP_SCL_I3C_PP_TIMING 0x00160016 >> + >> +#define MCHP_QUEUE_THLD_CTRL 0xD0 >> + >> +/* TID generation (4 bits wide in all cases) */ >> +#define mchp_hci_get_tid(bits) \ >> + (atomic_inc_return_relaxed(&hci->next_cmd_tid) % (1U << 4)) >> + >> +#define EXT_CAP(_id, _highest_mandatory_reg_offset, _parser) \ >> + { .id = (_id), .parser = (_parser), \ >> + .min_length = (_highest_mandatory_reg_offset)/4 + 1 } >> + >> +/* Our main structure */ >> +struct mchp_i3c_hci { >> + struct i3c_master_controller master; >> + struct clk *pclk; >> + struct clk *gclk; >> + void __iomem *base_regs; >> + void __iomem *DAT_regs; >> + void __iomem *DCT_regs; >> + void __iomem *RHS_regs; >> + void __iomem *PIO_regs; >> + void __iomem *EXTCAPS_regs; >> + void __iomem *AUTOCMD_regs; >> + void __iomem *DEBUG_regs; >> + const struct mchp_hci_io_ops *io; >> + void *io_data; >> + const struct mchp_hci_cmd_ops *cmd; >> + atomic_t next_cmd_tid; >> + u32 caps; >> + unsigned int quirks; >> + unsigned int DAT_entries; >> + unsigned int DAT_entry_size; >> + void *DAT_data; >> + unsigned int DCT_entries; >> + unsigned int DCT_entry_size; >> + u8 version_major; >> + u8 version_minor; >> + u8 revision; >> + u32 vendor_mipi_id; >> + u32 vendor_version_id; >> + u32 vendor_product_id; >> + void *vendor_data; >> +}; >> + >> +/* >> + * Structure to represent a master initiated transfer. >> + * The rnw, data and data_len fields must be initialized before calling any >> + * hci->cmd->*() method. The cmd method will initialize cmd_desc[] and >> + * possibly modify (clear) the data field. Then xfer->cmd_desc[0] can >> + * be augmented with CMD_0_ROC and/or CMD_0_TOC. >> + * The completion field needs to be initialized before queueing with >> + * hci->io->queue_xfer(), and requires CMD_0_ROC to be set. >> + */ >> +struct mchp_hci_xfer { >> + u32 cmd_desc[4]; >> + u32 response; >> + bool rnw; >> + void *data; >> + unsigned int data_len; >> + unsigned int cmd_tid; >> + struct completion *completion; >> + union { >> + struct { >> + /* PIO specific */ >> + struct mchp_hci_xfer *next_xfer; >> + struct mchp_hci_xfer *next_data; >> + struct mchp_hci_xfer *next_resp; >> + unsigned int data_left; >> + u32 data_word_before_partial; >> + }; >> + struct { >> + /* DMA specific */ >> + dma_addr_t data_dma; >> + void *bounce_buf; >> + int ring_number; >> + int ring_entry; >> + }; >> + }; >> +}; >> + >> +struct mchp_hci_dat_ops { >> + int (*init)(struct mchp_i3c_hci *hci); >> + void (*cleanup)(struct mchp_i3c_hci *hci); >> + int (*alloc_entry)(struct mchp_i3c_hci *hci); >> + void (*free_entry)(struct mchp_i3c_hci *hci, unsigned int dat_idx); >> + void (*set_dynamic_addr)(struct mchp_i3c_hci *hci, unsigned int dat_idx, u8 addr); >> + void (*set_static_addr)(struct mchp_i3c_hci *hci, unsigned int dat_idx, u8 addr); >> + void (*set_flags)(struct mchp_i3c_hci *hci, unsigned int dat_idx, u32 w0, u32 w1); >> + void (*clear_flags)(struct mchp_i3c_hci *hci, unsigned int dat_idx, u32 w0, u32 w1); >> + int (*get_index)(struct mchp_i3c_hci *hci, u8 address); >> +}; >> + >> +/* This abstracts PIO vs DMA operations */ >> +struct mchp_hci_io_ops { >> + bool (*irq_handler)(struct mchp_i3c_hci *hci, unsigned int mask); >> + int (*queue_xfer)(struct mchp_i3c_hci *hci, struct mchp_hci_xfer *xfer, int n); >> + bool (*dequeue_xfer)(struct mchp_i3c_hci *hci, struct mchp_hci_xfer *xfer, int n); >> + int (*request_ibi)(struct mchp_i3c_hci *hci, struct i3c_dev_desc *dev, >> + const struct i3c_ibi_setup *req); >> + void (*free_ibi)(struct mchp_i3c_hci *hci, struct i3c_dev_desc *dev); >> + void (*recycle_ibi_slot)(struct mchp_i3c_hci *hci, struct i3c_dev_desc *dev, >> + struct i3c_ibi_slot *slot); >> + int (*init)(struct mchp_i3c_hci *hci); >> + void (*cleanup)(struct mchp_i3c_hci *hci); >> +}; >> + >> +/* Our per device master private data */ >> +struct mchp_i3c_hci_dev_data { >> + int dat_idx; >> + void *ibi_data; >> +}; >> + >> +/* This abstracts operations with our command descriptor formats */ >> +struct mchp_hci_cmd_ops { >> + int (*prep_ccc)(struct mchp_i3c_hci *hci, struct mchp_hci_xfer *xfer, >> + u8 ccc_addr, u8 ccc_cmd, bool raw); >> + void (*prep_i3c_xfer)(struct mchp_i3c_hci *hci, struct i3c_dev_desc *dev, >> + struct mchp_hci_xfer *xfer); >> + void (*prep_i2c_xfer)(struct mchp_i3c_hci *hci, struct i2c_dev_desc *dev, >> + struct mchp_hci_xfer *xfer); >> + int (*perform_daa)(struct mchp_i3c_hci *hci); >> +}; >> + >> +struct hci_ext_caps { >> + u8 id; >> + u16 min_length; >> + int (*parser)(struct mchp_i3c_hci *hci, void __iomem *base); >> +}; >> + >> +struct hci_pio_dev_ibi_data { >> + struct i3c_generic_ibi_pool *pool; >> + unsigned int max_len; >> +}; >> + >> +struct hci_pio_ibi_data { >> + struct i3c_ibi_slot *slot; >> + void *data_ptr; >> + unsigned int addr; >> + unsigned int seg_len, seg_cnt; >> + unsigned int max_len; >> + bool last_seg; >> +}; >> + >> +struct mchp_hci_pio_data { >> + spinlock_t lock; >> + struct mchp_hci_xfer *curr_xfer, *xfer_queue; >> + struct mchp_hci_xfer *curr_rx, *rx_queue; >> + struct mchp_hci_xfer *curr_tx, *tx_queue; >> + struct mchp_hci_xfer *curr_resp, *resp_queue; >> + struct hci_pio_ibi_data ibi; >> + unsigned int rx_thresh_size, tx_thresh_size; >> + unsigned int max_ibi_thresh; >> + u32 reg_queue_thresh; >> + u32 enabled_irqs; >> +}; >> + >> +/* global functions */ >> +static int i3c_hci_parse_ext_caps(struct mchp_i3c_hci *hci); >> +void mchp_i3c_hci_dct_get_val(struct mchp_i3c_hci *hci, unsigned int dct_idx, >> + u64 *pid, unsigned int *dcr, unsigned int *bcr); >> +static void mchp_hci_pio_err(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio, >> + u32 status); >> +void mchp_mipi_i3c_hci_resume(struct mchp_i3c_hci *hci); >> +void mchp_mipi_i3c_hci_pio_reset(struct mchp_i3c_hci *hci); >> +void mchp_mipi_i3c_hci_dct_index_reset(struct mchp_i3c_hci *hci); >> +void microchip_set_od_pp_timing(struct mchp_i3c_hci *hci); >> +void microchip_set_resp_buf_thld(struct mchp_i3c_hci *hci); >> + >> +static inline struct mchp_hci_xfer *mchp_hci_alloc_xfer(unsigned int n) >> +{ >> + return kcalloc(n, sizeof(struct mchp_hci_xfer), GFP_KERNEL); >> +} >> + >> +static inline void mchp_hci_free_xfer(struct mchp_hci_xfer *xfer, unsigned int n) >> +{ >> + kfree(xfer); >> +} >> + >> +/* Data Transfer Speed and Mode */ >> +enum mchp_hci_cmd_mode { >> + MODE_I3C_SDR0 = 0x0, >> + MODE_I3C_SDR1 = 0x1, >> + MODE_I3C_SDR2 = 0x2, >> + MODE_I3C_SDR3 = 0x3, >> + MODE_I3C_SDR4 = 0x4, >> + MODE_I3C_HDR_TSx = 0x5, >> + MODE_I3C_HDR_DDR = 0x6, >> + MODE_I3C_HDR_BT = 0x7, >> + MODE_I3C_Fm_FmP = 0x8, >> + MODE_I2C_Fm = 0x0, >> + MODE_I2C_FmP = 0x1, >> + MODE_I2C_UD1 = 0x2, >> + MODE_I2C_UD2 = 0x3, >> + MODE_I2C_UD3 = 0x4, >> +}; >> + >> +enum mchp_hci_resp_err { >> + RESP_SUCCESS = 0x0, >> + RESP_ERR_CRC = 0x1, >> + RESP_ERR_PARITY = 0x2, >> + RESP_ERR_FRAME = 0x3, >> + RESP_ERR_ADDR_HEADER = 0x4, >> + RESP_ERR_BCAST_NACK_7E = 0x4, >> + RESP_ERR_NACK = 0x5, >> + RESP_ERR_OVL = 0x6, >> + RESP_ERR_I3C_SHORT_READ = 0x7, >> + RESP_ERR_HC_TERMINATED = 0x8, >> + RESP_ERR_I2C_WR_DATA_NACK = 0x9, >> + RESP_ERR_BUS_XFER_ABORTED = 0x9, >> + RESP_ERR_NOT_SUPPORTED = 0xa, >> + RESP_ERR_ABORTED_WITH_CRC = 0xb, >> + /* 0xc to 0xf are reserved for transfer specific errors */ >> +}; >> + >> +/* Our various instances */ >> +/* handy helpers */ >> +static inline struct i3c_dev_desc * >> +mchp_i3c_hci_addr_to_dev(struct mchp_i3c_hci *hci, unsigned int addr) >> +{ >> + struct i3c_bus *bus = i3c_master_get_bus(&hci->master); >> + struct i3c_dev_desc *dev; >> + >> + i3c_bus_for_each_i3cdev(bus, dev) { >> + if (dev->info.dyn_addr == addr) >> + return dev; >> + } >> + return NULL; >> +} >> + >> +void microchip_set_od_pp_timing(struct mchp_i3c_hci *hci) >> +{ >> + u32 data; >> + >> + reg_write(MCHP_HCI_SCL_I3C_OD_TIMING, MCHP_SCL_I3C_OD_TIMING); >> + reg_write(MCHP_HCI_SCL_I3C_PP_TIMING, MCHP_SCL_I3C_PP_TIMING); >> + data = reg_read(MCHP_HCI_SDA_HOLD_SWITCH_DLY_TIMING); >> + /* Configure maximum TX hold time */ >> + data |= W0_MASK(18, 16); >> + reg_write(MCHP_HCI_SDA_HOLD_SWITCH_DLY_TIMING, data); >> +} >> + >> +void microchip_set_resp_buf_thld(struct mchp_i3c_hci *hci) >> +{ >> + u32 data; >> + >> + data = reg_read(MCHP_QUEUE_THLD_CTRL); >> + data = data & ~W0_MASK(15, 8); >> + reg_write(MCHP_QUEUE_THLD_CTRL, data); >> +} >> + >> +static int hci_extcap_hardware_id(struct mchp_i3c_hci *hci, void __iomem *base) >> +{ >> + hci->vendor_mipi_id = readl(base + 0x04); >> + hci->vendor_version_id = readl(base + 0x08); >> + hci->vendor_product_id = readl(base + 0x0c); >> + >> + dev_info(&hci->master.dev, "vendor MIPI ID: %#x\n", hci->vendor_mipi_id); >> + dev_info(&hci->master.dev, "vendor version ID: %#x\n", hci->vendor_version_id); >> + dev_info(&hci->master.dev, "vendor product ID: %#x\n", hci->vendor_product_id); >> + >> + return 0; >> +} >> + >> +static int hci_extcap_master_config(struct mchp_i3c_hci *hci, void __iomem *base) >> +{ >> + u32 master_config = readl(base + 0x04); >> + unsigned int operation_mode = FIELD_GET(GENMASK(5, 4), master_config); >> + static const char * const functionality[] = { >> + "(unknown)", "master only", "target only", >> + "primary/secondary master" }; >> + dev_info(&hci->master.dev, "operation mode: %s\n", functionality[operation_mode]); >> + if (operation_mode & 0x1) >> + return 0; >> + dev_err(&hci->master.dev, "only master mode is currently supported\n"); >> + return -EOPNOTSUPP; >> +} >> + >> +static int hci_extcap_debug(struct mchp_i3c_hci *hci, void __iomem *base) >> +{ >> + dev_info(&hci->master.dev, "debug registers present\n"); >> + hci->DEBUG_regs = base; >> + return 0; >> +} >> + >> +static const struct hci_ext_caps ext_capabilities[] = { >> + EXT_CAP(0x01, 0x0c, hci_extcap_hardware_id), >> + EXT_CAP(0x02, 0x04, hci_extcap_master_config), >> + EXT_CAP(0x0c, 0x10, hci_extcap_debug), >> +}; >> + >> +static int i3c_hci_parse_ext_caps(struct mchp_i3c_hci *hci) >> +{ >> + void __iomem *curr_cap = hci->EXTCAPS_regs; >> + void __iomem *end = curr_cap + 0x1000; /* some arbitrary limit */ >> + u32 cap_header, cap_id, cap_length; >> + const struct hci_ext_caps *cap_entry; >> + int i, err = 0; >> + >> + if (!curr_cap) >> + return 0; >> + >> + for (; !err && curr_cap < end; curr_cap += cap_length * 4) { >> + cap_header = readl(curr_cap); >> + cap_id = FIELD_GET(CAP_HEADER_ID, cap_header); >> + cap_length = FIELD_GET(CAP_HEADER_LENGTH, cap_header); >> + dev_dbg(&hci->master.dev,"id=0x%02x length=%d", cap_id, cap_length); >> + if (!cap_length) >> + break; >> + if (curr_cap + cap_length * 4 >= end) { >> + dev_err(&hci->master.dev, >> + "ext_cap 0x%02x has size %d (too big)\n", >> + cap_id, cap_length); >> + err = -EINVAL; >> + break; >> + } >> + cap_entry = NULL; >> + for (i = 0; i < ARRAY_SIZE(ext_capabilities); i++) { >> + if (ext_capabilities[i].id == cap_id) { >> + cap_entry = &ext_capabilities[i]; >> + break; >> + } >> + } >> + if (!cap_entry) { >> + dev_notice(&hci->master.dev, >> + "unknown ext_cap 0x%02x\n", cap_id); >> + } else if (cap_length < cap_entry->min_length) { >> + dev_err(&hci->master.dev, >> + "ext_cap 0x%02x has size %d (expecting >= %d)\n", >> + cap_id, cap_length, cap_entry->min_length); >> + err = -EINVAL; >> + } else { >> + err = cap_entry->parser(hci, curr_cap); >> + } >> + } >> + return err; >> +} >> + >> +static inline bool dynaddr_parity(unsigned int addr) >> +{ >> + addr |= 1 << 7; >> + addr += addr >> 4; >> + addr += addr >> 2; >> + addr += addr >> 1; >> + return (addr & 1); >> +} >> + >> +static int mchp_hci_dat_v1_init(struct mchp_i3c_hci *hci) >> +{ >> + unsigned int dat_idx; >> + >> + if (!hci->DAT_regs) { >> + dev_err(&hci->master.dev, >> + "only DAT in register space is supported at the moment\n"); >> + return -EOPNOTSUPP; >> + } >> + if (hci->DAT_entry_size != 8) { >> + dev_err(&hci->master.dev, >> + "only 8-bytes DAT entries are supported at the moment\n"); >> + return -EOPNOTSUPP; >> + } >> + >> + if (!hci->DAT_data) { >> + /* use a bitmap for faster free slot search */ >> + hci->DAT_data = bitmap_zalloc(hci->DAT_entries, GFP_KERNEL); >> + if (!hci->DAT_data) >> + return -ENOMEM; >> + >> + /* clear them */ >> + for (dat_idx = 0; dat_idx < hci->DAT_entries; dat_idx++) { >> + dat_w0_write(dat_idx, 0); >> + dat_w1_write(dat_idx, 0); >> + } >> + } >> + >> + return 0; >> +} >> + >> +static void mchp_hci_dat_v1_cleanup(struct mchp_i3c_hci *hci) >> +{ >> + bitmap_free(hci->DAT_data); >> + hci->DAT_data = NULL; >> +} >> + >> +static int mchp_hci_dat_v1_alloc_entry(struct mchp_i3c_hci *hci) >> +{ >> + unsigned int dat_idx; >> + int ret; >> + >> + if (!hci->DAT_data) { >> + ret = mchp_hci_dat_v1_init(hci); >> + if (ret) >> + return ret; >> + } >> + dat_idx = find_first_zero_bit(hci->DAT_data, hci->DAT_entries); >> + if (dat_idx >= hci->DAT_entries) >> + return -ENOENT; >> + __set_bit(dat_idx, hci->DAT_data); >> + >> + /* default flags */ >> + dat_w0_write(dat_idx, DAT_0_SIR_REJECT | DAT_0_MR_REJECT); >> + >> + return dat_idx; >> +} >> + >> +static void mchp_hci_dat_v1_free_entry(struct mchp_i3c_hci *hci, unsigned int dat_idx) >> +{ >> + dat_w0_write(dat_idx, 0); >> + dat_w1_write(dat_idx, 0); >> + if (hci->DAT_data) >> + __clear_bit(dat_idx, hci->DAT_data); >> +} >> + >> +static void mchp_hci_dat_v1_set_dynamic_addr(struct mchp_i3c_hci *hci, >> + unsigned int dat_idx, u8 address) >> +{ >> + u32 dat_w0; >> + >> + dat_w0 = dat_w0_read(dat_idx); >> + dat_w0 &= ~(DAT_0_DYNAMIC_ADDRESS | DAT_0_DYNADDR_PARITY); >> + dat_w0 |= FIELD_PREP(DAT_0_DYNAMIC_ADDRESS, address) | >> + (dynaddr_parity(address) ? DAT_0_DYNADDR_PARITY : 0); >> + dat_w0_write(dat_idx, dat_w0); >> +} >> + >> +static void mchp_hci_dat_v1_set_static_addr(struct mchp_i3c_hci *hci, >> + unsigned int dat_idx, u8 address) >> +{ >> + u32 dat_w0; >> + >> + dat_w0 = dat_w0_read(dat_idx); >> + dat_w0 &= ~DAT_0_STATIC_ADDRESS; >> + dat_w0 |= FIELD_PREP(DAT_0_STATIC_ADDRESS, address); >> + dat_w0_write(dat_idx, dat_w0); >> +} >> + >> +static void mchp_hci_dat_v1_set_flags(struct mchp_i3c_hci *hci, unsigned int dat_idx, >> + u32 w0_flags, u32 w1_flags) >> +{ >> + u32 dat_w0, dat_w1; >> + >> + dat_w0 = dat_w0_read(dat_idx); >> + dat_w1 = dat_w1_read(dat_idx); >> + dat_w0 |= w0_flags; >> + dat_w1 |= w1_flags; >> + dat_w0_write(dat_idx, dat_w0); >> + dat_w1_write(dat_idx, dat_w1); >> +} >> + >> +static void mchp_hci_dat_v1_clear_flags(struct mchp_i3c_hci *hci, unsigned int dat_idx, >> + u32 w0_flags, u32 w1_flags) >> +{ >> + u32 dat_w0, dat_w1; >> + >> + dat_w0 = dat_w0_read(dat_idx); >> + dat_w1 = dat_w1_read(dat_idx); >> + dat_w0 &= ~w0_flags; >> + dat_w1 &= ~w1_flags; >> + dat_w0_write(dat_idx, dat_w0); >> + dat_w1_write(dat_idx, dat_w1); >> +} >> + >> +static int mchp_hci_dat_v1_get_index(struct mchp_i3c_hci *hci, u8 dev_addr) >> +{ >> + unsigned int dat_idx; >> + u32 dat_w0; >> + >> + for_each_set_bit(dat_idx, hci->DAT_data, hci->DAT_entries) { >> + dat_w0 = dat_w0_read(dat_idx); >> + if (FIELD_GET(DAT_0_DYNAMIC_ADDRESS, dat_w0) == dev_addr) >> + return dat_idx; >> + } >> + >> + return -ENODEV; >> +} >> + >> +const struct mchp_hci_dat_ops mchp_mipi_i3c_hci_dat_v1 = { >> + .init = mchp_hci_dat_v1_init, >> + .cleanup = mchp_hci_dat_v1_cleanup, >> + .alloc_entry = mchp_hci_dat_v1_alloc_entry, >> + .free_entry = mchp_hci_dat_v1_free_entry, >> + .set_dynamic_addr = mchp_hci_dat_v1_set_dynamic_addr, >> + .set_static_addr = mchp_hci_dat_v1_set_static_addr, >> + .set_flags = mchp_hci_dat_v1_set_flags, >> + .clear_flags = mchp_hci_dat_v1_clear_flags, >> + .get_index = mchp_hci_dat_v1_get_index, >> +}; >> + >> +/* >> + * Device Characteristic Table >> + */ >> + >> +void mchp_i3c_hci_dct_get_val(struct mchp_i3c_hci *hci, unsigned int dct_idx, >> + u64 *pid, unsigned int *dcr, unsigned int *bcr) >> +{ >> + void __iomem *reg = hci->DCT_regs + dct_idx * 4 * 4; >> + u32 dct_entry_data[4]; >> + unsigned int i; >> + >> + for (i = 0; i < 4; i++) { >> + dct_entry_data[i] = readl(reg); >> + reg += 4; >> + } >> + >> + *pid = ((u64)dct_entry_data[0]) << (47 - 32 + 1) | >> + FIELD_GET(W1_MASK(47, 32), dct_entry_data[1]); >> + *dcr = FIELD_GET(W2_MASK(71, 64), dct_entry_data[2]); >> + *bcr = FIELD_GET(W2_MASK(79, 72), dct_entry_data[2]); >> +} >> + >> +static enum mchp_hci_cmd_mode mchp_get_i3c_mode(struct mchp_i3c_hci *hci) >> +{ >> + struct i3c_bus *bus = i3c_master_get_bus(&hci->master); >> + >> + if (bus->scl_rate.i3c > 8000000) >> + return MODE_I3C_SDR0; >> + if (bus->scl_rate.i3c > 6000000) >> + return MODE_I3C_SDR1; >> + if (bus->scl_rate.i3c > 4000000) >> + return MODE_I3C_SDR2; >> + if (bus->scl_rate.i3c > 2000000) >> + return MODE_I3C_SDR3; >> + return MODE_I3C_SDR4; >> +} >> + >> +static enum mchp_hci_cmd_mode mchp_get_i2c_mode(struct mchp_i3c_hci *hci) >> +{ >> + struct i3c_bus *bus = i3c_master_get_bus(&hci->master); >> + >> + if (bus->scl_rate.i2c >= 1000000) >> + return MODE_I2C_FmP; >> + return MODE_I2C_Fm; >> +} >> + >> +static void mchp_fill_data_bytes(struct mchp_hci_xfer *xfer, u8 *data, >> + unsigned int data_len) >> +{ >> + xfer->cmd_desc[1] = 0; >> + switch (data_len) { >> + case 4: >> + xfer->cmd_desc[1] |= CMD_I1_DATA_BYTE_4(data[3]); >> + fallthrough; >> + case 3: >> + xfer->cmd_desc[1] |= CMD_I1_DATA_BYTE_3(data[2]); >> + fallthrough; >> + case 2: >> + xfer->cmd_desc[1] |= CMD_I1_DATA_BYTE_2(data[1]); >> + fallthrough; >> + case 1: >> + xfer->cmd_desc[1] |= CMD_I1_DATA_BYTE_1(data[0]); >> + fallthrough; >> + case 0: >> + break; >> + } >> + /* we consumed all the data with the cmd descriptor */ >> + xfer->data = NULL; >> +} >> + >> +static int mchp_hci_cmd_v1_prep_ccc(struct mchp_i3c_hci *hci, >> + struct mchp_hci_xfer *xfer, >> + u8 ccc_addr, u8 ccc_cmd, bool raw) >> +{ >> + unsigned int dat_idx = 0; >> + enum mchp_hci_cmd_mode mode = mchp_get_i3c_mode(hci); >> + u8 *data = xfer->data; >> + unsigned int data_len = xfer->data_len; >> + bool rnw = xfer->rnw; >> + int ret; >> + >> + /* this should never happen */ >> + if (WARN_ON(raw)) >> + return -EINVAL; >> + >> + if (ccc_addr != I3C_BROADCAST_ADDR) { >> + ret = mchp_mipi_i3c_hci_dat_v1.get_index(hci, ccc_addr); >> + if (ret < 0) >> + return ret; >> + dat_idx = ret; >> + } >> + >> + xfer->cmd_tid = mchp_hci_get_tid(); >> + >> + if (!rnw && data_len <= 4) { >> + /* we use an Immediate Data Transfer Command */ >> + xfer->cmd_desc[0] = >> + CMD_0_ATTR_I | >> + CMD_I0_TID(xfer->cmd_tid) | >> + CMD_I0_CMD(ccc_cmd) | CMD_I0_CP | >> + CMD_I0_DEV_INDEX(dat_idx) | >> + CMD_I0_DTT(data_len) | >> + CMD_I0_MODE(mode); >> + mchp_fill_data_bytes(xfer, data, data_len); >> + } else { >> + /* we use a Regular Data Transfer Command */ >> + xfer->cmd_desc[0] = >> + CMD_0_ATTR_R | >> + CMD_R0_TID(xfer->cmd_tid) | >> + CMD_R0_CMD(ccc_cmd) | CMD_R0_CP | >> + CMD_R0_DEV_INDEX(dat_idx) | >> + CMD_R0_MODE(mode) | >> + (rnw ? CMD_R0_RNW : 0); >> + xfer->cmd_desc[1] = >> + CMD_R1_DATA_LENGTH(data_len); >> + } >> + >> + return 0; >> +} >> + >> +static void mchp_hci_cmd_v1_prep_i3c_xfer(struct mchp_i3c_hci *hci, >> + struct i3c_dev_desc *dev, >> + struct mchp_hci_xfer *xfer) >> +{ >> + struct mchp_i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); >> + unsigned int dat_idx = dev_data->dat_idx; >> + enum mchp_hci_cmd_mode mode = mchp_get_i3c_mode(hci); >> + u8 *data = xfer->data; >> + unsigned int data_len = xfer->data_len; >> + bool rnw = xfer->rnw; >> + >> + xfer->cmd_tid = mchp_hci_get_tid(); >> + >> + if (!rnw && data_len <= 4) { >> + /* we use an Immediate Data Transfer Command */ >> + xfer->cmd_desc[0] = >> + CMD_0_ATTR_I | >> + CMD_I0_TID(xfer->cmd_tid) | >> + CMD_I0_DEV_INDEX(dat_idx) | >> + CMD_I0_DTT(data_len) | >> + CMD_I0_MODE(mode); >> + mchp_fill_data_bytes(xfer, data, data_len); >> + } else { >> + /* we use a Regular Data Transfer Command */ >> + xfer->cmd_desc[0] = >> + CMD_0_ATTR_R | >> + CMD_R0_TID(xfer->cmd_tid) | >> + CMD_R0_DEV_INDEX(dat_idx) | >> + CMD_R0_MODE(mode) | >> + (rnw ? CMD_R0_RNW : 0); >> + xfer->cmd_desc[1] = >> + CMD_R1_DATA_LENGTH(data_len); >> + } >> +} >> + >> +static void mchp_hci_cmd_v1_prep_i2c_xfer(struct mchp_i3c_hci *hci, >> + struct i2c_dev_desc *dev, >> + struct mchp_hci_xfer *xfer) >> +{ >> + struct mchp_i3c_hci_dev_data *dev_data = i2c_dev_get_master_data(dev); >> + unsigned int dat_idx = dev_data->dat_idx; >> + enum mchp_hci_cmd_mode mode = mchp_get_i2c_mode(hci); >> + u8 *data = xfer->data; >> + unsigned int data_len = xfer->data_len; >> + bool rnw = xfer->rnw; >> + >> + xfer->cmd_tid = mchp_hci_get_tid(); >> + >> + if (!rnw && data_len <= 4) { >> + /* we use an Immediate Data Transfer Command */ >> + xfer->cmd_desc[0] = >> + CMD_0_ATTR_I | >> + CMD_I0_TID(xfer->cmd_tid) | >> + CMD_I0_DEV_INDEX(dat_idx) | >> + CMD_I0_DTT(data_len) | >> + CMD_I0_MODE(mode); >> + mchp_fill_data_bytes(xfer, data, data_len); >> + } else { >> + /* we use a Regular Data Transfer Command */ >> + xfer->cmd_desc[0] = >> + CMD_0_ATTR_R | >> + CMD_R0_TID(xfer->cmd_tid) | >> + CMD_R0_DEV_INDEX(dat_idx) | >> + CMD_R0_MODE(mode) | >> + (rnw ? CMD_R0_RNW : 0); >> + xfer->cmd_desc[1] = >> + CMD_R1_DATA_LENGTH(data_len); >> + } >> +} >> + >> +static int mchp_hci_cmd_v1_daa(struct mchp_i3c_hci *hci) >> +{ >> + struct mchp_hci_xfer *xfer; >> + int ret, dat_idx = -1; >> + u8 next_addr = 0; >> + u64 pid; >> + unsigned int dcr, bcr; >> + DECLARE_COMPLETION_ONSTACK(done); >> + >> + xfer = mchp_hci_alloc_xfer(1); >> + if (!xfer) >> + return -ENOMEM; >> + >> + /* >> + * Simple for now: we allocate a temporary DAT entry, do a single >> + * DAA, register the device which will allocate its own DAT entry >> + * via the core callback, then free the temporary DAT entry. >> + * Loop until there is no more devices to assign an address to. >> + * Yes, there is room for improvements. >> + */ >> + for (;;) { >> + ret = mchp_mipi_i3c_hci_dat_v1.alloc_entry(hci); >> + if (ret < 0) >> + break; >> + dat_idx = ret; >> + ret = i3c_master_get_free_addr(&hci->master, next_addr); >> + if (ret < 0) >> + break; >> + next_addr = ret; >> + >> + dev_dbg(&hci->master.dev,"next_addr = 0x%02x, DAA using DAT %d", next_addr, dat_idx); >> + mchp_mipi_i3c_hci_dat_v1.set_dynamic_addr(hci, dat_idx, next_addr); >> + mchp_mipi_i3c_hci_dct_index_reset(hci); >> + >> + xfer->cmd_tid = mchp_hci_get_tid(); >> + xfer->cmd_desc[0] = >> + CMD_0_ATTR_A | >> + CMD_A0_TID(xfer->cmd_tid) | >> + CMD_A0_CMD(I3C_CCC_ENTDAA) | >> + CMD_A0_DEV_INDEX(dat_idx) | >> + CMD_A0_DEV_COUNT(1) | >> + CMD_A0_ROC | CMD_A0_TOC; >> + xfer->cmd_desc[1] = 0; >> + xfer->completion = &done; >> + hci->io->queue_xfer(hci, xfer, 1); >> + if (!wait_for_completion_timeout(&done, HZ) && >> + hci->io->dequeue_xfer(hci, xfer, 1)) { >> + ret = -ETIME; >> + break; >> + } >> + if ((RESP_STATUS(xfer->response) == RESP_ERR_ADDR_HEADER || >> + RESP_STATUS(xfer->response) == RESP_ERR_NACK) && >> + RESP_DATA_LENGTH(xfer->response) == 1) { >> + ret = 0; /* no more devices to be assigned */ >> + break; >> + } >> + if (RESP_STATUS(xfer->response) != RESP_SUCCESS) { >> + ret = -EIO; >> + break; >> + } >> + >> + mchp_i3c_hci_dct_get_val(hci, 0, &pid, &dcr, &bcr); >> + dev_dbg(&hci->master.dev,"assigned address %#x to device PID=0x%llx DCR=%#x BCR=%#x", >> + next_addr, pid, dcr, bcr); >> + >> + mchp_mipi_i3c_hci_dat_v1.free_entry(hci, dat_idx); >> + dat_idx = -1; >> + >> + /* >> + * TODO: Extend the subsystem layer to allow for registering >> + * new device and provide BCR/DCR/PID at the same time. >> + */ >> + ret = i3c_master_add_i3c_dev_locked(&hci->master, next_addr); >> + if (ret) >> + break; >> + } >> + >> + if (dat_idx >= 0) >> + mchp_mipi_i3c_hci_dat_v1.free_entry(hci, dat_idx); >> + mchp_hci_free_xfer(xfer, 1); >> + return ret; >> +} >> + >> +const struct mchp_hci_cmd_ops mchp_mipi_i3c_hci_cmd_v1 = { >> + .prep_ccc = mchp_hci_cmd_v1_prep_ccc, >> + .prep_i3c_xfer = mchp_hci_cmd_v1_prep_i3c_xfer, >> + .prep_i2c_xfer = mchp_hci_cmd_v1_prep_i2c_xfer, >> + .perform_daa = mchp_hci_cmd_v1_daa, >> +}; >> + >> +static int mchp_hci_pio_init(struct mchp_i3c_hci *hci) >> +{ >> + struct mchp_hci_pio_data *pio; >> + u32 val, size_val, rx_thresh, tx_thresh, ibi_val; >> + >> + pio = kzalloc(sizeof(*pio), GFP_KERNEL); >> + if (!pio) >> + return -ENOMEM; >> + >> + hci->io_data = pio; >> + spin_lock_init(&pio->lock); >> + >> + size_val = pio_reg_read(MCHP_QUEUE_SIZE); >> + dev_info(&hci->master.dev, "CMD/RESP FIFO = %ld entries\n", >> + FIELD_GET(MCHP_CR_QUEUE_SIZE, size_val)); >> + dev_info(&hci->master.dev, "IBI FIFO = %ld bytes\n", >> + 4 * FIELD_GET(MCHP_IBI_STATUS_SIZE, size_val)); >> + dev_info(&hci->master.dev, "RX data FIFO = %d bytes\n", >> + 4 * (2 << FIELD_GET(MCHP_RX_DATA_BUFFER_SIZE, size_val))); >> + dev_info(&hci->master.dev, "TX data FIFO = %d bytes\n", >> + 4 * (2 << FIELD_GET(MCHP_TX_DATA_BUFFER_SIZE, size_val))); >> + >> + /* >> + * Let's initialize data thresholds to half of the actual FIFO size. >> + * The start thresholds aren't used (set to 0) as the FIFO is always >> + * serviced before the corresponding command is queued. >> + */ >> + rx_thresh = FIELD_GET(MCHP_RX_DATA_BUFFER_SIZE, size_val); >> + tx_thresh = FIELD_GET(MCHP_TX_DATA_BUFFER_SIZE, size_val); >> + if (hci->version_major == 1) { >> + /* those are expressed as 2^[n+1), so just sub 1 if not 0 */ >> + if (rx_thresh) >> + rx_thresh -= 1; >> + if (tx_thresh) >> + tx_thresh -= 1; >> + pio->rx_thresh_size = 2 << rx_thresh; >> + pio->tx_thresh_size = 2 << tx_thresh; >> + } else { >> + /* size is 2^(n+1) and threshold is 2^n i.e. already halved */ >> + pio->rx_thresh_size = 1 << rx_thresh; >> + pio->tx_thresh_size = 1 << tx_thresh; >> + } >> + val = FIELD_PREP(MCHP_DATA_RX_BUF_THLD, rx_thresh) | >> + FIELD_PREP(MCHP_DATA_TX_BUF_THLD, tx_thresh); >> + pio_reg_write(MCHP_DATA_BUFFER_THLD_CTRL, val); >> + >> + /* >> + * Let's raise an interrupt as soon as there is one free cmd slot >> + * or one available response or IBI. For IBI data let's use half the >> + * IBI queue size within allowed bounds. >> + */ >> + ibi_val = FIELD_GET(MCHP_IBI_STATUS_SIZE, size_val); >> + pio->max_ibi_thresh = clamp_val(ibi_val/2, 1, 63); >> + val = FIELD_PREP(MCHP_QUEUE_IBI_STATUS_THLD, 1) | >> + FIELD_PREP(MCHP_QUEUE_IBI_DATA_THLD, pio->max_ibi_thresh) | >> + FIELD_PREP(MCHP_QUEUE_RESP_BUF_THLD, 1) | >> + FIELD_PREP(MCHP_QUEUE_CMD_EMPTY_BUF_THLD, 1); >> + pio_reg_write(MCHP_QUEUE_THLD_CTRL, val); >> + pio->reg_queue_thresh = val; >> + >> + /* Disable all IRQs but allow all status bits */ >> + pio_reg_write(MCHP_INTR_SIGNAL_ENABLE, 0x0); >> + pio_reg_write(MCHP_INTR_STATUS_ENABLE, 0xffffffff); >> + >> + /* Always accept error interrupts (will be activated on first xfer) */ >> + pio->enabled_irqs = STAT_ALL_ERRORS; >> + >> + return 0; >> +} >> + >> +static void mchp_hci_pio_cleanup(struct mchp_i3c_hci *hci) >> +{ >> + struct mchp_hci_pio_data *pio = hci->io_data; >> + >> + pio_reg_write(MCHP_INTR_SIGNAL_ENABLE, 0x0); >> + >> + if (pio) { >> + dev_dbg(&hci->master.dev,"status = %#x/%#x", >> + pio_reg_read(MCHP_INTR_STATUS), pio_reg_read(MCHP_INTR_SIGNAL_ENABLE)); >> + BUG_ON(pio->curr_xfer); >> + BUG_ON(pio->curr_rx); >> + BUG_ON(pio->curr_tx); >> + BUG_ON(pio->curr_resp); >> + kfree(pio); >> + hci->io_data = NULL; >> + } >> +} >> + >> +static void mchp_hci_pio_write_cmd(struct mchp_i3c_hci *hci, struct mchp_hci_xfer *xfer) >> +{ >> + dev_dbg(&hci->master.dev,"cmd_desc[%d] = 0x%08x", 0, xfer->cmd_desc[0]); >> + dev_dbg(&hci->master.dev,"cmd_desc[%d] = 0x%08x", 1, xfer->cmd_desc[1]); >> + pio_reg_write(MCHP_COMMAND_QUEUE_PORT, xfer->cmd_desc[0]); >> + pio_reg_write(MCHP_COMMAND_QUEUE_PORT, xfer->cmd_desc[1]); >> +} >> + >> +static bool mchp_hci_pio_do_rx(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + struct mchp_hci_xfer *xfer = pio->curr_rx; >> + unsigned int nr_words; >> + u32 *p; >> + >> + p = xfer->data; >> + p += (xfer->data_len - xfer->data_left) / 4; >> + >> + while (xfer->data_left >= 4) { >> + /* bail out if FIFO hasn't reached the threshold value yet */ >> + if (!(pio_reg_read(MCHP_INTR_STATUS) & STAT_RX_THLD)) >> + return false; >> + nr_words = min(xfer->data_left / 4, pio->rx_thresh_size); >> + /* extract data from FIFO */ >> + xfer->data_left -= nr_words * 4; >> + dev_dbg(&hci->master.dev,"now %d left %d", nr_words * 4, xfer->data_left); >> + while (nr_words--) >> + *p++ = pio_reg_read(MCHP_XFER_DATA_PORT); >> + } >> + >> + /* trailing data is retrieved upon response reception */ >> + return !xfer->data_left; >> +} >> + >> +static void mchp_hci_pio_do_trailing_rx(struct mchp_i3c_hci *hci, >> + struct mchp_hci_pio_data *pio, unsigned int count) >> +{ >> + struct mchp_hci_xfer *xfer = pio->curr_rx; >> + u32 *p; >> + >> + dev_dbg(&hci->master.dev,"%d remaining", count); >> + >> + p = xfer->data; >> + p += (xfer->data_len - xfer->data_left) / 4; >> + >> + if (count >= 4) { >> + unsigned int nr_words = count / 4; >> + /* extract data from FIFO */ >> + xfer->data_left -= nr_words * 4; >> + dev_dbg(&hci->master.dev,"now %d left %d", nr_words * 4, xfer->data_left); >> + while (nr_words--) >> + *p++ = pio_reg_read(MCHP_XFER_DATA_PORT); >> + } >> + >> + count &= 3; >> + if (count) { >> + /* >> + * There are trailing bytes in the last word. >> + * Fetch it and extract bytes in an endian independent way. >> + * Unlike the TX case, we must not write memory past the >> + * end of the destination buffer. >> + */ >> + u8 *p_byte = (u8 *)p; >> + u32 data = pio_reg_read(MCHP_XFER_DATA_PORT); >> + >> + xfer->data_word_before_partial = data; >> + xfer->data_left -= count; >> + data = (__force u32) cpu_to_le32(data); >> + while (count--) { >> + *p_byte++ = data; >> + data >>= 8; >> + } >> + } >> +} >> + >> +static bool mchp_hci_pio_do_tx(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + struct mchp_hci_xfer *xfer = pio->curr_tx; >> + unsigned int nr_words; >> + u32 *p; >> + >> + p = xfer->data; >> + p += (xfer->data_len - xfer->data_left) / 4; >> + >> + while (xfer->data_left >= 4) { >> + /* bail out if FIFO free space is below set threshold */ >> + if (!(pio_reg_read(MCHP_INTR_STATUS) & STAT_TX_THLD)) >> + return false; >> + /* we can fill up to that TX threshold */ >> + nr_words = min(xfer->data_left / 4, pio->tx_thresh_size); >> + /* push data into the FIFO */ >> + xfer->data_left -= nr_words * 4; >> + dev_dbg(&hci->master.dev,"now %d left %d", nr_words * 4, xfer->data_left); >> + while (nr_words--) >> + pio_reg_write(MCHP_XFER_DATA_PORT, *p++); >> + } >> + >> + if (xfer->data_left) { >> + /* >> + * There are trailing bytes to send. We can simply load >> + * them from memory as a word which will keep those bytes >> + * in their proper place even on a BE system. This will >> + * also get some bytes past the actual buffer but no one >> + * should care as they won't be sent out. >> + */ >> + if (!(pio_reg_read(MCHP_INTR_STATUS) & STAT_TX_THLD)) >> + return false; >> + dev_dbg(&hci->master.dev,"trailing %d", xfer->data_left); >> + pio_reg_write(MCHP_XFER_DATA_PORT, *p); >> + xfer->data_left = 0; >> + } >> + >> + return true; >> +} >> + >> +static bool mchp_hci_pio_process_rx(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + while (pio->curr_rx && mchp_hci_pio_do_rx(hci, pio)) >> + pio->curr_rx = pio->curr_rx->next_data; >> + return !pio->curr_rx; >> +} >> + >> +static bool mchp_hci_pio_process_tx(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + while (pio->curr_tx && mchp_hci_pio_do_tx(hci, pio)) >> + pio->curr_tx = pio->curr_tx->next_data; >> + return !pio->curr_tx; >> +} >> + >> +static void mchp_hci_pio_queue_data(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + struct mchp_hci_xfer *xfer = pio->curr_xfer; >> + struct mchp_hci_xfer *prev_queue_tail; >> + >> + if (!xfer->data) { >> + xfer->data_len = xfer->data_left = 0; >> + return; >> + } >> + >> + if (xfer->rnw) { >> + prev_queue_tail = pio->rx_queue; >> + pio->rx_queue = xfer; >> + if (pio->curr_rx) { >> + prev_queue_tail->next_data = xfer; >> + } else { >> + pio->curr_rx = xfer; >> + if (!mchp_hci_pio_process_rx(hci, pio)) >> + pio->enabled_irqs |= STAT_RX_THLD; >> + } >> + } else { >> + prev_queue_tail = pio->tx_queue; >> + pio->tx_queue = xfer; >> + if (pio->curr_tx) { >> + prev_queue_tail->next_data = xfer; >> + } else { >> + pio->curr_tx = xfer; >> + if (!mchp_hci_pio_process_tx(hci, pio)) >> + pio->enabled_irqs |= STAT_TX_THLD; >> + } >> + } >> +} >> + >> +static void mchp_hci_pio_push_to_next_rx(struct mchp_i3c_hci *hci, struct mchp_hci_xfer *xfer, >> + unsigned int words_to_keep) >> +{ >> + u32 *from = xfer->data; >> + u32 from_last; >> + unsigned int received, count; >> + >> + received = (xfer->data_len - xfer->data_left) / 4; >> + if ((xfer->data_len - xfer->data_left) & 3) { >> + from_last = xfer->data_word_before_partial; >> + received += 1; >> + } else { >> + from_last = from[received]; >> + } >> + from += words_to_keep; >> + count = received - words_to_keep; >> + >> + while (count) { >> + unsigned int room, left, chunk, bytes_to_move; >> + u32 last_word; >> + >> + xfer = xfer->next_data; >> + if (!xfer) { >> + dev_err(&hci->master.dev, "pushing RX data to unexistent xfer\n"); >> + return; >> + } >> + >> + room = DIV_ROUND_UP(xfer->data_len, 4); >> + left = DIV_ROUND_UP(xfer->data_left, 4); >> + chunk = min(count, room); >> + if (chunk > left) { >> + mchp_hci_pio_push_to_next_rx(hci, xfer, chunk - left); >> + left = chunk; >> + xfer->data_left = left * 4; >> + } >> + >> + bytes_to_move = xfer->data_len - xfer->data_left; >> + if (bytes_to_move & 3) { >> + /* preserve word to become partial */ >> + u32 *p = xfer->data; >> + >> + xfer->data_word_before_partial = p[bytes_to_move / 4]; >> + } >> + memmove(xfer->data + chunk, xfer->data, bytes_to_move); >> + >> + /* treat last word specially because of partial word issues */ >> + chunk -= 1; >> + >> + memcpy(xfer->data, from, chunk * 4); >> + xfer->data_left -= chunk * 4; >> + from += chunk; >> + count -= chunk; >> + >> + last_word = (count == 1) ? from_last : *from++; >> + if (xfer->data_left < 4) { >> + /* >> + * Like in hci_pio_do_trailing_rx(), preserve original >> + * word to be stored partially then store bytes it >> + * in an endian independent way. >> + */ >> + u8 *p_byte = xfer->data; >> + >> + p_byte += chunk * 4; >> + xfer->data_word_before_partial = last_word; >> + last_word = (__force u32) cpu_to_le32(last_word); >> + while (xfer->data_left--) { >> + *p_byte++ = last_word; >> + last_word >>= 8; >> + } >> + } else { >> + u32 *p = xfer->data; >> + >> + p[chunk] = last_word; >> + xfer->data_left -= 4; >> + } >> + count--; >> + } >> +} >> + >> +static bool mchp_hci_pio_process_resp(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + while (pio->curr_resp && >> + (pio_reg_read(MCHP_INTR_STATUS) & STAT_RESP_READY)) { >> + struct mchp_hci_xfer *xfer = pio->curr_resp; >> + u32 resp = pio_reg_read(MCHP_RESPONSE_QUEUE_PORT); >> + unsigned int tid = RESP_TID(resp); >> + >> + dev_dbg(&hci->master.dev,"resp = 0x%08x", resp); >> + if (tid != xfer->cmd_tid) { >> + dev_err(&hci->master.dev, >> + "response tid=%d when expecting %d\n", >> + tid, xfer->cmd_tid); >> + /* let's pretend it is a prog error... any of them */ >> + mchp_hci_pio_err(hci, pio, STAT_PROG_ERRORS); >> + return false; >> + } >> + xfer->response = resp; >> + >> + if (pio->curr_rx == xfer) { >> + /* >> + * Response availability implies RX completion. >> + * Retrieve trailing RX data if any. >> + * Note that short reads are possible. >> + */ >> + unsigned int received, expected, to_keep; >> + >> + received = xfer->data_len - xfer->data_left; >> + expected = RESP_DATA_LENGTH(xfer->response); >> + if (expected > received) { >> + mchp_hci_pio_do_trailing_rx(hci, pio, >> + expected - received); >> + } else if (received > expected) { >> + /* we consumed data meant for next xfer */ >> + to_keep = DIV_ROUND_UP(expected, 4); >> + mchp_hci_pio_push_to_next_rx(hci, xfer, to_keep); >> + } >> + >> + /* then process the RX list pointer */ >> + if (mchp_hci_pio_process_rx(hci, pio)) >> + pio->enabled_irqs &= ~STAT_RX_THLD; >> + } >> + >> + /* >> + * We're about to give back ownership of the xfer structure >> + * to the waiting instance. Make sure no reference to it >> + * still exists. >> + */ >> + if (pio->curr_rx == xfer) { >> + dev_dbg(&hci->master.dev,"short RX ?"); >> + pio->curr_rx = pio->curr_rx->next_data; >> + } else if (pio->curr_tx == xfer) { >> + dev_dbg(&hci->master.dev,"short TX ?"); >> + pio->curr_tx = pio->curr_tx->next_data; >> + } else if (xfer->data_left) { >> + dev_dbg(&hci->master.dev,"PIO xfer count = %d after response", >> + xfer->data_left); >> + } >> + >> + pio->curr_resp = xfer->next_resp; >> + if (xfer->completion) >> + complete(xfer->completion); >> + } >> + return !pio->curr_resp; >> +} >> + >> +static void mchp_hci_pio_queue_resp(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + struct mchp_hci_xfer *xfer = pio->curr_xfer; >> + struct mchp_hci_xfer *prev_queue_tail; >> + >> + if (!(xfer->cmd_desc[0] & CMD_0_ROC)) >> + return; >> + >> + prev_queue_tail = pio->resp_queue; >> + pio->resp_queue = xfer; >> + if (pio->curr_resp) { >> + prev_queue_tail->next_resp = xfer; >> + } else { >> + pio->curr_resp = xfer; >> + if (!mchp_hci_pio_process_resp(hci, pio)) >> + pio->enabled_irqs |= STAT_RESP_READY; >> + } >> +} >> + >> +static bool mchp_hci_pio_process_cmd(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + while (pio->curr_xfer && >> + (pio_reg_read(MCHP_INTR_STATUS) & STAT_CMD_QUEUE_READY)) { >> + /* >> + * Always process the data FIFO before sending the command >> + * so needed TX data or RX space is available upfront. >> + */ >> + mchp_hci_pio_queue_data(hci, pio); >> + /* >> + * Then queue our response request. This will also process >> + * the response FIFO in case it got suddenly filled up >> + * with results from previous commands. >> + */ >> + mchp_hci_pio_queue_resp(hci, pio); >> + /* >> + * Finally send the command. >> + */ >> + mchp_hci_pio_write_cmd(hci, pio->curr_xfer); >> + /* >> + * And move on. >> + */ >> + pio->curr_xfer = pio->curr_xfer->next_xfer; >> + } >> + return !pio->curr_xfer; >> +} >> + >> +static int mchp_hci_pio_queue_xfer(struct mchp_i3c_hci *hci, struct mchp_hci_xfer *xfer, int n) >> +{ >> + struct mchp_hci_pio_data *pio = hci->io_data; >> + struct mchp_hci_xfer *prev_queue_tail; >> + int i; >> + >> + dev_dbg(&hci->master.dev,"n = %d", n); >> + >> + /* link xfer instances together and initialize data count */ >> + for (i = 0; i < n; i++) { >> + xfer[i].next_xfer = (i + 1 < n) ? &xfer[i + 1] : NULL; >> + xfer[i].next_data = NULL; >> + xfer[i].next_resp = NULL; >> + xfer[i].data_left = xfer[i].data_len; >> + } >> + >> + spin_lock_irq(&pio->lock); >> + prev_queue_tail = pio->xfer_queue; >> + pio->xfer_queue = &xfer[n - 1]; >> + if (pio->curr_xfer) { >> + prev_queue_tail->next_xfer = xfer; >> + } else { >> + pio->curr_xfer = xfer; >> + if (!mchp_hci_pio_process_cmd(hci, pio)) >> + pio->enabled_irqs |= STAT_CMD_QUEUE_READY; >> + pio_reg_write(MCHP_INTR_SIGNAL_ENABLE, pio->enabled_irqs); >> + dev_dbg(&hci->master.dev,"status = %#x/%#x", >> + pio_reg_read(MCHP_INTR_STATUS), pio_reg_read(MCHP_INTR_SIGNAL_ENABLE)); >> + } >> + spin_unlock_irq(&pio->lock); >> + return 0; >> +} >> + >> +static bool mchp_hci_pio_dequeue_xfer_common(struct mchp_i3c_hci *hci, >> + struct mchp_hci_pio_data *pio, >> + struct mchp_hci_xfer *xfer, int n) >> +{ >> + struct mchp_hci_xfer *p, **p_prev_next; >> + int i; >> + >> + /* >> + * To safely dequeue a transfer request, it must be either entirely >> + * processed, or not yet processed at all. If our request tail is >> + * reachable from either the data or resp list that means the command >> + * was submitted and not yet completed. >> + */ >> + for (p = pio->curr_resp; p; p = p->next_resp) >> + for (i = 0; i < n; i++) >> + if (p == &xfer[i]) >> + goto pio_screwed; >> + for (p = pio->curr_rx; p; p = p->next_data) >> + for (i = 0; i < n; i++) >> + if (p == &xfer[i]) >> + goto pio_screwed; >> + for (p = pio->curr_tx; p; p = p->next_data) >> + for (i = 0; i < n; i++) >> + if (p == &xfer[i]) >> + goto pio_screwed; >> + >> + /* >> + * The command was completed, or wasn't yet submitted. >> + * Unlink it from the que if the later. >> + */ >> + p_prev_next = &pio->curr_xfer; >> + for (p = pio->curr_xfer; p; p = p->next_xfer) { >> + if (p == &xfer[0]) { >> + *p_prev_next = xfer[n - 1].next_xfer; >> + break; >> + } >> + p_prev_next = &p->next_xfer; >> + } >> + >> + /* return true if we actually unqueued something */ >> + return !!p; >> + >> +pio_screwed: >> + /* >> + * Life is tough. We must invalidate the hardware state and >> + * discard everything that is still queued. >> + */ >> + for (p = pio->curr_resp; p; p = p->next_resp) { >> + p->response = FIELD_PREP(RESP_ERR_FIELD, RESP_ERR_HC_TERMINATED); >> + if (p->completion) >> + complete(p->completion); >> + } >> + for (p = pio->curr_xfer; p; p = p->next_xfer) { >> + p->response = FIELD_PREP(RESP_ERR_FIELD, RESP_ERR_HC_TERMINATED); >> + if (p->completion) >> + complete(p->completion); >> + } >> + pio->curr_xfer = pio->curr_rx = pio->curr_tx = pio->curr_resp = NULL; >> + >> + return true; >> +} >> + >> +static bool mchp_hci_pio_dequeue_xfer(struct mchp_i3c_hci *hci, struct mchp_hci_xfer *xfer, int n) >> +{ >> + struct mchp_hci_pio_data *pio = hci->io_data; >> + int ret; >> + >> + spin_lock_irq(&pio->lock); >> + dev_dbg(&hci->master.dev,"n=%d status=%#x/%#x", n, >> + pio_reg_read(MCHP_INTR_STATUS), pio_reg_read(MCHP_INTR_SIGNAL_ENABLE)); >> + dev_dbg(&hci->master.dev,"main_status = %#x/%#x", >> + readl(hci->base_regs + 0x20), readl(hci->base_regs + 0x28)); >> + >> + ret = mchp_hci_pio_dequeue_xfer_common(hci, pio, xfer, n); >> + spin_unlock_irq(&pio->lock); >> + return ret; >> +} >> + >> +static void mchp_hci_pio_err(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio, >> + u32 status) >> +{ >> + /* TODO: this ought to be more sophisticated eventually */ >> + >> + if (pio_reg_read(MCHP_INTR_STATUS) & STAT_RESP_READY) { >> + /* this may happen when an error is signaled with ROC unset */ >> + u32 resp = pio_reg_read(MCHP_RESPONSE_QUEUE_PORT); >> + >> + dev_err(&hci->master.dev, >> + "orphan response (%#x) on error\n", resp); >> + } >> + >> + /* dump states on programming errors */ >> + if (status & STAT_PROG_ERRORS) { >> + u32 queue = pio_reg_read(MCHP_QUEUE_CUR_STATUS); >> + u32 data = pio_reg_read(MCHP_DATA_BUFFER_CUR_STATUS); >> + >> + dev_err(&hci->master.dev, >> + "prog error %#lx (C/R/I = %ld/%ld/%ld, TX/RX = %ld/%ld)\n", >> + status & STAT_PROG_ERRORS, >> + FIELD_GET(MCHP_CUR_CMD_Q_EMPTY_LEVEL, queue), >> + FIELD_GET(MCHP_CUR_RESP_Q_LEVEL, queue), >> + FIELD_GET(MCHP_CUR_IBI_Q_LEVEL, queue), >> + FIELD_GET(MCHP_CUR_TX_BUF_LVL, data), >> + FIELD_GET(MCHP_CUR_RX_BUF_LVL, data)); >> + } >> + >> + /* just bust out everything with pending responses for now */ >> + mchp_hci_pio_dequeue_xfer_common(hci, pio, pio->curr_resp, 1); >> + /* ... and half-way TX transfers if any */ >> + if (pio->curr_tx && pio->curr_tx->data_left != pio->curr_tx->data_len) >> + mchp_hci_pio_dequeue_xfer_common(hci, pio, pio->curr_tx, 1); >> + /* then reset the hardware */ >> + mchp_mipi_i3c_hci_pio_reset(hci); >> + mchp_mipi_i3c_hci_resume(hci); >> + >> + dev_dbg(&hci->master.dev,"status=%#x/%#x", >> + pio_reg_read(MCHP_INTR_STATUS), pio_reg_read(MCHP_INTR_SIGNAL_ENABLE)); >> +} >> + >> +static void mchp_hci_pio_set_ibi_thresh(struct mchp_i3c_hci *hci, >> + struct mchp_hci_pio_data *pio, >> + unsigned int thresh_val) >> +{ >> + u32 regval = pio->reg_queue_thresh; >> + >> + regval &= ~MCHP_QUEUE_IBI_STATUS_THLD; >> + regval |= FIELD_PREP(MCHP_QUEUE_IBI_STATUS_THLD, thresh_val); >> + /* write the threshold reg only if it changes */ >> + if (regval != pio->reg_queue_thresh) { >> + pio_reg_write(MCHP_QUEUE_THLD_CTRL, regval); >> + pio->reg_queue_thresh = regval; >> + dev_dbg(&hci->master.dev,"%d", thresh_val); >> + } >> +} >> + >> +static bool mchp_hci_pio_get_ibi_segment(struct mchp_i3c_hci *hci, >> + struct mchp_hci_pio_data *pio) >> +{ >> + struct hci_pio_ibi_data *ibi = &pio->ibi; >> + unsigned int nr_words, thresh_val; >> + u32 *p; >> + >> + p = ibi->data_ptr; >> + p += (ibi->seg_len - ibi->seg_cnt) / 4; >> + >> + while ((nr_words = ibi->seg_cnt/4)) { >> + /* determine our IBI queue threshold value */ >> + thresh_val = min(nr_words, pio->max_ibi_thresh); >> + mchp_hci_pio_set_ibi_thresh(hci, pio, thresh_val); >> + /* bail out if we don't have that amount of data ready */ >> + if (!(pio_reg_read(MCHP_INTR_STATUS) & STAT_IBI_STATUS_THLD)) >> + return false; >> + /* extract the data from the IBI port */ >> + nr_words = thresh_val; >> + ibi->seg_cnt -= nr_words * 4; >> + dev_dbg(&hci->master.dev,"now %d left %d", nr_words * 4, ibi->seg_cnt); >> + while (nr_words--) >> + *p++ = pio_reg_read(MCHP_IBI_PORT); >> + } >> + >> + if (ibi->seg_cnt) { >> + /* >> + * There are trailing bytes in the last word. >> + * Fetch it and extract bytes in an endian independent way. >> + * Unlike the TX case, we must not write past the end of >> + * the destination buffer. >> + */ >> + u32 data; >> + u8 *p_byte = (u8 *)p; >> + >> + mchp_hci_pio_set_ibi_thresh(hci, pio, 1); >> + if (!(pio_reg_read(MCHP_INTR_STATUS) & STAT_IBI_STATUS_THLD)) >> + return false; >> + dev_dbg(&hci->master.dev,"trailing %d", ibi->seg_cnt); >> + data = pio_reg_read(MCHP_IBI_PORT); >> + data = (__force u32) cpu_to_le32(data); >> + while (ibi->seg_cnt--) { >> + *p_byte++ = data; >> + data >>= 8; >> + } >> + } >> + >> + return true; >> +} >> + >> +static bool mchp_hci_pio_prep_new_ibi(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + struct hci_pio_ibi_data *ibi = &pio->ibi; >> + struct i3c_dev_desc *dev; >> + struct mchp_i3c_hci_dev_data *dev_data; >> + struct hci_pio_dev_ibi_data *dev_ibi; >> + u32 ibi_status; >> + >> + /* >> + * We have a new IBI. Try to set up its payload retrieval. >> + * When returning true, the IBI data has to be consumed whether >> + * or not we are set up to capture it. If we return true with >> + * ibi->slot == NULL that means the data payload has to be >> + * drained out of the IBI port and dropped. >> + */ >> + >> + ibi_status = pio_reg_read(MCHP_IBI_PORT); >> + dev_dbg(&hci->master.dev,"status = %#x", ibi_status); >> + ibi->addr = FIELD_GET(MCHP_IBI_TARGET_ADDR, ibi_status); >> + if (ibi_status & MCHP_IBI_ERROR) { >> + dev_err(&hci->master.dev, "IBI error from %#x\n", ibi->addr); >> + return false; >> + } >> + >> + ibi->last_seg = ibi_status & MCHP_IBI_LAST_STATUS; >> + ibi->seg_len = FIELD_GET(MCHP_IBI_DATA_LENGTH, ibi_status); >> + ibi->seg_cnt = ibi->seg_len; >> + >> + dev = mchp_i3c_hci_addr_to_dev(hci, ibi->addr); >> + if (!dev) { >> + dev_err(&hci->master.dev, >> + "IBI for unknown device %#x\n", ibi->addr); >> + return true; >> + } >> + >> + dev_data = i3c_dev_get_master_data(dev); >> + dev_ibi = dev_data->ibi_data; >> + ibi->max_len = dev_ibi->max_len; >> + >> + if (ibi->seg_len > ibi->max_len) { >> + dev_err(&hci->master.dev, "IBI payload too big (%d > %d)\n", >> + ibi->seg_len, ibi->max_len); >> + return true; >> + } >> + >> + ibi->slot = i3c_generic_ibi_get_free_slot(dev_ibi->pool); >> + if (!ibi->slot) { >> + dev_err(&hci->master.dev, "no free slot for IBI\n"); >> + } else { >> + ibi->slot->len = 0; >> + ibi->data_ptr = ibi->slot->data; >> + } >> + return true; >> +} >> + >> +static void mchp_hci_pio_free_ibi_slot(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + struct hci_pio_ibi_data *ibi = &pio->ibi; >> + struct hci_pio_dev_ibi_data *dev_ibi; >> + >> + if (ibi->slot) { >> + dev_ibi = ibi->slot->dev->common.master_priv; >> + i3c_generic_ibi_recycle_slot(dev_ibi->pool, ibi->slot); >> + ibi->slot = NULL; >> + } >> +} >> + >> +static bool mchp_hci_pio_process_ibi(struct mchp_i3c_hci *hci, struct mchp_hci_pio_data *pio) >> +{ >> + struct hci_pio_ibi_data *ibi = &pio->ibi; >> + >> + if (!ibi->slot && !ibi->seg_cnt && ibi->last_seg) >> + if (!mchp_hci_pio_prep_new_ibi(hci, pio)) >> + return false; >> + >> + for (;;) { >> + u32 ibi_status; >> + unsigned int ibi_addr; >> + >> + if (ibi->slot) { >> + if (!mchp_hci_pio_get_ibi_segment(hci, pio)) >> + return false; >> + ibi->slot->len += ibi->seg_len; >> + ibi->data_ptr += ibi->seg_len; >> + if (ibi->last_seg) { >> + /* was the last segment: submit it and leave */ >> + i3c_master_queue_ibi(ibi->slot->dev, ibi->slot); >> + ibi->slot = NULL; >> + mchp_hci_pio_set_ibi_thresh(hci, pio, 1); >> + return true; >> + } >> + } else if (ibi->seg_cnt) { >> + /* >> + * No slot but a non-zero count. This is the result >> + * of some error and the payload must be drained. >> + * This normally does not happen therefore no need >> + * to be extra optimized here. >> + */ >> + mchp_hci_pio_set_ibi_thresh(hci, pio, 1); >> + do { >> + if (!(pio_reg_read(MCHP_INTR_STATUS) & STAT_IBI_STATUS_THLD)) >> + return false; >> + pio_reg_read(MCHP_IBI_PORT); >> + } while (--ibi->seg_cnt); >> + if (ibi->last_seg) >> + return true; >> + } >> + >> + /* try to move to the next segment right away */ >> + mchp_hci_pio_set_ibi_thresh(hci, pio, 1); >> + if (!(pio_reg_read(MCHP_INTR_STATUS) & STAT_IBI_STATUS_THLD)) >> + return false; >> + ibi_status = pio_reg_read(MCHP_IBI_PORT); >> + ibi_addr = FIELD_GET(MCHP_IBI_TARGET_ADDR, ibi_status); >> + if (ibi->addr != ibi_addr) { >> + /* target address changed before last segment */ >> + dev_err(&hci->master.dev, >> + "unexp IBI address changed from %d to %d\n", >> + ibi->addr, ibi_addr); >> + mchp_hci_pio_free_ibi_slot(hci, pio); >> + } >> + ibi->last_seg = ibi_status & MCHP_IBI_LAST_STATUS; >> + ibi->seg_len = FIELD_GET(MCHP_IBI_DATA_LENGTH, ibi_status); >> + ibi->seg_cnt = ibi->seg_len; >> + if (ibi->slot && ibi->slot->len + ibi->seg_len > ibi->max_len) { >> + dev_err(&hci->master.dev, >> + "IBI payload too big (%d > %d)\n", >> + ibi->slot->len + ibi->seg_len, ibi->max_len); >> + mchp_hci_pio_free_ibi_slot(hci, pio); >> + } >> + } >> + >> + return false; >> +} >> + >> +static int mchp_hci_pio_request_ibi(struct mchp_i3c_hci *hci, struct i3c_dev_desc *dev, >> + const struct i3c_ibi_setup *req) >> +{ >> + struct mchp_i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); >> + struct i3c_generic_ibi_pool *pool; >> + struct hci_pio_dev_ibi_data *dev_ibi; >> + >> + dev_ibi = kmalloc(sizeof(*dev_ibi), GFP_KERNEL); >> + if (!dev_ibi) >> + return -ENOMEM; >> + pool = i3c_generic_ibi_alloc_pool(dev, req); >> + if (IS_ERR(pool)) { >> + kfree(dev_ibi); >> + return PTR_ERR(pool); >> + } >> + dev_ibi->pool = pool; >> + dev_ibi->max_len = req->max_payload_len; >> + dev_data->ibi_data = dev_ibi; >> + return 0; >> +} >> + >> +static void mchp_hci_pio_free_ibi(struct mchp_i3c_hci *hci, struct i3c_dev_desc *dev) >> +{ >> + struct mchp_i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); >> + struct hci_pio_dev_ibi_data *dev_ibi = dev_data->ibi_data; >> + >> + dev_data->ibi_data = NULL; >> + i3c_generic_ibi_free_pool(dev_ibi->pool); >> + kfree(dev_ibi); >> +} >> + >> +static void mchp_hci_pio_recycle_ibi_slot(struct mchp_i3c_hci *hci, >> + struct i3c_dev_desc *dev, >> + struct i3c_ibi_slot *slot) >> +{ >> + struct mchp_i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); >> + struct hci_pio_dev_ibi_data *dev_ibi = dev_data->ibi_data; >> + >> + i3c_generic_ibi_recycle_slot(dev_ibi->pool, slot); >> +} >> + >> +static bool mchp_hci_pio_irq_handler(struct mchp_i3c_hci *hci, unsigned int unused) >> +{ >> + struct mchp_hci_pio_data *pio = hci->io_data; >> + u32 status; >> + >> + spin_lock(&pio->lock); >> + status = pio_reg_read(MCHP_INTR_STATUS); >> + dev_dbg(&hci->master.dev,"(in) status: %#x/%#x", status, pio->enabled_irqs); >> + status &= pio->enabled_irqs | STAT_LATENCY_WARNINGS; >> + if (!status) { >> + spin_unlock(&pio->lock); >> + return false; >> + } >> + >> + if (status & STAT_IBI_STATUS_THLD) >> + mchp_hci_pio_process_ibi(hci, pio); >> + >> + if (status & STAT_RX_THLD) >> + if (mchp_hci_pio_process_rx(hci, pio)) >> + pio->enabled_irqs &= ~STAT_RX_THLD; >> + if (status & STAT_TX_THLD) >> + if (mchp_hci_pio_process_tx(hci, pio)) >> + pio->enabled_irqs &= ~STAT_TX_THLD; >> + if (status & STAT_RESP_READY) >> + if (mchp_hci_pio_process_resp(hci, pio)) >> + pio->enabled_irqs &= ~STAT_RESP_READY; >> + >> + if (unlikely(status & STAT_LATENCY_WARNINGS)) { >> + pio_reg_write(MCHP_INTR_STATUS, status & STAT_LATENCY_WARNINGS); >> + dev_warn_ratelimited(&hci->master.dev, >> + "encountered warning condition %#lx\n", >> + status & STAT_LATENCY_WARNINGS); >> + } >> + >> + if (unlikely(status & STAT_ALL_ERRORS)) { >> + pio_reg_write(MCHP_INTR_STATUS, status & STAT_ALL_ERRORS); >> + mchp_hci_pio_err(hci, pio, status & STAT_ALL_ERRORS); >> + } >> + >> + if (status & STAT_CMD_QUEUE_READY) >> + if (mchp_hci_pio_process_cmd(hci, pio)) >> + pio->enabled_irqs &= ~STAT_CMD_QUEUE_READY; >> + >> + pio_reg_write(MCHP_INTR_SIGNAL_ENABLE, pio->enabled_irqs); >> + dev_dbg(&hci->master.dev,"(out) status: %#x/%#x", >> + pio_reg_read(MCHP_INTR_STATUS), pio_reg_read(MCHP_INTR_SIGNAL_ENABLE)); >> + spin_unlock(&pio->lock); >> + return true; >> +} >> + >> +const struct mchp_hci_io_ops mchp_mipi_i3c_hci_pio = { >> + .init = mchp_hci_pio_init, >> + .cleanup = mchp_hci_pio_cleanup, >> + .queue_xfer = mchp_hci_pio_queue_xfer, >> + .dequeue_xfer = mchp_hci_pio_dequeue_xfer, >> + .irq_handler = mchp_hci_pio_irq_handler, >> + .request_ibi = mchp_hci_pio_request_ibi, >> + .free_ibi = mchp_hci_pio_free_ibi, >> + .recycle_ibi_slot = mchp_hci_pio_recycle_ibi_slot, >> +}; >> + >> +static inline struct mchp_i3c_hci *to_i3c_hci(struct i3c_master_controller *m) >> +{ >> + return container_of(m, struct mchp_i3c_hci, master); >> +} >> + >> +static int mchp_i3c_hci_bus_init(struct i3c_master_controller *m) >> +{ >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct i3c_device_info info; >> + int ret; >> + >> + if (hci->cmd == &mchp_mipi_i3c_hci_cmd_v1) { >> + ret = mchp_mipi_i3c_hci_dat_v1.init(hci); >> + if (ret) >> + return ret; >> + } >> + >> + ret = i3c_master_get_free_addr(m, 0); >> + if (ret < 0) >> + return ret; >> + reg_write(MCHP_MASTER_DEVICE_ADDR, >> + MCHP_MASTER_DYNAMIC_ADDR(ret) | MCHP_MASTER_DYNAMIC_ADDR_VALID); >> + memset(&info, 0, sizeof(info)); >> + info.dyn_addr = ret; >> + ret = i3c_master_set_info(m, &info); >> + if (ret) >> + return ret; >> + >> + ret = hci->io->init(hci); >> + if (ret) >> + return ret; >> + >> + microchip_set_resp_buf_thld(hci); >> + >> + reg_set(MCHP_HC_CONTROL, MCHP_HC_CONTROL_BUS_ENABLE); >> + dev_dbg(&hci->master.dev,"HC_CONTROL = %#x", reg_read(MCHP_HC_CONTROL)); >> + >> + return 0; >> +} >> + >> +static void mchp_i3c_hci_bus_cleanup(struct i3c_master_controller *m) >> +{ >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct platform_device *pdev = to_platform_device(m->dev.parent); >> + >> + reg_clear(MCHP_HC_CONTROL, MCHP_HC_CONTROL_BUS_ENABLE); >> + synchronize_irq(platform_get_irq(pdev, 0)); >> + hci->io->cleanup(hci); >> + if (hci->cmd == &mchp_mipi_i3c_hci_cmd_v1) >> + mchp_mipi_i3c_hci_dat_v1.cleanup(hci); >> +} >> + >> +void mchp_mipi_i3c_hci_resume(struct mchp_i3c_hci *hci) >> +{ >> + reg_set(MCHP_HC_CONTROL, MCHP_HC_CONTROL_RESUME); >> +} >> + >> +/* located here rather than pio.c because needed bits are in core reg space */ >> +void mchp_mipi_i3c_hci_pio_reset(struct mchp_i3c_hci *hci) >> +{ >> + reg_write(MCHP_RESET_CONTROL, MCHP_RX_FIFO_RST | MCHP_TX_FIFO_RST | MCHP_RESP_QUEUE_RST); >> +} >> + >> +/* located here rather than dct.c because needed bits are in core reg space */ >> +void mchp_mipi_i3c_hci_dct_index_reset(struct mchp_i3c_hci *hci) >> +{ >> + reg_write(MCHP_DCT_SECTION, FIELD_PREP(MCHP_DCT_TABLE_INDEX, 0)); >> +} >> + >> +static int mchp_i3c_hci_send_ccc_cmd(struct i3c_master_controller *m, >> + struct i3c_ccc_cmd *ccc) >> +{ >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_hci_xfer *xfer; >> + bool raw = !!(hci->quirks & HCI_QUIRK_RAW_CCC); >> + bool prefixed = raw && !!(ccc->id & I3C_CCC_DIRECT); >> + unsigned int nxfers = ccc->ndests + prefixed; >> + DECLARE_COMPLETION_ONSTACK(done); >> + int i, last, ret = 0; >> + >> + dev_dbg(&hci->master.dev,"cmd=%#x rnw=%d ndests=%d data[0].len=%d", >> + ccc->id, ccc->rnw, ccc->ndests, ccc->dests[0].payload.len); >> + >> + xfer = mchp_hci_alloc_xfer(nxfers); >> + if (!xfer) >> + return -ENOMEM; >> + >> + if (prefixed) { >> + xfer->data = NULL; >> + xfer->data_len = 0; >> + xfer->rnw = false; >> + hci->cmd->prep_ccc(hci, xfer, I3C_BROADCAST_ADDR, >> + ccc->id, true); >> + xfer++; >> + } >> + >> + for (i = 0; i < nxfers - prefixed; i++) { >> + xfer[i].data = ccc->dests[i].payload.data; >> + xfer[i].data_len = ccc->dests[i].payload.len; >> + xfer[i].rnw = ccc->rnw; >> + ret = hci->cmd->prep_ccc(hci, &xfer[i], ccc->dests[i].addr, >> + ccc->id, raw); >> + if (ret) >> + goto out; >> + xfer[i].cmd_desc[0] |= CMD_0_ROC; >> + } >> + last = i - 1; >> + xfer[last].cmd_desc[0] |= CMD_0_TOC; >> + xfer[last].completion = &done; >> + >> + if (prefixed) >> + xfer--; >> + >> + ret = hci->io->queue_xfer(hci, xfer, nxfers); >> + if (ret) >> + goto out; >> + if (!wait_for_completion_timeout(&done, HZ) && >> + hci->io->dequeue_xfer(hci, xfer, nxfers)) { >> + ret = -ETIME; >> + goto out; >> + } >> + for (i = prefixed; i < nxfers; i++) { >> + if (ccc->rnw) >> + ccc->dests[i - prefixed].payload.len = >> + RESP_DATA_LENGTH(xfer[i].response); >> + switch (RESP_STATUS(xfer[i].response)) { >> + case RESP_SUCCESS: >> + continue; >> + case RESP_ERR_ADDR_HEADER: >> + case RESP_ERR_NACK: >> + ccc->err = I3C_ERROR_M2; >> + fallthrough; >> + default: >> + ret = -EIO; >> + goto out; >> + } >> + } >> + >> + if (ccc->rnw) >> + dev_dbg(&hci->master.dev,"got: %*ph", >> + ccc->dests[0].payload.len, ccc->dests[0].payload.data); >> + >> +out: >> + mchp_hci_free_xfer(xfer, nxfers); >> + return ret; >> +} >> + >> +static int mchp_i3c_hci_daa(struct i3c_master_controller *m) >> +{ >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + return hci->cmd->perform_daa(hci); >> +} >> + >> +static int mchp_i3c_hci_alloc_safe_xfer_buf(struct mchp_i3c_hci *hci, >> + struct mchp_hci_xfer *xfer) >> +{ >> + if (hci->io == &mchp_mipi_i3c_hci_pio || >> + xfer->data == NULL || !is_vmalloc_addr(xfer->data)) >> + return 0; >> + if (xfer->rnw) >> + xfer->bounce_buf = kzalloc(xfer->data_len, GFP_KERNEL); >> + else >> + xfer->bounce_buf = kmemdup(xfer->data, >> + xfer->data_len, GFP_KERNEL); >> + >> + return xfer->bounce_buf == NULL ? -ENOMEM : 0; >> +} >> + >> +static void mchp_i3c_hci_free_safe_xfer_buf(struct mchp_i3c_hci *hci, >> + struct mchp_hci_xfer *xfer) >> +{ >> + if (hci->io == &mchp_mipi_i3c_hci_pio || xfer->bounce_buf == NULL) >> + return; >> + if (xfer->rnw) >> + memcpy(xfer->data, xfer->bounce_buf, xfer->data_len); >> + >> + kfree(xfer->bounce_buf); >> +} >> + >> +static int mchp_i3c_hci_priv_xfers(struct i3c_dev_desc *dev, >> + struct i3c_priv_xfer *i3c_xfers, >> + int nxfers) >> +{ >> + struct i3c_master_controller *m = i3c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_hci_xfer *xfer; >> + DECLARE_COMPLETION_ONSTACK(done); >> + unsigned int size_limit; >> + int i, last, ret = 0; >> + >> + dev_dbg(&hci->master.dev,"nxfers = %d", nxfers); >> + >> + xfer = mchp_hci_alloc_xfer(nxfers); >> + if (!xfer) >> + return -ENOMEM; >> + >> + size_limit = 1U << 16; >> + for (i = 0; i < nxfers; i++) { >> + xfer[i].data_len = i3c_xfers[i].len; >> + ret = -EFBIG; >> + if (xfer[i].data_len >= size_limit) >> + goto out; >> + xfer[i].rnw = i3c_xfers[i].rnw; >> + if (i3c_xfers[i].rnw) { >> + xfer[i].data = i3c_xfers[i].data.in; >> + } else { >> + /* silence the const qualifier warning with a cast */ >> + xfer[i].data = (void *) i3c_xfers[i].data.out; >> + } >> + hci->cmd->prep_i3c_xfer(hci, dev, &xfer[i]); >> + xfer[i].cmd_desc[0] |= CMD_0_ROC; >> + ret = mchp_i3c_hci_alloc_safe_xfer_buf(hci, &xfer[i]); >> + if (ret) >> + goto out; >> + } >> + last = i - 1; >> + xfer[last].cmd_desc[0] |= CMD_0_TOC; >> + xfer[last].completion = &done; >> + >> + ret = hci->io->queue_xfer(hci, xfer, nxfers); >> + if (ret) >> + goto out; >> + if (!wait_for_completion_timeout(&done, HZ) && >> + hci->io->dequeue_xfer(hci, xfer, nxfers)) { >> + ret = -ETIME; >> + goto out; >> + } >> + for (i = 0; i < nxfers; i++) { >> + if (i3c_xfers[i].rnw) >> + i3c_xfers[i].len = RESP_DATA_LENGTH(xfer[i].response); >> + if (RESP_STATUS(xfer[i].response) != RESP_SUCCESS) { >> + ret = -EIO; >> + goto out; >> + } >> + } >> + >> +out: >> + for (i = 0; i < nxfers; i++) >> + mchp_i3c_hci_free_safe_xfer_buf(hci, &xfer[i]); >> + >> + mchp_hci_free_xfer(xfer, nxfers); >> + return ret; >> +} >> + >> +static int mchp_i3c_hci_i2c_xfers(struct i2c_dev_desc *dev, >> + const struct i2c_msg *i2c_xfers, int nxfers) >> +{ >> + struct i3c_master_controller *m = i2c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_hci_xfer *xfer; >> + DECLARE_COMPLETION_ONSTACK(done); >> + int i, last, ret = 0; >> + >> + dev_dbg(&hci->master.dev,"nxfers = %d", nxfers); >> + >> + xfer = mchp_hci_alloc_xfer(nxfers); >> + if (!xfer) >> + return -ENOMEM; >> + >> + for (i = 0; i < nxfers; i++) { >> + xfer[i].data = i2c_xfers[i].buf; >> + xfer[i].data_len = i2c_xfers[i].len; >> + xfer[i].rnw = i2c_xfers[i].flags & I2C_M_RD; >> + hci->cmd->prep_i2c_xfer(hci, dev, &xfer[i]); >> + xfer[i].cmd_desc[0] |= CMD_0_ROC; >> + ret = mchp_i3c_hci_alloc_safe_xfer_buf(hci, &xfer[i]); >> + if (ret) >> + goto out; >> + } >> + last = i - 1; >> + xfer[last].cmd_desc[0] |= CMD_0_TOC; >> + xfer[last].completion = &done; >> + >> + ret = hci->io->queue_xfer(hci, xfer, nxfers); >> + if (ret) >> + goto out; >> + if (!wait_for_completion_timeout(&done, HZ) && >> + hci->io->dequeue_xfer(hci, xfer, nxfers)) { >> + ret = -ETIME; >> + goto out; >> + } >> + for (i = 0; i < nxfers; i++) { >> + if (RESP_STATUS(xfer[i].response) != RESP_SUCCESS) { >> + ret = -EIO; >> + goto out; >> + } >> + } >> + >> +out: >> + for (i = 0; i < nxfers; i++) >> + mchp_i3c_hci_free_safe_xfer_buf(hci, &xfer[i]); >> + >> + mchp_hci_free_xfer(xfer, nxfers); >> + return ret; >> +} >> + >> +static int mchp_i3c_hci_attach_i3c_dev(struct i3c_dev_desc *dev) >> +{ >> + struct i3c_master_controller *m = i3c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_i3c_hci_dev_data *dev_data; >> + int ret; >> + >> + dev_data = kzalloc(sizeof(*dev_data), GFP_KERNEL); >> + if (!dev_data) >> + return -ENOMEM; >> + if (hci->cmd == &mchp_mipi_i3c_hci_cmd_v1) { >> + ret = mchp_mipi_i3c_hci_dat_v1.alloc_entry(hci); >> + if (ret < 0) { >> + kfree(dev_data); >> + return ret; >> + } >> + mchp_mipi_i3c_hci_dat_v1.set_dynamic_addr(hci, ret, dev->info.dyn_addr); >> + dev_data->dat_idx = ret; >> + } >> + i3c_dev_set_master_data(dev, dev_data); >> + return 0; >> +} >> + >> +static int mchp_i3c_hci_reattach_i3c_dev(struct i3c_dev_desc *dev, u8 old_dyn_addr) >> +{ >> + struct i3c_master_controller *m = i3c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); >> + >> + if (hci->cmd == &mchp_mipi_i3c_hci_cmd_v1) >> + mchp_mipi_i3c_hci_dat_v1.set_dynamic_addr(hci, dev_data->dat_idx, >> + dev->info.dyn_addr); >> + return 0; >> +} >> + >> +static void mchp_i3c_hci_detach_i3c_dev(struct i3c_dev_desc *dev) >> +{ >> + struct i3c_master_controller *m = i3c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); >> + >> + i3c_dev_set_master_data(dev, NULL); >> + if (hci->cmd == &mchp_mipi_i3c_hci_cmd_v1) >> + mchp_mipi_i3c_hci_dat_v1.free_entry(hci, dev_data->dat_idx); >> + kfree(dev_data); >> +} >> + >> +static int mchp_i3c_hci_attach_i2c_dev(struct i2c_dev_desc *dev) >> +{ >> + struct i3c_master_controller *m = i2c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_i3c_hci_dev_data *dev_data; >> + int ret; >> + >> + if (hci->cmd != &mchp_mipi_i3c_hci_cmd_v1) >> + return 0; >> + dev_data = kzalloc(sizeof(*dev_data), GFP_KERNEL); >> + if (!dev_data) >> + return -ENOMEM; >> + ret = mchp_mipi_i3c_hci_dat_v1.alloc_entry(hci); >> + if (ret < 0) { >> + kfree(dev_data); >> + return ret; >> + } >> + mchp_mipi_i3c_hci_dat_v1.set_static_addr(hci, ret, dev->addr); >> + mchp_mipi_i3c_hci_dat_v1.set_flags(hci, ret, DAT_0_I2C_DEVICE, 0); >> + dev_data->dat_idx = ret; >> + i2c_dev_set_master_data(dev, dev_data); >> + return 0; >> +} >> + >> +static void mchp_i3c_hci_detach_i2c_dev(struct i2c_dev_desc *dev) >> +{ >> + struct i3c_master_controller *m = i2c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_i3c_hci_dev_data *dev_data = i2c_dev_get_master_data(dev); >> + >> + if (dev_data) { >> + i2c_dev_set_master_data(dev, NULL); >> + if (hci->cmd == &mchp_mipi_i3c_hci_cmd_v1) >> + mchp_mipi_i3c_hci_dat_v1.free_entry(hci, dev_data->dat_idx); >> + kfree(dev_data); >> + } >> +} >> + >> +static int mchp_i3c_hci_request_ibi(struct i3c_dev_desc *dev, >> + const struct i3c_ibi_setup *req) >> +{ >> + struct i3c_master_controller *m = i3c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); >> + unsigned int dat_idx = dev_data->dat_idx; >> + >> + if (req->max_payload_len != 0) >> + mchp_mipi_i3c_hci_dat_v1.set_flags(hci, dat_idx, DAT_0_IBI_PAYLOAD, 0); >> + else >> + mchp_mipi_i3c_hci_dat_v1.clear_flags(hci, dat_idx, DAT_0_IBI_PAYLOAD, 0); >> + return hci->io->request_ibi(hci, dev, req); >> +} >> + >> +static void mchp_i3c_hci_free_ibi(struct i3c_dev_desc *dev) >> +{ >> + struct i3c_master_controller *m = i3c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + >> + hci->io->free_ibi(hci, dev); >> +} >> + >> +static int mchp_i3c_hci_enable_ibi(struct i3c_dev_desc *dev) >> +{ >> + struct i3c_master_controller *m = i3c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); >> + >> + mchp_mipi_i3c_hci_dat_v1.clear_flags(hci, dev_data->dat_idx, DAT_0_SIR_REJECT, 0); >> + return i3c_master_enec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR); >> +} >> + >> +static int mchp_i3c_hci_disable_ibi(struct i3c_dev_desc *dev) >> +{ >> + struct i3c_master_controller *m = i3c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + struct mchp_i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); >> + >> + mchp_mipi_i3c_hci_dat_v1.set_flags(hci, dev_data->dat_idx, DAT_0_SIR_REJECT, 0); >> + return i3c_master_disec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR); >> +} >> + >> +static void mchp_i3c_hci_recycle_ibi_slot(struct i3c_dev_desc *dev, >> + struct i3c_ibi_slot *slot) >> +{ >> + struct i3c_master_controller *m = i3c_dev_get_master(dev); >> + struct mchp_i3c_hci *hci = to_i3c_hci(m); >> + >> + hci->io->recycle_ibi_slot(hci, dev, slot); >> +} >> + >> +static const struct i3c_master_controller_ops mchp_i3c_hci_ops = { >> + .bus_init = mchp_i3c_hci_bus_init, >> + .bus_cleanup = mchp_i3c_hci_bus_cleanup, >> + .do_daa = mchp_i3c_hci_daa, >> + .send_ccc_cmd = mchp_i3c_hci_send_ccc_cmd, >> + .priv_xfers = mchp_i3c_hci_priv_xfers, >> + .i2c_xfers = mchp_i3c_hci_i2c_xfers, >> + .attach_i3c_dev = mchp_i3c_hci_attach_i3c_dev, >> + .reattach_i3c_dev = mchp_i3c_hci_reattach_i3c_dev, >> + .detach_i3c_dev = mchp_i3c_hci_detach_i3c_dev, >> + .attach_i2c_dev = mchp_i3c_hci_attach_i2c_dev, >> + .detach_i2c_dev = mchp_i3c_hci_detach_i2c_dev, >> + .request_ibi = mchp_i3c_hci_request_ibi, >> + .free_ibi = mchp_i3c_hci_free_ibi, >> + .enable_ibi = mchp_i3c_hci_enable_ibi, >> + .disable_ibi = mchp_i3c_hci_disable_ibi, >> + .recycle_ibi_slot = mchp_i3c_hci_recycle_ibi_slot, >> +}; >> + >> +static irqreturn_t mchp_i3c_hci_irq_handler(int irq, void *dev_id) >> +{ >> + struct mchp_i3c_hci *hci = dev_id; >> + irqreturn_t result = IRQ_NONE; >> + u32 val; >> + >> + val = reg_read(MCHP_INTR_STATUS); >> + dev_dbg(&hci->master.dev,"INTR_STATUS = %#x", val); >> + >> + if (val & MCHP_INTR_HC_INTERNAL_ERR) { >> + dev_err(&hci->master.dev, "Host Controller Internal Error\n"); >> + val &= ~MCHP_INTR_HC_INTERNAL_ERR; >> + } >> + >> + hci->io->irq_handler(hci, 0); >> + >> + if (val) >> + dev_err(&hci->master.dev, "unexpected INTR_STATUS %#x\n", val); >> + else >> + result = IRQ_HANDLED; >> + >> + return result; >> +} >> + >> +static int mchp_i3c_hci_init(struct mchp_i3c_hci *hci) >> +{ >> + bool size_in_dwords, mode_selector; >> + u32 regval, offset; >> + int ret; >> + >> + /* Validate HCI hardware version */ >> + regval = reg_read(MCHP_HCI_VERSION); >> + hci->version_major = (regval >> 8) & 0xf; >> + hci->version_minor = (regval >> 4) & 0xf; >> + hci->revision = regval & 0xf; >> + dev_notice(&hci->master.dev, "MIPI I3C HCI v%u.%u r%02u\n", >> + hci->version_major, hci->version_minor, hci->revision); >> + /* known versions */ >> + switch (regval & ~0xf) { >> + case 0x100: /* version 1.0 */ >> + case 0x110: /* version 1.1 */ >> + case 0x200: /* version 2.0 */ >> + break; >> + default: >> + dev_err(&hci->master.dev, "unsupported HCI version\n"); >> + return -EPROTONOSUPPORT; >> + } >> + >> + hci->caps = reg_read(MCHP_HC_CAPABILITIES); >> + dev_dbg(&hci->master.dev,"caps = %#x", hci->caps); >> + >> + size_in_dwords = hci->version_major < 1 || >> + (hci->version_major == 1 && hci->version_minor < 1); >> + >> + regval = reg_read(MCHP_DAT_SECTION); >> + offset = FIELD_GET(MCHP_DAT_TABLE_OFFSET, regval); >> + hci->DAT_regs = offset ? hci->base_regs + offset : NULL; >> + hci->DAT_entries = FIELD_GET(MCHP_DAT_TABLE_SIZE, regval); >> + hci->DAT_entry_size = 8; >> + if (size_in_dwords) >> + hci->DAT_entries = 4 * hci->DAT_entries / hci->DAT_entry_size; >> + dev_info(&hci->master.dev, "DAT: %u %u-bytes entries at offset %#x\n", >> + hci->DAT_entries, hci->DAT_entry_size, offset); >> + >> + regval = reg_read(MCHP_DCT_SECTION); >> + offset = FIELD_GET(MCHP_DCT_TABLE_OFFSET, regval); >> + hci->DCT_regs = offset ? hci->base_regs + offset : NULL; >> + hci->DCT_entries = FIELD_GET(MCHP_DCT_TABLE_SIZE, regval); >> + hci->DCT_entry_size = 16; >> + if (size_in_dwords) >> + hci->DCT_entries = 4 * hci->DCT_entries / hci->DCT_entry_size; >> + dev_info(&hci->master.dev, "DCT: %u %u-bytes entries at offset %#x\n", >> + hci->DCT_entries, hci->DCT_entry_size, offset); >> + >> + regval = reg_read(MCHP_RING_HEADERS_SECTION); >> + offset = FIELD_GET(MCHP_RING_HEADERS_OFFSET, regval); >> + hci->RHS_regs = offset ? hci->base_regs + offset : NULL; >> + dev_info(&hci->master.dev, "Ring Headers at offset %#x\n", offset); >> + >> + regval = reg_read(MCHP_PIO_SECTION); >> + offset = FIELD_GET(MCHP_PIO_REGS_OFFSET, regval); >> + hci->PIO_regs = offset ? hci->base_regs + offset : NULL; >> + dev_info(&hci->master.dev, "PIO section at offset %#x\n", offset); >> + >> + regval = reg_read(MCHP_EXT_CAPS_SECTION); >> + offset = FIELD_GET(MCHP_EXT_CAPS_OFFSET, regval); >> + hci->EXTCAPS_regs = offset ? hci->base_regs + offset : NULL; >> + dev_info(&hci->master.dev, "Extended Caps at offset %#x\n", offset); >> + >> + ret = i3c_hci_parse_ext_caps(hci); >> + if (ret) >> + return ret; >> + >> + /* >> + * Now let's reset the hardware. >> + * SOFT_RST must be clear before we write to it. >> + * Then we must wait until it clears again. >> + */ >> + ret = readx_poll_timeout(reg_read, MCHP_RESET_CONTROL, regval, >> + !(regval & MCHP_SOFT_RST), 1, 10000); >> + if (ret) >> + return -ENXIO; >> + reg_write(MCHP_RESET_CONTROL, MCHP_SOFT_RST); >> + ret = readx_poll_timeout(reg_read, MCHP_RESET_CONTROL, regval, >> + !(regval & MCHP_SOFT_RST), 1, 10000); >> + if (ret) >> + return -ENXIO; >> + >> + /* Disable all interrupts and allow all signal updates */ >> + reg_write(MCHP_INTR_SIGNAL_ENABLE, 0x0); >> + reg_write(MCHP_INTR_STATUS_ENABLE, 0xffffffff); >> + >> + hci->cmd = &mchp_mipi_i3c_hci_cmd_v1; >> + mode_selector = hci->version_major > 1 || >> + (hci->version_major == 1 && hci->version_minor > 0); >> + >> + /* Quirk for HCI_QUIRK_PIO_MODE on MICROCHIP platforms */ >> + if (hci->quirks & MCHP_HCI_QUIRK_PIO_MODE) { >> + hci->RHS_regs = NULL; >> + } >> + >> + hci->io = &mchp_mipi_i3c_hci_pio; >> + dev_info(&hci->master.dev, "Using PIO\n"); >> + >> + microchip_set_od_pp_timing(hci); >> + >> + return 0; >> +} >> + >> +static int mchp_i3c_hci_probe(struct platform_device *pdev) >> +{ >> + struct mchp_i3c_hci *hci; >> + int irq, ret; >> + >> + hci = devm_kzalloc(&pdev->dev, sizeof(*hci), GFP_KERNEL); >> + if (!hci) >> + return -ENOMEM; >> + hci->base_regs = devm_platform_ioremap_resource(pdev, 0); >> + if (IS_ERR(hci->base_regs)) >> + return PTR_ERR(hci->base_regs); >> + >> + hci->gclk = devm_clk_get(&pdev->dev, "gclk"); >> + if (IS_ERR(hci->gclk)) >> + return PTR_ERR(hci->gclk); >> + >> + hci->pclk = devm_clk_get(&pdev->dev, "pclk"); >> + if (IS_ERR(hci->pclk)) >> + return PTR_ERR(hci->pclk); >> + >> + ret = clk_prepare_enable(hci->gclk); >> + if (ret) >> + goto err_disable_gclk; >> + >> + ret = clk_prepare_enable(hci->pclk); >> + if (ret) >> + goto err_disable_pclk; >> + >> + platform_set_drvdata(pdev, hci); >> + >> + hci->master.dev.init_name = dev_name(&pdev->dev); >> + >> + hci->quirks = (unsigned long)device_get_match_data(&pdev->dev); >> + >> + ret = mchp_i3c_hci_init(hci); >> + if (ret) >> + return ret; >> + >> + irq = platform_get_irq(pdev, 0); >> + ret = devm_request_irq(&pdev->dev, irq, mchp_i3c_hci_irq_handler, >> + 0, NULL, hci); >> + if (ret) >> + return ret; >> + >> + ret = i3c_master_register(&hci->master, &pdev->dev, >> + &mchp_i3c_hci_ops, false); >> + if (ret) >> + return ret; >> + >> + return 0; >> + >> +err_disable_pclk: >> + clk_disable_unprepare(hci->pclk); >> + >> +err_disable_gclk: >> + clk_disable_unprepare(hci->gclk); >> + >> + return ret; >> +} >> + >> +static void mchp_i3c_hci_remove(struct platform_device *pdev) >> +{ >> + struct mchp_i3c_hci *hci = platform_get_drvdata(pdev); >> + >> + i3c_master_unregister(&hci->master); >> +} >> + >> +static const __maybe_unused struct of_device_id mchp_i3c_hci_of_match[] = { >> + { .compatible = "microchip,sama7d65-i3c-hci", .data = (void *)(MCHP_HCI_QUIRK_PIO_MODE | MCHP_HCI_QUIRK_OD_PP_TIMING | MCHP_HCI_QUIRK_RESP_BUF_THLD) }, >> + {}, >> +}; >> +MODULE_DEVICE_TABLE(of, mchp_i3c_hci_of_match); >> + >> +static struct platform_driver mchp_i3c_hci_driver = { >> + .probe = mchp_i3c_hci_probe, >> + .remove_new = mchp_i3c_hci_remove, >> + .driver = { >> + .name = "sama7d65-i3c-hci-master", >> + .of_match_table = of_match_ptr(mchp_i3c_hci_of_match), >> + }, >> +}; >> +module_platform_driver(mchp_i3c_hci_driver); >> + >> +MODULE_AUTHOR("Durai Manickam KR "); >> +MODULE_DESCRIPTION("Microchip SAMA7d65 I3C HCI master driver"); >> +MODULE_LICENSE("GPL"); >> -- >> 2.34.1 >> -- linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM04-BN8-obe.outbound.protection.outlook.com (mail-bn8nam04on2041.outbound.protection.outlook.com [40.107.100.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B87982417E0; Wed, 10 Sep 2025 06:12:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.100.41 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757484783; cv=fail; b=pwri3LjoaiKIk26makXN+eJ04TdfSti50ldFeZM95H7cS5Rmek7VimTjAZ8AXZWQHAq1cbZsjBKA4b4qZgYw9+51nKO0CkDk5qt5xjww0IuKJrPCJhanYb6b7fSlWhgGzPWFW1xTwtYizg0AwjA+kDdmfF3cwSFAHchsF6BRmPs= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757484783; c=relaxed/simple; bh=Wh4xsnRlcGGMr0sHdvXIl7zHXp9Ke2sGi1+3mrIw3S0=; h=From:To:CC:Subject:Date:Message-ID:References:In-Reply-To: Content-Type:MIME-Version; b=EqWUp+jmxjme4BGPbueYFhW4H5ZXP1gZRrPPU7QWrO1IvqMKcVsCBNXBZEOGHoJp4cG0Z5lSEmyHjZGTr8stLX/uPIEmm4MTROMusSfrwBi62OgGOMxpecrR0K+6btkash8WBizRv6zZ9V7MZJ0dxixNKP+2QtC1WemD9II5fRc= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=bJZeplbh; arc=fail smtp.client-ip=40.107.100.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="bJZeplbh" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UDfnCA7870Uc1MNXxvLF/52sXfx4PPm8pRYUhmkfdhbcKdwCwdZ3Spg2LEQnyISH7LKq0vEQ7UEaKPN9NRxNMZQmQgd/bZB8aODxf/UMNeYpKr4a519b6QYRub30dUlux3GGw7a3kKlyYgdYfsmWX21rolRtpYfPQzq5lPL2jmKlysXR/w7dvDRhrJuN/OZXfTtsk1x35AQL3Uh3P803lYqU3xLvN2tXHk/vw9RNYYwq4M7muUXg75PHZavvpsCVQG1uVBDcFbFb2tQpjBmQ1Ed/yo0ykFxSFj8CVxJXiwqP49woC2Yf7B0AiAbEANE3LQzoLL7cyrrVJGxtYFUpMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Wh4xsnRlcGGMr0sHdvXIl7zHXp9Ke2sGi1+3mrIw3S0=; b=ySIcL6ABJCOKjqhk4V6GsfTYN9tRiwdKzR83j0BvRUeWCiH74fmz9r5EbRKQUnVUJxsRINlwgb6W04CMPXtlwo6Q8w2fNqnKiyLnUKXpLIYJxktYYTCjmeTUhv0c3JEXJ7ZtsjrVi5ezIc21qxgtl6q8o+iDpH6veth6P7iaqApNeUkK5ncjMkk93xuIn/z+UDncSHDTuCdX8kVQJ1wxQs+kFGGoL2vtgnjBDieK4OIxnZvNAUPWm1axL9cefgy4ce6NGV4saBp1HJWZtZ+VLsf40BnRUSXK9i1ADVsfVUSAHRecFGRoK8pt3sFUb9hVUtwbuqm6rTr6QtrGGUkCcA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microchip.com; dmarc=pass action=none header.from=microchip.com; dkim=pass header.d=microchip.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchip.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Wh4xsnRlcGGMr0sHdvXIl7zHXp9Ke2sGi1+3mrIw3S0=; b=bJZeplbhhGcTJT/HBKhcViR/vtgdtcyiGGFxWClknNCi9FuXzooSbY86MecN8q3Qt21WqrJ+4JHobrvfZnXm/xUELo5G0TzknTWOUAxwVlCT8vZaQDFd+WNnmPmSAMEdnF21p8FhMk6UCe+ii+dWfMoCVP5TogV58913QrXENcF/L4ukzxiSjJROSgjMCNzHi2RNLpqrnNoAeGjQr27AohhLsRq+/EN4COoruTewXhJ6WMTM3fXHYvaj1mcHPK5SC2DOTjZWIA+Sx4u23M29cv3I8cWghqYn2Ig+7lGe5Ls0HnmsDXNqq9O3tEgNXKFvWx1fkfDRihWuOZy/CijDtA== Received: from DS0PR11MB6541.namprd11.prod.outlook.com (2603:10b6:8:d3::14) by CH3PR11MB7392.namprd11.prod.outlook.com (2603:10b6:610:145::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Wed, 10 Sep 2025 06:12:52 +0000 Received: from DS0PR11MB6541.namprd11.prod.outlook.com ([fe80::e268:87f2:3bd1:1347]) by DS0PR11MB6541.namprd11.prod.outlook.com ([fe80::e268:87f2:3bd1:1347%6]) with mapi id 15.20.9094.021; Wed, 10 Sep 2025 06:12:52 +0000 From: To: CC: , , , , , , , , Subject: Re: [PATCH 2/4] i3c: master: add Microchip SAMA7D65 I3C HCI master driver Thread-Topic: [PATCH 2/4] i3c: master: add Microchip SAMA7D65 I3C HCI master driver Thread-Index: AQHcIXrqGVMOWFOs9UayQYE6vyTQPbSLW8GAgACVJwA= Date: Wed, 10 Sep 2025 06:12:52 +0000 Message-ID: <3229da67-9d67-47ff-9f01-0d71bfabb6a6@microchip.com> References: <20250909111333.170016-1-durai.manickamkr@microchip.com> <20250909111333.170016-3-durai.manickamkr@microchip.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=microchip.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: DS0PR11MB6541:EE_|CH3PR11MB7392:EE_ x-ms-office365-filtering-correlation-id: cbd54c24-3c2d-493c-8a2d-08ddf0311359 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|376014|366016|1800799024|38070700021; x-microsoft-antispam-message-info: =?utf-8?B?c2I0MVVhNTluNUdVOHZSY1IvVzhrM2lSVUdIWTRZcGQ3UnlqbFRCUE9ZZitI?= =?utf-8?B?b1pDREM1TFc1SjZmbkZjZ3liTFVFS0tsSXFhRU1JZFdnOVNqSDlzSlV4dWd6?= =?utf-8?B?YUx3cmxGTzlTNTY3dFE4SGtHSEpjWHdIZ0ZWcldRZFhjMldEblN5SE9qcVk2?= =?utf-8?B?aDU3c2tpSVVNWEtaSGZLeVlSTDl6TWhobEN2UXpkelVhY2VtOXpHTElWS1pr?= =?utf-8?B?RUZtUVBXbU8wNVVLMWVnQmIxMGRNTERtb21STDJWL2xoYWg2ZTJKWmd2Nlgz?= =?utf-8?B?MmFUeFgxN3ByY0hXQVl2NDBmdUZoMHlXQjBBd0dDOXZXSU0yVVJOUCthTEtK?= =?utf-8?B?bW9lc09OSGV0ODhzbzdoTHRBdlJCbzhrRkZtL3c1UXdRY0tXaUZUVUprb2oy?= =?utf-8?B?ZEgxQ0NlOVpsMnJSaGZCNC9UUnc4WEFJMFhVSzhlb1ZzYlI5STZTaXpGWU5T?= =?utf-8?B?aUg2aEVwVWdGZW1PTFNCTU9IenJlYmJTYWJBNTBWUndGVjdSOURvbHpPcVY4?= =?utf-8?B?eDVGQ3hDRkpxQlU0VHUxd3haSzRiaWgrcXo1VG9VOHJuRXFWcWdIUEtubm9L?= =?utf-8?B?c2w0S1dSNVZSUnRJL1lMbmIvb2pmM2U1WkhJT0x1T3IxcitWeUNEck9hTGpH?= =?utf-8?B?cWJVMjNDcVpENk90Q1k2b0NFSk9HUkFUd0x6eERDcWhMcTBCYWpzZmUrY1hh?= =?utf-8?B?ZU1QUDdFYUR2dEs2Rjc3NW9HbjEzZ2J2MnNldjVUazNjWTBTam5XSzlHSzJ6?= =?utf-8?B?cnphYWJ1YlI0TzJKdWYycDlBZkFWMzNySkx0aTlwd00rM2JXRk1ZVjQ0clBJ?= =?utf-8?B?N2hXYTA2M2FQVG1kelVWSXFpcFJRTncyUFpvVDVNQm1DSlk1MjlnVEhURkZG?= =?utf-8?B?Slc2eHZsaHRETlhJK2NoZ2oxZm43SjI2TUsrUmhETXdHVTM3cEpCOVJ4VFVv?= =?utf-8?B?bFlWVUpDdmVnU0lKcXJwYUZLeUxDVWRLRXBnNWpwc0Q5OXdneTBaZkVRZElZ?= =?utf-8?B?ZitkaklUYkNkcDAwYXRGSngrK09UL2hxcU0zUXlKN2s5cWF1ancrd0cwRk8r?= =?utf-8?B?RGozaXowSCtETmttUXhSM3NpT3NCK2V6ejdZSzZpcE9oNTdWeVhlc2N6c3k5?= =?utf-8?B?UUtqbUV3QndMdDIvN1JSK1NNaEZjOGNsU0RDbGlwUlAveTJhUkxKU1R3TlQ1?= =?utf-8?B?SUF6WCsydUd1R3Rzb0dPTEswWE5XZzJrL3FUdDN1VVZkbWdjZGtRVGJRUTBJ?= =?utf-8?B?bEl6MUx6czZOYS8zd0xybzJ5SDkxYWVFRTVGcG1GWkdOL0RLY3k5QUgraldj?= =?utf-8?B?WHA2cUp5c3B0T21uVXR6d3duSkN3MHoyR2JrRlEzQnBIQ3Q3b2cwRzEzRllW?= =?utf-8?B?L2lESmFZVjF0Uk1weUN3b1pyRDkyU2xDMTBORERKTUdKTmQwMWhueEZoR1RH?= =?utf-8?B?RE5pWVdOSHk0WFo4SnRvdEtXMVNabEZFTTBZUnAyNzc5UHk3WjBpeVlVWEtE?= =?utf-8?B?elpML0IvTFhiS0RLUThrUEduYWYvTWhJeHFabXRzOStvQllQOTFZbUlBVlBz?= =?utf-8?B?STRweVRCSVNra0Y0S1NlT1VmdnBnOFRFb3dMbzdkMDM0QTc0S2hlcC9VODJJ?= =?utf-8?B?RWVUNnErUGppT08vMG1ZY01VVlpzNkZyUVhQdTFOZlZOT0xvVTFtQWFVZ1Fz?= =?utf-8?B?Q3hwZU1yK29FTUI1dHNGdFBrdEY5czJUZFhVSno5dnRnNTduMDZ6a0pGd09m?= =?utf-8?B?SGNPdVpKeWNDV2liNTRpWE9DU3lVdXNzcEEvTDFqMXZHV2pvTzdzdVFwMVc5?= =?utf-8?B?V1RPZmlnUElxczBuTGZyTHp1SEI5NTJGcDlsRmFBM21zVU5mRENpOEFrWHdE?= =?utf-8?B?L0prMHVYT3dpMjRDRmVQQllnUWwvamNFUHl1Si9EeFl0cHZkRGNSVkJseTA0?= =?utf-8?B?MWorUW1XS2JzcjA0VWQxMnVIUWZYNWFSaGM4Y1BXS2pGY1JtZ2NBV1JSMDZk?= =?utf-8?B?NVk2cEJIaEpBPT0=?= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB6541.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(38070700021);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?ZGpUSnJTTWdpdjh4ajVHRjcxcFlINjM5ZEZFaGY3eTNLMUlWdFdYVkRwd1pl?= =?utf-8?B?eHhlaVk0Q2VsMTBsdEovUzhTTUVsTlFDYnYxcERBeXVRQWYyOUV2d3VUbDQz?= =?utf-8?B?OE1mWVZYVG96OEFVSEVTVmJtcWpHSTdDK1A5dkhZUXVEbXRndEtiUHdWUkky?= =?utf-8?B?WnpQYm5RSnU3TGplVWtuR0FMRjhnT213U21kUzB5WFltRGFyT1c2NnQ3VWwr?= =?utf-8?B?c3NuRHRGK1NyVFBtUmxHaWlXSlgyWlhldS9zbVcyU3MySjN1M3ZJZDhYaXJF?= =?utf-8?B?TzJqc0UzaGU5WE1EK2ZUZkdoSlRQUHlKY3Y5cHh0RnFjL2hIdDdLc1daZitj?= =?utf-8?B?UzBuU3Z4OHFaUjJWUVorRXY4c0x5Q2ZyZWl4ZVZzQStzYW90SUxRT01YVW4y?= =?utf-8?B?ZWI5aEphdFpjcE1lMXhUdHUxNkRqb2h1V1o0bk9SdGNnSm1BS1hKcGh3MzJ1?= =?utf-8?B?TUR3SUd6ZXpacjd1ZWpLNkNPVmlTZVphRHJidFRTR0NYcGhld3RQR2lmRVor?= =?utf-8?B?N1F2U2N6TWwvZERZRHNzOWRZb2lPclRRV0NVdkxoMlh1WlNJNG5sY3lnTWNZ?= =?utf-8?B?aEZ1VWd6Y0Y1WXBHblhDQnJXZDFVcHpUcW4yZlJ6WTJwZkJwa0UwUWREdDJP?= =?utf-8?B?TmozQnFyK2hwOWZFeTNjSElZUlVaQ2JGOU1mMVFmdG9LN0VXNy9ZbWZ4dUNM?= =?utf-8?B?L015S3NwSVpLbU5iQmt1UWtSSmV6d1cwWDZoa0dtcWZndS9QelBmVEY1NlZn?= =?utf-8?B?dlJLaGloMnd2SGNmOHBjbnlaaGdMK1JIblV5WFBScmU5a01tVFU5RjNuV0RN?= =?utf-8?B?QTVZbUxraXNtTUVNVVZPR2R4UngwMmJhZTdQQ2lYamViSU5VM2Z3Q2xpa2ZR?= =?utf-8?B?Q1BJT2FEUFVRclJjeWlTb3FrWDNiNnpZZlJscEplSkZPTGp3UWlqREsrb3Js?= =?utf-8?B?NEZGaTdBenhzT1FIV2F5SGI4bzJHbnhZQ0RTTHB0L3gxSWtpcmFUUU82aEE5?= =?utf-8?B?K0Jrci81TitsUVhKclIyanZ1YkNqN0xtVE1mVEY3Q2FmZ1MwVHhWTFBnYW0z?= =?utf-8?B?M1NqTE04ZThVY3VrczlMaXhmL3Rsb0hmdE84b0dMU3Vmb3Znc3AwdzRyRUNs?= =?utf-8?B?WGwzQWhjZ25VRmNKLzhUdW5yam82SElZS20xRmZnLytvc3NsNjljZ05XUGUz?= =?utf-8?B?dllxNm9vNVdXRVNETzRHR2tkeHJoRmZrZW9LMWYxQWxuWU5URlJBSkdmSHc2?= =?utf-8?B?Z2xJSnhTK2N2U0t3cHR5ajRUbWFQNk9RTHpNbUs4Rlc2R0RFMXBocGFrcEk1?= =?utf-8?B?WjlUcDV0ZEhhV3VoKzByRndjOHY3UCtrVzZYMnJDc3Q0d0xMUUR2YXR0V25D?= =?utf-8?B?RWZDNXJTZXZPbVQrblhZbkJsT2U5ZnJ0dUVtYWpsYWZEREx0WFFXcVh6b05T?= =?utf-8?B?aEVjRlhXd2U3VGsvZWt3aE83Zlk0aDNwNEVhUFFYQzZuUkJJRThIR0hsVXJP?= =?utf-8?B?dWcyc2hwaDlrODBTdW51YVlhZXNmZmptNHU4TzJleHFyZkwrMHJFNW96M2I4?= =?utf-8?B?OXU3ZmxZUkwvdVdoWXRFSzZ2VTM4aFNpNVpkeGhBcUZkTyt0US8ySmZ6MWt5?= =?utf-8?B?SDh4d2tEOU5NWm4wSUpDY2hPalQyUWhnZ2ExZVpFR1c2Zm04MDRyUWtWUlFv?= =?utf-8?B?TE5VUXhrTkpkMjJnZHJSSFhxaXFBV3g4UGw1TkZnbm1IR0FRZzA4bEpheXls?= =?utf-8?B?RWM0TnFMSVUzMWZsdEVMRDNHTWx1azZjL2JuWHVkTjVqdEluZXNYM2pPb3FP?= =?utf-8?B?c2t2TG5oa3RYOHZybmRPOHM0cW82SHRFRjhRZnRYYTh5WUo2TGtHOUR4QUJK?= =?utf-8?B?Yyt1dlFwamtKTmdOTUtGR2x3Y2JpNVlZTUpBakxwaG9FdmRVUG5QME9RN3kz?= =?utf-8?B?dG16elpUY3BYODBGaVpuSTJGOGhTLzgzcFRtOGdlcEprSlZxUmZzdERVMldp?= =?utf-8?B?dmtCR0g5M3dJOWxyWFdsOTQ2OTh2SWU1TVVycE1ZZmpVV2F2dkdMbHVvMkJi?= =?utf-8?B?bzJnWW8yOWUvOG5YVE5ycHlvSVprN1BkWXlVSjNVTjZGQ3ZGT3dsSWpUU2Vw?= =?utf-8?B?bWNwYzhIU2xBdmVFcCs1UFo2MkpKeGZTeDBWVlZCSm5GVWxUblhJRVVCR0c5?= =?utf-8?B?VGc9PQ==?= Content-Type: text/plain; charset="utf-8" Content-ID: <623AAB391A891A4692646E7B64C491FC@namprd11.prod.outlook.com> Content-Transfer-Encoding: base64 Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-OriginatorOrg: microchip.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB6541.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: cbd54c24-3c2d-493c-8a2d-08ddf0311359 X-MS-Exchange-CrossTenant-originalarrivaltime: 10 Sep 2025 06:12:52.4720 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ilCbtb02MC9AsYha3/LUaIMIVyhojE7qQ9A2hJO2NQVB0l+GOA4lwsLKWpk1aOYlVyqgAvO+Yg/x3GkNDzOc7vlUg8aimGEbDVphFxeSQao= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR11MB7392 T24gMTAvMDkvMjUgMDI6NDgsIEZyYW5rIExpIHdyb3RlOg0KPiBFWFRFUk5BTCBFTUFJTDogRG8g bm90IGNsaWNrIGxpbmtzIG9yIG9wZW4gYXR0YWNobWVudHMgdW5sZXNzIHlvdSBrbm93IHRoZSBj b250ZW50IGlzIHNhZmUNCj4NCj4gT24gVHVlLCBTZXAgMDksIDIwMjUgYXQgMDQ6NDM6MzFQTSAr MDUzMCwgRHVyYWkgTWFuaWNrYW0gS1Igd3JvdGU6DQo+PiBBZGQgc3VwcG9ydCBmb3IgbWljcm9j aGlwIFNBTUE3RDY1IEkzQyBIQ0kgbWFzdGVyIG9ubHkgSVAuIFRoaXMNCj4+IGhhcmR3YXJlIGlz IGFuIGluc3RhbmNlIG9mIHRoZSBNSVBJIEkzQyBIQ0kgQ29udHJvbGxlciBpbXBsZW1lbnRpbmcN Cj4+IHZlcnNpb24gMS4wIHNwZWNpZmljYXRpb24uIFRoaXMgZHJpdmVyIGFkZHMgcGxhdGZvcm0t c3BlY2lmaWMNCj4+IHN1cHBvcnQgZm9yIFNBTUE3RDY1IFNvQy4NCg0KSGkgRnJhbmssDQoNCldl IGhhdmUgaW50ZWdyYXRlZCB0aGUgSTNDIEhDSSBJUCBmcm9tIHN5bm9wc3lzLiBCdXQgdGhlIElQ IHdoaWNoIHdlIA0KaW50ZWdyYXRlZCBpbnRvIG91ciBTQU1BN0Q2NSBTb0MgZG9lcyBub3Qgc3Vw cG9ydCBETUEgZmVhdHVyZSwgRW5kaWFuZXNzIA0KY2hlY2sgYW5kIGZldyBvdGhlciBpbnRlcnJ1 cHQgc3RhdHVzLiBTbyB3ZSBoYXZlIHRvIGludHJvZHVjZSBhIA0KbWljcm9jaGlwIFNvQyBzcGVj aWZpYyBtYWNybyB0byBtb2RpZnkgdGhpcyBkcml2ZXIuIFNvIHdlIGhhdmUgYmVsb3cgMiANCmFw cHJvYWNoZXMsDQoNCjEuIFRvIGludHJvZHVjZSBhIE1pY3JvY2hpcCBTb0Mgc3BlY2lmaWMgbWFj cm8gdG8gYWRkIE1pY3JvY2hpcCBzcGVjaWZpYyANCkkzQyBjaGFuZ2VzIHRvIHRoZSBleGlzdGlu ZyBkcml2ZXIuIEJ1dCBpbiB0aGlzIGFwcHJvYWNoLCBpZiBzdXBwb3NlIHdlIA0KaGF2ZSBhIGNo YW5nZXMgaW4gdGhlIGkzYy1oY2kgZHJpdmVyLCB3ZSBoYXZlIHRvIGFkYXB0IHRoZSBjaGFuZ2Vz IHRvIA0Kb3VyIElQIGFsc28gZHVyaW5nIGV2ZXJ5IGtlcm5lbCB1cGRhdGlvbiBhbmQgSSBkb25v dCBrbm93IHdoZXRoZXIgdGhpcyANCmlzIGFjY2VwdGVkIGJ5IHRoZSBpM2MtaGNpIGRyaXZlciBt YWludGFpbmVyLg0KDQoyLiBPdGhlcndpc2UsIGNyZWF0aW5nIGEgc2VwYXJhdGUgcGxhdGZvcm0g ZHJpdmVyIGJ5IHJldXNpbmcgdGhlIA0KZXhpc3RpbmcgaTNjLWhjaSBkcml2ZXIuDQoNCkkgcmFp c2VkIGEgcXVlcnkgZmV3IHdlZWtzIGJhY2sgdG8gZGVjaWRlIHdoaWNoIGFwcHJvYWNoIHRvIHBy b2NlZWQgDQpiZWZvcmUgc2VuZGluZyB0aGlzIHBhdGNoIHRvIHVwc3RyZWFtLiBCdXQgaSBoYXZl IHJlY2VpdmVkIGNvbW1lbnRzIGxpa2UgDQoiaXRzIHVwdG8gdXMgdG8gZGVjaWRlIHdoaWNoIGlz IGJlc3Qgd2F5Ii4gSSBkb250IGhhdmUgbXVjaCBpZGVhIG9uIA0Kd2hpY2ggaXMgYmVzdCB3YXkg dG8gcHJvY2VlZCBhbmQgbWFpbnRhaW4uU28sIEkgaGF2ZSBkZWNpZGVkIHRvIGdvIHdpdGggDQph cHByb2FjaCAyLg0KDQpDb3VsZCB5b3Ugc2hhcmUgeW91ciBpZGVhIG9uIHRoaXM/DQoNCj4gd2h5 IG5vdCByZXVzZSBkcml2ZXJzL2kzYy9tYXN0ZXIvbWlwaS1pM2MtaGNpL2NvcmUuYyBhbmQgY3Jl YXRlIG5ldyBvbmUgPw0KPg0KPiBGcmFuaw0KPg0KPj4gSTNDIGluIG1hc3RlciBtb2RlIHN1cHBv cnRzIHVwIHRvIDEyLjVNSHosIFNEUiBtb2RlIGRhdGEgdHJhbnNmZXIgaW4NCj4+IG1peGVkIGJ1 cyBtb2RlIChJMkMgYW5kIEkzQyB0YXJnZXQgZGV2aWNlcyBvbiBzYW1lIGkzYyBidXMpLiBJdCBh bHNvDQo+PiBzdXBwb3J0cyBJQkkgbWVjaGFuaXNtLg0KPj4NCj4+IEZlYXR1cmVzIHRlc3RlZCBh bmQgc3VwcG9ydGVkIDoNCj4+ICAgICBTdGFuZGFyZCBDQ0MgY29tbWFuZHMuDQo+PiAgICAgSTND IFNEUiBtb2RlIHByaXZhdGUgdHJhbnNmZXJzIGluIFBJTyBtb2RlLg0KPj4gICAgIEkyQyB0cmFu c2ZlcnMgaW4gUElPIG1vZGUuDQo+PiAgICAgUHVyZSBidXMgbW9kZSBhbmQgbWl4ZWQgYnVzIG1v ZGUuDQo+Pg0KPj4gU2lnbmVkLW9mZi1ieTogRHVyYWkgTWFuaWNrYW0gS1IgPGR1cmFpLm1hbmlj a2Fta3JAbWljcm9jaGlwLmNvbT4NCj4+IC0tLQ0KPj4gICBkcml2ZXJzL2kzYy9tYXN0ZXIvS2Nv bmZpZyAgICAgICAgICAgICAgICAgICB8ICAgMTQgKw0KPj4gICBkcml2ZXJzL2kzYy9tYXN0ZXIv TWFrZWZpbGUgICAgICAgICAgICAgICAgICB8ICAgIDEgKw0KPj4gICBkcml2ZXJzL2kzYy9tYXN0 ZXIvc2FtYTdkNjUtaTNjLWhjaS1tYXN0ZXIuYyB8IDI3MDUgKysrKysrKysrKysrKysrKysrDQo+ PiAgIDMgZmlsZXMgY2hhbmdlZCwgMjcyMCBpbnNlcnRpb25zKCspDQo+PiAgIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2kzYy9tYXN0ZXIvc2FtYTdkNjUtaTNjLWhjaS1tYXN0ZXIuYw0KPj4N Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2kzYy9tYXN0ZXIvS2NvbmZpZyBiL2RyaXZlcnMvaTNj L21hc3Rlci9LY29uZmlnDQo+PiBpbmRleCAxM2RmMjk0NGYyZWMuLjhkMGIwMzNiZmEzZSAxMDA2 NDQNCj4+IC0tLSBhL2RyaXZlcnMvaTNjL21hc3Rlci9LY29uZmlnDQo+PiArKysgYi9kcml2ZXJz L2kzYy9tYXN0ZXIvS2NvbmZpZw0KPj4gQEAgLTc0LDMgKzc0LDE3IEBAIGNvbmZpZyBSRU5FU0FT X0kzQw0KPj4NCj4+ICAgICAgICAgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEg bW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlDQo+PiAgICAgICAgICBjYWxsZWQgcmVu ZXNhcy1pM2MuDQo+PiArDQo+PiArY29uZmlnIFNBTUE3RDY1X0kzQ19IQ0lfTUFTVEVSDQo+PiAr ICAgICAgICB0cmlzdGF0ZSAiTWljcm9jaGlwIFNBTUE3RDY1IEkzQyBIQ0kgTWFzdGVyIGRyaXZl ciINCj4+ICsgICAgICAgIGRlcGVuZHMgb24gSTNDDQo+PiArICAgICAgICBkZXBlbmRzIG9uIEhB U19JT01FTQ0KPj4gKyAgICAgICAgZGVwZW5kcyBvbiBBUkNIX0FUOTENCj4+ICsgICAgICAgIGhl bHANCj4+ICsgICAgICAgICAgU3VwcG9ydCBmb3IgTWljcm9jaGlwIFNBTUE3RDY1IEkzQyBIQ0kg TWFzdGVyIENvbnRyb2xsZXIuDQo+PiArDQo+PiArICAgICAgICAgIFRoaXMgaGFyZHdhcmUgaXMg YW4gaW5zdGFuY2Ugb2YgdGhlIE1JUEkgSTNDIEhDSSBjb250cm9sbGVyLiBUaGlzDQo+PiArICAg ICAgICAgIGRyaXZlciBhZGRzIHBsYXRmb3JtLXNwZWNpZmljIHN1cHBvcnQgZm9yIFNBTUE3RDY1 IFNvQy4NCj4+ICsNCj4+ICsgICAgICAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMg YSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUNCj4+ICsgICAgICAgY2FsbGVkIHNh bWE3ZDY1LWkzYy1oY2ktbWFzdGVyLg0KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTNjL21hc3Rl ci9NYWtlZmlsZSBiL2RyaXZlcnMvaTNjL21hc3Rlci9NYWtlZmlsZQ0KPj4gaW5kZXggYWFjNzRm M2UzODUxLi4wMzJjOGM1MTFmNTggMTAwNjQ0DQo+PiAtLS0gYS9kcml2ZXJzL2kzYy9tYXN0ZXIv TWFrZWZpbGUNCj4+ICsrKyBiL2RyaXZlcnMvaTNjL21hc3Rlci9NYWtlZmlsZQ0KPj4gQEAgLTUs MyArNSw0IEBAIG9iai0kKENPTkZJR19BU1QyNjAwX0kzQ19NQVNURVIpICAgICAgKz0gYXN0MjYw MC1pM2MtbWFzdGVyLm8NCj4+ICAgb2JqLSQoQ09ORklHX1NWQ19JM0NfTUFTVEVSKSAgICAgICAg ICs9IHN2Yy1pM2MtbWFzdGVyLm8NCj4+ICAgb2JqLSQoQ09ORklHX01JUElfSTNDX0hDSSkgICAg ICAgICAgICs9IG1pcGktaTNjLWhjaS8NCj4+ICAgb2JqLSQoQ09ORklHX1JFTkVTQVNfSTNDKSAg ICAgICAgICAgICs9IHJlbmVzYXMtaTNjLm8NCj4+ICtvYmotJChDT05GSUdfU0FNQTdENjVfSTND X0hDSV9NQVNURVIpICAgICAgICArPSBzYW1hN2Q2NS1pM2MtaGNpLW1hc3Rlci5vDQo+PiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9pM2MvbWFzdGVyL3NhbWE3ZDY1LWkzYy1oY2ktbWFzdGVyLmMgYi9k cml2ZXJzL2kzYy9tYXN0ZXIvc2FtYTdkNjUtaTNjLWhjaS1tYXN0ZXIuYw0KPj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQNCj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uNjIxODk0MTdmMmFmDQo+PiAtLS0g L2Rldi9udWxsDQo+PiArKysgYi9kcml2ZXJzL2kzYy9tYXN0ZXIvc2FtYTdkNjUtaTNjLWhjaS1t YXN0ZXIuYw0KPj4gQEAgLTAsMCArMSwyNzA1IEBADQo+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjANCj4+ICsvKg0KPj4gKyAqIENvcHlyaWdodCAoQykgMjAyNSBNaWNyb2No aXAgVGVjaG5vbG9neSBJbmMuIGFuZCBpdHMgc3Vic2lkaWFyaWVzDQo+PiArICoNCj4+ICsgKiBB dXRob3I6IER1cmFpIE1hbmlja2FtIEtSIDxkdXJhaS5tYW5pY2thbWtyQG1pY3JvY2hpcC5jb20+ DQo+PiArICoNCj4+ICsgKiBNaWNyb2NoaXAgU0FNQTdENjUgSTNDIEhDSSBNYXN0ZXIgZHJpdmVy DQo+PiArICovDQo+PiArDQo+PiArI2luY2x1ZGUgPGxpbnV4L2JpdGZpZWxkLmg+DQo+PiArI2lu Y2x1ZGUgPGxpbnV4L2JpdG1hcC5oPg0KPj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4NCj4+ICsj aW5jbHVkZSA8bGludXgvZGV2aWNlLmg+DQo+PiArI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+DQo+ PiArI2luY2x1ZGUgPGxpbnV4L2kzYy9tYXN0ZXIuaD4NCj4+ICsjaW5jbHVkZSA8bGludXgvaW50 ZXJydXB0Lmg+DQo+PiArI2luY2x1ZGUgPGxpbnV4L2lvLmg+DQo+PiArI2luY2x1ZGUgPGxpbnV4 L2lvcG9sbC5oPg0KPj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCj4+ICsjaW5jbHVkZSA8 bGludXgvbW9kdWxlLmg+DQo+PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPg0K Pj4gKw0KPj4gKy8qDQo+PiArICogTWljcm9jaGlwIEhvc3QgQ29udHJvbGxlciBDYXBhYmlsaXRp ZXMgYW5kIE9wZXJhdGlvbiBSZWdpc3RlcnMNCj4+ICsgKi8NCj4+ICsNCj4+ICsjZGVmaW5lIE1D SFBfSENJX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAweDAwICAgIC8qIEhDSSBWZXJzaW9u IChpbiBCQ0QpICovDQo+PiArDQo+PiArI2RlZmluZSBNQ0hQX0hDX0NPTlRST0wgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAweDA0DQo+PiArI2RlZmluZSBNQ0hQX0hDX0NPTlRST0xfQlVT X0VOQUJMRSAgICAgICAgICAgQklUKDMxKQ0KPj4gKyNkZWZpbmUgTUNIUF9IQ19DT05UUk9MX1JF U1VNRSAgICAgICAgICAgICAgICAgICAgICAgQklUKDMwKQ0KPj4gKyNkZWZpbmUgTUNIUF9IQ19D T05UUk9MX0FCT1JUICAgICAgICAgICAgICAgICAgICAgICAgQklUKDI5KQ0KPj4gKyNkZWZpbmUg TUNIUF9IQ19DT05UUk9MX0hPVF9KT0lOX0NUUkwgICAgICAgICAgICAgICAgQklUKDgpICAvKiBI b3QtSm9pbiBBQ0svTkFDSyBDb250cm9sICovDQo+PiArI2RlZmluZSBNQ0hQX0hDX0NPTlRST0xf STJDX1RBUkdFVF9QUkVTRU5UICAgQklUKDcpDQo+PiArI2RlZmluZSBNQ0hQX0hDX0NPTlRST0xf SUJBX0lOQ0xVREUgICAgICAgICAgQklUKDApICAvKiBJbmNsdWRlIEkzQyBCcm9hZGNhc3QgQWRk cmVzcyAqLw0KPj4gKw0KPj4gKyNkZWZpbmUgTUNIUF9NQVNURVJfREVWSUNFX0FERFIgICAgICAg ICAgICAgICAgICAgICAgMHgwOCAgICAvKiBNYXN0ZXIgRGV2aWNlIEFkZHJlc3MgKi8NCj4+ICsj ZGVmaW5lIE1DSFBfTUFTVEVSX0RZTkFNSUNfQUREUl9WQUxJRCAgICAgICAgICAgICAgIEJJVCgz MSkgLyogRHluYW1pYyBBZGRyZXNzIGlzIFZhbGlkICovDQo+PiArI2RlZmluZSBNQ0hQX01BU1RF Ul9EWU5BTUlDX0FERFIodikgICAgICAgICAgRklFTERfUFJFUChHRU5NQVNLKDIyLCAxNiksIHYp DQo+PiArDQo+PiArI2RlZmluZSBNQ0hQX0hDX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAg MHgwYw0KPj4gKyNkZWZpbmUgTUNIUF9IQ19DQVBfSERSX1RTX0VOICAgICAgICAgICAgICAgICAg ICAgICAgQklUKDcpDQo+PiArI2RlZmluZSBNQ0hQX0hDX0NBUF9IRFJfRERSX0VOICAgICAgICAg ICAgICAgICAgICAgICBCSVQoNikNCj4+ICsjZGVmaW5lIE1DSFBfSENfQ0FQX05PTl9DVVJSRU5U X01BU1RFUl9DQVAgICBCSVQoNSkgIC8qIG1hc3RlciBoYW5kb2ZmIGNhcGFibGUgKi8NCj4+ICsj ZGVmaW5lIE1DSFBfSENfQ0FQX0FVVE9fQ09NTUFORCAgICAgICAgICAgICBCSVQoMykNCj4+ICsj ZGVmaW5lIE1DSFBfSENfQ0FQX0NPTUJPX0NPTU1BTkQgICAgICAgICAgICBCSVQoMikNCj4+ICsN Cj4+ICsjZGVmaW5lIE1DSFBfUkVTRVRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAweDEwDQo+ PiArI2RlZmluZSBNQ0hQX0lCSV9RVUVVRV9SU1QgICAgICAgICAgICAgICAgICAgQklUKDUpDQo+ PiArI2RlZmluZSBNQ0hQX1JYX0ZJRk9fUlNUICAgICAgICAgICAgICAgICAgICAgQklUKDQpDQo+ PiArI2RlZmluZSBNQ0hQX1RYX0ZJRk9fUlNUICAgICAgICAgICAgICAgICAgICAgQklUKDMpDQo+ PiArI2RlZmluZSBNQ0hQX1JFU1BfUVVFVUVfUlNUICAgICAgICAgICAgICAgICAgQklUKDIpDQo+ PiArI2RlZmluZSBNQ0hQX0NNRF9RVUVVRV9SU1QgICAgICAgICAgICAgICAgICAgQklUKDEpDQo+ PiArI2RlZmluZSBNQ0hQX1NPRlRfUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBC SVQoMCkgIC8qIENvcmUgUmVzZXQgKi8NCj4+ICsNCj4+ICsjZGVmaW5lIE1DSFBfUFJFU0VOVF9T VEFURSAgICAgICAgICAgICAgICAgICAweDE0DQo+PiArI2RlZmluZSBNQ0hwX1NUQVRFX0NVUlJF TlRfTUFTVEVSICAgICAgICAgICAgQklUKDIpDQo+PiArDQo+PiArI2RlZmluZSBNQ0hQX0lOVFJf U1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHgyMA0KPj4gKyNkZWZpbmUgTUNIUF9JTlRSX1NU QVRVU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgyNA0KPj4gKyNkZWZpbmUgTUNIUF9J TlRSX1NJR05BTF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgyOA0KPj4gKyNkZWZpbmUg TUNIUF9JTlRSX0ZPUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyYw0KPj4gKyNk ZWZpbmUgTUNIUF9JTlRSX0hDX0lOVEVSTkFMX0VSUiAgICAgICAgICAgIEJJVCgxMCkgLyogSEMg SW50ZXJuYWwgRXJyb3IgKi8NCj4+ICsNCj4+ICsjZGVmaW5lIE1DSFBfREFUX1NFQ1RJT04gICAg ICAgICAgICAgICAgICAgICAweDMwICAgIC8qIERldmljZSBBZGRyZXNzIFRhYmxlICovDQo+PiAr I2RlZmluZSBNQ0hQX0RBVF9UQUJMRV9TSVpFICAgICAgICAgICAgICAgICAgR0VOTUFTSygxNywg MTIpDQo+PiArI2RlZmluZSBNQ0hQX0RBVF9UQUJMRV9PRkZTRVQgICAgICAgICAgICAgICAgICAg ICAgICBHRU5NQVNLKDExLCAwKQ0KPj4gKw0KPj4gKyNkZWZpbmUgTUNIUF9EQ1RfU0VDVElPTiAg ICAgICAgICAgICAgICAgICAgIDB4MzQgICAgLyogRGV2aWNlIENoYXJhY3RlcmlzdGljcyBUYWJs ZSAqLw0KPj4gKyNkZWZpbmUgTUNIUF9EQ1RfVEFCTEVfSU5ERVggICAgICAgICAgICAgICAgIEdF Tk1BU0soMjEsIDE5KQ0KPj4gKyNkZWZpbmUgTUNIUF9EQ1RfVEFCTEVfU0laRSAgICAgICAgICAg ICAgICAgIEdFTk1BU0soMTgsIDEyKQ0KPj4gKyNkZWZpbmUgTUNIUF9EQ1RfVEFCTEVfT0ZGU0VU ICAgICAgICAgICAgICAgICAgICAgICAgR0VOTUFTSygxMSwgMCkNCj4+ICsNCj4+ICsjZGVmaW5l IE1DSFBfUklOR19IRUFERVJTX1NFQ1RJT04gICAgICAgICAgICAweDM4DQo+PiArI2RlZmluZSBN Q0hQX1JJTkdfSEVBREVSU19PRkZTRVQgICAgICAgICAgICAgR0VOTUFTSygxNSwgMCkNCj4+ICsN Cj4+ICsjZGVmaW5lIE1DSFBfUElPX1NFQ1RJT04gICAgICAgICAgICAgICAgICAgICAweDNjDQo+ PiArI2RlZmluZSBNQ0hQX1BJT19SRUdTX09GRlNFVCAgICAgICAgICAgICAgICAgR0VOTUFTSygx NSwgMCkgIC8qIFBJTyBPZmZzZXQgKi8NCj4+ICsNCj4+ICsjZGVmaW5lIE1DSFBfRVhUX0NBUFNf U0VDVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4NDANCj4+ICsjZGVmaW5lIE1DSFBfRVhU X0NBUFNfT0ZGU0VUICAgICAgICAgICAgICAgICBHRU5NQVNLKDE1LCAwKQ0KPj4gKw0KPj4gKyNk ZWZpbmUgTUNIUF9JQklfTk9USUZZX0NUUkwgICAgICAgICAgICAgICAgIDB4NTggICAgLyogSUJJ IE5vdGlmeSBDb250cm9sICovDQo+PiArI2RlZmluZSBNQ0hQX0lCSV9OT1RJRllfU0lSX1JFSkVD VEVEICAgICAgICAgQklUKDMpICAvKiBSZWplY3RlZCBUYXJnZXQgSW50ZXJydXB0IFJlcXVlc3Qg Ki8NCj4+ICsjZGVmaW5lIE1DSFBfSUJJX05PVElGWV9NUl9SRUpFQ1RFRCAgICAgICAgICBCSVQo MSkgIC8qIFJlamVjdGVkIE1hc3RlciBSZXF1ZXN0IENvbnRyb2wgKi8NCj4+ICsjZGVmaW5lIE1D SFBfSUJJX05PVElGWV9ISl9SRUpFQ1RFRCAgICAgICAgICBCSVQoMCkgIC8qIFJlamVjdGVkIEhv dC1Kb2luIENvbnRyb2wgKi8NCj4+ICsNCj4+ICsjZGVmaW5lIERFVl9DVFhfQkFTRV9MTyAgICAg ICAgICAgICAgICAgICAgICAweDYwDQo+PiArI2RlZmluZSBERVZfQ1RYX0JBU0VfSEkgICAgICAg ICAgICAgICAgICAgICAgMHg2NA0KPj4gKw0KPj4gKy8qDQo+PiArICogUElPIEFjY2VzcyBBcmVh DQo+PiArICovDQo+PiArDQo+PiArI2RlZmluZSBwaW9fcmVnX3JlYWQocikgICAgICAgICByZWFk bChoY2ktPlBJT19yZWdzICsgKFBJT18jI3IpKQ0KPj4gKyNkZWZpbmUgcGlvX3JlZ193cml0ZShy LCB2KSAgICAgd3JpdGVsKHYsIGhjaS0+UElPX3JlZ3MgKyAoUElPXyMjcikpDQo+PiArDQo+PiAr I2RlZmluZSBQSU9fTUNIUF9DT01NQU5EX1FVRVVFX1BPUlQgICAgICAgICAgMHgwMA0KPj4gKyNk ZWZpbmUgUElPX01DSFBfUkVTUE9OU0VfUVVFVUVfUE9SVCAgICAgICAgIDB4MDQNCj4+ICsjZGVm aW5lIFBJT19NQ0hQX1hGRVJfREFUQV9QT1JUICAgICAgICAgICAgICAweDA4DQo+PiArI2RlZmlu ZSBQSU9fTUNIUF9JQklfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjDQo+PiAr DQo+PiArI2RlZmluZSBQSU9fTUNIUF9RVUVVRV9USExEX0NUUkwgICAgICAgICAgICAgMHgxMA0K Pj4gKyNkZWZpbmUgTUNIUF9RVUVVRV9JQklfU1RBVFVTX1RITEQgICAgICAgICAgIEdFTk1BU0so MzEsIDI0KQ0KPj4gKyNkZWZpbmUgTUNIUF9RVUVVRV9JQklfREFUQV9USExEICAgICAgICAgICAg IEdFTk1BU0soMjMsIDE2KQ0KPj4gKyNkZWZpbmUgTUNIUF9RVUVVRV9SRVNQX0JVRl9USExEICAg ICAgICAgICAgIEdFTk1BU0soMTUsIDgpDQo+PiArI2RlZmluZSBNQ0hQX1FVRVVFX0NNRF9FTVBU WV9CVUZfVEhMRCAgICAgICAgR0VOTUFTSyg3LCAwKQ0KPj4gKw0KPj4gKyNkZWZpbmUgUElPX01D SFBfREFUQV9CVUZGRVJfVEhMRF9DVFJMICAgICAgIDB4MTQNCj4+ICsjZGVmaW5lIE1DSFBfREFU QV9SWF9TVEFSVF9USExEICAgICAgICAgICAgICBHRU5NQVNLKDI2LCAyNCkNCj4+ICsjZGVmaW5l IE1DSFBfREFUQV9UWF9TVEFSVF9USExEICAgICAgICAgICAgICBHRU5NQVNLKDE4LCAxNikNCj4+ ICsjZGVmaW5lIE1DSFBfREFUQV9SWF9CVUZfVEhMRCAgICAgICAgICAgICAgICBHRU5NQVNLKDEw LCA4KQ0KPj4gKyNkZWZpbmUgTUNIUF9EQVRBX1RYX0JVRl9USExEICAgICAgICAgICAgICAgIEdF Tk1BU0soMiwgMCkNCj4+ICsNCj4+ICsjZGVmaW5lIFBJT19NQ0hQX1FVRVVFX1NJWkUgICAgICAg ICAgICAgICAgICAweDE4DQo+PiArI2RlZmluZSBNQ0hQX1RYX0RBVEFfQlVGRkVSX1NJWkUgICAg ICAgICAgICAgR0VOTUFTSygzMSwgMjQpDQo+PiArI2RlZmluZSBNQ0hQX1JYX0RBVEFfQlVGRkVS X1NJWkUgICAgICAgICAgICAgR0VOTUFTSygyMywgMTYpDQo+PiArI2RlZmluZSBNQ0hQX0lCSV9T VEFUVVNfU0laRSAgICAgICAgICAgICAgICAgR0VOTUFTSygxNSwgOCkNCj4+ICsjZGVmaW5lIE1D SFBfQ1JfUVVFVUVfU0laRSAgICAgICAgICAgICAgICAgICBHRU5NQVNLKDcsIDApDQo+PiArDQo+ PiArI2RlZmluZSBQSU9fTUNIUF9JTlRSX1NUQVRVUyAgICAgICAgICAgICAgICAgMHgyMA0KPj4g KyNkZWZpbmUgUElPX01DSFBfSU5UUl9TVEFUVVNfRU5BQkxFICAgICAgICAgIDB4MjQNCj4+ICsj ZGVmaW5lIFBJT19NQ0hQX0lOVFJfU0lHTkFMX0VOQUJMRSAgICAgICAgICAweDI4DQo+PiArI2Rl ZmluZSBQSU9fTUNIUF9JTlRSX0ZPUkNFICAgICAgICAgICAgICAgICAgMHgyYw0KPj4gKyNkZWZp bmUgU1RBVF9UUkFOU0ZFUl9CTE9DS0VEICAgICAgICAgICAgICAgIEJJVCgyNSkNCj4+ICsjZGVm aW5lIFNUQVRfUEVSUl9SRVNQX1VGTE9XICAgICAgICAgICAgICAgICBCSVQoMjQpDQo+PiArI2Rl ZmluZSBTVEFUX1BFUlJfQ01EX09GTE9XICAgICAgICAgICAgICAgICAgQklUKDIzKQ0KPj4gKyNk ZWZpbmUgU1RBVF9QRVJSX0lCSV9VRkxPVyAgICAgICAgICAgICAgICAgIEJJVCgyMikNCj4+ICsj ZGVmaW5lIFNUQVRfUEVSUl9SWF9VRkxPVyAgICAgICAgICAgICAgICAgICBCSVQoMjEpDQo+PiAr I2RlZmluZSBTVEFUX1BFUlJfVFhfT0ZMT1cgICAgICAgICAgICAgICAgICAgQklUKDIwKQ0KPj4g KyNkZWZpbmUgU1RBVF9FUlJfUkVTUF9RVUVVRV9GVUxMICAgICAgICAgICAgIEJJVCgxOSkNCj4+ ICsjZGVmaW5lIFNUQVRfV0FSTl9SRVNQX1FVRVVFX0ZVTEwgICAgICAgICAgICBCSVQoMTgpDQo+ PiArI2RlZmluZSBTVEFUX0VSUl9JQklfUVVFVUVfRlVMTCAgICAgICAgICAgICAgQklUKDE3KQ0K Pj4gKyNkZWZpbmUgU1RBVF9XQVJOX0lCSV9RVUVVRV9GVUxMICAgICAgICAgICAgIEJJVCgxNikN Cj4+ICsjZGVmaW5lIFNUQVRfRVJSX1JYX0RBVEFfRlVMTCAgICAgICAgICAgICAgICBCSVQoMTUp DQo+PiArI2RlZmluZSBTVEFUX1dBUk5fUlhfREFUQV9GVUxMICAgICAgICAgICAgICAgQklUKDE0 KQ0KPj4gKyNkZWZpbmUgU1RBVF9FUlJfVFhfREFUQV9FTVBUWSAgICAgICAgICAgICAgIEJJVCgx MykNCj4+ICsjZGVmaW5lIFNUQVRfV0FSTl9UWF9EQVRBX0VNUFRZICAgICAgICAgICAgICBCSVQo MTIpDQo+PiArI2RlZmluZSBTVEFUX1RSQU5TRkVSX0VSUiAgICAgICAgICAgICAgICAgICAgQklU KDkpDQo+PiArI2RlZmluZSBTVEFUX1dBUk5fSU5TX1NUT1BfTU9ERSAgICAgICAgICAgICAgQklU KDcpDQo+PiArI2RlZmluZSBTVEFUX1RSQU5TRkVSX0FCT1JUICAgICAgICAgICAgICAgICAgQklU KDUpDQo+PiArI2RlZmluZSBTVEFUX1JFU1BfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgQklU KDQpDQo+PiArI2RlZmluZSBTVEFUX0NNRF9RVUVVRV9SRUFEWSAgICAgICAgICAgICAgICAgQklU KDMpDQo+PiArI2RlZmluZSBTVEFUX0lCSV9TVEFUVVNfVEhMRCAgICAgICAgICAgICAgICAgQklU KDIpDQo+PiArI2RlZmluZSBTVEFUX1JYX1RITEQgICAgICAgICAgICAgICAgICAgICAgICAgQklU KDEpDQo+PiArI2RlZmluZSBTVEFUX1RYX1RITEQgICAgICAgICAgICAgICAgICAgICAgICAgQklU KDApDQo+PiArDQo+PiArI2RlZmluZSBQSU9fTUNIUF9RVUVVRV9DVVJfU1RBVFVTICAgICAgICAg ICAgMHgzOA0KPj4gKyNkZWZpbmUgTUNIUF9DVVJfSUJJX1FfTEVWRUwgICAgICAgICAgICAgICAg IEdFTk1BU0soMjMsIDE2KQ0KPj4gKyNkZWZpbmUgTUNIUF9DVVJfUkVTUF9RX0xFVkVMICAgICAg ICAgICAgICAgIEdFTk1BU0soMTUsIDgpDQo+PiArI2RlZmluZSBNQ0hQX0NVUl9DTURfUV9FTVBU WV9MRVZFTCAgICAgICAgICAgR0VOTUFTSyg3LCAwKQ0KPj4gKw0KPj4gKyNkZWZpbmUgUElPX01D SFBfREFUQV9CVUZGRVJfQ1VSX1NUQVRVUyAgICAgIDB4M2MNCj4+ICsjZGVmaW5lIE1DSFBfQ1VS X1JYX0JVRl9MVkwgICAgICAgICAgICAgICAgICBHRU5NQVNLKDE1LCA4KQ0KPj4gKyNkZWZpbmUg TUNIUF9DVVJfVFhfQlVGX0xWTCAgICAgICAgICAgICAgICAgIEdFTk1BU0soNywgMCkNCj4+ICsN Cj4+ICsvKg0KPj4gKyAqIEhhbmR5IHN0YXR1cyBiaXQgY29tYmluYXRpb25zDQo+PiArICovDQo+ PiArDQo+PiArI2RlZmluZSBTVEFUX0xBVEVOQ1lfV0FSTklOR1MgICAgICAgICAgIChTVEFUX1dB Uk5fUkVTUF9RVUVVRV9GVUxMIHwgXA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgU1RBVF9XQVJOX0lCSV9RVUVVRV9GVUxMIHwgXA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVF9XQVJOX1JYX0RBVEFfRlVMTCB8IFwN Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRfV0FSTl9U WF9EQVRBX0VNUFRZIHwgXA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgU1RBVF9XQVJOX0lOU19TVE9QX01PREUpDQo+PiArDQo+PiArI2RlZmluZSBTVEFUX0xB VEVOQ1lfRVJST1JTICAgICAgICAgICAgIChTVEFUX0VSUl9SRVNQX1FVRVVFX0ZVTEwgfCBcDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUX0VSUl9JQklf UVVFVUVfRlVMTCB8IFwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFNUQVRfRVJSX1JYX0RBVEFfRlVMTCB8IFwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFNUQVRfRVJSX1RYX0RBVEFfRU1QVFkpDQo+PiArDQo+PiArI2Rl ZmluZSBTVEFUX1BST0dfRVJST1JTICAgICAgICAgICAgICAgIChTVEFUX1RSQU5TRkVSX0JMT0NL RUQgfCBcDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFU X1BFUlJfUkVTUF9VRkxPVyB8IFwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFNUQVRfUEVSUl9DTURfT0ZMT1cgfCBcDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBTVEFUX1BFUlJfSUJJX1VGTE9XIHwgXA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVF9QRVJSX1JYX1VGTE9XIHwg XA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVF9QRVJS X1RYX09GTE9XKQ0KPj4gKw0KPj4gKyNkZWZpbmUgU1RBVF9BTExfRVJST1JTICAgICAgICAgICAg ICAgICAoU1RBVF9UUkFOU0ZFUl9BQk9SVCB8IFwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFNUQVRfVFJBTlNGRVJfRVJSIHwgXA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVF9MQVRFTkNZX0VSUk9SUyB8IFwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRfUFJPR19FUlJP UlMpDQo+PiArDQo+PiArLyoNCj4+ICsgKiBBZGRyZXNzIEFzc2lnbm1lbnQgQ29tbWFuZA0KPj4g KyAqLw0KPj4gKw0KPj4gKyNkZWZpbmUgQ01EXzBfQVRUUl9BICAgICAgICAgICAgICAgICAgICBG SUVMRF9QUkVQKENNRF8wX0FUVFIsIDB4MikNCj4+ICsNCj4+ICsjZGVmaW5lIENNRF9BMF9UT0Mg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXMF9CSVRfKDMxKQ0KPj4gKyNkZWZpbmUg Q01EX0EwX1JPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcwX0JJVF8oMzApDQo+ PiArI2RlZmluZSBDTURfQTBfREVWX0NPVU5UKHYpICAgICAgICAgICAgIEZJRUxEX1BSRVAoVzBf TUFTSygyOSwgMjYpLCB2KQ0KPj4gKyNkZWZpbmUgQ01EX0EwX0RFVl9JTkRFWCh2KSAgICAgICAg ICAgICBGSUVMRF9QUkVQKFcwX01BU0soMjAsIDE2KSwgdikNCj4+ICsjZGVmaW5lIENNRF9BMF9D TUQodikgICAgICAgICAgICAgICAgICAgRklFTERfUFJFUChXMF9NQVNLKDE0LCAgNyksIHYpDQo+ PiArI2RlZmluZSBDTURfQTBfVElEKHYpICAgICAgICAgICAgICAgICAgIEZJRUxEX1BSRVAoVzBf TUFTSyggNiwgIDMpLCB2KQ0KPj4gKw0KPj4gKy8qDQo+PiArICogSW1tZWRpYXRlIERhdGEgVHJh bnNmZXIgQ29tbWFuZA0KPj4gKyAqLw0KPj4gKw0KPj4gKyNkZWZpbmUgQ01EXzBfQVRUUl9JICAg ICAgICAgICAgICAgICAgICBGSUVMRF9QUkVQKENNRF8wX0FUVFIsIDB4MSkNCj4+ICsNCj4+ICsj ZGVmaW5lIENNRF9JMV9EQVRBX0JZVEVfNCh2KSAgICAgICAgICAgRklFTERfUFJFUChXMV9NQVNL KDYzLCA1NiksIHYpDQo+PiArI2RlZmluZSBDTURfSTFfREFUQV9CWVRFXzModikgICAgICAgICAg IEZJRUxEX1BSRVAoVzFfTUFTSyg1NSwgNDgpLCB2KQ0KPj4gKyNkZWZpbmUgQ01EX0kxX0RBVEFf QllURV8yKHYpICAgICAgICAgICBGSUVMRF9QUkVQKFcxX01BU0soNDcsIDQwKSwgdikNCj4+ICsj ZGVmaW5lIENNRF9JMV9EQVRBX0JZVEVfMSh2KSAgICAgICAgICAgRklFTERfUFJFUChXMV9NQVNL KDM5LCAzMiksIHYpDQo+PiArI2RlZmluZSBDTURfSTFfREVGX0JZVEUodikgICAgICAgICAgICAg IEZJRUxEX1BSRVAoVzFfTUFTSygzOSwgMzIpLCB2KQ0KPj4gKyNkZWZpbmUgQ01EX0kwX1RPQyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcwX0JJVF8oMzEpDQo+PiArI2RlZmluZSBD TURfSTBfUk9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVzBfQklUXygzMCkNCj4+ ICsjZGVmaW5lIENNRF9JMF9STlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXMF9C SVRfKDI5KQ0KPj4gKyNkZWZpbmUgQ01EX0kwX01PREUodikgICAgICAgICAgICAgICAgICBGSUVM RF9QUkVQKFcwX01BU0soMjgsIDI2KSwgdikNCj4+ICsjZGVmaW5lIENNRF9JMF9EVFQodikgICAg ICAgICAgICAgICAgICAgRklFTERfUFJFUChXMF9NQVNLKDI1LCAyMyksIHYpDQo+PiArI2RlZmlu ZSBDTURfSTBfREVWX0lOREVYKHYpICAgICAgICAgICAgIEZJRUxEX1BSRVAoVzBfTUFTSygyMCwg MTYpLCB2KQ0KPj4gKyNkZWZpbmUgQ01EX0kwX0NQICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFcwX0JJVF8oMTUpDQo+PiArI2RlZmluZSBDTURfSTBfQ01EKHYpICAgICAgICAgICAg ICAgICAgIEZJRUxEX1BSRVAoVzBfTUFTSygxNCwgIDcpLCB2KQ0KPj4gKyNkZWZpbmUgQ01EX0kw X1RJRCh2KSAgICAgICAgICAgICAgICAgICBGSUVMRF9QUkVQKFcwX01BU0soIDYsICAzKSwgdikN Cj4+ICsNCj4+ICsvKg0KPj4gKyAqIFJlZ3VsYXIgRGF0YSBUcmFuc2ZlciBDb21tYW5kDQo+PiAr ICovDQo+PiArDQo+PiArI2RlZmluZSBDTURfMF9BVFRSX1IgICAgICAgICAgICAgICAgICAgIEZJ RUxEX1BSRVAoQ01EXzBfQVRUUiwgMHgwKQ0KPj4gKw0KPj4gKyNkZWZpbmUgQ01EX1IxX0RBVEFf TEVOR1RIKHYpICAgICAgICAgICBGSUVMRF9QUkVQKFcxX01BU0soNjMsIDQ4KSwgdikNCj4+ICsj ZGVmaW5lIENNRF9SMV9ERUZfQllURSh2KSAgICAgICAgICAgICAgRklFTERfUFJFUChXMV9NQVNL KDM5LCAzMiksIHYpDQo+PiArI2RlZmluZSBDTURfUjBfVE9DICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgVzBfQklUXygzMSkNCj4+ICsjZGVmaW5lIENNRF9SMF9ST0MgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBXMF9CSVRfKDMwKQ0KPj4gKyNkZWZpbmUgQ01EX1IwX1JO VyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcwX0JJVF8oMjkpDQo+PiArI2RlZmlu ZSBDTURfUjBfTU9ERSh2KSAgICAgICAgICAgICAgICAgIEZJRUxEX1BSRVAoVzBfTUFTSygyOCwg MjYpLCB2KQ0KPj4gKyNkZWZpbmUgQ01EX1IwX0RCUCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFcwX0JJVF8oMjUpDQo+PiArI2RlZmluZSBDTURfUjBfREVWX0lOREVYKHYpICAgICAg ICAgICAgIEZJRUxEX1BSRVAoVzBfTUFTSygyMCwgMTYpLCB2KQ0KPj4gKyNkZWZpbmUgQ01EX1Iw X0NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcwX0JJVF8oMTUpDQo+PiArI2Rl ZmluZSBDTURfUjBfQ01EKHYpICAgICAgICAgICAgICAgICAgIEZJRUxEX1BSRVAoVzBfTUFTSygx NCwgIDcpLCB2KQ0KPj4gKyNkZWZpbmUgQ01EX1IwX1RJRCh2KSAgICAgICAgICAgICAgICAgICBG SUVMRF9QUkVQKFcwX01BU0soIDYsICAzKSwgdikNCj4+ICsNCj4+ICsvKg0KPj4gKyAqIENvbWJv IFRyYW5zZmVyIChXcml0ZSArIFdyaXRlL1JlYWQpIENvbW1hbmQNCj4+ICsgKi8NCj4+ICsNCj4+ ICsjZGVmaW5lIENNRF8wX0FUVFJfQyAgICAgICAgICAgICAgICAgICAgRklFTERfUFJFUChDTURf MF9BVFRSLCAweDMpDQo+PiArDQo+PiArI2RlZmluZSBDTURfQzFfREFUQV9MRU5HVEgodikgICAg ICAgICAgIEZJRUxEX1BSRVAoVzFfTUFTSyg2MywgNDgpLCB2KQ0KPj4gKyNkZWZpbmUgQ01EX0Mx X09GRlNFVCh2KSAgICAgICAgICAgICAgICBGSUVMRF9QUkVQKFcxX01BU0soNDcsIDMyKSwgdikN Cj4+ICsjZGVmaW5lIENNRF9DMF9UT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBX MF9CSVRfKDMxKQ0KPj4gKyNkZWZpbmUgQ01EX0MwX1JPQyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFcwX0JJVF8oMzApDQo+PiArI2RlZmluZSBDTURfQzBfUk5XICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgVzBfQklUXygyOSkNCj4+ICsjZGVmaW5lIENNRF9DMF9NT0RF KHYpICAgICAgICAgICAgICAgICAgRklFTERfUFJFUChXMF9NQVNLKDI4LCAyNiksIHYpDQo+PiAr I2RlZmluZSBDTURfQzBfMTZfQklUX1NVQk9GRlNFVCAgICAgICAgICAgICAgICAgICAgVzBfQklU XygyNSkNCj4+ICsjZGVmaW5lIENNRF9DMF9GSVJTVF9QSEFTRV9NT0RFICAgICAgICAgICAgICAg ICAgICBXMF9CSVRfKDI0KQ0KPj4gKyNkZWZpbmUgQ01EX0MwX0RBVEFfTEVOR1RIX1BPU0lUSU9O KHYpICBGSUVMRF9QUkVQKFcwX01BU0soMjMsIDIyKSwgdikNCj4+ICsjZGVmaW5lIENNRF9DMF9E RVZfSU5ERVgodikgICAgICAgICAgICAgRklFTERfUFJFUChXMF9NQVNLKDIwLCAxNiksIHYpDQo+ PiArI2RlZmluZSBDTURfQzBfQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVzBf QklUXygxNSkNCj4+ICsjZGVmaW5lIENNRF9DMF9DTUQodikgICAgICAgICAgICAgICAgICAgRklF TERfUFJFUChXMF9NQVNLKDE0LCAgNyksIHYpDQo+PiArI2RlZmluZSBDTURfQzBfVElEKHYpICAg ICAgICAgICAgICAgICAgIEZJRUxEX1BSRVAoVzBfTUFTSyggNiwgIDMpLCB2KQ0KPj4gKw0KPj4g Ky8qDQo+PiArICogSW50ZXJuYWwgQ29udHJvbCBDb21tYW5kDQo+PiArICovDQo+PiArDQo+PiAr I2RlZmluZSBDTURfMF9BVFRSX00gICAgICAgICAgICAgICAgICAgIEZJRUxEX1BSRVAoQ01EXzBf QVRUUiwgMHg3KQ0KPj4gKw0KPj4gKyNkZWZpbmUgQ01EX00xX1ZFTkRPUl9TUEVDSUZJQyAgICAg ICAgICAgICAgICAgICAgIFcxX01BU0soNjMsIDMyKQ0KPj4gKyNkZWZpbmUgQ01EX00wX01JUElf UkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgIFcwX01BU0soMzEsIDEyKQ0KPj4gKyNkZWZp bmUgQ01EX00wX01JUElfQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcwX01BU0soMTEs ICA4KQ0KPj4gKyNkZWZpbmUgQ01EX00wX1ZFTkRPUl9JTkZPX1BSRVNFTlQgICAgICAgICAgICAg ICAgIFcwX0JJVF8oIDcpDQo+PiArI2RlZmluZSBDTURfTTBfVElEKHYpICAgICAgICAgICAgICAg ICAgIEZJRUxEX1BSRVAoVzBfTUFTSyggNiwgIDMpLCB2KQ0KPj4gKw0KPj4gKy8qDQo+PiArICog RGV2aWNlIEFkZHJlc3MgVGFibGUgU3RydWN0dXJlDQo+PiArICovDQo+PiArDQo+PiArI2RlZmlu ZSBEQVRfMV9BVVRPQ01EX0hEUl9DT0RFICAgICAgICAgIFcxX01BU0soNTgsIDUxKQ0KPj4gKyNk ZWZpbmUgREFUXzFfQVVUT0NNRF9NT0RFICAgICAgICAgICAgICBXMV9NQVNLKDUwLCA0OCkNCj4+ ICsjZGVmaW5lIERBVF8xX0FVVE9DTURfVkFMVUUgICAgICAgICAgICAgVzFfTUFTSyg0NywgNDAp DQo+PiArI2RlZmluZSBEQVRfMV9BVVRPQ01EX01BU0sgICAgICAgICAgICAgIFcxX01BU0soMzks IDMyKQ0KPj4gKy8qICAgICAgREFUXzBfSTJDX0RFVklDRSAgICAgICAgICAgICAgICBXMF9CSVRf KDMxKSAqLw0KPj4gKyNkZWZpbmUgREFUXzBfREVWX05BQ0tfUkVUUllfQ05UICAgICAgICBXMF9N QVNLKDMwLCAyOSkNCj4+ICsjZGVmaW5lIERBVF8wX1JJTkdfSUQgICAgICAgICAgICAgICAgICAg VzBfTUFTSygyOCwgMjYpDQo+PiArI2RlZmluZSBEQVRfMF9EWU5BRERSX1BBUklUWSAgICAgICAg ICAgIFcwX0JJVF8oMjMpDQo+PiArI2RlZmluZSBEQVRfMF9EWU5BTUlDX0FERFJFU1MgICAgICAg ICAgIFcwX01BU0soMjIsIDE2KQ0KPj4gKyNkZWZpbmUgREFUXzBfVFMgICAgICAgICAgICAgICAg ICAgICAgICBXMF9CSVRfKDE1KQ0KPj4gKyNkZWZpbmUgREFUXzBfTVJfUkVKRUNUICAgICAgICAg ICAgICAgICBXMF9CSVRfKDE0KQ0KPj4gKy8qICAgICAgREFUXzBfU0lSX1JFSkVDVCAgICAgICAg ICAgICAgICBXMF9CSVRfKDEzKSAqLw0KPj4gKy8qICAgICAgREFUXzBfSUJJX1BBWUxPQUQgICAg ICAgICAgICAgICBXMF9CSVRfKDEyKSAqLw0KPj4gKyNkZWZpbmUgREFUXzBfU1RBVElDX0FERFJF U1MgICAgICAgICAgICBXMF9NQVNLKDYsIDApDQo+PiArDQo+PiArI2RlZmluZSBkYXRfdzBfcmVh ZChpKSAgICAgICAgICByZWFkbChoY2ktPkRBVF9yZWdzICsgKGkpICogOCkNCj4+ICsjZGVmaW5l IGRhdF93MV9yZWFkKGkpICAgICAgICAgIHJlYWRsKGhjaS0+REFUX3JlZ3MgKyAoaSkgKiA4ICsg NCkNCj4+ICsjZGVmaW5lIGRhdF93MF93cml0ZShpLCB2KSAgICAgIHdyaXRlbCh2LCBoY2ktPkRB VF9yZWdzICsgKGkpICogOCkNCj4+ICsjZGVmaW5lIGRhdF93MV93cml0ZShpLCB2KSAgICAgIHdy aXRlbCh2LCBoY2ktPkRBVF9yZWdzICsgKGkpICogOCArIDQpDQo+PiArDQo+PiArLyogR2xvYmFs IERBVCBmbGFncyAqLw0KPj4gKyNkZWZpbmUgREFUXzBfSTJDX0RFVklDRSAgICAgICAgICAgICAg ICBXMF9CSVRfKDMxKQ0KPj4gKyNkZWZpbmUgREFUXzBfU0lSX1JFSkVDVCAgICAgICAgICAgICAg ICBXMF9CSVRfKDEzKQ0KPj4gKyNkZWZpbmUgREFUXzBfSUJJX1BBWUxPQUQgICAgICAgICAgICAg ICBXMF9CSVRfKDEyKQ0KPj4gKw0KPj4gKy8qIDMyLWJpdCB3b3JkIGF3YXJlIGJpdCBhbmQgbWFz ayBtYWNyb3MgKi8NCj4+ICsjZGVmaW5lIFcwX01BU0soaCwgbCkgIEdFTk1BU0soKGgpIC0gMCwg IChsKSAtIDApDQo+PiArI2RlZmluZSBXMV9NQVNLKGgsIGwpICBHRU5NQVNLKChoKSAtIDMyLCAo bCkgLSAzMikNCj4+ICsjZGVmaW5lIFcyX01BU0soaCwgbCkgIEdFTk1BU0soKGgpIC0gNjQsIChs KSAtIDY0KQ0KPj4gKyNkZWZpbmUgVzNfTUFTSyhoLCBsKSAgR0VOTUFTSygoaCkgLSA5NiwgKGwp IC0gOTYpDQo+PiArDQo+PiArLyogU2FtZSBmb3Igc2luZ2xlIGJpdCBtYWNyb3MgKHRyYWlsaW5n IF8gdG8gYWxpZ24gd2l0aCBXKl9NQVNLIHdpZHRoKSAqLw0KPj4gKyNkZWZpbmUgVzBfQklUXyh4 KSAgQklUKCh4KSAtIDApDQo+PiArI2RlZmluZSBXMV9CSVRfKHgpICBCSVQoKHgpIC0gMzIpDQo+ PiArI2RlZmluZSBXMl9CSVRfKHgpICBCSVQoKHgpIC0gNjQpDQo+PiArI2RlZmluZSBXM19CSVRf KHgpICBCSVQoKHgpIC0gOTYpDQo+PiArDQo+PiArI2RlZmluZSByZWdfcmVhZChyKSAgICAgICAg ICAgICByZWFkbChoY2ktPmJhc2VfcmVncyArIChyKSkNCj4+ICsjZGVmaW5lIHJlZ193cml0ZShy LCB2KSAgICAgICAgIHdyaXRlbCh2LCBoY2ktPmJhc2VfcmVncyArIChyKSkNCj4+ICsjZGVmaW5l IHJlZ19zZXQociwgdikgICAgICAgICAgIHJlZ193cml0ZShyLCByZWdfcmVhZChyKSB8ICh2KSkN Cj4+ICsjZGVmaW5lIHJlZ19jbGVhcihyLCB2KSAgICAgICAgIHJlZ193cml0ZShyLCByZWdfcmVh ZChyKSAmIH4odikpDQo+PiArDQo+PiArLyoNCj4+ICsgKiBUaG9zZSBiaXRzIGFyZSBjb21tb24g dG8gYWxsIGRlc2NyaXB0b3IgZm9ybWF0cyBhbmQNCj4+ICsgKiBtYXkgYmUgbWFuaXB1bGF0ZWQg YnkgdGhlIGNvcmUgY29kZS4NCj4+ICsgKi8NCj4+ICsjZGVmaW5lIENNRF8wX1RPQyAgICAgICAg ICAgICAgICAgICAgICAgVzBfQklUXygzMSkNCj4+ICsjZGVmaW5lIENNRF8wX1JPQyAgICAgICAg ICAgICAgICAgICAgICAgVzBfQklUXygzMCkNCj4+ICsjZGVmaW5lIENNRF8wX0FUVFIgICAgICAg ICAgICAgICAgICAgICAgVzBfTUFTSygyLCAwKQ0KPj4gKw0KPj4gKy8qDQo+PiArICogUmVzcG9u c2UgRGVzY3JpcHRvciBTdHJ1Y3R1cmUNCj4+ICsgKi8NCj4+ICsjZGVmaW5lIFJFU1BfU1RBVFVT KHJlc3ApICAgICAgICAgICAgICAgRklFTERfR0VUKEdFTk1BU0soMzEsIDI4KSwgcmVzcCkNCj4+ ICsjZGVmaW5lIFJFU1BfVElEKHJlc3ApICAgICAgICAgICAgICAgICAgRklFTERfR0VUKEdFTk1B U0soMjcsIDI0KSwgcmVzcCkNCj4+ICsjZGVmaW5lIFJFU1BfREFUQV9MRU5HVEgocmVzcCkgICAg ICAgICAgRklFTERfR0VUKEdFTk1BU0soMTUsICAwKSwgcmVzcCkgLyogUmVzcG9uc2UgRGF0YSBs ZW5ndGggYXMgcGVyIE1pY3JvY2hpcCBJUCAqLw0KPj4gKyNkZWZpbmUgUkVTUF9FUlJfRklFTEQg ICAgICAgICAgICAgICAgICBHRU5NQVNLKDMxLCAyOCkNCj4+ICsNCj4+ICsvKg0KPj4gKyAqIElC SSBTdGF0dXMgRGVzY3JpcHRvciBiaXRzDQo+PiArICovDQo+PiArI2RlZmluZSBNQ0hQX0lCSV9T VFMgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMxKQ0KPj4gKyNkZWZpbmUgTUNIUF9JQklf RVJST1IgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzMCkNCj4+ICsjZGVmaW5lIE1DSFBfSUJJ X1NUQVRVU19UWVBFICAgICAgICAgICAgICAgICBCSVQoMjkpDQo+PiArI2RlZmluZSBNQ0hQX0lC SV9IV19DT05URVhUICAgICAgICAgICAgICAgICAgR0VOTUFTSygyOCwgMjYpDQo+PiArI2RlZmlu ZSBNQ0hQX0lCSV9UUyAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDI1KQ0KPj4gKyNkZWZp bmUgTUNIUF9JQklfTEFTVF9TVEFUVVMgICAgICAgICAgICAgICAgIEJJVCgyNCkNCj4+ICsjZGVm aW5lIE1DSFBfSUJJX0NIVU5LUyAgICAgICAgICAgICAgICAgICAgICBHRU5NQVNLKDIzLCAxNikN Cj4+ICsjZGVmaW5lIE1DSFBfSUJJX0lEICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5NQVNL KDE1LCA4KQ0KPj4gKyNkZWZpbmUgTUNIUF9JQklfVEFSR0VUX0FERFIgICAgICAgICAgICAgICAg IEdFTk1BU0soMTUsIDkpDQo+PiArI2RlZmluZSBNQ0hQX0lCSV9UQVJHRVRfUk5XICAgICAgICAg ICAgICAgICAgQklUKDgpDQo+PiArI2RlZmluZSBNQ0hQX0lCSV9EQVRBX0xFTkdUSCAgICAgICAg ICAgICAgICAgR0VOTUFTSyg3LCAwKQ0KPj4gKw0KPj4gKy8qDQo+PiArICogTWFzdGVyIERhdGEg VHJhbnNmZXIgUmF0ZSBUYWJsZSBNb2RlIElEIHZhbHVlcy4NCj4+ICsgKi8NCj4+ICsjZGVmaW5l IFhGRVJSQVRFX01PREVfSTNDICAgICAgICAgICAgICAgMHgwMA0KPj4gKyNkZWZpbmUgWEZFUlJB VEVfTU9ERV9JMkMgICAgICAgICAgICAgICAweDA4DQo+PiArDQo+PiArLyoNCj4+ICsgKiBNYXN0 ZXIgRGF0YSBUcmFuc2ZlciBSYXRlIFRhYmxlIEVudHJ5IEJpdHMgRGVmaW5pdGlvbnMNCj4+ICsg Ki8NCj4+ICsjZGVmaW5lIFhGRVJSQVRFX01PREVfSUQgICAgICAgICAgICAgICAgR0VOTUFTSygz MSwgMjgpDQo+PiArI2RlZmluZSBYRkVSUkFURV9SQVRFX0lEICAgICAgICAgICAgICAgIEdFTk1B U0soMjIsIDIwKQ0KPj4gKyNkZWZpbmUgWEZFUlJBVEVfQUNUVUFMX1JBVEVfS0haICAgICAgICBH RU5NQVNLKDE5LCAwKQ0KPj4gKw0KPj4gKy8qIEV4dGVuZGVkIENhcGFiaWxpdHkgSGVhZGVyICov DQo+PiArI2RlZmluZSBDQVBfSEVBREVSX0xFTkdUSCAgICAgICAgICAgICAgIEdFTk1BU0soMjMs IDgpDQo+PiArI2RlZmluZSBDQVBfSEVBREVSX0lEICAgICAgICAgICAgICAgICAgIEdFTk1BU0so NywgMCkNCj4+ICsvKmV4dF9jYXBzLmMgRU5EICovDQo+PiArDQo+PiArLyogbGlzdCBvZiBxdWly a3MgKi8NCj4+ICsjZGVmaW5lIEhDSV9RVUlSS19SQVdfQ0NDICAgICAgICAgICAgICAgQklUKDEp ICAvKiBDQ0MgZnJhbWluZyBtdXN0IGJlIGV4cGxpY2l0ICovDQo+PiArI2RlZmluZSBNQ0hQX0hD SV9RVUlSS19QSU9fTU9ERSAgICAgICAgIEJJVCgyKSAgLyogU2V0IFBJTyBtb2RlIGZvciBNaWNy b2NoaXAgcGxhdGZvcm1zICovDQo+PiArI2RlZmluZSBNQ0hQX0hDSV9RVUlSS19PRF9QUF9USU1J TkcgICAgIEJJVCgzKSAgLyogU2V0IE9EIGFuZCBQUCB0aW1pbmdzIGZvciBNaWNyb2NoaXAgcGxh dGZvcm1zICovDQo+PiArI2RlZmluZSBNQ0hQX0hDSV9RVUlSS19SRVNQX0JVRl9USExEICAgIEJJ VCg0KSAgLyogU2V0IHJlc3AgYnVmIHRobGQgdG8gMCBmb3IgTWljcm9jaGlwIHBsYXRmb3JtcyAq Lw0KPj4gKw0KPj4gKy8qIFRpbWluZyByZWdpc3RlcnMgKi8NCj4+ICsjZGVmaW5lIE1DSFBfSENJ X1NDTF9JM0NfT0RfVElNSU5HICAgICAgICAgIDB4MjE0DQo+PiArI2RlZmluZSBNQ0hQX0hDSV9T Q0xfSTNDX1BQX1RJTUlORyAgICAgICAgICAweDIxOA0KPj4gKyNkZWZpbmUgTUNIUF9IQ0lfU0RB X0hPTERfU1dJVENIX0RMWV9USU1JTkcgMHgyMzANCj4+ICsNCj4+ICsvKiBUaW1pbmcgdmFsdWVz IHRvIGNvbmZpZ3VyZSA5TUh6IGZyZXF1ZW5jeSAqLw0KPj4gKyNkZWZpbmUgTUNIUF9TQ0xfSTND X09EX1RJTUlORyAgICAgICAgICAweDAwY2YwMGNmIC8qIGNoZWNrIGFuZCB1cGRhdGUgY29ycmVj dCB2YWx1ZXMgbGF0ZXIgKi8NCj4+ICsjZGVmaW5lIE1DSFBfU0NMX0kzQ19QUF9USU1JTkcgICAg ICAgICAgMHgwMDE2MDAxNg0KPj4gKw0KPj4gKyNkZWZpbmUgTUNIUF9RVUVVRV9USExEX0NUUkwg ICAgICAgICAgICAgICAgMHhEMA0KPj4gKw0KPj4gKy8qIFRJRCBnZW5lcmF0aW9uICg0IGJpdHMg d2lkZSBpbiBhbGwgY2FzZXMpICovDQo+PiArI2RlZmluZSBtY2hwX2hjaV9nZXRfdGlkKGJpdHMp IFwNCj4+ICsgICAgICAgIChhdG9taWNfaW5jX3JldHVybl9yZWxheGVkKCZoY2ktPm5leHRfY21k X3RpZCkgJSAoMVUgPDwgNCkpDQo+PiArDQo+PiArI2RlZmluZSBFWFRfQ0FQKF9pZCwgX2hpZ2hl c3RfbWFuZGF0b3J5X3JlZ19vZmZzZXQsIF9wYXJzZXIpIFwNCj4+ICsgICAgICAgIHsgLmlkID0g KF9pZCksIC5wYXJzZXIgPSAoX3BhcnNlciksIFwNCj4+ICsgICAgICAgICAgLm1pbl9sZW5ndGgg PSAoX2hpZ2hlc3RfbWFuZGF0b3J5X3JlZ19vZmZzZXQpLzQgKyAxIH0NCj4+ICsNCj4+ICsvKiBP dXIgbWFpbiBzdHJ1Y3R1cmUgKi8NCj4+ICtzdHJ1Y3QgbWNocF9pM2NfaGNpIHsNCj4+ICsgICAg ICAgIHN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXIgbWFzdGVyOw0KPj4gKyAgICAgICAgc3Ry dWN0IGNsayAqcGNsazsNCj4+ICsgICAgICAgIHN0cnVjdCBjbGsgKmdjbGs7DQo+PiArICAgICAg ICB2b2lkIF9faW9tZW0gKmJhc2VfcmVnczsNCj4+ICsgICAgICAgIHZvaWQgX19pb21lbSAqREFU X3JlZ3M7DQo+PiArICAgICAgICB2b2lkIF9faW9tZW0gKkRDVF9yZWdzOw0KPj4gKyAgICAgICAg dm9pZCBfX2lvbWVtICpSSFNfcmVnczsNCj4+ICsgICAgICAgIHZvaWQgX19pb21lbSAqUElPX3Jl Z3M7DQo+PiArICAgICAgICB2b2lkIF9faW9tZW0gKkVYVENBUFNfcmVnczsNCj4+ICsgICAgICAg IHZvaWQgX19pb21lbSAqQVVUT0NNRF9yZWdzOw0KPj4gKyAgICAgICAgdm9pZCBfX2lvbWVtICpE RUJVR19yZWdzOw0KPj4gKyAgICAgICAgY29uc3Qgc3RydWN0IG1jaHBfaGNpX2lvX29wcyAqaW87 DQo+PiArICAgICAgICB2b2lkICppb19kYXRhOw0KPj4gKyAgICAgICAgY29uc3Qgc3RydWN0IG1j aHBfaGNpX2NtZF9vcHMgKmNtZDsNCj4+ICsgICAgICAgIGF0b21pY190IG5leHRfY21kX3RpZDsN Cj4+ICsgICAgICAgIHUzMiBjYXBzOw0KPj4gKyAgICAgICAgdW5zaWduZWQgaW50IHF1aXJrczsN Cj4+ICsgICAgICAgIHVuc2lnbmVkIGludCBEQVRfZW50cmllczsNCj4+ICsgICAgICAgIHVuc2ln bmVkIGludCBEQVRfZW50cnlfc2l6ZTsNCj4+ICsgICAgICAgIHZvaWQgKkRBVF9kYXRhOw0KPj4g KyAgICAgICAgdW5zaWduZWQgaW50IERDVF9lbnRyaWVzOw0KPj4gKyAgICAgICAgdW5zaWduZWQg aW50IERDVF9lbnRyeV9zaXplOw0KPj4gKyAgICAgICAgdTggdmVyc2lvbl9tYWpvcjsNCj4+ICsg ICAgICAgIHU4IHZlcnNpb25fbWlub3I7DQo+PiArICAgICAgICB1OCByZXZpc2lvbjsNCj4+ICsg ICAgICAgIHUzMiB2ZW5kb3JfbWlwaV9pZDsNCj4+ICsgICAgICAgIHUzMiB2ZW5kb3JfdmVyc2lv bl9pZDsNCj4+ICsgICAgICAgIHUzMiB2ZW5kb3JfcHJvZHVjdF9pZDsNCj4+ICsgICAgICAgIHZv aWQgKnZlbmRvcl9kYXRhOw0KPj4gK307DQo+PiArDQo+PiArLyoNCj4+ICsgKiBTdHJ1Y3R1cmUg dG8gcmVwcmVzZW50IGEgbWFzdGVyIGluaXRpYXRlZCB0cmFuc2Zlci4NCj4+ICsgKiBUaGUgcm53 LCBkYXRhIGFuZCBkYXRhX2xlbiBmaWVsZHMgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2Fs bGluZyBhbnkNCj4+ICsgKiBoY2ktPmNtZC0+KigpIG1ldGhvZC4gVGhlIGNtZCBtZXRob2Qgd2ls bCBpbml0aWFsaXplIGNtZF9kZXNjW10gYW5kDQo+PiArICogcG9zc2libHkgbW9kaWZ5IChjbGVh cikgdGhlIGRhdGEgZmllbGQuIFRoZW4geGZlci0+Y21kX2Rlc2NbMF0gY2FuDQo+PiArICogYmUg YXVnbWVudGVkIHdpdGggQ01EXzBfUk9DIGFuZC9vciBDTURfMF9UT0MuDQo+PiArICogVGhlIGNv bXBsZXRpb24gZmllbGQgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHF1ZXVlaW5nIHdp dGgNCj4+ICsgKiBoY2ktPmlvLT5xdWV1ZV94ZmVyKCksIGFuZCByZXF1aXJlcyBDTURfMF9ST0Mg dG8gYmUgc2V0Lg0KPj4gKyAqLw0KPj4gK3N0cnVjdCBtY2hwX2hjaV94ZmVyIHsNCj4+ICsgICAg ICAgIHUzMiBjbWRfZGVzY1s0XTsNCj4+ICsgICAgICAgIHUzMiByZXNwb25zZTsNCj4+ICsgICAg ICAgIGJvb2wgcm53Ow0KPj4gKyAgICAgICAgdm9pZCAqZGF0YTsNCj4+ICsgICAgICAgIHVuc2ln bmVkIGludCBkYXRhX2xlbjsNCj4+ICsgICAgICAgIHVuc2lnbmVkIGludCBjbWRfdGlkOw0KPj4g KyAgICAgICAgc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRpb247DQo+PiArICAgICAgICB1bmlv biB7DQo+PiArICAgICAgICAgICAgICAgIHN0cnVjdCB7DQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgLyogUElPIHNwZWNpZmljICovDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgc3Ry dWN0IG1jaHBfaGNpX3hmZXIgKm5leHRfeGZlcjsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqbmV4dF9kYXRhOw0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBtY2hwX2hjaV94ZmVyICpuZXh0X3Jlc3A7DQo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGFfbGVmdDsNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICB1MzIgZGF0YV93b3JkX2JlZm9yZV9wYXJ0aWFsOw0KPj4gKyAgICAgICAgICAgICAg ICB9Ow0KPj4gKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgew0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgIC8qIERNQSBzcGVjaWZpYyAqLw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGRt YV9hZGRyX3QgZGF0YV9kbWE7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYm91 bmNlX2J1ZjsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmluZ19udW1iZXI7DQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJpbmdfZW50cnk7DQo+PiArICAgICAgICAg ICAgICAgIH07DQo+PiArICAgICAgICB9Ow0KPj4gK307DQo+PiArDQo+PiArc3RydWN0IG1jaHBf aGNpX2RhdF9vcHMgew0KPj4gKyAgICAgICAgaW50ICgqaW5pdCkoc3RydWN0IG1jaHBfaTNjX2hj aSAqaGNpKTsNCj4+ICsgICAgICAgIHZvaWQgKCpjbGVhbnVwKShzdHJ1Y3QgbWNocF9pM2NfaGNp ICpoY2kpOw0KPj4gKyAgICAgICAgaW50ICgqYWxsb2NfZW50cnkpKHN0cnVjdCBtY2hwX2kzY19o Y2kgKmhjaSk7DQo+PiArICAgICAgICB2b2lkICgqZnJlZV9lbnRyeSkoc3RydWN0IG1jaHBfaTNj X2hjaSAqaGNpLCB1bnNpZ25lZCBpbnQgZGF0X2lkeCk7DQo+PiArICAgICAgICB2b2lkICgqc2V0 X2R5bmFtaWNfYWRkcikoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpLCB1bnNpZ25lZCBpbnQgZGF0 X2lkeCwgdTggYWRkcik7DQo+PiArICAgICAgICB2b2lkICgqc2V0X3N0YXRpY19hZGRyKShzdHJ1 Y3QgbWNocF9pM2NfaGNpICpoY2ksIHVuc2lnbmVkIGludCBkYXRfaWR4LCB1OCBhZGRyKTsNCj4+ ICsgICAgICAgIHZvaWQgKCpzZXRfZmxhZ3MpKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwgdW5z aWduZWQgaW50IGRhdF9pZHgsIHUzMiB3MCwgdTMyIHcxKTsNCj4+ICsgICAgICAgIHZvaWQgKCpj bGVhcl9mbGFncykoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpLCB1bnNpZ25lZCBpbnQgZGF0X2lk eCwgdTMyIHcwLCB1MzIgdzEpOw0KPj4gKyAgICAgICAgaW50ICgqZ2V0X2luZGV4KShzdHJ1Y3Qg bWNocF9pM2NfaGNpICpoY2ksIHU4IGFkZHJlc3MpOw0KPj4gK307DQo+PiArDQo+PiArLyogVGhp cyBhYnN0cmFjdHMgUElPIHZzIERNQSBvcGVyYXRpb25zICovDQo+PiArc3RydWN0IG1jaHBfaGNp X2lvX29wcyB7DQo+PiArICAgICAgICBib29sICgqaXJxX2hhbmRsZXIpKHN0cnVjdCBtY2hwX2kz Y19oY2kgKmhjaSwgdW5zaWduZWQgaW50IG1hc2spOw0KPj4gKyAgICAgICAgaW50ICgqcXVldWVf eGZlcikoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpLCBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqeGZl ciwgaW50IG4pOw0KPj4gKyAgICAgICAgYm9vbCAoKmRlcXVldWVfeGZlcikoc3RydWN0IG1jaHBf aTNjX2hjaSAqaGNpLCBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqeGZlciwgaW50IG4pOw0KPj4gKyAg ICAgICAgaW50ICgqcmVxdWVzdF9pYmkpKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwgc3RydWN0 IGkzY19kZXZfZGVzYyAqZGV2LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IHN0cnVjdCBpM2NfaWJpX3NldHVwICpyZXEpOw0KPj4gKyAgICAgICAgdm9pZCAoKmZyZWVfaWJp KShzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksIHN0cnVjdCBpM2NfZGV2X2Rlc2MgKmRldik7DQo+ PiArICAgICAgICB2b2lkICgqcmVjeWNsZV9pYmlfc2xvdCkoc3RydWN0IG1jaHBfaTNjX2hjaSAq aGNpLCBzdHJ1Y3QgaTNjX2Rldl9kZXNjICpkZXYsDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgaTNjX2liaV9zbG90ICpzbG90KTsNCj4+ICsgICAgICAgIGludCAo KmluaXQpKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSk7DQo+PiArICAgICAgICB2b2lkICgqY2xl YW51cCkoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpKTsNCj4+ICt9Ow0KPj4gKw0KPj4gKy8qIE91 ciBwZXIgZGV2aWNlIG1hc3RlciBwcml2YXRlIGRhdGEgKi8NCj4+ICtzdHJ1Y3QgbWNocF9pM2Nf aGNpX2Rldl9kYXRhIHsNCj4+ICsgICAgICAgIGludCBkYXRfaWR4Ow0KPj4gKyAgICAgICAgdm9p ZCAqaWJpX2RhdGE7DQo+PiArfTsNCj4+ICsNCj4+ICsvKiBUaGlzIGFic3RyYWN0cyBvcGVyYXRp b25zIHdpdGggb3VyIGNvbW1hbmQgZGVzY3JpcHRvciBmb3JtYXRzICovDQo+PiArc3RydWN0IG1j aHBfaGNpX2NtZF9vcHMgew0KPj4gKyAgICAgICAgaW50ICgqcHJlcF9jY2MpKHN0cnVjdCBtY2hw X2kzY19oY2kgKmhjaSwgc3RydWN0IG1jaHBfaGNpX3hmZXIgKnhmZXIsDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgdTggY2NjX2FkZHIsIHU4IGNjY19jbWQsIGJvb2wgcmF3KTsNCj4+ICsg ICAgICAgIHZvaWQgKCpwcmVwX2kzY194ZmVyKShzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksIHN0 cnVjdCBpM2NfZGV2X2Rlc2MgKmRldiwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqeGZlcik7DQo+PiArICAgICAgICB2b2lkICgqcHJlcF9p MmNfeGZlcikoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpLCBzdHJ1Y3QgaTJjX2Rldl9kZXNjICpk ZXYsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1jaHBfaGNpX3hm ZXIgKnhmZXIpOw0KPj4gKyAgICAgICAgaW50ICgqcGVyZm9ybV9kYWEpKHN0cnVjdCBtY2hwX2kz Y19oY2kgKmhjaSk7DQo+PiArfTsNCj4+ICsNCj4+ICtzdHJ1Y3QgaGNpX2V4dF9jYXBzIHsNCj4+ ICsgICAgICAgIHU4ICBpZDsNCj4+ICsgICAgICAgIHUxNiBtaW5fbGVuZ3RoOw0KPj4gKyAgICAg ICAgaW50ICgqcGFyc2VyKShzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksIHZvaWQgX19pb21lbSAq YmFzZSk7DQo+PiArfTsNCj4+ICsNCj4+ICtzdHJ1Y3QgaGNpX3Bpb19kZXZfaWJpX2RhdGEgew0K Pj4gKyAgICAgICAgc3RydWN0IGkzY19nZW5lcmljX2liaV9wb29sICpwb29sOw0KPj4gKyAgICAg ICAgdW5zaWduZWQgaW50IG1heF9sZW47DQo+PiArfTsNCj4+ICsNCj4+ICtzdHJ1Y3QgaGNpX3Bp b19pYmlfZGF0YSB7DQo+PiArICAgICAgICBzdHJ1Y3QgaTNjX2liaV9zbG90ICpzbG90Ow0KPj4g KyAgICAgICAgdm9pZCAqZGF0YV9wdHI7DQo+PiArICAgICAgICB1bnNpZ25lZCBpbnQgYWRkcjsN Cj4+ICsgICAgICAgIHVuc2lnbmVkIGludCBzZWdfbGVuLCBzZWdfY250Ow0KPj4gKyAgICAgICAg dW5zaWduZWQgaW50IG1heF9sZW47DQo+PiArICAgICAgICBib29sIGxhc3Rfc2VnOw0KPj4gK307 DQo+PiArDQo+PiArc3RydWN0IG1jaHBfaGNpX3Bpb19kYXRhIHsNCj4+ICsgICAgICAgIHNwaW5s b2NrX3QgbG9jazsNCj4+ICsgICAgICAgIHN0cnVjdCBtY2hwX2hjaV94ZmVyICpjdXJyX3hmZXIs ICp4ZmVyX3F1ZXVlOw0KPj4gKyAgICAgICAgc3RydWN0IG1jaHBfaGNpX3hmZXIgKmN1cnJfcngs ICpyeF9xdWV1ZTsNCj4+ICsgICAgICAgIHN0cnVjdCBtY2hwX2hjaV94ZmVyICpjdXJyX3R4LCAq dHhfcXVldWU7DQo+PiArICAgICAgICBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqY3Vycl9yZXNwLCAq cmVzcF9xdWV1ZTsNCj4+ICsgICAgICAgIHN0cnVjdCBoY2lfcGlvX2liaV9kYXRhIGliaTsNCj4+ ICsgICAgICAgIHVuc2lnbmVkIGludCByeF90aHJlc2hfc2l6ZSwgdHhfdGhyZXNoX3NpemU7DQo+ PiArICAgICAgICB1bnNpZ25lZCBpbnQgbWF4X2liaV90aHJlc2g7DQo+PiArICAgICAgICB1MzIg cmVnX3F1ZXVlX3RocmVzaDsNCj4+ICsgICAgICAgIHUzMiBlbmFibGVkX2lycXM7DQo+PiArfTsN Cj4+ICsNCj4+ICsvKiBnbG9iYWwgZnVuY3Rpb25zICovDQo+PiArc3RhdGljIGludCBpM2NfaGNp X3BhcnNlX2V4dF9jYXBzKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSk7DQo+PiArdm9pZCBtY2hw X2kzY19oY2lfZGN0X2dldF92YWwoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpLCB1bnNpZ25lZCBp bnQgZGN0X2lkeCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgdTY0ICpwaWQsIHVuc2ln bmVkIGludCAqZGNyLCB1bnNpZ25lZCBpbnQgKmJjcik7DQo+PiArc3RhdGljIHZvaWQgbWNocF9o Y2lfcGlvX2VycihzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksIHN0cnVjdCBtY2hwX2hjaV9waW9f ZGF0YSAqcGlvLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBzdGF0dXMpOw0KPj4g K3ZvaWQgbWNocF9taXBpX2kzY19oY2lfcmVzdW1lKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSk7 DQo+PiArdm9pZCBtY2hwX21pcGlfaTNjX2hjaV9waW9fcmVzZXQoc3RydWN0IG1jaHBfaTNjX2hj aSAqaGNpKTsNCj4+ICt2b2lkIG1jaHBfbWlwaV9pM2NfaGNpX2RjdF9pbmRleF9yZXNldChzdHJ1 Y3QgbWNocF9pM2NfaGNpICpoY2kpOw0KPj4gK3ZvaWQgbWljcm9jaGlwX3NldF9vZF9wcF90aW1p bmcoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpKTsNCj4+ICt2b2lkIG1pY3JvY2hpcF9zZXRfcmVz cF9idWZfdGhsZChzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2kpOw0KPj4gKw0KPj4gK3N0YXRpYyBp bmxpbmUgc3RydWN0IG1jaHBfaGNpX3hmZXIgKm1jaHBfaGNpX2FsbG9jX3hmZXIodW5zaWduZWQg aW50IG4pDQo+PiArew0KPj4gKyAgICAgICAgcmV0dXJuIGtjYWxsb2Mobiwgc2l6ZW9mKHN0cnVj dCBtY2hwX2hjaV94ZmVyKSwgR0ZQX0tFUk5FTCk7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBp bmxpbmUgdm9pZCBtY2hwX2hjaV9mcmVlX3hmZXIoc3RydWN0IG1jaHBfaGNpX3hmZXIgKnhmZXIs IHVuc2lnbmVkIGludCBuKQ0KPj4gK3sNCj4+ICsgICAgICAgIGtmcmVlKHhmZXIpOw0KPj4gK30N Cj4+ICsNCj4+ICsvKiBEYXRhIFRyYW5zZmVyIFNwZWVkIGFuZCBNb2RlICovDQo+PiArZW51bSBt Y2hwX2hjaV9jbWRfbW9kZSB7DQo+PiArICAgICAgICBNT0RFX0kzQ19TRFIwICAgICAgICAgICA9 IDB4MCwNCj4+ICsgICAgICAgIE1PREVfSTNDX1NEUjEgICAgICAgICAgID0gMHgxLA0KPj4gKyAg ICAgICAgTU9ERV9JM0NfU0RSMiAgICAgICAgICAgPSAweDIsDQo+PiArICAgICAgICBNT0RFX0kz Q19TRFIzICAgICAgICAgICA9IDB4MywNCj4+ICsgICAgICAgIE1PREVfSTNDX1NEUjQgICAgICAg ICAgID0gMHg0LA0KPj4gKyAgICAgICAgTU9ERV9JM0NfSERSX1RTeCAgICAgICAgPSAweDUsDQo+ PiArICAgICAgICBNT0RFX0kzQ19IRFJfRERSICAgICAgICA9IDB4NiwNCj4+ICsgICAgICAgIE1P REVfSTNDX0hEUl9CVCAgICAgICAgID0gMHg3LA0KPj4gKyAgICAgICAgTU9ERV9JM0NfRm1fRm1Q ICAgICAgICAgPSAweDgsDQo+PiArICAgICAgICBNT0RFX0kyQ19GbSAgICAgICAgICAgICA9IDB4 MCwNCj4+ICsgICAgICAgIE1PREVfSTJDX0ZtUCAgICAgICAgICAgID0gMHgxLA0KPj4gKyAgICAg ICAgTU9ERV9JMkNfVUQxICAgICAgICAgICAgPSAweDIsDQo+PiArICAgICAgICBNT0RFX0kyQ19V RDIgICAgICAgICAgICA9IDB4MywNCj4+ICsgICAgICAgIE1PREVfSTJDX1VEMyAgICAgICAgICAg ID0gMHg0LA0KPj4gK307DQo+PiArDQo+PiArZW51bSBtY2hwX2hjaV9yZXNwX2VyciB7DQo+PiAr ICAgICAgICBSRVNQX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgID0gMHgwLA0KPj4gKyAgICAg ICAgUkVTUF9FUlJfQ1JDICAgICAgICAgICAgICAgICAgICA9IDB4MSwNCj4+ICsgICAgICAgIFJF U1BfRVJSX1BBUklUWSAgICAgICAgICAgICAgICAgPSAweDIsDQo+PiArICAgICAgICBSRVNQX0VS Ul9GUkFNRSAgICAgICAgICAgICAgICAgID0gMHgzLA0KPj4gKyAgICAgICAgUkVTUF9FUlJfQURE Ul9IRUFERVIgICAgICAgICAgICA9IDB4NCwNCj4+ICsgICAgICAgIFJFU1BfRVJSX0JDQVNUX05B Q0tfN0UgICAgICAgICAgPSAweDQsDQo+PiArICAgICAgICBSRVNQX0VSUl9OQUNLICAgICAgICAg ICAgICAgICAgID0gMHg1LA0KPj4gKyAgICAgICAgUkVTUF9FUlJfT1ZMICAgICAgICAgICAgICAg ICAgICA9IDB4NiwNCj4+ICsgICAgICAgIFJFU1BfRVJSX0kzQ19TSE9SVF9SRUFEICAgICAgICAg PSAweDcsDQo+PiArICAgICAgICBSRVNQX0VSUl9IQ19URVJNSU5BVEVEICAgICAgICAgID0gMHg4 LA0KPj4gKyAgICAgICAgUkVTUF9FUlJfSTJDX1dSX0RBVEFfTkFDSyAgICAgICA9IDB4OSwNCj4+ ICsgICAgICAgIFJFU1BfRVJSX0JVU19YRkVSX0FCT1JURUQgICAgICAgPSAweDksDQo+PiArICAg ICAgICBSRVNQX0VSUl9OT1RfU1VQUE9SVEVEICAgICAgICAgID0gMHhhLA0KPj4gKyAgICAgICAg UkVTUF9FUlJfQUJPUlRFRF9XSVRIX0NSQyAgICAgICA9IDB4YiwNCj4+ICsgICAgICAgIC8qIDB4 YyB0byAweGYgYXJlIHJlc2VydmVkIGZvciB0cmFuc2ZlciBzcGVjaWZpYyBlcnJvcnMgKi8NCj4+ ICt9Ow0KPj4gKw0KPj4gKy8qIE91ciB2YXJpb3VzIGluc3RhbmNlcyAqLw0KPj4gKy8qICBoYW5k eSBoZWxwZXJzICovDQo+PiArc3RhdGljIGlubGluZSBzdHJ1Y3QgaTNjX2Rldl9kZXNjICoNCj4+ ICttY2hwX2kzY19oY2lfYWRkcl90b19kZXYoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpLCB1bnNp Z25lZCBpbnQgYWRkcikNCj4+ICt7DQo+PiArICAgICAgICBzdHJ1Y3QgaTNjX2J1cyAqYnVzID0g aTNjX21hc3Rlcl9nZXRfYnVzKCZoY2ktPm1hc3Rlcik7DQo+PiArICAgICAgICBzdHJ1Y3QgaTNj X2Rldl9kZXNjICpkZXY7DQo+PiArDQo+PiArICAgICAgICBpM2NfYnVzX2Zvcl9lYWNoX2kzY2Rl dihidXMsIGRldikgew0KPj4gKyAgICAgICAgICAgICAgICBpZiAoZGV2LT5pbmZvLmR5bl9hZGRy ID09IGFkZHIpDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldjsNCj4+ICsg ICAgICAgIH0NCj4+ICsgICAgICAgIHJldHVybiBOVUxMOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lk IG1pY3JvY2hpcF9zZXRfb2RfcHBfdGltaW5nKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSkNCj4+ ICt7DQo+PiArICAgICAgICB1MzIgZGF0YTsNCj4+ICsNCj4+ICsgICAgICAgIHJlZ193cml0ZShN Q0hQX0hDSV9TQ0xfSTNDX09EX1RJTUlORywgTUNIUF9TQ0xfSTNDX09EX1RJTUlORyk7DQo+PiAr ICAgICAgICByZWdfd3JpdGUoTUNIUF9IQ0lfU0NMX0kzQ19QUF9USU1JTkcsIE1DSFBfU0NMX0kz Q19QUF9USU1JTkcpOw0KPj4gKyAgICAgICAgZGF0YSA9IHJlZ19yZWFkKE1DSFBfSENJX1NEQV9I T0xEX1NXSVRDSF9ETFlfVElNSU5HKTsNCj4+ICsgICAgICAgIC8qIENvbmZpZ3VyZSBtYXhpbXVt IFRYIGhvbGQgdGltZSAqLw0KPj4gKyAgICAgICAgZGF0YSB8PSBXMF9NQVNLKDE4LCAxNik7DQo+ PiArICAgICAgICByZWdfd3JpdGUoTUNIUF9IQ0lfU0RBX0hPTERfU1dJVENIX0RMWV9USU1JTkcs IGRhdGEpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkIG1pY3JvY2hpcF9zZXRfcmVzcF9idWZfdGhs ZChzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2kpDQo+PiArew0KPj4gKyAgICAgICAgdTMyIGRhdGE7 DQo+PiArDQo+PiArICAgICAgICBkYXRhID0gcmVnX3JlYWQoTUNIUF9RVUVVRV9USExEX0NUUkwp Ow0KPj4gKyAgICAgICAgZGF0YSA9IGRhdGEgJiB+VzBfTUFTSygxNSwgOCk7DQo+PiArICAgICAg ICByZWdfd3JpdGUoTUNIUF9RVUVVRV9USExEX0NUUkwsIGRhdGEpOw0KPj4gK30NCj4+ICsNCj4+ ICtzdGF0aWMgaW50IGhjaV9leHRjYXBfaGFyZHdhcmVfaWQoc3RydWN0IG1jaHBfaTNjX2hjaSAq aGNpLCB2b2lkIF9faW9tZW0gKmJhc2UpDQo+PiArew0KPj4gKyAgICAgICAgaGNpLT52ZW5kb3Jf bWlwaV9pZCAgICAgPSByZWFkbChiYXNlICsgMHgwNCk7DQo+PiArICAgICAgICBoY2ktPnZlbmRv cl92ZXJzaW9uX2lkICA9IHJlYWRsKGJhc2UgKyAweDA4KTsNCj4+ICsgICAgICAgIGhjaS0+dmVu ZG9yX3Byb2R1Y3RfaWQgID0gcmVhZGwoYmFzZSArIDB4MGMpOw0KPj4gKw0KPj4gKyAgICAgICAg ZGV2X2luZm8oJmhjaS0+bWFzdGVyLmRldiwgInZlbmRvciBNSVBJIElEOiAlI3hcbiIsIGhjaS0+ dmVuZG9yX21pcGlfaWQpOw0KPj4gKyAgICAgICAgZGV2X2luZm8oJmhjaS0+bWFzdGVyLmRldiwg InZlbmRvciB2ZXJzaW9uIElEOiAlI3hcbiIsIGhjaS0+dmVuZG9yX3ZlcnNpb25faWQpOw0KPj4g KyAgICAgICAgZGV2X2luZm8oJmhjaS0+bWFzdGVyLmRldiwgInZlbmRvciBwcm9kdWN0IElEOiAl I3hcbiIsIGhjaS0+dmVuZG9yX3Byb2R1Y3RfaWQpOw0KPj4gKw0KPj4gKyAgICAgICAgcmV0dXJu IDA7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgaGNpX2V4dGNhcF9tYXN0ZXJfY29uZmln KHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwgdm9pZCBfX2lvbWVtICpiYXNlKQ0KPj4gK3sNCj4+ ICsgICAgICAgIHUzMiBtYXN0ZXJfY29uZmlnID0gcmVhZGwoYmFzZSArIDB4MDQpOw0KPj4gKyAg ICAgICAgdW5zaWduZWQgaW50IG9wZXJhdGlvbl9tb2RlID0gRklFTERfR0VUKEdFTk1BU0soNSwg NCksIG1hc3Rlcl9jb25maWcpOw0KPj4gKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25z dCBmdW5jdGlvbmFsaXR5W10gPSB7DQo+PiArICAgICAgICAgICAgICAgICIodW5rbm93bikiLCAi bWFzdGVyIG9ubHkiLCAidGFyZ2V0IG9ubHkiLA0KPj4gKyAgICAgICAgICAgICAgICAicHJpbWFy eS9zZWNvbmRhcnkgbWFzdGVyIiB9Ow0KPj4gKyAgICAgICAgZGV2X2luZm8oJmhjaS0+bWFzdGVy LmRldiwgIm9wZXJhdGlvbiBtb2RlOiAlc1xuIiwgZnVuY3Rpb25hbGl0eVtvcGVyYXRpb25fbW9k ZV0pOw0KPj4gKyAgICAgICAgaWYgKG9wZXJhdGlvbl9tb2RlICYgMHgxKQ0KPj4gKyAgICAgICAg ICAgICAgICByZXR1cm4gMDsNCj4+ICsgICAgICAgIGRldl9lcnIoJmhjaS0+bWFzdGVyLmRldiwg Im9ubHkgbWFzdGVyIG1vZGUgaXMgY3VycmVudGx5IHN1cHBvcnRlZFxuIik7DQo+PiArICAgICAg ICByZXR1cm4gLUVPUE5PVFNVUFA7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgaGNpX2V4 dGNhcF9kZWJ1ZyhzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksIHZvaWQgX19pb21lbSAqYmFzZSkN Cj4+ICt7DQo+PiArICAgICAgICBkZXZfaW5mbygmaGNpLT5tYXN0ZXIuZGV2LCAiZGVidWcgcmVn aXN0ZXJzIHByZXNlbnRcbiIpOw0KPj4gKyAgICAgICAgaGNpLT5ERUJVR19yZWdzID0gYmFzZTsN Cj4+ICsgICAgICAgIHJldHVybiAwOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IGhjaV9leHRfY2FwcyBleHRfY2FwYWJpbGl0aWVzW10gPSB7DQo+PiArICAgICAgICBFWFRf Q0FQKDB4MDEsIDB4MGMsIGhjaV9leHRjYXBfaGFyZHdhcmVfaWQpLA0KPj4gKyAgICAgICAgRVhU X0NBUCgweDAyLCAweDA0LCBoY2lfZXh0Y2FwX21hc3Rlcl9jb25maWcpLA0KPj4gKyAgICAgICAg RVhUX0NBUCgweDBjLCAweDEwLCBoY2lfZXh0Y2FwX2RlYnVnKSwNCj4+ICt9Ow0KPj4gKw0KPj4g K3N0YXRpYyBpbnQgaTNjX2hjaV9wYXJzZV9leHRfY2FwcyhzdHJ1Y3QgbWNocF9pM2NfaGNpICpo Y2kpDQo+PiArew0KPj4gKyAgICAgICAgdm9pZCBfX2lvbWVtICpjdXJyX2NhcCA9IGhjaS0+RVhU Q0FQU19yZWdzOw0KPj4gKyAgICAgICAgdm9pZCBfX2lvbWVtICplbmQgPSBjdXJyX2NhcCArIDB4 MTAwMDsgLyogc29tZSBhcmJpdHJhcnkgbGltaXQgKi8NCj4+ICsgICAgICAgIHUzMiBjYXBfaGVh ZGVyLCBjYXBfaWQsIGNhcF9sZW5ndGg7DQo+PiArICAgICAgICBjb25zdCBzdHJ1Y3QgaGNpX2V4 dF9jYXBzICpjYXBfZW50cnk7DQo+PiArICAgICAgICBpbnQgaSwgZXJyID0gMDsNCj4+ICsNCj4+ ICsgICAgICAgIGlmICghY3Vycl9jYXApDQo+PiArICAgICAgICAgICAgICAgIHJldHVybiAwOw0K Pj4gKw0KPj4gKyAgICAgICAgZm9yICg7ICFlcnIgJiYgY3Vycl9jYXAgPCBlbmQ7IGN1cnJfY2Fw ICs9IGNhcF9sZW5ndGggKiA0KSB7DQo+PiArICAgICAgICAgICAgICAgIGNhcF9oZWFkZXIgPSBy ZWFkbChjdXJyX2NhcCk7DQo+PiArICAgICAgICAgICAgICAgIGNhcF9pZCA9IEZJRUxEX0dFVChD QVBfSEVBREVSX0lELCBjYXBfaGVhZGVyKTsNCj4+ICsgICAgICAgICAgICAgICAgY2FwX2xlbmd0 aCA9IEZJRUxEX0dFVChDQVBfSEVBREVSX0xFTkdUSCwgY2FwX2hlYWRlcik7DQo+PiArICAgICAg ICAgICAgICAgIGRldl9kYmcoJmhjaS0+bWFzdGVyLmRldiwiaWQ9MHglMDJ4IGxlbmd0aD0lZCIs IGNhcF9pZCwgY2FwX2xlbmd0aCk7DQo+PiArICAgICAgICAgICAgIGlmICghY2FwX2xlbmd0aCkN Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCj4+ICsgICAgICAgICAgICAgICAg aWYgKGN1cnJfY2FwICsgY2FwX2xlbmd0aCAqIDQgPj0gZW5kKSB7DQo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgZGV2X2VycigmaGNpLT5tYXN0ZXIuZGV2LA0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgImV4dF9jYXAgMHglMDJ4IGhhcyBzaXplICVkICh0b28gYmlnKVxu IiwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcF9pZCwgY2FwX2xlbmd0 aCk7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICBicmVhazsNCj4+ICsgICAgICAgICAgICAgICAgfQ0KPj4gKyAg ICAgICAgICAgICAgICBjYXBfZW50cnkgPSBOVUxMOw0KPj4gKyAgICAgICAgICAgICAgICBmb3Ig KGkgPSAwOyBpIDwgQVJSQVlfU0laRShleHRfY2FwYWJpbGl0aWVzKTsgaSsrKSB7DQo+PiArICAg ICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dF9jYXBhYmlsaXRpZXNbaV0uaWQgPT0gY2FwX2lk KSB7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBfZW50cnkgPSAmZXh0 X2NhcGFiaWxpdGllc1tpXTsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJy ZWFrOw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCj4+ICsgICAgICAgICAgICAgICAg fQ0KPj4gKyAgICAgICAgICAgICAgICBpZiAoIWNhcF9lbnRyeSkgew0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgIGRldl9ub3RpY2UoJmhjaS0+bWFzdGVyLmRldiwNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGV4dF9jYXAgMHglMDJ4XG4iLCBjYXBf aWQpOw0KPj4gKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhcF9sZW5ndGggPCBjYXBfZW50 cnktPm1pbl9sZW5ndGgpIHsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZo Y2ktPm1hc3Rlci5kZXYsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0 X2NhcCAweCUwMnggaGFzIHNpemUgJWQgKGV4cGVjdGluZyA+PSAlZClcbiIsDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBfaWQsIGNhcF9sZW5ndGgsIGNhcF9lbnRyeS0+ bWluX2xlbmd0aCk7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsN Cj4+ICsgICAgICAgICAgICAgICAgfSBlbHNlIHsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICBlcnIgPSBjYXBfZW50cnktPnBhcnNlcihoY2ksIGN1cnJfY2FwKTsNCj4+ICsgICAgICAgICAg ICAgICAgfQ0KPj4gKyAgICAgfQ0KPj4gKyAgICAgICAgcmV0dXJuIGVycjsNCj4+ICt9DQo+PiAr DQo+PiArc3RhdGljIGlubGluZSBib29sIGR5bmFkZHJfcGFyaXR5KHVuc2lnbmVkIGludCBhZGRy KQ0KPj4gK3sNCj4+ICsgICAgICAgIGFkZHIgfD0gMSA8PCA3Ow0KPj4gKyAgICAgICAgYWRkciAr PSBhZGRyID4+IDQ7DQo+PiArICAgICAgICBhZGRyICs9IGFkZHIgPj4gMjsNCj4+ICsgICAgICAg IGFkZHIgKz0gYWRkciA+PiAxOw0KPj4gKyAgICAgICAgcmV0dXJuIChhZGRyICYgMSk7DQo+PiAr fQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgbWNocF9oY2lfZGF0X3YxX2luaXQoc3RydWN0IG1jaHBf aTNjX2hjaSAqaGNpKQ0KPj4gK3sNCj4+ICsgICAgICAgIHVuc2lnbmVkIGludCBkYXRfaWR4Ow0K Pj4gKw0KPj4gKyAgICAgICAgaWYgKCFoY2ktPkRBVF9yZWdzKSB7DQo+PiArICAgICAgICAgICAg ICAgIGRldl9lcnIoJmhjaS0+bWFzdGVyLmRldiwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAib25seSBEQVQgaW4gcmVnaXN0ZXIgc3BhY2UgaXMgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnRc biIpOw0KPj4gKyAgICAgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7DQo+PiArICAgICAg ICB9DQo+PiArICAgICAgICBpZiAoaGNpLT5EQVRfZW50cnlfc2l6ZSAhPSA4KSB7DQo+PiArICAg ICAgICAgICAgICAgIGRldl9lcnIoJmhjaS0+bWFzdGVyLmRldiwNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAib25seSA4LWJ5dGVzIERBVCBlbnRyaWVzIGFyZSBzdXBwb3J0ZWQgYXQgdGhl IG1vbWVudFxuIik7DQo+PiArICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsNCj4+ ICsgICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAgIGlmICghaGNpLT5EQVRfZGF0YSkgew0KPj4g KyAgICAgICAgICAgICAgICAvKiB1c2UgYSBiaXRtYXAgZm9yIGZhc3RlciBmcmVlIHNsb3Qgc2Vh cmNoICovDQo+PiArICAgICAgICAgICAgICAgIGhjaS0+REFUX2RhdGEgPSBiaXRtYXBfemFsbG9j KGhjaS0+REFUX2VudHJpZXMsIEdGUF9LRVJORUwpOw0KPj4gKyAgICAgICAgICAgICAgICBpZiAo IWhjaS0+REFUX2RhdGEpDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9N RU07DQo+PiArDQo+PiArICAgICAgICAgICAgICAgIC8qIGNsZWFyIHRoZW0gKi8NCj4+ICsgICAg ICAgICAgICAgICAgZm9yIChkYXRfaWR4ID0gMDsgZGF0X2lkeCA8IGhjaS0+REFUX2VudHJpZXM7 IGRhdF9pZHgrKykgew0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdF93MF93cml0ZShk YXRfaWR4LCAwKTsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBkYXRfdzFfd3JpdGUoZGF0 X2lkeCwgMCk7DQo+PiArICAgICAgICAgICAgICAgIH0NCj4+ICsgICAgICAgIH0NCj4+ICsNCj4+ ICsgICAgICAgIHJldHVybiAwOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgdm9pZCBtY2hwX2hj aV9kYXRfdjFfY2xlYW51cChzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2kpDQo+PiArew0KPj4gKyAg ICAgICAgYml0bWFwX2ZyZWUoaGNpLT5EQVRfZGF0YSk7DQo+PiArICAgICAgICBoY2ktPkRBVF9k YXRhID0gTlVMTDsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIGludCBtY2hwX2hjaV9kYXRfdjFf YWxsb2NfZW50cnkoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpKQ0KPj4gK3sNCj4+ICsgICAgICAg IHVuc2lnbmVkIGludCBkYXRfaWR4Ow0KPj4gKyAgICAgICAgaW50IHJldDsNCj4+ICsNCj4+ICsg ICAgICAgIGlmICghaGNpLT5EQVRfZGF0YSkgew0KPj4gKyAgICAgICAgICAgICAgICByZXQgPSBt Y2hwX2hjaV9kYXRfdjFfaW5pdChoY2kpOw0KPj4gKyAgICAgICAgICAgICAgICBpZiAocmV0KQ0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7DQo+PiArICAgICAgICB9DQo+ PiArICAgICAgICBkYXRfaWR4ID0gZmluZF9maXJzdF96ZXJvX2JpdChoY2ktPkRBVF9kYXRhLCBo Y2ktPkRBVF9lbnRyaWVzKTsNCj4+ICsgICAgICAgIGlmIChkYXRfaWR4ID49IGhjaS0+REFUX2Vu dHJpZXMpDQo+PiArICAgICAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOw0KPj4gKyAgICAgICAg X19zZXRfYml0KGRhdF9pZHgsIGhjaS0+REFUX2RhdGEpOw0KPj4gKw0KPj4gKyAgICAgICAgLyog ZGVmYXVsdCBmbGFncyAqLw0KPj4gKyAgICAgICAgZGF0X3cwX3dyaXRlKGRhdF9pZHgsIERBVF8w X1NJUl9SRUpFQ1QgfCBEQVRfMF9NUl9SRUpFQ1QpOw0KPj4gKw0KPj4gKyAgICAgICAgcmV0dXJu IGRhdF9pZHg7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB2b2lkIG1jaHBfaGNpX2RhdF92MV9m cmVlX2VudHJ5KHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwgdW5zaWduZWQgaW50IGRhdF9pZHgp DQo+PiArew0KPj4gKyAgICAgICAgZGF0X3cwX3dyaXRlKGRhdF9pZHgsIDApOw0KPj4gKyAgICAg ICAgZGF0X3cxX3dyaXRlKGRhdF9pZHgsIDApOw0KPj4gKyAgICAgICAgaWYgKGhjaS0+REFUX2Rh dGEpDQo+PiArICAgICAgICAgICAgICAgIF9fY2xlYXJfYml0KGRhdF9pZHgsIGhjaS0+REFUX2Rh dGEpOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgdm9pZCBtY2hwX2hjaV9kYXRfdjFfc2V0X2R5 bmFtaWNfYWRkcihzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRfaWR4LCB1OCBhZGRyZXNz KQ0KPj4gK3sNCj4+ICsgICAgICAgIHUzMiBkYXRfdzA7DQo+PiArDQo+PiArICAgICAgICBkYXRf dzAgPSBkYXRfdzBfcmVhZChkYXRfaWR4KTsNCj4+ICsgICAgICAgIGRhdF93MCAmPSB+KERBVF8w X0RZTkFNSUNfQUREUkVTUyB8IERBVF8wX0RZTkFERFJfUEFSSVRZKTsNCj4+ICsgICAgICAgIGRh dF93MCB8PSBGSUVMRF9QUkVQKERBVF8wX0RZTkFNSUNfQUREUkVTUywgYWRkcmVzcykgfA0KPj4g KyAgICAgICAgICAgICAgICAgIChkeW5hZGRyX3Bhcml0eShhZGRyZXNzKSA/IERBVF8wX0RZTkFE RFJfUEFSSVRZIDogMCk7DQo+PiArICAgICAgICBkYXRfdzBfd3JpdGUoZGF0X2lkeCwgZGF0X3cw KTsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIHZvaWQgbWNocF9oY2lfZGF0X3YxX3NldF9zdGF0 aWNfYWRkcihzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdF9pZHgsIHU4IGFkZHJlc3MpDQo+ PiArew0KPj4gKyAgICAgICAgdTMyIGRhdF93MDsNCj4+ICsNCj4+ICsgICAgICAgIGRhdF93MCA9 IGRhdF93MF9yZWFkKGRhdF9pZHgpOw0KPj4gKyAgICAgICAgZGF0X3cwICY9IH5EQVRfMF9TVEFU SUNfQUREUkVTUzsNCj4+ICsgICAgICAgIGRhdF93MCB8PSBGSUVMRF9QUkVQKERBVF8wX1NUQVRJ Q19BRERSRVNTLCBhZGRyZXNzKTsNCj4+ICsgICAgICAgIGRhdF93MF93cml0ZShkYXRfaWR4LCBk YXRfdzApOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgdm9pZCBtY2hwX2hjaV9kYXRfdjFfc2V0 X2ZsYWdzKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwgdW5zaWduZWQgaW50IGRhdF9pZHgsDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHcwX2ZsYWdzLCB1MzIgdzFf ZmxhZ3MpDQo+PiArew0KPj4gKyAgICAgICAgdTMyIGRhdF93MCwgZGF0X3cxOw0KPj4gKw0KPj4g KyAgICAgICAgZGF0X3cwID0gZGF0X3cwX3JlYWQoZGF0X2lkeCk7DQo+PiArICAgICAgICBkYXRf dzEgPSBkYXRfdzFfcmVhZChkYXRfaWR4KTsNCj4+ICsgICAgICAgIGRhdF93MCB8PSB3MF9mbGFn czsNCj4+ICsgICAgICAgIGRhdF93MSB8PSB3MV9mbGFnczsNCj4+ICsgICAgICAgIGRhdF93MF93 cml0ZShkYXRfaWR4LCBkYXRfdzApOw0KPj4gKyAgICAgICAgZGF0X3cxX3dyaXRlKGRhdF9pZHgs IGRhdF93MSk7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB2b2lkIG1jaHBfaGNpX2RhdF92MV9j bGVhcl9mbGFncyhzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksIHVuc2lnbmVkIGludCBkYXRfaWR4 LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHcwX2ZsYWdzLCB1 MzIgdzFfZmxhZ3MpDQo+PiArew0KPj4gKyAgICAgICAgdTMyIGRhdF93MCwgZGF0X3cxOw0KPj4g Kw0KPj4gKyAgICAgICAgZGF0X3cwID0gZGF0X3cwX3JlYWQoZGF0X2lkeCk7DQo+PiArICAgICAg ICBkYXRfdzEgPSBkYXRfdzFfcmVhZChkYXRfaWR4KTsNCj4+ICsgICAgICAgIGRhdF93MCAmPSB+ dzBfZmxhZ3M7DQo+PiArICAgICAgICBkYXRfdzEgJj0gfncxX2ZsYWdzOw0KPj4gKyAgICAgICAg ZGF0X3cwX3dyaXRlKGRhdF9pZHgsIGRhdF93MCk7DQo+PiArICAgICAgICBkYXRfdzFfd3JpdGUo ZGF0X2lkeCwgZGF0X3cxKTsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIGludCBtY2hwX2hjaV9k YXRfdjFfZ2V0X2luZGV4KHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwgdTggZGV2X2FkZHIpDQo+ PiArew0KPj4gKyAgICAgICAgdW5zaWduZWQgaW50IGRhdF9pZHg7DQo+PiArICAgICAgICB1MzIg ZGF0X3cwOw0KPj4gKw0KPj4gKyAgICAgICAgZm9yX2VhY2hfc2V0X2JpdChkYXRfaWR4LCBoY2kt PkRBVF9kYXRhLCBoY2ktPkRBVF9lbnRyaWVzKSB7DQo+PiArICAgICAgICAgICAgICAgIGRhdF93 MCA9IGRhdF93MF9yZWFkKGRhdF9pZHgpOw0KPj4gKyAgICAgICAgICAgICAgICBpZiAoRklFTERf R0VUKERBVF8wX0RZTkFNSUNfQUREUkVTUywgZGF0X3cwKSA9PSBkZXZfYWRkcikNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0X2lkeDsNCj4+ICsgICAgICAgIH0NCj4+ICsN Cj4+ICsgICAgICAgIHJldHVybiAtRU5PREVWOw0KPj4gK30NCj4+ICsNCj4+ICtjb25zdCBzdHJ1 Y3QgbWNocF9oY2lfZGF0X29wcyBtY2hwX21pcGlfaTNjX2hjaV9kYXRfdjEgPSB7DQo+PiArICAg ICAgICAuaW5pdCAgICAgICAgICAgICAgICAgICA9IG1jaHBfaGNpX2RhdF92MV9pbml0LA0KPj4g KyAgICAgICAgLmNsZWFudXAgICAgICAgICAgICAgICAgPSBtY2hwX2hjaV9kYXRfdjFfY2xlYW51 cCwNCj4+ICsgICAgICAgIC5hbGxvY19lbnRyeSAgICAgICAgICAgID0gbWNocF9oY2lfZGF0X3Yx X2FsbG9jX2VudHJ5LA0KPj4gKyAgICAgICAgLmZyZWVfZW50cnkgICAgICAgICAgICAgPSBtY2hw X2hjaV9kYXRfdjFfZnJlZV9lbnRyeSwNCj4+ICsgICAgICAgIC5zZXRfZHluYW1pY19hZGRyICAg ICAgID0gbWNocF9oY2lfZGF0X3YxX3NldF9keW5hbWljX2FkZHIsDQo+PiArICAgICAgICAuc2V0 X3N0YXRpY19hZGRyICAgICAgICA9IG1jaHBfaGNpX2RhdF92MV9zZXRfc3RhdGljX2FkZHIsDQo+ PiArICAgICAgICAuc2V0X2ZsYWdzICAgICAgICAgICAgICA9IG1jaHBfaGNpX2RhdF92MV9zZXRf ZmxhZ3MsDQo+PiArICAgICAgICAuY2xlYXJfZmxhZ3MgICAgICAgICAgICA9IG1jaHBfaGNpX2Rh dF92MV9jbGVhcl9mbGFncywNCj4+ICsgICAgICAgIC5nZXRfaW5kZXggICAgICAgICAgICAgID0g bWNocF9oY2lfZGF0X3YxX2dldF9pbmRleCwNCj4+ICt9Ow0KPj4gKw0KPj4gKy8qDQo+PiArICog RGV2aWNlIENoYXJhY3RlcmlzdGljIFRhYmxlDQo+PiArICovDQo+PiArDQo+PiArdm9pZCBtY2hw X2kzY19oY2lfZGN0X2dldF92YWwoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpLCB1bnNpZ25lZCBp bnQgZGN0X2lkeCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgdTY0ICpwaWQsIHVuc2ln bmVkIGludCAqZGNyLCB1bnNpZ25lZCBpbnQgKmJjcikNCj4+ICt7DQo+PiArICAgICAgICB2b2lk IF9faW9tZW0gKnJlZyA9IGhjaS0+RENUX3JlZ3MgKyBkY3RfaWR4ICogNCAqIDQ7DQo+PiArICAg ICAgICB1MzIgZGN0X2VudHJ5X2RhdGFbNF07DQo+PiArICAgICAgICB1bnNpZ25lZCBpbnQgaTsN Cj4+ICsNCj4+ICsgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsNCj4+ICsgICAgICAg ICAgICAgICAgZGN0X2VudHJ5X2RhdGFbaV0gPSByZWFkbChyZWcpOw0KPj4gKyAgICAgICAgICAg ICAgICByZWcgKz0gNDsNCj4+ICsgICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAgICpwaWQgPSAo KHU2NClkY3RfZW50cnlfZGF0YVswXSkgPDwgKDQ3IC0gMzIgKyAxKSB8DQo+PiArICAgICAgICAg ICAgICAgRklFTERfR0VUKFcxX01BU0soNDcsIDMyKSwgZGN0X2VudHJ5X2RhdGFbMV0pOw0KPj4g KyAgICAgICAgKmRjciA9IEZJRUxEX0dFVChXMl9NQVNLKDcxLCA2NCksIGRjdF9lbnRyeV9kYXRh WzJdKTsNCj4+ICsgICAgICAgICpiY3IgPSBGSUVMRF9HRVQoVzJfTUFTSyg3OSwgNzIpLCBkY3Rf ZW50cnlfZGF0YVsyXSk7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBlbnVtIG1jaHBfaGNpX2Nt ZF9tb2RlIG1jaHBfZ2V0X2kzY19tb2RlKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSkNCj4+ICt7 DQo+PiArICAgICAgICBzdHJ1Y3QgaTNjX2J1cyAqYnVzID0gaTNjX21hc3Rlcl9nZXRfYnVzKCZo Y2ktPm1hc3Rlcik7DQo+PiArDQo+PiArICAgICAgICBpZiAoYnVzLT5zY2xfcmF0ZS5pM2MgPiA4 MDAwMDAwKQ0KPj4gKyAgICAgICAgICAgICAgICByZXR1cm4gTU9ERV9JM0NfU0RSMDsNCj4+ICsg ICAgICAgIGlmIChidXMtPnNjbF9yYXRlLmkzYyA+IDYwMDAwMDApDQo+PiArICAgICAgICAgICAg ICAgIHJldHVybiBNT0RFX0kzQ19TRFIxOw0KPj4gKyAgICAgICAgaWYgKGJ1cy0+c2NsX3JhdGUu aTNjID4gNDAwMDAwMCkNCj4+ICsgICAgICAgICAgICAgICAgcmV0dXJuIE1PREVfSTNDX1NEUjI7 DQo+PiArICAgICAgICBpZiAoYnVzLT5zY2xfcmF0ZS5pM2MgPiAyMDAwMDAwKQ0KPj4gKyAgICAg ICAgICAgICAgICByZXR1cm4gTU9ERV9JM0NfU0RSMzsNCj4+ICsgICAgICAgIHJldHVybiBNT0RF X0kzQ19TRFI0Ow0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgZW51bSBtY2hwX2hjaV9jbWRfbW9k ZSBtY2hwX2dldF9pMmNfbW9kZShzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2kpDQo+PiArew0KPj4g KyAgICAgICAgc3RydWN0IGkzY19idXMgKmJ1cyA9IGkzY19tYXN0ZXJfZ2V0X2J1cygmaGNpLT5t YXN0ZXIpOw0KPj4gKw0KPj4gKyAgICAgICAgaWYgKGJ1cy0+c2NsX3JhdGUuaTJjID49IDEwMDAw MDApDQo+PiArICAgICAgICAgICAgICAgIHJldHVybiBNT0RFX0kyQ19GbVA7DQo+PiArICAgICAg ICByZXR1cm4gTU9ERV9JMkNfRm07DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB2b2lkIG1jaHBf ZmlsbF9kYXRhX2J5dGVzKHN0cnVjdCBtY2hwX2hjaV94ZmVyICp4ZmVyLCB1OCAqZGF0YSwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGFfbGVuKQ0KPj4g K3sNCj4+ICsgICAgICAgIHhmZXItPmNtZF9kZXNjWzFdID0gMDsNCj4+ICsgICAgICAgIHN3aXRj aCAoZGF0YV9sZW4pIHsNCj4+ICsgICAgICAgIGNhc2UgNDoNCj4+ICsgICAgICAgICAgICAgICAg eGZlci0+Y21kX2Rlc2NbMV0gfD0gQ01EX0kxX0RBVEFfQllURV80KGRhdGFbM10pOw0KPj4gKyAg ICAgICAgICAgICAgICBmYWxsdGhyb3VnaDsNCj4+ICsgICAgICAgIGNhc2UgMzoNCj4+ICsgICAg ICAgICAgICAgICAgeGZlci0+Y21kX2Rlc2NbMV0gfD0gQ01EX0kxX0RBVEFfQllURV8zKGRhdGFb Ml0pOw0KPj4gKyAgICAgICAgICAgICAgICBmYWxsdGhyb3VnaDsNCj4+ICsgICAgICAgIGNhc2Ug MjoNCj4+ICsgICAgICAgICAgICAgICAgeGZlci0+Y21kX2Rlc2NbMV0gfD0gQ01EX0kxX0RBVEFf QllURV8yKGRhdGFbMV0pOw0KPj4gKyAgICAgICAgICAgICAgICBmYWxsdGhyb3VnaDsNCj4+ICsg ICAgICAgIGNhc2UgMToNCj4+ICsgICAgICAgICAgICAgICAgeGZlci0+Y21kX2Rlc2NbMV0gfD0g Q01EX0kxX0RBVEFfQllURV8xKGRhdGFbMF0pOw0KPj4gKyAgICAgICAgICAgICAgICBmYWxsdGhy b3VnaDsNCj4+ICsgICAgICAgIGNhc2UgMDoNCj4+ICsgICAgICAgICAgICAgICAgYnJlYWs7DQo+ PiArICAgICAgICB9DQo+PiArICAgICAgICAvKiB3ZSBjb25zdW1lZCBhbGwgdGhlIGRhdGEgd2l0 aCB0aGUgY21kIGRlc2NyaXB0b3IgKi8NCj4+ICsgICAgICAgIHhmZXItPmRhdGEgPSBOVUxMOw0K Pj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgaW50IG1jaHBfaGNpX2NtZF92MV9wcmVwX2NjYyhzdHJ1 Y3QgbWNocF9pM2NfaGNpICpoY2ksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHN0cnVjdCBtY2hwX2hjaV94ZmVyICp4ZmVyLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1OCBjY2NfYWRkciwgdTggY2NjX2NtZCwgYm9vbCByYXcpDQo+PiArew0KPj4gKyAg ICAgICAgdW5zaWduZWQgaW50IGRhdF9pZHggPSAwOw0KPj4gKyAgICAgICAgZW51bSBtY2hwX2hj aV9jbWRfbW9kZSBtb2RlID0gbWNocF9nZXRfaTNjX21vZGUoaGNpKTsNCj4+ICsgICAgICAgIHU4 ICpkYXRhID0geGZlci0+ZGF0YTsNCj4+ICsgICAgICAgIHVuc2lnbmVkIGludCBkYXRhX2xlbiA9 IHhmZXItPmRhdGFfbGVuOw0KPj4gKyAgICAgICAgYm9vbCBybncgPSB4ZmVyLT5ybnc7DQo+PiAr ICAgICAgICBpbnQgcmV0Ow0KPj4gKw0KPj4gKyAgICAgICAgLyogdGhpcyBzaG91bGQgbmV2ZXIg aGFwcGVuICovDQo+PiArICAgICAgICBpZiAoV0FSTl9PTihyYXcpKQ0KPj4gKyAgICAgICAgICAg ICAgICByZXR1cm4gLUVJTlZBTDsNCj4+ICsNCj4+ICsgICAgICAgIGlmIChjY2NfYWRkciAhPSBJ M0NfQlJPQURDQVNUX0FERFIpIHsNCj4+ICsgICAgICAgICAgICAgICAgcmV0ID0gbWNocF9taXBp X2kzY19oY2lfZGF0X3YxLmdldF9pbmRleChoY2ksIGNjY19hZGRyKTsNCj4+ICsgICAgICAgICAg ICAgICAgaWYgKHJldCA8IDApDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJl dDsNCj4+ICsgICAgICAgICAgICAgICAgZGF0X2lkeCA9IHJldDsNCj4+ICsgICAgICAgIH0NCj4+ ICsNCj4+ICsgICAgICAgIHhmZXItPmNtZF90aWQgPSBtY2hwX2hjaV9nZXRfdGlkKCk7DQo+PiAr DQo+PiArICAgICAgICBpZiAoIXJudyAmJiBkYXRhX2xlbiA8PSA0KSB7DQo+PiArICAgICAgICAg ICAgICAgIC8qIHdlIHVzZSBhbiBJbW1lZGlhdGUgRGF0YSBUcmFuc2ZlciBDb21tYW5kICovDQo+ PiArICAgICAgICAgICAgICAgIHhmZXItPmNtZF9kZXNjWzBdID0NCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICBDTURfMF9BVFRSX0kgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENN RF9JMF9USUQoeGZlci0+Y21kX3RpZCkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENN RF9JMF9DTUQoY2NjX2NtZCkgfCBDTURfSTBfQ1AgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgIENNRF9JMF9ERVZfSU5ERVgoZGF0X2lkeCkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgIENNRF9JMF9EVFQoZGF0YV9sZW4pIHwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBD TURfSTBfTU9ERShtb2RlKTsNCj4+ICsgICAgICAgICAgICAgICAgbWNocF9maWxsX2RhdGFfYnl0 ZXMoeGZlciwgZGF0YSwgZGF0YV9sZW4pOw0KPj4gKyAgICAgICAgfSBlbHNlIHsNCj4+ICsgICAg ICAgICAgICAgICAgLyogd2UgdXNlIGEgUmVndWxhciBEYXRhIFRyYW5zZmVyIENvbW1hbmQgKi8N Cj4+ICsgICAgICAgICAgICAgICAgeGZlci0+Y21kX2Rlc2NbMF0gPQ0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgIENNRF8wX0FUVFJfUiB8DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg Q01EX1IwX1RJRCh4ZmVyLT5jbWRfdGlkKSB8DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg Q01EX1IwX0NNRChjY2NfY21kKSB8IENNRF9SMF9DUCB8DQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgQ01EX1IwX0RFVl9JTkRFWChkYXRfaWR4KSB8DQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgQ01EX1IwX01PREUobW9kZSkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIChy bncgPyBDTURfUjBfUk5XIDogMCk7DQo+PiArICAgICAgICAgICAgICAgIHhmZXItPmNtZF9kZXNj WzFdID0NCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBDTURfUjFfREFUQV9MRU5HVEgoZGF0 YV9sZW4pOw0KPj4gKyAgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgICAgcmV0dXJuIDA7DQo+PiAr fQ0KPj4gKw0KPj4gK3N0YXRpYyB2b2lkIG1jaHBfaGNpX2NtZF92MV9wcmVwX2kzY194ZmVyKHN0 cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc3RydWN0IGkzY19kZXZfZGVzYyAqZGV2LA0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqeGZlcikNCj4+ICt7DQo+ PiArICAgICAgICBzdHJ1Y3QgbWNocF9pM2NfaGNpX2Rldl9kYXRhICpkZXZfZGF0YSA9IGkzY19k ZXZfZ2V0X21hc3Rlcl9kYXRhKGRldik7DQo+PiArICAgICAgICB1bnNpZ25lZCBpbnQgZGF0X2lk eCA9IGRldl9kYXRhLT5kYXRfaWR4Ow0KPj4gKyAgICAgICAgZW51bSBtY2hwX2hjaV9jbWRfbW9k ZSBtb2RlID0gbWNocF9nZXRfaTNjX21vZGUoaGNpKTsNCj4+ICsgICAgICAgIHU4ICpkYXRhID0g eGZlci0+ZGF0YTsNCj4+ICsgICAgICAgIHVuc2lnbmVkIGludCBkYXRhX2xlbiA9IHhmZXItPmRh dGFfbGVuOw0KPj4gKyAgICAgICAgYm9vbCBybncgPSB4ZmVyLT5ybnc7DQo+PiArDQo+PiArICAg ICAgICB4ZmVyLT5jbWRfdGlkID0gbWNocF9oY2lfZ2V0X3RpZCgpOw0KPj4gKw0KPj4gKyAgICAg ICAgaWYgKCFybncgJiYgZGF0YV9sZW4gPD0gNCkgew0KPj4gKyAgICAgICAgICAgICAgICAvKiB3 ZSB1c2UgYW4gSW1tZWRpYXRlIERhdGEgVHJhbnNmZXIgQ29tbWFuZCAqLw0KPj4gKyAgICAgICAg ICAgICAgICB4ZmVyLT5jbWRfZGVzY1swXSA9DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg Q01EXzBfQVRUUl9JIHwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBDTURfSTBfVElEKHhm ZXItPmNtZF90aWQpIHwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBDTURfSTBfREVWX0lO REVYKGRhdF9pZHgpIHwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBDTURfSTBfRFRUKGRh dGFfbGVuKSB8DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgQ01EX0kwX01PREUobW9kZSk7 DQo+PiArICAgICAgICAgICAgICAgIG1jaHBfZmlsbF9kYXRhX2J5dGVzKHhmZXIsIGRhdGEsIGRh dGFfbGVuKTsNCj4+ICsgICAgICAgIH0gZWxzZSB7DQo+PiArICAgICAgICAgICAgICAgIC8qIHdl IHVzZSBhIFJlZ3VsYXIgRGF0YSBUcmFuc2ZlciBDb21tYW5kICovDQo+PiArICAgICAgICAgICAg ICAgIHhmZXItPmNtZF9kZXNjWzBdID0NCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBDTURf MF9BVFRSX1IgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENNRF9SMF9USUQoeGZlci0+ Y21kX3RpZCkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENNRF9SMF9ERVZfSU5ERVgo ZGF0X2lkeCkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENNRF9SMF9NT0RFKG1vZGUp IHwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAocm53ID8gQ01EX1IwX1JOVyA6IDApOw0K Pj4gKyAgICAgICAgICAgICAgICB4ZmVyLT5jbWRfZGVzY1sxXSA9DQo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgQ01EX1IxX0RBVEFfTEVOR1RIKGRhdGFfbGVuKTsNCj4+ICsgICAgICAgIH0N Cj4+ICt9DQo+PiArDQo+PiArc3RhdGljIHZvaWQgbWNocF9oY2lfY21kX3YxX3ByZXBfaTJjX3hm ZXIoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdHJ1Y3QgaTJjX2Rldl9kZXNjICpkZXYsDQo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtY2hwX2hjaV94ZmVyICp4ZmVyKQ0KPj4g K3sNCj4+ICsgICAgICAgIHN0cnVjdCBtY2hwX2kzY19oY2lfZGV2X2RhdGEgKmRldl9kYXRhID0g aTJjX2Rldl9nZXRfbWFzdGVyX2RhdGEoZGV2KTsNCj4+ICsgICAgICAgIHVuc2lnbmVkIGludCBk YXRfaWR4ID0gZGV2X2RhdGEtPmRhdF9pZHg7DQo+PiArICAgICAgICBlbnVtIG1jaHBfaGNpX2Nt ZF9tb2RlIG1vZGUgPSBtY2hwX2dldF9pMmNfbW9kZShoY2kpOw0KPj4gKyAgICAgICAgdTggKmRh dGEgPSB4ZmVyLT5kYXRhOw0KPj4gKyAgICAgICAgdW5zaWduZWQgaW50IGRhdGFfbGVuID0geGZl ci0+ZGF0YV9sZW47DQo+PiArICAgICAgICBib29sIHJudyA9IHhmZXItPnJudzsNCj4+ICsNCj4+ ICsgICAgICAgIHhmZXItPmNtZF90aWQgPSBtY2hwX2hjaV9nZXRfdGlkKCk7DQo+PiArDQo+PiAr ICAgICAgICBpZiAoIXJudyAmJiBkYXRhX2xlbiA8PSA0KSB7DQo+PiArICAgICAgICAgICAgICAg IC8qIHdlIHVzZSBhbiBJbW1lZGlhdGUgRGF0YSBUcmFuc2ZlciBDb21tYW5kICovDQo+PiArICAg ICAgICAgICAgICAgIHhmZXItPmNtZF9kZXNjWzBdID0NCj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICBDTURfMF9BVFRSX0kgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENNRF9JMF9U SUQoeGZlci0+Y21kX3RpZCkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENNRF9JMF9E RVZfSU5ERVgoZGF0X2lkeCkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENNRF9JMF9E VFQoZGF0YV9sZW4pIHwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBDTURfSTBfTU9ERSht b2RlKTsNCj4+ICsgICAgICAgICAgICAgICAgbWNocF9maWxsX2RhdGFfYnl0ZXMoeGZlciwgZGF0 YSwgZGF0YV9sZW4pOw0KPj4gKyAgICAgICAgfSBlbHNlIHsNCj4+ICsgICAgICAgICAgICAgICAg Lyogd2UgdXNlIGEgUmVndWxhciBEYXRhIFRyYW5zZmVyIENvbW1hbmQgKi8NCj4+ICsgICAgICAg ICAgICAgICAgeGZlci0+Y21kX2Rlc2NbMF0gPQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg IENNRF8wX0FUVFJfUiB8DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgQ01EX1IwX1RJRCh4 ZmVyLT5jbWRfdGlkKSB8DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgQ01EX1IwX0RFVl9J TkRFWChkYXRfaWR4KSB8DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgQ01EX1IwX01PREUo bW9kZSkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIChybncgPyBDTURfUjBfUk5XIDog MCk7DQo+PiArICAgICAgICAgICAgICAgIHhmZXItPmNtZF9kZXNjWzFdID0NCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICBDTURfUjFfREFUQV9MRU5HVEgoZGF0YV9sZW4pOw0KPj4gKyAgICAg ICAgfQ0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgaW50IG1jaHBfaGNpX2NtZF92MV9kYWEoc3Ry dWN0IG1jaHBfaTNjX2hjaSAqaGNpKQ0KPj4gK3sNCj4+ICsgICAgICAgIHN0cnVjdCBtY2hwX2hj aV94ZmVyICp4ZmVyOw0KPj4gKyAgICAgICAgaW50IHJldCwgZGF0X2lkeCA9IC0xOw0KPj4gKyAg ICAgICAgdTggbmV4dF9hZGRyID0gMDsNCj4+ICsgICAgICAgIHU2NCBwaWQ7DQo+PiArICAgICAg ICB1bnNpZ25lZCBpbnQgZGNyLCBiY3I7DQo+PiArICAgICAgICBERUNMQVJFX0NPTVBMRVRJT05f T05TVEFDSyhkb25lKTsNCj4+ICsNCj4+ICsgICAgICAgIHhmZXIgPSBtY2hwX2hjaV9hbGxvY194 ZmVyKDEpOw0KPj4gKyAgICAgICAgaWYgKCF4ZmVyKQ0KPj4gKyAgICAgICAgICAgICAgICByZXR1 cm4gLUVOT01FTTsNCj4+ICsNCj4+ICsgICAgICAgIC8qDQo+PiArICAgICAgICAgKiBTaW1wbGUg Zm9yIG5vdzogd2UgYWxsb2NhdGUgYSB0ZW1wb3JhcnkgREFUIGVudHJ5LCBkbyBhIHNpbmdsZQ0K Pj4gKyAgICAgICAgICogREFBLCByZWdpc3RlciB0aGUgZGV2aWNlIHdoaWNoIHdpbGwgYWxsb2Nh dGUgaXRzIG93biBEQVQgZW50cnkNCj4+ICsgICAgICAgICAqIHZpYSB0aGUgY29yZSBjYWxsYmFj aywgdGhlbiBmcmVlIHRoZSB0ZW1wb3JhcnkgREFUIGVudHJ5Lg0KPj4gKyAgICAgICAgICogTG9v cCB1bnRpbCB0aGVyZSBpcyBubyBtb3JlIGRldmljZXMgdG8gYXNzaWduIGFuIGFkZHJlc3MgdG8u DQo+PiArICAgICAgICAgKiBZZXMsIHRoZXJlIGlzIHJvb20gZm9yIGltcHJvdmVtZW50cy4NCj4+ ICsgICAgICAgICAqLw0KPj4gKyAgICAgICAgZm9yICg7Oykgew0KPj4gKyAgICAgICAgICAgICAg ICByZXQgPSBtY2hwX21pcGlfaTNjX2hjaV9kYXRfdjEuYWxsb2NfZW50cnkoaGNpKTsNCj4+ICsg ICAgICAgICAgICAgICAgaWYgKHJldCA8IDApDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg YnJlYWs7DQo+PiArICAgICAgICAgICAgICAgIGRhdF9pZHggPSByZXQ7DQo+PiArICAgICAgICAg ICAgICAgIHJldCA9IGkzY19tYXN0ZXJfZ2V0X2ZyZWVfYWRkcigmaGNpLT5tYXN0ZXIsIG5leHRf YWRkcik7DQo+PiArICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQ0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgIGJyZWFrOw0KPj4gKyAgICAgICAgICAgICAgICBuZXh0X2FkZHIgPSByZXQ7 DQo+PiArDQo+PiArICAgICAgICAgICAgICAgIGRldl9kYmcoJmhjaS0+bWFzdGVyLmRldiwibmV4 dF9hZGRyID0gMHglMDJ4LCBEQUEgdXNpbmcgREFUICVkIiwgbmV4dF9hZGRyLCBkYXRfaWR4KTsN Cj4+ICsgICAgICAgICAgICAgICAgbWNocF9taXBpX2kzY19oY2lfZGF0X3YxLnNldF9keW5hbWlj X2FkZHIoaGNpLCBkYXRfaWR4LCBuZXh0X2FkZHIpOw0KPj4gKyAgICAgICAgICAgICAgICBtY2hw X21pcGlfaTNjX2hjaV9kY3RfaW5kZXhfcmVzZXQoaGNpKTsNCj4+ICsNCj4+ICsgICAgICAgICAg ICAgICAgeGZlci0+Y21kX3RpZCA9IG1jaHBfaGNpX2dldF90aWQoKTsNCj4+ICsgICAgICAgICAg ICAgICAgeGZlci0+Y21kX2Rlc2NbMF0gPQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENN RF8wX0FUVFJfQSB8DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgQ01EX0EwX1RJRCh4ZmVy LT5jbWRfdGlkKSB8DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgQ01EX0EwX0NNRChJM0Nf Q0NDX0VOVERBQSkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENNRF9BMF9ERVZfSU5E RVgoZGF0X2lkeCkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENNRF9BMF9ERVZfQ09V TlQoMSkgfA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIENNRF9BMF9ST0MgfCBDTURfQTBf VE9DOw0KPj4gKyAgICAgICAgICAgICAgICB4ZmVyLT5jbWRfZGVzY1sxXSA9IDA7DQo+PiArICAg ICAgICAgICAgICAgIHhmZXItPmNvbXBsZXRpb24gPSAmZG9uZTsNCj4+ICsgICAgICAgICAgICAg ICAgaGNpLT5pby0+cXVldWVfeGZlcihoY2ksIHhmZXIsIDEpOw0KPj4gKyAgICAgICAgICAgICAg ICBpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZG9uZSwgSFopICYmDQo+PiArICAg ICAgICAgICAgICAgICAgICBoY2ktPmlvLT5kZXF1ZXVlX3hmZXIoaGNpLCB4ZmVyLCAxKSkgew0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FVElNRTsNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICBicmVhazsNCj4+ICsgICAgICAgICAgICAgICAgfQ0KPj4gKyAgICAgICAg ICAgICBpZiAoKFJFU1BfU1RBVFVTKHhmZXItPnJlc3BvbnNlKSA9PSBSRVNQX0VSUl9BRERSX0hF QURFUiB8fA0KPj4gKyAgICAgICAgICAgICAgICAgICAgIFJFU1BfU1RBVFVTKHhmZXItPnJlc3Bv bnNlKSA9PSBSRVNQX0VSUl9OQUNLKSAmJg0KPj4gKyAgICAgICAgICAgICAgICAgICAgUkVTUF9E QVRBX0xFTkdUSCh4ZmVyLT5yZXNwb25zZSkgPT0gMSkgew0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgIHJldCA9IDA7ICAvKiBubyBtb3JlIGRldmljZXMgdG8gYmUgYXNzaWduZWQgKi8NCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCj4+ICsgICAgICAgICAgICAgICAgfQ0K Pj4gKyAgICAgICAgICAgICBpZiAoUkVTUF9TVEFUVVMoeGZlci0+cmVzcG9uc2UpICE9IFJFU1Bf U1VDQ0VTUykgew0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU87DQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+PiArICAgICAgICAgICAgICAgIH0NCj4+ ICsNCj4+ICsgICAgICAgICAgICAgICAgbWNocF9pM2NfaGNpX2RjdF9nZXRfdmFsKGhjaSwgMCwg JnBpZCwgJmRjciwgJmJjcik7DQo+PiArICAgICAgICAgICAgICAgIGRldl9kYmcoJmhjaS0+bWFz dGVyLmRldiwiYXNzaWduZWQgYWRkcmVzcyAlI3ggdG8gZGV2aWNlIFBJRD0weCVsbHggRENSPSUj eCBCQ1I9JSN4IiwNCj4+ICsgICAgICAgICAgICAgICAgICAgIG5leHRfYWRkciwgcGlkLCBkY3Is IGJjcik7DQo+PiArDQo+PiArICAgICAgICAgICAgICAgIG1jaHBfbWlwaV9pM2NfaGNpX2RhdF92 MS5mcmVlX2VudHJ5KGhjaSwgZGF0X2lkeCk7DQo+PiArICAgICAgICAgICAgICAgIGRhdF9pZHgg PSAtMTsNCj4+ICsNCj4+ICsgICAgICAgICAgICAgICAgLyoNCj4+ICsgICAgICAgICAgICAgICAg ICogVE9ETzogRXh0ZW5kIHRoZSBzdWJzeXN0ZW0gbGF5ZXIgdG8gYWxsb3cgZm9yIHJlZ2lzdGVy aW5nDQo+PiArICAgICAgICAgICAgICAgICAqIG5ldyBkZXZpY2UgYW5kIHByb3ZpZGUgQkNSL0RD Ui9QSUQgYXQgdGhlIHNhbWUgdGltZS4NCj4+ICsgICAgICAgICAgICAgICAgICovDQo+PiArICAg ICAgICAgICAgICAgIHJldCA9IGkzY19tYXN0ZXJfYWRkX2kzY19kZXZfbG9ja2VkKCZoY2ktPm1h c3RlciwgbmV4dF9hZGRyKTsNCj4+ICsgICAgICAgICAgICAgICAgaWYgKHJldCkNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICBicmVhazsNCj4+ICsgICAgICAgIH0NCj4+ICsNCj4+ICsgICAg ICAgIGlmIChkYXRfaWR4ID49IDApDQo+PiArICAgICAgICAgICAgICAgIG1jaHBfbWlwaV9pM2Nf aGNpX2RhdF92MS5mcmVlX2VudHJ5KGhjaSwgZGF0X2lkeCk7DQo+PiArICAgICAgICBtY2hwX2hj aV9mcmVlX3hmZXIoeGZlciwgMSk7DQo+PiArICAgICAgICByZXR1cm4gcmV0Ow0KPj4gK30NCj4+ ICsNCj4+ICtjb25zdCBzdHJ1Y3QgbWNocF9oY2lfY21kX29wcyBtY2hwX21pcGlfaTNjX2hjaV9j bWRfdjEgPSB7DQo+PiArICAgICAgICAucHJlcF9jY2MgICAgICAgICAgICAgICA9IG1jaHBfaGNp X2NtZF92MV9wcmVwX2NjYywNCj4+ICsgICAgICAgIC5wcmVwX2kzY194ZmVyICAgICAgICAgID0g bWNocF9oY2lfY21kX3YxX3ByZXBfaTNjX3hmZXIsDQo+PiArICAgICAgICAucHJlcF9pMmNfeGZl ciAgICAgICAgICA9IG1jaHBfaGNpX2NtZF92MV9wcmVwX2kyY194ZmVyLA0KPj4gKyAgICAgICAg LnBlcmZvcm1fZGFhICAgICAgICAgICAgPSBtY2hwX2hjaV9jbWRfdjFfZGFhLA0KPj4gK307DQo+ PiArDQo+PiArc3RhdGljIGludCBtY2hwX2hjaV9waW9faW5pdChzdHJ1Y3QgbWNocF9pM2NfaGNp ICpoY2kpDQo+PiArew0KPj4gKyAgICAgICAgc3RydWN0IG1jaHBfaGNpX3Bpb19kYXRhICpwaW87 DQo+PiArICAgICAgICB1MzIgdmFsLCBzaXplX3ZhbCwgcnhfdGhyZXNoLCB0eF90aHJlc2gsIGli aV92YWw7DQo+PiArDQo+PiArICAgICAgICBwaW8gPSBremFsbG9jKHNpemVvZigqcGlvKSwgR0ZQ X0tFUk5FTCk7DQo+PiArICAgICAgICBpZiAoIXBpbykNCj4+ICsgICAgICAgICAgICAgICAgcmV0 dXJuIC1FTk9NRU07DQo+PiArDQo+PiArICAgICAgICBoY2ktPmlvX2RhdGEgPSBwaW87DQo+PiAr ICAgICAgICBzcGluX2xvY2tfaW5pdCgmcGlvLT5sb2NrKTsNCj4+ICsNCj4+ICsgICAgICAgIHNp emVfdmFsID0gcGlvX3JlZ19yZWFkKE1DSFBfUVVFVUVfU0laRSk7DQo+PiArICAgICAgICBkZXZf aW5mbygmaGNpLT5tYXN0ZXIuZGV2LCAiQ01EL1JFU1AgRklGTyA9ICVsZCBlbnRyaWVzXG4iLA0K Pj4gKyAgICAgICAgICAgICAgICAgRklFTERfR0VUKE1DSFBfQ1JfUVVFVUVfU0laRSwgc2l6ZV92 YWwpKTsNCj4+ICsgICAgICAgIGRldl9pbmZvKCZoY2ktPm1hc3Rlci5kZXYsICJJQkkgRklGTyA9 ICVsZCBieXRlc1xuIiwNCj4+ICsgICAgICAgICAgICAgICAgIDQgKiBGSUVMRF9HRVQoTUNIUF9J QklfU1RBVFVTX1NJWkUsIHNpemVfdmFsKSk7DQo+PiArICAgICAgICBkZXZfaW5mbygmaGNpLT5t YXN0ZXIuZGV2LCAiUlggZGF0YSBGSUZPID0gJWQgYnl0ZXNcbiIsDQo+PiArICAgICAgICAgICAg ICAgICA0ICogKDIgPDwgRklFTERfR0VUKE1DSFBfUlhfREFUQV9CVUZGRVJfU0laRSwgc2l6ZV92 YWwpKSk7DQo+PiArICAgICAgICBkZXZfaW5mbygmaGNpLT5tYXN0ZXIuZGV2LCAiVFggZGF0YSBG SUZPID0gJWQgYnl0ZXNcbiIsDQo+PiArICAgICAgICAgICAgICAgICA0ICogKDIgPDwgRklFTERf R0VUKE1DSFBfVFhfREFUQV9CVUZGRVJfU0laRSwgc2l6ZV92YWwpKSk7DQo+PiArDQo+PiArICAg ICAgICAvKg0KPj4gKyAgICAgICAgICogTGV0J3MgaW5pdGlhbGl6ZSBkYXRhIHRocmVzaG9sZHMg dG8gaGFsZiBvZiB0aGUgYWN0dWFsIEZJRk8gc2l6ZS4NCj4+ICsgICAgICAgICAqIFRoZSBzdGFy dCB0aHJlc2hvbGRzIGFyZW4ndCB1c2VkIChzZXQgdG8gMCkgYXMgdGhlIEZJRk8gaXMgYWx3YXlz DQo+PiArICAgICAgICAgKiBzZXJ2aWNlZCBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFu ZCBpcyBxdWV1ZWQuDQo+PiArICAgICAgICAgKi8NCj4+ICsgICAgICAgIHJ4X3RocmVzaCA9IEZJ RUxEX0dFVChNQ0hQX1JYX0RBVEFfQlVGRkVSX1NJWkUsIHNpemVfdmFsKTsNCj4+ICsgICAgICAg IHR4X3RocmVzaCA9IEZJRUxEX0dFVChNQ0hQX1RYX0RBVEFfQlVGRkVSX1NJWkUsIHNpemVfdmFs KTsNCj4+ICsgICAgICAgIGlmIChoY2ktPnZlcnNpb25fbWFqb3IgPT0gMSkgew0KPj4gKyAgICAg ICAgICAgICAgICAvKiB0aG9zZSBhcmUgZXhwcmVzc2VkIGFzIDJeW24rMSksIHNvIGp1c3Qgc3Vi IDEgaWYgbm90IDAgKi8NCj4+ICsgICAgICAgICAgICAgICAgaWYgKHJ4X3RocmVzaCkNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICByeF90aHJlc2ggLT0gMTsNCj4+ICsgICAgICAgICAgICAg ICAgaWYgKHR4X3RocmVzaCkNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICB0eF90aHJlc2gg LT0gMTsNCj4+ICsgICAgICAgICAgICAgICAgcGlvLT5yeF90aHJlc2hfc2l6ZSA9IDIgPDwgcnhf dGhyZXNoOw0KPj4gKyAgICAgICAgICAgICAgICBwaW8tPnR4X3RocmVzaF9zaXplID0gMiA8PCB0 eF90aHJlc2g7DQo+PiArICAgICAgICB9IGVsc2Ugew0KPj4gKyAgICAgICAgICAgICAgICAvKiBz aXplIGlzIDJeKG4rMSkgYW5kIHRocmVzaG9sZCBpcyAyXm4gaS5lLiBhbHJlYWR5IGhhbHZlZCAq Lw0KPj4gKyAgICAgICAgICAgICAgICBwaW8tPnJ4X3RocmVzaF9zaXplID0gMSA8PCByeF90aHJl c2g7DQo+PiArICAgICAgICAgICAgICAgIHBpby0+dHhfdGhyZXNoX3NpemUgPSAxIDw8IHR4X3Ro cmVzaDsNCj4+ICsgICAgICAgIH0NCj4+ICsgICAgICAgIHZhbCA9IEZJRUxEX1BSRVAoTUNIUF9E QVRBX1JYX0JVRl9USExELCAgIHJ4X3RocmVzaCkgfA0KPj4gKyAgICAgICAgICAgICAgRklFTERf UFJFUChNQ0hQX0RBVEFfVFhfQlVGX1RITEQsICAgdHhfdGhyZXNoKTsNCj4+ICsgICAgICAgIHBp b19yZWdfd3JpdGUoTUNIUF9EQVRBX0JVRkZFUl9USExEX0NUUkwsIHZhbCk7DQo+PiArDQo+PiAr ICAgICAvKg0KPj4gKyAgICAgICAgICogTGV0J3MgcmFpc2UgYW4gaW50ZXJydXB0IGFzIHNvb24g YXMgdGhlcmUgaXMgb25lIGZyZWUgY21kIHNsb3QNCj4+ICsgICAgICAgICAqIG9yIG9uZSBhdmFp bGFibGUgcmVzcG9uc2Ugb3IgSUJJLiBGb3IgSUJJIGRhdGEgbGV0J3MgdXNlIGhhbGYgdGhlDQo+ PiArICAgICAgICAgKiBJQkkgcXVldWUgc2l6ZSB3aXRoaW4gYWxsb3dlZCBib3VuZHMuDQo+PiAr ICAgICAgICAgKi8NCj4+ICsgICAgICAgIGliaV92YWwgPSBGSUVMRF9HRVQoTUNIUF9JQklfU1RB VFVTX1NJWkUsIHNpemVfdmFsKTsNCj4+ICsgICAgICAgIHBpby0+bWF4X2liaV90aHJlc2ggPSBj bGFtcF92YWwoaWJpX3ZhbC8yLCAxLCA2Myk7DQo+PiArICAgICAgICB2YWwgPSBGSUVMRF9QUkVQ KE1DSFBfUVVFVUVfSUJJX1NUQVRVU19USExELCAxKSB8DQo+PiArICAgICAgICAgICAgICBGSUVM RF9QUkVQKE1DSFBfUVVFVUVfSUJJX0RBVEFfVEhMRCwgcGlvLT5tYXhfaWJpX3RocmVzaCkgfA0K Pj4gKyAgICAgICAgICAgICAgRklFTERfUFJFUChNQ0hQX1FVRVVFX1JFU1BfQlVGX1RITEQsIDEp IHwNCj4+ICsgICAgICAgICAgICAgIEZJRUxEX1BSRVAoTUNIUF9RVUVVRV9DTURfRU1QVFlfQlVG X1RITEQsIDEpOw0KPj4gKyAgICAgICAgcGlvX3JlZ193cml0ZShNQ0hQX1FVRVVFX1RITERfQ1RS TCwgdmFsKTsNCj4+ICsgICAgICAgIHBpby0+cmVnX3F1ZXVlX3RocmVzaCA9IHZhbDsNCj4+ICsN Cj4+ICsgICAgICAgIC8qIERpc2FibGUgYWxsIElSUXMgYnV0IGFsbG93IGFsbCBzdGF0dXMgYml0 cyAqLw0KPj4gKyAgICAgICAgcGlvX3JlZ193cml0ZShNQ0hQX0lOVFJfU0lHTkFMX0VOQUJMRSwg MHgwKTsNCj4+ICsgICAgICAgIHBpb19yZWdfd3JpdGUoTUNIUF9JTlRSX1NUQVRVU19FTkFCTEUs IDB4ZmZmZmZmZmYpOw0KPj4gKw0KPj4gKyAgICAgICAgLyogQWx3YXlzIGFjY2VwdCBlcnJvciBp bnRlcnJ1cHRzICh3aWxsIGJlIGFjdGl2YXRlZCBvbiBmaXJzdCB4ZmVyKSAqLw0KPj4gKyAgICAg ICAgcGlvLT5lbmFibGVkX2lycXMgPSBTVEFUX0FMTF9FUlJPUlM7DQo+PiArDQo+PiArICAgICAg ICByZXR1cm4gMDsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIHZvaWQgbWNocF9oY2lfcGlvX2Ns ZWFudXAoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpKQ0KPj4gK3sNCj4+ICsgICAgICAgIHN0cnVj dCBtY2hwX2hjaV9waW9fZGF0YSAqcGlvID0gaGNpLT5pb19kYXRhOw0KPj4gKw0KPj4gKyAgICAg ICAgcGlvX3JlZ193cml0ZShNQ0hQX0lOVFJfU0lHTkFMX0VOQUJMRSwgMHgwKTsNCj4+ICsNCj4+ ICsgICAgICAgIGlmIChwaW8pIHsNCj4+ICsgICAgICAgICAgICAgICAgZGV2X2RiZygmaGNpLT5t YXN0ZXIuZGV2LCJzdGF0dXMgPSAlI3gvJSN4IiwNCj4+ICsgICAgICAgICAgICAgICAgICAgIHBp b19yZWdfcmVhZChNQ0hQX0lOVFJfU1RBVFVTKSwgcGlvX3JlZ19yZWFkKE1DSFBfSU5UUl9TSUdO QUxfRU5BQkxFKSk7DQo+PiArICAgICAgICAgICAgICAgIEJVR19PTihwaW8tPmN1cnJfeGZlcik7 DQo+PiArICAgICAgICAgICAgICAgIEJVR19PTihwaW8tPmN1cnJfcngpOw0KPj4gKyAgICAgICAg ICAgICAgICBCVUdfT04ocGlvLT5jdXJyX3R4KTsNCj4+ICsgICAgICAgICAgICAgICAgQlVHX09O KHBpby0+Y3Vycl9yZXNwKTsNCj4+ICsgICAgICAgICAgICAgICAga2ZyZWUocGlvKTsNCj4+ICsg ICAgICAgICAgICAgICAgaGNpLT5pb19kYXRhID0gTlVMTDsNCj4+ICsgICAgICAgIH0NCj4+ICt9 DQo+PiArDQo+PiArc3RhdGljIHZvaWQgbWNocF9oY2lfcGlvX3dyaXRlX2NtZChzdHJ1Y3QgbWNo cF9pM2NfaGNpICpoY2ksIHN0cnVjdCBtY2hwX2hjaV94ZmVyICp4ZmVyKQ0KPj4gK3sNCj4+ICsg ICAgICAgIGRldl9kYmcoJmhjaS0+bWFzdGVyLmRldiwiY21kX2Rlc2NbJWRdID0gMHglMDh4Iiwg MCwgeGZlci0+Y21kX2Rlc2NbMF0pOw0KPj4gKyAgICAgICAgZGV2X2RiZygmaGNpLT5tYXN0ZXIu ZGV2LCJjbWRfZGVzY1slZF0gPSAweCUwOHgiLCAxLCB4ZmVyLT5jbWRfZGVzY1sxXSk7DQo+PiAr ICAgICAgICBwaW9fcmVnX3dyaXRlKE1DSFBfQ09NTUFORF9RVUVVRV9QT1JULCB4ZmVyLT5jbWRf ZGVzY1swXSk7DQo+PiArICAgICAgICBwaW9fcmVnX3dyaXRlKE1DSFBfQ09NTUFORF9RVUVVRV9Q T1JULCB4ZmVyLT5jbWRfZGVzY1sxXSk7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBib29sIG1j aHBfaGNpX3Bpb19kb19yeChzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksIHN0cnVjdCBtY2hwX2hj aV9waW9fZGF0YSAqcGlvKQ0KPj4gK3sNCj4+ICsgICAgICAgIHN0cnVjdCBtY2hwX2hjaV94ZmVy ICp4ZmVyID0gcGlvLT5jdXJyX3J4Ow0KPj4gKyAgICAgICAgdW5zaWduZWQgaW50IG5yX3dvcmRz Ow0KPj4gKyAgICAgICAgdTMyICpwOw0KPj4gKw0KPj4gKyAgICAgICAgcCA9IHhmZXItPmRhdGE7 DQo+PiArICAgICAgICBwICs9ICh4ZmVyLT5kYXRhX2xlbiAtIHhmZXItPmRhdGFfbGVmdCkgLyA0 Ow0KPj4gKw0KPj4gKyAgICAgICAgd2hpbGUgKHhmZXItPmRhdGFfbGVmdCA+PSA0KSB7DQo+PiAr ICAgICAgICAgICAgICAgIC8qIGJhaWwgb3V0IGlmIEZJRk8gaGFzbid0IHJlYWNoZWQgdGhlIHRo cmVzaG9sZCB2YWx1ZSB5ZXQgKi8NCj4+ICsgICAgICAgICAgICAgICAgaWYgKCEocGlvX3JlZ19y ZWFkKE1DSFBfSU5UUl9TVEFUVVMpICYgU1RBVF9SWF9USExEKSkNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gZmFsc2U7DQo+PiArICAgICAgICAgICAgICAgIG5yX3dvcmRzID0g bWluKHhmZXItPmRhdGFfbGVmdCAvIDQsIHBpby0+cnhfdGhyZXNoX3NpemUpOw0KPj4gKyAgICAg ICAgICAgICAgICAvKiBleHRyYWN0IGRhdGEgZnJvbSBGSUZPICovDQo+PiArICAgICAgICAgICAg ICAgIHhmZXItPmRhdGFfbGVmdCAtPSBucl93b3JkcyAqIDQ7DQo+PiArICAgICAgICAgICAgICAg IGRldl9kYmcoJmhjaS0+bWFzdGVyLmRldiwibm93ICVkIGxlZnQgJWQiLCBucl93b3JkcyAqIDQs IHhmZXItPmRhdGFfbGVmdCk7DQo+PiArICAgICAgICAgICAgICAgIHdoaWxlIChucl93b3Jkcy0t KQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwaW9fcmVnX3JlYWQoTUNIUF9Y RkVSX0RBVEFfUE9SVCk7DQo+PiArICAgICAgICB9DQo+PiArDQo+PiArICAgICAgICAvKiB0cmFp bGluZyBkYXRhIGlzIHJldHJpZXZlZCB1cG9uIHJlc3BvbnNlIHJlY2VwdGlvbiAqLw0KPj4gKyAg ICAgICAgcmV0dXJuICF4ZmVyLT5kYXRhX2xlZnQ7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB2 b2lkIG1jaHBfaGNpX3Bpb19kb190cmFpbGluZ19yeChzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ks DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWNocF9oY2lf cGlvX2RhdGEgKnBpbywgdW5zaWduZWQgaW50IGNvdW50KQ0KPj4gK3sNCj4+ICsgICAgICAgIHN0 cnVjdCBtY2hwX2hjaV94ZmVyICp4ZmVyID0gcGlvLT5jdXJyX3J4Ow0KPj4gKyAgICAgICAgdTMy ICpwOw0KPj4gKw0KPj4gKyAgICAgICAgZGV2X2RiZygmaGNpLT5tYXN0ZXIuZGV2LCIlZCByZW1h aW5pbmciLCBjb3VudCk7DQo+PiArDQo+PiArICAgICAgICBwID0geGZlci0+ZGF0YTsNCj4+ICsg ICAgICAgIHAgKz0gKHhmZXItPmRhdGFfbGVuIC0geGZlci0+ZGF0YV9sZWZ0KSAvIDQ7DQo+PiAr DQo+PiArICAgICAgICBpZiAoY291bnQgPj0gNCkgew0KPj4gKyAgICAgICAgICAgICAgICB1bnNp Z25lZCBpbnQgbnJfd29yZHMgPSBjb3VudCAvIDQ7DQo+PiArICAgICAgICAgICAgICAgIC8qIGV4 dHJhY3QgZGF0YSBmcm9tIEZJRk8gKi8NCj4+ICsgICAgICAgICAgICAgICAgeGZlci0+ZGF0YV9s ZWZ0IC09IG5yX3dvcmRzICogNDsNCj4+ICsgICAgICAgICAgICAgICAgZGV2X2RiZygmaGNpLT5t YXN0ZXIuZGV2LCJub3cgJWQgbGVmdCAlZCIsIG5yX3dvcmRzICogNCwgeGZlci0+ZGF0YV9sZWZ0 KTsNCj4+ICsgICAgICAgICAgICAgICAgd2hpbGUgKG5yX3dvcmRzLS0pDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgKnArKyA9IHBpb19yZWdfcmVhZChNQ0hQX1hGRVJfREFUQV9QT1JUKTsN Cj4+ICsgICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAgIGNvdW50ICY9IDM7DQo+PiArICAgICAg ICBpZiAoY291bnQpIHsNCj4+ICsgICAgICAgICAgICAgICAgLyoNCj4+ICsgICAgICAgICAgICAg ICAgICogVGhlcmUgYXJlIHRyYWlsaW5nIGJ5dGVzIGluIHRoZSBsYXN0IHdvcmQuDQo+PiArICAg ICAgICAgICAgICAgICAqIEZldGNoIGl0IGFuZCBleHRyYWN0IGJ5dGVzIGluIGFuIGVuZGlhbiBp bmRlcGVuZGVudCB3YXkuDQo+PiArICAgICAgICAgICAgICAgICAqIFVubGlrZSB0aGUgVFggY2Fz ZSwgd2UgbXVzdCBub3Qgd3JpdGUgbWVtb3J5IHBhc3QgdGhlDQo+PiArICAgICAgICAgICAgICAg ICAqIGVuZCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLg0KPj4gKyAgICAgICAgICAgICAgICAg Ki8NCj4+ICsgICAgICAgICAgICAgICAgdTggKnBfYnl0ZSA9ICh1OCAqKXA7DQo+PiArICAgICAg ICAgICAgICAgIHUzMiBkYXRhID0gcGlvX3JlZ19yZWFkKE1DSFBfWEZFUl9EQVRBX1BPUlQpOw0K Pj4gKw0KPj4gKyAgICAgICAgICAgICAgICB4ZmVyLT5kYXRhX3dvcmRfYmVmb3JlX3BhcnRpYWwg PSBkYXRhOw0KPj4gKyAgICAgICAgICAgICAgICB4ZmVyLT5kYXRhX2xlZnQgLT0gY291bnQ7DQo+ PiArICAgICAgICAgICAgICAgIGRhdGEgPSAoX19mb3JjZSB1MzIpIGNwdV90b19sZTMyKGRhdGEp Ow0KPj4gKyAgICAgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkgew0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICpwX2J5dGUrKyA9IGRhdGE7DQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgZGF0YSA+Pj0gODsNCj4+ICsgICAgICAgICAgICAgICAgfQ0KPj4gKyAgICAgICAgfQ0KPj4g K30NCj4+ICsNCj4+ICtzdGF0aWMgYm9vbCBtY2hwX2hjaV9waW9fZG9fdHgoc3RydWN0IG1jaHBf aTNjX2hjaSAqaGNpLCBzdHJ1Y3QgbWNocF9oY2lfcGlvX2RhdGEgKnBpbykNCj4+ICt7DQo+PiAr ICAgICAgICBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqeGZlciA9IHBpby0+Y3Vycl90eDsNCj4+ICsg ICAgICAgIHVuc2lnbmVkIGludCBucl93b3JkczsNCj4+ICsgICAgICAgIHUzMiAqcDsNCj4+ICsN Cj4+ICsgICAgICAgIHAgPSB4ZmVyLT5kYXRhOw0KPj4gKyAgICAgICAgcCArPSAoeGZlci0+ZGF0 YV9sZW4gLSB4ZmVyLT5kYXRhX2xlZnQpIC8gNDsNCj4+ICsNCj4+ICsgICAgICAgIHdoaWxlICh4 ZmVyLT5kYXRhX2xlZnQgPj0gNCkgew0KPj4gKyAgICAgICAgICAgICAgICAvKiBiYWlsIG91dCBp ZiBGSUZPIGZyZWUgc3BhY2UgaXMgYmVsb3cgc2V0IHRocmVzaG9sZCAqLw0KPj4gKyAgICAgICAg ICAgICAgICBpZiAoIShwaW9fcmVnX3JlYWQoTUNIUF9JTlRSX1NUQVRVUykgJiBTVEFUX1RYX1RI TEQpKQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsgICAg ICAgICAgICAgICAgLyogd2UgY2FuIGZpbGwgdXAgdG8gdGhhdCBUWCB0aHJlc2hvbGQgKi8NCj4+ ICsgICAgICAgICAgICAgICAgbnJfd29yZHMgPSBtaW4oeGZlci0+ZGF0YV9sZWZ0IC8gNCwgcGlv LT50eF90aHJlc2hfc2l6ZSk7DQo+PiArICAgICAgICAgICAgICAgIC8qIHB1c2ggZGF0YSBpbnRv IHRoZSBGSUZPICovDQo+PiArICAgICAgICAgICAgICAgIHhmZXItPmRhdGFfbGVmdCAtPSBucl93 b3JkcyAqIDQ7DQo+PiArICAgICAgICAgICAgICAgIGRldl9kYmcoJmhjaS0+bWFzdGVyLmRldiwi bm93ICVkIGxlZnQgJWQiLCBucl93b3JkcyAqIDQsIHhmZXItPmRhdGFfbGVmdCk7DQo+PiArICAg ICAgICAgICAgICAgIHdoaWxlIChucl93b3Jkcy0tKQ0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgIHBpb19yZWdfd3JpdGUoTUNIUF9YRkVSX0RBVEFfUE9SVCwgKnArKyk7DQo+PiArICAgICAg ICB9DQo+PiArDQo+PiArICAgICAgICBpZiAoeGZlci0+ZGF0YV9sZWZ0KSB7DQo+PiArICAgICAg ICAgICAgICAgIC8qDQo+PiArICAgICAgICAgICAgICAgICAqIFRoZXJlIGFyZSB0cmFpbGluZyBi eXRlcyB0byBzZW5kLiBXZSBjYW4gc2ltcGx5IGxvYWQNCj4+ICsgICAgICAgICAgICAgICAgICog dGhlbSBmcm9tIG1lbW9yeSBhcyBhIHdvcmQgd2hpY2ggd2lsbCBrZWVwIHRob3NlIGJ5dGVzDQo+ PiArICAgICAgICAgICAgICAgICAqIGluIHRoZWlyIHByb3BlciBwbGFjZSBldmVuIG9uIGEgQkUg c3lzdGVtLiBUaGlzIHdpbGwNCj4+ICsgICAgICAgICAgICAgICAgICogYWxzbyBnZXQgc29tZSBi eXRlcyBwYXN0IHRoZSBhY3R1YWwgYnVmZmVyIGJ1dCBubyBvbmUNCj4+ICsgICAgICAgICAgICAg ICAgICogc2hvdWxkIGNhcmUgYXMgdGhleSB3b24ndCBiZSBzZW50IG91dC4NCj4+ICsgICAgICAg ICAgICAgICAgICovDQo+PiArICAgICAgICAgICAgICAgIGlmICghKHBpb19yZWdfcmVhZChNQ0hQ X0lOVFJfU1RBVFVTKSAmIFNUQVRfVFhfVEhMRCkpDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIGZhbHNlOw0KPj4gKyAgICAgICAgICAgICAgICBkZXZfZGJnKCZoY2ktPm1hc3Rl ci5kZXYsInRyYWlsaW5nICVkIiwgeGZlci0+ZGF0YV9sZWZ0KTsNCj4+ICsgICAgICAgICAgICAg ICAgcGlvX3JlZ193cml0ZShNQ0hQX1hGRVJfREFUQV9QT1JULCAqcCk7DQo+PiArICAgICAgICAg ICAgICAgIHhmZXItPmRhdGFfbGVmdCA9IDA7DQo+PiArICAgICAgICB9DQo+PiArDQo+PiArICAg ICAgICByZXR1cm4gdHJ1ZTsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIGJvb2wgbWNocF9oY2lf cGlvX3Byb2Nlc3Nfcngoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNpLCBzdHJ1Y3QgbWNocF9oY2lf cGlvX2RhdGEgKnBpbykNCj4+ICt7DQo+PiArICAgICAgICB3aGlsZSAocGlvLT5jdXJyX3J4ICYm IG1jaHBfaGNpX3Bpb19kb19yeChoY2ksIHBpbykpDQo+PiArICAgICAgICAgICAgICAgIHBpby0+ Y3Vycl9yeCA9IHBpby0+Y3Vycl9yeC0+bmV4dF9kYXRhOw0KPj4gKyAgICAgICAgcmV0dXJuICFw aW8tPmN1cnJfcng7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBib29sIG1jaHBfaGNpX3Bpb19w cm9jZXNzX3R4KHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwgc3RydWN0IG1jaHBfaGNpX3Bpb19k YXRhICpwaW8pDQo+PiArew0KPj4gKyAgICAgICAgd2hpbGUgKHBpby0+Y3Vycl90eCAmJiBtY2hw X2hjaV9waW9fZG9fdHgoaGNpLCBwaW8pKQ0KPj4gKyAgICAgICAgICAgICAgICBwaW8tPmN1cnJf dHggPSBwaW8tPmN1cnJfdHgtPm5leHRfZGF0YTsNCj4+ICsgICAgICAgIHJldHVybiAhcGlvLT5j dXJyX3R4Ow0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgdm9pZCBtY2hwX2hjaV9waW9fcXVldWVf ZGF0YShzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksIHN0cnVjdCBtY2hwX2hjaV9waW9fZGF0YSAq cGlvKQ0KPj4gK3sNCj4+ICsgICAgICAgIHN0cnVjdCBtY2hwX2hjaV94ZmVyICp4ZmVyID0gcGlv LT5jdXJyX3hmZXI7DQo+PiArICAgICAgICBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqcHJldl9xdWV1 ZV90YWlsOw0KPj4gKw0KPj4gKyAgICAgICAgaWYgKCF4ZmVyLT5kYXRhKSB7DQo+PiArICAgICAg ICAgICAgICAgIHhmZXItPmRhdGFfbGVuID0geGZlci0+ZGF0YV9sZWZ0ID0gMDsNCj4+ICsgICAg ICAgICAgICAgICAgcmV0dXJuOw0KPj4gKyAgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgICAgaWYg KHhmZXItPnJudykgew0KPj4gKyAgICAgICAgICAgICAgICBwcmV2X3F1ZXVlX3RhaWwgPSBwaW8t PnJ4X3F1ZXVlOw0KPj4gKyAgICAgICAgICAgICAgICBwaW8tPnJ4X3F1ZXVlID0geGZlcjsNCj4+ ICsgICAgICAgICAgICAgICAgaWYgKHBpby0+Y3Vycl9yeCkgew0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgIHByZXZfcXVldWVfdGFpbC0+bmV4dF9kYXRhID0geGZlcjsNCj4+ICsgICAgICAg ICAgICAgICAgfSBlbHNlIHsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBwaW8tPmN1cnJf cnggPSB4ZmVyOw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWNocF9oY2lfcGlv X3Byb2Nlc3NfcngoaGNpLCBwaW8pKQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcGlvLT5lbmFibGVkX2lycXMgfD0gU1RBVF9SWF9USExEOw0KPj4gKyAgICAgICAgICAgICAg ICB9DQo+PiArICAgICAgICB9IGVsc2Ugew0KPj4gKyAgICAgICAgICAgICAgICBwcmV2X3F1ZXVl X3RhaWwgPSBwaW8tPnR4X3F1ZXVlOw0KPj4gKyAgICAgICAgICAgICAgICBwaW8tPnR4X3F1ZXVl ID0geGZlcjsNCj4+ICsgICAgICAgICAgICAgICAgaWYgKHBpby0+Y3Vycl90eCkgew0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgIHByZXZfcXVldWVfdGFpbC0+bmV4dF9kYXRhID0geGZlcjsN Cj4+ICsgICAgICAgICAgICAgICAgfSBlbHNlIHsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICBwaW8tPmN1cnJfdHggPSB4ZmVyOw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgh bWNocF9oY2lfcGlvX3Byb2Nlc3NfdHgoaGNpLCBwaW8pKQ0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGlvLT5lbmFibGVkX2lycXMgfD0gU1RBVF9UWF9USExEOw0KPj4gKyAg ICAgICAgICAgICAgICB9DQo+PiArICAgICAgICB9DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB2 b2lkIG1jaHBfaGNpX3Bpb19wdXNoX3RvX25leHRfcngoc3RydWN0IG1jaHBfaTNjX2hjaSAqaGNp LCBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqeGZlciwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgd29yZHNfdG9fa2VlcCkNCj4+ICt7DQo+PiArICAg ICAgICB1MzIgKmZyb20gPSB4ZmVyLT5kYXRhOw0KPj4gKyAgICAgICAgdTMyIGZyb21fbGFzdDsN Cj4+ICsgICAgICAgIHVuc2lnbmVkIGludCByZWNlaXZlZCwgY291bnQ7DQo+PiArDQo+PiArICAg ICAgICByZWNlaXZlZCA9ICh4ZmVyLT5kYXRhX2xlbiAtIHhmZXItPmRhdGFfbGVmdCkgLyA0Ow0K Pj4gKyAgICAgICAgaWYgKCh4ZmVyLT5kYXRhX2xlbiAtIHhmZXItPmRhdGFfbGVmdCkgJiAzKSB7 DQo+PiArICAgICAgICAgICAgICAgIGZyb21fbGFzdCA9IHhmZXItPmRhdGFfd29yZF9iZWZvcmVf cGFydGlhbDsNCj4+ICsgICAgICAgICAgICAgICAgcmVjZWl2ZWQgKz0gMTsNCj4+ICsgICAgICAg IH0gZWxzZSB7DQo+PiArICAgICAgICAgICAgICAgIGZyb21fbGFzdCA9IGZyb21bcmVjZWl2ZWRd Ow0KPj4gKyAgICAgICAgfQ0KPj4gKyAgICAgICAgZnJvbSArPSB3b3Jkc190b19rZWVwOw0KPj4g KyAgICAgICAgY291bnQgPSByZWNlaXZlZCAtIHdvcmRzX3RvX2tlZXA7DQo+PiArDQo+PiArICAg ICAgICB3aGlsZSAoY291bnQpIHsNCj4+ICsgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJv b20sIGxlZnQsIGNodW5rLCBieXRlc190b19tb3ZlOw0KPj4gKyAgICAgICAgICAgICAgICB1MzIg bGFzdF93b3JkOw0KPj4gKw0KPj4gKyAgICAgICAgICAgICAgICB4ZmVyID0geGZlci0+bmV4dF9k YXRhOw0KPj4gKyAgICAgICAgICAgICAgICBpZiAoIXhmZXIpIHsNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICBkZXZfZXJyKCZoY2ktPm1hc3Rlci5kZXYsICJwdXNoaW5nIFJYIGRhdGEgdG8g dW5leGlzdGVudCB4ZmVyXG4iKTsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47 DQo+PiArICAgICAgICAgICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAgICAgICAgICAgcm9vbSA9 IERJVl9ST1VORF9VUCh4ZmVyLT5kYXRhX2xlbiwgNCk7DQo+PiArICAgICAgICAgICAgICAgIGxl ZnQgPSBESVZfUk9VTkRfVVAoeGZlci0+ZGF0YV9sZWZ0LCA0KTsNCj4+ICsgICAgICAgICAgICAg ICAgY2h1bmsgPSBtaW4oY291bnQsIHJvb20pOw0KPj4gKyAgICAgICAgICAgICAgICBpZiAoY2h1 bmsgPiBsZWZ0KSB7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgbWNocF9oY2lfcGlvX3B1 c2hfdG9fbmV4dF9yeChoY2ksIHhmZXIsIGNodW5rIC0gbGVmdCk7DQo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgbGVmdCA9IGNodW5rOw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHhm ZXItPmRhdGFfbGVmdCA9IGxlZnQgKiA0Ow0KPj4gKyAgICAgICAgICAgICAgICB9DQo+PiArDQo+ PiArICAgICAgICAgICAgICAgIGJ5dGVzX3RvX21vdmUgPSB4ZmVyLT5kYXRhX2xlbiAtIHhmZXIt PmRhdGFfbGVmdDsNCj4+ICsgICAgICAgICAgICAgICAgaWYgKGJ5dGVzX3RvX21vdmUgJiAzKSB7 DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlc2VydmUgd29yZCAgdG8gYmVjb21l IHBhcnRpYWwgKi8NCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICB1MzIgKnAgPSB4ZmVyLT5k YXRhOw0KPj4gKw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHhmZXItPmRhdGFfd29yZF9i ZWZvcmVfcGFydGlhbCA9IHBbYnl0ZXNfdG9fbW92ZSAvIDRdOw0KPj4gKyAgICAgICAgICAgICAg ICB9DQo+PiArICAgICAgICAgICAgICAgIG1lbW1vdmUoeGZlci0+ZGF0YSArIGNodW5rLCB4ZmVy LT5kYXRhLCBieXRlc190b19tb3ZlKTsNCj4+ICsNCj4+ICsgICAgICAgICAgICAgLyogdHJlYXQg bGFzdCB3b3JkIHNwZWNpYWxseSBiZWNhdXNlIG9mIHBhcnRpYWwgd29yZCBpc3N1ZXMgKi8NCj4+ ICsgICAgICAgICAgICAgICAgY2h1bmsgLT0gMTsNCj4+ICsNCj4+ICsgICAgICAgICAgICAgICAg bWVtY3B5KHhmZXItPmRhdGEsIGZyb20sIGNodW5rICogNCk7DQo+PiArICAgICAgICAgICAgICAg IHhmZXItPmRhdGFfbGVmdCAtPSBjaHVuayAqIDQ7DQo+PiArICAgICAgICAgICAgICAgIGZyb20g Kz0gY2h1bms7DQo+PiArICAgICAgICAgICAgICAgIGNvdW50IC09IGNodW5rOw0KPj4gKw0KPj4g KyAgICAgICAgICAgICAgICBsYXN0X3dvcmQgPSAoY291bnQgPT0gMSkgPyBmcm9tX2xhc3QgOiAq ZnJvbSsrOw0KPj4gKyAgICAgICAgICAgICAgICBpZiAoeGZlci0+ZGF0YV9sZWZ0IDwgNCkgew0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgIC8qDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICogTGlrZSBpbiBoY2lfcGlvX2RvX3RyYWlsaW5nX3J4KCksIHByZXNlcnZlIG9yaWdpbmFs DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICogd29yZCB0byBiZSBzdG9yZWQgcGFydGlh bGx5IHRoZW4gc3RvcmUgYnl0ZXMgaXQNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgKiBp biBhbiBlbmRpYW4gaW5kZXBlbmRlbnQgd2F5Lg0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAqLw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpwX2J5dGUgPSB4ZmVyLT5kYXRh Ow0KPj4gKw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHBfYnl0ZSArPSBjaHVuayAqIDQ7 DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgeGZlci0+ZGF0YV93b3JkX2JlZm9yZV9wYXJ0 aWFsID0gbGFzdF93b3JkOw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Rfd29yZCA9 IChfX2ZvcmNlIHUzMikgY3B1X3RvX2xlMzIobGFzdF93b3JkKTsNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICB3aGlsZSAoeGZlci0+ZGF0YV9sZWZ0LS0pIHsNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICpwX2J5dGUrKyA9IGxhc3Rfd29yZDsNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGxhc3Rfd29yZCA+Pj0gODsNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICB9DQo+PiArICAgICAgICAgICAgICAgIH0gZWxzZSB7DQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgdTMyICpwID0geGZlci0+ZGF0YTsNCj4+ICsNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICBwW2NodW5rXSA9IGxhc3Rfd29yZDsNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICB4ZmVyLT5kYXRhX2xlZnQgLT0gNDsNCj4+ICsgICAgICAgICAgICAgICAgfQ0KPj4g KyAgICAgICAgICAgICAgICBjb3VudC0tOw0KPj4gKyAgICAgICAgfQ0KPj4gK30NCj4+ICsNCj4+ ICtzdGF0aWMgYm9vbCBtY2hwX2hjaV9waW9fcHJvY2Vzc19yZXNwKHN0cnVjdCBtY2hwX2kzY19o Y2kgKmhjaSwgc3RydWN0IG1jaHBfaGNpX3Bpb19kYXRhICpwaW8pDQo+PiArew0KPj4gKyAgICAg ICAgd2hpbGUgKHBpby0+Y3Vycl9yZXNwICYmDQo+PiArICAgICAgICAgICAgICAgKHBpb19yZWdf cmVhZChNQ0hQX0lOVFJfU1RBVFVTKSAmIFNUQVRfUkVTUF9SRUFEWSkpIHsNCj4+ICsgICAgICAg ICAgICAgICAgc3RydWN0IG1jaHBfaGNpX3hmZXIgKnhmZXIgPSBwaW8tPmN1cnJfcmVzcDsNCj4+ ICsgICAgICAgICAgICAgICAgdTMyIHJlc3AgPSBwaW9fcmVnX3JlYWQoTUNIUF9SRVNQT05TRV9R VUVVRV9QT1JUKTsNCj4+ICsgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRpZCA9IFJFU1Bf VElEKHJlc3ApOw0KPj4gKw0KPj4gKyAgICAgICAgICAgICAgICBkZXZfZGJnKCZoY2ktPm1hc3Rl ci5kZXYsInJlc3AgPSAweCUwOHgiLCByZXNwKTsNCj4+ICsgICAgICAgICAgICAgICAgaWYgKHRp ZCAhPSB4ZmVyLT5jbWRfdGlkKSB7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2Vy cigmaGNpLT5tYXN0ZXIuZGV2LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg InJlc3BvbnNlIHRpZD0lZCB3aGVuIGV4cGVjdGluZyAlZFxuIiwNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHRpZCwgeGZlci0+Y21kX3RpZCk7DQo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgLyogbGV0J3MgcHJldGVuZCBpdCBpcyBhIHByb2cgZXJyb3IuLi4gYW55IG9m IHRoZW0gICovDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgbWNocF9oY2lfcGlvX2Vyciho Y2ksIHBpbywgU1RBVF9QUk9HX0VSUk9SUyk7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg cmV0dXJuIGZhbHNlOw0KPj4gKyAgICAgICAgICAgICAgICB9DQo+PiArICAgICAgICAgICAgICAg IHhmZXItPnJlc3BvbnNlID0gcmVzcDsNCj4+ICsNCj4+ICsgICAgICAgICAgICAgICAgaWYgKHBp by0+Y3Vycl9yeCA9PSB4ZmVyKSB7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgLyoNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXNwb25zZSBhdmFpbGFiaWxpdHkgaW1wbGll cyBSWCBjb21wbGV0aW9uLg0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFJldHJpZXZl IHRyYWlsaW5nIFJYIGRhdGEgaWYgYW55Lg0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAq IE5vdGUgdGhhdCBzaG9ydCByZWFkcyBhcmUgcG9zc2libGUuDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICovDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJl Y2VpdmVkLCBleHBlY3RlZCwgdG9fa2VlcDsNCj4+ICsNCj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICByZWNlaXZlZCA9IHhmZXItPmRhdGFfbGVuIC0geGZlci0+ZGF0YV9sZWZ0Ow0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gUkVTUF9EQVRBX0xFTkdUSCh4ZmVyLT5y ZXNwb25zZSk7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkID4gcmVj ZWl2ZWQpIHsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jaHBfaGNpX3Bp b19kb190cmFpbGluZ19yeChoY2ksIHBpbywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgLSByZWNlaXZlZCk7DQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNlaXZlZCA+IGV4cGVjdGVkKSB7 DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBjb25zdW1lZCBkYXRh IG1lYW50IGZvciBuZXh0IHhmZXIgKi8NCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHRvX2tlZXAgPSBESVZfUk9VTkRfVVAoZXhwZWN0ZWQsIDQpOw0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgbWNocF9oY2lfcGlvX3B1c2hfdG9fbmV4dF9yeChoY2ksIHhm ZXIsIHRvX2tlZXApOw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCj4+ICsNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHByb2Nlc3MgdGhlIFJYIGxpc3QgcG9pbnRl ciAqLw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtY2hwX2hjaV9waW9fcHJvY2Vz c19yeChoY2ksIHBpbykpDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW8t PmVuYWJsZWRfaXJxcyAmPSB+U1RBVF9SWF9USExEOw0KPj4gKyAgICAgICAgICAgICAgICB9DQo+ PiArDQo+PiArICAgICAgICAgICAgIC8qDQo+PiArICAgICAgICAgICAgICAgICAqIFdlJ3JlIGFi b3V0IHRvIGdpdmUgYmFjayBvd25lcnNoaXAgb2YgdGhlIHhmZXIgc3RydWN0dXJlDQo+PiArICAg ICAgICAgICAgICAgICAqIHRvIHRoZSB3YWl0aW5nIGluc3RhbmNlLiBNYWtlIHN1cmUgbm8gcmVm ZXJlbmNlIHRvIGl0DQo+PiArICAgICAgICAgICAgICAgICAqIHN0aWxsIGV4aXN0cy4NCj4+ICsg ICAgICAgICAgICAgICAgICovDQo+PiArICAgICAgICAgICAgICAgIGlmIChwaW8tPmN1cnJfcngg PT0geGZlcikgew0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9kYmcoJmhjaS0+bWFz dGVyLmRldiwic2hvcnQgUlggPyIpOw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHBpby0+ Y3Vycl9yeCA9IHBpby0+Y3Vycl9yeC0+bmV4dF9kYXRhOw0KPj4gKyAgICAgICAgICAgICAgICB9 IGVsc2UgaWYgKHBpby0+Y3Vycl90eCA9PSB4ZmVyKSB7DQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgZGV2X2RiZygmaGNpLT5tYXN0ZXIuZGV2LCJzaG9ydCBUWCA/Iik7DQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgcGlvLT5jdXJyX3R4ID0gcGlvLT5jdXJyX3R4LT5uZXh0X2RhdGE7 DQo+PiArICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeGZlci0+ZGF0YV9sZWZ0KSB7DQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2RiZygmaGNpLT5tYXN0ZXIuZGV2LCJQSU8geGZl ciBjb3VudCA9ICVkIGFmdGVyIHJlc3BvbnNlIiwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgeGZlci0+ZGF0YV9sZWZ0KTsNCj4+ICsgICAgICAgICAgICAgICAgfQ0KPj4gKw0KPj4g KyAgICAgICAgICAgICAgICBwaW8tPmN1cnJfcmVzcCA9IHhmZXItPm5leHRfcmVzcDsNCj4+ICsg ICAgICAgICAgICAgICAgaWYgKHhmZXItPmNvbXBsZXRpb24pDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgY29tcGxldGUoeGZlci0+Y29tcGxldGlvbik7DQo+PiArICAgICAgICB9DQo+PiAr ICAgICAgICByZXR1cm4gIXBpby0+Y3Vycl9yZXNwOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMg dm9pZCBtY2hwX2hjaV9waW9fcXVldWVfcmVzcChzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksIHN0 cnVjdCBtY2hwX2hjaV9waW9fZGF0YSAqcGlvKQ0KPj4gK3sNCj4+ICsgICAgICAgIHN0cnVjdCBt Y2hwX2hjaV94ZmVyICp4ZmVyID0gcGlvLT5jdXJyX3hmZXI7DQo+PiArICAgICAgICBzdHJ1Y3Qg bWNocF9oY2lfeGZlciAqcHJldl9xdWV1ZV90YWlsOw0KPj4gKw0KPj4gKyAgICAgICAgaWYgKCEo eGZlci0+Y21kX2Rlc2NbMF0gJiBDTURfMF9ST0MpKQ0KPj4gKyAgICAgICAgICAgICAgICByZXR1 cm47DQo+PiArDQo+PiArICAgICAgICBwcmV2X3F1ZXVlX3RhaWwgPSBwaW8tPnJlc3BfcXVldWU7 DQo+PiArICAgICAgICBwaW8tPnJlc3BfcXVldWUgPSB4ZmVyOw0KPj4gKyAgICAgICAgaWYgKHBp by0+Y3Vycl9yZXNwKSB7DQo+PiArICAgICAgICAgICAgICAgIHByZXZfcXVldWVfdGFpbC0+bmV4 dF9yZXNwID0geGZlcjsNCj4+ICsgICAgICAgIH0gZWxzZSB7DQo+PiArICAgICAgICAgICAgICAg IHBpby0+Y3Vycl9yZXNwID0geGZlcjsNCj4+ICsgICAgICAgICAgICAgICAgaWYgKCFtY2hwX2hj aV9waW9fcHJvY2Vzc19yZXNwKGhjaSwgcGlvKSkNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICBwaW8tPmVuYWJsZWRfaXJxcyB8PSBTVEFUX1JFU1BfUkVBRFk7DQo+PiArICAgICAgICB9DQo+ PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBib29sIG1jaHBfaGNpX3Bpb19wcm9jZXNzX2NtZChzdHJ1 Y3QgbWNocF9pM2NfaGNpICpoY2ksIHN0cnVjdCBtY2hwX2hjaV9waW9fZGF0YSAqcGlvKQ0KPj4g K3sNCj4+ICsgICAgICAgIHdoaWxlIChwaW8tPmN1cnJfeGZlciAmJg0KPj4gKyAgICAgICAgICAg ICAgIChwaW9fcmVnX3JlYWQoTUNIUF9JTlRSX1NUQVRVUykgJiBTVEFUX0NNRF9RVUVVRV9SRUFE WSkpIHsNCj4+ICsgICAgICAgICAgICAgICAgLyoNCj4+ICsgICAgICAgICAgICAgICAgICogQWx3 YXlzIHByb2Nlc3MgdGhlIGRhdGEgRklGTyBiZWZvcmUgc2VuZGluZyB0aGUgY29tbWFuZA0KPj4g KyAgICAgICAgICAgICAgICAgKiBzbyBuZWVkZWQgVFggZGF0YSBvciBSWCBzcGFjZSBpcyBhdmFp bGFibGUgdXBmcm9udC4NCj4+ICsgICAgICAgICAgICAgICAgICovDQo+PiArICAgICAgICAgICAg ICAgIG1jaHBfaGNpX3Bpb19xdWV1ZV9kYXRhKGhjaSwgcGlvKTsNCj4+ICsgICAgICAgICAgICAg ICAgLyoNCj4+ICsgICAgICAgICAgICAgICAgICogVGhlbiBxdWV1ZSBvdXIgcmVzcG9uc2UgcmVx dWVzdC4gVGhpcyB3aWxsIGFsc28gcHJvY2Vzcw0KPj4gKyAgICAgICAgICAgICAgICAgKiB0aGUg cmVzcG9uc2UgRklGTyBpbiBjYXNlIGl0IGdvdCBzdWRkZW5seSBmaWxsZWQgdXANCj4+ICsgICAg ICAgICAgICAgICAgICogd2l0aCByZXN1bHRzIGZyb20gcHJldmlvdXMgY29tbWFuZHMuDQo+PiAr ICAgICAgICAgICAgICAgICAqLw0KPj4gKyAgICAgICAgICAgICAgICBtY2hwX2hjaV9waW9fcXVl dWVfcmVzcChoY2ksIHBpbyk7DQo+PiArICAgICAgICAgICAgICAgIC8qDQo+PiArICAgICAgICAg ICAgICAgICAqIEZpbmFsbHkgc2VuZCB0aGUgY29tbWFuZC4NCj4+ICsgICAgICAgICAgICAgICAg ICovDQo+PiArICAgICAgICAgICAgICAgIG1jaHBfaGNpX3Bpb193cml0ZV9jbWQoaGNpLCBwaW8t PmN1cnJfeGZlcik7DQo+PiArICAgICAgICAgICAgICAgIC8qDQo+PiArICAgICAgICAgICAgICAg ICAqIEFuZCBtb3ZlIG9uLg0KPj4gKyAgICAgICAgICAgICAgICAgKi8NCj4+ICsgICAgICAgICAg ICAgICAgcGlvLT5jdXJyX3hmZXIgPSBwaW8tPmN1cnJfeGZlci0+bmV4dF94ZmVyOw0KPj4gKyAg ICAgICAgfQ0KPj4gKyAgICAgICAgcmV0dXJuICFwaW8tPmN1cnJfeGZlcjsNCj4+ICt9DQo+PiAr DQo+PiArc3RhdGljIGludCBtY2hwX2hjaV9waW9fcXVldWVfeGZlcihzdHJ1Y3QgbWNocF9pM2Nf aGNpICpoY2ksIHN0cnVjdCBtY2hwX2hjaV94ZmVyICp4ZmVyLCBpbnQgbikNCj4+ICt7DQo+PiAr ICAgICAgICBzdHJ1Y3QgbWNocF9oY2lfcGlvX2RhdGEgKnBpbyA9IGhjaS0+aW9fZGF0YTsNCj4+ ICsgICAgICAgIHN0cnVjdCBtY2hwX2hjaV94ZmVyICpwcmV2X3F1ZXVlX3RhaWw7DQo+PiArICAg ICAgICBpbnQgaTsNCj4+ICsNCj4+ICsgICAgICAgIGRldl9kYmcoJmhjaS0+bWFzdGVyLmRldiwi biA9ICVkIiwgbik7DQo+PiArDQo+PiArICAgICAgICAvKiBsaW5rIHhmZXIgaW5zdGFuY2VzIHRv Z2V0aGVyIGFuZCBpbml0aWFsaXplIGRhdGEgY291bnQgKi8NCj4+ICsgICAgICAgIGZvciAoaSA9 IDA7IGkgPCBuOyBpKyspIHsNCj4+ICsgICAgICAgICAgICAgICAgeGZlcltpXS5uZXh0X3hmZXIg PSAoaSArIDEgPCBuKSA/ICZ4ZmVyW2kgKyAxXSA6IE5VTEw7DQo+PiArICAgICAgICAgICAgICAg IHhmZXJbaV0ubmV4dF9kYXRhID0gTlVMTDsNCj4+ICsgICAgICAgICAgICAgICAgeGZlcltpXS5u ZXh0X3Jlc3AgPSBOVUxMOw0KPj4gKyAgICAgICAgICAgICAgICB4ZmVyW2ldLmRhdGFfbGVmdCA9 IHhmZXJbaV0uZGF0YV9sZW47DQo+PiArICAgICAgICB9DQo+PiArDQo+PiArICAgICAgICBzcGlu X2xvY2tfaXJxKCZwaW8tPmxvY2spOw0KPj4gKyAgICAgICAgcHJldl9xdWV1ZV90YWlsID0gcGlv LT54ZmVyX3F1ZXVlOw0KPj4gKyAgICAgICAgcGlvLT54ZmVyX3F1ZXVlID0gJnhmZXJbbiAtIDFd Ow0KPj4gKyAgICAgICAgaWYgKHBpby0+Y3Vycl94ZmVyKSB7DQo+PiArICAgICAgICAgICAgICAg IHByZXZfcXVldWVfdGFpbC0+bmV4dF94ZmVyID0geGZlcjsNCj4+ICsgICAgICAgIH0gZWxzZSB7 DQo+PiArICAgICAgICAgICAgICAgIHBpby0+Y3Vycl94ZmVyID0geGZlcjsNCj4+ICsgICAgICAg ICAgICAgICAgaWYgKCFtY2hwX2hjaV9waW9fcHJvY2Vzc19jbWQoaGNpLCBwaW8pKQ0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgIHBpby0+ZW5hYmxlZF9pcnFzIHw9IFNUQVRfQ01EX1FVRVVF X1JFQURZOw0KPj4gKyAgICAgICAgICAgICAgICBwaW9fcmVnX3dyaXRlKE1DSFBfSU5UUl9TSUdO QUxfRU5BQkxFLCBwaW8tPmVuYWJsZWRfaXJxcyk7DQo+PiArICAgICAgICAgICAgICAgIGRldl9k YmcoJmhjaS0+bWFzdGVyLmRldiwic3RhdHVzID0gJSN4LyUjeCIsDQo+PiArICAgICAgICAgICAg ICAgICAgICBwaW9fcmVnX3JlYWQoTUNIUF9JTlRSX1NUQVRVUyksIHBpb19yZWdfcmVhZChNQ0hQ X0lOVFJfU0lHTkFMX0VOQUJMRSkpOw0KPj4gKyAgICAgICAgfQ0KPj4gKyAgICAgICAgc3Bpbl91 bmxvY2tfaXJxKCZwaW8tPmxvY2spOw0KPj4gKyAgICAgICAgcmV0dXJuIDA7DQo+PiArfQ0KPj4g Kw0KPj4gK3N0YXRpYyBib29sIG1jaHBfaGNpX3Bpb19kZXF1ZXVlX3hmZXJfY29tbW9uKHN0cnVj dCBtY2hwX2kzY19oY2kgKmhjaSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc3RydWN0IG1jaHBfaGNpX3Bpb19kYXRhICpwaW8sDQo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtY2hwX2hjaV94ZmVyICp4ZmVyLCBp bnQgbikNCj4+ICt7DQo+PiArICAgICAgICBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqcCwgKipwX3By ZXZfbmV4dDsNCj4+ICsgICAgICAgIGludCBpOw0KPj4gKw0KPj4gKyAgICAgICAgLyoNCj4+ICsg ICAgICAgICAqIFRvIHNhZmVseSBkZXF1ZXVlIGEgdHJhbnNmZXIgcmVxdWVzdCwgaXQgbXVzdCBi ZSBlaXRoZXIgZW50aXJlbHkNCj4+ICsgICAgICAgICAqIHByb2Nlc3NlZCwgb3Igbm90IHlldCBw cm9jZXNzZWQgYXQgYWxsLiBJZiBvdXIgcmVxdWVzdCB0YWlsIGlzDQo+PiArICAgICAgICAgKiBy ZWFjaGFibGUgZnJvbSBlaXRoZXIgdGhlIGRhdGEgb3IgcmVzcCBsaXN0IHRoYXQgbWVhbnMgdGhl IGNvbW1hbmQNCj4+ICsgICAgICAgICAqIHdhcyBzdWJtaXR0ZWQgYW5kIG5vdCB5ZXQgY29tcGxl dGVkLg0KPj4gKyAgICAgICAgICovDQo+PiArICAgICAgICBmb3IgKHAgPSBwaW8tPmN1cnJfcmVz cDsgcDsgcCA9IHAtPm5leHRfcmVzcCkNCj4+ICsgICAgICAgICAgICAgICAgZm9yIChpID0gMDsg aSA8IG47IGkrKykNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSAmeGZlcltp XSkNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcGlvX3NjcmV3ZWQ7 DQo+PiArICAgICAgICBmb3IgKHAgPSBwaW8tPmN1cnJfcng7IHA7IHAgPSBwLT5uZXh0X2RhdGEp DQo+PiArICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gJnhmZXJbaV0pDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBnb3RvIHBpb19zY3Jld2VkOw0KPj4gKyAgICAgICAgZm9yIChwID0g cGlvLT5jdXJyX3R4OyBwOyBwID0gcC0+bmV4dF9kYXRhKQ0KPj4gKyAgICAgICAgICAgICAgICBm b3IgKGkgPSAwOyBpIDwgbjsgaSsrKQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChw ID09ICZ4ZmVyW2ldKQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBw aW9fc2NyZXdlZDsNCj4+ICsNCj4+ICsgICAgICAgIC8qDQo+PiArICAgICAgICAgKiBUaGUgY29t bWFuZCB3YXMgY29tcGxldGVkLCBvciB3YXNuJ3QgeWV0IHN1Ym1pdHRlZC4NCj4+ICsgICAgICAg ICAqIFVubGluayBpdCBmcm9tIHRoZSBxdWUgaWYgdGhlIGxhdGVyLg0KPj4gKyAgICAgICAgICov DQo+PiArICAgICAgICBwX3ByZXZfbmV4dCA9ICZwaW8tPmN1cnJfeGZlcjsNCj4+ICsgICAgICAg IGZvciAocCA9IHBpby0+Y3Vycl94ZmVyOyBwOyBwID0gcC0+bmV4dF94ZmVyKSB7DQo+PiArICAg ICAgICAgICAgICAgIGlmIChwID09ICZ4ZmVyWzBdKSB7DQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgKnBfcHJldl9uZXh0ID0geGZlcltuIC0gMV0ubmV4dF94ZmVyOw0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgIGJyZWFrOw0KPj4gKyAgICAgICAgICAgICAgICB9DQo+PiArICAgICAg ICAgICAgICAgIHBfcHJldl9uZXh0ID0gJnAtPm5leHRfeGZlcjsNCj4+ICsgICAgICAgIH0NCj4+ ICsNCj4+ICsgICAgICAgIC8qIHJldHVybiB0cnVlIGlmIHdlIGFjdHVhbGx5IHVucXVldWVkIHNv bWV0aGluZyAqLw0KPj4gKyAgICAgICAgcmV0dXJuICEhcDsNCj4+ICsNCj4+ICtwaW9fc2NyZXdl ZDoNCj4+ICsgICAgICAgIC8qDQo+PiArICAgICAgICAgKiBMaWZlIGlzIHRvdWdoLiBXZSBtdXN0 IGludmFsaWRhdGUgdGhlIGhhcmR3YXJlIHN0YXRlIGFuZA0KPj4gKyAgICAgICAgICogZGlzY2Fy ZCBldmVyeXRoaW5nIHRoYXQgaXMgc3RpbGwgcXVldWVkLg0KPj4gKyAgICAgICAgICovDQo+PiAr ICAgICAgICBmb3IgKHAgPSBwaW8tPmN1cnJfcmVzcDsgcDsgcCA9IHAtPm5leHRfcmVzcCkgew0K Pj4gKyAgICAgICAgICAgICAgICBwLT5yZXNwb25zZSA9IEZJRUxEX1BSRVAoUkVTUF9FUlJfRklF TEQsIFJFU1BfRVJSX0hDX1RFUk1JTkFURUQpOw0KPj4gKyAgICAgICAgICAgICAgICBpZiAocC0+ Y29tcGxldGlvbikNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZShwLT5jb21w bGV0aW9uKTsNCj4+ICsgICAgICAgIH0NCj4+ICsgICAgICAgIGZvciAocCA9IHBpby0+Y3Vycl94 ZmVyOyBwOyBwID0gcC0+bmV4dF94ZmVyKSB7DQo+PiArICAgICAgICAgICAgICAgIHAtPnJlc3Bv bnNlID0gRklFTERfUFJFUChSRVNQX0VSUl9GSUVMRCwgUkVTUF9FUlJfSENfVEVSTUlOQVRFRCk7 DQo+PiArICAgICAgICAgICAgICAgIGlmIChwLT5jb21wbGV0aW9uKQ0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgIGNvbXBsZXRlKHAtPmNvbXBsZXRpb24pOw0KPj4gKyAgICAgICAgfQ0KPj4g KyAgICAgICAgcGlvLT5jdXJyX3hmZXIgPSBwaW8tPmN1cnJfcnggPSBwaW8tPmN1cnJfdHggPSBw aW8tPmN1cnJfcmVzcCA9IE5VTEw7DQo+PiArDQo+PiArICAgICAgICByZXR1cm4gdHJ1ZTsNCj4+ ICt9DQo+PiArDQo+PiArc3RhdGljIGJvb2wgbWNocF9oY2lfcGlvX2RlcXVldWVfeGZlcihzdHJ1 Y3QgbWNocF9pM2NfaGNpICpoY2ksIHN0cnVjdCBtY2hwX2hjaV94ZmVyICp4ZmVyLCBpbnQgbikN Cj4+ICt7DQo+PiArICAgICAgICBzdHJ1Y3QgbWNocF9oY2lfcGlvX2RhdGEgKnBpbyA9IGhjaS0+ aW9fZGF0YTsNCj4+ICsgICAgICAgIGludCByZXQ7DQo+PiArDQo+PiArICAgICAgICBzcGluX2xv Y2tfaXJxKCZwaW8tPmxvY2spOw0KPj4gKyAgICAgICAgZGV2X2RiZygmaGNpLT5tYXN0ZXIuZGV2 LCJuPSVkIHN0YXR1cz0lI3gvJSN4IiwgbiwNCj4+ICsgICAgICAgICAgICBwaW9fcmVnX3JlYWQo TUNIUF9JTlRSX1NUQVRVUyksIHBpb19yZWdfcmVhZChNQ0hQX0lOVFJfU0lHTkFMX0VOQUJMRSkp Ow0KPj4gKyAgICAgICAgZGV2X2RiZygmaGNpLT5tYXN0ZXIuZGV2LCJtYWluX3N0YXR1cyA9ICUj eC8lI3giLA0KPj4gKyAgICAgICAgICAgIHJlYWRsKGhjaS0+YmFzZV9yZWdzICsgMHgyMCksIHJl YWRsKGhjaS0+YmFzZV9yZWdzICsgMHgyOCkpOw0KPj4gKw0KPj4gKyAgICAgICAgcmV0ID0gbWNo cF9oY2lfcGlvX2RlcXVldWVfeGZlcl9jb21tb24oaGNpLCBwaW8sIHhmZXIsIG4pOw0KPj4gKyAg ICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwaW8tPmxvY2spOw0KPj4gKyAgICAgICAgcmV0dXJuIHJl dDsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIHZvaWQgbWNocF9oY2lfcGlvX2VycihzdHJ1Y3Qg bWNocF9pM2NfaGNpICpoY2ksIHN0cnVjdCBtY2hwX2hjaV9waW9fZGF0YSAqcGlvLA0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgIHUzMiBzdGF0dXMpDQo+PiArew0KPj4gKyAgICAgICAgLyog VE9ETzogdGhpcyBvdWdodCB0byBiZSBtb3JlIHNvcGhpc3RpY2F0ZWQgZXZlbnR1YWxseSAqLw0K Pj4gKw0KPj4gKyAgICAgICAgaWYgKHBpb19yZWdfcmVhZChNQ0hQX0lOVFJfU1RBVFVTKSAmIFNU QVRfUkVTUF9SRUFEWSkgew0KPj4gKyAgICAgICAgICAgICAgICAvKiB0aGlzIG1heSBoYXBwZW4g d2hlbiBhbiBlcnJvciBpcyBzaWduYWxlZCB3aXRoIFJPQyB1bnNldCAqLw0KPj4gKyAgICAgICAg ICAgICAgICB1MzIgcmVzcCA9IHBpb19yZWdfcmVhZChNQ0hQX1JFU1BPTlNFX1FVRVVFX1BPUlQp Ow0KPj4gKw0KPj4gKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZoY2ktPm1hc3Rlci5kZXYsDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgIm9ycGhhbiByZXNwb25zZSAoJSN4KSBvbiBlcnJv clxuIiwgcmVzcCk7DQo+PiArICAgICAgICB9DQo+PiArDQo+PiArICAgICAgICAvKiBkdW1wIHN0 YXRlcyBvbiBwcm9ncmFtbWluZyBlcnJvcnMgKi8NCj4+ICsgICAgICAgIGlmIChzdGF0dXMgJiBT VEFUX1BST0dfRVJST1JTKSB7DQo+PiArICAgICAgICAgICAgICAgIHUzMiBxdWV1ZSA9IHBpb19y ZWdfcmVhZChNQ0hQX1FVRVVFX0NVUl9TVEFUVVMpOw0KPj4gKyAgICAgICAgICAgICAgICB1MzIg ZGF0YSA9IHBpb19yZWdfcmVhZChNQ0hQX0RBVEFfQlVGRkVSX0NVUl9TVEFUVVMpOw0KPj4gKw0K Pj4gKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZoY2ktPm1hc3Rlci5kZXYsDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgInByb2cgZXJyb3IgJSNseCAoQy9SL0kgPSAlbGQvJWxkLyVsZCwg VFgvUlggPSAlbGQvJWxkKVxuIiwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMg JiBTVEFUX1BST0dfRVJST1JTLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX0dF VChNQ0hQX0NVUl9DTURfUV9FTVBUWV9MRVZFTCwgcXVldWUpLA0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgIEZJRUxEX0dFVChNQ0hQX0NVUl9SRVNQX1FfTEVWRUwsIHF1ZXVlKSwNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICBGSUVMRF9HRVQoTUNIUF9DVVJfSUJJX1FfTEVWRUwsIHF1 ZXVlKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRF9HRVQoTUNIUF9DVVJfVFhf QlVGX0xWTCwgZGF0YSksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgRklFTERfR0VUKE1D SFBfQ1VSX1JYX0JVRl9MVkwsIGRhdGEpKTsNCj4+ICsgICAgICAgIH0NCj4+ICsNCj4+ICsgICAg ICAgIC8qIGp1c3QgYnVzdCBvdXQgZXZlcnl0aGluZyB3aXRoIHBlbmRpbmcgcmVzcG9uc2VzIGZv ciBub3cgKi8NCj4+ICsgICAgICAgIG1jaHBfaGNpX3Bpb19kZXF1ZXVlX3hmZXJfY29tbW9uKGhj aSwgcGlvLCBwaW8tPmN1cnJfcmVzcCwgMSk7DQo+PiArICAgICAgICAvKiAuLi4gYW5kIGhhbGYt d2F5IFRYIHRyYW5zZmVycyBpZiBhbnkgKi8NCj4+ICsgICAgICAgIGlmIChwaW8tPmN1cnJfdHgg JiYgcGlvLT5jdXJyX3R4LT5kYXRhX2xlZnQgIT0gcGlvLT5jdXJyX3R4LT5kYXRhX2xlbikNCj4+ ICsgICAgICAgICAgICAgICAgbWNocF9oY2lfcGlvX2RlcXVldWVfeGZlcl9jb21tb24oaGNpLCBw aW8sIHBpby0+Y3Vycl90eCwgMSk7DQo+PiArICAgICAgICAvKiB0aGVuIHJlc2V0IHRoZSBoYXJk d2FyZSAqLw0KPj4gKyAgICAgICAgbWNocF9taXBpX2kzY19oY2lfcGlvX3Jlc2V0KGhjaSk7DQo+ PiArICAgICAgICBtY2hwX21pcGlfaTNjX2hjaV9yZXN1bWUoaGNpKTsNCj4+ICsNCj4+ICsgICAg ICAgIGRldl9kYmcoJmhjaS0+bWFzdGVyLmRldiwic3RhdHVzPSUjeC8lI3giLA0KPj4gKyAgICAg ICAgICAgIHBpb19yZWdfcmVhZChNQ0hQX0lOVFJfU1RBVFVTKSwgcGlvX3JlZ19yZWFkKE1DSFBf SU5UUl9TSUdOQUxfRU5BQkxFKSk7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB2b2lkIG1jaHBf aGNpX3Bpb19zZXRfaWJpX3RocmVzaChzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksDQo+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWNocF9oY2lfcGlvX2RhdGEg KnBpbywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGlu dCB0aHJlc2hfdmFsKQ0KPj4gK3sNCj4+ICsgICAgICAgIHUzMiByZWd2YWwgPSBwaW8tPnJlZ19x dWV1ZV90aHJlc2g7DQo+PiArDQo+PiArICAgICAgICByZWd2YWwgJj0gfk1DSFBfUVVFVUVfSUJJ X1NUQVRVU19USExEOw0KPj4gKyAgICAgICAgcmVndmFsIHw9IEZJRUxEX1BSRVAoTUNIUF9RVUVV RV9JQklfU1RBVFVTX1RITEQsIHRocmVzaF92YWwpOw0KPj4gKyAgICAgICAgLyogd3JpdGUgdGhl IHRocmVzaG9sZCByZWcgb25seSBpZiBpdCBjaGFuZ2VzICovDQo+PiArICAgICAgICBpZiAocmVn dmFsICE9IHBpby0+cmVnX3F1ZXVlX3RocmVzaCkgew0KPj4gKyAgICAgICAgICAgICAgICBwaW9f cmVnX3dyaXRlKE1DSFBfUVVFVUVfVEhMRF9DVFJMLCByZWd2YWwpOw0KPj4gKyAgICAgICAgICAg ICAgICBwaW8tPnJlZ19xdWV1ZV90aHJlc2ggPSByZWd2YWw7DQo+PiArICAgICAgICAgICAgICAg IGRldl9kYmcoJmhjaS0+bWFzdGVyLmRldiwiJWQiLCB0aHJlc2hfdmFsKTsNCj4+ICsgICAgICAg IH0NCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIGJvb2wgbWNocF9oY2lfcGlvX2dldF9pYmlfc2Vn bWVudChzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RydWN0IG1jaHBfaGNpX3Bpb19kYXRhICpwaW8pDQo+PiArew0KPj4g KyAgICAgICAgc3RydWN0IGhjaV9waW9faWJpX2RhdGEgKmliaSA9ICZwaW8tPmliaTsNCj4+ICsg ICAgICAgIHVuc2lnbmVkIGludCBucl93b3JkcywgdGhyZXNoX3ZhbDsNCj4+ICsgICAgICAgIHUz MiAqcDsNCj4+ICsNCj4+ICsgICAgICAgIHAgPSBpYmktPmRhdGFfcHRyOw0KPj4gKyAgICAgICAg cCArPSAoaWJpLT5zZWdfbGVuIC0gaWJpLT5zZWdfY250KSAvIDQ7DQo+PiArDQo+PiArICAgICAg ICB3aGlsZSAoKG5yX3dvcmRzID0gaWJpLT5zZWdfY250LzQpKSB7DQo+PiArICAgICAgICAgICAg ICAgIC8qIGRldGVybWluZSBvdXIgSUJJIHF1ZXVlIHRocmVzaG9sZCB2YWx1ZSAqLw0KPj4gKyAg ICAgICAgICAgICAgICB0aHJlc2hfdmFsID0gbWluKG5yX3dvcmRzLCBwaW8tPm1heF9pYmlfdGhy ZXNoKTsNCj4+ICsgICAgICAgICAgICAgICAgbWNocF9oY2lfcGlvX3NldF9pYmlfdGhyZXNoKGhj aSwgcGlvLCB0aHJlc2hfdmFsKTsNCj4+ICsgICAgICAgICAgICAgICAgLyogYmFpbCBvdXQgaWYg d2UgZG9uJ3QgaGF2ZSB0aGF0IGFtb3VudCBvZiBkYXRhIHJlYWR5ICovDQo+PiArICAgICAgICAg ICAgICAgIGlmICghKHBpb19yZWdfcmVhZChNQ0hQX0lOVFJfU1RBVFVTKSAmIFNUQVRfSUJJX1NU QVRVU19USExEKSkNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQo+ PiArICAgICAgICAgICAgICAgIC8qIGV4dHJhY3QgdGhlIGRhdGEgZnJvbSB0aGUgSUJJIHBvcnQg Ki8NCj4+ICsgICAgICAgICAgICAgICAgbnJfd29yZHMgPSB0aHJlc2hfdmFsOw0KPj4gKyAgICAg ICAgICAgICAgICBpYmktPnNlZ19jbnQgLT0gbnJfd29yZHMgKiA0Ow0KPj4gKyAgICAgICAgICAg ICAgICBkZXZfZGJnKCZoY2ktPm1hc3Rlci5kZXYsIm5vdyAlZCBsZWZ0ICVkIiwgbnJfd29yZHMg KiA0LCBpYmktPnNlZ19jbnQpOw0KPj4gKyAgICAgICAgICAgICAgICB3aGlsZSAobnJfd29yZHMt LSkNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGlvX3JlZ19yZWFkKE1DSFBf SUJJX1BPUlQpOw0KPj4gKyAgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgaWYgKGliaS0+c2VnX2Nu dCkgew0KPj4gKyAgICAgICAgICAgICAgICAvKg0KPj4gKyAgICAgICAgICAgICAgICAgKiBUaGVy ZSBhcmUgdHJhaWxpbmcgYnl0ZXMgaW4gdGhlIGxhc3Qgd29yZC4NCj4+ICsgICAgICAgICAgICAg ICAgICogRmV0Y2ggaXQgYW5kIGV4dHJhY3QgYnl0ZXMgaW4gYW4gZW5kaWFuIGluZGVwZW5kZW50 IHdheS4NCj4+ICsgICAgICAgICAgICAgICAgICogVW5saWtlIHRoZSBUWCBjYXNlLCB3ZSBtdXN0 IG5vdCB3cml0ZSBwYXN0IHRoZSBlbmQgb2YNCj4+ICsgICAgICAgICAgICAgICAgICogdGhlIGRl c3RpbmF0aW9uIGJ1ZmZlci4NCj4+ICsgICAgICAgICAgICAgICAgICovDQo+PiArICAgICAgICAg ICAgICAgIHUzMiBkYXRhOw0KPj4gKyAgICAgICAgICAgICAgICB1OCAqcF9ieXRlID0gKHU4ICop cDsNCj4+ICsNCj4+ICsgICAgICAgICAgICAgICAgbWNocF9oY2lfcGlvX3NldF9pYmlfdGhyZXNo KGhjaSwgcGlvLCAxKTsNCj4+ICsgICAgICAgICAgICAgICAgaWYgKCEocGlvX3JlZ19yZWFkKE1D SFBfSU5UUl9TVEFUVVMpICYgU1RBVF9JQklfU1RBVFVTX1RITEQpKQ0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsgICAgICAgICAgICAgICAgZGV2X2RiZygm aGNpLT5tYXN0ZXIuZGV2LCJ0cmFpbGluZyAlZCIsIGliaS0+c2VnX2NudCk7DQo+PiArICAgICAg ICAgICAgICAgIGRhdGEgPSBwaW9fcmVnX3JlYWQoTUNIUF9JQklfUE9SVCk7DQo+PiArICAgICAg ICAgICAgICAgIGRhdGEgPSAoX19mb3JjZSB1MzIpIGNwdV90b19sZTMyKGRhdGEpOw0KPj4gKyAg ICAgICAgICAgICAgICB3aGlsZSAoaWJpLT5zZWdfY250LS0pIHsNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAqcF9ieXRlKysgPSBkYXRhOw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg IGRhdGEgPj49IDg7DQo+PiArICAgICAgICAgICAgICAgIH0NCj4+ICsgICAgICAgIH0NCj4+ICsN Cj4+ICsgICAgICAgIHJldHVybiB0cnVlOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgYm9vbCBt Y2hwX2hjaV9waW9fcHJlcF9uZXdfaWJpKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwgc3RydWN0 IG1jaHBfaGNpX3Bpb19kYXRhICpwaW8pDQo+PiArew0KPj4gKyAgICAgICAgc3RydWN0IGhjaV9w aW9faWJpX2RhdGEgKmliaSA9ICZwaW8tPmliaTsNCj4+ICsgICAgICAgIHN0cnVjdCBpM2NfZGV2 X2Rlc2MgKmRldjsNCj4+ICsgICAgICAgIHN0cnVjdCBtY2hwX2kzY19oY2lfZGV2X2RhdGEgKmRl dl9kYXRhOw0KPj4gKyAgICAgICAgc3RydWN0IGhjaV9waW9fZGV2X2liaV9kYXRhICpkZXZfaWJp Ow0KPj4gKyAgICAgICAgdTMyIGliaV9zdGF0dXM7DQo+PiArDQo+PiArICAgICAgICAvKg0KPj4g KyAgICAgICAgICogV2UgaGF2ZSBhIG5ldyBJQkkuIFRyeSB0byBzZXQgdXAgaXRzIHBheWxvYWQg cmV0cmlldmFsLg0KPj4gKyAgICAgICAgICogV2hlbiByZXR1cm5pbmcgdHJ1ZSwgdGhlIElCSSBk YXRhIGhhcyB0byBiZSBjb25zdW1lZCB3aGV0aGVyDQo+PiArICAgICAgICAgKiBvciBub3Qgd2Ug YXJlIHNldCB1cCB0byBjYXB0dXJlIGl0LiBJZiB3ZSByZXR1cm4gdHJ1ZSB3aXRoDQo+PiArICAg ICAgICAgKiBpYmktPnNsb3QgPT0gTlVMTCB0aGF0IG1lYW5zIHRoZSBkYXRhIHBheWxvYWQgaGFz IHRvIGJlDQo+PiArICAgICAgICAgKiBkcmFpbmVkIG91dCBvZiB0aGUgSUJJIHBvcnQgYW5kIGRy b3BwZWQuDQo+PiArICAgICAgICAgKi8NCj4+ICsNCj4+ICsgICAgIGliaV9zdGF0dXMgPSBwaW9f cmVnX3JlYWQoTUNIUF9JQklfUE9SVCk7DQo+PiArICAgICAgICBkZXZfZGJnKCZoY2ktPm1hc3Rl ci5kZXYsInN0YXR1cyA9ICUjeCIsIGliaV9zdGF0dXMpOw0KPj4gKyAgICAgICAgaWJpLT5hZGRy ID0gRklFTERfR0VUKE1DSFBfSUJJX1RBUkdFVF9BRERSLCBpYmlfc3RhdHVzKTsNCj4+ICsgICAg ICAgIGlmIChpYmlfc3RhdHVzICYgTUNIUF9JQklfRVJST1IpIHsNCj4+ICsgICAgICAgICAgICAg ICAgZGV2X2VycigmaGNpLT5tYXN0ZXIuZGV2LCAiSUJJIGVycm9yIGZyb20gJSN4XG4iLCBpYmkt PmFkZHIpOw0KPj4gKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQo+PiArICAgICAgICB9 DQo+PiArDQo+PiArICAgICAgICBpYmktPmxhc3Rfc2VnID0gaWJpX3N0YXR1cyAmIE1DSFBfSUJJ X0xBU1RfU1RBVFVTOw0KPj4gKyAgICAgICAgaWJpLT5zZWdfbGVuID0gRklFTERfR0VUKE1DSFBf SUJJX0RBVEFfTEVOR1RILCBpYmlfc3RhdHVzKTsNCj4+ICsgICAgICAgIGliaS0+c2VnX2NudCA9 IGliaS0+c2VnX2xlbjsNCj4+ICsNCj4+ICsgICAgICAgIGRldiA9IG1jaHBfaTNjX2hjaV9hZGRy X3RvX2RldihoY2ksIGliaS0+YWRkcik7DQo+PiArICAgICAgICBpZiAoIWRldikgew0KPj4gKyAg ICAgICAgICAgICAgICBkZXZfZXJyKCZoY2ktPm1hc3Rlci5kZXYsDQo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgIklCSSBmb3IgdW5rbm93biBkZXZpY2UgJSN4XG4iLCBpYmktPmFkZHIpOw0K Pj4gKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCj4+ICsgICAgICAgIH0NCj4+ICsNCj4+ ICsgICAgICAgIGRldl9kYXRhID0gaTNjX2Rldl9nZXRfbWFzdGVyX2RhdGEoZGV2KTsNCj4+ICsg ICAgICAgIGRldl9pYmkgPSBkZXZfZGF0YS0+aWJpX2RhdGE7DQo+PiArICAgICAgICBpYmktPm1h eF9sZW4gPSBkZXZfaWJpLT5tYXhfbGVuOw0KPj4gKw0KPj4gKyAgICAgICAgaWYgKGliaS0+c2Vn X2xlbiA+IGliaS0+bWF4X2xlbikgew0KPj4gKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZoY2kt Pm1hc3Rlci5kZXYsICJJQkkgcGF5bG9hZCB0b28gYmlnICglZCA+ICVkKVxuIiwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICBpYmktPnNlZ19sZW4sIGliaS0+bWF4X2xlbik7DQo+PiArICAg ICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KPj4gKyAgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAg ICAgaWJpLT5zbG90ID0gaTNjX2dlbmVyaWNfaWJpX2dldF9mcmVlX3Nsb3QoZGV2X2liaS0+cG9v bCk7DQo+PiArICAgICAgICBpZiAoIWliaS0+c2xvdCkgew0KPj4gKyAgICAgICAgICAgICAgICBk ZXZfZXJyKCZoY2ktPm1hc3Rlci5kZXYsICJubyBmcmVlIHNsb3QgZm9yIElCSVxuIik7DQo+PiAr ICAgICAgICB9IGVsc2Ugew0KPj4gKyAgICAgICAgICAgICAgICBpYmktPnNsb3QtPmxlbiA9IDA7 DQo+PiArICAgICAgICAgICAgICAgIGliaS0+ZGF0YV9wdHIgPSBpYmktPnNsb3QtPmRhdGE7DQo+ PiArICAgICAgICB9DQo+PiArICAgICAgICByZXR1cm4gdHJ1ZTsNCj4+ICt9DQo+PiArDQo+PiAr c3RhdGljIHZvaWQgbWNocF9oY2lfcGlvX2ZyZWVfaWJpX3Nsb3Qoc3RydWN0IG1jaHBfaTNjX2hj aSAqaGNpLCBzdHJ1Y3QgbWNocF9oY2lfcGlvX2RhdGEgKnBpbykNCj4+ICt7DQo+PiArICAgICAg ICBzdHJ1Y3QgaGNpX3Bpb19pYmlfZGF0YSAqaWJpID0gJnBpby0+aWJpOw0KPj4gKyAgICAgICAg c3RydWN0IGhjaV9waW9fZGV2X2liaV9kYXRhICpkZXZfaWJpOw0KPj4gKw0KPj4gKyAgICAgICAg aWYgKGliaS0+c2xvdCkgew0KPj4gKyAgICAgICAgICAgICAgICBkZXZfaWJpID0gaWJpLT5zbG90 LT5kZXYtPmNvbW1vbi5tYXN0ZXJfcHJpdjsNCj4+ICsgICAgICAgICAgICAgICAgaTNjX2dlbmVy aWNfaWJpX3JlY3ljbGVfc2xvdChkZXZfaWJpLT5wb29sLCBpYmktPnNsb3QpOw0KPj4gKyAgICAg ICAgICAgICAgICBpYmktPnNsb3QgPSBOVUxMOw0KPj4gKyAgICAgICAgfQ0KPj4gK30NCj4+ICsN Cj4+ICtzdGF0aWMgYm9vbCBtY2hwX2hjaV9waW9fcHJvY2Vzc19pYmkoc3RydWN0IG1jaHBfaTNj X2hjaSAqaGNpLCBzdHJ1Y3QgbWNocF9oY2lfcGlvX2RhdGEgKnBpbykNCj4+ICt7DQo+PiArICAg ICAgICBzdHJ1Y3QgaGNpX3Bpb19pYmlfZGF0YSAqaWJpID0gJnBpby0+aWJpOw0KPj4gKw0KPj4g KyAgICAgICAgaWYgKCFpYmktPnNsb3QgJiYgIWliaS0+c2VnX2NudCAmJiBpYmktPmxhc3Rfc2Vn KQ0KPj4gKyAgICAgICAgICAgICAgICBpZiAoIW1jaHBfaGNpX3Bpb19wcmVwX25ld19pYmkoaGNp LCBwaW8pKQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsN Cj4+ICsgICAgICAgIGZvciAoOzspIHsNCj4+ICsgICAgICAgICAgICAgICAgdTMyIGliaV9zdGF0 dXM7DQo+PiArICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpYmlfYWRkcjsNCj4+ICsNCj4+ ICsgICAgICAgICAgICAgICAgaWYgKGliaS0+c2xvdCkgew0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgIGlmICghbWNocF9oY2lfcGlvX2dldF9pYmlfc2VnbWVudChoY2ksIHBpbykpDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgaWJpLT5zbG90LT5sZW4gKz0gaWJpLT5zZWdfbGVuOw0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgIGliaS0+ZGF0YV9wdHIgKz0gaWJpLT5zZWdfbGVuOw0KPj4g KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpYmktPmxhc3Rfc2VnKSB7DQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3YXMgdGhlIGxhc3Qgc2VnbWVudDogc3VibWl0 IGl0IGFuZCBsZWF2ZSAqLw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTNj X21hc3Rlcl9xdWV1ZV9pYmkoaWJpLT5zbG90LT5kZXYsIGliaS0+c2xvdCk7DQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpYmktPnNsb3QgPSBOVUxMOw0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbWNocF9oY2lfcGlvX3NldF9pYmlfdGhyZXNoKGhjaSwg cGlvLCAxKTsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVl Ow0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCj4+ICsgICAgICAgICAgICAgICAgfSBl bHNlIGlmIChpYmktPnNlZ19jbnQpIHsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAvKg0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE5vIHNsb3QgYnV0IGEgbm9uLXplcm8gY291 bnQuIFRoaXMgaXMgdGhlIHJlc3VsdA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG9m IHNvbWUgZXJyb3IgYW5kIHRoZSBwYXlsb2FkIG11c3QgYmUgZHJhaW5lZC4NCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgKiBUaGlzIG5vcm1hbGx5IGRvZXMgbm90IGhhcHBlbiB0aGVyZWZv cmUgbm8gbmVlZA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGJlIGV4dHJhIG9w dGltaXplZCBoZXJlLg0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KPj4gKyAgICAg ICAgICAgICAgICAgICAgIG1jaHBfaGNpX3Bpb19zZXRfaWJpX3RocmVzaChoY2ksIHBpbywgMSk7 DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgZG8gew0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgaWYgKCEocGlvX3JlZ19yZWFkKE1DSFBfSU5UUl9TVEFUVVMpICYgU1RB VF9JQklfU1RBVFVTX1RITEQpKQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICByZXR1cm4gZmFsc2U7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwaW9fcmVnX3JlYWQoTUNIUF9JQklfUE9SVCk7DQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgfSB3aGlsZSAoLS1pYmktPnNlZ19jbnQpOw0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg IGlmIChpYmktPmxhc3Rfc2VnKQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cmV0dXJuIHRydWU7DQo+PiArICAgICAgICAgICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAgICAg ICAgICAgLyogdHJ5IHRvIG1vdmUgdG8gdGhlIG5leHQgc2VnbWVudCByaWdodCBhd2F5ICovDQo+ PiArICAgICAgICAgICAgICAgIG1jaHBfaGNpX3Bpb19zZXRfaWJpX3RocmVzaChoY2ksIHBpbywg MSk7DQo+PiArICAgICAgICAgICAgICAgIGlmICghKHBpb19yZWdfcmVhZChNQ0hQX0lOVFJfU1RB VFVTKSAmIFNUQVRfSUJJX1NUQVRVU19USExEKSkNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICByZXR1cm4gZmFsc2U7DQo+PiArICAgICAgICAgICAgICAgIGliaV9zdGF0dXMgPSBwaW9fcmVn X3JlYWQoTUNIUF9JQklfUE9SVCk7DQo+PiArICAgICAgICAgICAgICAgIGliaV9hZGRyID0gRklF TERfR0VUKE1DSFBfSUJJX1RBUkdFVF9BRERSLCBpYmlfc3RhdHVzKTsNCj4+ICsgICAgICAgICAg ICAgICAgaWYgKGliaS0+YWRkciAhPSBpYmlfYWRkcikgew0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgIC8qIHRhcmdldCBhZGRyZXNzIGNoYW5nZWQgYmVmb3JlIGxhc3Qgc2VnbWVudCAqLw0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmhjaS0+bWFzdGVyLmRldiwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cCBJQkkgYWRkcmVzcyBjaGFu Z2VkIGZyb20gJWQgdG8gJWRcbiIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBpYmktPmFkZHIsIGliaV9hZGRyKTsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBtY2hw X2hjaV9waW9fZnJlZV9pYmlfc2xvdChoY2ksIHBpbyk7DQo+PiArICAgICAgICAgICAgICAgIH0N Cj4+ICsgICAgICAgICAgICAgICAgaWJpLT5sYXN0X3NlZyA9IGliaV9zdGF0dXMgJiBNQ0hQX0lC SV9MQVNUX1NUQVRVUzsNCj4+ICsgICAgICAgICAgICAgICAgaWJpLT5zZWdfbGVuID0gRklFTERf R0VUKE1DSFBfSUJJX0RBVEFfTEVOR1RILCBpYmlfc3RhdHVzKTsNCj4+ICsgICAgICAgICAgICAg ICAgaWJpLT5zZWdfY250ID0gaWJpLT5zZWdfbGVuOw0KPj4gKyAgICAgICAgICAgICAgICBpZiAo aWJpLT5zbG90ICYmIGliaS0+c2xvdC0+bGVuICsgaWJpLT5zZWdfbGVuID4gaWJpLT5tYXhfbGVu KSB7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmaGNpLT5tYXN0ZXIuZGV2 LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklCSSBwYXlsb2FkIHRvbyBi aWcgKCVkID4gJWQpXG4iLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWJp LT5zbG90LT5sZW4gKyBpYmktPnNlZ19sZW4sIGliaS0+bWF4X2xlbik7DQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgbWNocF9oY2lfcGlvX2ZyZWVfaWJpX3Nsb3QoaGNpLCBwaW8pOw0KPj4g KyAgICAgICAgICAgICAgICB9DQo+PiArICAgICAgICB9DQo+PiArDQo+PiArICAgICAgICByZXR1 cm4gZmFsc2U7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgbWNocF9oY2lfcGlvX3JlcXVl c3RfaWJpKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwgc3RydWN0IGkzY19kZXZfZGVzYyAqZGV2 LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaTNjX2li aV9zZXR1cCAqcmVxKQ0KPj4gK3sNCj4+ICsgICAgICAgIHN0cnVjdCBtY2hwX2kzY19oY2lfZGV2 X2RhdGEgKmRldl9kYXRhID0gaTNjX2Rldl9nZXRfbWFzdGVyX2RhdGEoZGV2KTsNCj4+ICsgICAg ICAgIHN0cnVjdCBpM2NfZ2VuZXJpY19pYmlfcG9vbCAqcG9vbDsNCj4+ICsgICAgICAgIHN0cnVj dCBoY2lfcGlvX2Rldl9pYmlfZGF0YSAqZGV2X2liaTsNCj4+ICsNCj4+ICsgICAgICAgIGRldl9p YmkgPSBrbWFsbG9jKHNpemVvZigqZGV2X2liaSksIEdGUF9LRVJORUwpOw0KPj4gKyAgICAgICAg aWYgKCFkZXZfaWJpKQ0KPj4gKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsNCj4+ICsg ICAgICAgIHBvb2wgPSBpM2NfZ2VuZXJpY19pYmlfYWxsb2NfcG9vbChkZXYsIHJlcSk7DQo+PiAr ICAgICAgICBpZiAoSVNfRVJSKHBvb2wpKSB7DQo+PiArICAgICAgICAgICAgICAgIGtmcmVlKGRl dl9pYmkpOw0KPj4gKyAgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihwb29sKTsNCj4+ICsg ICAgICAgIH0NCj4+ICsgICAgICAgIGRldl9pYmktPnBvb2wgPSBwb29sOw0KPj4gKyAgICAgICAg ZGV2X2liaS0+bWF4X2xlbiA9IHJlcS0+bWF4X3BheWxvYWRfbGVuOw0KPj4gKyAgICAgICAgZGV2 X2RhdGEtPmliaV9kYXRhID0gZGV2X2liaTsNCj4+ICsgICAgICAgIHJldHVybiAwOw0KPj4gK30N Cj4+ICsNCj4+ICtzdGF0aWMgdm9pZCBtY2hwX2hjaV9waW9fZnJlZV9pYmkoc3RydWN0IG1jaHBf aTNjX2hjaSAqaGNpLCBzdHJ1Y3QgaTNjX2Rldl9kZXNjICpkZXYpDQo+PiArew0KPj4gKyAgICAg ICAgc3RydWN0IG1jaHBfaTNjX2hjaV9kZXZfZGF0YSAqZGV2X2RhdGEgPSBpM2NfZGV2X2dldF9t YXN0ZXJfZGF0YShkZXYpOw0KPj4gKyAgICAgICAgc3RydWN0IGhjaV9waW9fZGV2X2liaV9kYXRh ICpkZXZfaWJpID0gZGV2X2RhdGEtPmliaV9kYXRhOw0KPj4gKw0KPj4gKyAgICAgICAgZGV2X2Rh dGEtPmliaV9kYXRhID0gTlVMTDsNCj4+ICsgICAgICAgIGkzY19nZW5lcmljX2liaV9mcmVlX3Bv b2woZGV2X2liaS0+cG9vbCk7DQo+PiArICAgICAgICBrZnJlZShkZXZfaWJpKTsNCj4+ICt9DQo+ PiArDQo+PiArc3RhdGljIHZvaWQgbWNocF9oY2lfcGlvX3JlY3ljbGVfaWJpX3Nsb3Qoc3RydWN0 IG1jaHBfaTNjX2hjaSAqaGNpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHN0cnVjdCBpM2NfZGV2X2Rlc2MgKmRldiwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdHJ1Y3QgaTNjX2liaV9zbG90ICpzbG90KQ0KPj4gK3sNCj4+ICsgICAg ICAgIHN0cnVjdCBtY2hwX2kzY19oY2lfZGV2X2RhdGEgKmRldl9kYXRhID0gaTNjX2Rldl9nZXRf bWFzdGVyX2RhdGEoZGV2KTsNCj4+ICsgICAgICAgIHN0cnVjdCBoY2lfcGlvX2Rldl9pYmlfZGF0 YSAqZGV2X2liaSA9IGRldl9kYXRhLT5pYmlfZGF0YTsNCj4+ICsNCj4+ICsgICAgICAgIGkzY19n ZW5lcmljX2liaV9yZWN5Y2xlX3Nsb3QoZGV2X2liaS0+cG9vbCwgc2xvdCk7DQo+PiArfQ0KPj4g Kw0KPj4gK3N0YXRpYyBib29sIG1jaHBfaGNpX3Bpb19pcnFfaGFuZGxlcihzdHJ1Y3QgbWNocF9p M2NfaGNpICpoY2ksIHVuc2lnbmVkIGludCB1bnVzZWQpDQo+PiArew0KPj4gKyAgICAgICAgc3Ry dWN0IG1jaHBfaGNpX3Bpb19kYXRhICpwaW8gPSBoY2ktPmlvX2RhdGE7DQo+PiArICAgICAgICB1 MzIgc3RhdHVzOw0KPj4gKw0KPj4gKyAgICAgICAgc3Bpbl9sb2NrKCZwaW8tPmxvY2spOw0KPj4g KyAgICAgICAgc3RhdHVzID0gcGlvX3JlZ19yZWFkKE1DSFBfSU5UUl9TVEFUVVMpOw0KPj4gKyAg ICAgICAgZGV2X2RiZygmaGNpLT5tYXN0ZXIuZGV2LCIoaW4pIHN0YXR1czogJSN4LyUjeCIsIHN0 YXR1cywgcGlvLT5lbmFibGVkX2lycXMpOw0KPj4gKyAgICAgICAgc3RhdHVzICY9IHBpby0+ZW5h YmxlZF9pcnFzIHwgU1RBVF9MQVRFTkNZX1dBUk5JTkdTOw0KPj4gKyAgICAgICAgaWYgKCFzdGF0 dXMpIHsNCj4+ICsgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJnBpby0+bG9jayk7DQo+PiAr ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsgICAgICAgIH0NCj4+ICsNCj4+ICsg ICAgICAgIGlmIChzdGF0dXMgJiBTVEFUX0lCSV9TVEFUVVNfVEhMRCkNCj4+ICsgICAgICAgICAg ICAgICAgbWNocF9oY2lfcGlvX3Byb2Nlc3NfaWJpKGhjaSwgcGlvKTsNCj4+ICsNCj4+ICsgICAg ICAgIGlmIChzdGF0dXMgJiBTVEFUX1JYX1RITEQpDQo+PiArICAgICAgICAgICAgICAgIGlmICht Y2hwX2hjaV9waW9fcHJvY2Vzc19yeChoY2ksIHBpbykpDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgcGlvLT5lbmFibGVkX2lycXMgJj0gflNUQVRfUlhfVEhMRDsNCj4+ICsgICAgICAgIGlm IChzdGF0dXMgJiBTVEFUX1RYX1RITEQpDQo+PiArICAgICAgICAgICAgICAgIGlmIChtY2hwX2hj aV9waW9fcHJvY2Vzc190eChoY2ksIHBpbykpDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg cGlvLT5lbmFibGVkX2lycXMgJj0gflNUQVRfVFhfVEhMRDsNCj4+ICsgICAgICAgIGlmIChzdGF0 dXMgJiBTVEFUX1JFU1BfUkVBRFkpDQo+PiArICAgICAgICAgICAgICAgIGlmIChtY2hwX2hjaV9w aW9fcHJvY2Vzc19yZXNwKGhjaSwgcGlvKSkNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBw aW8tPmVuYWJsZWRfaXJxcyAmPSB+U1RBVF9SRVNQX1JFQURZOw0KPj4gKw0KPj4gKyAgICAgICAg aWYgKHVubGlrZWx5KHN0YXR1cyAmIFNUQVRfTEFURU5DWV9XQVJOSU5HUykpIHsNCj4+ICsgICAg ICAgICAgICAgICAgcGlvX3JlZ193cml0ZShNQ0hQX0lOVFJfU1RBVFVTLCBzdGF0dXMgJiBTVEFU X0xBVEVOQ1lfV0FSTklOR1MpOw0KPj4gKyAgICAgICAgICAgICAgICBkZXZfd2Fybl9yYXRlbGlt aXRlZCgmaGNpLT5tYXN0ZXIuZGV2LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAiZW5jb3VudGVyZWQgd2FybmluZyBjb25kaXRpb24gJSNseFxuIiwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzICYgU1RBVF9MQVRFTkNZX1dB Uk5JTkdTKTsNCj4+ICsgICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAgIGlmICh1bmxpa2VseShz dGF0dXMgJiBTVEFUX0FMTF9FUlJPUlMpKSB7DQo+PiArICAgICAgICAgICAgICAgIHBpb19yZWdf d3JpdGUoTUNIUF9JTlRSX1NUQVRVUywgc3RhdHVzICYgU1RBVF9BTExfRVJST1JTKTsNCj4+ICsg ICAgICAgICAgICAgICAgbWNocF9oY2lfcGlvX2VycihoY2ksIHBpbywgc3RhdHVzICYgU1RBVF9B TExfRVJST1JTKTsNCj4+ICsgICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAgIGlmIChzdGF0dXMg JiBTVEFUX0NNRF9RVUVVRV9SRUFEWSkNCj4+ICsgICAgICAgICAgICAgICAgaWYgKG1jaHBfaGNp X3Bpb19wcm9jZXNzX2NtZChoY2ksIHBpbykpDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg cGlvLT5lbmFibGVkX2lycXMgJj0gflNUQVRfQ01EX1FVRVVFX1JFQURZOw0KPj4gKw0KPj4gKyAg ICAgICAgcGlvX3JlZ193cml0ZShNQ0hQX0lOVFJfU0lHTkFMX0VOQUJMRSwgcGlvLT5lbmFibGVk X2lycXMpOw0KPj4gKyAgICAgICAgZGV2X2RiZygmaGNpLT5tYXN0ZXIuZGV2LCIob3V0KSBzdGF0 dXM6ICUjeC8lI3giLA0KPj4gKyAgICAgICAgICAgIHBpb19yZWdfcmVhZChNQ0hQX0lOVFJfU1RB VFVTKSwgcGlvX3JlZ19yZWFkKE1DSFBfSU5UUl9TSUdOQUxfRU5BQkxFKSk7DQo+PiArICAgICAg ICBzcGluX3VubG9jaygmcGlvLT5sb2NrKTsNCj4+ICsgICAgICAgIHJldHVybiB0cnVlOw0KPj4g K30NCj4+ICsNCj4+ICtjb25zdCBzdHJ1Y3QgbWNocF9oY2lfaW9fb3BzIG1jaHBfbWlwaV9pM2Nf aGNpX3BpbyA9IHsNCj4+ICsgICAgICAgIC5pbml0ICAgICAgICAgICAgICAgICAgID0gbWNocF9o Y2lfcGlvX2luaXQsDQo+PiArICAgICAgICAuY2xlYW51cCAgICAgICAgICAgICAgICA9IG1jaHBf aGNpX3Bpb19jbGVhbnVwLA0KPj4gKyAgICAgICAgLnF1ZXVlX3hmZXIgICAgICAgICAgICAgPSBt Y2hwX2hjaV9waW9fcXVldWVfeGZlciwNCj4+ICsgICAgICAgIC5kZXF1ZXVlX3hmZXIgICAgICAg ICAgID0gbWNocF9oY2lfcGlvX2RlcXVldWVfeGZlciwNCj4+ICsgICAgICAgIC5pcnFfaGFuZGxl ciAgICAgICAgICAgID0gbWNocF9oY2lfcGlvX2lycV9oYW5kbGVyLA0KPj4gKyAgICAgICAgLnJl cXVlc3RfaWJpICAgICAgICAgICAgPSBtY2hwX2hjaV9waW9fcmVxdWVzdF9pYmksDQo+PiArICAg ICAgICAuZnJlZV9pYmkgICAgICAgICAgICAgICA9IG1jaHBfaGNpX3Bpb19mcmVlX2liaSwNCj4+ ICsgICAgICAgIC5yZWN5Y2xlX2liaV9zbG90ICAgICAgID0gbWNocF9oY2lfcGlvX3JlY3ljbGVf aWJpX3Nsb3QsDQo+PiArfTsNCj4+ICsNCj4+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBtY2hwX2kz Y19oY2kgKnRvX2kzY19oY2koc3RydWN0IGkzY19tYXN0ZXJfY29udHJvbGxlciAqbSkNCj4+ICt7 DQo+PiArICAgICByZXR1cm4gY29udGFpbmVyX29mKG0sIHN0cnVjdCBtY2hwX2kzY19oY2ksIG1h c3Rlcik7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgbWNocF9pM2NfaGNpX2J1c19pbml0 KHN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXIgKm0pDQo+PiArew0KPj4gKyAgICAgc3RydWN0 IG1jaHBfaTNjX2hjaSAqaGNpID0gdG9faTNjX2hjaShtKTsNCj4+ICsgICAgIHN0cnVjdCBpM2Nf ZGV2aWNlX2luZm8gaW5mbzsNCj4+ICsgICAgIGludCByZXQ7DQo+PiArDQo+PiArICAgICBpZiAo aGNpLT5jbWQgPT0gJm1jaHBfbWlwaV9pM2NfaGNpX2NtZF92MSkgew0KPj4gKyAgICAgICAgICAg ICByZXQgPSBtY2hwX21pcGlfaTNjX2hjaV9kYXRfdjEuaW5pdChoY2kpOw0KPj4gKyAgICAgICAg ICAgICBpZiAocmV0KQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7DQo+PiAr ICAgICB9DQo+PiArDQo+PiArICAgICByZXQgPSBpM2NfbWFzdGVyX2dldF9mcmVlX2FkZHIobSwg MCk7DQo+PiArICAgICBpZiAocmV0IDwgMCkNCj4+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsN Cj4+ICsgICAgIHJlZ193cml0ZShNQ0hQX01BU1RFUl9ERVZJQ0VfQUREUiwNCj4+ICsgICAgICAg ICAgICAgICBNQ0hQX01BU1RFUl9EWU5BTUlDX0FERFIocmV0KSB8IE1DSFBfTUFTVEVSX0RZTkFN SUNfQUREUl9WQUxJRCk7DQo+PiArICAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7 DQo+PiArICAgICBpbmZvLmR5bl9hZGRyID0gcmV0Ow0KPj4gKyAgICAgcmV0ID0gaTNjX21hc3Rl cl9zZXRfaW5mbyhtLCAmaW5mbyk7DQo+PiArICAgICBpZiAocmV0KQ0KPj4gKyAgICAgICAgICAg ICByZXR1cm4gcmV0Ow0KPj4gKw0KPj4gKyAgICAgcmV0ID0gaGNpLT5pby0+aW5pdChoY2kpOw0K Pj4gKyAgICAgaWYgKHJldCkNCj4+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsNCj4+ICsNCj4+ ICsgICAgIG1pY3JvY2hpcF9zZXRfcmVzcF9idWZfdGhsZChoY2kpOw0KPj4gKw0KPj4gKyAgICAg cmVnX3NldChNQ0hQX0hDX0NPTlRST0wsIE1DSFBfSENfQ09OVFJPTF9CVVNfRU5BQkxFKTsNCj4+ ICsgICAgIGRldl9kYmcoJmhjaS0+bWFzdGVyLmRldiwiSENfQ09OVFJPTCA9ICUjeCIsIHJlZ19y ZWFkKE1DSFBfSENfQ09OVFJPTCkpOw0KPj4gKw0KPj4gKyAgICAgcmV0dXJuIDA7DQo+PiArfQ0K Pj4gKw0KPj4gK3N0YXRpYyB2b2lkIG1jaHBfaTNjX2hjaV9idXNfY2xlYW51cChzdHJ1Y3QgaTNj X21hc3Rlcl9jb250cm9sbGVyICptKQ0KPj4gK3sNCj4+ICsgICAgIHN0cnVjdCBtY2hwX2kzY19o Y2kgKmhjaSA9IHRvX2kzY19oY2kobSk7DQo+PiArICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl ICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKG0tPmRldi5wYXJlbnQpOw0KPj4gKw0KPj4gKyAg ICAgcmVnX2NsZWFyKE1DSFBfSENfQ09OVFJPTCwgTUNIUF9IQ19DT05UUk9MX0JVU19FTkFCTEUp Ow0KPj4gKyAgICAgc3luY2hyb25pemVfaXJxKHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCkpOw0K Pj4gKyAgICAgaGNpLT5pby0+Y2xlYW51cChoY2kpOw0KPj4gKyAgICAgaWYgKGhjaS0+Y21kID09 ICZtY2hwX21pcGlfaTNjX2hjaV9jbWRfdjEpDQo+PiArICAgICAgICAgICAgIG1jaHBfbWlwaV9p M2NfaGNpX2RhdF92MS5jbGVhbnVwKGhjaSk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQgbWNocF9t aXBpX2kzY19oY2lfcmVzdW1lKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSkNCj4+ICt7DQo+PiAr ICAgICByZWdfc2V0KE1DSFBfSENfQ09OVFJPTCwgTUNIUF9IQ19DT05UUk9MX1JFU1VNRSk7DQo+ PiArfQ0KPj4gKw0KPj4gKy8qIGxvY2F0ZWQgaGVyZSByYXRoZXIgdGhhbiBwaW8uYyBiZWNhdXNl IG5lZWRlZCBiaXRzIGFyZSBpbiBjb3JlIHJlZyBzcGFjZSAqLw0KPj4gK3ZvaWQgbWNocF9taXBp X2kzY19oY2lfcGlvX3Jlc2V0KHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSkNCj4+ICt7DQo+PiAr ICAgICByZWdfd3JpdGUoTUNIUF9SRVNFVF9DT05UUk9MLCBNQ0hQX1JYX0ZJRk9fUlNUIHwgTUNI UF9UWF9GSUZPX1JTVCB8IE1DSFBfUkVTUF9RVUVVRV9SU1QpOw0KPj4gK30NCj4+ICsNCj4+ICsv KiBsb2NhdGVkIGhlcmUgcmF0aGVyIHRoYW4gZGN0LmMgYmVjYXVzZSBuZWVkZWQgYml0cyBhcmUg aW4gY29yZSByZWcgc3BhY2UgKi8NCj4+ICt2b2lkIG1jaHBfbWlwaV9pM2NfaGNpX2RjdF9pbmRl eF9yZXNldChzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2kpDQo+PiArew0KPj4gKyAgICAgcmVnX3dy aXRlKE1DSFBfRENUX1NFQ1RJT04sIEZJRUxEX1BSRVAoTUNIUF9EQ1RfVEFCTEVfSU5ERVgsIDAp KTsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIGludCBtY2hwX2kzY19oY2lfc2VuZF9jY2NfY21k KHN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXIgKm0sDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgaTNjX2NjY19jbWQgKmNjYykNCj4+ICt7DQo+PiArICAgICBzdHJ1 Y3QgbWNocF9pM2NfaGNpICpoY2kgPSB0b19pM2NfaGNpKG0pOw0KPj4gKyAgICAgc3RydWN0IG1j aHBfaGNpX3hmZXIgKnhmZXI7DQo+PiArICAgICBib29sIHJhdyA9ICEhKGhjaS0+cXVpcmtzICYg SENJX1FVSVJLX1JBV19DQ0MpOw0KPj4gKyAgICAgYm9vbCBwcmVmaXhlZCA9IHJhdyAmJiAhIShj Y2MtPmlkICYgSTNDX0NDQ19ESVJFQ1QpOw0KPj4gKyAgICAgdW5zaWduZWQgaW50IG54ZmVycyA9 IGNjYy0+bmRlc3RzICsgcHJlZml4ZWQ7DQo+PiArICAgICBERUNMQVJFX0NPTVBMRVRJT05fT05T VEFDSyhkb25lKTsNCj4+ICsgICAgIGludCBpLCBsYXN0LCByZXQgPSAwOw0KPj4gKw0KPj4gKyAg ICAgZGV2X2RiZygmaGNpLT5tYXN0ZXIuZGV2LCJjbWQ9JSN4IHJudz0lZCBuZGVzdHM9JWQgZGF0 YVswXS5sZW49JWQiLA0KPj4gKyAgICAgICAgIGNjYy0+aWQsIGNjYy0+cm53LCBjY2MtPm5kZXN0 cywgY2NjLT5kZXN0c1swXS5wYXlsb2FkLmxlbik7DQo+PiArDQo+PiArICAgICB4ZmVyID0gbWNo cF9oY2lfYWxsb2NfeGZlcihueGZlcnMpOw0KPj4gKyAgICAgaWYgKCF4ZmVyKQ0KPj4gKyAgICAg ICAgICAgICByZXR1cm4gLUVOT01FTTsNCj4+ICsNCj4+ICsgICAgIGlmIChwcmVmaXhlZCkgew0K Pj4gKyAgICAgICAgICAgICB4ZmVyLT5kYXRhID0gTlVMTDsNCj4+ICsgICAgICAgICAgICAgeGZl ci0+ZGF0YV9sZW4gPSAwOw0KPj4gKyAgICAgICAgICAgICB4ZmVyLT5ybncgPSBmYWxzZTsNCj4+ ICsgICAgICAgICAgICAgaGNpLT5jbWQtPnByZXBfY2NjKGhjaSwgeGZlciwgSTNDX0JST0FEQ0FT VF9BRERSLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NjLT5pZCwgdHJ1 ZSk7DQo+PiArICAgICAgICAgICAgIHhmZXIrKzsNCj4+ICsgICAgIH0NCj4+ICsNCj4+ICsgICAg IGZvciAoaSA9IDA7IGkgPCBueGZlcnMgLSBwcmVmaXhlZDsgaSsrKSB7DQo+PiArICAgICAgICAg ICAgIHhmZXJbaV0uZGF0YSA9IGNjYy0+ZGVzdHNbaV0ucGF5bG9hZC5kYXRhOw0KPj4gKyAgICAg ICAgICAgICB4ZmVyW2ldLmRhdGFfbGVuID0gY2NjLT5kZXN0c1tpXS5wYXlsb2FkLmxlbjsNCj4+ ICsgICAgICAgICAgICAgeGZlcltpXS5ybncgPSBjY2MtPnJudzsNCj4+ICsgICAgICAgICAgICAg cmV0ID0gaGNpLT5jbWQtPnByZXBfY2NjKGhjaSwgJnhmZXJbaV0sIGNjYy0+ZGVzdHNbaV0uYWRk ciwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjYy0+aWQsIHJh dyk7DQo+PiArICAgICAgICAgICAgIGlmIChyZXQpDQo+PiArICAgICAgICAgICAgICAgICAgICAg Z290byBvdXQ7DQo+PiArICAgICAgICAgICAgIHhmZXJbaV0uY21kX2Rlc2NbMF0gfD0gQ01EXzBf Uk9DOw0KPj4gKyAgICAgfQ0KPj4gKyAgICAgbGFzdCA9IGkgLSAxOw0KPj4gKyAgICAgeGZlclts YXN0XS5jbWRfZGVzY1swXSB8PSBDTURfMF9UT0M7DQo+PiArICAgICB4ZmVyW2xhc3RdLmNvbXBs ZXRpb24gPSAmZG9uZTsNCj4+ICsNCj4+ICsgICAgIGlmIChwcmVmaXhlZCkNCj4+ICsgICAgICAg ICAgICAgeGZlci0tOw0KPj4gKw0KPj4gKyAgICAgcmV0ID0gaGNpLT5pby0+cXVldWVfeGZlciho Y2ksIHhmZXIsIG54ZmVycyk7DQo+PiArICAgICBpZiAocmV0KQ0KPj4gKyAgICAgICAgICAgICBn b3RvIG91dDsNCj4+ICsgICAgIGlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkb25l LCBIWikgJiYNCj4+ICsgICAgICAgICBoY2ktPmlvLT5kZXF1ZXVlX3hmZXIoaGNpLCB4ZmVyLCBu eGZlcnMpKSB7DQo+PiArICAgICAgICAgICAgIHJldCA9IC1FVElNRTsNCj4+ICsgICAgICAgICAg ICAgZ290byBvdXQ7DQo+PiArICAgICB9DQo+PiArICAgICBmb3IgKGkgPSBwcmVmaXhlZDsgaSA8 IG54ZmVyczsgaSsrKSB7DQo+PiArICAgICAgICAgICAgIGlmIChjY2MtPnJudykNCj4+ICsgICAg ICAgICAgICAgICAgICAgICBjY2MtPmRlc3RzW2kgLSBwcmVmaXhlZF0ucGF5bG9hZC5sZW4gPQ0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTUF9EQVRBX0xFTkdUSCh4ZmVyW2ld LnJlc3BvbnNlKTsNCj4+ICsgICAgICAgICAgICAgc3dpdGNoIChSRVNQX1NUQVRVUyh4ZmVyW2ld LnJlc3BvbnNlKSkgew0KPj4gKyAgICAgICAgICAgICBjYXNlIFJFU1BfU1VDQ0VTUzoNCj4+ICsg ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCj4+ICsgICAgICAgICAgICAgY2FzZSBSRVNQ X0VSUl9BRERSX0hFQURFUjoNCj4+ICsgICAgICAgICAgICAgY2FzZSBSRVNQX0VSUl9OQUNLOg0K Pj4gKyAgICAgICAgICAgICAgICAgICAgIGNjYy0+ZXJyID0gSTNDX0VSUk9SX00yOw0KPj4gKyAg ICAgICAgICAgICAgICAgICAgIGZhbGx0aHJvdWdoOw0KPj4gKyAgICAgICAgICAgICBkZWZhdWx0 Og0KPj4gKyAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU87DQo+PiArICAgICAgICAgICAg ICAgICAgICAgZ290byBvdXQ7DQo+PiArICAgICAgICAgICAgIH0NCj4+ICsgICAgIH0NCj4+ICsN Cj4+ICsgICAgIGlmIChjY2MtPnJudykNCj4+ICsgICAgICAgICAgICAgZGV2X2RiZygmaGNpLT5t YXN0ZXIuZGV2LCJnb3Q6ICUqcGgiLA0KPj4gKyAgICAgICAgICAgICAgICAgY2NjLT5kZXN0c1sw XS5wYXlsb2FkLmxlbiwgY2NjLT5kZXN0c1swXS5wYXlsb2FkLmRhdGEpOw0KPj4gKw0KPj4gK291 dDoNCj4+ICsgICAgIG1jaHBfaGNpX2ZyZWVfeGZlcih4ZmVyLCBueGZlcnMpOw0KPj4gKyAgICAg cmV0dXJuIHJldDsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIGludCBtY2hwX2kzY19oY2lfZGFh KHN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXIgKm0pDQo+PiArew0KPj4gKyAgICAgc3RydWN0 IG1jaHBfaTNjX2hjaSAqaGNpID0gdG9faTNjX2hjaShtKTsNCj4+ICsgICAgIHJldHVybiBoY2kt PmNtZC0+cGVyZm9ybV9kYWEoaGNpKTsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIGludCBtY2hw X2kzY19oY2lfYWxsb2Nfc2FmZV94ZmVyX2J1ZihzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2ksDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1jaHBfaGNpX3hm ZXIgKnhmZXIpDQo+PiArew0KPj4gKyAgICAgaWYgKGhjaS0+aW8gPT0gJm1jaHBfbWlwaV9pM2Nf aGNpX3BpbyB8fA0KPj4gKyAgICAgICAgIHhmZXItPmRhdGEgPT0gTlVMTCB8fCAhaXNfdm1hbGxv Y19hZGRyKHhmZXItPmRhdGEpKQ0KPj4gKyAgICAgICAgICAgICByZXR1cm4gMDsNCj4+ICsgICAg IGlmICh4ZmVyLT5ybncpDQo+PiArICAgICAgICAgICAgIHhmZXItPmJvdW5jZV9idWYgPSBremFs bG9jKHhmZXItPmRhdGFfbGVuLCBHRlBfS0VSTkVMKTsNCj4+ICsgICAgIGVsc2UNCj4+ICsgICAg ICAgICAgICAgeGZlci0+Ym91bmNlX2J1ZiA9IGttZW1kdXAoeGZlci0+ZGF0YSwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGZlci0+ZGF0YV9sZW4sIEdGUF9L RVJORUwpOw0KPj4gKw0KPj4gKyAgICAgcmV0dXJuIHhmZXItPmJvdW5jZV9idWYgPT0gTlVMTCA/ IC1FTk9NRU0gOiAwOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgdm9pZCBtY2hwX2kzY19oY2lf ZnJlZV9zYWZlX3hmZXJfYnVmKHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSwNCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqeGZlcikN Cj4+ICt7DQo+PiArICAgICBpZiAoaGNpLT5pbyA9PSAmbWNocF9taXBpX2kzY19oY2lfcGlvIHx8 IHhmZXItPmJvdW5jZV9idWYgPT0gTlVMTCkNCj4+ICsgICAgIHJldHVybjsNCj4+ICsgICAgIGlm ICh4ZmVyLT5ybncpDQo+PiArICAgICAgICAgICAgIG1lbWNweSh4ZmVyLT5kYXRhLCB4ZmVyLT5i b3VuY2VfYnVmLCB4ZmVyLT5kYXRhX2xlbik7DQo+PiArDQo+PiArICAgICBrZnJlZSh4ZmVyLT5i b3VuY2VfYnVmKTsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIGludCBtY2hwX2kzY19oY2lfcHJp dl94ZmVycyhzdHJ1Y3QgaTNjX2Rldl9kZXNjICpkZXYsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgc3RydWN0IGkzY19wcml2X3hmZXIgKmkzY194ZmVycywNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICBpbnQgbnhmZXJzKQ0KPj4gK3sNCj4+ICsgICAgIHN0cnVjdCBpM2Nf bWFzdGVyX2NvbnRyb2xsZXIgKm0gPSBpM2NfZGV2X2dldF9tYXN0ZXIoZGV2KTsNCj4+ICsgICAg IHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSA9IHRvX2kzY19oY2kobSk7DQo+PiArICAgICBzdHJ1 Y3QgbWNocF9oY2lfeGZlciAqeGZlcjsNCj4+ICsgICAgIERFQ0xBUkVfQ09NUExFVElPTl9PTlNU QUNLKGRvbmUpOw0KPj4gKyAgICAgdW5zaWduZWQgaW50IHNpemVfbGltaXQ7DQo+PiArICAgICBp bnQgaSwgbGFzdCwgcmV0ID0gMDsNCj4+ICsNCj4+ICsgICAgIGRldl9kYmcoJmhjaS0+bWFzdGVy LmRldiwibnhmZXJzID0gJWQiLCBueGZlcnMpOw0KPj4gKw0KPj4gKyAgICAgeGZlciA9IG1jaHBf aGNpX2FsbG9jX3hmZXIobnhmZXJzKTsNCj4+ICsgICAgIGlmICgheGZlcikNCj4+ICsgICAgICAg ICAgICAgcmV0dXJuIC1FTk9NRU07DQo+PiArDQo+PiArICAgICBzaXplX2xpbWl0ID0gMVUgPDwg MTY7DQo+PiArICAgICBmb3IgKGkgPSAwOyBpIDwgbnhmZXJzOyBpKyspIHsNCj4+ICsgICAgICAg ICAgICAgeGZlcltpXS5kYXRhX2xlbiA9IGkzY194ZmVyc1tpXS5sZW47DQo+PiArICAgICAgICAg ICAgIHJldCA9IC1FRkJJRzsNCj4+ICsgICAgICAgICAgICAgaWYgKHhmZXJbaV0uZGF0YV9sZW4g Pj0gc2l6ZV9saW1pdCkNCj4+ICsgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsNCj4+ICsg ICAgICAgICAgICAgeGZlcltpXS5ybncgPSBpM2NfeGZlcnNbaV0ucm53Ow0KPj4gKyAgICAgICAg ICAgICBpZiAoaTNjX3hmZXJzW2ldLnJudykgew0KPj4gKyAgICAgICAgICAgICAgICAgICAgIHhm ZXJbaV0uZGF0YSA9IGkzY194ZmVyc1tpXS5kYXRhLmluOw0KPj4gKyAgICAgICAgICAgICB9IGVs c2Ugew0KPj4gKyAgICAgICAgICAgICAgICAgICAgIC8qIHNpbGVuY2UgdGhlIGNvbnN0IHF1YWxp ZmllciB3YXJuaW5nIHdpdGggYSBjYXN0ICovDQo+PiArICAgICAgICAgICAgICAgICAgICAgeGZl cltpXS5kYXRhID0gKHZvaWQgKikgaTNjX3hmZXJzW2ldLmRhdGEub3V0Ow0KPj4gKyAgICAgICAg ICAgICB9DQo+PiArICAgICAgICAgICAgIGhjaS0+Y21kLT5wcmVwX2kzY194ZmVyKGhjaSwgZGV2 LCAmeGZlcltpXSk7DQo+PiArICAgICAgICAgICAgIHhmZXJbaV0uY21kX2Rlc2NbMF0gfD0gQ01E XzBfUk9DOw0KPj4gKyAgICAgICAgICAgICByZXQgPSBtY2hwX2kzY19oY2lfYWxsb2Nfc2FmZV94 ZmVyX2J1ZihoY2ksICZ4ZmVyW2ldKTsNCj4+ICsgICAgICAgICAgICAgaWYgKHJldCkNCj4+ICsg ICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsNCj4+ICsgICAgIH0NCj4+ICsgICAgIGxhc3Qg PSBpIC0gMTsNCj4+ICsgICAgIHhmZXJbbGFzdF0uY21kX2Rlc2NbMF0gfD0gQ01EXzBfVE9DOw0K Pj4gKyAgICAgeGZlcltsYXN0XS5jb21wbGV0aW9uID0gJmRvbmU7DQo+PiArDQo+PiArICAgICBy ZXQgPSBoY2ktPmlvLT5xdWV1ZV94ZmVyKGhjaSwgeGZlciwgbnhmZXJzKTsNCj4+ICsgICAgIGlm IChyZXQpDQo+PiArICAgICAgICAgICAgIGdvdG8gb3V0Ow0KPj4gKyAgICAgaWYgKCF3YWl0X2Zv cl9jb21wbGV0aW9uX3RpbWVvdXQoJmRvbmUsIEhaKSAmJg0KPj4gKyAgICAgICAgIGhjaS0+aW8t PmRlcXVldWVfeGZlcihoY2ksIHhmZXIsIG54ZmVycykpIHsNCj4+ICsgICAgICAgICAgICAgcmV0 ID0gLUVUSU1FOw0KPj4gKyAgICAgICAgICAgICBnb3RvIG91dDsNCj4+ICsgICAgIH0NCj4+ICsg ICAgIGZvciAoaSA9IDA7IGkgPCBueGZlcnM7IGkrKykgew0KPj4gKyAgICAgICAgICAgICBpZiAo aTNjX3hmZXJzW2ldLnJudykNCj4+ICsgICAgICAgICAgICAgICAgICAgICBpM2NfeGZlcnNbaV0u bGVuID0gUkVTUF9EQVRBX0xFTkdUSCh4ZmVyW2ldLnJlc3BvbnNlKTsNCj4+ICsgICAgICAgICAg ICAgaWYgKFJFU1BfU1RBVFVTKHhmZXJbaV0ucmVzcG9uc2UpICE9IFJFU1BfU1VDQ0VTUykgew0K Pj4gKyAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU87DQo+PiArICAgICAgICAgICAgICAg ICAgICAgZ290byBvdXQ7DQo+PiArICAgICAgICAgICAgIH0NCj4+ICsgICAgIH0NCj4+ICsNCj4+ ICtvdXQ6DQo+PiArICAgICBmb3IgKGkgPSAwOyBpIDwgbnhmZXJzOyBpKyspDQo+PiArICAgICAg ICAgICAgIG1jaHBfaTNjX2hjaV9mcmVlX3NhZmVfeGZlcl9idWYoaGNpLCAmeGZlcltpXSk7DQo+ PiArDQo+PiArICAgICBtY2hwX2hjaV9mcmVlX3hmZXIoeGZlciwgbnhmZXJzKTsNCj4+ICsgICAg IHJldHVybiByZXQ7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgbWNocF9pM2NfaGNpX2ky Y194ZmVycyhzdHJ1Y3QgaTJjX2Rldl9kZXNjICpkZXYsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBzdHJ1Y3QgaTJjX21zZyAqaTJjX3hmZXJzLCBpbnQgbnhmZXJzKQ0KPj4g K3sNCj4+ICsgICAgIHN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXIgKm0gPSBpMmNfZGV2X2dl dF9tYXN0ZXIoZGV2KTsNCj4+ICsgICAgIHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSA9IHRvX2kz Y19oY2kobSk7DQo+PiArICAgICBzdHJ1Y3QgbWNocF9oY2lfeGZlciAqeGZlcjsNCj4+ICsgICAg IERFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGRvbmUpOw0KPj4gKyAgICAgaW50IGksIGxhc3Qs IHJldCA9IDA7DQo+PiArDQo+PiArICAgICBkZXZfZGJnKCZoY2ktPm1hc3Rlci5kZXYsIm54ZmVy cyA9ICVkIiwgbnhmZXJzKTsNCj4+ICsNCj4+ICsgICAgIHhmZXIgPSBtY2hwX2hjaV9hbGxvY194 ZmVyKG54ZmVycyk7DQo+PiArICAgICBpZiAoIXhmZXIpDQo+PiArICAgICAgICAgICAgIHJldHVy biAtRU5PTUVNOw0KPj4gKw0KPj4gKyAgICAgZm9yIChpID0gMDsgaSA8IG54ZmVyczsgaSsrKSB7 DQo+PiArICAgICAgICAgICAgIHhmZXJbaV0uZGF0YSA9IGkyY194ZmVyc1tpXS5idWY7DQo+PiAr ICAgICAgICAgICAgIHhmZXJbaV0uZGF0YV9sZW4gPSBpMmNfeGZlcnNbaV0ubGVuOw0KPj4gKyAg ICAgICAgICAgICB4ZmVyW2ldLnJudyA9IGkyY194ZmVyc1tpXS5mbGFncyAmIEkyQ19NX1JEOw0K Pj4gKyAgICAgICAgICAgICBoY2ktPmNtZC0+cHJlcF9pMmNfeGZlcihoY2ksIGRldiwgJnhmZXJb aV0pOw0KPj4gKyAgICAgICAgICAgICB4ZmVyW2ldLmNtZF9kZXNjWzBdIHw9IENNRF8wX1JPQzsN Cj4+ICsgICAgICAgICAgICAgcmV0ID0gbWNocF9pM2NfaGNpX2FsbG9jX3NhZmVfeGZlcl9idWYo aGNpLCAmeGZlcltpXSk7DQo+PiArICAgICAgICAgICAgIGlmIChyZXQpDQo+PiArICAgICAgICAg ICAgICAgICAgICAgZ290byBvdXQ7DQo+PiArICAgICB9DQo+PiArICAgICBsYXN0ID0gaSAtIDE7 DQo+PiArICAgICB4ZmVyW2xhc3RdLmNtZF9kZXNjWzBdIHw9IENNRF8wX1RPQzsNCj4+ICsgICAg IHhmZXJbbGFzdF0uY29tcGxldGlvbiA9ICZkb25lOw0KPj4gKw0KPj4gKyAgICAgcmV0ID0gaGNp LT5pby0+cXVldWVfeGZlcihoY2ksIHhmZXIsIG54ZmVycyk7DQo+PiArICAgICBpZiAocmV0KQ0K Pj4gKyAgICAgICAgICAgICBnb3RvIG91dDsNCj4+ICsgICAgIGlmICghd2FpdF9mb3JfY29tcGxl dGlvbl90aW1lb3V0KCZkb25lLCBIWikgJiYNCj4+ICsgICAgICAgICBoY2ktPmlvLT5kZXF1ZXVl X3hmZXIoaGNpLCB4ZmVyLCBueGZlcnMpKSB7DQo+PiArICAgICAgICAgICAgIHJldCA9IC1FVElN RTsNCj4+ICsgICAgICAgICAgICAgZ290byBvdXQ7DQo+PiArICAgICB9DQo+PiArICAgICBmb3Ig KGkgPSAwOyBpIDwgbnhmZXJzOyBpKyspIHsNCj4+ICsgICAgICAgICAgICAgaWYgKFJFU1BfU1RB VFVTKHhmZXJbaV0ucmVzcG9uc2UpICE9IFJFU1BfU1VDQ0VTUykgew0KPj4gKyAgICAgICAgICAg ICAgICAgICAgIHJldCA9IC1FSU87DQo+PiArICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7 DQo+PiArICAgICAgICAgICAgIH0NCj4+ICsgICAgIH0NCj4+ICsNCj4+ICtvdXQ6DQo+PiArICAg ICBmb3IgKGkgPSAwOyBpIDwgbnhmZXJzOyBpKyspDQo+PiArICAgICAgICAgICAgIG1jaHBfaTNj X2hjaV9mcmVlX3NhZmVfeGZlcl9idWYoaGNpLCAmeGZlcltpXSk7DQo+PiArDQo+PiArICAgICBt Y2hwX2hjaV9mcmVlX3hmZXIoeGZlciwgbnhmZXJzKTsNCj4+ICsgICAgIHJldHVybiByZXQ7DQo+ PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgbWNocF9pM2NfaGNpX2F0dGFjaF9pM2NfZGV2KHN0 cnVjdCBpM2NfZGV2X2Rlc2MgKmRldikNCj4+ICt7DQo+PiArICAgICBzdHJ1Y3QgaTNjX21hc3Rl cl9jb250cm9sbGVyICptID0gaTNjX2Rldl9nZXRfbWFzdGVyKGRldik7DQo+PiArICAgICBzdHJ1 Y3QgbWNocF9pM2NfaGNpICpoY2kgPSB0b19pM2NfaGNpKG0pOw0KPj4gKyAgICAgc3RydWN0IG1j aHBfaTNjX2hjaV9kZXZfZGF0YSAqZGV2X2RhdGE7DQo+PiArICAgICBpbnQgcmV0Ow0KPj4gKw0K Pj4gKyAgICAgZGV2X2RhdGEgPSBremFsbG9jKHNpemVvZigqZGV2X2RhdGEpLCBHRlBfS0VSTkVM KTsNCj4+ICsgICAgIGlmICghZGV2X2RhdGEpDQo+PiArICAgICAgICAgICAgIHJldHVybiAtRU5P TUVNOw0KPj4gKyAgICAgaWYgKGhjaS0+Y21kID09ICZtY2hwX21pcGlfaTNjX2hjaV9jbWRfdjEp IHsNCj4+ICsgICAgICAgICAgICAgcmV0ID0gbWNocF9taXBpX2kzY19oY2lfZGF0X3YxLmFsbG9j X2VudHJ5KGhjaSk7DQo+PiArICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7DQo+PiArICAgICAg ICAgICAgICAgICAgICAga2ZyZWUoZGV2X2RhdGEpOw0KPj4gKyAgICAgICAgICAgICAgICAgICAg IHJldHVybiByZXQ7DQo+PiArICAgICAgICAgICAgIH0NCj4+ICsgICAgICAgICAgICAgbWNocF9t aXBpX2kzY19oY2lfZGF0X3YxLnNldF9keW5hbWljX2FkZHIoaGNpLCByZXQsIGRldi0+aW5mby5k eW5fYWRkcik7DQo+PiArICAgICAgICAgICAgIGRldl9kYXRhLT5kYXRfaWR4ID0gcmV0Ow0KPj4g KyAgICAgfQ0KPj4gKyAgICAgaTNjX2Rldl9zZXRfbWFzdGVyX2RhdGEoZGV2LCBkZXZfZGF0YSk7 DQo+PiArICAgICByZXR1cm4gMDsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIGludCBtY2hwX2kz Y19oY2lfcmVhdHRhY2hfaTNjX2RldihzdHJ1Y3QgaTNjX2Rldl9kZXNjICpkZXYsIHU4IG9sZF9k eW5fYWRkcikNCj4+ICt7DQo+PiArICAgICBzdHJ1Y3QgaTNjX21hc3Rlcl9jb250cm9sbGVyICpt ID0gaTNjX2Rldl9nZXRfbWFzdGVyKGRldik7DQo+PiArICAgICBzdHJ1Y3QgbWNocF9pM2NfaGNp ICpoY2kgPSB0b19pM2NfaGNpKG0pOw0KPj4gKyAgICAgc3RydWN0IG1jaHBfaTNjX2hjaV9kZXZf ZGF0YSAqZGV2X2RhdGEgPSBpM2NfZGV2X2dldF9tYXN0ZXJfZGF0YShkZXYpOw0KPj4gKw0KPj4g KyAgICAgaWYgKGhjaS0+Y21kID09ICZtY2hwX21pcGlfaTNjX2hjaV9jbWRfdjEpDQo+PiArICAg ICAgICAgICAgIG1jaHBfbWlwaV9pM2NfaGNpX2RhdF92MS5zZXRfZHluYW1pY19hZGRyKGhjaSwg ZGV2X2RhdGEtPmRhdF9pZHgsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZGV2LT5pbmZvLmR5bl9hZGRyKTsNCj4+ICsgICAgIHJldHVybiAwOw0KPj4gK30N Cj4+ICsNCj4+ICtzdGF0aWMgdm9pZCBtY2hwX2kzY19oY2lfZGV0YWNoX2kzY19kZXYoc3RydWN0 IGkzY19kZXZfZGVzYyAqZGV2KQ0KPj4gK3sNCj4+ICsgICAgIHN0cnVjdCBpM2NfbWFzdGVyX2Nv bnRyb2xsZXIgKm0gPSBpM2NfZGV2X2dldF9tYXN0ZXIoZGV2KTsNCj4+ICsgICAgIHN0cnVjdCBt Y2hwX2kzY19oY2kgKmhjaSA9IHRvX2kzY19oY2kobSk7DQo+PiArICAgICBzdHJ1Y3QgbWNocF9p M2NfaGNpX2Rldl9kYXRhICpkZXZfZGF0YSA9IGkzY19kZXZfZ2V0X21hc3Rlcl9kYXRhKGRldik7 DQo+PiArDQo+PiArICAgICBpM2NfZGV2X3NldF9tYXN0ZXJfZGF0YShkZXYsIE5VTEwpOw0KPj4g KyAgICAgaWYgKGhjaS0+Y21kID09ICZtY2hwX21pcGlfaTNjX2hjaV9jbWRfdjEpDQo+PiArICAg ICAgICAgICAgIG1jaHBfbWlwaV9pM2NfaGNpX2RhdF92MS5mcmVlX2VudHJ5KGhjaSwgZGV2X2Rh dGEtPmRhdF9pZHgpOw0KPj4gKyAgICAga2ZyZWUoZGV2X2RhdGEpOw0KPj4gK30NCj4+ICsNCj4+ ICtzdGF0aWMgaW50IG1jaHBfaTNjX2hjaV9hdHRhY2hfaTJjX2RldihzdHJ1Y3QgaTJjX2Rldl9k ZXNjICpkZXYpDQo+PiArew0KPj4gKyAgICAgc3RydWN0IGkzY19tYXN0ZXJfY29udHJvbGxlciAq bSA9IGkyY19kZXZfZ2V0X21hc3RlcihkZXYpOw0KPj4gKyAgICAgc3RydWN0IG1jaHBfaTNjX2hj aSAqaGNpID0gdG9faTNjX2hjaShtKTsNCj4+ICsgICAgIHN0cnVjdCBtY2hwX2kzY19oY2lfZGV2 X2RhdGEgKmRldl9kYXRhOw0KPj4gKyAgICAgaW50IHJldDsNCj4+ICsNCj4+ICsgICAgIGlmICho Y2ktPmNtZCAhPSAmbWNocF9taXBpX2kzY19oY2lfY21kX3YxKQ0KPj4gKyAgICAgICAgICAgICBy ZXR1cm4gMDsNCj4+ICsgICAgIGRldl9kYXRhID0ga3phbGxvYyhzaXplb2YoKmRldl9kYXRhKSwg R0ZQX0tFUk5FTCk7DQo+PiArICAgICBpZiAoIWRldl9kYXRhKQ0KPj4gKyAgICAgICAgICAgICBy ZXR1cm4gLUVOT01FTTsNCj4+ICsgICAgIHJldCA9IG1jaHBfbWlwaV9pM2NfaGNpX2RhdF92MS5h bGxvY19lbnRyeShoY2kpOw0KPj4gKyAgICAgaWYgKHJldCA8IDApIHsNCj4+ICsgICAgICAgICAg ICAga2ZyZWUoZGV2X2RhdGEpOw0KPj4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KPj4gKyAg ICAgfQ0KPj4gKyAgICAgbWNocF9taXBpX2kzY19oY2lfZGF0X3YxLnNldF9zdGF0aWNfYWRkciho Y2ksIHJldCwgZGV2LT5hZGRyKTsNCj4+ICsgICAgIG1jaHBfbWlwaV9pM2NfaGNpX2RhdF92MS5z ZXRfZmxhZ3MoaGNpLCByZXQsIERBVF8wX0kyQ19ERVZJQ0UsIDApOw0KPj4gKyAgICAgZGV2X2Rh dGEtPmRhdF9pZHggPSByZXQ7DQo+PiArICAgICBpMmNfZGV2X3NldF9tYXN0ZXJfZGF0YShkZXYs IGRldl9kYXRhKTsNCj4+ICsgICAgIHJldHVybiAwOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMg dm9pZCBtY2hwX2kzY19oY2lfZGV0YWNoX2kyY19kZXYoc3RydWN0IGkyY19kZXZfZGVzYyAqZGV2 KQ0KPj4gK3sNCj4+ICsgICAgIHN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXIgKm0gPSBpMmNf ZGV2X2dldF9tYXN0ZXIoZGV2KTsNCj4+ICsgICAgIHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSA9 IHRvX2kzY19oY2kobSk7DQo+PiArICAgICBzdHJ1Y3QgbWNocF9pM2NfaGNpX2Rldl9kYXRhICpk ZXZfZGF0YSA9IGkyY19kZXZfZ2V0X21hc3Rlcl9kYXRhKGRldik7DQo+PiArDQo+PiArICAgICBp ZiAoZGV2X2RhdGEpIHsNCj4+ICsgICAgICAgICAgICAgaTJjX2Rldl9zZXRfbWFzdGVyX2RhdGEo ZGV2LCBOVUxMKTsNCj4+ICsgICAgICAgICAgICAgaWYgKGhjaS0+Y21kID09ICZtY2hwX21pcGlf aTNjX2hjaV9jbWRfdjEpDQo+PiArICAgICAgICAgICAgICAgICAgICAgbWNocF9taXBpX2kzY19o Y2lfZGF0X3YxLmZyZWVfZW50cnkoaGNpLCBkZXZfZGF0YS0+ZGF0X2lkeCk7DQo+PiArICAgICAg ICAgICAgIGtmcmVlKGRldl9kYXRhKTsNCj4+ICsgICAgIH0NCj4+ICt9DQo+PiArDQo+PiArc3Rh dGljIGludCBtY2hwX2kzY19oY2lfcmVxdWVzdF9pYmkoc3RydWN0IGkzY19kZXZfZGVzYyAqZGV2 LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaTNjX2liaV9z ZXR1cCAqcmVxKQ0KPj4gK3sNCj4+ICsgICAgIHN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXIg Km0gPSBpM2NfZGV2X2dldF9tYXN0ZXIoZGV2KTsNCj4+ICsgICAgIHN0cnVjdCBtY2hwX2kzY19o Y2kgKmhjaSA9IHRvX2kzY19oY2kobSk7DQo+PiArICAgICBzdHJ1Y3QgbWNocF9pM2NfaGNpX2Rl dl9kYXRhICpkZXZfZGF0YSA9IGkzY19kZXZfZ2V0X21hc3Rlcl9kYXRhKGRldik7DQo+PiArICAg ICB1bnNpZ25lZCBpbnQgZGF0X2lkeCA9IGRldl9kYXRhLT5kYXRfaWR4Ow0KPj4gKw0KPj4gKyAg ICAgaWYgKHJlcS0+bWF4X3BheWxvYWRfbGVuICE9IDApDQo+PiArICAgICAgICAgICAgIG1jaHBf bWlwaV9pM2NfaGNpX2RhdF92MS5zZXRfZmxhZ3MoaGNpLCBkYXRfaWR4LCBEQVRfMF9JQklfUEFZ TE9BRCwgMCk7DQo+PiArICAgICBlbHNlDQo+PiArICAgICAgICAgICAgIG1jaHBfbWlwaV9pM2Nf aGNpX2RhdF92MS5jbGVhcl9mbGFncyhoY2ksIGRhdF9pZHgsIERBVF8wX0lCSV9QQVlMT0FELCAw KTsNCj4+ICsgICAgIHJldHVybiBoY2ktPmlvLT5yZXF1ZXN0X2liaShoY2ksIGRldiwgcmVxKTsN Cj4+ICt9DQo+PiArDQo+PiArc3RhdGljIHZvaWQgbWNocF9pM2NfaGNpX2ZyZWVfaWJpKHN0cnVj dCBpM2NfZGV2X2Rlc2MgKmRldikNCj4+ICt7DQo+PiArICAgICBzdHJ1Y3QgaTNjX21hc3Rlcl9j b250cm9sbGVyICptID0gaTNjX2Rldl9nZXRfbWFzdGVyKGRldik7DQo+PiArICAgICBzdHJ1Y3Qg bWNocF9pM2NfaGNpICpoY2kgPSB0b19pM2NfaGNpKG0pOw0KPj4gKw0KPj4gKyAgICAgaGNpLT5p by0+ZnJlZV9pYmkoaGNpLCBkZXYpOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgaW50IG1jaHBf aTNjX2hjaV9lbmFibGVfaWJpKHN0cnVjdCBpM2NfZGV2X2Rlc2MgKmRldikNCj4+ICt7DQo+PiAr ICAgICBzdHJ1Y3QgaTNjX21hc3Rlcl9jb250cm9sbGVyICptID0gaTNjX2Rldl9nZXRfbWFzdGVy KGRldik7DQo+PiArICAgICBzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2kgPSB0b19pM2NfaGNpKG0p Ow0KPj4gKyAgICAgc3RydWN0IG1jaHBfaTNjX2hjaV9kZXZfZGF0YSAqZGV2X2RhdGEgPSBpM2Nf ZGV2X2dldF9tYXN0ZXJfZGF0YShkZXYpOw0KPj4gKw0KPj4gKyAgICAgbWNocF9taXBpX2kzY19o Y2lfZGF0X3YxLmNsZWFyX2ZsYWdzKGhjaSwgZGV2X2RhdGEtPmRhdF9pZHgsIERBVF8wX1NJUl9S RUpFQ1QsIDApOw0KPj4gKyAgICAgcmV0dXJuIGkzY19tYXN0ZXJfZW5lY19sb2NrZWQobSwgZGV2 LT5pbmZvLmR5bl9hZGRyLCBJM0NfQ0NDX0VWRU5UX1NJUik7DQo+PiArfQ0KPj4gKw0KPj4gK3N0 YXRpYyBpbnQgbWNocF9pM2NfaGNpX2Rpc2FibGVfaWJpKHN0cnVjdCBpM2NfZGV2X2Rlc2MgKmRl dikNCj4+ICt7DQo+PiArICAgICBzdHJ1Y3QgaTNjX21hc3Rlcl9jb250cm9sbGVyICptID0gaTNj X2Rldl9nZXRfbWFzdGVyKGRldik7DQo+PiArICAgICBzdHJ1Y3QgbWNocF9pM2NfaGNpICpoY2kg PSB0b19pM2NfaGNpKG0pOw0KPj4gKyAgICAgc3RydWN0IG1jaHBfaTNjX2hjaV9kZXZfZGF0YSAq ZGV2X2RhdGEgPSBpM2NfZGV2X2dldF9tYXN0ZXJfZGF0YShkZXYpOw0KPj4gKw0KPj4gKyAgICAg bWNocF9taXBpX2kzY19oY2lfZGF0X3YxLnNldF9mbGFncyhoY2ksIGRldl9kYXRhLT5kYXRfaWR4 LCBEQVRfMF9TSVJfUkVKRUNULCAwKTsNCj4+ICsgICAgIHJldHVybiBpM2NfbWFzdGVyX2Rpc2Vj X2xvY2tlZChtLCBkZXYtPmluZm8uZHluX2FkZHIsIEkzQ19DQ0NfRVZFTlRfU0lSKTsNCj4+ICt9 DQo+PiArDQo+PiArc3RhdGljIHZvaWQgbWNocF9pM2NfaGNpX3JlY3ljbGVfaWJpX3Nsb3Qoc3Ry dWN0IGkzY19kZXZfZGVzYyAqZGV2LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzdHJ1Y3QgaTNjX2liaV9zbG90ICpzbG90KQ0KPj4gK3sNCj4+ICsgICAgIHN0cnVjdCBp M2NfbWFzdGVyX2NvbnRyb2xsZXIgKm0gPSBpM2NfZGV2X2dldF9tYXN0ZXIoZGV2KTsNCj4+ICsg ICAgIHN0cnVjdCBtY2hwX2kzY19oY2kgKmhjaSA9IHRvX2kzY19oY2kobSk7DQo+PiArDQo+PiAr ICAgICBoY2ktPmlvLT5yZWN5Y2xlX2liaV9zbG90KGhjaSwgZGV2LCBzbG90KTsNCj4+ICt9DQo+ PiArDQo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXJfb3BzIG1j aHBfaTNjX2hjaV9vcHMgPSB7DQo+PiArICAgICAuYnVzX2luaXQgICAgICAgICAgICAgICA9IG1j aHBfaTNjX2hjaV9idXNfaW5pdCwNCj4+ICsgICAgIC5idXNfY2xlYW51cCAgICAgICAgICAgID0g bWNocF9pM2NfaGNpX2J1c19jbGVhbnVwLA0KPj4gKyAgICAgLmRvX2RhYSAgICAgICAgICAgICAg ICAgPSBtY2hwX2kzY19oY2lfZGFhLA0KPj4gKyAgICAgLnNlbmRfY2NjX2NtZCAgICAgICAgICAg PSBtY2hwX2kzY19oY2lfc2VuZF9jY2NfY21kLA0KPj4gKyAgICAgLnByaXZfeGZlcnMgICAgICAg ICAgICAgPSBtY2hwX2kzY19oY2lfcHJpdl94ZmVycywNCj4+ICsgICAgIC5pMmNfeGZlcnMgICAg ICAgICAgICAgID0gbWNocF9pM2NfaGNpX2kyY194ZmVycywNCj4+ICsgICAgIC5hdHRhY2hfaTNj X2RldiAgICAgICAgID0gbWNocF9pM2NfaGNpX2F0dGFjaF9pM2NfZGV2LA0KPj4gKyAgICAgLnJl YXR0YWNoX2kzY19kZXYgICAgICAgPSBtY2hwX2kzY19oY2lfcmVhdHRhY2hfaTNjX2RldiwNCj4+ ICsgICAgIC5kZXRhY2hfaTNjX2RldiAgICAgICAgID0gbWNocF9pM2NfaGNpX2RldGFjaF9pM2Nf ZGV2LA0KPj4gKyAgICAgLmF0dGFjaF9pMmNfZGV2ICAgICAgICAgPSBtY2hwX2kzY19oY2lfYXR0 YWNoX2kyY19kZXYsDQo+PiArICAgICAuZGV0YWNoX2kyY19kZXYgICAgICAgICA9IG1jaHBfaTNj X2hjaV9kZXRhY2hfaTJjX2RldiwNCj4+ICsgICAgIC5yZXF1ZXN0X2liaSAgICAgICAgICAgID0g bWNocF9pM2NfaGNpX3JlcXVlc3RfaWJpLA0KPj4gKyAgICAgLmZyZWVfaWJpICAgICAgICAgICAg ICAgPSBtY2hwX2kzY19oY2lfZnJlZV9pYmksDQo+PiArICAgICAuZW5hYmxlX2liaSAgICAgICAg ICAgICA9IG1jaHBfaTNjX2hjaV9lbmFibGVfaWJpLA0KPj4gKyAgICAgLmRpc2FibGVfaWJpICAg ICAgICAgICAgPSBtY2hwX2kzY19oY2lfZGlzYWJsZV9pYmksDQo+PiArICAgICAucmVjeWNsZV9p Ymlfc2xvdCAgICAgICA9IG1jaHBfaTNjX2hjaV9yZWN5Y2xlX2liaV9zbG90LA0KPj4gK307DQo+ PiArDQo+PiArc3RhdGljIGlycXJldHVybl90IG1jaHBfaTNjX2hjaV9pcnFfaGFuZGxlcihpbnQg aXJxLCB2b2lkICpkZXZfaWQpDQo+PiArew0KPj4gKyAgICAgc3RydWN0IG1jaHBfaTNjX2hjaSAq aGNpID0gZGV2X2lkOw0KPj4gKyAgICAgaXJxcmV0dXJuX3QgcmVzdWx0ID0gSVJRX05PTkU7DQo+ PiArICAgICB1MzIgdmFsOw0KPj4gKw0KPj4gKyAgICAgdmFsID0gcmVnX3JlYWQoTUNIUF9JTlRS X1NUQVRVUyk7DQo+PiArICAgICBkZXZfZGJnKCZoY2ktPm1hc3Rlci5kZXYsIklOVFJfU1RBVFVT ID0gJSN4IiwgdmFsKTsNCj4+ICsNCj4+ICsgICAgIGlmICh2YWwgJiBNQ0hQX0lOVFJfSENfSU5U RVJOQUxfRVJSKSB7DQo+PiArICAgICAgICAgICAgIGRldl9lcnIoJmhjaS0+bWFzdGVyLmRldiwg Ikhvc3QgQ29udHJvbGxlciBJbnRlcm5hbCBFcnJvclxuIik7DQo+PiArICAgICAgICAgICAgIHZh bCAmPSB+TUNIUF9JTlRSX0hDX0lOVEVSTkFMX0VSUjsNCj4+ICsgICAgIH0NCj4+ICsNCj4+ICsg ICAgIGhjaS0+aW8tPmlycV9oYW5kbGVyKGhjaSwgMCk7DQo+PiArDQo+PiArICAgICBpZiAodmFs KQ0KPj4gKyAgICAgICAgICAgICBkZXZfZXJyKCZoY2ktPm1hc3Rlci5kZXYsICJ1bmV4cGVjdGVk IElOVFJfU1RBVFVTICUjeFxuIiwgdmFsKTsNCj4+ICsgICAgIGVsc2UNCj4+ICsgICAgICAgICAg ICAgcmVzdWx0ID0gSVJRX0hBTkRMRUQ7DQo+PiArDQo+PiArICAgICByZXR1cm4gcmVzdWx0Ow0K Pj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgaW50IG1jaHBfaTNjX2hjaV9pbml0KHN0cnVjdCBtY2hw X2kzY19oY2kgKmhjaSkNCj4+ICt7DQo+PiArICAgICBib29sIHNpemVfaW5fZHdvcmRzLCBtb2Rl X3NlbGVjdG9yOw0KPj4gKyAgICAgdTMyIHJlZ3ZhbCwgb2Zmc2V0Ow0KPj4gKyAgICAgaW50IHJl dDsNCj4+ICsNCj4+ICsgICAgIC8qIFZhbGlkYXRlIEhDSSBoYXJkd2FyZSB2ZXJzaW9uICovDQo+ PiArICAgICByZWd2YWwgPSByZWdfcmVhZChNQ0hQX0hDSV9WRVJTSU9OKTsNCj4+ICsgICAgIGhj aS0+dmVyc2lvbl9tYWpvciA9IChyZWd2YWwgPj4gOCkgJiAweGY7DQo+PiArICAgICBoY2ktPnZl cnNpb25fbWlub3IgPSAocmVndmFsID4+IDQpICYgMHhmOw0KPj4gKyAgICAgaGNpLT5yZXZpc2lv biA9IHJlZ3ZhbCAmIDB4ZjsNCj4+ICsgICAgIGRldl9ub3RpY2UoJmhjaS0+bWFzdGVyLmRldiwg Ik1JUEkgSTNDIEhDSSB2JXUuJXUgciUwMnVcbiIsDQo+PiArICAgICAgICAgICAgICAgIGhjaS0+ dmVyc2lvbl9tYWpvciwgaGNpLT52ZXJzaW9uX21pbm9yLCBoY2ktPnJldmlzaW9uKTsNCj4+ICsg ICAgIC8qIGtub3duIHZlcnNpb25zICovDQo+PiArICAgICBzd2l0Y2ggKHJlZ3ZhbCAmIH4weGYp IHsNCj4+ICsgICAgIGNhc2UgMHgxMDA6ICAgICAvKiB2ZXJzaW9uIDEuMCAqLw0KPj4gKyAgICAg Y2FzZSAweDExMDogICAgIC8qIHZlcnNpb24gMS4xICovDQo+PiArICAgICBjYXNlIDB4MjAwOiAg ICAgLyogdmVyc2lvbiAyLjAgKi8NCj4+ICsgICAgICAgICAgICAgYnJlYWs7DQo+PiArICAgICBk ZWZhdWx0Og0KPj4gKyAgICAgICAgICAgICBkZXZfZXJyKCZoY2ktPm1hc3Rlci5kZXYsICJ1bnN1 cHBvcnRlZCBIQ0kgdmVyc2lvblxuIik7DQo+PiArICAgICAgICAgICAgIHJldHVybiAtRVBST1RP Tk9TVVBQT1JUOw0KPj4gKyAgICAgfQ0KPj4gKw0KPj4gKyAgICAgaGNpLT5jYXBzID0gcmVnX3Jl YWQoTUNIUF9IQ19DQVBBQklMSVRJRVMpOw0KPj4gKyAgICAgZGV2X2RiZygmaGNpLT5tYXN0ZXIu ZGV2LCJjYXBzID0gJSN4IiwgaGNpLT5jYXBzKTsNCj4+ICsNCj4+ICsgICAgIHNpemVfaW5fZHdv cmRzID0gaGNpLT52ZXJzaW9uX21ham9yIDwgMSB8fA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAoaGNpLT52ZXJzaW9uX21ham9yID09IDEgJiYgaGNpLT52ZXJzaW9uX21pbm9yIDwgMSk7DQo+ PiArDQo+PiArICAgICByZWd2YWwgPSByZWdfcmVhZChNQ0hQX0RBVF9TRUNUSU9OKTsNCj4+ICsg ICAgIG9mZnNldCA9IEZJRUxEX0dFVChNQ0hQX0RBVF9UQUJMRV9PRkZTRVQsIHJlZ3ZhbCk7DQo+ PiArICAgICBoY2ktPkRBVF9yZWdzID0gb2Zmc2V0ID8gaGNpLT5iYXNlX3JlZ3MgKyBvZmZzZXQg OiBOVUxMOw0KPj4gKyAgICAgaGNpLT5EQVRfZW50cmllcyA9IEZJRUxEX0dFVChNQ0hQX0RBVF9U QUJMRV9TSVpFLCByZWd2YWwpOw0KPj4gKyAgICAgaGNpLT5EQVRfZW50cnlfc2l6ZSA9IDg7DQo+ PiArICAgICBpZiAoc2l6ZV9pbl9kd29yZHMpDQo+PiArICAgICAgICAgICAgIGhjaS0+REFUX2Vu dHJpZXMgPSA0ICogaGNpLT5EQVRfZW50cmllcyAvIGhjaS0+REFUX2VudHJ5X3NpemU7DQo+PiAr ICAgICBkZXZfaW5mbygmaGNpLT5tYXN0ZXIuZGV2LCAiREFUOiAldSAldS1ieXRlcyBlbnRyaWVz IGF0IG9mZnNldCAlI3hcbiIsDQo+PiArICAgICAgICAgICAgICBoY2ktPkRBVF9lbnRyaWVzLCBo Y2ktPkRBVF9lbnRyeV9zaXplLCBvZmZzZXQpOw0KPj4gKw0KPj4gKyAgICAgcmVndmFsID0gcmVn X3JlYWQoTUNIUF9EQ1RfU0VDVElPTik7DQo+PiArICAgICBvZmZzZXQgPSBGSUVMRF9HRVQoTUNI UF9EQ1RfVEFCTEVfT0ZGU0VULCByZWd2YWwpOw0KPj4gKyAgICAgaGNpLT5EQ1RfcmVncyA9IG9m ZnNldCA/IGhjaS0+YmFzZV9yZWdzICsgb2Zmc2V0IDogTlVMTDsNCj4+ICsgICAgIGhjaS0+RENU X2VudHJpZXMgPSBGSUVMRF9HRVQoTUNIUF9EQ1RfVEFCTEVfU0laRSwgcmVndmFsKTsNCj4+ICsg ICAgIGhjaS0+RENUX2VudHJ5X3NpemUgPSAxNjsNCj4+ICsgICAgIGlmIChzaXplX2luX2R3b3Jk cykNCj4+ICsgICAgICAgICAgICAgaGNpLT5EQ1RfZW50cmllcyA9IDQgKiBoY2ktPkRDVF9lbnRy aWVzIC8gaGNpLT5EQ1RfZW50cnlfc2l6ZTsNCj4+ICsgICAgIGRldl9pbmZvKCZoY2ktPm1hc3Rl ci5kZXYsICJEQ1Q6ICV1ICV1LWJ5dGVzIGVudHJpZXMgYXQgb2Zmc2V0ICUjeFxuIiwNCj4+ICsg ICAgICAgICAgICAgIGhjaS0+RENUX2VudHJpZXMsIGhjaS0+RENUX2VudHJ5X3NpemUsIG9mZnNl dCk7DQo+PiArDQo+PiArICAgICByZWd2YWwgPSByZWdfcmVhZChNQ0hQX1JJTkdfSEVBREVSU19T RUNUSU9OKTsNCj4+ICsgICAgIG9mZnNldCA9IEZJRUxEX0dFVChNQ0hQX1JJTkdfSEVBREVSU19P RkZTRVQsIHJlZ3ZhbCk7DQo+PiArICAgICBoY2ktPlJIU19yZWdzID0gb2Zmc2V0ID8gaGNpLT5i YXNlX3JlZ3MgKyBvZmZzZXQgOiBOVUxMOw0KPj4gKyAgICAgZGV2X2luZm8oJmhjaS0+bWFzdGVy LmRldiwgIlJpbmcgSGVhZGVycyBhdCBvZmZzZXQgJSN4XG4iLCBvZmZzZXQpOw0KPj4gKw0KPj4g KyAgICAgcmVndmFsID0gcmVnX3JlYWQoTUNIUF9QSU9fU0VDVElPTik7DQo+PiArICAgICBvZmZz ZXQgPSBGSUVMRF9HRVQoTUNIUF9QSU9fUkVHU19PRkZTRVQsIHJlZ3ZhbCk7DQo+PiArICAgICBo Y2ktPlBJT19yZWdzID0gb2Zmc2V0ID8gaGNpLT5iYXNlX3JlZ3MgKyBvZmZzZXQgOiBOVUxMOw0K Pj4gKyAgICAgZGV2X2luZm8oJmhjaS0+bWFzdGVyLmRldiwgIlBJTyBzZWN0aW9uIGF0IG9mZnNl dCAlI3hcbiIsIG9mZnNldCk7DQo+PiArDQo+PiArICAgICByZWd2YWwgPSByZWdfcmVhZChNQ0hQ X0VYVF9DQVBTX1NFQ1RJT04pOw0KPj4gKyAgICAgb2Zmc2V0ID0gRklFTERfR0VUKE1DSFBfRVhU X0NBUFNfT0ZGU0VULCByZWd2YWwpOw0KPj4gKyAgICAgaGNpLT5FWFRDQVBTX3JlZ3MgPSBvZmZz ZXQgPyBoY2ktPmJhc2VfcmVncyArIG9mZnNldCA6IE5VTEw7DQo+PiArICAgICBkZXZfaW5mbygm aGNpLT5tYXN0ZXIuZGV2LCAiRXh0ZW5kZWQgQ2FwcyBhdCBvZmZzZXQgJSN4XG4iLCBvZmZzZXQp Ow0KPj4gKw0KPj4gKyAgICAgcmV0ID0gaTNjX2hjaV9wYXJzZV9leHRfY2FwcyhoY2kpOw0KPj4g KyAgICAgaWYgKHJldCkNCj4+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsNCj4+ICsNCj4+ICsg ICAgIC8qDQo+PiArICAgICAgKiBOb3cgbGV0J3MgcmVzZXQgdGhlIGhhcmR3YXJlLg0KPj4gKyAg ICAgICogU09GVF9SU1QgbXVzdCBiZSBjbGVhciBiZWZvcmUgd2Ugd3JpdGUgdG8gaXQuDQo+PiAr ICAgICAgKiBUaGVuIHdlIG11c3Qgd2FpdCB1bnRpbCBpdCBjbGVhcnMgYWdhaW4uDQo+PiArICAg ICAgKi8NCj4+ICsgICAgIHJldCA9IHJlYWR4X3BvbGxfdGltZW91dChyZWdfcmVhZCwgTUNIUF9S RVNFVF9DT05UUk9MLCByZWd2YWwsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IShyZWd2YWwgJiBNQ0hQX1NPRlRfUlNUKSwgMSwgMTAwMDApOw0KPj4gKyAgICAgaWYgKHJldCkN Cj4+ICsgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsNCj4+ICsgICAgIHJlZ193cml0ZShNQ0hQ X1JFU0VUX0NPTlRST0wsIE1DSFBfU09GVF9SU1QpOw0KPj4gKyAgICAgcmV0ID0gcmVhZHhfcG9s bF90aW1lb3V0KHJlZ19yZWFkLCBNQ0hQX1JFU0VUX0NPTlRST0wsIHJlZ3ZhbCwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAhKHJlZ3ZhbCAmIE1DSFBfU09GVF9SU1QpLCAxLCAx MDAwMCk7DQo+PiArICAgICBpZiAocmV0KQ0KPj4gKyAgICAgICAgICAgICByZXR1cm4gLUVOWElP Ow0KPj4gKw0KPj4gKyAgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhbmQgYWxsb3cgYWxs IHNpZ25hbCB1cGRhdGVzICovDQo+PiArICAgICByZWdfd3JpdGUoTUNIUF9JTlRSX1NJR05BTF9F TkFCTEUsIDB4MCk7DQo+PiArICAgICByZWdfd3JpdGUoTUNIUF9JTlRSX1NUQVRVU19FTkFCTEUs IDB4ZmZmZmZmZmYpOw0KPj4gKw0KPj4gKyAgICAgaGNpLT5jbWQgPSAmbWNocF9taXBpX2kzY19o Y2lfY21kX3YxOw0KPj4gKyAgICAgbW9kZV9zZWxlY3RvciA9IGhjaS0+dmVyc2lvbl9tYWpvciA+ IDEgfHwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoY2ktPnZlcnNpb25fbWFq b3IgPT0gMSAmJiBoY2ktPnZlcnNpb25fbWlub3IgPiAwKTsNCj4+ICsNCj4+ICsgICAgIC8qIFF1 aXJrIGZvciBIQ0lfUVVJUktfUElPX01PREUgb24gTUlDUk9DSElQIHBsYXRmb3JtcyAqLw0KPj4g KyAgICAgaWYgKGhjaS0+cXVpcmtzICYgTUNIUF9IQ0lfUVVJUktfUElPX01PREUpIHsNCj4+ICsg ICAgICAgICAgICAgICAgICAgICBoY2ktPlJIU19yZWdzID0gTlVMTDsNCj4+ICsgICAgIH0NCj4+ ICsNCj4+ICsgICAgIGhjaS0+aW8gPSAmbWNocF9taXBpX2kzY19oY2lfcGlvOw0KPj4gKyAgICAg ZGV2X2luZm8oJmhjaS0+bWFzdGVyLmRldiwgIlVzaW5nIFBJT1xuIik7DQo+PiArDQo+PiArICAg ICBtaWNyb2NoaXBfc2V0X29kX3BwX3RpbWluZyhoY2kpOw0KPj4gKw0KPj4gKyAgICAgcmV0dXJu IDA7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgbWNocF9pM2NfaGNpX3Byb2JlKHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+PiArew0KPj4gKyAgICAgc3RydWN0IG1jaHBfaTNj X2hjaSAqaGNpOw0KPj4gKyAgICAgaW50IGlycSwgcmV0Ow0KPj4gKw0KPj4gKyAgICAgaGNpID0g ZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaGNpKSwgR0ZQX0tFUk5FTCk7DQo+PiAr ICAgICBpZiAoIWhjaSkNCj4+ICsgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07DQo+PiArICAg ICBoY2ktPmJhc2VfcmVncyA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZShwZGV2LCAw KTsNCj4+ICsgICAgIGlmIChJU19FUlIoaGNpLT5iYXNlX3JlZ3MpKQ0KPj4gKyAgICAgICAgICAg ICByZXR1cm4gUFRSX0VSUihoY2ktPmJhc2VfcmVncyk7DQo+PiArDQo+PiArICAgICBoY2ktPmdj bGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImdjbGsiKTsNCj4+ICsgICAgIGlmIChJU19F UlIoaGNpLT5nY2xrKSkNCj4+ICsgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIoaGNpLT5nY2xr KTsNCj4+ICsNCj4+ICsgICAgIGhjaS0+cGNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAi cGNsayIpOw0KPj4gKyAgICAgaWYgKElTX0VSUihoY2ktPnBjbGspKQ0KPj4gKyAgICAgICAgICAg ICByZXR1cm4gUFRSX0VSUihoY2ktPnBjbGspOw0KPj4gKw0KPj4gKyAgICAgcmV0ID0gY2xrX3By ZXBhcmVfZW5hYmxlKGhjaS0+Z2Nsayk7DQo+PiArICAgICBpZiAocmV0KQ0KPj4gKyAgICAgICAg ICAgICBnb3RvIGVycl9kaXNhYmxlX2djbGs7DQo+PiArDQo+PiArICAgICByZXQgPSBjbGtfcHJl cGFyZV9lbmFibGUoaGNpLT5wY2xrKTsNCj4+ICsgICAgIGlmIChyZXQpDQo+PiArICAgICAgICAg ICAgIGdvdG8gZXJyX2Rpc2FibGVfcGNsazsNCj4+ICsNCj4+ICsgICAgIHBsYXRmb3JtX3NldF9k cnZkYXRhKHBkZXYsIGhjaSk7DQo+PiArDQo+PiArICAgICBoY2ktPm1hc3Rlci5kZXYuaW5pdF9u YW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7DQo+PiArDQo+PiArICAgICBoY2ktPnF1aXJrcyA9 ICh1bnNpZ25lZCBsb25nKWRldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsNCj4+ICsN Cj4+ICsgICAgIHJldCA9IG1jaHBfaTNjX2hjaV9pbml0KGhjaSk7DQo+PiArICAgICBpZiAocmV0 KQ0KPj4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KPj4gKw0KPj4gKyAgICAgaXJxID0gcGxh dGZvcm1fZ2V0X2lycShwZGV2LCAwKTsNCj4+ICsgICAgIHJldCA9IGRldm1fcmVxdWVzdF9pcnEo JnBkZXYtPmRldiwgaXJxLCBtY2hwX2kzY19oY2lfaXJxX2hhbmRsZXIsDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIGhjaSk7DQo+PiArICAgICBpZiAocmV0KQ0KPj4g KyAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KPj4gKw0KPj4gKyAgICAgcmV0ID0gaTNjX21hc3Rl cl9yZWdpc3RlcigmaGNpLT5tYXN0ZXIsICZwZGV2LT5kZXYsDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICZtY2hwX2kzY19oY2lfb3BzLCBmYWxzZSk7DQo+PiArICAgICBpZiAo cmV0KQ0KPj4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KPj4gKw0KPj4gKyAgICAgcmV0dXJu IDA7DQo+PiArDQo+PiArZXJyX2Rpc2FibGVfcGNsazoNCj4+ICsgICAgIGNsa19kaXNhYmxlX3Vu cHJlcGFyZShoY2ktPnBjbGspOw0KPj4gKw0KPj4gK2Vycl9kaXNhYmxlX2djbGs6DQo+PiArICAg ICBjbGtfZGlzYWJsZV91bnByZXBhcmUoaGNpLT5nY2xrKTsNCj4+ICsNCj4+ICsgICAgIHJldHVy biByZXQ7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB2b2lkIG1jaHBfaTNjX2hjaV9yZW1vdmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4+ICt7DQo+PiArICAgICBzdHJ1Y3QgbWNo cF9pM2NfaGNpICpoY2kgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsNCj4+ICsNCj4+ICsg ICAgIGkzY19tYXN0ZXJfdW5yZWdpc3RlcigmaGNpLT5tYXN0ZXIpOw0KPj4gK30NCj4+ICsNCj4+ ICtzdGF0aWMgY29uc3QgX19tYXliZV91bnVzZWQgc3RydWN0IG9mX2RldmljZV9pZCBtY2hwX2kz Y19oY2lfb2ZfbWF0Y2hbXSA9IHsNCj4+ICsgICAgIHsgLmNvbXBhdGlibGUgPSAibWljcm9jaGlw LHNhbWE3ZDY1LWkzYy1oY2kiLCAuZGF0YSA9ICh2b2lkICopKE1DSFBfSENJX1FVSVJLX1BJT19N T0RFIHwgTUNIUF9IQ0lfUVVJUktfT0RfUFBfVElNSU5HIHwgTUNIUF9IQ0lfUVVJUktfUkVTUF9C VUZfVEhMRCkgfSwNCj4+ICsgICAgIHt9LA0KPj4gK307DQo+PiArTU9EVUxFX0RFVklDRV9UQUJM RShvZiwgbWNocF9pM2NfaGNpX29mX21hdGNoKTsNCj4+ICsNCj4+ICtzdGF0aWMgc3RydWN0IHBs YXRmb3JtX2RyaXZlciBtY2hwX2kzY19oY2lfZHJpdmVyID0gew0KPj4gKyAgICAgLnByb2JlID0g bWNocF9pM2NfaGNpX3Byb2JlLA0KPj4gKyAgICAgLnJlbW92ZV9uZXcgPSBtY2hwX2kzY19oY2lf cmVtb3ZlLA0KPj4gKyAgICAgLmRyaXZlciA9IHsNCj4+ICsgICAgICAgICAgICAgLm5hbWUgPSAi c2FtYTdkNjUtaTNjLWhjaS1tYXN0ZXIiLA0KPj4gKyAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFi bGUgPSBvZl9tYXRjaF9wdHIobWNocF9pM2NfaGNpX29mX21hdGNoKSwNCj4+ICsgICAgIH0sDQo+ PiArfTsNCj4+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1jaHBfaTNjX2hjaV9kcml2ZXIpOw0K Pj4gKw0KPj4gK01PRFVMRV9BVVRIT1IoIkR1cmFpIE1hbmlja2FtIEtSIDxkdXJhaS5tYW5pY2th bWtyQG1pY3JvY2hpcC5jb20+Iik7DQo+PiArTU9EVUxFX0RFU0NSSVBUSU9OKCJNaWNyb2NoaXAg U0FNQTdkNjUgSTNDIEhDSSBtYXN0ZXIgZHJpdmVyIik7DQo+PiArTU9EVUxFX0xJQ0VOU0UoIkdQ TCIpOw0KPj4gLS0NCj4+IDIuMzQuMQ0KPj4NCg0K