Home | History | Annotate | Line # | Download | only in ia64
cpu.c revision 1.8
      1  1.8  kiyohara /*	$NetBSD: cpu.c,v 1.8 2010/05/17 11:46:19 kiyohara Exp $	*/
      2  1.1    cherry 
      3  1.1    cherry /*
      4  1.1    cherry  * Copyright (c) 2006 The NetBSD Foundation, Inc.
      5  1.1    cherry  * All rights reserved.
      6  1.1    cherry  *
      7  1.1    cherry  *
      8  1.8  kiyohara  * Author:
      9  1.1    cherry  *
     10  1.1    cherry  * Redistribution and use in source and binary forms, with or without
     11  1.1    cherry  * modification, are permitted provided that the following conditions
     12  1.1    cherry  * are met:
     13  1.1    cherry  * 1. Redistributions of source code must retain the above copyright
     14  1.1    cherry  *    notice, this list of conditions and the following disclaimer.
     15  1.1    cherry  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1    cherry  *    notice, this list of conditions and the following disclaimer in the
     17  1.1    cherry  *    documentation and/or other materials provided with the distribution.
     18  1.1    cherry  *
     19  1.1    cherry  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  1.1    cherry  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  1.1    cherry  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  1.1    cherry  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  1.1    cherry  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  1.1    cherry  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  1.1    cherry  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  1.1    cherry  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  1.1    cherry  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  1.1    cherry  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  1.1    cherry  * POSSIBILITY OF SUCH DAMAGE.
     30  1.1    cherry  */
     31  1.1    cherry 
     32  1.1    cherry #include <sys/cdefs.h>
     33  1.8  kiyohara __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.8 2010/05/17 11:46:19 kiyohara Exp $");
     34  1.1    cherry 
     35  1.1    cherry #include <sys/param.h>
     36  1.1    cherry #include <sys/proc.h>
     37  1.1    cherry #include <sys/systm.h>
     38  1.1    cherry #include <sys/device.h>
     39  1.8  kiyohara #include <sys/kmem.h>
     40  1.1    cherry 
     41  1.8  kiyohara #include <dev/acpi/acpica.h>
     42  1.8  kiyohara #include <dev/acpi/acpivar.h>
     43  1.1    cherry 
     44  1.8  kiyohara 
     45  1.8  kiyohara struct cpu_info cpu_info_primary __aligned(CACHE_LINE_SIZE);
     46  1.8  kiyohara 
     47  1.8  kiyohara static int cpu_match(device_t, cfdata_t, void *);
     48  1.8  kiyohara static void cpu_attach(device_t, device_t, void *);
     49  1.1    cherry 
     50  1.1    cherry struct cpu_softc {
     51  1.6  kiyohara 	device_t sc_dev;		/* device tree glue */
     52  1.1    cherry 	struct cpu_info *sc_info;	/* pointer to CPU info */
     53  1.1    cherry };
     54  1.1    cherry 
     55  1.6  kiyohara CFATTACH_DECL_NEW(cpu, sizeof(struct cpu_softc),
     56  1.1    cherry     cpu_match, cpu_attach, NULL, NULL);
     57  1.1    cherry 
     58  1.1    cherry 
     59  1.8  kiyohara static int
     60  1.6  kiyohara cpu_match(device_t parent, cfdata_t match, void *aux)
     61  1.1    cherry {
     62  1.8  kiyohara 
     63  1.1    cherry 	return 1;
     64  1.1    cherry }
     65  1.1    cherry 
     66  1.8  kiyohara static void
     67  1.6  kiyohara cpu_attach(device_t parent, device_t self, void *aux)
     68  1.5  kiyohara {
     69  1.8  kiyohara 	struct cpu_softc *sc = device_private(self);
     70  1.8  kiyohara 	ACPI_MADT_LOCAL_SAPIC *sapic = (ACPI_MADT_LOCAL_SAPIC *)aux;
     71  1.8  kiyohara 	struct cpu_info *ci;
     72  1.8  kiyohara 	uint64_t lid;
     73  1.8  kiyohara 	int id, eid;
     74  1.8  kiyohara 
     75  1.8  kiyohara 	aprint_naive("\n");
     76  1.8  kiyohara 	aprint_normal(": ProcessorID %d, Id %d, Eid %d%s\n",
     77  1.8  kiyohara 	    sapic->ProcessorId, sapic->Id, sapic->Eid,
     78  1.8  kiyohara 	    sapic->LapicFlags & ACPI_MADT_ENABLED ? "" : " (disabled)");
     79  1.8  kiyohara 
     80  1.8  kiyohara 	/* Get current CPU Id */
     81  1.8  kiyohara 	lid = ia64_get_lid();
     82  1.8  kiyohara 	id = (lid & 0x00000000ff000000) >> 24;
     83  1.8  kiyohara 	eid = (lid & 0x0000000000ff0000) >> 16;
     84  1.8  kiyohara 
     85  1.8  kiyohara 	sc->sc_dev = self;
     86  1.8  kiyohara 	if (id == sapic->Id && eid == sapic->Eid)
     87  1.8  kiyohara 		ci = curcpu();
     88  1.8  kiyohara 	else {
     89  1.8  kiyohara 		ci = (struct cpu_info *)kmem_zalloc(sizeof(*ci), KM_NOSLEEP);
     90  1.8  kiyohara 		if (ci == NULL) {
     91  1.8  kiyohara 			aprint_error_dev(self, "memory alloc failed\n");
     92  1.8  kiyohara 			return;
     93  1.8  kiyohara 		}
     94  1.8  kiyohara 	}
     95  1.8  kiyohara 	sc->sc_info = ci;
     96  1.1    cherry 
     97  1.8  kiyohara 	ci->ci_cpuid = sapic->ProcessorId;
     98  1.8  kiyohara 	ci->ci_intrdepth = -1;			/* need ? */
     99  1.5  kiyohara 	ci->ci_dev = self;
    100  1.8  kiyohara 
    101  1.5  kiyohara 	return;
    102  1.5  kiyohara }
    103