PERFORCE change 38816 for review
Peter Wemm
peter at FreeBSD.org
Mon Sep 29 17:06:42 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=38816
Change 38816 by peter at 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
More information about the p4-projects
mailing list