| 1362 | } |
| 1363 | |
| 1364 | static int |
| 1365 | gicv3_its_alloc_msix(device_t dev, device_t child, device_t *pic, |
| 1366 | struct intr_irqsrc **isrcp) |
| 1367 | { |
| 1368 | struct gicv3_its_softc *sc; |
| 1369 | struct gicv3_its_irqsrc *girq; |
| 1370 | struct its_dev *its_dev; |
| 1371 | u_int nvecs, irq; |
| 1372 | |
| 1373 | nvecs = pci_msix_count(child); |
| 1374 | its_dev = its_device_get(dev, child, nvecs); |
| 1375 | if (its_dev == NULL) |
| 1376 | return (ENXIO); |
| 1377 | |
| 1378 | KASSERT(its_dev->lpis.lpi_free > 0, |
| 1379 | ("gicv3_its_alloc_msix: No free LPIs")); |
| 1380 | sc = device_get_softc(dev); |
| 1381 | irq = its_dev->lpis.lpi_base + its_dev->lpis.lpi_num - |
| 1382 | its_dev->lpis.lpi_free; |
| 1383 | |
| 1384 | girq = gicv3_its_alloc_irqsrc(dev, sc, irq); |
| 1385 | if (girq == NULL) |
| 1386 | return (ENXIO); |
| 1387 | girq->gi_id = its_dev->lpis.lpi_busy; |
| 1388 | girq->gi_its_dev = its_dev; |
| 1389 | |
| 1390 | its_dev->lpis.lpi_free--; |
| 1391 | its_dev->lpis.lpi_busy++; |
| 1392 | |
| 1393 | /* Map the message to the given IRQ */ |
| 1394 | gicv3_its_select_cpu(dev, (struct intr_irqsrc *)girq); |
| 1395 | its_cmd_mapti(dev, girq); |
| 1396 | |
| 1397 | *pic = dev; |
| 1398 | *isrcp = (struct intr_irqsrc *)girq; |
| 1399 | |
| 1400 | return (0); |
| 1401 | } |
| 1402 | |
| 1403 | static int |
| 1404 | gicv3_its_release_msix(device_t dev, device_t child, struct intr_irqsrc *isrc) |
nothing calls this directly
no test coverage detected