Lines Matching +full:irqs +full:- +full:map +full:- +full:range
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
81 * By default all VMD devices remap children MSI/MSI-X interrupts into their
99 * MSI-X can use different addresses, but we have limited number of MSI-X
104 "Maximum number of MSI-X vectors per device");
126 for (t = vmd_devs; t->vmd_name != NULL; t++) {
127 if (vid == t->vmd_vid && did == t->vmd_did) {
128 device_set_desc(dev, t->vmd_name);
142 if (sc->psc.bus.rman.rm_end != 0)
143 rman_fini(&sc->psc.bus.rman);
144 if (sc->psc.mem.rman.rm_end != 0)
145 rman_fini(&sc->psc.mem.rman);
146 while ((u = LIST_FIRST(&sc->vmd_users)) != NULL) {
150 if (sc->vmd_irq != NULL) {
151 for (i = 0; i < sc->vmd_msix_count; i++) {
152 vi = &sc->vmd_irq[i];
153 if (vi->vi_res == NULL)
155 bus_teardown_intr(sc->psc.dev, vi->vi_res,
156 vi->vi_handle);
157 bus_release_resource(sc->psc.dev, SYS_RES_IRQ,
158 vi->vi_rid, vi->vi_res);
161 free(sc->vmd_irq, M_DEVBUF);
162 sc->vmd_irq = NULL;
163 pci_release_msi(sc->psc.dev);
165 if (sc->vmd_regs_res[i] != NULL)
166 bus_release_resource(sc->psc.dev, SYS_RES_MEMORY,
167 sc->vmd_regs_rid[i], sc->vmd_regs_res[i]);
180 if (b < sc->vmd_bus_start || b > sc->vmd_bus_end)
183 offset = ((b - sc->vmd_bus_start) << 20) + (s << 15) + (f << 12) + reg;
187 return (bus_read_4(sc->vmd_regs_res[0], offset));
189 return (bus_read_2(sc->vmd_regs_res[0], offset));
191 return (bus_read_1(sc->vmd_regs_res[0], offset));
206 if (b < sc->vmd_bus_start || b > sc->vmd_bus_end)
209 offset = ((b - sc->vmd_bus_start) << 20) + (s << 15) + (f << 12) + reg;
213 return (bus_write_4(sc->vmd_regs_res[0], offset, val));
215 return (bus_write_2(sc->vmd_regs_res[0], offset, val));
217 return (bus_write_1(sc->vmd_regs_res[0], offset, val));
241 * handler to make PCI code setup and enable the MSI-X vector.
261 sc->psc.dev = dev;
262 sc->psc.domain = PCI_DOMAINMAX - device_get_unit(dev);
267 sc->vmd_regs_rid[i] = PCIR_BAR(j);
272 if ((sc->vmd_regs_res[i] = bus_alloc_resource_any(dev,
273 SYS_RES_MEMORY, &sc->vmd_regs_rid[i], RF_ACTIVE)) == NULL) {
281 for (t = vmd_devs; t->vmd_name != NULL; t++) {
282 if (vid == t->vmd_vid && did == t->vmd_did)
286 sc->vmd_bus_start = 0;
287 if ((t->flags & BUS_RESTRICT) &&
291 sc->vmd_bus_start = 0;
294 sc->vmd_bus_start = 128;
297 sc->vmd_bus_start = 224;
304 sc->vmd_bus_end = MIN(PCI_BUSMAX, sc->vmd_bus_start +
305 (rman_get_size(sc->vmd_regs_res[0]) >> 20) - 1);
307 bus = &sc->psc.bus;
308 bus->sec = sc->vmd_bus_start;
309 bus->sub = sc->vmd_bus_end;
310 bus->dev = dev;
311 bus->rman.rm_start = 0;
312 bus->rman.rm_end = PCI_BUSMAX;
313 bus->rman.rm_type = RMAN_ARRAY;
315 bus->rman.rm_descr = strdup(buf, M_DEVBUF);
316 error = rman_init(&bus->rman);
319 bus->rman.rm_end = 0;
322 error = rman_manage_region(&bus->rman, sc->vmd_bus_start,
323 sc->vmd_bus_end);
329 w = &sc->psc.mem;
330 w->rman.rm_type = RMAN_ARRAY;
332 w->rman.rm_descr = strdup(buf, M_DEVBUF);
333 error = rman_init(&w->rman);
336 w->rman.rm_end = 0;
339 error = rman_manage_region(&w->rman,
340 rman_get_start(sc->vmd_regs_res[1]),
341 rman_get_end(sc->vmd_regs_res[1]));
346 error = rman_manage_region(&w->rman,
347 rman_get_start(sc->vmd_regs_res[2]) + 0x2000,
348 rman_get_end(sc->vmd_regs_res[2]));
354 LIST_INIT(&sc->vmd_users);
355 sc->vmd_fist_vector = (t->flags & VECTOR_OFFSET) ? 1 : 0;
356 sc->vmd_msix_count = pci_msix_count(dev);
357 if (vmd_bypass_msi && (t->flags & CAN_BYPASS_MSI)) {
358 sc->vmd_msix_count = 0;
360 } else if (pci_alloc_msix(dev, &sc->vmd_msix_count) == 0) {
361 sc->vmd_irq = malloc(sizeof(struct vmd_irq) *
362 sc->vmd_msix_count, M_DEVBUF, M_WAITOK | M_ZERO);
363 for (i = 0; i < sc->vmd_msix_count; i++) {
364 vi = &sc->vmd_irq[i];
365 vi->vi_rid = i + 1;
366 vi->vi_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
367 &vi->vi_rid, RF_ACTIVE | RF_SHAREABLE);
368 if (vi->vi_res == NULL) {
372 vi->vi_irq = rman_get_start(vi->vi_res);
373 if (bus_setup_intr(dev, vi->vi_res, INTR_TYPE_MISC |
374 INTR_MPSAFE, vmd_intr, NULL, vi, &vi->vi_handle)) {
377 vi->vi_rid, vi->vi_res);
378 vi->vi_res = NULL;
385 sc->vmd_dma_tag = bus_get_dma_tag(dev);
386 sc->psc.child = device_add_child(dev, "pci", DEVICE_UNIT_ANY);
404 if (sc->vmd_msix_count == 0)
415 return (sc->vmd_dma_tag);
425 return (&sc->psc.mem.rman);
427 return (&sc->psc.bus.rman);
453 "allocated memory range (%#jx-%#jx) for rid %d of %s\n",
459 "allocated bus range (%ju-%ju) for rid %d of %s\n",
511 if (rman_get_start(sc->vmd_regs_res[i]) <= rman_get_start(r) &&
512 rman_get_end(sc->vmd_regs_res[i]) >= rman_get_end(r))
513 return (sc->vmd_regs_res[i]);
520 struct resource_map_request *argsp, struct resource_map *map)
541 args.offset = start - rman_get_start(pres);
543 return (bus_map_resource(dev, pres, &args, map));
548 struct resource_map *map)
556 return (bus_unmap_resource(dev, pres, map));
569 int *irqs)
575 if (sc->vmd_msix_count == 0) {
577 child, count, maxcount, irqs));
582 LIST_FOREACH(u, &sc->vmd_users, viu_link) {
583 if (u->viu_child == child)
587 for (i = sc->vmd_fist_vector; i < sc->vmd_msix_count; i++) {
588 if (best > sc->vmd_irq[i].vi_nusers) {
589 best = sc->vmd_irq[i].vi_nusers;
595 u->viu_child = child;
596 u->viu_vector = ibest;
597 LIST_INSERT_HEAD(&sc->vmd_users, u, viu_link);
598 sc->vmd_irq[ibest].vi_nusers += count;
601 irqs[i] = sc->vmd_irq[ibest].vi_irq;
606 vmd_release_msi(device_t dev, device_t child, int count, int *irqs)
611 if (sc->vmd_msix_count == 0) {
613 child, count, irqs));
616 LIST_FOREACH(u, &sc->vmd_users, viu_link) {
617 if (u->viu_child == child) {
618 sc->vmd_irq[u->viu_vector].vi_nusers -= count;
634 if (sc->vmd_msix_count == 0) {
640 LIST_FOREACH(u, &sc->vmd_users, viu_link) {
641 if (u->viu_child == child)
647 for (i = sc->vmd_fist_vector; i < sc->vmd_msix_count; i++) {
648 if (best > sc->vmd_irq[i].vi_nusers) {
649 best = sc->vmd_irq[i].vi_nusers;
655 u->viu_child = child;
656 u->viu_vector = ibest;
657 LIST_INSERT_HEAD(&sc->vmd_users, u, viu_link);
658 sc->vmd_irq[ibest].vi_nusers++;
660 *irq = sc->vmd_irq[ibest].vi_irq;
670 if (sc->vmd_msix_count == 0) {
675 LIST_FOREACH(u, &sc->vmd_users, viu_link) {
676 if (u->viu_child == child &&
677 sc->vmd_irq[u->viu_vector].vi_irq == irq) {
678 sc->vmd_irq[u->viu_vector].vi_nusers--;
693 if (sc->vmd_msix_count == 0) {
698 for (i = sc->vmd_fist_vector; i < sc->vmd_msix_count; i++) {
699 if (sc->vmd_irq[i].vi_irq == irq)
702 if (i >= sc->vmd_msix_count)
751 vmd_devs, nitems(vmd_devs) - 1);