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
Kirill Smelkov
linux
Commits
1569b827
Commit
1569b827
authored
Aug 18, 2002
by
Andy Grover
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add arch-neutral support for parsing SLIT and SRAT tables (Kochi Takayoshi)
parent
5dfd412e
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
231 additions
and
13 deletions
+231
-13
drivers/acpi/Config.in
drivers/acpi/Config.in
+8
-1
drivers/acpi/Makefile
drivers/acpi/Makefile
+1
-0
drivers/acpi/numa.c
drivers/acpi/numa.c
+187
-0
drivers/acpi/tables.c
drivers/acpi/tables.c
+22
-8
include/linux/acpi.h
include/linux/acpi.h
+13
-4
No files found.
drivers/acpi/Config.in
View file @
1569b827
...
@@ -31,6 +31,9 @@ if [ "$CONFIG_X86" = "y" ]; then
...
@@ -31,6 +31,9 @@ if [ "$CONFIG_X86" = "y" ]; then
tristate ' Fan' CONFIG_ACPI_FAN
tristate ' Fan' CONFIG_ACPI_FAN
tristate ' Processor' CONFIG_ACPI_PROCESSOR
tristate ' Processor' CONFIG_ACPI_PROCESSOR
dep_tristate ' Thermal Zone' CONFIG_ACPI_THERMAL $CONFIG_ACPI_PROCESSOR
dep_tristate ' Thermal Zone' CONFIG_ACPI_THERMAL $CONFIG_ACPI_PROCESSOR
if [ "$CONFIG_NUMA" = "y" ]; then
bool ' NUMA support' CONFIG_ACPI_NUMA $CONFIG_NUMA
fi
tristate ' Toshiba Laptop Extras' CONFIG_ACPI_TOSHIBA
tristate ' Toshiba Laptop Extras' CONFIG_ACPI_TOSHIBA
bool ' Debug Statements' CONFIG_ACPI_DEBUG
bool ' Debug Statements' CONFIG_ACPI_DEBUG
fi
fi
...
@@ -58,6 +61,7 @@ if [ "$CONFIG_IA64" = "y" ]; then
...
@@ -58,6 +61,7 @@ if [ "$CONFIG_IA64" = "y" ]; then
define_bool CONFIG_ACPI_FAN n
define_bool CONFIG_ACPI_FAN n
define_bool CONFIG_ACPI_PROCESSOR n
define_bool CONFIG_ACPI_PROCESSOR n
define_bool CONFIG_ACPI_THERMAL n
define_bool CONFIG_ACPI_THERMAL n
define_bool CONFIG_ACPI_NUMA y
endmenu
endmenu
fi
fi
...
@@ -78,6 +82,9 @@ if [ "$CONFIG_IA64" = "y" ]; then
...
@@ -78,6 +82,9 @@ if [ "$CONFIG_IA64" = "y" ]; then
tristate ' Fan' CONFIG_ACPI_FAN
tristate ' Fan' CONFIG_ACPI_FAN
tristate ' Processor' CONFIG_ACPI_PROCESSOR
tristate ' Processor' CONFIG_ACPI_PROCESSOR
dep_tristate ' Thermal Zone' CONFIG_ACPI_THERMAL $CONFIG_ACPI_PROCESSOR
dep_tristate ' Thermal Zone' CONFIG_ACPI_THERMAL $CONFIG_ACPI_PROCESSOR
if [ "$CONFIG_NUMA" = "y" ]; then
bool ' NUMA support' CONFIG_ACPI_NUMA $CONFIG_NUMA
fi
bool ' Debug Statements' CONFIG_ACPI_DEBUG
bool ' Debug Statements' CONFIG_ACPI_DEBUG
endmenu
endmenu
fi
fi
...
...
drivers/acpi/Makefile
View file @
1569b827
...
@@ -43,6 +43,7 @@ obj-$(CONFIG_ACPI_POWER) += power.o
...
@@ -43,6 +43,7 @@ obj-$(CONFIG_ACPI_POWER) += power.o
obj-$(CONFIG_ACPI_PROCESSOR)
+=
processor.o
obj-$(CONFIG_ACPI_PROCESSOR)
+=
processor.o
obj-$(CONFIG_ACPI_THERMAL)
+=
thermal.o
obj-$(CONFIG_ACPI_THERMAL)
+=
thermal.o
obj-$(CONFIG_ACPI_SYSTEM)
+=
system.o
obj-$(CONFIG_ACPI_SYSTEM)
+=
system.o
obj-$(CONFIG_ACPI_NUMA)
+=
numa.o
obj-$(CONFIG_ACPI_TOSHIBA)
+=
toshiba_acpi.o
obj-$(CONFIG_ACPI_TOSHIBA)
+=
toshiba_acpi.o
include
$(TOPDIR)/Rules.make
include
$(TOPDIR)/Rules.make
drivers/acpi/numa.c
0 → 100644
View file @
1569b827
/*
* acpi_numa.c - ACPI NUMA support
*
* Copyright (C) 2002 Takayoshi Kochi <t-kouchi@cq.jp.nec.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/config.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/acpi.h>
#define PREFIX "ACPI: "
extern
int
__init
acpi_table_parse_madt_family
(
enum
acpi_table_id
id
,
unsigned
long
madt_size
,
int
entry_id
,
acpi_madt_entry_handler
handler
);
void
__init
acpi_table_print_srat_entry
(
acpi_table_entry_header
*
header
)
{
if
(
!
header
)
return
;
switch
(
header
->
type
)
{
case
ACPI_SRAT_PROCESSOR_AFFINITY
:
{
struct
acpi_table_processor_affinity
*
p
=
(
struct
acpi_table_processor_affinity
*
)
header
;
printk
(
KERN_INFO
PREFIX
"SRAT Processor (id[0x%02x] eid[0x%02x]) in proximity domain %d %s
\n
"
,
p
->
apic_id
,
p
->
lsapic_eid
,
p
->
proximity_domain
,
p
->
flags
.
enabled
?
"enabled"
:
"disabled"
);
}
break
;
case
ACPI_SRAT_MEMORY_AFFINITY
:
{
struct
acpi_table_memory_affinity
*
p
=
(
struct
acpi_table_memory_affinity
*
)
header
;
printk
(
KERN_INFO
PREFIX
"SRAT Memory (0x%08x%08x length 0x%08x%08x type 0x%x) in proximity domain %d %s%s
\n
"
,
p
->
base_addr_hi
,
p
->
base_addr_lo
,
p
->
length_hi
,
p
->
length_lo
,
p
->
memory_type
,
p
->
proximity_domain
,
p
->
flags
.
enabled
?
"enabled"
:
"disabled"
,
p
->
flags
.
hot_pluggable
?
" hot-pluggable"
:
""
);
}
break
;
default:
printk
(
KERN_WARNING
PREFIX
"Found unsupported SRAT entry (type = 0x%x)
\n
"
,
header
->
type
);
break
;
}
}
static
int
__init
acpi_parse_slit
(
unsigned
long
phys_addr
,
unsigned
long
size
)
{
struct
acpi_table_slit
*
slit
;
u32
localities
;
if
(
!
phys_addr
||
!
size
)
return
-
EINVAL
;
slit
=
(
struct
acpi_table_slit
*
)
__va
(
phys_addr
);
/* downcast just for %llu vs %lu for i386/ia64 */
localities
=
(
u32
)
slit
->
localities
;
printk
(
KERN_INFO
PREFIX
"SLIT localities %ux%u
\n
"
,
localities
,
localities
);
acpi_numa_slit_init
(
slit
);
return
0
;
}
static
int
__init
acpi_parse_processor_affinity
(
acpi_table_entry_header
*
header
)
{
struct
acpi_table_processor_affinity
*
processor_affinity
=
NULL
;
processor_affinity
=
(
struct
acpi_table_processor_affinity
*
)
header
;
if
(
!
processor_affinity
)
return
-
EINVAL
;
acpi_table_print_srat_entry
(
header
);
/* let architecture-dependent part to do it */
acpi_numa_processor_affinity_init
(
processor_affinity
);
return
0
;
}
static
int
__init
acpi_parse_memory_affinity
(
acpi_table_entry_header
*
header
)
{
struct
acpi_table_memory_affinity
*
memory_affinity
=
NULL
;
memory_affinity
=
(
struct
acpi_table_memory_affinity
*
)
header
;
if
(
!
memory_affinity
)
return
-
EINVAL
;
acpi_table_print_srat_entry
(
header
);
/* let architecture-dependent part to do it */
acpi_numa_memory_affinity_init
(
memory_affinity
);
return
0
;
}
static
int
__init
acpi_parse_srat
(
unsigned
long
phys_addr
,
unsigned
long
size
)
{
struct
acpi_table_srat
*
srat
=
NULL
;
if
(
!
phys_addr
||
!
size
)
return
-
EINVAL
;
srat
=
(
struct
acpi_table_srat
*
)
__va
(
phys_addr
);
printk
(
KERN_INFO
PREFIX
"SRAT revision %d
\n
"
,
srat
->
table_revision
);
return
0
;
}
int
__init
acpi_table_parse_srat
(
enum
acpi_srat_entry_id
id
,
acpi_madt_entry_handler
handler
)
{
return
acpi_table_parse_madt_family
(
ACPI_SRAT
,
sizeof
(
struct
acpi_table_srat
),
id
,
handler
);
}
int
__init
acpi_numa_init
()
{
int
result
;
/* SRAT: Static Resource Affinity Table */
result
=
acpi_table_parse
(
ACPI_SRAT
,
acpi_parse_srat
);
if
(
result
>
0
)
{
result
=
acpi_table_parse_srat
(
ACPI_SRAT_PROCESSOR_AFFINITY
,
acpi_parse_processor_affinity
);
result
=
acpi_table_parse_srat
(
ACPI_SRAT_MEMORY_AFFINITY
,
acpi_parse_memory_affinity
);
}
else
{
/* FIXME */
printk
(
"Warning: acpi_table_parse(ACPI_SRAT) returned %d!
\n
"
,
result
);
}
/* SLIT: System Locality Information Table */
result
=
acpi_table_parse
(
ACPI_SLIT
,
acpi_parse_slit
);
if
(
result
<
1
)
{
/* FIXME */
printk
(
"Warning: acpi_table_parse(ACPI_SLIT) returned %d!
\n
"
,
result
);
}
acpi_numa_arch_fixup
();
return
0
;
}
drivers/acpi/tables.c
View file @
1569b827
...
@@ -224,11 +224,13 @@ acpi_table_compute_checksum (
...
@@ -224,11 +224,13 @@ acpi_table_compute_checksum (
int
__init
int
__init
acpi_table_parse_madt
(
acpi_table_parse_madt
_family
(
enum
acpi_table_id
id
,
enum
acpi_table_id
id
,
unsigned
long
madt_size
,
int
entry_id
,
acpi_madt_entry_handler
handler
)
acpi_madt_entry_handler
handler
)
{
{
struct
acpi_table_madt
*
madt
=
NULL
;
void
*
madt
=
NULL
;
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
;
...
@@ -240,19 +242,21 @@ acpi_table_parse_madt (
...
@@ -240,19 +242,21 @@ acpi_table_parse_madt (
/* Locate the MADT (if exists). There should only be one. */
/* Locate the MADT (if exists). There should only be one. */
for
(
i
=
0
;
i
<
sdt
.
count
;
i
++
)
{
for
(
i
=
0
;
i
<
sdt
.
count
;
i
++
)
{
if
(
sdt
.
entry
[
i
].
id
!=
ACPI_APIC
)
if
(
sdt
.
entry
[
i
].
id
!=
id
)
continue
;
continue
;
madt
=
(
struct
acpi_table_madt
*
)
madt
=
(
void
*
)
__acpi_map_table
(
sdt
.
entry
[
i
].
pa
,
sdt
.
entry
[
i
].
size
);
__acpi_map_table
(
sdt
.
entry
[
i
].
pa
,
sdt
.
entry
[
i
].
size
);
if
(
!
madt
)
{
if
(
!
madt
)
{
printk
(
KERN_WARNING
PREFIX
"Unable to map MADT
\n
"
);
printk
(
KERN_WARNING
PREFIX
"Unable to map %s
\n
"
,
acpi_table_signatures
[
id
]);
return
-
ENODEV
;
return
-
ENODEV
;
}
}
break
;
break
;
}
}
if
(
!
madt
)
{
if
(
!
madt
)
{
printk
(
KERN_WARNING
PREFIX
"MADT not present
\n
"
);
printk
(
KERN_WARNING
PREFIX
"%s not present
\n
"
,
acpi_table_signatures
[
id
]);
return
-
ENODEV
;
return
-
ENODEV
;
}
}
...
@@ -261,10 +265,10 @@ acpi_table_parse_madt (
...
@@ -261,10 +265,10 @@ acpi_table_parse_madt (
/* Parse all entries looking for a match. */
/* Parse all entries looking for a match. */
entry
=
(
acpi_table_entry_header
*
)
entry
=
(
acpi_table_entry_header
*
)
((
unsigned
long
)
madt
+
sizeof
(
struct
acpi_table_madt
)
);
((
unsigned
long
)
madt
+
madt_size
);
while
(((
unsigned
long
)
entry
)
<
madt_end
)
{
while
(((
unsigned
long
)
entry
)
<
madt_end
)
{
if
(
entry
->
type
==
id
)
{
if
(
entry
->
type
==
entry_
id
)
{
count
++
;
count
++
;
handler
(
entry
);
handler
(
entry
);
}
}
...
@@ -276,6 +280,16 @@ acpi_table_parse_madt (
...
@@ -276,6 +280,16 @@ acpi_table_parse_madt (
}
}
int
__init
acpi_table_parse_madt
(
enum
acpi_madt_entry_id
id
,
acpi_madt_entry_handler
handler
)
{
return
acpi_table_parse_madt_family
(
ACPI_APIC
,
sizeof
(
struct
acpi_table_madt
),
id
,
handler
);
}
int
__init
int
__init
acpi_table_parse
(
acpi_table_parse
(
enum
acpi_table_id
id
,
enum
acpi_table_id
id
,
...
...
include/linux/acpi.h
View file @
1569b827
...
@@ -336,12 +336,21 @@ typedef int (*acpi_madt_entry_handler) (acpi_table_entry_header *header);
...
@@ -336,12 +336,21 @@ typedef int (*acpi_madt_entry_handler) (acpi_table_entry_header *header);
char
*
__acpi_map_table
(
unsigned
long
phys_addr
,
unsigned
long
size
);
char
*
__acpi_map_table
(
unsigned
long
phys_addr
,
unsigned
long
size
);
unsigned
long
acpi_find_rsdp
(
void
);
unsigned
long
acpi_find_rsdp
(
void
);
int
acpi_boot_init
(
char
*
cmdline
);
int
acpi_boot_init
(
char
*
cmdline
);
int
acpi_numa_init
(
void
);
int
acpi_table_init
(
char
*
cmdline
);
int
acpi_table_init
(
char
*
cmdline
);
int
acpi_table_parse
(
enum
acpi_table_id
,
acpi_table_handler
);
int
acpi_table_parse
(
enum
acpi_table_id
id
,
acpi_table_handler
handler
);
int
acpi_table_parse_madt
(
enum
acpi_table_id
,
acpi_madt_entry_handler
);
int
acpi_table_parse_madt
(
enum
acpi_madt_entry_id
id
,
acpi_madt_entry_handler
handler
);
void
acpi_table_print
(
struct
acpi_table_header
*
,
unsigned
long
);
int
acpi_table_parse_srat
(
enum
acpi_srat_entry_id
id
,
acpi_madt_entry_handler
handler
);
void
acpi_table_print_madt_entry
(
acpi_table_entry_header
*
);
void
acpi_table_print
(
struct
acpi_table_header
*
header
,
unsigned
long
phys_addr
);
void
acpi_table_print_madt_entry
(
acpi_table_entry_header
*
madt
);
void
acpi_table_print_srat_entry
(
acpi_table_entry_header
*
srat
);
/* the following four functions are architecture-dependent */
void
acpi_numa_slit_init
(
struct
acpi_table_slit
*
slit
);
void
acpi_numa_processor_affinity_init
(
struct
acpi_table_processor_affinity
*
pa
);
void
acpi_numa_memory_affinity_init
(
struct
acpi_table_memory_affinity
*
ma
);
void
acpi_numa_arch_fixup
(
void
);
extern
int
acpi_mp_config
;
extern
int
acpi_mp_config
;
...
...
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