From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0D808C43334 for ; Wed, 20 Jul 2022 16:13:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234514AbiGTQNW (ORCPT ); Wed, 20 Jul 2022 12:13:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44476 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229663AbiGTQNV (ORCPT ); Wed, 20 Jul 2022 12:13:21 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5F8A952FCF; Wed, 20 Jul 2022 09:13:20 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 05C1161D3F; Wed, 20 Jul 2022 16:13:20 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1155AC3411E; Wed, 20 Jul 2022 16:13:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1658333599; bh=azV4rh1tEUOtwWZ2k2aBfyGO80U70CDuAQhKmnY7ZKk=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=EeYPcSugudjlBWfAxIxhS/y+sDO1CCygJN/OTX4NYpdkO48bFcLdvojgNscHQtdmO KIGkv7FqwfAXkiElizH3BulePE15ai1LQkaJ57QKace1gYbv3URSk4hXk5mQpP5xuA NyW50165+EVAxLaMbxviS7xK6t23lI17H2vGPHV0h5w3omqUPqsl6mWWd4i+bMKxjh Lvfl2QitS6R6rVZFkC5KjyqUOgeukl15ePHNOaKUbpQmOjEWZ/7byJkg5AnkZ1K6+8 M3DDpv38cQiqO+h1kdj3sGhphMwlWpPemE83Y3oFVZ7oFXVhTtxozaHUyyMj7Gq0jJ Fsp2oyO1xweXA== Received: by pali.im (Postfix) id E1729797; Wed, 20 Jul 2022 18:13:15 +0200 (CEST) Date: Wed, 20 Jul 2022 18:13:15 +0200 From: Pali =?utf-8?B?Um9ow6Fy?= To: Arnd Bergmann Cc: Mauri Sandberg , linux-pci , DTML , Linux Kernel Mailing List , Linux ARM , Bjorn Helgaas , Rob Herring , Krzysztof Kozlowski , Andrew Lunn , Sebastian Hesselbarth , Gregory CLEMENT , Russell King - ARM Linux , Lorenzo Pieralisi , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Thomas Petazzoni Subject: Re: [PATCH 2/2] PCI: mvebu: add support for orion5x Message-ID: <20220720161315.rr4ujakl7akm7pur@pali> References: <20220718202843.6766-1-maukka@ext.kapsi.fi> <20220718202843.6766-4-maukka@ext.kapsi.fi> <20220719094649.pzyrqdvm3fm5fqh2@pali> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: NeoMutt/20180716 Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Tuesday 19 July 2022 12:16:34 Arnd Bergmann wrote: > On Tue, Jul 19, 2022 at 11:46 AM Pali Rohár wrote: > > On Tuesday 19 July 2022 10:05:28 Arnd Bergmann wrote: > > > > +/* Relevant only for Orion-1/Orion-NAS */ > > > > +#define ORION5X_PCIE_WA_PHYS_BASE 0xf0000000 > > > > +#define ORION5X_PCIE_WA_VIRT_BASE IOMEM(0xfd000000) > > > > > > You should not need to hardcode these here. The ORION5X_PCIE_WA_PHYS_BASE > > > should already be part of the DT binding. > > > > Of course! But the issue is that we do not know how to do this DT > > binding. I have already wrote email with asking for help in which > > property and which format should be this config range defined, but no > > answer yet: https://lore.kernel.org/linux-pci/20220710225108.bgedria6igtqpz5l@pali/ > > Ah, I had not seen that email. Quoting from there: > > > So my question is: How to properly define config space range in device > > tree file? In which device tree property and in which format? Please > > note that this memory range of config space is PCIe root port specific > > and it requires its own MBUS_ID() like memory range of PCIe MEM and PCIe > > IO mapping. Please look e.g. at armada-385.dtsi how are MBUS_ID() used: > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/dts/armada-385.dtsi > > This is probably a question for Rob as the mvebu driver is a rather special > case. Normally this would just be a 'reg' property of the host bridge, > but I think > in your case the root device is imaginary, and the ports under it are the > actual hardware devices yes > so you'll probably have to do the same thing as > the armada-385, translating the mbus ranges for the config space in the > "ranges" property of the parent Problem is that "ranges" in PCIe are used for specifying MEM and IO mappings and kernel PCI code does not allow any other type. > and then referring to them by PCI > MMIO addresses using the assigned-addresses property to pass the > config-space registers as a second set of registers in addition to the > first set. It is more complicated. PCIe MEM and IO memory ranges are defined in "soc" node in "pcie-mem-aperture" and "pcie-io-aperture" properties. These ranges are shared across all PCIe controllers and assigning slices of these ranges to specific devices is done later by dynamic allocation. "soc" node is bind to mbus driver (which parse these properties) and provides API for other kernel drivers for dynamic allocation of memory from pcie aperture. In pcie node is just indirect reference to PCIe MEM and IO via MBUS_ID() macro and it is pci-mvebu.c driver who ask mbus driver for PCIe MEM and IO dynamic allocation. So because PCIe config space is not of type PCIe MEM nor PCIe IO (obviously) it cannot use "ranges" property. Because DT pcie nodes use "reg" property for specifying BDF address, we cannot use neither "reg" property for specifying memory range of PCIe config space. And here I'm lost. My guess is that proper way is to define "pcie-cfg-aperture" in "soc" node where would be defined physical address range without any binding to controller, then extend mbus driver to export API also for PCIe CFG and add code which dynamically assign slice of this range to some controller. And then use this new API by pci-mvebu.c to access config space. But pci-mvebu.c needs to know MBUS_ID() attributes which needs to be defined somewhere in pcie DT node... > > > There is little practical difference > > > here, but I see no value in taking the shortcut here either. > > > > > > For the ORION5X_PCIE_WA_VIRT_BASE, you rely on this to match the > > > definition in arch/arm/mach-orion5x/common.c, and this is rather fragile. > > > > > > Instead, please use ioremap() to create a mapping at runtime. The ioremap() > > > implementation on ARM is smart enough to reuse the address from the static > > > mapping in common.c, but will also keep working if that should go away. > > > > I'm planning to work with Mauri on this, but current blocker is DT. > > Ok. It should not be hard to do this first, as you just need to pass the > same physical address that you pass in the mbus setup, but I agree > it's easier to do this afterwards to avoid having to rewrite it again. > > > > This is probably good enough here, though I think you could also use > > > the trick from drivers/pci/ecam.c and map each bus at a time. > > > > > Yes, there are also helper functions like map bus and etc. which could > > simplify this code. I'm planning to do cleanups once we have fully > > working driver for Orion. > > Ok. This is probably not worth the effort if the old driver doesn't already > do provide access to the high registers. > > Arnd If we have free 256MB in physical address space, then we can implement it easily. It is just changing _size_ argument. I'm not sure how much DDR RAM has Orion, but if only 2GB then we should be fine (remaining 2GB should be enough for all peripherals + 256MB for PCIe config space). Main issue is that there is no Orion documentation which would describe how direct mapping of PCIe config space is working. (see also https://lore.kernel.org/linux-doc/20220719080807.16729-1-pali@kernel.org/) So we can only set "size" of the physical config space mapping and if we choose smaller size then we cannot access upper registers. I do not see any option how to specify "offset" for physical config space to allow mapping just one PCI bus. What we have under full control is virtual address space mapping, so we can just map only one PCI bus to virtual address space from large 256MB physical config address space. 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 BC606C43334 for ; Wed, 20 Jul 2022 16:14:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=+092g5+A5Bfn6bciajYm2CA0bAcXy/6WD4nDG4aINH4=; b=1ogF3x+aO9Wp2u IcqtJAY7jE4Jgwmj+lJzBJAWXF5J2QJygpGHtrUVq/vpDQYs7Tygp3Z1MQnRKNgzMpbkN0Kz+PZxC JNO73tf5ZKG0Hpm4xfXUC4ugU+NMLw160A9jPkCziaRXUFopaEn5bNqVcmOQquhJQv4EaRN34Z0YM droIlZ4YKHNheGvrxWfRt9LzPLCUZk4Quv7pa2ooMj+VJkY8hm4son+M1fA6KASchcrYreoUlSAG1 o93KIy/b7LbVyfhxyz/3Apvtr7M0VFnXUmEokQRqv7uMqciyz37Pq/J0yjnUsYxttYe+5C1hVvK9C cF6I0JcWP/x7PmjtQG/w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oECKD-00814f-Nv; Wed, 20 Jul 2022 16:13:25 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oECK9-0080yl-18 for linux-arm-kernel@lists.infradead.org; Wed, 20 Jul 2022 16:13:22 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 05A6861D4A; Wed, 20 Jul 2022 16:13:20 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1155AC3411E; Wed, 20 Jul 2022 16:13:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1658333599; bh=azV4rh1tEUOtwWZ2k2aBfyGO80U70CDuAQhKmnY7ZKk=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=EeYPcSugudjlBWfAxIxhS/y+sDO1CCygJN/OTX4NYpdkO48bFcLdvojgNscHQtdmO KIGkv7FqwfAXkiElizH3BulePE15ai1LQkaJ57QKace1gYbv3URSk4hXk5mQpP5xuA NyW50165+EVAxLaMbxviS7xK6t23lI17H2vGPHV0h5w3omqUPqsl6mWWd4i+bMKxjh Lvfl2QitS6R6rVZFkC5KjyqUOgeukl15ePHNOaKUbpQmOjEWZ/7byJkg5AnkZ1K6+8 M3DDpv38cQiqO+h1kdj3sGhphMwlWpPemE83Y3oFVZ7oFXVhTtxozaHUyyMj7Gq0jJ Fsp2oyO1xweXA== Received: by pali.im (Postfix) id E1729797; Wed, 20 Jul 2022 18:13:15 +0200 (CEST) Date: Wed, 20 Jul 2022 18:13:15 +0200 From: Pali =?utf-8?B?Um9ow6Fy?= To: Arnd Bergmann Cc: Mauri Sandberg , linux-pci , DTML , Linux Kernel Mailing List , Linux ARM , Bjorn Helgaas , Rob Herring , Krzysztof Kozlowski , Andrew Lunn , Sebastian Hesselbarth , Gregory CLEMENT , Russell King - ARM Linux , Lorenzo Pieralisi , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Thomas Petazzoni Subject: Re: [PATCH 2/2] PCI: mvebu: add support for orion5x Message-ID: <20220720161315.rr4ujakl7akm7pur@pali> References: <20220718202843.6766-1-maukka@ext.kapsi.fi> <20220718202843.6766-4-maukka@ext.kapsi.fi> <20220719094649.pzyrqdvm3fm5fqh2@pali> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20180716 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220720_091321_194457_E6471A2B X-CRM114-Status: GOOD ( 52.80 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gVHVlc2RheSAxOSBKdWx5IDIwMjIgMTI6MTY6MzQgQXJuZCBCZXJnbWFubiB3cm90ZToKPiBP biBUdWUsIEp1bCAxOSwgMjAyMiBhdCAxMTo0NiBBTSBQYWxpIFJvaMOhciA8cGFsaUBrZXJuZWwu b3JnPiB3cm90ZToKPiA+IE9uIFR1ZXNkYXkgMTkgSnVseSAyMDIyIDEwOjA1OjI4IEFybmQgQmVy Z21hbm4gd3JvdGU6Cj4gPiA+ID4gKy8qIFJlbGV2YW50IG9ubHkgZm9yIE9yaW9uLTEvT3Jpb24t TkFTICovCj4gPiA+ID4gKyNkZWZpbmUgT1JJT041WF9QQ0lFX1dBX1BIWVNfQkFTRSAgICAgIDB4 ZjAwMDAwMDAKPiA+ID4gPiArI2RlZmluZSBPUklPTjVYX1BDSUVfV0FfVklSVF9CQVNFICAgICAg SU9NRU0oMHhmZDAwMDAwMCkKPiA+ID4KPiA+ID4gWW91IHNob3VsZCBub3QgbmVlZCB0byBoYXJk Y29kZSB0aGVzZSBoZXJlLiBUaGUgT1JJT041WF9QQ0lFX1dBX1BIWVNfQkFTRQo+ID4gPiBzaG91 bGQgYWxyZWFkeSBiZSBwYXJ0IG9mIHRoZSBEVCBiaW5kaW5nLgo+ID4KPiA+IE9mIGNvdXJzZSEg QnV0IHRoZSBpc3N1ZSBpcyB0aGF0IHdlIGRvIG5vdCBrbm93IGhvdyB0byBkbyB0aGlzIERUCj4g PiBiaW5kaW5nLiBJIGhhdmUgYWxyZWFkeSB3cm90ZSBlbWFpbCB3aXRoIGFza2luZyBmb3IgaGVs cCBpbiB3aGljaAo+ID4gcHJvcGVydHkgYW5kIHdoaWNoIGZvcm1hdCBzaG91bGQgYmUgdGhpcyBj b25maWcgcmFuZ2UgZGVmaW5lZCwgYnV0IG5vCj4gPiBhbnN3ZXIgeWV0OiBodHRwczovL2xvcmUu a2VybmVsLm9yZy9saW51eC1wY2kvMjAyMjA3MTAyMjUxMDguYmdlZHJpYTZpZ3RxcHo1bEBwYWxp Lwo+IAo+IEFoLCBJIGhhZCBub3Qgc2VlbiB0aGF0IGVtYWlsLiBRdW90aW5nIGZyb20gdGhlcmU6 Cj4gCj4gPiBTbyBteSBxdWVzdGlvbiBpczogSG93IHRvIHByb3Blcmx5IGRlZmluZSBjb25maWcg c3BhY2UgcmFuZ2UgaW4gZGV2aWNlCj4gPiB0cmVlIGZpbGU/IEluIHdoaWNoIGRldmljZSB0cmVl IHByb3BlcnR5IGFuZCBpbiB3aGljaCBmb3JtYXQ/IFBsZWFzZQo+ID4gbm90ZSB0aGF0IHRoaXMg bWVtb3J5IHJhbmdlIG9mIGNvbmZpZyBzcGFjZSBpcyBQQ0llIHJvb3QgcG9ydCBzcGVjaWZpYwo+ ID4gYW5kIGl0IHJlcXVpcmVzIGl0cyBvd24gTUJVU19JRCgpIGxpa2UgbWVtb3J5IHJhbmdlIG9m IFBDSWUgTUVNIGFuZCBQQ0llCj4gPiBJTyBtYXBwaW5nLiBQbGVhc2UgbG9vayBlLmcuIGF0IGFy bWFkYS0zODUuZHRzaSBob3cgYXJlIE1CVVNfSUQoKSB1c2VkOgo+ID4gaHR0cHM6Ly9naXQua2Vy bmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXguZ2l0L3RyZWUv YXJjaC9hcm0vYm9vdC9kdHMvYXJtYWRhLTM4NS5kdHNpCj4gCj4gVGhpcyBpcyBwcm9iYWJseSBh IHF1ZXN0aW9uIGZvciBSb2IgYXMgdGhlIG12ZWJ1IGRyaXZlciBpcyBhIHJhdGhlciBzcGVjaWFs Cj4gY2FzZS4gTm9ybWFsbHkgdGhpcyB3b3VsZCBqdXN0IGJlIGEgJ3JlZycgcHJvcGVydHkgb2Yg dGhlIGhvc3QgYnJpZGdlLAo+IGJ1dCBJIHRoaW5rCj4gaW4geW91ciBjYXNlIHRoZSByb290IGRl dmljZSBpcyBpbWFnaW5hcnksIGFuZCB0aGUgcG9ydHMgdW5kZXIgaXQgYXJlIHRoZQo+IGFjdHVh bCBoYXJkd2FyZSBkZXZpY2VzCgp5ZXMKCj4gc28geW91J2xsIHByb2JhYmx5IGhhdmUgdG8gZG8g dGhlIHNhbWUgdGhpbmcgYXMKPiB0aGUgYXJtYWRhLTM4NSwgdHJhbnNsYXRpbmcgdGhlIG1idXMg cmFuZ2VzIGZvciB0aGUgY29uZmlnIHNwYWNlIGluIHRoZQo+ICJyYW5nZXMiIHByb3BlcnR5IG9m IHRoZSBwYXJlbnQKClByb2JsZW0gaXMgdGhhdCAicmFuZ2VzIiBpbiBQQ0llIGFyZSB1c2VkIGZv ciBzcGVjaWZ5aW5nIE1FTSBhbmQgSU8KbWFwcGluZ3MgYW5kIGtlcm5lbCBQQ0kgY29kZSBkb2Vz IG5vdCBhbGxvdyBhbnkgb3RoZXIgdHlwZS4KCj4gYW5kIHRoZW4gcmVmZXJyaW5nIHRvIHRoZW0g YnkgUENJCj4gTU1JTyBhZGRyZXNzZXMgdXNpbmcgdGhlIGFzc2lnbmVkLWFkZHJlc3NlcyBwcm9w ZXJ0eSB0byBwYXNzIHRoZQo+IGNvbmZpZy1zcGFjZSByZWdpc3RlcnMgYXMgYSBzZWNvbmQgc2V0 IG9mIHJlZ2lzdGVycyBpbiBhZGRpdGlvbiB0byB0aGUKPiBmaXJzdCBzZXQuCgpJdCBpcyBtb3Jl IGNvbXBsaWNhdGVkLiBQQ0llIE1FTSBhbmQgSU8gbWVtb3J5IHJhbmdlcyBhcmUgZGVmaW5lZCBp bgoic29jIiBub2RlIGluICJwY2llLW1lbS1hcGVydHVyZSIgYW5kICJwY2llLWlvLWFwZXJ0dXJl IiBwcm9wZXJ0aWVzLgpUaGVzZSByYW5nZXMgYXJlIHNoYXJlZCBhY3Jvc3MgYWxsIFBDSWUgY29u dHJvbGxlcnMgYW5kIGFzc2lnbmluZyBzbGljZXMKb2YgdGhlc2UgcmFuZ2VzIHRvIHNwZWNpZmlj IGRldmljZXMgaXMgZG9uZSBsYXRlciBieSBkeW5hbWljIGFsbG9jYXRpb24uCiJzb2MiIG5vZGUg aXMgYmluZCB0byBtYnVzIGRyaXZlciAod2hpY2ggcGFyc2UgdGhlc2UgcHJvcGVydGllcykgYW5k CnByb3ZpZGVzIEFQSSBmb3Igb3RoZXIga2VybmVsIGRyaXZlcnMgZm9yIGR5bmFtaWMgYWxsb2Nh dGlvbiBvZiBtZW1vcnkKZnJvbSBwY2llIGFwZXJ0dXJlLiBJbiBwY2llIG5vZGUgaXMganVzdCBp bmRpcmVjdCByZWZlcmVuY2UgdG8gUENJZSBNRU0KYW5kIElPIHZpYSBNQlVTX0lEKCkgbWFjcm8g YW5kIGl0IGlzIHBjaS1tdmVidS5jIGRyaXZlciB3aG8gYXNrIG1idXMKZHJpdmVyIGZvciBQQ0ll IE1FTSBhbmQgSU8gZHluYW1pYyBhbGxvY2F0aW9uLgoKU28gYmVjYXVzZSBQQ0llIGNvbmZpZyBz cGFjZSBpcyBub3Qgb2YgdHlwZSBQQ0llIE1FTSBub3IgUENJZSBJTwoob2J2aW91c2x5KSBpdCBj YW5ub3QgdXNlICJyYW5nZXMiIHByb3BlcnR5LiBCZWNhdXNlIERUIHBjaWUgbm9kZXMgdXNlCiJy ZWciIHByb3BlcnR5IGZvciBzcGVjaWZ5aW5nIEJERiBhZGRyZXNzLCB3ZSBjYW5ub3QgdXNlIG5l aXRoZXIgInJlZyIKcHJvcGVydHkgZm9yIHNwZWNpZnlpbmcgbWVtb3J5IHJhbmdlIG9mIFBDSWUg Y29uZmlnIHNwYWNlLgoKQW5kIGhlcmUgSSdtIGxvc3QuCgpNeSBndWVzcyBpcyB0aGF0IHByb3Bl ciB3YXkgaXMgdG8gZGVmaW5lICJwY2llLWNmZy1hcGVydHVyZSIgaW4gInNvYyIKbm9kZSB3aGVy ZSB3b3VsZCBiZSBkZWZpbmVkIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2Ugd2l0aG91dCBhbnkgYmlu ZGluZwp0byBjb250cm9sbGVyLCB0aGVuIGV4dGVuZCBtYnVzIGRyaXZlciB0byBleHBvcnQgQVBJ IGFsc28gZm9yIFBDSWUgQ0ZHCmFuZCBhZGQgY29kZSB3aGljaCBkeW5hbWljYWxseSBhc3NpZ24g c2xpY2Ugb2YgdGhpcyByYW5nZSB0byBzb21lCmNvbnRyb2xsZXIuIEFuZCB0aGVuIHVzZSB0aGlz IG5ldyBBUEkgYnkgcGNpLW12ZWJ1LmMgdG8gYWNjZXNzIGNvbmZpZwpzcGFjZS4gQnV0IHBjaS1t dmVidS5jIG5lZWRzIHRvIGtub3cgTUJVU19JRCgpIGF0dHJpYnV0ZXMgd2hpY2ggbmVlZHMgdG8K YmUgZGVmaW5lZCBzb21ld2hlcmUgaW4gcGNpZSBEVCBub2RlLi4uCgo+ID4gPiBUaGVyZSBpcyBs aXR0bGUgcHJhY3RpY2FsIGRpZmZlcmVuY2UKPiA+ID4gaGVyZSwgYnV0IEkgc2VlIG5vIHZhbHVl IGluIHRha2luZyB0aGUgc2hvcnRjdXQgaGVyZSBlaXRoZXIuCj4gPiA+Cj4gPiA+IEZvciB0aGUg T1JJT041WF9QQ0lFX1dBX1ZJUlRfQkFTRSwgeW91IHJlbHkgb24gdGhpcyB0byBtYXRjaCB0aGUK PiA+ID4gZGVmaW5pdGlvbiBpbiBhcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmMsIGFuZCB0 aGlzIGlzIHJhdGhlciBmcmFnaWxlLgo+ID4gPgo+ID4gPiBJbnN0ZWFkLCBwbGVhc2UgdXNlIGlv cmVtYXAoKSB0byBjcmVhdGUgYSBtYXBwaW5nIGF0IHJ1bnRpbWUuIFRoZSBpb3JlbWFwKCkKPiA+ ID4gaW1wbGVtZW50YXRpb24gb24gQVJNIGlzIHNtYXJ0IGVub3VnaCB0byByZXVzZSB0aGUgYWRk cmVzcyBmcm9tIHRoZSBzdGF0aWMKPiA+ID4gbWFwcGluZyBpbiBjb21tb24uYywgYnV0IHdpbGwg YWxzbyBrZWVwIHdvcmtpbmcgaWYgdGhhdCBzaG91bGQgZ28gYXdheS4KPiA+Cj4gPiBJJ20gcGxh bm5pbmcgdG8gd29yayB3aXRoIE1hdXJpIG9uIHRoaXMsIGJ1dCBjdXJyZW50IGJsb2NrZXIgaXMg RFQuCj4gCj4gT2suIEl0IHNob3VsZCBub3QgYmUgaGFyZCB0byBkbyB0aGlzIGZpcnN0LCBhcyB5 b3UganVzdCBuZWVkIHRvIHBhc3MgdGhlCj4gc2FtZSBwaHlzaWNhbCBhZGRyZXNzIHRoYXQgeW91 IHBhc3MgaW4gdGhlIG1idXMgc2V0dXAsIGJ1dCBJIGFncmVlCj4gaXQncyBlYXNpZXIgdG8gZG8g dGhpcyBhZnRlcndhcmRzIHRvIGF2b2lkIGhhdmluZyB0byByZXdyaXRlIGl0IGFnYWluLgo+IAo+ ID4gPiBUaGlzIGlzIHByb2JhYmx5IGdvb2QgZW5vdWdoIGhlcmUsIHRob3VnaCBJIHRoaW5rIHlv dSBjb3VsZCBhbHNvIHVzZQo+ID4gPiB0aGUgdHJpY2sgZnJvbSBkcml2ZXJzL3BjaS9lY2FtLmMg YW5kIG1hcCBlYWNoIGJ1cyBhdCBhIHRpbWUuCj4gPiA+Cj4gPiBZZXMsIHRoZXJlIGFyZSBhbHNv IGhlbHBlciBmdW5jdGlvbnMgbGlrZSBtYXAgYnVzIGFuZCBldGMuIHdoaWNoIGNvdWxkCj4gPiBz aW1wbGlmeSB0aGlzIGNvZGUuIEknbSBwbGFubmluZyB0byBkbyBjbGVhbnVwcyBvbmNlIHdlIGhh dmUgZnVsbHkKPiA+IHdvcmtpbmcgZHJpdmVyIGZvciBPcmlvbi4KPiAKPiBPay4gVGhpcyBpcyBw cm9iYWJseSBub3Qgd29ydGggdGhlIGVmZm9ydCBpZiB0aGUgb2xkIGRyaXZlciBkb2Vzbid0IGFs cmVhZHkKPiBkbyBwcm92aWRlIGFjY2VzcyB0byB0aGUgaGlnaCByZWdpc3RlcnMuCj4gCj4gICAg ICAgQXJuZAoKSWYgd2UgaGF2ZSBmcmVlIDI1Nk1CIGluIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2Us IHRoZW4gd2UgY2FuIGltcGxlbWVudAppdCBlYXNpbHkuIEl0IGlzIGp1c3QgY2hhbmdpbmcgX3Np emVfIGFyZ3VtZW50LiBJJ20gbm90IHN1cmUgaG93IG11Y2gKRERSIFJBTSBoYXMgT3Jpb24sIGJ1 dCBpZiBvbmx5IDJHQiB0aGVuIHdlIHNob3VsZCBiZSBmaW5lIChyZW1haW5pbmcgMkdCCnNob3Vs ZCBiZSBlbm91Z2ggZm9yIGFsbCBwZXJpcGhlcmFscyArIDI1Nk1CIGZvciBQQ0llIGNvbmZpZyBz cGFjZSkuCgpNYWluIGlzc3VlIGlzIHRoYXQgdGhlcmUgaXMgbm8gT3Jpb24gZG9jdW1lbnRhdGlv biB3aGljaCB3b3VsZCBkZXNjcmliZQpob3cgZGlyZWN0IG1hcHBpbmcgb2YgUENJZSBjb25maWcg c3BhY2UgaXMgd29ya2luZy4KKHNlZSBhbHNvIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xpbnV4 LWRvYy8yMDIyMDcxOTA4MDgwNy4xNjcyOS0xLXBhbGlAa2VybmVsLm9yZy8pCgpTbyB3ZSBjYW4g b25seSBzZXQgInNpemUiIG9mIHRoZSBwaHlzaWNhbCBjb25maWcgc3BhY2UgbWFwcGluZyBhbmQg aWYgd2UKY2hvb3NlIHNtYWxsZXIgc2l6ZSB0aGVuIHdlIGNhbm5vdCBhY2Nlc3MgdXBwZXIgcmVn aXN0ZXJzLiBJIGRvIG5vdCBzZWUKYW55IG9wdGlvbiBob3cgdG8gc3BlY2lmeSAib2Zmc2V0IiBm b3IgcGh5c2ljYWwgY29uZmlnIHNwYWNlIHRvIGFsbG93Cm1hcHBpbmcganVzdCBvbmUgUENJIGJ1 cy4KCldoYXQgd2UgaGF2ZSB1bmRlciBmdWxsIGNvbnRyb2wgaXMgdmlydHVhbCBhZGRyZXNzIHNw YWNlIG1hcHBpbmcsIHNvIHdlCmNhbiBqdXN0IG1hcCBvbmx5IG9uZSBQQ0kgYnVzIHRvIHZpcnR1 YWwgYWRkcmVzcyBzcGFjZSBmcm9tIGxhcmdlIDI1Nk1CCnBoeXNpY2FsIGNvbmZpZyBhZGRyZXNz IHNwYWNlLgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K bGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZy YWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGlu dXgtYXJtLWtlcm5lbAo=