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
63eac9ba
Commit
63eac9ba
authored
Jan 23, 2008
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Pull dmi-2.6.24 into release branch
parents
3645ca83
a1bd4e35
Changes
6
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
528 additions
and
47 deletions
+528
-47
drivers/acpi/blacklist.c
drivers/acpi/blacklist.c
+381
-0
drivers/acpi/osl.c
drivers/acpi/osl.c
+130
-43
drivers/firmware/dmi-id.c
drivers/firmware/dmi-id.c
+0
-2
drivers/firmware/dmi_scan.c
drivers/firmware/dmi_scan.c
+8
-0
include/linux/acpi.h
include/linux/acpi.h
+5
-2
include/linux/dmi.h
include/linux/dmi.h
+4
-0
No files found.
drivers/acpi/blacklist.c
View file @
63eac9ba
This diff is collapsed.
Click to expand it.
drivers/acpi/osl.c
View file @
63eac9ba
...
...
@@ -77,11 +77,55 @@ static struct workqueue_struct *kacpi_notify_wq;
#define OSI_STRING_LENGTH_MAX 64
/* arbitrary */
static
char
osi_additional_string
[
OSI_STRING_LENGTH_MAX
];
static
int
osi_linux
;
/* disable _OSI(Linux) by default */
/*
* "Ode to _OSI(Linux)"
*
* osi_linux -- Control response to BIOS _OSI(Linux) query.
*
* As Linux evolves, the features that it supports change.
* So an OSI string such as "Linux" is not specific enough
* to be useful across multiple versions of Linux. It
* doesn't identify any particular feature, interface,
* or even any particular version of Linux...
*
* Unfortunately, Linux-2.6.22 and earlier responded "yes"
* to a BIOS _OSI(Linux) query. When
* a reference mobile BIOS started using it, its use
* started to spread to many vendor platforms.
* As it is not supportable, we need to halt that spread.
*
* Today, most BIOS references to _OSI(Linux) are noise --
* they have no functional effect and are just dead code
* carried over from the reference BIOS.
*
* The next most common case is that _OSI(Linux) harms Linux,
* usually by causing the BIOS to follow paths that are
* not tested during Windows validation.
*
* Finally, there is a short list of platforms
* where OSI(Linux) benefits Linux.
*
* In Linux-2.6.23, OSI(Linux) is first disabled by default.
* DMI is used to disable the dmesg warning about OSI(Linux)
* on platforms where it is known to have no effect.
* But a dmesg warning remains for systems where
* we do not know if OSI(Linux) is good or bad for the system.
* DMI is also used to enable OSI(Linux) for the machines
* that are known to need it.
*
* BIOS writers should NOT query _OSI(Linux) on future systems.
* It will be ignored by default, and to get Linux to
* not ignore it will require a kernel source update to
* add a DMI entry, or a boot-time "acpi_osi=Linux" invocation.
*/
#define OSI_LINUX_ENABLE 0
#ifdef CONFIG_DMI
static
struct
__initdata
dmi_system_id
acpi_osl_dmi_table
[];
#endif
struct
osi_linux
{
unsigned
int
enable
:
1
;
unsigned
int
dmi
:
1
;
unsigned
int
cmdline
:
1
;
unsigned
int
known
:
1
;
}
osi_linux
=
{
OSI_LINUX_ENABLE
,
0
,
0
,
0
};
static
void
__init
acpi_request_region
(
struct
acpi_generic_address
*
addr
,
unsigned
int
length
,
char
*
desc
)
...
...
@@ -133,7 +177,6 @@ device_initcall(acpi_reserve_resources);
acpi_status
__init
acpi_os_initialize
(
void
)
{
dmi_check_system
(
acpi_osl_dmi_table
);
return
AE_OK
;
}
...
...
@@ -964,13 +1007,37 @@ static int __init acpi_os_name_setup(char *str)
__setup
(
"acpi_os_name="
,
acpi_os_name_setup
);
static
void
enable_osi_linux
(
int
enable
)
{
static
void
__init
set_osi_linux
(
unsigned
int
enable
)
{
if
(
osi_linux
.
enable
!=
enable
)
{
osi_linux
.
enable
=
enable
;
printk
(
KERN_NOTICE
PREFIX
"%sed _OSI(Linux)
\n
"
,
enable
?
"Add"
:
"Delet"
);
}
return
;
}
static
void
__init
acpi_cmdline_osi_linux
(
unsigned
int
enable
)
{
osi_linux
.
cmdline
=
1
;
/* cmdline set the default */
set_osi_linux
(
enable
);
return
;
}
void
__init
acpi_dmi_osi_linux
(
int
enable
,
const
struct
dmi_system_id
*
d
)
{
osi_linux
.
dmi
=
1
;
/* DMI knows that this box asks OSI(Linux) */
printk
(
KERN_NOTICE
PREFIX
"DMI detected: %s
\n
"
,
d
->
ident
);
if
(
enable
==
-
1
)
return
;
osi_linux
.
known
=
1
;
/* DMI knows which OSI(Linux) default needed */
if
(
osi_linux
!=
enable
)
printk
(
KERN_INFO
PREFIX
"%sabled _OSI(Linux)
\n
"
,
enable
?
"En"
:
"Dis"
);
set_osi_linux
(
enable
);
osi_linux
=
enable
;
return
;
}
...
...
@@ -987,12 +1054,12 @@ static int __init acpi_osi_setup(char *str)
printk
(
KERN_INFO
PREFIX
"_OSI method disabled
\n
"
);
acpi_gbl_create_osi_method
=
FALSE
;
}
else
if
(
!
strcmp
(
"!Linux"
,
str
))
{
enable_osi_linux
(
0
);
acpi_cmdline_osi_linux
(
0
);
/* !enable */
}
else
if
(
*
str
==
'!'
)
{
if
(
acpi_osi_invalidate
(
++
str
)
==
AE_OK
)
printk
(
KERN_INFO
PREFIX
"Deleted _OSI(%s)
\n
"
,
str
);
}
else
if
(
!
strcmp
(
"Linux"
,
str
))
{
enable_osi_linux
(
1
);
acpi_cmdline_osi_linux
(
1
);
/* enable */
}
else
if
(
*
osi_additional_string
==
'\0'
)
{
strncpy
(
osi_additional_string
,
str
,
OSI_STRING_LENGTH_MAX
);
printk
(
KERN_INFO
PREFIX
"Added _OSI(%s)
\n
"
,
str
);
...
...
@@ -1141,6 +1208,34 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
return
(
AE_OK
);
}
/**
* acpi_dmi_dump - dump DMI slots needed for blacklist entry
*
* Returns 0 on success
*/
int
acpi_dmi_dump
(
void
)
{
if
(
!
dmi_available
)
return
-
1
;
printk
(
KERN_NOTICE
PREFIX
"DMI System Vendor: %s
\n
"
,
dmi_get_slot
(
DMI_SYS_VENDOR
));
printk
(
KERN_NOTICE
PREFIX
"DMI Product Name: %s
\n
"
,
dmi_get_slot
(
DMI_PRODUCT_NAME
));
printk
(
KERN_NOTICE
PREFIX
"DMI Product Version: %s
\n
"
,
dmi_get_slot
(
DMI_PRODUCT_VERSION
));
printk
(
KERN_NOTICE
PREFIX
"DMI Board Name: %s
\n
"
,
dmi_get_slot
(
DMI_BOARD_NAME
));
printk
(
KERN_NOTICE
PREFIX
"DMI BIOS Vendor: %s
\n
"
,
dmi_get_slot
(
DMI_BIOS_VENDOR
));
printk
(
KERN_NOTICE
PREFIX
"DMI BIOS Date: %s
\n
"
,
dmi_get_slot
(
DMI_BIOS_DATE
));
return
0
;
}
/******************************************************************************
*
* FUNCTION: acpi_os_validate_interface
...
...
@@ -1160,13 +1255,29 @@ acpi_os_validate_interface (char *interface)
if
(
!
strncmp
(
osi_additional_string
,
interface
,
OSI_STRING_LENGTH_MAX
))
return
AE_OK
;
if
(
!
strcmp
(
"Linux"
,
interface
))
{
printk
(
KERN_WARNING
PREFIX
"System BIOS is requesting _OSI(Linux)
\n
"
);
printk
(
KERN_WARNING
PREFIX
"If
\"
acpi_osi=Linux
\"
works better,
\n
"
"Please send dmidecode "
"to linux-acpi@vger.kernel.org
\n
"
);
if
(
osi_linux
)
printk
(
KERN_NOTICE
PREFIX
"BIOS _OSI(Linux) query %s%s
\n
"
,
osi_linux
.
enable
?
"honored"
:
"ignored"
,
osi_linux
.
cmdline
?
" via cmdline"
:
osi_linux
.
dmi
?
" via DMI"
:
""
);
if
(
!
osi_linux
.
dmi
)
{
if
(
acpi_dmi_dump
())
printk
(
KERN_NOTICE
PREFIX
"[please extract dmidecode output]
\n
"
);
printk
(
KERN_NOTICE
PREFIX
"Please send DMI info above to "
"linux-acpi@vger.kernel.org
\n
"
);
}
if
(
!
osi_linux
.
known
&&
!
osi_linux
.
cmdline
)
{
printk
(
KERN_NOTICE
PREFIX
"If
\"
acpi_osi=%sLinux
\"
works better, "
"please notify linux-acpi@vger.kernel.org
\n
"
,
osi_linux
.
enable
?
"!"
:
""
);
}
if
(
osi_linux
.
enable
)
return
AE_OK
;
}
return
AE_SUPPORT
;
...
...
@@ -1198,28 +1309,4 @@ acpi_os_validate_address (
return
AE_OK
;
}
#ifdef CONFIG_DMI
static
int
dmi_osi_linux
(
const
struct
dmi_system_id
*
d
)
{
printk
(
KERN_NOTICE
"%s detected: enabling _OSI(Linux)
\n
"
,
d
->
ident
);
enable_osi_linux
(
1
);
return
0
;
}
static
struct
dmi_system_id
acpi_osl_dmi_table
[]
__initdata
=
{
/*
* Boxes that need _OSI(Linux)
*/
{
.
callback
=
dmi_osi_linux
,
.
ident
=
"Intel Napa CRB"
,
.
matches
=
{
DMI_MATCH
(
DMI_BOARD_VENDOR
,
"Intel Corporation"
),
DMI_MATCH
(
DMI_BOARD_NAME
,
"MPAD-MSAE Customer Reference Boards"
),
},
},
{}
};
#endif
/* CONFIG_DMI */
#endif
drivers/firmware/dmi-id.c
View file @
63eac9ba
...
...
@@ -173,8 +173,6 @@ static struct device *dmi_dev;
if (dmi_get_system_info(_field)) \
sys_dmi_attributes[i++] = &sys_dmi_##_name##_attr.dev_attr.attr;
extern
int
dmi_available
;
/* In a separate function to keep gcc 3.2 happy - do NOT merge this in
dmi_id_init! */
static
void
__init
dmi_id_init_attr_table
(
void
)
...
...
drivers/firmware/dmi_scan.c
View file @
63eac9ba
...
...
@@ -470,3 +470,11 @@ int dmi_get_year(int field)
return
year
;
}
/**
* dmi_get_slot - return dmi_ident[slot]
* @slot: index into dmi_ident[]
*/
char
*
dmi_get_slot
(
int
slot
)
{
return
(
dmi_ident
[
slot
]);
}
include/linux/acpi.h
View file @
63eac9ba
...
...
@@ -40,6 +40,7 @@
#include <acpi/acpi_drivers.h>
#include <acpi/acpi_numa.h>
#include <asm/acpi.h>
#include <linux/dmi.h>
#ifdef CONFIG_ACPI
...
...
@@ -192,7 +193,9 @@ extern int ec_transaction(u8 command,
#endif
/*CONFIG_ACPI_EC*/
extern
int
acpi_blacklisted
(
void
);
extern
void
acpi_bios_year
(
char
*
s
);
#ifdef CONFIG_DMI
extern
void
acpi_dmi_osi_linux
(
int
enable
,
const
struct
dmi_system_id
*
d
);
#endif
#ifdef CONFIG_ACPI_NUMA
int
acpi_get_pxm
(
acpi_handle
handle
);
...
...
@@ -226,5 +229,5 @@ static inline int acpi_boot_table_init(void)
return
0
;
}
#endif
/* CONFIG_ACPI */
#endif
/*
!
CONFIG_ACPI */
#endif
/*_LINUX_ACPI_H*/
include/linux/dmi.h
View file @
63eac9ba
...
...
@@ -78,6 +78,8 @@ extern const struct dmi_device * dmi_find_device(int type, const char *name,
extern
void
dmi_scan_machine
(
void
);
extern
int
dmi_get_year
(
int
field
);
extern
int
dmi_name_in_vendors
(
const
char
*
str
);
extern
int
dmi_available
;
extern
char
*
dmi_get_slot
(
int
slot
);
#else
...
...
@@ -87,6 +89,8 @@ static inline const struct dmi_device * dmi_find_device(int type, const char *na
const
struct
dmi_device
*
from
)
{
return
NULL
;
}
static
inline
int
dmi_get_year
(
int
year
)
{
return
0
;
}
static
inline
int
dmi_name_in_vendors
(
const
char
*
s
)
{
return
0
;
}
#define dmi_available 0
static
inline
char
*
dmi_get_slot
(
int
slot
)
{
return
NULL
;
}
#endif
...
...
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