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
9609c7e2
Commit
9609c7e2
authored
Feb 29, 2004
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge intel.com:/home/lenb/src/linux-acpi-test-2.6.3
into intel.com:/home/lenb/src/linux-acpi-test-2.6.4
parents
93229fee
849ee9b9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
51 additions
and
163 deletions
+51
-163
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/acpi/boot.c
+21
-0
arch/i386/kernel/bootflag.c
arch/i386/kernel/bootflag.c
+8
-162
include/linux/acpi.h
include/linux/acpi.h
+22
-1
No files found.
arch/i386/kernel/acpi/boot.c
View file @
9609c7e2
...
...
@@ -378,6 +378,25 @@ acpi_scan_rsdp (
return
0
;
}
static
int
__init
acpi_parse_sbf
(
unsigned
long
phys_addr
,
unsigned
long
size
)
{
struct
acpi_table_sbf
*
sb
;
if
(
!
phys_addr
||
!
size
)
return
-
EINVAL
;
sb
=
(
struct
acpi_table_sbf
*
)
__acpi_map_table
(
phys_addr
,
size
);
if
(
!
sb
)
{
printk
(
KERN_WARNING
PREFIX
"Unable to map SBF
\n
"
);
return
-
ENODEV
;
}
sbf_port
=
sb
->
sbf_cmos
;
/* Save CMOS port */
return
0
;
}
#ifdef CONFIG_HPET_TIMER
extern
unsigned
long
hpet_address
;
...
...
@@ -647,6 +666,8 @@ acpi_boot_init (void)
return
error
;
}
(
void
)
acpi_table_parse
(
ACPI_BOOT
,
acpi_parse_sbf
);
/*
* blacklist may disable ACPI entirely
*/
...
...
arch/i386/kernel/bootflag.c
View file @
9609c7e2
/*
* Implement 'Simple Boot Flag Specification 1.0'
*
* Implement 'Simple Boot Flag Specification 2.0'
*/
...
...
@@ -11,6 +10,7 @@
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/acpi.h>
#include <asm/io.h>
#include <linux/mc146818rtc.h>
...
...
@@ -23,56 +23,8 @@
#define SBF_PARITY (1<<7)
struct
sbf_boot
{
u8
sbf_signature
[
4
];
u32
sbf_len
;
u8
sbf_revision
__attribute
((
packed
));
u8
sbf_csum
__attribute
((
packed
));
u8
sbf_oemid
[
6
]
__attribute
((
packed
));
u8
sbf_oemtable
[
8
]
__attribute
((
packed
));
u8
sbf_revdata
[
4
]
__attribute
((
packed
));
u8
sbf_creator
[
4
]
__attribute
((
packed
));
u8
sbf_crearev
[
4
]
__attribute
((
packed
));
u8
sbf_cmos
__attribute
((
packed
));
u8
sbf_spare
[
3
]
__attribute
((
packed
));
};
static
int
sbf_port
__initdata
=
-
1
;
static
int
__init
sbf_struct_valid
(
unsigned
long
tptr
)
{
u8
*
ap
;
u8
v
;
unsigned
int
i
;
struct
sbf_boot
sb
;
memcpy_fromio
(
&
sb
,
(
void
*
)
tptr
,
sizeof
(
sb
));
if
(
sb
.
sbf_len
!=
40
&&
sb
.
sbf_len
!=
39
)
// 39 on IBM ThinkPad A21m, BIOS version 1.02b (KXET24WW; 2000-12-19).
return
0
;
ap
=
(
u8
*
)
&
sb
;
v
=
0
;
for
(
i
=
0
;
i
<
sb
.
sbf_len
;
i
++
)
v
+=*
ap
++
;
if
(
v
)
return
0
;
if
(
memcmp
(
sb
.
sbf_signature
,
"BOOT"
,
4
))
return
0
;
int
sbf_port
__initdata
=
-
1
;
/* set via acpi_boot_init() */
if
(
sb
.
sbf_len
==
39
)
printk
(
KERN_WARNING
"SBF: ACPI BOOT descriptor is wrong length (%d)
\n
"
,
sb
.
sbf_len
);
sbf_port
=
sb
.
sbf_cmos
;
/* Save CMOS port */
return
1
;
}
static
int
__init
parity
(
u8
v
)
{
...
...
@@ -96,7 +48,7 @@ static void __init sbf_write(u8 v)
if
(
!
parity
(
v
))
v
|=
SBF_PARITY
;
printk
(
KERN_INFO
"S
BF: Setting boot flags 0x%x
\n
"
,
v
);
printk
(
KERN_INFO
"S
imple Boot Flag 0x%x
\n
"
,
v
);
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
CMOS_WRITE
(
v
,
sbf_port
);
...
...
@@ -125,15 +77,15 @@ static int __init sbf_value_valid(u8 v)
return
1
;
}
static
void
__init
sbf_bootup
(
void
)
static
int
__init
sbf_init
(
void
)
{
u8
v
;
if
(
sbf_port
==
-
1
)
return
;
return
0
;
v
=
sbf_read
();
if
(
!
sbf_value_valid
(
v
))
printk
(
KERN_WARNING
"SBF: Simple boot flag value 0x%x read from CMOS RAM was invalid
\n
"
,
v
);
printk
(
KERN_WARNING
"Simple Boot Flag value 0x%x read from CMOS RAM was invalid
\n
"
,
v
);
v
&=
~
SBF_RESERVED
;
v
&=
~
SBF_BOOTING
;
v
&=
~
SBF_DIAG
;
...
...
@@ -141,112 +93,6 @@ static void __init sbf_bootup(void)
v
|=
SBF_PNPOS
;
#endif
sbf_write
(
v
);
}
static
int
__init
sbf_init
(
void
)
{
unsigned
int
i
;
void
*
rsdt
;
u32
rsdtlen
=
0
;
u32
rsdtbase
=
0
;
u8
sum
=
0
;
int
n
;
u8
*
p
;
for
(
i
=
0xE0000
;
i
<=
0xFFFE0
;
i
+=
16
)
{
p
=
phys_to_virt
(
i
);
if
(
memcmp
(
p
,
"RSD PTR "
,
8
))
continue
;
sum
=
0
;
for
(
n
=
0
;
n
<
20
;
n
++
)
sum
+=
p
[
n
];
if
(
sum
!=
0
)
continue
;
/* So it says RSD PTR and it checksums... */
/*
* Process the RDSP pointer
*/
rsdtbase
=
*
(
u32
*
)(
p
+
16
);
/*
* RSDT length is ACPI 2 only, for ACPI 1 we must map
* and remap.
*/
if
(
p
[
15
]
>
1
)
rsdtlen
=
*
(
u32
*
)(
p
+
20
);
else
rsdtlen
=
36
;
if
(
rsdtlen
<
36
||
rsdtlen
>
1024
)
continue
;
break
;
}
if
(
i
>
0xFFFE0
)
return
0
;
rsdt
=
ioremap
(
rsdtbase
,
rsdtlen
);
if
(
rsdt
==
0
)
return
0
;
i
=
readl
(
rsdt
+
4
);
/*
* Remap if needed
*/
if
(
i
>
rsdtlen
)
{
rsdtlen
=
i
;
iounmap
(
rsdt
);
rsdt
=
ioremap
(
rsdtbase
,
rsdtlen
);
if
(
rsdt
==
0
)
return
0
;
}
for
(
n
=
0
;
n
<
i
;
n
++
)
sum
+=
readb
(
rsdt
+
n
);
if
(
sum
)
{
iounmap
(
rsdt
);
return
0
;
}
/* Ok the RSDT checksums too */
for
(
n
=
36
;
n
+
3
<
i
;
n
+=
4
)
{
unsigned
long
rp
=
readl
(
rsdt
+
n
);
int
len
=
4096
;
if
(
rp
>
0xFFFFFFFFUL
-
len
)
len
=
0xFFFFFFFFUL
-
rp
;
/* Too close to the end!! */
if
(
len
<
20
)
continue
;
rp
=
(
unsigned
long
)
ioremap
(
rp
,
4096
);
if
(
rp
==
0
)
continue
;
if
(
sbf_struct_valid
(
rp
))
{
/* Found the BOOT table and processed it */
printk
(
KERN_INFO
"SBF: Simple Boot Flag extension found and enabled.
\n
"
);
}
iounmap
((
void
*
)
rp
);
}
iounmap
(
rsdt
);
sbf_bootup
();
return
0
;
}
...
...
include/linux/acpi.h
View file @
9609c7e2
...
...
@@ -232,9 +232,28 @@ struct acpi_table_hpet {
u8
page_protect
;
}
__attribute__
((
packed
));
/*
* Simple Boot Flags
* http://www.microsoft.com/whdc/hwdev/resources/specs/simp_bios.mspx
*/
struct
acpi_table_sbf
{
u8
sbf_signature
[
4
];
u32
sbf_len
;
u8
sbf_revision
;
u8
sbf_csum
;
u8
sbf_oemid
[
6
];
u8
sbf_oemtable
[
8
];
u8
sbf_revdata
[
4
];
u8
sbf_creator
[
4
];
u8
sbf_crearev
[
4
];
u8
sbf_cmos
;
u8
sbf_spare
[
3
];
}
__attribute__
((
packed
));
/*
* System Resource Affinity Table (SRAT)
*
see http://www.microsoft.com/hwdev/design/srat.htm
*
http://www.microsoft.com/whdc/hwdev/platform/proc/SRAT.mspx
*/
struct
acpi_table_srat
{
...
...
@@ -381,6 +400,8 @@ extern int acpi_mp_config;
extern
u32
pci_mmcfg_base_addr
;
extern
int
sbf_port
;
#else
/*!CONFIG_ACPI_BOOT*/
#define acpi_mp_config 0
...
...
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