its_dev
static struct its_dev *
struct its_dev *its_dev = NULL;
TAILQ_FOREACH(its_dev, &sc->sc_its_dev_list, entry) {
if (its_dev->pci_dev == child)
return (its_dev);
TAILQ_ENTRY(its_dev) entry;
static struct its_dev *
struct its_dev *its_dev;
its_dev = its_device_find(dev, child);
if (its_dev != NULL)
return (its_dev);
its_dev = malloc(sizeof(*its_dev), M_GICV3_ITS, M_NOWAIT | M_ZERO);
if (its_dev == NULL)
its_dev->pci_dev = child;
its_dev->devid = its_get_devid(child);
its_dev->lpis.lpi_busy = 0;
its_dev->lpis.lpi_num = nvecs;
its_dev->lpis.lpi_free = nvecs;
if (!its_device_alloc(sc, its_dev->devid)) {
free(its_dev, M_GICV3_ITS);
free(its_dev, M_GICV3_ITS);
its_dev->lpis.lpi_base = irq_base;
its_dev->itt = contigmalloc_domainset(itt_size,
if (its_dev->itt == NULL) {
vmem_free(sc->sc_irq_alloc, its_dev->lpis.lpi_base, nvecs);
free(its_dev, M_GICV3_ITS);
cpu_dcache_wb_range(its_dev->itt, itt_size);
TAILQ_INSERT_TAIL(&sc->sc_its_dev_list, its_dev, entry);
its_cmd_mapd(dev, its_dev, 1);
return (its_dev);
its_device_release(device_t dev, struct its_dev *its_dev)
KASSERT(its_dev->lpis.lpi_busy == 0,
its_cmd_mapd(dev, its_dev, 0);
TAILQ_REMOVE(&sc->sc_its_dev_list, its_dev, entry);
KASSERT(its_dev->itt != NULL, ("Invalid ITT in valid ITS device"));
free(its_dev->itt, M_GICV3_ITS);
vmem_free(sc->sc_irq_alloc, its_dev->lpis.lpi_base,
its_dev->lpis.lpi_num);
free(its_dev, M_GICV3_ITS);
struct its_dev *its_dev;
its_dev = its_device_get(dev, child, count);
if (its_dev == NULL)
KASSERT(its_dev->lpis.lpi_free >= count,
irq = its_dev->lpis.lpi_base + its_dev->lpis.lpi_num -
its_dev->lpis.lpi_free;
its_dev->lpis.lpi_free--;
girq->gi_its_dev = its_dev;
struct its_dev *its_dev;
its_dev->lpis.lpi_busy += count;
struct its_dev *its_dev;
its_dev = its_device_find(dev, child);
KASSERT(its_dev != NULL,
KASSERT(its_dev->lpis.lpi_busy >= count,
its_dev->lpis.lpi_busy));
its_dev->lpis.lpi_busy -= count;
if (its_dev->lpis.lpi_busy == 0)
its_device_release(dev, its_dev);
struct its_dev *its_dev;
its_dev = its_device_get(dev, child, nvecs);
if (its_dev == NULL)
KASSERT(its_dev->lpis.lpi_free > 0,
irq = its_dev->lpis.lpi_base + its_dev->lpis.lpi_num -
its_dev->lpis.lpi_free;
girq->gi_id = its_dev->lpis.lpi_busy;
girq->gi_its_dev = its_dev;
its_dev->lpis.lpi_free--;
its_dev->lpis.lpi_busy++;
struct its_dev *its_dev;
its_dev = its_device_find(dev, child);
KASSERT(its_dev != NULL,
KASSERT(its_dev->lpis.lpi_busy > 0,
"were allocated: allocated %d", its_dev->lpis.lpi_busy));
its_dev->lpis.lpi_busy--;
if (its_dev->lpis.lpi_busy == 0)
its_device_release(dev, its_dev);
struct its_dev *its_dev;
struct its_dev *its_dev;
struct its_dev *its_dev;
struct its_dev *its_dev;
cmd_format_devid(cmd, desc->cmd_desc_movi.its_dev->devid);
cmd_format_itt(cmd, vtophys(desc->cmd_desc_mapd.its_dev->itt));
size = fls(desc->cmd_desc_mapd.its_dev->lpis.lpi_num);
cmd_format_devid(cmd, desc->cmd_desc_mapd.its_dev->devid);
cmd_format_devid(cmd, desc->cmd_desc_mapvi.its_dev->devid);
cmd_format_devid(cmd, desc->cmd_desc_mapi.its_dev->devid);
cmd_format_devid(cmd, desc->cmd_desc_inv.its_dev->devid);
desc.cmd_desc_movi.its_dev = girq->gi_its_dev;
desc.cmd_desc_mapvi.its_dev = girq->gi_its_dev;
its_cmd_mapd(device_t dev, struct its_dev *its_dev, uint8_t valid)
desc.cmd_desc_mapd.its_dev = its_dev;
its_cmd_inv(device_t dev, struct its_dev *its_dev,
desc.cmd_desc_inv.its_dev = its_dev;
struct its_dev *gi_its_dev;
TAILQ_HEAD(its_dev_list, its_dev) sc_its_dev_list;
static void its_cmd_mapd(device_t, struct its_dev *, uint8_t);
static void its_cmd_inv(device_t, struct its_dev *, struct gicv3_its_irqsrc *);