Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/vmm/io/ppt.c
Show First 20 Lines • Show All 212 Lines • ▼ Show 20 Lines | TAILQ_FOREACH(ppt, &pptdev_list, next) { | ||||
f = pci_get_function(dev); | f = pci_get_function(dev); | ||||
if (bus == b && slot == s && func == f) | if (bus == b && slot == s && func == f) | ||||
return (ppt); | return (ppt); | ||||
} | } | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
static void | static void | ||||
ppt_unmap_mmio(struct vm *vm, struct pptdev *ppt) | ppt_unmap_mmio_all(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 179 Lines • ▼ Show 20 Lines | if (ppt != NULL) { | ||||
* If this device is not owned by this 'vm' then bail out. | * If this device is not owned by this 'vm' then bail out. | ||||
*/ | */ | ||||
if (ppt->vm != vm) | if (ppt->vm != vm) | ||||
return (EBUSY); | return (EBUSY); | ||||
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_mmio_all(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); | ||||
} | } | ||||
return (ENOENT); | return (ENOENT); | ||||
} | } | ||||
Show All 33 Lines | if (ppt != NULL) { | ||||
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) { | ||||
error = vm_map_mmio(vm, gpa, len, hpa); | error = vm_map_mmio(vm, gpa, len, hpa); | ||||
if (error == 0) { | if (error == 0) { | ||||
seg->gpa = gpa; | seg->gpa = gpa; | ||||
seg->len = len; | seg->len = len; | ||||
} | |||||
return (error); | |||||
} | |||||
} | |||||
return (ENOSPC); | |||||
} | |||||
return (ENOENT); | |||||
} | |||||
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; | |||||
ppt = ppt_find(bus, slot, func); | |||||
if (ppt != NULL) { | |||||
if (ppt->vm != vm) | |||||
return (EBUSY); | |||||
for (i = 0; i < MAX_MMIOSEGS; i++) { | |||||
seg = &ppt->mmio[i]; | |||||
if (seg->gpa == gpa && seg->len == len) { | |||||
error = vm_unmap_mmio(vm, gpa, len); | |||||
if (error == 0) { | |||||
seg->gpa = 0; | |||||
seg->len = 0; | |||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
} | } | ||||
return (ENOSPC); | return (ENOSPC); | ||||
} | } | ||||
return (ENOENT); | return (ENOENT); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 228 Lines • Show Last 20 Lines |