hv: Introduce Global System Interrupt (GSI) into INTx Remapping

As ACRN prepares to support platforms with multiple IO-APICs,
GSI is a better way to represent physical and virtual INTx interrupt
source.
1) This patch replaces usage of "pin" with "gsi" whereever applicable
across the modules.
2) PIC pin to gsi is trickier and needs to consider the usage of
"Interrupt Source Override" structure in ACPI for the corresponding VM.

Tracked-On: #4151
Signed-off-by: Sainath Grandhi <sainath.grandhi@intel.com>
Acked-by: Eddie Dong <eddie.dong@Intel.com>
This commit is contained in:
Sainath Grandhi
2020-03-11 13:03:43 -07:00
committed by wenlingz
parent 2fe3004202
commit 85217e362f
12 changed files with 198 additions and 128 deletions

View File

@@ -29,15 +29,15 @@
* Acknowledge a virtual legacy interrupt for a passthrough device.
*
* @param[in] vm pointer to acrn_vm
* @param[in] virt_pin virtual pin number associated with the passthrough device
* @param[in] vpin_ctlr INTX_CTLR_IOAPIC or INTX_CTLR_PIC
* @param[in] virt_gsi virtual GSI number associated with the passthrough device
* @param[in] vgsi_ctlr INTX_CTLR_IOAPIC or INTX_CTLR_PIC
*
* @return None
*
* @pre vm != NULL
*
*/
void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ctlr vpin_ctlr);
void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_gsi, enum intx_ctlr vgsi_ctlr);
/**
* @brief MSI/MSI-x remapping for passthrough device.
@@ -72,8 +72,8 @@ int32_t ptirq_prepare_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_
* This is the main entry for PCI/Legacy device assignment with INTx, calling from vIOAPIC or vPIC.
*
* @param[in] vm pointer to acrn_vm
* @param[in] virt_pin virtual pin number associated with the passthrough device
* @param[in] vpin_ctlr INTX_CTLR_IOAPIC or INTX_CTLR_PIC
* @param[in] virt_gsi virtual GSI number associated with the passthrough device
* @param[in] vgsi_ctlr INTX_CTLR_IOAPIC or INTX_CTLR_PIC
*
* @return
* - 0: on success
@@ -84,7 +84,7 @@ int32_t ptirq_prepare_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_
* @pre vm != NULL
*
*/
int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ctlr vpin_ctlr);
int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_gsi, enum intx_ctlr vgsi_ctlr);
/**
* @brief Add an interrupt remapping entry for INTx as pre-hold mapping.
@@ -94,8 +94,8 @@ int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ct
* Currently, one phys_pin can only be held by one pin source (vPIC or vIOAPIC).
*
* @param[in] vm pointer to acrn_vm
* @param[in] virt_pin virtual pin number associated with the passthrough device
* @param[in] phys_pin physical pin number associated with the passthrough device
* @param[in] virt_gsi virtual pin number associated with the passthrough device
* @param[in] phys_gsi physical pin number associated with the passthrough device
* @param[in] pic_pin true for pic, false for ioapic
*
* @return
@@ -106,7 +106,7 @@ int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ct
* @pre vm != NULL
*
*/
int32_t ptirq_add_intx_remapping(struct acrn_vm *vm, uint32_t virt_pin, uint32_t phys_pin, bool pic_pin);
int32_t ptirq_add_intx_remapping(struct acrn_vm *vm, uint32_t virt_gsi, uint32_t phys_gsi, bool pic_pin);
/**
* @brief Remove an interrupt remapping entry for INTx.
@@ -114,7 +114,7 @@ int32_t ptirq_add_intx_remapping(struct acrn_vm *vm, uint32_t virt_pin, uint32_t
* Deactivate & remove mapping entry of the given virt_pin for given vm.
*
* @param[in] vm pointer to acrn_vm
* @param[in] virt_pin virtual pin number associated with the passthrough device
* @param[in] virt_gsi virtual pin number associated with the passthrough device
* @param[in] pic_pin true for pic, false for ioapic
*
* @return None
@@ -122,7 +122,7 @@ int32_t ptirq_add_intx_remapping(struct acrn_vm *vm, uint32_t virt_pin, uint32_t
* @pre vm != NULL
*
*/
void ptirq_remove_intx_remapping(const struct acrn_vm *vm, uint32_t virt_pin, bool pic_pin);
void ptirq_remove_intx_remapping(const struct acrn_vm *vm, uint32_t virt_gsi, bool pic_pin);
/**
* @brief Remove interrupt remapping entry/entries for MSI/MSI-x.

View File

@@ -35,14 +35,13 @@ uint8_t ioapic_irq_to_ioapic_id(uint32_t irq);
*/
/**
* @brief Get irq num from pin num
* @brief Get irq num from gsi num
*
* @param[in] pin The pin number
* @param[in] gsi The gsi number
*
* @return irq number
*/
uint32_t ioapic_pin_to_irq(uint32_t pin);
uint32_t ioapic_gsi_to_irq(uint32_t gsi);
/**
* @brief Set the redirection table entry
*

View File

@@ -25,7 +25,7 @@ enum intx_ctlr {
union source_id (name) = {.msi_id = {.bdf = (a), .entry_nr = (b)} }
#define DEFINE_INTX_SID(name, a, b) \
union source_id (name) = {.intx_id = {.pin = (a), .ctlr = (b)} }
union source_id (name) = {.intx_id = {.gsi = (a), .ctlr = (b)} }
union irte_index {
uint16_t index;
@@ -49,7 +49,7 @@ union source_id {
*/
struct {
enum intx_ctlr ctlr;
uint32_t pin;
uint32_t gsi;
} intx_id;
};

