@@ -47,19 +47,6 @@ ptirq_lookup_entry_by_sid(uint32_t intr_type,
47
47
return entry_found ;
48
48
}
49
49
50
- static inline struct ptirq_remapping_info *
51
- ptirq_lookup_entry_by_vpin (const struct acrn_vm * vm , uint32_t virt_pin , bool pic_pin )
52
- {
53
- struct ptirq_remapping_info * entry ;
54
-
55
- if (pic_pin ) {
56
- entry = vm -> arch_vm .vpic .vpin_to_pt_entry [virt_pin ];
57
- } else {
58
- entry = vm -> arch_vm .vioapic .vpin_to_pt_entry [virt_pin ];
59
- }
60
- return entry ;
61
- }
62
-
63
50
static uint32_t calculate_logical_dest_mask (uint64_t pdmask )
64
51
{
65
52
uint32_t dest_mask = 0UL ;
@@ -356,23 +343,21 @@ remove_msix_remapping(const struct acrn_vm *vm, uint16_t virt_bdf, uint32_t entr
356
343
* - if the entry already be added by other vm, return NULL
357
344
*/
358
345
static struct ptirq_remapping_info * add_intx_remapping (struct acrn_vm * vm , uint32_t virt_pin ,
359
- uint32_t phys_pin , bool pic_pin )
346
+ uint32_t phys_pin , enum intx_ctlr vpin_ctlr )
360
347
{
361
348
struct ptirq_remapping_info * entry = NULL ;
362
- bool entry_is_updated = true;
363
- enum intx_ctlr vpin_ctlr = pic_pin ? INTX_CTLR_PIC : INTX_CTLR_IOAPIC ;
364
349
DEFINE_INTX_SID (phys_sid , phys_pin , INTX_CTLR_IOAPIC );
365
350
DEFINE_INTX_SID (virt_sid , virt_pin , vpin_ctlr );
366
351
uint32_t phys_irq = ioapic_pin_to_irq (phys_pin );
367
352
368
- if (((! pic_pin ) && (virt_pin >= vioapic_pincount (vm ))) || (pic_pin && (virt_pin >= vpic_pincount ()))) {
353
+ if (((vpin_ctlr == INTX_CTLR_IOAPIC ) && (virt_pin >= vioapic_pincount (vm ))) || (( vpin_ctlr == INTX_CTLR_PIC ) && (virt_pin >= vpic_pincount ()))) {
369
354
pr_err ("ptirq_add_intx_remapping fails!\n" );
370
355
} else if (!ioapic_irq_is_gsi (phys_irq )) {
371
356
pr_err ("%s, invalid phys_pin: %d <-> irq: 0x%x is not a GSI\n" , __func__ , phys_pin , phys_irq );
372
357
} else {
373
358
entry = ptirq_lookup_entry_by_sid (PTDEV_INTR_INTX , & phys_sid , NULL );
374
359
if (entry == NULL ) {
375
- if (ptirq_lookup_entry_by_vpin ( vm , virt_pin , pic_pin ) == NULL ) {
360
+ if (ptirq_lookup_entry_by_sid ( PTDEV_INTR_INTX , & virt_sid , vm ) == NULL ) {
376
361
entry = ptirq_alloc_entry (vm , PTDEV_INTR_INTX );
377
362
if (entry != NULL ) {
378
363
entry -> phys_sid .value = phys_sid .value ;
@@ -401,15 +386,12 @@ static struct ptirq_remapping_info *add_intx_remapping(struct acrn_vm *vm, uint3
401
386
} else {
402
387
/* The mapping has already been added to the VM. No action
403
388
* required. */
404
- entry_is_updated = false;
405
389
}
406
390
407
- if ((entry != NULL ) && entry_is_updated ) {
408
- if (pic_pin ) {
409
- vm -> arch_vm .vpic .vpin_to_pt_entry [virt_pin ] = entry ;
410
- } else {
411
- vm -> arch_vm .vioapic .vpin_to_pt_entry [virt_pin ] = entry ;
412
- }
391
+ /*
392
+ * ptirq entry is either created or transferred from SOS VM to Post-launched VM
393
+ */
394
+ if (entry != NULL ) {
413
395
dev_dbg (DBG_LEVEL_IRQ , "VM%d INTX add pin mapping vpin%d:ppin%d" ,
414
396
entry -> vm -> vm_id , virt_pin , phys_pin );
415
397
}
@@ -419,16 +401,17 @@ static struct ptirq_remapping_info *add_intx_remapping(struct acrn_vm *vm, uint3
419
401
}
420
402
421
403
/* deactive & remove mapping entry of vpin for vm */
422
- static void remove_intx_remapping (struct acrn_vm * vm , uint32_t virt_pin , bool pic_pin )
404
+ static void remove_intx_remapping (const struct acrn_vm * vm , uint32_t virt_pin , enum intx_ctlr vpin_ctlr )
423
405
{
424
406
uint32_t phys_irq ;
425
407
struct ptirq_remapping_info * entry ;
426
408
struct intr_source intr_src ;
409
+ DEFINE_INTX_SID (virt_sid , virt_pin , vpin_ctlr );
427
410
428
- if (((! pic_pin ) && (virt_pin >= vioapic_pincount (vm ))) || (pic_pin && (virt_pin >= vpic_pincount ()))) {
411
+ if (((vpin_ctlr == INTX_CTLR_IOAPIC ) && (virt_pin >= vioapic_pincount (vm ))) || (( vpin_ctlr == INTX_CTLR_PIC ) && (virt_pin >= vpic_pincount ()))) {
429
412
pr_err ("virtual irq pin is invalid!\n" );
430
413
} else {
431
- entry = ptirq_lookup_entry_by_vpin ( vm , virt_pin , pic_pin );
414
+ entry = ptirq_lookup_entry_by_sid ( PTDEV_INTR_INTX , & virt_sid , vm );
432
415
if (entry != NULL ) {
433
416
if (is_entry_active (entry )) {
434
417
phys_irq = entry -> allocated_pirq ;
@@ -442,18 +425,12 @@ static void remove_intx_remapping(struct acrn_vm *vm, uint32_t virt_pin, bool pi
442
425
dmar_free_irte (intr_src , (uint16_t )phys_irq );
443
426
dev_dbg (DBG_LEVEL_IRQ ,
444
427
"deactive %s intx entry:ppin=%d, pirq=%d " ,
445
- pic_pin ? "vPIC" : "vIOAPIC" ,
428
+ ( vpin_ctlr == INTX_CTLR_PIC ) ? "vPIC" : "vIOAPIC" ,
446
429
entry -> phys_sid .intx_id .pin , phys_irq );
447
430
dev_dbg (DBG_LEVEL_IRQ , "from vm%d vpin=%d\n" ,
448
431
entry -> vm -> vm_id , virt_pin );
449
432
}
450
433
451
- if (pic_pin ) {
452
- vm -> arch_vm .vpic .vpin_to_pt_entry [virt_pin ] = NULL ;
453
- } else {
454
- vm -> arch_vm .vioapic .vpin_to_pt_entry [virt_pin ] = NULL ;
455
- }
456
-
457
434
ptirq_release_entry (entry );
458
435
}
459
436
}
@@ -560,9 +537,9 @@ void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ctlr vpin_c
560
537
{
561
538
uint32_t phys_irq ;
562
539
struct ptirq_remapping_info * entry ;
563
- bool pic_pin = ( vpin_ctlr == INTX_CTLR_PIC );
540
+ DEFINE_INTX_SID ( virt_sid , virt_pin , vpin_ctlr );
564
541
565
- entry = ptirq_lookup_entry_by_vpin ( vm , virt_pin , pic_pin );
542
+ entry = ptirq_lookup_entry_by_sid ( PTDEV_INTR_INTX , & virt_sid , vm );
566
543
if (entry != NULL ) {
567
544
phys_irq = entry -> allocated_pirq ;
568
545
@@ -705,9 +682,8 @@ int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ct
705
682
{
706
683
int32_t status = 0 ;
707
684
struct ptirq_remapping_info * entry = NULL ;
708
- bool need_switch_vpin_ctlr = false;
709
685
DEFINE_INTX_SID (virt_sid , virt_pin , vpin_ctlr );
710
- bool pic_pin = ( vpin_ctlr == INTX_CTLR_PIC );
686
+ DEFINE_INTX_SID ( alt_virt_sid , virt_pin , vpin_ctlr );
711
687
712
688
/*
713
689
* virt pin could come from vpic master, vpic slave or vioapic
@@ -721,16 +697,10 @@ int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ct
721
697
*/
722
698
723
699
/* no remap for vuart intx */
724
- if (is_vuart_intx (vm , virt_sid .intx_id .pin )) {
725
- status = - ENODEV ;
726
- }
727
-
728
- if ((status != 0 ) || (pic_pin && (virt_pin >= NR_VPIC_PINS_TOTAL ))) {
729
- status = - EINVAL ;
730
- } else {
700
+ if (!is_vuart_intx (vm , virt_sid .intx_id .pin )) {
731
701
/* query if we have virt to phys mapping */
732
702
spinlock_obtain (& ptdev_lock );
733
- entry = ptirq_lookup_entry_by_vpin ( vm , virt_pin , pic_pin );
703
+ entry = ptirq_lookup_entry_by_sid ( PTDEV_INTR_INTX , & virt_sid , vm );
734
704
if (entry == NULL ) {
735
705
if (is_sos_vm (vm )) {
736
706
@@ -744,9 +714,23 @@ int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ct
744
714
if (virt_pin < NR_LEGACY_PIN ) {
745
715
uint32_t vpin = get_pic_pin_from_ioapic_pin (virt_pin );
746
716
747
- entry = ptirq_lookup_entry_by_vpin (vm , vpin , !pic_pin );
717
+ if (vpin_ctlr == INTX_CTLR_PIC ) {
718
+ alt_virt_sid .intx_id .ctlr = INTX_CTLR_IOAPIC ;
719
+ } else {
720
+ alt_virt_sid .intx_id .ctlr = INTX_CTLR_PIC ;
721
+ }
722
+ alt_virt_sid .intx_id .pin = vpin ;
723
+
724
+ entry = ptirq_lookup_entry_by_sid (PTDEV_INTR_INTX , & alt_virt_sid , vm );
748
725
if (entry != NULL ) {
749
- need_switch_vpin_ctlr = true;
726
+ entry -> virt_sid .value = virt_sid .value ;
727
+ dev_dbg (DBG_LEVEL_IRQ ,
728
+ "IOAPIC pin=%hhu pirq=%u vpin=%d switch from %s to %s vpin=%d for vm%d" ,
729
+ entry -> phys_sid .intx_id .pin ,
730
+ entry -> allocated_pirq , entry -> virt_sid .intx_id .pin ,
731
+ (vpin_ctlr == INTX_CTLR_IOAPIC ) ? "vPIC" : "vIOAPIC" ,
732
+ (vpin_ctlr == INTX_CTLR_IOAPIC ) ? "vIOPIC" : "vPIC" ,
733
+ virt_pin , entry -> vm -> vm_id );
750
734
}
751
735
}
752
736
@@ -755,10 +739,10 @@ int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ct
755
739
uint32_t phys_pin = virt_pin ;
756
740
757
741
/* fix vPIC pin to correct native IOAPIC pin */
758
- if (pic_pin ) {
742
+ if (vpin_ctlr == INTX_CTLR_PIC ) {
759
743
phys_pin = get_pic_pin_from_ioapic_pin (virt_pin );
760
744
}
761
- entry = add_intx_remapping (vm , virt_pin , phys_pin , pic_pin );
745
+ entry = add_intx_remapping (vm , virt_pin , phys_pin , vpin_ctlr );
762
746
if (entry == NULL ) {
763
747
pr_err ("%s, add intx remapping failed" ,
764
748
__func__ );
@@ -774,22 +758,11 @@ int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ct
774
758
}
775
759
}
776
760
spinlock_release (& ptdev_lock );
761
+ } else {
762
+ status = - EINVAL ;
777
763
}
778
764
779
765
if (status == 0 ) {
780
- spinlock_obtain (& ptdev_lock );
781
- /* if vpin source need switch */
782
- if ((need_switch_vpin_ctlr ) && (entry != NULL )) {
783
- dev_dbg (DBG_LEVEL_IRQ ,
784
- "IOAPIC pin=%hhu pirq=%u vpin=%d switch from %s to %s vpin=%d for vm%d" ,
785
- entry -> phys_sid .intx_id .pin ,
786
- entry -> allocated_pirq , entry -> virt_sid .intx_id .pin ,
787
- (vpin_ctlr == INTX_CTLR_IOAPIC ) ? "vPIC" : "vIOAPIC" ,
788
- (vpin_ctlr == INTX_CTLR_IOAPIC ) ? "vIOPIC" : "vPIC" ,
789
- virt_pin , entry -> vm -> vm_id );
790
- entry -> virt_sid .value = virt_sid .value ;
791
- }
792
- spinlock_release (& ptdev_lock );
793
766
activate_physical_ioapic (vm , entry );
794
767
}
795
768
@@ -807,9 +780,10 @@ int32_t ptirq_intx_pin_remap(struct acrn_vm *vm, uint32_t virt_pin, enum intx_ct
807
780
int32_t ptirq_add_intx_remapping (struct acrn_vm * vm , uint32_t virt_pin , uint32_t phys_pin , bool pic_pin )
808
781
{
809
782
struct ptirq_remapping_info * entry ;
783
+ enum intx_ctlr vpin_ctlr = pic_pin ? INTX_CTLR_PIC : INTX_CTLR_IOAPIC ;
810
784
811
785
spinlock_obtain (& ptdev_lock );
812
- entry = add_intx_remapping (vm , virt_pin , phys_pin , pic_pin );
786
+ entry = add_intx_remapping (vm , virt_pin , phys_pin , vpin_ctlr );
813
787
spinlock_release (& ptdev_lock );
814
788
815
789
return (entry != NULL ) ? 0 : - ENODEV ;
@@ -818,10 +792,12 @@ int32_t ptirq_add_intx_remapping(struct acrn_vm *vm, uint32_t virt_pin, uint32_t
818
792
/*
819
793
* @pre vm != NULL
820
794
*/
821
- void ptirq_remove_intx_remapping (struct acrn_vm * vm , uint32_t virt_pin , bool pic_pin )
795
+ void ptirq_remove_intx_remapping (const struct acrn_vm * vm , uint32_t virt_pin , bool pic_pin )
822
796
{
797
+ enum intx_ctlr vpin_ctlr = pic_pin ? INTX_CTLR_PIC : INTX_CTLR_IOAPIC ;
798
+
823
799
spinlock_obtain (& ptdev_lock );
824
- remove_intx_remapping (vm , virt_pin , pic_pin );
800
+ remove_intx_remapping (vm , virt_pin , vpin_ctlr );
825
801
spinlock_release (& ptdev_lock );
826
802
}
827
803
0 commit comments