Lines Matching +full:pci +full:- +full:domain

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
32 * Support APIs for Host to PCI bridge drivers and drivers that
33 * provide PCI domains.
42 #include <dev/pci/pcireg.h>
43 #include <dev/pci/pcivar.h>
44 #include <dev/pci/pcib_private.h>
47 * Try to read the bus number of a host-PCI bridge using appropriate config
75 * be seen first and isn't really a pci bridge (the
80 * Since the MIOC doesn't have a pci bus attached, we
105 /* ServerWorks -- vendor 0x1166 */
122 /* Compaq/HP -- vendor 0x0e11 */
135 * Return a pointer to a pretty name for a PCI device. If the device
137 * is generated from the device's PCI address.
146 snprintf(buf, sizeof(buf), "pci%d:%d:%d:%d", pci_get_domain(child),
152 * Some Host-PCI bridge drivers know which resource ranges they can
153 * decode and should only allocate subranges to child PCI devices.
166 hr->hr_pcib = pcib;
167 resource_list_init(&hr->hr_rl);
175 resource_list_free(&hr->hr_rl);
187 device_printf(hr->hr_pcib, "decoding %d %srange %#jx-%#jx\n",
190 rid = resource_list_add_next(&hr->hr_rl, type, start, end,
191 end - start + 1);
195 rle = resource_list_find(&hr->hr_rl, type, rid);
196 rle->flags = RLE_PREFETCH;
213 rle = resource_list_find(&hr->hr_rl, type, 0);
219 return (bus_generic_alloc_resource(hr->hr_pcib, dev, type, rid,
226 if (rle->type != type)
229 ((rle->flags & RLE_PREFETCH) != 0))
231 new_start = ummax(start, rle->start);
232 new_end = ummin(end, rle->end);
234 new_start + count - 1 > new_end ||
237 r = bus_generic_alloc_resource(hr->hr_pcib, dev, type, rid,
241 device_printf(hr->hr_pcib,
242 "allocated type %d (%#jx-%#jx) for rid %x of %s\n",
255 rle = resource_list_find(&hr->hr_rl, type, 0);
267 rle = resource_list_find(&hr->hr_rl, rman_get_type(r), 0);
273 return (bus_generic_adjust_resource(hr->hr_pcib, dev, r, start,
279 if (rle->start <= start && rle->end >= end)
280 return (bus_generic_adjust_resource(hr->hr_pcib, dev,
295 * Each PCI domain maintains its own resource manager for PCI bus
296 * numbers in that domain. Domain objects are created on first use.
297 * Host to PCI bridge drivers and PCI-PCI bridge drivers should
298 * allocate their bus ranges from their domain.
301 pci_find_domain(int domain)
308 if (d->pd_domain == domain)
312 snprintf(buf, sizeof(buf), "PCI domain %d bus numbers", domain);
314 d->pd_domain = domain;
315 d->pd_bus_rman.rm_start = 0;
316 d->pd_bus_rman.rm_end = PCI_BUSMAX;
317 d->pd_bus_rman.rm_type = RMAN_ARRAY;
319 d->pd_bus_rman.rm_descr = (char *)(d + 1);
320 error = rman_init(&d->pd_bus_rman);
322 error = rman_manage_region(&d->pd_bus_rman, 0, PCI_BUSMAX);
324 panic("Failed to initialize PCI domain %d rman", domain);
330 pci_domain_alloc_bus(int domain, device_t dev, int *rid, rman_res_t start,
336 if (domain < 0 || domain > PCI_DOMAINMAX)
338 d = pci_find_domain(domain);
339 res = rman_reserve_resource(&d->pd_bus_rman, start, end, count, flags,
350 pci_domain_adjust_bus(int domain, device_t dev, struct resource *r,
357 if (domain < 0 || domain > PCI_DOMAINMAX)
360 d = pci_find_domain(domain);
361 KASSERT(rman_is_region_manager(r, &d->pd_bus_rman), ("bad resource"));
367 pci_domain_release_bus(int domain, device_t dev, struct resource *r)
373 if (domain < 0 || domain > PCI_DOMAINMAX)
376 d = pci_find_domain(domain);
377 KASSERT(rman_is_region_manager(r, &d->pd_bus_rman), ("bad resource"));
383 pci_domain_activate_bus(int domain, device_t dev, struct resource *r)
389 if (domain < 0 || domain > PCI_DOMAINMAX)
392 d = pci_find_domain(domain);
393 KASSERT(rman_is_region_manager(r, &d->pd_bus_rman), ("bad resource"));
399 pci_domain_deactivate_bus(int domain, device_t dev, struct resource *r)
405 if (domain < 0 || domain > PCI_DOMAINMAX)
408 d = pci_find_domain(domain);
409 KASSERT(rman_is_region_manager(r, &d->pd_bus_rman), ("bad resource"));