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
17d0e4f4
Commit
17d0e4f4
authored
May 23, 2003
by
Andy Grover
Browse files
Options
Browse Files
Download
Plain Diff
Merge groveronline.com:/root/bk/linux-2.5
into groveronline.com:/root/bk/linux-acpi
parents
1a569433
8e498582
Changes
49
Hide whitespace changes
Inline
Side-by-side
Showing
49 changed files
with
860 additions
and
817 deletions
+860
-817
arch/i386/kernel/mpparse.c
arch/i386/kernel/mpparse.c
+5
-1
drivers/acpi/dispatcher/dsinit.c
drivers/acpi/dispatcher/dsinit.c
+2
-2
drivers/acpi/dispatcher/dsopcode.c
drivers/acpi/dispatcher/dsopcode.c
+3
-3
drivers/acpi/ec.c
drivers/acpi/ec.c
+11
-11
drivers/acpi/events/evgpe.c
drivers/acpi/events/evgpe.c
+2
-2
drivers/acpi/events/evgpeblk.c
drivers/acpi/events/evgpeblk.c
+2
-2
drivers/acpi/events/evmisc.c
drivers/acpi/events/evmisc.c
+12
-12
drivers/acpi/events/evregion.c
drivers/acpi/events/evregion.c
+133
-146
drivers/acpi/events/evrgnini.c
drivers/acpi/events/evrgnini.c
+90
-76
drivers/acpi/events/evxface.c
drivers/acpi/events/evxface.c
+33
-29
drivers/acpi/events/evxfevnt.c
drivers/acpi/events/evxfevnt.c
+4
-0
drivers/acpi/events/evxfregn.c
drivers/acpi/events/evxfregn.c
+56
-40
drivers/acpi/executer/exconfig.c
drivers/acpi/executer/exconfig.c
+4
-4
drivers/acpi/executer/exdump.c
drivers/acpi/executer/exdump.c
+19
-19
drivers/acpi/hardware/hwgpe.c
drivers/acpi/hardware/hwgpe.c
+12
-12
drivers/acpi/hardware/hwregs.c
drivers/acpi/hardware/hwregs.c
+56
-64
drivers/acpi/hardware/hwtimer.c
drivers/acpi/hardware/hwtimer.c
+1
-1
drivers/acpi/namespace/nsalloc.c
drivers/acpi/namespace/nsalloc.c
+37
-3
drivers/acpi/namespace/nsload.c
drivers/acpi/namespace/nsload.c
+8
-10
drivers/acpi/namespace/nsparse.c
drivers/acpi/namespace/nsparse.c
+1
-2
drivers/acpi/namespace/nsutils.c
drivers/acpi/namespace/nsutils.c
+7
-14
drivers/acpi/osl.c
drivers/acpi/osl.c
+2
-2
drivers/acpi/parser/pswalk.c
drivers/acpi/parser/pswalk.c
+1
-1
drivers/acpi/parser/psxface.c
drivers/acpi/parser/psxface.c
+1
-1
drivers/acpi/resources/rsxface.c
drivers/acpi/resources/rsxface.c
+9
-3
drivers/acpi/scan.c
drivers/acpi/scan.c
+1
-1
drivers/acpi/tables/tbconvrt.c
drivers/acpi/tables/tbconvrt.c
+89
-25
drivers/acpi/tables/tbget.c
drivers/acpi/tables/tbget.c
+7
-7
drivers/acpi/tables/tbgetall.c
drivers/acpi/tables/tbgetall.c
+1
-1
drivers/acpi/tables/tbinstal.c
drivers/acpi/tables/tbinstal.c
+75
-120
drivers/acpi/tables/tbutils.c
drivers/acpi/tables/tbutils.c
+8
-9
drivers/acpi/tables/tbxface.c
drivers/acpi/tables/tbxface.c
+10
-10
drivers/acpi/toshiba_acpi.c
drivers/acpi/toshiba_acpi.c
+7
-8
drivers/acpi/utilities/utdelete.c
drivers/acpi/utilities/utdelete.c
+29
-42
drivers/acpi/utilities/utglobal.c
drivers/acpi/utilities/utglobal.c
+17
-19
drivers/acpi/utilities/utmisc.c
drivers/acpi/utilities/utmisc.c
+23
-23
drivers/acpi/utilities/utxface.c
drivers/acpi/utilities/utxface.c
+35
-29
include/acpi/acconfig.h
include/acpi/acconfig.h
+1
-1
include/acpi/acevents.h
include/acpi/acevents.h
+1
-1
include/acpi/acexcep.h
include/acpi/acexcep.h
+4
-2
include/acpi/acglobal.h
include/acpi/acglobal.h
+11
-9
include/acpi/achware.h
include/acpi/achware.h
+2
-4
include/acpi/aclocal.h
include/acpi/aclocal.h
+10
-9
include/acpi/acmacros.h
include/acpi/acmacros.h
+0
-20
include/acpi/acnamesp.h
include/acpi/acnamesp.h
+5
-0
include/acpi/acobject.h
include/acpi/acobject.h
+6
-6
include/acpi/acpiosxf.h
include/acpi/acpiosxf.h
+2
-2
include/acpi/actables.h
include/acpi/actables.h
+3
-7
include/acpi/actypes.h
include/acpi/actypes.h
+2
-2
No files found.
arch/i386/kernel/mpparse.c
View file @
17d0e4f4
...
...
@@ -1086,7 +1086,7 @@ void __init mp_parse_prt (void)
/*
* Parsing through the PCI Interrupt Routing Table (PRT) and program
* routing for all
static (IOAPIC-direct)
entries.
* routing for all entries.
*/
list_for_each
(
node
,
&
acpi_prt
.
entries
)
{
entry
=
list_entry
(
node
,
struct
acpi_prt_entry
,
node
);
...
...
@@ -1100,6 +1100,10 @@ void __init mp_parse_prt (void)
else
irq
=
entry
->
link
.
index
;
/* Don't set up the ACPI SCI because it's already set up */
if
(
acpi_fadt
.
sci_int
==
irq
)
continue
;
ioapic
=
mp_find_ioapic
(
irq
);
if
(
ioapic
<
0
)
continue
;
...
...
drivers/acpi/dispatcher/dsinit.c
View file @
17d0e4f4
...
...
@@ -222,8 +222,8 @@ acpi_ds_initialize_objects (
}
ACPI_DEBUG_PRINT_RAW
((
ACPI_DB_INIT
,
"
\n
Table [%4.4s] - %hd Objects with %hd Devices %hd Methods %hd Regions
\n
"
,
table_desc
->
pointer
->
signature
,
info
.
object_count
,
"
\n
Table [%4.4s]
(id %4.4X)
- %hd Objects with %hd Devices %hd Methods %hd Regions
\n
"
,
table_desc
->
pointer
->
signature
,
table_desc
->
table_id
,
info
.
object_count
,
info
.
device_count
,
info
.
method_count
,
info
.
op_region_count
));
ACPI_DEBUG_PRINT
((
ACPI_DB_DISPATCH
,
...
...
drivers/acpi/dispatcher/dsopcode.c
View file @
17d0e4f4
...
...
@@ -82,7 +82,7 @@ acpi_ds_execute_arguments (
union
acpi_parse_object
*
arg
;
ACPI_FUNCTION_TRACE
(
"
acpi_
ds_execute_arguments"
);
ACPI_FUNCTION_TRACE
(
"ds_execute_arguments"
);
/*
...
...
@@ -99,7 +99,7 @@ acpi_ds_execute_arguments (
/* Create and initialize a new parser state */
walk_state
=
acpi_ds_create_walk_state
(
TABLE_ID_DSDT
,
NULL
,
NULL
,
NULL
);
walk_state
=
acpi_ds_create_walk_state
(
0
,
NULL
,
NULL
,
NULL
);
if
(
!
walk_state
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
...
...
@@ -139,7 +139,7 @@ acpi_ds_execute_arguments (
/* Create and initialize a new parser state */
walk_state
=
acpi_ds_create_walk_state
(
TABLE_ID_DSDT
,
NULL
,
NULL
,
NULL
);
walk_state
=
acpi_ds_create_walk_state
(
0
,
NULL
,
NULL
,
NULL
);
if
(
!
walk_state
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
...
...
drivers/acpi/ec.c
View file @
17d0e4f4
...
...
@@ -113,7 +113,7 @@ acpi_ec_wait (
switch
(
event
)
{
case
ACPI_EC_EVENT_OBF
:
do
{
acpi_hw_low_level_read
(
8
,
&
acpi_ec_status
,
&
ec
->
status_addr
,
0
);
acpi_hw_low_level_read
(
8
,
&
acpi_ec_status
,
&
ec
->
status_addr
);
if
(
acpi_ec_status
&
ACPI_EC_FLAG_OBF
)
return
0
;
udelay
(
ACPI_EC_UDELAY
);
...
...
@@ -121,7 +121,7 @@ acpi_ec_wait (
break
;
case
ACPI_EC_EVENT_IBE
:
do
{
acpi_hw_low_level_read
(
8
,
&
acpi_ec_status
,
&
ec
->
status_addr
,
0
);
acpi_hw_low_level_read
(
8
,
&
acpi_ec_status
,
&
ec
->
status_addr
);
if
(
!
(
acpi_ec_status
&
ACPI_EC_FLAG_IBF
))
return
0
;
udelay
(
ACPI_EC_UDELAY
);
...
...
@@ -161,18 +161,18 @@ acpi_ec_read (
spin_lock_irqsave
(
&
ec
->
lock
,
flags
);
acpi_hw_low_level_write
(
8
,
ACPI_EC_COMMAND_READ
,
&
ec
->
command_addr
,
0
);
acpi_hw_low_level_write
(
8
,
ACPI_EC_COMMAND_READ
,
&
ec
->
command_addr
);
result
=
acpi_ec_wait
(
ec
,
ACPI_EC_EVENT_IBE
);
if
(
result
)
goto
end
;
acpi_hw_low_level_write
(
8
,
address
,
&
ec
->
data_addr
,
0
);
acpi_hw_low_level_write
(
8
,
address
,
&
ec
->
data_addr
);
result
=
acpi_ec_wait
(
ec
,
ACPI_EC_EVENT_OBF
);
if
(
result
)
goto
end
;
acpi_hw_low_level_read
(
8
,
data
,
&
ec
->
data_addr
,
0
);
acpi_hw_low_level_read
(
8
,
data
,
&
ec
->
data_addr
);
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Read [%02x] from address [%02x]
\n
"
,
*
data
,
address
));
...
...
@@ -211,17 +211,17 @@ acpi_ec_write (
spin_lock_irqsave
(
&
ec
->
lock
,
flags
);
acpi_hw_low_level_write
(
8
,
ACPI_EC_COMMAND_WRITE
,
&
ec
->
command_addr
,
0
);
acpi_hw_low_level_write
(
8
,
ACPI_EC_COMMAND_WRITE
,
&
ec
->
command_addr
);
result
=
acpi_ec_wait
(
ec
,
ACPI_EC_EVENT_IBE
);
if
(
result
)
goto
end
;
acpi_hw_low_level_write
(
8
,
address
,
&
ec
->
data_addr
,
0
);
acpi_hw_low_level_write
(
8
,
address
,
&
ec
->
data_addr
);
result
=
acpi_ec_wait
(
ec
,
ACPI_EC_EVENT_IBE
);
if
(
result
)
goto
end
;
acpi_hw_low_level_write
(
8
,
data
,
&
ec
->
data_addr
,
0
);
acpi_hw_low_level_write
(
8
,
data
,
&
ec
->
data_addr
);
result
=
acpi_ec_wait
(
ec
,
ACPI_EC_EVENT_IBE
);
if
(
result
)
goto
end
;
...
...
@@ -310,12 +310,12 @@ acpi_ec_query (
*/
spin_lock_irqsave
(
&
ec
->
lock
,
flags
);
acpi_hw_low_level_write
(
8
,
ACPI_EC_COMMAND_QUERY
,
&
ec
->
command_addr
,
0
);
acpi_hw_low_level_write
(
8
,
ACPI_EC_COMMAND_QUERY
,
&
ec
->
command_addr
);
result
=
acpi_ec_wait
(
ec
,
ACPI_EC_EVENT_OBF
);
if
(
result
)
goto
end
;
acpi_hw_low_level_read
(
8
,
data
,
&
ec
->
data_addr
,
0
);
acpi_hw_low_level_read
(
8
,
data
,
&
ec
->
data_addr
);
if
(
!*
data
)
result
=
-
ENODATA
;
...
...
@@ -355,7 +355,7 @@ acpi_ec_gpe_query (
goto
end
;
spin_lock_irqsave
(
&
ec
->
lock
,
flags
);
acpi_hw_low_level_read
(
8
,
&
value
,
&
ec
->
command_addr
,
0
);
acpi_hw_low_level_read
(
8
,
&
value
,
&
ec
->
command_addr
);
spin_unlock_irqrestore
(
&
ec
->
lock
,
flags
);
/* TBD: Implement asynch events!
...
...
drivers/acpi/events/evgpe.c
View file @
17d0e4f4
...
...
@@ -170,7 +170,7 @@ acpi_ev_gpe_detect (
/* Read the Status Register */
status
=
acpi_hw_low_level_read
(
ACPI_GPE_REGISTER_WIDTH
,
&
in_value
,
&
gpe_register_info
->
status_address
,
0
);
&
gpe_register_info
->
status_address
);
gpe_register_info
->
status
=
(
u8
)
in_value
;
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
...
...
@@ -179,7 +179,7 @@ acpi_ev_gpe_detect (
/* Read the Enable Register */
status
=
acpi_hw_low_level_read
(
ACPI_GPE_REGISTER_WIDTH
,
&
in_value
,
&
gpe_register_info
->
enable_address
,
0
);
&
gpe_register_info
->
enable_address
);
gpe_register_info
->
enable
=
(
u8
)
in_value
;
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
...
...
drivers/acpi/events/evgpeblk.c
View file @
17d0e4f4
...
...
@@ -634,13 +634,13 @@ acpi_ev_create_gpe_info_blocks (
* by writing a '0'.
*/
status
=
acpi_hw_low_level_write
(
ACPI_GPE_REGISTER_WIDTH
,
0x00
,
&
this_register
->
enable_address
,
0
);
&
this_register
->
enable_address
);
if
(
ACPI_FAILURE
(
status
))
{
goto
error_exit
;
}
status
=
acpi_hw_low_level_write
(
ACPI_GPE_REGISTER_WIDTH
,
0xFF
,
&
this_register
->
status_address
,
0
);
&
this_register
->
status_address
);
if
(
ACPI_FAILURE
(
status
))
{
goto
error_exit
;
}
...
...
drivers/acpi/events/evmisc.c
View file @
17d0e4f4
...
...
@@ -156,10 +156,10 @@ acpi_ev_queue_notify_request (
case
ACPI_TYPE_POWER
:
if
(
notify_value
<=
ACPI_MAX_SYS_NOTIFY
)
{
handler_obj
=
obj_desc
->
common_notify
.
sys
_handler
;
handler_obj
=
obj_desc
->
common_notify
.
sys
tem_notify
;
}
else
{
handler_obj
=
obj_desc
->
common_notify
.
d
rv_handler
;
handler_obj
=
obj_desc
->
common_notify
.
d
evice_notify
;
}
break
;
...
...
@@ -171,8 +171,8 @@ acpi_ev_queue_notify_request (
/* If there is any handler to run, schedule the dispatcher */
if
((
acpi_gbl_sys_notify
.
handler
&&
(
notify_value
<=
ACPI_MAX_SYS_NOTIFY
))
||
(
acpi_gbl_d
rv
_notify
.
handler
&&
(
notify_value
>
ACPI_MAX_SYS_NOTIFY
))
||
if
((
acpi_gbl_sys
tem
_notify
.
handler
&&
(
notify_value
<=
ACPI_MAX_SYS_NOTIFY
))
||
(
acpi_gbl_d
evice
_notify
.
handler
&&
(
notify_value
>
ACPI_MAX_SYS_NOTIFY
))
||
handler_obj
)
{
notify_info
=
acpi_ut_create_generic_state
();
if
(
!
notify_info
)
{
...
...
@@ -235,17 +235,17 @@ acpi_ev_notify_dispatch (
if
(
notify_info
->
notify
.
value
<=
ACPI_MAX_SYS_NOTIFY
)
{
/* Global system notification handler */
if
(
acpi_gbl_sys_notify
.
handler
)
{
global_handler
=
acpi_gbl_sys_notify
.
handler
;
global_context
=
acpi_gbl_sys_notify
.
context
;
if
(
acpi_gbl_sys
tem
_notify
.
handler
)
{
global_handler
=
acpi_gbl_sys
tem
_notify
.
handler
;
global_context
=
acpi_gbl_sys
tem
_notify
.
context
;
}
}
else
{
/* Global driver notification handler */
if
(
acpi_gbl_d
rv
_notify
.
handler
)
{
global_handler
=
acpi_gbl_d
rv
_notify
.
handler
;
global_context
=
acpi_gbl_d
rv
_notify
.
context
;
if
(
acpi_gbl_d
evice
_notify
.
handler
)
{
global_handler
=
acpi_gbl_d
evice
_notify
.
handler
;
global_context
=
acpi_gbl_d
evice
_notify
.
context
;
}
}
...
...
@@ -259,8 +259,8 @@ acpi_ev_notify_dispatch (
handler_obj
=
notify_info
->
notify
.
handler_obj
;
if
(
handler_obj
)
{
handler_obj
->
notify
_handler
.
handler
(
notify_info
->
notify
.
node
,
notify_info
->
notify
.
value
,
handler_obj
->
notify
_handler
.
context
);
handler_obj
->
notify
.
handler
(
notify_info
->
notify
.
node
,
notify_info
->
notify
.
value
,
handler_obj
->
notify
.
context
);
}
/* All done with the info object */
...
...
drivers/acpi/events/evregion.c
View file @
17d0e4f4
...
...
@@ -161,10 +161,10 @@ acpi_ev_execute_reg_method (
}
/*
*
_REG method has two arguments
*
Arg0: Integer: Operation region space ID
* _REG method has two arguments
* Arg0: Integer: Operation region space ID
* Same value as region_obj->Region.space_id
*
Arg1: Integer: connection status
* Arg1: Integer: connection status
* 1 for connecting the handler,
* 0 for disconnecting the handler
* Passed as a parameter
...
...
@@ -180,16 +180,14 @@ acpi_ev_execute_reg_method (
goto
cleanup
;
}
/*
* Set up the parameter objects
*/
/* Set up the parameter objects */
params
[
0
]
->
integer
.
value
=
region_obj
->
region
.
space_id
;
params
[
1
]
->
integer
.
value
=
function
;
params
[
2
]
=
NULL
;
/*
* Execute the method, no return value
*/
/* Execute the method, no return value */
ACPI_DEBUG_EXEC
(
acpi_ut_display_init_pathname
(
ACPI_TYPE_METHOD
,
region_obj2
->
extra
.
method_REG
,
NULL
));
status
=
acpi_ns_evaluate_by_handle
(
region_obj2
->
extra
.
method_REG
,
params
,
NULL
);
...
...
@@ -245,10 +243,9 @@ acpi_ev_address_space_dispatch (
return_ACPI_STATUS
(
AE_NOT_EXIST
);
}
/*
* Ensure that there is a handler associated with this region
*/
handler_desc
=
region_obj
->
region
.
addr_handler
;
/* Ensure that there is a handler associated with this region */
handler_desc
=
region_obj
->
region
.
address_space
;
if
(
!
handler_desc
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"no handler for region(%p) [%s]
\n
"
,
region_obj
,
acpi_ut_get_region_name
(
region_obj
->
region
.
space_id
)));
...
...
@@ -264,24 +261,23 @@ acpi_ev_address_space_dispatch (
/*
* This region has not been initialized yet, do it
*/
region_setup
=
handler_desc
->
addr
_handler
.
setup
;
region_setup
=
handler_desc
->
addr
ess_space
.
setup
;
if
(
!
region_setup
)
{
/*
* Bad news, no init routine and not init'd
*/
/* No initialization routine, exit with error */
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"No init routine for region(%p) [%s]
\n
"
,
region_obj
,
acpi_ut_get_region_name
(
region_obj
->
region
.
space_id
)));
return_ACPI_STATUS
(
AE_
UNKNOWN_STATUS
);
return_ACPI_STATUS
(
AE_
NOT_EXIST
);
}
/*
* We must exit the interpreter because the region setup will potentially
* execute control methods
* execute control methods
(e.g., _REG method for this region)
*/
acpi_ex_exit_interpreter
();
status
=
region_setup
(
region_obj
,
ACPI_REGION_ACTIVATE
,
handler_desc
->
addr
_handler
.
context
,
&
region_context
);
handler_desc
->
addr
ess_space
.
context
,
&
region_context
);
/* Re-enter the interpreter */
...
...
@@ -290,9 +286,8 @@ acpi_ev_address_space_dispatch (
return_ACPI_STATUS
(
status2
);
}
/*
* Init routine may fail
*/
/* Check for failure of the Region Setup */
if
(
ACPI_FAILURE
(
status
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Region Init: %s [%s]
\n
"
,
acpi_format_exception
(
status
),
...
...
@@ -300,40 +295,50 @@ acpi_ev_address_space_dispatch (
return_ACPI_STATUS
(
status
);
}
region_obj
->
region
.
flags
|=
AOPOBJ_SETUP_COMPLETE
;
/*
* Save the returned context for use in all accesses to
* this particular region.
* Region initialization may have been completed by region_setup
*/
region_obj2
->
extra
.
region_context
=
region_context
;
if
(
!
(
region_obj
->
region
.
flags
&
AOPOBJ_SETUP_COMPLETE
))
{
region_obj
->
region
.
flags
|=
AOPOBJ_SETUP_COMPLETE
;
if
(
region_obj2
->
extra
.
region_context
)
{
/* The handler for this region was already installed */
ACPI_MEM_FREE
(
region_context
);
}
else
{
/*
* Save the returned context for use in all accesses to
* this particular region
*/
region_obj2
->
extra
.
region_context
=
region_context
;
}
}
}
/*
* We have everything we need, begin the process
*/
handler
=
handler_desc
->
addr_handler
.
handler
;
/* We have everything we need, we can invoke the address space handler */
handler
=
handler_desc
->
address_space
.
handler
;
ACPI_DEBUG_PRINT
((
ACPI_DB_OPREGION
,
"Handler %p (@%p) Address %8.8X%8.8X [%s]
\n
"
,
&
region_obj
->
region
.
addr
_handler
->
addr_handler
,
handler
,
&
region_obj
->
region
.
addr
ess_space
->
address_space
,
handler
,
ACPI_HIDWORD
(
address
),
ACPI_LODWORD
(
address
),
acpi_ut_get_region_name
(
region_obj
->
region
.
space_id
)));
if
(
!
(
handler_desc
->
addr
_handler
.
flags
&
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED
))
{
if
(
!
(
handler_desc
->
addr
ess_space
.
flags
&
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED
))
{
/*
*
For handlers other than the default (supplied) handlers, we must
*
exit the interpreter because the handler *might* block -- we don't
*
know what it will do, so we can't hold the lock on the intepreter.
* For handlers other than the default (supplied) handlers, we must
* exit the interpreter because the handler *might* block -- we don't
* know what it will do, so we can't hold the lock on the intepreter.
*/
acpi_ex_exit_interpreter
();
}
/*
* Invoke the handler.
*/
/* Call the handler */
status
=
handler
(
function
,
address
,
bit_width
,
value
,
handler_desc
->
addr
_handler
.
context
,
handler_desc
->
addr
ess_space
.
context
,
region_obj2
->
extra
.
region_context
);
if
(
ACPI_FAILURE
(
status
))
{
...
...
@@ -342,7 +347,7 @@ acpi_ev_address_space_dispatch (
acpi_format_exception
(
status
)));
}
if
(
!
(
handler_desc
->
addr
_handler
.
flags
&
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED
))
{
if
(
!
(
handler_desc
->
addr
ess_space
.
flags
&
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED
))
{
/*
* We just returned from a non-default handler, we must re-enter the
* interpreter
...
...
@@ -393,35 +398,30 @@ acpi_ev_detach_region(
}
region_context
=
region_obj2
->
extra
.
region_context
;
/*
* Get the address handler from the region object
*/
handler_obj
=
region_obj
->
region
.
addr_handler
;
/* Get the address handler from the region object */
handler_obj
=
region_obj
->
region
.
address_space
;
if
(
!
handler_obj
)
{
/*
* This region has no handler, all done
*/
/* This region has no handler, all done */
return_VOID
;
}
/* Find this region in the handler's list */
/*
* Find this region in the handler's list
*/
obj_desc
=
handler_obj
->
addr_handler
.
region_list
;
last_obj_ptr
=
&
handler_obj
->
addr_handler
.
region_list
;
obj_desc
=
handler_obj
->
address_space
.
region_list
;
last_obj_ptr
=
&
handler_obj
->
address_space
.
region_list
;
while
(
obj_desc
)
{
/*
* See if this is the one
*/
/* Is this the correct Region? */
if
(
obj_desc
==
region_obj
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_OPREGION
,
"Removing Region %p from address handler %p
\n
"
,
region_obj
,
handler_obj
));
/*
* This is it, remove it from the handler's list
*/
/* This is it, remove it from the handler's list */
*
last_obj_ptr
=
obj_desc
->
region
.
next
;
obj_desc
->
region
.
next
=
NULL
;
/* Must clear field */
...
...
@@ -432,9 +432,8 @@ acpi_ev_detach_region(
}
}
/*
* Now stop region accesses by executing the _REG method
*/
/* Now stop region accesses by executing the _REG method */
status
=
acpi_ev_execute_reg_method
(
region_obj
,
0
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"%s from region _REG, [%s]
\n
"
,
...
...
@@ -449,16 +448,14 @@ acpi_ev_detach_region(
}
}
/*
* Call the setup handler with the deactivate notification
*/
region_setup
=
handler_obj
->
addr_handler
.
setup
;
/* Call the setup handler with the deactivate notification */
region_setup
=
handler_obj
->
address_space
.
setup
;
status
=
region_setup
(
region_obj
,
ACPI_REGION_DEACTIVATE
,
handler_obj
->
addr_handler
.
context
,
&
region_context
);
handler_obj
->
address_space
.
context
,
&
region_context
);
/* Init routine may fail, Just ignore errors */
/*
* Init routine may fail, Just ignore errors
*/
if
(
ACPI_FAILURE
(
status
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"%s from region init, [%s]
\n
"
,
acpi_format_exception
(
status
),
...
...
@@ -468,31 +465,29 @@ acpi_ev_detach_region(
region_obj
->
region
.
flags
&=
~
(
AOPOBJ_SETUP_COMPLETE
);
/*
*
Remove handler reference in the region
* Remove handler reference in the region
*
*
NOTE: this doesn't mean that the region goes away
*
The region is just inaccessible as indicated to
*
the _REG method
* NOTE: this doesn't mean that the region goes away
* The region is just inaccessible as indicated to
* the _REG method
*
*
If the region is on the handler's list
*
this better be the region's handler
* If the region is on the handler's list
* this better be the region's handler
*/
region_obj
->
region
.
addr_handler
=
NULL
;
region_obj
->
region
.
address_space
=
NULL
;
acpi_ut_remove_reference
(
handler_obj
);
return_VOID
;
}
}
/* found the right handler
*/
/* Walk the linked list of handlers
*/
/*
* Move through the linked list of handlers
*/
last_obj_ptr
=
&
obj_desc
->
region
.
next
;
obj_desc
=
obj_desc
->
region
.
next
;
}
/*
* If we get here, the region was not in the handler's region list
*/
/* If we get here, the region was not in the handler's region list */
ACPI_DEBUG_PRINT
((
ACPI_DB_OPREGION
,
"Cannot remove region %p from address handler %p
\n
"
,
region_obj
,
handler_obj
));
...
...
@@ -534,16 +529,19 @@ acpi_ev_attach_region (
region_obj
,
handler_obj
,
acpi_ut_get_region_name
(
region_obj
->
region
.
space_id
)));
/*
* Link this region to the front of the handler's list
*/
region_obj
->
region
.
next
=
handler_obj
->
addr_handler
.
region_list
;
handler_obj
->
addr_handler
.
region_list
=
region_obj
;
/* Link this region to the front of the handler's list */
/*
* Set the region's handler
*/
region_obj
->
region
.
addr_handler
=
handler_obj
;
region_obj
->
region
.
next
=
handler_obj
->
address_space
.
region_list
;
handler_obj
->
address_space
.
region_list
=
region_obj
;
/* Install the region's handler */
if
(
region_obj
->
region
.
address_space
)
{
return_ACPI_STATUS
(
AE_ALREADY_EXISTS
);
}
region_obj
->
region
.
address_space
=
handler_obj
;
acpi_ut_add_reference
(
handler_obj
);
/*
* Tell all users that this region is usable by running the _REG
...
...
@@ -571,14 +569,14 @@ acpi_ev_attach_region (
/*******************************************************************************
*
* FUNCTION: acpi_ev_
addr_handler_help
er
* FUNCTION: acpi_ev_
install_handl
er
*
* PARAMETERS: Handle - Node to be dumped
* Level - Nesting level of the handle
* Context - Passed into acpi_ns_walk_namespace
*
* DESCRIPTION: This routine installs an address handler into objects that are
* of type Region.
* of type Region
or Device
.
*
* If the Object is a Device, and the device has a handler of
* the same type then the search is terminated in that branch.
...
...
@@ -589,20 +587,20 @@ acpi_ev_attach_region (
******************************************************************************/
acpi_status
acpi_ev_
addr_handler_help
er
(
acpi_ev_
install_handl
er
(
acpi_handle
obj_handle
,
u32
level
,
void
*
context
,
void
**
return_value
)
{
union
acpi_operand_object
*
handler_obj
;
union
acpi_operand_object
*
tmp
_obj
;
union
acpi_operand_object
*
next_handler
_obj
;
union
acpi_operand_object
*
obj_desc
;
struct
acpi_namespace_node
*
node
;
acpi_status
status
;
ACPI_FUNCTION_NAME
(
"ev_
addr_handler_help
er"
);
ACPI_FUNCTION_NAME
(
"ev_
install_handl
er"
);
handler_obj
=
(
union
acpi_operand_object
*
)
context
;
...
...
@@ -621,8 +619,8 @@ acpi_ev_addr_handler_helper (
}
/*
*
We only care about regions.and objects
*
that can have address
handlers
* We only care about regions.and objects
*
that are allowed to have address space
handlers
*/
if
((
node
->
type
!=
ACPI_TYPE_DEVICE
)
&&
(
node
->
type
!=
ACPI_TYPE_REGION
)
&&
...
...
@@ -634,81 +632,70 @@ acpi_ev_addr_handler_helper (
obj_desc
=
acpi_ns_get_attached_object
(
node
);
if
(
!
obj_desc
)
{
/*
* The object DNE, we don't care about it
*/
/* No object, just exit */
return
(
AE_OK
);
}
/*
* Devices are handled different than regions
*/
/* Devices are handled different than regions */
if
(
ACPI_GET_OBJECT_TYPE
(
obj_desc
)
==
ACPI_TYPE_DEVICE
)
{
/*
* See if this guy has any handlers
*/
tmp_obj
=
obj_desc
->
device
.
addr_handler
;
while
(
tmp_obj
)
{
/*
* Now let's see if it's for the same address space.
*/
if
(
tmp_obj
->
addr_handler
.
space_id
==
handler_obj
->
addr_handler
.
space_id
)
{
/*
* It's for the same address space
*/
/* Check if this Device already has a handler for this address space */
next_handler_obj
=
obj_desc
->
device
.
address_space
;
while
(
next_handler_obj
)
{
/* Found a handler, is it for the same address space? */
if
(
next_handler_obj
->
address_space
.
space_id
==
handler_obj
->
address_space
.
space_id
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_OPREGION
,
"Found handler for region [%s] in device %p(%p) handler %p
\n
"
,
acpi_ut_get_region_name
(
handler_obj
->
addr
_handler
.
space_id
),
obj_desc
,
tmp
_obj
,
handler_obj
));
acpi_ut_get_region_name
(
handler_obj
->
addr
ess_space
.
space_id
),
obj_desc
,
next_handler
_obj
,
handler_obj
));
/*
*
Since the object we found it on was a device, then it
*
means that someone has already installed a handler for
*
the branch of the namespace from this device on. Just
*
bail out telling the walk routine to not traverse this
*
branch. This preserves the scoping rule for handlers.
* Since the object we found it on was a device, then it
* means that someone has already installed a handler for
* the branch of the namespace from this device on. Just
* bail out telling the walk routine to not traverse this
* branch. This preserves the scoping rule for handlers.
*/
return
(
AE_CTRL_DEPTH
);
}
/*
* Move through the linked list of handlers
*/
tmp_obj
=
tmp_obj
->
addr_handler
.
next
;
/* Walk the linked list of handlers attached to this device */
next_handler_obj
=
next_handler_obj
->
address_space
.
next
;
}
/*
*
As long as the device didn't have a handler for this
*
space we don't care about it. We just ignore it and
*
proceed.
* As long as the device didn't have a handler for this
* space we don't care about it. We just ignore it and
* proceed.
*/
return
(
AE_OK
);
}
/*
* Only here if it was a region
*/
if
(
obj_desc
->
region
.
space_id
!=
handler_obj
->
addr_handler
.
space_id
)
{
/* Object is a Region */
if
(
obj_desc
->
region
.
space_id
!=
handler_obj
->
address_space
.
space_id
)
{
/*
*
This region is for a different address space
* ignore it
* This region is for a different address space
*
-- just
ignore it
*/
return
(
AE_OK
);
}
/*
*
Now we have a region and it is for the handler's address
*
space type.
* Now we have a region and it is for the handler's address
* space type.
*
*
First disconnect region for any previous handler (if any)
* First disconnect region for any previous handler (if any)
*/
acpi_ev_detach_region
(
obj_desc
,
FALSE
);
/*
* Then connect the region to the new handler
*/
status
=
acpi_ev_attach_region
(
handler_obj
,
obj_desc
,
FALSE
);
/* Connect the region to the new handler */
status
=
acpi_ev_attach_region
(
handler_obj
,
obj_desc
,
FALSE
);
return
(
status
);
}
...
...
drivers/acpi/events/evrgnini.c
View file @
17d0e4f4
...
...
@@ -165,10 +165,11 @@ acpi_ev_pci_config_region_setup (
void
**
region_context
)
{
acpi_status
status
=
AE_OK
;
acpi_integer
temp
;
acpi_integer
pci_value
;
struct
acpi_pci_id
*
pci_id
=
*
region_context
;
union
acpi_operand_object
*
handler_obj
;
struct
acpi_namespace_node
*
node
;
struct
acpi_namespace_node
*
parent_node
;
struct
acpi_namespace_node
*
pci_root_node
;
union
acpi_operand_object
*
region_obj
=
(
union
acpi_operand_object
*
)
handle
;
struct
acpi_device_id
object_hID
;
...
...
@@ -176,7 +177,7 @@ acpi_ev_pci_config_region_setup (
ACPI_FUNCTION_TRACE
(
"ev_pci_config_region_setup"
);
handler_obj
=
region_obj
->
region
.
addr
_handler
;
handler_obj
=
region_obj
->
region
.
addr
ess_space
;
if
(
!
handler_obj
)
{
/*
* No installed handler. This shouldn't happen because the dispatch
...
...
@@ -187,45 +188,15 @@ acpi_ev_pci_config_region_setup (
return_ACPI_STATUS
(
AE_NOT_EXIST
);
}
*
region_context
=
NULL
;
if
(
function
==
ACPI_REGION_DEACTIVATE
)
{
if
(
pci_id
)
{
ACPI_MEM_FREE
(
pci_id
);
*
region_context
=
NULL
;
}
return_ACPI_STATUS
(
status
);
}
/* Create a new context */
pci_id
=
ACPI_MEM_CALLOCATE
(
sizeof
(
struct
acpi_pci_id
));
if
(
!
pci_id
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
/*
* For PCI Config space access, we have to pass the segment, bus,
* device and function numbers. This routine must acquire those.
*/
/*
* First get device and function numbers from the _ADR object
* in the parent's scope.
*/
node
=
acpi_ns_get_parent_node
(
region_obj
->
region
.
node
);
/* Evaluate the _ADR object */
status
=
acpi_ut_evaluate_numeric_object
(
METHOD_NAME__ADR
,
node
,
&
temp
);
/*
* The default is zero, and since the allocation above zeroed
* the data, just do nothing on failure.
*/
if
(
ACPI_SUCCESS
(
status
))
{
pci_id
->
device
=
ACPI_HIWORD
(
ACPI_LODWORD
(
temp
));
pci_id
->
function
=
ACPI_LOWORD
(
ACPI_LODWORD
(
temp
));
}
parent_node
=
acpi_ns_get_parent_node
(
region_obj
->
region
.
node
);
/*
* Get the _SEG and _BBN values from the device upon which the handler
...
...
@@ -236,16 +207,16 @@ acpi_ev_pci_config_region_setup (
*/
/*
* If the addr
_handler
.Node is still pointing to the root, we need
* If the addr
ess_space
.Node is still pointing to the root, we need
* to scan upward for a PCI Root bridge and re-associate the op_region
* handlers with that device.
*/
if
(
handler_obj
->
addr
_handler
.
node
==
acpi_gbl_root_node
)
{
/*
* Node is currently the parent object
*/
while
(
node
!=
acpi_gbl_root_node
)
{
status
=
acpi_ut_execute_HID
(
node
,
&
object_hID
);
if
(
handler_obj
->
addr
ess_space
.
node
==
acpi_gbl_root_node
)
{
/*
Start search from the parent object */
pci_root_node
=
parent_node
;
while
(
pci_root_
node
!=
acpi_gbl_root_node
)
{
status
=
acpi_ut_execute_HID
(
pci_root_
node
,
&
object_hID
);
if
(
ACPI_SUCCESS
(
status
))
{
/* Got a valid _HID, check if this is a PCI root */
...
...
@@ -253,44 +224,89 @@ acpi_ev_pci_config_region_setup (
sizeof
(
PCI_ROOT_HID_STRING
))))
{
/* Install a handler for this PCI root bridge */
status
=
acpi_install_address_space_handler
((
acpi_handle
)
node
,
status
=
acpi_install_address_space_handler
((
acpi_handle
)
pci_root_
node
,
ACPI_ADR_SPACE_PCI_CONFIG
,
ACPI_DEFAULT_HANDLER
,
NULL
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_REPORT_ERROR
((
"Could not install pci_config handler for %4.4s, %s
\n
"
,
node
->
name
.
ascii
,
acpi_format_exception
(
status
)));
if
(
status
==
AE_SAME_HANDLER
)
{
/*
* It is OK if the handler is already installed on the root
* bridge. Still need to return a context object for the
* new PCI_Config operation region, however.
*/
status
=
AE_OK
;
}
else
{
ACPI_REPORT_ERROR
((
"Could not install pci_config handler for Root Bridge %4.4s, %s
\n
"
,
pci_root_node
->
name
.
ascii
,
acpi_format_exception
(
status
)));
}
}
break
;
}
}
node
=
acpi_ns_get_parent_node
(
node
);
pci_root_node
=
acpi_ns_get_parent_node
(
pci_root_
node
);
}
/* PCI root bridge not found, use namespace root node */
}
else
{
node
=
handler_obj
->
addr_handler
.
node
;
pci_root_node
=
handler_obj
->
address_space
.
node
;
}
/*
* The PCI segment number comes from the _SEG method
* If this region is now initialized, we are done.
* (install_address_space_handler could have initialized it)
*/
status
=
acpi_ut_evaluate_numeric_object
(
METHOD_NAME__SEG
,
node
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
{
pci_id
->
segment
=
ACPI_LOWORD
(
temp
);
if
(
region_obj
->
region
.
flags
&
AOPOBJ_SETUP_COMPLETE
)
{
return_ACPI_STATUS
(
AE_OK
);
}
/* Region is still not initialized. Create a new context */
pci_id
=
ACPI_MEM_CALLOCATE
(
sizeof
(
struct
acpi_pci_id
));
if
(
!
pci_id
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
/*
* The PCI bus number comes from the _BBN method
* For PCI_Config space access, we need the segment, bus,
* device and function numbers. Acquire them here.
*/
status
=
acpi_ut_evaluate_numeric_object
(
METHOD_NAME__BBN
,
node
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
{
pci_id
->
bus
=
ACPI_LOWORD
(
temp
);
}
/*
* Complete this device's pci_id
* Get the PCI device and function numbers from the _ADR object
* contained in the parent's scope.
*/
acpi_os_derive_pci_id
(
node
,
region_obj
->
region
.
node
,
&
pci_id
);
status
=
acpi_ut_evaluate_numeric_object
(
METHOD_NAME__ADR
,
parent_node
,
&
pci_value
);
/*
* The default is zero, and since the allocation above zeroed
* the data, just do nothing on failure.
*/
if
(
ACPI_SUCCESS
(
status
))
{
pci_id
->
device
=
ACPI_HIWORD
(
ACPI_LODWORD
(
pci_value
));
pci_id
->
function
=
ACPI_LOWORD
(
ACPI_LODWORD
(
pci_value
));
}
/* The PCI segment number comes from the _SEG method */
status
=
acpi_ut_evaluate_numeric_object
(
METHOD_NAME__SEG
,
pci_root_node
,
&
pci_value
);
if
(
ACPI_SUCCESS
(
status
))
{
pci_id
->
segment
=
ACPI_LOWORD
(
pci_value
);
}
/* The PCI bus number comes from the _BBN method */
status
=
acpi_ut_evaluate_numeric_object
(
METHOD_NAME__BBN
,
pci_root_node
,
&
pci_value
);
if
(
ACPI_SUCCESS
(
status
))
{
pci_id
->
bus
=
ACPI_LOWORD
(
pci_value
);
}
/* Complete this device's pci_id */
acpi_os_derive_pci_id
(
pci_root_node
,
region_obj
->
region
.
node
,
&
pci_id
);
*
region_context
=
pci_id
;
return_ACPI_STATUS
(
AE_OK
);
...
...
@@ -451,14 +467,15 @@ acpi_ev_initialize_region (
node
=
acpi_ns_get_parent_node
(
region_obj
->
region
.
node
);
space_id
=
region_obj
->
region
.
space_id
;
region_obj
->
region
.
addr_handler
=
NULL
;
/* Setup defaults */
region_obj
->
region
.
address_space
=
NULL
;
region_obj2
->
extra
.
method_REG
=
NULL
;
region_obj
->
common
.
flags
&=
~
(
AOPOBJ_SETUP_COMPLETE
);
region_obj
->
common
.
flags
|=
AOPOBJ_OBJECT_INITIALIZED
;
/*
* Find any "_REG" method associated with this region definition
*/
/* Find any "_REG" method associated with this region definition */
status
=
acpi_ns_search_node
(
*
reg_name_ptr
,
node
,
ACPI_TYPE_METHOD
,
&
method_node
);
if
(
ACPI_SUCCESS
(
status
))
{
...
...
@@ -475,29 +492,27 @@ acpi_ev_initialize_region (
* ie: acpi_gbl_root_node->parent_entry being set to NULL
*/
while
(
node
)
{
/*
* Check to see if a handler exists
*/
/* Check to see if a handler exists */
handler_obj
=
NULL
;
obj_desc
=
acpi_ns_get_attached_object
(
node
);
if
(
obj_desc
)
{
/*
* Can only be a handler if the object exists
*/
/* Can only be a handler if the object exists */
switch
(
node
->
type
)
{
case
ACPI_TYPE_DEVICE
:
handler_obj
=
obj_desc
->
device
.
addr
_handler
;
handler_obj
=
obj_desc
->
device
.
addr
ess_space
;
break
;
case
ACPI_TYPE_PROCESSOR
:
handler_obj
=
obj_desc
->
processor
.
addr
_handler
;
handler_obj
=
obj_desc
->
processor
.
addr
ess_space
;
break
;
case
ACPI_TYPE_THERMAL
:
handler_obj
=
obj_desc
->
thermal_zone
.
addr
_handler
;
handler_obj
=
obj_desc
->
thermal_zone
.
addr
ess_space
;
break
;
default:
...
...
@@ -508,7 +523,7 @@ acpi_ev_initialize_region (
while
(
handler_obj
)
{
/* Is this handler of the correct type? */
if
(
handler_obj
->
addr
_handler
.
space_id
==
space_id
)
{
if
(
handler_obj
->
addr
ess_space
.
space_id
==
space_id
)
{
/* Found correct handler */
ACPI_DEBUG_PRINT
((
ACPI_DB_OPREGION
,
...
...
@@ -523,7 +538,7 @@ acpi_ev_initialize_region (
/* Try next handler in the list */
handler_obj
=
handler_obj
->
addr
_handler
.
next
;
handler_obj
=
handler_obj
->
addr
ess_space
.
next
;
}
}
...
...
@@ -534,9 +549,8 @@ acpi_ev_initialize_region (
node
=
acpi_ns_get_parent_node
(
node
);
}
/*
* If we get here, there is no handler for this region
*/
/* If we get here, there is no handler for this region */
ACPI_DEBUG_PRINT
((
ACPI_DB_OPREGION
,
"No handler for region_type %s(%X) (region_obj %p)
\n
"
,
acpi_ut_get_region_name
(
space_id
),
space_id
,
region_obj
));
...
...
drivers/acpi/events/evxface.c
View file @
17d0e4f4
...
...
@@ -244,22 +244,22 @@ acpi_install_notify_handler (
/* Make sure the handler is not already installed */
if
(((
handler_type
==
ACPI_SYSTEM_NOTIFY
)
&&
acpi_gbl_sys_notify
.
handler
)
||
acpi_gbl_system_notify
.
handler
)
||
((
handler_type
==
ACPI_DEVICE_NOTIFY
)
&&
acpi_gbl_drv
_notify
.
handler
))
{
acpi_gbl_device
_notify
.
handler
))
{
status
=
AE_ALREADY_EXISTS
;
goto
unlock_and_exit
;
}
if
(
handler_type
==
ACPI_SYSTEM_NOTIFY
)
{
acpi_gbl_sys
_notify
.
node
=
node
;
acpi_gbl_sys_notify
.
handler
=
handler
;
acpi_gbl_sys_notify
.
context
=
context
;
acpi_gbl_sys
tem_notify
.
node
=
node
;
acpi_gbl_sys
tem
_notify
.
handler
=
handler
;
acpi_gbl_sys
tem
_notify
.
context
=
context
;
}
else
/* ACPI_DEVICE_NOTIFY */
{
acpi_gbl_d
rv_notify
.
node
=
node
;
acpi_gbl_d
rv
_notify
.
handler
=
handler
;
acpi_gbl_d
rv
_notify
.
context
=
context
;
acpi_gbl_d
evice_notify
.
node
=
node
;
acpi_gbl_d
evice
_notify
.
handler
=
handler
;
acpi_gbl_d
evice
_notify
.
context
=
context
;
}
/* Global notify handler installed */
...
...
@@ -282,13 +282,12 @@ acpi_install_notify_handler (
obj_desc
=
acpi_ns_get_attached_object
(
node
);
if
(
obj_desc
)
{
/* Object exists - make sure there's no handler */
if
(((
handler_type
==
ACPI_SYSTEM_NOTIFY
)
&&
obj_desc
->
common_notify
.
sys_handler
)
||
obj_desc
->
common_notify
.
system_notify
)
||
((
handler_type
==
ACPI_DEVICE_NOTIFY
)
&&
obj_desc
->
common_notify
.
drv_handler
))
{
obj_desc
->
common_notify
.
device_notify
))
{
status
=
AE_ALREADY_EXISTS
;
goto
unlock_and_exit
;
}
...
...
@@ -305,6 +304,11 @@ acpi_install_notify_handler (
/* Attach new object to the Node */
status
=
acpi_ns_attach_object
(
device
,
obj_desc
,
node
->
type
);
/* Remove local reference to the object */
acpi_ut_remove_reference
(
obj_desc
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
...
...
@@ -318,15 +322,15 @@ acpi_install_notify_handler (
goto
unlock_and_exit
;
}
notify_obj
->
notify
_handler
.
node
=
node
;
notify_obj
->
notify
_handler
.
handler
=
handler
;
notify_obj
->
notify
_handler
.
context
=
context
;
notify_obj
->
notify
.
node
=
node
;
notify_obj
->
notify
.
handler
=
handler
;
notify_obj
->
notify
.
context
=
context
;
if
(
handler_type
==
ACPI_SYSTEM_NOTIFY
)
{
obj_desc
->
common_notify
.
sys
_handler
=
notify_obj
;
obj_desc
->
common_notify
.
sys
tem_notify
=
notify_obj
;
}
else
/* ACPI_DEVICE_NOTIFY */
{
obj_desc
->
common_notify
.
d
rv_handler
=
notify_obj
;
obj_desc
->
common_notify
.
d
evice_notify
=
notify_obj
;
}
}
...
...
@@ -395,22 +399,22 @@ acpi_remove_notify_handler (
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Removing notify handler for ROOT object.
\n
"
));
if
(((
handler_type
==
ACPI_SYSTEM_NOTIFY
)
&&
!
acpi_gbl_sys_notify
.
handler
)
||
!
acpi_gbl_sys
tem
_notify
.
handler
)
||
((
handler_type
==
ACPI_DEVICE_NOTIFY
)
&&
!
acpi_gbl_d
rv
_notify
.
handler
))
{
!
acpi_gbl_d
evice
_notify
.
handler
))
{
status
=
AE_NOT_EXIST
;
goto
unlock_and_exit
;
}
if
(
handler_type
==
ACPI_SYSTEM_NOTIFY
)
{
acpi_gbl_sys_notify
.
node
=
NULL
;
acpi_gbl_sys_notify
.
handler
=
NULL
;
acpi_gbl_sys_notify
.
context
=
NULL
;
acpi_gbl_sys
tem
_notify
.
node
=
NULL
;
acpi_gbl_sys
tem
_notify
.
handler
=
NULL
;
acpi_gbl_sys
tem
_notify
.
context
=
NULL
;
}
else
{
acpi_gbl_d
rv
_notify
.
node
=
NULL
;
acpi_gbl_d
rv
_notify
.
handler
=
NULL
;
acpi_gbl_d
rv
_notify
.
context
=
NULL
;
acpi_gbl_d
evice
_notify
.
node
=
NULL
;
acpi_gbl_d
evice
_notify
.
handler
=
NULL
;
acpi_gbl_d
evice
_notify
.
context
=
NULL
;
}
}
...
...
@@ -436,14 +440,14 @@ acpi_remove_notify_handler (
/* Object exists - make sure there's an existing handler */
if
(
handler_type
==
ACPI_SYSTEM_NOTIFY
)
{
notify_obj
=
obj_desc
->
common_notify
.
sys
_handler
;
notify_obj
=
obj_desc
->
common_notify
.
sys
tem_notify
;
}
else
{
notify_obj
=
obj_desc
->
common_notify
.
d
rv_handler
;
notify_obj
=
obj_desc
->
common_notify
.
d
evice_notify
;
}
if
((
!
notify_obj
)
||
(
notify_obj
->
notify
_handler
.
handler
!=
handler
))
{
(
notify_obj
->
notify
.
handler
!=
handler
))
{
status
=
AE_BAD_PARAMETER
;
goto
unlock_and_exit
;
}
...
...
@@ -451,10 +455,10 @@ acpi_remove_notify_handler (
/* Remove the handler */
if
(
handler_type
==
ACPI_SYSTEM_NOTIFY
)
{
obj_desc
->
common_notify
.
sys
_handler
=
NULL
;
obj_desc
->
common_notify
.
sys
tem_notify
=
NULL
;
}
else
{
obj_desc
->
common_notify
.
d
rv_handler
=
NULL
;
obj_desc
->
common_notify
.
d
evice_notify
=
NULL
;
}
acpi_ut_remove_reference
(
notify_obj
);
...
...
drivers/acpi/events/evxfevnt.c
View file @
17d0e4f4
...
...
@@ -654,7 +654,11 @@ acpi_install_gpe_block (
}
status
=
acpi_ns_attach_object
(
node
,
obj_desc
,
ACPI_TYPE_DEVICE
);
/* Remove local reference to the object */
acpi_ut_remove_reference
(
obj_desc
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
...
...
drivers/acpi/events/evxfregn.c
View file @
17d0e4f4
...
...
@@ -154,7 +154,7 @@ acpi_install_address_space_handler (
break
;
default:
status
=
AE_
NOT_EXIST
;
status
=
AE_
BAD_PARAMETER
;
goto
unlock_and_exit
;
}
}
...
...
@@ -170,26 +170,36 @@ acpi_install_address_space_handler (
obj_desc
=
acpi_ns_get_attached_object
(
node
);
if
(
obj_desc
)
{
/*
* The
object
exists.
* The
attached device object already
exists.
* Make sure the handler is not already installed.
*/
handler_obj
=
obj_desc
->
device
.
address_space
;
/*
check the address handler the user requested
*/
/*
Walk the handler list for this device
*/
handler_obj
=
obj_desc
->
device
.
addr_handler
;
while
(
handler_obj
)
{
/*
* Found an Address handler, see if user requested this
* address space.
*/
if
(
handler_obj
->
addr_handler
.
space_id
==
space_id
)
{
status
=
AE_ALREADY_EXISTS
;
/* Same space_id indicates a handler already installed */
if
(
handler_obj
->
address_space
.
space_id
==
space_id
)
{
if
(
handler_obj
->
address_space
.
handler
==
handler
)
{
/*
* It is (relatively) OK to attempt to install the SAME
* handler twice. This can easily happen with PCI_Config space.
*/
status
=
AE_SAME_HANDLER
;
goto
unlock_and_exit
;
}
else
{
/* A handler is already installed */
status
=
AE_ALREADY_EXISTS
;
}
goto
unlock_and_exit
;
}
/* Walk the linked list of handlers */
handler_obj
=
handler_obj
->
addr
_handler
.
next
;
handler_obj
=
handler_obj
->
addr
ess_space
.
next
;
}
}
else
{
...
...
@@ -218,8 +228,12 @@ acpi_install_address_space_handler (
/* Attach the new object to the Node */
status
=
acpi_ns_attach_object
(
node
,
obj_desc
,
type
);
/* Remove local reference to the object */
acpi_ut_remove_reference
(
obj_desc
);
if
(
ACPI_FAILURE
(
status
))
{
acpi_ut_remove_reference
(
obj_desc
);
goto
unlock_and_exit
;
}
}
...
...
@@ -241,14 +255,25 @@ acpi_install_address_space_handler (
goto
unlock_and_exit
;
}
handler_obj
->
addr_handler
.
space_id
=
(
u8
)
space_id
;
handler_obj
->
addr_handler
.
hflags
=
flags
;
handler_obj
->
addr_handler
.
next
=
obj_desc
->
device
.
addr_handler
;
handler_obj
->
addr_handler
.
region_list
=
NULL
;
handler_obj
->
addr_handler
.
node
=
node
;
handler_obj
->
addr_handler
.
handler
=
handler
;
handler_obj
->
addr_handler
.
context
=
context
;
handler_obj
->
addr_handler
.
setup
=
setup
;
/* Init handler obj */
handler_obj
->
address_space
.
space_id
=
(
u8
)
space_id
;
handler_obj
->
address_space
.
hflags
=
flags
;
handler_obj
->
address_space
.
region_list
=
NULL
;
handler_obj
->
address_space
.
node
=
node
;
handler_obj
->
address_space
.
handler
=
handler
;
handler_obj
->
address_space
.
context
=
context
;
handler_obj
->
address_space
.
setup
=
setup
;
/* Install at head of Device.address_space list */
handler_obj
->
address_space
.
next
=
obj_desc
->
device
.
address_space
;
/*
* The Device object is the first reference on the handler_obj.
* Each region that uses the handler adds a reference.
*/
obj_desc
->
device
.
address_space
=
handler_obj
;
/*
* Walk the namespace finding all of the regions this
...
...
@@ -262,18 +287,9 @@ acpi_install_address_space_handler (
* In either case, back up and search down the remainder
* of the branch
*/
status
=
acpi_ns_walk_namespace
(
ACPI_TYPE_ANY
,
device
,
ACPI_UINT32_MAX
,
ACPI_NS_WALK_UNLOCK
,
acpi_ev_addr_handler_helper
,
handler_obj
,
NULL
);
/* Place this handler 1st on the list */
handler_obj
->
common
.
reference_count
=
(
u16
)
(
handler_obj
->
common
.
reference_count
+
obj_desc
->
common
.
reference_count
-
1
);
obj_desc
->
device
.
addr_handler
=
handler_obj
;
status
=
acpi_ns_walk_namespace
(
ACPI_TYPE_ANY
,
device
,
ACPI_UINT32_MAX
,
ACPI_NS_WALK_UNLOCK
,
acpi_ev_install_handler
,
handler_obj
,
NULL
);
unlock_and_exit:
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
...
...
@@ -341,12 +357,12 @@ acpi_remove_address_space_handler (
/* Find the address handler the user requested */
handler_obj
=
obj_desc
->
device
.
addr
_handler
;
last_obj_ptr
=
&
obj_desc
->
device
.
addr
_handler
;
handler_obj
=
obj_desc
->
device
.
addr
ess_space
;
last_obj_ptr
=
&
obj_desc
->
device
.
addr
ess_space
;
while
(
handler_obj
)
{
/* We have a handler, see if user requested this one */
if
(
handler_obj
->
addr
_handler
.
space_id
==
space_id
)
{
if
(
handler_obj
->
addr
ess_space
.
space_id
==
space_id
)
{
/* Matched space_id, first dereference this in the Regions */
ACPI_DEBUG_PRINT
((
ACPI_DB_OPREGION
,
...
...
@@ -354,7 +370,7 @@ acpi_remove_address_space_handler (
handler_obj
,
handler
,
acpi_ut_get_region_name
(
space_id
),
node
,
obj_desc
));
region_obj
=
handler_obj
->
addr
_handler
.
region_list
;
region_obj
=
handler_obj
->
addr
ess_space
.
region_list
;
/* Walk the handler's region list */
...
...
@@ -372,13 +388,13 @@ acpi_remove_address_space_handler (
* Walk the list: Just grab the head because the
* detach_region removed the previous head.
*/
region_obj
=
handler_obj
->
addr
_handler
.
region_list
;
region_obj
=
handler_obj
->
addr
ess_space
.
region_list
;
}
/* Remove this Handler object from the list */
*
last_obj_ptr
=
handler_obj
->
addr
_handler
.
next
;
*
last_obj_ptr
=
handler_obj
->
addr
ess_space
.
next
;
/* Now we can delete the handler object */
...
...
@@ -388,8 +404,8 @@ acpi_remove_address_space_handler (
/* Walk the linked list of handlers */
last_obj_ptr
=
&
handler_obj
->
addr
_handler
.
next
;
handler_obj
=
handler_obj
->
addr
_handler
.
next
;
last_obj_ptr
=
&
handler_obj
->
addr
ess_space
.
next
;
handler_obj
=
handler_obj
->
addr
ess_space
.
next
;
}
/* The handler does not exist */
...
...
drivers/acpi/executer/exconfig.c
View file @
17d0e4f4
...
...
@@ -360,11 +360,11 @@ acpi_ex_load_op (
/* The table must be either an SSDT or a PSDT */
if
((
!
ACPI_STRNCMP
(
table_ptr
->
signature
,
acpi_gbl_
acpi_
table_data
[
ACPI_TABLE_PSDT
].
signature
,
acpi_gbl_
acpi_
table_data
[
ACPI_TABLE_PSDT
].
sig_length
))
&&
acpi_gbl_table_data
[
ACPI_TABLE_PSDT
].
signature
,
acpi_gbl_table_data
[
ACPI_TABLE_PSDT
].
sig_length
))
&&
(
!
ACPI_STRNCMP
(
table_ptr
->
signature
,
acpi_gbl_
acpi_
table_data
[
ACPI_TABLE_SSDT
].
signature
,
acpi_gbl_
acpi_
table_data
[
ACPI_TABLE_SSDT
].
sig_length
)))
{
acpi_gbl_table_data
[
ACPI_TABLE_SSDT
].
signature
,
acpi_gbl_table_data
[
ACPI_TABLE_SSDT
].
sig_length
)))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Table has invalid signature [%4.4s], must be SSDT or PSDT
\n
"
,
table_ptr
->
signature
));
...
...
drivers/acpi/executer/exdump.c
View file @
17d0e4f4
...
...
@@ -635,9 +635,9 @@ acpi_ex_dump_object_descriptor (
case
ACPI_TYPE_DEVICE
:
acpi_ex_out_pointer
(
"addr
_handler"
,
obj_desc
->
device
.
addr_handler
);
acpi_ex_out_pointer
(
"sys
_handler"
,
obj_desc
->
device
.
sys_handler
);
acpi_ex_out_pointer
(
"d
rv_handler"
,
obj_desc
->
device
.
drv_handler
);
acpi_ex_out_pointer
(
"addr
ess_space"
,
obj_desc
->
device
.
address_space
);
acpi_ex_out_pointer
(
"sys
tem_notify"
,
obj_desc
->
device
.
system_notify
);
acpi_ex_out_pointer
(
"d
evice_notify"
,
obj_desc
->
device
.
device_notify
);
break
;
...
...
@@ -673,7 +673,7 @@ acpi_ex_dump_object_descriptor (
acpi_ex_out_integer
(
"Flags"
,
obj_desc
->
region
.
flags
);
acpi_ex_out_address
(
"Address"
,
obj_desc
->
region
.
address
);
acpi_ex_out_integer
(
"Length"
,
obj_desc
->
region
.
length
);
acpi_ex_out_pointer
(
"addr
_handler"
,
obj_desc
->
region
.
addr_handler
);
acpi_ex_out_pointer
(
"addr
ess_space"
,
obj_desc
->
region
.
address_space
);
acpi_ex_out_pointer
(
"Next"
,
obj_desc
->
region
.
next
);
break
;
...
...
@@ -682,8 +682,8 @@ acpi_ex_dump_object_descriptor (
acpi_ex_out_integer
(
"system_level"
,
obj_desc
->
power_resource
.
system_level
);
acpi_ex_out_integer
(
"resource_order"
,
obj_desc
->
power_resource
.
resource_order
);
acpi_ex_out_pointer
(
"sys
_handler"
,
obj_desc
->
power_resource
.
sys_handler
);
acpi_ex_out_pointer
(
"d
rv_handler"
,
obj_desc
->
power_resource
.
drv_handler
);
acpi_ex_out_pointer
(
"sys
tem_notify"
,
obj_desc
->
power_resource
.
system_notify
);
acpi_ex_out_pointer
(
"d
evice_notify"
,
obj_desc
->
power_resource
.
device_notify
);
break
;
...
...
@@ -692,17 +692,17 @@ acpi_ex_dump_object_descriptor (
acpi_ex_out_integer
(
"Processor ID"
,
obj_desc
->
processor
.
proc_id
);
acpi_ex_out_integer
(
"Length"
,
obj_desc
->
processor
.
length
);
acpi_ex_out_address
(
"Address"
,
(
acpi_physical_address
)
obj_desc
->
processor
.
address
);
acpi_ex_out_pointer
(
"sys
_handler"
,
obj_desc
->
processor
.
sys_handler
);
acpi_ex_out_pointer
(
"d
rv_handler"
,
obj_desc
->
processor
.
drv_handler
);
acpi_ex_out_pointer
(
"addr
_handler"
,
obj_desc
->
processor
.
addr_handler
);
acpi_ex_out_pointer
(
"sys
tem_notify"
,
obj_desc
->
processor
.
system_notify
);
acpi_ex_out_pointer
(
"d
evice_notify"
,
obj_desc
->
processor
.
device_notify
);
acpi_ex_out_pointer
(
"addr
ess_space"
,
obj_desc
->
processor
.
address_space
);
break
;
case
ACPI_TYPE_THERMAL
:
acpi_ex_out_pointer
(
"sys
_handler"
,
obj_desc
->
thermal_zone
.
sys_handler
);
acpi_ex_out_pointer
(
"d
rv_handler"
,
obj_desc
->
thermal_zone
.
drv_handler
);
acpi_ex_out_pointer
(
"addr
_handler"
,
obj_desc
->
thermal_zone
.
addr_handler
);
acpi_ex_out_pointer
(
"sys
tem_notify"
,
obj_desc
->
thermal_zone
.
system_notify
);
acpi_ex_out_pointer
(
"d
evice_notify"
,
obj_desc
->
thermal_zone
.
device_notify
);
acpi_ex_out_pointer
(
"addr
ess_space"
,
obj_desc
->
thermal_zone
.
address_space
);
break
;
...
...
@@ -762,18 +762,18 @@ acpi_ex_dump_object_descriptor (
case
ACPI_TYPE_LOCAL_ADDRESS_HANDLER
:
acpi_ex_out_integer
(
"space_id"
,
obj_desc
->
addr
_handler
.
space_id
);
acpi_ex_out_pointer
(
"Next"
,
obj_desc
->
addr
_handler
.
next
);
acpi_ex_out_pointer
(
"region_list"
,
obj_desc
->
addr
_handler
.
region_list
);
acpi_ex_out_pointer
(
"Node"
,
obj_desc
->
addr
_handler
.
node
);
acpi_ex_out_pointer
(
"Context"
,
obj_desc
->
addr
_handler
.
context
);
acpi_ex_out_integer
(
"space_id"
,
obj_desc
->
addr
ess_space
.
space_id
);
acpi_ex_out_pointer
(
"Next"
,
obj_desc
->
addr
ess_space
.
next
);
acpi_ex_out_pointer
(
"region_list"
,
obj_desc
->
addr
ess_space
.
region_list
);
acpi_ex_out_pointer
(
"Node"
,
obj_desc
->
addr
ess_space
.
node
);
acpi_ex_out_pointer
(
"Context"
,
obj_desc
->
addr
ess_space
.
context
);
break
;
case
ACPI_TYPE_LOCAL_NOTIFY
:
acpi_ex_out_pointer
(
"Node"
,
obj_desc
->
notify
_handler
.
node
);
acpi_ex_out_pointer
(
"Context"
,
obj_desc
->
notify
_handler
.
context
);
acpi_ex_out_pointer
(
"Node"
,
obj_desc
->
notify
.
node
);
acpi_ex_out_pointer
(
"Context"
,
obj_desc
->
notify
.
context
);
break
;
...
...
drivers/acpi/hardware/hwgpe.c
View file @
17d0e4f4
...
...
@@ -77,7 +77,7 @@ acpi_hw_enable_gpe (
* to enable the GPE, and write out the new register.
*/
status
=
acpi_hw_low_level_read
(
8
,
&
in_byte
,
&
gpe_event_info
->
register_info
->
enable_address
,
0
);
&
gpe_event_info
->
register_info
->
enable_address
);
if
(
ACPI_FAILURE
(
status
))
{
return
(
status
);
}
...
...
@@ -85,7 +85,7 @@ acpi_hw_enable_gpe (
/* Write with the new GPE bit enabled */
status
=
acpi_hw_low_level_write
(
8
,
(
in_byte
|
gpe_event_info
->
bit_mask
),
&
gpe_event_info
->
register_info
->
enable_address
,
0
);
&
gpe_event_info
->
register_info
->
enable_address
);
return
(
status
);
}
...
...
@@ -164,7 +164,7 @@ acpi_hw_disable_gpe (
* and write out the new register value to disable the GPE.
*/
status
=
acpi_hw_low_level_read
(
8
,
&
in_byte
,
&
gpe_register_info
->
enable_address
,
0
);
&
gpe_register_info
->
enable_address
);
if
(
ACPI_FAILURE
(
status
))
{
return
(
status
);
}
...
...
@@ -172,7 +172,7 @@ acpi_hw_disable_gpe (
/* Write the byte with this GPE bit cleared */
status
=
acpi_hw_low_level_write
(
8
,
(
in_byte
&
~
(
gpe_event_info
->
bit_mask
)),
&
gpe_register_info
->
enable_address
,
0
);
&
gpe_register_info
->
enable_address
);
if
(
ACPI_FAILURE
(
status
))
{
return
(
status
);
}
...
...
@@ -246,7 +246,7 @@ acpi_hw_clear_gpe (
* clear this GPE.
*/
status
=
acpi_hw_low_level_write
(
8
,
gpe_event_info
->
bit_mask
,
&
gpe_event_info
->
register_info
->
status_address
,
0
);
&
gpe_event_info
->
register_info
->
status_address
);
return
(
status
);
}
...
...
@@ -293,7 +293,7 @@ acpi_hw_get_gpe_status (
/* GPE Enabled? */
status
=
acpi_hw_low_level_read
(
8
,
&
in_byte
,
&
gpe_register_info
->
enable_address
,
0
);
status
=
acpi_hw_low_level_read
(
8
,
&
in_byte
,
&
gpe_register_info
->
enable_address
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
...
...
@@ -310,7 +310,7 @@ acpi_hw_get_gpe_status (
/* GPE active (set)? */
status
=
acpi_hw_low_level_read
(
8
,
&
in_byte
,
&
gpe_register_info
->
status_address
,
0
);
status
=
acpi_hw_low_level_read
(
8
,
&
in_byte
,
&
gpe_register_info
->
status_address
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
...
...
@@ -360,7 +360,7 @@ acpi_hw_disable_gpe_block (
for
(
i
=
0
;
i
<
gpe_block
->
register_count
;
i
++
)
{
status
=
acpi_hw_low_level_write
(
8
,
0x00
,
&
gpe_block
->
register_info
[
i
].
enable_address
,
(
u32
)
i
);
&
gpe_block
->
register_info
[
i
].
enable_address
);
if
(
ACPI_FAILURE
(
status
))
{
return
(
status
);
}
...
...
@@ -401,7 +401,7 @@ acpi_hw_clear_gpe_block (
for
(
i
=
0
;
i
<
gpe_block
->
register_count
;
i
++
)
{
status
=
acpi_hw_low_level_write
(
8
,
0xFF
,
&
gpe_block
->
register_info
[
i
].
status_address
,
(
u32
)
i
);
&
gpe_block
->
register_info
[
i
].
status_address
);
if
(
ACPI_FAILURE
(
status
))
{
return
(
status
);
}
...
...
@@ -447,7 +447,7 @@ acpi_hw_disable_non_wakeup_gpe_block (
* will be using it to restore all the GPEs later.
*/
status
=
acpi_hw_low_level_read
(
8
,
&
in_value
,
&
gpe_register_info
->
enable_address
,
0
);
&
gpe_register_info
->
enable_address
);
if
(
ACPI_FAILURE
(
status
))
{
return
(
status
);
}
...
...
@@ -458,7 +458,7 @@ acpi_hw_disable_non_wakeup_gpe_block (
* Disable all GPEs except wakeup GPEs.
*/
status
=
acpi_hw_low_level_write
(
8
,
gpe_register_info
->
wake_enable
,
&
gpe_register_info
->
enable_address
,
0
);
&
gpe_register_info
->
enable_address
);
if
(
ACPI_FAILURE
(
status
))
{
return
(
status
);
}
...
...
@@ -539,7 +539,7 @@ acpi_hw_enable_non_wakeup_gpe_block (
* Blast them back in.
*/
status
=
acpi_hw_low_level_write
(
8
,
gpe_register_info
->
enable
,
&
gpe_register_info
->
enable_address
,
0
);
&
gpe_register_info
->
enable_address
);
if
(
ACPI_FAILURE
(
status
))
{
return
(
status
);
}
...
...
drivers/acpi/hardware/hwregs.c
View file @
17d0e4f4
...
...
@@ -93,7 +93,7 @@ acpi_hw_clear_acpi_status (void)
if
(
acpi_gbl_FADT
->
xpm1b_evt_blk
.
address
)
{
status
=
acpi_hw_low_level_write
(
16
,
ACPI_BITMASK_ALL_FIXED_STATUS
,
&
acpi_gbl_FADT
->
xpm1b_evt_blk
,
0
);
&
acpi_gbl_FADT
->
xpm1b_evt_blk
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
...
...
@@ -470,7 +470,6 @@ acpi_hw_register_read (
{
u32
value1
=
0
;
u32
value2
=
0
;
u32
bank_offset
;
acpi_status
status
;
...
...
@@ -487,50 +486,53 @@ acpi_hw_register_read (
switch
(
register_id
)
{
case
ACPI_REGISTER_PM1_STATUS
:
/* 16-bit access */
status
=
acpi_hw_low_level_read
(
16
,
&
value1
,
&
acpi_gbl_FADT
->
xpm1a_evt_blk
,
0
);
status
=
acpi_hw_low_level_read
(
16
,
&
value1
,
&
acpi_gbl_FADT
->
xpm1a_evt_blk
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
status
=
acpi_hw_low_level_read
(
16
,
&
value2
,
&
acpi_gbl_FADT
->
xpm1b_evt_blk
,
0
);
/* PM1B is optional */
status
=
acpi_hw_low_level_read
(
16
,
&
value2
,
&
acpi_gbl_FADT
->
xpm1b_evt_blk
);
value1
|=
value2
;
break
;
case
ACPI_REGISTER_PM1_ENABLE
:
/* 16-bit access*/
case
ACPI_REGISTER_PM1_ENABLE
:
/* 16-bit access
*/
bank_offset
=
ACPI_DIV_2
(
acpi_gbl_FADT
->
pm1_evt_len
);
status
=
acpi_hw_low_level_read
(
16
,
&
value1
,
&
acpi_gbl_FADT
->
xpm1a_evt_blk
,
bank_offset
);
status
=
acpi_hw_low_level_read
(
16
,
&
value1
,
&
acpi_gbl_xpm1a_enable
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
status
=
acpi_hw_low_level_read
(
16
,
&
value2
,
&
acpi_gbl_FADT
->
xpm1b_evt_blk
,
bank_offset
);
/* PM1B is optional */
status
=
acpi_hw_low_level_read
(
16
,
&
value2
,
&
acpi_gbl_xpm1b_enable
);
value1
|=
value2
;
break
;
case
ACPI_REGISTER_PM1_CONTROL
:
/* 16-bit access */
status
=
acpi_hw_low_level_read
(
16
,
&
value1
,
&
acpi_gbl_FADT
->
xpm1a_cnt_blk
,
0
);
status
=
acpi_hw_low_level_read
(
16
,
&
value1
,
&
acpi_gbl_FADT
->
xpm1a_cnt_blk
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
status
=
acpi_hw_low_level_read
(
16
,
&
value2
,
&
acpi_gbl_FADT
->
xpm1b_cnt_blk
,
0
);
status
=
acpi_hw_low_level_read
(
16
,
&
value2
,
&
acpi_gbl_FADT
->
xpm1b_cnt_blk
);
value1
|=
value2
;
break
;
case
ACPI_REGISTER_PM2_CONTROL
:
/* 8-bit access */
status
=
acpi_hw_low_level_read
(
8
,
&
value1
,
&
acpi_gbl_FADT
->
xpm2_cnt_blk
,
0
);
status
=
acpi_hw_low_level_read
(
8
,
&
value1
,
&
acpi_gbl_FADT
->
xpm2_cnt_blk
);
break
;
case
ACPI_REGISTER_PM_TIMER
:
/* 32-bit access */
status
=
acpi_hw_low_level_read
(
32
,
&
value1
,
&
acpi_gbl_FADT
->
xpm_tmr_blk
,
0
);
status
=
acpi_hw_low_level_read
(
32
,
&
value1
,
&
acpi_gbl_FADT
->
xpm_tmr_blk
);
break
;
case
ACPI_REGISTER_SMI_COMMAND_BLOCK
:
/* 8-bit access */
...
...
@@ -577,7 +579,6 @@ acpi_hw_register_write (
u32
register_id
,
u32
value
)
{
u32
bank_offset
;
acpi_status
status
;
...
...
@@ -594,59 +595,62 @@ acpi_hw_register_write (
switch
(
register_id
)
{
case
ACPI_REGISTER_PM1_STATUS
:
/* 16-bit access */
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1a_evt_blk
,
0
);
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1a_evt_blk
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1b_evt_blk
,
0
);
/* PM1B is optional */
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1b_evt_blk
);
break
;
case
ACPI_REGISTER_PM1_ENABLE
:
/* 16-bit access*/
bank_offset
=
ACPI_DIV_2
(
acpi_gbl_FADT
->
pm1_evt_len
);
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1a_evt_blk
,
bank_offset
);
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_xpm1a_enable
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1b_evt_blk
,
bank_offset
);
/* PM1B is optional */
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_xpm1b_enable
);
break
;
case
ACPI_REGISTER_PM1_CONTROL
:
/* 16-bit access */
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1a_cnt_blk
,
0
);
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1a_cnt_blk
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1b_cnt_blk
,
0
);
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1b_cnt_blk
);
break
;
case
ACPI_REGISTER_PM1A_CONTROL
:
/* 16-bit access */
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1a_cnt_blk
,
0
);
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1a_cnt_blk
);
break
;
case
ACPI_REGISTER_PM1B_CONTROL
:
/* 16-bit access */
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1b_cnt_blk
,
0
);
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1b_cnt_blk
);
break
;
case
ACPI_REGISTER_PM2_CONTROL
:
/* 8-bit access */
status
=
acpi_hw_low_level_write
(
8
,
value
,
&
acpi_gbl_FADT
->
xpm2_cnt_blk
,
0
);
status
=
acpi_hw_low_level_write
(
8
,
value
,
&
acpi_gbl_FADT
->
xpm2_cnt_blk
);
break
;
case
ACPI_REGISTER_PM_TIMER
:
/* 32-bit access */
status
=
acpi_hw_low_level_write
(
32
,
value
,
&
acpi_gbl_FADT
->
xpm_tmr_blk
,
0
);
status
=
acpi_hw_low_level_write
(
32
,
value
,
&
acpi_gbl_FADT
->
xpm_tmr_blk
);
break
;
...
...
@@ -676,11 +680,11 @@ acpi_hw_register_write (
*
* FUNCTION: acpi_hw_low_level_read
*
* PARAMETERS:
Register - GAS register structure
*
Offset - Offset from the base address in the GAS
*
Width - 8, 16, or 32
* PARAMETERS:
Width - 8, 16, or 32
*
Value - Where the value is returned
*
Register - GAS register structure
*
* RETURN:
Value read
* RETURN:
Status
*
* DESCRIPTION: Read from either memory, IO, or PCI config space.
*
...
...
@@ -690,11 +694,8 @@ acpi_status
acpi_hw_low_level_read
(
u32
width
,
u32
*
value
,
struct
acpi_generic_address
*
reg
,
u32
offset
)
struct
acpi_generic_address
*
reg
)
{
acpi_physical_address
mem_address
;
acpi_io_address
io_address
;
struct
acpi_pci_id
pci_id
;
u16
pci_register
;
acpi_status
status
;
...
...
@@ -721,19 +722,16 @@ acpi_hw_low_level_read (
switch
(
reg
->
address_space_id
)
{
case
ACPI_ADR_SPACE_SYSTEM_MEMORY
:
mem_address
=
(
reg
->
address
+
(
acpi_physical_address
)
offset
);
status
=
acpi_os_read_memory
(
mem_address
,
value
,
width
);
status
=
acpi_os_read_memory
(
(
acpi_physical_address
)
reg
->
address
,
value
,
width
);
break
;
case
ACPI_ADR_SPACE_SYSTEM_IO
:
io_address
=
(
acpi_io_address
)
(
reg
->
address
+
(
acpi_physical_address
)
offset
);
status
=
acpi_os_read_port
(
io_address
,
value
,
width
);
status
=
acpi_os_read_port
((
acpi_io_address
)
reg
->
address
,
value
,
width
);
break
;
...
...
@@ -743,15 +741,16 @@ acpi_hw_low_level_read (
pci_id
.
bus
=
0
;
pci_id
.
device
=
ACPI_PCI_DEVICE
(
reg
->
address
);
pci_id
.
function
=
ACPI_PCI_FUNCTION
(
reg
->
address
);
pci_register
=
(
u16
)
(
ACPI_PCI_REGISTER
(
reg
->
address
)
+
offset
);
pci_register
=
(
u16
)
ACPI_PCI_REGISTER
(
reg
->
address
);
status
=
acpi_os_read_pci_configuration
(
&
pci_id
,
pci_register
,
value
,
width
);
status
=
acpi_os_read_pci_configuration
(
&
pci_id
,
pci_register
,
value
,
width
);
break
;
default:
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Unsupported address space: %X
\n
"
,
reg
->
address_space_id
));
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Unsupported address space: %X
\n
"
,
reg
->
address_space_id
));
status
=
AE_BAD_PARAMETER
;
break
;
}
...
...
@@ -767,12 +766,10 @@ acpi_hw_low_level_read (
* PARAMETERS: Width - 8, 16, or 32
* Value - To be written
* Register - GAS register structure
* Offset - Offset from the base address in the GAS
*
*
* RETURN:
Value read
* RETURN:
Status
*
* DESCRIPTION:
Read from
either memory, IO, or PCI config space.
* DESCRIPTION:
Write to
either memory, IO, or PCI config space.
*
******************************************************************************/
...
...
@@ -780,11 +777,8 @@ acpi_status
acpi_hw_low_level_write
(
u32
width
,
u32
value
,
struct
acpi_generic_address
*
reg
,
u32
offset
)
struct
acpi_generic_address
*
reg
)
{
acpi_physical_address
mem_address
;
acpi_io_address
io_address
;
struct
acpi_pci_id
pci_id
;
u16
pci_register
;
acpi_status
status
;
...
...
@@ -809,19 +803,16 @@ acpi_hw_low_level_write (
switch
(
reg
->
address_space_id
)
{
case
ACPI_ADR_SPACE_SYSTEM_MEMORY
:
mem_address
=
(
reg
->
address
+
(
acpi_physical_address
)
offset
);
status
=
acpi_os_write_memory
(
mem_address
,
value
,
width
);
status
=
acpi_os_write_memory
(
(
acpi_physical_address
)
reg
->
address
,
value
,
width
);
break
;
case
ACPI_ADR_SPACE_SYSTEM_IO
:
io_address
=
(
acpi_io_address
)
(
reg
->
address
+
(
acpi_physical_address
)
offset
);
status
=
acpi_os_write_port
(
io_address
,
value
,
width
);
status
=
acpi_os_write_port
((
acpi_io_address
)
reg
->
address
,
value
,
width
);
break
;
...
...
@@ -831,15 +822,16 @@ acpi_hw_low_level_write (
pci_id
.
bus
=
0
;
pci_id
.
device
=
ACPI_PCI_DEVICE
(
reg
->
address
);
pci_id
.
function
=
ACPI_PCI_FUNCTION
(
reg
->
address
);
pci_register
=
(
u16
)
(
ACPI_PCI_REGISTER
(
reg
->
address
)
+
offset
);
pci_register
=
(
u16
)
ACPI_PCI_REGISTER
(
reg
->
address
);
status
=
acpi_os_write_pci_configuration
(
&
pci_id
,
pci_register
,
(
acpi_integer
)
value
,
width
);
status
=
acpi_os_write_pci_configuration
(
&
pci_id
,
pci_register
,
(
acpi_integer
)
value
,
width
);
break
;
default:
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Unsupported address space: %X
\n
"
,
reg
->
address_space_id
));
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Unsupported address space: %X
\n
"
,
reg
->
address_space_id
));
status
=
AE_BAD_PARAMETER
;
break
;
}
...
...
drivers/acpi/hardware/hwtimer.c
View file @
17d0e4f4
...
...
@@ -108,7 +108,7 @@ acpi_get_timer (
return_ACPI_STATUS
(
AE_BAD_PARAMETER
);
}
status
=
acpi_hw_low_level_read
(
32
,
ticks
,
&
acpi_gbl_FADT
->
xpm_tmr_blk
,
0
);
status
=
acpi_hw_low_level_read
(
32
,
ticks
,
&
acpi_gbl_FADT
->
xpm_tmr_blk
);
return_ACPI_STATUS
(
status
);
}
...
...
drivers/acpi/namespace/nsalloc.c
View file @
17d0e4f4
...
...
@@ -116,19 +116,33 @@ acpi_ns_delete_node (
prev_node
=
NULL
;
next_node
=
parent_node
->
child
;
/* Find the node that is the previous peer in the parent's child list */
while
(
next_node
!=
node
)
{
prev_node
=
next_node
;
next_node
=
prev_node
->
peer
;
}
if
(
prev_node
)
{
/* Node is not first child, unlink it */
prev_node
->
peer
=
next_node
->
peer
;
if
(
next_node
->
flags
&
ANOBJ_END_OF_PEER_LIST
)
{
prev_node
->
flags
|=
ANOBJ_END_OF_PEER_LIST
;
}
}
else
{
parent_node
->
child
=
next_node
->
peer
;
/* Node is first child (has no previous peer) */
if
(
next_node
->
flags
&
ANOBJ_END_OF_PEER_LIST
)
{
/* No peers at all */
parent_node
->
child
=
NULL
;
}
else
{
/* Link peer list to parent */
parent_node
->
child
=
next_node
->
peer
;
}
}
...
...
@@ -222,7 +236,7 @@ acpi_ns_install_node (
struct
acpi_namespace_node
*
node
,
/* New Child*/
acpi_object_type
type
)
{
u16
owner_id
=
TABLE_ID_DSDT
;
u16
owner_id
=
0
;
struct
acpi_namespace_node
*
child_node
;
#ifdef ACPI_ALPHABETIC_NAMESPACE
...
...
@@ -355,6 +369,7 @@ acpi_ns_delete_children (
{
struct
acpi_namespace_node
*
child_node
;
struct
acpi_namespace_node
*
next_node
;
struct
acpi_namespace_node
*
node
;
u8
flags
;
...
...
@@ -399,6 +414,25 @@ acpi_ns_delete_children (
* Detach an object if there is one, then free the child node
*/
acpi_ns_detach_object
(
child_node
);
/*
* Decrement the reference count(s) of all parents up to
* the root! (counts were incremented when the node was created)
*/
node
=
child_node
;
while
((
node
=
acpi_ns_get_parent_node
(
node
))
!=
NULL
)
{
node
->
reference_count
--
;
}
/* There should be only one reference remaining on this node */
if
(
child_node
->
reference_count
!=
1
)
{
ACPI_REPORT_WARNING
((
"Existing references (%d) on node being deleted (%p)
\n
"
,
child_node
->
reference_count
,
child_node
));
}
/* Now we can delete the node */
ACPI_MEM_FREE
(
child_node
);
/* And move on to the next child in the list */
...
...
@@ -512,7 +546,7 @@ acpi_ns_delete_namespace_subtree (
*
******************************************************************************/
static
void
void
acpi_ns_remove_reference
(
struct
acpi_namespace_node
*
node
)
{
...
...
drivers/acpi/namespace/nsload.c
View file @
17d0e4f4
...
...
@@ -79,7 +79,7 @@ acpi_ns_load_table (
/* Check if table contains valid AML (must be DSDT, PSDT, SSDT, etc.) */
if
(
!
(
acpi_gbl_
acpi_
table_data
[
table_desc
->
type
].
flags
&
ACPI_TABLE_EXECUTABLE
))
{
if
(
!
(
acpi_gbl_table_data
[
table_desc
->
type
].
flags
&
ACPI_TABLE_EXECUTABLE
))
{
/* Just ignore this table */
return_ACPI_STATUS
(
AE_OK
);
...
...
@@ -182,7 +182,7 @@ acpi_ns_load_table_by_type (
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Loading DSDT
\n
"
));
table_desc
=
&
acpi_gbl_acpi_tables
[
ACPI_TABLE_DSDT
]
;
table_desc
=
acpi_gbl_table_lists
[
ACPI_TABLE_DSDT
].
next
;
/* If table already loaded into namespace, just return */
...
...
@@ -190,8 +190,6 @@ acpi_ns_load_table_by_type (
goto
unlock_and_exit
;
}
table_desc
->
table_id
=
TABLE_ID_DSDT
;
/* Now load the single DSDT */
status
=
acpi_ns_load_table
(
table_desc
,
acpi_gbl_root_node
);
...
...
@@ -205,13 +203,13 @@ acpi_ns_load_table_by_type (
case
ACPI_TABLE_SSDT
:
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Loading %d SSDTs
\n
"
,
acpi_gbl_
acpi_table
s
[
ACPI_TABLE_SSDT
].
count
));
acpi_gbl_
table_list
s
[
ACPI_TABLE_SSDT
].
count
));
/*
* Traverse list of SSDT tables
*/
table_desc
=
&
acpi_gbl_acpi_tables
[
ACPI_TABLE_SSDT
]
;
for
(
i
=
0
;
i
<
acpi_gbl_
acpi_table
s
[
ACPI_TABLE_SSDT
].
count
;
i
++
)
{
table_desc
=
acpi_gbl_table_lists
[
ACPI_TABLE_SSDT
].
next
;
for
(
i
=
0
;
i
<
acpi_gbl_
table_list
s
[
ACPI_TABLE_SSDT
].
count
;
i
++
)
{
/*
* Only attempt to load table if it is not
* already loaded!
...
...
@@ -233,14 +231,14 @@ acpi_ns_load_table_by_type (
case
ACPI_TABLE_PSDT
:
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Loading %d PSDTs
\n
"
,
acpi_gbl_
acpi_table
s
[
ACPI_TABLE_PSDT
].
count
));
acpi_gbl_
table_list
s
[
ACPI_TABLE_PSDT
].
count
));
/*
* Traverse list of PSDT tables
*/
table_desc
=
&
acpi_gbl_acpi_tables
[
ACPI_TABLE_PSDT
]
;
table_desc
=
acpi_gbl_table_lists
[
ACPI_TABLE_PSDT
].
next
;
for
(
i
=
0
;
i
<
acpi_gbl_
acpi_table
s
[
ACPI_TABLE_PSDT
].
count
;
i
++
)
{
for
(
i
=
0
;
i
<
acpi_gbl_
table_list
s
[
ACPI_TABLE_PSDT
].
count
;
i
++
)
{
/* Only attempt to load table if it is not already loaded! */
if
(
!
table_desc
->
loaded_into_namespace
)
{
...
...
drivers/acpi/namespace/nsparse.c
View file @
17d0e4f4
...
...
@@ -85,10 +85,9 @@ acpi_ns_one_complete_parse (
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
/* Create and initialize a new walk state */
walk_state
=
acpi_ds_create_walk_state
(
TABLE_ID_DSDT
,
walk_state
=
acpi_ds_create_walk_state
(
table_desc
->
table_id
,
NULL
,
NULL
,
NULL
);
if
(
!
walk_state
)
{
acpi_ps_free_op
(
parse_root
);
...
...
drivers/acpi/namespace/nsutils.c
View file @
17d0e4f4
...
...
@@ -799,38 +799,31 @@ void
acpi_ns_terminate
(
void
)
{
union
acpi_operand_object
*
obj_desc
;
struct
acpi_namespace_node
*
this_node
;
ACPI_FUNCTION_TRACE
(
"ns_terminate"
);
this_node
=
acpi_gbl_root_node
;
/*
* 1) Free the entire namespace -- all
objects, tables, and stack
s
* 1) Free the entire namespace -- all
nodes and object
s
*
* Delete all objects linked to the root
* (additional table descriptors)
* Delete all object descriptors attached to namepsace nodes
*/
acpi_ns_delete_namespace_subtree
(
this
_node
);
acpi_ns_delete_namespace_subtree
(
acpi_gbl_root
_node
);
/* Detach any object
(s)
attached to the root */
/* Detach any object
s
attached to the root */
obj_desc
=
acpi_ns_get_attached_object
(
this
_node
);
obj_desc
=
acpi_ns_get_attached_object
(
acpi_gbl_root
_node
);
if
(
obj_desc
)
{
acpi_ns_detach_object
(
this_node
);
acpi_ut_remove_reference
(
obj_desc
);
acpi_ns_detach_object
(
acpi_gbl_root_node
);
}
acpi_ns_delete_children
(
this_node
);
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Namespace freed
\n
"
));
/*
* 2) Now we can delete the ACPI tables
*/
acpi_tb_delete_a
cpi
_tables
();
acpi_tb_delete_a
ll
_tables
();
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"ACPI Tables freed
\n
"
));
return_VOID
;
...
...
drivers/acpi/osl.c
View file @
17d0e4f4
...
...
@@ -237,7 +237,7 @@ acpi_os_table_override (struct acpi_table_header *existing_table,
static
irqreturn_t
acpi_irq
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
return
(
*
acpi_irq_handler
)(
acpi_irq_context
);
return
(
*
acpi_irq_handler
)(
acpi_irq_context
)
?
IRQ_HANDLED
:
IRQ_NONE
;
}
acpi_status
...
...
@@ -1006,7 +1006,7 @@ acpi_os_name_setup(char *str)
return
0
;
for
(;
count
--
&&
str
&&
*
str
;
str
++
)
{
if
(
isalnum
(
*
str
)
||
*
str
==
' '
)
if
(
isalnum
(
*
str
)
||
*
str
==
' '
||
*
str
==
':'
)
*
p
++
=
*
str
;
else
if
(
*
str
==
'\''
||
*
str
==
'"'
)
continue
;
...
...
drivers/acpi/parser/pswalk.c
View file @
17d0e4f4
...
...
@@ -270,7 +270,7 @@ acpi_ps_delete_parse_tree (
return_VOID
;
}
walk_state
=
acpi_ds_create_walk_state
(
TABLE_ID_DSDT
,
NULL
,
NULL
,
thread
);
walk_state
=
acpi_ds_create_walk_state
(
0
,
NULL
,
NULL
,
thread
);
if
(
!
walk_state
)
{
return_VOID
;
}
...
...
drivers/acpi/parser/psxface.c
View file @
17d0e4f4
...
...
@@ -178,7 +178,7 @@ acpi_psx_execute (
/* Create and initialize a new walk state */
walk_state
=
acpi_ds_create_walk_state
(
TABLE_ID_DSDT
,
NULL
,
NULL
,
NULL
);
walk_state
=
acpi_ds_create_walk_state
(
0
,
NULL
,
NULL
,
NULL
);
if
(
!
walk_state
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
...
...
drivers/acpi/resources/rsxface.c
View file @
17d0e4f4
...
...
@@ -379,25 +379,31 @@ acpi_resource_to_address64 (
{
struct
acpi_resource_address16
*
address16
;
struct
acpi_resource_address32
*
address32
;
struct
acpi_resource_address64
*
address64
;
switch
(
resource
->
id
)
{
case
ACPI_RSTYPE_ADDRESS16
:
address16
=
(
struct
acpi_resource_address16
*
)
&
resource
->
data
;
ACPI_COPY_ADDRESS
(
out
,
address16
);
break
;
case
ACPI_RSTYPE_ADDRESS32
:
address32
=
(
struct
acpi_resource_address32
*
)
&
resource
->
data
;
ACPI_COPY_ADDRESS
(
out
,
address32
);
break
;
case
ACPI_RSTYPE_ADDRESS64
:
address64
=
(
struct
acpi_resource_address64
*
)
&
resource
->
data
;
ACPI_COPY_ADDRESS
(
out
,
address64
);
/* Simple copy for 64 bit source */
ACPI_MEMCPY
(
out
,
&
resource
->
data
,
sizeof
(
struct
acpi_resource_address64
));
break
;
default:
return
(
AE_BAD_PARAMETER
);
}
...
...
drivers/acpi/scan.c
View file @
17d0e4f4
...
...
@@ -69,7 +69,7 @@ static void acpi_device_register(struct acpi_device * device, struct acpi_device
device
->
kobj
.
parent
=
&
parent
->
kobj
;
device
->
kobj
.
ktype
=
&
ktype_acpi_ns
;
device
->
kobj
.
kset
=
&
acpi_namespace_kset
;
kobject_
register
(
&
device
->
kobj
);
kobject_
add
(
&
device
->
kobj
);
}
static
int
...
...
drivers/acpi/tables/tbconvrt.c
View file @
17d0e4f4
...
...
@@ -164,6 +164,36 @@ acpi_tb_convert_to_xsdt (
}
/******************************************************************************
*
* FUNCTION: acpi_tb_init_generic_address
*
* PARAMETERS: new_gas_struct - GAS struct to be initialized
* register_bit_width - Width of this register
* Address - Address of the register
*
* RETURN: None
*
* DESCRIPTION: Initialize a GAS structure.
*
******************************************************************************/
static
void
acpi_tb_init_generic_address
(
struct
acpi_generic_address
*
new_gas_struct
,
u8
register_bit_width
,
acpi_physical_address
address
)
{
ACPI_STORE_ADDRESS
(
new_gas_struct
->
address
,
address
);
new_gas_struct
->
address_space_id
=
ACPI_ADR_SPACE_SYSTEM_IO
;
new_gas_struct
->
register_bit_width
=
register_bit_width
;
new_gas_struct
->
register_bit_offset
=
0
;
new_gas_struct
->
reserved
=
0
;
}
/*******************************************************************************
*
* FUNCTION: acpi_tb_convert_fadt1
...
...
@@ -233,14 +263,34 @@ acpi_tb_convert_fadt1 (
/*
* Convert the V1.0 block addresses to V2.0 GAS structures
*/
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm1a_evt_blk
,
local_fadt
->
pm1_evt_len
,
local_fadt
->
V1_pm1a_evt_blk
);
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm1b_evt_blk
,
local_fadt
->
pm1_evt_len
,
local_fadt
->
V1_pm1b_evt_blk
);
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm1a_cnt_blk
,
local_fadt
->
pm1_cnt_len
,
local_fadt
->
V1_pm1a_cnt_blk
);
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm1b_cnt_blk
,
local_fadt
->
pm1_cnt_len
,
local_fadt
->
V1_pm1b_cnt_blk
);
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm2_cnt_blk
,
local_fadt
->
pm2_cnt_len
,
local_fadt
->
V1_pm2_cnt_blk
);
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm_tmr_blk
,
local_fadt
->
pm_tm_len
,
local_fadt
->
V1_pm_tmr_blk
);
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xgpe0_blk
,
0
,
local_fadt
->
V1_gpe0_blk
);
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xgpe1_blk
,
0
,
local_fadt
->
V1_gpe1_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm1a_evt_blk
,
local_fadt
->
pm1_evt_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm1a_evt_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm1b_evt_blk
,
local_fadt
->
pm1_evt_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm1b_evt_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm1a_cnt_blk
,
local_fadt
->
pm1_cnt_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm1a_cnt_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm1b_cnt_blk
,
local_fadt
->
pm1_cnt_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm1b_cnt_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm2_cnt_blk
,
local_fadt
->
pm2_cnt_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm2_cnt_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm_tmr_blk
,
local_fadt
->
pm_tm_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm_tmr_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xgpe0_blk
,
0
,
(
acpi_physical_address
)
local_fadt
->
V1_gpe0_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xgpe1_blk
,
0
,
(
acpi_physical_address
)
local_fadt
->
V1_gpe1_blk
);
/* Create separate GAS structs for the PM1 Enable registers */
acpi_tb_init_generic_address
(
&
acpi_gbl_xpm1a_enable
,
(
u8
)
ACPI_DIV_2
(
acpi_gbl_FADT
->
pm1_evt_len
),
(
acpi_physical_address
)
(
local_fadt
->
xpm1a_evt_blk
.
address
+
ACPI_DIV_2
(
acpi_gbl_FADT
->
pm1_evt_len
)));
acpi_tb_init_generic_address
(
&
acpi_gbl_xpm1b_enable
,
(
u8
)
ACPI_DIV_2
(
acpi_gbl_FADT
->
pm1_evt_len
),
(
acpi_physical_address
)
(
local_fadt
->
xpm1b_evt_blk
.
address
+
ACPI_DIV_2
(
acpi_gbl_FADT
->
pm1_evt_len
)));
}
...
...
@@ -282,44 +332,58 @@ acpi_tb_convert_fadt2 (
}
if
(
!
(
local_fadt
->
xpm1a_evt_blk
.
address
))
{
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm1a_evt_blk
,
local_fadt
->
pm1_evt_len
,
local_fadt
->
V1_pm1a_evt_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm1a_evt_blk
,
local_fadt
->
pm1_evt_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm1a_evt_blk
);
}
if
(
!
(
local_fadt
->
xpm1b_evt_blk
.
address
))
{
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm1b_evt_blk
,
local_fadt
->
pm1_evt_len
,
local_fadt
->
V1_pm1b_evt_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm1b_evt_blk
,
local_fadt
->
pm1_evt_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm1b_evt_blk
);
}
if
(
!
(
local_fadt
->
xpm1a_cnt_blk
.
address
))
{
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm1a_cnt_blk
,
local_fadt
->
pm1_cnt_len
,
local_fadt
->
V1_pm1a_cnt_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm1a_cnt_blk
,
local_fadt
->
pm1_cnt_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm1a_cnt_blk
);
}
if
(
!
(
local_fadt
->
xpm1b_cnt_blk
.
address
))
{
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm1b_cnt_blk
,
local_fadt
->
pm1_cnt_len
,
local_fadt
->
V1_pm1b_cnt_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm1b_cnt_blk
,
local_fadt
->
pm1_cnt_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm1b_cnt_blk
);
}
if
(
!
(
local_fadt
->
xpm2_cnt_blk
.
address
))
{
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm2_cnt_blk
,
local_fadt
->
pm2_cnt_len
,
local_fadt
->
V1_pm2_cnt_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm2_cnt_blk
,
local_fadt
->
pm2_cnt_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm2_cnt_blk
);
}
if
(
!
(
local_fadt
->
xpm_tmr_blk
.
address
))
{
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xpm_tmr_blk
,
local_fadt
->
pm_tm_len
,
local_fadt
->
V1_pm_tmr_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xpm_tmr_blk
,
local_fadt
->
pm_tm_len
,
(
acpi_physical_address
)
local_fadt
->
V1_pm_tmr_blk
);
}
if
(
!
(
local_fadt
->
xgpe0_blk
.
address
))
{
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xgpe0_blk
,
0
,
local_fadt
->
V1_gpe0_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xgpe0_blk
,
0
,
(
acpi_physical_address
)
local_fadt
->
V1_gpe0_blk
);
}
if
(
!
(
local_fadt
->
xgpe1_blk
.
address
))
{
ASL_BUILD_GAS_FROM_V1_ENTRY
(
local_fadt
->
xgpe1_blk
,
0
,
local_fadt
->
V1_gpe1_blk
);
acpi_tb_init_generic_address
(
&
local_fadt
->
xgpe1_blk
,
0
,
(
acpi_physical_address
)
local_fadt
->
V1_gpe1_blk
);
}
/* Create separate GAS structs for the PM1 Enable registers */
acpi_tb_init_generic_address
(
&
acpi_gbl_xpm1a_enable
,
(
u8
)
ACPI_DIV_2
(
acpi_gbl_FADT
->
pm1_evt_len
),
(
acpi_physical_address
)
(
local_fadt
->
xpm1a_evt_blk
.
address
+
ACPI_DIV_2
(
acpi_gbl_FADT
->
pm1_evt_len
)));
acpi_gbl_xpm1a_enable
.
address_space_id
=
local_fadt
->
xpm1a_evt_blk
.
address_space_id
;
acpi_tb_init_generic_address
(
&
acpi_gbl_xpm1b_enable
,
(
u8
)
ACPI_DIV_2
(
acpi_gbl_FADT
->
pm1_evt_len
),
(
acpi_physical_address
)
(
local_fadt
->
xpm1b_evt_blk
.
address
+
ACPI_DIV_2
(
acpi_gbl_FADT
->
pm1_evt_len
)));
acpi_gbl_xpm1b_enable
.
address_space_id
=
local_fadt
->
xpm1b_evt_blk
.
address_space_id
;
}
...
...
@@ -396,7 +460,7 @@ acpi_tb_convert_table_fadt (void)
/* Free the original table */
table_desc
=
&
acpi_gbl_acpi_tables
[
ACPI_TABLE_FADT
]
;
table_desc
=
acpi_gbl_table_lists
[
ACPI_TABLE_FADT
].
next
;
acpi_tb_delete_single_table
(
table_desc
);
/* Install the new table */
...
...
drivers/acpi/tables/tbget.c
View file @
17d0e4f4
...
...
@@ -456,18 +456,18 @@ acpi_tb_get_table_ptr (
* instance is always in the list head.
*/
if
(
instance
==
1
)
{
/*
* Just pluck the pointer out of the global table!
* Will be null if no table is present
*/
*
table_ptr_loc
=
acpi_gbl_acpi_tables
[
table_type
].
pointer
;
/*
Get the first */
if
(
acpi_gbl_table_lists
[
table_type
].
next
)
{
*
table_ptr_loc
=
acpi_gbl_table_lists
[
table_type
].
next
->
pointer
;
}
return_ACPI_STATUS
(
AE_OK
);
}
/*
* Check for instance out of range
*/
if
(
instance
>
acpi_gbl_
acpi_table
s
[
table_type
].
count
)
{
if
(
instance
>
acpi_gbl_
table_list
s
[
table_type
].
count
)
{
return_ACPI_STATUS
(
AE_NOT_EXIST
);
}
...
...
@@ -478,7 +478,7 @@ acpi_tb_get_table_ptr (
* need to walk from the 2nd table until we reach the Instance
* that the user is looking for and return its table pointer.
*/
table_desc
=
acpi_gbl_
acpi_table
s
[
table_type
].
next
;
table_desc
=
acpi_gbl_
table_list
s
[
table_type
].
next
;
for
(
i
=
2
;
i
<
instance
;
i
++
)
{
table_desc
=
table_desc
->
next
;
}
...
...
drivers/acpi/tables/tbgetall.c
View file @
17d0e4f4
...
...
@@ -307,7 +307,7 @@ acpi_tb_get_required_tables (
/* Always delete the RSDP mapping, we are done with it */
acpi_tb_delete_
acpi_tabl
e
(
ACPI_TABLE_RSDP
);
acpi_tb_delete_
tables_by_typ
e
(
ACPI_TABLE_RSDP
);
return_ACPI_STATUS
(
status
);
}
...
...
drivers/acpi/tables/tbinstal.c
View file @
17d0e4f4
...
...
@@ -79,13 +79,13 @@ acpi_tb_match_signature (
/*
* Search for a signature match among the known table types
*/
for
(
i
=
0
;
i
<
NUM_ACPI_TABLES
;
i
++
)
{
if
(
!
(
acpi_gbl_
acpi_
table_data
[
i
].
flags
&
search_type
))
{
for
(
i
=
0
;
i
<
NUM_ACPI_TABLE
_TYPE
S
;
i
++
)
{
if
(
!
(
acpi_gbl_table_data
[
i
].
flags
&
search_type
))
{
continue
;
}
if
(
!
ACPI_STRNCMP
(
signature
,
acpi_gbl_
acpi_
table_data
[
i
].
signature
,
acpi_gbl_
acpi_
table_data
[
i
].
sig_length
))
{
if
(
!
ACPI_STRNCMP
(
signature
,
acpi_gbl_table_data
[
i
].
signature
,
acpi_gbl_table_data
[
i
].
sig_length
))
{
/* Found a signature match, return index if requested */
if
(
table_info
)
{
...
...
@@ -94,7 +94,7 @@ acpi_tb_match_signature (
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Table [%4.4s] is an ACPI table consumed by the core subsystem
\n
"
,
(
char
*
)
acpi_gbl_
acpi_
table_data
[
i
].
signature
));
(
char
*
)
acpi_gbl_table_data
[
i
].
signature
));
return_ACPI_STATUS
(
AE_OK
);
}
...
...
@@ -149,7 +149,7 @@ acpi_tb_install_table (
}
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"%s located at %p
\n
"
,
acpi_gbl_
acpi_
table_data
[
table_info
->
type
].
name
,
table_info
->
pointer
));
acpi_gbl_table_data
[
table_info
->
type
].
name
,
table_info
->
pointer
));
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
return_ACPI_STATUS
(
status
);
...
...
@@ -239,70 +239,58 @@ acpi_tb_init_table_descriptor (
acpi_table_type
table_type
,
struct
acpi_table_desc
*
table_info
)
{
struct
acpi_table_
desc
*
list_head
;
struct
acpi_table_
list
*
list_head
;
struct
acpi_table_desc
*
table_desc
;
ACPI_FUNCTION_TRACE_U32
(
"tb_init_table_descriptor"
,
table_type
);
/* Allocate a descriptor for this table */
table_desc
=
ACPI_MEM_CALLOCATE
(
sizeof
(
struct
acpi_table_desc
));
if
(
!
table_desc
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
/*
* Install the table into the global data structure
*/
list_head
=
&
acpi_gbl_acpi_tables
[
table_type
];
table_desc
=
list_head
;
list_head
=
&
acpi_gbl_table_lists
[
table_type
];
/*
* Two major types of tables: 1) Only one instance is allowed. This
* includes most ACPI tables such as the DSDT. 2) Multiple instances of
* the table are allowed. This includes SSDT and PSDTs.
*/
if
(
ACPI_IS_SINGLE_TABLE
(
acpi_gbl_
acpi_
table_data
[
table_type
].
flags
))
{
if
(
ACPI_IS_SINGLE_TABLE
(
acpi_gbl_table_data
[
table_type
].
flags
))
{
/*
* Only one table allowed, and a table has alread been installed
* at this location, so return an error.
*/
if
(
list_head
->
pointer
)
{
if
(
list_head
->
next
)
{
return_ACPI_STATUS
(
AE_ALREADY_EXISTS
);
}
table_desc
->
count
=
1
;
table_desc
->
prev
=
NULL
;
table_desc
->
next
=
NULL
;
}
else
{
/*
* Multiple tables allowed for this table type, we must link
* the new table in to the list of tables of this type.
*/
if
(
list_head
->
pointer
)
{
table_desc
=
ACPI_MEM_CALLOCATE
(
sizeof
(
struct
acpi_table_desc
));
if
(
!
table_desc
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
list_head
->
count
++
;
/* Update the original previous */
list_head
->
prev
->
next
=
table_desc
;
/* Update new entry */
table_desc
->
prev
=
list_head
->
prev
;
table_desc
->
next
=
list_head
;
/* Update list head */
/*
* Link the new table in to the list of tables of this type.
* Just insert at the start of the list, order unimportant.
*
* table_desc->Prev is already NULL from calloc()
*/
table_desc
->
next
=
list_head
->
next
;
list_head
->
next
=
table_desc
;
list_head
->
prev
=
table_desc
;
}
else
{
table_desc
->
count
=
1
;
}
if
(
table_desc
->
next
)
{
table_desc
->
next
->
prev
=
table_desc
;
}
/* Common initialization of the table descriptor */
list_head
->
count
++
;
table_desc
->
type
=
table_info
->
type
;
/* Finish initialization of the table descriptor */
table_desc
->
type
=
(
u8
)
table_type
;
table_desc
->
pointer
=
table_info
->
pointer
;
table_desc
->
length
=
table_info
->
length
;
table_desc
->
allocation
=
table_info
->
allocation
;
...
...
@@ -316,8 +304,8 @@ acpi_tb_init_table_descriptor (
* Set the appropriate global pointer (if there is one) to point to the
* newly installed table
*/
if
(
acpi_gbl_
acpi_
table_data
[
table_type
].
global_ptr
)
{
*
(
acpi_gbl_
acpi_
table_data
[
table_type
].
global_ptr
)
=
table_info
->
pointer
;
if
(
acpi_gbl_table_data
[
table_type
].
global_ptr
)
{
*
(
acpi_gbl_table_data
[
table_type
].
global_ptr
)
=
table_info
->
pointer
;
}
/* Return Data */
...
...
@@ -331,7 +319,7 @@ acpi_tb_init_table_descriptor (
/*******************************************************************************
*
* FUNCTION: acpi_tb_delete_a
cpi
_tables
* FUNCTION: acpi_tb_delete_a
ll
_tables
*
* PARAMETERS: None.
*
...
...
@@ -342,7 +330,7 @@ acpi_tb_init_table_descriptor (
******************************************************************************/
void
acpi_tb_delete_a
cpi
_tables
(
void
)
acpi_tb_delete_a
ll
_tables
(
void
)
{
acpi_table_type
type
;
...
...
@@ -351,15 +339,15 @@ acpi_tb_delete_acpi_tables (void)
* Free memory allocated for ACPI tables
* Memory can either be mapped or allocated
*/
for
(
type
=
0
;
type
<
NUM_ACPI_TABLES
;
type
++
)
{
acpi_tb_delete_
acpi_tabl
e
(
type
);
for
(
type
=
0
;
type
<
NUM_ACPI_TABLE
_TYPE
S
;
type
++
)
{
acpi_tb_delete_
tables_by_typ
e
(
type
);
}
}
/*******************************************************************************
*
* FUNCTION: acpi_tb_delete_
acpi_tabl
e
* FUNCTION: acpi_tb_delete_
tables_by_typ
e
*
* PARAMETERS: Type - The table type to be deleted
*
...
...
@@ -371,11 +359,15 @@ acpi_tb_delete_acpi_tables (void)
******************************************************************************/
void
acpi_tb_delete_
acpi_tabl
e
(
acpi_tb_delete_
tables_by_typ
e
(
acpi_table_type
type
)
{
struct
acpi_table_desc
*
table_desc
;
u32
count
;
u32
i
;
ACPI_FUNCTION_TRACE_U32
(
"tb_delete_acpi_table"
,
type
);
ACPI_FUNCTION_TRACE_U32
(
"tb_delete_tables_by_type"
,
type
);
if
(
type
>
ACPI_TABLE_MAX
)
{
...
...
@@ -416,43 +408,10 @@ acpi_tb_delete_acpi_table (
}
/* Free the table */
acpi_tb_free_acpi_tables_of_type
(
&
acpi_gbl_acpi_tables
[
type
]);
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
return_VOID
;
}
/*******************************************************************************
*
* FUNCTION: acpi_tb_free_acpi_tables_of_type
*
* PARAMETERS: table_info - A table info struct
*
* RETURN: None.
*
* DESCRIPTION: Free the memory associated with an internal ACPI table
* Table mutex should be locked.
*
******************************************************************************/
void
acpi_tb_free_acpi_tables_of_type
(
struct
acpi_table_desc
*
list_head
)
{
struct
acpi_table_desc
*
table_desc
;
u32
count
;
u32
i
;
ACPI_FUNCTION_TRACE_PTR
(
"tb_free_acpi_tables_of_type"
,
list_head
);
/* Get the head of the list */
table_desc
=
list_head
;
count
=
list_head
->
count
;
table_desc
=
acpi_gbl_table_lists
[
type
].
next
;
count
=
acpi_gbl_table_lists
[
type
].
count
;
/*
* Walk the entire list, deleting both the allocated tables
...
...
@@ -462,6 +421,7 @@ acpi_tb_free_acpi_tables_of_type (
table_desc
=
acpi_tb_uninstall_table
(
table_desc
);
}
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
return_VOID
;
}
...
...
@@ -484,30 +444,31 @@ acpi_tb_delete_single_table (
struct
acpi_table_desc
*
table_desc
)
{
if
(
!
table_desc
)
{
/* Must have a valid table descriptor and pointer */
if
((
!
table_desc
)
||
(
!
table_desc
->
pointer
))
{
return
;
}
if
(
table_desc
->
pointer
)
{
/* Valid table, determine type of memory allocation */
/* Valid table, determine type of memory allocation */
switch
(
table_desc
->
allocation
)
{
case
ACPI_MEM_NOT_ALLOCATED
:
break
;
switch
(
table_desc
->
allocation
)
{
case
ACPI_MEM_NOT_ALLOCATED
:
break
;
case
ACPI_MEM_ALLOCATED
:
case
ACPI_MEM_ALLOCATED
:
ACPI_MEM_FREE
(
table_desc
->
pointer
);
break
;
ACPI_MEM_FREE
(
table_desc
->
pointer
);
break
;
case
ACPI_MEM_MAPPED
:
case
ACPI_MEM_MAPPED
:
acpi_os_unmap_memory
(
table_desc
->
pointer
,
table_desc
->
length
);
break
;
acpi_os_unmap_memory
(
table_desc
->
pointer
,
table_desc
->
length
);
break
;
default:
break
;
}
default:
break
;
}
}
...
...
@@ -533,18 +494,23 @@ acpi_tb_uninstall_table (
struct
acpi_table_desc
*
next_desc
;
ACPI_FUNCTION_TRACE_PTR
(
"
acpi_
tb_uninstall_table"
,
table_desc
);
ACPI_FUNCTION_TRACE_PTR
(
"tb_uninstall_table"
,
table_desc
);
if
(
!
table_desc
)
{
return_PTR
(
NULL
);
}
/* Unlink the descriptor */
/* Unlink the descriptor
from the doubly linked list
*/
if
(
table_desc
->
prev
)
{
table_desc
->
prev
->
next
=
table_desc
->
next
;
}
else
{
/* Is first on list, update list head */
acpi_gbl_table_lists
[
table_desc
->
type
].
next
=
table_desc
->
next
;
}
if
(
table_desc
->
next
)
{
table_desc
->
next
->
prev
=
table_desc
->
prev
;
...
...
@@ -554,23 +520,12 @@ acpi_tb_uninstall_table (
acpi_tb_delete_single_table
(
table_desc
);
/* Free the table descriptor (Don't delete the list head, tho) */
if
((
table_desc
->
prev
)
==
(
table_desc
->
next
))
{
next_desc
=
NULL
;
/* Free the table descriptor */
/* Clear the list head */
next_desc
=
table_desc
->
next
;
ACPI_MEM_FREE
(
table_desc
);
table_desc
->
pointer
=
NULL
;
table_desc
->
length
=
0
;
table_desc
->
count
=
0
;
}
else
{
/* Free the table descriptor */
next_desc
=
table_desc
->
next
;
ACPI_MEM_FREE
(
table_desc
);
}
/* Return pointer to the next descriptor */
return_PTR
(
next_desc
);
}
...
...
drivers/acpi/tables/tbutils.c
View file @
17d0e4f4
...
...
@@ -66,26 +66,25 @@
acpi_status
acpi_tb_handle_to_object
(
u16
table_id
,
struct
acpi_table_desc
**
table_desc
)
struct
acpi_table_desc
**
return_
table_desc
)
{
u32
i
;
struct
acpi_table_desc
*
list_head
;
struct
acpi_table_desc
*
table_desc
;
ACPI_FUNCTION_NAME
(
"tb_handle_to_object"
);
for
(
i
=
0
;
i
<
ACPI_TABLE_MAX
;
i
++
)
{
list_head
=
&
acpi_gbl_acpi_tables
[
i
]
;
do
{
if
(
list_head
->
table_id
==
table_id
)
{
*
table_desc
=
list_head
;
table_desc
=
acpi_gbl_table_lists
[
i
].
next
;
while
(
table_desc
)
{
if
(
table_desc
->
table_id
==
table_id
)
{
*
return_table_desc
=
table_desc
;
return
(
AE_OK
);
}
list_head
=
list_head
->
next
;
}
while
(
list_head
!=
&
acpi_gbl_acpi_tables
[
i
]);
table_desc
=
table_desc
->
next
;
}
}
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"table_id=%X does not exist
\n
"
,
table_id
));
...
...
drivers/acpi/tables/tbxface.c
View file @
17d0e4f4
...
...
@@ -235,7 +235,7 @@ acpi_status
acpi_unload_table
(
acpi_table_type
table_type
)
{
struct
acpi_table_desc
*
list_head
;
struct
acpi_table_desc
*
table_desc
;
ACPI_FUNCTION_TRACE
(
"acpi_unload_table"
);
...
...
@@ -250,22 +250,22 @@ acpi_unload_table (
/* Find all tables of the requested type */
list_head
=
&
acpi_gbl_acpi_tables
[
table_type
]
;
do
{
table_desc
=
acpi_gbl_table_lists
[
table_type
].
next
;
while
(
table_desc
);
{
/*
* Delete all namespace entries owned by this table. Note that these
* entries can appear anywhere in the namespace by virtue of the AML
* "Scope" operator. Thus, we need to track ownership by an ID, not
* simply a position within the hierarchy
*/
acpi_ns_delete_namespace_by_owner
(
list_head
->
table_id
);
acpi_ns_delete_namespace_by_owner
(
table_desc
->
table_id
);
/* Delete (or unmap) the actual table */
acpi_tb_delete_acpi_table
(
table_type
);
table_desc
=
table_desc
->
next
;
}
}
while
(
list_head
!=
&
acpi_gbl_acpi_tables
[
table_type
]);
/* Delete (or unmap) all tables of this type */
acpi_tb_delete_tables_by_type
(
table_type
);
return_ACPI_STATUS
(
AE_OK
);
}
...
...
@@ -313,7 +313,7 @@ acpi_get_table_header (
/* Check the table type and instance */
if
((
table_type
>
ACPI_TABLE_MAX
)
||
(
ACPI_IS_SINGLE_TABLE
(
acpi_gbl_
acpi_
table_data
[
table_type
].
flags
)
&&
(
ACPI_IS_SINGLE_TABLE
(
acpi_gbl_table_data
[
table_type
].
flags
)
&&
instance
>
1
))
{
return_ACPI_STATUS
(
AE_BAD_PARAMETER
);
}
...
...
@@ -394,7 +394,7 @@ acpi_get_table (
/* Check the table type and instance */
if
((
table_type
>
ACPI_TABLE_MAX
)
||
(
ACPI_IS_SINGLE_TABLE
(
acpi_gbl_
acpi_
table_data
[
table_type
].
flags
)
&&
(
ACPI_IS_SINGLE_TABLE
(
acpi_gbl_table_data
[
table_type
].
flags
)
&&
instance
>
1
))
{
return_ACPI_STATUS
(
AE_BAD_PARAMETER
);
}
...
...
drivers/acpi/toshiba_acpi.c
View file @
17d0e4f4
...
...
@@ -33,7 +33,7 @@
*
*/
#define TOSHIBA_ACPI_VERSION "0.1
4
"
#define TOSHIBA_ACPI_VERSION "0.1
5
"
#define PROC_INTERFACE_VERSION 1
#include <linux/kernel.h>
...
...
@@ -172,9 +172,7 @@ hci_raw(const u32 in[HCI_WORDS], u32 out[HCI_WORDS])
for
(
i
=
0
;
i
<
HCI_WORDS
;
++
i
)
{
in_objs
[
i
].
type
=
ACPI_TYPE_INTEGER
;
in_objs
[
i
].
integer
.
value
=
in
[
i
];
/*printk("%04x ", in[i]);*/
}
/*printk("\n");*/
results
.
length
=
sizeof
(
out_objs
);
results
.
pointer
=
out_objs
;
...
...
@@ -184,9 +182,7 @@ hci_raw(const u32 in[HCI_WORDS], u32 out[HCI_WORDS])
if
((
status
==
AE_OK
)
&&
(
out_objs
->
package
.
count
<=
HCI_WORDS
))
{
for
(
i
=
0
;
i
<
out_objs
->
package
.
count
;
++
i
)
{
out
[
i
]
=
out_objs
->
package
.
elements
[
i
].
integer
.
value
;
/*printk("%04x ", out[i]);*/
}
/*printk("\n");*/
}
return
status
;
...
...
@@ -226,7 +222,7 @@ static int key_event_valid;
typedef
struct
_ProcItem
{
char
*
name
;
c
onst
c
har
*
name
;
char
*
(
*
read_func
)(
char
*
);
unsigned
long
(
*
write_func
)(
const
char
*
,
unsigned
long
);
}
ProcItem
;
...
...
@@ -284,10 +280,8 @@ static unsigned long
write_lcd
(
const
char
*
buffer
,
unsigned
long
count
)
{
int
value
;
/*int byte_count;*/
u32
hci_result
;
/* ISSUE: %i doesn't work with hex values as advertised */
if
(
snscanf
(
buffer
,
count
,
" brightness : %i"
,
&
value
)
==
1
&&
value
>=
0
&&
value
<
HCI_LCD_BRIGHTNESS_LEVELS
)
{
value
=
value
<<
HCI_LCD_BRIGHTNESS_SHIFT
;
...
...
@@ -414,6 +408,11 @@ read_keys(char* p)
last_key_event
=
value
;
}
else
if
(
hci_result
==
HCI_EMPTY
)
{
/* better luck next time */
}
else
if
(
hci_result
==
HCI_NOT_SUPPORTED
)
{
/* This is a workaround for an unresolved issue on
* some machines where system events sporadically
* become disabled. */
hci_write1
(
HCI_SYSTEM_EVENT
,
1
,
&
hci_result
);
}
else
{
p
+=
sprintf
(
p
,
"ERROR
\n
"
);
goto
end
;
...
...
drivers/acpi/utilities/utdelete.c
View file @
17d0e4f4
...
...
@@ -71,6 +71,7 @@ acpi_ut_delete_internal_obj (
void
*
obj_pointer
=
NULL
;
union
acpi_operand_object
*
handler_desc
;
union
acpi_operand_object
*
second_desc
;
union
acpi_operand_object
*
next_desc
;
ACPI_FUNCTION_TRACE_PTR
(
"ut_delete_internal_obj"
,
object
);
...
...
@@ -136,6 +137,15 @@ acpi_ut_delete_internal_obj (
if
(
object
->
device
.
gpe_block
)
{
(
void
)
acpi_ev_delete_gpe_block
(
object
->
device
.
gpe_block
);
}
/* Walk the handler list for this device */
handler_desc
=
object
->
device
.
address_space
;
while
(
handler_desc
)
{
next_desc
=
handler_desc
->
address_space
.
next
;
acpi_ut_remove_reference
(
handler_desc
);
handler_desc
=
next_desc
;
}
break
;
...
...
@@ -183,10 +193,13 @@ acpi_ut_delete_internal_obj (
* default handlers -- and therefore, we created the context object
* locally, it was not created by an external caller.
*/
handler_desc
=
object
->
region
.
addr_handler
;
if
((
handler_desc
)
&&
(
handler_desc
->
addr_handler
.
hflags
==
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED
))
{
obj_pointer
=
second_desc
->
extra
.
region_context
;
handler_desc
=
object
->
region
.
address_space
;
if
(
handler_desc
)
{
if
(
handler_desc
->
address_space
.
hflags
&
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED
)
{
obj_pointer
=
second_desc
->
extra
.
region_context
;
}
acpi_ut_remove_reference
(
handler_desc
);
}
/* Now we can free the Extra object */
...
...
@@ -211,7 +224,6 @@ acpi_ut_delete_internal_obj (
break
;
}
/* Free any allocated memory (pointer within the object) found above */
if
(
obj_pointer
)
{
...
...
@@ -299,7 +311,7 @@ acpi_ut_update_ref_count (
new_count
=
count
;
/*
*
R
eference count action (increment, decrement, or force delete)
*
Perform the r
eference count action (increment, decrement, or force delete)
*/
switch
(
action
)
{
...
...
@@ -402,8 +414,6 @@ acpi_ut_update_object_reference (
{
acpi_status
status
;
u32
i
;
union
acpi_operand_object
*
next
;
union
acpi_operand_object
*
new
;
union
acpi_generic_state
*
state_list
=
NULL
;
union
acpi_generic_state
*
state
;
...
...
@@ -417,9 +427,8 @@ acpi_ut_update_object_reference (
return_ACPI_STATUS
(
AE_OK
);
}
/*
* Make sure that this isn't a namespace handle
*/
/* Make sure that this isn't a namespace handle */
if
(
ACPI_GET_DESCRIPTOR_TYPE
(
object
)
==
ACPI_DESC_TYPE_NAMED
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ALLOCATIONS
,
"Object %p is NS handle
\n
"
,
object
));
return_ACPI_STATUS
(
AE_OK
);
...
...
@@ -439,28 +448,8 @@ acpi_ut_update_object_reference (
switch
(
ACPI_GET_OBJECT_TYPE
(
object
))
{
case
ACPI_TYPE_DEVICE
:
status
=
acpi_ut_create_update_state_and_push
(
object
->
device
.
addr_handler
,
action
,
&
state_list
);
if
(
ACPI_FAILURE
(
status
))
{
goto
error_exit
;
}
acpi_ut_update_ref_count
(
object
->
device
.
sys_handler
,
action
);
acpi_ut_update_ref_count
(
object
->
device
.
drv_handler
,
action
);
break
;
case
ACPI_TYPE_LOCAL_ADDRESS_HANDLER
:
/* Must walk list of address handlers */
next
=
object
->
addr_handler
.
next
;
while
(
next
)
{
new
=
next
->
addr_handler
.
next
;
acpi_ut_update_ref_count
(
next
,
action
);
next
=
new
;
}
acpi_ut_update_ref_count
(
object
->
device
.
system_notify
,
action
);
acpi_ut_update_ref_count
(
object
->
device
.
device_notify
,
action
);
break
;
...
...
@@ -590,16 +579,14 @@ acpi_ut_add_reference (
ACPI_FUNCTION_TRACE_PTR
(
"ut_add_reference"
,
object
);
/*
* Ensure that we have a valid object
*/
/* Ensure that we have a valid object */
if
(
!
acpi_ut_valid_internal_object
(
object
))
{
return_VOID
;
}
/*
* We have a valid ACPI internal object, now increment the reference count
*/
/* Increment the reference count */
(
void
)
acpi_ut_update_object_reference
(
object
,
REF_INCREMENT
);
return_VOID
;
}
...
...
@@ -624,6 +611,7 @@ acpi_ut_remove_reference (
ACPI_FUNCTION_TRACE_PTR
(
"ut_remove_reference"
,
object
);
/*
* Allow a NULL pointer to be passed in, just ignore it. This saves
* each caller from having to check. Also, ignore NS nodes.
...
...
@@ -634,9 +622,8 @@ acpi_ut_remove_reference (
return_VOID
;
}
/*
* Ensure that we have a valid object
*/
/* Ensure that we have a valid object */
if
(
!
acpi_ut_valid_internal_object
(
object
))
{
return_VOID
;
}
...
...
drivers/acpi/utilities/utglobal.c
View file @
17d0e4f4
...
...
@@ -299,10 +299,10 @@ acpi_ut_hex_to_ascii_char (
******************************************************************************/
struct
acpi_table_
desc
acpi_gbl_acpi_tables
[
NUM_ACPI_TABL
ES
];
struct
acpi_table_
list
acpi_gbl_table_lists
[
NUM_ACPI_TABLE_TYP
ES
];
struct
acpi_table_support
acpi_gbl_
acpi_table_data
[
NUM_ACPI_TABL
ES
]
=
struct
acpi_table_support
acpi_gbl_
table_data
[
NUM_ACPI_TABLE_TYP
ES
]
=
{
/*********** Name, Signature, Global typed pointer Signature size, Type How many allowed?, Contains valid AML? */
...
...
@@ -535,12 +535,10 @@ acpi_ut_get_object_type_name (
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
/*
* Strings and procedures used for debug only
*/
/*****************************************************************************
*
* FUNCTION: acpi_ut_get_mutex_name
...
...
@@ -558,7 +556,7 @@ acpi_ut_get_mutex_name (
u32
mutex_id
)
{
if
(
mutex_id
>
MAX_M
T
X
)
if
(
mutex_id
>
MAX_M
UTE
X
)
{
return
(
"Invalid Mutex ID"
);
}
...
...
@@ -566,7 +564,6 @@ acpi_ut_get_mutex_name (
return
(
acpi_gbl_mutex_names
[
mutex_id
]);
}
#endif
...
...
@@ -630,9 +627,12 @@ acpi_ut_allocate_owner_id (
owner_id
=
acpi_gbl_next_table_owner_id
;
acpi_gbl_next_table_owner_id
++
;
/* Check for wraparound */
if
(
acpi_gbl_next_table_owner_id
==
ACPI_FIRST_METHOD_ID
)
{
acpi_gbl_next_table_owner_id
=
ACPI_FIRST_TABLE_ID
;
ACPI_REPORT_WARNING
((
"Table owner ID wraparound
\n
"
));
}
break
;
...
...
@@ -644,6 +644,8 @@ acpi_ut_allocate_owner_id (
if
(
acpi_gbl_next_method_owner_id
==
ACPI_FIRST_TABLE_ID
)
{
/* Check for wraparound */
acpi_gbl_next_method_owner_id
=
ACPI_FIRST_METHOD_ID
;
}
break
;
...
...
@@ -710,23 +712,19 @@ acpi_ut_init_globals (
/* ACPI table structure */
for
(
i
=
0
;
i
<
NUM_ACPI_TABLES
;
i
++
)
for
(
i
=
0
;
i
<
NUM_ACPI_TABLE
_TYPE
S
;
i
++
)
{
acpi_gbl_acpi_tables
[
i
].
prev
=
&
acpi_gbl_acpi_tables
[
i
];
acpi_gbl_acpi_tables
[
i
].
next
=
&
acpi_gbl_acpi_tables
[
i
];
acpi_gbl_acpi_tables
[
i
].
pointer
=
NULL
;
acpi_gbl_acpi_tables
[
i
].
length
=
0
;
acpi_gbl_acpi_tables
[
i
].
allocation
=
ACPI_MEM_NOT_ALLOCATED
;
acpi_gbl_acpi_tables
[
i
].
count
=
0
;
acpi_gbl_table_lists
[
i
].
next
=
NULL
;
acpi_gbl_table_lists
[
i
].
count
=
0
;
}
/* Mutex locked flags */
for
(
i
=
0
;
i
<
NUM_M
T
X
;
i
++
)
for
(
i
=
0
;
i
<
NUM_M
UTE
X
;
i
++
)
{
acpi_gbl_
acpi_mutex_info
[
i
].
mutex
=
NULL
;
acpi_gbl_
acpi_mutex_info
[
i
].
owner_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
acpi_gbl_
acpi_mutex_info
[
i
].
use_count
=
0
;
acpi_gbl_
mutex_info
[
i
].
mutex
=
NULL
;
acpi_gbl_
mutex_info
[
i
].
owner_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
acpi_gbl_
mutex_info
[
i
].
use_count
=
0
;
}
/* GPE support */
...
...
@@ -737,8 +735,8 @@ acpi_ut_init_globals (
/* Global notify handlers */
acpi_gbl_sys
_notify
.
handler
=
NULL
;
acpi_gbl_d
rv_notify
.
handler
=
NULL
;
acpi_gbl_sys
tem_notify
.
handler
=
NULL
;
acpi_gbl_d
evice_notify
.
handler
=
NULL
;
acpi_gbl_init_handler
=
NULL
;
/* Global "typed" ACPI table pointers */
...
...
drivers/acpi/utilities/utmisc.c
View file @
17d0e4f4
...
...
@@ -549,7 +549,7 @@ acpi_ut_mutex_initialize (
/*
* Create each of the predefined mutex objects
*/
for
(
i
=
0
;
i
<
NUM_M
T
X
;
i
++
)
{
for
(
i
=
0
;
i
<
NUM_M
UTE
X
;
i
++
)
{
status
=
acpi_ut_create_mutex
(
i
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
...
...
@@ -588,7 +588,7 @@ acpi_ut_mutex_terminate (
/*
* Delete each predefined mutex object
*/
for
(
i
=
0
;
i
<
NUM_M
T
X
;
i
++
)
{
for
(
i
=
0
;
i
<
NUM_M
UTE
X
;
i
++
)
{
(
void
)
acpi_ut_delete_mutex
(
i
);
}
...
...
@@ -619,15 +619,15 @@ acpi_ut_create_mutex (
ACPI_FUNCTION_TRACE_U32
(
"ut_create_mutex"
,
mutex_id
);
if
(
mutex_id
>
MAX_M
T
X
)
{
if
(
mutex_id
>
MAX_M
UTE
X
)
{
return_ACPI_STATUS
(
AE_BAD_PARAMETER
);
}
if
(
!
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
mutex
)
{
if
(
!
acpi_gbl_mutex_info
[
mutex_id
].
mutex
)
{
status
=
acpi_os_create_semaphore
(
1
,
1
,
&
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
mutex
);
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
owner_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
use_count
=
0
;
&
acpi_gbl_mutex_info
[
mutex_id
].
mutex
);
acpi_gbl_mutex_info
[
mutex_id
].
owner_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
acpi_gbl_mutex_info
[
mutex_id
].
use_count
=
0
;
}
return_ACPI_STATUS
(
status
);
...
...
@@ -656,14 +656,14 @@ acpi_ut_delete_mutex (
ACPI_FUNCTION_TRACE_U32
(
"ut_delete_mutex"
,
mutex_id
);
if
(
mutex_id
>
MAX_M
T
X
)
{
if
(
mutex_id
>
MAX_M
UTE
X
)
{
return_ACPI_STATUS
(
AE_BAD_PARAMETER
);
}
status
=
acpi_os_delete_semaphore
(
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
mutex
);
status
=
acpi_os_delete_semaphore
(
acpi_gbl_mutex_info
[
mutex_id
].
mutex
);
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
mutex
=
NULL
;
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
owner_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
acpi_gbl_mutex_info
[
mutex_id
].
mutex
=
NULL
;
acpi_gbl_mutex_info
[
mutex_id
].
owner_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
return_ACPI_STATUS
(
status
);
}
...
...
@@ -693,7 +693,7 @@ acpi_ut_acquire_mutex (
ACPI_FUNCTION_NAME
(
"ut_acquire_mutex"
);
if
(
mutex_id
>
MAX_M
T
X
)
{
if
(
mutex_id
>
MAX_M
UTE
X
)
{
return
(
AE_BAD_PARAMETER
);
}
...
...
@@ -705,8 +705,8 @@ acpi_ut_acquire_mutex (
* the mutex ordering rule. This indicates a coding error somewhere in
* the ACPI subsystem code.
*/
for
(
i
=
mutex_id
;
i
<
MAX_M
T
X
;
i
++
)
{
if
(
acpi_gbl_
acpi_
mutex_info
[
i
].
owner_id
==
this_thread_id
)
{
for
(
i
=
mutex_id
;
i
<
MAX_M
UTE
X
;
i
++
)
{
if
(
acpi_gbl_mutex_info
[
i
].
owner_id
==
this_thread_id
)
{
if
(
i
==
mutex_id
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Mutex [%s] already acquired by this thread [%X]
\n
"
,
...
...
@@ -728,14 +728,14 @@ acpi_ut_acquire_mutex (
"Thread %X attempting to acquire Mutex [%s]
\n
"
,
this_thread_id
,
acpi_ut_get_mutex_name
(
mutex_id
)));
status
=
acpi_os_wait_semaphore
(
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
mutex
,
status
=
acpi_os_wait_semaphore
(
acpi_gbl_mutex_info
[
mutex_id
].
mutex
,
1
,
ACPI_WAIT_FOREVER
);
if
(
ACPI_SUCCESS
(
status
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_MUTEX
,
"Thread %X acquired Mutex [%s]
\n
"
,
this_thread_id
,
acpi_ut_get_mutex_name
(
mutex_id
)));
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
use_count
++
;
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
owner_id
=
this_thread_id
;
acpi_gbl_mutex_info
[
mutex_id
].
use_count
++
;
acpi_gbl_mutex_info
[
mutex_id
].
owner_id
=
this_thread_id
;
}
else
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Thread %X could not acquire Mutex [%s] %s
\n
"
,
...
...
@@ -776,14 +776,14 @@ acpi_ut_release_mutex (
"Thread %X releasing Mutex [%s]
\n
"
,
this_thread_id
,
acpi_ut_get_mutex_name
(
mutex_id
)));
if
(
mutex_id
>
MAX_M
T
X
)
{
if
(
mutex_id
>
MAX_M
UTE
X
)
{
return
(
AE_BAD_PARAMETER
);
}
/*
* Mutex must be acquired in order to release it!
*/
if
(
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
owner_id
==
ACPI_MUTEX_NOT_ACQUIRED
)
{
if
(
acpi_gbl_mutex_info
[
mutex_id
].
owner_id
==
ACPI_MUTEX_NOT_ACQUIRED
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Mutex [%s] is not acquired, cannot release
\n
"
,
acpi_ut_get_mutex_name
(
mutex_id
)));
...
...
@@ -797,8 +797,8 @@ acpi_ut_release_mutex (
* ordering rule. This indicates a coding error somewhere in
* the ACPI subsystem code.
*/
for
(
i
=
mutex_id
;
i
<
MAX_M
T
X
;
i
++
)
{
if
(
acpi_gbl_
acpi_
mutex_info
[
i
].
owner_id
==
this_thread_id
)
{
for
(
i
=
mutex_id
;
i
<
MAX_M
UTE
X
;
i
++
)
{
if
(
acpi_gbl_mutex_info
[
i
].
owner_id
==
this_thread_id
)
{
if
(
i
==
mutex_id
)
{
continue
;
}
...
...
@@ -813,9 +813,9 @@ acpi_ut_release_mutex (
/* Mark unlocked FIRST */
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
owner_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
acpi_gbl_mutex_info
[
mutex_id
].
owner_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
status
=
acpi_os_signal_semaphore
(
acpi_gbl_
acpi_
mutex_info
[
mutex_id
].
mutex
,
1
);
status
=
acpi_os_signal_semaphore
(
acpi_gbl_mutex_info
[
mutex_id
].
mutex
,
1
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Thread %X could not release Mutex [%s] %s
\n
"
,
...
...
drivers/acpi/utilities/utxface.c
View file @
17d0e4f4
...
...
@@ -144,23 +144,9 @@ acpi_enable_subsystem (
ACPI_FUNCTION_TRACE
(
"acpi_enable_subsystem"
);
/*
* Install the default op_region handlers. These are installed unless
* other handlers have already been installed via the
* install_address_space_handler interface
*/
if
(
!
(
flags
&
ACPI_NO_ADDRESS_SPACE_INIT
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[Init] Installing default address space handlers
\n
"
));
status
=
acpi_ev_init_address_spaces
();
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
}
/*
* We must initialize the hardware before we can enable ACPI.
*
FADT values
are validated here.
*
The values from the FADT
are validated here.
*/
if
(
!
(
flags
&
ACPI_NO_HARDWARE_INIT
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[Init] Initializing ACPI hardware
\n
"
));
...
...
@@ -172,7 +158,7 @@ acpi_enable_subsystem (
}
/*
* Enable ACPI
on this platform
* Enable ACPI
mode
*/
if
(
!
(
flags
&
ACPI_NO_ACPI_ENABLE
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[Init] Going into ACPI mode
\n
"
));
...
...
@@ -187,8 +173,9 @@ acpi_enable_subsystem (
}
/*
* Note:
* We must have the hardware AND events initialized before we can execute
* Initialize ACPI Event handling
*
* NOTE: We must have the hardware AND events initialized before we can execute
* ANY control methods SAFELY. Any control method can require ACPI hardware
* support, so the hardware MUST be initialized before execution!
*/
...
...
@@ -201,7 +188,7 @@ acpi_enable_subsystem (
}
}
/* Install
SCI handler, Global Lock handler,
GPE handlers */
/* Install
the SCI handler, Global Lock handler, and
GPE handlers */
if
(
!
(
flags
&
ACPI_NO_HANDLER_INIT
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[Init] Installing SCI/GL/GPE handlers
\n
"
));
...
...
@@ -237,14 +224,20 @@ acpi_initialize_objects (
ACPI_FUNCTION_TRACE
(
"acpi_initialize_objects"
);
/*
* Initialize all device objects in the namespace
* This runs the _STA and _INI methods.
* Install the default op_region handlers. These are installed unless
* other handlers have already been installed via the
* install_address_space_handler interface.
*
* NOTE: This will cause _REG methods to be run. Any objects accessed
* by the _REG methods will be automatically initialized, even if they
* contain executable AML (see call to acpi_ns_initialize_objects below).
*/
if
(
!
(
flags
&
ACPI_NO_
DEVI
CE_INIT
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[Init] In
itializing ACPI Device
s
\n
"
));
if
(
!
(
flags
&
ACPI_NO_
ADDRESS_SPA
CE_INIT
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[Init] In
stalling default address space handler
s
\n
"
));
status
=
acpi_
ns_initialize_devi
ces
();
status
=
acpi_
ev_init_address_spa
ces
();
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -252,8 +245,8 @@ acpi_initialize_objects (
/*
* Initialize the objects that remain uninitialized. This
* runs the executable AML that
is part of the declaration of op_regions
*
and Field
s.
* runs the executable AML that
may be part of the declaration of these
*
objects: operation_regions, buffer_fields, Buffers, and Package
s.
*/
if
(
!
(
flags
&
ACPI_NO_OBJECT_INIT
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[Init] Initializing ACPI Objects
\n
"
));
...
...
@@ -264,6 +257,19 @@ acpi_initialize_objects (
}
}
/*
* Initialize all device objects in the namespace
* This runs the _STA and _INI methods.
*/
if
(
!
(
flags
&
ACPI_NO_DEVICE_INIT
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[Init] Initializing ACPI Devices
\n
"
));
status
=
acpi_ns_initialize_devices
();
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
}
/*
* Empty the caches (delete the cached objects) on the assumption that
* the table load filled them up more than they will be at runtime --
...
...
@@ -431,9 +437,9 @@ acpi_get_system_info (
/* Current status of the ACPI tables, per table type */
info_ptr
->
num_table_types
=
NUM_ACPI_TABLES
;
for
(
i
=
0
;
i
<
NUM_ACPI_TABLES
;
i
++
)
{
info_ptr
->
table_info
[
i
].
count
=
acpi_gbl_
acpi_table
s
[
i
].
count
;
info_ptr
->
num_table_types
=
NUM_ACPI_TABLE
_TYPE
S
;
for
(
i
=
0
;
i
<
NUM_ACPI_TABLE
_TYPE
S
;
i
++
)
{
info_ptr
->
table_info
[
i
].
count
=
acpi_gbl_
table_list
s
[
i
].
count
;
}
return_ACPI_STATUS
(
AE_OK
);
...
...
include/acpi/acconfig.h
View file @
17d0e4f4
...
...
@@ -64,7 +64,7 @@
/* Version string */
#define ACPI_CA_VERSION 0x20030
418
#define ACPI_CA_VERSION 0x20030
509
/* Maximum objects in the various object caches */
...
...
include/acpi/acevents.h
View file @
17d0e4f4
...
...
@@ -165,7 +165,7 @@ acpi_ev_address_space_dispatch (
void
*
value
);
acpi_status
acpi_ev_
addr_handler_help
er
(
acpi_ev_
install_handl
er
(
acpi_handle
obj_handle
,
u32
level
,
void
*
context
,
...
...
include/acpi/acexcep.h
View file @
17d0e4f4
...
...
@@ -94,8 +94,9 @@
#define AE_NO_GLOBAL_LOCK (acpi_status) (0x001A | AE_CODE_ENVIRONMENTAL)
#define AE_LOGICAL_ADDRESS (acpi_status) (0x001B | AE_CODE_ENVIRONMENTAL)
#define AE_ABORT_METHOD (acpi_status) (0x001C | AE_CODE_ENVIRONMENTAL)
#define AE_SAME_HANDLER (acpi_status) (0x001D | AE_CODE_ENVIRONMENTAL)
#define AE_CODE_ENV_MAX 0x001
C
#define AE_CODE_ENV_MAX 0x001
D
/*
* Programmer exceptions
...
...
@@ -219,7 +220,8 @@ char const *acpi_gbl_exception_names_env[] =
"AE_NO_HARDWARE_RESPONSE"
,
"AE_NO_GLOBAL_LOCK"
,
"AE_LOGICAL_ADDRESS"
,
"AE_ABORT_METHOD"
"AE_ABORT_METHOD"
,
"AE_SAME_HANDLER"
};
char
const
*
acpi_gbl_exception_names_pgm
[]
=
...
...
include/acpi/acglobal.h
View file @
17d0e4f4
...
...
@@ -105,6 +105,8 @@ ACPI_EXTERN struct acpi_common_facs acpi_gbl_common_fACS;
*/
ACPI_EXTERN
u8
acpi_gbl_integer_bit_width
;
ACPI_EXTERN
u8
acpi_gbl_integer_byte_width
;
ACPI_EXTERN
struct
acpi_generic_address
acpi_gbl_xpm1a_enable
;
ACPI_EXTERN
struct
acpi_generic_address
acpi_gbl_xpm1b_enable
;
/*
* Since there may be multiple SSDTs and PSDTS, a single pointer is not
...
...
@@ -115,15 +117,15 @@ ACPI_EXTERN u8 acpi_gbl_integer_byte_width;
/*
* ACPI Table info arrays
*/
extern
struct
acpi_table_
desc
acpi_gbl_acpi_tables
[
NUM_ACPI_TABL
ES
];
extern
struct
acpi_table_support
acpi_gbl_
acpi_table_data
[
NUM_ACPI_TABL
ES
];
extern
struct
acpi_table_
list
acpi_gbl_table_lists
[
NUM_ACPI_TABLE_TYP
ES
];
extern
struct
acpi_table_support
acpi_gbl_
table_data
[
NUM_ACPI_TABLE_TYP
ES
];
/*
* Predefined mutex objects. This array contains the
* actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs.
* (The table maps local handles to the real OS handles)
*/
ACPI_EXTERN
struct
acpi_mutex_info
acpi_gbl_
acpi_mutex_info
[
NUM_MT
X
];
ACPI_EXTERN
struct
acpi_mutex_info
acpi_gbl_
mutex_info
[
NUM_MUTE
X
];
/*****************************************************************************
...
...
@@ -134,8 +136,8 @@ ACPI_EXTERN struct acpi_mutex_info acpi_gbl_acpi_mutex_info [NUM_MT
ACPI_EXTERN
struct
acpi_memory_list
acpi_gbl_memory_lists
[
ACPI_NUM_MEM_LISTS
];
ACPI_EXTERN
struct
acpi_object_notify_handler
acpi_gbl_d
rv
_notify
;
ACPI_EXTERN
struct
acpi_object_notify_handler
acpi_gbl_sys_notify
;
ACPI_EXTERN
struct
acpi_object_notify_handler
acpi_gbl_d
evice
_notify
;
ACPI_EXTERN
struct
acpi_object_notify_handler
acpi_gbl_sys
tem
_notify
;
ACPI_EXTERN
acpi_init_handler
acpi_gbl_init_handler
;
ACPI_EXTERN
struct
acpi_walk_state
*
acpi_gbl_breakpoint_walk
;
ACPI_EXTERN
acpi_handle
acpi_gbl_global_lock_semaphore
;
...
...
@@ -200,7 +202,7 @@ ACPI_EXTERN u32 acpi_gbl_deepest_nesting;
****************************************************************************/
ACPI_EXTERN
struct
acpi_thread_state
*
acpi_gbl_current_walk_list
;
ACPI_EXTERN
struct
acpi_thread_state
*
acpi_gbl_current_walk_list
;
/* Control method single step flag */
...
...
@@ -213,7 +215,7 @@ ACPI_EXTERN u8 acpi_gbl_cm_single_step;
*
****************************************************************************/
ACPI_EXTERN
union
acpi_parse_object
*
acpi_gbl_parsed_namespace_root
;
ACPI_EXTERN
union
acpi_parse_object
*
acpi_gbl_parsed_namespace_root
;
/*****************************************************************************
*
...
...
@@ -234,8 +236,8 @@ ACPI_EXTERN u8 acpi_gbl_sleep_type_b;
extern
struct
acpi_fixed_event_info
acpi_gbl_fixed_event_info
[
ACPI_NUM_FIXED_EVENTS
];
ACPI_EXTERN
struct
acpi_fixed_event_handler
acpi_gbl_fixed_event_handlers
[
ACPI_NUM_FIXED_EVENTS
];
ACPI_EXTERN
struct
acpi_gpe_xrupt_info
*
acpi_gbl_gpe_xrupt_list_head
;
ACPI_EXTERN
struct
acpi_gpe_block_info
*
acpi_gbl_gpe_fadt_blocks
[
ACPI_MAX_GPE_BLOCKS
];
ACPI_EXTERN
struct
acpi_gpe_xrupt_info
*
acpi_gbl_gpe_xrupt_list_head
;
ACPI_EXTERN
struct
acpi_gpe_block_info
*
acpi_gbl_gpe_fadt_blocks
[
ACPI_MAX_GPE_BLOCKS
];
ACPI_EXTERN
acpi_handle
acpi_gbl_gpe_lock
;
...
...
include/acpi/achware.h
View file @
17d0e4f4
...
...
@@ -98,15 +98,13 @@ acpi_status
acpi_hw_low_level_read
(
u32
width
,
u32
*
value
,
struct
acpi_generic_address
*
reg
,
u32
offset
);
struct
acpi_generic_address
*
reg
);
acpi_status
acpi_hw_low_level_write
(
u32
width
,
u32
value
,
struct
acpi_generic_address
*
reg
,
u32
offset
);
struct
acpi_generic_address
*
reg
);
acpi_status
acpi_hw_clear_acpi_status
(
...
...
include/acpi/aclocal.h
View file @
17d0e4f4
...
...
@@ -87,8 +87,8 @@ typedef u32 acpi_mutex_handle;
#define ACPI_MTX_DEBUG_CMD_COMPLETE 11
#define ACPI_MTX_DEBUG_CMD_READY 12
#define MAX_M
TX
12
#define NUM_M
TX MAX_MT
X+1
#define MAX_M
UTEX
12
#define NUM_M
UTEX MAX_MUTE
X+1
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
...
...
@@ -140,12 +140,8 @@ struct acpi_mutex_info
typedef
u16
acpi_owner_id
;
#define ACPI_OWNER_TYPE_TABLE 0x0
#define ACPI_OWNER_TYPE_METHOD 0x1
#define ACPI_FIRST_METHOD_ID 0x0000
#define ACPI_FIRST_TABLE_ID 0x8000
/* TBD: [Restructure] get rid of the need for this! */
#define TABLE_ID_DSDT (acpi_owner_id) 0x8000
#define ACPI_FIRST_METHOD_ID 0x0001
#define ACPI_FIRST_TABLE_ID 0xF000
/* Field access granularities */
...
...
@@ -232,13 +228,18 @@ struct acpi_table_desc
u64
physical_address
;
u32
aml_length
;
acpi_size
length
;
u32
count
;
acpi_owner_id
table_id
;
u8
type
;
u8
allocation
;
u8
loaded_into_namespace
;
};
struct
acpi_table_list
{
struct
acpi_table_desc
*
next
;
u32
count
;
};
struct
acpi_find_context
{
...
...
include/acpi/acmacros.h
View file @
17d0e4f4
...
...
@@ -440,26 +440,6 @@
#define INCREMENT_ARG_LIST(list) (list >>= ((u32) ARG_TYPE_WIDTH))
/*
* Build a GAS structure from earlier ACPI table entries (V1.0 and 0.71 extensions)
*
* 1) Address space
* 2) Length in bytes -- convert to length in bits
* 3) Bit offset is zero
* 4) Reserved field is zero
* 5) Expand address to 64 bits
*/
#define ASL_BUILD_GAS_FROM_ENTRY(a,b,c,d) do {a.address_space_id = (u8) d;\
a.register_bit_width = (u8) ACPI_MUL_8 (b);\
a.register_bit_offset = 0;\
a.reserved = 0;\
ACPI_STORE_ADDRESS (a.address,(acpi_physical_address) c);} while (0)
/* ACPI V1.0 entries -- address space is always I/O */
#define ASL_BUILD_GAS_FROM_V1_ENTRY(a,b,c) ASL_BUILD_GAS_FROM_ENTRY(a,b,c,ACPI_ADR_SPACE_SYSTEM_IO)
/*
* Reporting macros that are never compiled out
*/
...
...
include/acpi/acnamesp.h
View file @
17d0e4f4
...
...
@@ -201,6 +201,11 @@ acpi_ns_compare_names (
char
*
name1
,
char
*
name2
);
void
acpi_ns_remove_reference
(
struct
acpi_namespace_node
*
node
);
/*
* Namespace modification - nsmodify
*/
...
...
include/acpi/acobject.h
View file @
17d0e4f4
...
...
@@ -112,9 +112,9 @@
* Common fields for objects that support ASL notifications
*/
#define ACPI_COMMON_NOTIFY_INFO \
union acpi_operand_object *sys
_handler;
/* Handler for system notifies */
\
union acpi_operand_object *d
rv_handler;
/* Handler for driver notifies */
\
union acpi_operand_object *addr
_handler;
/* Handler for Address space */
union acpi_operand_object *sys
tem_notify;
/* Handler for system notifies */
\
union acpi_operand_object *d
evice_notify;
/* Handler for driver notifies */
\
union acpi_operand_object *addr
ess_space;
/* Handler for Address space */
/******************************************************************************
...
...
@@ -214,7 +214,7 @@ struct acpi_object_region
ACPI_OBJECT_COMMON_HEADER
u8
space_id
;
union
acpi_operand_object
*
addr
_handler
;
/* Handler for system notifie
s */
union
acpi_operand_object
*
addr
ess_space
;
/* Handler for region acces
s */
struct
acpi_namespace_node
*
node
;
/* containing object */
union
acpi_operand_object
*
next
;
u32
length
;
...
...
@@ -446,8 +446,8 @@ union acpi_operand_object
struct
acpi_object_buffer_field
buffer_field
;
struct
acpi_object_bank_field
bank_field
;
struct
acpi_object_index_field
index_field
;
struct
acpi_object_notify_handler
notify
_handler
;
struct
acpi_object_addr_handler
addr
_handler
;
struct
acpi_object_notify_handler
notify
;
struct
acpi_object_addr_handler
addr
ess_space
;
struct
acpi_object_reference
reference
;
struct
acpi_object_extra
extra
;
struct
acpi_object_data
data
;
...
...
include/acpi/acpiosxf.h
View file @
17d0e4f4
...
...
@@ -290,12 +290,12 @@ acpi_os_derive_pci_id(
u8
acpi_os_readable
(
void
*
pointer
,
u32
length
);
acpi_size
length
);
u8
acpi_os_writable
(
void
*
pointer
,
u32
length
);
acpi_size
length
);
u32
acpi_os_get_timer
(
...
...
include/acpi/actables.h
View file @
17d0e4f4
...
...
@@ -157,7 +157,7 @@ acpi_tb_match_signature (
acpi_status
acpi_tb_recognize_table
(
struct
acpi_table_desc
*
table_info
,
u8
search_type
);
u8
search_type
);
acpi_status
acpi_tb_init_table_descriptor
(
...
...
@@ -170,11 +170,11 @@ acpi_tb_init_table_descriptor (
*/
void
acpi_tb_delete_a
cpi
_tables
(
acpi_tb_delete_a
ll
_tables
(
void
);
void
acpi_tb_delete_
acpi_tabl
e
(
acpi_tb_delete_
tables_by_typ
e
(
acpi_table_type
type
);
void
...
...
@@ -185,10 +185,6 @@ struct acpi_table_desc *
acpi_tb_uninstall_table
(
struct
acpi_table_desc
*
table_desc
);
void
acpi_tb_free_acpi_tables_of_type
(
struct
acpi_table_desc
*
table_info
);
/*
* tbrsd - RSDP, RSDT utilities
...
...
include/acpi/actypes.h
View file @
17d0e4f4
...
...
@@ -407,7 +407,7 @@ typedef u32 acpi_table_type;
#define ACPI_TABLE_SSDT (acpi_table_type) 5
#define ACPI_TABLE_XSDT (acpi_table_type) 6
#define ACPI_TABLE_MAX 6
#define NUM_ACPI_TABLE
S
(ACPI_TABLE_MAX+1)
#define NUM_ACPI_TABLE
_TYPES
(ACPI_TABLE_MAX+1)
/*
...
...
@@ -747,7 +747,7 @@ struct acpi_system_info
u32
debug_level
;
u32
debug_layer
;
u32
num_table_types
;
struct
acpi_table_info
table_info
[
NUM_ACPI_TABLES
];
struct
acpi_table_info
table_info
[
NUM_ACPI_TABLE
_TYPE
S
];
};
...
...
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