From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B3B5C33C9 for ; Mon, 31 Oct 2022 17:23:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4E816C433C1; Mon, 31 Oct 2022 17:23:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667236998; bh=R5DVql+ggtn4spylZiV/KEob6XtjcloHdtXG617w3S8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=LY2n3DiLmp5FpjF/ZWTuAay1igYQyimZp4RSW7KX4LHXCBX+bE3gyaJ93hIiAUugZ yyj7LfXFy7ucXXelA1iqMZTumMfgPKvSlzmLqREirYlMPNFa3TDxXQxRbXGV5cydX+ Nrt21BHpWwjGSwkiRGQdy1qtwBQ6pGeY0tu//ma7KdH98UbEzu0qrB0w+ERszWZXaO 8AlacUyb8Vfe90EfVnMwVbT40CFVGmbfcZr1NhQgOkbnprlhRLVxJuG+ggv1U4uFBk H8IQCfwyIgRSo42Q698k24cyvoOOffEe86JWyOjpW/sTHBQhsI0XgFyNj5u+Mjq0gp TRhupDMkiJXYw== Date: Mon, 31 Oct 2022 17:23:12 +0000 From: Lee Jones To: Hector Martin Cc: Russell King , Arnd Bergmann , Linus Walleij , Alyssa Rosenzweig , asahi@lists.linux.dev, Bartosz Golaszewski , linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org, Sven Peter Subject: Re: [PATCH 4/6] platform/apple: Add new Apple Mac SMC driver Message-ID: References: <8f30a490-f970-6605-20cb-c2256daab9de@marcan.st> <82088b05-2a0d-69cc-ba2c-d61c74c9d855@marcan.st> <4faa5e4c-b43b-12e4-2259-c2595bd55b97@marcan.st> Precedence: bulk X-Mailing-List: asahi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4faa5e4c-b43b-12e4-2259-c2595bd55b97@marcan.st> On Mon, 31 Oct 2022, Hector Martin wrote: > On 31/10/2022 18.29, Lee Jones wrote: > > On Mon, 31 Oct 2022, Hector Martin wrote: > > > >> On 31/10/2022 17.48, Lee Jones wrote: > >>> On Sat, 29 Oct 2022, Hector Martin wrote: > >>> > >>>> On 09/09/2022 16.50, Lee Jones wrote: > >>>>>> What's the point of just having effectively an array of mfd_cell and > >>>>>> wrappers to call into the mfd core in the drivers/mfd/ tree and the > >>>>>> rest of the driver elsewhere? > >>>>> > >>>>> They should be separate drivers, with MFD registering the Platform. > >>>> > >>>> Why? What purpose does this serve? I'm still confused. There's one > >>>> parent device, which provides services to the child devices. There isn't > >>>> one parent device which wraps a platform service which is used by > >>>> children. This makes no sense. The platform device is the root, if it > >>>> exposes MFD services, then it has to be in that direction, not the other > >>>> way around. > >>>> > >>>> Look at how this patch series is architected. There is smc_core.c, which > >>>> implements SMC helpers and wrappers on top of a generic backend, and > >>>> registers with the MFD subsystem. And then there is smc_rtkit.c which is > >>>> the actual platform implementation on top of the RTKit framework, and is > >>>> the actual platform device entry point. > >>>> > >>>> A priori, the only thing that makes sense to me right now would be to > >>>> move smc_core.c into drivers/mfd, and leave smc_rtkit.c in platform. > >>>> That way the mfd registration would be in drivers/mfd (as would be the > >>>> services offered to sub-drivers), but the actual backend implementation > >>>> would be in platform/ (and there would eventually be others, e.g. at > >>>> least two more for x86 systems). That does mean that the driver entry > >>>> point will be in platform/, with mfd/smc_core.c serving as effectively > >>>> library code to plumb in the mfd stuff into one of several possible > >>>> platform devices. Would that work for you? > >>> > >>> Yes, sounds sensible. However, keep all of the abstraction craziness > >>> somewhere else and fetch and share all of your shared resources from > >>> the MFD (SMC) driver. > >> > >> I'm not sure what you mean by that. The abstraction (smc_core.c) *is* > >> the shared resource. All it does is wrap ops callbacks with a mutex and > >> add a couple helpers for finding keys. Do you literally want us to just > >> have this in drivers/mfd? > >> > >> // SPDX-License-Identifier: GPL-2.0-only OR MIT > >> /* > >> * Apple SMC MFD wrapper > >> * Copyright The Asahi Linux Contributors > >> */ > >> > >> #include > >> #include "smc.h" > >> > >> static const struct mfd_cell apple_smc_devs[] = { > >> { > >> .name = "macsmc-gpio", > >> }, > >> { > >> .name = "macsmc-hid", > >> }, > >> { > >> .name = "macsmc-power", > >> }, > >> { > >> .name = "macsmc-reboot", > >> }, > >> { > >> .name = "macsmc-rtc", > >> }, > >> }; > >> > >> int apple_smc_add_mfd_devices(struct device *dev) > >> { > >> ret = mfd_add_devices(dev, -1, apple_smc_devs, > >> ARRAY_SIZE(apple_smc_devs), NULL, 0, NULL); > >> if (ret) > >> return dev_err_probe(dev, ret, "Subdevice initialization failed"); > >> > >> return 0; > >> } > >> EXPORT_SYMBOL(apple_smc_add_mfd_devices); > >> > >> int apple_smc_remove_mfd_devices(struct device *dev) > >> { > >> mfd_remove_devices(smc->dev); > >> > >> return 0; > >> } > >> EXPORT_SYMBOL(apple_smc_add_mfd_devices); > >> > >> MODULE_AUTHOR("Hector Martin "); > >> MODULE_LICENSE("Dual MIT/GPL"); > >> MODULE_DESCRIPTION("Apple SMC MFD wrapper"); > >> > >> Because this feels *immensely* silly and pointless. > > > > ... and hacky. I agree. > > > > [BTW: if this is all you want to do, have you considered simple-mfd?] > > > > No, I want you to author a proper MFD device. > > You don't seem to understand how MFD devices actually map to the > hardware we're working with here. Via an abstracted message passing API and a little shared memory? The former eventually ending up in the MBOX API? > > The hardware you're describing in this submission *is* an MFD. So use > > the subsystem properly, instead of abusing it as a shim API to simply > > register platform devices. > > *sigh* the hardware I'm describing is a *class* of MFD devices. They all > work the same way as far as the sub-devices see, but operate on > completely different hardware backends. That's common. Usually we're using talking; SPI, I2C, USB and MMIO, but a bespoke message passing API is not out of the realms of normal. > If you do not want "gooey > platform stuff" in drivers/mfd, then it *has* to be a dumb shim. > > You have 3 options: > > - We move everything into drivers/mfd, which means there will > (eventually) be 3 backend modules binding to real hardware devices and > one shared core which actually does the MFD registration and provides > common services. Moving everything isn't an option. A split would be the most reasonable approach. We just need to decide on which parts should reside on which side of the MFD / Platform boundary. > - We move just the core into drivers/mfd, which means the device binding > will happen elsewhere, and the only code in the MFD subsystem will be > common code and will be called as a library (via module exports, not via > device binding). What are you describing as 'the core' here? And which device binding are you alluding to? Sub-device registration or something else? > - We give up and just have a dumb shim in drivers/mfd as above, because > you don't want to work with us. If I wasn't willing to work with you, who are you conversing with? Side-note: Tweeting derogatory comments about the people who have volunteered to take valuable time out of their day to help you, is no good way to encourage people to "work with you"! Most, if not all of us do this willingly and with no additional benefit, purely to help others. Seeing such horrid things spread widely, is a guaranteed way to spoil someone's day. > Either you work with how our hardware works or we go with this dumb shim > workaround. It sounds like you have this the wrong way around. Linux and its associated subsystems aren't going to bend and flex around your design decisions. You need to apply a little flexibility and work with us to find something that'll work for everyone. > You seem to want us to simultaneously "author a proper MFD > device" and "not put platform stuff in MFD". We can't do both at the > same time. Either the code is here or it is elsewhere. Of course you can. Just like everyone else does. After taking quite a bit of time out of my day to look at this today, I can see that your RTKit initialisation implementation is actually much more suited to MFD than the SMC wrappers. One thing that I'm still a little unsure about is future the hierarchy and layering of all these drivers. Which is it you say can / will be swapped out for different methods of initialisation? I see that you pass a bunch of function pointers from the RTKit implementation into the SMC. Which in turn offers an exported (apple_smc_*) API. In most of the frameworks I have knowledge of, the core provides the Ops structure and it's populated by the client device. I'm sure having that clear in my head will go some ways to put me in a position to advise you further. > > Request the device-wide memory (and other shared resources) here. > > That's what smc_rtkit.c does, but you seem not to want that code in mfd. I'm not sure I explicitly said that. > > Conduct core operations and initialisation here > > The RTKit library is in charge of core RTKit initialization, smc_rtkit > is in charge of SMC-specific initialization, and smc_core.c is in charge > of core SMC operations and initialization. What, exactly, do you want to > move into drivers/mfd? (hint: not the RTKit library, that is shared by > many other drivers). > > > then call into your Platform and other child devices to initiate the real work. > > There is nothing to call into, the child devices will bind and call > *back* into the SMC core to do their job. "call into" was not a good choice of words here. Simply, let the child devices go about their business and do whatever they were designed to do. -- Lee Jones [李琼斯] 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 56EFCECAAA1 for ; Mon, 31 Oct 2022 17:24:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ZeRRLopEMtfn3z8J42z0DyMz7QDQW64sOwMCyuZst3A=; b=fVzl2va4QGiJ18 AKIVc7e0NZEVzSzrh6uGAlXAQlRVvOqktdzVnRW1zWC8UmdXFV3FSInYU/aUDvgqH9XtL1kicepht 2k3yaFslLpLTrO6mPnd+ohMpiupKT6f59aum+rIqEdcRowCZEetrCFzKgDW5mXLRmHQmfAfLmsqJE oib0RnBIG4XjyleSa6LznfLndxTbN2pvskbedvCBnqT5h6QWFj232xY3QZoX00Vtkt0UouEd6XYLK 9pnwyf9SGXp+llvH0L2BBCKBouMT0XvZ+MQpZiGqaa4ZWjM7KJOx6If741cUAqr5E23SqsfDAi+zl OXEsZfRMoHqRm5l+HKLg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1opYVO-00DLPS-BN; Mon, 31 Oct 2022 17:23:22 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1opYVL-00DLOO-KJ for linux-arm-kernel@lists.infradead.org; Mon, 31 Oct 2022 17:23:21 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id E2D0861316; Mon, 31 Oct 2022 17:23:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4E816C433C1; Mon, 31 Oct 2022 17:23:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667236998; bh=R5DVql+ggtn4spylZiV/KEob6XtjcloHdtXG617w3S8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=LY2n3DiLmp5FpjF/ZWTuAay1igYQyimZp4RSW7KX4LHXCBX+bE3gyaJ93hIiAUugZ yyj7LfXFy7ucXXelA1iqMZTumMfgPKvSlzmLqREirYlMPNFa3TDxXQxRbXGV5cydX+ Nrt21BHpWwjGSwkiRGQdy1qtwBQ6pGeY0tu//ma7KdH98UbEzu0qrB0w+ERszWZXaO 8AlacUyb8Vfe90EfVnMwVbT40CFVGmbfcZr1NhQgOkbnprlhRLVxJuG+ggv1U4uFBk H8IQCfwyIgRSo42Q698k24cyvoOOffEe86JWyOjpW/sTHBQhsI0XgFyNj5u+Mjq0gp TRhupDMkiJXYw== Date: Mon, 31 Oct 2022 17:23:12 +0000 From: Lee Jones To: Hector Martin Cc: Russell King , Arnd Bergmann , Linus Walleij , Alyssa Rosenzweig , asahi@lists.linux.dev, Bartosz Golaszewski , linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org, Sven Peter Subject: Re: [PATCH 4/6] platform/apple: Add new Apple Mac SMC driver Message-ID: References: <8f30a490-f970-6605-20cb-c2256daab9de@marcan.st> <82088b05-2a0d-69cc-ba2c-d61c74c9d855@marcan.st> <4faa5e4c-b43b-12e4-2259-c2595bd55b97@marcan.st> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <4faa5e4c-b43b-12e4-2259-c2595bd55b97@marcan.st> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221031_102319_772448_ADDA18F5 X-CRM114-Status: GOOD ( 54.63 ) 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 T24gTW9uLCAzMSBPY3QgMjAyMiwgSGVjdG9yIE1hcnRpbiB3cm90ZToKCj4gT24gMzEvMTAvMjAy MiAxOC4yOSwgTGVlIEpvbmVzIHdyb3RlOgo+ID4gT24gTW9uLCAzMSBPY3QgMjAyMiwgSGVjdG9y IE1hcnRpbiB3cm90ZToKPiA+IAo+ID4+IE9uIDMxLzEwLzIwMjIgMTcuNDgsIExlZSBKb25lcyB3 cm90ZToKPiA+Pj4gT24gU2F0LCAyOSBPY3QgMjAyMiwgSGVjdG9yIE1hcnRpbiB3cm90ZToKPiA+ Pj4KPiA+Pj4+IE9uIDA5LzA5LzIwMjIgMTYuNTAsIExlZSBKb25lcyB3cm90ZToKPiA+Pj4+Pj4g V2hhdCdzIHRoZSBwb2ludCBvZiBqdXN0IGhhdmluZyBlZmZlY3RpdmVseSBhbiBhcnJheSBvZiBt ZmRfY2VsbCBhbmQKPiA+Pj4+Pj4gd3JhcHBlcnMgdG8gY2FsbCBpbnRvIHRoZSBtZmQgY29yZSBp biB0aGUgZHJpdmVycy9tZmQvIHRyZWUgYW5kIHRoZQo+ID4+Pj4+PiByZXN0IG9mIHRoZSBkcml2 ZXIgZWxzZXdoZXJlPwo+ID4+Pj4+Cj4gPj4+Pj4gVGhleSBzaG91bGQgYmUgc2VwYXJhdGUgZHJp dmVycywgd2l0aCBNRkQgcmVnaXN0ZXJpbmcgdGhlIFBsYXRmb3JtLgo+ID4+Pj4KPiA+Pj4+IFdo eT8gV2hhdCBwdXJwb3NlIGRvZXMgdGhpcyBzZXJ2ZT8gSSdtIHN0aWxsIGNvbmZ1c2VkLiBUaGVy ZSdzIG9uZQo+ID4+Pj4gcGFyZW50IGRldmljZSwgd2hpY2ggcHJvdmlkZXMgc2VydmljZXMgdG8g dGhlIGNoaWxkIGRldmljZXMuIFRoZXJlIGlzbid0Cj4gPj4+PiBvbmUgcGFyZW50IGRldmljZSB3 aGljaCB3cmFwcyBhIHBsYXRmb3JtIHNlcnZpY2Ugd2hpY2ggaXMgdXNlZCBieQo+ID4+Pj4gY2hp bGRyZW4uIFRoaXMgbWFrZXMgbm8gc2Vuc2UuIFRoZSBwbGF0Zm9ybSBkZXZpY2UgaXMgdGhlIHJv b3QsIGlmIGl0Cj4gPj4+PiBleHBvc2VzIE1GRCBzZXJ2aWNlcywgdGhlbiBpdCBoYXMgdG8gYmUg aW4gdGhhdCBkaXJlY3Rpb24sIG5vdCB0aGUgb3RoZXIKPiA+Pj4+IHdheSBhcm91bmQuCj4gPj4+ Pgo+ID4+Pj4gTG9vayBhdCBob3cgdGhpcyBwYXRjaCBzZXJpZXMgaXMgYXJjaGl0ZWN0ZWQuIFRo ZXJlIGlzIHNtY19jb3JlLmMsIHdoaWNoCj4gPj4+PiBpbXBsZW1lbnRzIFNNQyBoZWxwZXJzIGFu ZCB3cmFwcGVycyBvbiB0b3Agb2YgYSBnZW5lcmljIGJhY2tlbmQsIGFuZAo+ID4+Pj4gcmVnaXN0 ZXJzIHdpdGggdGhlIE1GRCBzdWJzeXN0ZW0uIEFuZCB0aGVuIHRoZXJlIGlzIHNtY19ydGtpdC5j IHdoaWNoIGlzCj4gPj4+PiB0aGUgYWN0dWFsIHBsYXRmb3JtIGltcGxlbWVudGF0aW9uIG9uIHRv cCBvZiB0aGUgUlRLaXQgZnJhbWV3b3JrLCBhbmQgaXMKPiA+Pj4+IHRoZSBhY3R1YWwgcGxhdGZv cm0gZGV2aWNlIGVudHJ5IHBvaW50Lgo+ID4+Pj4KPiA+Pj4+IEEgcHJpb3JpLCB0aGUgb25seSB0 aGluZyB0aGF0IG1ha2VzIHNlbnNlIHRvIG1lIHJpZ2h0IG5vdyB3b3VsZCBiZSB0bwo+ID4+Pj4g bW92ZSBzbWNfY29yZS5jIGludG8gZHJpdmVycy9tZmQsIGFuZCBsZWF2ZSBzbWNfcnRraXQuYyBp biBwbGF0Zm9ybS4KPiA+Pj4+IFRoYXQgd2F5IHRoZSBtZmQgcmVnaXN0cmF0aW9uIHdvdWxkIGJl IGluIGRyaXZlcnMvbWZkIChhcyB3b3VsZCBiZSB0aGUKPiA+Pj4+IHNlcnZpY2VzIG9mZmVyZWQg dG8gc3ViLWRyaXZlcnMpLCBidXQgdGhlIGFjdHVhbCBiYWNrZW5kIGltcGxlbWVudGF0aW9uCj4g Pj4+PiB3b3VsZCBiZSBpbiBwbGF0Zm9ybS8gKGFuZCB0aGVyZSB3b3VsZCBldmVudHVhbGx5IGJl IG90aGVycywgZS5nLiBhdAo+ID4+Pj4gbGVhc3QgdHdvIG1vcmUgZm9yIHg4NiBzeXN0ZW1zKS4g VGhhdCBkb2VzIG1lYW4gdGhhdCB0aGUgZHJpdmVyIGVudHJ5Cj4gPj4+PiBwb2ludCB3aWxsIGJl IGluIHBsYXRmb3JtLywgd2l0aCBtZmQvc21jX2NvcmUuYyBzZXJ2aW5nIGFzIGVmZmVjdGl2ZWx5 Cj4gPj4+PiBsaWJyYXJ5IGNvZGUgdG8gcGx1bWIgaW4gdGhlIG1mZCBzdHVmZiBpbnRvIG9uZSBv ZiBzZXZlcmFsIHBvc3NpYmxlCj4gPj4+PiBwbGF0Zm9ybSBkZXZpY2VzLiBXb3VsZCB0aGF0IHdv cmsgZm9yIHlvdT8KPiA+Pj4KPiA+Pj4gWWVzLCBzb3VuZHMgc2Vuc2libGUuICBIb3dldmVyLCBr ZWVwIGFsbCBvZiB0aGUgYWJzdHJhY3Rpb24gY3JhemluZXNzCj4gPj4+IHNvbWV3aGVyZSBlbHNl IGFuZCBmZXRjaCBhbmQgc2hhcmUgYWxsIG9mIHlvdXIgc2hhcmVkIHJlc291cmNlcyBmcm9tCj4g Pj4+IHRoZSBNRkQgKFNNQykgZHJpdmVyLgo+ID4+Cj4gPj4gSSdtIG5vdCBzdXJlIHdoYXQgeW91 IG1lYW4gYnkgdGhhdC4gVGhlIGFic3RyYWN0aW9uIChzbWNfY29yZS5jKSAqaXMqCj4gPj4gdGhl IHNoYXJlZCByZXNvdXJjZS4gQWxsIGl0IGRvZXMgaXMgd3JhcCBvcHMgY2FsbGJhY2tzIHdpdGgg YSBtdXRleCBhbmQKPiA+PiBhZGQgYSBjb3VwbGUgaGVscGVycyBmb3IgZmluZGluZyBrZXlzLiBE byB5b3UgbGl0ZXJhbGx5IHdhbnQgdXMgdG8ganVzdAo+ID4+IGhhdmUgdGhpcyBpbiBkcml2ZXJz L21mZD8KPiA+Pgo+ID4+IC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkg T1IgTUlUCj4gPj4gLyoKPiA+PiAgKiBBcHBsZSBTTUMgTUZEIHdyYXBwZXIKPiA+PiAgKiBDb3B5 cmlnaHQgVGhlIEFzYWhpIExpbnV4IENvbnRyaWJ1dG9ycwo+ID4+ICAqLwo+ID4+Cj4gPj4gI2lu Y2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+ID4+ICNpbmNsdWRlICJzbWMuaCIKPiA+Pgo+ID4+IHN0 YXRpYyBjb25zdCBzdHJ1Y3QgbWZkX2NlbGwgYXBwbGVfc21jX2RldnNbXSA9IHsKPiA+PiAJewo+ ID4+IAkJLm5hbWUgPSAibWFjc21jLWdwaW8iLAo+ID4+IAl9LAo+ID4+IAl7Cj4gPj4gCQkubmFt ZSA9ICJtYWNzbWMtaGlkIiwKPiA+PiAJfSwKPiA+PiAJewo+ID4+IAkJLm5hbWUgPSAibWFjc21j LXBvd2VyIiwKPiA+PiAJfSwKPiA+PiAJewo+ID4+IAkJLm5hbWUgPSAibWFjc21jLXJlYm9vdCIs Cj4gPj4gCX0sCj4gPj4gCXsKPiA+PiAJCS5uYW1lID0gIm1hY3NtYy1ydGMiLAo+ID4+IAl9LAo+ ID4+IH07Cj4gPj4KPiA+PiBpbnQgYXBwbGVfc21jX2FkZF9tZmRfZGV2aWNlcyhzdHJ1Y3QgZGV2 aWNlICpkZXYpCj4gPj4gewo+ID4+IAlyZXQgPSBtZmRfYWRkX2RldmljZXMoZGV2LCAtMSwgYXBw bGVfc21jX2RldnMsCj4gPj4gQVJSQVlfU0laRShhcHBsZV9zbWNfZGV2cyksIE5VTEwsIDAsIE5V TEwpOwo+ID4+IAlpZiAocmV0KQo+ID4+IAkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCByZXQs ICJTdWJkZXZpY2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7Cj4gPj4KPiA+PiAJcmV0dXJuIDA7 Cj4gPj4gfQo+ID4+IEVYUE9SVF9TWU1CT0woYXBwbGVfc21jX2FkZF9tZmRfZGV2aWNlcyk7Cj4g Pj4KPiA+PiBpbnQgYXBwbGVfc21jX3JlbW92ZV9tZmRfZGV2aWNlcyhzdHJ1Y3QgZGV2aWNlICpk ZXYpCj4gPj4gewo+ID4+IAltZmRfcmVtb3ZlX2RldmljZXMoc21jLT5kZXYpOwo+ID4+Cj4gPj4g CXJldHVybiAwOwo+ID4+IH0KPiA+PiBFWFBPUlRfU1lNQk9MKGFwcGxlX3NtY19hZGRfbWZkX2Rl dmljZXMpOwo+ID4+Cj4gPj4gTU9EVUxFX0FVVEhPUigiSGVjdG9yIE1hcnRpbiA8bWFyY2FuQG1h cmNhbi5zdD4iKTsKPiA+PiBNT0RVTEVfTElDRU5TRSgiRHVhbCBNSVQvR1BMIik7Cj4gPj4gTU9E VUxFX0RFU0NSSVBUSU9OKCJBcHBsZSBTTUMgTUZEIHdyYXBwZXIiKTsKPiA+Pgo+ID4+IEJlY2F1 c2UgdGhpcyBmZWVscyAqaW1tZW5zZWx5KiBzaWxseSBhbmQgcG9pbnRsZXNzLgo+ID4gCj4gPiAu Li4gYW5kIGhhY2t5LiAgSSBhZ3JlZS4KPiA+IAo+ID4gW0JUVzogaWYgdGhpcyBpcyBhbGwgeW91 IHdhbnQgdG8gZG8sIGhhdmUgeW91IGNvbnNpZGVyZWQgc2ltcGxlLW1mZD9dCj4gPiAKPiA+IE5v LCBJIHdhbnQgeW91IHRvIGF1dGhvciBhIHByb3BlciBNRkQgZGV2aWNlLgo+IAo+IFlvdSBkb24n dCBzZWVtIHRvIHVuZGVyc3RhbmQgaG93IE1GRCBkZXZpY2VzIGFjdHVhbGx5IG1hcCB0byB0aGUK PiBoYXJkd2FyZSB3ZSdyZSB3b3JraW5nIHdpdGggaGVyZS4KClZpYSBhbiBhYnN0cmFjdGVkIG1l c3NhZ2UgcGFzc2luZyBBUEkgYW5kIGEgbGl0dGxlIHNoYXJlZCBtZW1vcnk/CgpUaGUgZm9ybWVy IGV2ZW50dWFsbHkgZW5kaW5nIHVwIGluIHRoZSBNQk9YIEFQST8KCj4gPiBUaGUgaGFyZHdhcmUg eW91J3JlIGRlc2NyaWJpbmcgaW4gdGhpcyBzdWJtaXNzaW9uICppcyogYW4gTUZELiAgU28gdXNl Cj4gPiB0aGUgc3Vic3lzdGVtIHByb3Blcmx5LCBpbnN0ZWFkIG9mIGFidXNpbmcgaXQgYXMgYSBz aGltIEFQSSB0byBzaW1wbHkKPiA+IHJlZ2lzdGVyIHBsYXRmb3JtIGRldmljZXMuCj4gCj4gKnNp Z2gqIHRoZSBoYXJkd2FyZSBJJ20gZGVzY3JpYmluZyBpcyBhICpjbGFzcyogb2YgTUZEIGRldmlj ZXMuIFRoZXkgYWxsCj4gd29yayB0aGUgc2FtZSB3YXkgYXMgZmFyIGFzIHRoZSBzdWItZGV2aWNl cyBzZWUsIGJ1dCBvcGVyYXRlIG9uCj4gY29tcGxldGVseSBkaWZmZXJlbnQgaGFyZHdhcmUgYmFj a2VuZHMuCgpUaGF0J3MgY29tbW9uLiAgVXN1YWxseSB3ZSdyZSB1c2luZyB0YWxraW5nOyBTUEks IEkyQywgVVNCIGFuZCBNTUlPLApidXQgYSBiZXNwb2tlIG1lc3NhZ2UgcGFzc2luZyBBUEkgaXMg bm90IG91dCBvZiB0aGUgcmVhbG1zIG9mIG5vcm1hbC4KCj4gSWYgeW91IGRvIG5vdCB3YW50ICJn b29leQo+IHBsYXRmb3JtIHN0dWZmIiBpbiBkcml2ZXJzL21mZCwgdGhlbiBpdCAqaGFzKiB0byBi ZSBhIGR1bWIgc2hpbS4KPiAKPiBZb3UgaGF2ZSAzIG9wdGlvbnM6Cj4gCj4gLSBXZSBtb3ZlIGV2 ZXJ5dGhpbmcgaW50byBkcml2ZXJzL21mZCwgd2hpY2ggbWVhbnMgdGhlcmUgd2lsbAo+IChldmVu dHVhbGx5KSBiZSAzIGJhY2tlbmQgbW9kdWxlcyBiaW5kaW5nIHRvIHJlYWwgaGFyZHdhcmUgZGV2 aWNlcyBhbmQKPiBvbmUgc2hhcmVkIGNvcmUgd2hpY2ggYWN0dWFsbHkgZG9lcyB0aGUgTUZEIHJl Z2lzdHJhdGlvbiBhbmQgcHJvdmlkZXMKPiBjb21tb24gc2VydmljZXMuCgpNb3ZpbmcgZXZlcnl0 aGluZyBpc24ndCBhbiBvcHRpb24uICBBIHNwbGl0IHdvdWxkIGJlIHRoZSBtb3N0CnJlYXNvbmFi bGUgYXBwcm9hY2guICBXZSBqdXN0IG5lZWQgdG8gZGVjaWRlIG9uIHdoaWNoIHBhcnRzIHNob3Vs ZApyZXNpZGUgb24gd2hpY2ggc2lkZSBvZiB0aGUgTUZEIC8gUGxhdGZvcm0gYm91bmRhcnkuCgo+ IC0gV2UgbW92ZSBqdXN0IHRoZSBjb3JlIGludG8gZHJpdmVycy9tZmQsIHdoaWNoIG1lYW5zIHRo ZSBkZXZpY2UgYmluZGluZwo+IHdpbGwgaGFwcGVuIGVsc2V3aGVyZSwgYW5kIHRoZSBvbmx5IGNv ZGUgaW4gdGhlIE1GRCBzdWJzeXN0ZW0gd2lsbCBiZQo+IGNvbW1vbiBjb2RlIGFuZCB3aWxsIGJl IGNhbGxlZCBhcyBhIGxpYnJhcnkgKHZpYSBtb2R1bGUgZXhwb3J0cywgbm90IHZpYQo+IGRldmlj ZSBiaW5kaW5nKS4KCldoYXQgYXJlIHlvdSBkZXNjcmliaW5nIGFzICd0aGUgY29yZScgaGVyZT8g IEFuZCB3aGljaCBkZXZpY2UgYmluZGluZwphcmUgeW91IGFsbHVkaW5nIHRvPyAgU3ViLWRldmlj ZSByZWdpc3RyYXRpb24gb3Igc29tZXRoaW5nIGVsc2U/Cgo+IC0gV2UgZ2l2ZSB1cCBhbmQganVz dCBoYXZlIGEgZHVtYiBzaGltIGluIGRyaXZlcnMvbWZkIGFzIGFib3ZlLCBiZWNhdXNlCj4geW91 IGRvbid0IHdhbnQgdG8gd29yayB3aXRoIHVzLgoKSWYgSSB3YXNuJ3Qgd2lsbGluZyB0byB3b3Jr IHdpdGggeW91LCB3aG8gYXJlIHlvdSBjb252ZXJzaW5nIHdpdGg/CgpTaWRlLW5vdGU6IFR3ZWV0 aW5nIGRlcm9nYXRvcnkgY29tbWVudHMgYWJvdXQgdGhlIHBlb3BsZSB3aG8gaGF2ZQogICAgICAg ICAgIHZvbHVudGVlcmVkIHRvIHRha2UgdmFsdWFibGUgdGltZSBvdXQgb2YgdGhlaXIgZGF5IHRv IGhlbHAKCSAgIHlvdSwgaXMgbm8gZ29vZCB3YXkgdG8gZW5jb3VyYWdlIHBlb3BsZSB0byAid29y ayB3aXRoIHlvdSIhCgoJICAgTW9zdCwgaWYgbm90IGFsbCBvZiB1cyBkbyB0aGlzIHdpbGxpbmds eSBhbmQgd2l0aCBubwoJICAgYWRkaXRpb25hbCBiZW5lZml0LCBwdXJlbHkgdG8gaGVscCBvdGhl cnMuICBTZWVpbmcgc3VjaAoJICAgaG9ycmlkIHRoaW5ncyBzcHJlYWQgd2lkZWx5LCBpcyBhIGd1 YXJhbnRlZWQgd2F5IHRvIHNwb2lsCgkgICBzb21lb25lJ3MgZGF5LgoKPiBFaXRoZXIgeW91IHdv cmsgd2l0aCBob3cgb3VyIGhhcmR3YXJlIHdvcmtzIG9yIHdlIGdvIHdpdGggdGhpcyBkdW1iIHNo aW0KPiB3b3JrYXJvdW5kLgoKSXQgc291bmRzIGxpa2UgeW91IGhhdmUgdGhpcyB0aGUgd3Jvbmcg d2F5IGFyb3VuZC4gIExpbnV4IGFuZCBpdHMKYXNzb2NpYXRlZCBzdWJzeXN0ZW1zIGFyZW4ndCBn b2luZyB0byBiZW5kIGFuZCBmbGV4IGFyb3VuZCB5b3VyIGRlc2lnbgpkZWNpc2lvbnMuICBZb3Ug bmVlZCB0byBhcHBseSBhIGxpdHRsZSBmbGV4aWJpbGl0eSBhbmQgd29yayB3aXRoIHVzIHRvCmZp bmQgc29tZXRoaW5nIHRoYXQnbGwgd29yayBmb3IgZXZlcnlvbmUuCgo+IFlvdSBzZWVtIHRvIHdh bnQgdXMgdG8gc2ltdWx0YW5lb3VzbHkgImF1dGhvciBhIHByb3BlciBNRkQKPiBkZXZpY2UiIGFu ZCAibm90IHB1dCBwbGF0Zm9ybSBzdHVmZiBpbiBNRkQiLiBXZSBjYW4ndCBkbyBib3RoIGF0IHRo ZQo+IHNhbWUgdGltZS4gRWl0aGVyIHRoZSBjb2RlIGlzIGhlcmUgb3IgaXQgaXMgZWxzZXdoZXJl LgoKT2YgY291cnNlIHlvdSBjYW4uICBKdXN0IGxpa2UgZXZlcnlvbmUgZWxzZSBkb2VzLgoKQWZ0 ZXIgdGFraW5nIHF1aXRlIGEgYml0IG9mIHRpbWUgb3V0IG9mIG15IGRheSB0byBsb29rIGF0IHRo aXMgdG9kYXksCkkgY2FuIHNlZSB0aGF0IHlvdXIgUlRLaXQgaW5pdGlhbGlzYXRpb24gaW1wbGVt ZW50YXRpb24gaXMgYWN0dWFsbHkKbXVjaCBtb3JlIHN1aXRlZCB0byBNRkQgdGhhbiB0aGUgU01D IHdyYXBwZXJzLgoKT25lIHRoaW5nIHRoYXQgSSdtIHN0aWxsIGEgbGl0dGxlIHVuc3VyZSBhYm91 dCBpcyBmdXR1cmUgdGhlIGhpZXJhcmNoeQphbmQgbGF5ZXJpbmcgb2YgYWxsIHRoZXNlIGRyaXZl cnMuICBXaGljaCBpcyBpdCB5b3Ugc2F5IGNhbiAvIHdpbGwgYmUKc3dhcHBlZCBvdXQgZm9yIGRp ZmZlcmVudCBtZXRob2RzIG9mIGluaXRpYWxpc2F0aW9uPwoKSSBzZWUgdGhhdCB5b3UgcGFzcyBh IGJ1bmNoIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGZyb20gdGhlIFJUS2l0CmltcGxlbWVudGF0aW9u IGludG8gdGhlIFNNQy4gIFdoaWNoIGluIHR1cm4gb2ZmZXJzIGFuIGV4cG9ydGVkCihhcHBsZV9z bWNfKikgQVBJLiAgSW4gbW9zdCBvZiB0aGUgZnJhbWV3b3JrcyBJIGhhdmUga25vd2xlZGdlIG9m LCB0aGUKY29yZSBwcm92aWRlcyB0aGUgT3BzIHN0cnVjdHVyZSBhbmQgaXQncyBwb3B1bGF0ZWQg YnkgdGhlIGNsaWVudApkZXZpY2UuCgpJJ20gc3VyZSBoYXZpbmcgdGhhdCBjbGVhciBpbiBteSBo ZWFkIHdpbGwgZ28gc29tZSB3YXlzIHRvIHB1dCBtZSBpbiBhCnBvc2l0aW9uIHRvIGFkdmlzZSB5 b3UgZnVydGhlci4KCj4gPiBSZXF1ZXN0IHRoZSBkZXZpY2Utd2lkZSBtZW1vcnkgKGFuZCBvdGhl ciBzaGFyZWQgcmVzb3VyY2VzKSBoZXJlLgo+IAo+IFRoYXQncyB3aGF0IHNtY19ydGtpdC5jIGRv ZXMsIGJ1dCB5b3Ugc2VlbSBub3QgdG8gd2FudCB0aGF0IGNvZGUgaW4gbWZkLgoKSSdtIG5vdCBz dXJlIEkgZXhwbGljaXRseSBzYWlkIHRoYXQuCgo+ID4gQ29uZHVjdCBjb3JlIG9wZXJhdGlvbnMg YW5kIGluaXRpYWxpc2F0aW9uIGhlcmUKPiAKPiBUaGUgUlRLaXQgbGlicmFyeSBpcyBpbiBjaGFy Z2Ugb2YgY29yZSBSVEtpdCBpbml0aWFsaXphdGlvbiwgc21jX3J0a2l0Cj4gaXMgaW4gY2hhcmdl IG9mIFNNQy1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiwgYW5kIHNtY19jb3JlLmMgaXMgaW4gY2hh cmdlCj4gb2YgY29yZSBTTUMgb3BlcmF0aW9ucyBhbmQgaW5pdGlhbGl6YXRpb24uIFdoYXQsIGV4 YWN0bHksIGRvIHlvdSB3YW50IHRvCj4gbW92ZSBpbnRvIGRyaXZlcnMvbWZkPyAoaGludDogbm90 IHRoZSBSVEtpdCBsaWJyYXJ5LCB0aGF0IGlzIHNoYXJlZCBieQo+IG1hbnkgb3RoZXIgZHJpdmVy cykuCj4gCj4gPiB0aGVuIGNhbGwgaW50byB5b3VyIFBsYXRmb3JtIGFuZCBvdGhlciBjaGlsZCBk ZXZpY2VzIHRvIGluaXRpYXRlIHRoZSByZWFsIHdvcmsuCj4gCj4gVGhlcmUgaXMgbm90aGluZyB0 byBjYWxsIGludG8sIHRoZSBjaGlsZCBkZXZpY2VzIHdpbGwgYmluZCBhbmQgY2FsbAo+ICpiYWNr KiBpbnRvIHRoZSBTTUMgY29yZSB0byBkbyB0aGVpciBqb2IuCgoiY2FsbCBpbnRvIiB3YXMgbm90 IGEgZ29vZCBjaG9pY2Ugb2Ygd29yZHMgaGVyZS4gIFNpbXBseSwgbGV0IHRoZQpjaGlsZCBkZXZp Y2VzIGdvIGFib3V0IHRoZWlyIGJ1c2luZXNzIGFuZCBkbyB3aGF0ZXZlciB0aGV5IHdlcmUKZGVz aWduZWQgdG8gZG8uCgotLSAKTGVlIEpvbmVzIFvmnY7nkLzmlq9dCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcg bGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==