From mboxrd@z Thu Jan 1 00:00:00 1970 From: paul.walmsley@sifive.com (Paul Walmsley) Date: Tue, 23 Oct 2018 10:05:40 -0700 Subject: [PATCH v2 1/2] dt-bindings: serial: add documentation for the SiFive UART driver In-Reply-To: References: <20181019184827.12351-1-paul.walmsley@sifive.com> <20181019184827.12351-2-paul.walmsley@sifive.com> <4317548d-f831-29ba-3be9-35f080587db9@sifive.com> Message-ID: <6571bb0e-b36a-1196-4d90-8aa62d8a2a90@sifive.com> To: linux-riscv@lists.infradead.org List-Id: linux-riscv.lists.infradead.org On 10/20/18 7:21 AM, Rob Herring wrote: > On Fri, Oct 19, 2018 at 5:06 PM Paul Walmsley wrote: >> On 10/19/18 1:45 PM, Rob Herring wrote: >>> On Fri, Oct 19, 2018 at 1:48 PM Paul Walmsley wrote: >>>> Add DT binding documentation for the Linux driver for the SiFive >>>> asynchronous serial IP block. Nothing too exotic. >>>> >>>> Cc: linux-serial at vger.kernel.org >>>> Cc: devicetree at vger.kernel.org >>>> Cc: linux-riscv at lists.infradead.org >>>> Cc: linux-kernel at vger.kernel.org >>>> Cc: Greg Kroah-Hartman >>>> Cc: Rob Herring >>>> Cc: Mark Rutland >>>> Cc: Palmer Dabbelt >>>> Reviewed-by: Palmer Dabbelt >>>> Signed-off-by: Paul Walmsley >>>> Signed-off-by: Paul Walmsley >>>> --- >>>> .../bindings/serial/sifive-serial.txt | 21 +++++++++++++++++++ >>>> 1 file changed, 21 insertions(+) >>>> create mode 100644 Documentation/devicetree/bindings/serial/sifive-serial.txt >>>> >>>> diff --git a/Documentation/devicetree/bindings/serial/sifive-serial.txt b/Documentation/devicetree/bindings/serial/sifive-serial.txt >>>> new file mode 100644 >>>> index 000000000000..8982338512f5 >>>> --- /dev/null >>>> +++ b/Documentation/devicetree/bindings/serial/sifive-serial.txt >>>> @@ -0,0 +1,21 @@ >>>> +SiFive asynchronous serial interface (UART) >>>> + >>>> +Required properties: >>>> + >>>> +- compatible: should be "sifive,fu540-c000-uart0" or "sifive,uart0" >>>> >>> As I mentioned for the >>> intc and now the pwm block bindings, if you are going to do version >>> numbers please document the versioning scheme. >>> >>> >>> Will add that to the binding document. > I don't seem to be making my point clear. I don't want any of this > added to a binding doc for particular IP blocks. Write a common doc > that explains the scheme and addresses the questions I asked. Then > just reference that doc here. > > Maybe this is documented somewhere already? Otherwise, if one is > creating a new IP block, how do they know what the versioning scheme > is or what goes in the DT ROM? Seems like there might be some confusion between IP blocks as integrated on an SoC vs. IP blocks in isolation.? It's not necessarily the SoC integrator that sets an IP block version number; this can come from the IP block vendor itself.? So each IP block may have its own version numbering practices for the IP block alone. For SiFive IP blocks, we at SiFive could probably align on a common version numbering structure for what's in the sifive-blocks repository. But other IP blocks from other vendors may not align to that, or may not have version numbers exposed at all.? In those cases there's no way for software folks to find out what they are,? as you pointed out earlier.? This is the case with most DT compatible strings in the kernel tree. For example, we've integrated the NVDLA IP block, from NVIDIA, on some designs.? Any NVIDIA version numbers in that IP block will probably not follow the SiFive version numbering scheme.? I'd propose the right thing to do for an IP block compatible string is to follow the vendor's practice, and then use the SoC integrator's version numbering practice for the SoC-integrated compatible string. In effect, an SoC integration DT compatible string like "sifive,fu540-c000-uart" implicitly states an IP block version number: "whatever came out of the fab on the chip"[**].?? I'd propose that even in these cases, there's an advantage to keeping the "0" on the end, since it uniquely identifies an SoC-independent IP block, rather than just the type of the IP block. ? But if the "0" on the end of the SoC integration DT compatible string is problematic for you, we can certainly drop that last 0 from the SoC integration DT compatible string, and only suffer a slight lack of clarity as to what version was integrated on that chip. But for IP block-specific version strings like "sifive,uart0", I think we can address your concern, at least for these public IP blocks. Since the SiFive UART and some other peripheral IP blocks are open-source, the public can have a pretty good idea of what DT version number corresponds to the source RTL, since the RTL is public. ? The version number identifies a specific programming model, without tying that programming model to any SoC-specific workarounds, etc.? So for these cases, I think there's a pretty good case for having IP block-specific version numbers in DT compatible strings, and I hope you'll agree. The advantage for all of us is that there's then no need to embed chip-specific DT match strings in these drivers, for the most part.? We just match on "sifive,uart0" and that's it, assuming no chip-specific workarounds are needed. >>> Where does the >>> number come from? >> >> It comes from the RTL, which is public: >> >> https://github.com/sifive/sifive-blocks/blob/master/src/main/scala/devices/uart/UART.scala#L43 > I'm not going to go read your RTL, sorry. There's no need, but you did ask where it came from.? Sorry you didn't like the answer. Please let us know what you want us to do. Thanks for your review - Paul ** The caveat is that even with SoC identifiers in the Linux DT compatible strings, there's not enough information in many of the existing kernel DT compatibility strings to uniquely identify chip versions.? Taking OMAP and Tegra as examples, there are several different chip versions for a given SoC generation that came out of the fab.? ? OMAP chip version strings usually began with "ES"; Tegra version numbers, as I recall, were a letter and two numbers.? For the most part, those versions were never specifically identified in the upstream kernel DT strings or in DT file names. (There are some exceptions with OMAP where we did identify specific chip version numbers, because sizable numbers of folks had boards with early silicon, and we were committed to supporting them at the time.)??? Sadly even adding these additional chip version identifiers to the DT strings wouldn't be perfect: I've seen at least one large vendor implementing metal-only ECOs without incrementing public chip version numbers. The point here is that we're already not uniquely identifying IP blocks with our current Linux DT compatibility string scheme. 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=-13.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED 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 427A9C67863 for ; Tue, 23 Oct 2018 17:06:01 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 10CAD20665 for ; Tue, 23 Oct 2018 17:06:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="JTofNC0E"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="hoRCkKAR" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 10CAD20665 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=lADxFwRrdnBRYqyAyqWlgemA5q3NbTUYuOeaA9AbvfI=; b=JTofNC0EgF9dB3YMHnPekQt64 srkLfMccl5FM7vFmPRMObWv5ExvPjQNiAFSbjMxdPC1xd4W67XF+ATBECtsolUA8YiA3URvBoqICi TuCVWcyO9nPYnNR7ujiPrMHn9vrlJ6t10vDr8H595CiPt+oZ815bGxa1wXHnYj8dOn0WhBWx1jqGt 4bcGi/2VGAv4tph8i/oPz+4fXEdGvV0fQ2HT/iMHxz/w4XBrwtK8qdmRL1IMT9puRo88eWdFAcXtV jyYLqfJVQgtDQJ+FKkN5tW5F7Aks1n/pQX5zVF1i/wJx4HdcARTqDiHaNwn6/MpUWTtRxozeelQOS Fx3oIvQIA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gF07y-0003dq-Lq; Tue, 23 Oct 2018 17:05:58 +0000 Received: from mail-ed1-x542.google.com ([2a00:1450:4864:20::542]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gF07u-0003cg-Uk for linux-riscv@lists.infradead.org; Tue, 23 Oct 2018 17:05:57 +0000 Received: by mail-ed1-x542.google.com with SMTP id y20-v6so2335498eds.10 for ; Tue, 23 Oct 2018 10:05:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding:content-language; bh=z9Hr70PhvvvU4PrsJYQR5cJ/AOmcSadB+PAQIQWG7Eo=; b=hoRCkKARqhl2rgpvFGA67polxnHSQ7lx9hF7w9hGwOrQfmLtCjHaepnz9Uh0wm3EpF 1ML4u2xEPsQVKH1Dylfhbc7z2hiLVMBgb7G+sPePfvm2VQn4hDEJHtHKqheR63D3ICwI mucgnHr5kcvt2wPuz3no9DxOBU6yFQGW3gq4yTTB7gj6mp9dj1EvT1HXjsdE5scxoECa /LtakaEjSOdab9HtLfCRRh6VALuTPj2bxwRY08tGE3gbmqpBSv1biLoB0zq0CDVSt+VI TL5iD1WmNkweO/Q4dQ3E0exFGAU/WVJWcheSaV5ZdhDll5Icg9hA8E4WAMRAsEGXF/vW 84+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=z9Hr70PhvvvU4PrsJYQR5cJ/AOmcSadB+PAQIQWG7Eo=; b=hF+uAVF5mHQFCueOEhw4CwLv9/BiFrsbJIxhLFMJbjohQskhCOeyMBkxu/cfytoYm6 prpj0M/irwTZcVKaoxnfhPQAuN1MlSM/e8OYJ53L9tMHPDYa4bv/b4lNUf+uezx5yWv3 hssvKzVYWMGjrTpujTwLh0AjSOiKBqDPBGmeT57U+c1qunZTCl1eVJA6OZyxoNZB8Dw6 x5/JMjV2krCZZA3XoMjZy7w9oXFKKs2bLJTc+zQh8EsQXDKqvT+qXJaUmdThHhLydvxF tjpfXqRwZKpIav4D+zXIx9ggoGCLEQiA068LKjpa9fbZICaS1i1cEp/TZ/lw/hUnbByA sChg== X-Gm-Message-State: ABuFfogsMnMjUiCIJVqTP8xnCGFwVmCUeq4uWf53UJdxpD3xoH0GSSVk s53iwPszlS6kMxio0kZO+XokoQ== X-Google-Smtp-Source: ACcGV60BTRSSS2MlVkKfrIgtqn7G1FptPmOo1Y5qjevk7WPaiowE17sFp+67GdQWJmU//Z9fXZJNEQ== X-Received: by 2002:a17:906:e082:: with SMTP id gh2-v6mr2708879ejb.92.1540314342849; Tue, 23 Oct 2018 10:05:42 -0700 (PDT) Received: from [10.1.6.225] ([185.15.205.146]) by smtp.gmail.com with ESMTPSA id dv2-v6sm480363ejb.10.2018.10.23.10.05.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Oct 2018 10:05:42 -0700 (PDT) Subject: Re: [PATCH v2 1/2] dt-bindings: serial: add documentation for the SiFive UART driver To: Rob Herring References: <20181019184827.12351-1-paul.walmsley@sifive.com> <20181019184827.12351-2-paul.walmsley@sifive.com> <4317548d-f831-29ba-3be9-35f080587db9@sifive.com> From: Paul Walmsley Message-ID: <6571bb0e-b36a-1196-4d90-8aa62d8a2a90@sifive.com> Date: Tue, 23 Oct 2018 10:05:40 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20181023_100555_029038_E1DDAF39 X-CRM114-Status: GOOD ( 29.77 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , devicetree@vger.kernel.org, Paul Walmsley , Greg Kroah-Hartman , Palmer Dabbelt , "linux-kernel@vger.kernel.org" , "open list:SERIAL DRIVERS" , linux-riscv@lists.infradead.org Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-riscv" Errors-To: linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org Message-ID: <20181023170540.ew72rE8TjGOcPBPMyaVEBMITaziyhsGvAI3_peeOcrI@z> Ck9uIDEwLzIwLzE4IDc6MjEgQU0sIFJvYiBIZXJyaW5nIHdyb3RlOgo+IE9uIEZyaSwgT2N0IDE5 LCAyMDE4IGF0IDU6MDYgUE0gUGF1bCBXYWxtc2xleSA8cGF1bC53YWxtc2xleUBzaWZpdmUuY29t PiB3cm90ZToKPj4gT24gMTAvMTkvMTggMTo0NSBQTSwgUm9iIEhlcnJpbmcgd3JvdGU6Cj4+PiBP biBGcmksIE9jdCAxOSwgMjAxOCBhdCAxOjQ4IFBNIFBhdWwgV2FsbXNsZXkgPHBhdWwud2FsbXNs ZXlAc2lmaXZlLmNvbT4gd3JvdGU6Cj4+Pj4gQWRkIERUIGJpbmRpbmcgZG9jdW1lbnRhdGlvbiBm b3IgdGhlIExpbnV4IGRyaXZlciBmb3IgdGhlIFNpRml2ZQo+Pj4+IGFzeW5jaHJvbm91cyBzZXJp YWwgSVAgYmxvY2suICBOb3RoaW5nIHRvbyBleG90aWMuCj4+Pj4KPj4+PiBDYzogbGludXgtc2Vy aWFsQHZnZXIua2VybmVsLm9yZwo+Pj4+IENjOiBkZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZwo+ Pj4+IENjOiBsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCj4+Pj4gQ2M6IGxpbnV4LWtl cm5lbEB2Z2VyLmtlcm5lbC5vcmcKPj4+PiBDYzogR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hA bGludXhmb3VuZGF0aW9uLm9yZz4KPj4+PiBDYzogUm9iIEhlcnJpbmcgPHJvYmgrZHRAa2VybmVs Lm9yZz4KPj4+PiBDYzogTWFyayBSdXRsYW5kIDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT4KPj4+PiBD YzogUGFsbWVyIERhYmJlbHQgPHBhbG1lckBzaWZpdmUuY29tPgo+Pj4+IFJldmlld2VkLWJ5OiBQ YWxtZXIgRGFiYmVsdCA8cGFsbWVyQHNpZml2ZS5jb20+Cj4+Pj4gU2lnbmVkLW9mZi1ieTogUGF1 bCBXYWxtc2xleSA8cGF1bC53YWxtc2xleUBzaWZpdmUuY29tPgo+Pj4+IFNpZ25lZC1vZmYtYnk6 IFBhdWwgV2FsbXNsZXkgPHBhdWxAcHdzYW4uY29tPgo+Pj4+IC0tLQo+Pj4+ICAgIC4uLi9iaW5k aW5ncy9zZXJpYWwvc2lmaXZlLXNlcmlhbC50eHQgICAgICAgICB8IDIxICsrKysrKysrKysrKysr KysrKysKPj4+PiAgICAxIGZpbGUgY2hhbmdlZCwgMjEgaW5zZXJ0aW9ucygrKQo+Pj4+ICAgIGNy ZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFs L3NpZml2ZS1zZXJpYWwudHh0Cj4+Pj4KPj4+PiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9k ZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9zaWZpdmUtc2VyaWFsLnR4dCBiL0RvY3VtZW50YXRp b24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvc2lmaXZlLXNlcmlhbC50eHQKPj4+PiBuZXcg ZmlsZSBtb2RlIDEwMDY0NAo+Pj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uODk4MjMzODUxMmY1Cj4+ Pj4gLS0tIC9kZXYvbnVsbAo+Pj4+ICsrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5k aW5ncy9zZXJpYWwvc2lmaXZlLXNlcmlhbC50eHQKPj4+PiBAQCAtMCwwICsxLDIxIEBACj4+Pj4g K1NpRml2ZSBhc3luY2hyb25vdXMgc2VyaWFsIGludGVyZmFjZSAoVUFSVCkKPj4+PiArCj4+Pj4g K1JlcXVpcmVkIHByb3BlcnRpZXM6Cj4+Pj4gKwo+Pj4+ICstIGNvbXBhdGlibGU6IHNob3VsZCBi ZSAic2lmaXZlLGZ1NTQwLWMwMDAtdWFydDAiIG9yICJzaWZpdmUsdWFydDAiCj4+Pj4KPj4+IEFz IEkgbWVudGlvbmVkIGZvciB0aGUKPj4+IGludGMgYW5kIG5vdyB0aGUgcHdtIGJsb2NrIGJpbmRp bmdzLCBpZiB5b3UgYXJlIGdvaW5nIHRvIGRvIHZlcnNpb24KPj4+IG51bWJlcnMgcGxlYXNlIGRv Y3VtZW50IHRoZSB2ZXJzaW9uaW5nIHNjaGVtZS4KPj4+Cj4+Pgo+Pj4gV2lsbCBhZGQgdGhhdCB0 byB0aGUgYmluZGluZyBkb2N1bWVudC4KPiBJIGRvbid0IHNlZW0gdG8gYmUgbWFraW5nIG15IHBv aW50IGNsZWFyLiBJIGRvbid0IHdhbnQgYW55IG9mIHRoaXMKPiBhZGRlZCB0byBhIGJpbmRpbmcg ZG9jIGZvciBwYXJ0aWN1bGFyIElQIGJsb2Nrcy4gV3JpdGUgYSBjb21tb24gZG9jCj4gdGhhdCBl eHBsYWlucyB0aGUgc2NoZW1lIGFuZCBhZGRyZXNzZXMgdGhlIHF1ZXN0aW9ucyBJIGFza2VkLiBU aGVuCj4ganVzdCByZWZlcmVuY2UgdGhhdCBkb2MgaGVyZS4KPgo+IE1heWJlIHRoaXMgaXMgZG9j dW1lbnRlZCBzb21ld2hlcmUgYWxyZWFkeT8gT3RoZXJ3aXNlLCBpZiBvbmUgaXMKPiBjcmVhdGlu ZyBhIG5ldyBJUCBibG9jaywgaG93IGRvIHRoZXkga25vdyB3aGF0IHRoZSB2ZXJzaW9uaW5nIHNj aGVtZQo+IGlzIG9yIHdoYXQgZ29lcyBpbiB0aGUgRFQgUk9NPwoKClNlZW1zIGxpa2UgdGhlcmUg bWlnaHQgYmUgc29tZSBjb25mdXNpb24gYmV0d2VlbiBJUCBibG9ja3MgYXMgaW50ZWdyYXRlZCAK b24gYW4gU29DIHZzLiBJUCBibG9ja3MgaW4gaXNvbGF0aW9uLsKgIEl0J3Mgbm90IG5lY2Vzc2Fy aWx5IHRoZSBTb0MgCmludGVncmF0b3IgdGhhdCBzZXRzIGFuIElQIGJsb2NrIHZlcnNpb24gbnVt YmVyOyB0aGlzIGNhbiBjb21lIGZyb20gdGhlIApJUCBibG9jayB2ZW5kb3IgaXRzZWxmLsKgIFNv IGVhY2ggSVAgYmxvY2sgbWF5IGhhdmUgaXRzIG93biB2ZXJzaW9uIApudW1iZXJpbmcgcHJhY3Rp Y2VzIGZvciB0aGUgSVAgYmxvY2sgYWxvbmUuCgoKRm9yIFNpRml2ZSBJUCBibG9ja3MsIHdlIGF0 IFNpRml2ZSBjb3VsZCBwcm9iYWJseSBhbGlnbiBvbiBhIGNvbW1vbiAKdmVyc2lvbiBudW1iZXJp bmcgc3RydWN0dXJlIGZvciB3aGF0J3MgaW4gdGhlIHNpZml2ZS1ibG9ja3MgcmVwb3NpdG9yeS4K CkJ1dCBvdGhlciBJUCBibG9ja3MgZnJvbSBvdGhlciB2ZW5kb3JzIG1heSBub3QgYWxpZ24gdG8g dGhhdCwgb3IgbWF5IG5vdCAKaGF2ZSB2ZXJzaW9uIG51bWJlcnMgZXhwb3NlZCBhdCBhbGwuwqAg SW4gdGhvc2UgY2FzZXMgdGhlcmUncyBubyB3YXkgZm9yIApzb2Z0d2FyZSBmb2xrcyB0byBmaW5k IG91dCB3aGF0IHRoZXkgYXJlLMKgIGFzIHlvdSBwb2ludGVkIG91dCBlYXJsaWVyLsKgIApUaGlz IGlzIHRoZSBjYXNlIHdpdGggbW9zdCBEVCBjb21wYXRpYmxlIHN0cmluZ3MgaW4gdGhlIGtlcm5l bCB0cmVlLgoKRm9yIGV4YW1wbGUsIHdlJ3ZlIGludGVncmF0ZWQgdGhlIE5WRExBIElQIGJsb2Nr LCBmcm9tIE5WSURJQSwgb24gc29tZSAKZGVzaWducy7CoCBBbnkgTlZJRElBIHZlcnNpb24gbnVt YmVycyBpbiB0aGF0IElQIGJsb2NrIHdpbGwgcHJvYmFibHkgbm90IApmb2xsb3cgdGhlIFNpRml2 ZSB2ZXJzaW9uIG51bWJlcmluZyBzY2hlbWUuwqAgSSdkIHByb3Bvc2UgdGhlIHJpZ2h0IHRoaW5n IAp0byBkbyBmb3IgYW4gSVAgYmxvY2sgY29tcGF0aWJsZSBzdHJpbmcgaXMgdG8gZm9sbG93IHRo ZSB2ZW5kb3IncyAKcHJhY3RpY2UsIGFuZCB0aGVuIHVzZSB0aGUgU29DIGludGVncmF0b3IncyB2 ZXJzaW9uIG51bWJlcmluZyBwcmFjdGljZSAKZm9yIHRoZSBTb0MtaW50ZWdyYXRlZCBjb21wYXRp YmxlIHN0cmluZy4KCgpJbiBlZmZlY3QsIGFuIFNvQyBpbnRlZ3JhdGlvbiBEVCBjb21wYXRpYmxl IHN0cmluZyBsaWtlIAoic2lmaXZlLGZ1NTQwLWMwMDAtdWFydCIgaW1wbGljaXRseSBzdGF0ZXMg YW4gSVAgYmxvY2sgdmVyc2lvbiBudW1iZXI6IAoid2hhdGV2ZXIgY2FtZSBvdXQgb2YgdGhlIGZh YiBvbiB0aGUgY2hpcCJbKipdLsKgwqAgSSdkIHByb3Bvc2UgdGhhdCBldmVuIAppbiB0aGVzZSBj YXNlcywgdGhlcmUncyBhbiBhZHZhbnRhZ2UgdG8ga2VlcGluZyB0aGUgIjAiIG9uIHRoZSBlbmQs IApzaW5jZSBpdCB1bmlxdWVseSBpZGVudGlmaWVzIGFuIFNvQy1pbmRlcGVuZGVudCBJUCBibG9j aywgcmF0aGVyIHRoYW4gCmp1c3QgdGhlIHR5cGUgb2YgdGhlIElQIGJsb2NrLiDCoCBCdXQgaWYg dGhlICIwIiBvbiB0aGUgZW5kIG9mIHRoZSBTb0MgCmludGVncmF0aW9uIERUIGNvbXBhdGlibGUg c3RyaW5nIGlzIHByb2JsZW1hdGljIGZvciB5b3UsIHdlIGNhbiAKY2VydGFpbmx5IGRyb3AgdGhh dCBsYXN0IDAgZnJvbSB0aGUgU29DIGludGVncmF0aW9uIERUIGNvbXBhdGlibGUgCnN0cmluZywg YW5kIG9ubHkgc3VmZmVyIGEgc2xpZ2h0IGxhY2sgb2YgY2xhcml0eSBhcyB0byB3aGF0IHZlcnNp b24gd2FzIAppbnRlZ3JhdGVkIG9uIHRoYXQgY2hpcC4KCgpCdXQgZm9yIElQIGJsb2NrLXNwZWNp ZmljIHZlcnNpb24gc3RyaW5ncyBsaWtlICJzaWZpdmUsdWFydDAiLCBJIHRoaW5rIAp3ZSBjYW4g YWRkcmVzcyB5b3VyIGNvbmNlcm4sIGF0IGxlYXN0IGZvciB0aGVzZSBwdWJsaWMgSVAgYmxvY2tz LiBTaW5jZSAKdGhlIFNpRml2ZSBVQVJUIGFuZCBzb21lIG90aGVyIHBlcmlwaGVyYWwgSVAgYmxv Y2tzIGFyZSBvcGVuLXNvdXJjZSwgdGhlIApwdWJsaWMgY2FuIGhhdmUgYSBwcmV0dHkgZ29vZCBp ZGVhIG9mIHdoYXQgRFQgdmVyc2lvbiBudW1iZXIgY29ycmVzcG9uZHMgCnRvIHRoZSBzb3VyY2Ug UlRMLCBzaW5jZSB0aGUgUlRMIGlzIHB1YmxpYy4gwqAgVGhlIHZlcnNpb24gbnVtYmVyIAppZGVu dGlmaWVzIGEgc3BlY2lmaWMgcHJvZ3JhbW1pbmcgbW9kZWwsIHdpdGhvdXQgdHlpbmcgdGhhdCBw cm9ncmFtbWluZyAKbW9kZWwgdG8gYW55IFNvQy1zcGVjaWZpYyB3b3JrYXJvdW5kcywgZXRjLsKg IFNvIGZvciB0aGVzZSBjYXNlcywgSSB0aGluayAKdGhlcmUncyBhIHByZXR0eSBnb29kIGNhc2Ug Zm9yIGhhdmluZyBJUCBibG9jay1zcGVjaWZpYyB2ZXJzaW9uIG51bWJlcnMgCmluIERUIGNvbXBh dGlibGUgc3RyaW5ncywgYW5kIEkgaG9wZSB5b3UnbGwgYWdyZWUuCgoKVGhlIGFkdmFudGFnZSBm b3IgYWxsIG9mIHVzIGlzIHRoYXQgdGhlcmUncyB0aGVuIG5vIG5lZWQgdG8gZW1iZWQgCmNoaXAt c3BlY2lmaWMgRFQgbWF0Y2ggc3RyaW5ncyBpbiB0aGVzZSBkcml2ZXJzLCBmb3IgdGhlIG1vc3Qg cGFydC7CoCBXZSAKanVzdCBtYXRjaCBvbiAic2lmaXZlLHVhcnQwIiBhbmQgdGhhdCdzIGl0LCBh c3N1bWluZyBubyBjaGlwLXNwZWNpZmljIAp3b3JrYXJvdW5kcyBhcmUgbmVlZGVkLgoKCj4+PiAg ICBXaGVyZSBkb2VzIHRoZQo+Pj4gbnVtYmVyIGNvbWUgZnJvbT8KPj4KPj4gSXQgY29tZXMgZnJv bSB0aGUgUlRMLCB3aGljaCBpcyBwdWJsaWM6Cj4+Cj4+IGh0dHBzOi8vZ2l0aHViLmNvbS9zaWZp dmUvc2lmaXZlLWJsb2Nrcy9ibG9iL21hc3Rlci9zcmMvbWFpbi9zY2FsYS9kZXZpY2VzL3VhcnQv VUFSVC5zY2FsYSNMNDMKPiBJJ20gbm90IGdvaW5nIHRvIGdvIHJlYWQgeW91ciBSVEwsIHNvcnJ5 LgoKClRoZXJlJ3Mgbm8gbmVlZCwgYnV0IHlvdSBkaWQgYXNrIHdoZXJlIGl0IGNhbWUgZnJvbS7C oCBTb3JyeSB5b3UgZGlkbid0IApsaWtlIHRoZSBhbnN3ZXIuCgoKUGxlYXNlIGxldCB1cyBrbm93 IHdoYXQgeW91IHdhbnQgdXMgdG8gZG8uCgoKVGhhbmtzIGZvciB5b3VyIHJldmlldwoKCi0gUGF1 bAoKCioqIFRoZSBjYXZlYXQgaXMgdGhhdCBldmVuIHdpdGggU29DIGlkZW50aWZpZXJzIGluIHRo ZSBMaW51eCBEVCAKY29tcGF0aWJsZSBzdHJpbmdzLCB0aGVyZSdzIG5vdCBlbm91Z2ggaW5mb3Jt YXRpb24gaW4gbWFueSBvZiB0aGUgCmV4aXN0aW5nIGtlcm5lbCBEVCBjb21wYXRpYmlsaXR5IHN0 cmluZ3MgdG8gdW5pcXVlbHkgaWRlbnRpZnkgY2hpcCAKdmVyc2lvbnMuwqAgVGFraW5nIE9NQVAg YW5kIFRlZ3JhIGFzIGV4YW1wbGVzLCB0aGVyZSBhcmUgc2V2ZXJhbCAKZGlmZmVyZW50IGNoaXAg dmVyc2lvbnMgZm9yIGEgZ2l2ZW4gU29DIGdlbmVyYXRpb24gdGhhdCBjYW1lIG91dCBvZiB0aGUg CmZhYi7CoCDCoCBPTUFQIGNoaXAgdmVyc2lvbiBzdHJpbmdzIHVzdWFsbHkgYmVnYW4gd2l0aCAi RVMiOyBUZWdyYSB2ZXJzaW9uIApudW1iZXJzLCBhcyBJIHJlY2FsbCwgd2VyZSBhIGxldHRlciBh bmQgdHdvIG51bWJlcnMuwqAgRm9yIHRoZSBtb3N0IHBhcnQsIAp0aG9zZSB2ZXJzaW9ucyB3ZXJl IG5ldmVyIHNwZWNpZmljYWxseSBpZGVudGlmaWVkIGluIHRoZSB1cHN0cmVhbSBrZXJuZWwgCkRU IHN0cmluZ3Mgb3IgaW4gRFQgZmlsZSBuYW1lcy4gKFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMg d2l0aCBPTUFQIAp3aGVyZSB3ZSBkaWQgaWRlbnRpZnkgc3BlY2lmaWMgY2hpcCB2ZXJzaW9uIG51 bWJlcnMsIGJlY2F1c2Ugc2l6YWJsZSAKbnVtYmVycyBvZiBmb2xrcyBoYWQgYm9hcmRzIHdpdGgg ZWFybHkgc2lsaWNvbiwgYW5kIHdlIHdlcmUgY29tbWl0dGVkIHRvIApzdXBwb3J0aW5nIHRoZW0g YXQgdGhlIHRpbWUuKcKgwqDCoCBTYWRseSBldmVuIGFkZGluZyB0aGVzZSBhZGRpdGlvbmFsIGNo aXAgCnZlcnNpb24gaWRlbnRpZmllcnMgdG8gdGhlIERUIHN0cmluZ3Mgd291bGRuJ3QgYmUgcGVy ZmVjdDogSSd2ZSBzZWVuIGF0IApsZWFzdCBvbmUgbGFyZ2UgdmVuZG9yIGltcGxlbWVudGluZyBt ZXRhbC1vbmx5IEVDT3Mgd2l0aG91dCBpbmNyZW1lbnRpbmcgCnB1YmxpYyBjaGlwIHZlcnNpb24g bnVtYmVycy4gVGhlIHBvaW50IGhlcmUgaXMgdGhhdCB3ZSdyZSBhbHJlYWR5IG5vdCAKdW5pcXVl bHkgaWRlbnRpZnlpbmcgSVAgYmxvY2tzIHdpdGggb3VyIGN1cnJlbnQgTGludXggRFQgY29tcGF0 aWJpbGl0eSAKc3RyaW5nIHNjaGVtZS4KCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LXJpc2N2Cg==