mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-09-22 01:07:57 +00:00
hv: dm: Use new pci device passthrough management ioctls
IC_ASSIGN_PCIDEV -> ACRN_IOCTL_ASSIGN_PCIDEV IC_DEASSIGN_PCIDEV -> ACRN_IOCTL_DEASSIGN_PCIDEV QUIRK_PTDEV -> ACRN_PTDEV_QUIRK_ASSIGN struct acrn_assign_pcidev -> struct acrn_pcidev Move struct acrn_pcidev into acrn_common.h because it is used by both DM and HV. Tracked-On: #6282 Signed-off-by: Shuo A Liu <shuo.a.liu@intel.com>
This commit is contained in:
@@ -850,7 +850,7 @@ int32_t hcall_gpa_to_hpa(struct acrn_vcpu *vcpu, struct acrn_vm *target_vm, __un
|
||||
* @param vcpu Pointer to vCPU that initiates the hypercall
|
||||
* @param target_vm Pointer to target VM data structure
|
||||
* @param param2 guest physical address. This gpa points to data structure of
|
||||
* acrn_assign_pcidev including assign PCI device info
|
||||
* acrn_pcidev including assign PCI device info
|
||||
*
|
||||
* @pre is_sos_vm(vcpu->vm)
|
||||
* @return 0 on success, non-zero on error.
|
||||
@@ -860,7 +860,7 @@ int32_t hcall_assign_pcidev(struct acrn_vcpu *vcpu, struct acrn_vm *target_vm,
|
||||
{
|
||||
struct acrn_vm *vm = vcpu->vm;
|
||||
int32_t ret = -EINVAL;
|
||||
struct acrn_assign_pcidev pcidev;
|
||||
struct acrn_pcidev pcidev;
|
||||
|
||||
/* We should only assign a device to a post-launched VM at creating time for safety, not runtime or other cases*/
|
||||
if (is_created_vm(target_vm)) {
|
||||
@@ -880,7 +880,7 @@ int32_t hcall_assign_pcidev(struct acrn_vcpu *vcpu, struct acrn_vm *target_vm,
|
||||
* @param vcpu Pointer to vCPU that initiates the hypercall
|
||||
* @param target_vm Pointer to target VM data structure
|
||||
* @param param2 guest physical address. This gpa points to data structure of
|
||||
* acrn_assign_pcidev including deassign PCI device info
|
||||
* acrn_pcidev including deassign PCI device info
|
||||
*
|
||||
* @pre is_sos_vm(vcpu->vm)
|
||||
* @return 0 on success, non-zero on error.
|
||||
@@ -890,7 +890,7 @@ int32_t hcall_deassign_pcidev(struct acrn_vcpu *vcpu, struct acrn_vm *target_vm,
|
||||
{
|
||||
struct acrn_vm *vm = vcpu->vm;
|
||||
int32_t ret = -EINVAL;
|
||||
struct acrn_assign_pcidev pcidev;
|
||||
struct acrn_pcidev pcidev;
|
||||
|
||||
/* We should only de-assign a device from a post-launched VM at creating/shutdown/reset time */
|
||||
if ((is_paused_vm(target_vm) || is_created_vm(target_vm))) {
|
||||
|
@@ -670,7 +670,7 @@ static void vpci_init_vdevs(struct acrn_vm *vm)
|
||||
* @pre tgt_vm != NULL
|
||||
* @pre pcidev != NULL
|
||||
*/
|
||||
int32_t vpci_assign_pcidev(struct acrn_vm *tgt_vm, struct acrn_assign_pcidev *pcidev)
|
||||
int32_t vpci_assign_pcidev(struct acrn_vm *tgt_vm, struct acrn_pcidev *pcidev)
|
||||
{
|
||||
int32_t ret = 0;
|
||||
uint32_t idx;
|
||||
@@ -743,7 +743,7 @@ int32_t vpci_assign_pcidev(struct acrn_vm *tgt_vm, struct acrn_assign_pcidev *pc
|
||||
* @pre tgt_vm != NULL
|
||||
* @pre pcidev != NULL
|
||||
*/
|
||||
int32_t vpci_deassign_pcidev(struct acrn_vm *tgt_vm, struct acrn_assign_pcidev *pcidev)
|
||||
int32_t vpci_deassign_pcidev(struct acrn_vm *tgt_vm, struct acrn_pcidev *pcidev)
|
||||
{
|
||||
int32_t ret = 0;
|
||||
struct pci_vdev *parent_vdev, *vdev;
|
||||
|
@@ -49,7 +49,7 @@ static inline struct acrn_vm *vpci2vm(const struct acrn_vpci *vpci)
|
||||
|
||||
static inline bool is_quirk_ptdev(const struct pci_vdev *vdev)
|
||||
{
|
||||
return ((vdev->flags & QUIRK_PTDEV) != 0U);
|
||||
return ((vdev->flags & ACRN_PTDEV_QUIRK_ASSIGN) != 0U);
|
||||
}
|
||||
|
||||
static inline bool in_range(uint32_t value, uint32_t lower, uint32_t len)
|
||||
|
@@ -284,7 +284,7 @@ int32_t hcall_gpa_to_hpa(struct acrn_vcpu *vcpu, struct acrn_vm *target_vm, uint
|
||||
* @param target_vm Pointer to target VM data structure
|
||||
* @param param1 not used
|
||||
* @param param2 guest physical address. This gpa points to data structure of
|
||||
* acrn_assign_pcidev including assign PCI device info
|
||||
* acrn_pcidev including assign PCI device info
|
||||
*
|
||||
* @pre is_sos_vm(vcpu->vm)
|
||||
* @return 0 on success, non-zero on error.
|
||||
@@ -298,7 +298,7 @@ int32_t hcall_assign_pcidev(struct acrn_vcpu *vcpu, struct acrn_vm *target_vm, u
|
||||
* @param target_vm Pointer to target VM data structure
|
||||
* @param param1 not used
|
||||
* @param param2 guest physical address. This gpa points to data structure of
|
||||
* acrn_assign_pcidev including deassign PCI device info
|
||||
* acrn_pcidev including deassign PCI device info
|
||||
*
|
||||
* @pre is_sos_vm(vcpu->vm)
|
||||
* @return 0 on success, non-zero on error.
|
||||
|
@@ -187,9 +187,9 @@ extern const struct pci_vdev_ops vpci_bridge_ops;
|
||||
void init_vpci(struct acrn_vm *vm);
|
||||
void deinit_vpci(struct acrn_vm *vm);
|
||||
struct pci_vdev *pci_find_vdev(struct acrn_vpci *vpci, union pci_bdf vbdf);
|
||||
struct acrn_assign_pcidev;
|
||||
int32_t vpci_assign_pcidev(struct acrn_vm *tgt_vm, struct acrn_assign_pcidev *pcidev);
|
||||
int32_t vpci_deassign_pcidev(struct acrn_vm *tgt_vm, struct acrn_assign_pcidev *pcidev);
|
||||
struct acrn_pcidev;
|
||||
int32_t vpci_assign_pcidev(struct acrn_vm *tgt_vm, struct acrn_pcidev *pcidev);
|
||||
int32_t vpci_deassign_pcidev(struct acrn_vm *tgt_vm, struct acrn_pcidev *pcidev);
|
||||
struct pci_vdev *vpci_init_vdev(struct acrn_vpci *vpci, struct acrn_vm_pci_dev_config *dev_config, struct pci_vdev *parent_pf_vdev);
|
||||
|
||||
static inline bool is_pci_io_bar(struct pci_vbar *vbar)
|
||||
|
@@ -703,6 +703,38 @@ struct vrp_config
|
||||
uint32_t ptm_cap_offset;
|
||||
};
|
||||
|
||||
/* Type of PCI device assignment */
|
||||
#define ACRN_PTDEV_QUIRK_ASSIGN (1U << 0)
|
||||
|
||||
#define ACRN_PCI_NUM_BARS 6U
|
||||
/**
|
||||
* @brief Info to assign or deassign PCI for a VM
|
||||
*
|
||||
*/
|
||||
struct acrn_pcidev {
|
||||
/** the type of the the pass-through PCI device */
|
||||
uint32_t type;
|
||||
|
||||
/** virtual BDF# of the pass-through PCI device */
|
||||
uint16_t virt_bdf;
|
||||
|
||||
/** physical BDF# of the pass-through PCI device */
|
||||
uint16_t phys_bdf;
|
||||
|
||||
/** the PCI Interrupt Line, initialized by ACRN-DM, which is RO and
|
||||
* ideally not used for pass-through MSI/MSI-x devices.
|
||||
*/
|
||||
uint8_t intr_line;
|
||||
|
||||
/** the PCI Interrupt Pin, initialized by ACRN-DM, which is RO and
|
||||
* ideally not used for pass-through MSI/MSI-x devices.
|
||||
*/
|
||||
uint8_t intr_pin;
|
||||
|
||||
/** the base address of the PCI BAR, initialized by ACRN-DM. */
|
||||
uint32_t bar[ACRN_PCI_NUM_BARS];
|
||||
} __attribute__((aligned(8)));
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
@@ -271,40 +271,6 @@ struct hc_ptdev_irq {
|
||||
|
||||
} __aligned(8);
|
||||
|
||||
/**
|
||||
* @brief Info to assign or deassign PCI for a VM
|
||||
*
|
||||
* the parameter for HC_ASSIGN_PCIDEV or HC_DEASSIGN_PCIDEV hypercall
|
||||
*/
|
||||
struct acrn_assign_pcidev {
|
||||
#define QUIRK_PTDEV (1U << 0) /* We will only handle general part in HV, others in DM */
|
||||
/** the type of the the pass-through PCI device */
|
||||
uint32_t type;
|
||||
|
||||
/** virtual BDF# of the pass-through PCI device */
|
||||
uint16_t virt_bdf;
|
||||
|
||||
/** physical BDF# of the pass-through PCI device */
|
||||
uint16_t phys_bdf;
|
||||
|
||||
/** the PCI Interrupt Line, initialized by ACRN-DM, which is RO and
|
||||
* ideally not used for pass-through MSI/MSI-x devices.
|
||||
*/
|
||||
uint8_t intr_line;
|
||||
|
||||
/** the PCI Interrupt Pin, initialized by ACRN-DM, which is RO and
|
||||
* ideally not used for pass-through MSI/MSI-x devices.
|
||||
*/
|
||||
uint8_t intr_pin;
|
||||
|
||||
/** the base address of the PCI BAR, initialized by ACRN-DM. */
|
||||
uint32_t bar[6];
|
||||
|
||||
/** reserved for extension */
|
||||
uint32_t rsvd2[6];
|
||||
|
||||
} __attribute__((aligned(8)));
|
||||
|
||||
/**
|
||||
* @brief Info to assign or deassign a MMIO device for a VM
|
||||
*
|
||||
|
Reference in New Issue
Block a user