Skip to content

Commit 460e7ee

Browse files
Sainath Grandhiwenlingz
authored andcommitted
hv: Variable/macro renaming for intr handling of PT devices using IO-APIC/PIC
1. Renames DEFINE_IOAPIC_SID with DEFINE_INTX_SID as the virtual source can be IOAPIC or PIC 2. Rename the src member of source_id.intx_id to ctlr to indicate interrupt controller 2. Changes the type of src member of source_id.intx_id from uint32_t to enum with INTX_CTLR_IOAPIC and INTX_CTLR_PIC Tracked-On: #4447 Signed-off-by: Sainath Grandhi <sainath.grandhi@intel.com>
1 parent 9a79443 commit 460e7ee

File tree

6 files changed

+49
-41
lines changed

6 files changed

+49
-41
lines changed

hypervisor/arch/x86/guest/assign.c

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ ptirq_build_physical_rte(struct acrn_vm *vm, struct ptirq_remapping_info *entry)
177177
struct intr_source intr_src;
178178
int32_t ret;
179179

180-
if (virt_sid->intx_id.src == PTDEV_VPIN_IOAPIC) {
180+
if (virt_sid->intx_id.ctlr == INTX_CTLR_IOAPIC) {
181181
uint64_t vdmask, pdmask;
182182
uint32_t dest, delmode, dest_mask, vector;
183183
union ioapic_rte virt_rte;
@@ -360,9 +360,9 @@ static struct ptirq_remapping_info *add_intx_remapping(struct acrn_vm *vm, uint3
360360
{
361361
struct ptirq_remapping_info *entry = NULL;
362362
bool entry_is_updated = true;
363-
uint32_t vpin_src = pic_pin ? PTDEV_VPIN_PIC : PTDEV_VPIN_IOAPIC;
364-
DEFINE_IOAPIC_SID(phys_sid, phys_pin, 0U);
365-
DEFINE_IOAPIC_SID(virt_sid, virt_pin, vpin_src);
363+
enum intx_ctlr vpin_ctlr = pic_pin ? INTX_CTLR_PIC : INTX_CTLR_IOAPIC;
364+
DEFINE_INTX_SID(phys_sid, phys_pin, INTX_CTLR_IOAPIC);
365+
DEFINE_INTX_SID(virt_sid, virt_pin, vpin_ctlr);
366366
uint32_t phys_irq = ioapic_pin_to_irq(phys_pin);
367367

368368
if (((!pic_pin) && (virt_pin >= vioapic_pincount(vm))) || (pic_pin && (virt_pin >= vpic_pincount()))) {
@@ -463,13 +463,13 @@ static void ptirq_handle_intx(struct acrn_vm *vm,
463463
const struct ptirq_remapping_info *entry)
464464
{
465465
const union source_id *virt_sid = &entry->virt_sid;
466-
switch (virt_sid->intx_id.src) {
467-
case PTDEV_VPIN_IOAPIC:
466+
switch (virt_sid->intx_id.ctlr) {
467+
case INTX_CTLR_IOAPIC:
468468
{
469469
union ioapic_rte rte;
470470
bool trigger_lvl = false;
471471

472-
/* VPIN_IOAPIC src means we have vioapic enabled */
472+
/* INTX_CTLR_IOAPIC means we have vioapic enabled */
473473
vioapic_get_rte(vm, (uint32_t)virt_sid->intx_id.pin, &rte);
474474
if (rte.bits.trigger_mode == IOAPIC_RTE_TRGRMODE_LEVEL) {
475475
trigger_lvl = true;
@@ -496,11 +496,11 @@ static void ptirq_handle_intx(struct acrn_vm *vm,
496496
rte.full);
497497
break;
498498
}
499-
case PTDEV_VPIN_PIC:
499+
case INTX_CTLR_PIC:
500500
{
501501
enum vpic_trigger trigger;
502502

503-
/* VPIN_PIC src means we have vpic enabled */
503+
/* INTX_CTLR_PIC means we have vpic enabled */
504504
vpic_get_irqline_trigger_mode(vm_pic(vm), virt_sid->intx_id.pin, &trigger);
505505
if (trigger == LEVEL_TRIGGER) {
506506
vpic_set_irqline(vm_pic(vm), virt_sid->intx_id.pin, GSI_SET_HIGH);
@@ -511,8 +511,8 @@ static void ptirq_handle_intx(struct acrn_vm *vm,
511511
}
512512
default:
513513
/*
514-
* In this switch statement, virt_sid->intx_id.src shall
515-
* either be PTDEV_VPIN_IOAPIC or PTDEV_VPIN_PIC.
514+
* In this switch statement, virt_sid->intx_id.ctlr shall
515+
* either be INTX_CTLR_IOAPIC or INTX_CTLR_PIC.
516516
* Gracefully return if prior case clauses have not been met.
517517
*/
518518
break;
@@ -556,11 +556,11 @@ void ptirq_softirq(uint16_t pcpu_id)
556556
}
557557
}
558558

559-
void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpin_src)
559+
void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ctlr vpin_ctlr)
560560
{
561561
uint32_t phys_irq;
562562
struct ptirq_remapping_info *entry;
563-
bool pic_pin = (vpin_src == PTDEV_VPIN_PIC);
563+
bool pic_pin = (vpin_ctlr == INTX_CTLR_PIC);
564564

565565
entry = ptirq_lookup_entry_by_vpin(vm, virt_pin, pic_pin);
566566
if (entry != NULL) {
@@ -569,21 +569,21 @@ void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpin_src)
569569
/* NOTE: only Level trigger will process EOI/ACK and if we got here
570570
* means we have this vioapic or vpic or both enabled
571571
*/
572-
switch (vpin_src) {
573-
case PTDEV_VPIN_IOAPIC:
572+
switch (vpin_ctlr) {
573+
case INTX_CTLR_IOAPIC:
574574
if (entry->polarity != 0U) {
575575
vioapic_set_irqline_lock(vm, virt_pin, GSI_SET_HIGH);
576576
} else {
577577
vioapic_set_irqline_lock(vm, virt_pin, GSI_SET_LOW);
578578
}
579579
break;
580-
case PTDEV_VPIN_PIC:
580+
case INTX_CTLR_PIC:
581581
vpic_set_irqline(vm_pic(vm), virt_pin, GSI_SET_LOW);
582582
break;
583583
default:
584584
/*
585-
* In this switch statement, vpin_src shall either be
586-
* PTDEV_VPIN_IOAPIC or PTDEV_VPIN_PIC.
585+
* In this switch statement, vpin_ctlr shall either be
586+
* INTX_CTLR_IOAPIC or INTX_CTLR_PIC.
587587
* Gracefully return if prior case clauses have not been met.
588588
*/
589589
break;
@@ -701,13 +701,13 @@ static void activate_physical_ioapic(struct acrn_vm *vm,
701701
/* Main entry for PCI/Legacy device assignment with INTx, calling from vIOAPIC
702702
* or vPIC
703703
*/
704-
int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpin_src)
704+
int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ctlr vpin_ctlr)
705705
{
706706
int32_t status = 0;
707707
struct ptirq_remapping_info *entry = NULL;
708-
bool need_switch_vpin_src = false;
709-
DEFINE_IOAPIC_SID(virt_sid, virt_pin, vpin_src);
710-
bool pic_pin = (vpin_src == PTDEV_VPIN_PIC);
708+
bool need_switch_vpin_ctlr = false;
709+
DEFINE_INTX_SID(virt_sid, virt_pin, vpin_ctlr);
710+
bool pic_pin = (vpin_ctlr == INTX_CTLR_PIC);
711711

712712
/*
713713
* virt pin could come from vpic master, vpic slave or vioapic
@@ -746,7 +746,7 @@ int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpi
746746

747747
entry = ptirq_lookup_entry_by_vpin(vm, vpin, !pic_pin);
748748
if (entry != NULL) {
749-
need_switch_vpin_src = true;
749+
need_switch_vpin_ctlr = true;
750750
}
751751
}
752752

@@ -779,13 +779,13 @@ int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpi
779779
if (status == 0) {
780780
spinlock_obtain(&ptdev_lock);
781781
/* if vpin source need switch */
782-
if ((need_switch_vpin_src) && (entry != NULL)) {
782+
if ((need_switch_vpin_ctlr) && (entry != NULL)) {
783783
dev_dbg(DBG_LEVEL_IRQ,
784784
"IOAPIC pin=%hhu pirq=%u vpin=%d switch from %s to %s vpin=%d for vm%d",
785785
entry->phys_sid.intx_id.pin,
786786
entry->allocated_pirq, entry->virt_sid.intx_id.pin,
787-
(vpin_src == 0U) ? "vPIC" : "vIOAPIC",
788-
(vpin_src == 0U) ? "vIOPIC" : "vPIC",
787+
(vpin_ctlr == INTX_CTLR_IOAPIC) ? "vPIC" : "vIOAPIC",
788+
(vpin_ctlr == INTX_CTLR_IOAPIC) ? "vIOPIC" : "vPIC",
789789
virt_pin, entry->vm->vm_id);
790790
entry->virt_sid.value = virt_sid.value;
791791
}

hypervisor/debug/shell.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,7 @@ static void get_entry_info(const struct ptirq_remapping_info *entry, char *type,
10731073
uint32_t phys_irq = entry->allocated_pirq;
10741074
union ioapic_rte rte;
10751075

1076-
if (entry->virt_sid.intx_id.src == PTDEV_VPIN_IOAPIC) {
1076+
if (entry->virt_sid.intx_id.ctlr == INTX_CTLR_IOAPIC) {
10771077
(void)strncpy_s(type, 16U, "IOAPIC", 16U);
10781078
} else {
10791079
(void)strncpy_s(type, 16U, "PIC", 16U);

hypervisor/dm/vioapic.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ static void vioapic_indirect_write(struct acrn_vioapic *vioapic, uint32_t addr,
333333
if ((new.bits.intr_mask == IOAPIC_RTE_MASK_CLR) || (last.bits.intr_mask == IOAPIC_RTE_MASK_CLR)) {
334334
/* VM enable intr */
335335
/* NOTE: only support max 256 pin */
336-
(void)ptirq_intx_pin_remap(vioapic->vm, pin, PTDEV_VPIN_IOAPIC);
336+
(void)ptirq_intx_pin_remap(vioapic->vm, pin, INTX_CTLR_IOAPIC);
337337
}
338338

339339
/*
@@ -420,7 +420,7 @@ vioapic_process_eoi(struct acrn_vm *vm, uint32_t vector)
420420
continue;
421421
}
422422

423-
ptirq_intx_ack(vm, pin, PTDEV_VPIN_IOAPIC);
423+
ptirq_intx_ack(vm, pin, INTX_CTLR_IOAPIC);
424424
}
425425

426426
/*

hypervisor/dm/vpic.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ static int32_t vpic_ocw1(const struct acrn_vpic *vpic, struct i8259_reg_state *i
342342

343343
virt_pin = (master_pic(vpic, i8259)) ?
344344
pin : (pin + 8U);
345-
(void)ptirq_intx_pin_remap(vpic->vm, virt_pin, PTDEV_VPIN_PIC);
345+
(void)ptirq_intx_pin_remap(vpic->vm, virt_pin, INTX_CTLR_PIC);
346346
}
347347
pin = (pin + 1U) & 0x7U;
348348
}
@@ -379,7 +379,7 @@ static int32_t vpic_ocw2(const struct acrn_vpic *vpic, struct i8259_reg_state *i
379379
/* if level ack PTDEV */
380380
if ((i8259->elc & (1U << (isr_bit & 0x7U))) != 0U) {
381381
ptirq_intx_ack(vpic->vm, (master_pic(vpic, i8259) ? isr_bit : isr_bit + 8U),
382-
PTDEV_VPIN_PIC);
382+
INTX_CTLR_PIC);
383383
}
384384
} else if (((val & OCW2_SL) != 0U) && i8259->rotate) {
385385
/* specific priority */

hypervisor/include/arch/x86/guest/assign.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@
3030
*
3131
* @param[in] vm pointer to acrn_vm
3232
* @param[in] virt_pin virtual pin number associated with the passthrough device
33-
* @param[in] vpin_src ioapic or pic
33+
* @param[in] vpin_ctlr INTX_CTLR_IOAPIC or INTX_CTLR_PIC
3434
*
3535
* @return None
3636
*
3737
* @pre vm != NULL
3838
*
3939
*/
40-
void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpin_src);
40+
void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ctlr vpin_ctlr);
4141

4242
/**
4343
* @brief MSI/MSI-x remapping for passthrough device.
@@ -73,7 +73,7 @@ int32_t ptirq_prepare_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_
7373
*
7474
* @param[in] vm pointer to acrn_vm
7575
* @param[in] virt_pin virtual pin number associated with the passthrough device
76-
* @param[in] vpin_src ioapic or pic
76+
* @param[in] vpin_ctlr INTX_CTLR_IOAPIC or INTX_CTLR_PIC
7777
*
7878
* @return
7979
* - 0: on success
@@ -84,7 +84,7 @@ int32_t ptirq_prepare_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_
8484
* @pre vm != NULL
8585
*
8686
*/
87-
int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpin_src);
87+
int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ctlr vpin_ctlr);
8888

8989
/**
9090
* @brief Add an interrupt remapping entry for INTx as pre-hold mapping.

hypervisor/include/common/ptdev.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,22 @@
1010
#include <spinlock.h>
1111
#include <timer.h>
1212

13+
14+
enum intx_ctlr {
15+
INTX_CTLR_IOAPIC = 0U,
16+
INTX_CTLR_PIC
17+
};
18+
1319
#define PTDEV_INTR_MSI (1U << 0U)
1420
#define PTDEV_INTR_INTX (1U << 1U)
1521

1622
#define INVALID_PTDEV_ENTRY_ID 0xffffU
1723

18-
#define PTDEV_VPIN_IOAPIC 0x0U
19-
#define PTDEV_VPIN_PIC 0x1U
20-
2124
#define DEFINE_MSI_SID(name, a, b) \
2225
union source_id (name) = {.msi_id = {.bdf = (a), .entry_nr = (b)} }
2326

24-
#define DEFINE_IOAPIC_SID(name, a, b) \
25-
union source_id (name) = {.intx_id = {.pin = (a), .src = (b)} }
27+
#define DEFINE_INTX_SID(name, a, b) \
28+
union source_id (name) = {.intx_id = {.pin = (a), .ctlr = (b)} }
2629

2730
union irte_index {
2831
uint16_t index;
@@ -32,16 +35,21 @@ union irte_index {
3235
} bits __packed;
3336
};
3437

38+
3539
union source_id {
3640
uint64_t value;
3741
struct {
3842
uint16_t bdf;
3943
uint16_t entry_nr;
4044
uint32_t reserved;
4145
} msi_id;
46+
/*
47+
* ctlr indicates if the source of interrupt is IO-APIC or PIC
48+
* pin indicates the pin number of interrupt controller determined by ctlr
49+
*/
4250
struct {
51+
enum intx_ctlr ctlr;
4352
uint32_t pin;
44-
uint32_t src;
4553
} intx_id;
4654
};
4755

0 commit comments

Comments
 (0)