From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29D702AE96; Thu, 16 Jan 2025 17:07:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737047245; cv=none; b=lxne3YBeIc02w3X4rmqLj5dWuQ1ggwDARHxvccofYX6C9kHApYEY1j7Bx9S2mOrrUGfIKgAiWGDy5IzcWtX7+n9BadlI8Y/AAT0e7Jt7vPcnky/NrwBYQZ88Is2ODu/hNhsWSByajsHQFUMufwpx0E84oDR0FvliO9y8+LZ34Rw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737047245; c=relaxed/simple; bh=pHmOcJZOrilTdmTARnJBuK8Ee8LYE3oxweFl53AmY6o=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition:In-Reply-To; b=mLiQIkV0ajAxEJfuxapR027QhHaQWfQuEsJf7xRg8v2n8IV1zJDNXTv6t4+nztFyQF0J/6cbFS7Gif7E8ebx/GtmGr/exmYy770HY9qt1jVkf3HM0vfA8hUe1cufmbpEkdPofXh9Du+YSjw8PcCWqiIb7G1TzSzAI+gR+kYos6s= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PX3bO30m; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PX3bO30m" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 725C4C4CED6; Thu, 16 Jan 2025 17:07:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1737047244; bh=pHmOcJZOrilTdmTARnJBuK8Ee8LYE3oxweFl53AmY6o=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=PX3bO30mgoYZOP5FVB/STh23OfeV/3vROEx2TAAi/MVWbjPdtXiXZB2XAHpBz2OHg ybmG1cGM854smS23RtuJG7xsVwg8MLL/wb1vTMvRJHWocQfyr+M5FS8xlEyCigcTej uM7DR200XMszSGAjxh0747KYtMCfqXsTdQkvRGYd/vfYFOyYLIwG0wTgtHXoLZOuug we6iZJMcjIKjYUpX4Y5cR0T9IMktkGZ1RMuVO8C9PXu09ZQvj4iqxhoXWM28u+WN8p Fv/BlqeB6H92yF6biuUVoWRuVBqg6+P806aazHrXbmmXPElYKKbN0uc5hIR1Etv8fG jo9cbjgQwT0gg== Date: Thu, 16 Jan 2025 11:07:22 -0600 From: Bjorn Helgaas To: Conor Dooley Cc: daire.mcnamara@microchip.com, linux-pci@vger.kernel.org, devicetree@vger.kernel.org, conor.dooley@microchip.com, lpieralisi@kernel.org, kw@linux.com, robh@kernel.org, bhelgaas@google.com, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, krzk+dt@kernel.org, conor+dt@kernel.org, ilpo.jarvinen@linux.intel.com, kevin.xie@starfivetech.com, Frank Li Subject: Re: [PATCH v10 1/3] PCI: microchip: Fix outbound address translation tables Message-ID: <20250116170722.GA589558@bhelgaas> Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20250116-debatable-hazelnut-6501986373fa@spud> [+cc Frank, original patch at https://lore.kernel.org/r/20241011140043.1250030-2-daire.mcnamara@microchip.com] On Thu, Jan 16, 2025 at 04:46:19PM +0000, Conor Dooley wrote: > On Thu, Jan 16, 2025 at 09:42:53AM -0600, Bjorn Helgaas wrote: > > On Tue, Jan 14, 2025 at 06:13:10PM -0600, Bjorn Helgaas wrote: > > > On Fri, Oct 11, 2024 at 03:00:41PM +0100, daire.mcnamara@microchip.com wrote: > > > > From: Daire McNamara > > > > > > > > On Microchip PolarFire SoC (MPFS) the PCIe Root Port can be behind one of > > > > three general-purpose Fabric Interface Controller (FIC) buses that > > > > encapsulate an AXI-M interface. That FIC is responsible for managing > > > > the translations of the upper 32-bits of the AXI-M address. On MPFS, > > > > the Root Port driver needs to take account of that outbound address > > > > translation done by the parent FIC bus before setting up its own > > > > outbound address translation tables. In all cases on MPFS, > > > > the remaining outbound address translation tables are 32-bit only. > > > > > > > > Limit the outbound address translation tables to 32-bit only. > > > > > > I don't quite understand what this is saying. It seems like the code > > > keeps only the low 32 bits of a PCI address and throws away any > > > address bits above the low 32. > > > > > > If that's what the FIC does, I wouldn't describe the FIC as > > > "translating the upper 32 bits" since it sounds like the translation > > > is just truncation. > > > > > > I guess it must be more complicated than that? I assume you can still > > > reach BARs that have PCI addresses above 4GB using CPU loads/stores? > > > > > > The apertures through the host bridge for MMIO access are described by > > > DT ranges properties, so this must be something that can't be > > > described that way? > > > > Ping? I'd really like to understand this before the v6.14 merge > > window opens on Sunday. > > Daire's been having some issues getting onto the corporate VPN to send > his reply, I've pasted it below on his behalf: > > There are 3 Fabric Inter Connect (FIC) buses on PolarFire SoC - each of > these FIC buses contain an AXI master bus and are 64-bits wide. These > AXI-Masters (each with an individual 64-bit AXI base address – for example > FIC1’s AXI Master has a base address of 0x2000000000) are connected to > general purpose FPGA logic. This FPGA logic is, in turn, connected to a > 2nd 32-bit AXI master which is attached to the PCIe block in RootPort mode. > Conceptually, on the other side of this configurable logic, there is a > 32-bit bus to a hard PCIe rootport. So, again conceptually, outbound address > translation looks like this: > > Processor Complex à FIC (64-bit AXI-M) à Configurable Logic à 32-bit AXI-M à PCIe Rootport > (This how it came to me from Daire, I think the á is meant to > be an arrow) > > This allows a designer two broad choices: > > Choice of FIC (effectively choice of AXI bus) > Ability to offset the AXI address of any peripherals they add in the > Fabric. > > So, for the case of an outbound AXI address, from the processors’ point > of view (or Linux’ point of view if you prefer), the processor uses a > 64-bit AXI address, then – in a very general way of viewing the process > and thinking only about accessing the PCIe device – the FPGA logic can > be configured to adjust that AXI-M address to any arbitrary “address” > before it passes that new “address” to the Root Port over a second 32-bit > AXI bus (the main constraint is that the FPGA logic can only use a 32-bit > address on that AXI-M interface to the Root Port). > > To manage this complexity, Microchip have design rules for customers > building their FPGA logic where we strongly recommend that they only > interact with the upper 32 bits of the 64-bit address in the FPGA logic > and pass the lower 32 bits through (unmodified) to the AXI-M side of the > PCIe Root Port. This allows them to “move” a 64-bit AXI-M window for their > PCIe Root Port (as viewed by the processor) for their particular design – > if they need to - so that they can also access any other AXI-M windows > associated with any other peripherals they might add to their design. > > In practise, so far, all customers, and our own internal boards have all > started by using one of two major reference designs from us (one using FIC1 > where the AXI-M window destined for the PCIe Root Port starts at 0x2000000000 > and one using FIC2 where its AXI-M window, again destined for the PCIe Root > Port starts at 0x3000000000). Is there something special about this that cannot be described by a DT 'ranges' property? This sounds conceptually similar to Frank's nice picture at https://lore.kernel.org/r/20241119-pci_fixup_addr-v8-2-c4bfa5193288@nxp.com Bjorn 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 75F3DC02183 for ; Thu, 16 Jan 2025 17:07:34 +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: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:References: List-Owner; bh=nydLwsRU43an/Zkk2R+6/xlmwW25vU3pP40NI6+CV1U=; b=ld/ZT4RU8R/gch iUTEEjSLjsrwOP/srkMqV17tK5A7UdRWgHaG08vmFgjoKpQC0HUfrKduJBzZhdl1V8zPELTEuXcgZ aY9/dJTVttL43nABbj9vKX6sVyw7mqpTOpsJXNEp49rhq1C7fKJqNf1CGlN1CDclLMSclKGtKwQW1 VcMYj0yejxXf+gJMHI6kQUb2RADtO60RulfLNE4eG7TunaCHArHycf1dsgNn1nHGkssDOUKcoJc2J fqvLJo0RTKmRpRgwrANyzL87PevjVWfW1u/heTKj0/Cv0/7UuFPXD/VrwLlzqORyo1MZTD0KP0EOR sUC3IxbgX1ZU83nYw96g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tYTL6-0000000Fdch-1cJB; Thu, 16 Jan 2025 17:07:28 +0000 Received: from nyc.source.kernel.org ([2604:1380:45d1:ec00::3]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tYTL4-0000000Fdbn-0jS0 for linux-riscv@lists.infradead.org; Thu, 16 Jan 2025 17:07:27 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by nyc.source.kernel.org (Postfix) with ESMTP id 06ABEA4251F; Thu, 16 Jan 2025 17:05:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 725C4C4CED6; Thu, 16 Jan 2025 17:07:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1737047244; bh=pHmOcJZOrilTdmTARnJBuK8Ee8LYE3oxweFl53AmY6o=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=PX3bO30mgoYZOP5FVB/STh23OfeV/3vROEx2TAAi/MVWbjPdtXiXZB2XAHpBz2OHg ybmG1cGM854smS23RtuJG7xsVwg8MLL/wb1vTMvRJHWocQfyr+M5FS8xlEyCigcTej uM7DR200XMszSGAjxh0747KYtMCfqXsTdQkvRGYd/vfYFOyYLIwG0wTgtHXoLZOuug we6iZJMcjIKjYUpX4Y5cR0T9IMktkGZ1RMuVO8C9PXu09ZQvj4iqxhoXWM28u+WN8p Fv/BlqeB6H92yF6biuUVoWRuVBqg6+P806aazHrXbmmXPElYKKbN0uc5hIR1Etv8fG jo9cbjgQwT0gg== Date: Thu, 16 Jan 2025 11:07:22 -0600 From: Bjorn Helgaas To: Conor Dooley Cc: daire.mcnamara@microchip.com, linux-pci@vger.kernel.org, devicetree@vger.kernel.org, conor.dooley@microchip.com, lpieralisi@kernel.org, kw@linux.com, robh@kernel.org, bhelgaas@google.com, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, krzk+dt@kernel.org, conor+dt@kernel.org, ilpo.jarvinen@linux.intel.com, kevin.xie@starfivetech.com, Frank Li Subject: Re: [PATCH v10 1/3] PCI: microchip: Fix outbound address translation tables Message-ID: <20250116170722.GA589558@bhelgaas> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20250116-debatable-hazelnut-6501986373fa@spud> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250116_090726_342905_762D139E X-CRM114-Status: GOOD ( 38.28 ) X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org WytjYyBGcmFuaywgb3JpZ2luYWwgcGF0Y2ggYXQKaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvci8y MDI0MTAxMTE0MDA0My4xMjUwMDMwLTItZGFpcmUubWNuYW1hcmFAbWljcm9jaGlwLmNvbV0KCk9u IFRodSwgSmFuIDE2LCAyMDI1IGF0IDA0OjQ2OjE5UE0gKzAwMDAsIENvbm9yIERvb2xleSB3cm90 ZToKPiBPbiBUaHUsIEphbiAxNiwgMjAyNSBhdCAwOTo0Mjo1M0FNIC0wNjAwLCBCam9ybiBIZWxn YWFzIHdyb3RlOgo+ID4gT24gVHVlLCBKYW4gMTQsIDIwMjUgYXQgMDY6MTM6MTBQTSAtMDYwMCwg Qmpvcm4gSGVsZ2FhcyB3cm90ZToKPiA+ID4gT24gRnJpLCBPY3QgMTEsIDIwMjQgYXQgMDM6MDA6 NDFQTSArMDEwMCwgZGFpcmUubWNuYW1hcmFAbWljcm9jaGlwLmNvbSB3cm90ZToKPiA+ID4gPiBG cm9tOiBEYWlyZSBNY05hbWFyYSA8ZGFpcmUubWNuYW1hcmFAbWljcm9jaGlwLmNvbT4KPiA+ID4g PiAKPiA+ID4gPiBPbiBNaWNyb2NoaXAgUG9sYXJGaXJlIFNvQyAoTVBGUykgdGhlIFBDSWUgUm9v dCBQb3J0IGNhbiBiZSBiZWhpbmQgb25lIG9mCj4gPiA+ID4gdGhyZWUgZ2VuZXJhbC1wdXJwb3Nl IEZhYnJpYyBJbnRlcmZhY2UgQ29udHJvbGxlciAoRklDKSBidXNlcyB0aGF0Cj4gPiA+ID4gZW5j YXBzdWxhdGUgYW4gQVhJLU0gaW50ZXJmYWNlLiBUaGF0IEZJQyBpcyByZXNwb25zaWJsZSBmb3Ig bWFuYWdpbmcKPiA+ID4gPiB0aGUgdHJhbnNsYXRpb25zIG9mIHRoZSB1cHBlciAzMi1iaXRzIG9m IHRoZSBBWEktTSBhZGRyZXNzLiBPbiBNUEZTLAo+ID4gPiA+IHRoZSBSb290IFBvcnQgZHJpdmVy IG5lZWRzIHRvIHRha2UgYWNjb3VudCBvZiB0aGF0IG91dGJvdW5kIGFkZHJlc3MKPiA+ID4gPiB0 cmFuc2xhdGlvbiBkb25lIGJ5IHRoZSBwYXJlbnQgRklDIGJ1cyBiZWZvcmUgc2V0dGluZyB1cCBp dHMgb3duCj4gPiA+ID4gb3V0Ym91bmQgYWRkcmVzcyB0cmFuc2xhdGlvbiB0YWJsZXMuICBJbiBh bGwgY2FzZXMgb24gTVBGUywKPiA+ID4gPiB0aGUgcmVtYWluaW5nIG91dGJvdW5kIGFkZHJlc3Mg dHJhbnNsYXRpb24gdGFibGVzIGFyZSAzMi1iaXQgb25seS4KPiA+ID4gPiAKPiA+ID4gPiBMaW1p dCB0aGUgb3V0Ym91bmQgYWRkcmVzcyB0cmFuc2xhdGlvbiB0YWJsZXMgdG8gMzItYml0IG9ubHku Cj4gPiA+IAo+ID4gPiBJIGRvbid0IHF1aXRlIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGlzIHNheWlu Zy4gIEl0IHNlZW1zIGxpa2UgdGhlIGNvZGUKPiA+ID4ga2VlcHMgb25seSB0aGUgbG93IDMyIGJp dHMgb2YgYSBQQ0kgYWRkcmVzcyBhbmQgdGhyb3dzIGF3YXkgYW55Cj4gPiA+IGFkZHJlc3MgYml0 cyBhYm92ZSB0aGUgbG93IDMyLgo+ID4gPiAKPiA+ID4gSWYgdGhhdCdzIHdoYXQgdGhlIEZJQyBk b2VzLCBJIHdvdWxkbid0IGRlc2NyaWJlIHRoZSBGSUMgYXMKPiA+ID4gInRyYW5zbGF0aW5nIHRo ZSB1cHBlciAzMiBiaXRzIiBzaW5jZSBpdCBzb3VuZHMgbGlrZSB0aGUgdHJhbnNsYXRpb24KPiA+ ID4gaXMganVzdCB0cnVuY2F0aW9uLgo+ID4gPiAKPiA+ID4gSSBndWVzcyBpdCBtdXN0IGJlIG1v cmUgY29tcGxpY2F0ZWQgdGhhbiB0aGF0PyAgSSBhc3N1bWUgeW91IGNhbiBzdGlsbAo+ID4gPiBy ZWFjaCBCQVJzIHRoYXQgaGF2ZSBQQ0kgYWRkcmVzc2VzIGFib3ZlIDRHQiB1c2luZyBDUFUgbG9h ZHMvc3RvcmVzPwo+ID4gPiAKPiA+ID4gVGhlIGFwZXJ0dXJlcyB0aHJvdWdoIHRoZSBob3N0IGJy aWRnZSBmb3IgTU1JTyBhY2Nlc3MgYXJlIGRlc2NyaWJlZCBieQo+ID4gPiBEVCByYW5nZXMgcHJv cGVydGllcywgc28gdGhpcyBtdXN0IGJlIHNvbWV0aGluZyB0aGF0IGNhbid0IGJlCj4gPiA+IGRl c2NyaWJlZCB0aGF0IHdheT8KPiA+IAo+ID4gUGluZz8gIEknZCByZWFsbHkgbGlrZSB0byB1bmRl cnN0YW5kIHRoaXMgYmVmb3JlIHRoZSB2Ni4xNCBtZXJnZQo+ID4gd2luZG93IG9wZW5zIG9uIFN1 bmRheS4KPiAKPiBEYWlyZSdzIGJlZW4gaGF2aW5nIHNvbWUgaXNzdWVzIGdldHRpbmcgb250byB0 aGUgY29ycG9yYXRlIFZQTiB0byBzZW5kCj4gaGlzIHJlcGx5LCBJJ3ZlIHBhc3RlZCBpdCBiZWxv dyBvbiBoaXMgYmVoYWxmOgo+IAo+IFRoZXJlIGFyZSAzIEZhYnJpYyBJbnRlciBDb25uZWN0IChG SUMpIGJ1c2VzIG9uIFBvbGFyRmlyZSBTb0MgLSBlYWNoIG9mCj4gdGhlc2UgRklDIGJ1c2VzIGNv bnRhaW4gYW4gQVhJIG1hc3RlciBidXMgYW5kIGFyZSA2NC1iaXRzIHdpZGUuIFRoZXNlCj4gQVhJ LU1hc3RlcnMgKGVhY2ggd2l0aCBhbiBpbmRpdmlkdWFsIDY0LWJpdCBBWEkgYmFzZSBhZGRyZXNz IOKAkyBmb3IgZXhhbXBsZQo+IEZJQzHigJlzIEFYSSBNYXN0ZXIgaGFzIGEgYmFzZSBhZGRyZXNz IG9mIDB4MjAwMDAwMDAwMCkgYXJlIGNvbm5lY3RlZCB0bwo+IGdlbmVyYWwgcHVycG9zZSBGUEdB IGxvZ2ljLiBUaGlzIEZQR0EgbG9naWMgaXMsIGluIHR1cm4sIGNvbm5lY3RlZCB0byBhCj4gMm5k IDMyLWJpdCBBWEkgbWFzdGVyIHdoaWNoIGlzIGF0dGFjaGVkIHRvIHRoZSBQQ0llIGJsb2NrIGlu IFJvb3RQb3J0IG1vZGUuCj4gQ29uY2VwdHVhbGx5LCBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGlz IGNvbmZpZ3VyYWJsZSBsb2dpYywgdGhlcmUgaXMgYQo+IDMyLWJpdCBidXMgdG8gYSBoYXJkIFBD SWUgcm9vdHBvcnQuICBTbywgYWdhaW4gY29uY2VwdHVhbGx5LCBvdXRib3VuZCBhZGRyZXNzCj4g dHJhbnNsYXRpb24gbG9va3MgbGlrZSB0aGlzOgo+IAo+ICAgICAgICAgICAgICAgICAgUHJvY2Vz c29yIENvbXBsZXggw6AgRklDICg2NC1iaXQgQVhJLU0pIMOgIENvbmZpZ3VyYWJsZSBMb2dpYyDD oCAzMi1iaXQgQVhJLU0gw6AgUENJZSBSb290cG9ydAo+IAkJIChUaGlzIGhvdyBpdCBjYW1lIHRv IG1lIGZyb20gRGFpcmUsIEkgdGhpbmsgdGhlIMOhIGlzIG1lYW50IHRvCj4gCQkgYmUgYW4gYXJy b3cpCj4gCj4gIFRoaXMgYWxsb3dzIGEgZGVzaWduZXIgdHdvIGJyb2FkIGNob2ljZXM6Cj4gCj4g ICAgIENob2ljZSBvZiBGSUMgKGVmZmVjdGl2ZWx5IGNob2ljZSBvZiBBWEkgYnVzKQo+ICAgICBB YmlsaXR5IHRvIG9mZnNldCB0aGUgQVhJIGFkZHJlc3Mgb2YgYW55IHBlcmlwaGVyYWxzIHRoZXkg YWRkIGluIHRoZQo+ICAgICBGYWJyaWMuCj4gCj4gU28sIGZvciB0aGUgY2FzZSBvZiBhbiBvdXRi b3VuZCBBWEkgYWRkcmVzcywgZnJvbSB0aGUgcHJvY2Vzc29yc+KAmSBwb2ludAo+IG9mIHZpZXcg KG9yIExpbnV44oCZIHBvaW50IG9mIHZpZXcgaWYgeW91IHByZWZlciksIHRoZSBwcm9jZXNzb3Ig dXNlcyBhCj4gNjQtYml0IEFYSSBhZGRyZXNzLCB0aGVuIOKAkyBpbiBhIHZlcnkgZ2VuZXJhbCB3 YXkgb2Ygdmlld2luZyB0aGUgcHJvY2Vzcwo+IGFuZCB0aGlua2luZyBvbmx5IGFib3V0IGFjY2Vz c2luZyB0aGUgUENJZSBkZXZpY2Ug4oCTIHRoZSBGUEdBIGxvZ2ljIGNhbgo+IGJlIGNvbmZpZ3Vy ZWQgdG8gYWRqdXN0IHRoYXQgQVhJLU0gYWRkcmVzcyB0byBhbnkgYXJiaXRyYXJ5IOKAnGFkZHJl c3PigJ0KPiBiZWZvcmUgaXQgcGFzc2VzIHRoYXQgbmV3IOKAnGFkZHJlc3PigJ0gdG8gdGhlIFJv b3QgUG9ydCBvdmVyIGEgc2Vjb25kIDMyLWJpdAo+IEFYSSBidXMgKHRoZSBtYWluIGNvbnN0cmFp bnQgaXMgdGhhdCB0aGUgRlBHQSBsb2dpYyBjYW4gb25seSB1c2UgYSAzMi1iaXQKPiBhZGRyZXNz IG9uIHRoYXQgQVhJLU0gaW50ZXJmYWNlIHRvIHRoZSBSb290IFBvcnQpLgo+IAo+IFRvIG1hbmFn ZSB0aGlzIGNvbXBsZXhpdHksIE1pY3JvY2hpcCBoYXZlIGRlc2lnbiBydWxlcyBmb3IgY3VzdG9t ZXJzCj4gYnVpbGRpbmcgdGhlaXIgRlBHQSBsb2dpYyB3aGVyZSB3ZSBzdHJvbmdseSByZWNvbW1l bmQgdGhhdCB0aGV5IG9ubHkKPiBpbnRlcmFjdCB3aXRoICB0aGUgdXBwZXIgMzIgYml0cyBvZiB0 aGUgNjQtYml0IGFkZHJlc3MgaW4gdGhlIEZQR0EgbG9naWMKPiBhbmQgcGFzcyB0aGUgbG93ZXIg MzIgYml0cyB0aHJvdWdoICh1bm1vZGlmaWVkKSB0byB0aGUgQVhJLU0gc2lkZSBvZiB0aGUKPiBQ Q0llIFJvb3QgUG9ydC4gVGhpcyBhbGxvd3MgdGhlbSB0byDigJxtb3Zl4oCdIGEgNjQtYml0IEFY SS1NIHdpbmRvdyBmb3IgdGhlaXIKPiBQQ0llIFJvb3QgUG9ydCAoYXMgdmlld2VkIGJ5IHRoZSBw cm9jZXNzb3IpIGZvciB0aGVpciBwYXJ0aWN1bGFyIGRlc2lnbiDigJMKPiBpZiB0aGV5IG5lZWQg dG8gLSBzbyB0aGF0IHRoZXkgY2FuIGFsc28gYWNjZXNzIGFueSBvdGhlciBBWEktTSB3aW5kb3dz Cj4gYXNzb2NpYXRlZCB3aXRoIGFueSBvdGhlciBwZXJpcGhlcmFscyB0aGV5IG1pZ2h0IGFkZCB0 byB0aGVpciBkZXNpZ24uCj4gCj4gSW4gcHJhY3Rpc2UsIHNvIGZhciwgYWxsIGN1c3RvbWVycywg YW5kIG91ciBvd24gaW50ZXJuYWwgYm9hcmRzIGhhdmUgYWxsCj4gc3RhcnRlZCBieSB1c2luZyBv bmUgb2YgdHdvIG1ham9yIHJlZmVyZW5jZSBkZXNpZ25zIGZyb20gdXMgKG9uZSB1c2luZyBGSUMx Cj4gd2hlcmUgdGhlIEFYSS1NIHdpbmRvdyBkZXN0aW5lZCBmb3IgdGhlIFBDSWUgUm9vdCBQb3J0 IHN0YXJ0cyBhdCAweDIwMDAwMDAwMDAKPiBhbmQgb25lIHVzaW5nIEZJQzIgd2hlcmUgaXRzIEFY SS1NIHdpbmRvdywgYWdhaW4gZGVzdGluZWQgZm9yIHRoZSBQQ0llIFJvb3QKPiBQb3J0IHN0YXJ0 cyBhdCAweDMwMDAwMDAwMDApLgoKSXMgdGhlcmUgc29tZXRoaW5nIHNwZWNpYWwgYWJvdXQgdGhp cyB0aGF0IGNhbm5vdCBiZSBkZXNjcmliZWQgYnkgYSBEVAoncmFuZ2VzJyBwcm9wZXJ0eT8gIFRo aXMgc291bmRzIGNvbmNlcHR1YWxseSBzaW1pbGFyIHRvIEZyYW5rJ3MgbmljZQpwaWN0dXJlIGF0 Cmh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL3IvMjAyNDExMTktcGNpX2ZpeHVwX2FkZHItdjgtMi1j NGJmYTUxOTMyODhAbnhwLmNvbQoKQmpvcm4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBs aXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtcmlzY3YK