From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (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 E21DA7E3 for ; Mon, 26 Dec 2022 10:06:59 +0000 (UTC) Received: from pendragon.ideasonboard.com (213-243-189-158.bb.dnainternet.fi [213.243.189.158]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1B941105; Mon, 26 Dec 2022 11:06:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1672049217; bh=fP68BnaD69pyQUOSxwZU1jHOt8kinIDfpW6cF4kE5+8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pzqlZ8FMJmusnRvf6pedjff0UKMQ/JsYlJS0x2rceaQ2shHulzNJ+ZNhkVxa0Z1zS +dYVDaAbvA3JVS5N7uzQUGwFmGTyRMAwvBta7RTVPEI9sSG1R+gJe9S5Ww/daoSLxu 0IvtTtqcOSfwFwnXpalo49UVtS6oS2ieiOJBbIBw= Date: Mon, 26 Dec 2022 12:06:53 +0200 From: Laurent Pinchart To: Greg Kroah-Hartman Cc: Stefan Wahren , Umang Jain , linux-staging@lists.linux.dev, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Florian Fainelli , Adrien Thierry , Dan Carpenter , Nicolas Saenz Julienne , Phil Elwell , Dave Stevenson , Kieran Bingham Subject: Re: [PATCH] staging: vc04_services: vchiq_arm: Create platform_device per device Message-ID: References: <20221220084404.19280-1-umang.jain@ideasonboard.com> <629b3f63-74e4-5cb5-29d1-6d2846bc24c7@i2se.com> Precedence: bulk X-Mailing-List: linux-staging@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: Hi Greg, On Fri, Dec 23, 2022 at 03:48:11PM +0100, Greg Kroah-Hartman wrote: > On Fri, Dec 23, 2022 at 12:24:22PM +0100, Stefan Wahren wrote: > > Am 22.12.22 um 18:35 schrieb Laurent Pinchart: > > > On Thu, Dec 22, 2022 at 01:59:28PM +0530, Umang Jain wrote: > > > > On 12/21/22 6:40 PM, Greg Kroah-Hartman wrote: > > > > > On Wed, Dec 21, 2022 at 01:14:59PM +0200, Laurent Pinchart wrote: > > > > > > On Tue, Dec 20, 2022 at 02:14:04PM +0530, Umang Jain wrote: > > > > > > > Create a proper per device platorm_device structure for all the child > > > > > > > devices that needs to be registered by vchiq platform driver. Replace > > > > > > > the vchiq_register_child() with platform_add_devices() to register the > > > > > > > child devices. > > > > > > > > > > > > This explains what the patch does, but not why. > > > > > > > > > > > > > This is part of an effort to address TODO item "Get rid of all non > > > > > > > essential global structures and create a proper per device structure" > > > > > > > > > > > > And this explains part of the reason only. Could you please expand the > > > > > > commit message with the reasoning behind this change ? It's not clear > > > > > > from the change below why this is needed and good. > > > > > > > > Ok, I thought the TODO reference was sufficient but I'll expand on it. > > > > > > > > > > > Signed-off-by: Umang Jain > > > > > > > --- > > > > > > > .../interface/vchiq_arm/vchiq_arm.c | 59 ++++++++++--------- > > > > > > > 1 file changed, 31 insertions(+), 28 deletions(-) > > > > > > > > > > > > > > diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c > > > > > > > index 22de23f3af02..fa42ea3791a7 100644 > > > > > > > --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c > > > > > > > +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c > > > > > > > @@ -65,8 +65,29 @@ int vchiq_susp_log_level = VCHIQ_LOG_ERROR; > > > > > > > DEFINE_SPINLOCK(msg_queue_spinlock); > > > > > > > struct vchiq_state g_state; > > > > > > > -static struct platform_device *bcm2835_camera; > > > > > > > -static struct platform_device *bcm2835_audio; > > > > > > > +static u64 vchiq_device_dmamask = DMA_BIT_MASK(32); > > > > > > > > > > > > The fact that this isn't const and is used by two different > > > > > > platform_device instances is worrying. Either it can be made const, or > > > > > > it's wrong. > > > > > > > > ack. > > > > > > > > > > > + > > > > > > > +static struct platform_device bcm2835_camera = { > > > > > > > + .name = "bcm2835-camera", > > > > > > > + .id = PLATFORM_DEVID_NONE, > > > > > > > + .dev = { > > > > > > > + .dma_mask = &vchiq_device_dmamask, > > > > > > > + } > > > > > > > +}; > > > > > > > + > > > > > > > +static struct platform_device bcm2835_audio = { > > > > > > > + .name = "bcm2835_audio", > > > > > > > + .id = PLATFORM_DEVID_NONE, > > > > > > > + .dev = { > > > > > > > + .dma_mask = &vchiq_device_dmamask, > > > > > > > + } > > > > > > > + > > > > > > > > > > > > Extra blank line. > > > > > > > > oops, checkpatch.pl didn't catch this :-/ > > > > > > > > > > > +}; > > > > > > > + > > > > > > > +static struct platform_device *vchiq_devices[] __initdata = { > > > > > > > > > > > > Make it const. > > > > > > > > > > > > > + &bcm2835_camera, > > > > > > > + &bcm2835_audio, > > > > > > > +}; > > > > > > > struct vchiq_drvdata { > > > > > > > const unsigned int cache_line_size; > > > > > > > @@ -1763,28 +1784,6 @@ static const struct of_device_id vchiq_of_match[] = { > > > > > > > }; > > > > > > > MODULE_DEVICE_TABLE(of, vchiq_of_match); > > > > > > > -static struct platform_device * > > > > > > > -vchiq_register_child(struct platform_device *pdev, const char *name) > > > > > > > -{ > > > > > > > - struct platform_device_info pdevinfo; > > > > > > > - struct platform_device *child; > > > > > > > - > > > > > > > - memset(&pdevinfo, 0, sizeof(pdevinfo)); > > > > > > > - > > > > > > > - pdevinfo.parent = &pdev->dev; > > > > > > > - pdevinfo.name = name; > > > > > > > - pdevinfo.id = PLATFORM_DEVID_NONE; > > > > > > > - pdevinfo.dma_mask = DMA_BIT_MASK(32); > > > > > > > - > > > > > > > - child = platform_device_register_full(&pdevinfo); > > > > > > > - if (IS_ERR(child)) { > > > > > > > - dev_warn(&pdev->dev, "%s not registered\n", name); > > > > > > > - child = NULL; > > > > > > > - } > > > > > > > - > > > > > > > - return child; > > > > > > > -} > > > > > > > - > > > > > > > static int vchiq_probe(struct platform_device *pdev) > > > > > > > { > > > > > > > struct device_node *fw_node; > > > > > > > @@ -1832,8 +1831,11 @@ static int vchiq_probe(struct platform_device *pdev) > > > > > > > goto error_exit; > > > > > > > } > > > > > > > - bcm2835_camera = vchiq_register_child(pdev, "bcm2835-camera"); > > > > > > > - bcm2835_audio = vchiq_register_child(pdev, "bcm2835_audio"); > > > > > > > + err = platform_add_devices(vchiq_devices, ARRAY_SIZE(vchiq_devices)); > > > > > > > + if (err) { > > > > > > > + dev_warn(&pdev->dev, "Failed to add vchiq child devices"); > > > > > > > + goto error_exit; > > > > > > > + } > > > > > > > > > > > > If you unbind and rebind this driver, the platform_device instances > > > > > > defined as global variables will be reused, and I'm pretty sure that > > > > > > will cause issues, for instance with the kobj->state_initialized check > > > > > > in kobject_init() (called from device_initialize(), itself called from > > > > > > platform_device_register(), from platform_add_devices()). I'm not sure > > > > > > static instances of platform_device are a very good idea in general. > > > > > > > > > > static instances of any device are a horrible idea, but it seems that > > > > > many drivers do this and abuse platform devices this way :( > > > > > > > > It seems  I have been a victim of the abuse usage while looking for > > > > platform_device references in the codebase. I'm working on a new > > > > approach for this. > > > > > > > > Currently (as per the linux-next branch), the vchiq driver will happily > > > > carry on if any of the child  platform device registration fails. That > > > > means if bcm2835-audio fails to register, bcm2835-camera will  still > > > > kept registered I suppose. > > > > > > > > However with usage of platform_add_devices() in this patch, I introduced > > > > a functionality change (I'm realizing this now) - any failure of child > > > > platform device registeration will -unregister- all the other platform > > > > devices i.e. if bcm2835-audio fails, bcm2835-camera will also get > > > > unregistered. > > > > > > > > Should I be working towards the status-quo behavior ? Or it's sane to > > > > unregistered other platform devices if one of the fails like > > > > platform_add_devices() does ? (This affects my new approach as well, > > > > hence the question) > > > > > > If it doesn't cause too much extra complexity, it would be nice to skip > > > devices that can't be registered successfully, and still support the > > > other ones. I don't expect registration failures to be a occuring > > > normally, so if this causes too much completely, I think it would still > > > be fine to fail more harshly. > > > > > > > > Ideally this should be done properly, with the correct devices created > > > > > automatically based on the device tree structure, NOT hard-coded into a > > > > > .c file like this. > > > > > > > > > > So I too really do not like this change, why are these not being created > > > > > by the firware layer automatically? > > > > > > > > Not sure if this is a helpful comment, but as far I know, there can be > > > > vchiq child platform devices which probably don't have a Device tree > > > > entry. like the bcm2835-isp [1] I posted earlier. > > > > > > > > [1] https://lore.kernel.org/lkml/20221121214722.22563-1-umang.jain@ideasonboard.com/ > > > > > > Those devices are implemented and exposed by the firmware running on the > > > VC4. The device tree describes the VC4 itself with the resources > > > required to communicate with it through a mailbox interface. I was going > > > to say that the platform devices are then created based on what the > > > firmware exposes, but that's not right, they're indeed hardcoded in the > > > vchiq driver. Adding corresponding DT nodes (as children of the vchiq DT > > > node) could make sense. Dave, do you have any opinion on this ? > > > > i vaguely remember the discussion how to represent audio and camera > > interface in the device tree. Representing as child nodes of the VC4 has > > been rejected on the device tree mailing some years ago, because this > > doesn't represent the physical (hardware) wiring. It's still possible to > > access e.g. the camera interface from the ARM. > > > > The whole approach with using a separate binding for all the firmware stuff > > lead to a lot of trouble on the Raspberry Pi platform (ugly dependencies > > between firmware, DT and kernel). So i would like to avoid this here. In > > case the current implementation is a no go, how about letting the ARM core > > discover the available interfaces e.g. via mailbox interface? > > > > For more inspiration take a look at this old thread [1] > > Yes, that's the proper way to do this please! This should be a bus and > dynamically add the devices when found, it is NOT a platform device > anymore. I'm fine with making this a bus, but when it comes to dynamically adding devices, that depends on the firmware exposing an interface to enumerate those devices. If that's not possible, are you fine with a custom bus and hardcoded children device instantiation in the VCHIQ driver ? -- Regards, Laurent Pinchart 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 C316BC4167B for ; Mon, 26 Dec 2022 10:08:01 +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=RTfitLXTtTdp5QaViZmFPL73uqW6sLAXEsV816vVveY=; b=3TUZq6KX82ybcg YenMsDqmHrBp5eyRVfdTxME6vYWX+bYTelp+FAzMEiyLIUAKmBXGRvSSJjHO+/M1+vyePkKUvvUZH G7UIoUvZvHVhf/qsXaH/e56m9FPVwWWeM51s4LP8ONpb6AkSd7drBugrFA3DL1BmsjM9rp9LJwEKU 6BUtYbJ53AyT10/POcfVvxibkGNx6eGyMXDQRfqIN1SXhCoJ1FI4GPOx7Vmv4dT8NZcONSMz7p2NO CNisJneLR0dSVXsNkYmSpBh1lqK8s/dsTDZAihp2reohAbrGBbFVnYHcpyaLtwSAwNy51aCIw/gMz +a3T1hqKqSU+eYvI5teQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1p9kNu-0034jz-Cs; Mon, 26 Dec 2022 10:07:06 +0000 Received: from perceval.ideasonboard.com ([213.167.242.64]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1p9kNn-0034hO-SK; Mon, 26 Dec 2022 10:07:05 +0000 Received: from pendragon.ideasonboard.com (213-243-189-158.bb.dnainternet.fi [213.243.189.158]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1B941105; Mon, 26 Dec 2022 11:06:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1672049217; bh=fP68BnaD69pyQUOSxwZU1jHOt8kinIDfpW6cF4kE5+8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pzqlZ8FMJmusnRvf6pedjff0UKMQ/JsYlJS0x2rceaQ2shHulzNJ+ZNhkVxa0Z1zS +dYVDaAbvA3JVS5N7uzQUGwFmGTyRMAwvBta7RTVPEI9sSG1R+gJe9S5Ww/daoSLxu 0IvtTtqcOSfwFwnXpalo49UVtS6oS2ieiOJBbIBw= Date: Mon, 26 Dec 2022 12:06:53 +0200 From: Laurent Pinchart To: Greg Kroah-Hartman Cc: Stefan Wahren , Umang Jain , linux-staging@lists.linux.dev, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Florian Fainelli , Adrien Thierry , Dan Carpenter , Nicolas Saenz Julienne , Phil Elwell , Dave Stevenson , Kieran Bingham Subject: Re: [PATCH] staging: vc04_services: vchiq_arm: Create platform_device per device Message-ID: References: <20221220084404.19280-1-umang.jain@ideasonboard.com> <629b3f63-74e4-5cb5-29d1-6d2846bc24c7@i2se.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-20221226_020700_781731_2D7BFF35 X-CRM114-Status: GOOD ( 70.95 ) 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 SGkgR3JlZywKCk9uIEZyaSwgRGVjIDIzLCAyMDIyIGF0IDAzOjQ4OjExUE0gKzAxMDAsIEdyZWcg S3JvYWgtSGFydG1hbiB3cm90ZToKPiBPbiBGcmksIERlYyAyMywgMjAyMiBhdCAxMjoyNDoyMlBN ICswMTAwLCBTdGVmYW4gV2FocmVuIHdyb3RlOgo+ID4gQW0gMjIuMTIuMjIgdW0gMTg6MzUgc2No cmllYiBMYXVyZW50IFBpbmNoYXJ0Ogo+ID4gPiBPbiBUaHUsIERlYyAyMiwgMjAyMiBhdCAwMTo1 OToyOFBNICswNTMwLCBVbWFuZyBKYWluIHdyb3RlOgo+ID4gPiA+IE9uIDEyLzIxLzIyIDY6NDAg UE0sIEdyZWcgS3JvYWgtSGFydG1hbiB3cm90ZToKPiA+ID4gPiA+IE9uIFdlZCwgRGVjIDIxLCAy MDIyIGF0IDAxOjE0OjU5UE0gKzAyMDAsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4gPiA+ID4g PiA+IE9uIFR1ZSwgRGVjIDIwLCAyMDIyIGF0IDAyOjE0OjA0UE0gKzA1MzAsIFVtYW5nIEphaW4g d3JvdGU6Cj4gPiA+ID4gPiA+ID4gQ3JlYXRlIGEgcHJvcGVyIHBlciBkZXZpY2UgcGxhdG9ybV9k ZXZpY2Ugc3RydWN0dXJlIGZvciBhbGwgdGhlIGNoaWxkCj4gPiA+ID4gPiA+ID4gZGV2aWNlcyB0 aGF0IG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYnkgdmNoaXEgcGxhdGZvcm0gZHJpdmVyLiBSZXBs YWNlCj4gPiA+ID4gPiA+ID4gdGhlIHZjaGlxX3JlZ2lzdGVyX2NoaWxkKCkgd2l0aCBwbGF0Zm9y bV9hZGRfZGV2aWNlcygpIHRvIHJlZ2lzdGVyIHRoZQo+ID4gPiA+ID4gPiA+IGNoaWxkIGRldmlj ZXMuCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IFRoaXMgZXhwbGFpbnMgd2hhdCB0aGUgcGF0Y2gg ZG9lcywgYnV0IG5vdCB3aHkuCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IFRoaXMgaXMgcGFy dCBvZiBhbiBlZmZvcnQgdG8gYWRkcmVzcyBUT0RPIGl0ZW0gIkdldCByaWQgb2YgYWxsIG5vbgo+ ID4gPiA+ID4gPiA+IGVzc2VudGlhbCBnbG9iYWwgc3RydWN0dXJlcyBhbmQgY3JlYXRlIGEgcHJv cGVyIHBlciBkZXZpY2Ugc3RydWN0dXJlIgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBBbmQgdGhp cyBleHBsYWlucyBwYXJ0IG9mIHRoZSByZWFzb24gb25seS4gQ291bGQgeW91IHBsZWFzZSBleHBh bmQgdGhlCj4gPiA+ID4gPiA+IGNvbW1pdCBtZXNzYWdlIHdpdGggdGhlIHJlYXNvbmluZyBiZWhp bmQgdGhpcyBjaGFuZ2UgPyBJdCdzIG5vdCBjbGVhcgo+ID4gPiA+ID4gPiBmcm9tIHRoZSBjaGFu Z2UgYmVsb3cgd2h5IHRoaXMgaXMgbmVlZGVkIGFuZCBnb29kLgo+ID4gPiA+IAo+ID4gPiA+IE9r LCBJIHRob3VnaHQgdGhlIFRPRE8gcmVmZXJlbmNlIHdhcyBzdWZmaWNpZW50IGJ1dCBJJ2xsIGV4 cGFuZCBvbiBpdC4KPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBVbWFuZyBK YWluIDx1bWFuZy5qYWluQGlkZWFzb25ib2FyZC5jb20+Cj4gPiA+ID4gPiA+ID4gLS0tCj4gPiA+ ID4gPiA+ID4gICAgLi4uL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYXJtLmMgICAgICAgICAg IHwgNTkgKysrKysrKysrKy0tLS0tLS0tLQo+ID4gPiA+ID4gPiA+ICAgIDEgZmlsZSBjaGFuZ2Vk LCAzMSBpbnNlcnRpb25zKCspLCAyOCBkZWxldGlvbnMoLSkKPiA+ID4gPiA+ID4gPiAKPiA+ID4g PiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJm YWNlL3ZjaGlxX2FybS92Y2hpcV9hcm0uYyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2Vz L2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYXJtLmMKPiA+ID4gPiA+ID4gPiBpbmRleCAyMmRl MjNmM2FmMDIuLmZhNDJlYTM3OTFhNyAxMDA2NDQKPiA+ID4gPiA+ID4gPiAtLS0gYS9kcml2ZXJz L3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2FybS5jCj4g PiA+ID4gPiA+ID4gKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNl L3ZjaGlxX2FybS92Y2hpcV9hcm0uYwo+ID4gPiA+ID4gPiA+IEBAIC02NSw4ICs2NSwyOSBAQCBp bnQgdmNoaXFfc3VzcF9sb2dfbGV2ZWwgPSBWQ0hJUV9MT0dfRVJST1I7Cj4gPiA+ID4gPiA+ID4g ICAgREVGSU5FX1NQSU5MT0NLKG1zZ19xdWV1ZV9zcGlubG9jayk7Cj4gPiA+ID4gPiA+ID4gICAg c3RydWN0IHZjaGlxX3N0YXRlIGdfc3RhdGU7Cj4gPiA+ID4gPiA+ID4gLXN0YXRpYyBzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpiY20yODM1X2NhbWVyYTsKPiA+ID4gPiA+ID4gPiAtc3RhdGljIHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmJjbTI4MzVfYXVkaW87Cj4gPiA+ID4gPiA+ID4gK3N0YXRp YyB1NjQgdmNoaXFfZGV2aWNlX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwo+ID4gPiA+ID4g Pgo+ID4gPiA+ID4gPiBUaGUgZmFjdCB0aGF0IHRoaXMgaXNuJ3QgY29uc3QgYW5kIGlzIHVzZWQg YnkgdHdvIGRpZmZlcmVudAo+ID4gPiA+ID4gPiBwbGF0Zm9ybV9kZXZpY2UgaW5zdGFuY2VzIGlz IHdvcnJ5aW5nLiBFaXRoZXIgaXQgY2FuIGJlIG1hZGUgY29uc3QsIG9yCj4gPiA+ID4gPiA+IGl0 J3Mgd3JvbmcuCj4gPiA+ID4KPiA+ID4gPiBhY2suCj4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gKwo+ ID4gPiA+ID4gPiA+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiY20yODM1X2NhbWVy YSA9IHsKPiA+ID4gPiA+ID4gPiArCS5uYW1lCQk9ICJiY20yODM1LWNhbWVyYSIsCj4gPiA+ID4g PiA+ID4gKwkuaWQJCT0gUExBVEZPUk1fREVWSURfTk9ORSwKPiA+ID4gPiA+ID4gPiArCS5kZXYJ CT0gewo+ID4gPiA+ID4gPiA+ICsJCS5kbWFfbWFzawk9ICZ2Y2hpcV9kZXZpY2VfZG1hbWFzaywK PiA+ID4gPiA+ID4gPiArCX0KPiA+ID4gPiA+ID4gPiArfTsKPiA+ID4gPiA+ID4gPiArCj4gPiA+ ID4gPiA+ID4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJjbTI4MzVfYXVkaW8gPSB7 Cj4gPiA+ID4gPiA+ID4gKwkubmFtZQkJPSAiYmNtMjgzNV9hdWRpbyIsCj4gPiA+ID4gPiA+ID4g KwkuaWQJCT0gUExBVEZPUk1fREVWSURfTk9ORSwKPiA+ID4gPiA+ID4gPiArCS5kZXYJCT0gewo+ ID4gPiA+ID4gPiA+ICsJCS5kbWFfbWFzawk9ICZ2Y2hpcV9kZXZpY2VfZG1hbWFzaywKPiA+ID4g PiA+ID4gPiArCX0KPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IEV4dHJh IGJsYW5rIGxpbmUuCj4gPiA+ID4KPiA+ID4gPiBvb3BzLCBjaGVja3BhdGNoLnBsIGRpZG4ndCBj YXRjaCB0aGlzIDotLwo+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ICt9Owo+ID4gPiA+ID4gPiA+ICsK PiA+ID4gPiA+ID4gPiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnZjaGlxX2Rldmlj ZXNbXSBfX2luaXRkYXRhID0gewo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBNYWtlIGl0IGNvbnN0 Lgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiArCSZiY20yODM1X2NhbWVyYSwKPiA+ID4gPiA+ ID4gPiArCSZiY20yODM1X2F1ZGlvLAo+ID4gPiA+ID4gPiA+ICt9Owo+ID4gPiA+ID4gPiA+ICAg IHN0cnVjdCB2Y2hpcV9kcnZkYXRhIHsKPiA+ID4gPiA+ID4gPiAgICAJY29uc3QgdW5zaWduZWQg aW50IGNhY2hlX2xpbmVfc2l6ZTsKPiA+ID4gPiA+ID4gPiBAQCAtMTc2MywyOCArMTc4NCw2IEBA IHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZjaGlxX29mX21hdGNoW10gPSB7Cj4g PiA+ID4gPiA+ID4gICAgfTsKPiA+ID4gPiA+ID4gPiAgICBNT0RVTEVfREVWSUNFX1RBQkxFKG9m LCB2Y2hpcV9vZl9tYXRjaCk7Cj4gPiA+ID4gPiA+ID4gLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICoKPiA+ID4gPiA+ID4gPiAtdmNoaXFfcmVnaXN0ZXJfY2hpbGQoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldiwgY29uc3QgY2hhciAqbmFtZSkKPiA+ID4gPiA+ID4gPiAtewo+ID4g PiA+ID4gPiA+IC0Jc3RydWN0IHBsYXRmb3JtX2RldmljZV9pbmZvIHBkZXZpbmZvOwo+ID4gPiA+ ID4gPiA+IC0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY2hpbGQ7Cj4gPiA+ID4gPiA+ID4gLQo+ ID4gPiA+ID4gPiA+IC0JbWVtc2V0KCZwZGV2aW5mbywgMCwgc2l6ZW9mKHBkZXZpbmZvKSk7Cj4g PiA+ID4gPiA+ID4gLQo+ID4gPiA+ID4gPiA+IC0JcGRldmluZm8ucGFyZW50ID0gJnBkZXYtPmRl djsKPiA+ID4gPiA+ID4gPiAtCXBkZXZpbmZvLm5hbWUgPSBuYW1lOwo+ID4gPiA+ID4gPiA+IC0J cGRldmluZm8uaWQgPSBQTEFURk9STV9ERVZJRF9OT05FOwo+ID4gPiA+ID4gPiA+IC0JcGRldmlu Zm8uZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwo+ID4gPiA+ID4gPiA+IC0KPiA+ID4gPiA+ ID4gPiAtCWNoaWxkID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2Z1bGwoJnBkZXZpbmZvKTsK PiA+ID4gPiA+ID4gPiAtCWlmIChJU19FUlIoY2hpbGQpKSB7Cj4gPiA+ID4gPiA+ID4gLQkJZGV2 X3dhcm4oJnBkZXYtPmRldiwgIiVzIG5vdCByZWdpc3RlcmVkXG4iLCBuYW1lKTsKPiA+ID4gPiA+ ID4gPiAtCQljaGlsZCA9IE5VTEw7Cj4gPiA+ID4gPiA+ID4gLQl9Cj4gPiA+ID4gPiA+ID4gLQo+ ID4gPiA+ID4gPiA+IC0JcmV0dXJuIGNoaWxkOwo+ID4gPiA+ID4gPiA+IC19Cj4gPiA+ID4gPiA+ ID4gLQo+ID4gPiA+ID4gPiA+ICAgIHN0YXRpYyBpbnQgdmNoaXFfcHJvYmUoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKPiA+ID4gPiA+ID4gPiAgICB7Cj4gPiA+ID4gPiA+ID4gICAgCXN0 cnVjdCBkZXZpY2Vfbm9kZSAqZndfbm9kZTsKPiA+ID4gPiA+ID4gPiBAQCAtMTgzMiw4ICsxODMx LDExIEBAIHN0YXRpYyBpbnQgdmNoaXFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl dikKPiA+ID4gPiA+ID4gPiAgICAJCWdvdG8gZXJyb3JfZXhpdDsKPiA+ID4gPiA+ID4gPiAgICAJ fQo+ID4gPiA+ID4gPiA+IC0JYmNtMjgzNV9jYW1lcmEgPSB2Y2hpcV9yZWdpc3Rlcl9jaGlsZChw ZGV2LCAiYmNtMjgzNS1jYW1lcmEiKTsKPiA+ID4gPiA+ID4gPiAtCWJjbTI4MzVfYXVkaW8gPSB2 Y2hpcV9yZWdpc3Rlcl9jaGlsZChwZGV2LCAiYmNtMjgzNV9hdWRpbyIpOwo+ID4gPiA+ID4gPiA+ ICsJZXJyID0gcGxhdGZvcm1fYWRkX2RldmljZXModmNoaXFfZGV2aWNlcywgQVJSQVlfU0laRSh2 Y2hpcV9kZXZpY2VzKSk7Cj4gPiA+ID4gPiA+ID4gKwlpZiAoZXJyKSB7Cj4gPiA+ID4gPiA+ID4g KwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhZGQgdmNoaXEgY2hpbGQgZGV2aWNl cyIpOwo+ID4gPiA+ID4gPiA+ICsJCWdvdG8gZXJyb3JfZXhpdDsKPiA+ID4gPiA+ID4gPiArCX0K PiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gSWYgeW91IHVuYmluZCBhbmQgcmViaW5kIHRoaXMgZHJp dmVyLCB0aGUgcGxhdGZvcm1fZGV2aWNlIGluc3RhbmNlcwo+ID4gPiA+ID4gPiBkZWZpbmVkIGFz IGdsb2JhbCB2YXJpYWJsZXMgd2lsbCBiZSByZXVzZWQsIGFuZCBJJ20gcHJldHR5IHN1cmUgdGhh dAo+ID4gPiA+ID4gPiB3aWxsIGNhdXNlIGlzc3VlcywgZm9yIGluc3RhbmNlIHdpdGggdGhlIGtv YmotPnN0YXRlX2luaXRpYWxpemVkIGNoZWNrCj4gPiA+ID4gPiA+IGluIGtvYmplY3RfaW5pdCgp IChjYWxsZWQgZnJvbSBkZXZpY2VfaW5pdGlhbGl6ZSgpLCBpdHNlbGYgY2FsbGVkIGZyb20KPiA+ ID4gPiA+ID4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCksIGZyb20gcGxhdGZvcm1fYWRkX2Rl dmljZXMoKSkuIEknbSBub3Qgc3VyZQo+ID4gPiA+ID4gPiBzdGF0aWMgaW5zdGFuY2VzIG9mIHBs YXRmb3JtX2RldmljZSBhcmUgYSB2ZXJ5IGdvb2QgaWRlYSBpbiBnZW5lcmFsLgo+ID4gPiA+ID4K PiA+ID4gPiA+IHN0YXRpYyBpbnN0YW5jZXMgb2YgYW55IGRldmljZSBhcmUgYSBob3JyaWJsZSBp ZGVhLCBidXQgaXQgc2VlbXMgdGhhdAo+ID4gPiA+ID4gbWFueSBkcml2ZXJzIGRvIHRoaXMgYW5k IGFidXNlIHBsYXRmb3JtIGRldmljZXMgdGhpcyB3YXkgOigKPiA+ID4gPgo+ID4gPiA+IEl0IHNl ZW1zwqAgSSBoYXZlIGJlZW4gYSB2aWN0aW0gb2YgdGhlIGFidXNlIHVzYWdlIHdoaWxlIGxvb2tp bmcgZm9yCj4gPiA+ID4gcGxhdGZvcm1fZGV2aWNlIHJlZmVyZW5jZXMgaW4gdGhlIGNvZGViYXNl LiBJJ20gd29ya2luZyBvbiBhIG5ldwo+ID4gPiA+IGFwcHJvYWNoIGZvciB0aGlzLgo+ID4gPiA+ IAo+ID4gPiA+IEN1cnJlbnRseSAoYXMgcGVyIHRoZSBsaW51eC1uZXh0IGJyYW5jaCksIHRoZSB2 Y2hpcSBkcml2ZXIgd2lsbCBoYXBwaWx5Cj4gPiA+ID4gY2Fycnkgb24gaWYgYW55IG9mIHRoZSBj aGlsZMKgIHBsYXRmb3JtIGRldmljZSByZWdpc3RyYXRpb24gZmFpbHMuIFRoYXQKPiA+ID4gPiBt ZWFucyBpZiBiY20yODM1LWF1ZGlvIGZhaWxzIHRvIHJlZ2lzdGVyLCBiY20yODM1LWNhbWVyYSB3 aWxswqAgc3RpbGwKPiA+ID4gPiBrZXB0IHJlZ2lzdGVyZWQgSSBzdXBwb3NlLgo+ID4gPiA+IAo+ ID4gPiA+IEhvd2V2ZXIgd2l0aCB1c2FnZSBvZiBwbGF0Zm9ybV9hZGRfZGV2aWNlcygpIGluIHRo aXMgcGF0Y2gsIEkgaW50cm9kdWNlZAo+ID4gPiA+IGEgZnVuY3Rpb25hbGl0eSBjaGFuZ2UgKEkn bSByZWFsaXppbmcgdGhpcyBub3cpIC0gYW55IGZhaWx1cmUgb2YgY2hpbGQKPiA+ID4gPiBwbGF0 Zm9ybSBkZXZpY2UgcmVnaXN0ZXJhdGlvbiB3aWxsIC11bnJlZ2lzdGVyLSBhbGwgdGhlIG90aGVy IHBsYXRmb3JtCj4gPiA+ID4gZGV2aWNlcyBpLmUuIGlmIGJjbTI4MzUtYXVkaW8gZmFpbHMsIGJj bTI4MzUtY2FtZXJhIHdpbGwgYWxzbyBnZXQKPiA+ID4gPiB1bnJlZ2lzdGVyZWQuCj4gPiA+ID4g Cj4gPiA+ID4gU2hvdWxkIEkgYmUgd29ya2luZyB0b3dhcmRzIHRoZSBzdGF0dXMtcXVvIGJlaGF2 aW9yID8gT3IgaXQncyBzYW5lIHRvCj4gPiA+ID4gdW5yZWdpc3RlcmVkIG90aGVyIHBsYXRmb3Jt IGRldmljZXMgaWYgb25lIG9mIHRoZSBmYWlscyBsaWtlCj4gPiA+ID4gcGxhdGZvcm1fYWRkX2Rl dmljZXMoKSBkb2VzID8gKFRoaXMgYWZmZWN0cyBteSBuZXcgYXBwcm9hY2ggYXMgd2VsbCwKPiA+ ID4gPiBoZW5jZSB0aGUgcXVlc3Rpb24pCj4gPiA+Cj4gPiA+IElmIGl0IGRvZXNuJ3QgY2F1c2Ug dG9vIG11Y2ggZXh0cmEgY29tcGxleGl0eSwgaXQgd291bGQgYmUgbmljZSB0byBza2lwCj4gPiA+ IGRldmljZXMgdGhhdCBjYW4ndCBiZSByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseSwgYW5kIHN0aWxs IHN1cHBvcnQgdGhlCj4gPiA+IG90aGVyIG9uZXMuIEkgZG9uJ3QgZXhwZWN0IHJlZ2lzdHJhdGlv biBmYWlsdXJlcyB0byBiZSBhIG9jY3VyaW5nCj4gPiA+IG5vcm1hbGx5LCBzbyBpZiB0aGlzIGNh dXNlcyB0b28gbXVjaCBjb21wbGV0ZWx5LCBJIHRoaW5rIGl0IHdvdWxkIHN0aWxsCj4gPiA+IGJl IGZpbmUgdG8gZmFpbCBtb3JlIGhhcnNobHkuCj4gPiA+IAo+ID4gPiA+ID4gSWRlYWxseSB0aGlz IHNob3VsZCBiZSBkb25lIHByb3Blcmx5LCB3aXRoIHRoZSBjb3JyZWN0IGRldmljZXMgY3JlYXRl ZAo+ID4gPiA+ID4gYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgZGV2aWNlIHRyZWUgc3RydWN0 dXJlLCBOT1QgaGFyZC1jb2RlZCBpbnRvIGEKPiA+ID4gPiA+IC5jIGZpbGUgbGlrZSB0aGlzLgo+ ID4gPiA+ID4gCj4gPiA+ID4gPiBTbyBJIHRvbyByZWFsbHkgZG8gbm90IGxpa2UgdGhpcyBjaGFu Z2UsIHdoeSBhcmUgdGhlc2Ugbm90IGJlaW5nIGNyZWF0ZWQKPiA+ID4gPiA+IGJ5IHRoZSBmaXJ3 YXJlIGxheWVyIGF1dG9tYXRpY2FsbHk/Cj4gPiA+ID4KPiA+ID4gPiBOb3Qgc3VyZSBpZiB0aGlz IGlzIGEgaGVscGZ1bCBjb21tZW50LCBidXQgYXMgZmFyIEkga25vdywgdGhlcmUgY2FuIGJlCj4g PiA+ID4gdmNoaXEgY2hpbGQgcGxhdGZvcm0gZGV2aWNlcyB3aGljaCBwcm9iYWJseSBkb24ndCBo YXZlIGEgRGV2aWNlIHRyZWUKPiA+ID4gPiBlbnRyeS4gbGlrZSB0aGUgYmNtMjgzNS1pc3AgWzFd IEkgcG9zdGVkIGVhcmxpZXIuCj4gPiA+ID4gCj4gPiA+ID4gWzFdIGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2xrbWwvMjAyMjExMjEyMTQ3MjIuMjI1NjMtMS11bWFuZy5qYWluQGlkZWFzb25ib2Fy ZC5jb20vCj4gPiA+Cj4gPiA+IFRob3NlIGRldmljZXMgYXJlIGltcGxlbWVudGVkIGFuZCBleHBv c2VkIGJ5IHRoZSBmaXJtd2FyZSBydW5uaW5nIG9uIHRoZQo+ID4gPiBWQzQuIFRoZSBkZXZpY2Ug dHJlZSBkZXNjcmliZXMgdGhlIFZDNCBpdHNlbGYgd2l0aCB0aGUgcmVzb3VyY2VzCj4gPiA+IHJl cXVpcmVkIHRvIGNvbW11bmljYXRlIHdpdGggaXQgdGhyb3VnaCBhIG1haWxib3ggaW50ZXJmYWNl LiBJIHdhcyBnb2luZwo+ID4gPiB0byBzYXkgdGhhdCB0aGUgcGxhdGZvcm0gZGV2aWNlcyBhcmUg dGhlbiBjcmVhdGVkIGJhc2VkIG9uIHdoYXQgdGhlCj4gPiA+IGZpcm13YXJlIGV4cG9zZXMsIGJ1 dCB0aGF0J3Mgbm90IHJpZ2h0LCB0aGV5J3JlIGluZGVlZCBoYXJkY29kZWQgaW4gdGhlCj4gPiA+ IHZjaGlxIGRyaXZlci4gQWRkaW5nIGNvcnJlc3BvbmRpbmcgRFQgbm9kZXMgKGFzIGNoaWxkcmVu IG9mIHRoZSB2Y2hpcSBEVAo+ID4gPiBub2RlKSBjb3VsZCBtYWtlIHNlbnNlLiBEYXZlLCBkbyB5 b3UgaGF2ZSBhbnkgb3BpbmlvbiBvbiB0aGlzID8KPiA+IAo+ID4gaSB2YWd1ZWx5IHJlbWVtYmVy IHRoZSBkaXNjdXNzaW9uIGhvdyB0byByZXByZXNlbnQgYXVkaW8gYW5kIGNhbWVyYQo+ID4gaW50 ZXJmYWNlIGluIHRoZSBkZXZpY2UgdHJlZS4gUmVwcmVzZW50aW5nIGFzIGNoaWxkIG5vZGVzIG9m IHRoZSBWQzQgaGFzCj4gPiBiZWVuIHJlamVjdGVkIG9uIHRoZSBkZXZpY2UgdHJlZSBtYWlsaW5n IHNvbWUgeWVhcnMgYWdvLCBiZWNhdXNlIHRoaXMKPiA+IGRvZXNuJ3QgcmVwcmVzZW50IHRoZSBw aHlzaWNhbCAoaGFyZHdhcmUpIHdpcmluZy4gSXQncyBzdGlsbCBwb3NzaWJsZSB0bwo+ID4gYWNj ZXNzIGUuZy4gdGhlIGNhbWVyYSBpbnRlcmZhY2UgZnJvbSB0aGUgQVJNLgo+ID4gCj4gPiBUaGUg d2hvbGUgYXBwcm9hY2ggd2l0aCB1c2luZyBhIHNlcGFyYXRlIGJpbmRpbmcgZm9yIGFsbCB0aGUg ZmlybXdhcmUgc3R1ZmYKPiA+IGxlYWQgdG8gYSBsb3Qgb2YgdHJvdWJsZSBvbiB0aGUgUmFzcGJl cnJ5IFBpIHBsYXRmb3JtICh1Z2x5IGRlcGVuZGVuY2llcwo+ID4gYmV0d2VlbiBmaXJtd2FyZSwg RFQgYW5kIGtlcm5lbCkuIFNvIGkgd291bGQgbGlrZSB0byBhdm9pZCB0aGlzIGhlcmUuIEluCj4g PiBjYXNlIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGEgbm8gZ28sIGhvdyBhYm91dCBs ZXR0aW5nIHRoZSBBUk0gY29yZQo+ID4gZGlzY292ZXIgdGhlIGF2YWlsYWJsZSBpbnRlcmZhY2Vz IGUuZy4gdmlhIG1haWxib3ggaW50ZXJmYWNlPwo+ID4gCj4gPiBGb3IgbW9yZSBpbnNwaXJhdGlv biB0YWtlIGEgbG9vayBhdCB0aGlzIG9sZCB0aHJlYWQgWzFdCj4gCj4gWWVzLCB0aGF0J3MgdGhl IHByb3BlciB3YXkgdG8gZG8gdGhpcyBwbGVhc2UhICBUaGlzIHNob3VsZCBiZSBhIGJ1cyBhbmQK PiBkeW5hbWljYWxseSBhZGQgdGhlIGRldmljZXMgd2hlbiBmb3VuZCwgaXQgaXMgTk9UIGEgcGxh dGZvcm0gZGV2aWNlCj4gYW55bW9yZS4KCkknbSBmaW5lIHdpdGggbWFraW5nIHRoaXMgYSBidXMs IGJ1dCB3aGVuIGl0IGNvbWVzIHRvIGR5bmFtaWNhbGx5IGFkZGluZwpkZXZpY2VzLCB0aGF0IGRl cGVuZHMgb24gdGhlIGZpcm13YXJlIGV4cG9zaW5nIGFuIGludGVyZmFjZSB0byBlbnVtZXJhdGUK dGhvc2UgZGV2aWNlcy4gSWYgdGhhdCdzIG5vdCBwb3NzaWJsZSwgYXJlIHlvdSBmaW5lIHdpdGgg YSBjdXN0b20gYnVzCmFuZCBoYXJkY29kZWQgY2hpbGRyZW4gZGV2aWNlIGluc3RhbnRpYXRpb24g aW4gdGhlIFZDSElRIGRyaXZlciA/CgotLSAKUmVnYXJkcywKCkxhdXJlbnQgUGluY2hhcnQKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1r ZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJu ZWwK