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 59FA0C54FB3 for ; Mon, 2 Jun 2025 12:18:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date :Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=+Aed1G3zEdiAE6/euJzRcaSWP5Y0mYDbnxPBMhKta6o=; b=CXCxttteWw3tuuW+b12xq7jHEK 2WOLhVYwqawhswINQqC9j8Y/VfXfQsHKNOfRCubCgE7vDUCKHB8jvTWr/dog+oKQVrt52up8VpbyE JUEauw74txMqiedBEHhcOLs5oLtLYcLgmyWyDw2jSWqz2y7GkvI9F1JND3Eg4cyj5TzNY/+h92prr 6EVY/cRw4HoIYn/ec2In9cOKvrT86bUhk5dThGOO315DH3ZMepONgWyti68LxgFF+JDPhKFpi8976 JP6ARox+O05aAeCmjD/tOgviLOYNV7SAYkrnwDRlf6SG15/v0KP+IbSc3RWyX26wg/o9WypIAlc4W XHMQn83w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uM47h-00000007Lam-3Q0p; Mon, 02 Jun 2025 12:18:37 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1uM45U-00000007LOE-47fF; Mon, 02 Jun 2025 12:16:22 +0000 ARC-Seal: i=1; a=rsa-sha256; t=1748866555; cv=none; d=zohomail.com; s=zohoarc; b=Vze/kjONo0AB70e1wZ0QkC2ynBo7Zq0uf545gqPwLvISGOTvuXAzUA+ZQUkgT/yabPY4SAI2wwfEWd++Pw3ju8eduO8POg4kuAyjrjtBUPFe1VIXQ8CPEs6/uW48a5pNQRRtUDuzPd49Pq89mcCcI+He1MfMlB0Ae4mruy/63t4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1748866555; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=+Aed1G3zEdiAE6/euJzRcaSWP5Y0mYDbnxPBMhKta6o=; b=Iw8ItoI0JX6aQ7esTRNbGbiSqiY+ajT7E3BJrKp1tp4mWqzgrycY7i4VNskyjzLnX6K4u6E59RojQDqqL8WpN3cLmJNGRiLl1gHrZnTGn6eQP0ldwqgtMogpDTDMFSXhgOH1r9GUfwXsAAstygtb/1rooxcO3R0AsBzW1FynCsM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1748866555; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Content-Type:Message-Id:Reply-To; bh=+Aed1G3zEdiAE6/euJzRcaSWP5Y0mYDbnxPBMhKta6o=; b=O39AVe9TKwe84UGQR/XEuzyNvSLxFaej5EFC98AH5IcrJ9mhLCJkAz3qaYrbCR9o Noy0MVDMzoyJCuqqYeai7k8gxbeP26nKRLSelY36aQlr373aHsEfUJelARxQdb4wGdR nqdhZxkeKZF7d+Wr9EUcC0NT9lkWqv/EleeL9MEE= Received: by mx.zohomail.com with SMTPS id 1748866552562746.0707424997689; Mon, 2 Jun 2025 05:15:52 -0700 (PDT) From: Nicolas Frattaroli To: Linus Walleij , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Uwe =?UTF-8?B?S2xlaW5lLUvDtm5pZw==?= , William Breathitt Gray , Sebastian Reichel , Kever Yang , Heiko =?UTF-8?B?U3TDvGJuZXI=?= Cc: linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org, linux-iio@vger.kernel.org, kernel@collabora.com, Jonas Karlman , Detlev Casanova Subject: Re: [PATCH 4/7] soc: rockchip: add mfpwm driver Date: Mon, 02 Jun 2025 14:15:45 +0200 Message-ID: <13790724.uLZWGnKmhe@workhorse> In-Reply-To: <2188729.OBFZWjSADL@diego> References: <20250408-rk3576-pwm-v1-0-a49286c2ca8e@collabora.com> <20250408-rk3576-pwm-v1-4-a49286c2ca8e@collabora.com> <2188729.OBFZWjSADL@diego> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250602_051621_070370_23D8D00A X-CRM114-Status: GOOD ( 41.13 ) 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: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Saturday, 31 May 2025 23:48:29 Central European Summer Time Heiko St=C3= =BCbner wrote: > Am Dienstag, 8. April 2025, 14:32:16 Mitteleurop=C3=A4ische Sommerzeit sc= hrieb Nicolas Frattaroli: > > With the Rockchip RK3576, the PWM IP used by Rockchip has changed > > substantially. Looking at both the downstream pwm-rockchip driver as > > well as the mainline pwm-rockchip driver made it clear that with all its > > additional features and its differences from previous IP revisions, it > > is best supported in a new driver. > >=20 > > This brings us to the question as to what such a new driver should be. > > To me, it soon became clear that it should actually be several new > > drivers, most prominently when Uwe Kleine-K=C3=B6nig let me know that I > > should not implement the pwm subsystem's capture callback, but instead > > write a counter driver for this functionality. > >=20 > > Combined with the other as-of-yet unimplemented functionality of this > > new IP, it became apparent that it needs to be spread across several > > subsystems. > >=20 > > For this reason, we add a new platform bus based driver, called mfpwm > > (short for "Multi-function PWM"). This "parent" driver makes sure that > > only one device function driver is using the device at a time, and is in > > charge of registering the platform bus devices for the individual device > > functions offered by the device. > >=20 > > An acquire/release pattern is used to guarantee that device function > > drivers don't step on each other's toes. > >=20 > > Signed-off-by: Nicolas Frattaroli >=20 > actually trying to compile this, led me to >=20 > aarch64-linux-gnu-ld: drivers/soc/rockchip/mfpwm.o: in function `mfpwm_re= g_read': > /home/devel/hstuebner/00_git-repos/linux-rockchip/_build-arm64/../include= /soc/rockchip/mfpwm.h:423: multiple definition of `mfpwm_reg_read'; drivers= /pwm/pwm-rockchip-v4.o:/home/devel/hstuebner/00_git-repos/linux-rockchip/_b= uild-arm64/../include/soc/rockchip/mfpwm.h:423: first defined here > aarch64-linux-gnu-ld: drivers/soc/rockchip/mfpwm.o: in function `mfpwm_re= g_write': > /home/devel/hstuebner/00_git-repos/linux-rockchip/_build-arm64/../include= /soc/rockchip/mfpwm.h:428: multiple definition of `mfpwm_reg_write'; driver= s/pwm/pwm-rockchip-v4.o:/home/devel/hstuebner/00_git-repos/linux-rockchip/_= build-arm64/../include/soc/rockchip/mfpwm.h:428: first defined here > make[3]: *** [../scripts/Makefile.vmlinux_o:72: vmlinux.o] Fehler 1 >=20 >=20 > during the linking stage - with the driver as builtin >=20 >=20 > > +inline u32 mfpwm_reg_read(void __iomem *base, u32 reg) > > +{ > > + return readl(base + reg); > > +} > > + > > +inline void mfpwm_reg_write(void __iomem *base, u32 reg, u32 val) > > +{ > > + writel(val, base + reg); > > +} >=20 > making that a "static inline ..." solves that. Ack, will change >=20 >=20 > On a more general note, what is the differentiation to an MFD here? >=20 > Like you can already bind dt-nodes to MFD subdevices, and can implement > the exclusivity API thing on top of a general mfd device, to make sure on= ly > one mfd-cell gets activated at one time. >=20 > Other than that, this looks like it reimplements MFDs? What initially made me not make this an MFD was Uwe Kleine-K=C3=B6nig expre= ssing some doubts, which lead me to alternatives like the auxiliary bus. Reading = the auxiliary bus docs I found: A key requirement for utilizing the auxiliary bus is that there is no dependency on a physical bus, device, register accesses or regmap support. These individual devices split from the core cannot live on the platform bus as they are not physical devices that are controlled by DT/ACPI. The same argument applies for not using MFD in this scenario as MFD relies on individual function devices being physical devices. Additionally, LWN[1] about the auxiliary bus, which I've read up on during = my ill-fated journey into that version of the driver, also goes further into w= hy MFD is sometimes a bad fit: Linux already includes a number of drivers for multi-function devices. One of the ways to support them is the Multi-Function Devices (MFD) subsystem. It handles independent devices "glued" together into one hardware block which may contain some shared resources. MFD allows access to device registers either directly, or using a common bus. In this second case, it conveniently multiplexes accesses on Inter-Integrated Circuit (I2C) or Serial Peripheral Interface (SPI) buses. As the MFD sub-devices are separate, MFD drivers do not share a common state. The devices Ertman addresses do not fit well into the MFD model. Devices using the auxiliary bus provide subsets of the capabilities of a single hardware device. They do not expose separate register sets for each function; thus they cannot be described by devicetrees or discovered by ACPI. Their drivers need to share access to the hardware. Events concerni= ng all sub-functionalities (like power management) need to be properly handl= ed by all drivers. The individual function devices may be all pointing at the same physical device here, but they're not distinct parts of the device. However, there still *is* a physical device, which convinced me that auxiliary bus wasn't the right one either, and the idea for just using the platform bus came during a work meeting. If someone with experience on aux bus vs platform bus (what this uses) vs MFD, then feel free to chime in. Unfortunately, as is t= he norm, I can't seem to find much in terms of MFD documentation. Needing to k= now what type of exclusion they guarantee and what type of abstractions they br= ing with them that would make them more useful than my solution would need some justification in more than just an auto-generated header listing. I am very inclined to start pretending things that aren't documented do not actually exist in the kernel, because it's very annoying to have to constantly deal with this. >=20 > Also handing around a regmap might be nicer, compared to readl/writel. Strong disagree, adding error handling around every single register read and write, and needing to always read into a variable rather than getting the read value as a return value, made the drivers a lot uglier in a previous iteration of this. >=20 >=20 > Heiko >=20 Kind regards, Nicolas Frattaroli [1]: https://lwn.net/Articles/840416/ 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 8F4B8C5AD49 for ; Mon, 2 Jun 2025 12:18:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ifJhYCtIFhBKzb1wDNufeyvB13AzPTf3PyCX7Lgo4nA=; b=DrnQBzBzSlmSP1 3XxkJXfwglbYaPhfEGAF37wHe4cQQg6lVIXklWqJFRoU14nlKR3g4DfuevbvlOODPqIRc+BSTiDcs rLW2Pqe1kGfpTxD4pVqeHcX1U9O4mq4t20eaUxBqDEXGJ2MzWoxqZPse0U9u7kTT4MULqEr1n/EPK nM7UQ71+xfrXvytIi+Sy/LD0cYWYgazoJKF03OYK4AglYaHI0UHK3+Y0yaRjtNukyX/wNwR4e/3hw q2ZTyBJOEOSu0441tElFxpm7mFhO6tsAQMWD8FeqQkQw0PTbs1YlZ9WqconPfrvfLhaD1N9tl02xp fdkc1TMQw4Ti8x7vkZXg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uM47i-00000007Laq-1N6U; Mon, 02 Jun 2025 12:18:38 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1uM45U-00000007LOE-47fF; Mon, 02 Jun 2025 12:16:22 +0000 ARC-Seal: i=1; a=rsa-sha256; t=1748866555; cv=none; d=zohomail.com; s=zohoarc; b=Vze/kjONo0AB70e1wZ0QkC2ynBo7Zq0uf545gqPwLvISGOTvuXAzUA+ZQUkgT/yabPY4SAI2wwfEWd++Pw3ju8eduO8POg4kuAyjrjtBUPFe1VIXQ8CPEs6/uW48a5pNQRRtUDuzPd49Pq89mcCcI+He1MfMlB0Ae4mruy/63t4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1748866555; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=+Aed1G3zEdiAE6/euJzRcaSWP5Y0mYDbnxPBMhKta6o=; b=Iw8ItoI0JX6aQ7esTRNbGbiSqiY+ajT7E3BJrKp1tp4mWqzgrycY7i4VNskyjzLnX6K4u6E59RojQDqqL8WpN3cLmJNGRiLl1gHrZnTGn6eQP0ldwqgtMogpDTDMFSXhgOH1r9GUfwXsAAstygtb/1rooxcO3R0AsBzW1FynCsM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1748866555; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Content-Type:Message-Id:Reply-To; bh=+Aed1G3zEdiAE6/euJzRcaSWP5Y0mYDbnxPBMhKta6o=; b=O39AVe9TKwe84UGQR/XEuzyNvSLxFaej5EFC98AH5IcrJ9mhLCJkAz3qaYrbCR9o Noy0MVDMzoyJCuqqYeai7k8gxbeP26nKRLSelY36aQlr373aHsEfUJelARxQdb4wGdR nqdhZxkeKZF7d+Wr9EUcC0NT9lkWqv/EleeL9MEE= Received: by mx.zohomail.com with SMTPS id 1748866552562746.0707424997689; Mon, 2 Jun 2025 05:15:52 -0700 (PDT) From: Nicolas Frattaroli To: Linus Walleij , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Uwe =?UTF-8?B?S2xlaW5lLUvDtm5pZw==?= , William Breathitt Gray , Sebastian Reichel , Kever Yang , Heiko =?UTF-8?B?U3TDvGJuZXI=?= Cc: linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org, linux-iio@vger.kernel.org, kernel@collabora.com, Jonas Karlman , Detlev Casanova Subject: Re: [PATCH 4/7] soc: rockchip: add mfpwm driver Date: Mon, 02 Jun 2025 14:15:45 +0200 Message-ID: <13790724.uLZWGnKmhe@workhorse> In-Reply-To: <2188729.OBFZWjSADL@diego> References: <20250408-rk3576-pwm-v1-0-a49286c2ca8e@collabora.com> <20250408-rk3576-pwm-v1-4-a49286c2ca8e@collabora.com> <2188729.OBFZWjSADL@diego> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250602_051621_070370_23D8D00A X-CRM114-Status: GOOD ( 41.13 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org T24gU2F0dXJkYXksIDMxIE1heSAyMDI1IDIzOjQ4OjI5IENlbnRyYWwgRXVyb3BlYW4gU3VtbWVy IFRpbWUgSGVpa28gU3TDvGJuZXIgd3JvdGU6Cj4gQW0gRGllbnN0YWcsIDguIEFwcmlsIDIwMjUs IDE0OjMyOjE2IE1pdHRlbGV1cm9ww6Rpc2NoZSBTb21tZXJ6ZWl0IHNjaHJpZWIgTmljb2xhcyBG cmF0dGFyb2xpOgo+ID4gV2l0aCB0aGUgUm9ja2NoaXAgUkszNTc2LCB0aGUgUFdNIElQIHVzZWQg YnkgUm9ja2NoaXAgaGFzIGNoYW5nZWQKPiA+IHN1YnN0YW50aWFsbHkuIExvb2tpbmcgYXQgYm90 aCB0aGUgZG93bnN0cmVhbSBwd20tcm9ja2NoaXAgZHJpdmVyIGFzCj4gPiB3ZWxsIGFzIHRoZSBt YWlubGluZSBwd20tcm9ja2NoaXAgZHJpdmVyIG1hZGUgaXQgY2xlYXIgdGhhdCB3aXRoIGFsbCBp dHMKPiA+IGFkZGl0aW9uYWwgZmVhdHVyZXMgYW5kIGl0cyBkaWZmZXJlbmNlcyBmcm9tIHByZXZp b3VzIElQIHJldmlzaW9ucywgaXQKPiA+IGlzIGJlc3Qgc3VwcG9ydGVkIGluIGEgbmV3IGRyaXZl ci4KPiA+IAo+ID4gVGhpcyBicmluZ3MgdXMgdG8gdGhlIHF1ZXN0aW9uIGFzIHRvIHdoYXQgc3Vj aCBhIG5ldyBkcml2ZXIgc2hvdWxkIGJlLgo+ID4gVG8gbWUsIGl0IHNvb24gYmVjYW1lIGNsZWFy IHRoYXQgaXQgc2hvdWxkIGFjdHVhbGx5IGJlIHNldmVyYWwgbmV3Cj4gPiBkcml2ZXJzLCBtb3N0 IHByb21pbmVudGx5IHdoZW4gVXdlIEtsZWluZS1Lw7ZuaWcgbGV0IG1lIGtub3cgdGhhdCBJCj4g PiBzaG91bGQgbm90IGltcGxlbWVudCB0aGUgcHdtIHN1YnN5c3RlbSdzIGNhcHR1cmUgY2FsbGJh Y2ssIGJ1dCBpbnN0ZWFkCj4gPiB3cml0ZSBhIGNvdW50ZXIgZHJpdmVyIGZvciB0aGlzIGZ1bmN0 aW9uYWxpdHkuCj4gPiAKPiA+IENvbWJpbmVkIHdpdGggdGhlIG90aGVyIGFzLW9mLXlldCB1bmlt cGxlbWVudGVkIGZ1bmN0aW9uYWxpdHkgb2YgdGhpcwo+ID4gbmV3IElQLCBpdCBiZWNhbWUgYXBw YXJlbnQgdGhhdCBpdCBuZWVkcyB0byBiZSBzcHJlYWQgYWNyb3NzIHNldmVyYWwKPiA+IHN1YnN5 c3RlbXMuCj4gPiAKPiA+IEZvciB0aGlzIHJlYXNvbiwgd2UgYWRkIGEgbmV3IHBsYXRmb3JtIGJ1 cyBiYXNlZCBkcml2ZXIsIGNhbGxlZCBtZnB3bQo+ID4gKHNob3J0IGZvciAiTXVsdGktZnVuY3Rp b24gUFdNIikuIFRoaXMgInBhcmVudCIgZHJpdmVyIG1ha2VzIHN1cmUgdGhhdAo+ID4gb25seSBv bmUgZGV2aWNlIGZ1bmN0aW9uIGRyaXZlciBpcyB1c2luZyB0aGUgZGV2aWNlIGF0IGEgdGltZSwg YW5kIGlzIGluCj4gPiBjaGFyZ2Ugb2YgcmVnaXN0ZXJpbmcgdGhlIHBsYXRmb3JtIGJ1cyBkZXZp Y2VzIGZvciB0aGUgaW5kaXZpZHVhbCBkZXZpY2UKPiA+IGZ1bmN0aW9ucyBvZmZlcmVkIGJ5IHRo ZSBkZXZpY2UuCj4gPiAKPiA+IEFuIGFjcXVpcmUvcmVsZWFzZSBwYXR0ZXJuIGlzIHVzZWQgdG8g Z3VhcmFudGVlIHRoYXQgZGV2aWNlIGZ1bmN0aW9uCj4gPiBkcml2ZXJzIGRvbid0IHN0ZXAgb24g ZWFjaCBvdGhlcidzIHRvZXMuCj4gPiAKPiA+IFNpZ25lZC1vZmYtYnk6IE5pY29sYXMgRnJhdHRh cm9saSA8bmljb2xhcy5mcmF0dGFyb2xpQGNvbGxhYm9yYS5jb20+Cj4gCj4gYWN0dWFsbHkgdHJ5 aW5nIHRvIGNvbXBpbGUgdGhpcywgbGVkIG1lIHRvCj4gCj4gYWFyY2g2NC1saW51eC1nbnUtbGQ6 IGRyaXZlcnMvc29jL3JvY2tjaGlwL21mcHdtLm86IGluIGZ1bmN0aW9uIGBtZnB3bV9yZWdfcmVh ZCc6Cj4gL2hvbWUvZGV2ZWwvaHN0dWVibmVyLzAwX2dpdC1yZXBvcy9saW51eC1yb2NrY2hpcC9f YnVpbGQtYXJtNjQvLi4vaW5jbHVkZS9zb2Mvcm9ja2NoaXAvbWZwd20uaDo0MjM6IG11bHRpcGxl IGRlZmluaXRpb24gb2YgYG1mcHdtX3JlZ19yZWFkJzsgZHJpdmVycy9wd20vcHdtLXJvY2tjaGlw LXY0Lm86L2hvbWUvZGV2ZWwvaHN0dWVibmVyLzAwX2dpdC1yZXBvcy9saW51eC1yb2NrY2hpcC9f YnVpbGQtYXJtNjQvLi4vaW5jbHVkZS9zb2Mvcm9ja2NoaXAvbWZwd20uaDo0MjM6IGZpcnN0IGRl ZmluZWQgaGVyZQo+IGFhcmNoNjQtbGludXgtZ251LWxkOiBkcml2ZXJzL3NvYy9yb2NrY2hpcC9t ZnB3bS5vOiBpbiBmdW5jdGlvbiBgbWZwd21fcmVnX3dyaXRlJzoKPiAvaG9tZS9kZXZlbC9oc3R1 ZWJuZXIvMDBfZ2l0LXJlcG9zL2xpbnV4LXJvY2tjaGlwL19idWlsZC1hcm02NC8uLi9pbmNsdWRl L3NvYy9yb2NrY2hpcC9tZnB3bS5oOjQyODogbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiBgbWZwd21f cmVnX3dyaXRlJzsgZHJpdmVycy9wd20vcHdtLXJvY2tjaGlwLXY0Lm86L2hvbWUvZGV2ZWwvaHN0 dWVibmVyLzAwX2dpdC1yZXBvcy9saW51eC1yb2NrY2hpcC9fYnVpbGQtYXJtNjQvLi4vaW5jbHVk ZS9zb2Mvcm9ja2NoaXAvbWZwd20uaDo0Mjg6IGZpcnN0IGRlZmluZWQgaGVyZQo+IG1ha2VbM106 ICoqKiBbLi4vc2NyaXB0cy9NYWtlZmlsZS52bWxpbnV4X286NzI6IHZtbGludXgub10gRmVobGVy IDEKPiAKPiAKPiBkdXJpbmcgdGhlIGxpbmtpbmcgc3RhZ2UgLSB3aXRoIHRoZSBkcml2ZXIgYXMg YnVpbHRpbgo+IAo+IAo+ID4gK2lubGluZSB1MzIgbWZwd21fcmVnX3JlYWQodm9pZCBfX2lvbWVt ICpiYXNlLCB1MzIgcmVnKQo+ID4gK3sKPiA+ICsJcmV0dXJuIHJlYWRsKGJhc2UgKyByZWcpOwo+ ID4gK30KPiA+ICsKPiA+ICtpbmxpbmUgdm9pZCBtZnB3bV9yZWdfd3JpdGUodm9pZCBfX2lvbWVt ICpiYXNlLCB1MzIgcmVnLCB1MzIgdmFsKQo+ID4gK3sKPiA+ICsJd3JpdGVsKHZhbCwgYmFzZSAr IHJlZyk7Cj4gPiArfQo+IAo+IG1ha2luZyB0aGF0IGEgInN0YXRpYyBpbmxpbmUgLi4uIiBzb2x2 ZXMgdGhhdC4KCkFjaywgd2lsbCBjaGFuZ2UKCj4gCj4gCj4gT24gYSBtb3JlIGdlbmVyYWwgbm90 ZSwgd2hhdCBpcyB0aGUgZGlmZmVyZW50aWF0aW9uIHRvIGFuIE1GRCBoZXJlPwo+IAo+IExpa2Ug eW91IGNhbiBhbHJlYWR5IGJpbmQgZHQtbm9kZXMgdG8gTUZEIHN1YmRldmljZXMsIGFuZCBjYW4g aW1wbGVtZW50Cj4gdGhlIGV4Y2x1c2l2aXR5IEFQSSB0aGluZyBvbiB0b3Agb2YgYSBnZW5lcmFs IG1mZCBkZXZpY2UsIHRvIG1ha2Ugc3VyZSBvbmx5Cj4gb25lIG1mZC1jZWxsIGdldHMgYWN0aXZh dGVkIGF0IG9uZSB0aW1lLgo+IAo+IE90aGVyIHRoYW4gdGhhdCwgdGhpcyBsb29rcyBsaWtlIGl0 IHJlaW1wbGVtZW50cyBNRkRzPwoKV2hhdCBpbml0aWFsbHkgbWFkZSBtZSBub3QgbWFrZSB0aGlz IGFuIE1GRCB3YXMgVXdlIEtsZWluZS1Lw7ZuaWcgZXhwcmVzc2luZwpzb21lIGRvdWJ0cywgd2hp Y2ggbGVhZCBtZSB0byBhbHRlcm5hdGl2ZXMgbGlrZSB0aGUgYXV4aWxpYXJ5IGJ1cy4gUmVhZGlu ZyB0aGUKYXV4aWxpYXJ5IGJ1cyBkb2NzIEkgZm91bmQ6CgogIEEga2V5IHJlcXVpcmVtZW50IGZv ciB1dGlsaXppbmcgdGhlIGF1eGlsaWFyeSBidXMgaXMgdGhhdCB0aGVyZSBpcyBubwogIGRlcGVu ZGVuY3kgb24gYSBwaHlzaWNhbCBidXMsIGRldmljZSwgcmVnaXN0ZXIgYWNjZXNzZXMgb3IgcmVn bWFwIHN1cHBvcnQuCiAgVGhlc2UgaW5kaXZpZHVhbCBkZXZpY2VzIHNwbGl0IGZyb20gdGhlIGNv cmUgY2Fubm90IGxpdmUgb24gdGhlIHBsYXRmb3JtCiAgYnVzIGFzIHRoZXkgYXJlIG5vdCBwaHlz aWNhbCBkZXZpY2VzIHRoYXQgYXJlIGNvbnRyb2xsZWQgYnkgRFQvQUNQSS4gVGhlCiAgc2FtZSBh cmd1bWVudCBhcHBsaWVzIGZvciBub3QgdXNpbmcgTUZEIGluIHRoaXMgc2NlbmFyaW8gYXMgTUZE IHJlbGllcyBvbgogIGluZGl2aWR1YWwgZnVuY3Rpb24gZGV2aWNlcyBiZWluZyBwaHlzaWNhbCBk ZXZpY2VzLgoKQWRkaXRpb25hbGx5LCBMV05bMV0gYWJvdXQgdGhlIGF1eGlsaWFyeSBidXMsIHdo aWNoIEkndmUgcmVhZCB1cCBvbiBkdXJpbmcgbXkKaWxsLWZhdGVkIGpvdXJuZXkgaW50byB0aGF0 IHZlcnNpb24gb2YgdGhlIGRyaXZlciwgYWxzbyBnb2VzIGZ1cnRoZXIgaW50byB3aHkKTUZEIGlz IHNvbWV0aW1lcyBhIGJhZCBmaXQ6CgogIExpbnV4IGFscmVhZHkgaW5jbHVkZXMgYSBudW1iZXIg b2YgZHJpdmVycyBmb3IgbXVsdGktZnVuY3Rpb24gZGV2aWNlcy4gT25lCiAgb2YgdGhlIHdheXMg dG8gc3VwcG9ydCB0aGVtIGlzIHRoZSBNdWx0aS1GdW5jdGlvbiBEZXZpY2VzIChNRkQpIHN1YnN5 c3RlbS4KICBJdCBoYW5kbGVzIGluZGVwZW5kZW50IGRldmljZXMgImdsdWVkIiB0b2dldGhlciBp bnRvIG9uZSBoYXJkd2FyZSBibG9jawogIHdoaWNoIG1heSBjb250YWluIHNvbWUgc2hhcmVkIHJl c291cmNlcy4gTUZEIGFsbG93cyBhY2Nlc3MgdG8gZGV2aWNlCiAgcmVnaXN0ZXJzIGVpdGhlciBk aXJlY3RseSwgb3IgdXNpbmcgYSBjb21tb24gYnVzLiBJbiB0aGlzIHNlY29uZCBjYXNlLCBpdAog IGNvbnZlbmllbnRseSBtdWx0aXBsZXhlcyBhY2Nlc3NlcyBvbiBJbnRlci1JbnRlZ3JhdGVkIENp cmN1aXQgKEkyQykgb3IKICBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgYnVzZXMu IEFzIHRoZSBNRkQgc3ViLWRldmljZXMgYXJlCiAgc2VwYXJhdGUsIE1GRCBkcml2ZXJzIGRvIG5v dCBzaGFyZSBhIGNvbW1vbiBzdGF0ZS4KCiAgVGhlIGRldmljZXMgRXJ0bWFuIGFkZHJlc3NlcyBk byBub3QgZml0IHdlbGwgaW50byB0aGUgTUZEIG1vZGVsLiBEZXZpY2VzCiAgdXNpbmcgdGhlIGF1 eGlsaWFyeSBidXMgcHJvdmlkZSBzdWJzZXRzIG9mIHRoZSBjYXBhYmlsaXRpZXMgb2YgYSBzaW5n bGUKICBoYXJkd2FyZSBkZXZpY2UuIFRoZXkgZG8gbm90IGV4cG9zZSBzZXBhcmF0ZSByZWdpc3Rl ciBzZXRzIGZvciBlYWNoCiAgZnVuY3Rpb247IHRodXMgdGhleSBjYW5ub3QgYmUgZGVzY3JpYmVk IGJ5IGRldmljZXRyZWVzIG9yIGRpc2NvdmVyZWQgYnkKICBBQ1BJLiBUaGVpciBkcml2ZXJzIG5l ZWQgdG8gc2hhcmUgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZS4gRXZlbnRzIGNvbmNlcm5pbmcKICBh bGwgc3ViLWZ1bmN0aW9uYWxpdGllcyAobGlrZSBwb3dlciBtYW5hZ2VtZW50KSBuZWVkIHRvIGJl IHByb3Blcmx5IGhhbmRsZWQKICBieSBhbGwgZHJpdmVycy4KClRoZSBpbmRpdmlkdWFsIGZ1bmN0 aW9uIGRldmljZXMgbWF5IGJlIGFsbCBwb2ludGluZyBhdCB0aGUgc2FtZSBwaHlzaWNhbApkZXZp Y2UgaGVyZSwgYnV0IHRoZXkncmUgbm90IGRpc3RpbmN0IHBhcnRzIG9mIHRoZSBkZXZpY2UuIEhv d2V2ZXIsIHRoZXJlCnN0aWxsICppcyogYSBwaHlzaWNhbCBkZXZpY2UsIHdoaWNoIGNvbnZpbmNl ZCBtZSB0aGF0IGF1eGlsaWFyeSBidXMgd2Fzbid0CnRoZSByaWdodCBvbmUgZWl0aGVyLCBhbmQg dGhlIGlkZWEgZm9yIGp1c3QgdXNpbmcgdGhlIHBsYXRmb3JtIGJ1cyBjYW1lCmR1cmluZyBhIHdv cmsgbWVldGluZy4gSWYgc29tZW9uZSB3aXRoIGV4cGVyaWVuY2Ugb24gYXV4IGJ1cyB2cyBwbGF0 Zm9ybSBidXMKKHdoYXQgdGhpcyB1c2VzKSB2cyBNRkQsIHRoZW4gZmVlbCBmcmVlIHRvIGNoaW1l IGluLiBVbmZvcnR1bmF0ZWx5LCBhcyBpcyB0aGUKbm9ybSwgSSBjYW4ndCBzZWVtIHRvIGZpbmQg bXVjaCBpbiB0ZXJtcyBvZiBNRkQgZG9jdW1lbnRhdGlvbi4gTmVlZGluZyB0byBrbm93CndoYXQg dHlwZSBvZiBleGNsdXNpb24gdGhleSBndWFyYW50ZWUgYW5kIHdoYXQgdHlwZSBvZiBhYnN0cmFj dGlvbnMgdGhleSBicmluZwp3aXRoIHRoZW0gdGhhdCB3b3VsZCBtYWtlIHRoZW0gbW9yZSB1c2Vm dWwgdGhhbiBteSBzb2x1dGlvbiB3b3VsZCBuZWVkIHNvbWUKanVzdGlmaWNhdGlvbiBpbiBtb3Jl IHRoYW4ganVzdCBhbiBhdXRvLWdlbmVyYXRlZCBoZWFkZXIgbGlzdGluZy4KCkkgYW0gdmVyeSBp bmNsaW5lZCB0byBzdGFydCBwcmV0ZW5kaW5nIHRoaW5ncyB0aGF0IGFyZW4ndCBkb2N1bWVudGVk IGRvCm5vdCBhY3R1YWxseSBleGlzdCBpbiB0aGUga2VybmVsLCBiZWNhdXNlIGl0J3MgdmVyeSBh bm5veWluZyB0byBoYXZlIHRvCmNvbnN0YW50bHkgZGVhbCB3aXRoIHRoaXMuCgo+IAo+IEFsc28g aGFuZGluZyBhcm91bmQgYSByZWdtYXAgbWlnaHQgYmUgbmljZXIsIGNvbXBhcmVkIHRvIHJlYWRs L3dyaXRlbC4KClN0cm9uZyBkaXNhZ3JlZSwgYWRkaW5nIGVycm9yIGhhbmRsaW5nIGFyb3VuZCBl dmVyeSBzaW5nbGUgcmVnaXN0ZXIgcmVhZAphbmQgd3JpdGUsIGFuZCBuZWVkaW5nIHRvIGFsd2F5 cyByZWFkIGludG8gYSB2YXJpYWJsZSByYXRoZXIgdGhhbiBnZXR0aW5nCnRoZSByZWFkIHZhbHVl IGFzIGEgcmV0dXJuIHZhbHVlLCBtYWRlIHRoZSBkcml2ZXJzIGEgbG90IHVnbGllciBpbiBhCnBy ZXZpb3VzIGl0ZXJhdGlvbiBvZiB0aGlzLgoKPiAKPiAKPiBIZWlrbwo+IAoKS2luZCByZWdhcmRz LApOaWNvbGFzIEZyYXR0YXJvbGkKClsxXTogaHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzg0MDQx Ni8KCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxp bnV4LXJvY2tjaGlwIG1haWxpbmcgbGlzdApMaW51eC1yb2NrY2hpcEBsaXN0cy5pbmZyYWRlYWQu b3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcm9j a2NoaXAK