Instead of holding the bus or retry loops like PCI, PCI-X splits the read into two independent bus transactions:
-
Read Request Phase (by the Requester):
- Requester = initiator of the read.
- Sends:
- Address
- Transaction type (read)
- Byte count (how much data)
- Requester ID (Bus:Device:Function number)
👉 If the target (now called the Completer) can’t supply the data immediately, it responds with a Split Response.
✅ At this point:
- The requester stops holding the bus.
- The bus returns to idle, so other devices can use it.
-
Split Completion Phase (by the Completer):
- Once the completer has the requested data ready:
- It arbitrates for bus ownership.
- Starts a Split Completion cycle, which looks a lot like a write.
- The Requester recognizes its own ID in the completion and accepts the data.
👉 No retries, no wasted polling — the completer just brings the data back when ready.
- Once the completer has the requested data ready:
Key Efficiency Gains
- Bus is free while data is being fetched (no more “wait” hogging).
- Requester can do other work (even issue other requests).
- Only two bus transactions needed:
- Request
- Completion
→ Much more efficient than PCI’s repeated retries.
Naming Change
- PCI: Master ↔ Target
- PCI-X: Requester ↔ Completer
(to reflect the split responsibility across two separate transactions).
Bus Utilization
- PCI efficiency: ~50–60%
- PCI-X efficiency: ~85%
→ This is a huge leap, especially in servers where multiple devices are competing for bandwidth.
