Lines Matching +full:pm +full:- +full:bus
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
54 #include <sys/bus.h>
55 #include <machine/bus.h>
68 struct pcisel pc_sel; /* domain+bus+slot+function */
85 struct pcisel pc_sel; /* domain+bus+slot+function */
132 error = securelevel_gt(td->td_ucred, 0); in pci_open()
175 && (match_buf->pc_sel.pc_domain != in pci_conf_match_native()
180 && (match_buf->pc_sel.pc_bus != matches[i].pc_sel.pc_bus)) in pci_conf_match_native()
184 && (match_buf->pc_sel.pc_dev != matches[i].pc_sel.pc_dev)) in pci_conf_match_native()
188 && (match_buf->pc_sel.pc_func != matches[i].pc_sel.pc_func)) in pci_conf_match_native()
192 && (match_buf->pc_vendor != matches[i].pc_vendor)) in pci_conf_match_native()
196 && (match_buf->pc_device != matches[i].pc_device)) in pci_conf_match_native()
200 && (match_buf->pc_class != matches[i].pc_class)) in pci_conf_match_native()
204 && (match_buf->pd_unit != matches[i].pd_unit)) in pci_conf_match_native()
208 && (strncmp(matches[i].pd_name, match_buf->pd_name, in pci_conf_match_native()
209 sizeof(match_buf->pd_name)) != 0)) in pci_conf_match_native()
241 && (match_buf->pc_sel.pc_domain != in pci_conf_match32()
246 && (match_buf->pc_sel.pc_bus != matches[i].pc_sel.pc_bus)) in pci_conf_match32()
250 && (match_buf->pc_sel.pc_dev != matches[i].pc_sel.pc_dev)) in pci_conf_match32()
254 && (match_buf->pc_sel.pc_func != matches[i].pc_sel.pc_func)) in pci_conf_match32()
258 && (match_buf->pc_vendor != matches[i].pc_vendor)) in pci_conf_match32()
262 && (match_buf->pc_device != matches[i].pc_device)) in pci_conf_match32()
266 && (match_buf->pc_class != matches[i].pc_class)) in pci_conf_match32()
270 && (match_buf->pd_unit != matches[i].pd_unit)) in pci_conf_match32()
274 && (strncmp(matches[i].pd_name, match_buf->pd_name, in pci_conf_match32()
275 sizeof(match_buf->pd_name)) != 0)) in pci_conf_match32()
302 u_int8_t pc_bus; /* bus number */
303 u_int8_t pc_dev; /* device on this bus */
308 struct pcisel_freebsd6 pc_sel; /* bus+slot+function */
325 struct pcisel_freebsd6 pc_sel; /* bus+slot+function */
343 struct pcisel_freebsd6 pc_sel; /* bus+slot+function */
360 struct pcisel_freebsd6 pc_sel; /* bus+slot+function */
386 if (match_buf->pc_sel.pc_domain != 0) in pci_conf_match_freebsd6()
401 && (match_buf->pc_sel.pc_bus != matches[i].pc_sel.pc_bus)) in pci_conf_match_freebsd6()
405 && (match_buf->pc_sel.pc_dev != matches[i].pc_sel.pc_dev)) in pci_conf_match_freebsd6()
409 && (match_buf->pc_sel.pc_func != matches[i].pc_sel.pc_func)) in pci_conf_match_freebsd6()
413 && (match_buf->pc_vendor != matches[i].pc_vendor)) in pci_conf_match_freebsd6()
417 && (match_buf->pc_device != matches[i].pc_device)) in pci_conf_match_freebsd6()
421 && (match_buf->pc_class != matches[i].pc_class)) in pci_conf_match_freebsd6()
425 && (match_buf->pd_unit != matches[i].pd_unit)) in pci_conf_match_freebsd6()
429 && (strncmp(matches[i].pd_name, match_buf->pd_name, in pci_conf_match_freebsd6()
430 sizeof(match_buf->pd_name)) != 0)) in pci_conf_match_freebsd6()
450 if (match_buf->pc_sel.pc_domain != 0) in pci_conf_match_freebsd6_32()
465 (match_buf->pc_sel.pc_bus != matches[i].pc_sel.pc_bus)) in pci_conf_match_freebsd6_32()
469 (match_buf->pc_sel.pc_dev != matches[i].pc_sel.pc_dev)) in pci_conf_match_freebsd6_32()
473 (match_buf->pc_sel.pc_func != matches[i].pc_sel.pc_func)) in pci_conf_match_freebsd6_32()
477 (match_buf->pc_vendor != matches[i].pc_vendor)) in pci_conf_match_freebsd6_32()
481 (match_buf->pc_device != matches[i].pc_device)) in pci_conf_match_freebsd6_32()
485 (match_buf->pc_class != matches[i].pc_class)) in pci_conf_match_freebsd6_32()
489 ((u_int32_t)match_buf->pd_unit != matches[i].pd_unit)) in pci_conf_match_freebsd6_32()
493 (strncmp(matches[i].pd_name, match_buf->pd_name, in pci_conf_match_freebsd6_32()
494 sizeof(match_buf->pd_name)) != 0)) in pci_conf_match_freebsd6_32()
567 if (vpd->vpd_reg == 0 || vpd->vpd_ident == NULL) in pci_list_vpd()
572 * identifier element is always present followed by the read-only in pci_list_vpd()
573 * and read-write keywords. in pci_list_vpd()
575 len = sizeof(struct pci_vpd_element) + strlen(vpd->vpd_ident); in pci_list_vpd()
576 for (i = 0; i < vpd->vpd_rocnt; i++) in pci_list_vpd()
577 len += sizeof(struct pci_vpd_element) + vpd->vpd_ros[i].len; in pci_list_vpd()
578 for (i = 0; i < vpd->vpd_wcnt; i++) in pci_list_vpd()
579 len += sizeof(struct pci_vpd_element) + vpd->vpd_w[i].len; in pci_list_vpd()
581 if (lvio->plvi_len == 0) { in pci_list_vpd()
582 lvio->plvi_len = len; in pci_list_vpd()
585 if (lvio->plvi_len < len) { in pci_list_vpd()
586 lvio->plvi_len = len; in pci_list_vpd()
594 datalen = strlen(vpd->vpd_ident); in pci_list_vpd()
596 vpd_user = lvio->plvi_data; in pci_list_vpd()
604 error = copyout(vpd->vpd_ident, vpd_user->pve_data, datalen); in pci_list_vpd()
609 for (i = 0; i < vpd->vpd_rocnt; i++) { in pci_list_vpd()
610 vpd_element.pve_keyword[0] = vpd->vpd_ros[i].keyword[0]; in pci_list_vpd()
611 vpd_element.pve_keyword[1] = vpd->vpd_ros[i].keyword[1]; in pci_list_vpd()
612 vpd_element.pve_datalen = vpd->vpd_ros[i].len; in pci_list_vpd()
616 error = copyout(vpd->vpd_ros[i].value, vpd_user->pve_data, in pci_list_vpd()
617 vpd->vpd_ros[i].len); in pci_list_vpd()
623 for (i = 0; i < vpd->vpd_wcnt; i++) { in pci_list_vpd()
624 vpd_element.pve_keyword[0] = vpd->vpd_w[i].keyword[0]; in pci_list_vpd()
625 vpd_element.pve_keyword[1] = vpd->vpd_w[i].keyword[1]; in pci_list_vpd()
626 vpd_element.pve_datalen = vpd->vpd_w[i].len; in pci_list_vpd()
630 error = copyout(vpd->vpd_w[i].value, vpd_user->pve_data, in pci_list_vpd()
631 vpd->vpd_w[i].len); in pci_list_vpd()
636 KASSERT((char *)vpd_user - (char *)lvio->plvi_data == len, in pci_list_vpd()
638 lvio->plvi_len = len; in pci_list_vpd()
713 cio->pat_buf_len = cio32->pat_buf_len; in pci_conf_io_init()
714 cio->num_patterns = cio32->num_patterns; in pci_conf_io_init()
715 cio->patterns = (void *)(uintptr_t)cio32->patterns; in pci_conf_io_init()
716 cio->match_buf_len = cio32->match_buf_len; in pci_conf_io_init()
717 cio->num_matches = cio32->num_matches; in pci_conf_io_init()
718 cio->matches = (void *)(uintptr_t)cio32->matches; in pci_conf_io_init()
719 cio->offset = cio32->offset; in pci_conf_io_init()
720 cio->generation = cio32->generation; in pci_conf_io_init()
721 cio->status = cio32->status; in pci_conf_io_init()
746 d_cio->status = cio->status; in pci_conf_io_update_data()
747 d_cio->generation = cio->generation; in pci_conf_io_update_data()
748 d_cio->offset = cio->offset; in pci_conf_io_update_data()
749 d_cio->num_matches = cio->num_matches; in pci_conf_io_update_data()
759 cio32->status = cio->status; in pci_conf_io_update_data()
760 cio32->generation = cio->generation; in pci_conf_io_update_data()
761 cio32->offset = cio->offset; in pci_conf_io_update_data()
762 cio32->num_matches = cio->num_matches; in pci_conf_io_update_data()
781 pcup->pc = *pcp; in pci_conf_for_copyout()
786 pcup->pc32.pc_sel = pcp->pc_sel; in pci_conf_for_copyout()
787 pcup->pc32.pc_hdr = pcp->pc_hdr; in pci_conf_for_copyout()
788 pcup->pc32.pc_subvendor = pcp->pc_subvendor; in pci_conf_for_copyout()
789 pcup->pc32.pc_subdevice = pcp->pc_subdevice; in pci_conf_for_copyout()
790 pcup->pc32.pc_vendor = pcp->pc_vendor; in pci_conf_for_copyout()
791 pcup->pc32.pc_device = pcp->pc_device; in pci_conf_for_copyout()
792 pcup->pc32.pc_class = pcp->pc_class; in pci_conf_for_copyout()
793 pcup->pc32.pc_subclass = pcp->pc_subclass; in pci_conf_for_copyout()
794 pcup->pc32.pc_progif = pcp->pc_progif; in pci_conf_for_copyout()
795 pcup->pc32.pc_revid = pcp->pc_revid; in pci_conf_for_copyout()
796 strlcpy(pcup->pc32.pd_name, pcp->pd_name, in pci_conf_for_copyout()
797 sizeof(pcup->pc32.pd_name)); in pci_conf_for_copyout()
798 pcup->pc32.pd_unit = (uint32_t)pcp->pd_unit; in pci_conf_for_copyout()
805 pcup->pco32.pc_sel.pc_bus = pcp->pc_sel.pc_bus; in pci_conf_for_copyout()
806 pcup->pco32.pc_sel.pc_dev = pcp->pc_sel.pc_dev; in pci_conf_for_copyout()
807 pcup->pco32.pc_sel.pc_func = pcp->pc_sel.pc_func; in pci_conf_for_copyout()
808 pcup->pco32.pc_hdr = pcp->pc_hdr; in pci_conf_for_copyout()
809 pcup->pco32.pc_subvendor = pcp->pc_subvendor; in pci_conf_for_copyout()
810 pcup->pco32.pc_subdevice = pcp->pc_subdevice; in pci_conf_for_copyout()
811 pcup->pco32.pc_vendor = pcp->pc_vendor; in pci_conf_for_copyout()
812 pcup->pco32.pc_device = pcp->pc_device; in pci_conf_for_copyout()
813 pcup->pco32.pc_class = pcp->pc_class; in pci_conf_for_copyout()
814 pcup->pco32.pc_subclass = pcp->pc_subclass; in pci_conf_for_copyout()
815 pcup->pco32.pc_progif = pcp->pc_progif; in pci_conf_for_copyout()
816 pcup->pco32.pc_revid = pcp->pc_revid; in pci_conf_for_copyout()
817 strlcpy(pcup->pco32.pd_name, pcp->pd_name, in pci_conf_for_copyout()
818 sizeof(pcup->pco32.pd_name)); in pci_conf_for_copyout()
819 pcup->pco32.pd_unit = (uint32_t)pcp->pd_unit; in pci_conf_for_copyout()
824 pcup->pco.pc_sel.pc_bus = pcp->pc_sel.pc_bus; in pci_conf_for_copyout()
825 pcup->pco.pc_sel.pc_dev = pcp->pc_sel.pc_dev; in pci_conf_for_copyout()
826 pcup->pco.pc_sel.pc_func = pcp->pc_sel.pc_func; in pci_conf_for_copyout()
827 pcup->pco.pc_hdr = pcp->pc_hdr; in pci_conf_for_copyout()
828 pcup->pco.pc_subvendor = pcp->pc_subvendor; in pci_conf_for_copyout()
829 pcup->pco.pc_subdevice = pcp->pc_subdevice; in pci_conf_for_copyout()
830 pcup->pco.pc_vendor = pcp->pc_vendor; in pci_conf_for_copyout()
831 pcup->pco.pc_device = pcp->pc_device; in pci_conf_for_copyout()
832 pcup->pco.pc_class = pcp->pc_class; in pci_conf_for_copyout()
833 pcup->pco.pc_subclass = pcp->pc_subclass; in pci_conf_for_copyout()
834 pcup->pco.pc_progif = pcp->pc_progif; in pci_conf_for_copyout()
835 pcup->pco.pc_revid = pcp->pc_revid; in pci_conf_for_copyout()
836 strlcpy(pcup->pco.pd_name, pcp->pd_name, in pci_conf_for_copyout()
837 sizeof(pcup->pco.pd_name)); in pci_conf_for_copyout()
838 pcup->pco.pd_unit = pcp->pd_unit; in pci_conf_for_copyout()
855 struct pci_map *pm; in pci_bar_mmap() local
864 map = &td->td_proc->p_vmspace->vm_map; in pci_bar_mmap()
865 if ((pbm->pbm_flags & ~(PCIIO_BAR_MMAP_FIXED | PCIIO_BAR_MMAP_EXCL | in pci_bar_mmap()
867 pbm->pbm_memattr != (vm_memattr_t)pbm->pbm_memattr || in pci_bar_mmap()
868 !pmap_is_valid_memattr(map->pmap, pbm->pbm_memattr)) in pci_bar_mmap()
872 pm = pci_find_bar(pcidev, pbm->pbm_reg); in pci_bar_mmap()
873 if (pm == NULL) in pci_bar_mmap()
875 if (!pci_bar_enabled(pcidev, pm)) in pci_bar_mmap()
877 if (!PCI_BAR_MEM(pm->pm_value)) in pci_bar_mmap()
880 pm->pm_value & PCIM_BAR_MEM_BASE, &membase); in pci_bar_mmap()
885 plen = round_page(membase + ((pci_addr_t)1 << pm->pm_size)) - in pci_bar_mmap()
887 prot = VM_PROT_READ | (((pbm->pbm_flags & PCIIO_BAR_MMAP_RW) != 0) ? in pci_bar_mmap()
895 obj = vm_pager_allocate(OBJT_SG, sg, plen, prot, 0, td->td_ucred); in pci_bar_mmap()
900 obj->memattr = pbm->pbm_memattr; in pci_bar_mmap()
903 if ((pbm->pbm_flags & PCIIO_BAR_MMAP_FIXED) != 0) { in pci_bar_mmap()
904 addr = (uintptr_t)pbm->pbm_map_base; in pci_bar_mmap()
907 if ((pbm->pbm_flags & PCIIO_BAR_MMAP_EXCL) != 0) in pci_bar_mmap()
915 pbm->pbm_map_base = (void *)addr; in pci_bar_mmap()
916 pbm->pbm_map_length = plen; in pci_bar_mmap()
917 pbm->pbm_bar_off = membase - pbase; in pci_bar_mmap()
918 pbm->pbm_bar_length = (pci_addr_t)1 << pm->pm_size; in pci_bar_mmap()
928 struct pci_map *pm; in pci_bar_io() local
933 if (pbi->pbi_op != PCIBARIO_READ && in pci_bar_io()
934 pbi->pbi_op != PCIBARIO_WRITE) in pci_bar_io()
937 bar = PCIR_BAR(pbi->pbi_bar); in pci_bar_io()
938 pm = pci_find_bar(pcidev, bar); in pci_bar_io()
939 if (pm == NULL) in pci_bar_io()
942 offset = pbi->pbi_offset; in pci_bar_io()
943 width = pbi->pbi_width; in pci_bar_io()
946 ((pci_addr_t)1 << pm->pm_size) < offset + width) in pci_bar_io()
949 type = PCI_BAR_MEM(pm->pm_value) ? SYS_RES_MEMORY : SYS_RES_IOPORT; in pci_bar_io()
961 switch (pbi->pbi_op) { in pci_bar_io()
963 switch (pbi->pbi_width) { in pci_bar_io()
965 pbi->pbi_value = bus_read_1(res, offset); in pci_bar_io()
968 pbi->pbi_value = bus_read_2(res, offset); in pci_bar_io()
971 pbi->pbi_value = bus_read_4(res, offset); in pci_bar_io()
975 pbi->pbi_value = bus_read_8(res, offset); in pci_bar_io()
984 switch (pbi->pbi_width) { in pci_bar_io()
986 bus_write_1(res, offset, pbi->pbi_value); in pci_bar_io()
989 bus_write_2(res, offset, pbi->pbi_value); in pci_bar_io()
992 bus_write_4(res, offset, pbi->pbi_value); in pci_bar_io()
996 bus_write_8(res, offset, pbi->pbi_value); in pci_bar_io()
1024 struct pci_map *pm; in pci_ioctl() local
1037 * Interpret read-only opened /dev/pci as a promise that no in pci_ioctl()
1039 * including side-effects due to reading devices registers. in pci_ioctl()
1062 * Use bus topology lock to ensure that the pci list of devies doesn't in pci_ioctl()
1085 cio->num_matches = 0; in pci_ioctl()
1093 if ((cio->offset != 0) in pci_ioctl()
1094 && (cio->generation != pci_generation)){ in pci_ioctl()
1095 cio->status = PCI_GETCONF_LIST_CHANGED; in pci_ioctl()
1104 if (cio->offset >= pci_numdevs) { in pci_ioctl()
1105 cio->status = PCI_GETCONF_LAST_DEVICE; in pci_ioctl()
1120 iolen = min(cio->match_buf_len - (cio->match_buf_len % confsz), in pci_ioctl()
1133 if ((cio->num_patterns > 0) && (cio->num_patterns < pci_numdevs) in pci_ioctl()
1134 && (cio->pat_buf_len > 0)) { in pci_ioctl()
1148 if (cio->num_patterns * pci_match_conf_size(cmd) != in pci_ioctl()
1149 cio->pat_buf_len) { in pci_ioctl()
1151 cio->status = PCI_GETCONF_ERROR; in pci_ioctl()
1159 pattern_buf = malloc(cio->pat_buf_len, M_TEMP, in pci_ioctl()
1161 error = copyin(cio->patterns, pattern_buf, in pci_ioctl()
1162 cio->pat_buf_len); in pci_ioctl()
1167 num_patterns = cio->num_patterns; in pci_ioctl()
1168 } else if ((cio->num_patterns > 0) in pci_ioctl()
1169 || (cio->pat_buf_len > 0)) { in pci_ioctl()
1173 cio->status = PCI_GETCONF_ERROR; in pci_ioctl()
1182 for (cio->num_matches = 0, i = 0, in pci_ioctl()
1186 if (i < cio->offset) in pci_ioctl()
1191 if (dinfo->cfg.dev) in pci_ioctl()
1192 name = device_get_name(dinfo->cfg.dev); in pci_ioctl()
1194 strncpy(dinfo->conf.pd_name, name, in pci_ioctl()
1195 sizeof(dinfo->conf.pd_name)); in pci_ioctl()
1196 dinfo->conf.pd_name[PCI_MAXNAMELEN] = 0; in pci_ioctl()
1197 dinfo->conf.pd_unit = in pci_ioctl()
1198 device_get_unit(dinfo->cfg.dev); in pci_ioctl()
1200 dinfo->conf.pd_name[0] = '\0'; in pci_ioctl()
1201 dinfo->conf.pd_unit = 0; in pci_ioctl()
1206 &dinfo->conf) == 0) { in pci_ioctl()
1215 if (cio->num_matches >= ionum) { in pci_ioctl()
1220 pci_conf_for_copyout(&dinfo->conf, &pcu, cmd); in pci_ioctl()
1222 (caddr_t)cio->matches + in pci_ioctl()
1223 confsz * cio->num_matches, confsz); in pci_ioctl()
1226 cio->num_matches++; in pci_ioctl()
1234 cio->offset = i; in pci_ioctl()
1240 cio->generation = pci_generation; in pci_ioctl()
1249 cio->status = PCI_GETCONF_LAST_DEVICE; in pci_ioctl()
1251 cio->status = PCI_GETCONF_MORE_DEVS; in pci_ioctl()
1265 iodata.pi_sel.pc_bus = io_freebsd6->pi_sel.pc_bus; in pci_ioctl()
1266 iodata.pi_sel.pc_dev = io_freebsd6->pi_sel.pc_dev; in pci_ioctl()
1267 iodata.pi_sel.pc_func = io_freebsd6->pi_sel.pc_func; in pci_ioctl()
1268 iodata.pi_reg = io_freebsd6->pi_reg; in pci_ioctl()
1269 iodata.pi_width = io_freebsd6->pi_width; in pci_ioctl()
1270 iodata.pi_data = io_freebsd6->pi_data; in pci_ioctl()
1277 switch(io->pi_width) { in pci_ioctl()
1282 if (io->pi_reg < 0 || in pci_ioctl()
1283 io->pi_reg & (io->pi_width - 1)) { in pci_ioctl()
1288 * Assume that the user-level bus number is in pci_ioctl()
1289 * in fact the physical PCI bus number. in pci_ioctl()
1293 pcidev = pci_find_dbsf(io->pi_sel.pc_domain, in pci_ioctl()
1294 io->pi_sel.pc_bus, io->pi_sel.pc_dev, in pci_ioctl()
1295 io->pi_sel.pc_func); in pci_ioctl()
1303 io->pi_reg, in pci_ioctl()
1304 io->pi_data, in pci_ioctl()
1305 io->pi_width); in pci_ioctl()
1308 io_freebsd6->pi_data = in pci_ioctl()
1310 io->pi_reg, in pci_ioctl()
1311 io->pi_width); in pci_ioctl()
1314 io->pi_data = in pci_ioctl()
1316 io->pi_reg, in pci_ioctl()
1317 io->pi_width); in pci_ioctl()
1322 io_freebsd6->pi_data = -1; in pci_ioctl()
1339 * Assume that the user-level bus number is in pci_ioctl()
1340 * in fact the physical PCI bus number. in pci_ioctl()
1342 pcidev = pci_find_dbsf(bio->pbi_sel.pc_domain, in pci_ioctl()
1343 bio->pbi_sel.pc_bus, bio->pbi_sel.pc_dev, in pci_ioctl()
1344 bio->pbi_sel.pc_func); in pci_ioctl()
1349 pm = pci_find_bar(pcidev, bio->pbi_reg); in pci_ioctl()
1350 if (pm == NULL) { in pci_ioctl()
1354 bio->pbi_base = pm->pm_value; in pci_ioctl()
1355 bio->pbi_length = (pci_addr_t)1 << pm->pm_size; in pci_ioctl()
1356 bio->pbi_enabled = pci_bar_enabled(pcidev, pm); in pci_ioctl()
1362 pcidev = pci_find_dbsf(io->pi_sel.pc_domain, io->pi_sel.pc_bus, in pci_ioctl()
1363 io->pi_sel.pc_dev, io->pi_sel.pc_func); in pci_ioctl()
1365 io->pi_data = device_is_attached(pcidev); in pci_ioctl()
1373 * Assume that the user-level bus number is in pci_ioctl()
1374 * in fact the physical PCI bus number. in pci_ioctl()
1376 pcidev = pci_find_dbsf(lvio->plvi_sel.pc_domain, in pci_ioctl()
1377 lvio->plvi_sel.pc_bus, lvio->plvi_sel.pc_dev, in pci_ioctl()
1378 lvio->plvi_sel.pc_func); in pci_ioctl()
1389 (pbm->pbm_flags & PCIIO_BAR_MMAP_RW) != 0) { in pci_ioctl()
1393 pcidev = pci_find_dbsf(pbm->pbm_sel.pc_domain, in pci_ioctl()
1394 pbm->pbm_sel.pc_bus, pbm->pbm_sel.pc_dev, in pci_ioctl()
1395 pbm->pbm_sel.pc_func); in pci_ioctl()
1402 pcidev = pci_find_dbsf(pbi->pbi_sel.pc_domain, in pci_ioctl()
1403 pbi->pbi_sel.pc_bus, pbi->pbi_sel.pc_dev, in pci_ioctl()
1404 pbi->pbi_sel.pc_func); in pci_ioctl()