Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch Move the generic ARM soft interrupt code into a gen...



details:   https://anonhg.NetBSD.org/src/rev/22fd690c9e3b
branches:  trunk
changeset: 521396:22fd690c9e3b
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Tue Jan 29 22:54:14 2002 +0000

description:
Move the generic ARM soft interrupt code into a generic place.

diffstat:

 sys/arch/arm/arm/softintr.c       |  198 ++++++++++++++++++++++++++++++++++++++
 sys/arch/arm/include/softintr.h   |  105 ++++++++++++++++++++
 sys/arch/evbarm/evbarm/softintr.c |  198 --------------------------------------
 3 files changed, 303 insertions(+), 198 deletions(-)

diffs (truncated from 513 to 300 lines):

diff -r 561b8b0e402b -r 22fd690c9e3b sys/arch/arm/arm/softintr.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arm/arm/softintr.c       Tue Jan 29 22:54:14 2002 +0000
@@ -0,0 +1,198 @@
+/*     $NetBSD: softintr.c,v 1.1 2002/01/29 22:54:14 thorpej Exp $     */
+
+/*
+ * Copyright (c) 2001 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Jason R. Thorpe for Wasabi Systems, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed for the NetBSD Project by
+ *     Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ *    or promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+
+/* XXX Network interrupts should be converted to new softintrs. */
+#include <net/netisr.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/intr.h>
+
+struct soft_intrq soft_intrq[SI_NQUEUES];
+
+struct soft_intrhand *softnet_intrhand;
+
+void   netintr(void);
+
+/*
+ * softintr_init:
+ *
+ *     Initialize the software interrupt system.
+ */
+void
+softintr_init(void)
+{
+       static const char *softintr_names[] = SI_QUEUENAMES;
+       struct soft_intrq *siq;
+       int i;
+
+       for (i = 0; i < SI_NQUEUES; i++) {
+               siq = &soft_intrq[i];
+               TAILQ_INIT(&siq->siq_list);
+               evcnt_attach_dynamic(&siq->siq_evcnt, EVCNT_TYPE_INTR,
+                   NULL, "soft", softintr_names[i]);
+               siq->siq_si = i;
+       }
+
+       /* XXX Establish legacy software interrupt handlers. */
+       softnet_intrhand = softintr_establish(IPL_SOFTNET,
+           (void (*)(void *))netintr, NULL);
+
+       assert(softnet_intrhand != NULL);
+}
+
+/*
+ * softintr_dispatch:
+ *
+ *     Process pending software interrupts on the specified queue.
+ *
+ *     NOTE: We must already be at the correct interrupt priority level.
+ */
+void
+softintr_dispatch(int si)
+{
+       struct soft_intrq *siq = &soft_intrq[si];
+       struct soft_intrhand *sih;
+       int oldirqstate;
+
+       siq->siq_evcnt.ev_count++;
+       for (;;) {
+               oldirqstate = disable_interrupts(I32_bit);
+               sih = TAILQ_FIRST(&siq->siq_list);
+               if (sih == NULL) {
+                       restore_interrupts(oldirqstate);
+                       break;
+               }
+
+               TAILQ_REMOVE(&siq->siq_list, sih, sih_list);
+               sih->sih_pending = 0;
+
+               uvmexp.softs++;
+
+               restore_interrupts(oldirqstate);
+
+               (*sih->sih_func)(sih->sih_arg);
+       }
+}
+
+/*
+ * softintr_establish:         [interface]
+ *
+ *     Register a software interrupt handler.
+ */
+void *
+softintr_establish(int ipl, void (*func)(void *), void *arg)
+{
+       struct soft_intrhand *sih;
+       int si;
+
+       switch (ipl) {
+       case IPL_SOFT:
+               si = SI_SOFT;
+               break;
+
+       case IPL_SOFTCLOCK:
+               si = SI_SOFTCLOCK;
+               break;
+
+       case IPL_SOFTNET:
+               si = SI_SOFTNET;
+               break;
+
+       case IPL_SOFTSERIAL:
+               si = SI_SOFTSERIAL;
+               break;
+
+       default:
+               panic("softintr_establish: unknown soft IPL %d", ipl);
+       }
+
+       sih = malloc(sizeof(*sih), M_DEVBUF, M_NOWAIT);
+       if (__predict_true(sih != NULL)) {
+               sih->sih_func = func;
+               sih->sih_arg = arg;
+               sih->sih_siq = &soft_intrq[si];
+               sih->sih_pending = 0;
+       }
+       return (sih);
+}
+
+/*
+ * softintr_disestablish:      [interface]
+ *
+ *     Unregister a software interrupt handler.
+ */
+void
+softintr_disestablish(void *arg)
+{
+       struct soft_intrhand *sih = arg;
+       struct soft_intrq *siq = sih->sih_siq;
+       int oldirqstate;
+
+       oldirqstate = disable_interrupts(I32_bit);
+       if (sih->sih_pending) {
+               TAILQ_REMOVE(&siq->siq_list, sih, sih_list);
+               sih->sih_pending = 0;
+       }
+       restore_interrupts(oldirqstate);
+
+       free(sih, M_DEVBUF);
+}
+
+void
+netintr(void)
+{
+       int n, s;
+
+       s = splhigh();
+       n = netisr;
+       netisr = 0;
+       splx(s);
+
+#define        DONETISR(bit, fn)                                               \
+       do {                                                            \
+               if (n & (1 << (bit)))                                   \
+                       fn();                                           \
+       } while (/*CONSTCOND*/0)
+
+#include <net/netisr_dispatch.h>
+
+#undef DONETISR
+}
diff -r 561b8b0e402b -r 22fd690c9e3b sys/arch/arm/include/softintr.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arm/include/softintr.h   Tue Jan 29 22:54:14 2002 +0000
@@ -0,0 +1,105 @@
+/*     $NetBSD: softintr.h,v 1.1 2002/01/29 22:54:14 thorpej Exp $     */
+
+/*
+ * Copyright (c) 2001 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Jason R. Thorpe for Wasabi Systems, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed for the NetBSD Project by
+ *     Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ *    or promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef        _ARM_SOFTINTR_H_
+#define        _ARM_SOFTINTR_H_
+
+#ifdef _KERNEL
+
+/*
+ * Generic software interrupt support for all ARM platforms.
+ *
+ * To use this code, include <arm/softintr.h> from your platform's
+ * <machine/intr.h>.
+ */
+
+#define        SI_SOFT                 0       /* for IPL_SOFT */
+#define        SI_SOFTCLOCK            1       /* for IPL_SOFTCLOCK */
+#define        SI_SOFTNET              2       /* for IPL_SOFTNET */
+#define        SI_SOFTSERIAL           3       /* for IPL_SOFTSERIAL */
+
+#define        SI_NQUEUES              4
+
+#define        SI_QUEUENAMES {                                                 \
+       "generic",                                                      \
+       "clock",                                                        \
+       "net",                                                          \
+       "serial",                                                       \
+}
+
+struct soft_intrhand {
+       TAILQ_ENTRY(soft_intrhand) sih_list;
+       void (*sih_func)(void *);
+       void *sih_arg;
+       struct soft_intrq *sih_siq;
+       int sih_pending;
+};
+
+struct soft_intrq {
+       TAILQ_HEAD(, soft_intrhand) siq_list;
+       struct evcnt siq_evcnt;
+       int siq_si;
+};
+
+void   *softintr_establish(int, void (*)(void *), void *);
+void   softintr_disestablish(void *);
+void   softintr_init(void);
+void   softintr_dispatch(int);
+
+#define        softintr_schedule(arg)                                          \
+do {                                                                   \
+       struct soft_intrhand *__sih = (arg);                            \
+       struct soft_intrq *__siq = __sih->sih_siq;                      \
+       int __s;                                                        \
+                                                                       \
+       __s = splhigh();                                                \
+       if (__sih->sih_pending == 0) {                                  \
+               TAILQ_INSERT_TAIL(&__siq->siq_list, __sih, sih_list);   \
+               __sih->sih_pending = 1;                                 \
+               _setsoftintr(__siq->siq_si);                            \
+       }                                                               \



Home | Main Index | Thread Index | Old Index