Lines Matching full:foo*
1 /* $NetBSD: footbridge_irqhandler.c,v 1.28 2021/08/13 11:40:43 skrll Exp $ */
43 __KERNEL_RCSID(0,"$NetBSD: footbridge_irqhandler.c,v 1.28 2021/08/13 11:40:43 skrll Exp $");
53 #include <arm/footbridge/dc21285mem.h>
54 #include <arm/footbridge/dc21285reg.h>
64 static struct intrq footbridge_intrq[NIRQ];
67 int footbridge_imask[NIPL];
73 volatile int footbridge_ipending;
75 void footbridge_intr_dispatch(struct clockframe *frame);
77 const struct evcnt *footbridge_pci_intr_evcnt(void *, pci_intr_handle_t);
80 footbridge_pci_intr_evcnt(void *pcv, pci_intr_handle_t ih)
88 return &footbridge_intrq[ih].iq_ev;
92 footbridge_enable_irq(int irq)
95 footbridge_set_intrmask();
99 footbridge_disable_irq(int irq)
102 footbridge_set_intrmask();
109 footbridge_intr_calculate_masks(void)
118 iq = &footbridge_intrq[irq];
119 footbridge_disable_irq(irq);
130 if (footbridge_intrq[irq].iq_levels & (1U << ipl))
133 footbridge_imask[ipl] = irqs;
137 KASSERT(footbridge_imask[IPL_NONE] == 0);
138 KASSERT(footbridge_imask[IPL_SOFTCLOCK] == 0);
139 KASSERT(footbridge_imask[IPL_SOFTBIO] == 0);
140 KASSERT(footbridge_imask[IPL_SOFTNET] == 0);
141 KASSERT(footbridge_imask[IPL_SOFTSERIAL] == 0);
148 footbridge_imask[IPL_SCHED] |= footbridge_imask[IPL_VM];
149 footbridge_imask[IPL_HIGH] |= footbridge_imask[IPL_SCHED];
154 for (irq = 0, iq = footbridge_intrq; irq < NIRQ; irq++, iq++) {
157 footbridge_enable_irq(irq);
159 irqs |= footbridge_imask[ih->ih_ipl];
169 return (footbridge_splraise(ipl));
176 footbridge_splx(new);
182 return (footbridge_spllower(ipl));
186 footbridge_intr_init(void)
193 footbridge_ipending = 0;
194 footbridge_set_intrmask();
196 for (i = 0, iq = footbridge_intrq; i < NIRQ; i++, iq++) {
200 footbridge_intr_calculate_masks();
207 footbridge_intr_evcnt_attach(void)
212 for (i = 0, iq = footbridge_intrq; i < NIRQ; i++, iq++) {
216 NULL, "footbridge", iq->iq_name);
221 footbridge_intr_claim(int irq, int ipl, const char *name, int (*func)(void *), void *arg)
228 panic("footbridge_intr_establish: IRQ %d out of range", irq);
236 iq = &footbridge_intrq[irq];
244 footbridge_intr_calculate_masks();
249 NULL, "footbridge", name);
257 footbridge_intr_disestablish(void *cookie)
260 struct intrq *iq = &footbridge_intrq[ih->ih_irq];
268 footbridge_intr_calculate_masks();
273 static inline uint32_t footbridge_intstatus(void)
280 footbridge_intr_dispatch(struct clockframe *frame)
287 const int imask = footbridge_imask[ppl];
289 hwpend = footbridge_intstatus();
296 footbridge_set_intrmask();
310 footbridge_ipending |= ibit;
314 footbridge_ipending &= ~ibit;
316 iq = &footbridge_intrq[irq];
332 footbridge_set_intrmask();
336 hwpend |= (footbridge_ipending & ICU_INT_HWMASK) & ~imask;