summaryrefslogtreecommitdiffstats
path: root/sys/amd64/acpica
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2004-06-03 20:25:05 +0000
committerpeter <peter@FreeBSD.org>2004-06-03 20:25:05 +0000
commit14c9e7f78844d72b025335ec817850339c943567 (patch)
treeebf0f244f589f8b667c4f7bc8a689bf76402bebc /sys/amd64/acpica
parente1d648f93223d140aaa2e4691245e769a5993c5c (diff)
downloadFreeBSD-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.c58
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)
OpenPOWER on IntegriCloud