Lines Matching refs:ppt

168 	struct pptdev *ppt;  in ppt_ioctl()  local
171 if ((ppt = ddi_get_soft_state(ppt_state, minor)) == NULL) { in ppt_ioctl()
178 ddi_acc_handle_t cfg = ppt->pptd_cfg; in ppt_ioctl()
204 ddi_acc_handle_t cfg = ppt->pptd_cfg; in ppt_ioctl()
235 pbar = &ppt->pptd_bars[barg.pbq_baridx]; in ppt_ioctl()
263 pbar = &ppt->pptd_bars[rnum]; in ppt_ioctl()
302 pbar = &ppt->pptd_bars[rnum]; in ppt_ioctl()
333 ppt_find_msix_table_bar(struct pptdev *ppt) in ppt_find_msix_table_bar() argument
338 if (PCI_CAP_LOCATE(ppt->pptd_cfg, PCI_CAP_ID_MSI_X, &base) != in ppt_find_msix_table_bar()
342 off = pci_config_get32(ppt->pptd_cfg, base + PCI_MSIX_TBL_OFFSET); in ppt_find_msix_table_bar()
355 struct pptdev *ppt; in ppt_devmap() local
361 if ((ppt = ddi_get_soft_state(ppt_state, minor)) == NULL) in ppt_devmap()
372 if ((bar = ppt_find_msix_table_bar(ppt)) == -1) in ppt_devmap()
375 ddireg = ppt->pptd_bars[bar].ddireg; in ppt_devmap()
380 err = devmap_devmem_setup(dhp, ppt->pptd_dip, NULL, ddireg, off, len, in ppt_devmap()
390 ppt_bar_wipe(struct pptdev *ppt) in ppt_bar_wipe() argument
395 struct pptbar *pbar = &ppt->pptd_bars[i]; in ppt_bar_wipe()
400 bzero(&ppt->pptd_bars, sizeof (ppt->pptd_bars)); in ppt_bar_wipe()
404 ppt_bar_crawl(struct pptdev *ppt) in ppt_bar_crawl() argument
410 if (ddi_getlongprop(DDI_DEV_T_ANY, ppt->pptd_dip, DDI_PROP_DONTPASS, in ppt_bar_crawl()
429 pbar = &ppt->pptd_bars[rnum]; in ppt_bar_crawl()
449 err = ddi_regs_map_setup(ppt->pptd_dip, rnum, in ppt_bar_crawl()
459 ppt_bar_wipe(ppt); in ppt_bar_crawl()
465 ppt_bar_verify_mmio(struct pptdev *ppt, uint64_t base, uint64_t size) in ppt_bar_verify_mmio() argument
479 const struct pptbar *bar = &ppt->pptd_bars[i]; in ppt_bar_verify_mmio()
501 ppt_toggle_bar(struct pptdev *ppt, boolean_t enable) in ppt_toggle_bar() argument
511 if (pci_config_setup(ppt->pptd_dip, &hdl) != DDI_SUCCESS) in ppt_toggle_bar()
519 const struct pptbar *bar = &ppt->pptd_bars[i]; in ppt_toggle_bar()
544 struct pptdev *ppt = NULL; in ppt_ddi_attach() local
556 VERIFY(ppt = ddi_get_soft_state(ppt_state, inst)); in ppt_ddi_attach()
557 ppt->pptd_dip = dip; in ppt_ddi_attach()
558 ddi_set_driver_private(dip, ppt); in ppt_ddi_attach()
560 if (pci_config_setup(dip, &ppt->pptd_cfg) != DDI_SUCCESS) { in ppt_ddi_attach()
563 if (ppt_bar_crawl(ppt) != 0) { in ppt_ddi_attach()
571 ppt_toggle_bar(ppt, B_FALSE); in ppt_ddi_attach()
574 list_insert_tail(&pptdev_list, ppt); in ppt_ddi_attach()
580 if (ppt != NULL) { in ppt_ddi_attach()
582 if (ppt->pptd_cfg != NULL) { in ppt_ddi_attach()
583 pci_config_teardown(&ppt->pptd_cfg); in ppt_ddi_attach()
585 ppt_bar_wipe(ppt); in ppt_ddi_attach()
594 struct pptdev *ppt; in ppt_ddi_detach() local
600 ppt = ddi_get_driver_private(dip); in ppt_ddi_detach()
603 ASSERT3P(ddi_get_soft_state(ppt_state, inst), ==, ppt); in ppt_ddi_detach()
606 if (ppt->vm != NULL) { in ppt_ddi_detach()
610 list_remove(&pptdev_list, ppt); in ppt_ddi_detach()
614 ppt_bar_wipe(ppt); in ppt_ddi_detach()
615 pci_config_teardown(&ppt->pptd_cfg); in ppt_ddi_detach()
630 struct pptdev *ppt = ddi_get_soft_state(ppt_state, inst); in ppt_ddi_info() local
632 if (ppt != NULL) { in ppt_ddi_info()
633 *result = (void *)ppt->pptd_dip; in ppt_ddi_info()
888 struct pptdev *ppt = NULL; in ppt_findf() local
905 ppt = ddi_get_soft_state(ppt_state, getminor(va.va_rdev)); in ppt_findf()
907 if (ppt == NULL) { in ppt_findf()
912 if (ppt->vm != vm) { in ppt_findf()
917 *pptp = ppt; in ppt_findf()
926 ppt_unmap_all_mmio(struct vm *vm, struct pptdev *ppt) in ppt_unmap_all_mmio() argument
932 seg = &ppt->mmio[i]; in ppt_unmap_all_mmio()
941 ppt_teardown_msi(struct pptdev *ppt) in ppt_teardown_msi() argument
945 if (ppt->msi.num_msgs == 0) in ppt_teardown_msi()
948 for (i = 0; i < ppt->msi.num_msgs; i++) { in ppt_teardown_msi()
951 (void) ddi_intr_get_cap(ppt->msi.inth[i], &intr_cap); in ppt_teardown_msi()
953 ddi_intr_block_disable(&ppt->msi.inth[i], 1); in ppt_teardown_msi()
955 ddi_intr_disable(ppt->msi.inth[i]); in ppt_teardown_msi()
957 ddi_intr_remove_handler(ppt->msi.inth[i]); in ppt_teardown_msi()
958 ddi_intr_free(ppt->msi.inth[i]); in ppt_teardown_msi()
960 ppt->msi.inth[i] = NULL; in ppt_teardown_msi()
963 kmem_free(ppt->msi.inth, ppt->msi.inth_sz); in ppt_teardown_msi()
964 ppt->msi.inth = NULL; in ppt_teardown_msi()
965 ppt->msi.inth_sz = 0; in ppt_teardown_msi()
966 ppt->msi.is_fixed = B_FALSE; in ppt_teardown_msi()
968 ppt->msi.num_msgs = 0; in ppt_teardown_msi()
972 ppt_teardown_msix_intr(struct pptdev *ppt, int idx) in ppt_teardown_msix_intr() argument
974 if (ppt->msix.inth != NULL && ppt->msix.inth[idx] != NULL) { in ppt_teardown_msix_intr()
977 (void) ddi_intr_get_cap(ppt->msix.inth[idx], &intr_cap); in ppt_teardown_msix_intr()
979 ddi_intr_block_disable(&ppt->msix.inth[idx], 1); in ppt_teardown_msix_intr()
981 ddi_intr_disable(ppt->msix.inth[idx]); in ppt_teardown_msix_intr()
983 ddi_intr_remove_handler(ppt->msix.inth[idx]); in ppt_teardown_msix_intr()
988 ppt_teardown_msix(struct pptdev *ppt) in ppt_teardown_msix() argument
992 if (ppt->msix.num_msgs == 0) in ppt_teardown_msix()
995 for (i = 0; i < ppt->msix.num_msgs; i++) in ppt_teardown_msix()
996 ppt_teardown_msix_intr(ppt, i); in ppt_teardown_msix()
998 if (ppt->msix.inth) { in ppt_teardown_msix()
999 for (i = 0; i < ppt->msix.num_msgs; i++) in ppt_teardown_msix()
1000 ddi_intr_free(ppt->msix.inth[i]); in ppt_teardown_msix()
1001 kmem_free(ppt->msix.inth, ppt->msix.inth_sz); in ppt_teardown_msix()
1002 ppt->msix.inth = NULL; in ppt_teardown_msix()
1003 ppt->msix.inth_sz = 0; in ppt_teardown_msix()
1004 kmem_free(ppt->msix.arg, ppt->msix.arg_sz); in ppt_teardown_msix()
1005 ppt->msix.arg = NULL; in ppt_teardown_msix()
1006 ppt->msix.arg_sz = 0; in ppt_teardown_msix()
1009 ppt->msix.num_msgs = 0; in ppt_teardown_msix()
1015 struct pptdev *ppt; in ppt_assigned_devices() local
1019 for (ppt = list_head(&pptdev_list); ppt != NULL; in ppt_assigned_devices()
1020 ppt = list_next(&pptdev_list, ppt)) { in ppt_assigned_devices()
1021 if (ppt->vm == vm) { in ppt_assigned_devices()
1032 struct pptdev *ppt = list_head(&pptdev_list); in ppt_is_mmio() local
1036 for (ppt = list_head(&pptdev_list); ppt != NULL; in ppt_is_mmio()
1037 ppt = list_next(&pptdev_list, ppt)) { in ppt_is_mmio()
1038 if (ppt->vm != vm) { in ppt_is_mmio()
1043 struct pptseg *seg = &ppt->mmio[i]; in ppt_is_mmio()
1061 struct pptdev *ppt; in ppt_assign_device() local
1066 err = ppt_findf(NULL, pptfd, &ppt); in ppt_assign_device()
1072 if (pci_save_config_regs(ppt->pptd_dip) != DDI_SUCCESS) { in ppt_assign_device()
1076 ppt_flr(ppt->pptd_dip, B_TRUE); in ppt_assign_device()
1083 if (pci_restore_config_regs(ppt->pptd_dip) != DDI_SUCCESS || in ppt_assign_device()
1084 pci_save_config_regs(ppt->pptd_dip) != DDI_SUCCESS) { in ppt_assign_device()
1089 ppt_toggle_bar(ppt, B_TRUE); in ppt_assign_device()
1091 ppt->vm = vm; in ppt_assign_device()
1092 iommu_remove_device(iommu_host_domain(), pci_get_bdf(ppt->pptd_dip)); in ppt_assign_device()
1093 iommu_add_device(vm_iommu_domain(vm), pci_get_bdf(ppt->pptd_dip)); in ppt_assign_device()
1094 pf_set_passthru(ppt->pptd_dip, B_TRUE); in ppt_assign_device()
1126 ppt_do_unassign(struct pptdev *ppt) in ppt_do_unassign() argument
1128 struct vm *vm = ppt->vm; in ppt_do_unassign()
1133 ppt_flr(ppt->pptd_dip, B_TRUE); in ppt_do_unassign()
1140 ppt_reset_pci_power_state(ppt->pptd_dip); in ppt_do_unassign()
1141 (void) pci_restore_config_regs(ppt->pptd_dip); in ppt_do_unassign()
1143 pf_set_passthru(ppt->pptd_dip, B_FALSE); in ppt_do_unassign()
1145 ppt_unmap_all_mmio(vm, ppt); in ppt_do_unassign()
1146 ppt_teardown_msi(ppt); in ppt_do_unassign()
1147 ppt_teardown_msix(ppt); in ppt_do_unassign()
1148 iommu_remove_device(vm_iommu_domain(vm), pci_get_bdf(ppt->pptd_dip)); in ppt_do_unassign()
1149 iommu_add_device(iommu_host_domain(), pci_get_bdf(ppt->pptd_dip)); in ppt_do_unassign()
1150 ppt->vm = NULL; in ppt_do_unassign()
1156 struct pptdev *ppt; in ppt_unassign_device() local
1160 err = ppt_findf(vm, pptfd, &ppt); in ppt_unassign_device()
1166 ppt_do_unassign(ppt); in ppt_unassign_device()
1176 struct pptdev *ppt; in ppt_unassign_all() local
1179 for (ppt = list_head(&pptdev_list); ppt != NULL; in ppt_unassign_all()
1180 ppt = list_next(&pptdev_list, ppt)) { in ppt_unassign_all()
1181 if (ppt->vm == vm) { in ppt_unassign_all()
1182 ppt_do_unassign(ppt); in ppt_unassign_all()
1192 struct pptdev *ppt; in ppt_map_mmio() local
1201 err = ppt_findf(vm, pptfd, &ppt); in ppt_map_mmio()
1211 if (!ppt_bar_verify_mmio(ppt, hpa, len)) { in ppt_map_mmio()
1217 struct pptseg *seg = &ppt->mmio[i]; in ppt_map_mmio()
1239 struct pptdev *ppt; in ppt_unmap_mmio() local
1244 err = ppt_findf(vm, pptfd, &ppt); in ppt_unmap_mmio()
1251 struct pptseg *seg = &ppt->mmio[i]; in ppt_unmap_mmio()
1273 struct pptdev *ppt = pptarg->pptdev; in pptintr() local
1275 if (ppt->vm != NULL) { in pptintr()
1276 lapic_intr_msi(ppt->vm, pptarg->addr, pptarg->msg_data); in pptintr()
1288 return (ppt->msi.is_fixed ? DDI_INTR_UNCLAIMED : DDI_INTR_CLAIMED); in pptintr()
1296 struct pptdev *ppt; in ppt_setup_msi() local
1303 err = ppt_findf(vm, pptfd, &ppt); in ppt_setup_msi()
1310 if (ppt->msix.num_msgs != 0 && numvec != 0) { in ppt_setup_msi()
1316 ppt_teardown_msi(ppt); in ppt_setup_msi()
1323 if (ddi_intr_get_navail(ppt->pptd_dip, DDI_INTR_TYPE_MSI, in ppt_setup_msi()
1325 if (ddi_intr_get_navail(ppt->pptd_dip, DDI_INTR_TYPE_FIXED, in ppt_setup_msi()
1332 ppt->msi.is_fixed = B_TRUE; in ppt_setup_msi()
1346 ppt->msi.inth_sz = numvec * sizeof (ddi_intr_handle_t); in ppt_setup_msi()
1347 ppt->msi.inth = kmem_zalloc(ppt->msi.inth_sz, KM_SLEEP); in ppt_setup_msi()
1348 if (ddi_intr_alloc(ppt->pptd_dip, ppt->msi.inth, intr_type, 0, in ppt_setup_msi()
1350 kmem_free(ppt->msi.inth, ppt->msi.inth_sz); in ppt_setup_msi()
1357 ppt_teardown_msi(ppt); in ppt_setup_msi()
1366 ppt->msi.num_msgs = i + 1; in ppt_setup_msi()
1367 ppt->msi.arg[i].pptdev = ppt; in ppt_setup_msi()
1368 ppt->msi.arg[i].addr = addr; in ppt_setup_msi()
1369 ppt->msi.arg[i].msg_data = msg + i; in ppt_setup_msi()
1371 if (ddi_intr_add_handler(ppt->msi.inth[i], pptintr, in ppt_setup_msi()
1372 &ppt->msi.arg[i], NULL) != DDI_SUCCESS) in ppt_setup_msi()
1375 (void) ddi_intr_get_cap(ppt->msi.inth[i], &intr_cap); in ppt_setup_msi()
1377 res = ddi_intr_block_enable(&ppt->msi.inth[i], 1); in ppt_setup_msi()
1379 res = ddi_intr_enable(ppt->msi.inth[i]); in ppt_setup_msi()
1385 ppt_teardown_msi(ppt); in ppt_setup_msi()
1399 struct pptdev *ppt; in ppt_setup_msix() local
1404 err = ppt_findf(vm, pptfd, &ppt); in ppt_setup_msix()
1411 if (ppt->msi.num_msgs != 0) { in ppt_setup_msix()
1422 if (ppt->msix.num_msgs == 0) { in ppt_setup_msix()
1423 dev_info_t *dip = ppt->pptd_dip; in ppt_setup_msix()
1431 ppt->msix.num_msgs = numvec; in ppt_setup_msix()
1433 ppt->msix.arg_sz = numvec * sizeof (ppt->msix.arg[0]); in ppt_setup_msix()
1434 ppt->msix.arg = kmem_zalloc(ppt->msix.arg_sz, KM_SLEEP); in ppt_setup_msix()
1435 ppt->msix.inth_sz = numvec * sizeof (ddi_intr_handle_t); in ppt_setup_msix()
1436 ppt->msix.inth = kmem_zalloc(ppt->msix.inth_sz, KM_SLEEP); in ppt_setup_msix()
1438 if (ddi_intr_alloc(dip, ppt->msix.inth, DDI_INTR_TYPE_MSIX, 0, in ppt_setup_msix()
1440 kmem_free(ppt->msix.arg, ppt->msix.arg_sz); in ppt_setup_msix()
1441 kmem_free(ppt->msix.inth, ppt->msix.inth_sz); in ppt_setup_msix()
1442 ppt->msix.arg = NULL; in ppt_setup_msix()
1443 ppt->msix.inth = NULL; in ppt_setup_msix()
1444 ppt->msix.arg_sz = ppt->msix.inth_sz = 0; in ppt_setup_msix()
1450 ppt_teardown_msix(ppt); in ppt_setup_msix()
1456 if (idx >= ppt->msix.num_msgs) { in ppt_setup_msix()
1465 ppt_teardown_msix_intr(ppt, idx); in ppt_setup_msix()
1467 ppt->msix.arg[idx].pptdev = ppt; in ppt_setup_msix()
1468 ppt->msix.arg[idx].addr = addr; in ppt_setup_msix()
1469 ppt->msix.arg[idx].msg_data = msg; in ppt_setup_msix()
1472 if (ddi_intr_add_handler(ppt->msix.inth[idx], pptintr, in ppt_setup_msix()
1473 &ppt->msix.arg[idx], NULL) != DDI_SUCCESS) { in ppt_setup_msix()
1478 (void) ddi_intr_get_cap(ppt->msix.inth[idx], &intr_cap); in ppt_setup_msix()
1480 res = ddi_intr_block_enable(&ppt->msix.inth[idx], 1); in ppt_setup_msix()
1482 res = ddi_intr_enable(ppt->msix.inth[idx]); in ppt_setup_msix()
1485 ddi_intr_remove_handler(ppt->msix.inth[idx]); in ppt_setup_msix()
1491 ppt_teardown_msix_intr(ppt, idx); in ppt_setup_msix()
1503 struct pptdev *ppt; in ppt_get_limits() local
1507 err = ppt_findf(vm, pptfd, &ppt); in ppt_get_limits()
1513 if (ddi_intr_get_navail(ppt->pptd_dip, DDI_INTR_TYPE_MSI, in ppt_get_limits()
1517 if (ddi_intr_get_navail(ppt->pptd_dip, DDI_INTR_TYPE_MSIX, in ppt_get_limits()
1530 struct pptdev *ppt; in ppt_disable_msix() local
1534 err = ppt_findf(vm, pptfd, &ppt); in ppt_disable_msix()
1540 ppt_teardown_msix(ppt); in ppt_disable_msix()