Merge some more changes from i386.

This commit is contained in:
Peter Wemm 2004-01-30 00:24:45 +00:00
parent 9608d7e2cd
commit 8a703d13b0
4 changed files with 46 additions and 10 deletions

View File

@ -320,13 +320,22 @@ madt_setup_local(void)
}
/*
* Run through the MP table enumerating I/O APICs.
* Enumerate I/O APICs and setup interrupt sources.
*/
static int
madt_setup_io(void)
{
int i;
/* Try to initialize ACPI so that we can access the FADT. */
i = acpi_Startup();
if (ACPI_FAILURE(i)) {
printf("MADT: ACPI Startup failed with %s\n",
AcpiFormatException(i));
printf("Try disabling either ACPI or apic support.\n");
panic("Using MADT but ACPI doesn't work");
}
/* First, we run through adding I/O APIC's. */
madt_walk_table(madt_parse_apics, NULL);
@ -523,6 +532,7 @@ madt_parse_interrupt_override(MADT_INTERRUPT_OVERRIDE *intr)
{
void *new_ioapic, *old_ioapic;
u_int new_pin, old_pin;
int force_lo;
if (bootverbose)
printf("MADT: intr override: source %u, irq %u\n",
@ -535,9 +545,27 @@ madt_parse_interrupt_override(MADT_INTERRUPT_OVERRIDE *intr)
return;
}
/*
* If the SCI is remapped to a non-ISA global interrupt,
* force it to level trigger and active-lo polarity.
* If the SCI is identity mapped but has edge trigger and
* active-hi polarity, also force it to use level/lo.
*/
force_lo = 0;
if (intr->Source == AcpiGbl_FADT->SciInt)
if (intr->Interrupt > 15 || (intr->Interrupt == intr->Source &&
intr->TriggerMode == TRIGGER_EDGE &&
intr->Polarity == POLARITY_ACTIVE_HIGH))
force_lo = 1;
if (intr->Source != intr->Interrupt) {
/* XXX: This assumes that the SCI uses IRQ 9. */
if (intr->Interrupt > 15 && intr->Source == 9)
/*
* If the SCI is remapped to a non-ISA global interrupt,
* then override the vector we use to setup and allocate
* the interrupt.
*/
if (intr->Interrupt > 15 &&
intr->Source == AcpiGbl_FADT->SciInt)
acpi_OverrideInterruptLevel(intr->Interrupt);
else
ioapic_remap_vector(new_ioapic, new_pin, intr->Source);
@ -549,10 +577,18 @@ madt_parse_interrupt_override(MADT_INTERRUPT_OVERRIDE *intr)
intr->Source)
ioapic_disable_pin(old_ioapic, old_pin);
}
ioapic_set_triggermode(new_ioapic, new_pin,
interrupt_trigger(intr->TriggerMode));
ioapic_set_polarity(new_ioapic, new_pin,
interrupt_polarity(intr->Polarity));
if (force_lo) {
printf(
"MADT: Forcing active-lo polarity and level trigger for IRQ %d\n",
intr->Source);
ioapic_set_polarity(new_ioapic, new_pin, 0);
ioapic_set_triggermode(new_ioapic, new_pin, 0);
} else {
ioapic_set_polarity(new_ioapic, new_pin,
interrupt_polarity(intr->Polarity));
ioapic_set_triggermode(new_ioapic, new_pin,
interrupt_trigger(intr->TriggerMode));
}
}
/*

View File

@ -638,7 +638,6 @@ SYSINIT(apic_setup_io, SI_SUB_INTR, SI_ORDER_SECOND, apic_setup_io, NULL)
* private the sys/i386 code. The public interface for the rest of the
* kernel is defined in mp_machdep.c.
*/
#define DETECT_DEADLOCK
int
lapic_ipi_wait(int delay)

View File

@ -80,8 +80,8 @@ extern int nkpt;
/*
* CPU topology map datastructures for HTT.
*/
struct cpu_group mp_groups[MAXCPU];
struct cpu_top mp_top;
static struct cpu_group mp_groups[MAXCPU];
static struct cpu_top mp_top;
/* AP uses this during bootstrap. Do not staticize. */
char *bootSTK;

View File

@ -117,6 +117,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sx.h>
#include <sys/user.h>
#include <sys/vmmeter.h>
#include <sys/sched.h>
#include <sys/sysctl.h>
#ifdef SMP
#include <sys/smp.h>