Lines Matching +full:ap806 +full:- +full:sei

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
53 #define MV_AP806_SEI_LOCK(_sc) mtx_lock(&(_sc)->mtx)
54 #define MV_AP806_SEI_UNLOCK(_sc) mtx_unlock(&(_sc)->mtx)
55 #define MV_AP806_SEI_LOCK_INIT(_sc) mtx_init(&_sc->mtx, \
56 device_get_nameunit(_sc->dev), "mv_ap806_sei", MTX_DEF)
57 #define MV_AP806_SEI_LOCK_DESTROY(_sc) mtx_destroy(&_sc->mtx);
58 #define MV_AP806_SEI_ASSERT_LOCKED(_sc) mtx_assert(&_sc->mtx, MA_OWNED);
59 #define MV_AP806_SEI_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->mtx, MA_NOTOWNED);
98 {"marvell,ap806-sei", 1},
102 #define RD4(sc, reg) bus_read_4((sc)->mem_res, (reg))
103 #define WR4(sc, reg, val) bus_write_4((sc)->mem_res, (reg), (val))
116 bit = GICP_SEMR_BIT(sisrc->irq); in mv_ap806_sei_isrc_mask()
118 tmp = RD4(sc, GICP_SEMR(sisrc->irq)); in mv_ap806_sei_isrc_mask()
123 WR4(sc, GICP_SEMR(sisrc->irq), tmp); in mv_ap806_sei_isrc_mask()
132 WR4(sc, GICP_SECR(sisrc->irq), GICP_SECR_BIT(sisrc->irq)); in mv_ap806_sei_isrc_eoi()
163 if (data->type != INTR_MAP_DATA_FDT) in mv_ap806_sei_map()
167 if (daf->ncells != 1) in mv_ap806_sei_map()
170 if (daf->cells[0] < MV_AP806_SEI_AP_FIRST || in mv_ap806_sei_map()
171 daf->cells[0] >= MV_AP806_SEI_AP_FIRST + MV_AP806_SEI_AP_SIZE) in mv_ap806_sei_map()
174 irq = daf->cells[0]; in mv_ap806_sei_map()
192 *isrcp = &sc->isrcs[irq].isrc; in mv_ap806_sei_map_intr()
213 if (irq != sisrc->irq) in mv_ap806_sei_setup_intr()
271 /* ----------------------------------------------------------------------------
285 tf = curthread->td_intr_frame; in mv_ap806_sei_intr()
293 irq--; in mv_ap806_sei_intr()
294 sirq = &sc->isrcs[irq]; in mv_ap806_sei_intr()
295 if (intr_isrc_dispatch(&sirq->isrc, tf) != 0) { in mv_ap806_sei_intr()
298 device_printf(sc->dev, in mv_ap806_sei_intr()
313 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) in mv_ap806_sei_probe()
316 device_set_desc(dev, "Marvell SEI"); in mv_ap806_sei_probe()
330 sc->dev = dev; in mv_ap806_sei_attach()
336 sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in mv_ap806_sei_attach()
338 if (sc->mem_res == NULL) { in mv_ap806_sei_attach()
345 sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); in mv_ap806_sei_attach()
346 if (sc->irq_res == NULL) { in mv_ap806_sei_attach()
357 sc->isrcs = malloc(sizeof(*sc->isrcs) * MV_AP806_SEI_MAX_NIRQS, in mv_ap806_sei_attach()
359 name = device_get_nameunit(sc->dev); in mv_ap806_sei_attach()
361 sc->isrcs[irq].irq = irq; in mv_ap806_sei_attach()
362 rv = intr_isrc_register(&sc->isrcs[irq].isrc, in mv_ap806_sei_attach()
363 sc->dev, 0, "%s,%u", name, irq); in mv_ap806_sei_attach()
369 device_printf(dev, "Cannot register SEI\n"); in mv_ap806_sei_attach()
373 if (bus_setup_intr(dev, sc->irq_res,INTR_TYPE_MISC | INTR_MPSAFE, in mv_ap806_sei_attach()
374 mv_ap806_sei_intr, NULL, sc, &sc->irq_ih)) { in mv_ap806_sei_attach()
383 * 1 - available, 0 - used. in mv_ap806_sei_attach()
385 BIT_FILL(MV_AP806_SEI_CP_SIZE, &sc->msi_bitmap); in mv_ap806_sei_attach()
391 if (sc->irq_ih != NULL) in mv_ap806_sei_attach()
392 bus_teardown_intr(dev, sc->irq_res, sc->irq_ih); in mv_ap806_sei_attach()
393 if (sc->irq_res != NULL) in mv_ap806_sei_attach()
394 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res); in mv_ap806_sei_attach()
395 if (sc->mem_res != NULL) in mv_ap806_sei_attach()
396 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->mem_res); in mv_ap806_sei_attach()
423 vector = BIT_FFS_AT(MV_AP806_SEI_CP_SIZE, &sc->msi_bitmap, 0); in mv_ap806_sei_alloc_msi()
426 i--; in mv_ap806_sei_alloc_msi()
430 vector--; in mv_ap806_sei_alloc_msi()
431 BIT_CLR(MV_AP806_SEI_CP_SIZE, vector, &sc->msi_bitmap); in mv_ap806_sei_alloc_msi()
434 srcs[i] = &sc->isrcs[vector].isrc; in mv_ap806_sei_alloc_msi()
453 srcs[i]->isrc_irq - MV_AP806_SEI_CP_FIRST, in mv_ap806_sei_release_msi()
454 &sc->msi_bitmap); in mv_ap806_sei_release_msi()
468 *addr = rman_get_start(sc->mem_res) + MV_AP806_SEI_SETSPI_OFFSET; in mv_ap806_sei_map_msi()
469 *data = isrc->isrc_irq; in mv_ap806_sei_map_msi()