Lines Matching refs:pb

274 get_io_desc(pciconf_bus_t *pb, bus_size_t size)  in get_io_desc()  argument
278 n = pb->niowin; in get_io_desc()
279 for (i = n; i > 0 && size > pb->pciiowin[i-1].size; i--) in get_io_desc()
280 pb->pciiowin[i] = pb->pciiowin[i-1]; /* struct copy */ in get_io_desc()
281 return &pb->pciiowin[i]; in get_io_desc()
285 get_mem_desc(pciconf_bus_t *pb, bus_size_t size) in get_mem_desc() argument
289 n = pb->nmemwin; in get_mem_desc()
290 for (i = n; i > 0 && size > pb->pcimemwin[i-1].size; i--) in get_mem_desc()
291 pb->pcimemwin[i] = pb->pcimemwin[i-1]; /* struct copy */ in get_mem_desc()
292 return &pb->pcimemwin[i]; in get_mem_desc()
300 probe_bus(pciconf_bus_t *pb) in probe_bus() argument
306 pb->ndevs = 0; in probe_bus()
307 pb->niowin = 0; in probe_bus()
308 pb->nmemwin = 0; in probe_bus()
309 pb->freq_66 = 1; in probe_bus()
311 pb->fast_b2b = 0; in probe_bus()
313 pb->fast_b2b = 1; in probe_bus()
315 pb->prefetch = 1; in probe_bus()
316 pb->max_mingnt = 0; /* we are looking for the maximum */ in probe_bus()
317 pb->min_maxlat = 0x100; /* we are looking for the minimum */ in probe_bus()
318 pb->bandwidth_used = 0; in probe_bus()
320 n = pci_bus_devorder(pb->pc, pb->busno, devs, __arraycount(devs)); in probe_bus()
329 tag = pci_make_tag(pb->pc, pb->busno, device, 0); in probe_bus()
331 print_tag(pb->pc, tag); in probe_bus()
333 id = pci_conf_read(pb->pc, tag, PCI_ID_REG); in probe_bus()
343 bhlcr = pci_conf_read(pb->pc, tag, PCI_BHLC_REG); in probe_bus()
346 tag = pci_make_tag(pb->pc, pb->busno, device, function); in probe_bus()
347 id = pci_conf_read(pb->pc, tag, PCI_ID_REG); in probe_bus()
350 if (pb->ndevs + 1 < MAX_CONF_DEV) { in probe_bus()
352 print_tag(pb->pc, tag); in probe_bus()
358 confmode = pci_conf_hook(pb->pc, pb->busno, in probe_bus()
372 if (pci_do_device_query(pb, tag, device, in probe_bus()
375 pb->ndevs++; in probe_bus()
383 alloc_busno(pciconf_bus_t *parent, pciconf_bus_t *pb) in alloc_busno() argument
385 pb->busno = parent->next_busno; in alloc_busno()
386 pb->next_busno = pb->busno + 1; in alloc_busno()
403 pciconf_bus_t *pb; in query_bus() local
407 pb = kmem_zalloc(sizeof (pciconf_bus_t), KM_SLEEP); in query_bus()
408 pb->cacheline_size = parent->cacheline_size; in query_bus()
409 pb->parent_bus = parent; in query_bus()
410 alloc_busno(parent, pb); in query_bus()
412 pb->mem_align = 0x100000; /* 1M alignment */ in query_bus()
413 pb->pmem_align = 0x100000; /* 1M alignment */ in query_bus()
414 pb->io_align = 0x1000; /* 4K alignment */ in query_bus()
416 set_busreg(parent->pc, pd->tag, parent->busno, pb->busno, 0xff); in query_bus()
418 pb->swiz = parent->swiz + dev; in query_bus()
420 memset(&pb->io_res, 0, sizeof(pb->io_res)); in query_bus()
421 memset(&pb->mem_res, 0, sizeof(pb->mem_res)); in query_bus()
422 memset(&pb->pmem_res, 0, sizeof(pb->pmem_res)); in query_bus()
424 pb->pc = parent->pc; in query_bus()
425 pb->io_total = pb->mem_total = pb->pmem_total = 0; in query_bus()
427 pb->io_32bit = 0; in query_bus()
431 pb->io_32bit = 1; in query_bus()
434 pb->pmem_64bit = 0; in query_bus()
439 pb->pmem_64bit = 1; in query_bus()
443 pb->mem_64bit = 0; in query_bus()
445 if (probe_bus(pb)) { in query_bus()
446 printf("Failed to probe bus %d\n", pb->busno); in query_bus()
451 pb->last_busno = pb->next_busno - 1; in query_bus()
452 parent->next_busno = pb->next_busno; in query_bus()
453 set_busreg(parent->pc, pd->tag, parent->busno, pb->busno, in query_bus()
454 pb->last_busno); in query_bus()
457 parent->busno, pb->busno, pb->last_busno); in query_bus()
459 if (pb->io_total > 0) { in query_bus()
465 pb->io_total |= pb->io_align - 1; /* Round up */ in query_bus()
466 pi = get_io_desc(parent, pb->io_total); in query_bus()
469 pi->size = pb->io_total; in query_bus()
470 pi->align = pb->io_align; /* 4K min alignment */ in query_bus()
471 if (parent->io_align < pb->io_align) in query_bus()
472 parent->io_align = pb->io_align; in query_bus()
475 parent->io_total += pb->io_total; in query_bus()
478 if (pb->mem_total > 0) { in query_bus()
484 pb->mem_total |= pb->mem_align - 1; /* Round up */ in query_bus()
485 pm = get_mem_desc(parent, pb->mem_total); in query_bus()
488 pm->size = pb->mem_total; in query_bus()
489 pm->align = pb->mem_align; /* 1M min alignment */ in query_bus()
490 if (parent->mem_align < pb->mem_align) in query_bus()
491 parent->mem_align = pb->mem_align; in query_bus()
494 parent->mem_total += pb->mem_total; in query_bus()
497 if (pb->pmem_total > 0) { in query_bus()
502 pb->pmem_total |= pb->pmem_align - 1; /* Round up */ in query_bus()
503 pm = get_mem_desc(parent, pb->pmem_total); in query_bus()
506 pm->size = pb->pmem_total; in query_bus()
507 pm->align = pb->pmem_align; /* 1M alignment */ in query_bus()
508 if (parent->pmem_align < pb->pmem_align) in query_bus()
509 parent->pmem_align = pb->pmem_align; in query_bus()
512 parent->pmem_total += pb->pmem_total; in query_bus()
515 return pb; in query_bus()
517 kmem_free(pb, sizeof(*pb)); in query_bus()
537 pci_bar_is_reserved(pciconf_bus_t *pb, pciconf_dev_t *pd, int br) in pci_bar_is_reserved() argument
555 base = pci_conf_read(pb->pc, tag, br); in pci_bar_is_reserved()
556 pci_conf_write(pb->pc, tag, br, 0xffffffff); in pci_bar_is_reserved()
557 mask = pci_conf_read(pb->pc, tag, br); in pci_bar_is_reserved()
558 pci_conf_write(pb->pc, tag, br, base); in pci_bar_is_reserved()
568 base64 = pci_conf_read(pb->pc, tag, br + 4); in pci_bar_is_reserved()
569 pci_conf_write(pb->pc, tag, br + 4, 0xffffffff); in pci_bar_is_reserved()
570 mask64 = pci_conf_read(pb->pc, tag, br + 4); in pci_bar_is_reserved()
571 pci_conf_write(pb->pc, tag, br + 4, base64); in pci_bar_is_reserved()
588 pci_do_device_query(pciconf_bus_t *pb, pcitag_t tag, int dev, int func, in pci_do_device_query() argument
598 pd = &pb->device[pb->ndevs]; in pci_do_device_query()
599 pd->pc = pb->pc; in pci_do_device_query()
605 classreg = pci_conf_read(pb->pc, tag, PCI_CLASS_REG); in pci_do_device_query()
607 cmd = pci_conf_read(pb->pc, tag, PCI_COMMAND_STATUS_REG); in pci_do_device_query()
608 bhlc = pci_conf_read(pb->pc, tag, PCI_BHLC_REG); in pci_do_device_query()
610 if (pci_get_capability(pb->pc, tag, PCI_CAP_EA, &pd->ea_cap_ptr, in pci_do_device_query()
613 print_tag(pb->pc, tag); in pci_do_device_query()
622 pci_conf_write(pb->pc, tag, PCI_COMMAND_STATUS_REG, cmd); in pci_do_device_query()
624 print_tag(pb->pc, tag); in pci_do_device_query()
629 pb->fast_b2b = 0; in pci_do_device_query()
632 pb->freq_66 = 0; in pci_do_device_query()
640 pd->ppb = query_bus(pb, pd, dev); in pci_do_device_query()
648 busreg = pci_conf_read(pb->pc, tag, PCI_BUSNUM); in pci_do_device_query()
650 __SHIFTIN(pb->busno, PCI_BRIDGE_BUS_PRIMARY) | in pci_do_device_query()
651 __SHIFTIN(pb->next_busno, PCI_BRIDGE_BUS_SECONDARY) | in pci_do_device_query()
652 __SHIFTIN(pb->next_busno, PCI_BRIDGE_BUS_SUBORDINATE); in pci_do_device_query()
653 pci_conf_write(pb->pc, tag, PCI_BUSNUM, busreg); in pci_do_device_query()
655 pb->next_busno++; in pci_do_device_query()
661 icr = pci_conf_read(pb->pc, tag, PCI_INTERRUPT_REG); in pci_do_device_query()
667 pci_conf_interrupt(pb->pc, pb->busno, dev, pd->ipin, pb->swiz, in pci_do_device_query()
671 pci_conf_write(pb->pc, tag, PCI_INTERRUPT_REG, icr); in pci_do_device_query()
675 if (pd->min_gnt != 0 && pd->min_gnt > pb->max_mingnt) in pci_do_device_query()
676 pb->max_mingnt = pd->min_gnt; in pci_do_device_query()
678 if (pd->max_lat != 0 && pd->max_lat < pb->min_maxlat) in pci_do_device_query()
679 pb->min_maxlat = pd->max_lat; in pci_do_device_query()
681 pb->bandwidth_used += pd->min_gnt * 4000000 / in pci_do_device_query()
694 bar = pci_conf_read(pb->pc, tag, br); in pci_do_device_query()
695 pci_conf_write(pb->pc, tag, br, 0xffffffff); in pci_do_device_query()
696 mask = pci_conf_read(pb->pc, tag, br); in pci_do_device_query()
697 pci_conf_write(pb->pc, tag, br, bar); in pci_do_device_query()
711 print_tag(pb->pc, tag); in pci_do_device_query()
717 if (pb->niowin >= MAX_CONF_IO) { in pci_do_device_query()
722 pi = get_io_desc(pb, size); in pci_do_device_query()
727 if (pb->io_align < pi->size) in pci_do_device_query()
728 pb->io_align = pi->size; in pci_do_device_query()
731 print_tag(pb->pc, tag); in pci_do_device_query()
735 pb->niowin++; in pci_do_device_query()
736 pb->io_total += size; in pci_do_device_query()
745 bar64 = pci_conf_read(pb->pc, tag, br + 4); in pci_do_device_query()
746 pci_conf_write(pb->pc, tag, br + 4, 0xffffffff); in pci_do_device_query()
747 mask64 = pci_conf_read(pb->pc, tag, br + 4); in pci_do_device_query()
748 pci_conf_write(pb->pc, tag, br + 4, bar64); in pci_do_device_query()
754 print_tag(pb->pc, tag); in pci_do_device_query()
762 print_tag(pb->pc, tag); in pci_do_device_query()
771 print_tag(pb->pc, tag); in pci_do_device_query()
780 if (pb->nmemwin >= MAX_CONF_MEM) { in pci_do_device_query()
785 pm = get_mem_desc(pb, size); in pci_do_device_query()
792 print_tag(pb->pc, tag); in pci_do_device_query()
796 pb->nmemwin++; in pci_do_device_query()
798 pb->pmem_total += size; in pci_do_device_query()
799 if (pb->pmem_align < pm->size) in pci_do_device_query()
800 pb->pmem_align = pm->size; in pci_do_device_query()
802 pb->mem_total += size; in pci_do_device_query()
803 if (pb->mem_align < pm->size) in pci_do_device_query()
804 pb->mem_align = pm->size; in pci_do_device_query()
810 bar = pci_conf_read(pb->pc, tag, PCI_MAPREG_ROM); in pci_do_device_query()
811 pci_conf_write(pb->pc, tag, PCI_MAPREG_ROM, 0xfffffffe); in pci_do_device_query()
812 mask = pci_conf_read(pb->pc, tag, PCI_MAPREG_ROM); in pci_do_device_query()
813 pci_conf_write(pb->pc, tag, PCI_MAPREG_ROM, bar); in pci_do_device_query()
816 if (pb->nmemwin >= MAX_CONF_MEM) { in pci_do_device_query()
822 pm = get_mem_desc(pb, size); in pci_do_device_query()
829 print_tag(pb->pc, tag); in pci_do_device_query()
833 pb->nmemwin++; in pci_do_device_query()
835 pb->pmem_total += size; in pci_do_device_query()
836 if (pb->pmem_align < pm->size) in pci_do_device_query()
837 pb->pmem_align = pm->size; in pci_do_device_query()
839 pb->mem_total += size; in pci_do_device_query()
840 if (pb->mem_align < pm->size) in pci_do_device_query()
841 pb->mem_align = pm->size; in pci_do_device_query()
852 bar = pci_conf_read(pb->pc, tag, PCI_MAPREG_ROM); in pci_do_device_query()
853 pci_conf_write(pb->pc, tag, PCI_MAPREG_ROM, in pci_do_device_query()
911 setup_iowins(pciconf_bus_t *pb) in setup_iowins() argument
918 for (pi = pb->pciiowin; pi < &pb->pciiowin[pb->niowin]; pi++) { in setup_iowins()
923 rsvd = pci_bar_is_reserved(pb, pd, pi->reg); in setup_iowins()
925 if (pb->io_res.arena == NULL) { in setup_iowins()
932 pi->address = pci_allocate_range(&pb->io_res, pi->size, in setup_iowins()
951 if (!pb->io_32bit && pi->address > 0xFFFF) { in setup_iowins()
973 setup_memwins(pciconf_bus_t *pb) in setup_memwins() argument
983 for (pm = pb->pcimemwin; pm < &pb->pcimemwin[pb->nmemwin]; pm++) { in setup_memwins()
989 rsvd = pci_bar_is_reserved(pb, pd, pm->reg); in setup_memwins()
992 r = &pb->pmem_res; in setup_memwins()
993 ok64 = pb->pmem_64bit; in setup_memwins()
995 r = &pb->mem_res; in setup_memwins()
996 ok64 = pb->mem_64bit && pd->ppb == NULL; in setup_memwins()
1014 if (~pm->address == 0 && r == &pb->pmem_res) { in setup_memwins()
1015 r = &pb->mem_res; in setup_memwins()
1077 if (!pci_bar_is_reserved(pb, pd, pm->reg)) { in setup_memwins()
1082 for (pm = pb->pcimemwin; pm < &pb->pcimemwin[pb->nmemwin]; pm++) { in setup_memwins()
1136 pciconf_bus_t *pb; in configure_bridge() local
1142 pb = pd->ppb; in configure_bridge()
1144 if (pb->io_res.arena) { in configure_bridge()
1145 io_base = pb->io_res.min_addr; in configure_bridge()
1146 io_limit = pb->io_res.max_addr; in configure_bridge()
1151 if (pb->io_32bit) { in configure_bridge()
1157 pb->busno); in configure_bridge()
1164 io = pci_conf_read(pb->pc, pd->tag, PCI_BRIDGE_STATIO_REG) & in configure_bridge()
1170 pci_conf_write(pb->pc, pd->tag, PCI_BRIDGE_STATIO_REG, io); in configure_bridge()
1171 pci_conf_write(pb->pc, pd->tag, PCI_BRIDGE_IOHIGH_REG, iohigh); in configure_bridge()
1175 if (pb->mem_res.arena) { in configure_bridge()
1176 bad_range = constrain_bridge_mem_range(&pb->mem_res, in configure_bridge()
1185 printf("Bus %d bridge MEM range out of range. ", pb->busno); in configure_bridge()
1194 pci_conf_write(pb->pc, pd->tag, PCI_BRIDGE_MEMORY_REG, mem); in configure_bridge()
1197 mem = pci_conf_read(pb->pc, pd->tag, PCI_BRIDGE_PREFETCHMEM_REG); in configure_bridge()
1200 if (pb->pmem_res.arena) { in configure_bridge()
1201 bad_range = constrain_bridge_mem_range(&pb->pmem_res, in configure_bridge()
1211 pb->busno); in configure_bridge()
1220 pci_conf_write(pb->pc, pd->tag, PCI_BRIDGE_PREFETCHMEM_REG, mem); in configure_bridge()
1227 pci_conf_write(pb->pc, pd->tag, in configure_bridge()
1229 pci_conf_write(pb->pc, pd->tag, in configure_bridge()
1233 rv = configure_bus(pb); in configure_bridge()
1235 fini_range_resource(&pb->io_res); in configure_bridge()
1236 fini_range_resource(&pb->mem_res); in configure_bridge()
1237 fini_range_resource(&pb->pmem_res); in configure_bridge()
1243 if (pb->fast_b2b) in configure_bridge()
1261 configure_bus(pciconf_bus_t *pb) in configure_bus() argument
1266 if (pb->ndevs == 0) { in configure_bus()
1268 printf("PCI bus %d - no devices\n", pb->busno); in configure_bus()
1271 bus_mhz = pb->freq_66 ? 66 : 33; in configure_bus()
1272 max_ltim = pb->max_mingnt * bus_mhz / 4; /* cvt to cycle count */ in configure_bus()
1274 if (band < pb->bandwidth_used) { in configure_bus()
1276 pb->busno, pb->bandwidth_used); in configure_bus()
1279 def_ltim = (band - pb->bandwidth_used) / pb->ndevs; in configure_bus()
1280 if (def_ltim > pb->min_maxlat) in configure_bus()
1281 def_ltim = pb->min_maxlat; in configure_bus()
1287 pb->def_ltim = MIN(def_ltim, 255); in configure_bus()
1288 pb->max_ltim = MIN(MAX(max_ltim, def_ltim), 255); in configure_bus()
1296 if (setup_iowins(pb) || setup_memwins(pb)) { in configure_bus()
1305 for (pd = pb->device; pd < &pb->device[pb->ndevs]; pd++) { in configure_bus()
1320 if (pb->fast_b2b) in configure_bus()
1331 ltim = MIN (MAX (pb->def_ltim, ltim), pb->max_ltim); in configure_bus()
1334 ltim = MIN (pb->def_ltim, pb->max_ltim); in configure_bus()
1348 misc |= ((pb->cacheline_size >> 2) & PCI_CACHELINE_MASK) << in configure_bus()
1360 printf("PCI bus %d configured\n", pb->busno); in configure_bus()
1549 pciconf_bus_t *pb; in pci_configure_bus() local
1552 pb = kmem_zalloc(sizeof (pciconf_bus_t), KM_SLEEP); in pci_configure_bus()
1553 pb->busno = firstbus; in pci_configure_bus()
1554 pb->next_busno = pb->busno + 1; in pci_configure_bus()
1555 pb->last_busno = 255; in pci_configure_bus()
1556 pb->cacheline_size = cacheline_size; in pci_configure_bus()
1557 pb->parent_bus = NULL; in pci_configure_bus()
1558 pb->swiz = 0; in pci_configure_bus()
1559 pb->io_32bit = 1; in pci_configure_bus()
1560 pb->io_res = rs->resources[PCICONF_RESOURCE_IO]; in pci_configure_bus()
1562 pb->mem_res = rs->resources[PCICONF_RESOURCE_MEM]; in pci_configure_bus()
1563 if (pb->mem_res.arena == NULL) in pci_configure_bus()
1564 pb->mem_res = rs->resources[PCICONF_RESOURCE_PREFETCHABLE_MEM]; in pci_configure_bus()
1566 pb->pmem_res = rs->resources[PCICONF_RESOURCE_PREFETCHABLE_MEM]; in pci_configure_bus()
1567 if (pb->pmem_res.arena == NULL) in pci_configure_bus()
1568 pb->pmem_res = rs->resources[PCICONF_RESOURCE_MEM]; in pci_configure_bus()
1574 pb->mem_64bit = mem_region_ok64(&pb->mem_res); in pci_configure_bus()
1575 pb->pmem_64bit = mem_region_ok64(&pb->pmem_res); in pci_configure_bus()
1577 pb->pc = pc; in pci_configure_bus()
1578 pb->io_total = pb->mem_total = pb->pmem_total = 0; in pci_configure_bus()
1580 rv = probe_bus(pb); in pci_configure_bus()
1581 pb->last_busno = pb->next_busno - 1; in pci_configure_bus()
1583 rv = configure_bus(pb); in pci_configure_bus()
1588 kmem_free(pb, sizeof(*pb)); in pci_configure_bus()