[PATCH V5 3/3] ARM64 LPC: LPC driver implementation on Hip06
From: arnd@arndb.de (Arnd Bergmann)
Date: 2016-11-18 11:47:36
Also in:
linux-devicetree, linux-pci, linux-serial, lkml
[found this old mail in my drafts folder, might as well send it now] On Thursday, November 10, 2016 8:36:24 PM CET zhichang.yuan wrote:
Sorry! I can't catch your idea yet:( When to register the I/O range? Is it done just after the successfully of_translate_address() during the children scanning?
No, you do it when first finding the bus itself, just like we do for PCI host bridges.
If yes, when a child is scanning, there is no range data in arm64_extio_ops. The addr_is_indirect_io() calling in of_get_isa_indirect_io() don't need. All we can check is just whether the address to be translated is IO and is under a parent device which has no 'ranges' property.
The children should only be scanned after the I/O range has been registered for the parent.
quoted
Your current version has if (arm64_extio_ops->pfout) \ arm64_extio_ops->pfout(arm64_extio_ops->devpara,\ addr, value, sizeof(type)); \ Instead, just subtract the start of the range from the logical port number to transform it back into a bus-local port number: if (arm64_extio_ops->pfout) \ arm64_extio_ops->pfout(arm64_extio_ops->devpara,\ addr - arm64_extio_ops->start, value, sizeof(type)); \I think there is some information needed sync. In the old patch-set, we don't bypass the pci_address_to_pio() after successfully of_translate_address(). In this way, we don't need to reserve any PIO space for our LPC since the logical port are from the same mapping algorithm. Based on this way, the port number in the device resource is logical one, then we need to subtract the start of the resource to get back the bus-local port. From V3, we don't apply the mapping based on pci_address_to_pio(), the of_translate_address() return the bus-local port directly and store into relevant device resource. So, in the current arm64_extio_ops->pfout(), the reverse translation don't need anymore. The input "addr" is bus-local port now.
Ok, so this would have to be changed again: If we want to support multiple bus domains, of_translate_address() must translate between the bus specific address and the general Linux I/O port number. Even without doing that, it seems nicer to not overlap the range of the first PCI host bridge. Arnd