201 lines
8.8 KiB
ReStructuredText
201 lines
8.8 KiB
ReStructuredText
================================
|
|
POWER9 XIVE interrupt controller
|
|
================================
|
|
|
|
The POWER9 processor comes with a new interrupt controller
|
|
architecture, called XIVE as "eXternal Interrupt Virtualization
|
|
Engine".
|
|
|
|
Compared to the previous architecture, the main characteristics of
|
|
XIVE are to support a larger number of interrupt sources and to
|
|
deliver interrupts directly to virtual processors without hypervisor
|
|
assistance. This removes the context switches required for the
|
|
delivery process.
|
|
|
|
|
|
XIVE architecture
|
|
=================
|
|
|
|
The XIVE IC is composed of three sub-engines, each taking care of a
|
|
processing layer of external interrupts:
|
|
|
|
- Interrupt Virtualization Source Engine (IVSE), or Source Controller
|
|
(SC). These are found in PCI PHBs, in the Processor Service
|
|
Interface (PSI) host bridge Controller, but also inside the main
|
|
controller for the core IPIs and other sub-chips (NX, CAP, NPU) of
|
|
the chip/processor. They are configured to feed the IVRE with
|
|
events.
|
|
- Interrupt Virtualization Routing Engine (IVRE) or Virtualization
|
|
Controller (VC). It handles event coalescing and perform interrupt
|
|
routing by matching an event source number with an Event
|
|
Notification Descriptor (END).
|
|
- Interrupt Virtualization Presentation Engine (IVPE) or Presentation
|
|
Controller (PC). It maintains the interrupt context state of each
|
|
thread and handles the delivery of the external interrupt to the
|
|
thread.
|
|
|
|
::
|
|
|
|
XIVE Interrupt Controller
|
|
+------------------------------------+ IPIs
|
|
| +---------+ +---------+ +--------+ | +-------+
|
|
| |IVRE | |Common Q | |IVPE |----> | CORES |
|
|
| | esb | | | | |----> | |
|
|
| | eas | | Bridge | | tctx |----> | |
|
|
| |SC end | | | | nvt | | | |
|
|
+------+ | +---------+ +----+----+ +--------+ | +-+-+-+-+
|
|
| RAM | +------------------|-----------------+ | | |
|
|
| | | | | |
|
|
| | | | | |
|
|
| | +--------------------v------------------------v-v-v--+ other
|
|
| <--+ Power Bus +--> chips
|
|
| esb | +---------+-----------------------+------------------+
|
|
| eas | | |
|
|
| end | +--|------+ |
|
|
| nvt | +----+----+ | +----+----+
|
|
+------+ |IVSE | | |IVSE |
|
|
| | | | |
|
|
| PQ-bits | | | PQ-bits |
|
|
| local |-+ | in VC |
|
|
+---------+ +---------+
|
|
PCIe NX,NPU,CAPI
|
|
|
|
|
|
PQ-bits: 2 bits source state machine (P:pending Q:queued)
|
|
esb: Event State Buffer (Array of PQ bits in an IVSE)
|
|
eas: Event Assignment Structure
|
|
end: Event Notification Descriptor
|
|
nvt: Notification Virtual Target
|
|
tctx: Thread interrupt Context registers
|
|
|
|
|
|
|
|
XIVE internal tables
|
|
--------------------
|
|
|
|
Each of the sub-engines uses a set of tables to redirect interrupts
|
|
from event sources to CPU threads.
|
|
|
|
::
|
|
|
|
+-------+
|
|
User or O/S | EQ |
|
|
or +------>|entries|
|
|
Hypervisor | | .. |
|
|
Memory | +-------+
|
|
| ^
|
|
| |
|
|
+-------------------------------------------------+
|
|
| |
|
|
Hypervisor +------+ +---+--+ +---+--+ +------+
|
|
Memory | ESB | | EAT | | ENDT | | NVTT |
|
|
(skiboot) +----+-+ +----+-+ +----+-+ +------+
|
|
^ | ^ | ^ | ^
|
|
| | | | | | |
|
|
+-------------------------------------------------+
|
|
| | | | | | |
|
|
| | | | | | |
|
|
+----|--|--------|--|--------|--|-+ +-|-----+ +------+
|
|
| | | | | | | | | | tctx| |Thread|
|
|
IPI or ---+ + v + v + v |---| + .. |-----> |
|
|
HW events | | | | | |
|
|
| IVRE | | IVPE | +------+
|
|
+---------------------------------+ +-------+
|
|
|
|
|
|
The IVSE have a 2-bits state machine, P for pending and Q for queued,
|
|
for each source that allows events to be triggered. They are stored in
|
|
an Event State Buffer (ESB) array and can be controlled by MMIOs.
|
|
|
|
If the event is let through, the IVRE looks up in the Event Assignment
|
|
Structure (EAS) table for an Event Notification Descriptor (END)
|
|
configured for the source. Each Event Notification Descriptor defines
|
|
a notification path to a CPU and an in-memory Event Queue, in which
|
|
will be enqueued an EQ data for the O/S to pull.
|
|
|
|
The IVPE determines if a Notification Virtual Target (NVT) can handle
|
|
the event by scanning the thread contexts of the VCPUs dispatched on
|
|
the processor HW threads. It maintains the interrupt context state of
|
|
each thread in a NVT table.
|
|
|
|
XIVE thread interrupt context
|
|
-----------------------------
|
|
|
|
The XIVE presenter can generate four different exceptions to its
|
|
HW threads:
|
|
|
|
- hypervisor exception
|
|
- O/S exception
|
|
- Event-Based Branch (user level)
|
|
- msgsnd (doorbell)
|
|
|
|
Each exception has a state independent from the others called a Thread
|
|
Interrupt Management context. This context is a set of registers which
|
|
lets the thread handle priority management and interrupt
|
|
acknowledgment among other things. The most important ones being :
|
|
|
|
- Interrupt Priority Register (PIPR)
|
|
- Interrupt Pending Buffer (IPB)
|
|
- Current Processor Priority (CPPR)
|
|
- Notification Source Register (NSR)
|
|
|
|
TIMA
|
|
~~~~
|
|
|
|
The Thread Interrupt Management registers are accessible through a
|
|
specific MMIO region, called the Thread Interrupt Management Area
|
|
(TIMA), four aligned pages, each exposing a different view of the
|
|
registers. First page (page address ending in ``0b00``) gives access
|
|
to the entire context and is reserved for the ring 0 view for the
|
|
physical thread context. The second (page address ending in ``0b01``)
|
|
is for the hypervisor, ring 1 view. The third (page address ending in
|
|
``0b10``) is for the operating system, ring 2 view. The fourth (page
|
|
address ending in ``0b11``) is for user level, ring 3 view.
|
|
|
|
Interrupt flow from an O/S perspective
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
After an event data has been enqueued in the O/S Event Queue, the IVPE
|
|
raises the bit corresponding to the priority of the pending interrupt
|
|
in the register IBP (Interrupt Pending Buffer) to indicate that an
|
|
event is pending in one of the 8 priority queues. The Pending
|
|
Interrupt Priority Register (PIPR) is also updated using the IPB. This
|
|
register represent the priority of the most favored pending
|
|
notification.
|
|
|
|
The PIPR is then compared to the Current Processor Priority
|
|
Register (CPPR). If it is more favored (numerically less than), the
|
|
CPU interrupt line is raised and the EO bit of the Notification Source
|
|
Register (NSR) is updated to notify the presence of an exception for
|
|
the O/S. The O/S acknowledges the interrupt with a special load in the
|
|
Thread Interrupt Management Area.
|
|
|
|
The O/S handles the interrupt and when done, performs an EOI using a
|
|
MMIO operation on the ESB management page of the associate source.
|
|
|
|
Overview of the QEMU models for XIVE
|
|
====================================
|
|
|
|
The XiveSource models the IVSE in general, internal and external. It
|
|
handles the source ESBs and the MMIO interface to control them.
|
|
|
|
The XiveNotifier is a small helper interface interconnecting the
|
|
XiveSource to the XiveRouter.
|
|
|
|
The XiveRouter is an abstract model acting as a combined IVRE and
|
|
IVPE. It routes event notifications using the EAS and END tables to
|
|
the IVPE sub-engine which does a CAM scan to find a CPU to deliver the
|
|
exception. Storage should be provided by the inheriting classes.
|
|
|
|
XiveEnDSource is a special source object. It exposes the END ESB MMIOs
|
|
of the Event Queues which are used for coalescing event notifications
|
|
and for escalation. Not used on the field, only to sync the EQ cache
|
|
in OPAL.
|
|
|
|
Finally, the XiveTCTX contains the interrupt state context of a thread,
|
|
four sets of registers, one for each exception that can be delivered
|
|
to a CPU. These contexts are scanned by the IVPE to find a matching VP
|
|
when a notification is triggered. It also models the Thread Interrupt
|
|
Management Area (TIMA), which exposes the thread context registers to
|
|
the CPU for interrupt management.
|