diff options
author | peter <peter@FreeBSD.org> | 2004-01-30 00:24:45 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2004-01-30 00:24:45 +0000 |
commit | 35e9c42442d4d38801c8647571190be0abd9b8e4 (patch) | |
tree | 28dec38d0e336338f1fd59f4a558d2de8b88d373 /sys/amd64 | |
parent | f9d4d91579cf054ae4ec3370d355a464c1cbb33f (diff) | |
download | FreeBSD-src-35e9c42442d4d38801c8647571190be0abd9b8e4.zip FreeBSD-src-35e9c42442d4d38801c8647571190be0abd9b8e4.tar.gz |
Merge some more changes from i386.
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/acpica/madt.c | 50 | ||||
-rw-r--r-- | sys/amd64/amd64/local_apic.c | 1 | ||||
-rw-r--r-- | sys/amd64/amd64/mp_machdep.c | 4 | ||||
-rw-r--r-- | sys/amd64/amd64/pmap.c | 1 |
4 files changed, 46 insertions, 10 deletions
diff --git a/sys/amd64/acpica/madt.c b/sys/amd64/acpica/madt.c index 68759c5..d8d6437 100644 --- a/sys/amd64/acpica/madt.c +++ b/sys/amd64/acpica/madt.c @@ -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)); + } } /* diff --git a/sys/amd64/amd64/local_apic.c b/sys/amd64/amd64/local_apic.c index e4232bb..65d8c89 100644 --- a/sys/amd64/amd64/local_apic.c +++ b/sys/amd64/amd64/local_apic.c @@ -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) diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index 660f7e6..7bf7f93 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -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; diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 30512e9..87b3c11 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -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> |