Skip to content

PCIe · Module 2

Endpoint — The Device-Side Participant

What terminates a path in a PCIe hierarchy: an endpoint's architectural role, why it is defined by position rather than packaging or workload, how it both responds and initiates, and why most PCIe RTL and verification work is endpoint-centric.

Chapter 2.2 took the origin of the hierarchy. This chapter takes the other extreme:

What is the device-side participant at the end of a PCIe hierarchy path?

The answer is the Endpoint, and it is worth defining carefully — because the term is routinely confused with a physical form factor, with a category of product, and with "the thing that receives traffic." All three readings are wrong in ways that will cost you later.

1. Defined by Position, Not by Packaging

The definition is architectural: an Endpoint is what sits at the far end of a path and terminates it. Everything else about the device — how it is built, packaged, sold, or what it does — is outside the definition.

That has a consequence worth stating explicitly, because the mental image most people carry is wrong. An Endpoint is not necessarily an add-in card. The same architectural role is filled by devices integrated onto a board, functions embedded within a larger component, and other arrangements consistent with the architecture. A device soldered down is exactly as much an Endpoint as one in a connector.

The physical packaging is not the definition. Position in the hierarchy is.

The same applies to what the device does. Storage, networking, graphics, and accelerator devices can all be Endpoints, and being an Endpoint tells you nothing about which one you are looking at. Its traffic profile, bandwidth appetite, and latency sensitivity are properties of the device — the architectural role is identical across all of them. When Chapter 1.7 discussed heterogeneous demand, that heterogeneity lives inside devices that occupy the same role.

2. Terminating a Path

The sharpest way to understand an Endpoint is by what it does not do.

A Switch receives traffic on one connection and forwards it onward toward somewhere else. Its job is to be in the middle. An Endpoint receives traffic and that traffic has arrived — there is no onward destination, because nothing lies beyond it in the hierarchy. It is a leaf.

Chapter 2.1's three-way classification — root, intermediate forwarding, termination — puts the Endpoint firmly in the third position, and that placement determines its architectural obligations. It never has to decide where something should go next, because for an Endpoint there is no next. What it must do instead is recognise what has arrived, act on it, and respond where a response is expected.

An endpoint terminating a hierarchy path: a Root Complex connects by a dedicated link to an Endpoint, and nothing continues past it. The Endpoint comprises a PCIe-facing function that software discovers and configures, and device-specific logic that performs the device's actual work.Root Complexhost-side anchorEndpointpath terminates herePCIe-facing functionwhat software discoversDevice-specific logicwhat the device actuallydoesLink12
Figure 1 — an Endpoint terminates its path. A Link joins the Root Complex to the Endpoint and nothing continues beyond it. Architecturally the Endpoint has two faces: a PCIe-facing function, which is what system software discovers and configures and which follows the protocol's rules, and the device-specific logic that actually performs the device's work. The boundary between those two faces is where most PCIe design and verification effort is spent.

3. It Responds — and It Initiates

The most common under-reading of "endpoint" is that it is a passive target waiting to be accessed. Half right, and the missing half is where most of the interesting behaviour lives.

An Endpoint responds. The host can direct accesses at resources the device exposes — reading status, writing control, reaching whatever the device makes visible. These arrive over the Link, and the Endpoint acts on them and returns a response where one is expected.

An Endpoint also initiates. A device can generate transactions of its own accord, most importantly toward system memory: moving data it has produced, fetching data it needs, without the processor mediating each transfer. It can also signal that something requires host attention.

That second capability is not a detail — it is the whole reason high-throughput devices work. Chapter 1.3 traced it back to bus mastering, and Chapter 2.2 noted that such traffic travels up the hierarchy to the Root Complex and onward to memory. From the Endpoint's side, the point is simply this: it is an active participant, not a passive target.

A device that only ever responded would require the processor to move every byte on its behalf — precisely the arrangement the industry spent decades escaping.

4. Being Found and Given Resources

An Endpoint is of no use if software cannot find it or does not know how to reach it. Two things therefore have to be true.

It must be discoverable and identifiable. Software needs to determine that something is present at the end of a path and establish what it is, so the right driver can be matched to it. The Endpoint must expose that information in a standardized form, because system software cannot be expected to know about every device that might ever exist.

Its resources must be reachable through the system's address map. A device exposes some set of resources for software to access, and those need to occupy known locations that the host can direct traffic to. Rather than each device claiming fixed locations — Chapter 1.2 showed where that leads — the device describes what it requires and the system assigns where those requirements land.

That division of labour is the durable idea, and it is the one PCI introduced and PCIe carried forward as part of the software continuity Chapter 1.8 described: the device declares what it needs; the system decides where it goes.

Keep it at that level here. What the standardized information actually contains, how resource requirements are expressed and programmed, and the procedure by which the hierarchy is discovered are substantial topics with dedicated treatment — Modules 7, 8, and 9 own discovery, configuration, and device resources respectively.

5. One Device, One or More Functions

A precision point worth getting right, because casual usage blurs it.

The unit the architecture identifies and configures is a function. In the simplest and most common arrangement, a device presents a single function, and "device" and "function" can be used interchangeably without causing trouble.

But that is not a rule. A device may present more than one function, each independently identifiable and separately configured, so that what is physically one component appears to software as several distinct things it can discover and drive independently.

The reason to flag this now is to prevent an assumption from hardening: do not assume one device always equals exactly one function. The detailed behaviour of multi-function devices belongs to later modules; for now, treat "function" as the precise term and "device" as the informal one, and be aware they are not always one-to-one.

6. Common Misconceptions

7. Real Engineering Relevance

If you work on PCIe in industry, the odds strongly favour working on an Endpoint. Root Complex and Switch implementations exist and matter, but the population of devices that attach to a hierarchy vastly exceeds the population of components that anchor or forward one — every accelerator, storage controller, network device, and custom card is an Endpoint.

That makes this chapter's role the practical centre of PCIe design and verification work, which typically involves:

  • Accepting host-directed accesses correctly — recognising what has arrived, acting on it, and responding where a response is expected.
  • Generating device-originated traffic — issuing transactions toward system memory on the device's behalf, and signalling when something needs host attention.
  • Exposing the device properly so software can discover it, identify it, and have its resource requirements satisfied.
  • Obeying the protocol at the PCIe boundary, regardless of what the device-specific logic behind that boundary is doing.

Figure 1's internal split is the useful frame here. An Endpoint has a PCIe-facing side that must behave exactly as the architecture requires, and a device-specific side that implements whatever the product actually does. Most PCIe verification effort concentrates on that boundary — checking that the device-side design meets its obligations as a hierarchy participant, independently of whether its application logic is correct.

Two habits follow. First, a verification environment for an Endpoint must model a plausible counterpart on the other side of the Link, which requires knowing which behaviours legitimately belong to the root side — the question Chapter 2.2 framed. Second, when something misbehaves, the boundary is the first place to localise the problem: is the device failing its protocol obligations, or is it meeting them and the application logic behind is wrong? Those have entirely different investigations, and confusing them wastes a great deal of time.

8. Understanding Check

9. Summary

An Endpoint is a PCIe function that terminates a hierarchy path. Traffic reaching it has arrived — nothing lies beyond it to forward to — which is exactly what distinguishes it from a Switch, and its counterpart at the opposite extreme is the Root Complex where paths begin.

It is defined by position, not packaging: add-in devices, integrated devices, and embedded functions all fill the role identically. It is likewise not defined by workload — storage, networking, graphics, and accelerator devices occupy the same architectural role, and their very different traffic profiles are properties of the devices rather than of the role.

It is an active participant. It responds to host-directed accesses, and it initiates transactions of its own toward system memory as well as signalling when it needs attention — the second being what makes high-throughput devices viable at all. To be usable it must be discoverable and identifiable in a standardized way, and its resource requirements must be described so the system can assign where they land: the device declares what it needs, and the system decides where it goes. The unit the architecture identifies is a function, and while one function per device is the common case, a device may present several.

Hold the model: an Endpoint terminates a hierarchy path and consumes or generates transactions for the device it represents; it is not an intermediate forwarding element.

10. What Comes Next

Chapters 2.1 through 2.3 have established the structure and both of its extremes — the map, the root where paths begin, and the leaves where they end. What remains is the middle and the connections themselves.

Chapter 2.4 develops the Switch: how an intermediate component forwards between its connections, and how that produces the fan-out this module has been assuming. Chapter 2.5 covers the Bridge and legacy interoperability, 2.6 how a hierarchy is organised and identified, 2.7 the fabric view, 2.8 the Link itself in depth, and 2.9 the switched-architecture contrast.

Revisit Root Complex for the host-side counterpart to this chapter, or PCIe Architecture Overview for the system map both sit within. Browse the full path on the PCIe tutorials index.