Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
47637d5d
Commit
47637d5d
authored
Aug 12, 2003
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
ACPI: merge andy-2.6 into lenb-2.6
parents
140f0045
cf899a69
Changes
22
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
476 additions
and
938 deletions
+476
-938
Documentation/kbuild/kconfig-language.txt
Documentation/kbuild/kconfig-language.txt
+2
-2
Documentation/kernel-parameters.txt
Documentation/kernel-parameters.txt
+4
-9
arch/i386/Kconfig
arch/i386/Kconfig
+6
-1
arch/i386/kernel/Makefile
arch/i386/kernel/Makefile
+1
-1
arch/i386/kernel/acpi/Makefile
arch/i386/kernel/acpi/Makefile
+0
-1
arch/i386/kernel/acpi/acpitable.c
arch/i386/kernel/acpi/acpitable.c
+0
-553
arch/i386/kernel/acpi/acpitable.h
arch/i386/kernel/acpi/acpitable.h
+0
-260
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/acpi/boot.c
+43
-10
arch/i386/kernel/cpu/intel.c
arch/i386/kernel/cpu/intel.c
+1
-11
arch/i386/kernel/dmi_scan.c
arch/i386/kernel/dmi_scan.c
+265
-3
arch/i386/kernel/mpparse.c
arch/i386/kernel/mpparse.c
+4
-6
arch/i386/kernel/setup.c
arch/i386/kernel/setup.c
+29
-10
arch/i386/kernel/smpboot.c
arch/i386/kernel/smpboot.c
+1
-1
arch/i386/pci/acpi.c
arch/i386/pci/acpi.c
+10
-0
drivers/Makefile
drivers/Makefile
+1
-1
drivers/acpi/Kconfig
drivers/acpi/Kconfig
+70
-38
drivers/acpi/Makefile
drivers/acpi/Makefile
+3
-2
drivers/acpi/bus.c
drivers/acpi/bus.c
+1
-1
drivers/acpi/tables.c
drivers/acpi/tables.c
+13
-8
include/asm-i386/acpi.h
include/asm-i386/acpi.h
+9
-17
include/linux/acpi.h
include/linux/acpi.h
+3
-3
init/do_mounts.c
init/do_mounts.c
+10
-0
No files found.
Documentation/kbuild/kconfig-language.txt
View file @
47637d5d
...
@@ -124,8 +124,8 @@ module state. Dependency expressions have the following syntax:
...
@@ -124,8 +124,8 @@ module state. Dependency expressions have the following syntax:
<symbol> '!=' <symbol> (3)
<symbol> '!=' <symbol> (3)
'(' <expr> ')' (4)
'(' <expr> ')' (4)
'!' <expr> (5)
'!' <expr> (5)
<expr> '
||
' <expr> (6)
<expr> '
&&
' <expr> (6)
<expr> '
&&
' <expr> (7)
<expr> '
||
' <expr> (7)
Expressions are listed in decreasing order of precedence.
Expressions are listed in decreasing order of precedence.
...
...
Documentation/kernel-parameters.txt
View file @
47637d5d
...
@@ -85,13 +85,10 @@ running once the system is up.
...
@@ -85,13 +85,10 @@ running once the system is up.
See also Documentation/scsi/ncr53c7xx.txt.
See also Documentation/scsi/ncr53c7xx.txt.
acpi= [HW,ACPI] Advanced Configuration and Power Interface
acpi= [HW,ACPI] Advanced Configuration and Power Interface
Format: off
Format: { force | off | ht }
off -- disables both ACPI table parsing and interpreter init
force -- enables ACPI for systems with default off
See also Documentation/pm.txt.
off -- disabled ACPI for systems with default on
ht -- run only enough ACPI to enable Hyper Threading
acpismp= [IA-32] Early setup parse and use ACPI SMP table.
Format: force
force -- force use of ACPI table parsing and interpreter init
See also Documentation/pm.txt.
See also Documentation/pm.txt.
ad1816= [HW,OSS]
ad1816= [HW,OSS]
...
@@ -619,8 +616,6 @@ running once the system is up.
...
@@ -619,8 +616,6 @@ running once the system is up.
instruction doesn't work correctly and not to
instruction doesn't work correctly and not to
use it.
use it.
noht [SMP,IA-32] Disables P4 Xeon(tm) HyperThreading.
noirqdebug [IA-32] Disables the code which attempts to detect and
noirqdebug [IA-32] Disables the code which attempts to detect and
disable unhandled interrupt sources.
disable unhandled interrupt sources.
...
...
arch/i386/Kconfig
View file @
47637d5d
...
@@ -846,8 +846,11 @@ config SOFTWARE_SUSPEND
...
@@ -846,8 +846,11 @@ config SOFTWARE_SUSPEND
source "drivers/acpi/Kconfig"
source "drivers/acpi/Kconfig"
menu "APM (Advanced Power Management) BIOS Support"
depends on PM
config APM
config APM
tristate "A
dvanced Power Management
BIOS support"
tristate "A
PM (Advanced Power Management)
BIOS support"
depends on PM
depends on PM
---help---
---help---
APM is a BIOS specification for saving power using several different
APM is a BIOS specification for saving power using several different
...
@@ -991,6 +994,8 @@ config APM_REAL_MODE_POWER_OFF
...
@@ -991,6 +994,8 @@ config APM_REAL_MODE_POWER_OFF
a work-around for a number of buggy BIOSes. Switch this option on if
a work-around for a number of buggy BIOSes. Switch this option on if
your computer crashes instead of powering off properly.
your computer crashes instead of powering off properly.
endmenu
source "arch/i386/kernel/cpu/cpufreq/Kconfig"
source "arch/i386/kernel/cpu/cpufreq/Kconfig"
endmenu
endmenu
...
...
arch/i386/kernel/Makefile
View file @
47637d5d
...
@@ -11,7 +11,7 @@ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \
...
@@ -11,7 +11,7 @@ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \
obj-y
+=
cpu/
obj-y
+=
cpu/
obj-y
+=
timers/
obj-y
+=
timers/
obj-$(CONFIG_ACPI)
+=
acpi/
obj-$(CONFIG_ACPI
_BOOT
)
+=
acpi/
obj-$(CONFIG_X86_BIOS_REBOOT)
+=
reboot.o
obj-$(CONFIG_X86_BIOS_REBOOT)
+=
reboot.o
obj-$(CONFIG_MCA)
+=
mca.o
obj-$(CONFIG_MCA)
+=
mca.o
obj-$(CONFIG_X86_MSR)
+=
msr.o
obj-$(CONFIG_X86_MSR)
+=
msr.o
...
...
arch/i386/kernel/acpi/Makefile
View file @
47637d5d
obj-$(CONFIG_ACPI_HT_ONLY)
:=
acpitable.o
obj-$(CONFIG_ACPI_BOOT)
:=
boot.o
obj-$(CONFIG_ACPI_BOOT)
:=
boot.o
obj-$(CONFIG_ACPI_SLEEP)
+=
sleep.o wakeup.o
obj-$(CONFIG_ACPI_SLEEP)
+=
sleep.o wakeup.o
arch/i386/kernel/acpi/acpitable.c
deleted
100644 → 0
View file @
140f0045
/*
* acpitable.c - IA32-specific ACPI boot-time initialization (Revision: 1)
*
* Copyright (C) 1999 Andrew Henroid
* Copyright (C) 2001 Richard Schaal
* Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
* Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com>
* Copyright (C) 2001 Arjan van de Ven <arjanv@redhat.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
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* $Id: acpitable.c,v 1.7 2001/11/04 12:21:18 fenrus Exp $
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/stddef.h>
#include <linux/slab.h>
#include <linux/pci.h>
#include <asm/mpspec.h>
#include <asm/io.h>
#include <asm/apic.h>
#include <asm/apicdef.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include "acpitable.h"
static
acpi_table_handler
acpi_boot_ops
[
ACPI_TABLE_COUNT
];
int
acpi_lapic
;
static
unsigned
char
__init
acpi_checksum
(
void
*
buffer
,
int
length
)
{
int
i
;
unsigned
char
*
bytebuffer
;
unsigned
char
sum
=
0
;
if
(
!
buffer
||
length
<=
0
)
return
0
;
bytebuffer
=
(
unsigned
char
*
)
buffer
;
for
(
i
=
0
;
i
<
length
;
i
++
)
sum
+=
*
(
bytebuffer
++
);
return
sum
;
}
static
void
__init
acpi_print_table_header
(
acpi_table_header
*
header
)
{
if
(
!
header
)
return
;
printk
(
KERN_INFO
"ACPI table found: %.4s v%d [%.6s %.8s %d.%d]
\n
"
,
header
->
signature
,
header
->
revision
,
header
->
oem_id
,
header
->
oem_table_id
,
header
->
oem_revision
>>
16
,
header
->
oem_revision
&
0xffff
);
return
;
}
/*******************************************************************************
*
* FUNCTION: acpi_tb_scan_memory_for_rsdp
*
* PARAMETERS: address - Starting pointer for search
* length - Maximum length to search
*
* RETURN: Pointer to the RSDP if found and valid, otherwise NULL.
*
* DESCRIPTION: Search a block of memory for the RSDP signature
*
******************************************************************************/
static
void
*
__init
acpi_tb_scan_memory_for_rsdp
(
void
*
address
,
int
length
)
{
u32
offset
;
if
(
length
<=
0
)
return
NULL
;
/* Search from given start addr for the requested length */
offset
=
0
;
while
(
offset
<
length
)
{
/* The signature must match and the checksum must be correct */
if
(
strncmp
(
address
,
RSDP_SIG
,
sizeof
(
RSDP_SIG
)
-
1
)
==
0
&&
acpi_checksum
(
address
,
RSDP_CHECKSUM_LENGTH
)
==
0
)
{
/* If so, we have found the RSDP */
printk
(
KERN_INFO
"ACPI: RSDP located at physical address %p
\n
"
,
address
);
return
address
;
}
offset
+=
RSDP_SCAN_STEP
;
address
+=
RSDP_SCAN_STEP
;
}
/* Searched entire block, no RSDP was found */
printk
(
KERN_INFO
"ACPI: Searched entire block, no RSDP was found.
\n
"
);
return
NULL
;
}
/*******************************************************************************
*
* FUNCTION: acpi_find_root_pointer
*
* PARAMETERS: none
*
* RETURN: physical address of the RSDP
*
* DESCRIPTION: Search lower 1_mbyte of memory for the root system descriptor
* pointer structure. If it is found, set *RSDP to point to it.
*
* NOTE: The RSDP must be either in the first 1_k of the Extended
* BIOS Data Area or between E0000 and FFFFF (ACPI 1.0 section
* 5.2.2; assertion #421).
*
******************************************************************************/
static
struct
acpi_table_rsdp
*
__init
acpi_find_root_pointer
(
void
)
{
struct
acpi_table_rsdp
*
rsdp
;
/*
* Physical address is given
*/
/*
* Region 1) Search EBDA (low memory) paragraphs
*/
rsdp
=
acpi_tb_scan_memory_for_rsdp
(
__va
(
LO_RSDP_WINDOW_BASE
),
LO_RSDP_WINDOW_SIZE
);
if
(
rsdp
)
return
rsdp
;
/*
* Region 2) Search upper memory: 16-byte boundaries in E0000h-F0000h
*/
rsdp
=
acpi_tb_scan_memory_for_rsdp
(
__va
(
HI_RSDP_WINDOW_BASE
),
HI_RSDP_WINDOW_SIZE
);
if
(
rsdp
)
return
rsdp
;
printk
(
KERN_ERR
"ACPI: System description tables not found
\n
"
);
return
NULL
;
}
/*
* Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END,
* to map the target physical address. The problem is that set_fixmap()
* provides a single page, and it is possible that the page is not
* sufficient.
* By using this area, we can map up to MAX_IO_APICS pages temporarily,
* i.e. until the next __va_range() call.
*
* Important Safety Note: The fixed I/O APIC page numbers are *subtracted*
* from the fixed base. That's why we start at FIX_IO_APIC_BASE_END and
* count idx down while incrementing the phys address.
*/
static
__init
char
*
__va_range
(
unsigned
long
phys
,
unsigned
long
size
)
{
unsigned
long
base
,
offset
,
mapped_size
;
int
idx
;
offset
=
phys
&
(
PAGE_SIZE
-
1
);
mapped_size
=
PAGE_SIZE
-
offset
;
set_fixmap
(
FIX_IO_APIC_BASE_END
,
phys
);
base
=
fix_to_virt
(
FIX_IO_APIC_BASE_END
);
dprintk
(
"__va_range(0x%lx, 0x%lx): idx=%d mapped at %lx
\n
"
,
phys
,
size
,
FIX_IO_APIC_BASE_END
,
base
);
/*
* Most cases can be covered by the below.
*/
idx
=
FIX_IO_APIC_BASE_END
;
while
(
mapped_size
<
size
)
{
if
(
--
idx
<
FIX_IO_APIC_BASE_0
)
return
0
;
/* cannot handle this */
phys
+=
PAGE_SIZE
;
set_fixmap
(
idx
,
phys
);
mapped_size
+=
PAGE_SIZE
;
}
return
((
unsigned
char
*
)
base
+
offset
);
}
static
int
__init
acpi_tables_init
(
void
)
{
int
result
=
-
ENODEV
;
acpi_table_header
*
header
=
NULL
;
struct
acpi_table_rsdp
*
rsdp
=
NULL
;
struct
acpi_table_rsdt
*
rsdt
=
NULL
;
struct
acpi_table_rsdt
saved_rsdt
;
int
tables
=
0
;
int
type
=
0
;
int
i
=
0
;
rsdp
=
(
struct
acpi_table_rsdp
*
)
acpi_find_root_pointer
();
if
(
!
rsdp
)
return
-
ENODEV
;
printk
(
KERN_INFO
"%.8s v%d [%.6s]
\n
"
,
rsdp
->
signature
,
rsdp
->
revision
,
rsdp
->
oem_id
);
if
(
strncmp
(
rsdp
->
signature
,
RSDP_SIG
,
strlen
(
RSDP_SIG
)))
{
printk
(
KERN_WARNING
"RSDP table signature incorrect
\n
"
);
return
-
EINVAL
;
}
rsdt
=
(
struct
acpi_table_rsdt
*
)
__va_range
(
rsdp
->
rsdt_address
,
sizeof
(
struct
acpi_table_rsdt
));
if
(
!
rsdt
)
{
printk
(
KERN_WARNING
"ACPI: Invalid root system description tables (RSDT)
\n
"
);
return
-
ENODEV
;
}
header
=
&
rsdt
->
header
;
acpi_print_table_header
(
header
);
if
(
strncmp
(
header
->
signature
,
RSDT_SIG
,
strlen
(
RSDT_SIG
)))
{
printk
(
KERN_WARNING
"ACPI: RSDT signature incorrect
\n
"
);
return
-
ENODEV
;
}
/*
* The number of tables is computed by taking the
* size of all entries (header size minus total
* size of RSDT) divided by the size of each entry
* (4-byte table pointers).
*/
tables
=
(
header
->
length
-
sizeof
(
acpi_table_header
))
/
4
;
memcpy
(
&
saved_rsdt
,
rsdt
,
sizeof
(
saved_rsdt
));
if
(
saved_rsdt
.
header
.
length
>
sizeof
(
saved_rsdt
))
{
printk
(
KERN_WARNING
"ACPI: Too big length in RSDT: %d
\n
"
,
saved_rsdt
.
header
.
length
);
return
-
ENODEV
;
}
for
(
i
=
0
;
i
<
tables
;
i
++
)
{
/* Map in header, then map in full table length. */
header
=
(
acpi_table_header
*
)
__va_range
(
saved_rsdt
.
entry
[
i
],
sizeof
(
acpi_table_header
));
if
(
!
header
)
break
;
header
=
(
acpi_table_header
*
)
__va_range
(
saved_rsdt
.
entry
[
i
],
header
->
length
);
if
(
!
header
)
break
;
acpi_print_table_header
(
header
);
if
(
acpi_checksum
(
header
,
header
->
length
))
{
printk
(
KERN_WARNING
"ACPI %s has invalid checksum
\n
"
,
acpi_table_signatures
[
i
]);
continue
;
}
for
(
type
=
0
;
type
<
ACPI_TABLE_COUNT
;
type
++
)
if
(
!
strncmp
((
char
*
)
&
header
->
signature
,
acpi_table_signatures
[
type
],
strlen
(
acpi_table_signatures
[
type
])))
break
;
if
(
type
>=
ACPI_TABLE_COUNT
)
{
printk
(
KERN_WARNING
"ACPI: Unsupported table %.4s
\n
"
,
header
->
signature
);
continue
;
}
if
(
!
acpi_boot_ops
[
type
])
continue
;
result
=
acpi_boot_ops
[
type
]
(
header
,
(
unsigned
long
)
saved_rsdt
.
entry
[
i
]);
}
return
result
;
}
static
int
total_cpus
__initdata
=
0
;
int
have_acpi_tables
;
extern
void
__init
MP_processor_info
(
struct
mpc_config_processor
*
);
static
void
__init
acpi_parse_lapic
(
struct
acpi_table_lapic
*
local_apic
)
{
struct
mpc_config_processor
proc_entry
;
int
ix
=
0
;
if
(
!
local_apic
)
return
;
printk
(
KERN_INFO
"LAPIC (acpi_id[0x%04x] id[0x%x] enabled[%d])
\n
"
,
local_apic
->
acpi_id
,
local_apic
->
id
,
local_apic
->
flags
.
enabled
);
printk
(
KERN_INFO
"CPU %d (0x%02x00)"
,
total_cpus
,
local_apic
->
id
);
if
(
local_apic
->
flags
.
enabled
)
{
printk
(
" enabled"
);
ix
=
local_apic
->
id
;
if
(
ix
>=
MAX_APICS
)
{
printk
(
KERN_WARNING
"Processor #%d INVALID - (Max ID: %d).
\n
"
,
ix
,
MAX_APICS
);
return
;
}
/*
* Fill in the info we want to save. Not concerned about
* the processor ID. Processor features aren't present in
* the table.
*/
proc_entry
.
mpc_type
=
MP_PROCESSOR
;
proc_entry
.
mpc_apicid
=
local_apic
->
id
;
proc_entry
.
mpc_cpuflag
=
CPU_ENABLED
;
if
(
proc_entry
.
mpc_apicid
==
boot_cpu_physical_apicid
)
{
printk
(
" (BSP)"
);
proc_entry
.
mpc_cpuflag
|=
CPU_BOOTPROCESSOR
;
}
proc_entry
.
mpc_cpufeature
=
(
boot_cpu_data
.
x86
<<
8
)
|
(
boot_cpu_data
.
x86_model
<<
4
)
|
boot_cpu_data
.
x86_mask
;
proc_entry
.
mpc_featureflag
=
boot_cpu_data
.
x86_capability
[
0
];
proc_entry
.
mpc_reserved
[
0
]
=
0
;
proc_entry
.
mpc_reserved
[
1
]
=
0
;
proc_entry
.
mpc_apicver
=
0x10
;
/* integrated APIC */
MP_processor_info
(
&
proc_entry
);
}
else
{
printk
(
" disabled"
);
}
printk
(
"
\n
"
);
total_cpus
++
;
return
;
}
static
void
__init
acpi_parse_ioapic
(
struct
acpi_table_ioapic
*
ioapic
)
{
if
(
!
ioapic
)
return
;
printk
(
KERN_INFO
"IOAPIC (id[0x%x] address[0x%x] global_irq_base[0x%x])
\n
"
,
ioapic
->
id
,
ioapic
->
address
,
ioapic
->
global_irq_base
);
if
(
nr_ioapics
>=
MAX_IO_APICS
)
{
printk
(
KERN_WARNING
"Max # of I/O APICs (%d) exceeded (found %d).
\n
"
,
MAX_IO_APICS
,
nr_ioapics
);
/* panic("Recompile kernel with bigger MAX_IO_APICS!\n"); */
}
}
/* Interrupt source overrides inform the machine about exceptions
to the normal "PIC" mode interrupt routing */
static
void
__init
acpi_parse_int_src_ovr
(
struct
acpi_table_int_src_ovr
*
intsrc
)
{
if
(
!
intsrc
)
return
;
printk
(
KERN_INFO
"INT_SRC_OVR (bus[%d] irq[0x%x] global_irq[0x%x] polarity[0x%x] trigger[0x%x])
\n
"
,
intsrc
->
bus
,
intsrc
->
bus_irq
,
intsrc
->
global_irq
,
intsrc
->
flags
.
polarity
,
intsrc
->
flags
.
trigger
);
}
/*
* At this point, we look at the interrupt assignment entries in the MPS
* table.
*/
static
void
__init
acpi_parse_nmi_src
(
struct
acpi_table_nmi_src
*
nmisrc
)
{
if
(
!
nmisrc
)
return
;
printk
(
KERN_INFO
"NMI_SRC (polarity[0x%x] trigger[0x%x] global_irq[0x%x])
\n
"
,
nmisrc
->
flags
.
polarity
,
nmisrc
->
flags
.
trigger
,
nmisrc
->
global_irq
);
}
static
void
__init
acpi_parse_lapic_nmi
(
struct
acpi_table_lapic_nmi
*
localnmi
)
{
if
(
!
localnmi
)
return
;
printk
(
KERN_INFO
"LAPIC_NMI (acpi_id[0x%04x] polarity[0x%x] trigger[0x%x] lint[0x%x])
\n
"
,
localnmi
->
acpi_id
,
localnmi
->
flags
.
polarity
,
localnmi
->
flags
.
trigger
,
localnmi
->
lint
);
}
static
void
__init
acpi_parse_lapic_addr_ovr
(
struct
acpi_table_lapic_addr_ovr
*
lapic_addr_ovr
)
{
if
(
!
lapic_addr_ovr
)
return
;
printk
(
KERN_INFO
"LAPIC_ADDR_OVR (address[0x%lx])
\n
"
,
(
unsigned
long
)
lapic_addr_ovr
->
address
);
}
static
void
__init
acpi_parse_plat_int_src
(
struct
acpi_table_plat_int_src
*
plintsrc
)
{
if
(
!
plintsrc
)
return
;
printk
(
KERN_INFO
"PLAT_INT_SRC (polarity[0x%x] trigger[0x%x] type[0x%x] id[0x%04x] eid[0x%x] iosapic_vector[0x%x] global_irq[0x%x]
\n
"
,
plintsrc
->
flags
.
polarity
,
plintsrc
->
flags
.
trigger
,
plintsrc
->
type
,
plintsrc
->
id
,
plintsrc
->
eid
,
plintsrc
->
iosapic_vector
,
plintsrc
->
global_irq
);
}
static
int
__init
acpi_parse_madt
(
acpi_table_header
*
header
,
unsigned
long
phys
)
{
struct
acpi_table_madt
*
madt
;
acpi_madt_entry_header
*
entry_header
;
int
table_size
;
madt
=
(
struct
acpi_table_madt
*
)
__va_range
(
phys
,
header
->
length
);
if
(
!
madt
)
return
-
EINVAL
;
table_size
=
(
int
)
(
header
->
length
-
sizeof
(
*
madt
));
entry_header
=
(
acpi_madt_entry_header
*
)
((
void
*
)
madt
+
sizeof
(
*
madt
));
while
(
entry_header
&&
(
table_size
>
0
))
{
switch
(
entry_header
->
type
)
{
case
ACPI_MADT_LAPIC
:
acpi_parse_lapic
((
struct
acpi_table_lapic
*
)
entry_header
);
break
;
case
ACPI_MADT_IOAPIC
:
acpi_parse_ioapic
((
struct
acpi_table_ioapic
*
)
entry_header
);
break
;
case
ACPI_MADT_INT_SRC_OVR
:
acpi_parse_int_src_ovr
((
struct
acpi_table_int_src_ovr
*
)
entry_header
);
break
;
case
ACPI_MADT_NMI_SRC
:
acpi_parse_nmi_src
((
struct
acpi_table_nmi_src
*
)
entry_header
);
break
;
case
ACPI_MADT_LAPIC_NMI
:
acpi_parse_lapic_nmi
((
struct
acpi_table_lapic_nmi
*
)
entry_header
);
break
;
case
ACPI_MADT_LAPIC_ADDR_OVR
:
acpi_parse_lapic_addr_ovr
((
struct
acpi_table_lapic_addr_ovr
*
)
entry_header
);
break
;
case
ACPI_MADT_PLAT_INT_SRC
:
acpi_parse_plat_int_src
((
struct
acpi_table_plat_int_src
*
)
entry_header
);
break
;
default:
printk
(
KERN_WARNING
"Unsupported MADT entry type 0x%x
\n
"
,
entry_header
->
type
);
break
;
}
table_size
-=
entry_header
->
length
;
entry_header
=
(
acpi_madt_entry_header
*
)
((
void
*
)
entry_header
+
entry_header
->
length
);
}
if
(
!
total_cpus
)
{
printk
(
"ACPI: No Processors found in the APCI table.
\n
"
);
return
-
EINVAL
;
}
printk
(
KERN_INFO
"%d CPUs total
\n
"
,
total_cpus
);
if
(
madt
->
lapic_address
)
mp_lapic_addr
=
madt
->
lapic_address
;
else
mp_lapic_addr
=
APIC_DEFAULT_PHYS_BASE
;
printk
(
KERN_INFO
"Local APIC address %x
\n
"
,
madt
->
lapic_address
);
return
0
;
}
/*
* Configure the processor info using MADT in the ACPI tables. If we fail to
* configure that, then we use the MPS tables.
*/
void
__init
acpi_boot_init
(
void
)
{
memset
(
&
acpi_boot_ops
,
0
,
sizeof
(
acpi_boot_ops
));
acpi_boot_ops
[
ACPI_APIC
]
=
acpi_parse_madt
;
/*
* Only do this when requested, either because of CPU/Bios type or from the command line
*/
if
(
!
acpi_tables_init
())
acpi_lapic
=
1
;
}
arch/i386/kernel/acpi/acpitable.h
deleted
100644 → 0
View file @
140f0045
/*
* acpitable.c - IA32-specific ACPI boot-time initialization (Revision: 1)
*
* Copyright (C) 1999 Andrew Henroid
* Copyright (C) 2001 Richard Schaal
* Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
* Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com>
* Copyright (C) 2001 Arjan van de Ven <arjanv@redhat.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
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* $Id: acpitable.h,v 1.3 2001/11/03 22:41:34 fenrus Exp $
*/
/*
* The following codes are cut&pasted from drivers/acpi. Part of the code
* there can be not updated or delivered yet.
* To avoid conflicts when CONFIG_ACPI is defined, the following codes are
* modified so that they are self-contained in this file.
* -- jun
*/
#ifndef _HEADER_ACPITABLE_H_
#define _HEADER_ACPITABLE_H_
#define dprintk printk
typedef
unsigned
int
ACPI_TBLPTR
;
typedef
struct
{
/* ACPI common table header */
char
signature
[
4
];
/* identifies type of table */
u32
length
;
/* length of table,
in bytes, * including header */
u8
revision
;
/* specification minor version # */
u8
checksum
;
/* to make sum of entire table == 0 */
char
oem_id
[
6
];
/* OEM identification */
char
oem_table_id
[
8
];
/* OEM table identification */
u32
oem_revision
;
/* OEM revision number */
char
asl_compiler_id
[
4
];
/* ASL compiler vendor ID */
u32
asl_compiler_revision
;
/* ASL compiler revision number */
}
acpi_table_header
__attribute__
((
packed
));;
enum
{
ACPI_APIC
=
0
,
ACPI_BOOT
,
ACPI_DBGP
,
ACPI_DSDT
,
ACPI_ECDT
,
ACPI_ETDT
,
ACPI_FACP
,
ACPI_FACS
,
ACPI_OEMX
,
ACPI_PSDT
,
ACPI_SBST
,
ACPI_SLIT
,
ACPI_SPCR
,
ACPI_SRAT
,
ACPI_SSDT
,
ACPI_SPMI
,
ACPI_XSDT
,
ACPI_TABLE_COUNT
};
static
char
*
acpi_table_signatures
[
ACPI_TABLE_COUNT
]
=
{
"APIC"
,
"BOOT"
,
"DBGP"
,
"DSDT"
,
"ECDT"
,
"ETDT"
,
"FACP"
,
"FACS"
,
"OEM"
,
"PSDT"
,
"SBST"
,
"SLIT"
,
"SPCR"
,
"SRAT"
,
"SSDT"
,
"SPMI"
,
"XSDT"
};
struct
acpi_table_madt
{
acpi_table_header
header
;
u32
lapic_address
;
struct
{
u32
pcat_compat
:
1
;
u32
reserved
:
31
;
}
flags
__attribute__
((
packed
));
}
__attribute__
((
packed
));;
enum
{
ACPI_MADT_LAPIC
=
0
,
ACPI_MADT_IOAPIC
,
ACPI_MADT_INT_SRC_OVR
,
ACPI_MADT_NMI_SRC
,
ACPI_MADT_LAPIC_NMI
,
ACPI_MADT_LAPIC_ADDR_OVR
,
ACPI_MADT_IOSAPIC
,
ACPI_MADT_LSAPIC
,
ACPI_MADT_PLAT_INT_SRC
,
ACPI_MADT_ENTRY_COUNT
};
#define RSDP_SIG "RSD PTR "
#define RSDT_SIG "RSDT"
#define ACPI_DEBUG_PRINT(pl)
#define ACPI_MEMORY_MODE 0x01
#define ACPI_LOGICAL_ADDRESSING 0x00
#define ACPI_PHYSICAL_ADDRESSING 0x01
#define LO_RSDP_WINDOW_BASE 0
/* Physical Address */
#define HI_RSDP_WINDOW_BASE 0xE0000
/* Physical Address */
#define LO_RSDP_WINDOW_SIZE 0x400
#define HI_RSDP_WINDOW_SIZE 0x20000
#define RSDP_SCAN_STEP 16
#define RSDP_CHECKSUM_LENGTH 20
typedef
int
(
*
acpi_table_handler
)
(
acpi_table_header
*
header
,
unsigned
long
);
struct
acpi_table_rsdp
{
char
signature
[
8
];
u8
checksum
;
char
oem_id
[
6
];
u8
revision
;
u32
rsdt_address
;
}
__attribute__
((
packed
));
struct
acpi_table_rsdt
{
acpi_table_header
header
;
u32
entry
[
ACPI_TABLE_COUNT
];
}
__attribute__
((
packed
));
typedef
struct
{
u8
type
;
u8
length
;
}
acpi_madt_entry_header
__attribute__
((
packed
));
typedef
struct
{
u16
polarity
:
2
;
u16
trigger
:
2
;
u16
reserved
:
12
;
}
acpi_madt_int_flags
__attribute__
((
packed
));
struct
acpi_table_lapic
{
acpi_madt_entry_header
header
;
u8
acpi_id
;
u8
id
;
struct
{
u32
enabled
:
1
;
u32
reserved
:
31
;
}
flags
__attribute__
((
packed
));
}
__attribute__
((
packed
));
struct
acpi_table_ioapic
{
acpi_madt_entry_header
header
;
u8
id
;
u8
reserved
;
u32
address
;
u32
global_irq_base
;
}
__attribute__
((
packed
));
struct
acpi_table_int_src_ovr
{
acpi_madt_entry_header
header
;
u8
bus
;
u8
bus_irq
;
u32
global_irq
;
acpi_madt_int_flags
flags
;
}
__attribute__
((
packed
));
struct
acpi_table_nmi_src
{
acpi_madt_entry_header
header
;
acpi_madt_int_flags
flags
;
u32
global_irq
;
}
__attribute__
((
packed
));
struct
acpi_table_lapic_nmi
{
acpi_madt_entry_header
header
;
u8
acpi_id
;
acpi_madt_int_flags
flags
;
u8
lint
;
}
__attribute__
((
packed
));
struct
acpi_table_lapic_addr_ovr
{
acpi_madt_entry_header
header
;
u8
reserved
[
2
];
u64
address
;
}
__attribute__
((
packed
));
struct
acpi_table_iosapic
{
acpi_madt_entry_header
header
;
u8
id
;
u8
reserved
;
u32
global_irq_base
;
u64
address
;
}
__attribute__
((
packed
));
struct
acpi_table_lsapic
{
acpi_madt_entry_header
header
;
u8
acpi_id
;
u8
id
;
u8
eid
;
u8
reserved
[
3
];
struct
{
u32
enabled
:
1
;
u32
reserved
:
31
;
}
flags
;
}
__attribute__
((
packed
));
struct
acpi_table_plat_int_src
{
acpi_madt_entry_header
header
;
acpi_madt_int_flags
flags
;
u8
type
;
u8
id
;
u8
eid
;
u8
iosapic_vector
;
u32
global_irq
;
u32
reserved
;
}
__attribute__
((
packed
));
/*
* ACPI Table Descriptor. One per ACPI table
*/
typedef
struct
acpi_table_desc
{
struct
acpi_table_desc
*
prev
;
struct
acpi_table_desc
*
next
;
struct
acpi_table_desc
*
installed_desc
;
acpi_table_header
*
pointer
;
void
*
base_pointer
;
u8
*
aml_pointer
;
u64
physical_address
;
u32
aml_length
;
u32
length
;
u32
count
;
u16
table_id
;
u8
type
;
u8
allocation
;
u8
loaded_into_namespace
;
}
acpi_table_desc
__attribute__
((
packed
));;
#endif
arch/i386/kernel/acpi/boot.c
View file @
47637d5d
...
@@ -39,6 +39,7 @@
...
@@ -39,6 +39,7 @@
#define PREFIX "ACPI: "
#define PREFIX "ACPI: "
extern
int
acpi_disabled
;
extern
int
acpi_disabled
;
extern
int
acpi_ht
;
/* --------------------------------------------------------------------------
/* --------------------------------------------------------------------------
Boot-time Configuration
Boot-time Configuration
...
@@ -157,7 +158,7 @@ acpi_parse_lapic_addr_ovr (
...
@@ -157,7 +158,7 @@ acpi_parse_lapic_addr_ovr (
return
0
;
return
0
;
}
}
#if
ndef CONFIG_ACPI_HT_ONLY
#if
def CONFIG_ACPI
static
int
__init
static
int
__init
acpi_parse_lapic_nmi
(
acpi_parse_lapic_nmi
(
...
@@ -177,7 +178,7 @@ acpi_parse_lapic_nmi (
...
@@ -177,7 +178,7 @@ acpi_parse_lapic_nmi (
return
0
;
return
0
;
}
}
#endif
/*CONFIG_ACPI
_HT_ONLY
*/
#endif
/*CONFIG_ACPI*/
#endif
/*CONFIG_X86_LOCAL_APIC*/
#endif
/*CONFIG_X86_LOCAL_APIC*/
...
@@ -185,7 +186,7 @@ acpi_parse_lapic_nmi (
...
@@ -185,7 +186,7 @@ acpi_parse_lapic_nmi (
int
acpi_ioapic
;
int
acpi_ioapic
;
#if
ndef CONFIG_ACPI_HT_ONLY
#if
def CONFIG_ACPI
static
int
__init
static
int
__init
acpi_parse_ioapic
(
acpi_parse_ioapic
(
...
@@ -247,7 +248,7 @@ acpi_parse_nmi_src (
...
@@ -247,7 +248,7 @@ acpi_parse_nmi_src (
return
0
;
return
0
;
}
}
#endif
/*
!CONFIG_ACPI_HT_ONLY
*/
#endif
/*
CONFIG_ACPI
*/
#endif
/*CONFIG_X86_IO_APIC*/
#endif
/*CONFIG_X86_IO_APIC*/
...
@@ -289,12 +290,34 @@ acpi_find_rsdp (void)
...
@@ -289,12 +290,34 @@ acpi_find_rsdp (void)
return
rsdp_phys
;
return
rsdp_phys
;
}
}
/*
* acpi_boot_init()
* called from setup_arch(), always.
* 1. maps ACPI tables for later use
* 2. enumerates lapics
* 3. enumerates io-apics
*
* side effects:
* acpi_lapic = 1 if LAPIC found
* acpi_ioapic = 1 if IOAPIC found
* if (acpi_lapic && acpi_ioapic) smp_found_config = 1;
* if acpi_blacklisted() acpi_disabled = 1;
* acpi_irq_model=...
* ...
*
* return value: (currently ignored)
* 0: success
* !0: failure
*/
int
__init
int
__init
acpi_boot_init
(
void
)
acpi_boot_init
(
void
)
{
{
int
result
=
0
;
int
result
=
0
;
if
(
acpi_disabled
&&
!
acpi_ht
)
return
1
;
/*
/*
* The default interrupt routing model is PIC (8259). This gets
* The default interrupt routing model is PIC (8259). This gets
* overriden if IOAPICs are enumerated (below).
* overriden if IOAPICs are enumerated (below).
...
@@ -308,14 +331,14 @@ acpi_boot_init (void)
...
@@ -308,14 +331,14 @@ acpi_boot_init (void)
if
(
result
)
if
(
result
)
return
result
;
return
result
;
#ifdef CONFIG_ACPI
result
=
acpi_blacklisted
();
result
=
acpi_blacklisted
();
if
(
result
)
{
if
(
result
)
{
printk
(
KERN_WARNING
PREFIX
"BIOS listed in blacklist, disabling ACPI support
\n
"
);
printk
(
KERN_WARNING
PREFIX
"BIOS listed in blacklist, disabling ACPI support
\n
"
);
acpi_disabled
=
1
;
acpi_disabled
=
1
;
return
result
;
return
result
;
}
}
else
#endif
printk
(
KERN_NOTICE
PREFIX
"BIOS not listed in blacklist
\n
"
);
#ifdef CONFIG_X86_LOCAL_APIC
#ifdef CONFIG_X86_LOCAL_APIC
...
@@ -366,27 +389,37 @@ acpi_boot_init (void)
...
@@ -366,27 +389,37 @@ acpi_boot_init (void)
return
result
;
return
result
;
}
}
#if
ndef CONFIG_ACPI_HT_ONLY
#if
def CONFIG_ACPI
result
=
acpi_table_parse_madt
(
ACPI_MADT_LAPIC_NMI
,
acpi_parse_lapic_nmi
);
result
=
acpi_table_parse_madt
(
ACPI_MADT_LAPIC_NMI
,
acpi_parse_lapic_nmi
);
if
(
result
<
0
)
{
if
(
result
<
0
)
{
printk
(
KERN_ERR
PREFIX
"Error parsing LAPIC NMI entry
\n
"
);
printk
(
KERN_ERR
PREFIX
"Error parsing LAPIC NMI entry
\n
"
);
/* TBD: Cleanup to allow fallback to MPS */
/* TBD: Cleanup to allow fallback to MPS */
return
result
;
return
result
;
}
}
#endif
/*
!CONFIG_ACPI_HT_ONLY
*/
#endif
/*
CONFIG_ACPI
*/
acpi_lapic
=
1
;
acpi_lapic
=
1
;
#endif
/*CONFIG_X86_LOCAL_APIC*/
#endif
/*CONFIG_X86_LOCAL_APIC*/
#ifdef CONFIG_X86_IO_APIC
#ifdef CONFIG_X86_IO_APIC
#if
ndef CONFIG_ACPI_HT_ONLY
#if
def CONFIG_ACPI
/*
/*
* I/O APIC
* I/O APIC
* --------
* --------
*/
*/
/*
* ACPI interpreter is required to complete interrupt setup,
* so if it is off, don't enumerate the io-apics with ACPI.
* If MPS is present, it will handle them,
* otherwise the system will stay in PIC mode
*/
if
(
acpi_disabled
)
{
return
1
;
}
result
=
acpi_table_parse_madt
(
ACPI_MADT_IOAPIC
,
acpi_parse_ioapic
);
result
=
acpi_table_parse_madt
(
ACPI_MADT_IOAPIC
,
acpi_parse_ioapic
);
if
(
!
result
)
{
if
(
!
result
)
{
printk
(
KERN_ERR
PREFIX
"No IOAPIC entries present
\n
"
);
printk
(
KERN_ERR
PREFIX
"No IOAPIC entries present
\n
"
);
...
@@ -418,7 +451,7 @@ acpi_boot_init (void)
...
@@ -418,7 +451,7 @@ acpi_boot_init (void)
acpi_ioapic
=
1
;
acpi_ioapic
=
1
;
#endif
/*
!CONFIG_ACPI_HT_ONLY
*/
#endif
/*
CONFIG_ACPI
*/
#endif
/*CONFIG_X86_IO_APIC*/
#endif
/*CONFIG_X86_IO_APIC*/
#ifdef CONFIG_X86_LOCAL_APIC
#ifdef CONFIG_X86_LOCAL_APIC
...
...
arch/i386/kernel/cpu/intel.c
View file @
47637d5d
...
@@ -11,7 +11,6 @@
...
@@ -11,7 +11,6 @@
#include "cpu.h"
#include "cpu.h"
static
int
disable_P4_HT
__initdata
=
0
;
extern
int
trap_init_f00f_bug
(
void
);
extern
int
trap_init_f00f_bug
(
void
);
#ifdef CONFIG_X86_INTEL_USERCOPY
#ifdef CONFIG_X86_INTEL_USERCOPY
...
@@ -68,13 +67,6 @@ int __init ppro_with_ram_bug(void)
...
@@ -68,13 +67,6 @@ int __init ppro_with_ram_bug(void)
return
0
;
return
0
;
}
}
static
int
__init
P4_disable_ht
(
char
*
s
)
{
disable_P4_HT
=
1
;
return
1
;
}
__setup
(
"noht"
,
P4_disable_ht
);
#define LVL_1_INST 1
#define LVL_1_INST 1
#define LVL_1_DATA 2
#define LVL_1_DATA 2
#define LVL_2 3
#define LVL_2 3
...
@@ -281,7 +273,7 @@ static void __init init_intel(struct cpuinfo_x86 *c)
...
@@ -281,7 +273,7 @@ static void __init init_intel(struct cpuinfo_x86 *c)
strcpy
(
c
->
x86_model_id
,
p
);
strcpy
(
c
->
x86_model_id
,
p
);
#ifdef CONFIG_X86_HT
#ifdef CONFIG_X86_HT
if
(
cpu_has
(
c
,
X86_FEATURE_HT
)
&&
!
disable_P4_HT
)
{
if
(
cpu_has
(
c
,
X86_FEATURE_HT
))
{
extern
int
phys_proc_id
[
NR_CPUS
];
extern
int
phys_proc_id
[
NR_CPUS
];
u32
eax
,
ebx
,
ecx
,
edx
;
u32
eax
,
ebx
,
ecx
,
edx
;
...
@@ -329,8 +321,6 @@ static void __init init_intel(struct cpuinfo_x86 *c)
...
@@ -329,8 +321,6 @@ static void __init init_intel(struct cpuinfo_x86 *c)
}
}
too_many_siblings:
too_many_siblings:
if
(
disable_P4_HT
)
clear_bit
(
X86_FEATURE_HT
,
c
->
x86_capability
);
#endif
#endif
/* Work around errata */
/* Work around errata */
...
...
arch/i386/kernel/dmi_scan.c
View file @
47637d5d
...
@@ -129,10 +129,10 @@ static int __init dmi_iterate(void (*decode)(struct dmi_header *))
...
@@ -129,10 +129,10 @@ static int __init dmi_iterate(void (*decode)(struct dmi_header *))
* the SMBIOS version, which we don't know at this point.
* the SMBIOS version, which we don't know at this point.
*/
*/
if
(
buf
[
14
]
!=
0
)
if
(
buf
[
14
]
!=
0
)
dmi_printk
(
(
KERN_INFO
"DMI %d.%d present.
\n
"
,
printk
(
KERN_INFO
"DMI %d.%d present.
\n
"
,
buf
[
14
]
>>
4
,
buf
[
14
]
&
0x0F
)
)
;
buf
[
14
]
>>
4
,
buf
[
14
]
&
0x0F
);
else
else
dmi_printk
((
KERN_INFO
"DMI present.
\n
"
)
);
printk
(
KERN_INFO
"DMI present.
\n
"
);
dmi_printk
((
KERN_INFO
"%d structures occupying %d bytes.
\n
"
,
dmi_printk
((
KERN_INFO
"%d structures occupying %d bytes.
\n
"
,
num
,
len
));
num
,
len
));
dmi_printk
((
KERN_INFO
"DMI table at 0x%08X.
\n
"
,
dmi_printk
((
KERN_INFO
"DMI table at 0x%08X.
\n
"
,
...
@@ -162,6 +162,20 @@ enum
...
@@ -162,6 +162,20 @@ enum
static
char
*
dmi_ident
[
DMI_STRING_MAX
];
static
char
*
dmi_ident
[
DMI_STRING_MAX
];
/* print some information suitable for a blacklist entry. */
void
dmi_dump_system
(
void
)
{
printk
(
"DMI: BIOS: %.40s, %.40s, %.40s
\n
"
,
dmi_ident
[
DMI_BIOS_VENDOR
],
dmi_ident
[
DMI_BIOS_VERSION
],
dmi_ident
[
DMI_BIOS_DATE
]);
printk
(
"DMI: System: %.40s, %.40s, %.40s
\n
"
,
dmi_ident
[
DMI_SYS_VENDOR
],
dmi_ident
[
DMI_PRODUCT_NAME
],
dmi_ident
[
DMI_PRODUCT_VERSION
]);
printk
(
"DMI: Board: %.40s, %.40s, %.40s
\n
"
,
dmi_ident
[
DMI_BOARD_VENDOR
],
dmi_ident
[
DMI_BOARD_NAME
],
dmi_ident
[
DMI_BOARD_VERSION
]);
}
/*
/*
* Save a DMI string
* Save a DMI string
*/
*/
...
@@ -341,6 +355,31 @@ static __init int fix_broken_hp_bios_irq9(struct dmi_blacklist *d)
...
@@ -341,6 +355,31 @@ static __init int fix_broken_hp_bios_irq9(struct dmi_blacklist *d)
return
0
;
return
0
;
}
}
/* Some BIOS / motherboard combinations require the APIC to be enabled
* even on UP systems or will exhibit instability. */
static
int
__init
abit_apic_required
(
struct
dmi_blacklist
*
d
)
{
#ifdef CONFIG_X86_LOCAL_APIC
#ifndef CONFIG_SMP
extern
int
enable_apic_up
;
extern
int
dont_enable_local_apic
;
extern
int
skip_ioapic_setup
;
if
(
!
enable_apic_up
)
{
printk
(
KERN_WARNING
" *** %s: APIC forcibly enabled to avoid "
"RANDOM CRASHES.
\n
"
,
d
->
ident
);
printk
(
KERN_WARNING
" *** PLEASE add 'apic' to the kernel "
"commandline AND enable it in the BIOS! ***
\n
"
);
dont_enable_local_apic
=
0
;
enable_apic_up
=
1
;
skip_ioapic_setup
=
0
;
}
#endif
#endif
return
0
;
}
/*
/*
* Check for clue free BIOS implementations who use
* Check for clue free BIOS implementations who use
* the following QA technique
* the following QA technique
...
@@ -415,6 +454,17 @@ static __init int broken_pirq(struct dmi_blacklist *d)
...
@@ -415,6 +454,17 @@ static __init int broken_pirq(struct dmi_blacklist *d)
return
0
;
return
0
;
}
}
/*
* ASUS K7V-RM has broken ACPI table defining sleep modes
*/
static
__init
int
broken_acpi_Sx
(
struct
dmi_blacklist
*
d
)
{
printk
(
KERN_WARNING
"Detected ASUS mainboard with broken ACPI sleep table
\n
"
);
dmi_broken
|=
BROKEN_ACPI_Sx
;
return
0
;
}
/*
/*
* Toshiba keyboard likes to repeat keys when they are not repeated.
* Toshiba keyboard likes to repeat keys when they are not repeated.
*/
*/
...
@@ -489,6 +539,63 @@ static __init int print_if_true(struct dmi_blacklist *d)
...
@@ -489,6 +539,63 @@ static __init int print_if_true(struct dmi_blacklist *d)
return
0
;
return
0
;
}
}
extern
int
acpi_disabled
,
acpi_force
;
extern
int
enable_apic_up
,
skip_ioapic_setup
;
static
__init
__attribute__
((
unused
))
int
acpi_disable
(
struct
dmi_blacklist
*
d
)
{
if
(
!
acpi_force
)
{
printk
(
KERN_NOTICE
"%s detected: acpi off
\n
"
,
d
->
ident
);
acpi_disabled
=
1
;
}
else
{
printk
(
KERN_NOTICE
"Warning: DMI blacklist says broken, but acpi forced
\n
"
);
}
return
0
;
}
#ifdef CONFIG_ACPI_BOOT
extern
int
acpi_ht
;
/*
* Limit ACPI to CPU enumeration for HT
*/
static
__init
__attribute__
((
unused
))
int
force_acpi_ht
(
struct
dmi_blacklist
*
d
)
{
if
(
!
acpi_force
)
{
printk
(
KERN_NOTICE
"%s detected: force use of acpi=ht
\n
"
,
d
->
ident
);
acpi_disabled
=
1
;
acpi_ht
=
1
;
}
else
{
printk
(
KERN_NOTICE
"Warning: acpi=force overrules DMI blacklist: acpi=ht
\n
"
);
}
return
0
;
}
#endif
#ifdef CONFIG_ACPI_PCI
static
__init
int
disable_acpi_pci
(
struct
dmi_blacklist
*
d
)
{
extern
__init
void
pci_disable_acpi
(
void
)
;
printk
(
KERN_NOTICE
"%s detected: force use of pci=noacpi
\n
"
,
d
->
ident
);
pci_disable_acpi
();
return
0
;
}
#endif
#ifndef CONFIG_SMP
static
__init
int
force_apic
(
struct
dmi_blacklist
*
d
)
{
printk
(
KERN_NOTICE
"%s detected: force APIC
\n
"
,
d
->
ident
);
enable_apic_up
=
1
;
skip_ioapic_setup
=
0
;
return
0
;
}
#endif
/*
/*
* Process the DMI blacklists
* Process the DMI blacklists
*/
*/
...
@@ -551,6 +658,11 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
...
@@ -551,6 +658,11 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
MATCH
(
DMI_PRODUCT_NAME
,
"L8400K series Notebook PC"
),
MATCH
(
DMI_PRODUCT_NAME
,
"L8400K series Notebook PC"
),
NO_MATCH
,
NO_MATCH
NO_MATCH
,
NO_MATCH
}
},
}
},
{
apm_is_horked
,
"ABIT KX7-333[R]"
,
{
/* APM blows on shutdown */
MATCH
(
DMI_BOARD_VENDOR
,
"ABIT"
),
MATCH
(
DMI_BOARD_NAME
,
"VT8367-8233A (KX7-333[R])"
),
NO_MATCH
,
NO_MATCH
,
}
},
{
apm_is_horked
,
"Trigem Delhi3"
,
{
/* APM crashes */
{
apm_is_horked
,
"Trigem Delhi3"
,
{
/* APM crashes */
MATCH
(
DMI_SYS_VENDOR
,
"TriGem Computer, Inc"
),
MATCH
(
DMI_SYS_VENDOR
,
"TriGem Computer, Inc"
),
MATCH
(
DMI_PRODUCT_NAME
,
"Delhi3"
),
MATCH
(
DMI_PRODUCT_NAME
,
"Delhi3"
),
...
@@ -699,6 +811,12 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
...
@@ -699,6 +811,12 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
NO_MATCH
,
NO_MATCH
NO_MATCH
,
NO_MATCH
}
},
}
},
{
abit_apic_required
,
"ABIT KX7-333[R]"
,
{
/* Will crash randomly w/o */
MATCH
(
DMI_BOARD_VENDOR
,
"ABIT"
),
MATCH
(
DMI_BOARD_NAME
,
"VT8367-8233A (KX7-333[R])"
),
NO_MATCH
,
NO_MATCH
,
}
},
/* Problem Intel 440GX bioses */
/* Problem Intel 440GX bioses */
{
broken_pirq
,
"SABR1 Bios"
,
{
/* Bad $PIR */
{
broken_pirq
,
"SABR1 Bios"
,
{
/* Bad $PIR */
...
@@ -734,6 +852,12 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
...
@@ -734,6 +852,12 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
NO_MATCH
,
NO_MATCH
,
NO_MATCH
NO_MATCH
,
NO_MATCH
,
NO_MATCH
}
},
}
},
{
broken_acpi_Sx
,
"ASUS K7V-RM"
,
{
/* Bad ACPI Sx table */
MATCH
(
DMI_BIOS_VERSION
,
"ASUS K7V-RM ACPI BIOS Revision 1003A"
),
MATCH
(
DMI_BOARD_NAME
,
"<K7V-RM>"
),
NO_MATCH
,
NO_MATCH
}
},
{
broken_toshiba_keyboard
,
"Toshiba Satellite 4030cdt"
,
{
/* Keyboard generates spurious repeats */
{
broken_toshiba_keyboard
,
"Toshiba Satellite 4030cdt"
,
{
/* Keyboard generates spurious repeats */
MATCH
(
DMI_PRODUCT_NAME
,
"S4030CDT/4.3"
),
MATCH
(
DMI_PRODUCT_NAME
,
"S4030CDT/4.3"
),
NO_MATCH
,
NO_MATCH
,
NO_MATCH
NO_MATCH
,
NO_MATCH
,
NO_MATCH
...
@@ -792,6 +916,122 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
...
@@ -792,6 +916,122 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
NO_MATCH
,
NO_MATCH
,
NO_MATCH
,
NO_MATCH
,
}
},
}
},
/*
* Boxes that need ACPI disabled
*/
{
acpi_disable
,
"IBM Thinkpad"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"IBM"
),
MATCH
(
DMI_BOARD_NAME
,
"2629H1G"
),
NO_MATCH
,
NO_MATCH
}},
#ifdef CONFIG_ACPI_BOOT
/*
* Boxes that need acpi=ht
*/
{
force_acpi_ht
,
"FSC Primergy T850"
,
{
MATCH
(
DMI_SYS_VENDOR
,
"FUJITSU SIEMENS"
),
MATCH
(
DMI_PRODUCT_NAME
,
"PRIMERGY T850"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"DELL GX240"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"Dell Computer Corporation"
),
MATCH
(
DMI_BOARD_NAME
,
"OptiPlex GX240"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"HP VISUALIZE NT Workstation"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"Hewlett-Packard"
),
MATCH
(
DMI_PRODUCT_NAME
,
"HP VISUALIZE NT Workstation"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"Compaq ProLiant DL380 G2"
,
{
MATCH
(
DMI_SYS_VENDOR
,
"Compaq"
),
MATCH
(
DMI_PRODUCT_NAME
,
"ProLiant DL380 G2"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"Compaq ProLiant ML530 G2"
,
{
MATCH
(
DMI_SYS_VENDOR
,
"Compaq"
),
MATCH
(
DMI_PRODUCT_NAME
,
"ProLiant ML530 G2"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"Compaq ProLiant ML350 G3"
,
{
MATCH
(
DMI_SYS_VENDOR
,
"Compaq"
),
MATCH
(
DMI_PRODUCT_NAME
,
"ProLiant ML350 G3"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"Compaq Workstation W8000"
,
{
MATCH
(
DMI_SYS_VENDOR
,
"Compaq"
),
MATCH
(
DMI_PRODUCT_NAME
,
"Workstation W8000"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"ASUS P4B266"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"ASUSTeK Computer INC."
),
MATCH
(
DMI_BOARD_NAME
,
"P4B266"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"ASUS P2B-DS"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"ASUSTeK Computer INC."
),
MATCH
(
DMI_BOARD_NAME
,
"P2B-DS"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"ASUS CUR-DLS"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"ASUSTeK Computer INC."
),
MATCH
(
DMI_BOARD_NAME
,
"CUR-DLS"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"ASUS A7V"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"ASUSTeK Computer INC"
),
MATCH
(
DMI_BOARD_NAME
,
"<A7V>"
),
MATCH
(
DMI_BIOS_VERSION
,
"ASUS A7V ACPI BIOS Revision 1011"
),
NO_MATCH
}},
{
force_acpi_ht
,
"ABIT i440BX-W83977"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"ABIT <http://www.abit.com>"
),
MATCH
(
DMI_BOARD_NAME
,
"i440BX-W83977 (BP6)"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"IBM Bladecenter"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"IBM"
),
MATCH
(
DMI_BOARD_NAME
,
"IBM eServer BladeCenter HS20"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"IBM eServer xSeries 360"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"IBM"
),
MATCH
(
DMI_BOARD_NAME
,
"eServer xSeries 360"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"IBM eserver xSeries 330"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"IBM"
),
MATCH
(
DMI_BOARD_NAME
,
"eserver xSeries 330"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"IBM eserver xSeries 440"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"IBM"
),
MATCH
(
DMI_PRODUCT_NAME
,
"eserver xSeries 440"
),
NO_MATCH
,
NO_MATCH
}},
#endif // CONFIG_ACPI_BOOT
#ifdef CONFIG_ACPI_PCI
/*
* Boxes that need ACPI PCI IRQ routing disabled
*/
{
disable_acpi_pci
,
"ASUS A7V"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"ASUSTeK Computer INC"
),
MATCH
(
DMI_BOARD_NAME
,
"<A7V>"
),
MATCH
(
DMI_BIOS_VERSION
,
"ASUS A7V ACPI BIOS Revision 1007"
),
NO_MATCH
}},
#endif
#ifndef CONFIG_SMP
/*
* Enable APIC on UP kernels.
*/
{
force_apic
,
"Supermicro P4DC6"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"Supermicro"
),
MATCH
(
DMI_BOARD_NAME
,
"P4DC6"
),
NO_MATCH
,
NO_MATCH
}
},
#endif
{
NULL
,
}
{
NULL
,
}
};
};
...
@@ -801,11 +1041,31 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
...
@@ -801,11 +1041,31 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
* returns 1 or we hit the end.
* returns 1 or we hit the end.
*/
*/
#define ACPI_BLACKLIST_CUTOFF_YEAR 2001
static
__init
void
dmi_check_blacklist
(
void
)
static
__init
void
dmi_check_blacklist
(
void
)
{
{
struct
dmi_blacklist
*
d
;
struct
dmi_blacklist
*
d
;
int
i
;
int
i
;
if
(
dmi_ident
[
DMI_BIOS_DATE
])
{
char
*
s
=
strrchr
(
dmi_ident
[
DMI_BIOS_DATE
],
'/'
);
if
(
s
)
{
int
year
,
disable
=
0
;
s
++
;
year
=
simple_strtoul
(
s
,
NULL
,
0
);
if
(
year
>=
1000
)
disable
=
year
<
ACPI_BLACKLIST_CUTOFF_YEAR
;
else
if
(
year
<
1
||
(
year
>
90
&&
year
<=
99
))
disable
=
1
;
if
(
disable
&&
!
acpi_force
)
{
printk
(
KERN_NOTICE
"ACPI disabled because your bios is from %s and too old
\n
"
,
s
);
printk
(
KERN_NOTICE
"You can enable it with acpi=force
\n
"
);
acpi_disabled
=
1
;
}
}
}
d
=&
dmi_blacklist
[
0
];
d
=&
dmi_blacklist
[
0
];
while
(
d
->
callback
)
while
(
d
->
callback
)
{
{
...
@@ -885,6 +1145,8 @@ void __init dmi_scan_machine(void)
...
@@ -885,6 +1145,8 @@ void __init dmi_scan_machine(void)
int
err
=
dmi_iterate
(
dmi_decode
);
int
err
=
dmi_iterate
(
dmi_decode
);
if
(
err
==
0
)
if
(
err
==
0
)
dmi_check_blacklist
();
dmi_check_blacklist
();
else
printk
(
KERN_INFO
"DMI not present.
\n
"
);
}
}
EXPORT_SYMBOL
(
is_unsafe_smbus
);
EXPORT_SYMBOL
(
is_unsafe_smbus
);
arch/i386/kernel/mpparse.c
View file @
47637d5d
...
@@ -620,7 +620,7 @@ void __init get_smp_config (void)
...
@@ -620,7 +620,7 @@ void __init get_smp_config (void)
/*
/*
* ACPI may be used to obtain the entire SMP configuration or just to
* ACPI may be used to obtain the entire SMP configuration or just to
* enumerate/configure processors (CONFIG_ACPI_HT
_ONLY
). Note that
* enumerate/configure processors (CONFIG_ACPI_HT). Note that
* ACPI supports both logical (e.g. Hyper-Threading) and physical
* ACPI supports both logical (e.g. Hyper-Threading) and physical
* processors, where MPS only supports physical.
* processors, where MPS only supports physical.
*/
*/
...
@@ -1011,8 +1011,9 @@ void __init mp_config_acpi_legacy_irqs (void)
...
@@ -1011,8 +1011,9 @@ void __init mp_config_acpi_legacy_irqs (void)
panic
(
"Max # of irq sources exceeded!
\n
"
);
panic
(
"Max # of irq sources exceeded!
\n
"
);
}
}
}
}
#endif
/* CONFIG_X86_IO_APIC */
#if
ndef CONFIG_ACPI_HT_ONLY
#if
def CONFIG_ACPI
/* Ensure the ACPI SCI interrupt level is active low, edge-triggered */
/* Ensure the ACPI SCI interrupt level is active low, edge-triggered */
...
@@ -1067,8 +1068,7 @@ void __init mp_config_ioapic_for_sci(int irq)
...
@@ -1067,8 +1068,7 @@ void __init mp_config_ioapic_for_sci(int irq)
io_apic_set_pci_routing
(
ioapic
,
ioapic_pin
,
irq
,
1
,
1
);
// Active low, level triggered
io_apic_set_pci_routing
(
ioapic
,
ioapic_pin
,
irq
,
1
,
1
);
// Active low, level triggered
}
}
#endif
/* CONFIG_ACPI */
#endif
/*CONFIG_ACPI_HT_ONLY*/
#ifdef CONFIG_ACPI_PCI
#ifdef CONFIG_ACPI_PCI
...
@@ -1149,6 +1149,4 @@ void __init mp_parse_prt (void)
...
@@ -1149,6 +1149,4 @@ void __init mp_parse_prt (void)
#endif
/*CONFIG_ACPI_PCI*/
#endif
/*CONFIG_ACPI_PCI*/
#endif
/*CONFIG_X86_IO_APIC*/
#endif
/*CONFIG_ACPI_BOOT*/
#endif
/*CONFIG_ACPI_BOOT*/
arch/i386/kernel/setup.c
View file @
47637d5d
...
@@ -62,13 +62,20 @@ struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
...
@@ -62,13 +62,20 @@ struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
unsigned
long
mmu_cr4_features
;
unsigned
long
mmu_cr4_features
;
EXPORT_SYMBOL_GPL
(
mmu_cr4_features
);
EXPORT_SYMBOL_GPL
(
mmu_cr4_features
);
#ifdef
CONFIG_ACPI_HT_ONLY
#ifdef
CONFIG_ACPI
int
acpi_disabled
=
1
;
int
acpi_disabled
__initdata
=
0
;
#else
#else
int
acpi_disabled
=
0
;
int
acpi_disabled
__initdata
=
1
;
#endif
#endif
EXPORT_SYMBOL
(
acpi_disabled
);
EXPORT_SYMBOL
(
acpi_disabled
);
#ifdef CONFIG_ACPI_BOOT
int
acpi_ht
__initdata
=
1
;
/* enable HT */
#endif
int
acpi_force
__initdata
=
0
;
int
MCA_bus
;
int
MCA_bus
;
/* for MCA, but anyone else can use it if they want */
/* for MCA, but anyone else can use it if they want */
unsigned
int
machine_id
;
unsigned
int
machine_id
;
...
@@ -516,13 +523,26 @@ static void __init parse_cmdline_early (char ** cmdline_p)
...
@@ -516,13 +523,26 @@ static void __init parse_cmdline_early (char ** cmdline_p)
}
}
}
}
/* "acpi=off" disables both ACPI table parsing and interpreter init */
#ifdef CONFIG_ACPI_BOOT
if
(
c
==
' '
&&
!
memcmp
(
from
,
"acpi=off"
,
8
))
/* "acpi=off" disables both ACPI table parsing and interpreter */
else
if
(
!
memcmp
(
from
,
"acpi=off"
,
8
))
{
acpi_ht
=
0
;
acpi_disabled
=
1
;
acpi_disabled
=
1
;
}
/* "acpismp=force" turns on ACPI again */
/* acpi=force to over-ride black-list */
if
(
c
==
' '
&&
!
memcmp
(
from
,
"acpismp=force"
,
13
))
else
if
(
!
memcmp
(
from
,
"acpi=force"
,
10
))
{
acpi_force
=
1
;
acpi_ht
=
1
;
acpi_disabled
=
0
;
acpi_disabled
=
0
;
}
/* Limit ACPI just to boot-time to enable HT */
else
if
(
!
memcmp
(
from
,
"acpi=ht"
,
7
))
{
acpi_ht
=
1
;
if
(
!
acpi_force
)
acpi_disabled
=
1
;
}
#endif
/*
/*
* highmem=size forces highmem to be exactly 'size' bytes.
* highmem=size forces highmem to be exactly 'size' bytes.
...
@@ -978,12 +998,11 @@ void __init setup_arch(char **cmdline_p)
...
@@ -978,12 +998,11 @@ void __init setup_arch(char **cmdline_p)
generic_apic_probe
(
*
cmdline_p
);
generic_apic_probe
(
*
cmdline_p
);
#endif
#endif
#ifdef CONFIG_ACPI
#ifdef CONFIG_ACPI
_BOOT
/*
/*
* Parse the ACPI tables for possible boot-time SMP configuration.
* Parse the ACPI tables for possible boot-time SMP configuration.
*/
*/
if
(
!
acpi_disabled
)
(
void
)
acpi_boot_init
();
acpi_boot_init
();
#endif
#endif
#ifdef CONFIG_X86_LOCAL_APIC
#ifdef CONFIG_X86_LOCAL_APIC
if
(
smp_found_config
)
if
(
smp_found_config
)
...
...
arch/i386/kernel/smpboot.c
View file @
47637d5d
...
@@ -954,7 +954,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
...
@@ -954,7 +954,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
* If we couldn't find an SMP configuration at boot time,
* If we couldn't find an SMP configuration at boot time,
* get out of here now!
* get out of here now!
*/
*/
if
(
!
smp_found_config
)
{
if
(
!
smp_found_config
&&
!
acpi_lapic
)
{
printk
(
KERN_NOTICE
"SMP motherboard not detected.
\n
"
);
printk
(
KERN_NOTICE
"SMP motherboard not detected.
\n
"
);
smpboot_clear_io_apic_irqs
();
smpboot_clear_io_apic_irqs
();
phys_cpu_present_map
=
1
;
phys_cpu_present_map
=
1
;
...
...
arch/i386/pci/acpi.c
View file @
47637d5d
...
@@ -32,4 +32,14 @@ static int __init pci_acpi_init(void)
...
@@ -32,4 +32,14 @@ static int __init pci_acpi_init(void)
return
0
;
return
0
;
}
}
/*
* pci_disable_acpi()
* act like pci=noacpi seen on command line
* called by DMI blacklist code
*/
__init
void
pci_disable_acpi
(
void
)
{
pci_probe
|=
PCI_NO_ACPI_ROUTING
;
}
subsys_initcall
(
pci_acpi_init
);
subsys_initcall
(
pci_acpi_init
);
drivers/Makefile
View file @
47637d5d
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
obj-$(CONFIG_PCI)
+=
pci/
obj-$(CONFIG_PCI)
+=
pci/
obj-$(CONFIG_PARISC)
+=
parisc/
obj-$(CONFIG_PARISC)
+=
parisc/
obj-$(CONFIG_ACPI)
+=
acpi/
obj-$(CONFIG_ACPI
_BOOT
)
+=
acpi/
# PnP must come after ACPI since it will eventually need to check if acpi
# PnP must come after ACPI since it will eventually need to check if acpi
# was used and do nothing if so
# was used and do nothing if so
obj-$(CONFIG_PNP)
+=
pnp/
obj-$(CONFIG_PNP)
+=
pnp/
...
...
drivers/acpi/Kconfig
View file @
47637d5d
...
@@ -2,12 +2,36 @@
...
@@ -2,12 +2,36 @@
# ACPI Configuration
# ACPI Configuration
#
#
menu "ACPI Support"
menu "ACPI (Advanced Configuration and Power Interface) Support"
config ACPI_HT
bool "ACPI Processor Enumeration for HT"
depends on (X86 && X86_LOCAL_APIC)
default y
---help---
ACPI enumerates both logical (a.k.a. Hyper-Threaded -- HT)
and physical processors. It is designed to obsolete several older
specifications, including the MultiProcessor Specification (MPS),
which supported only physical processors.
CONFIG_ACPI_HT includes the minimal ACPI boot-time code
necessary to enumerate logical processors and enable HT.
CONFIG_ACPI includes CONFIG_ACPI_HT, plus IO APIC enumeration,
and the hooks to run the ACPI AML interpreter for run-time events.
When CONFIG_ACPI is selected, the command-line option "acpi=ht"
is available to run just the ACPI boot-time code -- just as if
only CONFIG_ACPI_HT were selected.
Note that "acpi=off" can be used to disable all ACPI code in the kernel.
config ACPI
config ACPI
bool "
ACPI Support" if X86
bool "
Full ACPI Support"
depends on !X86_VISWS
depends on !X86_VISWS
default y if IA64 && (!IA64_HP_SIM || IA64_SGI_SN)
depends on !IA64_HP_SIM
depends on IA64 || (X86 && ACPI_HT)
default y
---help---
---help---
Advanced Configuration and Power Interface (ACPI) support for
Advanced Configuration and Power Interface (ACPI) support for
Linux requires an ACPI compliant platform (hardware/firmware),
Linux requires an ACPI compliant platform (hardware/firmware),
...
@@ -36,30 +60,16 @@ config ACPI
...
@@ -36,30 +60,16 @@ config ACPI
available at:
available at:
<http://www.acpi.info>
<http://www.acpi.info>
config ACPI_HT_ONLY
bool "CPU Enumeration Only"
depends on X86 && ACPI && X86_LOCAL_APIC
---help---
This option enables limited ACPI support -- just enough to
enumerate processors from the ACPI Multiple APIC Description
Table (MADT). Note that ACPI supports both logical (e.g. Hyper-
Threading) and physical processors, where the MultiProcessor
Specification (MPS) table only supports physical processors.
Full ACPI support (CONFIG_ACPI) is preferred. Use this option
only if you wish to limit ACPI's role to processor enumeration.
In this configuration, ACPI defaults to off. It must be enabled
on the command-line with the "acpismp=force" option.
config ACPI_BOOT
config ACPI_BOOT
bool
bool
depends on
IA64 && (!IA64_HP_SIM || IA64_SGI_SN) || X86 && ACPI && !ACPI_HT_ONLY
depends on
ACPI || ACPI_HT
default y
default y
config ACPI_SLEEP
config ACPI_SLEEP
bool "Sleep States (EXPERIMENTAL)"
bool "Sleep States"
depends on X86 && ACPI && !ACPI_HT_ONLY && EXPERIMENTAL
depends on X86 && ACPI
depends on SOFTWARE_SUSPEND
default y
---help---
---help---
This option adds support for ACPI suspend states.
This option adds support for ACPI suspend states.
...
@@ -83,7 +93,8 @@ config ACPI_SLEEP_PROC_FS
...
@@ -83,7 +93,8 @@ config ACPI_SLEEP_PROC_FS
config ACPI_AC
config ACPI_AC
tristate "AC Adapter"
tristate "AC Adapter"
depends on X86 && ACPI && !ACPI_HT_ONLY
depends on X86 && ACPI
default m
help
help
This driver adds support for the AC Adapter object, which indicates
This driver adds support for the AC Adapter object, which indicates
whether a system is on AC, or not. Typically, only mobile systems
whether a system is on AC, or not. Typically, only mobile systems
...
@@ -91,7 +102,8 @@ config ACPI_AC
...
@@ -91,7 +102,8 @@ config ACPI_AC
config ACPI_BATTERY
config ACPI_BATTERY
tristate "Battery"
tristate "Battery"
depends on X86 && ACPI && !ACPI_HT_ONLY
depends on X86 && ACPI
default m
help
help
This driver adds support for battery information through
This driver adds support for battery information through
/proc/acpi/battery. If you have a mobile system with a battery,
/proc/acpi/battery. If you have a mobile system with a battery,
...
@@ -99,7 +111,9 @@ config ACPI_BATTERY
...
@@ -99,7 +111,9 @@ config ACPI_BATTERY
config ACPI_BUTTON
config ACPI_BUTTON
tristate "Button"
tristate "Button"
depends on IA64 && !IA64_HP_SIM || X86 && ACPI && !ACPI_HT_ONLY
depends on ACPI
depends on !IA64_SGI_SN
default m
help
help
This driver registers for events based on buttons, such as the
This driver registers for events based on buttons, such as the
power, sleep, and lid switch. In the future, a daemon will read
power, sleep, and lid switch. In the future, a daemon will read
...
@@ -109,14 +123,18 @@ config ACPI_BUTTON
...
@@ -109,14 +123,18 @@ config ACPI_BUTTON
config ACPI_FAN
config ACPI_FAN
tristate "Fan"
tristate "Fan"
depends on IA64 && !IA64_HP_SIM || X86 && ACPI && !ACPI_HT_ONLY
depends on ACPI
depends on !IA64_SGI_SN
default m
help
help
This driver adds support for ACPI fan devices, allowing user-mode
This driver adds support for ACPI fan devices, allowing user-mode
applications to perform basic fan control (on, off, status).
applications to perform basic fan control (on, off, status).
config ACPI_PROCESSOR
config ACPI_PROCESSOR
tristate "Processor"
tristate "Processor"
depends on IA64 && !IA64_HP_SIM || X86 && ACPI && !ACPI_HT_ONLY
depends on ACPI
depends on !IA64_SGI_SN
default m
help
help
This driver installs ACPI as the idle handler for Linux, and uses
This driver installs ACPI as the idle handler for Linux, and uses
ACPI C2 and C3 processor states to save power, on systems that
ACPI C2 and C3 processor states to save power, on systems that
...
@@ -125,6 +143,7 @@ config ACPI_PROCESSOR
...
@@ -125,6 +143,7 @@ config ACPI_PROCESSOR
config ACPI_THERMAL
config ACPI_THERMAL
tristate "Thermal Zone"
tristate "Thermal Zone"
depends on ACPI_PROCESSOR
depends on ACPI_PROCESSOR
default m
help
help
This driver adds support for ACPI thermal zones. Most mobile and
This driver adds support for ACPI thermal zones. Most mobile and
some desktop systems support ACPI thermal zones. It is HIGHLY
some desktop systems support ACPI thermal zones. It is HIGHLY
...
@@ -132,12 +151,16 @@ config ACPI_THERMAL
...
@@ -132,12 +151,16 @@ config ACPI_THERMAL
may be damaged without it.
may be damaged without it.
config ACPI_NUMA
config ACPI_NUMA
bool "NUMA support" if NUMA && (IA64 && !IA64_HP_SIM || X86 && ACPI && !ACPI_HT_ONLY && !X86_64)
bool "NUMA support"
depends on ACPI
depends on NUMA
depends on !X86_64
default y if IA64_GENERIC || IA64_SGI_SN2
default y if IA64_GENERIC || IA64_SGI_SN2
config ACPI_ASUS
config ACPI_ASUS
tristate "ASUS/Medion Laptop Extras"
tristate "ASUS/Medion Laptop Extras"
depends on X86 && ACPI && !ACPI_HT_ONLY
depends on X86 && ACPI
default m
---help---
---help---
This driver provides support for extra features of ACPI-compatible
This driver provides support for extra features of ACPI-compatible
ASUS laptops. As some of Medion laptops are made by ASUS, it may also
ASUS laptops. As some of Medion laptops are made by ASUS, it may also
...
@@ -162,7 +185,8 @@ config ACPI_ASUS
...
@@ -162,7 +185,8 @@ config ACPI_ASUS
config ACPI_TOSHIBA
config ACPI_TOSHIBA
tristate "Toshiba Laptop Extras"
tristate "Toshiba Laptop Extras"
depends on X86 && ACPI && !ACPI_HT_ONLY
depends on X86 && ACPI
default m
---help---
---help---
This driver adds support for access to certain system settings
This driver adds support for access to certain system settings
on "legacy free" Toshiba laptops. These laptops can be recognized by
on "legacy free" Toshiba laptops. These laptops can be recognized by
...
@@ -188,7 +212,9 @@ config ACPI_TOSHIBA
...
@@ -188,7 +212,9 @@ config ACPI_TOSHIBA
config ACPI_DEBUG
config ACPI_DEBUG
bool "Debug Statements"
bool "Debug Statements"
depends on IA64 && !IA64_HP_SIM || X86 && ACPI && !ACPI_HT_ONLY
depends on ACPI
depends on !IA64_SGI_SN
default n
help
help
The ACPI driver can optionally report errors with a great deal
The ACPI driver can optionally report errors with a great deal
of verbosity. Saying Y enables these statements. This will increase
of verbosity. Saying Y enables these statements. This will increase
...
@@ -196,17 +222,19 @@ config ACPI_DEBUG
...
@@ -196,17 +222,19 @@ config ACPI_DEBUG
config ACPI_BUS
config ACPI_BUS
bool
bool
depends on IA64 && !IA64_HP_SIM || X86 && ACPI && !ACPI_HT_ONLY
depends on ACPI
depends on !IA64_SGI_SN
default y
default y
config ACPI_INTERPRETER
config ACPI_INTERPRETER
bool
bool
depends on IA64 && !IA64_HP_SIM || X86 && ACPI && !ACPI_HT_ONLY
depends on ACPI
depends on !IA64_SGI_SN
default y
default y
config ACPI_EC
config ACPI_EC
bool
bool
depends on X86 && ACPI
&& !ACPI_HT_ONLY
depends on X86 && ACPI
default y
default y
help
help
This driver is required on some systems for the proper operation of
This driver is required on some systems for the proper operation of
...
@@ -215,17 +243,20 @@ config ACPI_EC
...
@@ -215,17 +243,20 @@ config ACPI_EC
config ACPI_POWER
config ACPI_POWER
bool
bool
depends on IA64 && !IA64_HP_SIM || X86 && ACPI && !ACPI_HT_ONLY
depends on ACPI
depends on !IA64_SGI_SN
default y
default y
config ACPI_PCI
config ACPI_PCI
bool
bool
depends on IA64 && !IA64_HP_SIM || X86 && ACPI && !ACPI_HT_ONLY
depends on ACPI
depends on !IA64_SGI_SN
default PCI
default PCI
config ACPI_SYSTEM
config ACPI_SYSTEM
bool
bool
depends on IA64 && !IA64_HP_SIM || X86 && ACPI && !ACPI_HT_ONLY
depends on ACPI
depends on !IA64_SGI_SN
default y
default y
help
help
This driver will enable your system to shut down using ACPI, and
This driver will enable your system to shut down using ACPI, and
...
@@ -233,7 +264,8 @@ config ACPI_SYSTEM
...
@@ -233,7 +264,8 @@ config ACPI_SYSTEM
config ACPI_EFI
config ACPI_EFI
bool
bool
depends on IA64 && (!IA64_HP_SIM || IA64_SGI_SN)
depends on ACPI
depends on IA64
default y
default y
endmenu
endmenu
...
...
drivers/acpi/Makefile
View file @
47637d5d
...
@@ -12,12 +12,13 @@ endif
...
@@ -12,12 +12,13 @@ endif
EXTRA_CFLAGS
+=
$(ACPI_CFLAGS)
EXTRA_CFLAGS
+=
$(ACPI_CFLAGS)
obj-
y
:=
acpi_ksyms.o
obj-
$(CONFIG_ACPI)
:=
acpi_ksyms.o
#
#
# ACPI Boot-Time Table Parsing
# ACPI Boot-Time Table Parsing
#
#
obj-$(CONFIG_ACPI_BOOT)
+=
tables.o blacklist.o
obj-$(CONFIG_ACPI_BOOT)
+=
tables.o
obj-$(CONFIG_ACPI)
+=
blacklist.o
#
#
# ACPI Core Subsystem (Interpreter)
# ACPI Core Subsystem (Interpreter)
...
...
drivers/acpi/bus.c
View file @
47637d5d
...
@@ -691,7 +691,7 @@ static int __init acpi_init (void)
...
@@ -691,7 +691,7 @@ static int __init acpi_init (void)
acpi_set_debug
(
ACPI_DEBUG_LOW
);
acpi_set_debug
(
ACPI_DEBUG_LOW
);
if
(
acpi_disabled
)
{
if
(
acpi_disabled
)
{
printk
(
KERN_INFO
PREFIX
"
Disabled via command line (acpi=off)
\n
"
);
printk
(
KERN_INFO
PREFIX
"
Interpreter disabled.
\n
"
);
return
-
ENODEV
;
return
-
ENODEV
;
}
}
...
...
drivers/acpi/tables.c
View file @
47637d5d
...
@@ -96,10 +96,11 @@ acpi_table_print (
...
@@ -96,10 +96,11 @@ acpi_table_print (
else
else
name
=
header
->
signature
;
name
=
header
->
signature
;
printk
(
KERN_INFO
PREFIX
"%.4s (v%3.3d %6.6s %8.8s
%5.5d.%5.5d
) @ 0x%p
\n
"
,
printk
(
KERN_INFO
PREFIX
"%.4s (v%3.3d %6.6s %8.8s
0x%08x %.4s 0x%08x
) @ 0x%p
\n
"
,
name
,
header
->
revision
,
header
->
oem_id
,
name
,
header
->
revision
,
header
->
oem_id
,
header
->
oem_table_id
,
header
->
oem_revision
>>
16
,
header
->
oem_table_id
,
header
->
oem_revision
,
header
->
oem_revision
&
0xffff
,
(
void
*
)
phys_addr
);
header
->
asl_compiler_id
,
header
->
asl_compiler_revision
,
(
void
*
)
phys_addr
);
}
}
...
@@ -219,12 +220,16 @@ acpi_table_compute_checksum (
...
@@ -219,12 +220,16 @@ acpi_table_compute_checksum (
return
(
sum
&
0xFF
);
return
(
sum
&
0xFF
);
}
}
/*
* acpi_get_table_header_early()
* for acpi_blacklisted(), acpi_table_get_sdt()
*/
int
__init
int
__init
acpi_get_table_header_early
(
acpi_get_table_header_early
(
enum
acpi_table_id
id
,
enum
acpi_table_id
id
,
struct
acpi_table_header
**
header
)
struct
acpi_table_header
**
header
)
{
{
int
i
;
unsigned
int
i
;
enum
acpi_table_id
temp_id
;
enum
acpi_table_id
temp_id
;
/* DSDT is different from the rest */
/* DSDT is different from the rest */
...
@@ -281,7 +286,7 @@ acpi_table_parse_madt_family (
...
@@ -281,7 +286,7 @@ acpi_table_parse_madt_family (
acpi_table_entry_header
*
entry
=
NULL
;
acpi_table_entry_header
*
entry
=
NULL
;
unsigned
long
count
=
0
;
unsigned
long
count
=
0
;
unsigned
long
madt_end
=
0
;
unsigned
long
madt_end
=
0
;
int
i
=
0
;
unsigned
int
i
=
0
;
if
(
!
handler
)
if
(
!
handler
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -343,7 +348,7 @@ acpi_table_parse (
...
@@ -343,7 +348,7 @@ acpi_table_parse (
acpi_table_handler
handler
)
acpi_table_handler
handler
)
{
{
int
count
=
0
;
int
count
=
0
;
int
i
=
0
;
unsigned
int
i
=
0
;
if
(
!
handler
)
if
(
!
handler
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -364,7 +369,7 @@ acpi_table_get_sdt (
...
@@ -364,7 +369,7 @@ acpi_table_get_sdt (
struct
acpi_table_rsdp
*
rsdp
)
struct
acpi_table_rsdp
*
rsdp
)
{
{
struct
acpi_table_header
*
header
=
NULL
;
struct
acpi_table_header
*
header
=
NULL
;
int
i
,
id
=
0
;
unsigned
int
i
,
id
=
0
;
if
(
!
rsdp
)
if
(
!
rsdp
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -550,7 +555,7 @@ acpi_table_init (void)
...
@@ -550,7 +555,7 @@ acpi_table_init (void)
return
-
ENODEV
;
return
-
ENODEV
;
}
}
printk
(
KERN_INFO
PREFIX
"RSDP (v%3.3d %6.6s ) @ 0x%p
\n
"
,
printk
(
KERN_INFO
PREFIX
"RSDP (v%3.3d %6.6s
) @ 0x%p
\n
"
,
rsdp
->
revision
,
rsdp
->
oem_id
,
(
void
*
)
rsdp_phys
);
rsdp
->
revision
,
rsdp
->
oem_id
,
(
void
*
)
rsdp_phys
);
if
(
rsdp
->
revision
<
2
)
if
(
rsdp
->
revision
<
2
)
...
...
include/asm-i386/acpi.h
View file @
47637d5d
...
@@ -106,30 +106,22 @@
...
@@ -106,30 +106,22 @@
:"0"(n_hi), "1"(n_lo))
:"0"(n_hi), "1"(n_lo))
#ifdef CONFIG_ACPI_HT_ONLY
#if defined(CONFIG_ACPI_BOOT) && defined(CONFIG_X86_LOCAL_APIC)
extern
int
acpi_lapic
;
extern
int
acpi_lapic
;
#define acpi_ioapic 0
#else
#else
#ifndef CONFIG_ACPI_BOOT
#define acpi_lapic 0
#define acpi_lapic 0
#define acpi_ioapic 0
#else
#ifdef CONFIG_X86_LOCAL_APIC
extern
int
acpi_lapic
;
#else
#define acpi_lapic 0
#endif
#endif
#ifdef CONFIG_X86_IO_APIC
extern
int
acpi_ioapic
;
#if defined(CONFIG_ACPI_BOOT) && defined(CONFIG_X86_IO_APIC)
extern
int
acpi_ioapic
;
#else
#else
#define acpi_ioapic 0
#define acpi_ioapic 0
#endif
#endif
#endif
#ifdef CONFIG_ACPI_BOOT
/* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */
/* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */
#define FIX_ACPI_PAGES 4
#define FIX_ACPI_PAGES 4
#endif
#endif
/*CONFIG_ACPI_BOOT*/
#ifdef CONFIG_ACPI_SLEEP
#ifdef CONFIG_ACPI_SLEEP
...
...
include/linux/acpi.h
View file @
47637d5d
...
@@ -37,7 +37,7 @@
...
@@ -37,7 +37,7 @@
#include <asm/acpi.h>
#include <asm/acpi.h>
#ifdef CONFIG_ACPI
#ifdef CONFIG_ACPI
_BOOT
enum
acpi_irq_model_id
{
enum
acpi_irq_model_id
{
ACPI_IRQ_MODEL_PIC
=
0
,
ACPI_IRQ_MODEL_PIC
=
0
,
...
@@ -369,11 +369,11 @@ void acpi_numa_arch_fixup(void);
...
@@ -369,11 +369,11 @@ void acpi_numa_arch_fixup(void);
extern
int
acpi_mp_config
;
extern
int
acpi_mp_config
;
#else
#else
/*!CONFIG_ACPI_BOOT*/
#define acpi_mp_config 0
#define acpi_mp_config 0
#endif
#endif
/*!CONFIG_ACPI_BOOT*/
#ifdef CONFIG_ACPI_PCI
#ifdef CONFIG_ACPI_PCI
...
...
init/do_mounts.c
View file @
47637d5d
...
@@ -273,6 +273,16 @@ void __init mount_block_root(char *name, int flags)
...
@@ -273,6 +273,16 @@ void __init mount_block_root(char *name, int flags)
printk
(
"VFS: Cannot open root device
\"
%s
\"
or %s
\n
"
,
printk
(
"VFS: Cannot open root device
\"
%s
\"
or %s
\n
"
,
root_device_name
,
b
);
root_device_name
,
b
);
printk
(
"Please append a correct
\"
root=
\"
boot option
\n
"
);
printk
(
"Please append a correct
\"
root=
\"
boot option
\n
"
);
#ifdef __i386__
{
extern
void
dmi_dump_system
(
void
);
printk
(
"You may want to retry boot with pci=noacpi, "
"acpi=ht, or acpi=off on the command line.
\n
"
);
printk
(
"If one of them helps please report it with "
"the following lines:
\n
"
);
dmi_dump_system
();
}
#endif
panic
(
"VFS: Unable to mount root fs on %s"
,
b
);
panic
(
"VFS: Unable to mount root fs on %s"
,
b
);
}
}
panic
(
"VFS: Unable to mount root fs on %s"
,
__bdevname
(
ROOT_DEV
,
b
));
panic
(
"VFS: Unable to mount root fs on %s"
,
__bdevname
(
ROOT_DEV
,
b
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment