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 X-Spam-Level: X-Spam-Status: No, score=-11.5 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A28ACC4363D for ; Fri, 25 Sep 2020 12:39:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 591A521D91 for ; Fri, 25 Sep 2020 12:39:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728395AbgIYMjN (ORCPT ); Fri, 25 Sep 2020 08:39:13 -0400 Received: from foss.arm.com ([217.140.110.172]:44430 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726990AbgIYMjM (ORCPT ); Fri, 25 Sep 2020 08:39:12 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id D5852101E; Fri, 25 Sep 2020 05:39:10 -0700 (PDT) Received: from [10.57.48.76] (unknown [10.57.48.76]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2457F3F70D; Fri, 25 Sep 2020 05:39:08 -0700 (PDT) Subject: Re: [PATCH v2 1/4] dt-bindings: reserved-memory: Document "active" property To: Dmitry Osipenko , Thierry Reding Cc: Joerg Roedel , Rob Herring , Frank Rowand , Will Deacon , iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, "linux-tegra@vger.kernel.org" References: <20200904130000.691933-1-thierry.reding@gmail.com> <20200924140130.GA2527337@ulmo> From: Robin Murphy Message-ID: <484b9e90-7395-6161-577c-4d3f3716997e@arm.com> Date: Fri, 25 Sep 2020 13:39:07 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.2.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org On 2020-09-24 17:23, Dmitry Osipenko wrote: > 24.09.2020 17:01, Thierry Reding пишет: >> On Thu, Sep 24, 2020 at 04:23:59PM +0300, Dmitry Osipenko wrote: >>> 04.09.2020 15:59, Thierry Reding пишет: >>>> From: Thierry Reding >>>> >>>> Reserved memory regions can be marked as "active" if hardware is >>>> expected to access the regions during boot and before the operating >>>> system can take control. One example where this is useful is for the >>>> operating system to infer whether the region needs to be identity- >>>> mapped through an IOMMU. >>>> >>>> Signed-off-by: Thierry Reding >>>> --- >>>> .../bindings/reserved-memory/reserved-memory.txt | 7 +++++++ >>>> 1 file changed, 7 insertions(+) >>>> >>>> diff --git a/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt b/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt >>>> index 4dd20de6977f..163d2927e4fc 100644 >>>> --- a/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt >>>> +++ b/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt >>>> @@ -63,6 +63,13 @@ reusable (optional) - empty property >>>> able to reclaim it back. Typically that means that the operating >>>> system can use that region to store volatile or cached data that >>>> can be otherwise regenerated or migrated elsewhere. >>>> +active (optional) - empty property >>>> + - If this property is set for a reserved memory region, it indicates >>>> + that some piece of hardware may be actively accessing this region. >>>> + Should the operating system want to enable IOMMU protection for a >>>> + device, all active memory regions must have been identity-mapped >>>> + in order to ensure that non-quiescent hardware during boot can >>>> + continue to access the memory. >>>> >>>> Linux implementation note: >>>> - If a "linux,cma-default" property is present, then Linux will use the >>>> >>> >>> Hi, >>> >>> Could you please explain what devices need this quirk? I see that you're >>> targeting Tegra SMMU driver, which means that it should be some pre-T186 >>> device. >> >> Primarily I'm looking at Tegra210 and later, because on earlier devices >> the bootloader doesn't consistently initialize display. I know that it >> does on some devices, but not all of them. > > AFAIK, all tablet devices starting with Tegra20 that have display panel > are initializing display at a boot time for showing splash screen. This > includes all T20/T30/T114 tablets that are already supported by upstream > kernel. > >> This same code should also >> work on Tegra186 and later (with an ARM SMMU) although the situation is >> slightly more complicated there because IOMMU translations will fault by >> default long before these identity mappings can be established. >> >>> Is this reservation needed for some device that has display >>> hardwired to a very specific IOMMU domain at the boot time? >> >> No, this is only used to convey information about the active framebuffer >> to the kernel. In practice the DMA/IOMMU code will use this information >> to establish a 1:1 mapping on whatever IOMMU domain that was picked for >> display. >> >>> If you're targeting devices that don't have IOMMU enabled by default at >>> the boot time, then this approach won't work for the existing devices >>> which won't ever get an updated bootloader. >> >> If the devices don't use an IOMMU, then there should be no problem. The >> extra reserved-memory nodes would still be necessary to ensure that the >> kernel doesn't reuse the framebuffer memory for the slab allocator, but >> if no IOMMU is used, then the display controller accessing the memory >> isn't going to cause problems other than perhaps scanning out data that >> is no longer a framebuffer. >> >> There should also be no problem for devices with an old bootloader >> because this code is triggered by the presence of a reserved-memory node >> referenced via the memory-region property. Devices with an old >> bootloader should continue to work as they did before. Although I >> suppose they would start faulting once we enable DMA/IOMMU integration >> for Tegra SMMU if they have a bootloader that does initialize display to >> actively scan out during boot. >> >>> I think Robin Murphy already suggested that we should simply create >>> a dummy "identity" IOMMU domain by default for the DRM/VDE devices and >>> then replace it with an explicitly created domain within the drivers. >> >> I don't recall reading about that suggestion. So does this mean that for >> certain devices we'd want to basically passthrough by default and then >> at some point during boot take over with a properly managed IOMMU >> domain? > > Yes, my understanding that this is what Robin suggested here: > > https://lore.kernel.org/linux-iommu/cb12808b-7316-19db-7413-b7f852a6f8ae@arm.com/ Just to clarify, what I was talking about there is largely orthogonal to the issue here. That was about systems with limited translation resources letting translation be specifically opt-in by IOMMU-aware drivers. It probably *would* happen to obviate the issue of disrupting live DMA at boot time on these particular Tegra platforms, but we still need something like Thierry's solution in general, since IOMMU drivers may have no other way to determine whether devices are active at boot and they have to take care to avoid breaking anything - e.g. SMMUv3 will at a bare minimum need to set up *some* form of valid stream table entry for the relevant device(s) right at the beginning where we first probe and reset the SMMU itself, regardless of what happens with domains and addresses later down the line. >> The primary goal here is to move towards using the DMA API rather than >> the IOMMU API directly, so we don't really have the option of replacing >> with an explicitly created domain. Unless we have code in the DMA/IOMMU >> code that does this somehow. >> >> But I'm not sure what would be a good way to mark certain devices as >> needing an identity domain by default. Do we still use the reserved- >> memory node for that? > > The reserved-memory indeed shouldn't be needed for resolving the > implicit IOMMU problem since we could mark certain devices within the > kernel IOMMU driver. > > I haven't got around to trying to implement the implicit IOMMU support > yet, but I suppose we could implement the def_domain_type() hook in the > SMMU driver and then return IOMMU_DOMAIN_IDENTITY for the Display/VDE > devices. Then the Display/VDE drivers will take over the identity domain > and replace it with the explicit domain. FWIW I've already cooked up identity domain support for tegra-gart; I was planning on tackling it for tegra-smmu as well for the next version of my arm default domains series (which will be after the next -rc1 now since I'm just about to take some long-overdue holiday). >> That would still require some sort of flag to >> specify which reserved-memory regions would need this identity mapping >> because, as was pointed out in earlier review, some devices may have >> reserved-memory regions that are not meant to be identity mapped. > > Please note that the reserved-memory approach also creates problem for > selection of a large CMA region if FB is located somewhere in a middle > of DRAM. > > I already see that the FB's reserved-memory will break CMA for Nexus 7 > and Acer A500 because CMA area overlaps with the bootloader's FB :) > > Also keep in mind that initrd needs a location too and location usually > hardwired in a bootloader. Hence it increases pressure on the CMA selection. > >>> Secondly, all NVIDIA bootloaders are passing tegra_fbmem=... via >>> kernel's cmdline with the physical location of the framebuffer in >>> memory. Maybe we could support this option? >> >> I'm not a big fan of that command-line option, but I also realize that >> for older bootloaders that's probably the only option we have. I don't >> suppose all of the devices support U-Boot? > > Majority of devices in a wild don't use u-boot and they have a > locked-down bootloader. Still it's possible to chain-load u-boot or > bypass the "security" and replace the bootloader, but these approaches > aren't widely supported because they take a lot of effort to be > implemented and maintained. > > Even those devices that use proper u-boot usually never updating it and > are running some ancient version. You can't ignore all those people :) > >> Because ideally we'd just >> translate from tegra_fbmem=... to reserved-memory region there so that >> we don't have to carry backwards-compatibility code for these purely >> downstream bootloaders. > > IIRC, in the past Robin Murphy was suggesting to read out hardware state > early during kernel boot in order to find what regions are in use by > hardware. I doubt I suggested that in general, because I've always firmly believed it to be a terrible idea. I've debugged too many cases where firmware or kexec has inadvertently left DMA running and corrupted kernel memory, so in general we definitely *don't* want to blindly trust random hardware state. Anything I may have said in relation to Qualcomm's fundamentally broken hypervisor/bootloader setup should not be considered outside that specific context ;) Robin. > I think it should be easy to do for the display controller since we > could check clock and PD states in order to decide whether DC's IO could > be accessed and then read out the FB pointer and size. I guess it should > take about hundred lines of code. > > But the easiest way should be to ignore this trouble for devices that > have IOMMU disabled by default and simply allow display to show garbage. > Nobody ever complained about this for the past 7+ years :) > > Hence implementing the dummy-identity domain support should be enough > for solving the problem, at least this should work for pre-T186 devices. > 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 X-Spam-Level: X-Spam-Status: No, score=-11.5 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 62185C4363D for ; Fri, 25 Sep 2020 12:39:17 +0000 (UTC) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DD36C21D7A for ; Fri, 25 Sep 2020 12:39:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DD36C21D7A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 4D93E86DC1; Fri, 25 Sep 2020 12:39:16 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id YfIHHOz0Pcn5; Fri, 25 Sep 2020 12:39:14 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 6C99086C6E; Fri, 25 Sep 2020 12:39:14 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 44CA4C0890; Fri, 25 Sep 2020 12:39:14 +0000 (UTC) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 055C3C0859 for ; Fri, 25 Sep 2020 12:39:13 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id EF4CE86C6D for ; Fri, 25 Sep 2020 12:39:12 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fyOC1mdstoYg for ; Fri, 25 Sep 2020 12:39:11 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by whitealder.osuosl.org (Postfix) with ESMTP id 91E8286C6E for ; Fri, 25 Sep 2020 12:39:11 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id D5852101E; Fri, 25 Sep 2020 05:39:10 -0700 (PDT) Received: from [10.57.48.76] (unknown [10.57.48.76]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2457F3F70D; Fri, 25 Sep 2020 05:39:08 -0700 (PDT) Subject: Re: [PATCH v2 1/4] dt-bindings: reserved-memory: Document "active" property To: Dmitry Osipenko , Thierry Reding References: <20200904130000.691933-1-thierry.reding@gmail.com> <20200924140130.GA2527337@ulmo> From: Robin Murphy Message-ID: <484b9e90-7395-6161-577c-4d3f3716997e@arm.com> Date: Fri, 25 Sep 2020 13:39:07 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.2.2 MIME-Version: 1.0 In-Reply-To: Content-Language: en-GB Cc: devicetree@vger.kernel.org, Frank Rowand , linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org, Rob Herring , "linux-tegra@vger.kernel.org" , Will Deacon X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" T24gMjAyMC0wOS0yNCAxNzoyMywgRG1pdHJ5IE9zaXBlbmtvIHdyb3RlOgo+IDI0LjA5LjIwMjAg MTc6MDEsIFRoaWVycnkgUmVkaW5nINC/0LjRiNC10YI6Cj4+IE9uIFRodSwgU2VwIDI0LCAyMDIw IGF0IDA0OjIzOjU5UE0gKzAzMDAsIERtaXRyeSBPc2lwZW5rbyB3cm90ZToKPj4+IDA0LjA5LjIw MjAgMTU6NTksIFRoaWVycnkgUmVkaW5nINC/0LjRiNC10YI6Cj4+Pj4gRnJvbTogVGhpZXJyeSBS ZWRpbmcgPHRyZWRpbmdAbnZpZGlhLmNvbT4KPj4+Pgo+Pj4+IFJlc2VydmVkIG1lbW9yeSByZWdp b25zIGNhbiBiZSBtYXJrZWQgYXMgImFjdGl2ZSIgaWYgaGFyZHdhcmUgaXMKPj4+PiBleHBlY3Rl ZCB0byBhY2Nlc3MgdGhlIHJlZ2lvbnMgZHVyaW5nIGJvb3QgYW5kIGJlZm9yZSB0aGUgb3BlcmF0 aW5nCj4+Pj4gc3lzdGVtIGNhbiB0YWtlIGNvbnRyb2wuIE9uZSBleGFtcGxlIHdoZXJlIHRoaXMg aXMgdXNlZnVsIGlzIGZvciB0aGUKPj4+PiBvcGVyYXRpbmcgc3lzdGVtIHRvIGluZmVyIHdoZXRo ZXIgdGhlIHJlZ2lvbiBuZWVkcyB0byBiZSBpZGVudGl0eS0KPj4+PiBtYXBwZWQgdGhyb3VnaCBh biBJT01NVS4KPj4+Pgo+Pj4+IFNpZ25lZC1vZmYtYnk6IFRoaWVycnkgUmVkaW5nIDx0cmVkaW5n QG52aWRpYS5jb20+Cj4+Pj4gLS0tCj4+Pj4gICAuLi4vYmluZGluZ3MvcmVzZXJ2ZWQtbWVtb3J5 L3Jlc2VydmVkLW1lbW9yeS50eHQgICAgICAgICAgIHwgNyArKysrKysrCj4+Pj4gICAxIGZpbGUg Y2hhbmdlZCwgNyBpbnNlcnRpb25zKCspCj4+Pj4KPj4+PiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRh dGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Jlc2VydmVkLW1lbW9yeS9yZXNlcnZlZC1tZW1vcnku dHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Jlc2VydmVkLW1lbW9yeS9y ZXNlcnZlZC1tZW1vcnkudHh0Cj4+Pj4gaW5kZXggNGRkMjBkZTY5NzdmLi4xNjNkMjkyN2U0ZmMg MTAwNjQ0Cj4+Pj4gLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Jlc2Vy dmVkLW1lbW9yeS9yZXNlcnZlZC1tZW1vcnkudHh0Cj4+Pj4gKysrIGIvRG9jdW1lbnRhdGlvbi9k ZXZpY2V0cmVlL2JpbmRpbmdzL3Jlc2VydmVkLW1lbW9yeS9yZXNlcnZlZC1tZW1vcnkudHh0Cj4+ Pj4gQEAgLTYzLDYgKzYzLDEzIEBAIHJldXNhYmxlIChvcHRpb25hbCkgLSBlbXB0eSBwcm9wZXJ0 eQo+Pj4+ICAgICAgICAgYWJsZSB0byByZWNsYWltIGl0IGJhY2suIFR5cGljYWxseSB0aGF0IG1l YW5zIHRoYXQgdGhlIG9wZXJhdGluZwo+Pj4+ICAgICAgICAgc3lzdGVtIGNhbiB1c2UgdGhhdCBy ZWdpb24gdG8gc3RvcmUgdm9sYXRpbGUgb3IgY2FjaGVkIGRhdGEgdGhhdAo+Pj4+ICAgICAgICAg Y2FuIGJlIG90aGVyd2lzZSByZWdlbmVyYXRlZCBvciBtaWdyYXRlZCBlbHNld2hlcmUuCj4+Pj4g K2FjdGl2ZSAob3B0aW9uYWwpIC0gZW1wdHkgcHJvcGVydHkKPj4+PiArICAgIC0gSWYgdGhpcyBw cm9wZXJ0eSBpcyBzZXQgZm9yIGEgcmVzZXJ2ZWQgbWVtb3J5IHJlZ2lvbiwgaXQgaW5kaWNhdGVz Cj4+Pj4gKyAgICAgIHRoYXQgc29tZSBwaWVjZSBvZiBoYXJkd2FyZSBtYXkgYmUgYWN0aXZlbHkg YWNjZXNzaW5nIHRoaXMgcmVnaW9uLgo+Pj4+ICsgICAgICBTaG91bGQgdGhlIG9wZXJhdGluZyBz eXN0ZW0gd2FudCB0byBlbmFibGUgSU9NTVUgcHJvdGVjdGlvbiBmb3IgYQo+Pj4+ICsgICAgICBk ZXZpY2UsIGFsbCBhY3RpdmUgbWVtb3J5IHJlZ2lvbnMgbXVzdCBoYXZlIGJlZW4gaWRlbnRpdHkt bWFwcGVkCj4+Pj4gKyAgICAgIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IG5vbi1xdWllc2NlbnQg aGFyZHdhcmUgZHVyaW5nIGJvb3QgY2FuCj4+Pj4gKyAgICAgIGNvbnRpbnVlIHRvIGFjY2VzcyB0 aGUgbWVtb3J5Lgo+Pj4+ICAgCj4+Pj4gICBMaW51eCBpbXBsZW1lbnRhdGlvbiBub3RlOgo+Pj4+ ICAgLSBJZiBhICJsaW51eCxjbWEtZGVmYXVsdCIgcHJvcGVydHkgaXMgcHJlc2VudCwgdGhlbiBM aW51eCB3aWxsIHVzZSB0aGUKPj4+Pgo+Pj4KPj4+IEhpLAo+Pj4KPj4+IENvdWxkIHlvdSBwbGVh c2UgZXhwbGFpbiB3aGF0IGRldmljZXMgbmVlZCB0aGlzIHF1aXJrPyBJIHNlZSB0aGF0IHlvdSdy ZQo+Pj4gdGFyZ2V0aW5nIFRlZ3JhIFNNTVUgZHJpdmVyLCB3aGljaCBtZWFucyB0aGF0IGl0IHNo b3VsZCBiZSBzb21lIHByZS1UMTg2Cj4+PiBkZXZpY2UuCj4+Cj4+IFByaW1hcmlseSBJJ20gbG9v a2luZyBhdCBUZWdyYTIxMCBhbmQgbGF0ZXIsIGJlY2F1c2Ugb24gZWFybGllciBkZXZpY2VzCj4+ IHRoZSBib290bG9hZGVyIGRvZXNuJ3QgY29uc2lzdGVudGx5IGluaXRpYWxpemUgZGlzcGxheS4g SSBrbm93IHRoYXQgaXQKPj4gZG9lcyBvbiBzb21lIGRldmljZXMsIGJ1dCBub3QgYWxsIG9mIHRo ZW0uCj4gCj4gQUZBSUssIGFsbCB0YWJsZXQgZGV2aWNlcyBzdGFydGluZyB3aXRoIFRlZ3JhMjAg dGhhdCBoYXZlIGRpc3BsYXkgcGFuZWwKPiBhcmUgaW5pdGlhbGl6aW5nIGRpc3BsYXkgYXQgYSBi b290IHRpbWUgZm9yIHNob3dpbmcgc3BsYXNoIHNjcmVlbi4gVGhpcwo+IGluY2x1ZGVzIGFsbCBU MjAvVDMwL1QxMTQgdGFibGV0cyB0aGF0IGFyZSBhbHJlYWR5IHN1cHBvcnRlZCBieSB1cHN0cmVh bQo+IGtlcm5lbC4KPiAKPj4gVGhpcyBzYW1lIGNvZGUgc2hvdWxkIGFsc28KPj4gd29yayBvbiBU ZWdyYTE4NiBhbmQgbGF0ZXIgKHdpdGggYW4gQVJNIFNNTVUpIGFsdGhvdWdoIHRoZSBzaXR1YXRp b24gaXMKPj4gc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCB0aGVyZSBiZWNhdXNlIElPTU1VIHRy YW5zbGF0aW9ucyB3aWxsIGZhdWx0IGJ5Cj4+IGRlZmF1bHQgbG9uZyBiZWZvcmUgdGhlc2UgaWRl bnRpdHkgbWFwcGluZ3MgY2FuIGJlIGVzdGFibGlzaGVkLgo+Pgo+Pj4gSXMgdGhpcyByZXNlcnZh dGlvbiBuZWVkZWQgZm9yIHNvbWUgZGV2aWNlIHRoYXQgaGFzIGRpc3BsYXkKPj4+IGhhcmR3aXJl ZCB0byBhIHZlcnkgc3BlY2lmaWMgSU9NTVUgZG9tYWluIGF0IHRoZSBib290IHRpbWU/Cj4+Cj4+ IE5vLCB0aGlzIGlzIG9ubHkgdXNlZCB0byBjb252ZXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFj dGl2ZSBmcmFtZWJ1ZmZlcgo+PiB0byB0aGUga2VybmVsLiBJbiBwcmFjdGljZSB0aGUgRE1BL0lP TU1VIGNvZGUgd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbgo+PiB0byBlc3RhYmxpc2ggYSAxOjEg bWFwcGluZyBvbiB3aGF0ZXZlciBJT01NVSBkb21haW4gdGhhdCB3YXMgcGlja2VkIGZvcgo+PiBk aXNwbGF5Lgo+Pgo+Pj4gSWYgeW91J3JlIHRhcmdldGluZyBkZXZpY2VzIHRoYXQgZG9uJ3QgaGF2 ZSBJT01NVSBlbmFibGVkIGJ5IGRlZmF1bHQgYXQKPj4+IHRoZSBib290IHRpbWUsIHRoZW4gdGhp cyBhcHByb2FjaCB3b24ndCB3b3JrIGZvciB0aGUgZXhpc3RpbmcgZGV2aWNlcwo+Pj4gd2hpY2gg d29uJ3QgZXZlciBnZXQgYW4gdXBkYXRlZCBib290bG9hZGVyLgo+Pgo+PiBJZiB0aGUgZGV2aWNl cyBkb24ndCB1c2UgYW4gSU9NTVUsIHRoZW4gdGhlcmUgc2hvdWxkIGJlIG5vIHByb2JsZW0uIFRo ZQo+PiBleHRyYSByZXNlcnZlZC1tZW1vcnkgbm9kZXMgd291bGQgc3RpbGwgYmUgbmVjZXNzYXJ5 IHRvIGVuc3VyZSB0aGF0IHRoZQo+PiBrZXJuZWwgZG9lc24ndCByZXVzZSB0aGUgZnJhbWVidWZm ZXIgbWVtb3J5IGZvciB0aGUgc2xhYiBhbGxvY2F0b3IsIGJ1dAo+PiBpZiBubyBJT01NVSBpcyB1 c2VkLCB0aGVuIHRoZSBkaXNwbGF5IGNvbnRyb2xsZXIgYWNjZXNzaW5nIHRoZSBtZW1vcnkKPj4g aXNuJ3QgZ29pbmcgdG8gY2F1c2UgcHJvYmxlbXMgb3RoZXIgdGhhbiBwZXJoYXBzIHNjYW5uaW5n IG91dCBkYXRhIHRoYXQKPj4gaXMgbm8gbG9uZ2VyIGEgZnJhbWVidWZmZXIuCj4+Cj4+IFRoZXJl IHNob3VsZCBhbHNvIGJlIG5vIHByb2JsZW0gZm9yIGRldmljZXMgd2l0aCBhbiBvbGQgYm9vdGxv YWRlcgo+PiBiZWNhdXNlIHRoaXMgY29kZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIHByZXNlbmNlIG9m IGEgcmVzZXJ2ZWQtbWVtb3J5IG5vZGUKPj4gcmVmZXJlbmNlZCB2aWEgdGhlIG1lbW9yeS1yZWdp b24gcHJvcGVydHkuIERldmljZXMgd2l0aCBhbiBvbGQKPj4gYm9vdGxvYWRlciBzaG91bGQgY29u dGludWUgdG8gd29yayBhcyB0aGV5IGRpZCBiZWZvcmUuIEFsdGhvdWdoIEkKPj4gc3VwcG9zZSB0 aGV5IHdvdWxkIHN0YXJ0IGZhdWx0aW5nIG9uY2Ugd2UgZW5hYmxlIERNQS9JT01NVSBpbnRlZ3Jh dGlvbgo+PiBmb3IgVGVncmEgU01NVSBpZiB0aGV5IGhhdmUgYSBib290bG9hZGVyIHRoYXQgZG9l cyBpbml0aWFsaXplIGRpc3BsYXkgdG8KPj4gYWN0aXZlbHkgc2NhbiBvdXQgZHVyaW5nIGJvb3Qu Cj4+Cj4+PiBJIHRoaW5rIFJvYmluIE11cnBoeSBhbHJlYWR5IHN1Z2dlc3RlZCB0aGF0IHdlIHNo b3VsZCBzaW1wbHkgY3JlYXRlCj4+PiBhIGR1bW15ICJpZGVudGl0eSIgSU9NTVUgZG9tYWluIGJ5 IGRlZmF1bHQgZm9yIHRoZSBEUk0vVkRFIGRldmljZXMgYW5kCj4+PiB0aGVuIHJlcGxhY2UgaXQg d2l0aCBhbiBleHBsaWNpdGx5IGNyZWF0ZWQgZG9tYWluIHdpdGhpbiB0aGUgZHJpdmVycy4KPj4K Pj4gSSBkb24ndCByZWNhbGwgcmVhZGluZyBhYm91dCB0aGF0IHN1Z2dlc3Rpb24uIFNvIGRvZXMg dGhpcyBtZWFuIHRoYXQgZm9yCj4+IGNlcnRhaW4gZGV2aWNlcyB3ZSdkIHdhbnQgdG8gYmFzaWNh bGx5IHBhc3N0aHJvdWdoIGJ5IGRlZmF1bHQgYW5kIHRoZW4KPj4gYXQgc29tZSBwb2ludCBkdXJp bmcgYm9vdCB0YWtlIG92ZXIgd2l0aCBhIHByb3Blcmx5IG1hbmFnZWQgSU9NTVUKPj4gZG9tYWlu Pwo+IAo+IFllcywgbXkgdW5kZXJzdGFuZGluZyB0aGF0IHRoaXMgaXMgd2hhdCBSb2JpbiBzdWdn ZXN0ZWQgaGVyZToKPiAKPiBodHRwczovL2xvcmUua2VybmVsLm9yZy9saW51eC1pb21tdS9jYjEy ODA4Yi03MzE2LTE5ZGItNzQxMy1iN2Y4NTJhNmY4YWVAYXJtLmNvbS8KCkp1c3QgdG8gY2xhcmlm eSwgd2hhdCBJIHdhcyB0YWxraW5nIGFib3V0IHRoZXJlIGlzIGxhcmdlbHkgb3J0aG9nb25hbCB0 byAKdGhlIGlzc3VlIGhlcmUuIFRoYXQgd2FzIGFib3V0IHN5c3RlbXMgd2l0aCBsaW1pdGVkIHRy YW5zbGF0aW9uIApyZXNvdXJjZXMgbGV0dGluZyB0cmFuc2xhdGlvbiBiZSBzcGVjaWZpY2FsbHkg b3B0LWluIGJ5IElPTU1VLWF3YXJlIApkcml2ZXJzLiBJdCBwcm9iYWJseSAqd291bGQqIGhhcHBl biB0byBvYnZpYXRlIHRoZSBpc3N1ZSBvZiBkaXNydXB0aW5nIApsaXZlIERNQSBhdCBib290IHRp bWUgb24gdGhlc2UgcGFydGljdWxhciBUZWdyYSBwbGF0Zm9ybXMsIGJ1dCB3ZSBzdGlsbCAKbmVl ZCBzb21ldGhpbmcgbGlrZSBUaGllcnJ5J3Mgc29sdXRpb24gaW4gZ2VuZXJhbCwgc2luY2UgSU9N TVUgZHJpdmVycyAKbWF5IGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRldGVybWluZSB3aGV0aGVyIGRl dmljZXMgYXJlIGFjdGl2ZSBhdCBib290IAphbmQgdGhleSBoYXZlIHRvIHRha2UgY2FyZSB0byBh dm9pZCBicmVha2luZyBhbnl0aGluZyAtIGUuZy4gU01NVXYzIHdpbGwgCmF0IGEgYmFyZSBtaW5p bXVtIG5lZWQgdG8gc2V0IHVwICpzb21lKiBmb3JtIG9mIHZhbGlkIHN0cmVhbSB0YWJsZSBlbnRy eSAKZm9yIHRoZSByZWxldmFudCBkZXZpY2UocykgcmlnaHQgYXQgdGhlIGJlZ2lubmluZyB3aGVy ZSB3ZSBmaXJzdCBwcm9iZSAKYW5kIHJlc2V0IHRoZSBTTU1VIGl0c2VsZiwgcmVnYXJkbGVzcyBv ZiB3aGF0IGhhcHBlbnMgd2l0aCBkb21haW5zIGFuZCAKYWRkcmVzc2VzIGxhdGVyIGRvd24gdGhl IGxpbmUuCgo+PiBUaGUgcHJpbWFyeSBnb2FsIGhlcmUgaXMgdG8gbW92ZSB0b3dhcmRzIHVzaW5n IHRoZSBETUEgQVBJIHJhdGhlciB0aGFuCj4+IHRoZSBJT01NVSBBUEkgZGlyZWN0bHksIHNvIHdl IGRvbid0IHJlYWxseSBoYXZlIHRoZSBvcHRpb24gb2YgcmVwbGFjaW5nCj4+IHdpdGggYW4gZXhw bGljaXRseSBjcmVhdGVkIGRvbWFpbi4gVW5sZXNzIHdlIGhhdmUgY29kZSBpbiB0aGUgRE1BL0lP TU1VCj4+IGNvZGUgdGhhdCBkb2VzIHRoaXMgc29tZWhvdy4KPj4KPj4gQnV0IEknbSBub3Qgc3Vy ZSB3aGF0IHdvdWxkIGJlIGEgZ29vZCB3YXkgdG8gbWFyayBjZXJ0YWluIGRldmljZXMgYXMKPj4g bmVlZGluZyBhbiBpZGVudGl0eSBkb21haW4gYnkgZGVmYXVsdC4gRG8gd2Ugc3RpbGwgdXNlIHRo ZSByZXNlcnZlZC0KPj4gbWVtb3J5IG5vZGUgZm9yIHRoYXQ/Cj4gCj4gVGhlIHJlc2VydmVkLW1l bW9yeSBpbmRlZWQgc2hvdWxkbid0IGJlIG5lZWRlZCBmb3IgcmVzb2x2aW5nIHRoZQo+IGltcGxp Y2l0IElPTU1VIHByb2JsZW0gc2luY2Ugd2UgY291bGQgbWFyayBjZXJ0YWluIGRldmljZXMgd2l0 aGluIHRoZQo+IGtlcm5lbCBJT01NVSBkcml2ZXIuCj4gCj4gSSBoYXZlbid0IGdvdCBhcm91bmQg dG8gdHJ5aW5nIHRvIGltcGxlbWVudCB0aGUgaW1wbGljaXQgSU9NTVUgc3VwcG9ydAo+IHlldCwg YnV0IEkgc3VwcG9zZSB3ZSBjb3VsZCBpbXBsZW1lbnQgdGhlIGRlZl9kb21haW5fdHlwZSgpIGhv b2sgaW4gdGhlCj4gU01NVSBkcml2ZXIgYW5kIHRoZW4gcmV0dXJuIElPTU1VX0RPTUFJTl9JREVO VElUWSBmb3IgdGhlIERpc3BsYXkvVkRFCj4gZGV2aWNlcy4gVGhlbiB0aGUgRGlzcGxheS9WREUg ZHJpdmVycyB3aWxsIHRha2Ugb3ZlciB0aGUgaWRlbnRpdHkgZG9tYWluCj4gYW5kIHJlcGxhY2Ug aXQgd2l0aCB0aGUgZXhwbGljaXQgZG9tYWluLgoKRldJVyBJJ3ZlIGFscmVhZHkgY29va2VkIHVw IGlkZW50aXR5IGRvbWFpbiBzdXBwb3J0IGZvciB0ZWdyYS1nYXJ0OyBJIAp3YXMgcGxhbm5pbmcg b24gdGFja2xpbmcgaXQgZm9yIHRlZ3JhLXNtbXUgYXMgd2VsbCBmb3IgdGhlIG5leHQgdmVyc2lv biAKb2YgbXkgYXJtIGRlZmF1bHQgZG9tYWlucyBzZXJpZXMgKHdoaWNoIHdpbGwgYmUgYWZ0ZXIg dGhlIG5leHQgLXJjMSBub3cgCnNpbmNlIEknbSBqdXN0IGFib3V0IHRvIHRha2Ugc29tZSBsb25n LW92ZXJkdWUgaG9saWRheSkuCgo+PiBUaGF0IHdvdWxkIHN0aWxsIHJlcXVpcmUgc29tZSBzb3J0 IG9mIGZsYWcgdG8KPj4gc3BlY2lmeSB3aGljaCByZXNlcnZlZC1tZW1vcnkgcmVnaW9ucyB3b3Vs ZCBuZWVkIHRoaXMgaWRlbnRpdHkgbWFwcGluZwo+PiBiZWNhdXNlLCBhcyB3YXMgcG9pbnRlZCBv dXQgaW4gZWFybGllciByZXZpZXcsIHNvbWUgZGV2aWNlcyBtYXkgaGF2ZQo+PiByZXNlcnZlZC1t ZW1vcnkgcmVnaW9ucyB0aGF0IGFyZSBub3QgbWVhbnQgdG8gYmUgaWRlbnRpdHkgbWFwcGVkLgo+ IAo+IFBsZWFzZSBub3RlIHRoYXQgdGhlIHJlc2VydmVkLW1lbW9yeSBhcHByb2FjaCBhbHNvIGNy ZWF0ZXMgcHJvYmxlbSBmb3IKPiBzZWxlY3Rpb24gb2YgYSBsYXJnZSBDTUEgcmVnaW9uIGlmIEZC IGlzIGxvY2F0ZWQgc29tZXdoZXJlIGluIGEgbWlkZGxlCj4gb2YgRFJBTS4KPiAKPiBJIGFscmVh ZHkgc2VlIHRoYXQgdGhlIEZCJ3MgcmVzZXJ2ZWQtbWVtb3J5IHdpbGwgYnJlYWsgQ01BIGZvciBO ZXh1cyA3Cj4gYW5kIEFjZXIgQTUwMCBiZWNhdXNlIENNQSBhcmVhIG92ZXJsYXBzIHdpdGggdGhl IGJvb3Rsb2FkZXIncyBGQiA6KQo+IAo+IEFsc28ga2VlcCBpbiBtaW5kIHRoYXQgaW5pdHJkIG5l ZWRzIGEgbG9jYXRpb24gdG9vIGFuZCBsb2NhdGlvbiB1c3VhbGx5Cj4gaGFyZHdpcmVkIGluIGEg Ym9vdGxvYWRlci4gSGVuY2UgaXQgaW5jcmVhc2VzIHByZXNzdXJlIG9uIHRoZSBDTUEgc2VsZWN0 aW9uLgo+IAo+Pj4gU2Vjb25kbHksIGFsbCBOVklESUEgYm9vdGxvYWRlcnMgYXJlIHBhc3Npbmcg dGVncmFfZmJtZW09Li4uIHZpYQo+Pj4ga2VybmVsJ3MgY21kbGluZSB3aXRoIHRoZSBwaHlzaWNh bCBsb2NhdGlvbiBvZiB0aGUgZnJhbWVidWZmZXIgaW4KPj4+IG1lbW9yeS4gTWF5YmUgd2UgY291 bGQgc3VwcG9ydCB0aGlzIG9wdGlvbj8KPj4KPj4gSSdtIG5vdCBhIGJpZyBmYW4gb2YgdGhhdCBj b21tYW5kLWxpbmUgb3B0aW9uLCBidXQgSSBhbHNvIHJlYWxpemUgdGhhdAo+PiBmb3Igb2xkZXIg Ym9vdGxvYWRlcnMgdGhhdCdzIHByb2JhYmx5IHRoZSBvbmx5IG9wdGlvbiB3ZSBoYXZlLiBJIGRv bid0Cj4+IHN1cHBvc2UgYWxsIG9mIHRoZSBkZXZpY2VzIHN1cHBvcnQgVS1Cb290Pwo+IAo+IE1h am9yaXR5IG9mIGRldmljZXMgaW4gYSB3aWxkIGRvbid0IHVzZSB1LWJvb3QgYW5kIHRoZXkgaGF2 ZSBhCj4gbG9ja2VkLWRvd24gYm9vdGxvYWRlci4gU3RpbGwgaXQncyBwb3NzaWJsZSB0byBjaGFp bi1sb2FkIHUtYm9vdCBvcgo+IGJ5cGFzcyB0aGUgInNlY3VyaXR5IiBhbmQgcmVwbGFjZSB0aGUg Ym9vdGxvYWRlciwgYnV0IHRoZXNlIGFwcHJvYWNoZXMKPiBhcmVuJ3Qgd2lkZWx5IHN1cHBvcnRl ZCBiZWNhdXNlIHRoZXkgdGFrZSBhIGxvdCBvZiBlZmZvcnQgdG8gYmUKPiBpbXBsZW1lbnRlZCBh bmQgbWFpbnRhaW5lZC4KPiAKPiBFdmVuIHRob3NlIGRldmljZXMgdGhhdCB1c2UgcHJvcGVyIHUt Ym9vdCB1c3VhbGx5IG5ldmVyIHVwZGF0aW5nIGl0IGFuZAo+IGFyZSBydW5uaW5nIHNvbWUgYW5j aWVudCB2ZXJzaW9uLiBZb3UgY2FuJ3QgaWdub3JlIGFsbCB0aG9zZSBwZW9wbGUgOikKPiAKPj4g QmVjYXVzZSBpZGVhbGx5IHdlJ2QganVzdAo+PiB0cmFuc2xhdGUgZnJvbSB0ZWdyYV9mYm1lbT0u Li4gdG8gcmVzZXJ2ZWQtbWVtb3J5IHJlZ2lvbiB0aGVyZSBzbyB0aGF0Cj4+IHdlIGRvbid0IGhh dmUgdG8gY2FycnkgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgY29kZSBmb3IgdGhlc2UgcHVyZWx5 Cj4+IGRvd25zdHJlYW0gYm9vdGxvYWRlcnMuCj4gCj4gSUlSQywgaW4gdGhlIHBhc3QgUm9iaW4g TXVycGh5IHdhcyBzdWdnZXN0aW5nIHRvIHJlYWQgb3V0IGhhcmR3YXJlIHN0YXRlCj4gZWFybHkg ZHVyaW5nIGtlcm5lbCBib290IGluIG9yZGVyIHRvIGZpbmQgd2hhdCByZWdpb25zIGFyZSBpbiB1 c2UgYnkKPiBoYXJkd2FyZS4KCkkgZG91YnQgSSBzdWdnZXN0ZWQgdGhhdCBpbiBnZW5lcmFsLCBi ZWNhdXNlIEkndmUgYWx3YXlzIGZpcm1seSBiZWxpZXZlZCAKaXQgdG8gYmUgYSB0ZXJyaWJsZSBp ZGVhLiBJJ3ZlIGRlYnVnZ2VkIHRvbyBtYW55IGNhc2VzIHdoZXJlIGZpcm13YXJlIG9yIAprZXhl YyBoYXMgaW5hZHZlcnRlbnRseSBsZWZ0IERNQSBydW5uaW5nIGFuZCBjb3JydXB0ZWQga2VybmVs IG1lbW9yeSwgc28gCmluIGdlbmVyYWwgd2UgZGVmaW5pdGVseSAqZG9uJ3QqIHdhbnQgdG8gYmxp bmRseSB0cnVzdCByYW5kb20gaGFyZHdhcmUgCnN0YXRlLiBBbnl0aGluZyBJIG1heSBoYXZlIHNh aWQgaW4gcmVsYXRpb24gdG8gUXVhbGNvbW0ncyBmdW5kYW1lbnRhbGx5IApicm9rZW4gaHlwZXJ2 aXNvci9ib290bG9hZGVyIHNldHVwIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBvdXRzaWRlIHRo YXQgCnNwZWNpZmljIGNvbnRleHQgOykKClJvYmluLgoKPiBJIHRoaW5rIGl0IHNob3VsZCBiZSBl YXN5IHRvIGRvIGZvciB0aGUgZGlzcGxheSBjb250cm9sbGVyIHNpbmNlIHdlCj4gY291bGQgY2hl Y2sgY2xvY2sgYW5kIFBEIHN0YXRlcyBpbiBvcmRlciB0byBkZWNpZGUgd2hldGhlciBEQydzIElP IGNvdWxkCj4gYmUgYWNjZXNzZWQgYW5kIHRoZW4gcmVhZCBvdXQgdGhlIEZCIHBvaW50ZXIgYW5k IHNpemUuIEkgZ3Vlc3MgaXQgc2hvdWxkCj4gdGFrZSBhYm91dCBodW5kcmVkIGxpbmVzIG9mIGNv ZGUuCj4gCj4gQnV0IHRoZSBlYXNpZXN0IHdheSBzaG91bGQgYmUgdG8gaWdub3JlIHRoaXMgdHJv dWJsZSBmb3IgZGV2aWNlcyB0aGF0Cj4gaGF2ZSBJT01NVSBkaXNhYmxlZCBieSBkZWZhdWx0IGFu ZCBzaW1wbHkgYWxsb3cgZGlzcGxheSB0byBzaG93IGdhcmJhZ2UuCj4gTm9ib2R5IGV2ZXIgY29t cGxhaW5lZCBhYm91dCB0aGlzIGZvciB0aGUgcGFzdCA3KyB5ZWFycyA6KQo+IAo+IEhlbmNlIGlt cGxlbWVudGluZyB0aGUgZHVtbXktaWRlbnRpdHkgZG9tYWluIHN1cHBvcnQgc2hvdWxkIGJlIGVu b3VnaAo+IGZvciBzb2x2aW5nIHRoZSBwcm9ibGVtLCBhdCBsZWFzdCB0aGlzIHNob3VsZCB3b3Jr IGZvciBwcmUtVDE4NiBkZXZpY2VzLgo+IApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwppb21tdSBtYWlsaW5nIGxpc3QKaW9tbXVAbGlzdHMubGludXgtZm91 bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51eGZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlz dGluZm8vaW9tbXU=