Module Name: src Committed By: kiyohara Date: Mon May 17 11:46:19 UTC 2010
Modified Files: src/sys/arch/ia64/ia64: cpu.c mainbus.c Log Message: Attach CPU only of the pretense. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/arch/ia64/ia64/cpu.c \ src/sys/arch/ia64/ia64/mainbus.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/ia64/ia64/cpu.c diff -u src/sys/arch/ia64/ia64/cpu.c:1.7 src/sys/arch/ia64/ia64/cpu.c:1.8 --- src/sys/arch/ia64/ia64/cpu.c:1.7 Sat Nov 21 15:36:34 2009 +++ src/sys/arch/ia64/ia64/cpu.c Mon May 17 11:46:19 2010 @@ -1,11 +1,11 @@ -/* $NetBSD: cpu.c,v 1.7 2009/11/21 15:36:34 rmind Exp $ */ +/* $NetBSD: cpu.c,v 1.8 2010/05/17 11:46:19 kiyohara Exp $ */ /* * Copyright (c) 2006 The NetBSD Foundation, Inc. * All rights reserved. * * - * Author: + * Author: * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,18 +30,22 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.7 2009/11/21 15:36:34 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.8 2010/05/17 11:46:19 kiyohara Exp $"); #include <sys/param.h> #include <sys/proc.h> #include <sys/systm.h> #include <sys/device.h> -#include <sys/malloc.h> +#include <sys/kmem.h> -struct cpu_info cpu_info_primary; +#include <dev/acpi/acpica.h> +#include <dev/acpi/acpivar.h> -int cpu_match(device_t, cfdata_t, void *); -void cpu_attach(device_t, device_t, void *); + +struct cpu_info cpu_info_primary __aligned(CACHE_LINE_SIZE); + +static int cpu_match(device_t, cfdata_t, void *); +static void cpu_attach(device_t, device_t, void *); struct cpu_softc { device_t sc_dev; /* device tree glue */ @@ -52,20 +56,47 @@ cpu_match, cpu_attach, NULL, NULL); -int +static int cpu_match(device_t parent, cfdata_t match, void *aux) { + return 1; } -void +static void cpu_attach(device_t parent, device_t self, void *aux) { + struct cpu_softc *sc = device_private(self); + ACPI_MADT_LOCAL_SAPIC *sapic = (ACPI_MADT_LOCAL_SAPIC *)aux; + struct cpu_info *ci; + uint64_t lid; + int id, eid; + + aprint_naive("\n"); + aprint_normal(": ProcessorID %d, Id %d, Eid %d%s\n", + sapic->ProcessorId, sapic->Id, sapic->Eid, + sapic->LapicFlags & ACPI_MADT_ENABLED ? "" : " (disabled)"); + + /* Get current CPU Id */ + lid = ia64_get_lid(); + id = (lid & 0x00000000ff000000) >> 24; + eid = (lid & 0x0000000000ff0000) >> 16; + + sc->sc_dev = self; + if (id == sapic->Id && eid == sapic->Eid) + ci = curcpu(); + else { + ci = (struct cpu_info *)kmem_zalloc(sizeof(*ci), KM_NOSLEEP); + if (ci == NULL) { + aprint_error_dev(self, "memory alloc failed\n"); + return; + } + } + sc->sc_info = ci; -#if 0 /* not yet */ - ci->ci_cpuid = id; - ci->ci_intrdepth = -1; /* need ? */ + ci->ci_cpuid = sapic->ProcessorId; + ci->ci_intrdepth = -1; /* need ? */ ci->ci_dev = self; -#endif + return; } Index: src/sys/arch/ia64/ia64/mainbus.c diff -u src/sys/arch/ia64/ia64/mainbus.c:1.7 src/sys/arch/ia64/ia64/mainbus.c:1.8 --- src/sys/arch/ia64/ia64/mainbus.c:1.7 Sat Jan 23 06:13:20 2010 +++ src/sys/arch/ia64/ia64/mainbus.c Mon May 17 11:46:19 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: mainbus.c,v 1.7 2010/01/23 06:13:20 kiyohara Exp $ */ +/* $NetBSD: mainbus.c,v 1.8 2010/05/17 11:46:19 kiyohara Exp $ */ /*- * Copyright (c) 2006 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.7 2010/01/23 06:13:20 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.8 2010/05/17 11:46:19 kiyohara Exp $"); #include "acpica.h" @@ -37,17 +37,15 @@ #include <sys/device.h> #include <sys/errno.h> -#if NACPICA > 0 +#include <dev/acpi/acpica.h> #include <dev/acpi/acpivar.h> -#endif +#include <actables.h> static int mainbus_match(device_t, cfdata_t, void *); static void mainbus_attach(device_t, device_t, void *); -CFATTACH_DECL_NEW(mainbus, - /*sizeof(struct device): XXXXX It doesn't use it now*/ 0, - mainbus_match, mainbus_attach, NULL, NULL); +CFATTACH_DECL_NEW(mainbus, 0, mainbus_match, mainbus_attach, NULL, NULL); /* @@ -69,10 +67,52 @@ #if NACPICA > 0 struct acpibus_attach_args aaa; #endif + ACPI_PHYSICAL_ADDRESS rsdp_ptr; + ACPI_MADT_LOCAL_SAPIC *entry; + ACPI_TABLE_MADT *table; + ACPI_TABLE_RSDP *rsdp; + ACPI_TABLE_XSDT *xsdt; + char *end, *p; + int tables, i; aprint_naive("\n"); aprint_normal("\n"); + if ((rsdp_ptr = AcpiOsGetRootPointer()) == 0) + panic("cpu not found"); + + rsdp = (ACPI_TABLE_RSDP *)IA64_PHYS_TO_RR7(rsdp_ptr); + xsdt = (ACPI_TABLE_XSDT *)IA64_PHYS_TO_RR7(rsdp->XsdtPhysicalAddress); + + tables = (UINT64 *)((char *)xsdt + xsdt->Header.Length) - + xsdt->TableOffsetEntry; + + for (i = 0; i < tables; i++) { + int len; + char *sig; + + table = (ACPI_TABLE_MADT *) + IA64_PHYS_TO_RR7(xsdt->TableOffsetEntry[i]); + + sig = table->Header.Signature; + if (strncmp(sig, ACPI_SIG_MADT, ACPI_NAME_SIZE) != 0) + continue; + len = table->Header.Length; + if (ACPI_FAILURE(AcpiTbChecksum((void *)table, len))) + continue; + + end = (char *)table + table->Header.Length; + p = (char *)(table + 1); + while (p < end) { + entry = (ACPI_MADT_LOCAL_SAPIC *)p; + + if (entry->Header.Type == ACPI_MADT_TYPE_LOCAL_SAPIC) + config_found_ia(self, "cpubus", entry, 0); + + p += entry->Header.Length; + } + } + #if NACPICA > 0 acpi_probe();