Module Name: src Committed By: cegger Date: Wed Nov 25 13:21:49 UTC 2009
Modified Files: src/sys/dev/acpi: files.acpi Added Files: src/sys/dev/acpi: acpi_slit.c acpi_slit.h Log Message: Add ACPI SLIT parser. This is part of NUMA support. Tested on a 8-node machine. Patch presented on tech-kern@, port-i386@ and port-am...@. No comments. To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/sys/dev/acpi/acpi_slit.c \ src/sys/dev/acpi/acpi_slit.h cvs rdiff -u -r1.61 -r1.62 src/sys/dev/acpi/files.acpi Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/acpi/files.acpi diff -u src/sys/dev/acpi/files.acpi:1.61 src/sys/dev/acpi/files.acpi:1.62 --- src/sys/dev/acpi/files.acpi:1.61 Wed Nov 25 13:17:06 2009 +++ src/sys/dev/acpi/files.acpi Wed Nov 25 13:21:49 2009 @@ -1,4 +1,4 @@ -# $NetBSD: files.acpi,v 1.61 2009/11/25 13:17:06 cegger Exp $ +# $NetBSD: files.acpi,v 1.62 2009/11/25 13:21:49 cegger Exp $ include "dev/acpi/acpica/files.acpica" @@ -21,6 +21,7 @@ file dev/acpi/acpi_timer.c acpi file dev/acpi/acpi_wakedev.c acpi file dev/acpi/acpi_srat.c acpi +file dev/acpi/acpi_slit.c acpi # ACPI/apm emulation. attach apm at acpiapmbus with acpiapm: sysmon_envsys Added files: Index: src/sys/dev/acpi/acpi_slit.c diff -u /dev/null src/sys/dev/acpi/acpi_slit.c:1.1 --- /dev/null Wed Nov 25 13:21:49 2009 +++ src/sys/dev/acpi/acpi_slit.c Wed Nov 25 13:21:49 2009 @@ -0,0 +1,103 @@ +/* $NetBSD $ */ + +/* + * Copyright (c) 2009 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christoph Egger. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD $"); + +#include <sys/param.h> +#include <sys/systm.h> + +#include <dev/acpi/acpica.h> +#include <dev/acpi/acpi_slit.h> + +static ACPI_TABLE_SLIT *slit; + +bool +acpislit_exist(void) +{ + ACPI_TABLE_HEADER *table; + ACPI_STATUS rv; + + rv = AcpiGetTable(ACPI_SIG_SLIT, 1, (ACPI_TABLE_HEADER **)&table); + if (ACPI_FAILURE(rv)) + return false; + + /* Check if header is valid */ + if (table == NULL) + return false; + + if (table->Length == 0xffffffff) + return false; + + slit = (ACPI_TABLE_SLIT *)table; + + return true; +} + +int +acpislit_init(void) +{ + if (!acpislit_exist()) + return EEXIST; + return 0; +} + +void +acpislit_dump(void) +{ + uint64_t idx, count; + + count = acpislit_cpus(); + + aprint_debug("SLIT: matrix with %"PRIu64" nodes\n", count); + aprint_debug("SLIT: "); + for (idx = 0; idx < (count * count); idx++) { + aprint_debug("%u ", slit->Entry[idx]); + if ((idx % count) == (count - 1)) { + aprint_debug("\n"); + if (idx < (count * count) - 1) + aprint_debug("SLIT: "); + } + } +} + +uint32_t +acpislit_cpus(void) +{ + return slit->LocalityCount; +} + +uint32_t +acpislit_distance(uint32_t cpu1, uint32_t cpu2) +{ + uint64_t idx = cpu1 * slit->LocalityCount + cpu2; + return slit->Entry[idx]; +} Index: src/sys/dev/acpi/acpi_slit.h diff -u /dev/null src/sys/dev/acpi/acpi_slit.h:1.1 --- /dev/null Wed Nov 25 13:21:49 2009 +++ src/sys/dev/acpi/acpi_slit.h Wed Nov 25 13:21:49 2009 @@ -0,0 +1,54 @@ +/* $NetBSD $ */ + +/* + * Copyright (c) 2009 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christoph Egger. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ACPI_SLIT_H +#define ACPI_SLIT_H + +/* Returns true if ACPI SLIT table is available + * If table does not exist, all functions below + * have undefined behaviour. + */ +bool acpislit_exist(void); + +/* Initializes parser. Must be the first function + * being called when table is available. + */ +int acpislit_init(void); + +void acpislit_dump(void); + +/* Retrieve number of cpus */ +uint32_t acpislit_cpus(void); + +/* Get distance between cpu1 and cpu2 */ +uint32_t acpislit_distance(uint32_t, uint32_t); + +#endif /* ACPI_SLIT_H */