Lines Matching defs:ppt

26  * $FreeBSD: releng/10.2/sys/amd64/vmm/io/ppt.c 284899 2015-06-28 01:21:55Z neel $
30 __FBSDID("$FreeBSD: releng/10.2/sys/amd64/vmm/io/ppt.c 284899 2015-06-28 01:21:55Z neel $");
55 #include "ppt.h"
105 SYSCTL_NODE(_hw_vmm, OID_AUTO, ppt, CTLFLAG_RW, 0, "bhyve passthru devices");
137 * SR-IOV infrastructure specified as "ppt" passthrough devices.
138 * All normal devices that did not have "ppt" specified as their
147 struct pptdev *ppt;
149 ppt = device_get_softc(dev);
152 TAILQ_INSERT_TAIL(&pptdev_list, ppt, next);
153 ppt->dev = dev;
164 struct pptdev *ppt;
166 ppt = device_get_softc(dev);
168 if (ppt->vm != NULL)
171 TAILQ_REMOVE(&pptdev_list, ppt, next);
185 DEFINE_CLASS_0(ppt, ppt_driver, ppt_methods, sizeof(struct pptdev));
186 DRIVER_MODULE(ppt, pci, ppt_driver, ppt_devclass, NULL, NULL);
192 struct pptdev *ppt;
195 TAILQ_FOREACH(ppt, &pptdev_list, next) {
196 dev = ppt->dev;
201 return (ppt);
207 ppt_unmap_mmio(struct vm *vm, struct pptdev *ppt)
213 seg = &ppt->mmio[i];
222 ppt_teardown_msi(struct pptdev *ppt)
228 if (ppt->msi.num_msgs == 0)
231 for (i = 0; i < ppt->msi.num_msgs; i++) {
232 rid = ppt->msi.startrid + i;
233 res = ppt->msi.res[i];
234 cookie = ppt->msi.cookie[i];
237 bus_teardown_intr(ppt->dev, res, cookie);
240 bus_release_resource(ppt->dev, SYS_RES_IRQ, rid, res);
242 ppt->msi.res[i] = NULL;
243 ppt->msi.cookie[i] = NULL;
246 if (ppt->msi.startrid == 1)
247 pci_release_msi(ppt->dev);
249 ppt->msi.num_msgs = 0;
253 ppt_teardown_msix_intr(struct pptdev *ppt, int idx)
259 rid = ppt->msix.startrid + idx;
260 res = ppt->msix.res[idx];
261 cookie = ppt->msix.cookie[idx];
264 bus_teardown_intr(ppt->dev, res, cookie);
267 bus_release_resource(ppt->dev, SYS_RES_IRQ, rid, res);
269 ppt->msix.res[idx] = NULL;
270 ppt->msix.cookie[idx] = NULL;
274 ppt_teardown_msix(struct pptdev *ppt)
278 if (ppt->msix.num_msgs == 0)
281 for (i = 0; i < ppt->msix.num_msgs; i++)
282 ppt_teardown_msix_intr(ppt, i);
284 if (ppt->msix.msix_table_res) {
285 bus_release_resource(ppt->dev, SYS_RES_MEMORY,
286 ppt->msix.msix_table_rid,
287 ppt->msix.msix_table_res);
288 ppt->msix.msix_table_res = NULL;
289 ppt->msix.msix_table_rid = 0;
292 free(ppt->msix.res, M_PPTMSIX);
293 free(ppt->msix.cookie, M_PPTMSIX);
294 free(ppt->msix.arg, M_PPTMSIX);
296 pci_release_msi(ppt->dev);
298 ppt->msix.num_msgs = 0;
311 struct pptdev *ppt;
315 TAILQ_FOREACH(ppt, &pptdev_list, next) {
316 if (ppt->vm == vm)
326 struct pptdev *ppt;
329 TAILQ_FOREACH(ppt, &pptdev_list, next) {
330 if (ppt->vm != vm)
334 seg = &ppt->mmio[i];
348 struct pptdev *ppt;
350 ppt = ppt_find(bus, slot, func);
351 if (ppt != NULL) {
356 if (ppt->vm != NULL && ppt->vm != vm)
359 ppt->vm = vm;
360 iommu_add_device(vm_iommu_domain(vm), pci_get_rid(ppt->dev));
369 struct pptdev *ppt;
371 ppt = ppt_find(bus, slot, func);
372 if (ppt != NULL) {
376 if (ppt->vm != vm)
378 ppt_unmap_mmio(vm, ppt);
379 ppt_teardown_msi(ppt);
380 ppt_teardown_msix(ppt);
381 iommu_remove_device(vm_iommu_domain(vm), pci_get_rid(ppt->dev));
382 ppt->vm = NULL;
391 struct pptdev *ppt;
395 TAILQ_FOREACH(ppt, &pptdev_list, next) {
396 if (ppt->vm == vm) {
397 dev = ppt->dev;
414 struct pptdev *ppt;
416 ppt = ppt_find(bus, slot, func);
417 if (ppt != NULL) {
418 if (ppt->vm != vm)
422 seg = &ppt->mmio[i];
440 struct pptdev *ppt;
444 ppt = pptarg->pptdev;
446 if (ppt->vm != NULL)
447 lapic_intr_msi(ppt->vm, pptarg->addr, pptarg->msg_data);
459 if (ppt->msi.startrid == 0)
471 struct pptdev *ppt;
476 ppt = ppt_find(bus, slot, func);
477 if (ppt == NULL)
479 if (ppt->vm != vm) /* Make sure we own this device */
483 ppt_teardown_msi(ppt);
489 msi_count = pci_msi_count(ppt->dev);
510 error = pci_alloc_msi(ppt->dev, &tmp);
514 pci_release_msi(ppt->dev);
521 ppt->msi.startrid = startrid;
527 ppt->msi.num_msgs = i + 1;
528 ppt->msi.cookie[i] = NULL;
531 ppt->msi.res[i] = bus_alloc_resource_any(ppt->dev, SYS_RES_IRQ,
533 if (ppt->msi.res[i] == NULL)
536 ppt->msi.arg[i].pptdev = ppt;
537 ppt->msi.arg[i].addr = addr;
538 ppt->msi.arg[i].msg_data = msg + i;
540 error = bus_setup_intr(ppt->dev, ppt->msi.res[i],
542 pptintr, NULL, &ppt->msi.arg[i],
543 &ppt->msi.cookie[i]);
549 ppt_teardown_msi(ppt);
560 struct pptdev *ppt;
565 ppt = ppt_find(bus, slot, func);
566 if (ppt == NULL)
568 if (ppt->vm != vm) /* Make sure we own this device */
571 dinfo = device_get_ivars(ppt->dev);
579 * Set up some variables in ppt->msix
581 if (ppt->msix.num_msgs == 0) {
582 numvec = pci_msix_count(ppt->dev);
586 ppt->msix.startrid = 1;
587 ppt->msix.num_msgs = numvec;
589 res_size = numvec * sizeof(ppt->msix.res[0]);
590 cookie_size = numvec * sizeof(ppt->msix.cookie[0]);
591 arg_size = numvec * sizeof(ppt->msix.arg[0]);
593 ppt->msix.res = malloc(res_size, M_PPTMSIX, M_WAITOK | M_ZERO);
594 ppt->msix.cookie = malloc(cookie_size, M_PPTMSIX,
596 ppt->msix.arg = malloc(arg_size, M_PPTMSIX, M_WAITOK | M_ZERO);
599 ppt->msix.msix_table_res = bus_alloc_resource_any(ppt->dev,
602 if (ppt->msix.msix_table_res == NULL) {
603 ppt_teardown_msix(ppt);
606 ppt->msix.msix_table_rid = rid;
609 error = pci_alloc_msix(ppt->dev, &alloced);
611 ppt_teardown_msix(ppt);
618 ppt_teardown_msix_intr(ppt, idx);
621 ppt->msix.cookie[idx] = NULL;
622 rid = ppt->msix.startrid + idx;
623 ppt->msix.res[idx] = bus_alloc_resource_any(ppt->dev, SYS_RES_IRQ,
625 if (ppt->msix.res[idx] == NULL)
628 ppt->msix.arg[idx].pptdev = ppt;
629 ppt->msix.arg[idx].addr = addr;
630 ppt->msix.arg[idx].msg_data = msg;
633 error = bus_setup_intr(ppt->dev, ppt->msix.res[idx],
635 pptintr, NULL, &ppt->msix.arg[idx],
636 &ppt->msix.cookie[idx]);
639 bus_teardown_intr(ppt->dev, ppt->msix.res[idx], ppt->msix.cookie[idx]);
640 bus_release_resource(ppt->dev, SYS_RES_IRQ, rid, ppt->msix.res[idx]);
641 ppt->msix.cookie[idx] = NULL;
642 ppt->msix.res[idx] = NULL;
647 ppt_teardown_msix_intr(ppt, idx);