@@ -77,10 +77,10 @@ entry_id(struct ptdev_remapping_info *entry)
77
77
uint32_t id ;
78
78
79
79
if (entry -> type == PTDEV_INTR_INTX )
80
- id = entry_id_from_intx (entry -> intx .phys_pin );
80
+ id = entry_id_from_intx (entry -> ptdev_intr_info . intx .phys_pin );
81
81
else
82
82
id = entry_id_from_msix (entry -> phys_bdf ,
83
- entry -> msi .msix_entry_index );
83
+ entry -> ptdev_intr_info . msi .msix_entry_index );
84
84
85
85
return id ;
86
86
}
@@ -138,7 +138,8 @@ _lookup_entry_by_vmsi(struct vm *vm, uint16_t vbdf, int32_t index)
138
138
if ((entry -> type == PTDEV_INTR_MSI )
139
139
&& (entry -> vm == vm )
140
140
&& (entry -> virt_bdf == vbdf )
141
- && (entry -> msi .msix_entry_index == index ))
141
+ && (entry -> ptdev_intr_info .msi .msix_entry_index
142
+ == index ))
142
143
return entry ;
143
144
}
144
145
@@ -169,8 +170,8 @@ _lookup_entry_by_vintx(struct vm *vm, uint8_t vpin,
169
170
entry_node );
170
171
if ((entry -> type == PTDEV_INTR_INTX )
171
172
&& (entry -> vm == vm )
172
- && (entry -> intx .virt_pin == vpin )
173
- && (entry -> intx .vpin_src == vpin_src ))
173
+ && (entry -> ptdev_intr_info . intx .virt_pin == vpin )
174
+ && (entry -> ptdev_intr_info . intx .vpin_src == vpin_src ))
174
175
return entry ;
175
176
}
176
177
@@ -299,12 +300,13 @@ ptdev_update_irq_handler(struct vm *vm, struct ptdev_remapping_info *entry)
299
300
}
300
301
/* update irq handler for IOAPIC */
301
302
if ((entry -> type == PTDEV_INTR_INTX )
302
- && (entry -> intx .vpin_src == PTDEV_VPIN_IOAPIC )) {
303
+ && (entry -> ptdev_intr_info .intx .vpin_src
304
+ == PTDEV_VPIN_IOAPIC )) {
303
305
uint64_t rte ;
304
306
bool trigger_lvl = false;
305
307
306
308
/* VPIN_IOAPIC src means we have vioapic enabled */
307
- vioapic_get_rte (vm , entry -> intx .virt_pin , & rte );
309
+ vioapic_get_rte (vm , entry -> ptdev_intr_info . intx .virt_pin , & rte );
308
310
if ((rte & IOAPIC_RTE_TRGRMOD ) == IOAPIC_RTE_TRGRLVL )
309
311
trigger_lvl = true;
310
312
@@ -315,11 +317,12 @@ ptdev_update_irq_handler(struct vm *vm, struct ptdev_remapping_info *entry)
315
317
}
316
318
/* update irq handler for PIC */
317
319
if ((entry -> type == PTDEV_INTR_INTX ) && (phys_irq < NR_LEGACY_IRQ )
318
- && (entry -> intx .vpin_src == PTDEV_VPIN_PIC )) {
320
+ && (entry -> ptdev_intr_info . intx .vpin_src == PTDEV_VPIN_PIC )) {
319
321
enum vpic_trigger trigger ;
320
322
321
323
/* VPIN_PIC src means we have vpic enabled */
322
- vpic_get_irq_trigger (vm , entry -> intx .virt_pin , & trigger );
324
+ vpic_get_irq_trigger (vm ,
325
+ entry -> ptdev_intr_info .intx .virt_pin , & trigger );
323
326
if (trigger == LEVEL_TRIGGER )
324
327
update_irq_handler (phys_irq , common_dev_handler_level );
325
328
else
@@ -413,12 +416,12 @@ static uint64_t ptdev_build_physical_rte(struct vm *vm,
413
416
int phys_irq = dev_to_irq (entry -> node );
414
417
int vector = dev_to_vector (entry -> node );
415
418
416
- if (entry -> intx .vpin_src == PTDEV_VPIN_IOAPIC ) {
419
+ if (entry -> ptdev_intr_info . intx .vpin_src == PTDEV_VPIN_IOAPIC ) {
417
420
uint64_t vdmask , pdmask ;
418
421
uint32_t dest , low , high , delmode ;
419
422
bool phys ;
420
423
421
- vioapic_get_rte (vm , entry -> intx .virt_pin , & rte );
424
+ vioapic_get_rte (vm , entry -> ptdev_intr_info . intx .virt_pin , & rte );
422
425
low = rte ;
423
426
high = rte >> 32 ;
424
427
@@ -456,7 +459,8 @@ static uint64_t ptdev_build_physical_rte(struct vm *vm,
456
459
ioapic_get_rte (phys_irq , & physical_rte );
457
460
rte = physical_rte ;
458
461
rte &= ~IOAPIC_RTE_TRGRMOD ;
459
- vpic_get_irq_trigger (vm , entry -> intx .virt_pin , & trigger );
462
+ vpic_get_irq_trigger (vm ,
463
+ entry -> ptdev_intr_info .intx .virt_pin , & trigger );
460
464
if (trigger == LEVEL_TRIGGER )
461
465
rte |= IOAPIC_RTE_TRGRLVL ;
462
466
@@ -492,14 +496,15 @@ add_msix_remapping(struct vm *vm, uint16_t virt_bdf, uint16_t phys_bdf,
492
496
entry = alloc_entry (vm , PTDEV_INTR_MSI );
493
497
entry -> virt_bdf = virt_bdf ;
494
498
entry -> phys_bdf = phys_bdf ;
495
- entry -> msi .msix_entry_index = msix_entry_index ;
499
+ entry -> ptdev_intr_info . msi .msix_entry_index = msix_entry_index ;
496
500
} else if ((entry -> vm != vm ) && is_vm0 (entry -> vm )) {
497
501
entry -> vm = vm ;
498
502
entry -> virt_bdf = virt_bdf ;
499
503
} else if ((entry -> vm != vm ) && !is_vm0 (entry -> vm )) {
500
504
pr_err ("MSIX pbdf%x idx=%d already in vm%d with vbdf%x, not "
501
505
"able to add into vm%d with vbdf%x" , entry -> phys_bdf ,
502
- entry -> msi .msix_entry_index , entry -> vm -> attr .id ,
506
+ entry -> ptdev_intr_info .msi .msix_entry_index ,
507
+ entry -> vm -> attr .id ,
503
508
entry -> virt_bdf , vm -> attr .id , virt_bdf );
504
509
ASSERT (0 , "msix entry pbdf%x idx%d already in vm%d" ,
505
510
phys_bdf , msix_entry_index , entry -> vm -> attr .id );
@@ -565,17 +570,19 @@ add_intx_remapping(struct vm *vm, uint8_t virt_pin,
565
570
return & invalid_entry ;
566
571
}
567
572
entry = alloc_entry (vm , PTDEV_INTR_INTX );
568
- entry -> intx .phys_pin = phys_pin ;
569
- entry -> intx .virt_pin = virt_pin ;
570
- entry -> intx .vpin_src = vpin_src ;
573
+ entry -> ptdev_intr_info . intx .phys_pin = phys_pin ;
574
+ entry -> ptdev_intr_info . intx .virt_pin = virt_pin ;
575
+ entry -> ptdev_intr_info . intx .vpin_src = vpin_src ;
571
576
} else if ((entry -> vm != vm ) && is_vm0 (entry -> vm )) {
572
577
entry -> vm = vm ;
573
- entry -> intx .virt_pin = virt_pin ;
574
- entry -> intx .vpin_src = vpin_src ;
578
+ entry -> ptdev_intr_info . intx .virt_pin = virt_pin ;
579
+ entry -> ptdev_intr_info . intx .vpin_src = vpin_src ;
575
580
} else if ((entry -> vm != vm ) && !is_vm0 (entry -> vm )) {
576
581
pr_err ("INTX pin%d already in vm%d with vpin%d, not able to "
577
- "add into vm%d with vpin%d" , entry -> intx .phys_pin ,
578
- entry -> vm -> attr .id , entry -> intx .virt_pin ,
582
+ "add into vm%d with vpin%d" ,
583
+ entry -> ptdev_intr_info .intx .phys_pin ,
584
+ entry -> vm -> attr .id ,
585
+ entry -> ptdev_intr_info .intx .virt_pin ,
579
586
vm -> attr .id , virt_pin );
580
587
ASSERT (0 , "intx entry pin%d already vm%d" ,
581
588
phys_pin , entry -> vm -> attr .id );
@@ -617,10 +624,12 @@ void remove_intx_remapping(struct vm *vm, uint8_t virt_pin, bool pic_pin)
617
624
ptdev_deactivate_entry (entry );
618
625
dev_dbg (ACRN_DBG_IRQ ,
619
626
"deactive %s intx entry:ppin=%d, pirq=%d " ,
620
- entry -> intx .vpin_src == PTDEV_VPIN_PIC ?
621
- "vPIC" : "vIOAPIC" , entry -> intx .phys_pin , phys_irq );
627
+ entry -> ptdev_intr_info .intx .vpin_src == PTDEV_VPIN_PIC ?
628
+ "vPIC" : "vIOAPIC" ,
629
+ entry -> ptdev_intr_info .intx .phys_pin , phys_irq );
622
630
dev_dbg (ACRN_DBG_IRQ , "from vm%d vpin=%d\n" ,
623
- entry -> vm -> attr .id , entry -> intx .virt_pin );
631
+ entry -> vm -> attr .id ,
632
+ entry -> ptdev_intr_info .intx .virt_pin );
624
633
}
625
634
626
635
release_entry (entry );
@@ -632,21 +641,23 @@ void remove_intx_remapping(struct vm *vm, uint8_t virt_pin, bool pic_pin)
632
641
static void ptdev_intr_handle_irq (struct vm * vm ,
633
642
struct ptdev_remapping_info * entry )
634
643
{
635
- switch (entry -> intx .vpin_src ) {
644
+ switch (entry -> ptdev_intr_info . intx .vpin_src ) {
636
645
case PTDEV_VPIN_IOAPIC :
637
646
{
638
647
uint64_t rte ;
639
648
bool trigger_lvl = false;
640
649
641
650
/* VPIN_IOAPIC src means we have vioapic enabled */
642
- vioapic_get_rte (vm , entry -> intx .virt_pin , & rte );
651
+ vioapic_get_rte (vm , entry -> ptdev_intr_info . intx .virt_pin , & rte );
643
652
if ((rte & IOAPIC_RTE_TRGRMOD ) == IOAPIC_RTE_TRGRLVL )
644
653
trigger_lvl = true;
645
654
646
655
if (trigger_lvl )
647
- vioapic_assert_irq (vm , entry -> intx .virt_pin );
656
+ vioapic_assert_irq (vm ,
657
+ entry -> ptdev_intr_info .intx .virt_pin );
648
658
else
649
- vioapic_pulse_irq (vm , entry -> intx .virt_pin );
659
+ vioapic_pulse_irq (vm ,
660
+ entry -> ptdev_intr_info .intx .virt_pin );
650
661
651
662
dev_dbg (ACRN_DBG_PTIRQ ,
652
663
"dev-assign: irq=0x%x assert vr: 0x%x vRTE=0x%x" ,
@@ -659,11 +670,14 @@ static void ptdev_intr_handle_irq(struct vm *vm,
659
670
enum vpic_trigger trigger ;
660
671
661
672
/* VPIN_PIC src means we have vpic enabled */
662
- vpic_get_irq_trigger (vm , entry -> intx .virt_pin , & trigger );
673
+ vpic_get_irq_trigger (vm ,
674
+ entry -> ptdev_intr_info .intx .virt_pin , & trigger );
663
675
if (trigger == LEVEL_TRIGGER )
664
- vpic_assert_irq (vm , entry -> intx .virt_pin );
676
+ vpic_assert_irq (vm ,
677
+ entry -> ptdev_intr_info .intx .virt_pin );
665
678
else
666
- vpic_pulse_irq (vm , entry -> intx .virt_pin );
679
+ vpic_pulse_irq (vm ,
680
+ entry -> ptdev_intr_info .intx .virt_pin );
667
681
break ;
668
682
}
669
683
default :
@@ -694,16 +708,18 @@ void ptdev_softirq(__unused int cpu)
694
708
ptdev_intr_handle_irq (vm , entry );
695
709
else {
696
710
/* TODO: msi destmode check required */
697
- vlapic_intr_msi (vm , entry -> msi .vmsi_addr ,
698
- entry -> msi .vmsi_data );
711
+ vlapic_intr_msi (vm ,
712
+ entry -> ptdev_intr_info .msi .vmsi_addr ,
713
+ entry -> ptdev_intr_info .msi .vmsi_data );
699
714
dev_dbg (ACRN_DBG_PTIRQ ,
700
715
"dev-assign: irq=0x%x MSI VR: 0x%x-0x%x" ,
701
716
dev_to_irq (entry -> node ),
702
- entry -> msi .virt_vector ,
717
+ entry -> ptdev_intr_info . msi .virt_vector ,
703
718
irq_to_vector (dev_to_irq (entry -> node )));
704
719
dev_dbg (ACRN_DBG_PTIRQ ,
705
720
" vmsi_addr: 0x%x vmsi_data: 0x%x" ,
706
- entry -> msi .vmsi_addr , entry -> msi .vmsi_data );
721
+ entry -> ptdev_intr_info .msi .vmsi_addr ,
722
+ entry -> ptdev_intr_info .msi .vmsi_data );
707
723
}
708
724
}
709
725
}
@@ -719,15 +735,15 @@ void ptdev_intx_ack(struct vm *vm, int virt_pin,
719
735
if (!entry )
720
736
return ;
721
737
722
- phys_pin = entry -> intx .phys_pin ;
738
+ phys_pin = entry -> ptdev_intr_info . intx .phys_pin ;
723
739
phys_irq = pin_to_irq (phys_pin );
724
740
if (!irq_is_gsi (phys_irq ))
725
741
return ;
726
742
727
743
/* NOTE: only Level trigger will process EOI/ACK and if we got here
728
744
* means we have this vioapic or vpic or both enabled
729
745
*/
730
- switch (entry -> intx .vpin_src ) {
746
+ switch (entry -> ptdev_intr_info . intx .vpin_src ) {
731
747
case PTDEV_VPIN_IOAPIC :
732
748
vioapic_deassert_irq (vm , virt_pin );
733
749
break ;
@@ -798,9 +814,9 @@ int ptdev_msix_remap(struct vm *vm, uint16_t virt_bdf,
798
814
799
815
/* build physical config MSI, update to info->pmsi_xxx */
800
816
ptdev_build_physical_msi (vm , info , dev_to_vector (entry -> node ));
801
- entry -> msi = * info ;
802
- entry -> msi .virt_vector = info -> vmsi_data & 0xFF ;
803
- entry -> msi .phys_vector = dev_to_vector (entry -> node );
817
+ entry -> ptdev_intr_info . msi = * info ;
818
+ entry -> ptdev_intr_info . msi .virt_vector = info -> vmsi_data & 0xFF ;
819
+ entry -> ptdev_intr_info . msi .phys_vector = dev_to_vector (entry -> node );
804
820
805
821
/* update irq handler according to info in guest */
806
822
ptdev_update_irq_handler (vm , entry );
@@ -809,8 +825,10 @@ int ptdev_msix_remap(struct vm *vm, uint16_t virt_bdf,
809
825
"PCI %x:%x.%x MSI VR[%d] 0x%x->0x%x assigned to vm%d" ,
810
826
(entry -> virt_bdf >> 8 ) & 0xFF ,
811
827
(entry -> virt_bdf >> 3 ) & 0x1F ,
812
- (entry -> virt_bdf ) & 0x7 , entry -> msi .msix_entry_index ,
813
- entry -> msi .virt_vector , entry -> msi .phys_vector ,
828
+ (entry -> virt_bdf ) & 0x7 ,
829
+ entry -> ptdev_intr_info .msi .msix_entry_index ,
830
+ entry -> ptdev_intr_info .msi .virt_vector ,
831
+ entry -> ptdev_intr_info .msi .phys_vector ,
814
832
entry -> vm -> attr .id );
815
833
END :
816
834
return 0 ;
@@ -938,7 +956,7 @@ int ptdev_intx_pin_remap(struct vm *vm, struct ptdev_intx_info *info)
938
956
goto END ;
939
957
940
958
/* phys_pin from physical IOAPIC */
941
- phys_pin = entry -> intx .phys_pin ;
959
+ phys_pin = entry -> ptdev_intr_info . intx .phys_pin ;
942
960
phys_irq = pin_to_irq (phys_pin );
943
961
if (!irq_is_gsi (phys_irq ))
944
962
goto END ;
@@ -952,18 +970,21 @@ int ptdev_intx_pin_remap(struct vm *vm, struct ptdev_intx_info *info)
952
970
dev_dbg (ACRN_DBG_IRQ ,
953
971
"IOAPIC pin=%d pirq=%d vpin=%d switch from %s to %s "
954
972
"vpin=%d for vm%d" , phys_pin , phys_irq ,
955
- entry -> intx .virt_pin ,
956
- entry -> intx .vpin_src ? "vPIC" : "vIOAPIC" ,
957
- entry -> intx .vpin_src ? "vIOPIC" : "vPIC" ,
973
+ entry -> ptdev_intr_info .intx .virt_pin ,
974
+ entry -> ptdev_intr_info .intx .vpin_src ?
975
+ "vPIC" : "vIOAPIC" ,
976
+ entry -> ptdev_intr_info .intx .vpin_src ?
977
+ "vIOPIC" : "vPIC" ,
958
978
info -> virt_pin ,
959
979
entry -> vm -> attr .id );
960
- entry -> intx .vpin_src = info -> vpin_src ;
961
- entry -> intx .virt_pin = info -> virt_pin ;
980
+ entry -> ptdev_intr_info . intx .vpin_src = info -> vpin_src ;
981
+ entry -> ptdev_intr_info . intx .virt_pin = info -> virt_pin ;
962
982
}
963
983
964
984
if (is_entry_active (entry )
965
- && (entry -> intx .vpin_src == PTDEV_VPIN_IOAPIC )) {
966
- vioapic_get_rte (vm , entry -> intx .virt_pin , & rte );
985
+ && (entry -> ptdev_intr_info .intx .vpin_src
986
+ == PTDEV_VPIN_IOAPIC )) {
987
+ vioapic_get_rte (vm , entry -> ptdev_intr_info .intx .virt_pin , & rte );
967
988
if (((uint32_t )rte ) == 0x10000 ) {
968
989
/* disable interrupt */
969
990
GSI_MASK_IRQ (phys_irq );
@@ -972,14 +993,15 @@ int ptdev_intx_pin_remap(struct vm *vm, struct ptdev_intx_info *info)
972
993
"IOAPIC pin=%d pirq=%d deassigned " ,
973
994
phys_pin , phys_irq );
974
995
dev_dbg (ACRN_DBG_IRQ , "from vm%d vIOAPIC vpin=%d" ,
975
- entry -> vm -> attr .id , entry -> intx .virt_pin );
996
+ entry -> vm -> attr .id ,
997
+ entry -> ptdev_intr_info .intx .virt_pin );
976
998
goto END ;
977
999
} else {
978
1000
/*update rte*/
979
1001
activate_physical_ioapic (vm , entry );
980
1002
}
981
1003
} else if (is_entry_active (entry )
982
- && (entry -> intx .vpin_src == PTDEV_VPIN_PIC )) {
1004
+ && (entry -> ptdev_intr_info . intx .vpin_src == PTDEV_VPIN_PIC )) {
983
1005
/* only update here
984
1006
* deactive vPIC entry when IOAPIC take it over
985
1007
*/
@@ -993,8 +1015,9 @@ int ptdev_intx_pin_remap(struct vm *vm, struct ptdev_intx_info *info)
993
1015
dev_dbg (ACRN_DBG_IRQ ,
994
1016
"IOAPIC pin=%d pirq=%d assigned to vm%d %s vpin=%d" ,
995
1017
phys_pin , phys_irq , entry -> vm -> attr .id ,
996
- entry -> intx .vpin_src == PTDEV_VPIN_PIC ?
997
- "vPIC" : "vIOAPIC" , entry -> intx .virt_pin );
1018
+ entry -> ptdev_intr_info .intx .vpin_src == PTDEV_VPIN_PIC ?
1019
+ "vPIC" : "vIOAPIC" ,
1020
+ entry -> ptdev_intr_info .intx .virt_pin );
998
1021
}
999
1022
END :
1000
1023
return 0 ;
@@ -1095,8 +1118,10 @@ static void get_entry_info(struct ptdev_remapping_info *entry, char *type,
1095
1118
if (is_entry_active (entry )) {
1096
1119
if (entry -> type == PTDEV_INTR_MSI ) {
1097
1120
strcpy_s (type , 16 , "MSI" );
1098
- * dest = (entry -> msi .pmsi_addr & 0xFF000 ) >> 12 ;
1099
- if (entry -> msi .pmsi_data & APIC_TRIGMOD_LEVEL )
1121
+ * dest = (entry -> ptdev_intr_info .msi .pmsi_addr & 0xFF000 )
1122
+ >> 12 ;
1123
+ if (entry -> ptdev_intr_info .msi .pmsi_data &
1124
+ APIC_TRIGMOD_LEVEL )
1100
1125
* lvl_tm = true;
1101
1126
else
1102
1127
* lvl_tm = false;
@@ -1105,10 +1130,12 @@ static void get_entry_info(struct ptdev_remapping_info *entry, char *type,
1105
1130
* bdf = entry -> phys_bdf ;
1106
1131
* vbdf = entry -> virt_bdf ;
1107
1132
} else {
1108
- int phys_irq = pin_to_irq (entry -> intx .phys_pin );
1133
+ int phys_irq = pin_to_irq (
1134
+ entry -> ptdev_intr_info .intx .phys_pin );
1109
1135
uint64_t rte = 0 ;
1110
1136
1111
- if (entry -> intx .vpin_src == PTDEV_VPIN_IOAPIC )
1137
+ if (entry -> ptdev_intr_info .intx .vpin_src
1138
+ == PTDEV_VPIN_IOAPIC )
1112
1139
strcpy_s (type , 16 , "IOAPIC" );
1113
1140
else
1114
1141
strcpy_s (type , 16 , "PIC" );
@@ -1118,8 +1145,8 @@ static void get_entry_info(struct ptdev_remapping_info *entry, char *type,
1118
1145
* lvl_tm = true;
1119
1146
else
1120
1147
* lvl_tm = false;
1121
- * pin = entry -> intx .phys_pin ;
1122
- * vpin = entry -> intx .virt_pin ;
1148
+ * pin = entry -> ptdev_intr_info . intx .phys_pin ;
1149
+ * vpin = entry -> ptdev_intr_info . intx .virt_pin ;
1123
1150
* bdf = 0 ;
1124
1151
* vbdf = 0 ;
1125
1152
}
0 commit comments