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
1d5b953d
Commit
1d5b953d
authored
Mar 26, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux-acpi.bkbits.net/linux-acpi-release-2.6.5
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
75a8032a
5f10ea14
Changes
29
Hide whitespace changes
Inline
Side-by-side
Showing
29 changed files
with
537 additions
and
201 deletions
+537
-201
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/acpi/boot.c
+11
-7
drivers/acpi/ec.c
drivers/acpi/ec.c
+2
-2
drivers/acpi/events/evgpe.c
drivers/acpi/events/evgpe.c
+5
-6
drivers/acpi/events/evgpeblk.c
drivers/acpi/events/evgpeblk.c
+209
-33
drivers/acpi/events/evmisc.c
drivers/acpi/events/evmisc.c
+22
-21
drivers/acpi/events/evxfevnt.c
drivers/acpi/events/evxfevnt.c
+19
-6
drivers/acpi/executer/excreate.c
drivers/acpi/executer/excreate.c
+14
-2
drivers/acpi/executer/exdump.c
drivers/acpi/executer/exdump.c
+1
-0
drivers/acpi/executer/exresnte.c
drivers/acpi/executer/exresnte.c
+3
-2
drivers/acpi/executer/exstoren.c
drivers/acpi/executer/exstoren.c
+1
-0
drivers/acpi/hardware/hwgpe.c
drivers/acpi/hardware/hwgpe.c
+57
-41
drivers/acpi/hardware/hwsleep.c
drivers/acpi/hardware/hwsleep.c
+17
-5
drivers/acpi/namespace/nsaccess.c
drivers/acpi/namespace/nsaccess.c
+9
-0
drivers/acpi/namespace/nsdump.c
drivers/acpi/namespace/nsdump.c
+1
-0
drivers/acpi/namespace/nseval.c
drivers/acpi/namespace/nseval.c
+9
-0
drivers/acpi/namespace/nssearch.c
drivers/acpi/namespace/nssearch.c
+6
-0
drivers/acpi/namespace/nsutils.c
drivers/acpi/namespace/nsutils.c
+1
-1
drivers/acpi/namespace/nsxfeval.c
drivers/acpi/namespace/nsxfeval.c
+17
-9
drivers/acpi/osl.c
drivers/acpi/osl.c
+21
-0
drivers/acpi/pci_link.c
drivers/acpi/pci_link.c
+13
-5
drivers/acpi/resources/rsaddr.c
drivers/acpi/resources/rsaddr.c
+7
-6
drivers/acpi/utilities/utglobal.c
drivers/acpi/utilities/utglobal.c
+24
-18
drivers/acpi/utilities/utmisc.c
drivers/acpi/utilities/utmisc.c
+2
-3
include/acpi/acconfig.h
include/acpi/acconfig.h
+1
-1
include/acpi/acglobal.h
include/acpi/acglobal.h
+2
-0
include/acpi/achware.h
include/acpi/achware.h
+2
-2
include/acpi/aclocal.h
include/acpi/aclocal.h
+7
-0
include/acpi/actypes.h
include/acpi/actypes.h
+53
-31
include/acpi/acutils.h
include/acpi/acutils.h
+1
-0
No files found.
arch/i386/kernel/acpi/boot.c
View file @
1d5b953d
...
...
@@ -277,7 +277,7 @@ acpi_parse_ioapic (
* Parse Interrupt Source Override for the ACPI SCI
*/
static
void
acpi_
parse_sci_int_src_ovr
(
u8
bus_irq
,
u16
polarity
,
u16
trigger
,
u32
global_irq
)
acpi_
sci_ioapic_setup
(
u32
gsi
,
u16
polarity
,
u16
trigger
)
{
if
(
trigger
==
0
)
/* compatible SCI trigger is level */
trigger
=
3
;
...
...
@@ -292,13 +292,18 @@ acpi_parse_sci_int_src_ovr(u8 bus_irq, u16 polarity, u16 trigger, u32 global_irq
if
(
acpi_sci_flags
.
polarity
)
polarity
=
acpi_sci_flags
.
polarity
;
mp_override_legacy_irq
(
bus_irq
,
polarity
,
trigger
,
global_irq
);
/*
* mp_config_acpi_legacy_irqs() already setup IRQs < 16
* If GSI is < 16, this will update its flags,
* else it will create a new mp_irqs[] entry.
*/
mp_override_legacy_irq
(
gsi
,
polarity
,
trigger
,
gsi
);
/*
* stash over-ride to indicate we've been here
* and for later update of acpi_fadt
*/
acpi_sci_override_gsi
=
g
lobal_irq
;
acpi_sci_override_gsi
=
g
si
;
return
;
}
...
...
@@ -315,9 +320,8 @@ acpi_parse_int_src_ovr (
acpi_table_print_madt_entry
(
header
);
if
(
intsrc
->
bus_irq
==
acpi_fadt
.
sci_int
)
{
acpi_parse_sci_int_src_ovr
(
intsrc
->
bus_irq
,
intsrc
->
flags
.
polarity
,
intsrc
->
flags
.
trigger
,
intsrc
->
global_irq
);
acpi_sci_ioapic_setup
(
intsrc
->
global_irq
,
intsrc
->
flags
.
polarity
,
intsrc
->
flags
.
trigger
);
return
0
;
}
...
...
@@ -660,7 +664,7 @@ acpi_parse_madt_ioapic_entries(void)
* pretend we got one so we can set the SCI flags.
*/
if
(
!
acpi_sci_override_gsi
)
acpi_
parse_sci_int_src_ovr
(
acpi_fadt
.
sci_int
,
0
,
0
,
acpi_fadt
.
sci_int
);
acpi_
sci_ioapic_setup
(
acpi_fadt
.
sci_int
,
0
,
0
);
count
=
acpi_table_parse_madt
(
ACPI_MADT_NMI_SRC
,
acpi_parse_nmi_src
,
NR_IRQ_VECTORS
);
if
(
count
<
0
)
{
...
...
drivers/acpi/ec.c
View file @
1d5b953d
...
...
@@ -719,7 +719,7 @@ acpi_ec_start (
* Install GPE handler
*/
status
=
acpi_install_gpe_handler
(
NULL
,
ec
->
gpe_bit
,
ACPI_
EVENT
_EDGE_TRIGGERED
,
&
acpi_ec_gpe_handler
,
ec
);
ACPI_
GPE
_EDGE_TRIGGERED
,
&
acpi_ec_gpe_handler
,
ec
);
if
(
ACPI_FAILURE
(
status
))
{
return_VALUE
(
-
ENODEV
);
}
...
...
@@ -803,7 +803,7 @@ acpi_ec_ecdt_probe (void)
* Install GPE handler
*/
status
=
acpi_install_gpe_handler
(
NULL
,
ec_ecdt
->
gpe_bit
,
ACPI_
EVENT
_EDGE_TRIGGERED
,
&
acpi_ec_gpe_handler
,
ACPI_
GPE
_EDGE_TRIGGERED
,
&
acpi_ec_gpe_handler
,
ec_ecdt
);
if
(
ACPI_FAILURE
(
status
))
{
goto
error
;
...
...
drivers/acpi/events/evgpe.c
View file @
1d5b953d
...
...
@@ -99,9 +99,8 @@ acpi_ev_get_gpe_event_info (
return
(
NULL
);
}
/*
* A Non-null gpe_device means this is a GPE Block Device.
*/
/* A Non-NULL gpe_device means this is a GPE Block Device */
obj_desc
=
acpi_ns_get_attached_object
((
struct
acpi_namespace_node
*
)
gpe_device
);
if
(
!
obj_desc
||
!
obj_desc
->
device
.
gpe_block
)
{
...
...
@@ -297,7 +296,7 @@ acpi_ev_asynch_execute_gpe_method (
}
}
if
(
local_gpe_event_info
.
flags
&
ACPI_EVENT
_LEVEL_TRIGGERED
)
{
if
(
(
local_gpe_event_info
.
flags
&
ACPI_GPE_XRUPT_TYPE_MASK
)
==
ACPI_GPE
_LEVEL_TRIGGERED
)
{
/*
* GPE is level-triggered, we clear the GPE status bit after handling
* the event.
...
...
@@ -346,7 +345,7 @@ acpi_ev_gpe_dispatch (
* If edge-triggered, clear the GPE status bit now. Note that
* level-triggered events are cleared after the GPE is serviced.
*/
if
(
gpe_event_info
->
flags
&
ACPI_EVENT
_EDGE_TRIGGERED
)
{
if
(
(
gpe_event_info
->
flags
&
ACPI_GPE_XRUPT_TYPE_MASK
)
==
ACPI_GPE
_EDGE_TRIGGERED
)
{
status
=
acpi_hw_clear_gpe
(
gpe_event_info
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_REPORT_ERROR
((
"acpi_ev_gpe_dispatch: Unable to clear GPE[%2X]
\n
"
,
...
...
@@ -369,7 +368,7 @@ acpi_ev_gpe_dispatch (
/* It is now safe to clear level-triggered events. */
if
(
gpe_event_info
->
flags
&
ACPI_EVENT
_LEVEL_TRIGGERED
)
{
if
(
(
gpe_event_info
->
flags
&
ACPI_GPE_XRUPT_TYPE_MASK
)
==
ACPI_GPE
_LEVEL_TRIGGERED
)
{
status
=
acpi_hw_clear_gpe
(
gpe_event_info
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_REPORT_ERROR
((
...
...
drivers/acpi/events/evgpeblk.c
View file @
1d5b953d
...
...
@@ -168,11 +168,11 @@ acpi_ev_walk_gpe_list (
* information for quick lookup during GPE dispatch
*
* The name of each GPE control method is of the form:
*
"_Lnn" or "_Enn
"
*
Where:
*
L - means that the GPE is level triggered
*
E - means that the GPE is edge triggered
*
nn
- is the GPE number [in HEX]
*
"_Lxx" or "_Exx
"
* Where:
* L - means that the GPE is level triggered
* E - means that the GPE is edge triggered
*
xx
- is the GPE number [in HEX]
*
******************************************************************************/
...
...
@@ -188,36 +188,41 @@ acpi_ev_save_method_info (
u32
gpe_number
;
char
name
[
ACPI_NAME_SIZE
+
1
];
u8
type
;
acpi_status
status
;
ACPI_FUNCTION_TRACE
(
"ev_save_method_info"
);
/* Extract the name from the object and convert to a string */
/*
* _Lxx and _Exx GPE method support
*
* 1) Extract the name from the object and convert to a string
*/
ACPI_MOVE_32_TO_32
(
name
,
&
((
struct
acpi_namespace_node
*
)
obj_handle
)
->
name
.
integer
);
name
[
ACPI_NAME_SIZE
]
=
0
;
/*
* Edge/Level determination is based on the 2nd character
* of the method name
* 2) Edge/Level determination is based on the 2nd character
* of the method name
*
* NOTE: Default GPE type is RUNTIME. May be changed later to WAKE if a
* _PRW object is found that points to this GPE.
*/
switch
(
name
[
1
])
{
case
'L'
:
type
=
ACPI_
EVENT_LEVEL_TRIGGERED
;
type
=
ACPI_
GPE_LEVEL_TRIGGERED
|
ACPI_GPE_TYPE_RUNTIME
;
break
;
case
'E'
:
type
=
ACPI_
EVENT_EDGE_TRIGGERED
;
type
=
ACPI_
GPE_EDGE_TRIGGERED
|
ACPI_GPE_TYPE_RUNTIME
;
break
;
default:
/* Unknown method type, just ignore it! */
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Unknown GPE method type: %s (name not of form _L
nn or _Enn
)
\n
"
,
"Unknown GPE method type: %s (name not of form _L
xx or _Exx
)
\n
"
,
name
));
return_ACPI_STATUS
(
AE_OK
);
}
...
...
@@ -229,7 +234,7 @@ acpi_ev_save_method_info (
/* Conversion failed; invalid method, just ignore it */
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Could not extract GPE number from name: %s (name is not of form _L
nn or _Enn
)
\n
"
,
"Could not extract GPE number from name: %s (name is not of form _L
xx or _Exx
)
\n
"
,
name
));
return_ACPI_STATUS
(
AE_OK
);
}
...
...
@@ -255,13 +260,6 @@ acpi_ev_save_method_info (
gpe_event_info
->
flags
=
type
;
gpe_event_info
->
method_node
=
(
struct
acpi_namespace_node
*
)
obj_handle
;
/* Enable the GPE (SCIs should be disabled at this point) */
status
=
acpi_hw_enable_gpe
(
gpe_event_info
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
ACPI_DEBUG_PRINT
((
ACPI_DB_LOAD
,
"Registered GPE method %s as GPE number 0x%.2X
\n
"
,
name
,
gpe_number
));
...
...
@@ -269,6 +267,122 @@ acpi_ev_save_method_info (
}
/*******************************************************************************
*
* FUNCTION: acpi_ev_get_gpe_type
*
* PARAMETERS: Callback from walk_namespace
*
* RETURN: Status
*
* DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a
* Device. Run the _PRW method. If present, extract the GPE
* number and mark the GPE as a WAKE GPE.
*
******************************************************************************/
static
acpi_status
acpi_ev_get_gpe_type
(
acpi_handle
obj_handle
,
u32
level
,
void
*
info
,
void
**
return_value
)
{
struct
acpi_gpe_walk_info
*
gpe_info
=
(
void
*
)
info
;
struct
acpi_namespace_node
*
gpe_device
;
struct
acpi_gpe_block_info
*
gpe_block
;
struct
acpi_namespace_node
*
target_gpe_device
;
struct
acpi_gpe_event_info
*
gpe_event_info
;
union
acpi_operand_object
*
pkg_desc
;
union
acpi_operand_object
*
obj_desc
;
u32
gpe_number
;
acpi_status
status
;
ACPI_FUNCTION_TRACE
(
"ev_get_gpe_type"
);
/* Check for a _PRW method under this device */
status
=
acpi_ut_evaluate_object
(
obj_handle
,
METHOD_NAME__PRW
,
ACPI_BTYPE_PACKAGE
,
&
pkg_desc
);
if
(
status
==
AE_NOT_FOUND
)
{
return_ACPI_STATUS
(
AE_OK
);
}
else
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
/* The returned _PRW package must have at least two elements */
if
(
pkg_desc
->
package
.
count
<
2
)
{
goto
cleanup
;
}
/* Extract pointers from the input context */
gpe_device
=
gpe_info
->
gpe_device
;
gpe_block
=
gpe_info
->
gpe_block
;
/*
* The _PRW object must return a package, we are only interested
* in the first element
*/
obj_desc
=
pkg_desc
->
package
.
elements
[
0
];
if
(
ACPI_GET_OBJECT_TYPE
(
obj_desc
)
==
ACPI_TYPE_INTEGER
)
{
/* Use FADT-defined GPE device (from definition of _PRW) */
target_gpe_device
=
acpi_gbl_fadt_gpe_device
;
/* Integer is the GPE number in the FADT described GPE blocks */
gpe_number
=
(
u32
)
obj_desc
->
integer
.
value
;
}
else
if
(
ACPI_GET_OBJECT_TYPE
(
obj_desc
)
==
ACPI_TYPE_PACKAGE
)
{
/* Package contains a GPE reference and GPE number within a GPE block */
if
((
obj_desc
->
package
.
count
<
2
)
||
(
ACPI_GET_OBJECT_TYPE
(
obj_desc
->
package
.
elements
[
0
])
!=
ACPI_TYPE_LOCAL_REFERENCE
)
||
(
ACPI_GET_OBJECT_TYPE
(
obj_desc
->
package
.
elements
[
1
])
!=
ACPI_TYPE_INTEGER
))
{
goto
cleanup
;
}
/* Get GPE block reference and decode */
target_gpe_device
=
obj_desc
->
package
.
elements
[
0
]
->
reference
.
node
;
gpe_number
=
(
u32
)
obj_desc
->
package
.
elements
[
1
]
->
integer
.
value
;
}
else
{
/* Unknown type, just ignore it */
goto
cleanup
;
}
/*
* Is this GPE within this block?
*
* TRUE iff these conditions are true:
* 1) The GPE devices match.
* 2) The GPE index(number) is within the range of the Gpe Block
* associated with the GPE device.
*/
if
((
gpe_device
==
target_gpe_device
)
&&
(
gpe_number
>=
gpe_block
->
block_base_number
)
&&
(
gpe_number
<
gpe_block
->
block_base_number
+
(
gpe_block
->
register_count
*
8
)))
{
/* Mark GPE for WAKE but DISABLED (even for wake) */
gpe_event_info
=
&
gpe_block
->
event_info
[
gpe_number
-
gpe_block
->
block_base_number
];
gpe_event_info
->
flags
|=
ACPI_GPE_TYPE_WAKE
;
}
cleanup:
acpi_ut_remove_reference
(
pkg_desc
);
return_ACPI_STATUS
(
status
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ev_get_gpe_xrupt_block
...
...
@@ -695,8 +809,13 @@ acpi_ev_create_gpe_block (
struct
acpi_gpe_block_info
**
return_gpe_block
)
{
struct
acpi_gpe_block_info
*
gpe_block
;
struct
acpi_gpe_event_info
*
gpe_event_info
;
acpi_native_uint
i
;
acpi_native_uint
j
;
u32
wake_gpe_count
;
u32
gpe_enabled_count
;
acpi_status
status
;
struct
acpi_gpe_walk_info
gpe_info
;
ACPI_FUNCTION_TRACE
(
"ev_create_gpe_block"
);
...
...
@@ -737,7 +856,8 @@ acpi_ev_create_gpe_block (
/* Dump info about this GPE block */
ACPI_DEBUG_PRINT
((
ACPI_DB_INIT
,
"GPE %02d to %02d [%4.4s] %d regs at %8.8X%8.8X on int %d
\n
"
,
ACPI_DEBUG_PRINT
((
ACPI_DB_INIT
,
"GPE %02d to %02d [%4.4s] %d regs at %8.8X%8.8X on int %d
\n
"
,
gpe_block
->
block_base_number
,
(
u32
)
(
gpe_block
->
block_base_number
+
((
gpe_block
->
register_count
*
ACPI_GPE_REGISTER_WIDTH
)
-
1
)),
...
...
@@ -752,6 +872,58 @@ acpi_ev_create_gpe_block (
ACPI_UINT32_MAX
,
ACPI_NS_WALK_NO_UNLOCK
,
acpi_ev_save_method_info
,
gpe_block
,
NULL
);
/*
* Runtime option: Should Wake GPEs be enabled at runtime? The default is
* No,they should only be enabled just as the machine goes to sleep.
*/
if
(
acpi_gbl_leave_wake_gpes_disabled
)
{
/*
* Differentiate RUNTIME vs WAKE GPEs, via the _PRW control methods. (Each
* GPE that has one or more _PRWs that reference it is by definition a
* WAKE GPE and will not be enabled while the machine is running.)
*/
gpe_info
.
gpe_block
=
gpe_block
;
gpe_info
.
gpe_device
=
gpe_device
;
status
=
acpi_ns_walk_namespace
(
ACPI_TYPE_DEVICE
,
ACPI_ROOT_OBJECT
,
ACPI_UINT32_MAX
,
ACPI_NS_WALK_UNLOCK
,
acpi_ev_get_gpe_type
,
&
gpe_info
,
NULL
);
}
/*
* Enable all GPEs in this block that are 1) "runtime" GPEs, and 2) have
* a corresponding _Lxx or _Exx method. All other GPEs must be enabled via
* the acpi_enable_gpe() external interface.
*/
wake_gpe_count
=
0
;
gpe_enabled_count
=
0
;
for
(
i
=
0
;
i
<
gpe_block
->
register_count
;
i
++
)
{
for
(
j
=
0
;
j
<
8
;
j
++
)
{
/* Get the info block for this particular GPE */
gpe_event_info
=
&
gpe_block
->
event_info
[(
i
*
ACPI_GPE_REGISTER_WIDTH
)
+
j
];
if
((
gpe_event_info
->
method_node
)
&&
((
gpe_event_info
->
flags
&
ACPI_GPE_TYPE_MASK
)
==
ACPI_GPE_TYPE_RUNTIME
))
{
/* Enable this GPE, it is 1) RUNTIME and 2) has an _Lxx or _Exx method */
status
=
acpi_hw_enable_gpe
(
gpe_event_info
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
gpe_enabled_count
++
;
}
if
((
gpe_event_info
->
flags
&
ACPI_GPE_TYPE_MASK
)
==
ACPI_GPE_TYPE_WAKE
)
{
wake_gpe_count
++
;
}
}
}
ACPI_DEBUG_PRINT
((
ACPI_DB_INIT
,
"Found %u Wake, Enabled %u Runtime GPEs in this block
\n
"
,
wake_gpe_count
,
gpe_enabled_count
));
/* Return the new block */
if
(
return_gpe_block
)
{
...
...
@@ -775,27 +947,25 @@ acpi_ev_create_gpe_block (
******************************************************************************/
acpi_status
acpi_ev_gpe_initialize
(
void
)
acpi_ev_gpe_initialize
(
void
)
{
u32
register_count0
=
0
;
u32
register_count1
=
0
;
u32
gpe_number_max
=
0
;
acpi_handle
gpe_device
;
acpi_status
status
;
ACPI_FUNCTION_TRACE
(
"ev_gpe_initialize"
);
/* Get a handle to the predefined _GPE object */
status
=
acpi_get_handle
(
NULL
,
"
\\
_GPE"
,
&
gpe_device
);
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
/*
* Initialize the GPE Block
s
defined in the FADT
* Initialize the GPE Block
(s)
defined in the FADT
*
* Why the GPE register block lengths are divided by 2: From the ACPI Spec,
* section "General-Purpose Event Registers", we have:
...
...
@@ -829,8 +999,9 @@ acpi_ev_gpe_initialize (void)
/* Install GPE Block 0 */
status
=
acpi_ev_create_gpe_block
(
gpe_device
,
&
acpi_gbl_FADT
->
xgpe0_blk
,
status
=
acpi_ev_create_gpe_block
(
acpi_gbl_fadt_
gpe_device
,
&
acpi_gbl_FADT
->
xgpe0_blk
,
register_count0
,
0
,
acpi_gbl_FADT
->
sci_int
,
&
acpi_gbl_gpe_fadt_blocks
[
0
]);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_REPORT_ERROR
((
"Could not create GPE Block 0, %s
\n
"
,
...
...
@@ -861,9 +1032,10 @@ acpi_ev_gpe_initialize (void)
else
{
/* Install GPE Block 1 */
status
=
acpi_ev_create_gpe_block
(
gpe_device
,
&
acpi_gbl_FADT
->
xgpe1_blk
,
status
=
acpi_ev_create_gpe_block
(
acpi_gbl_fadt_
gpe_device
,
&
acpi_gbl_FADT
->
xgpe1_blk
,
register_count1
,
acpi_gbl_FADT
->
gpe1_base
,
acpi_gbl_FADT
->
sci_int
,
&
acpi_gbl_gpe_fadt_blocks
[
1
]);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_REPORT_ERROR
((
"Could not create GPE Block 1, %s
\n
"
,
...
...
@@ -885,7 +1057,8 @@ acpi_ev_gpe_initialize (void)
/* GPEs are not required by ACPI, this is OK */
ACPI_REPORT_INFO
((
"There are no GPE blocks defined in the FADT
\n
"
));
return_ACPI_STATUS
(
AE_OK
);
status
=
AE_OK
;
goto
cleanup
;
}
/* Check for Max GPE number out-of-range */
...
...
@@ -893,9 +1066,12 @@ acpi_ev_gpe_initialize (void)
if
(
gpe_number_max
>
ACPI_GPE_MAX
)
{
ACPI_REPORT_ERROR
((
"Maximum GPE number from FADT is too large: 0x%X
\n
"
,
gpe_number_max
));
return_ACPI_STATUS
(
AE_BAD_VALUE
);
status
=
AE_BAD_VALUE
;
goto
cleanup
;
}
cleanup:
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
return_ACPI_STATUS
(
AE_OK
);
}
...
...
drivers/acpi/events/evmisc.c
View file @
1d5b953d
...
...
@@ -97,6 +97,20 @@ acpi_ev_is_notify_object (
*
******************************************************************************/
#ifdef ACPI_DEBUG_OUTPUT
static
const
char
*
acpi_notify_value_names
[]
=
{
"Bus Check"
,
"Device Check"
,
"Device Wake"
,
"Eject request"
,
"Device Check Light"
,
"Frequency Mismatch"
,
"Bus Mode Mismatch"
,
"Power Fault"
};
#endif
acpi_status
acpi_ev_queue_notify_request
(
struct
acpi_namespace_node
*
node
,
...
...
@@ -112,7 +126,7 @@ acpi_ev_queue_notify_request (
/*
* For value
1
(Ejection Request), some device method may need to be run.
* For value
3
(Ejection Request), some device method may need to be run.
* For value 2 (Device Wake) if _PRW exists, the _PS0 method may need to be run.
* For value 0x80 (Status Change) on the power button or sleep button,
* initiate soft-off or sleep operation?
...
...
@@ -120,26 +134,13 @@ acpi_ev_queue_notify_request (
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Dispatching Notify(%X) on node %p
\n
"
,
notify_value
,
node
));
switch
(
notify_value
)
{
case
0
:
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Notify value: Re-enumerate Devices
\n
"
));
break
;
case
1
:
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Notify value: Ejection Request
\n
"
));
break
;
case
2
:
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Notify value: Device Wake
\n
"
));
break
;
case
0x80
:
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Notify value: Status Change
\n
"
));
break
;
default:
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Unknown Notify Value: %X
\n
"
,
notify_value
));
break
;
if
(
notify_value
<=
7
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Notify value: %s
\n
"
,
acpi_notify_value_names
[
notify_value
]));
}
else
{
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"notify value: 0x2.2_x **Device Specific**
\n
"
,
notify_value
));
}
/*
...
...
drivers/acpi/events/evxfevnt.c
View file @
1d5b953d
...
...
@@ -247,16 +247,29 @@ acpi_enable_gpe (
goto
unlock_and_exit
;
}
/* Enable the requested GPE number */
status
=
acpi_hw_enable_gpe
(
gpe_event_info
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
/* Check for Wake vs Runtime GPE */
if
(
flags
&
ACPI_EVENT_WAKE_ENABLE
)
{
/* Ensure the requested wake GPE is disabled */
status
=
acpi_hw_disable_gpe
(
gpe_event_info
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
/* Defer Enable of Wake GPE until sleep time */
acpi_hw_enable_gpe_for_wakeup
(
gpe_event_info
);
}
else
{
/* Enable the requested runtime GPE */
status
=
acpi_hw_enable_gpe
(
gpe_event_info
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
}
unlock_and_exit:
if
(
flags
&
ACPI_NOT_ISR
)
{
...
...
drivers/acpi/executer/excreate.c
View file @
1d5b953d
...
...
@@ -84,14 +84,15 @@ acpi_ex_create_alias (
alias_node
=
(
struct
acpi_namespace_node
*
)
walk_state
->
operands
[
0
];
target_node
=
(
struct
acpi_namespace_node
*
)
walk_state
->
operands
[
1
];
if
(
target_node
->
type
==
ACPI_TYPE_LOCAL_ALIAS
)
{
if
((
target_node
->
type
==
ACPI_TYPE_LOCAL_ALIAS
)
||
(
target_node
->
type
==
ACPI_TYPE_LOCAL_METHOD_ALIAS
))
{
/*
* Dereference an existing alias so that we don't create a chain
* of aliases. With this code, we guarantee that an alias is
* always exactly one level of indirection away from the
* actual aliased name.
*/
target_node
=
(
struct
acpi_namespace_node
*
)
target_node
->
object
;
target_node
=
ACPI_CAST_PTR
(
struct
acpi_namespace_node
,
target_node
->
object
)
;
}
/*
...
...
@@ -117,6 +118,17 @@ acpi_ex_create_alias (
alias_node
->
object
=
ACPI_CAST_PTR
(
union
acpi_operand_object
,
target_node
);
break
;
case
ACPI_TYPE_METHOD
:
/*
* The new alias has the type ALIAS and points to the original
* NS node, not the object itself. This is because for these
* types, the object can change dynamically via a Store.
*/
alias_node
->
type
=
ACPI_TYPE_LOCAL_METHOD_ALIAS
;
alias_node
->
object
=
ACPI_CAST_PTR
(
union
acpi_operand_object
,
target_node
);
break
;
default:
/* Attach the original source object to the new Alias Node */
...
...
drivers/acpi/executer/exdump.c
View file @
1d5b953d
...
...
@@ -774,6 +774,7 @@ acpi_ex_dump_object_descriptor (
case
ACPI_TYPE_LOCAL_ALIAS
:
case
ACPI_TYPE_LOCAL_METHOD_ALIAS
:
case
ACPI_TYPE_LOCAL_EXTRA
:
case
ACPI_TYPE_LOCAL_DATA
:
default:
...
...
drivers/acpi/executer/exresnte.c
View file @
1d5b953d
...
...
@@ -108,10 +108,11 @@ acpi_ex_resolve_node_to_value (
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"Entry=%p source_desc=%p [%s]
\n
"
,
node
,
source_desc
,
acpi_ut_get_type_name
(
entry_type
)));
if
(
entry_type
==
ACPI_TYPE_LOCAL_ALIAS
)
{
if
((
entry_type
==
ACPI_TYPE_LOCAL_ALIAS
)
||
(
entry_type
==
ACPI_TYPE_LOCAL_METHOD_ALIAS
))
{
/* There is always exactly one level of indirection */
node
=
(
struct
acpi_namespace_node
*
)
node
->
object
;
node
=
ACPI_CAST_PTR
(
struct
acpi_namespace_node
,
node
->
object
)
;
source_desc
=
acpi_ns_get_attached_object
(
node
);
entry_type
=
acpi_ns_get_type
((
acpi_handle
)
node
);
*
object_ptr
=
node
;
...
...
drivers/acpi/executer/exstoren.c
View file @
1d5b953d
...
...
@@ -138,6 +138,7 @@ acpi_ex_resolve_object (
case
ACPI_TYPE_LOCAL_ALIAS
:
case
ACPI_TYPE_LOCAL_METHOD_ALIAS
:
/*
* Aliases are resolved by acpi_ex_prep_operands
...
...
drivers/acpi/hardware/hwgpe.c
View file @
1d5b953d
...
...
@@ -53,9 +53,9 @@
*
* FUNCTION: acpi_hw_enable_gpe
*
* PARAMETERS: gpe_
number - The GPE
* PARAMETERS: gpe_
event_info - Info block for the GPE to be enabled
*
* RETURN:
None
* RETURN:
Status
*
* DESCRIPTION: Enable a single GPE.
*
...
...
@@ -95,7 +95,7 @@ acpi_hw_enable_gpe (
*
* FUNCTION: acpi_hw_enable_gpe_for_wakeup
*
* PARAMETERS: gpe_
number - The GPE
* PARAMETERS: gpe_
event_info - Info block for the GPE to be enabled
*
* RETURN: None
*
...
...
@@ -122,9 +122,11 @@ acpi_hw_enable_gpe_for_wakeup (
}
/*
* Set the bit so we will not disable this when sleeping
* Set the bit so we will not enable this GPE when sleeping (and disable
* it upon wake)
*/
gpe_register_info
->
wake_enable
|=
gpe_event_info
->
bit_mask
;
gpe_event_info
->
flags
|=
(
ACPI_GPE_TYPE_WAKE
|
ACPI_GPE_ENABLED
);
}
...
...
@@ -132,9 +134,9 @@ acpi_hw_enable_gpe_for_wakeup (
*
* FUNCTION: acpi_hw_disable_gpe
*
* PARAMETERS: gpe_
number - The GPE
* PARAMETERS: gpe_
event_info - Info block for the GPE to be disabled
*
* RETURN:
None
* RETURN:
Status
*
* DESCRIPTION: Disable a single GPE.
*
...
...
@@ -177,6 +179,8 @@ acpi_hw_disable_gpe (
return
(
status
);
}
/* Make sure this GPE is disabled for wake, also */
acpi_hw_disable_gpe_for_wakeup
(
gpe_event_info
);
return
(
AE_OK
);
}
...
...
@@ -186,7 +190,7 @@ acpi_hw_disable_gpe (
*
* FUNCTION: acpi_hw_disable_gpe_for_wakeup
*
* PARAMETERS: gpe_
number - The GPE
* PARAMETERS: gpe_
event_info - Info block for the GPE to be disabled
*
* RETURN: None
*
...
...
@@ -212,9 +216,8 @@ acpi_hw_disable_gpe_for_wakeup (
return
;
}
/*
* Clear the bit so we will disable this when sleeping
*/
/* Clear the bit so we will disable this when sleeping */
gpe_register_info
->
wake_enable
&=
~
(
gpe_event_info
->
bit_mask
);
}
...
...
@@ -223,11 +226,11 @@ acpi_hw_disable_gpe_for_wakeup (
*
* FUNCTION: acpi_hw_clear_gpe
*
* PARAMETERS: gpe_
number - The GPE
* PARAMETERS: gpe_
event_info - Info block for the GPE to be cleared
*
* RETURN:
None
* RETURN:
status_status
*
* DESCRIPTION: Clear a single GPE.
* DESCRIPTION: Clear
the status bit for
a single GPE.
*
******************************************************************************/
...
...
@@ -256,9 +259,10 @@ acpi_hw_clear_gpe (
*
* FUNCTION: acpi_hw_get_gpe_status
*
* PARAMETERS: gpe_number - The GPE
* PARAMETERS: gpe_event_info - Info block for the GPE to queried
* event_status - Where the GPE status is returned
*
* RETURN:
None
* RETURN:
Status
*
* DESCRIPTION: Return the status of a single GPE.
*
...
...
@@ -376,7 +380,7 @@ acpi_hw_disable_gpe_block (
*
* RETURN: Status
*
* DESCRIPTION: Clear all GPEs within a GPE block
* DESCRIPTION: Clear
status bits for
all GPEs within a GPE block
*
******************************************************************************/
...
...
@@ -392,7 +396,7 @@ acpi_hw_clear_gpe_block (
/* Examine each GPE Register within the block */
for
(
i
=
0
;
i
<
gpe_block
->
register_count
;
i
++
)
{
/* Clear all GPEs in this register */
/* Clear
status on
all GPEs in this register */
status
=
acpi_hw_low_level_write
(
8
,
0xFF
,
&
gpe_block
->
register_info
[
i
].
status_address
);
...
...
@@ -407,19 +411,20 @@ acpi_hw_clear_gpe_block (
/******************************************************************************
*
* FUNCTION: acpi_hw_
disable_non_wakeup_gpe_block
* FUNCTION: acpi_hw_
prepare_gpe_block_for_sleep
*
* PARAMETERS: gpe_xrupt_info - GPE Interrupt info
* gpe_block - Gpe Block info
*
* RETURN: Status
*
* DESCRIPTION: Disable all GPEs except wakeup GPEs in a GPE block
* DESCRIPTION: Disable all runtime GPEs and enable all wakeup GPEs -- within
* a single GPE block
*
******************************************************************************/
static
acpi_status
acpi_hw_
disable_non_wakeup_gpe_block
(
acpi_hw_
prepare_gpe_block_for_sleep
(
struct
acpi_gpe_xrupt_info
*
gpe_xrupt_info
,
struct
acpi_gpe_block_info
*
gpe_block
)
{
...
...
@@ -437,8 +442,11 @@ acpi_hw_disable_non_wakeup_gpe_block (
for
(
i
=
0
;
i
<
gpe_block
->
register_count
;
i
++
)
{
/*
* Read the enabled status of all GPEs. We
* Read the enabled
/disabled
status of all GPEs. We
* will be using it to restore all the GPEs later.
*
* NOTE: Wake GPEs are are ALL disabled at this time, so when we wake
* and restore this register, they will be automatically disabled.
*/
status
=
acpi_hw_low_level_read
(
8
,
&
in_value
,
&
gpe_register_info
->
enable_address
);
...
...
@@ -449,7 +457,8 @@ acpi_hw_disable_non_wakeup_gpe_block (
gpe_register_info
->
enable
=
(
u8
)
in_value
;
/*
* Disable all GPEs except wakeup GPEs.
* 1) Disable all runtime GPEs
* 2) Enable all wakeup GPEs
*/
status
=
acpi_hw_low_level_write
(
8
,
gpe_register_info
->
wake_enable
,
&
gpe_register_info
->
enable_address
);
...
...
@@ -457,6 +466,8 @@ acpi_hw_disable_non_wakeup_gpe_block (
return
(
status
);
}
/* Point to next GPE register */
gpe_register_info
++
;
}
...
...
@@ -466,22 +477,22 @@ acpi_hw_disable_non_wakeup_gpe_block (
/******************************************************************************
*
* FUNCTION: acpi_hw_
disable_non_wakeup_gpes
* FUNCTION: acpi_hw_
prepare_gpes_for_sleep
*
* PARAMETERS: None
*
* RETURN:
None
* RETURN:
Status
*
* DESCRIPTION: Disable all
non-wakeup GPEs
* DESCRIPTION: Disable all
runtime GPEs, enable all wake GPEs.
* Called with interrupts disabled. The interrupt handler also
* modifies gpe_register_info->Enable, so it should not be
* given the chance to run until after
non-wak
e GPEs are
* given the chance to run until after
the runtim
e GPEs are
* re-enabled.
*
******************************************************************************/
acpi_status
acpi_hw_
disable_non_wakeup_gpes
(
acpi_hw_
prepare_gpes_for_sleep
(
void
)
{
acpi_status
status
;
...
...
@@ -490,27 +501,27 @@ acpi_hw_disable_non_wakeup_gpes (
ACPI_FUNCTION_ENTRY
();
status
=
acpi_ev_walk_gpe_list
(
acpi_hw_disable_non_wakeup_gpe_block
);
status
=
acpi_ev_walk_gpe_list
(
acpi_hw_prepare_gpe_block_for_sleep
);
return
(
status
);
}
/******************************************************************************
*
* FUNCTION: acpi_hw_
enable_non_wakeup_gpe_block
* FUNCTION: acpi_hw_
restore_gpe_block_on_wake
*
* PARAMETERS: gpe_xrupt_info - GPE Interrupt info
* gpe_block - Gpe Block info
*
* RETURN: Status
*
* DESCRIPTION: Enable a single GPE.
* DESCRIPTION: Enable all runtime GPEs and disable all wake GPEs -- in one
* GPE block
*
******************************************************************************/
static
acpi_status
acpi_hw_
enable_non_wakeup_gpe_block
(
acpi_hw_
restore_gpe_block_on_wake
(
struct
acpi_gpe_xrupt_info
*
gpe_xrupt_info
,
struct
acpi_gpe_block_info
*
gpe_block
)
{
...
...
@@ -537,8 +548,12 @@ acpi_hw_enable_non_wakeup_gpe_block (
}
/*
* We previously stored the enabled status of all GPEs.
* Blast them back in.
* Restore the GPE Enable register, which will do the following:
*
* 1) Disable all wakeup GPEs
* 2) Enable all runtime GPEs
*
* (On sleep, we saved the enabled status of all GPEs)
*/
status
=
acpi_hw_low_level_write
(
8
,
gpe_register_info
->
enable
,
&
gpe_register_info
->
enable_address
);
...
...
@@ -546,28 +561,30 @@ acpi_hw_enable_non_wakeup_gpe_block (
return
(
status
);
}
/* Point to next GPE register */
gpe_register_info
++
;
}
return
(
AE_OK
);
}
/******************************************************************************
*
* FUNCTION: acpi_hw_
enable_non_wakeup_gpes
* FUNCTION: acpi_hw_
restore_gpes_on_wake
*
* PARAMETERS: None
*
* RETURN:
None
* RETURN:
Status
*
* DESCRIPTION: Enable all non-wakeup GPEs we previously enabled.
* DESCRIPTION: Enable all runtime GPEs and disable all wake GPEs -- in all
* GPE blocks
*
******************************************************************************/
acpi_status
acpi_hw_
enable_non_wakeup_gpes
(
acpi_hw_
restore_gpes_on_wake
(
void
)
{
acpi_status
status
;
...
...
@@ -576,7 +593,6 @@ acpi_hw_enable_non_wakeup_gpes (
ACPI_FUNCTION_ENTRY
();
status
=
acpi_ev_walk_gpe_list
(
acpi_hw_enable_non_wakeup_gpe_block
);
status
=
acpi_ev_walk_gpe_list
(
acpi_hw_restore_gpe_block_on_wake
);
return
(
status
);
}
drivers/acpi/hardware/hwsleep.c
View file @
1d5b953d
...
...
@@ -286,7 +286,11 @@ acpi_enter_sleep_state (
}
}
status
=
acpi_hw_disable_non_wakeup_gpes
();
/*
* 1) Disable all runtime GPEs
* 2) Enable all wakeup GPEs
*/
status
=
acpi_hw_prepare_gpes_for_sleep
();
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -415,7 +419,11 @@ acpi_enter_sleep_state_s4bios (
return_ACPI_STATUS
(
status
);
}
status
=
acpi_hw_disable_non_wakeup_gpes
();
/*
* 1) Disable all runtime GPEs
* 2) Enable all wakeup GPEs
*/
status
=
acpi_hw_prepare_gpes_for_sleep
();
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -528,10 +536,14 @@ acpi_leave_sleep_state (
if
(
ACPI_FAILURE
(
status
)
&&
status
!=
AE_NOT_FOUND
)
{
ACPI_REPORT_ERROR
((
"Method _WAK failed, %s
\n
"
,
acpi_format_exception
(
status
)));
}
/* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */
/* _WAK returns stuff - do we want to look at it? */
status
=
acpi_hw_enable_non_wakeup_gpes
();
/*
* Restore the GPEs:
* 1) Disable all wakeup GPEs
* 2) Enable all runtime GPEs
*/
status
=
acpi_hw_restore_gpes_on_wake
();
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
drivers/acpi/namespace/nsaccess.c
View file @
1d5b953d
...
...
@@ -247,6 +247,14 @@ acpi_ns_root_initialize (void)
unlock_and_exit:
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
/* Save a handle to "_GPE", it is always present */
if
(
ACPI_SUCCESS
(
status
))
{
status
=
acpi_ns_get_node_by_path
(
"
\\
_GPE"
,
NULL
,
ACPI_NS_NO_UPSEARCH
,
&
acpi_gbl_fadt_gpe_device
);
}
return_ACPI_STATUS
(
status
);
}
...
...
@@ -577,6 +585,7 @@ acpi_ns_lookup (
if
((
num_segments
==
0
)
&&
(
type_to_check_for
!=
ACPI_TYPE_ANY
)
&&
(
type_to_check_for
!=
ACPI_TYPE_LOCAL_ALIAS
)
&&
(
type_to_check_for
!=
ACPI_TYPE_LOCAL_METHOD_ALIAS
)
&&
(
type_to_check_for
!=
ACPI_TYPE_LOCAL_SCOPE
)
&&
(
this_node
->
type
!=
ACPI_TYPE_ANY
)
&&
(
this_node
->
type
!=
type_to_check_for
))
{
...
...
drivers/acpi/namespace/nsdump.c
View file @
1d5b953d
...
...
@@ -351,6 +351,7 @@ acpi_ns_dump_one_object (
case
ACPI_TYPE_LOCAL_ALIAS
:
case
ACPI_TYPE_LOCAL_METHOD_ALIAS
:
acpi_os_printf
(
"Target %4.4s (%p)
\n
"
,
acpi_ut_get_node_name
(
obj_desc
),
obj_desc
);
break
;
...
...
drivers/acpi/namespace/nseval.c
View file @
1d5b953d
...
...
@@ -310,6 +310,15 @@ acpi_ns_evaluate_by_handle (
return_ACPI_STATUS
(
AE_BAD_PARAMETER
);
}
/*
* For a method alias, we must grab the actual method node
* so that proper scoping context will be established
* before execution.
*/
if
(
acpi_ns_get_type
(
node
)
==
ACPI_TYPE_LOCAL_METHOD_ALIAS
)
{
node
=
ACPI_CAST_PTR
(
struct
acpi_namespace_node
,
node
->
object
);
}
/*
* Two major cases here:
* 1) The object is an actual control method -- execute it.
...
...
drivers/acpi/namespace/nssearch.c
View file @
1d5b953d
...
...
@@ -113,6 +113,12 @@ acpi_ns_search_node (
/* Check for match against the name */
if
(
next_node
->
name
.
integer
==
target_name
)
{
/* Resolve a control method alias if any */
if
(
acpi_ns_get_type
(
next_node
)
==
ACPI_TYPE_LOCAL_METHOD_ALIAS
)
{
next_node
=
ACPI_CAST_PTR
(
struct
acpi_namespace_node
,
next_node
->
object
);
}
/*
* Found matching entry.
*/
...
...
drivers/acpi/namespace/nsutils.c
View file @
1d5b953d
...
...
@@ -256,7 +256,7 @@ acpi_ns_get_type (
if
(
!
node
)
{
ACPI_REPORT_WARNING
((
"ns_get_type: Null Node
ptr
"
));
ACPI_REPORT_WARNING
((
"ns_get_type: Null Node
input pointer
\n
"
));
return_VALUE
(
ACPI_TYPE_ANY
);
}
...
...
drivers/acpi/namespace/nsxfeval.c
View file @
1d5b953d
...
...
@@ -45,6 +45,7 @@
#include <acpi/acpi.h>
#include <acpi/acnamesp.h>
#include <acpi/acinterp.h>
#define _COMPONENT ACPI_NAMESPACE
...
...
@@ -149,11 +150,11 @@ acpi_evaluate_object_typed (
* FUNCTION: acpi_evaluate_object
*
* PARAMETERS: Handle - Object handle (optional)
*
*Pathname
- Object pathname (optional)
*
**external_params
- List of parameters to pass to method,
*
Pathname
- Object pathname (optional)
*
external_params
- List of parameters to pass to method,
* terminated by NULL. May be NULL
* if no parameters are being passed.
*
*return_buffer
- Where to put method's return value (if
*
return_buffer
- Where to put method's return value (if
* any). If NULL, no value is returned.
*
* RETURN: Status
...
...
@@ -172,6 +173,7 @@ acpi_evaluate_object (
struct
acpi_buffer
*
return_buffer
)
{
acpi_status
status
;
acpi_status
status2
;
union
acpi_operand_object
**
internal_params
=
NULL
;
union
acpi_operand_object
*
internal_return_obj
=
NULL
;
acpi_size
buffer_space_needed
;
...
...
@@ -203,7 +205,7 @@ acpi_evaluate_object (
*/
for
(
i
=
0
;
i
<
external_params
->
count
;
i
++
)
{
status
=
acpi_ut_copy_eobject_to_iobject
(
&
external_params
->
pointer
[
i
],
&
internal_params
[
i
]);
&
internal_params
[
i
]);
if
(
ACPI_FAILURE
(
status
))
{
acpi_ut_delete_internal_object_list
(
internal_params
);
return_ACPI_STATUS
(
status
);
...
...
@@ -321,14 +323,20 @@ acpi_evaluate_object (
}
}
/* Delete the return and parameter objects */
if
(
internal_return_obj
)
{
/*
* Delete the internal return object.
(Or at least
*
decrement the reference count by one)
* Delete the internal return object.
NOTE: Interpreter
*
must be locked to avoid race condition.
*/
acpi_ut_remove_reference
(
internal_return_obj
);
status2
=
acpi_ex_enter_interpreter
();
if
(
ACPI_SUCCESS
(
status2
))
{
/*
* Delete the internal return object. (Or at least
* decrement the reference count by one)
*/
acpi_ut_remove_reference
(
internal_return_obj
);
acpi_ex_exit_interpreter
();
}
}
/*
...
...
drivers/acpi/osl.c
View file @
1d5b953d
...
...
@@ -1048,3 +1048,24 @@ acpi_serialize_setup(char *str)
__setup
(
"acpi_serialize"
,
acpi_serialize_setup
);
/*
* Wake and Run-Time GPES are expected to be separate.
* We disable wake-GPEs at run-time to prevent spurious
* interrupts.
*
* However, if a system exists that shares Wake and
* Run-time events on the same GPE this flag is available
* to tell Linux to keep the wake-time GPEs enabled at run-time.
*/
int
__init
acpi_wake_gpes_always_on_setup
(
char
*
str
)
{
printk
(
KERN_INFO
PREFIX
"wake GPEs not disabled
\n
"
);
acpi_gbl_leave_wake_gpes_disabled
=
FALSE
;
return
1
;
}
__setup
(
"acpi_wake_gpes_always_on"
,
acpi_wake_gpes_always_on_setup
);
drivers/acpi/pci_link.c
View file @
1d5b953d
...
...
@@ -72,6 +72,7 @@ struct acpi_pci_link_irq {
u8
edge_level
;
/* All IRQs */
u8
active_high_low
;
/* All IRQs */
u8
setonboot
;
u8
resource_type
;
u8
possible_count
;
u8
possible
[
ACPI_PCI_LINK_MAX_POSSIBLE
];
};
...
...
@@ -123,6 +124,7 @@ acpi_pci_link_check_possible (
}
link
->
irq
.
edge_level
=
p
->
edge_level
;
link
->
irq
.
active_high_low
=
p
->
active_high_low
;
link
->
irq
.
resource_type
=
ACPI_RSTYPE_IRQ
;
break
;
}
case
ACPI_RSTYPE_EXT_IRQ
:
...
...
@@ -143,6 +145,7 @@ acpi_pci_link_check_possible (
}
link
->
irq
.
edge_level
=
p
->
edge_level
;
link
->
irq
.
active_high_low
=
p
->
active_high_low
;
link
->
irq
.
resource_type
=
ACPI_RSTYPE_EXT_IRQ
;
break
;
}
default:
...
...
@@ -342,13 +345,18 @@ acpi_pci_link_set (
}
}
resource_type
=
link
->
irq
.
resource_type
;
if
(
resource_type
!=
ACPI_RSTYPE_IRQ
&&
resource_type
!=
ACPI_RSTYPE_EXT_IRQ
){
/* If IRQ<=15, first try with a "normal" IRQ descriptor. If that fails, try with
* an extended one */
if
(
irq
<=
15
)
{
resource_type
=
ACPI_RSTYPE_IRQ
;
}
else
{
resource_type
=
ACPI_RSTYPE_EXT_IRQ
;
}
if
(
irq
<=
15
)
{
resource_type
=
ACPI_RSTYPE_IRQ
;
}
else
{
resource_type
=
ACPI_RSTYPE_EXT_IRQ
;
}
}
retry_programming:
...
...
drivers/acpi/resources/rsaddr.c
View file @
1d5b953d
...
...
@@ -88,6 +88,7 @@ acpi_rs_address16_resource (
ACPI_FUNCTION_TRACE
(
"rs_address16_resource"
);
/*
* Point past the Descriptor to get the number of bytes consumed
*/
...
...
@@ -149,7 +150,7 @@ acpi_rs_address16_resource (
output_struct
->
data
.
address16
.
attribute
.
memory
.
read_write_attribute
=
(
u16
)
(
temp8
&
0x01
);
output_struct
->
data
.
address16
.
attribute
.
memory
.
cache_attribute
=
(
u16
)
((
temp8
>>
1
)
&
0x0
F
);
(
u16
)
((
temp8
>>
1
)
&
0x0
3
);
}
else
{
if
(
ACPI_IO_RANGE
==
output_struct
->
data
.
address16
.
resource_type
)
{
...
...
@@ -347,7 +348,7 @@ acpi_rs_address16_stream (
temp8
|=
(
linked_list
->
data
.
address16
.
attribute
.
memory
.
cache_attribute
&
0x0
F
)
<<
1
;
0x0
3
)
<<
1
;
}
else
if
(
ACPI_IO_RANGE
==
linked_list
->
data
.
address16
.
resource_type
)
{
temp8
=
(
u8
)
...
...
@@ -539,7 +540,7 @@ acpi_rs_address32_resource (
(
u16
)
(
temp8
&
0x01
);
output_struct
->
data
.
address32
.
attribute
.
memory
.
cache_attribute
=
(
u16
)
((
temp8
>>
1
)
&
0x0
F
);
(
u16
)
((
temp8
>>
1
)
&
0x0
3
);
}
else
{
if
(
ACPI_IO_RANGE
==
output_struct
->
data
.
address32
.
resource_type
)
{
...
...
@@ -735,7 +736,7 @@ acpi_rs_address32_stream (
temp8
|=
(
linked_list
->
data
.
address32
.
attribute
.
memory
.
cache_attribute
&
0x0
F
)
<<
1
;
0x0
3
)
<<
1
;
}
else
if
(
ACPI_IO_RANGE
==
linked_list
->
data
.
address32
.
resource_type
)
{
temp8
=
(
u8
)
...
...
@@ -926,7 +927,7 @@ acpi_rs_address64_resource (
(
u16
)
(
temp8
&
0x01
);
output_struct
->
data
.
address64
.
attribute
.
memory
.
cache_attribute
=
(
u16
)
((
temp8
>>
1
)
&
0x0
F
);
(
u16
)
((
temp8
>>
1
)
&
0x0
3
);
}
else
{
if
(
ACPI_IO_RANGE
==
output_struct
->
data
.
address64
.
resource_type
)
{
...
...
@@ -1124,7 +1125,7 @@ acpi_rs_address64_stream (
temp8
|=
(
linked_list
->
data
.
address64
.
attribute
.
memory
.
cache_attribute
&
0x0
F
)
<<
1
;
0x0
3
)
<<
1
;
}
else
if
(
ACPI_IO_RANGE
==
linked_list
->
data
.
address64
.
resource_type
)
{
temp8
=
(
u8
)
...
...
drivers/acpi/utilities/utglobal.c
View file @
1d5b953d
...
...
@@ -253,14 +253,15 @@ const u8 acpi_gbl_ns_properties[] =
ACPI_NS_NORMAL
,
/* 19 index_field */
ACPI_NS_NORMAL
,
/* 20 Reference */
ACPI_NS_NORMAL
,
/* 21 Alias */
ACPI_NS_NORMAL
,
/* 22 Notify */
ACPI_NS_NORMAL
,
/* 23 Address Handler */
ACPI_NS_NEWSCOPE
|
ACPI_NS_LOCAL
,
/* 24 Resource Desc */
ACPI_NS_NEWSCOPE
|
ACPI_NS_LOCAL
,
/* 25 Resource Field */
ACPI_NS_NEWSCOPE
,
/* 26 Scope */
ACPI_NS_NORMAL
,
/* 27 Extra */
ACPI_NS_NORMAL
,
/* 28 Data */
ACPI_NS_NORMAL
/* 29 Invalid */
ACPI_NS_NORMAL
,
/* 22 method_alias */
ACPI_NS_NORMAL
,
/* 23 Notify */
ACPI_NS_NORMAL
,
/* 24 Address Handler */
ACPI_NS_NEWSCOPE
|
ACPI_NS_LOCAL
,
/* 25 Resource Desc */
ACPI_NS_NEWSCOPE
|
ACPI_NS_LOCAL
,
/* 26 Resource Field */
ACPI_NS_NEWSCOPE
,
/* 27 Scope */
ACPI_NS_NORMAL
,
/* 28 Extra */
ACPI_NS_NORMAL
,
/* 29 Data */
ACPI_NS_NORMAL
/* 30 Invalid */
};
...
...
@@ -501,14 +502,15 @@ static const char *acpi_gbl_ns_type_names[] = /* printable nam
/* 19 */
"index_field"
,
/* 20 */
"Reference"
,
/* 21 */
"Alias"
,
/* 22 */
"Notify"
,
/* 23 */
"addr_handler"
,
/* 24 */
"resource_desc"
,
/* 25 */
"resource_fld"
,
/* 26 */
"Scope"
,
/* 27 */
"Extra"
,
/* 28 */
"Data"
,
/* 39 */
"Invalid"
/* 22 */
"method_alias"
,
/* 23 */
"Notify"
,
/* 24 */
"addr_handler"
,
/* 25 */
"resource_desc"
,
/* 26 */
"resource_fld"
,
/* 27 */
"Scope"
,
/* 28 */
"Extra"
,
/* 29 */
"Data"
,
/* 30 */
"Invalid"
};
...
...
@@ -556,7 +558,7 @@ char *
acpi_ut_get_node_name
(
void
*
object
)
{
struct
acpi_namespace_node
*
node
;
struct
acpi_namespace_node
*
node
=
(
struct
acpi_namespace_node
*
)
object
;
if
(
!
object
)
...
...
@@ -564,7 +566,10 @@ acpi_ut_get_node_name (
return
(
"NULL NODE"
);
}
node
=
(
struct
acpi_namespace_node
*
)
object
;
if
(
object
==
ACPI_ROOT_OBJECT
)
{
node
=
acpi_gbl_root_node
;
}
if
(
node
->
descriptor
!=
ACPI_DESC_TYPE_NAMED
)
{
...
...
@@ -782,6 +787,7 @@ acpi_ut_init_globals (
acpi_gbl_create_osi_method
=
TRUE
;
acpi_gbl_all_methods_serialized
=
FALSE
;
acpi_gbl_leave_wake_gpes_disabled
=
TRUE
;
/* Memory allocation and cache lists */
...
...
drivers/acpi/utilities/utmisc.c
View file @
1d5b953d
...
...
@@ -529,6 +529,7 @@ acpi_ut_strupr (
return
(
src_string
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ut_mutex_initialize
...
...
@@ -562,10 +563,8 @@ acpi_ut_mutex_initialize (
}
}
status
=
acpi_os_create_lock
(
&
acpi_gbl_gpe_lock
);
return_ACPI_STATUS
(
AE_OK
);
return_ACPI_STATUS
(
status
);
}
...
...
include/acpi/acconfig.h
View file @
1d5b953d
...
...
@@ -64,7 +64,7 @@
/* Version string */
#define ACPI_CA_VERSION 0x200403
11
#define ACPI_CA_VERSION 0x200403
26
/* Maximum objects in the various object caches */
...
...
include/acpi/acglobal.h
View file @
1d5b953d
...
...
@@ -87,6 +87,7 @@ extern u32 acpi_gbl_nesting_level;
ACPI_EXTERN
u8
acpi_gbl_create_osi_method
;
ACPI_EXTERN
u8
acpi_gbl_all_methods_serialized
;
ACPI_EXTERN
u8
acpi_gbl_leave_wake_gpes_disabled
;
/*****************************************************************************
*
...
...
@@ -196,6 +197,7 @@ extern const char *acpi_gbl_valid_osi_strings[ACPI_
ACPI_EXTERN
struct
acpi_namespace_node
acpi_gbl_root_node_struct
;
ACPI_EXTERN
struct
acpi_namespace_node
*
acpi_gbl_root_node
;
ACPI_EXTERN
struct
acpi_namespace_node
*
acpi_gbl_fadt_gpe_device
;
extern
const
u8
acpi_gbl_ns_properties
[
NUM_NS_TYPES
];
extern
const
struct
acpi_predefined_names
acpi_gbl_pre_defined_names
[
NUM_PREDEFINED_NAMES
];
...
...
include/acpi/achware.h
View file @
1d5b953d
...
...
@@ -149,11 +149,11 @@ acpi_hw_get_gpe_status (
acpi_event_status
*
event_status
);
acpi_status
acpi_hw_
disable_non_wakeup_gpes
(
acpi_hw_
prepare_gpes_for_sleep
(
void
);
acpi_status
acpi_hw_
enable_non_wakeup_gpes
(
acpi_hw_
restore_gpes_on_wake
(
void
);
...
...
include/acpi/aclocal.h
View file @
1d5b953d
...
...
@@ -360,6 +360,13 @@ struct acpi_gpe_xrupt_info
};
struct
acpi_gpe_walk_info
{
struct
acpi_namespace_node
*
gpe_device
;
struct
acpi_gpe_block_info
*
gpe_block
;
};
typedef
acpi_status
(
*
ACPI_GPE_CALLBACK
)
(
struct
acpi_gpe_xrupt_info
*
gpe_xrupt_info
,
struct
acpi_gpe_block_info
*
gpe_block
);
...
...
include/acpi/actypes.h
View file @
1d5b953d
...
...
@@ -413,7 +413,7 @@ typedef u32 acpi_table_type;
* of the ACPI object_type() operator (See the ACPI Spec). Therefore,
* only add to the first group if the spec changes.
*
* Types must be kept in sync with the global acpi_ns_properties
*
NOTE:
Types must be kept in sync with the global acpi_ns_properties
* and acpi_ns_type_names arrays.
*/
typedef
u32
acpi_object_type
;
...
...
@@ -450,26 +450,27 @@ typedef u32 acpi_object_type;
#define ACPI_TYPE_LOCAL_INDEX_FIELD 0x13
#define ACPI_TYPE_LOCAL_REFERENCE 0x14
/* Arg#, Local#, Name, Debug, ref_of, Index */
#define ACPI_TYPE_LOCAL_ALIAS 0x15
#define ACPI_TYPE_LOCAL_NOTIFY 0x16
#define ACPI_TYPE_LOCAL_ADDRESS_HANDLER 0x17
#define ACPI_TYPE_LOCAL_RESOURCE 0x18
#define ACPI_TYPE_LOCAL_RESOURCE_FIELD 0x19
#define ACPI_TYPE_LOCAL_SCOPE 0x1A
/* 1 Name, multiple object_list Nodes */
#define ACPI_TYPE_LOCAL_METHOD_ALIAS 0x16
#define ACPI_TYPE_LOCAL_NOTIFY 0x17
#define ACPI_TYPE_LOCAL_ADDRESS_HANDLER 0x18
#define ACPI_TYPE_LOCAL_RESOURCE 0x19
#define ACPI_TYPE_LOCAL_RESOURCE_FIELD 0x1A
#define ACPI_TYPE_LOCAL_SCOPE 0x1B
/* 1 Name, multiple object_list Nodes */
#define ACPI_TYPE_NS_NODE_MAX 0x1
A
/* Last typecode used within a NS Node */
#define ACPI_TYPE_NS_NODE_MAX 0x1
B
/* Last typecode used within a NS Node */
/*
* These are special object types that never appear in
* a Namespace node, only in an union acpi_operand_object
*/
#define ACPI_TYPE_LOCAL_EXTRA 0x1
B
#define ACPI_TYPE_LOCAL_DATA 0x1
C
#define ACPI_TYPE_LOCAL_EXTRA 0x1
C
#define ACPI_TYPE_LOCAL_DATA 0x1
D
#define ACPI_TYPE_LOCAL_MAX 0x1
C
#define ACPI_TYPE_LOCAL_MAX 0x1
D
/* All types above here are invalid */
#define ACPI_TYPE_INVALID 0x1
D
#define ACPI_TYPE_INVALID 0x1
E
#define ACPI_TYPE_NOT_FOUND 0xFF
...
...
@@ -511,9 +512,8 @@ typedef u32 acpi_object_type;
#define ACPI_WRITE 1
#define ACPI_IO_MASK 1
/*
*
Acpi
Event Types: Fixed & General Purpose
* Event Types: Fixed & General Purpose
*/
typedef
u32
acpi_event_type
;
...
...
@@ -528,25 +528,8 @@ typedef u32 acpi_event_type;
#define ACPI_EVENT_MAX 4
#define ACPI_NUM_FIXED_EVENTS ACPI_EVENT_MAX + 1
#define ACPI_GPE_INVALID 0xFF
#define ACPI_GPE_MAX 0xFF
#define ACPI_NUM_GPE 256
#define ACPI_EVENT_LEVEL_TRIGGERED 1
#define ACPI_EVENT_EDGE_TRIGGERED 2
/*
* Flags for GPE and Lock interfaces
*/
#define ACPI_EVENT_WAKE_ENABLE 0x2
#define ACPI_EVENT_WAKE_DISABLE 0x2
#define ACPI_NOT_ISR 0x1
#define ACPI_ISR 0x0
/*
*
acpi_event Status:
*
Event Status - Per event
* -------------
* The encoding of acpi_event_status is illustrated below.
* Note that a set bit (1) indicates the property is TRUE
...
...
@@ -567,6 +550,45 @@ typedef u32 acpi_event_status;
#define ACPI_EVENT_FLAG_WAKE_ENABLED (acpi_event_status) 0x02
#define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x04
/*
* General Purpose Events (GPE)
*/
#define ACPI_GPE_INVALID 0xFF
#define ACPI_GPE_MAX 0xFF
#define ACPI_NUM_GPE 256
/*
* GPE info flags - Per GPE
* +---------+-+-+-+
* |Bits 8:3 |2|1|0|
* +---------+-+-+-+
* | | | |
* | | | +- Edge or Level Triggered
* | | +--- Type: Wake or Runtime
* | +----- Enabled for wake?
* +--------<Reserved>
*/
#define ACPI_GPE_XRUPT_TYPE_MASK (u8) 1
#define ACPI_GPE_LEVEL_TRIGGERED (u8) 1
#define ACPI_GPE_EDGE_TRIGGERED (u8) 0
#define ACPI_GPE_TYPE_MASK (u8) 2
#define ACPI_GPE_TYPE_WAKE (u8) 2
#define ACPI_GPE_TYPE_RUNTIME (u8) 0
/* Default */
#define ACPI_GPE_ENABLE_MASK (u8) 4
#define ACPI_GPE_ENABLED (u8) 4
#define ACPI_GPE_DISABLED (u8) 0
/* Default */
/*
* Flags for GPE and Lock interfaces
*/
#define ACPI_EVENT_WAKE_ENABLE 0x2
#define ACPI_EVENT_WAKE_DISABLE 0x2
#define ACPI_NOT_ISR 0x1
#define ACPI_ISR 0x0
/* Notify types */
...
...
include/acpi/acutils.h
View file @
1d5b953d
...
...
@@ -471,6 +471,7 @@ acpi_ut_delete_internal_object_list (
#define METHOD_NAME__PRT "_PRT"
#define METHOD_NAME__CRS "_CRS"
#define METHOD_NAME__PRS "_PRS"
#define METHOD_NAME__PRW "_PRW"
acpi_status
...
...
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