cd354f1ae7
After Al Viro (finally) succeeded in removing the sched.h #include in module.h recently, it makes sense again to remove other superfluous sched.h includes. There are quite a lot of files which include it but don't actually need anything defined in there. Presumably these includes were once needed for macros that used to live in sched.h, but moved to other header files in the course of cleaning it up. To ease the pain, this time I did not fiddle with any header files and only removed #includes from .c-files, which tend to cause less trouble. Compile tested against 2.6.20-rc2 and 2.6.20-rc2-mm2 (with offsets) on alpha, arm, i386, ia64, mips, powerpc, and x86_64 with allnoconfig, defconfig, allmodconfig, and allyesconfig as well as a few randconfigs on x86_64 and all configs in arch/arm/configs on arm. I also checked that no new warnings were introduced by the patch (actually, some warnings are removed that were emitted by unnecessarily included header files). Signed-off-by: Tim Schmielau <tim@physik3.uni-rostock.de> Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
256 lines
7.2 KiB
C
256 lines
7.2 KiB
C
/*
|
|
* acpi_tables.c - ACPI Boot-Time Table Parsing
|
|
*
|
|
* Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
|
|
*
|
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
*
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/smp.h>
|
|
#include <linux/string.h>
|
|
#include <linux/types.h>
|
|
#include <linux/irq.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/acpi.h>
|
|
#include <linux/bootmem.h>
|
|
|
|
#define PREFIX "ACPI: "
|
|
|
|
#define ACPI_MAX_TABLES 128
|
|
|
|
static char *mps_inti_flags_polarity[] = { "dfl", "high", "res", "low" };
|
|
static char *mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" };
|
|
|
|
static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata;
|
|
|
|
void acpi_table_print_madt_entry(struct acpi_subtable_header * header)
|
|
{
|
|
if (!header)
|
|
return;
|
|
|
|
switch (header->type) {
|
|
|
|
case ACPI_MADT_TYPE_LOCAL_APIC:
|
|
{
|
|
struct acpi_madt_local_apic *p =
|
|
(struct acpi_madt_local_apic *)header;
|
|
printk(KERN_INFO PREFIX
|
|
"LAPIC (acpi_id[0x%02x] lapic_id[0x%02x] %s)\n",
|
|
p->processor_id, p->id,
|
|
(p->lapic_flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled");
|
|
}
|
|
break;
|
|
|
|
case ACPI_MADT_TYPE_IO_APIC:
|
|
{
|
|
struct acpi_madt_io_apic *p =
|
|
(struct acpi_madt_io_apic *)header;
|
|
printk(KERN_INFO PREFIX
|
|
"IOAPIC (id[0x%02x] address[0x%08x] gsi_base[%d])\n",
|
|
p->id, p->address, p->global_irq_base);
|
|
}
|
|
break;
|
|
|
|
case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
|
|
{
|
|
struct acpi_madt_interrupt_override *p =
|
|
(struct acpi_madt_interrupt_override *)header;
|
|
printk(KERN_INFO PREFIX
|
|
"INT_SRC_OVR (bus %d bus_irq %d global_irq %d %s %s)\n",
|
|
p->bus, p->source_irq, p->global_irq,
|
|
mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK],
|
|
mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2]);
|
|
if (p->inti_flags &
|
|
~(ACPI_MADT_POLARITY_MASK | ACPI_MADT_TRIGGER_MASK))
|
|
printk(KERN_INFO PREFIX
|
|
"INT_SRC_OVR unexpected reserved flags: 0x%x\n",
|
|
p->inti_flags &
|
|
~(ACPI_MADT_POLARITY_MASK | ACPI_MADT_TRIGGER_MASK));
|
|
|
|
}
|
|
break;
|
|
|
|
case ACPI_MADT_TYPE_NMI_SOURCE:
|
|
{
|
|
struct acpi_madt_nmi_source *p =
|
|
(struct acpi_madt_nmi_source *)header;
|
|
printk(KERN_INFO PREFIX
|
|
"NMI_SRC (%s %s global_irq %d)\n",
|
|
mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK],
|
|
mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2],
|
|
p->global_irq);
|
|
}
|
|
break;
|
|
|
|
case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
|
|
{
|
|
struct acpi_madt_local_apic_nmi *p =
|
|
(struct acpi_madt_local_apic_nmi *)header;
|
|
printk(KERN_INFO PREFIX
|
|
"LAPIC_NMI (acpi_id[0x%02x] %s %s lint[0x%x])\n",
|
|
p->processor_id,
|
|
mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK ],
|
|
mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2],
|
|
p->lint);
|
|
}
|
|
break;
|
|
|
|
case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
|
|
{
|
|
struct acpi_madt_local_apic_override *p =
|
|
(struct acpi_madt_local_apic_override *)header;
|
|
printk(KERN_INFO PREFIX
|
|
"LAPIC_ADDR_OVR (address[%p])\n",
|
|
(void *)(unsigned long)p->address);
|
|
}
|
|
break;
|
|
|
|
case ACPI_MADT_TYPE_IO_SAPIC:
|
|
{
|
|
struct acpi_madt_io_sapic *p =
|
|
(struct acpi_madt_io_sapic *)header;
|
|
printk(KERN_INFO PREFIX
|
|
"IOSAPIC (id[0x%x] address[%p] gsi_base[%d])\n",
|
|
p->id, (void *)(unsigned long)p->address,
|
|
p->global_irq_base);
|
|
}
|
|
break;
|
|
|
|
case ACPI_MADT_TYPE_LOCAL_SAPIC:
|
|
{
|
|
struct acpi_madt_local_sapic *p =
|
|
(struct acpi_madt_local_sapic *)header;
|
|
printk(KERN_INFO PREFIX
|
|
"LSAPIC (acpi_id[0x%02x] lsapic_id[0x%02x] lsapic_eid[0x%02x] %s)\n",
|
|
p->processor_id, p->id, p->eid,
|
|
(p->lapic_flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled");
|
|
}
|
|
break;
|
|
|
|
case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
|
|
{
|
|
struct acpi_madt_interrupt_source *p =
|
|
(struct acpi_madt_interrupt_source *)header;
|
|
printk(KERN_INFO PREFIX
|
|
"PLAT_INT_SRC (%s %s type[0x%x] id[0x%04x] eid[0x%x] iosapic_vector[0x%x] global_irq[0x%x]\n",
|
|
mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK],
|
|
mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2],
|
|
p->type, p->id, p->eid, p->io_sapic_vector,
|
|
p->global_irq);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
printk(KERN_WARNING PREFIX
|
|
"Found unsupported MADT entry (type = 0x%x)\n",
|
|
header->type);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
int __init
|
|
acpi_table_parse_madt_family(char *id,
|
|
unsigned long madt_size,
|
|
int entry_id,
|
|
acpi_madt_entry_handler handler,
|
|
unsigned int max_entries)
|
|
{
|
|
struct acpi_table_header *madt = NULL;
|
|
struct acpi_subtable_header *entry;
|
|
unsigned int count = 0;
|
|
unsigned long madt_end;
|
|
|
|
if (!handler)
|
|
return -EINVAL;
|
|
|
|
/* Locate the MADT (if exists). There should only be one. */
|
|
acpi_get_table(id, 0, &madt);
|
|
|
|
if (!madt) {
|
|
printk(KERN_WARNING PREFIX "%4.4s not present\n", id);
|
|
return -ENODEV;
|
|
}
|
|
|
|
madt_end = (unsigned long)madt + madt->length;
|
|
|
|
/* Parse all entries looking for a match. */
|
|
|
|
entry = (struct acpi_subtable_header *)
|
|
((unsigned long)madt + madt_size);
|
|
|
|
while (((unsigned long)entry) + sizeof(struct acpi_subtable_header) <
|
|
madt_end) {
|
|
if (entry->type == entry_id
|
|
&& (!max_entries || count++ < max_entries))
|
|
if (handler(entry, madt_end))
|
|
return -EINVAL;
|
|
|
|
entry = (struct acpi_subtable_header *)
|
|
((unsigned long)entry + entry->length);
|
|
}
|
|
if (max_entries && count > max_entries) {
|
|
printk(KERN_WARNING PREFIX "[%4.4s:0x%02x] ignored %i entries of "
|
|
"%i found\n", id, entry_id, count - max_entries, count);
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
int __init
|
|
acpi_table_parse_madt(enum acpi_madt_type id,
|
|
acpi_madt_entry_handler handler, unsigned int max_entries)
|
|
{
|
|
return acpi_table_parse_madt_family(ACPI_SIG_MADT,
|
|
sizeof(struct acpi_table_madt), id,
|
|
handler, max_entries);
|
|
}
|
|
|
|
int __init acpi_table_parse(char *id, acpi_table_handler handler)
|
|
{
|
|
struct acpi_table_header *table = NULL;
|
|
if (!handler)
|
|
return -EINVAL;
|
|
|
|
acpi_get_table(id, 0, &table);
|
|
if (table) {
|
|
handler(table);
|
|
return 1;
|
|
} else
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* acpi_table_init()
|
|
*
|
|
* find RSDP, find and checksum SDT/XSDT.
|
|
* checksum all tables, print SDT/XSDT
|
|
*
|
|
* result: sdt_entry[] is initialized
|
|
*/
|
|
|
|
|
|
int __init acpi_table_init(void)
|
|
{
|
|
acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
|
|
return 0;
|
|
}
|