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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB420EC874E for ; Thu, 7 Sep 2023 18:21:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343817AbjIGSV7 (ORCPT ); Thu, 7 Sep 2023 14:21:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245195AbjIGSV6 (ORCPT ); Thu, 7 Sep 2023 14:21:58 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 970CC91; Thu, 7 Sep 2023 11:21:53 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id ABB771595; Thu, 7 Sep 2023 03:06:41 -0700 (PDT) Received: from pluto (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 8D0A83F64C; Thu, 7 Sep 2023 03:06:01 -0700 (PDT) Date: Thu, 7 Sep 2023 11:05:52 +0100 From: Cristian Marussi To: AKASHI Takahiro , Peng Fan , Linus Walleij , "Peng Fan (OSS)" , "oleksii_moisieiev@epam.com" , "sudeep.holla@arm.com" , Aisheng Dong , "festevam@gmail.com" , Jacky Bai , "s.hauer@pengutronix.de" , "shawnguo@kernel.org" , "kernel@pengutronix.de" , dl-linux-imx , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-gpio@vger.kernel.org" Subject: Re: [RFC] scmi: pinctrl: support i.MX9 Message-ID: References: <20230824070611.3335107-1-peng.fan@oss.nxp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org On Wed, Sep 06, 2023 at 02:43:46PM +0900, AKASHI Takahiro wrote: > On Wed, Aug 30, 2023 at 02:37:48PM +0100, Cristian Marussi wrote: > > On Wed, Aug 30, 2023 at 12:48:37PM +0000, Peng Fan wrote: > > > Hi Cristian, > > > > > > > Hi, > > Hi, > > > > Subject: Re: [RFC] scmi: pinctrl: support i.MX9 > > > > > > > > On Fri, Aug 25, 2023 at 08:43:38AM +0000, Peng Fan wrote: > > > > > > Subject: Re: [RFC] scmi: pinctrl: support i.MX9 > > > > > > > > > > > > On Thu, Aug 24, 2023 at 2:47 PM Peng Fan wrote: > > > > > > > Me: > > > > > > > > Hi Peng, > > > > > > > > > > > > > > > > >> it is merely making things more complex and also slower > > > > > > > > bymaking the registers only accessible from this SCMI link. > > > > > > > > > > > > > > This is for safety reason, the pinctrl hardware must be handled by > > > > > > > a system manager entity. So mmio direct access not allowed from > > > > > > > Cortex-A side. > > > > > > > > > > > > Yeah I understood as much. But I don't think that the firmware is > > > > > > really filtering any of the access, it will just poke into any > > > > > > pinctrl register as instructed anyway so what's the point. Just looks like a > > > > layer of indirection. > > > > > > > > > > No, the firmware has a check on whether a pin is allowed to be > > > > > configured by the agent that wanna to configure the pin. > > > > > > > > > > > But I'm not your system manager, so it's not my decision. > > > > > > > > > > > > > The SCMI firmware is very straightforward, there is no group or > > > > > > > function. > > > > > > > > > > > > > > It just accepts the format as this: > > > > > > > MUX_TYPE, MUX VALUE, CONF_TYPE, CONF_VAL, DAISY_TYPE, DAISY > > > > ID, > > > > > > > DAISY_CFG, DAISY_VALUE. > > > > > > > > > > > > > > Similar as linux MMIO format. > > > > > > > > > > > > > > Our i.MX95 platform will support two settings, one with SCMI > > > > > > > firmware, one without SCMI. These two settings will share the same > > > > > > > pinctrl header file. > > > > > > > > > > > > > > And to simplify the scmi firmware design(anyway I am not owner of > > > > > > > the firmware), to make pinctrl header shared w/o scmi, we take the > > > > > > > current in-upstream freescale imx binding format. > > > > > > > > > > > > The SCMI people will have to state their position on this. > > > > > > Like what they consider conformance and what extensions are allowed. > > > > > > This is more a standardization question than an implementation > > > > > > question so it's not really my turf. > > > > > > > > > > The i.MX95 SCMI firmware uses OEM extension type. So I just follow > > > > > what the firmware did and support it in linux. Anyway let's wait > > > > > Sudeep's reply. > > > > > > > > > > > > > So my unsderstanding on this matter as of now is that: > > > > > > > > 1. the current SCMI Pinctrl specification can support your usecase by using > > > > OEM Types and multiple pins/values CONFIG_GET/SET commands > > > > > > Yes, based on the Oleksii patchset with my local multiple configs support. > > > > > > > Yes, I know, I pointed out on his series that the protocol has still to > > be fixed to be aligned with the latest BETA2 spec (we changed the spec > > on the fly while he was already posting indeed..) > > > > > > > > > > 2. the Kernel SCMI protocol layer (driver/firmware/arm_scmi/pinctrl.c) > > > > is equally fine and can support your usecase, AFTER Oleksii fixes it to > > > > align it to the latest v3.2-BETA2 specification changes. > > > > IOW, this means that, using the SCMI Pinctrl protocol operations > > > > exposed in scmi_protocol.h, from somewhere, you are able to properly > > > > configure multiple pins/values with your specific OEM types. > > > > > > Yes. > > > > Good. > > > > > > > > > > > > > 3. The SCMI Pinctrl driver (by Oleksii) built on top of the pinctrl protocol > > > > operations is instead NOT suitable for your usecase since it uses the Linux > > > > Generic Pinconf and IMX does not make use of it, and instead IMX has > > > > its own bindings and related parsing logic. > > > > > > Yes. > > > > > > > > > > > Am I right ? > > > > > > You are right. > > > > > > > > > > > If this is the case, I would NOT try to abuse the current SCMI Pinctrl Generic > > > > driver (by Oleksii) by throwing into it a bunch of IMX specific DT parsing, > > > > also because you'll end-up NOT using most of the generic SCMI Pinctrl driver > > > > but just reusing a bit of the probe (customized with your own DT maps > > > > parsing) > > > > > > Only DT map to parse the dts and map to config array. Others are same, > > > so need to export some symbols for pinctrl-scmi-imx.c driver if build imx > > > scmi driver. > > > > > > > Yes, but you are basically using some exported symbol to parse the DT in > > your way and then you do not use anything of the various > > functions/groups stuff...you just leverage some of the probing stuff and > > then issue you OEM Type configs....I mean most of the picntrl-scmi > > driver would be unused anyway in this scenario. > > > > > > > > > > Instead, given that the spec[1.] and the protocol layer[2.] are fine for your > > > > use case and you indeed have already a custom way to parse your DT > > > > mappings, I would say that you could just write your own custom SCMI > > > > driver ( ? pinctrl-imx-scmi), distinct and much more simple than the generic > > > > one, that does its own IMX DT parsing and calls just the SCMI protocol > > > > operations that it needs in the way that your platform expects: so basically > > > > another Pinctrl SCMI driver that does not use the generic pinconf DT > > > > configuration BUT DO USE the underlying SCMI Pinctrl protocol (via its > > > > exposed protocol operations...) > > > > > > I am ok with this approach, but I need use the other ID, saying 0x99, not 0x19, > > > because 0x19 will bind with the pinctrl-scmi.c driver, I could not reuse > > > this ID for i.MX pinctrl-scmi-imx driver. Otherwise there will be issue if both > > > driver are built in kernel image. > > > > > > > Ok here I lost you. > > > > The protocol ID 0x19 is bound to the protocol layer and identifies the > > standard Pinctrl protocol: usually you use a 0x99 to define and describe > > you own specific NEW vendor protocol, BUT here you are saying you are fine to > > use std Pinctrl spec AND the protocol operations as exposed in pinctrl.c, so > > I dont see why you should use a new vendor protocol_id to basically > > expose the same operations. (and I also dont see how you can do that > > without hacks in the current codebase) > > > > You CAN have multiple SCMI drivers using the same protocol at the same > > time (even more than one protocol at the same time), even though we try > > to avoid it if there are no good reason to have more than one driver, there > > is nothing in the spec or in the current SCMI platform or agent stacks that > > inhibits such scenario (and I use iot heavily for my offline testing > > indeed.) > > > > Look at: > > > > - drivers/hwmon/scmi-hwmon > > - drivers/iio/common/scmi_sensors/scmi_iio.c > > > > and you'll see that these 2 drivers uses the same SENSOR protocol, just for > > different sensor types so they do not interfere one with each other. > > Then, how are those two devices identified in a device tree? At SCMI probe time the SCMI core stack creates one device for each 'protocol_id/name' as provided by the registered SCMI drivers in their respective scmi_device_id/id_tableS, as long as the requested protocol is active in the DT (protocol@XX defined) and the 'name' is not duplicated; each of these devices, sharing the same SCMI protocol, are created sharing also the same DT node protocol@XX. Their respective SCMI drivers are subsequently separately matched on protocol_id/name and then probed as usual: it is up to the drivers not to step on each other feet by competing for the same SCMI resources... ...like issuing comflicting request for the same reosurce domain on the same protocol. I suppose, though, a lot depends on how the respective drivers interact with their subsystems, like IIO SCMI does not really need any info from DT, and the hwmon uses just the phandle to pick the sensor_domain_id to associate, as an example, to thermal sensors. > That is the point in Peng's case and why he wants to have a dedicated > protocol id (I don't agree to this, though.) > If we follow Cristian's idea, we may want to have two dt nodes, say > pinctrl-scmi-generic and pinctrl-scmi-imx, as phandles for other device > nodes to refer to pins, respectively. > I think there is currently no mechanism (or binding?) to allow this > except adding a protocol id. > Beside the uglyness of having 2 different DT bindings schemas for 2 different drivers coexisting in the same parent protocol node, it is still not clear to me why this cant be done technically without the need of a new dummy 0x99 protocol_node, given that each driver can use its own parsing logic in its probe, which is what Peng is doing in dt_node_to_map indeed ...even though, maybe, the result would be so ugly and/or not accepatble from bindings point of view that we will not want to do it at the end anyway....I mean maybe it is just the attempt itself to combine the Generic Pinctrl approach with the highly specific IMX approach that inevitably leads to these clashes... ...I maybe missing something, though, so I'll made some experiments on my side about this before I'll keep on blabbing :P Thanks, Cristian 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 B84F9EE14DC for ; Thu, 7 Sep 2023 10:06:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Cc:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=lwxs0kYgGBiKoEc0Oisotoe1NrRt951Gs4sVzXzeBTE=; b=DPx0Hdt23zPhBz j60uNqM7shUOCSq2N8NeU8E5xTxUL4Zt90SnKpA7ljjhFHxMbHSXEl8NYG91fwhNyBam4qAjmuawx azvG46CjLipK5iL04rnWXydShcccLhHHbKFVVt4DpCZGA4lPVboz3hKInMHjeDLsKfHjtbZ2q1Klh 6Xhi7ekBBnvPhYMuTA7sJEVHgs2bCCMF1SKxLOkIdn4jgD1zIRsktSKNZD85yrBSqTSadQ27d766r dSDz4z1Zhavg4MuxfV0B7hsCFlCs7jRhzUWX6IKzQPwYAODg3LQN3/oPPsfpKcsrYdq9n9W65s3Ph CNHzlEF0vrfbqi9YcS4A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qeBtp-00BkCN-0A; Thu, 07 Sep 2023 10:06:09 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qeBtm-00BkBx-1V for linux-arm-kernel@lists.infradead.org; Thu, 07 Sep 2023 10:06:08 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id ABB771595; Thu, 7 Sep 2023 03:06:41 -0700 (PDT) Received: from pluto (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 8D0A83F64C; Thu, 7 Sep 2023 03:06:01 -0700 (PDT) Date: Thu, 7 Sep 2023 11:05:52 +0100 From: Cristian Marussi To: AKASHI Takahiro , Peng Fan , Linus Walleij , "Peng Fan (OSS)" , "oleksii_moisieiev@epam.com" , "sudeep.holla@arm.com" , Aisheng Dong , "festevam@gmail.com" , Jacky Bai , "s.hauer@pengutronix.de" , "shawnguo@kernel.org" , "kernel@pengutronix.de" , dl-linux-imx , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-gpio@vger.kernel.org" Subject: Re: [RFC] scmi: pinctrl: support i.MX9 Message-ID: References: <20230824070611.3335107-1-peng.fan@oss.nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230907_030606_619868_DF5F705B X-CRM114-Status: GOOD ( 71.17 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gV2VkLCBTZXAgMDYsIDIwMjMgYXQgMDI6NDM6NDZQTSArMDkwMCwgQUtBU0hJIFRha2FoaXJv IHdyb3RlOgo+IE9uIFdlZCwgQXVnIDMwLCAyMDIzIGF0IDAyOjM3OjQ4UE0gKzAxMDAsIENyaXN0 aWFuIE1hcnVzc2kgd3JvdGU6Cj4gPiBPbiBXZWQsIEF1ZyAzMCwgMjAyMyBhdCAxMjo0ODozN1BN ICswMDAwLCBQZW5nIEZhbiB3cm90ZToKPiA+ID4gSGkgQ3Jpc3RpYW4sCj4gPiA+IAo+ID4gCj4g PiBIaSwKPiA+IAoKSGksCgo+ID4gPiA+IFN1YmplY3Q6IFJlOiBbUkZDXSBzY21pOiBwaW5jdHJs OiBzdXBwb3J0IGkuTVg5Cj4gPiA+ID4gCj4gPiA+ID4gT24gRnJpLCBBdWcgMjUsIDIwMjMgYXQg MDg6NDM6MzhBTSArMDAwMCwgUGVuZyBGYW4gd3JvdGU6Cj4gPiA+ID4gPiA+IFN1YmplY3Q6IFJl OiBbUkZDXSBzY21pOiBwaW5jdHJsOiBzdXBwb3J0IGkuTVg5Cj4gPiA+ID4gPiA+Cj4gPiA+ID4g PiA+IE9uIFRodSwgQXVnIDI0LCAyMDIzIGF0IDI6NDfigK9QTSBQZW5nIEZhbiA8cGVuZy5mYW5A bnhwLmNvbT4gd3JvdGU6Cj4gPiA+ID4gPiA+ID4gTWU6Cj4gPiA+ID4gCj4gPiA+ID4gSGkgUGVu ZywKPiA+ID4gPiAKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPj4gaXQgaXMgbWVyZWx5IG1ha2lu ZyB0aGluZ3MgbW9yZSBjb21wbGV4IGFuZCBhbHNvIHNsb3dlcgo+ID4gPiA+ID4gPiA+ID4gYnlt YWtpbmcgdGhlIHJlZ2lzdGVycyBvbmx5IGFjY2Vzc2libGUgZnJvbSB0aGlzIFNDTUkgbGluay4K PiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IFRoaXMgaXMgZm9yIHNhZmV0eSByZWFzb24sIHRo ZSBwaW5jdHJsIGhhcmR3YXJlIG11c3QgYmUgaGFuZGxlZCBieQo+ID4gPiA+ID4gPiA+IGEgc3lz dGVtIG1hbmFnZXIgZW50aXR5LiBTbyBtbWlvIGRpcmVjdCBhY2Nlc3Mgbm90IGFsbG93ZWQgZnJv bQo+ID4gPiA+ID4gPiA+IENvcnRleC1BIHNpZGUuCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IFll YWggSSB1bmRlcnN0b29kIGFzIG11Y2guIEJ1dCBJIGRvbid0IHRoaW5rIHRoYXQgdGhlIGZpcm13 YXJlIGlzCj4gPiA+ID4gPiA+IHJlYWxseSBmaWx0ZXJpbmcgYW55IG9mIHRoZSBhY2Nlc3MsIGl0 IHdpbGwganVzdCBwb2tlIGludG8gYW55Cj4gPiA+ID4gPiA+IHBpbmN0cmwgcmVnaXN0ZXIgYXMg aW5zdHJ1Y3RlZCBhbnl3YXkgc28gd2hhdCdzIHRoZSBwb2ludC4gSnVzdCBsb29rcyBsaWtlIGEK PiA+ID4gPiBsYXllciBvZiBpbmRpcmVjdGlvbi4KPiA+ID4gPiA+Cj4gPiA+ID4gPiBObywgdGhl IGZpcm13YXJlIGhhcyBhIGNoZWNrIG9uIHdoZXRoZXIgYSBwaW4gaXMgYWxsb3dlZCB0byBiZQo+ ID4gPiA+ID4gY29uZmlndXJlZCBieSB0aGUgYWdlbnQgdGhhdCB3YW5uYSB0byBjb25maWd1cmUg dGhlIHBpbi4KPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IEJ1dCBJJ20gbm90IHlvdXIgc3lzdGVtIG1h bmFnZXIsIHNvIGl0J3Mgbm90IG15IGRlY2lzaW9uLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ IFRoZSBTQ01JIGZpcm13YXJlIGlzIHZlcnkgc3RyYWlnaHRmb3J3YXJkLCB0aGVyZSBpcyBubyBn cm91cCBvcgo+ID4gPiA+ID4gPiA+IGZ1bmN0aW9uLgo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ID4gSXQganVzdCBhY2NlcHRzIHRoZSBmb3JtYXQgYXMgdGhpczoKPiA+ID4gPiA+ID4gPiBNVVhf VFlQRSwgTVVYIFZBTFVFLCBDT05GX1RZUEUsIENPTkZfVkFMLCBEQUlTWV9UWVBFLCBEQUlTWQo+ ID4gPiA+IElELAo+ID4gPiA+ID4gPiA+IERBSVNZX0NGRywgREFJU1lfVkFMVUUuCj4gPiA+ID4g PiA+ID4KPiA+ID4gPiA+ID4gPiBTaW1pbGFyIGFzIGxpbnV4IE1NSU8gZm9ybWF0Lgo+ID4gPiA+ ID4gPiA+Cj4gPiA+ID4gPiA+ID4gT3VyIGkuTVg5NSBwbGF0Zm9ybSB3aWxsIHN1cHBvcnQgdHdv IHNldHRpbmdzLCBvbmUgd2l0aCBTQ01JCj4gPiA+ID4gPiA+ID4gZmlybXdhcmUsIG9uZSB3aXRo b3V0IFNDTUkuIFRoZXNlIHR3byBzZXR0aW5ncyB3aWxsIHNoYXJlIHRoZSBzYW1lCj4gPiA+ID4g PiA+ID4gcGluY3RybCBoZWFkZXIgZmlsZS4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IEFu ZCB0byBzaW1wbGlmeSB0aGUgc2NtaSBmaXJtd2FyZSBkZXNpZ24oYW55d2F5IEkgYW0gbm90IG93 bmVyIG9mCj4gPiA+ID4gPiA+ID4gdGhlIGZpcm13YXJlKSwgdG8gbWFrZSBwaW5jdHJsIGhlYWRl ciBzaGFyZWQgdy9vIHNjbWksIHdlIHRha2UgdGhlCj4gPiA+ID4gPiA+ID4gY3VycmVudCBpbi11 cHN0cmVhbSBmcmVlc2NhbGUgaW14IGJpbmRpbmcgZm9ybWF0Lgo+ID4gPiA+ID4gPgo+ID4gPiA+ ID4gPiBUaGUgU0NNSSBwZW9wbGUgd2lsbCBoYXZlIHRvIHN0YXRlIHRoZWlyIHBvc2l0aW9uIG9u IHRoaXMuCj4gPiA+ID4gPiA+IExpa2Ugd2hhdCB0aGV5IGNvbnNpZGVyIGNvbmZvcm1hbmNlIGFu ZCB3aGF0IGV4dGVuc2lvbnMgYXJlIGFsbG93ZWQuCj4gPiA+ID4gPiA+IFRoaXMgaXMgbW9yZSBh IHN0YW5kYXJkaXphdGlvbiBxdWVzdGlvbiB0aGFuIGFuIGltcGxlbWVudGF0aW9uCj4gPiA+ID4g PiA+IHF1ZXN0aW9uIHNvIGl0J3Mgbm90IHJlYWxseSBteSB0dXJmLgo+ID4gPiA+ID4KPiA+ID4g PiA+IFRoZSBpLk1YOTUgU0NNSSBmaXJtd2FyZSB1c2VzIE9FTSBleHRlbnNpb24gdHlwZS4gU28g SSBqdXN0IGZvbGxvdwo+ID4gPiA+ID4gd2hhdCB0aGUgZmlybXdhcmUgZGlkIGFuZCBzdXBwb3J0 IGl0IGluIGxpbnV4LiBBbnl3YXkgbGV0J3Mgd2FpdAo+ID4gPiA+ID4gU3VkZWVwJ3MgcmVwbHku Cj4gPiA+ID4gPgo+ID4gPiA+IAo+ID4gPiA+IFNvIG15IHVuc2RlcnN0YW5kaW5nIG9uIHRoaXMg bWF0dGVyIGFzIG9mIG5vdyBpcyB0aGF0Ogo+ID4gPiA+IAo+ID4gPiA+IDEuIHRoZSBjdXJyZW50 IFNDTUkgUGluY3RybCBzcGVjaWZpY2F0aW9uIGNhbiBzdXBwb3J0IHlvdXIgdXNlY2FzZSBieSB1 c2luZwo+ID4gPiA+ICAgIE9FTSBUeXBlcyBhbmQgbXVsdGlwbGUgcGlucy92YWx1ZXMgQ09ORklH X0dFVC9TRVQgY29tbWFuZHMKPiA+ID4gCj4gPiA+IFllcywgYmFzZWQgb24gdGhlIE9sZWtzaWkg cGF0Y2hzZXQgd2l0aCBteSBsb2NhbCBtdWx0aXBsZSBjb25maWdzIHN1cHBvcnQuCj4gPiA+IAo+ ID4gCj4gPiBZZXMsIEkga25vdywgSSBwb2ludGVkIG91dCBvbiBoaXMgc2VyaWVzIHRoYXQgdGhl IHByb3RvY29sIGhhcyBzdGlsbCB0bwo+ID4gYmUgZml4ZWQgdG8gYmUgYWxpZ25lZCB3aXRoIHRo ZSBsYXRlc3QgQkVUQTIgc3BlYyAod2UgY2hhbmdlZCB0aGUgc3BlYwo+ID4gb24gdGhlIGZseSB3 aGlsZSBoZSB3YXMgYWxyZWFkeSBwb3N0aW5nIGluZGVlZC4uKQo+ID4gCj4gPiA+ID4gCj4gPiA+ ID4gMi4gdGhlIEtlcm5lbCBTQ01JIHByb3RvY29sIGxheWVyIChkcml2ZXIvZmlybXdhcmUvYXJt X3NjbWkvcGluY3RybC5jKQo+ID4gPiA+ICAgIGlzIGVxdWFsbHkgZmluZSBhbmQgY2FuIHN1cHBv cnQgeW91ciB1c2VjYXNlLCBBRlRFUiBPbGVrc2lpIGZpeGVzIGl0IHRvCj4gPiA+ID4gICAgYWxp Z24gaXQgdG8gdGhlIGxhdGVzdCB2My4yLUJFVEEyIHNwZWNpZmljYXRpb24gY2hhbmdlcy4KPiA+ ID4gPiAgICBJT1csIHRoaXMgbWVhbnMgdGhhdCwgdXNpbmcgdGhlIFNDTUkgUGluY3RybCBwcm90 b2NvbCBvcGVyYXRpb25zCj4gPiA+ID4gICAgZXhwb3NlZCBpbiBzY21pX3Byb3RvY29sLmgsIGZy b20gc29tZXdoZXJlLCB5b3UgYXJlIGFibGUgdG8gcHJvcGVybHkKPiA+ID4gPiAgICBjb25maWd1 cmUgbXVsdGlwbGUgcGlucy92YWx1ZXMgd2l0aCB5b3VyIHNwZWNpZmljIE9FTSB0eXBlcy4KPiA+ ID4gCj4gPiA+IFllcy4KPiA+IAo+ID4gR29vZC4KPiA+IAo+ID4gPiAKPiA+ID4gPiAKPiA+ID4g PiAzLiBUaGUgU0NNSSBQaW5jdHJsIGRyaXZlciAoYnkgT2xla3NpaSkgYnVpbHQgb24gdG9wIG9m IHRoZSBwaW5jdHJsIHByb3RvY29sCj4gPiA+ID4gICAgb3BlcmF0aW9ucyBpcyBpbnN0ZWFkIE5P VCBzdWl0YWJsZSBmb3IgeW91ciB1c2VjYXNlIHNpbmNlIGl0IHVzZXMgdGhlIExpbnV4Cj4gPiA+ ID4gICAgR2VuZXJpYyBQaW5jb25mIGFuZCBJTVggZG9lcyBub3QgbWFrZSB1c2Ugb2YgaXQsIGFu ZCBpbnN0ZWFkIElNWCBoYXMKPiA+ID4gPiAgICBpdHMgb3duIGJpbmRpbmdzIGFuZCByZWxhdGVk IHBhcnNpbmcgbG9naWMuCj4gPiA+IAo+ID4gPiBZZXMuCj4gPiA+IAo+ID4gPiA+IAo+ID4gPiA+ IEFtIEkgcmlnaHQgPwo+ID4gPiAKPiA+ID4gWW91IGFyZSByaWdodC4KPiA+ID4gCj4gPiA+ID4g Cj4gPiA+ID4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgSSB3b3VsZCBOT1QgdHJ5IHRvIGFidXNlIHRo ZSBjdXJyZW50IFNDTUkgUGluY3RybCBHZW5lcmljCj4gPiA+ID4gZHJpdmVyIChieSBPbGVrc2lp KSBieSB0aHJvd2luZyBpbnRvIGl0IGEgYnVuY2ggb2YgSU1YIHNwZWNpZmljIERUIHBhcnNpbmcs Cj4gPiA+ID4gYWxzbyBiZWNhdXNlIHlvdSdsbCBlbmQtdXAgTk9UIHVzaW5nIG1vc3Qgb2YgdGhl IGdlbmVyaWMgU0NNSSBQaW5jdHJsIGRyaXZlcgo+ID4gPiA+IGJ1dCBqdXN0IHJldXNpbmcgYSBi aXQgb2YgdGhlIHByb2JlIChjdXN0b21pemVkIHdpdGggeW91ciBvd24gRFQgbWFwcwo+ID4gPiA+ IHBhcnNpbmcpCj4gPiA+IAo+ID4gPiBPbmx5IERUIG1hcCB0byBwYXJzZSB0aGUgZHRzIGFuZCBt YXAgdG8gY29uZmlnIGFycmF5LiBPdGhlcnMgYXJlIHNhbWUsCj4gPiA+IHNvIG5lZWQgdG8gZXhw b3J0IHNvbWUgc3ltYm9scyBmb3IgcGluY3RybC1zY21pLWlteC5jIGRyaXZlciBpZiBidWlsZCBp bXgKPiA+ID4gc2NtaSBkcml2ZXIuCj4gPiA+Cj4gPiAKPiA+IFllcywgYnV0IHlvdSBhcmUgYmFz aWNhbGx5IHVzaW5nIHNvbWUgZXhwb3J0ZWQgc3ltYm9sIHRvIHBhcnNlIHRoZSBEVCBpbgo+ID4g eW91ciB3YXkgYW5kIHRoZW4geW91IGRvIG5vdCB1c2UgYW55dGhpbmcgb2YgdGhlIHZhcmlvdXMK PiA+IGZ1bmN0aW9ucy9ncm91cHMgc3R1ZmYuLi55b3UganVzdCBsZXZlcmFnZSBzb21lIG9mIHRo ZSBwcm9iaW5nIHN0dWZmIGFuZAo+ID4gdGhlbiBpc3N1ZSB5b3UgT0VNIFR5cGUgY29uZmlncy4u Li5JIG1lYW4gbW9zdCBvZiB0aGUgcGljbnRybC1zY21pCj4gPiBkcml2ZXIgd291bGQgYmUgdW51 c2VkIGFueXdheSBpbiB0aGlzIHNjZW5hcmlvLgo+ID4gCj4gPiA+ID4gCj4gPiA+ID4gSW5zdGVh ZCwgZ2l2ZW4gdGhhdCB0aGUgc3BlY1sxLl0gYW5kIHRoZSBwcm90b2NvbCBsYXllclsyLl0gYXJl IGZpbmUgZm9yIHlvdXIKPiA+ID4gPiB1c2UgY2FzZSBhbmQgeW91IGluZGVlZCBoYXZlIGFscmVh ZHkgYSBjdXN0b20gd2F5IHRvIHBhcnNlIHlvdXIgRFQKPiA+ID4gPiBtYXBwaW5ncywgSSB3b3Vs ZCBzYXkgdGhhdCB5b3UgY291bGQganVzdCB3cml0ZSB5b3VyIG93biBjdXN0b20gU0NNSQo+ID4g PiA+IGRyaXZlciAoID8gcGluY3RybC1pbXgtc2NtaSksIGRpc3RpbmN0IGFuZCBtdWNoIG1vcmUg c2ltcGxlIHRoYW4gdGhlIGdlbmVyaWMKPiA+ID4gPiBvbmUsIHRoYXQgZG9lcyBpdHMgb3duIElN WCBEVCBwYXJzaW5nIGFuZCBjYWxscyBqdXN0IHRoZSBTQ01JIHByb3RvY29sCj4gPiA+ID4gb3Bl cmF0aW9ucyB0aGF0IGl0IG5lZWRzIGluIHRoZSB3YXkgdGhhdCB5b3VyIHBsYXRmb3JtIGV4cGVj dHM6IHNvIGJhc2ljYWxseQo+ID4gPiA+IGFub3RoZXIgUGluY3RybCBTQ01JIGRyaXZlciB0aGF0 IGRvZXMgbm90IHVzZSB0aGUgZ2VuZXJpYyBwaW5jb25mIERUCj4gPiA+ID4gY29uZmlndXJhdGlv biBCVVQgRE8gVVNFIHRoZSB1bmRlcmx5aW5nIFNDTUkgUGluY3RybCBwcm90b2NvbCAodmlhIGl0 cwo+ID4gPiA+IGV4cG9zZWQgcHJvdG9jb2wgb3BlcmF0aW9ucy4uLikKPiA+ID4gCj4gPiA+IEkg YW0gb2sgd2l0aCB0aGlzIGFwcHJvYWNoLCBidXQgSSBuZWVkIHVzZSB0aGUgb3RoZXIgSUQsIHNh eWluZyAweDk5LCBub3QgMHgxOSwKPiA+ID4gYmVjYXVzZSAweDE5IHdpbGwgYmluZCB3aXRoIHRo ZSBwaW5jdHJsLXNjbWkuYyBkcml2ZXIsIEkgY291bGQgbm90IHJldXNlCj4gPiA+IHRoaXMgSUQg Zm9yIGkuTVggcGluY3RybC1zY21pLWlteCBkcml2ZXIuIE90aGVyd2lzZSB0aGVyZSB3aWxsIGJl IGlzc3VlIGlmIGJvdGgKPiA+ID4gZHJpdmVyIGFyZSBidWlsdCBpbiBrZXJuZWwgaW1hZ2UuCj4g PiA+IAo+ID4gCj4gPiBPayBoZXJlIEkgbG9zdCB5b3UuCj4gPiAKPiA+IFRoZSBwcm90b2NvbCBJ RCAweDE5IGlzIGJvdW5kIHRvIHRoZSBwcm90b2NvbCBsYXllciBhbmQgaWRlbnRpZmllcyB0aGUK PiA+IHN0YW5kYXJkIFBpbmN0cmwgcHJvdG9jb2w6IHVzdWFsbHkgeW91IHVzZSBhIDB4OTkgdG8g ZGVmaW5lIGFuZCBkZXNjcmliZQo+ID4geW91IG93biBzcGVjaWZpYyBORVcgdmVuZG9yIHByb3Rv Y29sLCBCVVQgaGVyZSB5b3UgYXJlIHNheWluZyB5b3UgYXJlIGZpbmUgdG8KPiA+IHVzZSBzdGQg UGluY3RybCBzcGVjIEFORCB0aGUgcHJvdG9jb2wgb3BlcmF0aW9ucyBhcyBleHBvc2VkIGluIHBp bmN0cmwuYywgc28KPiA+IEkgZG9udCBzZWUgd2h5IHlvdSBzaG91bGQgdXNlIGEgbmV3IHZlbmRv ciBwcm90b2NvbF9pZCB0byBiYXNpY2FsbHkKPiA+IGV4cG9zZSB0aGUgc2FtZSBvcGVyYXRpb25z LiAoYW5kIEkgYWxzbyBkb250IHNlZSBob3cgeW91IGNhbiBkbyB0aGF0Cj4gPiB3aXRob3V0IGhh Y2tzIGluIHRoZSBjdXJyZW50IGNvZGViYXNlKQo+ID4gCj4gPiBZb3UgQ0FOIGhhdmUgbXVsdGlw bGUgU0NNSSBkcml2ZXJzIHVzaW5nIHRoZSBzYW1lIHByb3RvY29sIGF0IHRoZSBzYW1lCj4gPiB0 aW1lIChldmVuIG1vcmUgdGhhbiBvbmUgcHJvdG9jb2wgYXQgdGhlIHNhbWUgdGltZSksIGV2ZW4g dGhvdWdoIHdlIHRyeQo+ID4gdG8gYXZvaWQgaXQgaWYgdGhlcmUgYXJlIG5vIGdvb2QgcmVhc29u IHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBkcml2ZXIsIHRoZXJlCj4gPiBpcyBub3RoaW5nIGluIHRo ZSBzcGVjIG9yIGluIHRoZSBjdXJyZW50IFNDTUkgcGxhdGZvcm0gb3IgYWdlbnQgc3RhY2tzIHRo YXQKPiA+IGluaGliaXRzIHN1Y2ggc2NlbmFyaW8gKGFuZCBJIHVzZSBpb3QgaGVhdmlseSBmb3Ig bXkgb2ZmbGluZSB0ZXN0aW5nCj4gPiBpbmRlZWQuKQo+ID4gCj4gPiBMb29rIGF0Ogo+ID4gCj4g PiAgLSBkcml2ZXJzL2h3bW9uL3NjbWktaHdtb24gCj4gPiAgLSBkcml2ZXJzL2lpby9jb21tb24v c2NtaV9zZW5zb3JzL3NjbWlfaWlvLmMKPiA+IAo+ID4gYW5kIHlvdSdsbCBzZWUgdGhhdCB0aGVz ZSAyIGRyaXZlcnMgdXNlcyB0aGUgc2FtZSBTRU5TT1IgcHJvdG9jb2wsIGp1c3QgZm9yCj4gPiBk aWZmZXJlbnQgc2Vuc29yIHR5cGVzIHNvIHRoZXkgZG8gbm90IGludGVyZmVyZSBvbmUgd2l0aCBl YWNoIG90aGVyLgo+IAo+IFRoZW4sIGhvdyBhcmUgdGhvc2UgdHdvIGRldmljZXMgaWRlbnRpZmll ZCBpbiBhIGRldmljZSB0cmVlPwoKQXQgU0NNSSBwcm9iZSB0aW1lIHRoZSBTQ01JIGNvcmUgc3Rh Y2sgY3JlYXRlcyBvbmUgZGV2aWNlIGZvciBlYWNoCidwcm90b2NvbF9pZC9uYW1lJyBhcyBwcm92 aWRlZCBieSB0aGUgcmVnaXN0ZXJlZCBTQ01JIGRyaXZlcnMgaW4KdGhlaXIgcmVzcGVjdGl2ZSBz Y21pX2RldmljZV9pZC9pZF90YWJsZVMsIGFzIGxvbmcgYXMgdGhlIHJlcXVlc3RlZApwcm90b2Nv bCBpcyBhY3RpdmUgaW4gdGhlIERUIChwcm90b2NvbEBYWCBkZWZpbmVkKSBhbmQgdGhlICduYW1l JwppcyBub3QgZHVwbGljYXRlZDsgZWFjaCBvZiB0aGVzZSBkZXZpY2VzLCBzaGFyaW5nIHRoZSBz YW1lIFNDTUkKcHJvdG9jb2wsIGFyZSBjcmVhdGVkIHNoYXJpbmcgYWxzbyB0aGUgc2FtZSBEVCBu b2RlIHByb3RvY29sQFhYLgoKVGhlaXIgcmVzcGVjdGl2ZSBTQ01JIGRyaXZlcnMgYXJlIHN1YnNl cXVlbnRseSBzZXBhcmF0ZWx5IG1hdGNoZWQgb24KcHJvdG9jb2xfaWQvbmFtZSBhbmQgdGhlbiBw cm9iZWQgYXMgdXN1YWw6IGl0IGlzIHVwIHRvIHRoZSBkcml2ZXJzIG5vdAp0byBzdGVwIG9uIGVh Y2ggb3RoZXIgZmVldCBieSBjb21wZXRpbmcgZm9yIHRoZSBzYW1lIFNDTUkgcmVzb3VyY2VzLi4u Ci4uLmxpa2UgaXNzdWluZyBjb21mbGljdGluZyByZXF1ZXN0IGZvciB0aGUgc2FtZSByZW9zdXJj ZSBkb21haW4Kb24gdGhlIHNhbWUgcHJvdG9jb2wuCgpJIHN1cHBvc2UsIHRob3VnaCwgYSBsb3Qg ZGVwZW5kcyBvbiBob3cgdGhlIHJlc3BlY3RpdmUgZHJpdmVycyBpbnRlcmFjdAp3aXRoIHRoZWly IHN1YnN5c3RlbXMsIGxpa2UgSUlPIFNDTUkgZG9lcyBub3QgcmVhbGx5IG5lZWQgYW55IGluZm8K ZnJvbSBEVCwgYW5kIHRoZSBod21vbiB1c2VzIGp1c3QgdGhlIHBoYW5kbGUgdG8gcGljayB0aGUg c2Vuc29yX2RvbWFpbl9pZAp0byBhc3NvY2lhdGUsIGFzIGFuIGV4YW1wbGUsIHRvIHRoZXJtYWwg c2Vuc29ycy4KCj4gVGhhdCBpcyB0aGUgcG9pbnQgaW4gUGVuZydzIGNhc2UgYW5kIHdoeSBoZSB3 YW50cyB0byBoYXZlIGEgZGVkaWNhdGVkCj4gcHJvdG9jb2wgaWQgKEkgZG9uJ3QgYWdyZWUgdG8g dGhpcywgdGhvdWdoLikKPiBJZiB3ZSBmb2xsb3cgQ3Jpc3RpYW4ncyBpZGVhLCB3ZSBtYXkgd2Fu dCB0byBoYXZlIHR3byBkdCBub2Rlcywgc2F5Cj4gcGluY3RybC1zY21pLWdlbmVyaWMgYW5kIHBp bmN0cmwtc2NtaS1pbXgsIGFzIHBoYW5kbGVzIGZvciBvdGhlciBkZXZpY2UKPiBub2RlcyB0byBy ZWZlciB0byBwaW5zLCByZXNwZWN0aXZlbHkuCj4gSSB0aGluayB0aGVyZSBpcyBjdXJyZW50bHkg bm8gbWVjaGFuaXNtIChvciBiaW5kaW5nPykgdG8gYWxsb3cgdGhpcwo+IGV4Y2VwdCBhZGRpbmcg YSBwcm90b2NvbCBpZC4KPgoKQmVzaWRlIHRoZSB1Z2x5bmVzcyBvZiBoYXZpbmcgMiBkaWZmZXJl bnQgRFQgYmluZGluZ3Mgc2NoZW1hcyBmb3IgMgpkaWZmZXJlbnQgZHJpdmVycyBjb2V4aXN0aW5n IGluIHRoZSBzYW1lIHBhcmVudCBwcm90b2NvbCBub2RlLCBpdCBpcwpzdGlsbCBub3QgY2xlYXIg dG8gbWUgd2h5IHRoaXMgY2FudCBiZSBkb25lIHRlY2huaWNhbGx5IHdpdGhvdXQgdGhlIG5lZWQK b2YgYSBuZXcgZHVtbXkgMHg5OSBwcm90b2NvbF9ub2RlLCBnaXZlbiB0aGF0IGVhY2ggZHJpdmVy IGNhbiB1c2UgaXRzCm93biBwYXJzaW5nIGxvZ2ljIGluIGl0cyBwcm9iZSwgd2hpY2ggaXMgd2hh dCBQZW5nIGlzIGRvaW5nIGluCmR0X25vZGVfdG9fbWFwIGluZGVlZCAuLi5ldmVuIHRob3VnaCwg bWF5YmUsIHRoZSByZXN1bHQgd291bGQgYmUgc28KdWdseSBhbmQvb3Igbm90IGFjY2VwYXRibGUg ZnJvbSBiaW5kaW5ncyBwb2ludCBvZiB2aWV3IHRoYXQgd2Ugd2lsbApub3Qgd2FudCB0byBkbyBp dCBhdCB0aGUgZW5kIGFueXdheS4uLi5JIG1lYW4gbWF5YmUgaXQgaXMganVzdCB0aGUKYXR0ZW1w dCBpdHNlbGYgdG8gY29tYmluZSB0aGUgR2VuZXJpYyBQaW5jdHJsIGFwcHJvYWNoIHdpdGggdGhl IGhpZ2hseQpzcGVjaWZpYyBJTVggYXBwcm9hY2ggdGhhdCBpbmV2aXRhYmx5IGxlYWRzIHRvIHRo ZXNlIGNsYXNoZXMuLi4KCi4uLkkgbWF5YmUgbWlzc2luZyBzb21ldGhpbmcsIHRob3VnaCwgc28g SSdsbCBtYWRlIHNvbWUgZXhwZXJpbWVudHMgb24KbXkgc2lkZSBhYm91dCB0aGlzIGJlZm9yZSBJ J2xsIGtlZXAgb24gYmxhYmJpbmcgOlAKClRoYW5rcywKQ3Jpc3RpYW4KCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGlu ZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMu aW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK