Lines Matching +full:fiq +full:- +full:device

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
54 #include <dt-bindings/interrupt-controller/apple-aic.h>
175 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) in apple_aic_probe()
193 sc->sc_dev = dev; in apple_aic_attach()
196 sc->sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in apple_aic_attach()
198 if (sc->sc_mem == NULL) { in apple_aic_attach()
203 info = bus_read_4(sc->sc_mem, AIC_INFO); in apple_aic_attach()
204 sc->sc_nirqs = AIC_INFO_NIRQS(info); in apple_aic_attach()
205 sc->sc_ndie = AIC_INFO_NDIE(info) + 1; in apple_aic_attach()
208 sc->sc_nirqs, sc->sc_ndie); in apple_aic_attach()
210 for (i = 0; i < sc->sc_ndie; i++) { in apple_aic_attach()
211 sc->sc_isrcs[i] = mallocarray(sc->sc_nirqs, in apple_aic_attach()
212 sizeof(**sc->sc_isrcs), M_DEVBUF, M_WAITOK | M_ZERO); in apple_aic_attach()
216 sc->sc_ipimasks = malloc(sizeof(*sc->sc_ipimasks) * mp_maxid + 1, in apple_aic_attach()
219 sc->sc_cpuids = malloc(sizeof(*sc->sc_cpuids) * mp_maxid + 1, in apple_aic_attach()
223 sc->sc_cpuids[cpu] = bus_read_4(sc->sc_mem, AIC_WHOAMI); in apple_aic_attach()
226 sc->sc_cpuids[cpu]); in apple_aic_attach()
229 for (i = 0; i < sc->sc_ndie; i++) { in apple_aic_attach()
232 die_isrcs = sc->sc_isrcs[i]; in apple_aic_attach()
233 for (j = 0; j < sc->sc_nirqs; j++) { in apple_aic_attach()
267 "Unable to set root fiq controller\n"); in apple_aic_attach()
289 if (data->ncells != 3) in apple_aic_map_intr_fdt()
298 * 1 = FIQ in apple_aic_map_intr_fdt()
302 switch(data->cells[0]) { in apple_aic_map_intr_fdt()
315 *irq = data->cells[1]; in apple_aic_map_intr_fdt()
316 if (*irq > sc->sc_nirqs) in apple_aic_map_intr_fdt()
320 if ((data->cells[2] & FDT_INTR_EDGE_MASK) != 0) in apple_aic_map_intr_fdt()
326 if ((data->cells[2] & FDT_INTR_LEVEL_HIGH) != 0) in apple_aic_map_intr_fdt()
347 switch(data->type) { in apple_aic_map_intr()
353 *isrcp = &sc->sc_isrcs[0 /* XXX */][irq].ai_isrc; in apple_aic_map_intr()
378 KASSERT(data->type == INTR_MAP_DATA_FDT, in apple_aic_setup_intr()
380 data->type)); in apple_aic_setup_intr()
391 if (isrc->isrc_handlers != 0) { in apple_aic_setup_intr()
401 ai->ai_pol = pol; in apple_aic_setup_intr()
402 ai->ai_trig = trig; in apple_aic_setup_intr()
403 ai->ai_type = type; in apple_aic_setup_intr()
412 bus_write_4(sc->sc_mem, AIC_TARGET_CPU(irq), in apple_aic_setup_intr()
413 1 << sc->sc_cpuids[aic_next_cpu]); in apple_aic_setup_intr()
416 isrc->isrc_flags |= INTR_ISRCF_PPI; in apple_aic_setup_intr()
440 irq = ai->ai_irq; in apple_aic_enable_intr()
441 switch(ai->ai_type) { in apple_aic_enable_intr()
444 bus_write_4(sc->sc_mem, AIC_MASK_CLEAR(irq), AIC_IRQ_MASK(irq)); in apple_aic_enable_intr()
453 panic("%s: %x\n", __func__, ai->ai_type); in apple_aic_enable_intr()
465 irq = ai->ai_irq; in apple_aic_disable_intr()
466 switch(ai->ai_type) { in apple_aic_disable_intr()
469 bus_write_4(sc->sc_mem, AIC_MASK_SET(irq), AIC_IRQ_MASK(irq)); in apple_aic_disable_intr()
478 panic("%s: %x\n", __func__, ai->ai_type); in apple_aic_disable_intr()
490 irq = ai->ai_irq; in apple_aic_post_filter()
491 switch(ai->ai_type) { in apple_aic_post_filter()
494 bus_write_4(sc->sc_mem, AIC_SW_CLEAR(irq), AIC_IRQ_MASK(irq)); in apple_aic_post_filter()
495 bus_write_4(sc->sc_mem, AIC_MASK_CLEAR(irq), AIC_IRQ_MASK(irq)); in apple_aic_post_filter()
501 panic("%s: %x\n", __func__, ai->ai_type); in apple_aic_post_filter()
514 irq = ai->ai_irq; in apple_aic_pre_ithread()
515 bus_write_4(sc->sc_mem, AIC_SW_CLEAR(irq), AIC_IRQ_MASK(irq)); in apple_aic_pre_ithread()
529 irq = ai->ai_irq; in apple_aic_post_ithread()
531 bus_write_4(sc->sc_mem, AIC_MASK_CLEAR(irq), AIC_IRQ_MASK(irq)); in apple_aic_post_ithread()
545 mask = atomic_readandclear_32(&sc->sc_ipimasks[cpu]); in apple_aic_ipi_received()
548 ipi = ffs(mask) - 1; in apple_aic_ipi_received()
565 tf = curthread->td_intr_frame; in apple_aic_irq()
567 event = bus_read_4(sc->sc_mem, AIC_EVENT); in apple_aic_irq()
575 device_printf(sc->sc_dev, "unexpected event type %d\n", in apple_aic_irq()
583 if (die >= sc->sc_ndie) in apple_aic_irq()
585 if (irq >= sc->sc_nirqs) in apple_aic_irq()
588 aisrc = &sc->sc_isrcs[die][irq]; in apple_aic_irq()
589 if (intr_isrc_dispatch(&aisrc->ai_isrc, tf) != 0) { in apple_aic_irq()
590 device_printf(sc->sc_dev, "Stray irq %u:%u disabled\n", in apple_aic_irq()
606 tf = curthread->td_intr_frame; in apple_aic_fiq()
621 isrcs = sc->sc_isrcs[0]; in apple_aic_fiq()
657 MPASS(((struct apple_aic_irqsrc *)isrc)->ai_type == AIC_TYPE_IRQ); in apple_aic_bind_intr()
658 irq = ((struct apple_aic_irqsrc *)isrc)->ai_irq; in apple_aic_bind_intr()
659 if (CPU_EMPTY(&isrc->isrc_cpu)) { in apple_aic_bind_intr()
661 CPU_SETOF(aic_next_cpu, &isrc->isrc_cpu); in apple_aic_bind_intr()
662 bus_write_4(sc->sc_mem, AIC_TARGET_CPU(irq), in apple_aic_bind_intr()
663 sc->sc_cpuids[aic_next_cpu] << 1); in apple_aic_bind_intr()
665 CPU_FOREACH_ISSET(cpu, &isrc->isrc_cpu) { in apple_aic_bind_intr()
666 targets |= sc->sc_cpuids[cpu] << 1; in apple_aic_bind_intr()
668 bus_write_4(sc->sc_mem, AIC_TARGET_CPU(irq), targets); in apple_aic_bind_intr()
685 KASSERT(isrc == &sc->sc_ipi_srcs[ipi].ai_isrc, in apple_aic_ipi_send()
691 atomic_set_32(&sc->sc_ipimasks[cpu], 1 << ipi); in apple_aic_ipi_send()
725 ai = &sc->sc_ipi_srcs[ipi]; in apple_aic_ipi_setup()
726 ai->ai_type = AIC_TYPE_IPI; in apple_aic_ipi_setup()
728 *isrcp = &ai->ai_isrc; in apple_aic_ipi_setup()
738 /* We don't need to re-initialize for the FIQ root. */ in apple_aic_init_secondary()
742 sc->sc_cpuids[cpu] = bus_read_4(sc->sc_mem, AIC_WHOAMI); in apple_aic_init_secondary()
745 sc->sc_cpuids[cpu]); in apple_aic_init_secondary()
747 bus_write_4(sc->sc_mem, AIC_IPI_MASK_SET, AIC_IPI_SELF | AIC_IPI_OTHER); in apple_aic_init_secondary()
752 /* Device interface */