Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xiphi1978
linux
提交
9dce0e95
L
linux
项目概览
xiphi1978
/
linux
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9dce0e95
编写于
6月 29, 2006
作者:
L
Len Brown
浏览文件
操作
浏览文件
下载
差异文件
Pull acpica into release branch
上级
f1b2ad5d
967440e3
变更
28
隐藏空白更改
内联
并排
Showing
28 changed file
with
563 addition
and
470 deletion
+563
-470
drivers/acpi/dispatcher/dsinit.c
drivers/acpi/dispatcher/dsinit.c
+0
-30
drivers/acpi/dispatcher/dsmethod.c
drivers/acpi/dispatcher/dsmethod.c
+138
-192
drivers/acpi/dispatcher/dswexec.c
drivers/acpi/dispatcher/dswexec.c
+1
-3
drivers/acpi/dispatcher/dswload.c
drivers/acpi/dispatcher/dswload.c
+23
-26
drivers/acpi/events/evgpe.c
drivers/acpi/events/evgpe.c
+5
-9
drivers/acpi/executer/exconfig.c
drivers/acpi/executer/exconfig.c
+8
-0
drivers/acpi/executer/excreate.c
drivers/acpi/executer/excreate.c
+11
-16
drivers/acpi/executer/exdump.c
drivers/acpi/executer/exdump.c
+4
-4
drivers/acpi/executer/exfldio.c
drivers/acpi/executer/exfldio.c
+55
-16
drivers/acpi/executer/exmutex.c
drivers/acpi/executer/exmutex.c
+6
-6
drivers/acpi/executer/exsystem.c
drivers/acpi/executer/exsystem.c
+68
-14
drivers/acpi/hardware/hwregs.c
drivers/acpi/hardware/hwregs.c
+62
-15
drivers/acpi/namespace/nsaccess.c
drivers/acpi/namespace/nsaccess.c
+12
-15
drivers/acpi/osl.c
drivers/acpi/osl.c
+7
-21
drivers/acpi/parser/psparse.c
drivers/acpi/parser/psparse.c
+16
-2
drivers/acpi/utilities/utdelete.c
drivers/acpi/utilities/utdelete.c
+23
-13
drivers/acpi/utilities/utglobal.c
drivers/acpi/utilities/utglobal.c
+1
-0
drivers/acpi/utilities/utmutex.c
drivers/acpi/utilities/utmutex.c
+10
-29
include/acpi/acconfig.h
include/acpi/acconfig.h
+1
-1
include/acpi/acdispat.h
include/acpi/acdispat.h
+1
-1
include/acpi/acglobal.h
include/acpi/acglobal.h
+20
-6
include/acpi/acinterp.h
include/acpi/acinterp.h
+4
-1
include/acpi/aclocal.h
include/acpi/aclocal.h
+21
-15
include/acpi/acmacros.h
include/acpi/acmacros.h
+2
-0
include/acpi/acobject.h
include/acpi/acobject.h
+4
-4
include/acpi/acpiosxf.h
include/acpi/acpiosxf.h
+31
-9
include/acpi/actypes.h
include/acpi/actypes.h
+27
-22
include/acpi/platform/aclinux.h
include/acpi/platform/aclinux.h
+2
-0
未找到文件。
drivers/acpi/dispatcher/dsinit.c
浏览文件 @
9dce0e95
...
...
@@ -125,37 +125,7 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
if
(
info
->
table_desc
->
pointer
->
revision
==
1
)
{
node
->
flags
|=
ANOBJ_DATA_WIDTH_32
;
}
#ifdef ACPI_INIT_PARSE_METHODS
/*
* Note 11/2005: Removed this code to parse all methods during table
* load because it causes problems if there are any errors during the
* parse. Also, it seems like overkill and we probably don't want to
* abort a table load because of an issue with a single method.
*/
/*
* Print a dot for each method unless we are going to print
* the entire pathname
*/
if
(
!
(
acpi_dbg_level
&
ACPI_LV_INIT_NAMES
))
{
ACPI_DEBUG_PRINT_RAW
((
ACPI_DB_INIT
,
"."
));
}
/*
* Always parse methods to detect errors, we will delete
* the parse tree below
*/
status
=
acpi_ds_parse_method
(
obj_handle
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_ERROR
((
AE_INFO
,
"Method %p [%4.4s] - parse failure, %s"
,
obj_handle
,
acpi_ut_get_node_name
(
obj_handle
),
acpi_format_exception
(
status
)));
/* This parse failed, but we will continue parsing more methods */
}
#endif
info
->
method_count
++
;
break
;
...
...
drivers/acpi/dispatcher/dsmethod.c
浏览文件 @
9dce0e95
...
...
@@ -52,6 +52,10 @@
#define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME
(
"dsmethod"
)
/* Local prototypes */
static
acpi_status
acpi_ds_create_method_mutex
(
union
acpi_operand_object
*
method_desc
);
/*******************************************************************************
*
* FUNCTION: acpi_ds_method_error
...
...
@@ -67,6 +71,7 @@ ACPI_MODULE_NAME("dsmethod")
* Note: Allows the exception handler to change the status code
*
******************************************************************************/
acpi_status
acpi_ds_method_error
(
acpi_status
status
,
struct
acpi_walk_state
*
walk_state
)
{
...
...
@@ -111,13 +116,53 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
return
(
status
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ds_create_method_mutex
*
* PARAMETERS: obj_desc - The method object
*
* RETURN: Status
*
* DESCRIPTION: Create a mutex object for a serialized control method
*
******************************************************************************/
static
acpi_status
acpi_ds_create_method_mutex
(
union
acpi_operand_object
*
method_desc
)
{
union
acpi_operand_object
*
mutex_desc
;
acpi_status
status
;
ACPI_FUNCTION_NAME
(
ds_create_method_mutex
);
/* Create the new mutex object */
mutex_desc
=
acpi_ut_create_internal_object
(
ACPI_TYPE_MUTEX
);
if
(
!
mutex_desc
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
/* Create the actual OS Mutex */
status
=
acpi_os_create_mutex
(
&
mutex_desc
->
mutex
.
os_mutex
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
mutex_desc
->
mutex
.
sync_level
=
method_desc
->
method
.
sync_level
;
method_desc
->
method
.
mutex
=
mutex_desc
;
return_ACPI_STATUS
(
AE_OK
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ds_begin_method_execution
*
* PARAMETERS: method_node - Node of the method
* obj_desc - The method object
* calling_method_node - Caller of this method (if non-null)
* walk_state - current state, NULL if not yet executing
* a method.
*
* RETURN: Status
*
...
...
@@ -128,9 +173,9 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
******************************************************************************/
acpi_status
acpi_ds_begin_method_execution
(
struct
acpi_namespace_node
*
method_node
,
union
acpi_operand_object
*
obj_desc
,
struct
acpi_
namespace_node
*
calling_method_nod
e
)
acpi_ds_begin_method_execution
(
struct
acpi_namespace_node
*
method_node
,
union
acpi_operand_object
*
obj_desc
,
struct
acpi_
walk_state
*
walk_stat
e
)
{
acpi_status
status
=
AE_OK
;
...
...
@@ -149,35 +194,80 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node,
}
/*
* If there is a concurrency limit on this method, we need to
* obtain a unit from the method semaphore.
* If this method is serialized, we need to acquire the method mutex.
*/
if
(
obj_desc
->
method
.
semaphore
)
{
if
(
obj_desc
->
method
.
method_flags
&
AML_METHOD_SERIALIZED
)
{
/*
* Allow recursive method calls, up to the reentrancy/concurrency
* limit imposed by the SERIALIZED rule and the sync_level method
* parameter.
*
* The point of this code is to avoid permanently blocking a
* thread that is making recursive method calls.
* Create a mutex for the method if it is defined to be Serialized
* and a mutex has not already been created. We defer the mutex creation
* until a method is actually executed, to minimize the object count
*/
if
(
method_node
==
calling_method_node
)
{
if
(
obj_desc
->
method
.
thread_count
>=
obj_desc
->
method
.
concurrency
)
{
return_ACPI_STATUS
(
AE_AML_METHOD_LIMIT
);
if
(
!
obj_desc
->
method
.
mutex
)
{
status
=
acpi_ds_create_method_mutex
(
obj_desc
);
if
(
ACPI_FAILURE
(
status
)
)
{
return_ACPI_STATUS
(
status
);
}
}
/*
* Get a unit from the method semaphore. This releases the
* interpreter if we block (then reacquires it)
* The current_sync_level (per-thread) must be less than or equal to
* the sync level of the method. This mechanism provides some
* deadlock prevention
*
* Top-level method invocation has no walk state at this point
*/
status
=
acpi_ex_system_wait_semaphore
(
obj_desc
->
method
.
semaphore
,
ACPI_WAIT_FOREVER
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
if
(
walk_state
&&
(
walk_state
->
thread
->
current_sync_level
>
obj_desc
->
method
.
mutex
->
mutex
.
sync_level
))
{
ACPI_ERROR
((
AE_INFO
,
"Cannot acquire Mutex for method [%4.4s], current SyncLevel is too large (%d)"
,
acpi_ut_get_node_name
(
method_node
),
walk_state
->
thread
->
current_sync_level
));
return_ACPI_STATUS
(
AE_AML_MUTEX_ORDER
);
}
/*
* Obtain the method mutex if necessary. Do not acquire mutex for a
* recursive call.
*/
if
(
!
walk_state
||
!
obj_desc
->
method
.
mutex
->
mutex
.
owner_thread
||
(
walk_state
->
thread
!=
obj_desc
->
method
.
mutex
->
mutex
.
owner_thread
))
{
/*
* Acquire the method mutex. This releases the interpreter if we
* block (and reacquires it before it returns)
*/
status
=
acpi_ex_system_wait_mutex
(
obj_desc
->
method
.
mutex
->
mutex
.
os_mutex
,
ACPI_WAIT_FOREVER
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
/* Update the mutex and walk info and save the original sync_level */
if
(
walk_state
)
{
obj_desc
->
method
.
mutex
->
mutex
.
original_sync_level
=
walk_state
->
thread
->
current_sync_level
;
obj_desc
->
method
.
mutex
->
mutex
.
owner_thread
=
walk_state
->
thread
;
walk_state
->
thread
->
current_sync_level
=
obj_desc
->
method
.
sync_level
;
}
else
{
obj_desc
->
method
.
mutex
->
mutex
.
original_sync_level
=
obj_desc
->
method
.
mutex
->
mutex
.
sync_level
;
}
}
/* Always increase acquisition depth */
obj_desc
->
method
.
mutex
->
mutex
.
acquisition_depth
++
;
}
/*
...
...
@@ -200,10 +290,10 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node,
return_ACPI_STATUS
(
status
);
cleanup:
/* On error, must
signal the method semaphore if present
*/
/* On error, must
release the method mutex (if present)
*/
if
(
obj_desc
->
method
.
semaphore
)
{
(
void
)
acpi_os_signal_semaphore
(
obj_desc
->
method
.
semaphore
,
1
);
if
(
obj_desc
->
method
.
mutex
)
{
acpi_os_release_mutex
(
obj_desc
->
method
.
mutex
->
mutex
.
os_mutex
);
}
return_ACPI_STATUS
(
status
);
}
...
...
@@ -253,10 +343,10 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
return_ACPI_STATUS
(
AE_NULL_OBJECT
);
}
/* Init for new method, possibly wait on
concurrency semaphore
*/
/* Init for new method, possibly wait on
method mutex
*/
status
=
acpi_ds_begin_method_execution
(
method_node
,
obj_desc
,
this_walk_state
->
method_node
);
this_walk_state
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -478,6 +568,8 @@ acpi_ds_restart_control_method(struct acpi_walk_state *walk_state,
* created, delete all locals and arguments, and delete the parse
* tree if requested.
*
* MUTEX: Interpreter is locked
*
******************************************************************************/
void
...
...
@@ -503,26 +595,21 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
}
/*
* Lock the parser while we terminate this method.
* If this is the last thread executing the method,
* we have additional cleanup to perform
* If method is serialized, release the mutex and restore the
* current sync level for this thread
*/
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_CONTROL_METHOD
);
if
(
ACPI_FAILURE
(
status
))
{
return_VOID
;
}
if
(
method_desc
->
method
.
mutex
)
{
/* Signal completion of the execution of this method if necessary
*/
/* Acquisition Depth handles recursive calls
*/
if
(
method_desc
->
method
.
semaphore
)
{
status
=
acpi_os_signal_semaphore
(
method_desc
->
method
.
semaphore
,
1
);
if
(
ACPI_FAILURE
(
status
))
{
/* Ignore error and continue */
method_desc
->
method
.
mutex
->
mutex
.
acquisition_depth
--
;
if
(
!
method_desc
->
method
.
mutex
->
mutex
.
acquisition_depth
)
{
walk_state
->
thread
->
current_sync_level
=
method_desc
->
method
.
mutex
->
mutex
.
original_sync_level
;
ACPI_EXCEPTION
((
AE_INFO
,
status
,
"Could not signal method semaphore"
)
);
acpi_os_release_mutex
(
method_desc
->
method
.
mutex
->
mutex
.
os_mutex
);
}
}
...
...
@@ -537,7 +624,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
if
(
ACPI_FAILURE
(
status
))
{
goto
exit
;
return_VOID
;
}
/*
...
...
@@ -580,18 +667,16 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
/*
* Support to dynamically change a method from not_serialized to
* Serialized if it appears that the method is incorrectly written and
* does not support multiple thread execution.
The best example of this
* is if such a method creates namespace objects and blocks.
A second
* does not support multiple thread execution. The best example of this
* is if such a method creates namespace objects and blocks. A second
* thread will fail with an AE_ALREADY_EXISTS exception
*
* This code is here because we must wait until the last thread exits
* before creating the synchronization semaphore.
*/
if
((
method_desc
->
method
.
concurrency
==
1
)
&&
(
!
method_desc
->
method
.
semaphore
))
{
status
=
acpi_os_create_semaphore
(
1
,
1
,
&
method_desc
->
method
.
semaphore
);
if
((
method_desc
->
method
.
method_flags
&
AML_METHOD_SERIALIZED
)
&&
(
!
method_desc
->
method
.
mutex
))
{
status
=
acpi_ds_create_method_mutex
(
method_desc
);
}
/* No more threads, we can free the owner_id */
...
...
@@ -599,144 +684,5 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
acpi_ut_release_owner_id
(
&
method_desc
->
method
.
owner_id
);
}
exit:
(
void
)
acpi_ut_release_mutex
(
ACPI_MTX_CONTROL_METHOD
);
return_VOID
;
}
#ifdef ACPI_INIT_PARSE_METHODS
/*
* Note 11/2005: Removed this code to parse all methods during table
* load because it causes problems if there are any errors during the
* parse. Also, it seems like overkill and we probably don't want to
* abort a table load because of an issue with a single method.
*/
/*******************************************************************************
*
* FUNCTION: acpi_ds_parse_method
*
* PARAMETERS: Node - Method node
*
* RETURN: Status
*
* DESCRIPTION: Parse the AML that is associated with the method.
*
* MUTEX: Assumes parser is locked
*
******************************************************************************/
acpi_status
acpi_ds_parse_method
(
struct
acpi_namespace_node
*
node
)
{
acpi_status
status
;
union
acpi_operand_object
*
obj_desc
;
union
acpi_parse_object
*
op
;
struct
acpi_walk_state
*
walk_state
;
ACPI_FUNCTION_TRACE_PTR
(
ds_parse_method
,
node
);
/* Parameter Validation */
if
(
!
node
)
{
return_ACPI_STATUS
(
AE_NULL_ENTRY
);
}
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"**** Parsing [%4.4s] **** NamedObj=%p
\n
"
,
acpi_ut_get_node_name
(
node
),
node
));
/* Extract the method object from the method Node */
obj_desc
=
acpi_ns_get_attached_object
(
node
);
if
(
!
obj_desc
)
{
return_ACPI_STATUS
(
AE_NULL_OBJECT
);
}
/* Create a mutex for the method if there is a concurrency limit */
if
((
obj_desc
->
method
.
concurrency
!=
ACPI_INFINITE_CONCURRENCY
)
&&
(
!
obj_desc
->
method
.
semaphore
))
{
status
=
acpi_os_create_semaphore
(
obj_desc
->
method
.
concurrency
,
obj_desc
->
method
.
concurrency
,
&
obj_desc
->
method
.
semaphore
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
}
/*
* Allocate a new parser op to be the root of the parsed
* method tree
*/
op
=
acpi_ps_alloc_op
(
AML_METHOD_OP
);
if
(
!
op
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
/* Init new op with the method name and pointer back to the Node */
acpi_ps_set_name
(
op
,
node
->
name
.
integer
);
op
->
common
.
node
=
node
;
/*
* Get a new owner_id for objects created by this method. Namespace
* objects (such as Operation Regions) can be created during the
* first pass parse.
*/
status
=
acpi_ut_allocate_owner_id
(
&
obj_desc
->
method
.
owner_id
);
if
(
ACPI_FAILURE
(
status
))
{
goto
cleanup
;
}
/* Create and initialize a new walk state */
walk_state
=
acpi_ds_create_walk_state
(
obj_desc
->
method
.
owner_id
,
NULL
,
NULL
,
NULL
);
if
(
!
walk_state
)
{
status
=
AE_NO_MEMORY
;
goto
cleanup2
;
}
status
=
acpi_ds_init_aml_walk
(
walk_state
,
op
,
node
,
obj_desc
->
method
.
aml_start
,
obj_desc
->
method
.
aml_length
,
NULL
,
1
);
if
(
ACPI_FAILURE
(
status
))
{
acpi_ds_delete_walk_state
(
walk_state
);
goto
cleanup2
;
}
/*
* Parse the method, first pass
*
* The first pass load is where newly declared named objects are added into
* the namespace. Actual evaluation of the named objects (what would be
* called a "second pass") happens during the actual execution of the
* method so that operands to the named objects can take on dynamic
* run-time values.
*/
status
=
acpi_ps_parse_aml
(
walk_state
);
if
(
ACPI_FAILURE
(
status
))
{
goto
cleanup2
;
}
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"**** [%4.4s] Parsed **** NamedObj=%p Op=%p
\n
"
,
acpi_ut_get_node_name
(
node
),
node
,
op
));
/*
* Delete the parse tree. We simply re-parse the method for every
* execution since there isn't much overhead (compared to keeping lots
* of parse trees around)
*/
acpi_ns_delete_namespace_subtree
(
node
);
acpi_ns_delete_namespace_by_owner
(
obj_desc
->
method
.
owner_id
);
cleanup2:
acpi_ut_release_owner_id
(
&
obj_desc
->
method
.
owner_id
);
cleanup:
acpi_ps_delete_parse_tree
(
op
);
return_ACPI_STATUS
(
status
);
}
#endif
drivers/acpi/dispatcher/dswexec.c
浏览文件 @
9dce0e95
...
...
@@ -472,7 +472,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
acpi_ds_result_push
(
walk_state
->
result_obj
,
walk_state
);
}
break
;
default:
...
...
@@ -510,6 +509,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
ACPI_DEBUG_PRINT
((
ACPI_DB_DISPATCH
,
"Method Reference in a Package, Op=%p
\n
"
,
op
));
op
->
common
.
node
=
(
struct
acpi_namespace_node
*
)
op
->
asl
.
value
.
arg
->
asl
.
node
->
object
;
...
...
@@ -670,7 +670,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
status
=
acpi_ds_result_stack_pop
(
walk_state
);
}
break
;
case
AML_TYPE_UNDEFINED
:
...
...
@@ -708,7 +707,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
* Check if we just completed the evaluation of a
* conditional predicate
*/
if
((
ACPI_SUCCESS
(
status
))
&&
(
walk_state
->
control_state
)
&&
(
walk_state
->
control_state
->
common
.
state
==
...
...
drivers/acpi/dispatcher/dswload.c
浏览文件 @
9dce0e95
...
...
@@ -175,7 +175,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
if
(
status
==
AE_NOT_FOUND
)
{
/*
* Table disassembly:
* Target of Scope() not found.
Generate an External for it, and
* Target of Scope() not found. Generate an External for it, and
* insert the name into the namespace.
*/
acpi_dm_add_to_external_list
(
path
,
ACPI_TYPE_DEVICE
,
0
);
...
...
@@ -210,16 +210,15 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
case
ACPI_TYPE_BUFFER
:
/*
* These types we will allow, but we will change the type.
This
* These types we will allow, but we will change the type. This
* enables some existing code of the form:
*
* Name (DEB, 0)
* Scope (DEB) { ... }
*
* Note: silently change the type here.
On the second pass, we will report
* Note: silently change the type here. On the second pass, we will report
* a warning
*/
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)
\n
"
,
path
,
...
...
@@ -242,7 +241,6 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
break
;
default:
/*
* For all other named opcodes, we will enter the name into
* the namespace.
...
...
@@ -259,7 +257,6 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
* buffer_field, or Package), the name of the object is already
* in the namespace.
*/
if
(
walk_state
->
deferred_node
)
{
/* This name is already in the namespace, get the node */
...
...
@@ -293,8 +290,8 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
}
/*
* Enter the named type into the internal namespace.
We enter the name
* as we go downward in the parse tree.
Any necessary subobjects that
* Enter the named type into the internal namespace. We enter the name
* as we go downward in the parse tree. Any necessary subobjects that
* involve arguments to the opcode must be created as we go back up the
* parse tree later.
*/
...
...
@@ -327,12 +324,12 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
(
status
);
}
}
status
=
AE_OK
;
}
}
if
(
ACPI_FAILURE
(
status
))
{
ACPI_ERROR_NAMESPACE
(
path
,
status
);
return_ACPI_STATUS
(
status
);
}
...
...
@@ -434,9 +431,13 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
status
=
acpi_ex_create_region
(
op
->
named
.
data
,
op
->
named
.
length
,
(
acpi_adr_space_type
)
((
op
->
common
.
value
.
arg
)
->
common
.
value
.
integer
),
(
acpi_adr_space_type
)
((
op
->
common
.
value
.
arg
)
->
common
.
value
.
integer
),
walk_state
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
...
...
@@ -474,7 +475,7 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
* method_op pkg_length name_string method_flags term_list
*
* Note: We must create the method node/object pair as soon as we
* see the method declaration.
This allows later pass1 parsing
* see the method declaration. This allows later pass1 parsing
* of invocations of the method (need to know the number of
* arguments.)
*/
...
...
@@ -499,6 +500,7 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
length
,
walk_state
);
}
walk_state
->
operands
[
0
]
=
NULL
;
walk_state
->
num_operands
=
0
;
...
...
@@ -570,7 +572,6 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
#ifdef ACPI_ENABLE_MODULE_LEVEL_CODE
if
((
walk_state
->
op_info
->
class
==
AML_CLASS_EXECUTE
)
||
(
walk_state
->
op_info
->
class
==
AML_CLASS_CONTROL
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_DISPATCH
,
"Begin/EXEC: %s (fl %8.8X)
\n
"
,
walk_state
->
op_info
->
name
,
...
...
@@ -602,7 +603,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
}
else
{
/* Get name from the op */
buffer_ptr
=
(
char
*
)
&
op
->
named
.
name
;
buffer_ptr
=
ACPI_CAST_PTR
(
char
,
&
op
->
named
.
name
)
;
}
}
else
{
/* Get the namestring from the raw AML */
...
...
@@ -629,7 +630,6 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
break
;
case
AML_INT_NAMEPATH_OP
:
/*
* The name_path is an object reference to an existing object.
* Don't enter the name into the namespace, but look it up
...
...
@@ -642,7 +642,6 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
break
;
case
AML_SCOPE_OP
:
/*
* The Path is an object reference to an existing object.
* Don't enter the name into the namespace, but look it up
...
...
@@ -664,6 +663,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
#endif
return_ACPI_STATUS
(
status
);
}
/*
* We must check to make sure that the target is
* one of the opcodes that actually opens a scope
...
...
@@ -683,13 +683,12 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
case
ACPI_TYPE_BUFFER
:
/*
* These types we will allow, but we will change the type.
This
* These types we will allow, but we will change the type. This
* enables some existing code of the form:
*
* Name (DEB, 0)
* Scope (DEB) { ... }
*/
ACPI_WARNING
((
AE_INFO
,
"Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)"
,
buffer_ptr
,
...
...
@@ -729,14 +728,14 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
}
return_ACPI_STATUS
(
AE_OK
);
}
/*
* Enter the named type into the internal namespace.
We enter the name
* as we go downward in the parse tree.
Any necessary subobjects that
* Enter the named type into the internal namespace. We enter the name
* as we go downward in the parse tree. Any necessary subobjects that
* involve arguments to the opcode must be created as we go back up the
* parse tree later.
*
...
...
@@ -787,7 +786,6 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
* can get it again quickly when this scope is closed
*/
op
->
common
.
node
=
node
;
return_ACPI_STATUS
(
status
);
}
...
...
@@ -922,7 +920,6 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
#ifndef ACPI_NO_METHOD_EXECUTION
case
AML_TYPE_CREATE_FIELD
:
/*
* Create the field object, but the field buffer and index must
* be evaluated later during the execution phase
...
...
@@ -931,7 +928,6 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
break
;
case
AML_TYPE_NAMED_FIELD
:
/*
* If we are executing a method, initialize the field
*/
...
...
@@ -1051,6 +1047,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
* argument is the space_id. (We must save the address of the
* AML of the address and length operands)
*/
/*
* If we have a valid region, initialize it
* Namespace is NOT locked at this point.
...
...
@@ -1080,7 +1077,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
* method_op pkg_length name_string method_flags term_list
*
* Note: We must create the method node/object pair as soon as we
* see the method declaration.
This allows later pass1 parsing
* see the method declaration. This allows later pass1 parsing
* of invocations of the method (need to know the number of
* arguments.)
*/
...
...
drivers/acpi/events/evgpe.c
浏览文件 @
9dce0e95
...
...
@@ -382,7 +382,6 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
u32
status_reg
;
u32
enable_reg
;
acpi_cpu_flags
flags
;
acpi_cpu_flags
hw_flags
;
acpi_native_uint
i
;
acpi_native_uint
j
;
...
...
@@ -394,8 +393,11 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
return
(
int_status
);
}
/* We need to hold the GPE lock now, hardware lock in the loop */
/*
* We need to obtain the GPE lock for both the data structs and registers
* Note: Not necessary to obtain the hardware lock, since the GPE registers
* are owned by the gpe_lock.
*/
flags
=
acpi_os_acquire_lock
(
acpi_gbl_gpe_lock
);
/* Examine all GPE blocks attached to this interrupt level */
...
...
@@ -413,8 +415,6 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
gpe_register_info
=
&
gpe_block
->
register_info
[
i
];
hw_flags
=
acpi_os_acquire_lock
(
acpi_gbl_hardware_lock
);
/* Read the Status Register */
status
=
...
...
@@ -423,8 +423,6 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
&
gpe_register_info
->
status_address
);
if
(
ACPI_FAILURE
(
status
))
{
acpi_os_release_lock
(
acpi_gbl_hardware_lock
,
hw_flags
);
goto
unlock_and_exit
;
}
...
...
@@ -435,8 +433,6 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
&
enable_reg
,
&
gpe_register_info
->
enable_address
);
acpi_os_release_lock
(
acpi_gbl_hardware_lock
,
hw_flags
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
...
...
drivers/acpi/executer/exconfig.c
浏览文件 @
9dce0e95
...
...
@@ -266,6 +266,10 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
}
}
ACPI_INFO
((
AE_INFO
,
"Dynamic OEM Table Load - [%4.4s] OemId [%6.6s] OemTableId [%8.8s]"
,
table
->
signature
,
table
->
oem_id
,
table
->
oem_table_id
));
*
return_desc
=
ddb_handle
;
return_ACPI_STATUS
(
status
);
}
...
...
@@ -446,6 +450,10 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
return_ACPI_STATUS
(
status
);
}
ACPI_INFO
((
AE_INFO
,
"Dynamic SSDT Load - OemId [%6.6s] OemTableId [%8.8s]"
,
table_ptr
->
oem_id
,
table_ptr
->
oem_table_id
));
cleanup:
if
(
ACPI_FAILURE
(
status
))
{
ACPI_FREE
(
table_ptr
);
...
...
drivers/acpi/executer/excreate.c
浏览文件 @
9dce0e95
...
...
@@ -177,7 +177,7 @@ acpi_status acpi_ex_create_event(struct acpi_walk_state *walk_state)
* that the event is created in an unsignalled state
*/
status
=
acpi_os_create_semaphore
(
ACPI_NO_UNIT_LIMIT
,
0
,
&
obj_desc
->
event
.
semaphore
);
&
obj_desc
->
event
.
os_
semaphore
);
if
(
ACPI_FAILURE
(
status
))
{
goto
cleanup
;
}
...
...
@@ -226,12 +226,9 @@ acpi_status acpi_ex_create_mutex(struct acpi_walk_state *walk_state)
goto
cleanup
;
}
/*
* Create the actual OS semaphore.
* One unit max to make it a mutex, with one initial unit to allow
* the mutex to be acquired.
*/
status
=
acpi_os_create_semaphore
(
1
,
1
,
&
obj_desc
->
mutex
.
semaphore
);
/* Create the actual OS Mutex */
status
=
acpi_os_create_mutex
(
&
obj_desc
->
mutex
.
os_mutex
);
if
(
ACPI_FAILURE
(
status
))
{
goto
cleanup
;
}
...
...
@@ -565,7 +562,7 @@ acpi_ex_create_method(u8 * aml_start,
obj_desc
->
method
.
aml_length
=
aml_length
;
/*
* Disassemble the method flags.
Split off the Arg Count
* Disassemble the method flags. Split off the Arg Count
* for efficiency
*/
method_flags
=
(
u8
)
operand
[
1
]
->
integer
.
value
;
...
...
@@ -576,21 +573,19 @@ acpi_ex_create_method(u8 * aml_start,
(
u8
)
(
method_flags
&
AML_METHOD_ARG_COUNT
);
/*
* Get the
concurrency count. If required, a semaphore
will be
* Get the
sync_level. If method is serialized, a mutex
will be
* created for this method when it is parsed.
*/
if
(
acpi_gbl_all_methods_serialized
)
{
obj_desc
->
method
.
concurrency
=
1
;
obj_desc
->
method
.
sync_level
=
0
;
obj_desc
->
method
.
method_flags
|=
AML_METHOD_SERIALIZED
;
}
else
if
(
method_flags
&
AML_METHOD_SERIALIZED
)
{
/*
* ACPI 1.0:
Concurrency = 1
* ACPI 2.0:
Concurrency = (sync_level (in method declaration) + 1)
* ACPI 1.0:
sync_level = 0
* ACPI 2.0:
sync_level = sync_level in method declaration
*/
obj_desc
->
method
.
concurrency
=
(
u8
)
(((
method_flags
&
AML_METHOD_SYNCH_LEVEL
)
>>
4
)
+
1
);
}
else
{
obj_desc
->
method
.
concurrency
=
ACPI_INFINITE_CONCURRENCY
;
obj_desc
->
method
.
sync_level
=
(
u8
)
((
method_flags
&
AML_METHOD_SYNCH_LEVEL
)
>>
4
);
}
/* Attach the new object to the method Node */
...
...
drivers/acpi/executer/exdump.c
浏览文件 @
9dce0e95
...
...
@@ -118,14 +118,14 @@ static struct acpi_exdump_info acpi_ex_dump_device[4] = {
static
struct
acpi_exdump_info
acpi_ex_dump_event
[
2
]
=
{
{
ACPI_EXD_INIT
,
ACPI_EXD_TABLE_SIZE
(
acpi_ex_dump_event
),
NULL
},
{
ACPI_EXD_POINTER
,
ACPI_EXD_OFFSET
(
event
.
semaphore
),
"
Semaphore"
}
{
ACPI_EXD_POINTER
,
ACPI_EXD_OFFSET
(
event
.
os_semaphore
),
"Os
Semaphore"
}
};
static
struct
acpi_exdump_info
acpi_ex_dump_method
[
8
]
=
{
{
ACPI_EXD_INIT
,
ACPI_EXD_TABLE_SIZE
(
acpi_ex_dump_method
),
NULL
},
{
ACPI_EXD_UINT8
,
ACPI_EXD_OFFSET
(
method
.
param_count
),
"ParamCount"
},
{
ACPI_EXD_UINT8
,
ACPI_EXD_OFFSET
(
method
.
concurrency
),
"Concurrency
"
},
{
ACPI_EXD_POINTER
,
ACPI_EXD_OFFSET
(
method
.
semaphore
),
"Semaphore
"
},
{
ACPI_EXD_UINT8
,
ACPI_EXD_OFFSET
(
method
.
sync_level
),
"Sync Level
"
},
{
ACPI_EXD_POINTER
,
ACPI_EXD_OFFSET
(
method
.
mutex
),
"Mutex
"
},
{
ACPI_EXD_UINT8
,
ACPI_EXD_OFFSET
(
method
.
owner_id
),
"Owner Id"
},
{
ACPI_EXD_UINT8
,
ACPI_EXD_OFFSET
(
method
.
thread_count
),
"Thread Count"
},
{
ACPI_EXD_UINT32
,
ACPI_EXD_OFFSET
(
method
.
aml_length
),
"Aml Length"
},
...
...
@@ -138,7 +138,7 @@ static struct acpi_exdump_info acpi_ex_dump_mutex[5] = {
{
ACPI_EXD_POINTER
,
ACPI_EXD_OFFSET
(
mutex
.
owner_thread
),
"Owner Thread"
},
{
ACPI_EXD_UINT16
,
ACPI_EXD_OFFSET
(
mutex
.
acquisition_depth
),
"Acquire Depth"
},
{
ACPI_EXD_POINTER
,
ACPI_EXD_OFFSET
(
mutex
.
semaphore
),
"Semaphore
"
}
{
ACPI_EXD_POINTER
,
ACPI_EXD_OFFSET
(
mutex
.
os_mutex
),
"OsMutex
"
}
};
static
struct
acpi_exdump_info
acpi_ex_dump_region
[
7
]
=
{
...
...
drivers/acpi/executer/exfldio.c
浏览文件 @
9dce0e95
...
...
@@ -727,11 +727,23 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
return_ACPI_STATUS
(
status
);
}
/* Merge with previous datum if necessary */
merged_datum
|=
raw_datum
<<
(
obj_desc
->
common_field
.
access_bit_width
-
obj_desc
->
common_field
.
start_field_bit_offset
);
/*
* Merge with previous datum if necessary.
*
* Note: Before the shift, check if the shift value will be larger than
* the integer size. If so, there is no need to perform the operation.
* This avoids the differences in behavior between different compilers
* concerning shift values larger than the target data width.
*/
if
((
obj_desc
->
common_field
.
access_bit_width
-
obj_desc
->
common_field
.
start_field_bit_offset
)
<
ACPI_INTEGER_BIT_SIZE
)
{
merged_datum
|=
raw_datum
<<
(
obj_desc
->
common_field
.
access_bit_width
-
obj_desc
->
common_field
.
start_field_bit_offset
);
}
if
(
i
==
datum_count
)
{
break
;
...
...
@@ -808,13 +820,23 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
return_ACPI_STATUS
(
AE_BUFFER_OVERFLOW
);
}
/* Compute the number of datums (access width data items) */
/*
* Create the bitmasks used for bit insertion.
* Note: This if/else is used to bypass compiler differences with the
* shift operator
*/
if
(
obj_desc
->
common_field
.
access_bit_width
==
ACPI_INTEGER_BIT_SIZE
)
{
width_mask
=
ACPI_INTEGER_MAX
;
}
else
{
width_mask
=
ACPI_MASK_BITS_ABOVE
(
obj_desc
->
common_field
.
access_bit_width
);
}
width_mask
=
ACPI_MASK_BITS_ABOVE
(
obj_desc
->
common_field
.
access_bit_width
);
mask
=
width_mask
&
ACPI_MASK_BITS_BELOW
(
obj_desc
->
common_field
.
start_field_bit_offset
);
mask
=
width_mask
&
ACPI_MASK_BITS_BELOW
(
obj_desc
->
common_field
.
start_field_bit_offset
);
/* Compute the number of datums (access width data items) */
datum_count
=
ACPI_ROUND_UP_TO
(
obj_desc
->
common_field
.
bit_length
,
obj_desc
->
common_field
.
access_bit_width
);
...
...
@@ -848,12 +870,29 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
return_ACPI_STATUS
(
status
);
}
/* Start new output datum by merging with previous input datum */
field_offset
+=
obj_desc
->
common_field
.
access_byte_width
;
merged_datum
=
raw_datum
>>
(
obj_desc
->
common_field
.
access_bit_width
-
obj_desc
->
common_field
.
start_field_bit_offset
);
/*
* Start new output datum by merging with previous input datum
* if necessary.
*
* Note: Before the shift, check if the shift value will be larger than
* the integer size. If so, there is no need to perform the operation.
* This avoids the differences in behavior between different compilers
* concerning shift values larger than the target data width.
*/
if
((
obj_desc
->
common_field
.
access_bit_width
-
obj_desc
->
common_field
.
start_field_bit_offset
)
<
ACPI_INTEGER_BIT_SIZE
)
{
merged_datum
=
raw_datum
>>
(
obj_desc
->
common_field
.
access_bit_width
-
obj_desc
->
common_field
.
start_field_bit_offset
);
}
else
{
merged_datum
=
0
;
}
mask
=
width_mask
;
if
(
i
==
datum_count
)
{
...
...
drivers/acpi/executer/exmutex.c
浏览文件 @
9dce0e95
...
...
@@ -161,12 +161,13 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
/*
* Current Sync must be less than or equal to the sync level of the
* mutex.
This mechanism provides some deadlock prevention
* mutex. This mechanism provides some deadlock prevention
*/
if
(
walk_state
->
thread
->
current_sync_level
>
obj_desc
->
mutex
.
sync_level
)
{
ACPI_ERROR
((
AE_INFO
,
"Cannot acquire Mutex [%4.4s], incorrect SyncLevel"
,
acpi_ut_get_node_name
(
obj_desc
->
mutex
.
node
)));
"Cannot acquire Mutex [%4.4s], current SyncLevel is too large (%d)"
,
acpi_ut_get_node_name
(
obj_desc
->
mutex
.
node
),
walk_state
->
thread
->
current_sync_level
));
return_ACPI_STATUS
(
AE_AML_MUTEX_ORDER
);
}
...
...
@@ -178,8 +179,7 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
if
((
obj_desc
->
mutex
.
owner_thread
->
thread_id
==
walk_state
->
thread
->
thread_id
)
||
(
obj_desc
->
mutex
.
semaphore
==
acpi_gbl_global_lock_semaphore
))
{
(
obj_desc
->
mutex
.
os_mutex
==
ACPI_GLOBAL_LOCK
))
{
/*
* The mutex is already owned by this thread,
* just increment the acquisition depth
...
...
@@ -264,7 +264,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
*/
if
((
obj_desc
->
mutex
.
owner_thread
->
thread_id
!=
walk_state
->
thread
->
thread_id
)
&&
(
obj_desc
->
mutex
.
semaphore
!=
acpi_gbl_global_lock_semaphore
))
{
&&
(
obj_desc
->
mutex
.
os_mutex
!=
ACPI_GLOBAL_LOCK
))
{
ACPI_ERROR
((
AE_INFO
,
"Thread %X cannot release Mutex [%4.4s] acquired by thread %X"
,
walk_state
->
thread
->
thread_id
,
...
...
drivers/acpi/executer/exsystem.c
浏览文件 @
9dce0e95
...
...
@@ -63,14 +63,14 @@ ACPI_MODULE_NAME("exsystem")
* interpreter is released.
*
******************************************************************************/
acpi_status
acpi_ex_system_wait_semaphore
(
acpi_
handl
e
semaphore
,
u16
timeout
)
acpi_status
acpi_ex_system_wait_semaphore
(
acpi_
semaphor
e
semaphore
,
u16
timeout
)
{
acpi_status
status
;
acpi_status
status2
;
ACPI_FUNCTION_TRACE
(
ex_system_wait_semaphore
);
status
=
acpi_os_wait_semaphore
(
semaphore
,
1
,
0
);
status
=
acpi_os_wait_semaphore
(
semaphore
,
1
,
ACPI_DO_NOT_WAIT
);
if
(
ACPI_SUCCESS
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -101,6 +101,59 @@ acpi_status acpi_ex_system_wait_semaphore(acpi_handle semaphore, u16 timeout)
return_ACPI_STATUS
(
status
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_system_wait_mutex
*
* PARAMETERS: Mutex - Mutex to wait on
* Timeout - Max time to wait
*
* RETURN: Status
*
* DESCRIPTION: Implements a semaphore wait with a check to see if the
* semaphore is available immediately. If it is not, the
* interpreter is released.
*
******************************************************************************/
acpi_status
acpi_ex_system_wait_mutex
(
acpi_mutex
mutex
,
u16
timeout
)
{
acpi_status
status
;
acpi_status
status2
;
ACPI_FUNCTION_TRACE
(
ex_system_wait_mutex
);
status
=
acpi_os_acquire_mutex
(
mutex
,
ACPI_DO_NOT_WAIT
);
if
(
ACPI_SUCCESS
(
status
))
{
return_ACPI_STATUS
(
status
);
}
if
(
status
==
AE_TIME
)
{
/* We must wait, so unlock the interpreter */
acpi_ex_exit_interpreter
();
status
=
acpi_os_acquire_mutex
(
mutex
,
timeout
);
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"*** Thread awake after blocking, %s
\n
"
,
acpi_format_exception
(
status
)));
/* Reacquire the interpreter */
status2
=
acpi_ex_enter_interpreter
();
if
(
ACPI_FAILURE
(
status2
))
{
/* Report fatal error, could not acquire interpreter */
return_ACPI_STATUS
(
status2
);
}
}
return_ACPI_STATUS
(
status
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_system_do_stall
...
...
@@ -176,7 +229,7 @@ acpi_status acpi_ex_system_do_suspend(acpi_integer how_long)
*
* FUNCTION: acpi_ex_system_acquire_mutex
*
* PARAMETERS: time_desc -
The 'time to delay' object descriptor
* PARAMETERS: time_desc -
Maximum time to wait for the mutex
* obj_desc - The object descriptor for this op
*
* RETURN: Status
...
...
@@ -201,14 +254,14 @@ acpi_ex_system_acquire_mutex(union acpi_operand_object * time_desc,
/* Support for the _GL_ Mutex object -- go get the global lock */
if
(
obj_desc
->
mutex
.
semaphore
==
acpi_gbl_global_lock_semaphore
)
{
if
(
obj_desc
->
mutex
.
os_mutex
==
ACPI_GLOBAL_LOCK
)
{
status
=
acpi_ev_acquire_global_lock
((
u16
)
time_desc
->
integer
.
value
);
return_ACPI_STATUS
(
status
);
}
status
=
acpi_ex_system_wait_
semaphore
(
obj_desc
->
mutex
.
semaphore
,
(
u16
)
time_desc
->
integer
.
value
);
status
=
acpi_ex_system_wait_
mutex
(
obj_desc
->
mutex
.
os_mutex
,
(
u16
)
time_desc
->
integer
.
value
);
return_ACPI_STATUS
(
status
);
}
...
...
@@ -239,13 +292,13 @@ acpi_status acpi_ex_system_release_mutex(union acpi_operand_object *obj_desc)
/* Support for the _GL_ Mutex object -- release the global lock */
if
(
obj_desc
->
mutex
.
semaphore
==
acpi_gbl_global_lock_semaphore
)
{
if
(
obj_desc
->
mutex
.
os_mutex
==
ACPI_GLOBAL_LOCK
)
{
status
=
acpi_ev_release_global_lock
();
return_ACPI_STATUS
(
status
);
}
status
=
acpi_os_signal_semaphore
(
obj_desc
->
mutex
.
semaphore
,
1
);
return_ACPI_STATUS
(
status
);
acpi_os_release_mutex
(
obj_desc
->
mutex
.
os_mutex
);
return_ACPI_STATUS
(
AE_OK
);
}
/*******************************************************************************
...
...
@@ -268,7 +321,8 @@ acpi_status acpi_ex_system_signal_event(union acpi_operand_object *obj_desc)
ACPI_FUNCTION_TRACE
(
ex_system_signal_event
);
if
(
obj_desc
)
{
status
=
acpi_os_signal_semaphore
(
obj_desc
->
event
.
semaphore
,
1
);
status
=
acpi_os_signal_semaphore
(
obj_desc
->
event
.
os_semaphore
,
1
);
}
return_ACPI_STATUS
(
status
);
...
...
@@ -299,7 +353,7 @@ acpi_ex_system_wait_event(union acpi_operand_object *time_desc,
if
(
obj_desc
)
{
status
=
acpi_ex_system_wait_semaphore
(
obj_desc
->
event
.
semaphore
,
acpi_ex_system_wait_semaphore
(
obj_desc
->
event
.
os_
semaphore
,
(
u16
)
time_desc
->
integer
.
value
);
}
...
...
@@ -322,7 +376,7 @@ acpi_ex_system_wait_event(union acpi_operand_object *time_desc,
acpi_status
acpi_ex_system_reset_event
(
union
acpi_operand_object
*
obj_desc
)
{
acpi_status
status
=
AE_OK
;
void
*
temp_semaphore
;
acpi_semaphore
temp_semaphore
;
ACPI_FUNCTION_ENTRY
();
...
...
@@ -333,8 +387,8 @@ acpi_status acpi_ex_system_reset_event(union acpi_operand_object *obj_desc)
status
=
acpi_os_create_semaphore
(
ACPI_NO_UNIT_LIMIT
,
0
,
&
temp_semaphore
);
if
(
ACPI_SUCCESS
(
status
))
{
(
void
)
acpi_os_delete_semaphore
(
obj_desc
->
event
.
semaphore
);
obj_desc
->
event
.
semaphore
=
temp_semaphore
;
(
void
)
acpi_os_delete_semaphore
(
obj_desc
->
event
.
os_
semaphore
);
obj_desc
->
event
.
os_
semaphore
=
temp_semaphore
;
}
return
(
status
);
...
...
drivers/acpi/hardware/hwregs.c
浏览文件 @
9dce0e95
...
...
@@ -172,9 +172,9 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 * sleep_type_a, u8 * sleep_type_b)
}
/*
* The package must have at least two elements.
NOTE (March 2005): This
* The package must have at least two elements. NOTE (March 2005): This
* goes against the current ACPI spec which defines this object as a
* package with one encoded DWORD element.
However, existing practice
* package with one encoded DWORD element. However, existing practice
* by BIOS vendors seems to be to have 2 or more elements, at least
* one per sleep type (A/B).
*/
...
...
@@ -255,7 +255,7 @@ struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id)
* return_value - Value that was read from the register
* Flags - Lock the hardware or not
*
* RETURN: Status and the value read from specified Register.
Value
* RETURN: Status and the value read from specified Register. Value
* returned is normalized to bit0 (is shifted all the way right)
*
* DESCRIPTION: ACPI bit_register read function.
...
...
@@ -361,8 +361,8 @@ acpi_status acpi_set_register(u32 register_id, u32 value, u32 flags)
case
ACPI_REGISTER_PM1_STATUS
:
/*
* Status Registers are different from the rest.
Clear by
* writing 1, and writing 0 has no effect.
So, the only relevant
* Status Registers are different from the rest. Clear by
* writing 1, and writing 0 has no effect. So, the only relevant
* information is the single bit we're interested in, all others should
* be written as 0 so they will be left unchanged.
*/
...
...
@@ -467,14 +467,13 @@ ACPI_EXPORT_SYMBOL(acpi_set_register)
*
* FUNCTION: acpi_hw_register_read
*
* PARAMETERS: use_lock -
Mutex hw access
* register_id -
register_iD + Offset
* PARAMETERS: use_lock -
Lock hardware? True/False
* register_id -
ACPI Register ID
* return_value - Where the register value is returned
*
* RETURN: Status and the value read.
*
* DESCRIPTION: Acpi register read function. Registers are read at the
* given offset.
* DESCRIPTION: Read from the specified ACPI register
*
******************************************************************************/
acpi_status
...
...
@@ -580,14 +579,26 @@ acpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value)
*
* FUNCTION: acpi_hw_register_write
*
* PARAMETERS: use_lock -
Mutex hw access
* register_id -
register_iD + Offset
* PARAMETERS: use_lock -
Lock hardware? True/False
* register_id -
ACPI Register ID
* Value - The value to write
*
* RETURN: Status
*
* DESCRIPTION: Acpi register Write function. Registers are written at the
* given offset.
* DESCRIPTION: Write to the specified ACPI register
*
* NOTE: In accordance with the ACPI specification, this function automatically
* preserves the value of the following bits, meaning that these bits cannot be
* changed via this interface:
*
* PM1_CONTROL[0] = SCI_EN
* PM1_CONTROL[9]
* PM1_STATUS[11]
*
* ACPI References:
* 1) Hardware Ignored Bits: When software writes to a register with ignored
* bit fields, it preserves the ignored bit fields
* 2) SCI_EN: OSPM always preserves this bit position
*
******************************************************************************/
...
...
@@ -595,6 +606,7 @@ acpi_status acpi_hw_register_write(u8 use_lock, u32 register_id, u32 value)
{
acpi_status
status
;
acpi_cpu_flags
lock_flags
=
0
;
u32
read_value
;
ACPI_FUNCTION_TRACE
(
hw_register_write
);
...
...
@@ -605,6 +617,22 @@ acpi_status acpi_hw_register_write(u8 use_lock, u32 register_id, u32 value)
switch
(
register_id
)
{
case
ACPI_REGISTER_PM1_STATUS
:
/* 16-bit access */
/* Perform a read first to preserve certain bits (per ACPI spec) */
status
=
acpi_hw_register_read
(
ACPI_MTX_DO_NOT_LOCK
,
ACPI_REGISTER_PM1_STATUS
,
&
read_value
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
/* Insert the bits to be preserved */
ACPI_INSERT_BITS
(
value
,
ACPI_PM1_STATUS_PRESERVED_BITS
,
read_value
);
/* Now we can write the data */
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1a_evt_blk
);
...
...
@@ -635,6 +663,25 @@ acpi_status acpi_hw_register_write(u8 use_lock, u32 register_id, u32 value)
case
ACPI_REGISTER_PM1_CONTROL
:
/* 16-bit access */
/*
* Perform a read first to preserve certain bits (per ACPI spec)
*
* Note: This includes SCI_EN, we never want to change this bit
*/
status
=
acpi_hw_register_read
(
ACPI_MTX_DO_NOT_LOCK
,
ACPI_REGISTER_PM1_CONTROL
,
&
read_value
);
if
(
ACPI_FAILURE
(
status
))
{
goto
unlock_and_exit
;
}
/* Insert the bits to be preserved */
ACPI_INSERT_BITS
(
value
,
ACPI_PM1_CONTROL_PRESERVED_BITS
,
read_value
);
/* Now we can write the data */
status
=
acpi_hw_low_level_write
(
16
,
value
,
&
acpi_gbl_FADT
->
xpm1a_cnt_blk
);
...
...
@@ -726,7 +773,7 @@ acpi_hw_low_level_read(u32 width, u32 * value, struct acpi_generic_address *reg)
return
(
AE_OK
);
}
/* Get a local copy of the address.
Handles possible alignment issues */
/* Get a local copy of the address. Handles possible alignment issues */
ACPI_MOVE_64_TO_64
(
&
address
,
&
reg
->
address
);
if
(
!
address
)
{
...
...
@@ -798,7 +845,7 @@ acpi_hw_low_level_write(u32 width, u32 value, struct acpi_generic_address * reg)
return
(
AE_OK
);
}
/* Get a local copy of the address.
Handles possible alignment issues */
/* Get a local copy of the address. Handles possible alignment issues */
ACPI_MOVE_64_TO_64
(
&
address
,
&
reg
->
address
);
if
(
!
address
)
{
...
...
drivers/acpi/namespace/nsaccess.c
浏览文件 @
9dce0e95
...
...
@@ -196,33 +196,30 @@ acpi_status acpi_ns_root_initialize(void)
(
u8
)
(
ACPI_TO_INTEGER
(
val
)
-
1
);
if
(
ACPI_STRCMP
(
init_val
->
name
,
"_GL_"
)
==
0
)
{
/*
* Create a counting semaphore for the
* global lock
*/
/* Create a counting semaphore for the global lock */
status
=
acpi_os_create_semaphore
(
ACPI_NO_UNIT_LIMIT
,
1
,
&
obj_desc
->
mutex
.
semaphore
);
&
acpi_gbl_global_lock_
semaphore
);
if
(
ACPI_FAILURE
(
status
))
{
acpi_ut_remove_reference
(
obj_desc
);
goto
unlock_and_exit
;
}
/*
* We just created the mutex for the
* global lock, save it
*/
acpi_gbl_global_lock_semaphore
=
obj_desc
->
mutex
.
semaphore
;
/* Mark this mutex as very special */
obj_desc
->
mutex
.
os_mutex
=
ACPI_GLOBAL_LOCK
;
}
else
{
/* Create a mutex */
status
=
acpi_os_create_semaphore
(
1
,
1
,
&
obj_desc
->
mutex
.
semaphore
);
status
=
acpi_os_create_mutex
(
&
obj_desc
->
mutex
.
os_mutex
);
if
(
ACPI_FAILURE
(
status
))
{
acpi_ut_remove_reference
(
obj_desc
);
...
...
drivers/acpi/osl.c
浏览文件 @
9dce0e95
...
...
@@ -688,18 +688,9 @@ EXPORT_SYMBOL(acpi_os_wait_events_complete);
/*
* Allocate the memory for a spinlock and initialize it.
*/
acpi_status
acpi_os_create_lock
(
acpi_
handle
*
out_
handle
)
acpi_status
acpi_os_create_lock
(
acpi_
spinlock
*
handle
)
{
spinlock_t
*
lock_ptr
;
lock_ptr
=
acpi_os_allocate
(
sizeof
(
spinlock_t
));
spin_lock_init
(
lock_ptr
);
ACPI_DEBUG_PRINT
((
ACPI_DB_MUTEX
,
"Creating spinlock[%p].
\n
"
,
lock_ptr
));
*
out_handle
=
lock_ptr
;
spin_lock_init
(
*
handle
);
return
AE_OK
;
}
...
...
@@ -707,13 +698,8 @@ acpi_status acpi_os_create_lock(acpi_handle * out_handle)
/*
* Deallocate the memory for a spinlock.
*/
void
acpi_os_delete_lock
(
acpi_
handle
handle
)
void
acpi_os_delete_lock
(
acpi_
spinlock
handle
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_MUTEX
,
"Deleting spinlock[%p].
\n
"
,
handle
));
acpi_os_free
(
handle
);
return
;
}
...
...
@@ -1037,10 +1023,10 @@ EXPORT_SYMBOL(max_cstate);
* handle is a pointer to the spinlock_t.
*/
acpi_cpu_flags
acpi_os_acquire_lock
(
acpi_
handle
handle
)
acpi_cpu_flags
acpi_os_acquire_lock
(
acpi_
spinlock
lockp
)
{
acpi_cpu_flags
flags
;
spin_lock_irqsave
(
(
spinlock_t
*
)
handle
,
flags
);
spin_lock_irqsave
(
lockp
,
flags
);
return
flags
;
}
...
...
@@ -1048,9 +1034,9 @@ acpi_cpu_flags acpi_os_acquire_lock(acpi_handle handle)
* Release a spinlock. See above.
*/
void
acpi_os_release_lock
(
acpi_
handle
handle
,
acpi_cpu_flags
flags
)
void
acpi_os_release_lock
(
acpi_
spinlock
lockp
,
acpi_cpu_flags
flags
)
{
spin_unlock_irqrestore
(
(
spinlock_t
*
)
handle
,
flags
);
spin_unlock_irqrestore
(
lockp
,
flags
);
}
#ifndef ACPI_USE_LOCAL_CACHE
...
...
drivers/acpi/parser/psparse.c
浏览文件 @
9dce0e95
...
...
@@ -469,6 +469,16 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
}
walk_state
->
thread
=
thread
;
/*
* If executing a method, the starting sync_level is this method's
* sync_level
*/
if
(
walk_state
->
method_desc
)
{
walk_state
->
thread
->
current_sync_level
=
walk_state
->
method_desc
->
method
.
sync_level
;
}
acpi_ds_push_walk_state
(
walk_state
,
thread
);
/*
...
...
@@ -505,6 +515,10 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
status
=
acpi_ds_call_control_method
(
thread
,
walk_state
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
{
status
=
acpi_ds_method_error
(
status
,
walk_state
);
}
/*
* If the transfer to the new method method call worked, a new walk
...
...
@@ -525,7 +539,7 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
/* Check for possible multi-thread reentrancy problem */
if
((
status
==
AE_ALREADY_EXISTS
)
&&
(
!
walk_state
->
method_desc
->
method
.
semaphore
))
{
(
!
walk_state
->
method_desc
->
method
.
mutex
))
{
/*
* Method tried to create an object twice. The probable cause is
* that the method cannot handle reentrancy.
...
...
@@ -537,7 +551,7 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
*/
walk_state
->
method_desc
->
method
.
method_flags
|=
AML_METHOD_SERIALIZED
;
walk_state
->
method_desc
->
method
.
concurrency
=
1
;
walk_state
->
method_desc
->
method
.
sync_level
=
0
;
}
}
...
...
drivers/acpi/utilities/utdelete.c
浏览文件 @
9dce0e95
...
...
@@ -155,21 +155,30 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
case
ACPI_TYPE_MUTEX
:
ACPI_DEBUG_PRINT
((
ACPI_DB_ALLOCATIONS
,
"***** Mutex %p,
Semaphore
%p
\n
"
,
object
,
object
->
mutex
.
semaphore
));
"***** Mutex %p,
OS Mutex
%p
\n
"
,
object
,
object
->
mutex
.
os_mutex
));
acpi_ex_unlink_mutex
(
object
);
(
void
)
acpi_os_delete_semaphore
(
object
->
mutex
.
semaphore
);
if
(
object
->
mutex
.
os_mutex
!=
ACPI_GLOBAL_LOCK
)
{
acpi_ex_unlink_mutex
(
object
);
acpi_os_delete_mutex
(
object
->
mutex
.
os_mutex
);
}
else
{
/* Global Lock "mutex" is actually a counting semaphore */
(
void
)
acpi_os_delete_semaphore
(
acpi_gbl_global_lock_semaphore
);
acpi_gbl_global_lock_semaphore
=
NULL
;
}
break
;
case
ACPI_TYPE_EVENT
:
ACPI_DEBUG_PRINT
((
ACPI_DB_ALLOCATIONS
,
"***** Event %p, Semaphore %p
\n
"
,
object
,
object
->
event
.
semaphore
));
"***** Event %p,
OS
Semaphore %p
\n
"
,
object
,
object
->
event
.
os_
semaphore
));
(
void
)
acpi_os_delete_semaphore
(
object
->
event
.
semaphore
);
object
->
event
.
semaphore
=
NULL
;
(
void
)
acpi_os_delete_semaphore
(
object
->
event
.
os_
semaphore
);
object
->
event
.
os_
semaphore
=
NULL
;
break
;
case
ACPI_TYPE_METHOD
:
...
...
@@ -177,12 +186,13 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
ACPI_DEBUG_PRINT
((
ACPI_DB_ALLOCATIONS
,
"***** Method %p
\n
"
,
object
));
/* Delete the method
semaphore
if it exists */
/* Delete the method
mutex
if it exists */
if
(
object
->
method
.
semaphore
)
{
(
void
)
acpi_os_delete_semaphore
(
object
->
method
.
semaphore
);
object
->
method
.
semaphore
=
NULL
;
if
(
object
->
method
.
mutex
)
{
acpi_os_delete_mutex
(
object
->
method
.
mutex
->
mutex
.
os_mutex
);
acpi_ut_delete_object_desc
(
object
->
method
.
mutex
);
object
->
method
.
mutex
=
NULL
;
}
break
;
...
...
drivers/acpi/utilities/utglobal.c
浏览文件 @
9dce0e95
...
...
@@ -794,6 +794,7 @@ void acpi_ut_init_globals(void)
/* Global Lock support */
acpi_gbl_global_lock_semaphore
=
NULL
;
acpi_gbl_global_lock_acquired
=
FALSE
;
acpi_gbl_global_lock_thread_count
=
0
;
acpi_gbl_global_lock_handle
=
0
;
...
...
drivers/acpi/utilities/utmutex.c
浏览文件 @
9dce0e95
...
...
@@ -82,12 +82,9 @@ acpi_status acpi_ut_mutex_initialize(void)
/* Create the spinlocks for use at interrupt level */
status
=
acpi_os_create_lock
(
&
acpi_gbl_gpe_lock
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
spin_lock_init
(
acpi_gbl_gpe_lock
);
spin_lock_init
(
acpi_gbl_hardware_lock
);
status
=
acpi_os_create_lock
(
&
acpi_gbl_hardware_lock
);
return_ACPI_STATUS
(
status
);
}
...
...
@@ -146,9 +143,8 @@ static acpi_status acpi_ut_create_mutex(acpi_mutex_handle mutex_id)
}
if
(
!
acpi_gbl_mutex_info
[
mutex_id
].
mutex
)
{
status
=
acpi_os_create_semaphore
(
1
,
1
,
&
acpi_gbl_mutex_info
[
mutex_id
].
mutex
);
status
=
acpi_os_create_mutex
(
&
acpi_gbl_mutex_info
[
mutex_id
].
mutex
);
acpi_gbl_mutex_info
[
mutex_id
].
thread_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
acpi_gbl_mutex_info
[
mutex_id
].
use_count
=
0
;
...
...
@@ -171,7 +167,6 @@ static acpi_status acpi_ut_create_mutex(acpi_mutex_handle mutex_id)
static
acpi_status
acpi_ut_delete_mutex
(
acpi_mutex_handle
mutex_id
)
{
acpi_status
status
;
ACPI_FUNCTION_TRACE_U32
(
ut_delete_mutex
,
mutex_id
);
...
...
@@ -179,12 +174,12 @@ static acpi_status acpi_ut_delete_mutex(acpi_mutex_handle mutex_id)
return_ACPI_STATUS
(
AE_BAD_PARAMETER
);
}
status
=
acpi_os_delete_semaphore
(
acpi_gbl_mutex_info
[
mutex_id
].
mutex
);
acpi_os_delete_mutex
(
acpi_gbl_mutex_info
[
mutex_id
].
mutex
);
acpi_gbl_mutex_info
[
mutex_id
].
mutex
=
NULL
;
acpi_gbl_mutex_info
[
mutex_id
].
thread_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
return_ACPI_STATUS
(
status
);
return_ACPI_STATUS
(
AE_OK
);
}
/*******************************************************************************
...
...
@@ -251,8 +246,8 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)
"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_mutex_info
[
mutex_id
].
mutex
,
1
,
ACPI_WAIT_FOREVER
);
status
=
acpi_os_
acquire_mutex
(
acpi_gbl_mutex_info
[
mutex_id
].
mutex
,
ACPI_WAIT_FOREVER
);
if
(
ACPI_SUCCESS
(
status
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_MUTEX
,
"Thread %X acquired Mutex [%s]
\n
"
,
...
...
@@ -284,7 +279,6 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)
acpi_status
acpi_ut_release_mutex
(
acpi_mutex_handle
mutex_id
)
{
acpi_status
status
;
acpi_thread_id
this_thread_id
;
ACPI_FUNCTION_NAME
(
ut_release_mutex
);
...
...
@@ -340,19 +334,6 @@ acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id)
acpi_gbl_mutex_info
[
mutex_id
].
thread_id
=
ACPI_MUTEX_NOT_ACQUIRED
;
status
=
acpi_os_signal_semaphore
(
acpi_gbl_mutex_info
[
mutex_id
].
mutex
,
1
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_EXCEPTION
((
AE_INFO
,
status
,
"Thread %X could not release Mutex [%X]"
,
this_thread_id
,
mutex_id
));
}
else
{
ACPI_DEBUG_PRINT
((
ACPI_DB_MUTEX
,
"Thread %X released Mutex [%s]
\n
"
,
this_thread_id
,
acpi_ut_get_mutex_name
(
mutex_id
)));
}
return
(
status
);
acpi_os_release_mutex
(
acpi_gbl_mutex_info
[
mutex_id
].
mutex
);
return
(
AE_OK
);
}
include/acpi/acconfig.h
浏览文件 @
9dce0e95
...
...
@@ -63,7 +63,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x200606
08
#define ACPI_CA_VERSION 0x200606
23
/*
* OS name, used for the _OS object. The _OS object is essentially obsolete,
...
...
include/acpi/acdispat.h
浏览文件 @
9dce0e95
...
...
@@ -201,7 +201,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
acpi_status
acpi_ds_begin_method_execution
(
struct
acpi_namespace_node
*
method_node
,
union
acpi_operand_object
*
obj_desc
,
struct
acpi_
namespace_node
*
calling_method_nod
e
);
struct
acpi_
walk_state
*
walk_stat
e
);
acpi_status
acpi_ds_method_error
(
acpi_status
status
,
struct
acpi_walk_state
*
walk_state
);
...
...
include/acpi/acglobal.h
浏览文件 @
9dce0e95
...
...
@@ -181,6 +181,12 @@ ACPI_EXTERN u8 acpi_gbl_integer_nybble_width;
extern
struct
acpi_table_list
acpi_gbl_table_lists
[
ACPI_TABLE_ID_MAX
+
1
];
extern
struct
acpi_table_support
acpi_gbl_table_data
[
ACPI_TABLE_ID_MAX
+
1
];
/*****************************************************************************
*
* Mutual exlusion within ACPICA subsystem
*
****************************************************************************/
/*
* Predefined mutex objects. This array contains the
* actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs.
...
...
@@ -188,6 +194,20 @@ extern struct acpi_table_support acpi_gbl_table_data[ACPI_TABLE_ID_MAX + 1];
*/
ACPI_EXTERN
struct
acpi_mutex_info
acpi_gbl_mutex_info
[
ACPI_NUM_MUTEX
];
/*
* Global lock semaphore works in conjunction with the actual HW global lock
*/
ACPI_EXTERN
acpi_semaphore
acpi_gbl_global_lock_semaphore
;
/*
* Spinlocks are used for interfaces that can be possibly called at
* interrupt level
*/
ACPI_EXTERN
spinlock_t
_acpi_gbl_gpe_lock
;
/* For GPE data structs and registers */
ACPI_EXTERN
spinlock_t
_acpi_gbl_hardware_lock
;
/* For ACPI H/W except GPE registers */
#define acpi_gbl_gpe_lock &_acpi_gbl_gpe_lock
#define acpi_gbl_hardware_lock &_acpi_gbl_hardware_lock
/*****************************************************************************
*
* Miscellaneous globals
...
...
@@ -217,7 +237,6 @@ ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_system_notify;
ACPI_EXTERN
acpi_exception_handler
acpi_gbl_exception_handler
;
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
;
/* Misc */
...
...
@@ -315,11 +334,6 @@ 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
];
/* Spinlocks */
ACPI_EXTERN
acpi_handle
acpi_gbl_gpe_lock
;
ACPI_EXTERN
acpi_handle
acpi_gbl_hardware_lock
;
/*****************************************************************************
*
* Debugger globals
...
...
include/acpi/acinterp.h
浏览文件 @
9dce0e95
...
...
@@ -287,7 +287,10 @@ acpi_ex_system_wait_event(union acpi_operand_object *time,
acpi_status
acpi_ex_system_reset_event
(
union
acpi_operand_object
*
obj_desc
);
acpi_status
acpi_ex_system_wait_semaphore
(
acpi_handle
semaphore
,
u16
timeout
);
acpi_status
acpi_ex_system_wait_semaphore
(
acpi_semaphore
semaphore
,
u16
timeout
);
acpi_status
acpi_ex_system_wait_mutex
(
acpi_mutex
mutex
,
u16
timeout
);
/*
* exoparg1 - ACPI AML execution, 1 operand
...
...
include/acpi/aclocal.h
浏览文件 @
9dce0e95
...
...
@@ -47,10 +47,11 @@
/* acpisrc:struct_defs -- for acpisrc conversion */
#define ACPI_WAIT_FOREVER 0xFFFF
/* u16, as per ACPI spec */
#define ACPI_INFINITE_CONCURRENCY 0xFF
#define ACPI_DO_NOT_WAIT 0
#define ACPI_SERIALIZED 0xFF
typedef
void
*
acpi_mutex
;
typedef
u32
acpi_mutex_handle
;
#define ACPI_GLOBAL_LOCK (acpi_semaphore) (-1)
/* Total number of aml opcodes defined */
...
...
@@ -79,16 +80,15 @@ union acpi_parse_object;
* table below also!
*/
#define ACPI_MTX_INTERPRETER 0
/* AML Interpreter, main lock */
#define ACPI_MTX_CONTROL_METHOD 1
/* Control method termination [TBD: may no longer be necessary] */
#define ACPI_MTX_TABLES 2
/* Data for ACPI tables */
#define ACPI_MTX_NAMESPACE 3
/* ACPI Namespace */
#define ACPI_MTX_EVENTS 4
/* Data for ACPI events */
#define ACPI_MTX_CACHES 5
/* Internal caches, general purposes */
#define ACPI_MTX_MEMORY 6
/* Debug memory tracking lists */
#define ACPI_MTX_DEBUG_CMD_COMPLETE 7
/* AML debugger */
#define ACPI_MTX_DEBUG_CMD_READY 8
/* AML debugger */
#define ACPI_MAX_MUTEX 8
#define ACPI_MTX_TABLES 1
/* Data for ACPI tables */
#define ACPI_MTX_NAMESPACE 2
/* ACPI Namespace */
#define ACPI_MTX_EVENTS 3
/* Data for ACPI events */
#define ACPI_MTX_CACHES 4
/* Internal caches, general purposes */
#define ACPI_MTX_MEMORY 5
/* Debug memory tracking lists */
#define ACPI_MTX_DEBUG_CMD_COMPLETE 6
/* AML debugger */
#define ACPI_MTX_DEBUG_CMD_READY 7
/* AML debugger */
#define ACPI_MAX_MUTEX 7
#define ACPI_NUM_MUTEX ACPI_MAX_MUTEX+1
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
...
...
@@ -98,14 +98,13 @@ union acpi_parse_object;
static
char
*
acpi_gbl_mutex_names
[
ACPI_NUM_MUTEX
]
=
{
"ACPI_MTX_Interpreter"
,
"ACPI_MTX_Method"
,
"ACPI_MTX_Tables"
,
"ACPI_MTX_Namespace"
,
"ACPI_MTX_Events"
,
"ACPI_MTX_Caches"
,
"ACPI_MTX_Memory"
,
"ACPI_MTX_
DebugCm
dComplete"
,
"ACPI_MTX_
DebugCm
dReady"
"ACPI_MTX_
Comman
dComplete"
,
"ACPI_MTX_
Comman
dReady"
};
#endif
...
...
@@ -704,6 +703,13 @@ struct acpi_bit_register_info {
u16
access_bit_mask
;
};
/*
* Some ACPI registers have bits that must be ignored -- meaning that they
* must be preserved.
*/
#define ACPI_PM1_STATUS_PRESERVED_BITS 0x0800
/* Bit 11 */
#define ACPI_PM1_CONTROL_PRESERVED_BITS 0x0201
/* Bit 9, Bit 0 (SCI_EN) */
/*
* Register IDs
* These are the full ACPI registers
...
...
include/acpi/acmacros.h
浏览文件 @
9dce0e95
...
...
@@ -394,6 +394,8 @@
#define ACPI_REGISTER_PREPARE_BITS(val, pos, mask) ((val << pos) & mask)
#define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val) reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask)
#define ACPI_INSERT_BITS(target, mask, source) target = ((target & (~(mask))) | (source & mask))
/* Generate a UUID */
#define ACPI_INIT_UUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
...
...
include/acpi/acobject.h
浏览文件 @
9dce0e95
...
...
@@ -140,14 +140,14 @@ struct acpi_object_package {
*****************************************************************************/
struct
acpi_object_event
{
ACPI_OBJECT_COMMON_HEADER
void
*
semaphore
;
ACPI_OBJECT_COMMON_HEADER
acpi_semaphore
os_semaphore
;
/* Actual OS synchronization object */
};
struct
acpi_object_mutex
{
ACPI_OBJECT_COMMON_HEADER
u8
sync_level
;
/* 0-15, specified in Mutex() call */
u16
acquisition_depth
;
/* Allow multiple Acquires, same thread */
struct
acpi_thread_state
*
owner_thread
;
/* Current owner of the mutex */
void
*
semaphore
;
/* Actual OS synchronization object */
acpi_mutex
os_mutex
;
/* Actual OS synchronization object */
union
acpi_operand_object
*
prev
;
/* Link for list of acquired mutexes */
union
acpi_operand_object
*
next
;
/* Link for list of acquired mutexes */
struct
acpi_namespace_node
*
node
;
/* Containing namespace node */
...
...
@@ -166,8 +166,8 @@ struct acpi_object_region {
struct
acpi_object_method
{
ACPI_OBJECT_COMMON_HEADER
u8
method_flags
;
u8
param_count
;
u8
concurrency
;
void
*
semaphore
;
u8
sync_level
;
union
acpi_operand_object
*
mutex
;
u8
*
aml_start
;
ACPI_INTERNAL_METHOD
implementation
;
u32
aml_length
;
...
...
include/acpi/acpiosxf.h
浏览文件 @
9dce0e95
...
...
@@ -96,25 +96,47 @@ acpi_os_table_override(struct acpi_table_header *existing_table,
struct
acpi_table_header
**
new_table
);
/*
* Synchronization primitives
* Spinlock primitives
*/
acpi_status
acpi_os_create_lock
(
acpi_spinlock
*
out_handle
);
void
acpi_os_delete_lock
(
acpi_spinlock
handle
);
acpi_cpu_flags
acpi_os_acquire_lock
(
acpi_spinlock
handle
);
void
acpi_os_release_lock
(
acpi_spinlock
handle
,
acpi_cpu_flags
flags
);
/*
* Semaphore primitives
*/
acpi_status
acpi_os_create_semaphore
(
u32
max_units
,
u32
initial_units
,
acpi_
handl
e
*
out_handle
);
u32
initial_units
,
acpi_
semaphor
e
*
out_handle
);
acpi_status
acpi_os_delete_semaphore
(
acpi_
handl
e
handle
);
acpi_status
acpi_os_delete_semaphore
(
acpi_
semaphor
e
handle
);
acpi_status
acpi_os_wait_semaphore
(
acpi_handle
handle
,
u32
units
,
u16
timeout
);
acpi_status
acpi_os_wait_semaphore
(
acpi_semaphore
handle
,
u32
units
,
u16
timeout
);
acpi_status
acpi_os_signal_semaphore
(
acpi_semaphore
handle
,
u32
units
);
/*
* Mutex primitives
*/
acpi_status
acpi_os_create_mutex
(
acpi_mutex
*
out_handle
);
acpi_status
acpi_os_signal_semaphore
(
acpi_handle
handle
,
u32
units
);
void
acpi_os_delete_mutex
(
acpi_mutex
handle
);
acpi_status
acpi_os_
create_lock
(
acpi_handle
*
out_handle
);
acpi_status
acpi_os_
acquire_mutex
(
acpi_mutex
handle
,
u16
timeout
);
void
acpi_os_
delete_lock
(
acpi_handle
handle
);
void
acpi_os_
release_mutex
(
acpi_mutex
handle
);
acpi_cpu_flags
acpi_os_acquire_lock
(
acpi_handle
handle
);
/* Temporary macros for Mutex* interfaces, map to existing semaphore xfaces */
void
acpi_os_release_lock
(
acpi_handle
handle
,
acpi_cpu_flags
flags
);
#define acpi_os_create_mutex(out_handle) acpi_os_create_semaphore (1, 1, out_handle)
#define acpi_os_delete_mutex(handle) (void) acpi_os_delete_semaphore (handle)
#define acpi_os_acquire_mutex(handle,time) acpi_os_wait_semaphore (handle, 1, time)
#define acpi_os_release_mutex(handle) (void) acpi_os_signal_semaphore (handle, 1)
/*
* Memory allocation and mapping
...
...
include/acpi/actypes.h
浏览文件 @
9dce0e95
...
...
@@ -241,7 +241,7 @@ typedef acpi_native_uint acpi_size;
/*******************************************************************************
*
* OS-
or
compiler-dependent types
* OS-
dependent and
compiler-dependent types
*
* If the defaults below are not appropriate for the host system, they can
* be defined in the compiler-specific or OS-specific header, and this will
...
...
@@ -249,29 +249,36 @@ typedef acpi_native_uint acpi_size;
*
******************************************************************************/
/*
Use C99 uintptr_t for pointer casting if available, "void *" otherwise
*/
/*
Value returned by acpi_os_get_thread_id
*/
#ifndef acpi_
uintptr_t
#define acpi_
uintptr_t void *
#ifndef acpi_
thread_id
#define acpi_
thread_id acpi_native_uint
#endif
/*
* If acpi_cache_t was not defined in the OS-dependent header,
* define it now. This is typically the case where the local cache
* manager implementation is to be used (ACPI_USE_LOCAL_CACHE)
*/
#ifndef acpi_cache_t
#define acpi_cache_t struct acpi_memory_list
/* Object returned from acpi_os_create_lock */
#ifndef acpi_spinlock
#define acpi_spinlock void *
#endif
/*
* Allow the CPU flags word to be defined per-OS to simplify the use of the
* lock and unlock OSL interfaces.
*/
/* Flags for acpi_os_acquire_lock/acpi_os_release_lock */
#ifndef acpi_cpu_flags
#define acpi_cpu_flags acpi_native_uint
#endif
/* Object returned from acpi_os_create_cache */
#ifndef acpi_cache_t
#define acpi_cache_t struct acpi_memory_list
#endif
/* Use C99 uintptr_t for pointer casting if available, "void *" otherwise */
#ifndef acpi_uintptr_t
#define acpi_uintptr_t void *
#endif
/*
* ACPI_PRINTF_LIKE is used to tag functions as "printf-like" because
* some compilers can catch printf format string problems
...
...
@@ -298,13 +305,6 @@ typedef acpi_native_uint acpi_size;
#define ACPI_EXPORT_SYMBOL(symbol)
#endif
/*
* thread_id is returned by acpi_os_get_thread_id.
*/
#ifndef acpi_thread_id
#define acpi_thread_id acpi_native_uint
#endif
/*******************************************************************************
*
* Independent types
...
...
@@ -380,6 +380,11 @@ struct uint32_struct {
u32
hi
;
};
/* Synchronization objects */
#define acpi_mutex void *
#define acpi_semaphore void *
/*
* Acpi integer width. In ACPI version 1, integers are
* 32 bits. In ACPI version 2, integers are 64 bits.
...
...
include/acpi/platform/aclinux.h
浏览文件 @
9dce0e95
...
...
@@ -58,11 +58,13 @@
#include <asm/div64.h>
#include <asm/acpi.h>
#include <linux/slab.h>
#include <linux/spinlock_types.h>
/* Host-dependent types and defines */
#define ACPI_MACHINE_WIDTH BITS_PER_LONG
#define acpi_cache_t kmem_cache_t
#define acpi_spinlock spinlock_t *
#define ACPI_EXPORT_SYMBOL(symbol) EXPORT_SYMBOL(symbol);
#define strtoul simple_strtoul
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录