Date: Wed, 18 Nov 2009 22:52:05 +0000 (UTC) From: Oleksandr Tymoshenko <gonzo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r199496 - in projects/mips/sys/mips: include mips Message-ID: <200911182252.nAIMq5LV086656@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: gonzo Date: Wed Nov 18 22:52:05 2009 New Revision: 199496 URL: http://svn.freebsd.org/changeset/base/199496 Log: - Add cpu_init_interrupts function that is supposed to prepeare stuff required for spinning out interrupts later - Add API for managing intrcnt/intrnames arrays - Some minor style(9) fixes Modified: projects/mips/sys/mips/include/intr_machdep.h projects/mips/sys/mips/mips/exception.S projects/mips/sys/mips/mips/genassym.c projects/mips/sys/mips/mips/intr_machdep.c projects/mips/sys/mips/mips/machdep.c Modified: projects/mips/sys/mips/include/intr_machdep.h ============================================================================== --- projects/mips/sys/mips/include/intr_machdep.h Wed Nov 18 22:31:10 2009 (r199495) +++ projects/mips/sys/mips/include/intr_machdep.h Wed Nov 18 22:52:05 2009 (r199496) @@ -52,11 +52,25 @@ extern struct mips_intrhand mips_intr_ha struct trapframe; +void cpu_init_interrupts(void); void cpu_establish_hardintr(const char *, driver_filter_t *, driver_intr_t *, void *, int, int, void **); void cpu_establish_softintr(const char *, driver_filter_t *, void (*)(void*), void *, int, int, void **); void cpu_intr(struct trapframe *); +/* + * Opaque datatype that represents intr counter + */ +typedef unsigned long* mips_intrcnt_t; +mips_intrcnt_t mips_intrcnt_create(const char *); +void mips_intrcnt_setname(mips_intrcnt_t, const char *); + +static __inline void +mips_intrcnt_inc(mips_intrcnt_t counter) +{ + if (counter) + atomic_add_long(counter, 1); +} #endif /* !_MACHINE_INTR_MACHDEP_H_ */ Modified: projects/mips/sys/mips/mips/exception.S ============================================================================== --- projects/mips/sys/mips/mips/exception.S Wed Nov 18 22:31:10 2009 (r199495) +++ projects/mips/sys/mips/mips/exception.S Wed Nov 18 22:52:05 2009 (r199496) @@ -97,6 +97,11 @@ #endif /* + * Reasonable limit + */ +#define INTRCNT_COUNT 128 + +/* * Assume that w alaways need nops to escape CP0 hazard * TODO: Make hazard delays configurable. Stuck with 5 cycles on the moment * For more info on CP0 hazards see Chapter 7 (p.99) of "MIPS32 Architecture @@ -1273,15 +1278,11 @@ END(MipsFPTrap) .globl intrnames .globl eintrnames intrnames: - .asciiz "clock" - .asciiz "rtc" - .asciiz "sio" - .asciiz "pe" - .asciiz "pic-nic" + .space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 eintrnames: - .align 2 + .align 4 intrcnt: - .word 0,0,0,0,0 + .space INTRCNT_COUNT * 4 * 2 eintrcnt: Modified: projects/mips/sys/mips/mips/genassym.c ============================================================================== --- projects/mips/sys/mips/mips/genassym.c Wed Nov 18 22:31:10 2009 (r199495) +++ projects/mips/sys/mips/mips/genassym.c Wed Nov 18 22:52:05 2009 (r199496) @@ -99,3 +99,4 @@ ASSYM(NPTEPG, NPTEPG); ASSYM(TDF_NEEDRESCHED, TDF_NEEDRESCHED); ASSYM(TDF_ASTPENDING, TDF_ASTPENDING); ASSYM(PCPU_SIZE, sizeof(struct pcpu)); +ASSYM(MAXCOMLEN, MAXCOMLEN); Modified: projects/mips/sys/mips/mips/intr_machdep.c ============================================================================== --- projects/mips/sys/mips/mips/intr_machdep.c Wed Nov 18 22:31:10 2009 (r199495) +++ projects/mips/sys/mips/mips/intr_machdep.c Wed Nov 18 22:52:05 2009 (r199496) @@ -46,12 +46,29 @@ __FBSDID("$FreeBSD$"); static struct intr_event *hardintr_events[NHARD_IRQS]; static struct intr_event *softintr_events[NSOFT_IRQS]; +static mips_intrcnt_t mips_intr_counters[NSOFT_IRQS + NHARD_IRQS]; -#ifdef notyet -static int intrcnt_tab[NHARD_IRQS + NSOFT_IRQS]; -static int intrcnt_index = 0; -static int last_printed = 0; -#endif +static int intrcnt_index; + +mips_intrcnt_t +mips_intrcnt_create(const char* name) +{ + mips_intrcnt_t counter = &intrcnt[intrcnt_index++]; + + mips_intrcnt_setname(counter, name); + return counter; +} + +void +mips_intrcnt_setname(mips_intrcnt_t counter, const char *name) +{ + int idx = counter - intrcnt; + + KASSERT(counter != NULL, ("mips_intrcnt_setname: NULL counter")); + + snprintf(intrnames + (MAXCOMLEN + 1) * idx, + MAXCOMLEN + 1, "%-*s", MAXCOMLEN, name); +} static void mips_mask_hard_irq(void *source) @@ -85,6 +102,30 @@ mips_unmask_soft_irq(void *source) mips_wr_status(mips_rd_status() | ((1 << irq) << 8)); } +/* + * Perform initialization of interrupts prior to setting + * handlings + */ +void +cpu_init_interrupts() +{ + int i; + char name[MAXCOMLEN + 1]; + + /* + * Initialize all available vectors so spare IRQ + * would show up in systat output + */ + for (i = 0; i < NSOFT_IRQS; i++) { + snprintf(name, MAXCOMLEN + 1, "sint%d:", i); + mips_intr_counters[i] = mips_intrcnt_create(name); + } + + for (i = 0; i < NHARD_IRQS; i++) { + snprintf(name, MAXCOMLEN + 1, "int%d:", i); + mips_intr_counters[NSOFT_IRQS + i] = mips_intrcnt_create(name); + } +} void cpu_establish_hardintr(const char *name, driver_filter_t *filt, @@ -107,23 +148,17 @@ cpu_establish_hardintr(const char *name, if (event == NULL) { error = intr_event_create(&event, (void *)(uintptr_t)irq, 0, irq, mips_mask_hard_irq, mips_unmask_hard_irq, - NULL, NULL, "hard intr%d:", irq); + NULL, NULL, "int%d", irq); if (error) return; hardintr_events[irq] = event; -#ifdef notyet - last_printed += snprintf(intrnames + last_printed, - MAXCOMLEN + 1, "hard irq%d: %s", irq, name); - last_printed++; - intrcnt_tab[irq] = intrcnt_index; - intrcnt_index++; -#endif - } intr_event_add_handler(event, name, filt, handler, arg, intr_priority(flags), flags, cookiep); + mips_intrcnt_setname(mips_intr_counters[NSOFT_IRQS + irq], event->ie_fullname); + mips_unmask_hard_irq((void*)(uintptr_t)irq); } @@ -146,7 +181,7 @@ cpu_establish_softintr(const char *name, if (event == NULL) { error = intr_event_create(&event, (void *)(uintptr_t)irq, 0, irq, mips_mask_soft_irq, mips_unmask_soft_irq, - NULL, NULL, "intr%d:", irq); + NULL, NULL, "sint%d:", irq); if (error) return; softintr_events[irq] = event; @@ -155,6 +190,8 @@ cpu_establish_softintr(const char *name, intr_event_add_handler(event, name, filt, handler, arg, intr_priority(flags), flags, cookiep); + mips_intrcnt_setname(mips_intr_counters[irq], event->ie_fullname); + mips_unmask_soft_irq((void*)(uintptr_t)irq); } @@ -184,6 +221,7 @@ cpu_intr(struct trapframe *tf) i--; /* Get a 0-offset interrupt. */ hard = 0; event = softintr_events[i]; + mips_intrcnt_inc(mips_intr_counters[i]); break; default: /* Hardware interrupt. */ @@ -191,6 +229,7 @@ cpu_intr(struct trapframe *tf) i--; /* Get a 0-offset interrupt. */ hard = 1; event = hardintr_events[i]; + mips_intrcnt_inc(mips_intr_counters[NSOFT_IRQS + i]); break; } Modified: projects/mips/sys/mips/mips/machdep.c ============================================================================== --- projects/mips/sys/mips/mips/machdep.c Wed Nov 18 22:31:10 2009 (r199495) +++ projects/mips/sys/mips/mips/machdep.c Wed Nov 18 22:52:05 2009 (r199496) @@ -75,16 +75,17 @@ __FBSDID("$FreeBSD$"); #include <sys/socket.h> #include <sys/user.h> +#include <sys/interrupt.h> #include <sys/cons.h> #include <sys/syslog.h> -#include <machine/cache.h> -#include <machine/cpu.h> -#include <net/netisr.h> -#include <machine/md_var.h> -#include <machine/clock.h> #include <machine/asm.h> #include <machine/bootinfo.h> +#include <machine/cache.h> +#include <machine/clock.h> +#include <machine/cpu.h> #include <machine/hwfunc.h> +#include <machine/intr_machdep.h> +#include <machine/md_var.h> #ifdef DDB #include <sys/kdb.h> #include <ddb/ddb.h> @@ -186,6 +187,7 @@ cpu_startup(void *dummy) printf("avail memory = %lu (%luMB)\n", ptoa(cnt.v_free_count), ptoa(cnt.v_free_count) / 1048576); + cpu_init_interrupts(); /* * Set up buffers, so they can be used to read disk labels.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911182252.nAIMq5LV086656>