On Sun, 27 Jun 2021, Paul Koning wrote: > > However both serial and parallel ports remain reasonably available as > > PCIe option devices. Though parallel ports seem to be made as legacy PCIe > > devices only, that is accessed with I/O rather than memory read/write bus > > cycles, which are not, as I have learnt the hard way recently, supported > > by all computer systems nowadays. I guess x86 systems will continue to > > support them however as x86 CPUs have native I/O access instructions. > > I/O cycles on PCI have no direct connection to I/O instructions. I've > routinely used I/O operations in PCI on a MIPS platform, which of course > has no such concept; all that was needed is to send the memory cycles to > the address block that the PCI bridge maps onto I/O cycles rather than > memory cycles.
That's not my point. The host bridge has to implement them and some do not (e.g. the POWER9 PHB4). For CPU architectures that do not have native I/O cycle support an MMIO window has to be defined by the host bridge for memory cycles decoded within that window to be forwarded downstream as PCIe I/O Read/Write TLPs (likewise with legacy PCI I/O Read/Write cycles). If you don't define such a window along with associated circuitry (like with the PHB4), then there's simply no way to produce I/O TLPs on PCIe. When you have a CPU architecture such as x86 that does do I/O cycles natively, then they're just forwarded by the host bridge as PCIe I/O Read/Write TLPs. Of course one can envisage an x86 host bridge that won't forward I/O cycles produced by the CPU to PCIe and will either terminate them with a bus error or let them time out, but I find it highly unlikely. For one I suspect the circuitry required to terminate unclaimed host bus I/O cycles is no less expensive than one to just forward them downstream; after all a PCIe I/O TLP is told apart from a memory TLP merely by a difference in a bit pattern sent downstream that encodes the cycle type, one of several (likewise with PCI cycles). NB PCIe I/O Read/Write TLPs have been deprecated ever since the first revision of the PCIe specification and PCIe devices that do require I/O TLPs for operation have always been referred to as legacy PCIe devices. I guess support for such devices has been added to the specification so as to aid the industry with switching entirely to the MMIO operating model, with initial PCIe devices expected to be implemented by placing the original PCI/PCI-X ASIC behind a PCIe-to-PCI bridge, until new PCIe ASICs have been made. For some option cards it seems the only way to date, e.g. PCIe ATM network adapters. As it has turned out actual PCIe ASICs have been manufactured that do require I/O Read/Write TLPs for their operation such as said IEEE 1284 parallel ports. It's not actually clear to me why, but a plausible explanation is they have been considered too niche at that point for the effort required for the OS drivers to be updated. Maciej