Date: Mon, 29 Sep 2003 17:06:38 -0700 (PDT) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 38816 for review Message-ID: <200309300006.h8U06cRP022864@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=38816 Change 38816 by peter@peter_daintree on 2003/09/29 17:05:51 cross-branch integrate from jhb_acpipci (p4 integ -I smp_hammer) Affected files ... .. //depot/projects/hammer/sys/amd64/amd64/apic_vector.s#3 integrate .. //depot/projects/hammer/sys/amd64/amd64/io_apic.c#6 integrate .. //depot/projects/hammer/sys/amd64/amd64/local_apic.c#4 integrate .. //depot/projects/hammer/sys/amd64/include/intr_machdep.h#3 integrate .. //depot/projects/hammer/sys/amd64/isa/atpic.c#4 integrate .. //depot/projects/hammer/sys/jhb_notes#4 integrate Differences ... ==== //depot/projects/hammer/sys/amd64/amd64/apic_vector.s#3 (text+ko) ==== ==== //depot/projects/hammer/sys/amd64/amd64/io_apic.c#6 (text+ko) ==== @@ -73,7 +73,6 @@ #define DEST_NONE -1 #define DEST_EXTINT -2 -#define DEST_EXTINT_ENABLED -3 #define TODO printf("%s: not implemented!\n", __func__) @@ -130,7 +129,7 @@ static void ioapic_resume(struct intsrc *isrc); static void ioapic_program_destination(struct ioapic_intsrc *intpin); #ifdef MIXED_MODE -static struct intsrc *mixedpic_create_source(struct ioapic_intsrc *intpin); +static void ioapic_setup_mixed_mode(struct ioapic_intsrc *intpin); #endif struct pic ioapic_template = { ioapic_enable_source, ioapic_disable_source, @@ -214,8 +213,7 @@ KASSERT(intpin->io_dest != DEST_NONE, ("intpin not assigned to a cluster")); - KASSERT(intpin->io_dest != DEST_EXTINT && - intpin->io_dest != DEST_EXTINT_ENABLED, + KASSERT(intpin->io_dest != DEST_EXTINT, ("intpin routed via ExtINT")); /* XXXTEST */ printf("ioapic%u: routing intpin %u (", io->io_id, intpin->io_intpin); @@ -261,33 +259,18 @@ ioapic_enable_intr(struct intsrc *isrc) { struct ioapic_intsrc *intpin = (struct ioapic_intsrc *)isrc; - struct ioapic_intsrc *extint; - struct ioapic *io; if (intpin->io_vector == IDT_TO_IRQ(IDT_SYSCALL)) { printf("WARNING: IRQ %d is not routed!\n", IDT_TO_IRQ(IDT_SYSCALL)); return; } - switch (intpin->io_dest) { - case DEST_NONE: + KASSERT(intpin->io_dest != DEST_EXTINT, + ("ExtINT pin trying to use ioapic enable_intr method")); + if (intpin->io_dest == DEST_NONE) { ioapic_assign_cluster(intpin); - break; - case DEST_EXTINT: - io = (struct ioapic *)isrc->is_pic; - extint = &io->io_pins[0]; - if (extint->io_vector != VECTOR_EXTINT) - panic("Can't find ExtINT pin to route through!"); - if (extint->io_dest == DEST_NONE) { - ioapic_assign_cluster(extint); - ioapic_enable_source(&extint->io_intsrc); - } - intpin->io_dest = DEST_EXTINT_ENABLED; - break; - default: - return; + lapic_enable_intr(intpin->io_vector); } - lapic_enable_intr(intpin->io_vector); } static int @@ -419,9 +402,13 @@ */ intpin->io_masked = 1; intpin->io_dest = -1; - if (bootverbose) - printf("ioapic%u: intpin %d -> irq %d\n", io->io_id, - i, intpin->io_vector); + if (bootverbose) { + printf("ioapic%u: intpin %d -> ", io->io_id, i); + if (intpin->io_vector == VECTOR_EXTINT) + printf("ExtINT\n"); + else + printf("irq %d\n", intpin->io_vector); + } value = ioapic_read(apic, IOAPIC_REDTBL_LO(i)); ioapic_write(apic, IOAPIC_REDTBL_LO(i), value | IOART_INTMSET); } @@ -490,6 +477,8 @@ return (EINVAL); io->io_pins[pin].io_vector = VECTOR_NMI; io->io_pins[pin].io_masked = 0; + io->io_pins[pin].io_edgetrigger = 1; + io->io_pins[pin].io_activehi = 1; #if 0 if (bootverbose) #endif @@ -510,6 +499,8 @@ return (EINVAL); io->io_pins[pin].io_vector = VECTOR_SMI; io->io_pins[pin].io_masked = 0; + io->io_pins[pin].io_edgetrigger = 1; + io->io_pins[pin].io_activehi = 1; #if 0 if (bootverbose) #endif @@ -530,6 +521,7 @@ return (EINVAL); io->io_pins[pin].io_vector = VECTOR_EXTINT; io->io_pins[pin].io_edgetrigger = 1; + io->io_pins[pin].io_activehi = 1; #if 0 if (bootverbose) #endif @@ -645,16 +637,15 @@ ioapic_write(apic, IOAPIC_REDTBL_HI(i), flags); mtx_unlock_spin(&icu_lock); if (pin->io_vector >= 0) { - struct intsrc *isrc; #ifdef MIXED_MODE /* Route IRQ0 via the 8259A using mixed mode. */ if (pin->io_vector == 0) - isrc = mixedpic_create_source(pin); + ioapic_setup_mixed_mode(pin); else #endif - isrc = &pin->io_intsrc; - intr_register_source(isrc); + intr_register_source(&pin->io_intsrc); } + } } @@ -671,7 +662,8 @@ program_logical_dest = 1; STAILQ_FOREACH(io, &ioapic_list, io_next) for (i = 0; i < io->io_numintr; i++) - if (io->io_pins[i].io_dest != DEST_NONE) + if (io->io_pins[i].io_dest != DEST_NONE && + io->io_pins[i].io_dest != DEST_EXTINT) ioapic_program_destination(&io->io_pins[i]); } SYSINIT(ioapic_destinations, SI_SUB_SMP, SI_ORDER_SECOND, @@ -685,140 +677,26 @@ * functionality to build these interrupt sources. */ -struct mixedpic_intsrc { - struct intsrc mp_intsrc; - struct intsrc *mp_atpicsrc; - struct intsrc *mp_apicpin; -}; - -static void mixedpic_enable_source(struct intsrc *isrc); -static void mixedpic_disable_source(struct intsrc *isrc); -static void mixedpic_eoi_source(struct intsrc *isrc); -static void mixedpic_enable_intr(struct intsrc *isrc); -static int mixedpic_vector(struct intsrc *isrc); -static int mixedpic_source_pending(struct intsrc *isrc); -static void mixedpic_suspend(struct intsrc *isrc); -static void mixedpic_resume(struct intsrc *isrc); - -struct pic mixedpic = { mixedpic_enable_source, mixedpic_disable_source, - mixedpic_eoi_source, mixedpic_enable_intr, - mixedpic_vector, mixedpic_source_pending, - mixedpic_suspend, mixedpic_resume }; - -static void -mixedpic_enable_source(struct intsrc *isrc) +void +ioapic_setup_mixed_mode(struct ioapic_intsrc *intpin) { - struct mixedpic_intsrc *mpsrc; - - mpsrc = (struct mixedpic_intsrc *)isrc; - isrc = mpsrc->mp_atpicsrc; - isrc->is_pic->pic_enable_source(isrc); -} - -static void -mixedpic_disable_source(struct intsrc *isrc) -{ - struct mixedpic_intsrc *mpsrc; -#if 0 - struct intsrc *intpin; -#endif - - mpsrc = (struct mixedpic_intsrc *)isrc; -#if 0 - intpin = mpsrc->mp_apicpin; -#endif - isrc = mpsrc->mp_atpicsrc; - isrc->is_pic->pic_disable_source(isrc); + struct ioapic_intsrc *extint; + struct ioapic *io; -#if 0 /* - * If the interrupt is pending in the local APIC, assume that - * we have been called just before the local APIC gets its - * EOI and send an EOI out to the 8259As. + * Mark the associated I/O APIC intpin as being delivered via + * ExtINT and enable the ExtINT pin on the I/O APIC if needed. */ - if (intpin->is_pic->pic_source_pending(intpin)) - isrc->is_pic->pic_eoi_source(isrc); -#endif -} - -static void -mixedpic_eoi_source(struct intsrc *isrc) -{ - struct mixedpic_intsrc *mpsrc; -#if 0 - struct intsrc *intpin; -#endif - - mpsrc = (struct mixedpic_intsrc *)isrc; -#if 0 - intpin = mpsrc->mp_apicpin; -#endif - isrc = mpsrc->mp_atpicsrc; - isrc->is_pic->pic_eoi_source(isrc); -#if 0 - intpin->is_pic->pic_eoi_source(intpin); -#endif -} - -static void -mixedpic_enable_intr(struct intsrc *isrc) -{ - struct mixedpic_intsrc *mpsrc; - - mpsrc = (struct mixedpic_intsrc *)isrc; - isrc = mpsrc->mp_atpicsrc; - isrc->is_pic->pic_enable_intr(isrc); -} + intpin->io_dest = DEST_EXTINT; + io = (struct ioapic *)intpin->io_intsrc.is_pic; + extint = &io->io_pins[0]; + if (extint->io_vector != VECTOR_EXTINT) + panic("Can't find ExtINT pin to route through!"); + if (extint->io_dest == DEST_NONE) { + ioapic_assign_cluster(extint); + ioapic_enable_source(&extint->io_intsrc); + } -static int -mixedpic_vector(struct intsrc *isrc) -{ - struct mixedpic_intsrc *mpsrc; - - mpsrc = (struct mixedpic_intsrc *)isrc; - isrc = mpsrc->mp_atpicsrc; - return (isrc->is_pic->pic_vector(isrc)); -} - -static int -mixedpic_source_pending(struct intsrc *isrc) -{ - struct mixedpic_intsrc *mpsrc; - - mpsrc = (struct mixedpic_intsrc *)isrc; - isrc = mpsrc->mp_atpicsrc; - return (isrc->is_pic->pic_source_pending(isrc)); -} - -static void -mixedpic_suspend(struct intsrc *isrc) -{ - - TODO; -} - -static void -mixedpic_resume(struct intsrc *isrc) -{ - - TODO; -} - -static struct intsrc * -mixedpic_create_source(struct ioapic_intsrc *intpin) -{ - struct mixedpic_intsrc *mpsrc; - int vector; - - KASSERT(intpin->io_dest == DEST_NONE, ("%s: intpin already enabled", - __func__)); - mpsrc = malloc(sizeof(struct mixedpic_intsrc), M_IOAPIC, M_WAITOK); - mpsrc->mp_intsrc.is_pic = &mixedpic; - mpsrc->mp_apicpin = (struct intsrc *)intpin; - vector = intpin->io_intsrc.is_pic->pic_vector(&intpin->io_intsrc); - mpsrc->mp_atpicsrc = atpic_lookup_source(vector); - intpin->io_dest = DEST_EXTINT; /* XXX */ - return (&mpsrc->mp_intsrc); } #endif /* MIXED_MODE */ ==== //depot/projects/hammer/sys/amd64/amd64/local_apic.c#4 (text+ko) ==== @@ -139,18 +139,13 @@ value |= lvt->lvt_mode; switch (lvt->lvt_mode) { case APIC_LVT_DM_NMI: - /* XXX: do the same for SMI? */ - /* Enable NMI's on the BSP. */ - if (PCPU_GET(cpuid) == 0) - value &= ~APIC_LVT_M; - /* FALLTHROUGH */ case APIC_LVT_DM_SMI: case APIC_LVT_DM_INIT: + case APIC_LVT_DM_EXTINT: KASSERT(lvt->lvt_edgetrigger == 1, ("LVT with mode %#x must be edge triggered", lvt->lvt_mode)); /* FALLTHROUGH */ - case APIC_LVT_DM_EXTINT: /* Use a vector of 0. */ break; case APIC_LVT_DM_FIXED: @@ -361,17 +356,35 @@ int lapic_set_lvt_mode(u_int apic_id, u_int lvt, u_int32_t mode) { + struct lvt *lv; if (lvt > LVT_MAX) return (EINVAL); if (apic_id == APIC_ID_ALL) - lvts[lvt].lvt_mode = mode; + lv = &lvts[lvt]; else { KASSERT(lapics[apic_id].la_present, ("%s: missing APIC %u", __func__, apic_id)); - lapics[apic_id].la_lvts[lvt].lvt_mode = mode; - lapics[apic_id].la_lvts[lvt].lvt_active = 1; + lv = &lapics[apic_id].la_lvts[lvt]; + lv->lvt_active = 1; + } + lv->lvt_mode = mode; + switch (mode) { + case APIC_LVT_DM_NMI: + case APIC_LVT_DM_SMI: + case APIC_LVT_DM_INIT: + case APIC_LVT_DM_EXTINT: + lv->lvt_edgetrigger = 1; + lv->lvt_activehi = 1; + if (mode == APIC_LVT_DM_EXTINT) + lvt->lvt_masked = 1; + else + lvt->lvt_masked = 0; + break; + default: + panic("Unsupported delivery mode: 0x%x\n", mode); + } return (0); } ==== //depot/projects/hammer/sys/amd64/include/intr_machdep.h#3 (text+ko) ==== @@ -77,8 +77,8 @@ extern struct mtx icu_lock; +/* XXX: Does this belong in icu.h? */ void atpic_startup(void); -struct intsrc *atpic_lookup_source(int vector); int intr_add_handler(const char *name, int vector, driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep); ==== //depot/projects/hammer/sys/amd64/isa/atpic.c#4 (text+ko) ==== @@ -106,6 +106,7 @@ int at_irq; /* Relative to PIC base. */ inthand_t *at_fastintr; inthand_t *at_intr; + struct intsrc *at_extsrc; }; /* @@ -346,20 +347,17 @@ void atpic_sched_ithd(struct intrframe iframe) { + struct atpic_intsrc *asrc; + struct intsrc *isrc; KASSERT((uint)iframe.if_vec < ICU_LEN, ("unknown int %d\n", iframe.if_vec)); - intr_execute_handlers(&atintrs[iframe.if_vec].at_intsrc, &iframe); -} - -struct intsrc * -atpic_lookup_source(int vector) -{ - - KASSERT(vector >= 0 && vector != ICU_SLAVEID && - vector < sizeof(atintrs) / sizeof(struct atpic_intsrc), - ("%s: invalid vector %d", __func__, vector)); - return (&atintrs[vector].at_intsrc); + asrc = &atintrs[iframe.if_vec]; + if (asrc->at_extsrc != NULL) + isrc = asrc->at_extsrc; + else + isrc = &asrc->at_intsrc; + intr_execute_handlers(isrc, &iframe); } /* ==== //depot/projects/hammer/sys/jhb_notes#4 (text+ko) ==== @@ -27,8 +27,17 @@ - isa/vector.s Todo: -- Set PCPU(apic_id) for UP case in lapic_init(). -- Use apic id of BSP (current CPU) when programming temporary physical +- DDB + + Add APIC ID to show pcpu + + Add 'show intrcnt' + + Add 'show idt' + - Add 'show ithread' + + Add 'show irqs' + - print out PIC driver name for each IRQ? + - Add 'show irq' +- Add nmi.c ++ Set PCPU(apic_id) for UP case in lapic_init(). ++ Use apic id of BSP (current CPU) when programming temporary physical destinations into I/O APIC RDT entries. - Fix IDT_SYSCALL mapping in APIC case - Test mixed mode
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309300006.h8U06cRP022864>