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 90E7FC433EF for ; Tue, 1 Feb 2022 07:36:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234948AbiBAHg0 (ORCPT ); Tue, 1 Feb 2022 02:36:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44218 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234345AbiBAHg0 (ORCPT ); Tue, 1 Feb 2022 02:36:26 -0500 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D82E3C06173B for ; Mon, 31 Jan 2022 23:36:25 -0800 (PST) Received: by mail-wr1-x435.google.com with SMTP id v13so30064068wrv.10 for ; Mon, 31 Jan 2022 23:36:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=Bb6Mga8U7K4glRZ6MmtVlPXAX6IIPgGD3C6UTBEFxHU=; b=Ahq7jif3/GDZalygQ6KbDff2Y7Dn6Zh26zZBI/jiyAdElTrO/SSvFV7SCpPjKoWt5g hI+7EPZ+BHYlw21dR2EzdcWdHDt9eqSqKaYK9X/RO9aX2CeDYLot8Ro+/LzCJa1IovPc ZU6I4uP//AAniwRZHOYDYnhMl4gVGG5MqVwZHSVKdlOQUB/PjBpS7gfAu7MZJk9wGz2S i05ByWDb4ie8AQ142sd3m67EBW/v5+dk3Y4J2S4UfY9FDrd5PCWyIzxcnIoyKEd8PIr0 UA6UFRdfO3pGykYvR0eKAyaIC+QLHlD8abJ0+08XRqYdZtcpPHqjhMaMWep+rNPelcJm fyyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=Bb6Mga8U7K4glRZ6MmtVlPXAX6IIPgGD3C6UTBEFxHU=; b=VE2YC+jkpiTPGWZ+HdPyepNZ6wzcqfg6AVQopqtz+9EQqTnWoA7qmBPpmcng9BEO9r S5eXpZIjVSV91H/gVL6FYpf53uW6b509V4y7B29XCLo59AN/v5Jys2lk9z08SK9tJHWI KVtLSEtKtzOeN+wOizFM0NJl74Xv09hgBaPM+Aql9ULRUJWoOJ0rbHAL+Yzc75wh761d Rizs9Z65wJ2DRrN+TtcHsn//Apb10PejSKin0fpgEh97pWu7aWNkFiWdCSEN/p5TeNXX gjPCzSgsrTThIwa6P9l+k5mjQJYtrVPBXEqOHDox3sDkZ7qJZP7d8HrL58B5E1DD7rpf zDyg== X-Gm-Message-State: AOAM533RvzumM/KzDZMdtPp1cVxycWJsf2gaytUjgCcAwGX7AzjrJ1UC RouEtymVJobTLBPFsyikEk5qVA== X-Google-Smtp-Source: ABdhPJw0te5xOcbBzC+a3jqrrIgxBT+vb9ApuO2zXf7MyjEmiqExE7WWqNHRMqZA2vyoiNlbCKfslQ== X-Received: by 2002:a05:6000:1885:: with SMTP id a5mr19750194wri.705.1643700984292; Mon, 31 Jan 2022 23:36:24 -0800 (PST) Received: from google.com (cpc106310-bagu17-2-0-cust853.1-3.cable.virginm.net. [86.15.223.86]) by smtp.gmail.com with ESMTPSA id 1sm16170216wry.52.2022.01.31.23.36.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Jan 2022 23:36:23 -0800 (PST) Date: Tue, 1 Feb 2022 07:36:21 +0000 From: Lee Jones To: Colin Foster Cc: linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steen Hegelund , Lars Povlsen , Linus Walleij , Russell King , Heiner Kallweit , Jakub Kicinski , "David S. Miller" , Florian Fainelli , Vivien Didelot , Andrew Lunn , UNGLinuxDriver@microchip.com, Alexandre Belloni , Claudiu Manoil , Vladimir Oltean , katie.morris@in-advantage.com Subject: Re: [RFC v6 net-next 6/9] mfd: ocelot: add support for external mfd control over SPI for the VSC7512 Message-ID: References: <20220129220221.2823127-1-colin.foster@in-advantage.com> <20220129220221.2823127-7-colin.foster@in-advantage.com> <20220131172934.GB28107@COLIN-DESKTOP1.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220131172934.GB28107@COLIN-DESKTOP1.localdomain> Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org On Mon, 31 Jan 2022, Colin Foster wrote: > Hi Lee, > > Thank you very much for your time / feedback. > > On Mon, Jan 31, 2022 at 09:29:34AM +0000, Lee Jones wrote: > > On Sat, 29 Jan 2022, Colin Foster wrote: > > > > > Create a single SPI MFD ocelot device that manages the SPI bus on the > > > external chip and can handle requests for regmaps. This should allow any > > > ocelot driver (pinctrl, miim, etc.) to be used externally, provided they > > > utilize regmaps. > > > > > > Signed-off-by: Colin Foster > > > --- > > > drivers/mfd/Kconfig | 19 ++ > > > drivers/mfd/Makefile | 3 + > > > drivers/mfd/ocelot-core.c | 165 +++++++++++ > > > drivers/mfd/ocelot-spi.c | 325 ++++++++++++++++++++++ > > > drivers/mfd/ocelot.h | 36 +++ > > > > > drivers/net/mdio/mdio-mscc-miim.c | 21 +- > > > drivers/pinctrl/pinctrl-microchip-sgpio.c | 22 +- > > > drivers/pinctrl/pinctrl-ocelot.c | 29 +- > > > include/soc/mscc/ocelot.h | 11 + > > > > Please avoid mixing subsystems in patches if at all avoidable. > > > > If there are not build time dependencies/breakages, I'd suggest > > firstly applying support for this into MFD *then* utilising that > > support in subsequent patches. > > My last RFC did this, and you had suggested to squash the commits. To > clarify, are you suggesting the MFD / Pinctrl get applied in a single > patch, then the MIIM get applied in a separate one? Because I had > started with what sounds like you're describing - an "empty" MFD with > subsequent patches rolling in each subsystem. > > Perhaps I misinterpreted your initial feedback. I want you to add all device support into the MFD driver at once. The associated drivers, the ones that live in other subsystems, should be applied as separate patches. There seldom exist any *build time* dependencies between the device side and the driver side. > > > 9 files changed, 614 insertions(+), 17 deletions(-) > > > create mode 100644 drivers/mfd/ocelot-core.c > > > create mode 100644 drivers/mfd/ocelot-spi.c > > > create mode 100644 drivers/mfd/ocelot.h > > > > > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > > > index ba0b3eb131f1..57bbf2d11324 100644 > > > --- a/drivers/mfd/Kconfig > > > +++ b/drivers/mfd/Kconfig > > > @@ -948,6 +948,25 @@ config MFD_MENF21BMC > > > This driver can also be built as a module. If so the module > > > will be called menf21bmc. > > > > > > +config MFD_OCELOT > > > + tristate "Microsemi Ocelot External Control Support" > > > > Please explain exactly what an ECS is in the help below. > > I thought I had by way of the second paragraph below. I'm trying to > think of what extra information could be of use at this point... > > I could describe how they have internal processors and using this level > of control would basically bypass that functionality. Yes please. Also provide details about what the device actually does. > > > +static struct regmap *ocelot_devm_regmap_init(struct ocelot_core *core, > > > + struct device *dev, > > > + const struct resource *res) > > > +{ > > > + struct regmap *regmap; > > > + > > > + regmap = dev_get_regmap(dev, res->name); > > > + if (!regmap) > > > + regmap = ocelot_spi_devm_get_regmap(core, dev, res); > > > > Why are you making SPI specific calls from the Core driver? > > This was my interpretation of your initial feedback. It was initially > implemented as a config->get_regmap() function pointer so that core > didn't need to know anything about ocelot_spi. > > If function pointers aren't used, it seems like core would have to know > about all possible bus types... Maybe my naming led to some > misunderstandings. Specifically I'd used "init_bus" which was intended > to be "set up the chip to be able to properly communicate via SPI" but > could have been interpreted as "tell the user of this driver that the > bus is being initialized by way of a callback"? Okay, I see what's happening now. Please add a comment to describe why you're calling one helper, what failure means in the first instance and what you hope to achieve by calling the subsequent one. > > > + return regmap; > > > +} > > > + > > > +struct regmap *ocelot_get_regmap_from_resource(struct device *dev, > > > + const struct resource *res) > > > +{ > > > + struct ocelot_core *core = dev_get_drvdata(dev); > > > + > > > + return ocelot_devm_regmap_init(core, dev, res); > > > +} > > > +EXPORT_SYMBOL(ocelot_get_regmap_from_resource); > > > > Why don't you always call ocelot_devm_regmap_init() with the 'core' > > parameter dropped and just do dev_get_drvdata() inside of there? > > > > You're passing 'dev' anyway. > > This might be an error. I'll look into this, but I changed the intended > behavior of this between v5 and v6. > > In v5 I had intended to attach all regmaps to the spi_device. This way > they could be shared amongst child devices of spi->dev. I think that was > a bad design decision on my part, so I abandoned it. If the child > devices are to share regmaps, they should explicitly do so by way of > syscon, not implicitly by name. > > In v6 my intent is to have every regmap be devm-linked to the children. > This way the regmap would be destroyed and recreated by rmmod / insmod, > of the sub-modules, instead of being kept around the MFD module. What's the reason for using an MFD to handle the Regmap(s) if you're going to have per-device ones anyway? Why not handle them in the children? > So perhaps to clear this up I should rename "dev" to "child" because it > seems that the naming has already gotten too confusing. What I intended > to do was: > > struct regmap *ocelot_get_regmap_from_resource(struct device *parent, > struct device *child, > const struct resource *res) > { > struct ocelot_core *core = dev_get_drvdata(parent); > > return ocelot_devm_regmap_init(core, child, res); > } > > Or maybe even: > struct regmap *ocelot_get_regmap_from_resource(struct device *child, > const struct resource *res) > { > struct ocelot_core *core = dev_get_drvdata(child->parent); > > return ocelot_devm_regmap_init(core, child, res); > } Or just call: ocelot_devm_regmap_init(core, dev->parent, res); ... from the original call-site? Or, as I previously suggested: ocelot_devm_regmap_init(dev->parent, res); [...] > > > + ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, vsc7512_devs, > > > > Why NONE? > > I dont know the implication here. Example taken from > drivers/mfd/madera-core.c. I imagine PLATFORM_DEVID_AUTO is the correct > macro to use here? That's why I asked. Please read-up on the differences and use the correct one for your device instead of just blindly copy/pasting from other sources. :) [...] > > > + WARN_ON(!val); > > > > Is this possible? > > Hmm... I don't know if regmap_read guards against val == NULL. It > doesn't look like it does. It is very much a "this should never happen" > moment... > > I can remove it, or change this to return an error if !val, which is > what I probably should have done in the first place. Thoughts? Not really. Just make sure whatever you decide to do is informed. [...] > > > - regs = devm_platform_ioremap_resource(pdev, 0); > > > - if (IS_ERR(regs)) > > > - return PTR_ERR(regs); > > > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > > + > > > + if (!device_is_mfd(pdev)) { > > > + regs = devm_ioremap_resource(dev, res); > > > > What happens if you call this if the device was registered via MFD? > > I don't recall if it was your suggestion, but I tried this. > devm_ioremap_resource on the MFD triggered a kernel crash. I didn't look > much more into things than that, but if trying devm_ioremap_resource and > falling back to ocelot_get_regmap_from_resource is the desired path, I > can investigate further. Yes please. It should never crash. That's probably a bug. -- Lee Jones [李琼斯] Principal Technical Lead - Developer Services Linaro.org │ Open source software for Arm SoCs Follow Linaro: Facebook | Twitter | Blog 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 E9FCCC4332F for ; Tue, 1 Feb 2022 07:38:11 +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=phplQTwCY4uSg54AoH/0QMUb+ethMxq31EKIC7vZRYw=; b=1IsB6otHPGJFkk y0Xk8jtO/gcUX19nGu0d6ed50rjO77goHvaInW75buInVuMw0neDiBo1lznvh69nbTS+mdHc6qTzk T0SGvmuacedPj8M4du5xdXRARhTfaoWb+TZuZDByDQArUc/x2IqmzQ3ryeN3gHg2qK1ZcFD8vG8ok PO7+HVR2Vmlspqi/MRqiPiNhkbbc86ecW7YBuuYEcX4vNFBk3c9PdPk3Mk055ABFdZ2PZOJKwZnNm bfIvU3nASzSlN7Vi5xVxiCUwTpBQmOgUEjz88Mjn/NgW+NIZj6xSuD9wMBCItwTFfiYN/nBVKkERc YXuk7CQ/s6O9WyrPxt3A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nEniI-00BMl0-Nd; Tue, 01 Feb 2022 07:36:30 +0000 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nEniE-00BMk4-E3 for linux-arm-kernel@lists.infradead.org; Tue, 01 Feb 2022 07:36:28 +0000 Received: by mail-wr1-x42d.google.com with SMTP id w11so30107117wra.4 for ; Mon, 31 Jan 2022 23:36:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=Bb6Mga8U7K4glRZ6MmtVlPXAX6IIPgGD3C6UTBEFxHU=; b=Ahq7jif3/GDZalygQ6KbDff2Y7Dn6Zh26zZBI/jiyAdElTrO/SSvFV7SCpPjKoWt5g hI+7EPZ+BHYlw21dR2EzdcWdHDt9eqSqKaYK9X/RO9aX2CeDYLot8Ro+/LzCJa1IovPc ZU6I4uP//AAniwRZHOYDYnhMl4gVGG5MqVwZHSVKdlOQUB/PjBpS7gfAu7MZJk9wGz2S i05ByWDb4ie8AQ142sd3m67EBW/v5+dk3Y4J2S4UfY9FDrd5PCWyIzxcnIoyKEd8PIr0 UA6UFRdfO3pGykYvR0eKAyaIC+QLHlD8abJ0+08XRqYdZtcpPHqjhMaMWep+rNPelcJm fyyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=Bb6Mga8U7K4glRZ6MmtVlPXAX6IIPgGD3C6UTBEFxHU=; b=WVmtu2wLtkPkC6CCfZ7dixxHvz3HKAP1S44jB0CznV74pjxRb3tsIy73Qa5D9YFAlR 8P0KbR7YU0RdAiwu0DNiRfPW3PFBBPYjSEiYKFcHd2mg3LvepAlYdo3axqXgB7FYEYHa 1aG96WQ8z0601iwYEHX5oCoDeGpwyu4n54ysXCCGZWyLut/Ca3dn30TOQCjpXibcj+7d lltgtVu0btwV2ItOOnNPWYMZfH+HQg00zcet4keti2yNKfw60jYFyZ7f52CYmZx6IGS3 ExV2+zSYlgGQ4nJSn671e9to9Q7+9UIQwWVIp23C2JgO3eLYTAMVyJZQX3XsDpJ/DKky CZ5w== X-Gm-Message-State: AOAM533jp6ilRqEahoDKejHlAnYGkm70CGq6KPHmLHzZjK6hPF9dtLkE f5oPKAOFCxJ6jSrA0lyH25MqTA== X-Google-Smtp-Source: ABdhPJw0te5xOcbBzC+a3jqrrIgxBT+vb9ApuO2zXf7MyjEmiqExE7WWqNHRMqZA2vyoiNlbCKfslQ== X-Received: by 2002:a05:6000:1885:: with SMTP id a5mr19750194wri.705.1643700984292; Mon, 31 Jan 2022 23:36:24 -0800 (PST) Received: from google.com (cpc106310-bagu17-2-0-cust853.1-3.cable.virginm.net. [86.15.223.86]) by smtp.gmail.com with ESMTPSA id 1sm16170216wry.52.2022.01.31.23.36.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Jan 2022 23:36:23 -0800 (PST) Date: Tue, 1 Feb 2022 07:36:21 +0000 From: Lee Jones To: Colin Foster Cc: linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steen Hegelund , Lars Povlsen , Linus Walleij , Russell King , Heiner Kallweit , Jakub Kicinski , "David S. Miller" , Florian Fainelli , Vivien Didelot , Andrew Lunn , UNGLinuxDriver@microchip.com, Alexandre Belloni , Claudiu Manoil , Vladimir Oltean , katie.morris@in-advantage.com Subject: Re: [RFC v6 net-next 6/9] mfd: ocelot: add support for external mfd control over SPI for the VSC7512 Message-ID: References: <20220129220221.2823127-1-colin.foster@in-advantage.com> <20220129220221.2823127-7-colin.foster@in-advantage.com> <20220131172934.GB28107@COLIN-DESKTOP1.localdomain> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20220131172934.GB28107@COLIN-DESKTOP1.localdomain> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220131_233626_521912_7C993642 X-CRM114-Status: GOOD ( 66.96 ) 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 T24gTW9uLCAzMSBKYW4gMjAyMiwgQ29saW4gRm9zdGVyIHdyb3RlOgoKPiBIaSBMZWUsCj4gCj4g VGhhbmsgeW91IHZlcnkgbXVjaCBmb3IgeW91ciB0aW1lIC8gZmVlZGJhY2suCj4gCj4gT24gTW9u LCBKYW4gMzEsIDIwMjIgYXQgMDk6Mjk6MzRBTSArMDAwMCwgTGVlIEpvbmVzIHdyb3RlOgo+ID4g T24gU2F0LCAyOSBKYW4gMjAyMiwgQ29saW4gRm9zdGVyIHdyb3RlOgo+ID4gCj4gPiA+IENyZWF0 ZSBhIHNpbmdsZSBTUEkgTUZEIG9jZWxvdCBkZXZpY2UgdGhhdCBtYW5hZ2VzIHRoZSBTUEkgYnVz IG9uIHRoZQo+ID4gPiBleHRlcm5hbCBjaGlwIGFuZCBjYW4gaGFuZGxlIHJlcXVlc3RzIGZvciBy ZWdtYXBzLiBUaGlzIHNob3VsZCBhbGxvdyBhbnkKPiA+ID4gb2NlbG90IGRyaXZlciAocGluY3Ry bCwgbWlpbSwgZXRjLikgdG8gYmUgdXNlZCBleHRlcm5hbGx5LCBwcm92aWRlZCB0aGV5Cj4gPiA+ IHV0aWxpemUgcmVnbWFwcy4KPiA+ID4gCj4gPiA+IFNpZ25lZC1vZmYtYnk6IENvbGluIEZvc3Rl ciA8Y29saW4uZm9zdGVyQGluLWFkdmFudGFnZS5jb20+Cj4gPiA+IC0tLQo+ID4gPiAgZHJpdmVy cy9tZmQvS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgfCAgMTkgKysKPiA+ID4gIGRyaXZl cnMvbWZkL01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgIHwgICAzICsKPiA+ID4gIGRyaXZl cnMvbWZkL29jZWxvdC1jb3JlLmMgICAgICAgICAgICAgICAgIHwgMTY1ICsrKysrKysrKysrCj4g PiA+ICBkcml2ZXJzL21mZC9vY2Vsb3Qtc3BpLmMgICAgICAgICAgICAgICAgICB8IDMyNSArKysr KysrKysrKysrKysrKysrKysrCj4gPiA+ICBkcml2ZXJzL21mZC9vY2Vsb3QuaCAgICAgICAgICAg ICAgICAgICAgICB8ICAzNiArKysKPiA+IAo+ID4gPiAgZHJpdmVycy9uZXQvbWRpby9tZGlvLW1z Y2MtbWlpbS5jICAgICAgICAgfCAgMjEgKy0KPiA+ID4gIGRyaXZlcnMvcGluY3RybC9waW5jdHJs LW1pY3JvY2hpcC1zZ3Bpby5jIHwgIDIyICstCj4gPiA+ICBkcml2ZXJzL3BpbmN0cmwvcGluY3Ry bC1vY2Vsb3QuYyAgICAgICAgICB8ICAyOSArLQo+ID4gPiAgaW5jbHVkZS9zb2MvbXNjYy9vY2Vs b3QuaCAgICAgICAgICAgICAgICAgfCAgMTEgKwo+ID4gCj4gPiBQbGVhc2UgYXZvaWQgbWl4aW5n IHN1YnN5c3RlbXMgaW4gcGF0Y2hlcyBpZiBhdCBhbGwgYXZvaWRhYmxlLgo+ID4gCj4gPiBJZiB0 aGVyZSBhcmUgbm90IGJ1aWxkIHRpbWUgZGVwZW5kZW5jaWVzL2JyZWFrYWdlcywgSSdkIHN1Z2dl c3QKPiA+IGZpcnN0bHkgYXBwbHlpbmcgc3VwcG9ydCBmb3IgdGhpcyBpbnRvIE1GRCAqdGhlbiog dXRpbGlzaW5nIHRoYXQKPiA+IHN1cHBvcnQgaW4gc3Vic2VxdWVudCBwYXRjaGVzLgo+IAo+IE15 IGxhc3QgUkZDIGRpZCB0aGlzLCBhbmQgeW91IGhhZCBzdWdnZXN0ZWQgdG8gc3F1YXNoIHRoZSBj b21taXRzLiBUbwo+IGNsYXJpZnksIGFyZSB5b3Ugc3VnZ2VzdGluZyB0aGUgTUZEIC8gUGluY3Ry bCBnZXQgYXBwbGllZCBpbiBhIHNpbmdsZQo+IHBhdGNoLCB0aGVuIHRoZSBNSUlNIGdldCBhcHBs aWVkIGluIGEgc2VwYXJhdGUgb25lPyBCZWNhdXNlIEkgaGFkCj4gc3RhcnRlZCB3aXRoIHdoYXQg c291bmRzIGxpa2UgeW91J3JlIGRlc2NyaWJpbmcgLSBhbiAiZW1wdHkiIE1GRCB3aXRoCj4gc3Vi c2VxdWVudCBwYXRjaGVzIHJvbGxpbmcgaW4gZWFjaCBzdWJzeXN0ZW0uCj4gCj4gUGVyaGFwcyBJ IG1pc2ludGVycHJldGVkIHlvdXIgaW5pdGlhbCBmZWVkYmFjay4KCkkgd2FudCB5b3UgdG8gYWRk IGFsbCBkZXZpY2Ugc3VwcG9ydCBpbnRvIHRoZSBNRkQgZHJpdmVyIGF0IG9uY2UuCgpUaGUgYXNz b2NpYXRlZCBkcml2ZXJzLCB0aGUgb25lcyB0aGF0IGxpdmUgaW4gb3RoZXIgc3Vic3lzdGVtcywg c2hvdWxkCmJlIGFwcGxpZWQgYXMgc2VwYXJhdGUgcGF0Y2hlcy4gIFRoZXJlIHNlbGRvbSBleGlz dCBhbnkgKmJ1aWxkIHRpbWUqCmRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZSBkZXZpY2Ugc2lkZSBh bmQgdGhlIGRyaXZlciBzaWRlLgoKPiA+ID4gIDkgZmlsZXMgY2hhbmdlZCwgNjE0IGluc2VydGlv bnMoKyksIDE3IGRlbGV0aW9ucygtKQo+ID4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv bWZkL29jZWxvdC1jb3JlLmMKPiA+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21mZC9v Y2Vsb3Qtc3BpLmMKPiA+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21mZC9vY2Vsb3Qu aAo+ID4gPiAKPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJz L21mZC9LY29uZmlnCj4gPiA+IGluZGV4IGJhMGIzZWIxMzFmMS4uNTdiYmYyZDExMzI0IDEwMDY0 NAo+ID4gPiAtLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCj4gPiA+ICsrKyBiL2RyaXZlcnMvbWZk L0tjb25maWcKPiA+ID4gQEAgLTk0OCw2ICs5NDgsMjUgQEAgY29uZmlnIE1GRF9NRU5GMjFCTUMK PiA+ID4gIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBz byB0aGUgbW9kdWxlCj4gPiA+ICAJICB3aWxsIGJlIGNhbGxlZCBtZW5mMjFibWMuCj4gPiA+ICAK PiA+ID4gK2NvbmZpZyBNRkRfT0NFTE9UCj4gPiA+ICsJdHJpc3RhdGUgIk1pY3Jvc2VtaSBPY2Vs b3QgRXh0ZXJuYWwgQ29udHJvbCBTdXBwb3J0Igo+ID4gCj4gPiBQbGVhc2UgZXhwbGFpbiBleGFj dGx5IHdoYXQgYW4gRUNTIGlzIGluIHRoZSBoZWxwIGJlbG93Lgo+IAo+IEkgdGhvdWdodCBJIGhh ZCBieSB3YXkgb2YgdGhlIHNlY29uZCBwYXJhZ3JhcGggYmVsb3cuIEknbSB0cnlpbmcgdG8KPiB0 aGluayBvZiB3aGF0IGV4dHJhIGluZm9ybWF0aW9uIGNvdWxkIGJlIG9mIHVzZSBhdCB0aGlzIHBv aW50Li4uIAo+IAo+IEkgY291bGQgZGVzY3JpYmUgaG93IHRoZXkgaGF2ZSBpbnRlcm5hbCBwcm9j ZXNzb3JzIGFuZCB1c2luZyB0aGlzIGxldmVsCj4gb2YgY29udHJvbCB3b3VsZCBiYXNpY2FsbHkg YnlwYXNzIHRoYXQgZnVuY3Rpb25hbGl0eS4KClllcyBwbGVhc2UuCgpBbHNvIHByb3ZpZGUgZGV0 YWlscyBhYm91dCB3aGF0IHRoZSBkZXZpY2UgYWN0dWFsbHkgZG9lcy4KCj4gPiA+ICtzdGF0aWMg c3RydWN0IHJlZ21hcCAqb2NlbG90X2Rldm1fcmVnbWFwX2luaXQoc3RydWN0IG9jZWxvdF9jb3Jl ICpjb3JlLAo+ID4gPiArCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiA+ICsJCQkJ CSAgICAgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzKQo+ID4gPiArewo+ID4gPiArCXN0cnVj dCByZWdtYXAgKnJlZ21hcDsKPiA+ID4gKwo+ID4gPiArCXJlZ21hcCA9IGRldl9nZXRfcmVnbWFw KGRldiwgcmVzLT5uYW1lKTsKPiA+ID4gKwlpZiAoIXJlZ21hcCkKPiA+ID4gKwkJcmVnbWFwID0g b2NlbG90X3NwaV9kZXZtX2dldF9yZWdtYXAoY29yZSwgZGV2LCByZXMpOwo+ID4gCj4gPiBXaHkg YXJlIHlvdSBtYWtpbmcgU1BJIHNwZWNpZmljIGNhbGxzIGZyb20gdGhlIENvcmUgZHJpdmVyPwo+ IAo+IFRoaXMgd2FzIG15IGludGVycHJldGF0aW9uIG9mIHlvdXIgaW5pdGlhbCBmZWVkYmFjay4g SXQgd2FzIGluaXRpYWxseQo+IGltcGxlbWVudGVkIGFzIGEgY29uZmlnLT5nZXRfcmVnbWFwKCkg ZnVuY3Rpb24gcG9pbnRlciBzbyB0aGF0IGNvcmUKPiBkaWRuJ3QgbmVlZCB0byBrbm93IGFueXRo aW5nIGFib3V0IG9jZWxvdF9zcGkuCj4gCj4gSWYgZnVuY3Rpb24gcG9pbnRlcnMgYXJlbid0IHVz ZWQsIGl0IHNlZW1zIGxpa2UgY29yZSB3b3VsZCBoYXZlIHRvIGtub3cKPiBhYm91dCBhbGwgcG9z c2libGUgYnVzIHR5cGVzLi4uIE1heWJlIG15IG5hbWluZyBsZWQgdG8gc29tZQo+IG1pc3VuZGVy c3RhbmRpbmdzLiBTcGVjaWZpY2FsbHkgSSdkIHVzZWQgImluaXRfYnVzIiB3aGljaCB3YXMgaW50 ZW5kZWQKPiB0byBiZSAic2V0IHVwIHRoZSBjaGlwIHRvIGJlIGFibGUgdG8gcHJvcGVybHkgY29t bXVuaWNhdGUgdmlhIFNQSSIgYnV0Cj4gY291bGQgaGF2ZSBiZWVuIGludGVycHJldGVkIGFzICJ0 ZWxsIHRoZSB1c2VyIG9mIHRoaXMgZHJpdmVyIHRoYXQgdGhlCj4gYnVzIGlzIGJlaW5nIGluaXRp YWxpemVkIGJ5IHdheSBvZiBhIGNhbGxiYWNrIj8KCk9rYXksIEkgc2VlIHdoYXQncyBoYXBwZW5p bmcgbm93LgoKUGxlYXNlIGFkZCBhIGNvbW1lbnQgdG8gZGVzY3JpYmUgd2h5IHlvdSdyZSBjYWxs aW5nIG9uZSBoZWxwZXIsIHdoYXQKZmFpbHVyZSBtZWFucyBpbiB0aGUgZmlyc3QgaW5zdGFuY2Ug YW5kIHdoYXQgeW91IGhvcGUgdG8gYWNoaWV2ZSBieQpjYWxsaW5nIHRoZSBzdWJzZXF1ZW50IG9u ZS4KCj4gPiA+ICsJcmV0dXJuIHJlZ21hcDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RydWN0 IHJlZ21hcCAqb2NlbG90X2dldF9yZWdtYXBfZnJvbV9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpk ZXYsCj4gPiA+ICsJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKPiA+ID4g K3sKPiA+ID4gKwlzdHJ1Y3Qgb2NlbG90X2NvcmUgKmNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2 KTsKPiA+ID4gKwo+ID4gPiArCXJldHVybiBvY2Vsb3RfZGV2bV9yZWdtYXBfaW5pdChjb3JlLCBk ZXYsIHJlcyk7Cj4gPiA+ICt9Cj4gPiA+ICtFWFBPUlRfU1lNQk9MKG9jZWxvdF9nZXRfcmVnbWFw X2Zyb21fcmVzb3VyY2UpOwo+ID4gCj4gPiBXaHkgZG9uJ3QgeW91IGFsd2F5cyBjYWxsIG9jZWxv dF9kZXZtX3JlZ21hcF9pbml0KCkgd2l0aCB0aGUgJ2NvcmUnCj4gPiBwYXJhbWV0ZXIgZHJvcHBl ZCBhbmQganVzdCBkbyBkZXZfZ2V0X2RydmRhdGEoKSBpbnNpZGUgb2YgdGhlcmU/Cj4gPiAKPiA+ IFlvdSdyZSBwYXNzaW5nICdkZXYnIGFueXdheS4KPiAKPiBUaGlzIG1pZ2h0IGJlIGFuIGVycm9y LiBJJ2xsIGxvb2sgaW50byB0aGlzLCBidXQgSSBjaGFuZ2VkIHRoZSBpbnRlbmRlZAo+IGJlaGF2 aW9yIG9mIHRoaXMgYmV0d2VlbiB2NSBhbmQgdjYuCj4gCj4gSW4gdjUgSSBoYWQgaW50ZW5kZWQg dG8gYXR0YWNoIGFsbCByZWdtYXBzIHRvIHRoZSBzcGlfZGV2aWNlLiBUaGlzIHdheQo+IHRoZXkg Y291bGQgYmUgc2hhcmVkIGFtb25nc3QgY2hpbGQgZGV2aWNlcyBvZiBzcGktPmRldi4gSSB0aGlu ayB0aGF0IHdhcwo+IGEgYmFkIGRlc2lnbiBkZWNpc2lvbiBvbiBteSBwYXJ0LCBzbyBJIGFiYW5k b25lZCBpdC4gSWYgdGhlIGNoaWxkCj4gZGV2aWNlcyBhcmUgdG8gc2hhcmUgcmVnbWFwcywgdGhl eSBzaG91bGQgZXhwbGljaXRseSBkbyBzbyBieSB3YXkgb2YKPiBzeXNjb24sIG5vdCBpbXBsaWNp dGx5IGJ5IG5hbWUuCj4gCj4gSW4gdjYgbXkgaW50ZW50IGlzIHRvIGhhdmUgZXZlcnkgcmVnbWFw IGJlIGRldm0tbGlua2VkIHRvIHRoZSBjaGlsZHJlbi4KPiBUaGlzIHdheSB0aGUgcmVnbWFwIHdv dWxkIGJlIGRlc3Ryb3llZCBhbmQgcmVjcmVhdGVkIGJ5IHJtbW9kIC8gaW5zbW9kLAo+IG9mIHRo ZSBzdWItbW9kdWxlcywgaW5zdGVhZCBvZiBiZWluZyBrZXB0IGFyb3VuZCB0aGUgTUZEIG1vZHVs ZS4KCldoYXQncyB0aGUgcmVhc29uIGZvciB1c2luZyBhbiBNRkQgdG8gaGFuZGxlIHRoZSBSZWdt YXAocykgaWYgeW91J3JlCmdvaW5nIHRvIGhhdmUgcGVyLWRldmljZSBvbmVzIGFueXdheT8gIFdo eSBub3QgaGFuZGxlIHRoZW0gaW4gdGhlCmNoaWxkcmVuPwoKPiBTbyBwZXJoYXBzIHRvIGNsZWFy IHRoaXMgdXAgSSBzaG91bGQgcmVuYW1lICJkZXYiIHRvICJjaGlsZCIgYmVjYXVzZSBpdAo+IHNl ZW1zIHRoYXQgdGhlIG5hbWluZyBoYXMgYWxyZWFkeSBnb3R0ZW4gdG9vIGNvbmZ1c2luZy4gV2hh dCBJIGludGVuZGVkCj4gdG8gZG8gd2FzOgo+IAo+IHN0cnVjdCByZWdtYXAgKm9jZWxvdF9nZXRf cmVnbWFwX2Zyb21fcmVzb3VyY2Uoc3RydWN0IGRldmljZSAqcGFyZW50LAo+IAkJCQkJICAgICAg IHN0cnVjdCBkZXZpY2UgKmNoaWxkLAo+IAkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCByZXNvdXJj ZSAqcmVzKQo+IHsKPiAJc3RydWN0IG9jZWxvdF9jb3JlICpjb3JlID0gZGV2X2dldF9kcnZkYXRh KHBhcmVudCk7Cj4gCj4gCXJldHVybiBvY2Vsb3RfZGV2bV9yZWdtYXBfaW5pdChjb3JlLCBjaGls ZCwgcmVzKTsKPiB9Cj4gCj4gT3IgbWF5YmUgZXZlbjoKPiBzdHJ1Y3QgcmVnbWFwICpvY2Vsb3Rf Z2V0X3JlZ21hcF9mcm9tX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmNoaWxkLAo+IAkJCQkJICAg ICAgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzKQo+IHsKPiAJc3RydWN0IG9jZWxvdF9jb3Jl ICpjb3JlID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkLT5wYXJlbnQpOwo+IAo+IAlyZXR1cm4gb2Nl bG90X2Rldm1fcmVnbWFwX2luaXQoY29yZSwgY2hpbGQsIHJlcyk7Cj4gfQoKT3IganVzdCBjYWxs OgoKICBvY2Vsb3RfZGV2bV9yZWdtYXBfaW5pdChjb3JlLCBkZXYtPnBhcmVudCwgcmVzKTsKCi4u LiBmcm9tIHRoZSBvcmlnaW5hbCBjYWxsLXNpdGU/CgpPciwgYXMgSSBwcmV2aW91c2x5IHN1Z2dl c3RlZDoKCiAgb2NlbG90X2Rldm1fcmVnbWFwX2luaXQoZGV2LT5wYXJlbnQsIHJlcyk7CgpbLi4u XQoKPiA+ID4gKwlyZXQgPSBkZXZtX21mZF9hZGRfZGV2aWNlcyhkZXYsIFBMQVRGT1JNX0RFVklE X05PTkUsIHZzYzc1MTJfZGV2cywKPiA+IAo+ID4gV2h5IE5PTkU/Cj4gCj4gSSBkb250IGtub3cg dGhlIGltcGxpY2F0aW9uIGhlcmUuIEV4YW1wbGUgdGFrZW4gZnJvbQo+IGRyaXZlcnMvbWZkL21h ZGVyYS1jb3JlLmMuIEkgaW1hZ2luZSBQTEFURk9STV9ERVZJRF9BVVRPIGlzIHRoZSBjb3JyZWN0 Cj4gbWFjcm8gdG8gdXNlIGhlcmU/CgpUaGF0J3Mgd2h5IEkgYXNrZWQuICBQbGVhc2UgcmVhZC11 cCBvbiB0aGUgZGlmZmVyZW5jZXMgYW5kIHVzZSB0aGUKY29ycmVjdCBvbmUgZm9yIHlvdXIgZGV2 aWNlIGluc3RlYWQgb2YganVzdCBibGluZGx5IGNvcHkvcGFzdGluZyBmcm9tCm90aGVyIHNvdXJj ZXMuIDopCgpbLi4uXQoKPiA+ID4gKwlXQVJOX09OKCF2YWwpOwo+ID4gCj4gPiBJcyB0aGlzIHBv c3NpYmxlPwo+IAo+IEhtbS4uLiBJIGRvbid0IGtub3cgaWYgcmVnbWFwX3JlYWQgZ3VhcmRzIGFn YWluc3QgdmFsID09IE5VTEwuIEl0Cj4gZG9lc24ndCBsb29rIGxpa2UgaXQgZG9lcy4gSXQgaXMg dmVyeSBtdWNoIGEgInRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiIKPiBtb21lbnQuLi4KPiAKPiBJ IGNhbiByZW1vdmUgaXQsIG9yIGNoYW5nZSB0aGlzIHRvIHJldHVybiBhbiBlcnJvciBpZiAhdmFs LCB3aGljaCBpcwo+IHdoYXQgSSBwcm9iYWJseSBzaG91bGQgaGF2ZSBkb25lIGluIHRoZSBmaXJz dCBwbGFjZS4gVGhvdWdodHM/CgpOb3QgcmVhbGx5LiAgSnVzdCBtYWtlIHN1cmUgd2hhdGV2ZXIg eW91IGRlY2lkZSB0byBkbyBpcyBpbmZvcm1lZC4KClsuLi5dCgo+ID4gPiAtCXJlZ3MgPSBkZXZt X3BsYXRmb3JtX2lvcmVtYXBfcmVzb3VyY2UocGRldiwgMCk7Cj4gPiA+IC0JaWYgKElTX0VSUihy ZWdzKSkKPiA+ID4gLQkJcmV0dXJuIFBUUl9FUlIocmVncyk7Cj4gPiA+ICsJcmVzID0gcGxhdGZv cm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPiA+ID4gKwo+ID4gPiAr CWlmICghZGV2aWNlX2lzX21mZChwZGV2KSkgewo+ID4gPiArCQlyZWdzID0gZGV2bV9pb3JlbWFw X3Jlc291cmNlKGRldiwgcmVzKTsKPiA+IAo+ID4gV2hhdCBoYXBwZW5zIGlmIHlvdSBjYWxsIHRo aXMgaWYgdGhlIGRldmljZSB3YXMgcmVnaXN0ZXJlZCB2aWEgTUZEPwo+IAo+IEkgZG9uJ3QgcmVj YWxsIGlmIGl0IHdhcyB5b3VyIHN1Z2dlc3Rpb24sIGJ1dCBJIHRyaWVkIHRoaXMuCj4gZGV2bV9p b3JlbWFwX3Jlc291cmNlIG9uIHRoZSBNRkQgdHJpZ2dlcmVkIGEga2VybmVsIGNyYXNoLiBJIGRp ZG4ndCBsb29rCj4gbXVjaCBtb3JlIGludG8gdGhpbmdzIHRoYW4gdGhhdCwgYnV0IGlmIHRyeWlu ZyBkZXZtX2lvcmVtYXBfcmVzb3VyY2UgYW5kCj4gZmFsbGluZyBiYWNrIHRvIG9jZWxvdF9nZXRf cmVnbWFwX2Zyb21fcmVzb3VyY2UgaXMgdGhlIGRlc2lyZWQgcGF0aCwgSQo+IGNhbiBpbnZlc3Rp Z2F0ZSBmdXJ0aGVyLgoKWWVzIHBsZWFzZS4gIEl0IHNob3VsZCBuZXZlciBjcmFzaC4gIFRoYXQn cyBwcm9iYWJseSBhIGJ1Zy4KCi0tIApMZWUgSm9uZXMgW+adjueQvOaWr10KUHJpbmNpcGFsIFRl Y2huaWNhbCBMZWFkIC0gRGV2ZWxvcGVyIFNlcnZpY2VzCkxpbmFyby5vcmcg4pSCIE9wZW4gc291 cmNlIHNvZnR3YXJlIGZvciBBcm0gU29DcwpGb2xsb3cgTGluYXJvOiBGYWNlYm9vayB8IFR3aXR0 ZXIgfCBCbG9nCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmlu ZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9s aW51eC1hcm0ta2VybmVsCg==