Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/vmm/io/ppt.c
Show First 20 Lines • Show All 218 Lines • ▼ Show 20 Lines | if (ppt == NULL) | ||||
return (ENOENT); | return (ENOENT); | ||||
if (ppt->vm != vm) /* Make sure we own this device */ | if (ppt->vm != vm) /* Make sure we own this device */ | ||||
return (EBUSY); | return (EBUSY); | ||||
*pptp = ppt; | *pptp = ppt; | ||||
return (0); | return (0); | ||||
} | } | ||||
static void | static void | ||||
ppt_unmap_mmio(struct vm *vm, struct pptdev *ppt) | ppt_unmap_all_mmio(struct vm *vm, struct pptdev *ppt) | ||||
{ | { | ||||
int i; | int i; | ||||
struct pptseg *seg; | struct pptseg *seg; | ||||
for (i = 0; i < MAX_MMIOSEGS; i++) { | for (i = 0; i < MAX_MMIOSEGS; i++) { | ||||
seg = &ppt->mmio[i]; | seg = &ppt->mmio[i]; | ||||
if (seg->len == 0) | if (seg->len == 0) | ||||
continue; | continue; | ||||
▲ Show 20 Lines • Show All 171 Lines • ▼ Show 20 Lines | ppt_unassign_device(struct vm *vm, int bus, int slot, int func) | ||||
error = ppt_find(vm, bus, slot, func, &ppt); | error = ppt_find(vm, bus, slot, func, &ppt); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
pci_save_state(ppt->dev); | pci_save_state(ppt->dev); | ||||
ppt_pci_reset(ppt->dev); | ppt_pci_reset(ppt->dev); | ||||
pci_restore_state(ppt->dev); | pci_restore_state(ppt->dev); | ||||
ppt_unmap_mmio(vm, ppt); | ppt_unmap_all_mmio(vm, ppt); | ||||
ppt_teardown_msi(ppt); | ppt_teardown_msi(ppt); | ||||
ppt_teardown_msix(ppt); | ppt_teardown_msix(ppt); | ||||
iommu_remove_device(vm_iommu_domain(vm), pci_get_rid(ppt->dev)); | iommu_remove_device(vm_iommu_domain(vm), pci_get_rid(ppt->dev)); | ||||
ppt->vm = NULL; | ppt->vm = NULL; | ||||
return (0); | return (0); | ||||
} | } | ||||
int | int | ||||
Show All 35 Lines | if (seg->len == 0) { | ||||
if (error == 0) { | if (error == 0) { | ||||
seg->gpa = gpa; | seg->gpa = gpa; | ||||
seg->len = len; | seg->len = len; | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
} | } | ||||
return (ENOSPC); | return (ENOSPC); | ||||
} | |||||
int | |||||
ppt_unmap_mmio(struct vm *vm, int bus, int slot, int func, | |||||
vm_paddr_t gpa, size_t len) | |||||
{ | |||||
int i, error; | |||||
struct pptseg *seg; | |||||
struct pptdev *ppt; | |||||
error = ppt_find(vm, bus, slot, func, &ppt); | |||||
if (error) | |||||
return (error); | |||||
for (i = 0; i < MAX_MMIOSEGS; i++) { | |||||
seg = &ppt->mmio[i]; | |||||
if (seg->gpa == gpa && seg->len == len) { | |||||
error = vm_unmap_mmio(vm, seg->gpa, seg->len); | |||||
if (error == 0) { | |||||
seg->gpa = 0; | |||||
seg->len = 0; | |||||
} | |||||
return (error); | |||||
} | |||||
} | |||||
return (ENOENT); | |||||
} | } | ||||
static int | static int | ||||
pptintr(void *arg) | pptintr(void *arg) | ||||
{ | { | ||||
struct pptdev *ppt; | struct pptdev *ppt; | ||||
struct pptintr_arg *pptarg; | struct pptintr_arg *pptarg; | ||||
▲ Show 20 Lines • Show All 239 Lines • Show Last 20 Lines |