mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-07-03 18:46:33 +00:00
hv:Rename ptdev to ptirq for some APIs
-- Rename the fowllowing APIs: ptdev_intx_pin_remap --> ptirq_intx_pin_remap ptdev_msix_remap --> ptirq_msix_remap ptdev_add_intx_remapping --> ptirq_add_intx_remapping ptdev_remove_intx_remapping --> ptirq_remove_intx_remapping ptdev_add_msix_remapping --> ptirq_add_msix_remapping ptdev_remove_msix_remapping --> ptirq_remove_msix_remapping ptdev_intx_ack --> ptirq_intx_ack ptdev_lookup_entry_by_sid --> ptirq_lookup_entry_by_sid ptdev_lookup_entry_by_vpin --> ptirq_lookup_entry_by_vpin ptdev_build_physical_msi --> ptirq_build_physical_msi ptdev_build_physical_rte --> ptirq_build_physical_rte alloc_entry --> ptirq_alloc_entry release_entry --> ptirq_release_one_entry ptdev_activate_entry --> ptirq_activate_entry ptdev_deactivate_entry --> ptirq_deactivate_entry ptdev_intr_handle_irq --> ptirq_handle_intx ptdev_softirq --> ptirq_softirq ptdev_enqueue_softirq --> ptirq_enqueue_softirq ptdev_dequeue_softirq --> ptirq_dequeue_softirq get_vm_ptdev_intr_data --> ptirq_get_intr_data alloc_ptdev_entry_id --> ptirq_alloc_entry_id ptdev_intr_delay_callback --> ptirq_intr_delay_callback ptdev_dequeue_softirq --> ptirq_dequeue_softirq ptdev_interrupt_handler --> ptirq_interrupt_handler -- Merge 'ptdev_release_all_entries' and 'release_all_entries' to 'ptirq_release_all_entries' v2-->v3: Rename ptirq_release_one_entry to ptirq_release_entry v1-->v2: still use ptdev_init instead of ptirq_init Tracked-On: #861 Signed-off-by: Mingqiang Chi <mingqiang.chi@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
5b43aa8a65
commit
5dcfc1336b
@ -136,7 +136,7 @@ Interrupt Remapping
|
||||
|
||||
When the physical interrupt of a passthrough device happens, hypervisor has
|
||||
to distribute it to the relevant VM according to interrupt remapping
|
||||
relationships. The structure ``ptdev_remapping_info`` is used to define
|
||||
relationships. The structure ``ptirq_remapping_info`` is used to define
|
||||
the subordination relation between physical interrupt and VM, the
|
||||
virtual destination, etc. See the following figure for details:
|
||||
|
||||
@ -186,7 +186,7 @@ the following steps:
|
||||
- VM exit happens and the trapped vCPU is the target where the interrupt
|
||||
will be injected.
|
||||
- Hypervisor will handle the interrupt and translate the vector
|
||||
according to ptdev_remapping_info.
|
||||
according to ptirq_remapping_info.
|
||||
- Hypervisor delivers the interrupt to UOS.
|
||||
|
||||
When the SOS needs to use the physical device, the passthrough is also
|
||||
@ -198,7 +198,7 @@ active because the SOS is the first VM. The detail steps are:
|
||||
- When physical interrupt is trapped, an exception will happen after VMCS
|
||||
has been set.
|
||||
- Hypervisor will handle the vm exit issue according to
|
||||
ptdev_remapping_info and translates the vector.
|
||||
ptirq_remapping_info and translates the vector.
|
||||
- The interrupt will be injected the same as a virtual interrupt.
|
||||
|
||||
ACPI Virtualization
|
||||
@ -234,28 +234,28 @@ Data structures and interfaces
|
||||
The following APIs are provided to initialize interrupt remapping for
|
||||
SOS:
|
||||
|
||||
.. doxygenfunction:: ptdev_intx_pin_remap
|
||||
.. doxygenfunction:: ptirq_intx_pin_remap
|
||||
:project: Project ACRN
|
||||
|
||||
.. doxygenfunction:: ptdev_msix_remap
|
||||
.. doxygenfunction:: ptirq_msix_remap
|
||||
:project: Project ACRN
|
||||
|
||||
The following APIs are provided to manipulate the interrupt remapping
|
||||
for UOS.
|
||||
|
||||
.. doxygenfunction:: ptdev_add_intx_remapping
|
||||
.. doxygenfunction:: ptirq_add_intx_remapping
|
||||
:project: Project ACRN
|
||||
|
||||
.. doxygenfunction:: ptdev_remove_intx_remapping
|
||||
.. doxygenfunction:: ptirq_remove_intx_remapping
|
||||
:project: Project ACRN
|
||||
|
||||
.. doxygenfunction:: ptdev_add_msix_remapping
|
||||
.. doxygenfunction:: ptirq_add_msix_remapping
|
||||
:project: Project ACRN
|
||||
|
||||
.. doxygenfunction:: ptdev_remove_msix_remapping
|
||||
.. doxygenfunction:: ptirq_remove_msix_remapping
|
||||
:project: Project ACRN
|
||||
|
||||
The following APIs are provided to acknowledge a virtual interrupt.
|
||||
|
||||
.. doxygenfunction:: ptdev_intx_ack
|
||||
.. doxygenfunction:: ptirq_intx_ack
|
||||
:project: Project ACRN
|
||||
|
@ -16,7 +16,7 @@
|
||||
* vm must not be NULL when lookup by virtual sid.
|
||||
*/
|
||||
static inline struct ptirq_remapping_info *
|
||||
ptdev_lookup_entry_by_sid(uint32_t intr_type,
|
||||
ptirq_lookup_entry_by_sid(uint32_t intr_type,
|
||||
const union source_id *sid,const struct acrn_vm *vm)
|
||||
{
|
||||
uint16_t idx;
|
||||
@ -40,7 +40,7 @@ ptdev_lookup_entry_by_sid(uint32_t intr_type,
|
||||
}
|
||||
|
||||
static inline struct ptirq_remapping_info *
|
||||
ptdev_lookup_entry_by_vpin(struct acrn_vm *vm, uint8_t virt_pin, bool pic_pin)
|
||||
ptirq_lookup_entry_by_vpin(struct acrn_vm *vm, uint8_t virt_pin, bool pic_pin)
|
||||
{
|
||||
struct ptirq_remapping_info *entry;
|
||||
|
||||
@ -79,7 +79,7 @@ static uint64_t calculate_logical_dest_mask(uint64_t pdmask)
|
||||
return dest_mask;
|
||||
}
|
||||
|
||||
static void ptdev_build_physical_msi(struct acrn_vm *vm, struct ptirq_msi_info *info,
|
||||
static void ptirq_build_physical_msi(struct acrn_vm *vm, struct ptirq_msi_info *info,
|
||||
uint32_t vector)
|
||||
{
|
||||
uint64_t vdmask, pdmask, dest_mask;
|
||||
@ -116,7 +116,7 @@ static void ptdev_build_physical_msi(struct acrn_vm *vm, struct ptirq_msi_info *
|
||||
}
|
||||
|
||||
static union ioapic_rte
|
||||
ptdev_build_physical_rte(struct acrn_vm *vm, struct ptirq_remapping_info *entry)
|
||||
ptirq_build_physical_rte(struct acrn_vm *vm, struct ptirq_remapping_info *entry)
|
||||
{
|
||||
union ioapic_rte rte;
|
||||
uint32_t phys_irq = entry->allocated_pirq;
|
||||
@ -206,14 +206,14 @@ static struct ptirq_remapping_info *add_msix_remapping(struct acrn_vm *vm,
|
||||
DEFINE_MSI_SID(phys_sid, phys_bdf, entry_nr);
|
||||
DEFINE_MSI_SID(virt_sid, virt_bdf, entry_nr);
|
||||
|
||||
entry = ptdev_lookup_entry_by_sid(PTDEV_INTR_MSI, &phys_sid, NULL);
|
||||
entry = ptirq_lookup_entry_by_sid(PTDEV_INTR_MSI, &phys_sid, NULL);
|
||||
if (entry == NULL) {
|
||||
if (ptdev_lookup_entry_by_sid(PTDEV_INTR_MSI, &virt_sid, vm) != NULL) {
|
||||
if (ptirq_lookup_entry_by_sid(PTDEV_INTR_MSI, &virt_sid, vm) != NULL) {
|
||||
pr_err("MSIX re-add vbdf%x", virt_bdf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
entry = alloc_entry(vm, PTDEV_INTR_MSI);
|
||||
entry = ptirq_alloc_entry(vm, PTDEV_INTR_MSI);
|
||||
if (entry == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
@ -221,8 +221,8 @@ static struct ptirq_remapping_info *add_msix_remapping(struct acrn_vm *vm,
|
||||
entry->virt_sid.value = virt_sid.value;
|
||||
|
||||
/* update msi source and active entry */
|
||||
if (ptdev_activate_entry(entry, IRQ_INVALID) < 0) {
|
||||
release_entry(entry);
|
||||
if (ptirq_activate_entry(entry, IRQ_INVALID) < 0) {
|
||||
ptirq_release_entry(entry);
|
||||
entry = NULL;
|
||||
}
|
||||
} else if (entry->vm != vm) {
|
||||
@ -255,14 +255,14 @@ remove_msix_remapping(const struct acrn_vm *vm, uint16_t virt_bdf, uint32_t entr
|
||||
struct ptirq_remapping_info *entry;
|
||||
DEFINE_MSI_SID(virt_sid, virt_bdf, entry_nr);
|
||||
|
||||
entry = ptdev_lookup_entry_by_sid(PTDEV_INTR_MSI, &virt_sid, vm);
|
||||
entry = ptirq_lookup_entry_by_sid(PTDEV_INTR_MSI, &virt_sid, vm);
|
||||
if (entry == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_entry_active(entry)) {
|
||||
/*TODO: disable MSIX device when HV can in future */
|
||||
ptdev_deactivate_entry(entry);
|
||||
ptirq_deactivate_entry(entry);
|
||||
}
|
||||
|
||||
dev_dbg(ACRN_DBG_IRQ,
|
||||
@ -270,7 +270,7 @@ remove_msix_remapping(const struct acrn_vm *vm, uint16_t virt_bdf, uint32_t entr
|
||||
entry->vm->vm_id, virt_bdf,
|
||||
entry->phys_sid.msi_id.bdf, entry_nr);
|
||||
|
||||
release_entry(entry);
|
||||
ptirq_release_entry(entry);
|
||||
|
||||
}
|
||||
|
||||
@ -290,7 +290,7 @@ static struct ptirq_remapping_info *add_intx_remapping(struct acrn_vm *vm, uint8
|
||||
|
||||
if ((!pic_pin && virt_pin >= vioapic_pincount(vm))
|
||||
|| (pic_pin && virt_pin >= vpic_pincount())) {
|
||||
pr_err("ptdev_add_intx_remapping fails!\n");
|
||||
pr_err("ptirq_add_intx_remapping fails!\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -299,13 +299,13 @@ static struct ptirq_remapping_info *add_intx_remapping(struct acrn_vm *vm, uint8
|
||||
return NULL;
|
||||
}
|
||||
|
||||
entry = ptdev_lookup_entry_by_sid(PTDEV_INTR_INTX, &phys_sid, NULL);
|
||||
entry = ptirq_lookup_entry_by_sid(PTDEV_INTR_INTX, &phys_sid, NULL);
|
||||
if (entry == NULL) {
|
||||
if (ptdev_lookup_entry_by_vpin(vm, virt_pin, pic_pin) != NULL) {
|
||||
if (ptirq_lookup_entry_by_vpin(vm, virt_pin, pic_pin) != NULL) {
|
||||
pr_err("INTX re-add vpin %d", virt_pin);
|
||||
return NULL;
|
||||
}
|
||||
entry = alloc_entry(vm, PTDEV_INTR_INTX);
|
||||
entry = ptirq_alloc_entry(vm, PTDEV_INTR_INTX);
|
||||
if (entry == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
@ -313,8 +313,8 @@ static struct ptirq_remapping_info *add_intx_remapping(struct acrn_vm *vm, uint8
|
||||
entry->virt_sid.value = virt_sid.value;
|
||||
|
||||
/* activate entry */
|
||||
if (ptdev_activate_entry(entry, phys_irq) < 0) {
|
||||
release_entry(entry);
|
||||
if (ptirq_activate_entry(entry, phys_irq) < 0) {
|
||||
ptirq_release_entry(entry);
|
||||
entry = NULL;
|
||||
}
|
||||
} else if (entry->vm != vm) {
|
||||
@ -354,7 +354,7 @@ static void remove_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, bool pic
|
||||
return;
|
||||
}
|
||||
|
||||
entry = ptdev_lookup_entry_by_vpin(vm, virt_pin, pic_pin);
|
||||
entry = ptirq_lookup_entry_by_vpin(vm, virt_pin, pic_pin);
|
||||
if (entry == NULL) {
|
||||
return;
|
||||
}
|
||||
@ -363,7 +363,7 @@ static void remove_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, bool pic
|
||||
/* disable interrupt */
|
||||
gsi_mask_irq(phys_irq);
|
||||
|
||||
ptdev_deactivate_entry(entry);
|
||||
ptirq_deactivate_entry(entry);
|
||||
dev_dbg(ACRN_DBG_IRQ,
|
||||
"deactive %s intx entry:ppin=%d, pirq=%d ",
|
||||
pic_pin ? "vPIC" : "vIOAPIC",
|
||||
@ -378,10 +378,10 @@ static void remove_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, bool pic
|
||||
vm->arch_vm.vioapic.vpin_to_pt_entry[virt_pin] = NULL;
|
||||
}
|
||||
|
||||
release_entry(entry);
|
||||
ptirq_release_entry(entry);
|
||||
}
|
||||
|
||||
static void ptdev_intr_handle_irq(struct acrn_vm *vm,
|
||||
static void ptirq_handle_intx(struct acrn_vm *vm,
|
||||
const struct ptirq_remapping_info *entry)
|
||||
{
|
||||
const union source_id *virt_sid = &entry->virt_sid;
|
||||
@ -446,13 +446,13 @@ static void ptdev_intr_handle_irq(struct acrn_vm *vm,
|
||||
}
|
||||
}
|
||||
|
||||
void ptdev_softirq(uint16_t pcpu_id)
|
||||
void ptirq_softirq(uint16_t pcpu_id)
|
||||
{
|
||||
struct acrn_vcpu *vcpu = (struct acrn_vcpu *)per_cpu(vcpu, pcpu_id);
|
||||
struct acrn_vm *vm = vcpu->vm;
|
||||
|
||||
while (1) {
|
||||
struct ptirq_remapping_info *entry = ptdev_dequeue_softirq(vm);
|
||||
struct ptirq_remapping_info *entry = ptirq_dequeue_softirq(vm);
|
||||
struct ptirq_msi_info *msi;
|
||||
|
||||
if (entry == NULL) {
|
||||
@ -469,7 +469,7 @@ void ptdev_softirq(uint16_t pcpu_id)
|
||||
|
||||
/* handle real request */
|
||||
if (entry->intr_type == PTDEV_INTR_INTX) {
|
||||
ptdev_intr_handle_irq(vm, entry);
|
||||
ptirq_handle_intx(vm, entry);
|
||||
} else {
|
||||
/* TODO: msi destmode check required */
|
||||
(void)vlapic_intr_msi(vm,
|
||||
@ -488,14 +488,14 @@ void ptdev_softirq(uint16_t pcpu_id)
|
||||
}
|
||||
}
|
||||
|
||||
void ptdev_intx_ack(struct acrn_vm *vm, uint8_t virt_pin,
|
||||
void ptirq_intx_ack(struct acrn_vm *vm, uint8_t virt_pin,
|
||||
enum ptirq_vpin_source vpin_src)
|
||||
{
|
||||
uint32_t phys_irq;
|
||||
struct ptirq_remapping_info *entry;
|
||||
bool pic_pin = (vpin_src == PTDEV_VPIN_PIC);
|
||||
|
||||
entry = ptdev_lookup_entry_by_vpin(vm, virt_pin, pic_pin);
|
||||
entry = ptirq_lookup_entry_by_vpin(vm, virt_pin, pic_pin);
|
||||
if (entry == NULL) {
|
||||
return;
|
||||
}
|
||||
@ -535,7 +535,7 @@ void ptdev_intx_ack(struct acrn_vm *vm, uint8_t virt_pin,
|
||||
* entry_nr = 0 means first vector
|
||||
* user must provide bdf and entry_nr
|
||||
*/
|
||||
int ptdev_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf,
|
||||
int ptirq_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf,
|
||||
uint16_t entry_nr, struct ptirq_msi_info *info)
|
||||
{
|
||||
struct ptirq_remapping_info *entry;
|
||||
@ -543,13 +543,13 @@ int ptdev_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf,
|
||||
|
||||
/*
|
||||
* Device Model should pre-hold the mapping entries by calling
|
||||
* ptdev_add_msix_remapping for UOS.
|
||||
* ptirq_add_msix_remapping for UOS.
|
||||
*
|
||||
* For SOS(vm0), it adds the mapping entries at runtime, if the
|
||||
* entry already be held by others, return error.
|
||||
*/
|
||||
spinlock_obtain(&ptdev_lock);
|
||||
entry = ptdev_lookup_entry_by_sid(PTDEV_INTR_MSI, &virt_sid, vm);
|
||||
entry = ptirq_lookup_entry_by_sid(PTDEV_INTR_MSI, &virt_sid, vm);
|
||||
if (entry == NULL) {
|
||||
/* VM0 we add mapping dynamically */
|
||||
if (is_vm0(vm)) {
|
||||
@ -561,7 +561,7 @@ int ptdev_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf,
|
||||
return -ENODEV;
|
||||
}
|
||||
} else {
|
||||
/* ptdev_msix_remap is called by SOS on demand, if
|
||||
/* ptirq_msix_remap is called by SOS on demand, if
|
||||
* failed to find pre-hold mapping, return error to
|
||||
* the caller.
|
||||
*/
|
||||
@ -580,7 +580,7 @@ int ptdev_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf,
|
||||
}
|
||||
|
||||
/* build physical config MSI, update to info->pmsi_xxx */
|
||||
ptdev_build_physical_msi(vm, info, irq_to_vector(entry->allocated_pirq));
|
||||
ptirq_build_physical_msi(vm, info, irq_to_vector(entry->allocated_pirq));
|
||||
entry->msi = *info;
|
||||
|
||||
dev_dbg(ACRN_DBG_IRQ, "PCI %x:%x.%x MSI VR[%d] 0x%x->0x%x assigned to vm%d",
|
||||
@ -602,7 +602,7 @@ static void activate_physical_ioapic(struct acrn_vm *vm,
|
||||
gsi_mask_irq(phys_irq);
|
||||
|
||||
/* build physical IOAPIC RTE */
|
||||
rte = ptdev_build_physical_rte(vm, entry);
|
||||
rte = ptirq_build_physical_rte(vm, entry);
|
||||
intr_mask = (uint32_t)(rte.full & IOAPIC_RTE_INTMASK);
|
||||
|
||||
/* update irq trigger mode according to info in guest */
|
||||
@ -623,7 +623,7 @@ static void activate_physical_ioapic(struct acrn_vm *vm,
|
||||
/* Main entry for PCI/Legacy device assignment with INTx, calling from vIOAPIC
|
||||
* or vPIC
|
||||
*/
|
||||
int ptdev_intx_pin_remap(struct acrn_vm *vm, uint8_t virt_pin,
|
||||
int ptirq_intx_pin_remap(struct acrn_vm *vm, uint8_t virt_pin,
|
||||
enum ptirq_vpin_source vpin_src)
|
||||
{
|
||||
struct ptirq_remapping_info *entry;
|
||||
@ -636,7 +636,7 @@ int ptdev_intx_pin_remap(struct acrn_vm *vm, uint8_t virt_pin,
|
||||
* while phys pin is always means for physical IOAPIC.
|
||||
*
|
||||
* Device Model should pre-hold the mapping entries by calling
|
||||
* ptdev_add_intx_remapping for UOS.
|
||||
* ptirq_add_intx_remapping for UOS.
|
||||
*
|
||||
* For SOS(vm0), it adds the mapping entries at runtime, if the
|
||||
* entry already be held by others, return error.
|
||||
@ -651,7 +651,7 @@ int ptdev_intx_pin_remap(struct acrn_vm *vm, uint8_t virt_pin,
|
||||
|
||||
/* query if we have virt to phys mapping */
|
||||
spinlock_obtain(&ptdev_lock);
|
||||
entry = ptdev_lookup_entry_by_vpin(vm, virt_pin, pic_pin);
|
||||
entry = ptirq_lookup_entry_by_vpin(vm, virt_pin, pic_pin);
|
||||
if (entry == NULL) {
|
||||
if (is_vm0(vm)) {
|
||||
|
||||
@ -665,7 +665,7 @@ int ptdev_intx_pin_remap(struct acrn_vm *vm, uint8_t virt_pin,
|
||||
if (virt_pin < NR_LEGACY_PIN) {
|
||||
uint8_t vpin = pic_ioapic_pin_map[virt_pin];
|
||||
|
||||
entry = ptdev_lookup_entry_by_vpin(vm, vpin, !pic_pin);
|
||||
entry = ptirq_lookup_entry_by_vpin(vm, vpin, !pic_pin);
|
||||
if (entry != NULL) {
|
||||
need_switch_vpin_src = true;
|
||||
}
|
||||
@ -689,7 +689,7 @@ int ptdev_intx_pin_remap(struct acrn_vm *vm, uint8_t virt_pin,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* ptdev_intx_pin_remap is triggered by vPIC/vIOAPIC
|
||||
/* ptirq_intx_pin_remap is triggered by vPIC/vIOAPIC
|
||||
* everytime a pin get unmask, here filter out pins
|
||||
* not get mapped.
|
||||
*/
|
||||
@ -729,7 +729,7 @@ END:
|
||||
* - currently, one phys_pin can only be held by one pin source (vPIC or
|
||||
* vIOAPIC)
|
||||
*/
|
||||
int ptdev_add_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, uint8_t phys_pin,
|
||||
int ptirq_add_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, uint8_t phys_pin,
|
||||
bool pic_pin)
|
||||
{
|
||||
struct ptirq_remapping_info *entry;
|
||||
@ -744,7 +744,7 @@ int ptdev_add_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, uint8_t phys_
|
||||
/*
|
||||
* @pre vm != NULL
|
||||
*/
|
||||
void ptdev_remove_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, bool pic_pin)
|
||||
void ptirq_remove_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, bool pic_pin)
|
||||
{
|
||||
spinlock_obtain(&ptdev_lock);
|
||||
remove_intx_remapping(vm, virt_pin, pic_pin);
|
||||
@ -756,7 +756,7 @@ void ptdev_remove_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, bool pic_
|
||||
* - the entry is identified by phys_bdf:msi_idx:
|
||||
* one entry vs. one phys_bdf:msi_idx
|
||||
*/
|
||||
int ptdev_add_msix_remapping(struct acrn_vm *vm, uint16_t virt_bdf,
|
||||
int ptirq_add_msix_remapping(struct acrn_vm *vm, uint16_t virt_bdf,
|
||||
uint16_t phys_bdf, uint32_t vector_count)
|
||||
{
|
||||
struct ptirq_remapping_info *entry;
|
||||
@ -777,7 +777,7 @@ int ptdev_add_msix_remapping(struct acrn_vm *vm, uint16_t virt_bdf,
|
||||
/*
|
||||
* @pre vm != NULL
|
||||
*/
|
||||
void ptdev_remove_msix_remapping(const struct acrn_vm *vm, uint16_t virt_bdf,
|
||||
void ptirq_remove_msix_remapping(const struct acrn_vm *vm, uint16_t virt_bdf,
|
||||
uint32_t vector_count)
|
||||
{
|
||||
uint32_t i;
|
||||
|
@ -870,10 +870,10 @@ int32_t hcall_set_ptdev_intr_info(struct acrn_vm *vm, uint16_t vmid, uint64_t pa
|
||||
#endif
|
||||
|
||||
if (irq.type == IRQ_INTX) {
|
||||
ret = ptdev_add_intx_remapping(target_vm, irq.is.intx.virt_pin,
|
||||
ret = ptirq_add_intx_remapping(target_vm, irq.is.intx.virt_pin,
|
||||
irq.is.intx.phys_pin, irq.is.intx.pic_pin);
|
||||
} else if ((irq.type == IRQ_MSI) || (irq.type == IRQ_MSIX)) {
|
||||
ret = ptdev_add_msix_remapping(target_vm,
|
||||
ret = ptirq_add_msix_remapping(target_vm,
|
||||
irq.virt_bdf, irq.phys_bdf,
|
||||
irq.is.msix.vector_cnt);
|
||||
} else {
|
||||
@ -914,7 +914,7 @@ hcall_reset_ptdev_intr_info(struct acrn_vm *vm, uint16_t vmid, uint64_t param)
|
||||
}
|
||||
|
||||
if (irq.type == IRQ_INTX) {
|
||||
ptdev_remove_intx_remapping(target_vm,
|
||||
ptirq_remove_intx_remapping(target_vm,
|
||||
irq.is.intx.virt_pin,
|
||||
irq.is.intx.pic_pin);
|
||||
} else if ((irq.type == IRQ_MSI) || (irq.type == IRQ_MSIX)) {
|
||||
@ -927,7 +927,7 @@ hcall_reset_ptdev_intr_info(struct acrn_vm *vm, uint16_t vmid, uint64_t param)
|
||||
vpci_reset_ptdev_intr_info(target_vm, irq.virt_bdf, irq.phys_bdf);
|
||||
#endif
|
||||
|
||||
ptdev_remove_msix_remapping(target_vm,
|
||||
ptirq_remove_msix_remapping(target_vm,
|
||||
irq.virt_bdf,
|
||||
irq.is.msix.vector_cnt);
|
||||
} else {
|
||||
@ -1076,7 +1076,7 @@ int32_t hcall_vm_intr_monitor(struct acrn_vm *vm, uint16_t vmid, uint64_t param)
|
||||
|
||||
switch (intr_hdr->cmd) {
|
||||
case INTR_CMD_GET_DATA:
|
||||
intr_hdr->buf_cnt = get_vm_ptdev_intr_data(target_vm,
|
||||
intr_hdr->buf_cnt = ptirq_get_intr_data(target_vm,
|
||||
intr_hdr->buffer, intr_hdr->buf_cnt);
|
||||
break;
|
||||
|
||||
|
@ -18,7 +18,7 @@ bool is_entry_active(const struct ptirq_remapping_info *entry)
|
||||
return atomic_load32(&entry->active) == ACTIVE_FLAG;
|
||||
}
|
||||
|
||||
static inline uint16_t alloc_ptdev_entry_id(void)
|
||||
static inline uint16_t ptirq_alloc_entry_id(void)
|
||||
{
|
||||
uint16_t id = (uint16_t)ffz64_ex(ptirq_entry_bitmaps, CONFIG_MAX_PT_IRQ_ENTRIES);
|
||||
|
||||
@ -32,7 +32,7 @@ static inline uint16_t alloc_ptdev_entry_id(void)
|
||||
return INVALID_PTDEV_ENTRY_ID;
|
||||
}
|
||||
|
||||
static void ptdev_enqueue_softirq(struct ptirq_remapping_info *entry)
|
||||
static void ptirq_enqueue_softirq(struct ptirq_remapping_info *entry)
|
||||
{
|
||||
uint64_t rflags;
|
||||
|
||||
@ -48,16 +48,15 @@ static void ptdev_enqueue_softirq(struct ptirq_remapping_info *entry)
|
||||
fire_softirq(SOFTIRQ_PTDEV);
|
||||
}
|
||||
|
||||
static void ptdev_intr_delay_callback(void *data)
|
||||
static void ptirq_intr_delay_callback(void *data)
|
||||
{
|
||||
struct ptirq_remapping_info *entry =
|
||||
(struct ptirq_remapping_info *) data;
|
||||
|
||||
ptdev_enqueue_softirq(entry);
|
||||
ptirq_enqueue_softirq(entry);
|
||||
}
|
||||
|
||||
struct ptirq_remapping_info*
|
||||
ptdev_dequeue_softirq(struct acrn_vm *vm)
|
||||
struct ptirq_remapping_info *ptirq_dequeue_softirq(struct acrn_vm *vm)
|
||||
{
|
||||
uint64_t rflags;
|
||||
struct ptirq_remapping_info *entry = NULL;
|
||||
@ -85,27 +84,26 @@ ptdev_dequeue_softirq(struct acrn_vm *vm)
|
||||
return entry;
|
||||
}
|
||||
|
||||
struct ptirq_remapping_info *
|
||||
alloc_entry(struct acrn_vm *vm, uint32_t intr_type)
|
||||
struct ptirq_remapping_info *ptirq_alloc_entry(struct acrn_vm *vm, uint32_t intr_type)
|
||||
{
|
||||
struct ptirq_remapping_info *entry;
|
||||
uint16_t ptdev_id = alloc_ptdev_entry_id();
|
||||
uint16_t ptirq_id = ptirq_alloc_entry_id();
|
||||
|
||||
if (ptdev_id >= CONFIG_MAX_PT_IRQ_ENTRIES) {
|
||||
if (ptirq_id >= CONFIG_MAX_PT_IRQ_ENTRIES) {
|
||||
pr_err("Alloc ptdev irq entry failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
entry = &ptirq_entries[ptdev_id];
|
||||
entry = &ptirq_entries[ptirq_id];
|
||||
(void)memset((void *)entry, 0U, sizeof(struct ptirq_remapping_info));
|
||||
entry->ptdev_entry_id = ptdev_id;
|
||||
entry->ptdev_entry_id = ptirq_id;
|
||||
entry->intr_type = intr_type;
|
||||
entry->vm = vm;
|
||||
entry->intr_count = 0UL;
|
||||
|
||||
INIT_LIST_HEAD(&entry->softirq_node);
|
||||
|
||||
initialize_timer(&entry->intr_delay_timer, ptdev_intr_delay_callback,
|
||||
initialize_timer(&entry->intr_delay_timer, ptirq_intr_delay_callback,
|
||||
entry, 0UL, 0, 0UL);
|
||||
|
||||
atomic_clear32(&entry->active, ACTIVE_FLAG);
|
||||
@ -113,14 +111,13 @@ alloc_entry(struct acrn_vm *vm, uint32_t intr_type)
|
||||
return entry;
|
||||
}
|
||||
|
||||
void
|
||||
release_entry(struct ptirq_remapping_info *entry)
|
||||
void ptirq_release_entry(struct ptirq_remapping_info *entry)
|
||||
{
|
||||
uint64_t rflags;
|
||||
|
||||
/*
|
||||
* remove entry from softirq list
|
||||
* is required before calling release_entry.
|
||||
* is required before calling ptirq_release_entry.
|
||||
*/
|
||||
spinlock_irqsave_obtain(&entry->vm->softirq_dev_lock, &rflags);
|
||||
list_del_init(&entry->softirq_node);
|
||||
@ -129,22 +126,8 @@ release_entry(struct ptirq_remapping_info *entry)
|
||||
bitmap_clear_nolock((entry->ptdev_entry_id) & 0x3FU, &ptirq_entry_bitmaps[(entry->ptdev_entry_id) >> 6U]);
|
||||
}
|
||||
|
||||
static void
|
||||
release_all_entries(const struct acrn_vm *vm)
|
||||
{
|
||||
struct ptirq_remapping_info *entry;
|
||||
uint16_t idx;
|
||||
|
||||
for (idx = 0U; idx < CONFIG_MAX_PT_IRQ_ENTRIES; idx++) {
|
||||
entry = &ptirq_entries[idx];
|
||||
if (entry->vm == vm) {
|
||||
release_entry(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* interrupt context */
|
||||
static void ptdev_interrupt_handler(__unused uint32_t irq, void *data)
|
||||
static void ptirq_interrupt_handler(__unused uint32_t irq, void *data)
|
||||
{
|
||||
struct ptirq_remapping_info *entry =
|
||||
(struct ptirq_remapping_info *) data;
|
||||
@ -165,16 +148,16 @@ static void ptdev_interrupt_handler(__unused uint32_t irq, void *data)
|
||||
}
|
||||
}
|
||||
|
||||
ptdev_enqueue_softirq(entry);
|
||||
ptirq_enqueue_softirq(entry);
|
||||
}
|
||||
|
||||
/* active intr with irq registering */
|
||||
int32_t ptdev_activate_entry(struct ptirq_remapping_info *entry, uint32_t phys_irq)
|
||||
int32_t ptirq_activate_entry(struct ptirq_remapping_info *entry, uint32_t phys_irq)
|
||||
{
|
||||
int32_t retval;
|
||||
|
||||
/* register and allocate host vector/irq */
|
||||
retval = request_irq(phys_irq, ptdev_interrupt_handler, (void *)entry, IRQF_PT);
|
||||
retval = request_irq(phys_irq, ptirq_interrupt_handler, (void *)entry, IRQF_PT);
|
||||
|
||||
if (retval < 0) {
|
||||
pr_err("request irq failed, please check!, phys-irq=%d", phys_irq);
|
||||
@ -186,8 +169,7 @@ int32_t ptdev_activate_entry(struct ptirq_remapping_info *entry, uint32_t phys_i
|
||||
return retval;
|
||||
}
|
||||
|
||||
void
|
||||
ptdev_deactivate_entry(struct ptirq_remapping_info *entry)
|
||||
void ptirq_deactivate_entry(struct ptirq_remapping_info *entry)
|
||||
{
|
||||
uint64_t rflags;
|
||||
|
||||
@ -210,19 +192,27 @@ void ptdev_init(void)
|
||||
}
|
||||
|
||||
spinlock_init(&ptdev_lock);
|
||||
register_softirq(SOFTIRQ_PTDEV, ptdev_softirq);
|
||||
register_softirq(SOFTIRQ_PTDEV, ptirq_softirq);
|
||||
}
|
||||
|
||||
void ptdev_release_all_entries(const struct acrn_vm *vm)
|
||||
{
|
||||
struct ptirq_remapping_info *entry;
|
||||
uint16_t idx;
|
||||
|
||||
/* VM already down */
|
||||
spinlock_obtain(&ptdev_lock);
|
||||
release_all_entries(vm);
|
||||
spinlock_release(&ptdev_lock);
|
||||
for (idx = 0U; idx < CONFIG_MAX_PT_IRQ_ENTRIES; idx++) {
|
||||
entry = &ptirq_entries[idx];
|
||||
if (entry->vm == vm) {
|
||||
spinlock_obtain(&ptdev_lock);
|
||||
ptirq_release_entry(entry);
|
||||
spinlock_release(&ptdev_lock);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint32_t get_vm_ptdev_intr_data(const struct acrn_vm *target_vm, uint64_t *buffer,
|
||||
uint32_t buffer_cnt)
|
||||
uint32_t ptirq_get_intr_data(const struct acrn_vm *target_vm, uint64_t *buffer, uint32_t buffer_cnt)
|
||||
{
|
||||
uint32_t index = 0U;
|
||||
uint16_t i;
|
||||
|
@ -400,7 +400,7 @@ vioapic_indirect_write(struct acrn_vioapic *vioapic, uint32_t addr,
|
||||
((last.full & IOAPIC_RTE_INTMASK) == 0UL)) {
|
||||
/* VM enable intr */
|
||||
/* NOTE: only support max 256 pin */
|
||||
(void)ptdev_intx_pin_remap(vioapic->vm,
|
||||
(void)ptirq_intx_pin_remap(vioapic->vm,
|
||||
(uint8_t)pin, PTDEV_VPIN_IOAPIC);
|
||||
}
|
||||
}
|
||||
@ -468,7 +468,7 @@ vioapic_process_eoi(struct acrn_vm *vm, uint32_t vector)
|
||||
continue;
|
||||
}
|
||||
|
||||
ptdev_intx_ack(vm, (uint8_t)pin, PTDEV_VPIN_IOAPIC);
|
||||
ptirq_intx_ack(vm, (uint8_t)pin, PTDEV_VPIN_IOAPIC);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -78,7 +78,7 @@ static int32_t vmsi_remap(struct pci_vdev *vdev, bool enable)
|
||||
info.vmsi_data = 0U;
|
||||
}
|
||||
|
||||
ret = ptdev_msix_remap(vm, vdev->vbdf.value, 0U, &info);
|
||||
ret = ptirq_msix_remap(vm, vdev->vbdf.value, 0U, &info);
|
||||
if (ret == 0) {
|
||||
/* Update MSI Capability structure to physical device */
|
||||
pci_pdev_write_cfg(pbdf, capoff + PCIR_MSI_ADDR, 0x4U, (uint32_t)info.pmsi_addr);
|
||||
@ -220,7 +220,7 @@ void populate_msi_struct(struct pci_vdev *vdev)
|
||||
static int32_t vmsi_deinit(struct pci_vdev *vdev)
|
||||
{
|
||||
if (vdev->msi.capoff != 0U) {
|
||||
ptdev_remove_msix_remapping(vdev->vpci->vm, vdev->vbdf.value, 1U);
|
||||
ptirq_remove_msix_remapping(vdev->vpci->vm, vdev->vbdf.value, 1U);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -59,7 +59,7 @@ static int vmsix_remap_entry(struct pci_vdev *vdev, uint32_t index, bool enable)
|
||||
info.vmsi_addr = vdev->msix.tables[index].addr;
|
||||
info.vmsi_data = (enable) ? vdev->msix.tables[index].data : 0U;
|
||||
|
||||
ret = ptdev_msix_remap(vdev->vpci->vm, vdev->vbdf.value, (uint16_t)index, &info);
|
||||
ret = ptirq_msix_remap(vdev->vpci->vm, vdev->vbdf.value, (uint16_t)index, &info);
|
||||
if (ret == 0) {
|
||||
/* Write the table entry to the physical structure */
|
||||
hva = vdev->msix.mmio_hva + vdev->msix.table_offset;
|
||||
@ -412,7 +412,7 @@ static int vmsix_deinit(struct pci_vdev *vdev)
|
||||
vdev->msix.intercepted_size = 0U;
|
||||
|
||||
if (vdev->msix.table_count != 0U) {
|
||||
ptdev_remove_msix_remapping(vdev->vpci->vm, vdev->vbdf.value, vdev->msix.table_count);
|
||||
ptirq_remove_msix_remapping(vdev->vpci->vm, vdev->vbdf.value, vdev->msix.table_count);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -328,7 +328,7 @@ static int vpic_ocw1(const struct acrn_vpic *vpic, struct i8259_reg_state *i8259
|
||||
|
||||
virt_pin = (master_pic(vpic, i8259)) ?
|
||||
pin : (pin + 8U);
|
||||
(void)ptdev_intx_pin_remap(vpic->vm,
|
||||
(void)ptirq_intx_pin_remap(vpic->vm,
|
||||
virt_pin, PTDEV_VPIN_PIC);
|
||||
}
|
||||
pin = (pin + 1U) & 0x7U;
|
||||
@ -365,7 +365,7 @@ static int vpic_ocw2(struct acrn_vpic *vpic, struct i8259_reg_state *i8259, uint
|
||||
|
||||
/* if level ack PTDEV */
|
||||
if ((i8259->elc & (1U << (isr_bit & 0x7U))) != 0U) {
|
||||
ptdev_intx_ack(vpic->vm,
|
||||
ptirq_intx_ack(vpic->vm,
|
||||
(master_pic(vpic, i8259) ? isr_bit : isr_bit + 8U),
|
||||
PTDEV_VPIN_PIC);
|
||||
}
|
||||
|
@ -36,7 +36,7 @@
|
||||
* @pre vm != NULL
|
||||
*
|
||||
*/
|
||||
void ptdev_intx_ack(struct acrn_vm *vm, uint8_t virt_pin, enum ptirq_vpin_source vpin_src);
|
||||
void ptirq_intx_ack(struct acrn_vm *vm, uint8_t virt_pin, enum ptirq_vpin_source vpin_src);
|
||||
|
||||
/**
|
||||
* @brief MSI/MSI-x remapping for passthrough device.
|
||||
@ -59,7 +59,7 @@ void ptdev_intx_ack(struct acrn_vm *vm, uint8_t virt_pin, enum ptirq_vpin_source
|
||||
* @pre info != NULL
|
||||
*
|
||||
*/
|
||||
int ptdev_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_t entry_nr, struct ptirq_msi_info *info);
|
||||
int ptirq_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_t entry_nr, struct ptirq_msi_info *info);
|
||||
|
||||
|
||||
/**
|
||||
@ -81,7 +81,7 @@ int ptdev_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_t entry_nr, s
|
||||
* @pre vm != NULL
|
||||
*
|
||||
*/
|
||||
int ptdev_intx_pin_remap(struct acrn_vm *vm, uint8_t virt_pin, enum ptirq_vpin_source vpin_src);
|
||||
int ptirq_intx_pin_remap(struct acrn_vm *vm, uint8_t virt_pin, enum ptirq_vpin_source vpin_src);
|
||||
|
||||
/**
|
||||
* @brief Add an interrupt remapping entry for INTx as pre-hold mapping.
|
||||
@ -103,7 +103,7 @@ int ptdev_intx_pin_remap(struct acrn_vm *vm, uint8_t virt_pin, enum ptirq_vpin_s
|
||||
* @pre vm != NULL
|
||||
*
|
||||
*/
|
||||
int ptdev_add_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, uint8_t phys_pin, bool pic_pin);
|
||||
int ptirq_add_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, uint8_t phys_pin, bool pic_pin);
|
||||
|
||||
/**
|
||||
* @brief Remove an interrupt remapping entry for INTx.
|
||||
@ -119,7 +119,7 @@ int ptdev_add_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, uint8_t phys_
|
||||
* @pre vm != NULL
|
||||
*
|
||||
*/
|
||||
void ptdev_remove_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, bool pic_pin);
|
||||
void ptirq_remove_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, bool pic_pin);
|
||||
|
||||
/**
|
||||
* @brief Add interrupt remapping entry/entries for MSI/MSI-x as pre-hold mapping.
|
||||
@ -140,7 +140,7 @@ void ptdev_remove_intx_remapping(struct acrn_vm *vm, uint8_t virt_pin, bool pic_
|
||||
* @pre vm != NULL
|
||||
*
|
||||
*/
|
||||
int ptdev_add_msix_remapping(struct acrn_vm *vm, uint16_t virt_bdf, uint16_t phys_bdf, uint32_t vector_count);
|
||||
int ptirq_add_msix_remapping(struct acrn_vm *vm, uint16_t virt_bdf, uint16_t phys_bdf, uint32_t vector_count);
|
||||
|
||||
/**
|
||||
* @brief Remove interrupt remapping entry/entries for MSI/MSI-x.
|
||||
@ -156,7 +156,7 @@ int ptdev_add_msix_remapping(struct acrn_vm *vm, uint16_t virt_bdf, uint16_t phy
|
||||
* @pre vm != NULL
|
||||
*
|
||||
*/
|
||||
void ptdev_remove_msix_remapping(const struct acrn_vm *vm, uint16_t virt_bdf, uint32_t vector_count);
|
||||
void ptirq_remove_msix_remapping(const struct acrn_vm *vm, uint16_t virt_bdf, uint32_t vector_count);
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
@ -72,16 +72,16 @@ extern struct ptirq_remapping_info ptirq_entries[];
|
||||
extern spinlock_t ptdev_lock;
|
||||
|
||||
bool is_entry_active(const struct ptirq_remapping_info *entry);
|
||||
void ptdev_softirq(uint16_t pcpu_id);
|
||||
void ptirq_softirq(uint16_t pcpu_id);
|
||||
void ptdev_init(void);
|
||||
void ptdev_release_all_entries(const struct acrn_vm *vm);
|
||||
|
||||
struct ptirq_remapping_info *ptdev_dequeue_softirq(struct acrn_vm *vm);
|
||||
struct ptirq_remapping_info *alloc_entry(struct acrn_vm *vm, uint32_t intr_type);
|
||||
void release_entry(struct ptirq_remapping_info *entry);
|
||||
int32_t ptdev_activate_entry(struct ptirq_remapping_info *entry, uint32_t phys_irq);
|
||||
void ptdev_deactivate_entry(struct ptirq_remapping_info *entry);
|
||||
struct ptirq_remapping_info *ptirq_dequeue_softirq(struct acrn_vm *vm);
|
||||
struct ptirq_remapping_info *ptirq_alloc_entry(struct acrn_vm *vm, uint32_t intr_type);
|
||||
void ptirq_release_entry(struct ptirq_remapping_info *entry);
|
||||
int32_t ptirq_activate_entry(struct ptirq_remapping_info *entry, uint32_t phys_irq);
|
||||
void ptirq_deactivate_entry(struct ptirq_remapping_info *entry);
|
||||
|
||||
uint32_t get_vm_ptdev_intr_data(const struct acrn_vm *target_vm, uint64_t *buffer, uint32_t buffer_cnt);
|
||||
uint32_t ptirq_get_intr_data(const struct acrn_vm *target_vm, uint64_t *buffer, uint32_t buffer_cnt);
|
||||
|
||||
#endif /* PTDEV_H */
|
||||
|
Loading…
Reference in New Issue
Block a user