diff options
author | peter <peter@FreeBSD.org> | 2004-06-03 20:25:05 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2004-06-03 20:25:05 +0000 |
commit | 14c9e7f78844d72b025335ec817850339c943567 (patch) | |
tree | ebf0f244f589f8b667c4f7bc8a689bf76402bebc /sys/amd64/acpica | |
parent | e1d648f93223d140aaa2e4691245e769a5993c5c (diff) | |
download | FreeBSD-src-14c9e7f78844d72b025335ec817850339c943567.zip FreeBSD-src-14c9e7f78844d72b025335ec817850339c943567.tar.gz |
MFi386: apic intpin programming updates etc.
Diffstat (limited to 'sys/amd64/acpica')
-rw-r--r-- | sys/amd64/acpica/madt.c | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/sys/amd64/acpica/madt.c b/sys/amd64/acpica/madt.c index 575e916..11229da 100644 --- a/sys/amd64/acpica/madt.c +++ b/sys/amd64/acpica/madt.c @@ -67,8 +67,8 @@ struct ioapic_info { struct lapic_info { u_int la_present:1; u_int la_enabled:1; - u_int la_apic_id:8; -} lapics[NLAPICS + 1]; + u_int la_acpi_id:8; +} lapics[NLAPICS]; static int madt_found_sci_override; static MULTIPLE_APIC_TABLE *madt; @@ -447,14 +447,14 @@ madt_probe_cpus_handler(APIC_HEADER *entry, void *arg) printf("MADT: Found CPU APIC ID %d ACPI ID %d: %s\n", proc->LocalApicId, proc->ProcessorId, proc->ProcessorEnabled ? "enabled" : "disabled"); - if (proc->ProcessorId > NLAPICS) + if (proc->LocalApicId >= NLAPICS) panic("%s: CPU ID %d too high", __func__, - proc->ProcessorId); - la = &lapics[proc->ProcessorId]; + proc->LocalApicId); + la = &lapics[proc->LocalApicId]; KASSERT(la->la_present == 0, - ("Duplicate local ACPI ID %d", proc->ProcessorId)); + ("Duplicate local APIC ID %d", proc->LocalApicId)); la->la_present = 1; - la->la_apic_id = proc->LocalApicId; + la->la_acpi_id = proc->ProcessorId; if (proc->ProcessorEnabled) { la->la_enabled = 1; lapic_create(proc->LocalApicId, 0); @@ -545,14 +545,20 @@ interrupt_trigger(UINT16 TriggerMode, UINT8 Source) static int madt_find_cpu(u_int acpi_id, u_int *apic_id) { + int i; - if (!lapics[acpi_id].la_present) - return (ENOENT); - *apic_id = lapics[acpi_id].la_apic_id; - if (lapics[acpi_id].la_enabled) - return (0); - else - return (ENXIO); + for (i = 0; i < NLAPICS; i++) { + if (!lapics[i].la_present) + continue; + if (lapics[i].la_acpi_id != acpi_id) + continue; + *apic_id = i; + if (lapics[i].la_enabled) + return (0); + else + return (ENXIO); + } + return (ENOENT); } /* @@ -752,8 +758,9 @@ madt_parse_ints(APIC_HEADER *entry, void *arg __unused) static void madt_set_ids(void *dummy) { + struct lapic_info *la; struct pcpu *pc; - u_int i, j; + u_int i; if (madt == NULL) return; @@ -762,19 +769,14 @@ madt_set_ids(void *dummy) continue; pc = pcpu_find(i); KASSERT(pc != NULL, ("no pcpu data for CPU %d", i)); - for (j = 0; j < NLAPICS + 1; j++) { - if (!lapics[j].la_present || !lapics[j].la_enabled) - continue; - if (lapics[j].la_apic_id == pc->pc_apic_id) { - pc->pc_acpi_id = j; - if (bootverbose) - printf("APIC: CPU %u has ACPI ID %u\n", - i, j); - break; - } - } - if (j == NLAPICS + 1) - panic("Unable to find ACPI ID for CPU %d", i); + la = &lapics[pc->pc_apic_id]; + if (!la->la_present || !la->la_enabled) + panic("APIC: CPU with APIC ID %u is not enabled", + pc->pc_apic_id); + pc->pc_acpi_id = la->la_acpi_id; + if (bootverbose) + printf("APIC: CPU %u has ACPI ID %u\n", i, + la->la_acpi_id); } } SYSINIT(madt_set_ids, SI_SUB_CPU, SI_ORDER_ANY, madt_set_ids, NULL) |