@@ -77,32 +77,33 @@ static void ptirq_build_physical_msi(struct acrn_vm *vm, struct ptirq_msi_info *
77
77
bool phys ;
78
78
79
79
/* get physical destination cpu mask */
80
- dest = ( uint32_t )( info -> vmsi_addr & MSI_ADDR_DEST ) >> MSI_ADDR_DEST_SHIFT ;
81
- phys = (( info -> vmsi_addr & MSI_ADDR_LOG ) != MSI_ADDR_LOG );
80
+ dest = info -> vmsi_addr . bits . dest_field ;
81
+ phys = (info -> vmsi_addr . bits . dest_mode == MSI_ADDR_DESTMODE_PHYS );
82
82
83
83
vlapic_calcdest (vm , & vdmask , dest , phys , false);
84
84
pdmask = vcpumask2pcpumask (vm , vdmask );
85
85
86
86
/* get physical delivery mode */
87
- delmode = info -> vmsi_data & APIC_DELMODE_MASK ;
88
- if ((delmode != APIC_DELMODE_FIXED ) && (delmode != APIC_DELMODE_LOWPRIO )) {
89
- delmode = APIC_DELMODE_LOWPRIO ;
87
+ delmode = info -> vmsi_data . bits . delivery_mode ;
88
+ if ((delmode != MSI_DATA_DELMODE_FIXED ) && (delmode != MSI_DATA_DELMODE_LOPRI )) {
89
+ delmode = MSI_DATA_DELMODE_LOPRI ;
90
90
}
91
91
92
92
/* update physical delivery mode & vector */
93
93
info -> pmsi_data = info -> vmsi_data ;
94
- info -> pmsi_data &= ~ 0x7FFU ;
95
- info -> pmsi_data |= delmode | vector ;
94
+ info -> pmsi_data . bits . delivery_mode = delmode ;
95
+ info -> pmsi_data . bits . vector = vector ;
96
96
97
97
dest_mask = calculate_logical_dest_mask (pdmask );
98
98
/* update physical dest mode & dest field */
99
99
info -> pmsi_addr = info -> vmsi_addr ;
100
- info -> pmsi_addr &= ~0xFF00CU ;
101
- info -> pmsi_addr |= (dest_mask << MSI_ADDR_DEST_SHIFT ) | MSI_ADDR_RH | MSI_ADDR_LOG ;
100
+ info -> pmsi_addr .bits .dest_mode = MSI_ADDR_DESTMODE_LOGICAL ;
101
+ info -> pmsi_addr .bits .rh = MSI_ADDR_RH ;
102
+ info -> pmsi_addr .bits .dest_field = dest_mask ;
102
103
103
104
dev_dbg (ACRN_DBG_IRQ , "MSI addr:data = 0x%llx:%x(V) -> 0x%llx:%x(P)" ,
104
- info -> vmsi_addr , info -> vmsi_data ,
105
- info -> pmsi_addr , info -> pmsi_data );
105
+ info -> vmsi_addr . full , info -> vmsi_data . full ,
106
+ info -> pmsi_addr . full , info -> pmsi_data . full );
106
107
}
107
108
108
109
static union ioapic_rte
@@ -442,14 +443,14 @@ void ptirq_softirq(uint16_t pcpu_id)
442
443
} else {
443
444
if (msi != NULL ) {
444
445
/* TODO: msi destmode check required */
445
- (void )vlapic_intr_msi (vm , msi -> vmsi_addr , msi -> vmsi_data );
446
+ (void )vlapic_intr_msi (vm , msi -> vmsi_addr . full , msi -> vmsi_data . full );
446
447
dev_dbg (ACRN_DBG_PTIRQ , "dev-assign: irq=0x%x MSI VR: 0x%x-0x%x" ,
447
448
entry -> allocated_pirq ,
448
- msi -> vmsi_data & 0xFFU ,
449
+ msi -> vmsi_data . bits . vector ,
449
450
irq_to_vector (entry -> allocated_pirq ));
450
451
dev_dbg (ACRN_DBG_PTIRQ , " vmsi_addr: 0x%llx vmsi_data: 0x%x" ,
451
- msi -> vmsi_addr ,
452
- msi -> vmsi_data );
452
+ msi -> vmsi_addr . full ,
453
+ msi -> vmsi_data . full );
453
454
}
454
455
}
455
456
}
@@ -534,16 +535,16 @@ int32_t ptirq_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf,
534
535
spinlock_release (& ptdev_lock );
535
536
536
537
if (entry != NULL ) {
537
- if (is_entry_active (entry ) && (info -> vmsi_data == 0U )) {
538
+ if (is_entry_active (entry ) && (info -> vmsi_data . full == 0U )) {
538
539
/* handle destroy case */
539
- info -> pmsi_data = 0U ;
540
+ info -> pmsi_data . full = 0U ;
540
541
} else {
541
542
/* build physical config MSI, update to info->pmsi_xxx */
542
543
ptirq_build_physical_msi (vm , info , irq_to_vector (entry -> allocated_pirq ));
543
544
entry -> msi = * info ;
544
545
dev_dbg (ACRN_DBG_IRQ , "PCI %x:%x.%x MSI VR[%d] 0x%x->0x%x assigned to vm%d" ,
545
546
pci_bus (virt_bdf ), pci_slot (virt_bdf ), pci_func (virt_bdf ), entry_nr ,
546
- info -> vmsi_data & 0xFFU , irq_to_vector (entry -> allocated_pirq ), entry -> vm -> vm_id );
547
+ info -> vmsi_data . bits . vector , irq_to_vector (entry -> allocated_pirq ), entry -> vm -> vm_id );
547
548
}
548
549
ret = 0 ;
549
550
}
0 commit comments