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();
 

Reply via email to