Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752401AbcKRNn4 (ORCPT ); Fri, 18 Nov 2016 08:43:56 -0500 Received: from mout.kundenserver.de ([212.227.126.130]:63570 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751665AbcKRNnw (ORCPT ); Fri, 18 Nov 2016 08:43:52 -0500 From: Arnd Bergmann To: linux-arm-kernel@lists.infradead.org Cc: Gabriele Paoloni , "mark.rutland@arm.com" , "benh@kernel.crashing.org" , "catalin.marinas@arm.com" , "liviu.dudau@arm.com" , Linuxarm , "lorenzo.pieralisi@arm.com" , "xuwei (O)" , Jason Gunthorpe , "linux-serial@vger.kernel.org" , "linux-pci@vger.kernel.org" , "devicetree@vger.kernel.org" , "minyard@acm.org" , "will.deacon@arm.com" , John Garry , "zourongrong@gmail.com" , "robh+dt@kernel.org" , "bhelgaas@go og le.com" , "kantyzc@163.com" , "zhichang.yuan02@gmail.com" , Thomas Petazzoni , "linux-kernel@vger.kernel.org" , Yuanzhichang , "olof@lixom.net" Subject: Re: [PATCH V5 3/3] ARM64 LPC: LPC driver implementation on Hip06 Date: Fri, 18 Nov 2016 14:42:38 +0100 Message-ID: <2271602.GoSoby0zHK@wuerfel> User-Agent: KMail/5.1.3 (Linux/4.4.0-34-generic; KDE/5.18.0; x86_64; ; ) In-Reply-To: References: <1478576829-112707-1-git-send-email-yuanzhichang@hisilicon.com> <2822893.F0LqNAm9bT@wuerfel> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V03:K0:tr6JUHe7Zx4P3HLNmePS9Whr7leSZ/qMbBNDnQo/OkyYsPaXIY2 /ACKnr6VqtVAEdg/78lEZzB2rxfeg+FLNxyRRVAfwHZLD7/lGHNAMX7ZTfFR7zcKUm/dCCd LbGZPGnBqm5TFa8IItxt6BZD8sRWMUwexlpfIa2o0n/gLJIIlF7hzdK09keFrQ8jANzXAED 2H1on/6v6WS12yt33xEQA== X-UI-Out-Filterresults: notjunk:1;V01:K0:n97+y5GSJkE=:gz3k+IGRc/AgwH/EgDUyfE LrKfdEsIvSscGXHQl9VfmSPVYXJIvOl9vHi09uo7zLF12Gb7MmPCG794Mpz81dFdYKxwJXdg6 R+XuvDJbWt2AZYZumMGorY6JGNU4gdwIOVfVYP5mCTAKyTE50pRBo1RUrZYCoxxCrr16l2B9k pn8O48E1gopx0dvY/X1nLllLHTgp9Ywu8A7wUvZRXl4Q3bJkLHZb1L+vV/beFW+K9IfPA2A/F zCneuRy+LQvO27FO15A9nvuNZM9m2sJiMmNwjAz4GFzvbrSkTYyKT7Tt8AQq8oDZQHr+vyA0S I3XV50ycPhdD8KvYaalx/pXr0ksyArZ1ztfpHEgvX+RRys1NN0NQIatHxA0YXArhA4szEjpvw c/azO382tZsPDX/UxxAPTVmhx0h1WE91/7knrkIxy/Jaq1K0oqMHiPztPq8NV3u8GoCCImHXl SDorlNgWaqympEu9bG5aT65jThLl4Iq0fWNWsiBtH47tMfhy4SaP0LBWzrf7scn2EXe6Qo/8w uNJjuP5n1CmjI5iwrwrPr+OW3ruJVqr8+82pQvqhuaRzwuamDHs9CzrHCECImeUFPy4+ogNwB qG3unwSkmb6b0bBcutQ6Xv5lbNq+rTmDrALi6W7udxQyVvtNKkpq2rmKSJgdRp7IuMZ3S+XkT qK/C6aHEzMXPQUzOinKD2vJnrJRfcC/P6Nf06Jp06HnCk9dDv9L6+npNAO9rtZOtlDCc8fTSF JQTdAulvB4UjYO8Q Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4053 Lines: 85 On Friday, November 18, 2016 12:53:08 PM CET Gabriele Paoloni wrote: > From: Arnd Bergmann [mailto:arnd@arndb.de] > > On Friday, November 18, 2016 12:07:28 PM CET Gabriele Paoloni wrote: > > > > I think there is no need to change a) here, we have PCIBIOS_MIN_IO > > > > today and even if we don't need it, there is no obvious downside. > > > > I would also argue that we can ignore b) for the discussion of > > > > the HiSilicon LPC driver, we just need to assign some range > > > > of logical addresses to each domain. > > > > > > > > That means solving c) is the important problem here, and it > > > > shouldn't be so hard. We can do this either with a single > > > > special domain as in the v5 patch series, or by generalizing it > > > > so that any I/O space mapping gets looked up through the device > > > > pointer of the bus master. > > > > > > I am not very on the "generalized" multi-domain solution... > > > Currently the IO accessors prototypes have an unsigned long addr > > > as input parameter. If we live in a multi-domain IO system > > > how can we distinguish inside the accessor which domain addr > > > belongs to? > > > > The easiest change compared to the v5 code would be to walk > > a linked list of 'struct extio_ops' structures rather than > > assuming there is only ever one of them. I think one of the > > earlier versions actually did this. > > Right but if my understanding is correct if we live in a multi- > domain I/O space world when you have an input addr in the I/O > accessors this addr can be duplicated (for example for the standard > PCI IO domain and for our special LPC domain). > So effectively even if you walk a linked list there is a problem > of disambiguation...am I right? No, unlike the PCI memory space, the PIO addresses are not usually distinct, i.e. every PCI bus has its own 64K I/O addresses starting at zero. We linearize them into the Linux I/O space using the per-domain io_offset value. For the ISA/LPC spaces there are only 4k of addresses, they the bus addresses always overlap, but we can trivially figure out the bus address from Linux I/O port number by subtracting the start of the range. > > Another option the IA64 approach mentioned in another subthread > > today, looking up the operations based on an index from the > > upper bits of the port number. If we do this, we probably > > want to do that for all PIO access and replace the entire > > virtual address remapping logic with that. I think Bjorn > > in the past argued in favor of such an approach, while I > > advocated the current scheme for simplicity based on how > > every I/O space these days is just memory mapped (which now > > turned out to be false, both on powerpc and arm64). > > This seems really complex...I am a bit worried that possibly > we end up in having the maintainers saying that it is not worth > to re-invent the world just for this special LPC device... It would clearly be a rather invasive change, but the end-result isn't necessarily more complex than what we have today, as we'd kill off the crazy pci_pio_to_address() and pci_address_to_pio() hacks in address translation. > To be honest with you I would keep things simple for this > LPC and introduce more complex reworks later if more devices > need to be introduced. > > What if we stick on a single domain now where we introduce a > reserved threshold for the IO space (say INDIRECT_MAX_IO). I said having a single domain is fine, but I still don't like the idea of reserving low port numbers for this hack, it would mean that the numbers change for everyone else. > We define INDIRECT_MAX_IO as 0 in "include/linux/extio.h" and > we define INDIRECT_MAX_IO as 0x1000 in "arch/arm64/include/asm/io.h" > > So effectively this threshold can change according to the > architecture and so far we only define it for ARM64 as we need > it for ARM64... I liked the idea of having it done in asm-generic/io.h (in an ifdef) and lib/*.c under an as someone suggested earlier. There is nothing ARM64 specific in the implementation. Arnd