View File

@@ -76,7 +76,7 @@ void vioapic_reset(struct acrn_vm *vm);
* @brief Set vIOAPIC IRQ line status.
*
* @param[in] vm Pointer to target VM
* @param[in] irqline Target IRQ number
* @param[in] vgsi GSI for the virtual interrupt
* @param[in] operation Action options: GSI_SET_HIGH/GSI_SET_LOW/
* GSI_RAISING_PULSE/GSI_FALLING_PULSE
*
@@ -84,7 +84,7 @@ void vioapic_reset(struct acrn_vm *vm);
*
* @return None
*/
void vioapic_set_irqline_lock(const struct acrn_vm *vm, uint32_t irqline, uint32_t operation);
void vioapic_set_irqline_lock(const struct acrn_vm *vm, uint32_t vgsi, uint32_t operation);
/**
* @brief Set vIOAPIC IRQ line status.
@@ -93,18 +93,18 @@ void vioapic_set_irqline_lock(const struct acrn_vm *vm, uint32_t irqline, uint32
* operation be done with ioapic lock.
*
* @param[in] vm Pointer to target VM
* @param[in] irqline Target IRQ number
* @param[in] vgsi GSI for the virtual interrupt
* @param[in] operation Action options: GSI_SET_HIGH/GSI_SET_LOW/
* GSI_RAISING_PULSE/GSI_FALLING_PULSE
*
* @pre irqline < vioapic_pincount(vm)
* @return None
*/
void vioapic_set_irqline_nolock(const struct acrn_vm *vm, uint32_t irqline, uint32_t operation);
void vioapic_set_irqline_nolock(const struct acrn_vm *vm, uint32_t vgsi, uint32_t operation);
uint32_t vioapic_pincount(const struct acrn_vm *vm);
void vioapic_process_eoi(struct acrn_vm *vm, uint32_t vector);
void vioapic_get_rte(const struct acrn_vm *vm, uint32_t pin, union ioapic_rte *rte);
void vioapic_get_rte(const struct acrn_vm *vm, uint32_t vgsi, union ioapic_rte *rte);
int32_t vioapic_mmio_access_handler(struct io_request *io_req, void *handler_private_data);
/**

View File

@@ -149,13 +149,13 @@ void vpic_init(struct acrn_vm *vm);
* @brief Set vPIC IRQ line status.
*
* @param[in] vpic Pointer to target VM's vpic table
* @param[in] irqline Target IRQ number
* @param[in] vgsi GSI for the virtual interrupt
* @param[in] operation action options:GSI_SET_HIGH/GSI_SET_LOW/
* GSI_RAISING_PULSE/GSI_FALLING_PULSE
*
* @return None
*/
void vpic_set_irqline(struct acrn_vpic *vpic, uint32_t irqline, uint32_t operation);
void vpic_set_irqline(struct acrn_vpic *vpic, uint32_t vgsi, uint32_t operation);
/**
* @brief Get pending virtual interrupts for vPIC.
@@ -179,7 +179,7 @@ void vpic_pending_intr(struct acrn_vpic *vpic, uint32_t *vecptr);
* @pre vm != NULL
*/
void vpic_intr_accepted(struct acrn_vpic *vpic, uint32_t vector);
void vpic_get_irqline_trigger_mode(const struct acrn_vpic *vpic, uint32_t irqline, enum vpic_trigger *trigger);
void vpic_get_irqline_trigger_mode(const struct acrn_vpic *vpic, uint32_t vgsi, enum vpic_trigger *trigger);
uint32_t vpic_pincount(void);
struct acrn_vpic *vm_pic(const struct acrn_vm *vm);

View File

@@ -88,5 +88,5 @@ void vuart_putchar(struct acrn_vuart *vu, char ch);
char vuart_getchar(struct acrn_vuart *vu);
void vuart_toggle_intr(const struct acrn_vuart *vu);
bool is_vuart_intx(const struct acrn_vm *vm, uint32_t intx_pin);
bool is_vuart_intx(const struct acrn_vm *vm, uint32_t intx_gsi);
#endif /* VUART_H */