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
Hide 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
...
...
@@ -3,6 +3,7 @@
*
* Check to see if the given machine has a known bad ACPI BIOS
* or if the BIOS is too old.
* Check given machine against acpi_osi_dmi_table[].
*
* Copyright (C) 2004 Len Brown <len.brown@intel.com>
* Copyright (C) 2002 Andy Grover <andrew.grover@intel.com>
...
...
@@ -50,6 +51,8 @@ struct acpi_blacklist_item {
u32
is_critical_error
;
};
static
struct
dmi_system_id
acpi_osi_dmi_table
[]
__initdata
;
/*
* POLICY: If *anything* doesn't work, put it on the blacklist.
* If they are critical errors, mark it critical, and abort driver load.
...
...
@@ -165,5 +168,383 @@ int __init acpi_blacklisted(void)
blacklisted
+=
blacklist_by_year
();
dmi_check_system
(
acpi_osi_dmi_table
);
return
blacklisted
;
}
#ifdef CONFIG_DMI
static
int
__init
dmi_enable_osi_linux
(
const
struct
dmi_system_id
*
d
)
{
acpi_dmi_osi_linux
(
1
,
d
);
/* enable */
return
0
;
}
static
int
__init
dmi_disable_osi_linux
(
const
struct
dmi_system_id
*
d
)
{
acpi_dmi_osi_linux
(
0
,
d
);
/* disable */
return
0
;
}
static
int
__init
dmi_unknown_osi_linux
(
const
struct
dmi_system_id
*
d
)
{
acpi_dmi_osi_linux
(
-
1
,
d
);
/* unknown */
return
0
;
}
/*
* Most BIOS that invoke OSI(Linux) do nothing with it.
* But some cause Linux to break.
* Only a couple use it to make Linux run better.
*
* Thus, Linux should continue to disable OSI(Linux) by default,
* should continue to discourage BIOS writers from using it, and
* should whitelist the few existing systems that require it.
*
* If it appears clear a vendor isn't using OSI(Linux)
* for anything constructive, blacklist them by name to disable
* unnecessary dmesg warnings on all of their products.
*/
static
struct
dmi_system_id
acpi_osi_dmi_table
[]
__initdata
=
{
/*
* Disable OSI(Linux) warnings on all "Acer, inc."
*
* _OSI(Linux) disables the latest Windows BIOS code:
* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"),
* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"),
* DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"),
* _OSI(Linux) effect unknown:
* DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"),
*/
{
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Acer, inc."
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Acer, inc."
),
},
},
/*
* Disable OSI(Linux) warnings on all "Acer"
*
* _OSI(Linux) effect unknown:
* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"),
* DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"),
* DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 6460"),
* DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 7510"),
* DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5220"),
*/
{
.
callback
=
dmi_unknown_osi_linux
,
.
ident
=
"Acer"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Acer"
),
},
},
/*
* Disable OSI(Linux) warnings on all "Apple Computer, Inc."
*
* _OSI(Linux) confirmed to be a NOP:
* DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
* DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"),
* DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"),
* _OSI(Linux) effect unknown:
* DMI_MATCH(DMI_PRODUCT_NAME, "MacPro2,1"),
* DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"),
* DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"),
*/
{
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Apple"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Apple Computer, Inc."
),
},
},
/*
* Disable OSI(Linux) warnings on all "BenQ"
*
* _OSI(Linux) confirmed to be a NOP:
* DMI_MATCH(DMI_PRODUCT_NAME, "Joybook S31"),
*/
{
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"BenQ"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"BenQ"
),
},
},
/*
* Disable OSI(Linux) warnings on all "Clevo Co."
*
* _OSI(Linux) confirmed to be a NOP:
* DMI_MATCH(DMI_PRODUCT_NAME, "M570RU"),
*/
{
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Clevo"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Clevo Co."
),
},
},
/*
* Disable OSI(Linux) warnings on all "COMPAL"
*
* _OSI(Linux) confirmed to be a NOP:
* DMI_MATCH(DMI_BOARD_NAME, "HEL8X"),
* _OSI(Linux) unknown effect:
* DMI_MATCH(DMI_BOARD_NAME, "IFL91"),
*/
{
.
callback
=
dmi_unknown_osi_linux
,
.
ident
=
"Compal"
,
.
matches
=
{
DMI_MATCH
(
DMI_BIOS_VENDOR
,
"COMPAL"
),
},
},
{
/* OSI(Linux) touches USB, breaks suspend to disk */
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Dell Dimension 5150"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Dell DM051"
),
},
},
{
/* OSI(Linux) is a NOP */
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Dell"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Inspiron 1501"
),
},
},
{
/* OSI(Linux) effect unknown */
.
callback
=
dmi_unknown_osi_linux
,
.
ident
=
"Dell"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Latitude D830"
),
},
},
{
/* OSI(Linux) effect unknown */
.
callback
=
dmi_unknown_osi_linux
,
.
ident
=
"Dell"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"OptiPlex GX620"
),
},
},
{
/* OSI(Linux) effect unknown */
.
callback
=
dmi_unknown_osi_linux
,
.
ident
=
"Dell"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"PowerEdge 1900"
),
},
},
{
/* OSI(Linux) touches USB */
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Dell"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Precision WorkStation 390"
),
},
},
{
/* OSI(Linux) is a NOP */
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Dell Vostro 1000"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Vostro 1000"
),
},
},
{
/* OSI(Linux) effect unknown */
.
callback
=
dmi_unknown_osi_linux
,
.
ident
=
"Dell"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"PowerEdge SC440"
),
},
},
{
/* OSI(Linux) effect unknown */
.
callback
=
dmi_unknown_osi_linux
,
.
ident
=
"Dialogue Flybook V5"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dialogue Technology Corporation"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Flybook V5"
),
},
},
/*
* Disable OSI(Linux) warnings on all "FUJITSU SIEMENS"
*
* _OSI(Linux) disables latest Windows BIOS code:
* DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2510"),
* _OSI(Linux) confirmed to be a NOP:
* DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1536"),
* DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1556"),
* DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 1546"),
* _OSI(Linux) unknown effect:
* DMI_MATCH(DMI_PRODUCT_NAME, "Amilo M1425"),
* DMI_MATCH(DMI_PRODUCT_NAME, "Amilo Si 1520"),
* DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"),
*/
{
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Fujitsu Siemens"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"FUJITSU SIEMENS"
),
},
},
/*
* Disable OSI(Linux) warnings on all "Hewlett-Packard"
*
* _OSI(Linux) confirmed to be a NOP:
* .ident = "HP Pavilion tx 1000"
* DMI_MATCH(DMI_BOARD_NAME, "30BF"),
* .ident = "HP Pavilion dv2000"
* DMI_MATCH(DMI_BOARD_NAME, "30B5"),
* .ident = "HP Pavilion dv5000",
* DMI_MATCH(DMI_BOARD_NAME, "30A7"),
* .ident = "HP Pavilion dv6300 30BC",
* DMI_MATCH(DMI_BOARD_NAME, "30BC"),
* .ident = "HP Pavilion dv6000",
* DMI_MATCH(DMI_BOARD_NAME, "30B7"),
* DMI_MATCH(DMI_BOARD_NAME, "30B8"),
* .ident = "HP Pavilion dv9000",
* DMI_MATCH(DMI_BOARD_NAME, "30B9"),
* .ident = "HP Pavilion dv9500",
* DMI_MATCH(DMI_BOARD_NAME, "30CB"),
* .ident = "HP/Compaq Presario C500",
* DMI_MATCH(DMI_BOARD_NAME, "30C6"),
* .ident = "HP/Compaq Presario F500",
* DMI_MATCH(DMI_BOARD_NAME, "30D3"),
* _OSI(Linux) unknown effect:
* .ident = "HP Pavilion dv6500",
* DMI_MATCH(DMI_BOARD_NAME, "30D0"),
*/
{
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Hewlett-Packard"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Hewlett-Packard"
),
},
},
/*
* Lenovo has a mix of systems OSI(Linux) situations
* and thus we can not wildcard the vendor.
*
* _OSI(Linux) helps sound
* DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad R61"),
* DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T61"),
* _OSI(Linux) is a NOP:
* DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
*/
{
.
callback
=
dmi_enable_osi_linux
,
.
ident
=
"Lenovo ThinkPad R61"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_VERSION
,
"ThinkPad R61"
),
},
},
{
.
callback
=
dmi_enable_osi_linux
,
.
ident
=
"Lenovo ThinkPad T61"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_VERSION
,
"ThinkPad T61"
),
},
},
{
.
callback
=
dmi_unknown_osi_linux
,
.
ident
=
"Lenovo 3000 V100"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_VERSION
,
"LENOVO3000 V100"
),
},
},
{
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Lenovo 3000 N100"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_VERSION
,
"3000 N100"
),
},
},
/*
* Disable OSI(Linux) warnings on all "LG Electronics"
*
* _OSI(Linux) confirmed to be a NOP:
* DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"),
*/
{
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"LG"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LG Electronics"
),
},
},
/* NEC - OSI(Linux) effect unknown */
{
.
callback
=
dmi_unknown_osi_linux
,
.
ident
=
"NEC VERSA M360"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"NEC Computers SAS"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"NEC VERSA M360"
),
},
},
/*
* Disable OSI(Linux) warnings on all "Samsung Electronics"
*
* OSI(Linux) disables PNP0C32 and other BIOS code for Windows:
* DMI_MATCH(DMI_PRODUCT_NAME, "R40P/R41P"),
* DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"),
*/
{
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Samsung"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"SAMSUNG ELECTRONICS CO., LTD."
),
},
},
/*
* Disable OSI(Linux) warnings on all "Sony Corporation"
*
* _OSI(Linux) is a NOP:
* DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ650N"),
* DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ38GP_C"),
* DMI_MATCH(DMI_PRODUCT_NAME, "VGN-TZ21MN_N"),
* _OSI(Linux) unknown effect:
* DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ11M"),
*/
{
.
callback
=
dmi_unknown_osi_linux
,
.
ident
=
"Sony"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Sony Corporation"
),
},
},
/*
* Disable OSI(Linux) warnings on all "TOSHIBA"
*
* _OSI(Linux) breaks sound (bugzilla 7787):
* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P100"),
* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P105"),
* _OSI(Linux) is a NOP:
* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A100"),
* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A210"),
* _OSI(Linux) unknown effect:
* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A135"),
* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A200"),
* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P205"),
* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite U305"),
*/
{
.
callback
=
dmi_disable_osi_linux
,
.
ident
=
"Toshiba"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"TOSHIBA"
),
},
},
{}
};
#endif
/* CONFIG_DMI */
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
;
}
if
(
osi_linux
!=
enable
)
printk
(
KERN_INFO
PREFIX
"%sabled _OSI(Linux)
\n
"
,
enable
?
"En"
:
"Dis"
);
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 */
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