Comprehensive technical analysis covering What, Why, When, Where, How, System Applications, and all normative Rules
Unordered I/O (UIO) is a new transaction type introduced in PCIe 6.0 and enhanced in PCIe 7.0 that allows memory read and write operations to complete in any order, regardless of when they were issued. Unlike traditional PCIe transactions where ordering rules (producer-consumer model) must be enforced, UIO transactions explicitly allow out-of-order completion.
UIO provides a mechanism where:
Traditional PCIe ordering rules create significant complexity and performance overhead in the switching fabric. UIO removes this burden by allowing Requesters that don't need strict ordering to explicitly indicate this, enabling more efficient fabric implementations and higher throughput.
Traditional PCIe enforces strict ordering to support the producer-consumer programming model:
UIO is appropriate when the Requester either does not require ordering guarantees, or when the Requester's software can explicitly manage ordering through other mechanisms (fences, barriers, completion waiting).
UIO applies to memory transactions in PCIe hierarchies where all components in the path support UIO capability. This requires end-to-end UIO support from Requester to Completer.
┌─────────────────────────────────────────────────────────────────────┐
│ ROOT COMPLEX │
│ ┌──────────────┐ │
│ │ Root Port │◄── UIO Capability Required │
│ │ (UIO-aware) │ │
│ └──────┬───────┘ │
│ │ Flit Mode Link (64/128 GT/s) │
└─────────┼───────────────────────────────────────────────────────────┘
│
▼
┌──────────────┐
│ Switch │◄── UIO forwarding capability required
│ (UIO-aware) │ (all ports in the path)
└──────┬───────┘
│ Flit Mode Link (64/128 GT/s)
▼
┌──────────────┐
│ Endpoint │◄── UIO Requester or Completer capability
│ (UIO-aware) │ 14-bit Tag support required
└──────────────┘
═══════════════════════════════════════════════════════════════════
KEY: All components in UIO transaction path MUST support UIO
All links MUST operate in Flit Mode
All components MUST support 14-bit Tags for UIO
UIO requires that every component in the transaction path supports UIO:
UIO uses dedicated Virtual Channels for traffic segregation:
UIO transactions follow a request-completion model where both reads and writes receive completions. The fabric forwards transactions without enforcing ordering, and completions can arrive in any order.
Requester Completer
│ │
│ 1. UIOMWr Request │
│ ──────────────────────────►│
│ (14-bit Tag, Address, │
│ Length, Data) │
│ │
│ │ 2. Write data to memory
│ │
│ 3. UIOWrCpl Completion │
│ ◄──────────────────────────│
│ (Tag, Completion Status, │
│ Length) │
│ │
│ 4. Requester matches Tag │
│ Mark transaction done │
│ │
NOTES:
- Unlike traditional MWr, UIOMWr receives a completion
- Completion indicates write has reached destination
- Multiple UIOMWr with same Tag allowed (coalesced completion)
- Length in completion = DWs completed (for accounting)
Requester Completer
│ │
│ 1. UIOMRd Request │
│ ──────────────────────────►│
│ (14-bit Tag, Address, │
│ Length) │
│ │
│ │ 2. Read data from memory
│ │
│ 3. UIORdCplD Completion │
│ ◄──────────────────────────│
│ (Tag, Lower Address, │
│ Length, Data) │
│ │
│ 4. Match Tag, extract data │
│ │
SPLIT COMPLETION EXAMPLE:
┌────────────────────────────────────────┐
│ Original UIOMRd: 1024 bytes │
│ Completion 1: 256 bytes (LA=0x000) │
│ Completion 3: 512 bytes (LA=0x200) │ ← Out of order!
│ Completion 2: 256 bytes (LA=0x100) │
│ Total: 1024 bytes (transaction done) │
└────────────────────────────────────────┘
UIO transactions are identified by a Transaction ID consisting of:
For UIO Memory Writes, multiple Requests with the same Transaction ID are allowed to be outstanding simultaneously. The Completion Length field is used to track how many DWs have been completed for proper accounting.
UIO defines specific TLP Types that are only valid in Flit Mode:
| TLP Type | Type[7:0] | Description | Has Payload |
|---|---|---|---|
| UIOMRd | 0010 0xxx | UIO Memory Read Request | No |
| UIOMWr | 0110 0xxx | UIO Memory Write Request | Yes |
| UIORdCpl | 0000 1011 | UIO Read Completion (no data - error) | No |
| UIORdCplD | 0100 1011 | UIO Read Completion with Data | Yes |
| UIOWrCpl | 0000 1010 | UIO Write Completion | No |
In Flit Mode, the Type[7:0] field fully identifies the TLP type:
Includes all fields above plus:
When UIO Completions with different statuses are coalesced:
| Priority | Status | Rule |
|---|---|---|
| 1 (Highest) | UR (Unsupported Request) | If ANY completion has UR → final status is UR |
| 2 | CA (Completer Abort) | If no UR, but any CA → final status is CA |
| 3 | RRS (Retry) | If no UR or CA, but any RRS → final status is RRS |
| 4 (Lowest) | SC (Success) | If ALL completions are SC → final status is SC |
A UIO transaction is considered complete when:
Unlike traditional PCIe where the fabric enforces producer-consumer ordering, UIO explicitly removes this requirement:
When using UIO, the Requester takes on ordering responsibilities:
UIO transactions and non-UIO transactions are on separate Virtual Channels. There are no ordering relationships enforced between UIO and non-UIO traffic. If ordering between UIO and non-UIO is needed, software must explicitly manage it.
UIO uses dedicated Virtual Channels with their own flow control credits:
| Transaction | Credit Type Used | Notes |
|---|---|---|
| UIOMRd | NP (Non-Posted) | Standard NP credit for UIO VC |
| UIOMWr | NP (Non-Posted) OR P (Posted) | Can use either - configurable |
| UIORdCplD | Cpl (Completion) | UIO VC completion credits |
| UIOWrCpl | Cpl (Completion) | UIO VC completion credits |
In Flit Mode, flow control uses credit blocks instead of individual credits:
UIO requires 14-bit Tags for several reasons:
For UIO with 14-bit Tags, the recommended Tag range is 1024 to 16383. Tags 0-1023 should be avoided to maintain keep-out for 10-bit Tag compatibility.
Primary use case for UIO is CXL memory systems:
| Aspect | Traditional MWr (Posted) | Traditional MRd (Non-Posted) | UIOMWr | UIOMRd |
|---|---|---|---|---|
| Completion | None | Required | Required (UIOWrCpl) | Required (UIORdCplD) |
| Ordering | Producer-Consumer | Producer-Consumer | None | None |
| Acknowledgment | None (fire-and-forget) | Via Completion | Via Completion | Via Completion |
| Mode | NFM or Flit | NFM or Flit | Flit Mode Only | Flit Mode Only |
| Tags | N/A | 8/10/14-bit | 14-bit Required | 14-bit Required |
| Fabric Complexity | High (ordering) | Medium | Low (no ordering) | Low (no ordering) |