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
23750205
Commit
23750205
authored
Sep 17, 2016
by
Rafael J. Wysocki
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'acpica' into acpi-sysfs
parents
18864cc4
86ec64bc
Changes
45
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
45 changed files
with
1223 additions
and
822 deletions
+1223
-822
drivers/acpi/acpica/Makefile
drivers/acpi/acpica/Makefile
+1
-0
drivers/acpi/acpica/acdebug.h
drivers/acpi/acpica/acdebug.h
+1
-1
drivers/acpi/acpica/acnamesp.h
drivers/acpi/acpica/acnamesp.h
+8
-0
drivers/acpi/acpica/acparser.h
drivers/acpi/acpica/acparser.h
+2
-0
drivers/acpi/acpica/actables.h
drivers/acpi/acpica/actables.h
+9
-6
drivers/acpi/acpica/acutils.h
drivers/acpi/acpica/acutils.h
+10
-7
drivers/acpi/acpica/dbconvert.c
drivers/acpi/acpica/dbconvert.c
+4
-3
drivers/acpi/acpica/dbexec.c
drivers/acpi/acpica/dbexec.c
+34
-28
drivers/acpi/acpica/dbinput.c
drivers/acpi/acpica/dbinput.c
+2
-0
drivers/acpi/acpica/dbmethod.c
drivers/acpi/acpica/dbmethod.c
+132
-0
drivers/acpi/acpica/dsmethod.c
drivers/acpi/acpica/dsmethod.c
+12
-2
drivers/acpi/acpica/dswexec.c
drivers/acpi/acpica/dswexec.c
+2
-1
drivers/acpi/acpica/dswload2.c
drivers/acpi/acpica/dswload2.c
+2
-5
drivers/acpi/acpica/evgpeinit.c
drivers/acpi/acpica/evgpeinit.c
+5
-2
drivers/acpi/acpica/evrgnini.c
drivers/acpi/acpica/evrgnini.c
+2
-1
drivers/acpi/acpica/exconcat.c
drivers/acpi/acpica/exconcat.c
+1
-1
drivers/acpi/acpica/exconfig.c
drivers/acpi/acpica/exconfig.c
+29
-89
drivers/acpi/acpica/exconvrt.c
drivers/acpi/acpica/exconvrt.c
+4
-4
drivers/acpi/acpica/exmisc.c
drivers/acpi/acpica/exmisc.c
+2
-2
drivers/acpi/acpica/exoparg1.c
drivers/acpi/acpica/exoparg1.c
+13
-10
drivers/acpi/acpica/exresop.c
drivers/acpi/acpica/exresop.c
+6
-5
drivers/acpi/acpica/extrace.c
drivers/acpi/acpica/extrace.c
+0
-25
drivers/acpi/acpica/exutils.c
drivers/acpi/acpica/exutils.c
+8
-0
drivers/acpi/acpica/nsconvert.c
drivers/acpi/acpica/nsconvert.c
+0
-1
drivers/acpi/acpica/nsload.c
drivers/acpi/acpica/nsload.c
+12
-18
drivers/acpi/acpica/nsparse.c
drivers/acpi/acpica/nsparse.c
+134
-31
drivers/acpi/acpica/nsutils.c
drivers/acpi/acpica/nsutils.c
+50
-16
drivers/acpi/acpica/psparse.c
drivers/acpi/acpica/psparse.c
+5
-1
drivers/acpi/acpica/psxface.c
drivers/acpi/acpica/psxface.c
+73
-0
drivers/acpi/acpica/tbdata.c
drivers/acpi/acpica/tbdata.c
+140
-0
drivers/acpi/acpica/tbfadt.c
drivers/acpi/acpica/tbfadt.c
+63
-63
drivers/acpi/acpica/tbfind.c
drivers/acpi/acpica/tbfind.c
+8
-4
drivers/acpi/acpica/tbinstal.c
drivers/acpi/acpica/tbinstal.c
+9
-64
drivers/acpi/acpica/tbxfload.c
drivers/acpi/acpica/tbxfload.c
+8
-45
drivers/acpi/acpica/utaddress.c
drivers/acpi/acpica/utaddress.c
+0
-8
drivers/acpi/acpica/uthex.c
drivers/acpi/acpica/uthex.c
+42
-4
drivers/acpi/acpica/utnonansi.c
drivers/acpi/acpica/utnonansi.c
+2
-355
drivers/acpi/acpica/utosi.c
drivers/acpi/acpica/utosi.c
+17
-5
drivers/acpi/acpica/utstrtoul64.c
drivers/acpi/acpica/utstrtoul64.c
+348
-0
drivers/acpi/acpica/utxfinit.c
drivers/acpi/acpica/utxfinit.c
+2
-1
include/acpi/acpixf.h
include/acpi/acpixf.h
+8
-1
include/acpi/actypes.h
include/acpi/actypes.h
+7
-9
tools/power/acpi/tools/acpidump/Makefile
tools/power/acpi/tools/acpidump/Makefile
+2
-0
tools/power/acpi/tools/acpidump/apdump.c
tools/power/acpi/tools/acpidump/apdump.c
+2
-2
tools/power/acpi/tools/acpidump/apmain.c
tools/power/acpi/tools/acpidump/apmain.c
+2
-2
No files found.
drivers/acpi/acpica/Makefile
View file @
23750205
...
...
@@ -175,6 +175,7 @@ acpi-y += \
utresrc.o
\
utstate.o
\
utstring.o
\
utstrtoul64.o
\
utxface.o
\
utxfinit.o
\
utxferror.o
\
...
...
drivers/acpi/acpica/acdebug.h
View file @
23750205
...
...
@@ -155,7 +155,7 @@ acpi_status acpi_db_disassemble_method(char *name);
void
acpi_db_disassemble_aml
(
char
*
statements
,
union
acpi_parse_object
*
op
);
void
acpi_db_
batch_execute
(
char
*
count_arg
);
void
acpi_db_
evaluate_predefined_names
(
void
);
/*
* dbnames - namespace commands
...
...
drivers/acpi/acpica/acnamesp.h
View file @
23750205
...
...
@@ -129,6 +129,9 @@ struct acpi_namespace_node *acpi_ns_get_next_node_typed(acpi_object_type type,
acpi_status
acpi_ns_parse_table
(
u32
table_index
,
struct
acpi_namespace_node
*
start_node
);
acpi_status
acpi_ns_execute_table
(
u32
table_index
,
struct
acpi_namespace_node
*
start_node
);
acpi_status
acpi_ns_one_complete_parse
(
u32
pass_number
,
u32
table_index
,
...
...
@@ -295,6 +298,11 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
u8
acpi_ns_pattern_match
(
struct
acpi_namespace_node
*
obj_node
,
char
*
search_for
);
acpi_status
acpi_ns_get_node_unlocked
(
struct
acpi_namespace_node
*
prefix_node
,
const
char
*
external_pathname
,
u32
flags
,
struct
acpi_namespace_node
**
out_node
);
acpi_status
acpi_ns_get_node
(
struct
acpi_namespace_node
*
prefix_node
,
const
char
*
external_pathname
,
...
...
drivers/acpi/acpica/acparser.h
View file @
23750205
...
...
@@ -78,6 +78,8 @@ extern const u8 acpi_gbl_long_op_index[];
*/
acpi_status
acpi_ps_execute_method
(
struct
acpi_evaluate_info
*
info
);
acpi_status
acpi_ps_execute_table
(
struct
acpi_evaluate_info
*
info
);
/*
* psargs - Parse AML opcode arguments
*/
...
...
drivers/acpi/acpica/actables.h
View file @
23750205
...
...
@@ -123,6 +123,14 @@ acpi_tb_install_standard_table(acpi_physical_address address,
void
acpi_tb_uninstall_table
(
struct
acpi_table_desc
*
table_desc
);
acpi_status
acpi_tb_load_table
(
u32
table_index
,
struct
acpi_namespace_node
*
parent_node
);
acpi_status
acpi_tb_install_and_load_table
(
struct
acpi_table_header
*
table
,
acpi_physical_address
address
,
u8
flags
,
u8
override
,
u32
*
table_index
);
void
acpi_tb_terminate
(
void
);
acpi_status
acpi_tb_delete_namespace_by_owner
(
u32
table_index
);
...
...
@@ -155,12 +163,7 @@ void
acpi_tb_install_table_with_override
(
struct
acpi_table_desc
*
new_table_desc
,
u8
override
,
u32
*
table_index
);
acpi_status
acpi_tb_install_fixed_table
(
acpi_physical_address
address
,
char
*
signature
,
u32
*
table_index
);
acpi_status
ACPI_INIT_FUNCTION
acpi_tb_parse_root_table
(
acpi_physical_address
rsdp_address
);
acpi_status
acpi_tb_parse_root_table
(
acpi_physical_address
rsdp_address
);
/*
* tbxfload
...
...
drivers/acpi/acpica/acutils.h
View file @
23750205
...
...
@@ -196,14 +196,15 @@ void acpi_ut_strlwr(char *src_string);
int
acpi_ut_stricmp
(
char
*
string1
,
char
*
string2
);
acpi_status
acpi_ut_strtoul64
(
char
*
string
,
u32
base
,
u32
max_integer_byte_width
,
u64
*
ret_integer
);
/* Values for max_integer_byte_width above */
acpi_status
acpi_ut_strtoul64
(
char
*
string
,
u32
flags
,
u64
*
ret_integer
);
#define ACPI_MAX32_BYTE_WIDTH 4
#define ACPI_MAX64_BYTE_WIDTH 8
/*
* Values for Flags above
* Note: LIMIT values correspond to acpi_gbl_integer_byte_width values (4/8)
*/
#define ACPI_STRTOUL_32BIT 0x04
/* 4 bytes */
#define ACPI_STRTOUL_64BIT 0x08
/* 8 bytes */
#define ACPI_STRTOUL_BASE16 0x10
/* Default: Base10/16 */
/*
* utglobal - Global data structures and procedures
...
...
@@ -233,6 +234,8 @@ const char *acpi_ut_get_event_name(u32 event_id);
char
acpi_ut_hex_to_ascii_char
(
u64
integer
,
u32
position
);
acpi_status
acpi_ut_ascii_to_hex_byte
(
char
*
two_ascii_chars
,
u8
*
return_byte
);
u8
acpi_ut_ascii_char_to_hex
(
int
hex_char
);
u8
acpi_ut_valid_object_type
(
acpi_object_type
type
);
...
...
drivers/acpi/acpica/dbconvert.c
View file @
23750205
...
...
@@ -277,9 +277,10 @@ acpi_db_convert_to_object(acpi_object_type type,
default:
object
->
type
=
ACPI_TYPE_INTEGER
;
status
=
acpi_ut_strtoul64
(
string
,
16
,
acpi_gbl_integer_byte_width
,
&
object
->
integer
.
value
);
status
=
acpi_ut_strtoul64
(
string
,
(
acpi_gbl_integer_byte_width
|
ACPI_STRTOUL_BASE16
),
&
object
->
integer
.
value
);
break
;
}
...
...
drivers/acpi/acpica/dbexec.c
View file @
23750205
...
...
@@ -392,42 +392,48 @@ acpi_db_execute(char *name, char **args, acpi_object_type *types, u32 flags)
acpi_db_execution_walk
,
NULL
,
NULL
,
NULL
);
return
;
}
else
{
name_string
=
ACPI_ALLOCATE
(
strlen
(
name
)
+
1
);
if
(
!
name_string
)
{
return
;
}
}
memset
(
&
acpi_gbl_db_method_info
,
0
,
sizeof
(
struct
acpi_db_method_info
));
name_string
=
ACPI_ALLOCATE
(
strlen
(
name
)
+
1
);
if
(
!
name_string
)
{
return
;
}
strcpy
(
name_string
,
name
);
acpi_ut_strupr
(
name_string
);
acpi_gbl_db_method_info
.
name
=
name_string
;
acpi_gbl_db_method_info
.
args
=
args
;
acpi_gbl_db_method_info
.
types
=
types
;
acpi_gbl_db_method_info
.
flags
=
flags
;
memset
(
&
acpi_gbl_db_method_info
,
0
,
sizeof
(
struct
acpi_db_method_info
));
strcpy
(
name_string
,
name
);
acpi_ut_strupr
(
name_string
);
return_obj
.
pointer
=
NULL
;
return_obj
.
length
=
ACPI_ALLOCATE_BUFFER
;
/* Subcommand to Execute all predefined names in the namespace */
status
=
acpi_db_execute_setup
(
&
acpi_gbl_db_method_info
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_FREE
(
name_string
);
return
;
}
if
(
!
strncmp
(
name_string
,
"PREDEF"
,
6
))
{
acpi_db_evaluate_predefined_names
();
ACPI_FREE
(
name_string
);
return
;
}
/* Get the NS node, determines existence also */
acpi_gbl_db_method_info
.
name
=
name_string
;
acpi_gbl_db_method_info
.
args
=
args
;
acpi_gbl_db_method_info
.
types
=
types
;
acpi_gbl_db_method_info
.
flags
=
flags
;
status
=
acpi_get_handle
(
NULL
,
acpi_gbl_db_method_info
.
pathname
,
&
acpi_gbl_db_method_info
.
method
);
if
(
ACPI_SUCCESS
(
status
))
{
status
=
acpi_db_execute_method
(
&
acpi_gbl_db_method_info
,
&
return_obj
);
}
return_obj
.
pointer
=
NULL
;
return_obj
.
length
=
ACPI_ALLOCATE_BUFFER
;
status
=
acpi_db_execute_setup
(
&
acpi_gbl_db_method_info
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_FREE
(
name_string
);
return
;
}
/* Get the NS node, determines existence also */
status
=
acpi_get_handle
(
NULL
,
acpi_gbl_db_method_info
.
pathname
,
&
acpi_gbl_db_method_info
.
method
);
if
(
ACPI_SUCCESS
(
status
))
{
status
=
acpi_db_execute_method
(
&
acpi_gbl_db_method_info
,
&
return_obj
);
}
ACPI_FREE
(
name_string
);
/*
* Allow any handlers in separate threads to complete.
...
...
drivers/acpi/acpica/dbinput.c
View file @
23750205
...
...
@@ -286,6 +286,8 @@ static const struct acpi_db_command_help acpi_gbl_db_command_help[] = {
{
1
,
"
\"
Ascii String
\"
"
,
"String method argument
\n
"
},
{
1
,
" (Hex Byte List)"
,
"Buffer method argument
\n
"
},
{
1
,
" [Package Element List]"
,
"Package method argument
\n
"
},
{
5
,
" Execute predefined"
,
"Execute all predefined (public) methods
\n
"
},
{
1
,
" Go"
,
"Allow method to run to completion
\n
"
},
{
1
,
" Information"
,
"Display info about the current method
\n
"
},
{
1
,
" Into"
,
"Step into (not over) a method call
\n
"
},
...
...
drivers/acpi/acpica/dbmethod.c
View file @
23750205
...
...
@@ -52,6 +52,11 @@
#define _COMPONENT ACPI_CA_DEBUGGER
ACPI_MODULE_NAME
(
"dbmethod"
)
/* Local prototypes */
static
acpi_status
acpi_db_walk_for_execute
(
acpi_handle
obj_handle
,
u32
nesting_level
,
void
*
context
,
void
**
return_value
);
/*******************************************************************************
*
* FUNCTION: acpi_db_set_method_breakpoint
...
...
@@ -66,6 +71,7 @@ ACPI_MODULE_NAME("dbmethod")
* AML offset
*
******************************************************************************/
void
acpi_db_set_method_breakpoint
(
char
*
location
,
struct
acpi_walk_state
*
walk_state
,
...
...
@@ -367,3 +373,129 @@ acpi_status acpi_db_disassemble_method(char *name)
acpi_ut_release_owner_id
(
&
obj_desc
->
method
.
owner_id
);
return
(
AE_OK
);
}
/*******************************************************************************
*
* FUNCTION: acpi_db_walk_for_execute
*
* PARAMETERS: Callback from walk_namespace
*
* RETURN: Status
*
* DESCRIPTION: Batch execution module. Currently only executes predefined
* ACPI names.
*
******************************************************************************/
static
acpi_status
acpi_db_walk_for_execute
(
acpi_handle
obj_handle
,
u32
nesting_level
,
void
*
context
,
void
**
return_value
)
{
struct
acpi_namespace_node
*
node
=
(
struct
acpi_namespace_node
*
)
obj_handle
;
struct
acpi_db_execute_walk
*
info
=
(
struct
acpi_db_execute_walk
*
)
context
;
struct
acpi_buffer
return_obj
;
acpi_status
status
;
char
*
pathname
;
u32
i
;
struct
acpi_device_info
*
obj_info
;
struct
acpi_object_list
param_objects
;
union
acpi_object
params
[
ACPI_METHOD_NUM_ARGS
];
const
union
acpi_predefined_info
*
predefined
;
predefined
=
acpi_ut_match_predefined_method
(
node
->
name
.
ascii
);
if
(
!
predefined
)
{
return
(
AE_OK
);
}
if
(
node
->
type
==
ACPI_TYPE_LOCAL_SCOPE
)
{
return
(
AE_OK
);
}
pathname
=
acpi_ns_get_external_pathname
(
node
);
if
(
!
pathname
)
{
return
(
AE_OK
);
}
/* Get the object info for number of method parameters */
status
=
acpi_get_object_info
(
obj_handle
,
&
obj_info
);
if
(
ACPI_FAILURE
(
status
))
{
return
(
status
);
}
param_objects
.
pointer
=
NULL
;
param_objects
.
count
=
0
;
if
(
obj_info
->
type
==
ACPI_TYPE_METHOD
)
{
/* Setup default parameters */
for
(
i
=
0
;
i
<
obj_info
->
param_count
;
i
++
)
{
params
[
i
].
type
=
ACPI_TYPE_INTEGER
;
params
[
i
].
integer
.
value
=
1
;
}
param_objects
.
pointer
=
params
;
param_objects
.
count
=
obj_info
->
param_count
;
}
ACPI_FREE
(
obj_info
);
return_obj
.
pointer
=
NULL
;
return_obj
.
length
=
ACPI_ALLOCATE_BUFFER
;
/* Do the actual method execution */
acpi_gbl_method_executing
=
TRUE
;
status
=
acpi_evaluate_object
(
node
,
NULL
,
&
param_objects
,
&
return_obj
);
acpi_os_printf
(
"%-32s returned %s
\n
"
,
pathname
,
acpi_format_exception
(
status
));
acpi_gbl_method_executing
=
FALSE
;
ACPI_FREE
(
pathname
);
/* Ignore status from method execution */
status
=
AE_OK
;
/* Update count, check if we have executed enough methods */
info
->
count
++
;
if
(
info
->
count
>=
info
->
max_count
)
{
status
=
AE_CTRL_TERMINATE
;
}
return
(
status
);
}
/*******************************************************************************
*
* FUNCTION: acpi_db_evaluate_predefined_names
*
* PARAMETERS: None
*
* RETURN: None
*
* DESCRIPTION: Namespace batch execution. Execute predefined names in the
* namespace, up to the max count, if specified.
*
******************************************************************************/
void
acpi_db_evaluate_predefined_names
(
void
)
{
struct
acpi_db_execute_walk
info
;
info
.
count
=
0
;
info
.
max_count
=
ACPI_UINT32_MAX
;
/* Search all nodes in namespace */
(
void
)
acpi_walk_namespace
(
ACPI_TYPE_ANY
,
ACPI_ROOT_OBJECT
,
ACPI_UINT32_MAX
,
acpi_db_walk_for_execute
,
NULL
,
(
void
*
)
&
info
,
NULL
);
acpi_os_printf
(
"Evaluated %u predefined names in the namespace
\n
"
,
info
.
count
);
}
drivers/acpi/acpica/dsmethod.c
View file @
23750205
...
...
@@ -99,11 +99,14 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node,
"Method auto-serialization parse [%4.4s] %p
\n
"
,
acpi_ut_get_node_name
(
node
),
node
));
acpi_ex_enter_interpreter
();
/* Create/Init a root op for the method parse tree */
op
=
acpi_ps_alloc_op
(
AML_METHOD_OP
,
obj_desc
->
method
.
aml_start
);
if
(
!
op
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
status
=
AE_NO_MEMORY
;
goto
unlock
;
}
acpi_ps_set_name
(
op
,
node
->
name
.
integer
);
...
...
@@ -115,7 +118,8 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node,
acpi_ds_create_walk_state
(
node
->
owner_id
,
NULL
,
NULL
,
NULL
);
if
(
!
walk_state
)
{
acpi_ps_free_op
(
op
);
return_ACPI_STATUS
(
AE_NO_MEMORY
);
status
=
AE_NO_MEMORY
;
goto
unlock
;
}
status
=
acpi_ds_init_aml_walk
(
walk_state
,
op
,
node
,
...
...
@@ -134,6 +138,8 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node,
status
=
acpi_ps_parse_aml
(
walk_state
);
acpi_ps_delete_parse_tree
(
op
);
unlock:
acpi_ex_exit_interpreter
();
return_ACPI_STATUS
(
status
);
}
...
...
@@ -757,8 +763,10 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
/* Delete any direct children of (created by) this method */
(
void
)
acpi_ex_exit_interpreter
();
acpi_ns_delete_namespace_subtree
(
walk_state
->
method_node
);
(
void
)
acpi_ex_enter_interpreter
();
/*
* Delete any objects that were created by this method
...
...
@@ -769,9 +777,11 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
*/
if
(
method_desc
->
method
.
info_flags
&
ACPI_METHOD_MODIFIED_NAMESPACE
)
{
(
void
)
acpi_ex_exit_interpreter
();
acpi_ns_delete_namespace_by_owner
(
method_desc
->
method
.
owner_id
);
(
void
)
acpi_ex_enter_interpreter
();
method_desc
->
method
.
info_flags
&=
~
ACPI_METHOD_MODIFIED_NAMESPACE
;
}
...
...
drivers/acpi/acpica/dswexec.c
View file @
23750205
...
...
@@ -133,7 +133,8 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
* Result of predicate evaluation must be an Integer
* object. Implicitly convert the argument if necessary.
*/
status
=
acpi_ex_convert_to_integer
(
obj_desc
,
&
local_obj_desc
,
16
);
status
=
acpi_ex_convert_to_integer
(
obj_desc
,
&
local_obj_desc
,
ACPI_STRTOUL_BASE16
);
if
(
ACPI_FAILURE
(
status
))
{
goto
cleanup
;
}
...
...
drivers/acpi/acpica/dswload2.c
View file @
23750205
...
...
@@ -605,16 +605,13 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
acpi_ex_exit_interpreter
();
}
acpi_ex_exit_interpreter
();
status
=
acpi_ev_initialize_region
(
acpi_ns_get_attached_object
(
node
),
FALSE
);
if
(
walk_state
->
method_node
)
{
acpi_ex_enter_interpreter
();
}
acpi_ex_enter_interpreter
();
if
(
ACPI_FAILURE
(
status
))
{
/*
...
...
drivers/acpi/acpica/evgpeinit.c
View file @
23750205
...
...
@@ -323,7 +323,9 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
struct
acpi_gpe_walk_info
*
walk_info
=
ACPI_CAST_PTR
(
struct
acpi_gpe_walk_info
,
context
);
struct
acpi_gpe_event_info
*
gpe_event_info
;
acpi_status
status
;
u32
gpe_number
;
u8
temp_gpe_number
;
char
name
[
ACPI_NAME_SIZE
+
1
];
u8
type
;
...
...
@@ -377,8 +379,8 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
/* 4) The last two characters of the name are the hex GPE Number */
gpe_number
=
strtoul
(
&
name
[
2
],
NULL
,
16
);
if
(
gpe_number
==
ACPI_UINT32_MAX
)
{
status
=
acpi_ut_ascii_to_hex_byte
(
&
name
[
2
],
&
temp_gpe_number
);
if
(
ACPI_FAILURE
(
status
)
)
{
/* Conversion failed; invalid method, just ignore it */
...
...
@@ -390,6 +392,7 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
/* Ensure that we have a valid GPE number for this GPE block */
gpe_number
=
(
u32
)
temp_gpe_number
;
gpe_event_info
=
acpi_ev_low_get_gpe_info
(
gpe_number
,
walk_info
->
gpe_block
);
if
(
!
gpe_event_info
)
{
...
...
drivers/acpi/acpica/evrgnini.c
View file @
23750205
...
...
@@ -553,7 +553,8 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
*
* See acpi_ns_exec_module_code
*/
if
(
obj_desc
->
method
.
if
(
!
acpi_gbl_parse_table_as_term_list
&&
obj_desc
->
method
.
info_flags
&
ACPI_METHOD_MODULE_LEVEL
)
{
handler_obj
=
obj_desc
->
method
.
dispatch
.
handler
;
...
...
drivers/acpi/acpica/exconcat.c
View file @
23750205
...
...
@@ -156,7 +156,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
status
=
acpi_ex_convert_to_integer
(
local_operand1
,
&
temp_operand1
,
16
);
ACPI_STRTOUL_BASE
16
);
break
;
case
ACPI_TYPE_BUFFER
:
...
...
drivers/acpi/acpica/exconfig.c
View file @
23750205
...
...
@@ -55,9 +55,7 @@ ACPI_MODULE_NAME("exconfig")
/* Local prototypes */
static
acpi_status
acpi_ex_add_table
(
u32
table_index
,
struct
acpi_namespace_node
*
parent_node
,
union
acpi_operand_object
**
ddb_handle
);
acpi_ex_add_table
(
u32
table_index
,
union
acpi_operand_object
**
ddb_handle
);
static
acpi_status
acpi_ex_region_read
(
union
acpi_operand_object
*
obj_desc
,
...
...
@@ -79,13 +77,9 @@ acpi_ex_region_read(union acpi_operand_object *obj_desc,
******************************************************************************/
static
acpi_status
acpi_ex_add_table
(
u32
table_index
,
struct
acpi_namespace_node
*
parent_node
,
union
acpi_operand_object
**
ddb_handle
)
acpi_ex_add_table
(
u32
table_index
,
union
acpi_operand_object
**
ddb_handle
)
{
union
acpi_operand_object
*
obj_desc
;
acpi_status
status
;
acpi_owner_id
owner_id
;
ACPI_FUNCTION_TRACE
(
ex_add_table
);
...
...
@@ -100,39 +94,8 @@ acpi_ex_add_table(u32 table_index,
obj_desc
->
common
.
flags
|=
AOPOBJ_DATA_VALID
;
obj_desc
->
reference
.
class
=
ACPI_REFCLASS_TABLE
;
*
ddb_handle
=
obj_desc
;
/* Install the new table into the local data structures */
obj_desc
->
reference
.
value
=
table_index
;
/* Add the table to the namespace */
status
=
acpi_ns_load_table
(
table_index
,
parent_node
);
if
(
ACPI_FAILURE
(
status
))
{
acpi_ut_remove_reference
(
obj_desc
);
*
ddb_handle
=
NULL
;
return_ACPI_STATUS
(
status
);
}
/* Execute any module-level code that was found in the table */
acpi_ex_exit_interpreter
();
if
(
acpi_gbl_group_module_level_code
)
{
acpi_ns_exec_module_code_list
();
}
acpi_ex_enter_interpreter
();
/*
* Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
* responsible for discovering any new wake GPEs by running _PRW methods
* that may have been loaded by this table.
*/
status
=
acpi_tb_get_owner_id
(
table_index
,
&
owner_id
);
if
(
ACPI_SUCCESS
(
status
))
{
acpi_ev_update_gpes
(
owner_id
);
}
*
ddb_handle
=
obj_desc
;
return_ACPI_STATUS
(
AE_OK
);
}
...
...
@@ -159,16 +122,17 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
struct
acpi_namespace_node
*
start_node
;
struct
acpi_namespace_node
*
parameter_node
=
NULL
;
union
acpi_operand_object
*
ddb_handle
;
struct
acpi_table_header
*
table
;
u32
table_index
;
ACPI_FUNCTION_TRACE
(
ex_load_table_op
);
/* Find the ACPI table in the RSDT/XSDT */
acpi_ex_exit_interpreter
();
status
=
acpi_tb_find_table
(
operand
[
0
]
->
string
.
pointer
,
operand
[
1
]
->
string
.
pointer
,
operand
[
2
]
->
string
.
pointer
,
&
table_index
);
acpi_ex_enter_interpreter
();
if
(
ACPI_FAILURE
(
status
))
{
if
(
status
!=
AE_NOT_FOUND
)
{
return_ACPI_STATUS
(
status
);
...
...
@@ -197,9 +161,10 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
* Find the node referenced by the root_path_string. This is the
* location within the namespace where the table will be loaded.
*/
status
=
acpi_ns_get_node
(
start_node
,
operand
[
3
]
->
string
.
pointer
,
ACPI_NS_SEARCH_PARENT
,
&
parent_node
);
status
=
acpi_ns_get_node_unlocked
(
start_node
,
operand
[
3
]
->
string
.
pointer
,
ACPI_NS_SEARCH_PARENT
,
&
parent_node
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -219,9 +184,10 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
/* Find the node referenced by the parameter_path_string */
status
=
acpi_ns_get_node
(
start_node
,
operand
[
4
]
->
string
.
pointer
,
ACPI_NS_SEARCH_PARENT
,
&
parameter_node
);
status
=
acpi_ns_get_node_unlocked
(
start_node
,
operand
[
4
]
->
string
.
pointer
,
ACPI_NS_SEARCH_PARENT
,
&
parameter_node
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -229,7 +195,15 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
/* Load the table into the namespace */
status
=
acpi_ex_add_table
(
table_index
,
parent_node
,
&
ddb_handle
);
ACPI_INFO
((
"Dynamic OEM Table Load:"
));
acpi_ex_exit_interpreter
();
status
=
acpi_tb_load_table
(
table_index
,
parent_node
);
acpi_ex_enter_interpreter
();
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
status
=
acpi_ex_add_table
(
table_index
,
&
ddb_handle
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -252,19 +226,6 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
}
}
status
=
acpi_get_table_by_index
(
table_index
,
&
table
);
if
(
ACPI_SUCCESS
(
status
))
{
ACPI_INFO
((
"Dynamic OEM Table Load:"
));
acpi_tb_print_table_header
(
0
,
table
);
}
/* Invoke table handler if present */
if
(
acpi_gbl_table_handler
)
{
(
void
)
acpi_gbl_table_handler
(
ACPI_TABLE_EVENT_LOAD
,
table
,
acpi_gbl_table_handler_context
);
}
*
return_desc
=
ddb_handle
;
return_ACPI_STATUS
(
status
);
}
...
...
@@ -475,13 +436,12 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
/* Install the new table into the local data structures */
ACPI_INFO
((
"Dynamic OEM Table Load:"
));
(
void
)
acpi_ut_acquire_mutex
(
ACPI_MTX_TABLES
);
status
=
acpi_tb_install_standard_table
(
ACPI_PTR_TO_PHYSADDR
(
table
),
ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL
,
TRUE
,
TRUE
,
&
table_index
);
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
acpi_ex_exit_interpreter
();
status
=
acpi_tb_install_and_load_table
(
table
,
ACPI_PTR_TO_PHYSADDR
(
table
),
ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL
,
TRUE
,
&
table_index
);
acpi_ex_enter_interpreter
();
if
(
ACPI_FAILURE
(
status
))
{
/* Delete allocated table buffer */
...
...
@@ -490,17 +450,6 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
return_ACPI_STATUS
(
status
);
}
/*
* Note: Now table is "INSTALLED", it must be validated before
* loading.
*/
status
=
acpi_tb_validate_table
(
&
acpi_gbl_root_table_list
.
tables
[
table_index
]);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
/*
* Add the table to the namespace.
*
...
...
@@ -508,8 +457,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
* This appears to go against the ACPI specification, but we do it for
* compatibility with other ACPI implementations.
*/
status
=
acpi_ex_add_table
(
table_index
,
acpi_gbl_root_node
,
&
ddb_handle
);
status
=
acpi_ex_add_table
(
table_index
,
&
ddb_handle
);
if
(
ACPI_FAILURE
(
status
))
{
/* On error, table_ptr was deallocated above */
...
...
@@ -532,14 +480,6 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
/* Remove the reference by added by acpi_ex_store above */
acpi_ut_remove_reference
(
ddb_handle
);
/* Invoke table handler if present */
if
(
acpi_gbl_table_handler
)
{
(
void
)
acpi_gbl_table_handler
(
ACPI_TABLE_EVENT_LOAD
,
table
,
acpi_gbl_table_handler_context
);
}
return_ACPI_STATUS
(
status
);
}
...
...
drivers/acpi/acpica/exconvrt.c
View file @
23750205
...
...
@@ -124,9 +124,9 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
* of ACPI 3.0) is that the to_integer() operator allows both decimal
* and hexadecimal strings (hex prefixed with "0x").
*/
status
=
acpi_ut_strtoul64
(
(
char
*
)
pointer
,
flags
,
acpi_gbl_integer_byte_width
,
&
result
);
status
=
acpi_ut_strtoul64
(
ACPI_CAST_PTR
(
char
,
pointer
)
,
(
acpi_gbl_integer_byte_width
|
flags
),
&
result
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -632,7 +632,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
*/
status
=
acpi_ex_convert_to_integer
(
source_desc
,
result_desc
,
16
);
ACPI_STRTOUL_BASE
16
);
break
;
case
ACPI_TYPE_STRING
:
...
...
drivers/acpi/acpica/exmisc.c
View file @
23750205
...
...
@@ -327,8 +327,8 @@ acpi_ex_do_logical_op(u16 opcode,
switch
(
operand0
->
common
.
type
)
{
case
ACPI_TYPE_INTEGER
:
status
=
acpi_ex_convert_to_integer
(
operand1
,
&
local_operand1
,
16
);
status
=
acpi_ex_convert_to_integer
(
operand1
,
&
local_operand1
,
ACPI_STRTOUL_BASE
16
);
break
;
case
ACPI_TYPE_STRING
:
...
...
drivers/acpi/acpica/exoparg1.c
View file @
23750205
...
...
@@ -521,9 +521,10 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
case
AML_TO_INTEGER_OP
:
/* to_integer (Data, Result) */
/* Perform "explicit" conversion */
status
=
acpi_ex_convert_to_integer
(
operand
[
0
],
&
return_desc
,
ACPI_ANY_BASE
);
acpi_ex_convert_to_integer
(
operand
[
0
],
&
return_desc
,
0
);
if
(
return_desc
==
operand
[
0
])
{
/* No conversion performed, add ref to handle return value */
...
...
@@ -890,14 +891,16 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
* Field, so we need to resolve the node to a value.
*/
status
=
acpi_ns_get_node
(
walk_state
->
scope_info
->
scope
.
node
,
operand
[
0
]
->
string
.
pointer
,
ACPI_NS_SEARCH_PARENT
,
ACPI_CAST_INDIRECT_PTR
(
struct
acpi_namespace_node
,
&
return_desc
));
acpi_ns_get_node_unlocked
(
walk_state
->
scope_info
->
scope
.
node
,
operand
[
0
]
->
string
.
pointer
,
ACPI_NS_SEARCH_PARENT
,
ACPI_CAST_INDIRECT_PTR
(
struct
acpi_namespace_node
,
&
return_desc
));
if
(
ACPI_FAILURE
(
status
))
{
goto
cleanup
;
}
...
...
drivers/acpi/acpica/exresop.c
View file @
23750205
...
...
@@ -410,12 +410,13 @@ acpi_ex_resolve_operands(u16 opcode,
case
ARGI_INTEGER
:
/*
* Need an operand of type ACPI_TYPE_INTEGER,
* But we can implicitly convert from a STRING or BUFFER
* aka - "Implicit Source Operand Conversion"
* Need an operand of type ACPI_TYPE_INTEGER, but we can
* implicitly convert from a STRING or BUFFER.
*
* Known as "Implicit Source Operand Conversion"
*/
status
=
acpi_ex_convert_to_integer
(
obj_desc
,
stack_ptr
,
16
);
status
=
acpi_ex_convert_to_integer
(
obj_desc
,
stack_ptr
,
ACPI_STRTOUL_BASE
16
);
if
(
ACPI_FAILURE
(
status
))
{
if
(
status
==
AE_TYPE
)
{
ACPI_ERROR
((
AE_INFO
,
...
...
drivers/acpi/acpica/extrace.c
View file @
23750205
...
...
@@ -201,7 +201,6 @@ acpi_ex_start_trace_method(struct acpi_namespace_node *method_node,
union
acpi_operand_object
*
obj_desc
,
struct
acpi_walk_state
*
walk_state
)
{
acpi_status
status
;
char
*
pathname
=
NULL
;
u8
enabled
=
FALSE
;
...
...
@@ -211,11 +210,6 @@ acpi_ex_start_trace_method(struct acpi_namespace_node *method_node,
pathname
=
acpi_ns_get_normalized_pathname
(
method_node
,
TRUE
);
}
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
goto
exit
;
}
enabled
=
acpi_ex_interpreter_trace_enabled
(
pathname
);
if
(
enabled
&&
!
acpi_gbl_trace_method_object
)
{
acpi_gbl_trace_method_object
=
obj_desc
;
...
...
@@ -233,9 +227,6 @@ acpi_ex_start_trace_method(struct acpi_namespace_node *method_node,
}
}
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
exit:
if
(
enabled
)
{
ACPI_TRACE_POINT
(
ACPI_TRACE_AML_METHOD
,
TRUE
,
obj_desc
?
obj_desc
->
method
.
aml_start
:
NULL
,
...
...
@@ -267,7 +258,6 @@ acpi_ex_stop_trace_method(struct acpi_namespace_node *method_node,
union
acpi_operand_object
*
obj_desc
,
struct
acpi_walk_state
*
walk_state
)
{
acpi_status
status
;
char
*
pathname
=
NULL
;
u8
enabled
;
...
...
@@ -277,26 +267,14 @@ acpi_ex_stop_trace_method(struct acpi_namespace_node *method_node,
pathname
=
acpi_ns_get_normalized_pathname
(
method_node
,
TRUE
);
}
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
goto
exit_path
;
}
enabled
=
acpi_ex_interpreter_trace_enabled
(
NULL
);
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
enabled
)
{
ACPI_TRACE_POINT
(
ACPI_TRACE_AML_METHOD
,
FALSE
,
obj_desc
?
obj_desc
->
method
.
aml_start
:
NULL
,
pathname
);
}
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
goto
exit_path
;
}
/* Check whether the tracer should be stopped */
if
(
acpi_gbl_trace_method_object
==
obj_desc
)
{
...
...
@@ -312,9 +290,6 @@ acpi_ex_stop_trace_method(struct acpi_namespace_node *method_node,
acpi_gbl_trace_method_object
=
NULL
;
}
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
exit_path:
if
(
pathname
)
{
ACPI_FREE
(
pathname
);
}
...
...
drivers/acpi/acpica/exutils.c
View file @
23750205
...
...
@@ -94,6 +94,10 @@ void acpi_ex_enter_interpreter(void)
ACPI_ERROR
((
AE_INFO
,
"Could not acquire AML Interpreter mutex"
));
}
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_ERROR
((
AE_INFO
,
"Could not acquire AML Namespace mutex"
));
}
return_VOID
;
}
...
...
@@ -127,6 +131,10 @@ void acpi_ex_exit_interpreter(void)
ACPI_FUNCTION_TRACE
(
ex_exit_interpreter
);
status
=
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_ERROR
((
AE_INFO
,
"Could not release AML Namespace mutex"
));
}
status
=
acpi_ut_release_mutex
(
ACPI_MTX_INTERPRETER
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_ERROR
((
AE_INFO
,
...
...
drivers/acpi/acpica/nsconvert.c
View file @
23750205
...
...
@@ -79,7 +79,6 @@ acpi_ns_convert_to_integer(union acpi_operand_object *original_object,
/* String-to-Integer conversion */
status
=
acpi_ut_strtoul64
(
original_object
->
string
.
pointer
,
ACPI_ANY_BASE
,
acpi_gbl_integer_byte_width
,
&
value
);
if
(
ACPI_FAILURE
(
status
))
{
return
(
status
);
...
...
drivers/acpi/acpica/nsload.c
View file @
23750205
...
...
@@ -46,6 +46,7 @@
#include "acnamesp.h"
#include "acdispat.h"
#include "actables.h"
#include "acinterp.h"
#define _COMPONENT ACPI_NAMESPACE
ACPI_MODULE_NAME
(
"nsload"
)
...
...
@@ -78,20 +79,6 @@ acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
ACPI_FUNCTION_TRACE
(
ns_load_table
);
/*
* Parse the table and load the namespace with all named
* objects found within. Control methods are NOT parsed
* at this time. In fact, the control methods cannot be
* parsed until the entire namespace is loaded, because
* if a control method makes a forward reference (call)
* to another control method, we can't continue parsing
* because we don't know how many arguments to parse next!
*/
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
/* If table already loaded into namespace, just return */
if
(
acpi_tb_is_table_loaded
(
table_index
))
{
...
...
@@ -107,6 +94,15 @@ acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
goto
unlock
;
}
/*
* Parse the table and load the namespace with all named
* objects found within. Control methods are NOT parsed
* at this time. In fact, the control methods cannot be
* parsed until the entire namespace is loaded, because
* if a control method makes a forward reference (call)
* to another control method, we can't continue parsing
* because we don't know how many arguments to parse next!
*/
status
=
acpi_ns_parse_table
(
table_index
,
node
);
if
(
ACPI_SUCCESS
(
status
))
{
acpi_tb_set_table_loaded_flag
(
table_index
,
TRUE
);
...
...
@@ -120,7 +116,6 @@ acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
* exist. This target of Scope must already exist in the
* namespace, as per the ACPI specification.
*/
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
acpi_ns_delete_namespace_by_owner
(
acpi_gbl_root_table_list
.
tables
[
table_index
].
owner_id
);
...
...
@@ -129,8 +124,6 @@ acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
}
unlock:
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -162,7 +155,8 @@ acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
* other ACPI implementations. Optionally, the execution can be deferred
* until later, see acpi_initialize_objects.
*/
if
(
!
acpi_gbl_group_module_level_code
)
{
if
(
!
acpi_gbl_parse_table_as_term_list
&&
!
acpi_gbl_group_module_level_code
)
{
acpi_ns_exec_module_code_list
();
}
...
...
drivers/acpi/acpica/nsparse.c
View file @
23750205
...
...
@@ -47,10 +47,101 @@
#include "acparser.h"
#include "acdispat.h"
#include "actables.h"
#include "acinterp.h"
#define _COMPONENT ACPI_NAMESPACE
ACPI_MODULE_NAME
(
"nsparse"
)
/*******************************************************************************
*
* FUNCTION: ns_execute_table
*
* PARAMETERS: table_desc - An ACPI table descriptor for table to parse
* start_node - Where to enter the table into the namespace
*
* RETURN: Status
*
* DESCRIPTION: Load ACPI/AML table by executing the entire table as a
* term_list.
*
******************************************************************************/
acpi_status
acpi_ns_execute_table
(
u32
table_index
,
struct
acpi_namespace_node
*
start_node
)
{
acpi_status
status
;
struct
acpi_table_header
*
table
;
acpi_owner_id
owner_id
;
struct
acpi_evaluate_info
*
info
=
NULL
;
u32
aml_length
;
u8
*
aml_start
;
union
acpi_operand_object
*
method_obj
=
NULL
;
ACPI_FUNCTION_TRACE
(
ns_execute_table
);
status
=
acpi_get_table_by_index
(
table_index
,
&
table
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
/* Table must consist of at least a complete header */
if
(
table
->
length
<
sizeof
(
struct
acpi_table_header
))
{
return_ACPI_STATUS
(
AE_BAD_HEADER
);
}
aml_start
=
(
u8
*
)
table
+
sizeof
(
struct
acpi_table_header
);
aml_length
=
table
->
length
-
sizeof
(
struct
acpi_table_header
);
status
=
acpi_tb_get_owner_id
(
table_index
,
&
owner_id
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
/* Create, initialize, and link a new temporary method object */
method_obj
=
acpi_ut_create_internal_object
(
ACPI_TYPE_METHOD
);
if
(
!
method_obj
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
/* Allocate the evaluation information block */
info
=
ACPI_ALLOCATE_ZEROED
(
sizeof
(
struct
acpi_evaluate_info
));
if
(
!
info
)
{
status
=
AE_NO_MEMORY
;
goto
cleanup
;
}
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"Create table code block: %p
\n
"
,
method_obj
));
method_obj
->
method
.
aml_start
=
aml_start
;
method_obj
->
method
.
aml_length
=
aml_length
;
method_obj
->
method
.
owner_id
=
owner_id
;
method_obj
->
method
.
info_flags
|=
ACPI_METHOD_MODULE_LEVEL
;
info
->
pass_number
=
ACPI_IMODE_EXECUTE
;
info
->
node
=
start_node
;
info
->
obj_desc
=
method_obj
;
info
->
node_flags
=
info
->
node
->
flags
;
info
->
full_pathname
=
acpi_ns_get_normalized_pathname
(
info
->
node
,
TRUE
);
if
(
!
info
->
full_pathname
)
{
status
=
AE_NO_MEMORY
;
goto
cleanup
;
}
status
=
acpi_ps_execute_table
(
info
);
cleanup:
if
(
info
)
{
ACPI_FREE
(
info
->
full_pathname
);
info
->
full_pathname
=
NULL
;
}
ACPI_FREE
(
info
);
acpi_ut_remove_reference
(
method_obj
);
return_ACPI_STATUS
(
status
);
}
/*******************************************************************************
*
* FUNCTION: ns_one_complete_parse
...
...
@@ -63,6 +154,7 @@ ACPI_MODULE_NAME("nsparse")
* DESCRIPTION: Perform one complete parse of an ACPI/AML table.
*
******************************************************************************/
acpi_status
acpi_ns_one_complete_parse
(
u32
pass_number
,
u32
table_index
,
...
...
@@ -143,7 +235,9 @@ acpi_ns_one_complete_parse(u32 pass_number,
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"*PARSE* pass %u parse
\n
"
,
pass_number
));
acpi_ex_enter_interpreter
();
status
=
acpi_ps_parse_aml
(
walk_state
);
acpi_ex_exit_interpreter
();
cleanup:
acpi_ps_delete_parse_tree
(
parse_root
);
...
...
@@ -170,38 +264,47 @@ acpi_ns_parse_table(u32 table_index, struct acpi_namespace_node *start_node)
ACPI_FUNCTION_TRACE
(
ns_parse_table
);
/*
* AML Parse, pass 1
*
* In this pass, we load most of the namespace. Control methods
* are not parsed until later. A parse tree is not created. Instead,
* each Parser Op subtree is deleted when it is finished. This saves
* a great deal of memory, and allows a small cache of parse objects
* to service the entire parse. The second pass of the parse then
* performs another complete parse of the AML.
*/
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"**** Start pass 1
\n
"
));
status
=
acpi_ns_one_complete_parse
(
ACPI_IMODE_LOAD_PASS1
,
table_index
,
start_node
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
if
(
acpi_gbl_parse_table_as_term_list
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"**** Start load pass
\n
"
));
/*
* AML Parse, pass 2
*
* In this pass, we resolve forward references and other things
* that could not be completed during the first pass.
* Another complete parse of the AML is performed, but the
* overhead of this is compensated for by the fact that the
* parse objects are all cached.
*/
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"**** Start pass 2
\n
"
));
status
=
acpi_ns_one_complete_parse
(
ACPI_IMODE_LOAD_PASS2
,
table_index
,
start_node
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
status
=
acpi_ns_execute_table
(
table_index
,
start_node
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
}
else
{
/*
* AML Parse, pass 1
*
* In this pass, we load most of the namespace. Control methods
* are not parsed until later. A parse tree is not created.
* Instead, each Parser Op subtree is deleted when it is finished.
* This saves a great deal of memory, and allows a small cache of
* parse objects to service the entire parse. The second pass of
* the parse then performs another complete parse of the AML.
*/
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"**** Start pass 1
\n
"
));
status
=
acpi_ns_one_complete_parse
(
ACPI_IMODE_LOAD_PASS1
,
table_index
,
start_node
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
/*
* AML Parse, pass 2
*
* In this pass, we resolve forward references and other things
* that could not be completed during the first pass.
* Another complete parse of the AML is performed, but the
* overhead of this is compensated for by the fact that the
* parse objects are all cached.
*/
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"**** Start pass 2
\n
"
));
status
=
acpi_ns_one_complete_parse
(
ACPI_IMODE_LOAD_PASS2
,
table_index
,
start_node
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
}
return_ACPI_STATUS
(
status
);
...
...
drivers/acpi/acpica/nsutils.c
View file @
23750205
...
...
@@ -662,7 +662,7 @@ u32 acpi_ns_opens_scope(acpi_object_type type)
/*******************************************************************************
*
* FUNCTION: acpi_ns_get_node
* FUNCTION: acpi_ns_get_node
_unlocked
*
* PARAMETERS: *pathname - Name to be found, in external (ASL) format. The
* \ (backslash) and ^ (carat) prefixes, and the
...
...
@@ -678,20 +678,21 @@ u32 acpi_ns_opens_scope(acpi_object_type type)
* DESCRIPTION: Look up a name relative to a given scope and return the
* corresponding Node. NOTE: Scope can be null.
*
* MUTEX:
L
ocks namespace
* MUTEX:
Doesn't l
ocks namespace
*
******************************************************************************/
acpi_status
acpi_ns_get_node
(
struct
acpi_namespace_node
*
prefix_node
,
const
char
*
pathname
,
u32
flags
,
struct
acpi_namespace_node
**
return_node
)
acpi_ns_get_node
_unlocked
(
struct
acpi_namespace_node
*
prefix_node
,
const
char
*
pathname
,
u32
flags
,
struct
acpi_namespace_node
**
return_node
)
{
union
acpi_generic_state
scope_info
;
acpi_status
status
;
char
*
internal_path
;
ACPI_FUNCTION_TRACE_PTR
(
ns_get_node
,
ACPI_CAST_PTR
(
char
,
pathname
));
ACPI_FUNCTION_TRACE_PTR
(
ns_get_node_unlocked
,
ACPI_CAST_PTR
(
char
,
pathname
));
/* Simplest case is a null pathname */
...
...
@@ -718,13 +719,6 @@ acpi_ns_get_node(struct acpi_namespace_node *prefix_node,
return_ACPI_STATUS
(
status
);
}
/* Must lock namespace during lookup */
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
goto
cleanup
;
}
/* Setup lookup scope (search starting point) */
scope_info
.
scope
.
node
=
prefix_node
;
...
...
@@ -740,9 +734,49 @@ acpi_ns_get_node(struct acpi_namespace_node *prefix_node,
pathname
,
acpi_format_exception
(
status
)));
}
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
cleanup:
ACPI_FREE
(
internal_path
);
return_ACPI_STATUS
(
status
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ns_get_node
*
* PARAMETERS: *pathname - Name to be found, in external (ASL) format. The
* \ (backslash) and ^ (carat) prefixes, and the
* . (period) to separate segments are supported.
* prefix_node - Root of subtree to be searched, or NS_ALL for the
* root of the name space. If Name is fully
* qualified (first s8 is '\'), the passed value
* of Scope will not be accessed.
* flags - Used to indicate whether to perform upsearch or
* not.
* return_node - Where the Node is returned
*
* DESCRIPTION: Look up a name relative to a given scope and return the
* corresponding Node. NOTE: Scope can be null.
*
* MUTEX: Locks namespace
*
******************************************************************************/
acpi_status
acpi_ns_get_node
(
struct
acpi_namespace_node
*
prefix_node
,
const
char
*
pathname
,
u32
flags
,
struct
acpi_namespace_node
**
return_node
)
{
acpi_status
status
;
ACPI_FUNCTION_TRACE_PTR
(
ns_get_node
,
ACPI_CAST_PTR
(
char
,
pathname
));
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
status
=
acpi_ns_get_node_unlocked
(
prefix_node
,
pathname
,
flags
,
return_node
);
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
return_ACPI_STATUS
(
status
);
}
drivers/acpi/acpica/psparse.c
View file @
23750205
...
...
@@ -537,9 +537,11 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
/* Either the method parse or actual execution failed */
acpi_ex_exit_interpreter
();
ACPI_ERROR_METHOD
(
"Method parse/execution failed"
,
walk_state
->
method_node
,
NULL
,
status
);
acpi_ex_enter_interpreter
();
/* Check for possible multi-thread reentrancy problem */
...
...
@@ -571,7 +573,9 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
* cleanup to do
*/
if
(((
walk_state
->
parse_flags
&
ACPI_PARSE_MODE_MASK
)
==
ACPI_PARSE_EXECUTE
)
||
(
ACPI_FAILURE
(
status
)))
{
ACPI_PARSE_EXECUTE
&&
!
(
walk_state
->
parse_flags
&
ACPI_PARSE_MODULE_LEVEL
))
||
(
ACPI_FAILURE
(
status
)))
{
acpi_ds_terminate_control_method
(
walk_state
->
method_desc
,
walk_state
);
...
...
drivers/acpi/acpica/psxface.c
View file @
23750205
...
...
@@ -250,6 +250,79 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info)
return_ACPI_STATUS
(
status
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ps_execute_table
*
* PARAMETERS: info - Method info block, contains:
* node - Node to where the is entered into the
* namespace
* obj_desc - Pseudo method object describing the AML
* code of the entire table
* pass_number - Parse or execute pass
*
* RETURN: Status
*
* DESCRIPTION: Execute a table
*
******************************************************************************/
acpi_status
acpi_ps_execute_table
(
struct
acpi_evaluate_info
*
info
)
{
acpi_status
status
;
union
acpi_parse_object
*
op
=
NULL
;
struct
acpi_walk_state
*
walk_state
=
NULL
;
ACPI_FUNCTION_TRACE
(
ps_execute_table
);
/* Create and init a Root Node */
op
=
acpi_ps_create_scope_op
(
info
->
obj_desc
->
method
.
aml_start
);
if
(
!
op
)
{
status
=
AE_NO_MEMORY
;
goto
cleanup
;
}
/* Create and initialize a new walk state */
walk_state
=
acpi_ds_create_walk_state
(
info
->
obj_desc
->
method
.
owner_id
,
NULL
,
NULL
,
NULL
);
if
(
!
walk_state
)
{
status
=
AE_NO_MEMORY
;
goto
cleanup
;
}
status
=
acpi_ds_init_aml_walk
(
walk_state
,
op
,
info
->
node
,
info
->
obj_desc
->
method
.
aml_start
,
info
->
obj_desc
->
method
.
aml_length
,
info
,
info
->
pass_number
);
if
(
ACPI_FAILURE
(
status
))
{
goto
cleanup
;
}
if
(
info
->
obj_desc
->
method
.
info_flags
&
ACPI_METHOD_MODULE_LEVEL
)
{
walk_state
->
parse_flags
|=
ACPI_PARSE_MODULE_LEVEL
;
}
/*
* Parse the AML, walk_state will be deleted by parse_aml
*/
acpi_ex_enter_interpreter
();
status
=
acpi_ps_parse_aml
(
walk_state
);
acpi_ex_exit_interpreter
();
walk_state
=
NULL
;
cleanup:
if
(
walk_state
)
{
acpi_ds_delete_walk_state
(
walk_state
);
}
if
(
op
)
{
acpi_ps_delete_parse_tree
(
op
);
}
return_ACPI_STATUS
(
status
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ps_update_parameter_list
...
...
drivers/acpi/acpica/tbdata.c
View file @
23750205
...
...
@@ -45,6 +45,7 @@
#include "accommon.h"
#include "acnamesp.h"
#include "actables.h"
#include "acevents.h"
#define _COMPONENT ACPI_TABLES
ACPI_MODULE_NAME
(
"tbdata"
)
...
...
@@ -771,3 +772,142 @@ void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded)
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
}
/*******************************************************************************
*
* FUNCTION: acpi_tb_load_table
*
* PARAMETERS: table_index - Table index
* parent_node - Where table index is returned
*
* RETURN: Status
*
* DESCRIPTION: Load an ACPI table
*
******************************************************************************/
acpi_status
acpi_tb_load_table
(
u32
table_index
,
struct
acpi_namespace_node
*
parent_node
)
{
struct
acpi_table_header
*
table
;
acpi_status
status
;
acpi_owner_id
owner_id
;
ACPI_FUNCTION_TRACE
(
tb_load_table
);
/*
* Note: Now table is "INSTALLED", it must be validated before
* using.
*/
status
=
acpi_get_table_by_index
(
table_index
,
&
table
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
status
=
acpi_ns_load_table
(
table_index
,
parent_node
);
/* Execute any module-level code that was found in the table */
if
(
!
acpi_gbl_parse_table_as_term_list
&&
acpi_gbl_group_module_level_code
)
{
acpi_ns_exec_module_code_list
();
}
/*
* Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
* responsible for discovering any new wake GPEs by running _PRW methods
* that may have been loaded by this table.
*/
status
=
acpi_tb_get_owner_id
(
table_index
,
&
owner_id
);
if
(
ACPI_SUCCESS
(
status
))
{
acpi_ev_update_gpes
(
owner_id
);
}
/* Invoke table handler if present */
if
(
acpi_gbl_table_handler
)
{
(
void
)
acpi_gbl_table_handler
(
ACPI_TABLE_EVENT_LOAD
,
table
,
acpi_gbl_table_handler_context
);
}
return_ACPI_STATUS
(
status
);
}
/*******************************************************************************
*
* FUNCTION: acpi_tb_install_and_load_table
*
* PARAMETERS: table - Pointer to the table
* address - Physical address of the table
* flags - Allocation flags of the table
* table_index - Where table index is returned
*
* RETURN: Status
*
* DESCRIPTION: Install and load an ACPI table
*
******************************************************************************/
acpi_status
acpi_tb_install_and_load_table
(
struct
acpi_table_header
*
table
,
acpi_physical_address
address
,
u8
flags
,
u8
override
,
u32
*
table_index
)
{
acpi_status
status
;
u32
i
;
acpi_owner_id
owner_id
;
ACPI_FUNCTION_TRACE
(
acpi_load_table
);
(
void
)
acpi_ut_acquire_mutex
(
ACPI_MTX_TABLES
);
/* Install the table and load it into the namespace */
status
=
acpi_tb_install_standard_table
(
address
,
flags
,
TRUE
,
override
,
&
i
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
/*
* Note: Now table is "INSTALLED", it must be validated before
* using.
*/
status
=
acpi_tb_validate_table
(
&
acpi_gbl_root_table_list
.
tables
[
i
]);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
status
=
acpi_ns_load_table
(
i
,
acpi_gbl_root_node
);
/* Execute any module-level code that was found in the table */
if
(
!
acpi_gbl_parse_table_as_term_list
&&
acpi_gbl_group_module_level_code
)
{
acpi_ns_exec_module_code_list
();
}
/*
* Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
* responsible for discovering any new wake GPEs by running _PRW methods
* that may have been loaded by this table.
*/
status
=
acpi_tb_get_owner_id
(
i
,
&
owner_id
);
if
(
ACPI_SUCCESS
(
status
))
{
acpi_ev_update_gpes
(
owner_id
);
}
/* Invoke table handler if present */
if
(
acpi_gbl_table_handler
)
{
(
void
)
acpi_gbl_table_handler
(
ACPI_TABLE_EVENT_LOAD
,
table
,
acpi_gbl_table_handler_context
);
}
(
void
)
acpi_ut_acquire_mutex
(
ACPI_MTX_TABLES
);
unlock_and_exit:
*
table_index
=
i
;
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
return_ACPI_STATUS
(
status
);
}
drivers/acpi/acpica/tbfadt.c
View file @
23750205
...
...
@@ -344,23 +344,27 @@ void acpi_tb_parse_fadt(void)
/* Obtain the DSDT and FACS tables via their addresses within the FADT */
acpi_tb_install_fixed_table
((
acpi_physical_address
)
acpi_gbl_FADT
.
Xdsdt
,
ACPI_SIG_DSDT
,
&
acpi_gbl_dsdt_index
);
acpi_tb_install_standard_table
((
acpi_physical_address
)
acpi_gbl_FADT
.
Xdsdt
,
ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL
,
FALSE
,
TRUE
,
&
acpi_gbl_dsdt_index
);
/* If Hardware Reduced flag is set, there is no FACS */
if
(
!
acpi_gbl_reduced_hardware
)
{
if
(
acpi_gbl_FADT
.
facs
)
{
acpi_tb_install_fixed_table
((
acpi_physical_address
)
acpi_gbl_FADT
.
facs
,
ACPI_SIG_FACS
,
&
acpi_gbl_facs_index
);
acpi_tb_install_standard_table
((
acpi_physical_address
)
acpi_gbl_FADT
.
facs
,
ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL
,
FALSE
,
TRUE
,
&
acpi_gbl_facs_index
);
}
if
(
acpi_gbl_FADT
.
Xfacs
)
{
acpi_tb_install_fixed_table
((
acpi_physical_address
)
acpi_gbl_FADT
.
Xfacs
,
ACPI_SIG_FACS
,
&
acpi_gbl_xfacs_index
);
acpi_tb_install_standard_table
((
acpi_physical_address
)
acpi_gbl_FADT
.
Xfacs
,
ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL
,
FALSE
,
TRUE
,
&
acpi_gbl_xfacs_index
);
}
}
}
...
...
@@ -554,78 +558,74 @@ static void acpi_tb_convert_fadt(void)
*
* Address32 zero, Address64 [don't care] - Use Address64
*
* No override: if acpi_gbl_use32_bit_fadt_addresses is FALSE, and:
* Address32 non-zero, Address64 zero - Copy/use Address32
* Address32 non-zero == Address64 non-zero - Use Address64
* Address32 non-zero != Address64 non-zero - Warning, use Address64
*
* Override: if acpi_gbl_use32_bit_fadt_addresses is TRUE, and:
* Address32 non-zero, Address64 zero - Copy/use Address32
* Address32 non-zero == Address64 non-zero - Copy/use Address32
* Address32 non-zero != Address64 non-zero - Warning, copy/use Address32
*
* Note: space_id is always I/O for 32-bit legacy address fields
*/
if
(
address32
)
{
if
(
!
address64
->
address
)
{
if
(
address64
->
address
)
{
if
(
address64
->
address
!=
(
u64
)
address32
)
{
/* Address mismatch */
ACPI_BIOS_WARNING
((
AE_INFO
,
"32/64X address mismatch in FADT/%s: "
"0x%8.8X/0x%8.8X%8.8X, using %u-bit address"
,
name
,
address32
,
ACPI_FORMAT_UINT64
(
address64
->
address
),
acpi_gbl_use32_bit_fadt_addresses
?
32
:
64
));
}
/* 64-bit address is zero, use 32-bit address */
/*
* For each extended field, check for length mismatch
* between the legacy length field and the corresponding
* 64-bit X length field.
* Note: If the legacy length field is > 0xFF bits, ignore
* this check. (GPE registers can be larger than the
* 64-bit GAS structure can accomodate, 0xFF bits).
*/
if
((
ACPI_MUL_8
(
length
)
<=
ACPI_UINT8_MAX
)
&&
(
address64
->
bit_width
!=
ACPI_MUL_8
(
length
)))
{
ACPI_BIOS_WARNING
((
AE_INFO
,
"32/64X length mismatch in FADT/%s: %u/%u"
,
name
,
ACPI_MUL_8
(
length
),
address64
->
bit_width
));
}
}
/*
* Hardware register access code always uses the 64-bit fields.
* So if the 64-bit field is zero or is to be overridden,
* initialize it with the 32-bit fields.
* Note that when the 32-bit address favor is specified, the
* 64-bit fields are always re-initialized so that
* access_size/bit_width/bit_offset fields can be correctly
* configured to the values to trigger a 32-bit compatible
* access mode in the hardware register access code.
*/
if
(
!
address64
->
address
||
acpi_gbl_use32_bit_fadt_addresses
)
{
acpi_tb_init_generic_address
(
address64
,
ACPI_ADR_SPACE_SYSTEM_IO
,
*
ACPI_ADD_PTR
(
u8
,
&
acpi_gbl_FADT
,
fadt_info_table
[
i
].
length
),
length
,
(
u64
)
address32
,
name
,
flags
);
}
else
if
(
address64
->
address
!=
(
u64
)
address32
)
{
/* Address mismatch */
ACPI_BIOS_WARNING
((
AE_INFO
,
"32/64X address mismatch in FADT/%s: "
"0x%8.8X/0x%8.8X%8.8X, using %u-bit address"
,
name
,
address32
,
ACPI_FORMAT_UINT64
(
address64
->
address
),
acpi_gbl_use32_bit_fadt_addresses
?
32
:
64
));
if
(
acpi_gbl_use32_bit_fadt_addresses
)
{
/* 32-bit address override */
acpi_tb_init_generic_address
(
address64
,
ACPI_ADR_SPACE_SYSTEM_IO
,
*
ACPI_ADD_PTR
(
u8
,
&
acpi_gbl_FADT
,
fadt_info_table
[
i
].
length
),
(
u64
)
address32
,
name
,
flags
);
}
}
}
/*
* For each extended field, check for length mismatch between the
* legacy length field and the corresponding 64-bit X length field.
* Note: If the legacy length field is > 0xFF bits, ignore this
* check. (GPE registers can be larger than the 64-bit GAS structure
* can accomodate, 0xFF bits).
*/
if
(
address64
->
address
&&
(
ACPI_MUL_8
(
length
)
<=
ACPI_UINT8_MAX
)
&&
(
address64
->
bit_width
!=
ACPI_MUL_8
(
length
)))
{
ACPI_BIOS_WARNING
((
AE_INFO
,
"32/64X length mismatch in FADT/%s: %u/%u"
,
name
,
ACPI_MUL_8
(
length
),
address64
->
bit_width
));
}
if
(
fadt_info_table
[
i
].
flags
&
ACPI_FADT_REQUIRED
)
{
/*
* Field is required (Pm1a_event, Pm1a_control).
...
...
drivers/acpi/acpica/tbfind.c
View file @
23750205
...
...
@@ -68,7 +68,7 @@ acpi_status
acpi_tb_find_table
(
char
*
signature
,
char
*
oem_id
,
char
*
oem_table_id
,
u32
*
table_index
)
{
acpi_status
status
;
acpi_status
status
=
AE_OK
;
struct
acpi_table_header
header
;
u32
i
;
...
...
@@ -96,6 +96,7 @@ acpi_tb_find_table(char *signature,
/* Search for the table */
(
void
)
acpi_ut_acquire_mutex
(
ACPI_MTX_TABLES
);
for
(
i
=
0
;
i
<
acpi_gbl_root_table_list
.
current_table_count
;
++
i
)
{
if
(
memcmp
(
&
(
acpi_gbl_root_table_list
.
tables
[
i
].
signature
),
header
.
signature
,
ACPI_NAME_SIZE
))
{
...
...
@@ -115,7 +116,7 @@ acpi_tb_find_table(char *signature,
acpi_tb_validate_table
(
&
acpi_gbl_root_table_list
.
tables
[
i
]);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
)
;
goto
unlock_and_exit
;
}
if
(
!
acpi_gbl_root_table_list
.
tables
[
i
].
pointer
)
{
...
...
@@ -144,9 +145,12 @@ acpi_tb_find_table(char *signature,
ACPI_DEBUG_PRINT
((
ACPI_DB_TABLES
,
"Found table [%4.4s]
\n
"
,
header
.
signature
));
return_ACPI_STATUS
(
AE_OK
)
;
goto
unlock_and_exit
;
}
}
status
=
AE_NOT_FOUND
;
return_ACPI_STATUS
(
AE_NOT_FOUND
);
unlock_and_exit:
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
return_ACPI_STATUS
(
status
);
}
drivers/acpi/acpica/tbinstal.c
View file @
23750205
...
...
@@ -155,68 +155,6 @@ acpi_tb_install_table_with_override(struct acpi_table_desc *new_table_desc,
}
}
/*******************************************************************************
*
* FUNCTION: acpi_tb_install_fixed_table
*
* PARAMETERS: address - Physical address of DSDT or FACS
* signature - Table signature, NULL if no need to
* match
* table_index - Where the table index is returned
*
* RETURN: Status
*
* DESCRIPTION: Install a fixed ACPI table (DSDT/FACS) into the global data
* structure.
*
******************************************************************************/
acpi_status
acpi_tb_install_fixed_table
(
acpi_physical_address
address
,
char
*
signature
,
u32
*
table_index
)
{
struct
acpi_table_desc
new_table_desc
;
acpi_status
status
;
ACPI_FUNCTION_TRACE
(
tb_install_fixed_table
);
if
(
!
address
)
{
ACPI_ERROR
((
AE_INFO
,
"Null physical address for ACPI table [%s]"
,
signature
));
return
(
AE_NO_MEMORY
);
}
/* Fill a table descriptor for validation */
status
=
acpi_tb_acquire_temp_table
(
&
new_table_desc
,
address
,
ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_ERROR
((
AE_INFO
,
"Could not acquire table length at %8.8X%8.8X"
,
ACPI_FORMAT_UINT64
(
address
)));
return_ACPI_STATUS
(
status
);
}
/* Validate and verify a table before installation */
status
=
acpi_tb_verify_temp_table
(
&
new_table_desc
,
signature
);
if
(
ACPI_FAILURE
(
status
))
{
goto
release_and_exit
;
}
/* Add the table to the global root table list */
acpi_tb_install_table_with_override
(
&
new_table_desc
,
TRUE
,
table_index
);
release_and_exit:
/* Release the temporary table descriptor */
acpi_tb_release_temp_table
(
&
new_table_desc
);
return_ACPI_STATUS
(
status
);
}
/*******************************************************************************
*
* FUNCTION: acpi_tb_install_standard_table
...
...
@@ -230,8 +168,7 @@ acpi_tb_install_fixed_table(acpi_physical_address address,
*
* RETURN: Status
*
* DESCRIPTION: This function is called to install an ACPI table that is
* neither DSDT nor FACS (a "standard" table.)
* DESCRIPTION: This function is called to verify and install an ACPI table.
* When this function is called by "Load" or "LoadTable" opcodes,
* or by acpi_load_table() API, the "Reload" parameter is set.
* After sucessfully returning from this function, table is
...
...
@@ -364,6 +301,14 @@ acpi_tb_install_standard_table(acpi_physical_address address,
acpi_tb_install_table_with_override
(
&
new_table_desc
,
override
,
table_index
);
/* Invoke table handler if present */
if
(
acpi_gbl_table_handler
)
{
(
void
)
acpi_gbl_table_handler
(
ACPI_TABLE_EVENT_INSTALL
,
new_table_desc
.
pointer
,
acpi_gbl_table_handler_context
);
}
release_and_exit:
/* Release the temporary table descriptor */
...
...
drivers/acpi/acpica/tbxfload.c
View file @
23750205
...
...
@@ -103,7 +103,8 @@ acpi_status ACPI_INIT_FUNCTION acpi_load_tables(void)
"While loading namespace from ACPI tables"
));
}
if
(
!
acpi_gbl_group_module_level_code
)
{
if
(
acpi_gbl_parse_table_as_term_list
||
!
acpi_gbl_group_module_level_code
)
{
/*
* Initialize the objects that remain uninitialized. This
* runs the executable AML that may be part of the
...
...
@@ -188,11 +189,11 @@ acpi_status acpi_tb_load_namespace(void)
memcpy
(
&
acpi_gbl_original_dsdt_header
,
acpi_gbl_DSDT
,
sizeof
(
struct
acpi_table_header
));
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
/* Load and parse tables */
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
status
=
acpi_ns_load_table
(
acpi_gbl_dsdt_index
,
acpi_gbl_root_node
);
(
void
)
acpi_ut_acquire_mutex
(
ACPI_MTX_TABLES
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_EXCEPTION
((
AE_INFO
,
status
,
"[DSDT] table load failed"
));
tables_failed
++
;
...
...
@@ -202,7 +203,6 @@ acpi_status acpi_tb_load_namespace(void)
/* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
(
void
)
acpi_ut_acquire_mutex
(
ACPI_MTX_TABLES
);
for
(
i
=
0
;
i
<
acpi_gbl_root_table_list
.
current_table_count
;
++
i
)
{
table
=
&
acpi_gbl_root_table_list
.
tables
[
i
];
...
...
@@ -220,6 +220,7 @@ acpi_status acpi_tb_load_namespace(void)
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
status
=
acpi_ns_load_table
(
i
,
acpi_gbl_root_node
);
(
void
)
acpi_ut_acquire_mutex
(
ACPI_MTX_TABLES
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_EXCEPTION
((
AE_INFO
,
status
,
"(%4.4s:%8.8s) while loading table"
,
...
...
@@ -235,8 +236,6 @@ acpi_status acpi_tb_load_namespace(void)
}
else
{
tables_loaded
++
;
}
(
void
)
acpi_ut_acquire_mutex
(
ACPI_MTX_TABLES
);
}
if
(
!
tables_failed
)
{
...
...
@@ -324,49 +323,13 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
return_ACPI_STATUS
(
AE_BAD_PARAMETER
);
}
/* Must acquire the interpreter lock during this operation */
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_INTERPRETER
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
/* Install the table and load it into the namespace */
ACPI_INFO
((
"Host-directed Dynamic ACPI Table Load:"
));
(
void
)
acpi_ut_acquire_mutex
(
ACPI_MTX_TABLES
);
status
=
acpi_tb_install_standard_table
(
ACPI_PTR_TO_PHYSADDR
(
table
),
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL
,
TRUE
,
FALSE
,
&
table_index
);
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_TABLES
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
/*
* Note: Now table is "INSTALLED", it must be validated before
* using.
*/
status
=
acpi_tb_validate_table
(
&
acpi_gbl_root_table_list
.
tables
[
table_index
]);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
status
=
acpi_ns_load_table
(
table_index
,
acpi_gbl_root_node
);
/* Invoke table handler if present */
if
(
acpi_gbl_table_handler
)
{
(
void
)
acpi_gbl_table_handler
(
ACPI_TABLE_EVENT_LOAD
,
table
,
acpi_gbl_table_handler_context
);
}
unlock_and_exit:
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_INTERPRETER
);
acpi_tb_install_and_load_table
(
table
,
ACPI_PTR_TO_PHYSADDR
(
table
),
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL
,
FALSE
,
&
table_index
);
return_ACPI_STATUS
(
status
);
}
...
...
drivers/acpi/acpica/utaddress.c
View file @
23750205
...
...
@@ -77,7 +77,6 @@ acpi_ut_add_address_range(acpi_adr_space_type space_id,
u32
length
,
struct
acpi_namespace_node
*
region_node
)
{
struct
acpi_address_range
*
range_info
;
acpi_status
status
;
ACPI_FUNCTION_TRACE
(
ut_add_address_range
);
...
...
@@ -97,12 +96,6 @@ acpi_ut_add_address_range(acpi_adr_space_type space_id,
range_info
->
end_address
=
(
address
+
length
-
1
);
range_info
->
region_node
=
region_node
;
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_FREE
(
range_info
);
return_ACPI_STATUS
(
status
);
}
range_info
->
next
=
acpi_gbl_address_range_list
[
space_id
];
acpi_gbl_address_range_list
[
space_id
]
=
range_info
;
...
...
@@ -112,7 +105,6 @@ acpi_ut_add_address_range(acpi_adr_space_type space_id,
ACPI_FORMAT_UINT64
(
address
),
ACPI_FORMAT_UINT64
(
range_info
->
end_address
)));
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_NAMESPACE
);
return_ACPI_STATUS
(
AE_OK
);
}
...
...
drivers/acpi/acpica/uthex.c
View file @
23750205
...
...
@@ -73,11 +73,43 @@ char acpi_ut_hex_to_ascii_char(u64 integer, u32 position)
return
(
acpi_gbl_hex_to_ascii
[(
integer
>>
position
)
&
0xF
]);
}
/*******************************************************************************
*
* FUNCTION: acpi_ut_ascii_to_hex_byte
*
* PARAMETERS: two_ascii_chars - Pointer to two ASCII characters
* return_byte - Where converted byte is returned
*
* RETURN: Status and converted hex byte
*
* DESCRIPTION: Perform ascii-to-hex translation, exactly two ASCII characters
* to a single converted byte value.
*
******************************************************************************/
acpi_status
acpi_ut_ascii_to_hex_byte
(
char
*
two_ascii_chars
,
u8
*
return_byte
)
{
/* Both ASCII characters must be valid hex digits */
if
(
!
isxdigit
((
int
)
two_ascii_chars
[
0
])
||
!
isxdigit
((
int
)
two_ascii_chars
[
1
]))
{
return
(
AE_BAD_HEX_CONSTANT
);
}
*
return_byte
=
acpi_ut_ascii_char_to_hex
(
two_ascii_chars
[
1
])
|
(
acpi_ut_ascii_char_to_hex
(
two_ascii_chars
[
0
])
<<
4
);
return
(
AE_OK
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ut_ascii_char_to_hex
*
* PARAMETERS: hex_char - Hex character in Ascii
* PARAMETERS: hex_char - Hex character in Ascii. Must be:
* 0-9 or A-F or a-f
*
* RETURN: The binary value of the ascii/hex character
*
...
...
@@ -88,13 +120,19 @@ char acpi_ut_hex_to_ascii_char(u64 integer, u32 position)
u8
acpi_ut_ascii_char_to_hex
(
int
hex_char
)
{
if
(
hex_char
<=
0x39
)
{
return
((
u8
)(
hex_char
-
0x30
));
/* Values 0-9 */
if
(
hex_char
<=
'9'
)
{
return
((
u8
)(
hex_char
-
'0'
));
}
if
(
hex_char
<=
0x46
)
{
/* Upper case A-F */
if
(
hex_char
<=
'F'
)
{
return
((
u8
)(
hex_char
-
0x37
));
}
/* Lower case a-f */
return
((
u8
)(
hex_char
-
0x57
));
}
drivers/acpi/acpica/utnonansi.c
View file @
23750205
...
...
@@ -48,8 +48,8 @@
ACPI_MODULE_NAME
(
"utnonansi"
)
/*
* Non-ANSI C library functions - strlwr, strupr, stricmp, and
a 64-bit
*
version of strtoul
.
* Non-ANSI C library functions - strlwr, strupr, stricmp, and
"safe"
*
string functions
.
*/
/*******************************************************************************
*
...
...
@@ -200,356 +200,3 @@ acpi_ut_safe_strncat(char *dest,
return
(
FALSE
);
}
#endif
/*******************************************************************************
*
* FUNCTION: acpi_ut_strtoul64
*
* PARAMETERS: string - Null terminated string
* base - Radix of the string: 16 or 10 or
* ACPI_ANY_BASE
* max_integer_byte_width - Maximum allowable integer,in bytes:
* 4 or 8 (32 or 64 bits)
* ret_integer - Where the converted integer is
* returned
*
* RETURN: Status and Converted value
*
* DESCRIPTION: Convert a string into an unsigned value. Performs either a
* 32-bit or 64-bit conversion, depending on the input integer
* size (often the current mode of the interpreter).
*
* NOTES: Negative numbers are not supported, as they are not supported
* by ACPI.
*
* acpi_gbl_integer_byte_width should be set to the proper width.
* For the core ACPICA code, this width depends on the DSDT
* version. For iASL, the default byte width is always 8 for the
* parser, but error checking is performed later to flag cases
* where a 64-bit constant is defined in a 32-bit DSDT/SSDT.
*
* Does not support Octal strings, not needed at this time.
*
******************************************************************************/
acpi_status
acpi_ut_strtoul64
(
char
*
string
,
u32
base
,
u32
max_integer_byte_width
,
u64
*
ret_integer
)
{
u32
this_digit
=
0
;
u64
return_value
=
0
;
u64
quotient
;
u64
dividend
;
u8
valid_digits
=
0
;
u8
sign_of0x
=
0
;
u8
term
=
0
;
ACPI_FUNCTION_TRACE_STR
(
ut_strtoul64
,
string
);
switch
(
base
)
{
case
ACPI_ANY_BASE
:
case
10
:
case
16
:
break
;
default:
/* Invalid Base */
return_ACPI_STATUS
(
AE_BAD_PARAMETER
);
}
if
(
!
string
)
{
goto
error_exit
;
}
/* Skip over any white space in the buffer */
while
((
*
string
)
&&
(
isspace
((
int
)
*
string
)
||
*
string
==
'\t'
))
{
string
++
;
}
if
(
base
==
ACPI_ANY_BASE
)
{
/*
* Base equal to ACPI_ANY_BASE means 'Either decimal or hex'.
* We need to determine if it is decimal or hexadecimal.
*/
if
((
*
string
==
'0'
)
&&
(
tolower
((
int
)
*
(
string
+
1
))
==
'x'
))
{
sign_of0x
=
1
;
base
=
16
;
/* Skip over the leading '0x' */
string
+=
2
;
}
else
{
base
=
10
;
}
}
/* Any string left? Check that '0x' is not followed by white space. */
if
(
!
(
*
string
)
||
isspace
((
int
)
*
string
)
||
*
string
==
'\t'
)
{
if
(
base
==
ACPI_ANY_BASE
)
{
goto
error_exit
;
}
else
{
goto
all_done
;
}
}
/*
* Perform a 32-bit or 64-bit conversion, depending upon the input
* byte width
*/
dividend
=
(
max_integer_byte_width
<=
ACPI_MAX32_BYTE_WIDTH
)
?
ACPI_UINT32_MAX
:
ACPI_UINT64_MAX
;
/* Main loop: convert the string to a 32- or 64-bit integer */
while
(
*
string
)
{
if
(
isdigit
((
int
)
*
string
))
{
/* Convert ASCII 0-9 to Decimal value */
this_digit
=
((
u8
)
*
string
)
-
'0'
;
}
else
if
(
base
==
10
)
{
/* Digit is out of range; possible in to_integer case only */
term
=
1
;
}
else
{
this_digit
=
(
u8
)
toupper
((
int
)
*
string
);
if
(
isxdigit
((
int
)
this_digit
))
{
/* Convert ASCII Hex char to value */
this_digit
=
this_digit
-
'A'
+
10
;
}
else
{
term
=
1
;
}
}
if
(
term
)
{
if
(
base
==
ACPI_ANY_BASE
)
{
goto
error_exit
;
}
else
{
break
;
}
}
else
if
((
valid_digits
==
0
)
&&
(
this_digit
==
0
)
&&
!
sign_of0x
)
{
/* Skip zeros */
string
++
;
continue
;
}
valid_digits
++
;
if
(
sign_of0x
&&
((
valid_digits
>
16
)
||
((
valid_digits
>
8
)
&&
(
max_integer_byte_width
<=
ACPI_MAX32_BYTE_WIDTH
))))
{
/*
* This is to_integer operation case.
* No restrictions for string-to-integer conversion,
* see ACPI spec.
*/
goto
error_exit
;
}
/* Divide the digit into the correct position */
(
void
)
acpi_ut_short_divide
((
dividend
-
(
u64
)
this_digit
),
base
,
&
quotient
,
NULL
);
if
(
return_value
>
quotient
)
{
if
(
base
==
ACPI_ANY_BASE
)
{
goto
error_exit
;
}
else
{
break
;
}
}
return_value
*=
base
;
return_value
+=
this_digit
;
string
++
;
}
/* All done, normal exit */
all_done:
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"Converted value: %8.8X%8.8X
\n
"
,
ACPI_FORMAT_UINT64
(
return_value
)));
*
ret_integer
=
return_value
;
return_ACPI_STATUS
(
AE_OK
);
error_exit:
/* Base was set/validated above (10 or 16) */
if
(
base
==
10
)
{
return_ACPI_STATUS
(
AE_BAD_DECIMAL_CONSTANT
);
}
else
{
return_ACPI_STATUS
(
AE_BAD_HEX_CONSTANT
);
}
}
#ifdef _OBSOLETE_FUNCTIONS
/* Removed: 01/2016 */
/*******************************************************************************
*
* FUNCTION: strtoul64
*
* PARAMETERS: string - Null terminated string
* terminater - Where a pointer to the terminating byte
* is returned
* base - Radix of the string
*
* RETURN: Converted value
*
* DESCRIPTION: Convert a string into an unsigned value.
*
******************************************************************************/
acpi_status
strtoul64
(
char
*
string
,
u32
base
,
u64
*
ret_integer
)
{
u32
index
;
u32
sign
;
u64
return_value
=
0
;
acpi_status
status
=
AE_OK
;
*
ret_integer
=
0
;
switch
(
base
)
{
case
0
:
case
8
:
case
10
:
case
16
:
break
;
default:
/*
* The specified Base parameter is not in the domain of
* this function:
*/
return
(
AE_BAD_PARAMETER
);
}
/* Skip over any white space in the buffer: */
while
(
isspace
((
int
)
*
string
)
||
*
string
==
'\t'
)
{
++
string
;
}
/*
* The buffer may contain an optional plus or minus sign.
* If it does, then skip over it but remember what is was:
*/
if
(
*
string
==
'-'
)
{
sign
=
ACPI_SIGN_NEGATIVE
;
++
string
;
}
else
if
(
*
string
==
'+'
)
{
++
string
;
sign
=
ACPI_SIGN_POSITIVE
;
}
else
{
sign
=
ACPI_SIGN_POSITIVE
;
}
/*
* If the input parameter Base is zero, then we need to
* determine if it is octal, decimal, or hexadecimal:
*/
if
(
base
==
0
)
{
if
(
*
string
==
'0'
)
{
if
(
tolower
((
int
)
*
(
++
string
))
==
'x'
)
{
base
=
16
;
++
string
;
}
else
{
base
=
8
;
}
}
else
{
base
=
10
;
}
}
/*
* For octal and hexadecimal bases, skip over the leading
* 0 or 0x, if they are present.
*/
if
(
base
==
8
&&
*
string
==
'0'
)
{
string
++
;
}
if
(
base
==
16
&&
*
string
==
'0'
&&
tolower
((
int
)
*
(
++
string
))
==
'x'
)
{
string
++
;
}
/* Main loop: convert the string to an unsigned long */
while
(
*
string
)
{
if
(
isdigit
((
int
)
*
string
))
{
index
=
((
u8
)
*
string
)
-
'0'
;
}
else
{
index
=
(
u8
)
toupper
((
int
)
*
string
);
if
(
isupper
((
int
)
index
))
{
index
=
index
-
'A'
+
10
;
}
else
{
goto
error_exit
;
}
}
if
(
index
>=
base
)
{
goto
error_exit
;
}
/* Check to see if value is out of range: */
if
(
return_value
>
((
ACPI_UINT64_MAX
-
(
u64
)
index
)
/
(
u64
)
base
))
{
goto
error_exit
;
}
else
{
return_value
*=
base
;
return_value
+=
index
;
}
++
string
;
}
/* If a minus sign was present, then "the conversion is negated": */
if
(
sign
==
ACPI_SIGN_NEGATIVE
)
{
return_value
=
(
ACPI_UINT32_MAX
-
return_value
)
+
1
;
}
*
ret_integer
=
return_value
;
return
(
status
);
error_exit:
switch
(
base
)
{
case
8
:
status
=
AE_BAD_OCTAL_CONSTANT
;
break
;
case
10
:
status
=
AE_BAD_DECIMAL_CONSTANT
;
break
;
case
16
:
status
=
AE_BAD_HEX_CONSTANT
;
break
;
default:
/* Base validated above */
break
;
}
return
(
status
);
}
#endif
drivers/acpi/acpica/utosi.c
View file @
23750205
...
...
@@ -390,11 +390,22 @@ struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name)
* PARAMETERS: walk_state - Current walk state
*
* RETURN: Status
* Integer: TRUE (0) if input string is matched
* FALSE (-1) if string is not matched
*
* DESCRIPTION: Implementation of the _OSI predefined control method. When
* an invocation of _OSI is encountered in the system AML,
* control is transferred to this function.
*
* (August 2016)
* Note: _OSI is now defined to return "Ones" to indicate a match, for
* compatibility with other ACPI implementations. On a 32-bit DSDT, Ones
* is 0xFFFFFFFF. On a 64-bit DSDT, Ones is 0xFFFFFFFFFFFFFFFF
* (ACPI_UINT64_MAX).
*
* This function always returns ACPI_UINT64_MAX for TRUE, and later code
* will truncate this to 32 bits if necessary.
*
******************************************************************************/
acpi_status
acpi_ut_osi_implementation
(
struct
acpi_walk_state
*
walk_state
)
...
...
@@ -404,7 +415,7 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
struct
acpi_interface_info
*
interface_info
;
acpi_interface_handler
interface_handler
;
acpi_status
status
;
u
32
return_value
;
u
64
return_value
;
ACPI_FUNCTION_TRACE
(
ut_osi_implementation
);
...
...
@@ -444,7 +455,7 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
acpi_gbl_osi_data
=
interface_info
->
value
;
}
return_value
=
ACPI_UINT
32
_MAX
;
return_value
=
ACPI_UINT
64
_MAX
;
}
acpi_os_release_mutex
(
acpi_gbl_osi_mutex
);
...
...
@@ -456,9 +467,10 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
*/
interface_handler
=
acpi_gbl_interface_handler
;
if
(
interface_handler
)
{
return_value
=
interface_handler
(
string_desc
->
string
.
pointer
,
return_value
);
if
(
interface_handler
(
string_desc
->
string
.
pointer
,
(
u32
)
return_value
))
{
return_value
=
ACPI_UINT64_MAX
;
}
}
ACPI_DEBUG_PRINT_RAW
((
ACPI_DB_INFO
,
...
...
drivers/acpi/acpica/utstrtoul64.c
0 → 100644
View file @
23750205
This diff is collapsed.
Click to expand it.
drivers/acpi/acpica/utxfinit.c
View file @
23750205
...
...
@@ -265,7 +265,8 @@ acpi_status ACPI_INIT_FUNCTION acpi_initialize_objects(u32 flags)
* all of the tables have been loaded. It is a legacy option and is
* not compatible with other ACPI implementations. See acpi_ns_load_table.
*/
if
(
acpi_gbl_group_module_level_code
)
{
if
(
!
acpi_gbl_parse_table_as_term_list
&&
acpi_gbl_group_module_level_code
)
{
acpi_ns_exec_module_code_list
();
/*
...
...
include/acpi/acpixf.h
View file @
23750205
...
...
@@ -46,7 +46,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20160
729
#define ACPI_CA_VERSION 0x20160
831
#include <acpi/acconfig.h>
#include <acpi/actypes.h>
...
...
@@ -194,6 +194,13 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_do_not_use_xsdt, FALSE);
*/
ACPI_INIT_GLOBAL
(
u8
,
acpi_gbl_group_module_level_code
,
TRUE
);
/*
* Optionally support module level code by parsing the entire table as
* a term_list. Default is FALSE, do not execute entire table until some
* lock order issues are fixed.
*/
ACPI_INIT_GLOBAL
(
u8
,
acpi_gbl_parse_table_as_term_list
,
FALSE
);
/*
* Optionally use 32-bit FADT addresses if and when there is a conflict
* (address mismatch) between the 32-bit and 64-bit versions of the
...
...
include/acpi/actypes.h
View file @
23750205
...
...
@@ -1034,12 +1034,6 @@ struct acpi_statistics {
u32
method_count
;
};
/* Table Event Types */
#define ACPI_TABLE_EVENT_LOAD 0x0
#define ACPI_TABLE_EVENT_UNLOAD 0x1
#define ACPI_NUM_TABLE_EVENTS 2
/*
* Types specific to the OS service interfaces
*/
...
...
@@ -1091,9 +1085,13 @@ acpi_status (*acpi_exception_handler) (acpi_status aml_status,
typedef
acpi_status
(
*
acpi_table_handler
)
(
u32
event
,
void
*
table
,
void
*
context
);
#define ACPI_TABLE_LOAD 0x0
#define ACPI_TABLE_UNLOAD 0x1
#define ACPI_NUM_TABLE_EVENTS 2
/* Table Event Types */
#define ACPI_TABLE_EVENT_LOAD 0x0
#define ACPI_TABLE_EVENT_UNLOAD 0x1
#define ACPI_TABLE_EVENT_INSTALL 0x2
#define ACPI_TABLE_EVENT_UNINSTALL 0x3
#define ACPI_NUM_TABLE_EVENTS 4
/* Address Spaces (For Operation Regions) */
...
...
tools/power/acpi/tools/acpidump/Makefile
View file @
23750205
...
...
@@ -36,10 +36,12 @@ TOOL_OBJS = \
utdebug.o
\
utexcep.o
\
utglobal.o
\
uthex.o
\
utmath.o
\
utnonansi.o
\
utprint.o
\
utstring.o
\
utstrtoul64.o
\
utxferror.o
\
oslinuxtbl.o
\
cmfsize.o
\
...
...
tools/power/acpi/tools/acpidump/apdump.c
View file @
23750205
...
...
@@ -287,8 +287,8 @@ int ap_dump_table_by_address(char *ascii_address)
/* Convert argument to an integer physical address */
status
=
acpi_ut_strtoul64
(
ascii_address
,
ACPI_
ANY_BASE
,
ACPI_MAX64_BYTE_WIDTH
,
&
long_address
);
status
=
acpi_ut_strtoul64
(
ascii_address
,
ACPI_
STRTOUL_64BIT
,
&
long_address
);
if
(
ACPI_FAILURE
(
status
))
{
fprintf
(
stderr
,
"%s: Could not convert to a physical address
\n
"
,
ascii_address
);
...
...
tools/power/acpi/tools/acpidump/apmain.c
View file @
23750205
...
...
@@ -208,8 +208,8 @@ static int ap_do_options(int argc, char **argv)
case
'r'
:
/* Dump tables from specified RSDP */
status
=
acpi_ut_strtoul64
(
acpi_gbl_optarg
,
ACPI_ANY_BASE
,
ACPI_
MAX64_BYTE_WIDTH
,
acpi_ut_strtoul64
(
acpi_gbl_optarg
,
ACPI_
STRTOUL_64BIT
,
&
gbl_rsdp_base
);
if
(
ACPI_FAILURE
(
status
))
{
fprintf
(
stderr
,
...
...
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