On Sun, 27 Jun 2021, Kevin Bowling wrote: > Thanks this was interesting learning.
You are welcome! NB I think it is also worth noting that the presence of I/O instructions and corresponding bus cycles with x86 is most relevant for PCI as it is only *because* x86, or more importantly the PC/AT architecture, has had them in the first place that PCI (and consequently PCIe) has them as well. Likewise the interrupt acknowledge or the special cycle bus transactions -- they're both x86-specific, even if they may have been later repurposed in non-x86 PCI system designs. Intel was a key player in PCI design and surely their requirements were first-class citizens in the solution proposed. While early PCI systems commonly had PCI and ISA/EISA buses arranged as peers on the CPU host bus, with the respective bridge chips being two of the three or more agents arbitrated there (the remaining ones being the CPU(s)), the ability to route x86-specific bus cycles over PCI eventually let the industry settle on PCI x86 systems of the common northbridge/southbridge architecture we saw so many specimens of, where I/O address space resources originating from the PC, PC/XT, and PC/AT architectures can be accessed behind a PCI bus segment just as if they were attached directly to the CPU, possibly via some bus buffers only, like with the original IBM design from 1981. Similarly an x86 CPU can send an interrupt acknowledge cycle over PCI to request an interrupt vector from an 8259A interrupt controller core present in the southbridge, or a shutdown special cycle, in response to a triple fault, so as to make the southbridge assert a CPU reset, just like the original discrete PC/AT circuitry did. None of this is really needed by non-x86 systems, although again these features may have been repurposed now that they are present (Intel has since invented additional special CPU cycles too, used in power management and intepreted by the southbridge), and numerous host bridges used with non-x86 systems have dedicated CSRs in the memory address space for issuing these PCI bus cycles, which the CPU cannot natively produce. BTW it wasn't exactly obvious to me that a flood of: LPC[000]: Got SYNC no-response error. Error address reg: 0xd0010014 IPMI: dropping non severe PEL event messages produced by the system firmware to the console serial port was a symptom of a PCI device driver trying to poke at the port I/O address of 0, correctly left by the OS in the relevant device's BAR (Base Address Register) along with the disabled status for I/O decoding in the device's PCI Command Register. The driver, not platform-specific and unaware of the possibility of the inexistence of the PCI I/O address space in some systems, ignored the disabled status of I/O decoding with the device and just went ahead and poked at it, confusing the host bridge with the bus accesses that resulted (likely an OS bug too with port I/O address space accessors, though I wasn't inclined enough to chase it); of course the port I/O address of 0 itself has no particular meaning with non-x86 systems and can be legitimately assigned and used with PCI devices. FWIW, Maciej