diff options
author | Olivier Houchard <cognet@FreeBSD.org> | 2007-07-27 14:26:42 +0000 |
---|---|---|
committer | Olivier Houchard <cognet@FreeBSD.org> | 2007-07-27 14:26:42 +0000 |
commit | 43a2baaf1c2f6096f740ddb1f26bd48ebf516fd1 (patch) | |
tree | 5cadac3bfe501084a5a1f39793feed0a45b293ee /sys/arm | |
parent | 7bd2b6a8ab8195bad882b15942737bf9d06a06dc (diff) | |
download | src-43a2baaf1c2f6096f740ddb1f26bd48ebf516fd1.tar.gz src-43a2baaf1c2f6096f740ddb1f26bd48ebf516fd1.zip |
INTR_FILTER bits for arm
Approved by: re (blanket)
Notes
Notes:
svn path=/head/; revision=171616
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/arm/intr.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/sys/arm/arm/intr.c b/sys/arm/arm/intr.c index 58aa1f60b2ea..c9912206c5ec 100644 --- a/sys/arm/arm/intr.c +++ b/sys/arm/arm/intr.c @@ -57,6 +57,27 @@ static int last_printed = 0; void arm_handler_execute(struct trapframe *, int); +#ifdef INTR_FILTER +static void +intr_disab_eoi_src(void *arg) +{ + uintptr_t nb; + + nb = (uintptr_t)arg; + arm_mask_irq(nb); +} + +static void +intr_eoi_src(void *arg) +{ + uintptr_t nb; + + nb = (uintptr_t)arg; + arm_unmask_irq(nb); +} + +#endif + void arm_setup_irqhandler(const char *name, driver_filter_t *filt, void (*hand)(void*), void *arg, int irq, int flags, void **cookiep) @@ -68,8 +89,14 @@ arm_setup_irqhandler(const char *name, driver_filter_t *filt, return; event = intr_events[irq]; if (event == NULL) { +#ifdef INTR_FILTER + error = intr_event_create(&event, (void *)irq, 0, + (void (*)(void *))arm_unmask_irq, intr_eoi_src, + intr_disab_eoi_src, "intr%d:", irq); +#else error = intr_event_create(&event, (void *)irq, 0, (void (*)(void *))arm_unmask_irq, "intr%d:", irq); +#endif if (error) return; intr_events[irq] = event; @@ -102,19 +129,33 @@ void arm_handler_execute(struct trapframe *frame, int irqnb) { struct intr_event *event; - struct intr_handler *ih; struct thread *td = curthread; +#ifdef INTR_FILTER + int i; +#else int i, thread, ret; + struct intr_handler *ih; +#endif PCPU_INC(cnt.v_intr); td->td_intr_nesting_level++; while ((i = arm_get_next_irq()) != -1) { +#ifndef INTR_FILTER arm_mask_irq(i); +#endif intrcnt[intrcnt_tab[i]]++; event = intr_events[i]; - if (!event || TAILQ_EMPTY(&event->ie_handlers)) + if (!event || TAILQ_EMPTY(&event->ie_handlers)) { +#ifdef INTR_FILTER + arm_mask_irq(i); +#endif continue; + } +#ifdef INTR_FILTER + intr_event_handle(event, frame); + /* XXX: Log stray IRQs */ +#else /* Execute fast handlers. */ ret = 0; thread = 0; @@ -139,6 +180,7 @@ arm_handler_execute(struct trapframe *frame, int irqnb) intr_event_schedule_thread(event); else arm_unmask_irq(i); +#endif } td->td_intr_nesting_level--; } |