Skip site navigation (1)Skip section navigation (2)
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>