 df59feb197
			
		
	
	
		df59feb197
		
	
	
	
	
		
			
			'the' has a tendency to double up; squash them back down. Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20191104185202.102504-1-dgilbert@redhat.com> [lv: removed disas/libvixl/vixl/invalset.h change] Signed-off-by: Laurent Vivier <laurent@vivier.eu>
		
			
				
	
	
		
			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.
 |