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=-5.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 2C590C433E2 for ; Fri, 10 Jul 2020 23:04:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 04DD3206E2 for ; Fri, 10 Jul 2020 23:04:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="sxEL6JcH" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727812AbgGJXES (ORCPT ); Fri, 10 Jul 2020 19:04:18 -0400 Received: from lelv0142.ext.ti.com ([198.47.23.249]:60320 "EHLO lelv0142.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726519AbgGJXER (ORCPT ); Fri, 10 Jul 2020 19:04:17 -0400 Received: from lelv0265.itg.ti.com ([10.180.67.224]) by lelv0142.ext.ti.com (8.15.2/8.15.2) with ESMTP id 06AN3B24130519; Fri, 10 Jul 2020 18:03:11 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1594422191; bh=ub1+3l989W7mhZEj/I2ppqT5GtSi7nEJv2DHiEKNTsI=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=sxEL6JcHWOB90ZiF98uA+dnOLNJqIhGWjmu2u+pC6gH0R2vT5KLDlxKuxEu4pC/fX G4oMyPeUkc3IiwKheb9KJS1SC7u4/NRrEJXV7vdzSM5lSzHSsR3vrKe59DVsbRo0r+ Z/uYWam3khgNv9oq002dgqRLzCrbqM4PP3FJoPM0= Received: from DLEE114.ent.ti.com (dlee114.ent.ti.com [157.170.170.25]) by lelv0265.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 06AN3BvQ064771 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 10 Jul 2020 18:03:11 -0500 Received: from DLEE106.ent.ti.com (157.170.170.36) by DLEE114.ent.ti.com (157.170.170.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1979.3; Fri, 10 Jul 2020 18:03:11 -0500 Received: from fllv0039.itg.ti.com (10.64.41.19) by DLEE106.ent.ti.com (157.170.170.36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1979.3 via Frontend Transport; Fri, 10 Jul 2020 18:03:10 -0500 Received: from [10.250.34.57] (ileax41-snat.itg.ti.com [10.172.224.153]) by fllv0039.itg.ti.com (8.15.2/8.15.2) with ESMTP id 06AN3AG1093664; Fri, 10 Jul 2020 18:03:10 -0500 Subject: Re: [PATCHv3 2/6] irqchip/irq-pruss-intc: Add a PRUSS irqchip driver for PRUSS interrupts To: Marc Zyngier , Grzegorz Jaszczyk CC: , , , Lee Jones , , , , , , "Mills, William" , "Andrew F . Davis" , Roger Quadros References: <1593699479-1445-1-git-send-email-grzegorz.jaszczyk@linaro.org> <1593699479-1445-3-git-send-email-grzegorz.jaszczyk@linaro.org> <12db6d22c12369b6d64f410aa2434b03@kernel.org> <53d39d8fbd63c6638dbf0584c7016ee0@kernel.org> From: Suman Anna Message-ID: <3501f3a6-0613-df1c-2c6d-5ac4610a226d@ti.com> Date: Fri, 10 Jul 2020 18:03:10 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8"; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Marc, On 7/8/20 5:47 AM, Marc Zyngier wrote: > On 2020-07-08 08:04, Grzegorz Jaszczyk wrote: >> On Sun, 5 Jul 2020 at 22:45, Marc Zyngier wrote: >>> >>> On 2020-07-05 14:26, Grzegorz Jaszczyk wrote: >>> > On Sat, 4 Jul 2020 at 11:39, Marc Zyngier wrote: >>> >> >>> >> On 2020-07-03 15:28, Grzegorz Jaszczyk wrote: >>> >>> [...] >>> >>> >> It still begs the question: if the HW can support both edge and level >>> >> triggered interrupts, why isn't the driver supporting this diversity? >>> >> I appreciate that your HW may only have level interrupts so far, but >>> >> what guarantees that this will forever be true? It would imply a >>> >> change >>> >> in the DT binding, which isn't desirable. >>> > >>> > Ok, I've got your point. I will try to come up with something later >>> > on. Probably extending interrupt-cells by one and passing interrupt >>> > type will be enough for now. Extending this driver to actually support >>> > it can be handled later if needed. Hope it works for you. >>> >>> Writing a set_type callback to deal with this should be pretty easy. >>> Don't delay doing the right thing. >> >> Ok. Sorry for the typo in my comment causing this confusion. The h/w actually doesn't support the edge-interrupts. Likewise, the polarity is always high. The individual register bit descriptions mention what the bit values 0 and 1 mean, but there is additional description in the TRMs on all the SoCs that says "always write 1 to the bits of this register" for PRUSS_INTC_SIPR(x) and "always write 0 to the bits of this register" for PRUSS_INTC_SITR(x). FWIW, these are also the reset values. Eg: AM335x TRM - https://www.ti.com/lit/pdf/spruh73 Please see Section 4.4.2.5 and the register descriptions in 4.5.3.49, 4.5.3.51. Please also see Section 4.4.2.3 that explains the PRUSS INTC methodology. >> >>> >>> [...] >>> >>> >> >> > +             hwirq = hipir & GENMASK(9, 0); >>> >> >> > +             virq = irq_linear_revmap(intc->domain, hwirq); >>> >> >> >>> >> >> And this is where I worry. You seems to have a single irqdomain >>> >> >> for all the muxes. Are you guaranteed that you will have no >>> >> >> overlap between muxes? And please use irq_find_mapping(), as >>> >> >> I have top-secret plans to kill irq_linear_revmap(). >>> >> > >>> >> > Regarding irq_find_mapping - sure. >>> >> > >>> >> > Regarding irqdomains: >>> >> > It is a single irqdomain since the hwirq (system event) can be >>> mapped >>> >> > to different irq_host (muxes). Patch #6 >>> >> > https://lkml.org/lkml/2020/7/2/616 implements and describes how >>> input >>> >> > events can be mapped to some output host interrupts through 2 >>> levels >>> >> > of many-to-one mapping i.e. events to channel mapping and >>> channels to >>> >> > host interrupts. Mentioned implementation ensures that specific >>> system >>> >> > event (hwirq) can be mapped through PRUSS specific channel into a >>> >> > single host interrupt. >>> >> >>> >> Patch #6 is a nightmare of its own, and I haven't fully groked it >>> yet. >>> >> Also, this driver seems to totally ignore the 2-level routing. Where >>> >> is it set up? map/unmap in this driver do exactly *nothing*, so >>> >> something somewhere must set it up. >>> > >>> > The map/unmap is updated in patch #6 and it deals with those 2-level >>> > routing setup. Map is responsible for programming the Channel Map >>> > Registers (CMRx) and Host-Interrupt Map Registers (HMRx) basing on >>> > provided configuration from the one parsed in the xlate function. >>> > Unmap undo whatever was done on the map. More details can be found in >>> > patch #6. >>> > >>> > Maybe it would be better to squash patch #6 with this one so it would >>> > be less confusing. What is your advice? >>> >>> So am I right in understanding that without patch #6, this driver does >>> exactly nothing? If so, it has been a waste of review time. >>> >>> Please split patch #6 so that this driver does something useful >>> for Linux, without any of the PRU interrupt routing stuff. I want >>> to see a Linux-only driver that works and doesn't rely on any other >>> exotic feature. >>> >> >> Patch #6 provides PRU specific 2-level routing setup. This step is >> required and it is part of the entire patch-set. Theoretically routing >> setup could be done by other platform driver (not irq one) or e.g. by >> PRU firmware. In such case this driver would be functional without >> patch #6 but I do not think it would be proper. > > Then this whole driver is non-functional until the last patch that > comes with the PRU-specific "value-add". It is all moot actually and the interrupts work only when the PRU remoteproc/clients have invoked the irq_create_fwspec_mapping() for all of the desired system events. It does not make much difference if it was a separate patch or squashed in, patch #6 is a replacement for the previous logic, and since it was complex, it was done in a separate patch to better explain the usage (same reason on v1 and v2 as well). > > [...] > >> I am open to any suggestion if there is a better way of handling >> 2-level routing. I will also appreciate if you could elaborate about >> issues that you see with patch #6. > > The two level routing has to be part of this (or another) irqchip > driver (specially given that it appears to me like another set of > crossbar). There should only be a *single* binding for all interrupts, > including those targeting the PRU (you seem to have two). > Yeah, there hasn't been a clean way of doing this. Our previous attempt was to do this through custom exported functions so that the PRU remoteproc driver can set these up correctly, but that was shot down and this is the direction we are pointed to. We do want to leverage the "interrupts" property in the PRU user nodes instead of inventing our own paradigm through a non-irqchip driver, and at the same time, be able to configure this at the run time only when that PRU driver is running, and remove the mappings once that driver is removed allowing another PRU application/driver. We treat PRUs as an exclusive resource, so everything needs to go along with an appropriate client user. > And the non-CPU interrupt code has to be in its own patch, because > it is pretty borderline anyway (I'm still not completely convinced > this is Linux's job). The logic for non-CPU interrupt code is exactly the same as the CPU interrupt code, as they are all setup through the irq_create_fwspec_mapping(). The CPU-specific pieces are primarily the chained interrupt handling. We have already argued internally about the last part, but our firmware developers literally don't have any IRAM space (we have a lot of Industrial protocols working out of 4K/8K memory), and have pushed all one-time setup to the OS running (Linux or otherwise) on the main ARM core, and INTC is one among the other many such settings. Every word in Instruction RAM was crucial for them. So, we are all ears if there is still an elegant way of doing this. Look forward to any suggestions you may have. And thank you for all your review comments. regards Suman 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=-5.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 38FD3C433E7 for ; Fri, 10 Jul 2020 23:06:09 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 EB84A205CB for ; Fri, 10 Jul 2020 23:06:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="AgSfuN+n"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ti.com header.i=@ti.com header.b="sxEL6JcH" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EB84A205CB Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=ti.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.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=v1I06j9zH73fvVMQMKSu7f6JLbnyIRTN0zWzoXKCmLw=; b=AgSfuN+n3zEh10rkgvoX+jifU Fefo2zIjS5fvDIP3ukcJjUZsoTzbscZWpSirzzJJgA0+ljklhQmCB/kFIoseCAv9jD+uOUYAu74I9 R8LoUulzTgEn1HjwefnrhwGimsk23ataDGW2ZRVJq3Br25qCRE5A+RSxncnKyIdIDsryB6QYAk7pc 8rIHkPcRC2A0hdGWIX56SnFrpMukNjxoZS5HhnxLEpTD+KvnKasME+sC7zT08uUlDsdBxpjaWh47o IX/TkYpeAUARqqIpsxJTTFjBi5pd09B8QWQkuhjVnCKzJY7KAKe6xUL89OsJn9vi5MneFLGc9ZBOb MegPvN2FA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ju242-0003yV-RE; Fri, 10 Jul 2020 23:04:18 +0000 Received: from lelv0142.ext.ti.com ([198.47.23.249]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ju23z-0003wg-5p for linux-arm-kernel@lists.infradead.org; Fri, 10 Jul 2020 23:04:16 +0000 Received: from lelv0265.itg.ti.com ([10.180.67.224]) by lelv0142.ext.ti.com (8.15.2/8.15.2) with ESMTP id 06AN3B24130519; Fri, 10 Jul 2020 18:03:11 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1594422191; bh=ub1+3l989W7mhZEj/I2ppqT5GtSi7nEJv2DHiEKNTsI=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=sxEL6JcHWOB90ZiF98uA+dnOLNJqIhGWjmu2u+pC6gH0R2vT5KLDlxKuxEu4pC/fX G4oMyPeUkc3IiwKheb9KJS1SC7u4/NRrEJXV7vdzSM5lSzHSsR3vrKe59DVsbRo0r+ Z/uYWam3khgNv9oq002dgqRLzCrbqM4PP3FJoPM0= Received: from DLEE114.ent.ti.com (dlee114.ent.ti.com [157.170.170.25]) by lelv0265.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 06AN3BvQ064771 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 10 Jul 2020 18:03:11 -0500 Received: from DLEE106.ent.ti.com (157.170.170.36) by DLEE114.ent.ti.com (157.170.170.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1979.3; Fri, 10 Jul 2020 18:03:11 -0500 Received: from fllv0039.itg.ti.com (10.64.41.19) by DLEE106.ent.ti.com (157.170.170.36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1979.3 via Frontend Transport; Fri, 10 Jul 2020 18:03:10 -0500 Received: from [10.250.34.57] (ileax41-snat.itg.ti.com [10.172.224.153]) by fllv0039.itg.ti.com (8.15.2/8.15.2) with ESMTP id 06AN3AG1093664; Fri, 10 Jul 2020 18:03:10 -0500 Subject: Re: [PATCHv3 2/6] irqchip/irq-pruss-intc: Add a PRUSS irqchip driver for PRUSS interrupts To: Marc Zyngier , Grzegorz Jaszczyk References: <1593699479-1445-1-git-send-email-grzegorz.jaszczyk@linaro.org> <1593699479-1445-3-git-send-email-grzegorz.jaszczyk@linaro.org> <12db6d22c12369b6d64f410aa2434b03@kernel.org> <53d39d8fbd63c6638dbf0584c7016ee0@kernel.org> From: Suman Anna Message-ID: <3501f3a6-0613-df1c-2c6d-5ac4610a226d@ti.com> Date: Fri, 10 Jul 2020 18:03:10 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200710_190415_368776_94A848CE X-CRM114-Status: GOOD ( 38.49 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, Roger Quadros , jason@lakedaemon.net, linux-kernel@vger.kernel.org, "Andrew F . Davis" , robh+dt@kernel.org, tglx@linutronix.de, linux-omap@vger.kernel.org, Lee Jones , "Mills, William" , linux-arm-kernel@lists.infradead.org, david@lechnology.com Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgTWFyYywKCk9uIDcvOC8yMCA1OjQ3IEFNLCBNYXJjIFp5bmdpZXIgd3JvdGU6Cj4gT24gMjAy MC0wNy0wOCAwODowNCwgR3J6ZWdvcnogSmFzemN6eWsgd3JvdGU6Cj4+IE9uIFN1biwgNSBKdWwg MjAyMCBhdCAyMjo0NSwgTWFyYyBaeW5naWVyIDxtYXpAa2VybmVsLm9yZz4gd3JvdGU6Cj4+Pgo+ Pj4gT24gMjAyMC0wNy0wNSAxNDoyNiwgR3J6ZWdvcnogSmFzemN6eWsgd3JvdGU6Cj4+PiA+IE9u IFNhdCwgNCBKdWwgMjAyMCBhdCAxMTozOSwgTWFyYyBaeW5naWVyIDxtYXpAa2VybmVsLm9yZz4g d3JvdGU6Cj4+PiA+Pgo+Pj4gPj4gT24gMjAyMC0wNy0wMyAxNToyOCwgR3J6ZWdvcnogSmFzemN6 eWsgd3JvdGU6Cj4+Pgo+Pj4gWy4uLl0KPj4+Cj4+PiA+PiBJdCBzdGlsbCBiZWdzIHRoZSBxdWVz dGlvbjogaWYgdGhlIEhXIGNhbiBzdXBwb3J0IGJvdGggZWRnZSBhbmQgbGV2ZWwKPj4+ID4+IHRy aWdnZXJlZCBpbnRlcnJ1cHRzLCB3aHkgaXNuJ3QgdGhlIGRyaXZlciBzdXBwb3J0aW5nIHRoaXMg ZGl2ZXJzaXR5Pwo+Pj4gPj4gSSBhcHByZWNpYXRlIHRoYXQgeW91ciBIVyBtYXkgb25seSBoYXZl IGxldmVsIGludGVycnVwdHMgc28gZmFyLCBidXQKPj4+ID4+IHdoYXQgZ3VhcmFudGVlcyB0aGF0 IHRoaXMgd2lsbCBmb3JldmVyIGJlIHRydWU/IEl0IHdvdWxkIGltcGx5IGEKPj4+ID4+IGNoYW5n ZQo+Pj4gPj4gaW4gdGhlIERUIGJpbmRpbmcsIHdoaWNoIGlzbid0IGRlc2lyYWJsZS4KPj4+ID4K Pj4+ID4gT2ssIEkndmUgZ290IHlvdXIgcG9pbnQuIEkgd2lsbCB0cnkgdG8gY29tZSB1cCB3aXRo IHNvbWV0aGluZyBsYXRlcgo+Pj4gPiBvbi4gUHJvYmFibHkgZXh0ZW5kaW5nIGludGVycnVwdC1j ZWxscyBieSBvbmUgYW5kIHBhc3NpbmcgaW50ZXJydXB0Cj4+PiA+IHR5cGUgd2lsbCBiZSBlbm91 Z2ggZm9yIG5vdy4gRXh0ZW5kaW5nIHRoaXMgZHJpdmVyIHRvIGFjdHVhbGx5IHN1cHBvcnQKPj4+ ID4gaXQgY2FuIGJlIGhhbmRsZWQgbGF0ZXIgaWYgbmVlZGVkLiBIb3BlIGl0IHdvcmtzIGZvciB5 b3UuCj4+Pgo+Pj4gV3JpdGluZyBhIHNldF90eXBlIGNhbGxiYWNrIHRvIGRlYWwgd2l0aCB0aGlz IHNob3VsZCBiZSBwcmV0dHkgZWFzeS4KPj4+IERvbid0IGRlbGF5IGRvaW5nIHRoZSByaWdodCB0 aGluZy4KPj4KPj4gT2suCgpTb3JyeSBmb3IgdGhlIHR5cG8gaW4gbXkgY29tbWVudCBjYXVzaW5n IHRoaXMgY29uZnVzaW9uLgoKVGhlIGgvdyBhY3R1YWxseSBkb2Vzbid0IHN1cHBvcnQgdGhlIGVk Z2UtaW50ZXJydXB0cy4gTGlrZXdpc2UsIHRoZSAKcG9sYXJpdHkgaXMgYWx3YXlzIGhpZ2guIFRo ZSBpbmRpdmlkdWFsIHJlZ2lzdGVyIGJpdCBkZXNjcmlwdGlvbnMgCm1lbnRpb24gd2hhdCB0aGUg Yml0IHZhbHVlcyAwIGFuZCAxIG1lYW4sIGJ1dCB0aGVyZSBpcyBhZGRpdGlvbmFsIApkZXNjcmlw dGlvbiBpbiB0aGUgVFJNcyBvbiBhbGwgdGhlIFNvQ3MgdGhhdCBzYXlzCiJhbHdheXMgd3JpdGUg MSB0byB0aGUgYml0cyBvZiB0aGlzIHJlZ2lzdGVyIiBmb3IgUFJVU1NfSU5UQ19TSVBSKHgpIGFu ZAoiYWx3YXlzIHdyaXRlIDAgdG8gdGhlIGJpdHMgb2YgdGhpcyByZWdpc3RlciIgZm9yIFBSVVNT X0lOVENfU0lUUih4KS4KRldJVywgdGhlc2UgYXJlIGFsc28gdGhlIHJlc2V0IHZhbHVlcy4KCkVn OiBBTTMzNXggVFJNIC0gaHR0cHM6Ly93d3cudGkuY29tL2xpdC9wZGYvc3BydWg3MwpQbGVhc2Ug c2VlIFNlY3Rpb24gNC40LjIuNSBhbmQgdGhlIHJlZ2lzdGVyIGRlc2NyaXB0aW9ucyBpbiA0LjUu My40OSwgCjQuNS4zLjUxLiBQbGVhc2UgYWxzbyBzZWUgU2VjdGlvbiA0LjQuMi4zIHRoYXQgZXhw bGFpbnMgdGhlIFBSVVNTIElOVEMgCm1ldGhvZG9sb2d5LgoKPj4KPj4+Cj4+PiBbLi4uXQo+Pj4K Pj4+ID4+ID4+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBod2lycSA9IGhpcGlyICYgR0VO TUFTSyg5LCAwKTsKPj4+ID4+ID4+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2aXJxID0g aXJxX2xpbmVhcl9yZXZtYXAoaW50Yy0+ZG9tYWluLCBod2lycSk7Cj4+PiA+PiA+Pgo+Pj4gPj4g Pj4gQW5kIHRoaXMgaXMgd2hlcmUgSSB3b3JyeS4gWW91IHNlZW1zIHRvIGhhdmUgYSBzaW5nbGUg aXJxZG9tYWluCj4+PiA+PiA+PiBmb3IgYWxsIHRoZSBtdXhlcy4gQXJlIHlvdSBndWFyYW50ZWVk IHRoYXQgeW91IHdpbGwgaGF2ZSBubwo+Pj4gPj4gPj4gb3ZlcmxhcCBiZXR3ZWVuIG11eGVzPyBB bmQgcGxlYXNlIHVzZSBpcnFfZmluZF9tYXBwaW5nKCksIGFzCj4+PiA+PiA+PiBJIGhhdmUgdG9w LXNlY3JldCBwbGFucyB0byBraWxsIGlycV9saW5lYXJfcmV2bWFwKCkuCj4+PiA+PiA+Cj4+PiA+ PiA+IFJlZ2FyZGluZyBpcnFfZmluZF9tYXBwaW5nIC0gc3VyZS4KPj4+ID4+ID4KPj4+ID4+ID4g UmVnYXJkaW5nIGlycWRvbWFpbnM6Cj4+PiA+PiA+IEl0IGlzIGEgc2luZ2xlIGlycWRvbWFpbiBz aW5jZSB0aGUgaHdpcnEgKHN5c3RlbSBldmVudCkgY2FuIGJlIAo+Pj4gbWFwcGVkCj4+PiA+PiA+ IHRvIGRpZmZlcmVudCBpcnFfaG9zdCAobXV4ZXMpLiBQYXRjaCAjNgo+Pj4gPj4gPiBodHRwczov L2xrbWwub3JnL2xrbWwvMjAyMC83LzIvNjE2IGltcGxlbWVudHMgYW5kIGRlc2NyaWJlcyBob3cg Cj4+PiBpbnB1dAo+Pj4gPj4gPiBldmVudHMgY2FuIGJlIG1hcHBlZCB0byBzb21lIG91dHB1dCBo b3N0IGludGVycnVwdHMgdGhyb3VnaCAyIAo+Pj4gbGV2ZWxzCj4+PiA+PiA+IG9mIG1hbnktdG8t b25lIG1hcHBpbmcgaS5lLiBldmVudHMgdG8gY2hhbm5lbCBtYXBwaW5nIGFuZCAKPj4+IGNoYW5u ZWxzIHRvCj4+PiA+PiA+IGhvc3QgaW50ZXJydXB0cy4gTWVudGlvbmVkIGltcGxlbWVudGF0aW9u IGVuc3VyZXMgdGhhdCBzcGVjaWZpYyAKPj4+IHN5c3RlbQo+Pj4gPj4gPiBldmVudCAoaHdpcnEp IGNhbiBiZSBtYXBwZWQgdGhyb3VnaCBQUlVTUyBzcGVjaWZpYyBjaGFubmVsIGludG8gYQo+Pj4g Pj4gPiBzaW5nbGUgaG9zdCBpbnRlcnJ1cHQuCj4+PiA+Pgo+Pj4gPj4gUGF0Y2ggIzYgaXMgYSBu aWdodG1hcmUgb2YgaXRzIG93biwgYW5kIEkgaGF2ZW4ndCBmdWxseSBncm9rZWQgaXQgCj4+PiB5 ZXQuCj4+PiA+PiBBbHNvLCB0aGlzIGRyaXZlciBzZWVtcyB0byB0b3RhbGx5IGlnbm9yZSB0aGUg Mi1sZXZlbCByb3V0aW5nLiBXaGVyZQo+Pj4gPj4gaXMgaXQgc2V0IHVwPyBtYXAvdW5tYXAgaW4g dGhpcyBkcml2ZXIgZG8gZXhhY3RseSAqbm90aGluZyosIHNvCj4+PiA+PiBzb21ldGhpbmcgc29t ZXdoZXJlIG11c3Qgc2V0IGl0IHVwLgo+Pj4gPgo+Pj4gPiBUaGUgbWFwL3VubWFwIGlzIHVwZGF0 ZWQgaW4gcGF0Y2ggIzYgYW5kIGl0IGRlYWxzIHdpdGggdGhvc2UgMi1sZXZlbAo+Pj4gPiByb3V0 aW5nIHNldHVwLiBNYXAgaXMgcmVzcG9uc2libGUgZm9yIHByb2dyYW1taW5nIHRoZSBDaGFubmVs IE1hcAo+Pj4gPiBSZWdpc3RlcnMgKENNUngpIGFuZCBIb3N0LUludGVycnVwdCBNYXAgUmVnaXN0 ZXJzIChITVJ4KSBiYXNpbmcgb24KPj4+ID4gcHJvdmlkZWQgY29uZmlndXJhdGlvbiBmcm9tIHRo ZSBvbmUgcGFyc2VkIGluIHRoZSB4bGF0ZSBmdW5jdGlvbi4KPj4+ID4gVW5tYXAgdW5kbyB3aGF0 ZXZlciB3YXMgZG9uZSBvbiB0aGUgbWFwLiBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluCj4+ PiA+IHBhdGNoICM2Lgo+Pj4gPgo+Pj4gPiBNYXliZSBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gc3F1 YXNoIHBhdGNoICM2IHdpdGggdGhpcyBvbmUgc28gaXQgd291bGQKPj4+ID4gYmUgbGVzcyBjb25m dXNpbmcuIFdoYXQgaXMgeW91ciBhZHZpY2U/Cj4+Pgo+Pj4gU28gYW0gSSByaWdodCBpbiB1bmRl cnN0YW5kaW5nIHRoYXQgd2l0aG91dCBwYXRjaCAjNiwgdGhpcyBkcml2ZXIgZG9lcwo+Pj4gZXhh Y3RseSBub3RoaW5nPyBJZiBzbywgaXQgaGFzIGJlZW4gYSB3YXN0ZSBvZiByZXZpZXcgdGltZS4K Pj4+Cj4+PiBQbGVhc2Ugc3BsaXQgcGF0Y2ggIzYgc28gdGhhdCB0aGlzIGRyaXZlciBkb2VzIHNv bWV0aGluZyB1c2VmdWwKPj4+IGZvciBMaW51eCwgd2l0aG91dCBhbnkgb2YgdGhlIFBSVSBpbnRl cnJ1cHQgcm91dGluZyBzdHVmZi4gSSB3YW50Cj4+PiB0byBzZWUgYSBMaW51eC1vbmx5IGRyaXZl ciB0aGF0IHdvcmtzIGFuZCBkb2Vzbid0IHJlbHkgb24gYW55IG90aGVyCj4+PiBleG90aWMgZmVh dHVyZS4KPj4+Cj4+Cj4+IFBhdGNoICM2IHByb3ZpZGVzIFBSVSBzcGVjaWZpYyAyLWxldmVsIHJv dXRpbmcgc2V0dXAuIFRoaXMgc3RlcCBpcwo+PiByZXF1aXJlZCBhbmQgaXQgaXMgcGFydCBvZiB0 aGUgZW50aXJlIHBhdGNoLXNldC4gVGhlb3JldGljYWxseSByb3V0aW5nCj4+IHNldHVwIGNvdWxk IGJlIGRvbmUgYnkgb3RoZXIgcGxhdGZvcm0gZHJpdmVyIChub3QgaXJxIG9uZSkgb3IgZS5nLiBi eQo+PiBQUlUgZmlybXdhcmUuIEluIHN1Y2ggY2FzZSB0aGlzIGRyaXZlciB3b3VsZCBiZSBmdW5j dGlvbmFsIHdpdGhvdXQKPj4gcGF0Y2ggIzYgYnV0IEkgZG8gbm90IHRoaW5rIGl0IHdvdWxkIGJl IHByb3Blci4KPiAKPiBUaGVuIHRoaXMgd2hvbGUgZHJpdmVyIGlzIG5vbi1mdW5jdGlvbmFsIHVu dGlsIHRoZSBsYXN0IHBhdGNoIHRoYXQKPiBjb21lcyB3aXRoIHRoZSBQUlUtc3BlY2lmaWMgInZh bHVlLWFkZCIuCgpJdCBpcyBhbGwgbW9vdCBhY3R1YWxseSBhbmQgdGhlIGludGVycnVwdHMgd29y ayBvbmx5IHdoZW4gdGhlIFBSVSAKcmVtb3RlcHJvYy9jbGllbnRzIGhhdmUgaW52b2tlZCB0aGUg aXJxX2NyZWF0ZV9md3NwZWNfbWFwcGluZygpCmZvciBhbGwgb2YgdGhlIGRlc2lyZWQgc3lzdGVt IGV2ZW50cy4gSXQgZG9lcyBub3QgbWFrZSBtdWNoIGRpZmZlcmVuY2UgCmlmIGl0IHdhcyBhIHNl cGFyYXRlIHBhdGNoIG9yIHNxdWFzaGVkIGluLCBwYXRjaCAjNiBpcyBhIHJlcGxhY2VtZW50IGZv ciAKdGhlIHByZXZpb3VzIGxvZ2ljLCBhbmQgc2luY2UgaXQgd2FzIGNvbXBsZXgsIGl0IHdhcyBk b25lIGluIGEgc2VwYXJhdGUgCnBhdGNoIHRvIGJldHRlciBleHBsYWluIHRoZSB1c2FnZSAoc2Ft ZSByZWFzb24gb24gdjEgYW5kIHYyIGFzIHdlbGwpLgoKPiAKPiBbLi4uXQo+IAo+PiBJIGFtIG9w ZW4gdG8gYW55IHN1Z2dlc3Rpb24gaWYgdGhlcmUgaXMgYSBiZXR0ZXIgd2F5IG9mIGhhbmRsaW5n Cj4+IDItbGV2ZWwgcm91dGluZy4gSSB3aWxsIGFsc28gYXBwcmVjaWF0ZSBpZiB5b3UgY291bGQg ZWxhYm9yYXRlIGFib3V0Cj4+IGlzc3VlcyB0aGF0IHlvdSBzZWUgd2l0aCBwYXRjaCAjNi4KPiAK PiBUaGUgdHdvIGxldmVsIHJvdXRpbmcgaGFzIHRvIGJlIHBhcnQgb2YgdGhpcyAob3IgYW5vdGhl cikgaXJxY2hpcAo+IGRyaXZlciAoc3BlY2lhbGx5IGdpdmVuIHRoYXQgaXQgYXBwZWFycyB0byBt ZSBsaWtlIGFub3RoZXIgc2V0IG9mCj4gY3Jvc3NiYXIpLiBUaGVyZSBzaG91bGQgb25seSBiZSBh ICpzaW5nbGUqIGJpbmRpbmcgZm9yIGFsbCBpbnRlcnJ1cHRzLAo+IGluY2x1ZGluZyB0aG9zZSB0 YXJnZXRpbmcgdGhlIFBSVSAoeW91IHNlZW0gdG8gaGF2ZSB0d28pLgo+IAoKWWVhaCwgdGhlcmUg aGFzbid0IGJlZW4gYSBjbGVhbiB3YXkgb2YgZG9pbmcgdGhpcy4gT3VyIHByZXZpb3VzIGF0dGVt cHQgCndhcyB0byBkbyB0aGlzIHRocm91Z2ggY3VzdG9tIGV4cG9ydGVkIGZ1bmN0aW9ucyBzbyB0 aGF0IHRoZSBQUlUgCnJlbW90ZXByb2MgZHJpdmVyIGNhbiBzZXQgdGhlc2UgdXAgY29ycmVjdGx5 LCBidXQgdGhhdCB3YXMgc2hvdCBkb3duIGFuZCAKdGhpcyBpcyB0aGUgZGlyZWN0aW9uIHdlIGFy ZSBwb2ludGVkIHRvLgoKV2UgZG8gd2FudCB0byBsZXZlcmFnZSB0aGUgImludGVycnVwdHMiIHBy b3BlcnR5IGluIHRoZSBQUlUgdXNlciBub2RlcyAKaW5zdGVhZCBvZiBpbnZlbnRpbmcgb3VyIG93 biBwYXJhZGlnbSB0aHJvdWdoIGEgbm9uLWlycWNoaXAgZHJpdmVyLCBhbmQgCmF0IHRoZSBzYW1l IHRpbWUsIGJlIGFibGUgdG8gY29uZmlndXJlIHRoaXMgYXQgdGhlIHJ1biB0aW1lIG9ubHkgd2hl biAKdGhhdCBQUlUgZHJpdmVyIGlzIHJ1bm5pbmcsIGFuZCByZW1vdmUgdGhlIG1hcHBpbmdzIG9u Y2UgdGhhdCBkcml2ZXIgaXMgCnJlbW92ZWQgYWxsb3dpbmcgYW5vdGhlciBQUlUgYXBwbGljYXRp b24vZHJpdmVyLiBXZSB0cmVhdCBQUlVzIGFzIGFuIApleGNsdXNpdmUgcmVzb3VyY2UsIHNvIGV2 ZXJ5dGhpbmcgbmVlZHMgdG8gZ28gYWxvbmcgd2l0aCBhbiBhcHByb3ByaWF0ZSAKY2xpZW50IHVz ZXIuCgo+IEFuZCB0aGUgbm9uLUNQVSBpbnRlcnJ1cHQgY29kZSBoYXMgdG8gYmUgaW4gaXRzIG93 biBwYXRjaCwgYmVjYXVzZQo+IGl0IGlzIHByZXR0eSBib3JkZXJsaW5lIGFueXdheSAoSSdtIHN0 aWxsIG5vdCBjb21wbGV0ZWx5IGNvbnZpbmNlZAo+IHRoaXMgaXMgTGludXgncyBqb2IpLgoKVGhl IGxvZ2ljIGZvciBub24tQ1BVIGludGVycnVwdCBjb2RlIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMg dGhlIENQVSAKaW50ZXJydXB0IGNvZGUsIGFzIHRoZXkgYXJlIGFsbCBzZXR1cCB0aHJvdWdoIHRo ZSAKaXJxX2NyZWF0ZV9md3NwZWNfbWFwcGluZygpLiBUaGUgQ1BVLXNwZWNpZmljIHBpZWNlcyBh cmUgcHJpbWFyaWx5IHRoZSAKY2hhaW5lZCBpbnRlcnJ1cHQgaGFuZGxpbmcuCgpXZSBoYXZlIGFs cmVhZHkgYXJndWVkIGludGVybmFsbHkgYWJvdXQgdGhlIGxhc3QgcGFydCwgYnV0IG91ciBmaXJt d2FyZSAKZGV2ZWxvcGVycyBsaXRlcmFsbHkgZG9uJ3QgaGF2ZSBhbnkgSVJBTSBzcGFjZSAod2Ug aGF2ZSBhIGxvdCBvZiAKSW5kdXN0cmlhbCBwcm90b2NvbHMgd29ya2luZyBvdXQgb2YgNEsvOEsg bWVtb3J5KSwgYW5kIGhhdmUgcHVzaGVkIGFsbCAKb25lLXRpbWUgc2V0dXAgdG8gdGhlIE9TIHJ1 bm5pbmcgKExpbnV4IG9yIG90aGVyd2lzZSkgb24gdGhlIG1haW4gQVJNIApjb3JlLCBhbmQgSU5U QyBpcyBvbmUgYW1vbmcgdGhlIG90aGVyIG1hbnkgc3VjaCBzZXR0aW5ncy4gRXZlcnkgd29yZCBp biAKSW5zdHJ1Y3Rpb24gUkFNIHdhcyBjcnVjaWFsIGZvciB0aGVtLgoKU28sIHdlIGFyZSBhbGwg ZWFycyBpZiB0aGVyZSBpcyBzdGlsbCBhbiBlbGVnYW50IHdheSBvZiBkb2luZyB0aGlzLiBMb29r IApmb3J3YXJkIHRvIGFueSBzdWdnZXN0aW9ucyB5b3UgbWF5IGhhdmUuCgpBbmQgdGhhbmsgeW91 IGZvciBhbGwgeW91ciByZXZpZXcgY29tbWVudHMuCgpyZWdhcmRzClN1bWFuCgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBt YWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9s aXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=