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
nexedi
linux
Commits
47b6ac1d
Commit
47b6ac1d
authored
Mar 13, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux-acpi.bkbits.net/linux-acpi-release-2.6.5
into ppc970.osdl.org:/home/torvalds/v2.5/linux
parents
180cc17d
1e102760
Changes
30
Hide whitespace changes
Inline
Side-by-side
Showing
30 changed files
with
386 additions
and
151 deletions
+386
-151
Documentation/kernel-parameters.txt
Documentation/kernel-parameters.txt
+4
-0
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/acpi/boot.c
+10
-14
arch/i386/kernel/bootflag.c
arch/i386/kernel/bootflag.c
+1
-1
drivers/acpi/dispatcher/dsmethod.c
drivers/acpi/dispatcher/dsmethod.c
+58
-27
drivers/acpi/events/evgpe.c
drivers/acpi/events/evgpe.c
+5
-0
drivers/acpi/executer/excreate.c
drivers/acpi/executer/excreate.c
+13
-7
drivers/acpi/executer/exmutex.c
drivers/acpi/executer/exmutex.c
+18
-12
drivers/acpi/hardware/hwsleep.c
drivers/acpi/hardware/hwsleep.c
+1
-1
drivers/acpi/namespace/nsaccess.c
drivers/acpi/namespace/nsaccess.c
+22
-8
drivers/acpi/namespace/nsalloc.c
drivers/acpi/namespace/nsalloc.c
+4
-3
drivers/acpi/namespace/nseval.c
drivers/acpi/namespace/nseval.c
+11
-4
drivers/acpi/osl.c
drivers/acpi/osl.c
+36
-0
drivers/acpi/parser/psparse.c
drivers/acpi/parser/psparse.c
+39
-5
drivers/acpi/parser/psscope.c
drivers/acpi/parser/psscope.c
+2
-7
drivers/acpi/power.c
drivers/acpi/power.c
+12
-0
drivers/acpi/sleep/poweroff.c
drivers/acpi/sleep/poweroff.c
+3
-0
drivers/acpi/tables.c
drivers/acpi/tables.c
+6
-1
drivers/acpi/utilities/uteval.c
drivers/acpi/utilities/uteval.c
+56
-0
drivers/acpi/utilities/utglobal.c
drivers/acpi/utilities/utglobal.c
+17
-11
include/acpi/acconfig.h
include/acpi/acconfig.h
+5
-1
include/acpi/acglobal.h
include/acpi/acglobal.h
+10
-1
include/acpi/acmacros.h
include/acpi/acmacros.h
+0
-3
include/acpi/acobject.h
include/acpi/acobject.h
+6
-1
include/acpi/acpixf.h
include/acpi/acpixf.h
+1
-1
include/acpi/actypes.h
include/acpi/actypes.h
+1
-4
include/acpi/acutils.h
include/acpi/acutils.h
+4
-2
include/acpi/amlcode.h
include/acpi/amlcode.h
+10
-4
include/asm-i386/acpi.h
include/asm-i386/acpi.h
+29
-24
include/asm-x86_64/acpi.h
include/asm-x86_64/acpi.h
+2
-2
include/asm-x86_64/system.h
include/asm-x86_64/system.h
+0
-7
No files found.
Documentation/kernel-parameters.txt
View file @
47b6ac1d
...
...
@@ -116,6 +116,10 @@ running once the system is up.
acpi_irq_isa= [HW,ACPI] If irq_balance, Mark listed IRQs used by ISA
Format: <irq>,<irq>...
acpi_osi= [HW,ACPI] empty param disables _OSI
acpi_serialize [HW,ACPI] force serialization of AML methods
ad1816= [HW,OSS]
Format: <io>,<irq>,<dma>,<dma2>
See also Documentation/sound/oss/AD1816.
...
...
arch/i386/kernel/acpi/boot.c
View file @
47b6ac1d
...
...
@@ -128,7 +128,9 @@ static int __init acpi_parse_mcfg(unsigned long phys_addr, unsigned long size)
return
0
;
}
#endif
/* CONFIG_PCI_MMCONFIG */
#else
#define acpi_parse_mcfg NULL
#endif
/* !CONFIG_PCI_MMCONFIG */
#ifdef CONFIG_X86_LOCAL_APIC
static
int
__init
...
...
@@ -424,6 +426,8 @@ static int __init acpi_parse_hpet(unsigned long phys, unsigned long size)
hpet_address
);
return
0
;
}
#else
#define acpi_parse_hpet NULL
#endif
/* detect the location of the ACPI PM Timer */
...
...
@@ -454,6 +458,8 @@ static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
printk
(
KERN_INFO
PREFIX
"PM-Timer IO Port: %#x
\n
"
,
pmtmr_ioport
);
return
0
;
}
#else
#define acpi_parse_fadt NULL
#endif
...
...
@@ -666,7 +672,7 @@ acpi_boot_init (void)
return
error
;
}
(
void
)
acpi_table_parse
(
ACPI_BOOT
,
acpi_parse_sbf
);
acpi_table_parse
(
ACPI_BOOT
,
acpi_parse_sbf
);
/*
* blacklist may disable ACPI entirely
...
...
@@ -683,19 +689,9 @@ acpi_boot_init (void)
*/
acpi_process_madt
();
#ifdef CONFIG_X86_PM_TIMER
acpi_table_parse
(
ACPI_FADT
,
acpi_parse_fadt
);
#endif
#ifdef CONFIG_HPET_TIMER
(
void
)
acpi_table_parse
(
ACPI_HPET
,
acpi_parse_hpet
);
#endif
#ifdef CONFIG_PCI_MMCONFIG
error
=
acpi_table_parse
(
ACPI_MCFG
,
acpi_parse_mcfg
);
if
(
error
)
printk
(
KERN_ERR
PREFIX
"Error %d parsing MCFG
\n
"
,
error
);
#endif
acpi_table_parse
(
ACPI_HPET
,
acpi_parse_hpet
);
acpi_table_parse
(
ACPI_MCFG
,
acpi_parse_mcfg
);
return
0
;
}
...
...
arch/i386/kernel/bootflag.c
View file @
47b6ac1d
...
...
@@ -48,7 +48,7 @@ static void __init sbf_write(u8 v)
if
(
!
parity
(
v
))
v
|=
SBF_PARITY
;
printk
(
KERN_INFO
"Simple Boot Flag
0x%x
\n
"
,
v
);
printk
(
KERN_INFO
"Simple Boot Flag
at 0x%x set to 0x%x
\n
"
,
sbf_port
,
v
);
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
CMOS_WRITE
(
v
,
sbf_port
);
...
...
drivers/acpi/dispatcher/dsmethod.c
View file @
47b6ac1d
...
...
@@ -106,7 +106,7 @@ acpi_ds_parse_method (
/* Create a mutex for the method if there is a concurrency limit */
if
((
obj_desc
->
method
.
concurrency
!=
INFINITE_CONCURRENCY
)
&&
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
,
...
...
@@ -300,34 +300,37 @@ acpi_ds_call_control_method (
return_ACPI_STATUS
(
status
);
}
/* 1) Parse: Create a new walk state for the preempting walk */
if
(
!
(
obj_desc
->
method
.
method_flags
&
AML_METHOD_INTERNAL_ONLY
))
{
/* 1) Parse: Create a new walk state for the preempting walk */
next_walk_state
=
acpi_ds_create_walk_state
(
obj_desc
->
method
.
owning_id
,
op
,
obj_desc
,
NULL
);
if
(
!
next_walk_state
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
next_walk_state
=
acpi_ds_create_walk_state
(
obj_desc
->
method
.
owning_id
,
op
,
obj_desc
,
NULL
);
if
(
!
next_walk_state
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
/* Create and init a Root Node */
op
=
acpi_ps_create_scope_op
();
if
(
!
op
)
{
status
=
AE_NO_MEMORY
;
goto
cleanup
;
}
/* Create and init a Root Node */
status
=
acpi_ds_init_aml_walk
(
next_walk_state
,
op
,
method_node
,
obj_desc
->
method
.
aml_start
,
obj_desc
->
method
.
aml_length
,
NULL
,
NULL
,
1
);
if
(
ACPI_FAILURE
(
status
))
{
acpi_ds_delete_walk_state
(
next_walk_state
);
goto
cleanup
;
}
op
=
acpi_ps_create_scope_op
();
if
(
!
op
)
{
status
=
AE_NO_MEMORY
;
goto
cleanup
;
}
status
=
acpi_ds_init_aml_walk
(
next_walk_state
,
op
,
method_node
,
obj_desc
->
method
.
aml_start
,
obj_desc
->
method
.
aml_length
,
NULL
,
NULL
,
1
);
if
(
ACPI_FAILURE
(
status
))
{
acpi_ds_delete_walk_state
(
next_walk_state
);
goto
cleanup
;
}
/* Begin AML parse */
/* Begin AML parse */
status
=
acpi_ps_parse_aml
(
next_walk_state
);
acpi_ps_delete_parse_tree
(
op
);
status
=
acpi_ps_parse_aml
(
next_walk_state
);
acpi_ps_delete_parse_tree
(
op
);
}
/* 2) Execute: Create a new state for the preempting walk */
...
...
@@ -337,7 +340,6 @@ acpi_ds_call_control_method (
status
=
AE_NO_MEMORY
;
goto
cleanup
;
}
/*
* The resolved arguments were put on the previous walk state's operand
* stack. Operands on the previous walk state stack always
...
...
@@ -369,16 +371,25 @@ acpi_ds_call_control_method (
ACPI_DEBUG_PRINT
((
ACPI_DB_DISPATCH
,
"Starting nested execution, newstate=%p
\n
"
,
next_walk_state
));
if
(
obj_desc
->
method
.
method_flags
&
AML_METHOD_INTERNAL_ONLY
)
{
status
=
obj_desc
->
method
.
implementation
(
next_walk_state
);
return_ACPI_STATUS
(
status
);
}
return_ACPI_STATUS
(
AE_OK
);
/* On error, we must delete the new walk state */
cleanup:
if
(
next_walk_state
->
method_desc
)
{
/* Decrement the thread count on the method parse tree */
next_walk_state
->
method_desc
->
method
.
thread_count
--
;
}
(
void
)
acpi_ds_terminate_control_method
(
next_walk_state
);
acpi_ds_delete_walk_state
(
next_walk_state
);
return_ACPI_STATUS
(
status
);
}
...
...
@@ -500,10 +511,30 @@ acpi_ds_terminate_control_method (
}
}
/* Decrement the thread count on the method parse tree */
if
(
walk_state
->
method_desc
->
method
.
thread_count
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_DISPATCH
,
"*** Not deleting method namespace, there are still %d threads
\n
"
,
walk_state
->
method_desc
->
method
.
thread_count
));
}
walk_state
->
method_desc
->
method
.
thread_count
--
;
if
(
!
walk_state
->
method_desc
->
method
.
thread_count
)
{
/*
* Support to dynamically change a method from not_serialized to
* Serialized if it appears that the method is written foolishly and
* 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
((
walk_state
->
method_desc
->
method
.
concurrency
==
1
)
&&
(
!
walk_state
->
method_desc
->
method
.
semaphore
))
{
status
=
acpi_os_create_semaphore
(
1
,
1
,
&
walk_state
->
method_desc
->
method
.
semaphore
);
}
/*
* There are no more threads executing this method. Perform
* additional cleanup.
...
...
drivers/acpi/events/evgpe.c
View file @
47b6ac1d
...
...
@@ -149,6 +149,11 @@ acpi_ev_gpe_detect (
ACPI_FUNCTION_NAME
(
"ev_gpe_detect"
);
/* Check for the case where there are no GPEs */
if
(
!
gpe_xrupt_list
)
{
return
(
int_status
);
}
/* Examine all GPE blocks attached to this interrupt level */
...
...
drivers/acpi/executer/excreate.c
View file @
47b6ac1d
...
...
@@ -587,27 +587,33 @@ acpi_ex_create_method (
obj_desc
->
method
.
aml_start
=
aml_start
;
obj_desc
->
method
.
aml_length
=
aml_length
;
/* disassemble the method flags */
/*
* Disassemble the method flags. Split off the Arg Count
* for efficiency
*/
method_flags
=
(
u8
)
operand
[
1
]
->
integer
.
value
;
obj_desc
->
method
.
method_flags
=
method_flags
;
obj_desc
->
method
.
param_count
=
(
u8
)
(
method_flags
&
METHOD_FLAGS
_ARG_COUNT
);
obj_desc
->
method
.
method_flags
=
(
u8
)
(
method_flags
&
~
AML_METHOD_ARG_COUNT
)
;
obj_desc
->
method
.
param_count
=
(
u8
)
(
method_flags
&
AML_METHOD
_ARG_COUNT
);
/*
* Get the concurrency count. If required, a semaphore will be
* created for this method when it is parsed.
*/
if
(
method_flags
&
METHOD_FLAGS_SERIALIZED
)
{
if
(
acpi_gbl_all_methods_serialized
)
{
obj_desc
->
method
.
concurrency
=
1
;
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)
*/
obj_desc
->
method
.
concurrency
=
(
u8
)
(((
method_flags
&
METHOD_FLAGS
_SYNCH_LEVEL
)
>>
4
)
+
1
);
(((
method_flags
&
AML_METHOD
_SYNCH_LEVEL
)
>>
4
)
+
1
);
}
else
{
obj_desc
->
method
.
concurrency
=
INFINITE_CONCURRENCY
;
obj_desc
->
method
.
concurrency
=
ACPI_
INFINITE_CONCURRENCY
;
}
/* Attach the new object to the method Node */
...
...
drivers/acpi/executer/exmutex.c
View file @
47b6ac1d
...
...
@@ -176,15 +176,18 @@ acpi_ex_acquire_mutex (
/*
* Support for multiple acquires by the owning thread
*/
if
((
obj_desc
->
mutex
.
owner_thread
)
&&
(
obj_desc
->
mutex
.
owner_thread
->
thread_id
==
walk_state
->
thread
->
thread_id
))
{
/*
* The mutex is already owned by this thread,
* just increment the acquisition depth
*/
obj_desc
->
mutex
.
acquisition_depth
++
;
return_ACPI_STATUS
(
AE_OK
);
if
(
obj_desc
->
mutex
.
owner_thread
)
{
/* Special case for Global Lock, allow all threads */
if
((
obj_desc
->
mutex
.
owner_thread
->
thread_id
==
walk_state
->
thread
->
thread_id
)
||
(
obj_desc
->
mutex
.
semaphore
==
acpi_gbl_global_lock_semaphore
))
{
/*
* The mutex is already owned by this thread,
* just increment the acquisition depth
*/
obj_desc
->
mutex
.
acquisition_depth
++
;
return_ACPI_STATUS
(
AE_OK
);
}
}
/* Acquire the mutex, wait if necessary */
...
...
@@ -254,9 +257,12 @@ acpi_ex_release_mutex (
return_ACPI_STATUS
(
AE_AML_INTERNAL
);
}
/* The Mutex is owned, but this thread must be the owner */
if
(
obj_desc
->
mutex
.
owner_thread
->
thread_id
!=
walk_state
->
thread
->
thread_id
)
{
/*
* The Mutex is owned, but this thread must be the owner.
* Special case for Global Lock, any thread can release
*/
if
((
obj_desc
->
mutex
.
owner_thread
->
thread_id
!=
walk_state
->
thread
->
thread_id
)
&&
(
obj_desc
->
mutex
.
semaphore
!=
acpi_gbl_global_lock_semaphore
))
{
ACPI_REPORT_ERROR
((
"Thread %X cannot release Mutex [%4.4s] acquired by thread %X
\n
"
,
walk_state
->
thread
->
thread_id
,
...
...
drivers/acpi/hardware/hwsleep.c
View file @
47b6ac1d
...
...
@@ -394,7 +394,7 @@ acpi_enter_sleep_state (
*
******************************************************************************/
acpi_status
acpi_status
asmlinkage
acpi_enter_sleep_state_s4bios
(
void
)
{
...
...
drivers/acpi/namespace/nsaccess.c
View file @
47b6ac1d
...
...
@@ -105,8 +105,15 @@ acpi_ns_root_initialize (void)
"Entering predefined entries into namespace
\n
"
));
for
(
init_val
=
acpi_gbl_pre_defined_names
;
init_val
->
name
;
init_val
++
)
{
/* _OSI is optional for now, will be permanent later */
if
(
!
ACPI_STRCMP
(
init_val
->
name
,
"_OSI"
)
&&
!
acpi_gbl_create_osi_method
)
{
continue
;
}
status
=
acpi_ns_lookup
(
NULL
,
init_val
->
name
,
init_val
->
type
,
ACPI_IMODE_LOAD_PASS2
,
ACPI_NS_NO_UPSEARCH
,
NULL
,
&
new_node
);
ACPI_IMODE_LOAD_PASS2
,
ACPI_NS_NO_UPSEARCH
,
NULL
,
&
new_node
);
if
(
ACPI_FAILURE
(
status
)
||
(
!
new_node
))
/* Must be on same line for code converter */
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
...
...
@@ -122,7 +129,8 @@ acpi_ns_root_initialize (void)
if
(
init_val
->
val
)
{
status
=
acpi_os_predefined_override
(
init_val
,
&
val
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Could not override predefined %s
\n
"
,
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Could not override predefined %s
\n
"
,
init_val
->
name
));
}
...
...
@@ -147,15 +155,20 @@ acpi_ns_root_initialize (void)
*/
switch
(
init_val
->
type
)
{
case
ACPI_TYPE_METHOD
:
obj_desc
->
method
.
param_count
=
(
u8
)
ACPI_STRTOUL
(
val
,
NULL
,
10
);
obj_desc
->
method
.
param_count
=
(
u8
)
ACPI_STRTOUL
(
val
,
NULL
,
10
);
obj_desc
->
common
.
flags
|=
AOPOBJ_DATA_VALID
;
#if defined (
ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY
)
#if defined (
_ACPI_ASL_COMPILER) || defined (_ACPI_DUMP_App
)
/* Compiler cheats by putting parameter count in the owner_iD */
/*
i_aSL
Compiler cheats by putting parameter count in the owner_iD */
new_node
->
owner_id
=
obj_desc
->
method
.
param_count
;
#else
/* Mark this as a very SPECIAL method */
obj_desc
->
method
.
method_flags
=
AML_METHOD_INTERNAL_ONLY
;
obj_desc
->
method
.
implementation
=
acpi_ut_osi_implementation
;
#endif
break
;
...
...
@@ -180,8 +193,8 @@ acpi_ns_root_initialize (void)
case
ACPI_TYPE_MUTEX
:
obj_desc
->
mutex
.
node
=
new_node
;
obj_desc
->
mutex
.
sync_level
=
(
u16
)
ACPI_STRTOUL
(
val
,
NULL
,
10
);
obj_desc
->
mutex
.
sync_level
=
(
u16
)
ACPI_STRTOUL
(
val
,
NULL
,
10
);
if
(
ACPI_STRCMP
(
init_val
->
name
,
"_GL_"
)
==
0
)
{
/*
...
...
@@ -213,6 +226,7 @@ acpi_ns_root_initialize (void)
default:
ACPI_REPORT_ERROR
((
"Unsupported initial type value %X
\n
"
,
init_val
->
type
));
acpi_ut_remove_reference
(
obj_desc
);
...
...
drivers/acpi/namespace/nsalloc.c
View file @
47b6ac1d
...
...
@@ -334,10 +334,11 @@ acpi_ns_install_node (
node
->
owner_id
=
owner_id
;
node
->
type
=
(
u8
)
type
;
ACPI_DEBUG_PRINT
((
ACPI_DB_NAMES
,
"%4.4s (%s) added to %4.4s (%s) %p at %p
\n
"
,
acpi_ut_get_node_name
(
node
),
acpi_ut_get_type_name
(
node
->
type
),
ACPI_DEBUG_PRINT
((
ACPI_DB_NAMES
,
"%4.4s (%s) [Node %p Owner %X] added to %4.4s (%s) [Node %p]
\n
"
,
acpi_ut_get_node_name
(
node
),
acpi_ut_get_type_name
(
node
->
type
),
node
,
owner_id
,
acpi_ut_get_node_name
(
parent_node
),
acpi_ut_get_type_name
(
parent_node
->
type
),
parent_node
,
node
));
parent_node
));
/*
* Increment the reference count(s) of all parents up to
...
...
drivers/acpi/namespace/nseval.c
View file @
47b6ac1d
...
...
@@ -82,11 +82,11 @@ acpi_ns_evaluate_relative (
union
acpi_operand_object
**
params
,
union
acpi_operand_object
**
return_object
)
{
struct
acpi_namespace_node
*
prefix_node
;
acpi_status
status
;
struct
acpi_namespace_node
*
prefix_node
;
struct
acpi_namespace_node
*
node
=
NULL
;
union
acpi_generic_state
*
scope_info
;
char
*
internal_path
=
NULL
;
union
acpi_generic_state
scope_info
;
ACPI_FUNCTION_TRACE
(
"ns_evaluate_relative"
);
...
...
@@ -106,6 +106,11 @@ acpi_ns_evaluate_relative (
return_ACPI_STATUS
(
status
);
}
scope_info
=
acpi_ut_create_generic_state
();
if
(
!
scope_info
)
{
goto
cleanup1
;
}
/* Get the prefix handle and Node */
status
=
acpi_ut_acquire_mutex
(
ACPI_MTX_NAMESPACE
);
...
...
@@ -122,8 +127,8 @@ acpi_ns_evaluate_relative (
/* Lookup the name in the namespace */
scope_info
.
scope
.
node
=
prefix_node
;
status
=
acpi_ns_lookup
(
&
scope_info
,
internal_path
,
ACPI_TYPE_ANY
,
scope_info
->
scope
.
node
=
prefix_node
;
status
=
acpi_ns_lookup
(
scope_info
,
internal_path
,
ACPI_TYPE_ANY
,
ACPI_IMODE_EXECUTE
,
ACPI_NS_NO_UPSEARCH
,
NULL
,
&
node
);
...
...
@@ -148,7 +153,9 @@ acpi_ns_evaluate_relative (
pathname
));
cleanup:
acpi_ut_delete_generic_state
(
scope_info
);
cleanup1:
ACPI_MEM_FREE
(
internal_path
);
return_ACPI_STATUS
(
status
);
}
...
...
drivers/acpi/osl.c
View file @
47b6ac1d
...
...
@@ -1012,3 +1012,39 @@ acpi_os_name_setup(char *str)
}
__setup
(
"acpi_os_name="
,
acpi_os_name_setup
);
/*
* _OSI control
* empty string disables _OSI
* TBD additional string adds to _OSI
*/
int
__init
acpi_osi_setup
(
char
*
str
)
{
if
(
str
==
NULL
||
*
str
==
'\0'
)
{
printk
(
KERN_INFO
PREFIX
"_OSI method disabled
\n
"
);
acpi_gbl_create_osi_method
=
FALSE
;
}
else
{
/* TBD */
printk
(
KERN_ERR
PREFIX
"_OSI additional string ignored -- %s
\n
"
,
str
);
}
return
1
;
}
__setup
(
"acpi_osi="
,
acpi_osi_setup
);
/* enable serialization to combat AE_ALREADY_EXISTS errors */
int
__init
acpi_serialize_setup
(
char
*
str
)
{
printk
(
KERN_INFO
PREFIX
"serialize enabled
\n
"
);
acpi_gbl_all_methods_serialized
=
TRUE
;
return
1
;
}
__setup
(
"acpi_serialize"
,
acpi_serialize_setup
);
drivers/acpi/parser/psparse.c
View file @
47b6ac1d
...
...
@@ -426,7 +426,7 @@ acpi_ps_parse_loop (
acpi_status
status
=
AE_OK
;
union
acpi_parse_object
*
op
=
NULL
;
/* current op */
union
acpi_parse_object
*
arg
=
NULL
;
union
acpi_parse_object
pre_op
;
union
acpi_parse_object
*
pre_op
=
NULL
;
struct
acpi_parse_state
*
parser_state
;
u8
*
aml_op_start
=
NULL
;
...
...
@@ -547,8 +547,17 @@ acpi_ps_parse_loop (
/* Create Op structure and append to parent's argument list */
if
(
walk_state
->
op_info
->
flags
&
AML_NAMED
)
{
pre_op
.
common
.
value
.
arg
=
NULL
;
pre_op
.
common
.
aml_opcode
=
walk_state
->
opcode
;
/* Allocate a new pre_op if necessary */
if
(
!
pre_op
)
{
pre_op
=
acpi_ps_alloc_op
(
walk_state
->
opcode
);
if
(
!
pre_op
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
}
pre_op
->
common
.
value
.
arg
=
NULL
;
pre_op
->
common
.
aml_opcode
=
walk_state
->
opcode
;
/*
* Get and append arguments until we find the node that contains
...
...
@@ -562,7 +571,7 @@ acpi_ps_parse_loop (
goto
close_this_op
;
}
acpi_ps_append_arg
(
&
pre_op
,
arg
);
acpi_ps_append_arg
(
pre_op
,
arg
);
INCREMENT_ARG_LIST
(
walk_state
->
arg_types
);
}
...
...
@@ -603,7 +612,7 @@ acpi_ps_parse_loop (
goto
close_this_op
;
}
acpi_ps_append_arg
(
op
,
pre_op
.
common
.
value
.
arg
);
acpi_ps_append_arg
(
op
,
pre_op
->
common
.
value
.
arg
);
acpi_gbl_depth
++
;
if
(
op
->
common
.
aml_opcode
==
AML_REGION_OP
)
{
...
...
@@ -854,6 +863,10 @@ acpi_ps_parse_loop (
acpi_ps_complete_this_op
(
walk_state
,
op
);
op
=
NULL
;
if
(
pre_op
)
{
acpi_ps_free_op
(
pre_op
);
pre_op
=
NULL
;
}
switch
(
status
)
{
case
AE_OK
:
...
...
@@ -1118,6 +1131,27 @@ acpi_ps_parse_aml (
else
if
(
status
!=
AE_OK
)
{
ACPI_REPORT_METHOD_ERROR
(
"Method execution failed"
,
walk_state
->
method_node
,
NULL
,
status
);
/* Check for possible multi-thread reentrancy problem */
if
((
status
==
AE_ALREADY_EXISTS
)
&&
(
!
walk_state
->
method_desc
->
method
.
semaphore
))
{
/*
* This method is marked not_serialized, but it tried to create a named
* object, causing the second thread entrance to fail. We will workaround
* this by marking the method permanently as Serialized.
*/
walk_state
->
method_desc
->
method
.
method_flags
|=
AML_METHOD_SERIALIZED
;
walk_state
->
method_desc
->
method
.
concurrency
=
1
;
}
}
if
(
walk_state
->
method_desc
)
{
/* Decrement the thread count on the method parse tree */
if
(
walk_state
->
method_desc
->
method
.
thread_count
)
{
walk_state
->
method_desc
->
method
.
thread_count
--
;
}
}
/* We are done with this walk, move on to the parent if any */
...
...
drivers/acpi/parser/psscope.c
View file @
47b6ac1d
...
...
@@ -167,7 +167,6 @@ acpi_ps_push_scope (
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
scope
->
common
.
data_type
=
ACPI_DESC_TYPE_STATE_PSCOPE
;
scope
->
parse_scope
.
op
=
op
;
scope
->
parse_scope
.
arg_list
=
remaining_args
;
...
...
@@ -178,13 +177,11 @@ acpi_ps_push_scope (
acpi_ut_push_generic_state
(
&
parser_state
->
scope
,
scope
);
if
(
arg_count
==
ACPI_VAR_ARGS
)
{
/* multiple arguments */
scope
->
parse_scope
.
arg_end
=
parser_state
->
pkg_end
;
}
else
{
/* single argument */
...
...
@@ -241,7 +238,6 @@ acpi_ps_pop_scope (
acpi_ut_delete_generic_state
(
scope
);
}
else
{
/* empty parse stack, prepare to fetch next opcode */
...
...
@@ -250,7 +246,6 @@ acpi_ps_pop_scope (
*
arg_count
=
0
;
}
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"Popped Op %p Args %X
\n
"
,
*
op
,
*
arg_count
));
return_VOID
;
}
...
...
@@ -275,14 +270,14 @@ acpi_ps_cleanup_scope (
{
union
acpi_generic_state
*
scope
;
ACPI_FUNCTION_TRACE_PTR
(
"ps_cleanup_scope"
,
parser_state
);
if
(
!
parser_state
)
{
return
;
return
_VOID
;
}
/* Delete anything on the scope stack */
while
(
parser_state
->
scope
)
{
...
...
drivers/acpi/power.c
View file @
47b6ac1d
...
...
@@ -23,6 +23,18 @@
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
/*
* ACPI power-managed devices may be controlled in two ways:
* 1. via "Device Specific (D-State) Control"
* 2. via "Power Resource Control".
* This module is used to manage devices relying on Power Resource Control.
*
* An ACPI "power resource object" describes a software controllable power
* plane, clock plane, or other resource used by a power managed device.
* A device may rely on multiple power resources, and a power resource
* may be shared by multiple devices.
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
...
...
drivers/acpi/sleep/poweroff.c
View file @
47b6ac1d
...
...
@@ -8,11 +8,14 @@
#include <linux/pm.h>
#include <linux/init.h>
#include <acpi/acpi_bus.h>
#include <linux/sched.h>
static
void
acpi_power_off
(
void
)
{
printk
(
"%s called
\n
"
,
__FUNCTION__
);
/* Some SMP machines only can poweroff in boot CPU */
set_cpus_allowed
(
current
,
cpumask_of_cpu
(
0
));
acpi_enter_sleep_state_prep
(
ACPI_STATE_S5
);
ACPI_DISABLE_IRQS
();
acpi_enter_sleep_state
(
ACPI_STATE_S5
);
...
...
drivers/acpi/tables.c
View file @
47b6ac1d
...
...
@@ -386,8 +386,13 @@ acpi_table_parse (
for
(
i
=
0
;
i
<
sdt_count
;
i
++
)
{
if
(
sdt_entry
[
i
].
id
!=
id
)
continue
;
handler
(
sdt_entry
[
i
].
pa
,
sdt_entry
[
i
].
size
);
count
++
;
if
(
count
==
1
)
handler
(
sdt_entry
[
i
].
pa
,
sdt_entry
[
i
].
size
);
else
printk
(
KERN_WARNING
PREFIX
"%d duplicate %s table ignored.
\n
"
,
count
,
acpi_table_signatures
[
id
]);
}
return
count
;
...
...
drivers/acpi/utilities/uteval.c
View file @
47b6ac1d
...
...
@@ -51,6 +51,62 @@
ACPI_MODULE_NAME
(
"uteval"
)
/*******************************************************************************
*
* FUNCTION: acpi_ut_osi_implementation
*
* PARAMETERS: walk_state - Current walk state
*
* RETURN: Status
*
* DESCRIPTION: Implementation of _OSI predefined control method
* Supported = _OSI (String)
*
******************************************************************************/
acpi_status
acpi_ut_osi_implementation
(
struct
acpi_walk_state
*
walk_state
)
{
union
acpi_operand_object
*
string_desc
;
union
acpi_operand_object
*
return_desc
;
acpi_native_uint
i
;
ACPI_FUNCTION_TRACE
(
"ut_osi_implementation"
);
/* Validate the string input argument */
string_desc
=
walk_state
->
arguments
[
0
].
object
;
if
(
!
string_desc
||
(
string_desc
->
common
.
type
!=
ACPI_TYPE_STRING
))
{
return_ACPI_STATUS
(
AE_TYPE
);
}
/* Create a return object (Default value = 0) */
return_desc
=
acpi_ut_create_internal_object
(
ACPI_TYPE_INTEGER
);
if
(
!
return_desc
)
{
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
/* Compare input string to table of supported strings */
for
(
i
=
0
;
i
<
ACPI_NUM_OSI_STRINGS
;
i
++
)
{
if
(
!
ACPI_STRCMP
(
string_desc
->
string
.
pointer
,
(
char
*
)
acpi_gbl_valid_osi_strings
[
i
]))
{
/* This string is supported */
return_desc
->
integer
.
value
=
0xFFFFFFFF
;
break
;
}
}
walk_state
->
return_desc
=
return_desc
;
return_ACPI_STATUS
(
AE_CTRL_TERMINATE
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ut_evaluate_object
...
...
drivers/acpi/utilities/utglobal.c
View file @
47b6ac1d
...
...
@@ -185,6 +185,15 @@ const char *acpi_gbl_highest_dstate_names[4] = {
"_S3D"
,
"_S4D"
};
/* Strings supported by the _OSI predefined (internal) method */
const
char
*
acpi_gbl_valid_osi_strings
[
ACPI_NUM_OSI_STRINGS
]
=
{
"Linux"
,
"Windows 2000"
,
"Windows 2001"
,
"Windows 2001.1"
};
/******************************************************************************
*
* Namespace globals
...
...
@@ -195,14 +204,10 @@ const char *acpi_gbl_highest_dstate_names[4] = {
/*
* Predefined ACPI Names (Built-in to the Interpreter)
*
* Initial values are currently supported only for types String and Number.
* Both are specified as strings in this table.
*
* NOTES:
* 1) _SB_ is defined to be a device to allow
_SB_/
_INI to be run
* 1) _SB_ is defined to be a device to allow
\_SB_.
_INI to be run
* during the initialization sequence.
*/
const
struct
acpi_predefined_names
acpi_gbl_pre_defined_names
[]
=
{
{
"_GPE"
,
ACPI_TYPE_LOCAL_SCOPE
,
NULL
},
{
"_PR_"
,
ACPI_TYPE_LOCAL_SCOPE
,
NULL
},
...
...
@@ -213,7 +218,7 @@ const struct acpi_predefined_names acpi_gbl_pre_defined_names[] =
{
"_OS_"
,
ACPI_TYPE_STRING
,
ACPI_OS_NAME
},
{
"_GL_"
,
ACPI_TYPE_MUTEX
,
"0"
},
#if defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
#if
!
defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
{
"_OSI"
,
ACPI_TYPE_METHOD
,
"1"
},
#endif
{
NULL
,
ACPI_TYPE_ANY
,
NULL
}
/* Table terminator */
...
...
@@ -224,7 +229,6 @@ const struct acpi_predefined_names acpi_gbl_pre_defined_names[] =
* Properties of the ACPI Object Types, both internal and external.
* The table is indexed by values of acpi_object_type
*/
const
u8
acpi_gbl_ns_properties
[]
=
{
ACPI_NS_NORMAL
,
/* 00 Any */
...
...
@@ -303,10 +307,8 @@ acpi_ut_hex_to_ascii_char (
*
******************************************************************************/
struct
acpi_table_list
acpi_gbl_table_lists
[
NUM_ACPI_TABLE_TYPES
];
struct
acpi_table_support
acpi_gbl_table_data
[
NUM_ACPI_TABLE_TYPES
]
=
{
/*********** Name, Signature, Global typed pointer Signature size, Type How many allowed?, Contains valid AML? */
...
...
@@ -470,9 +472,8 @@ acpi_ut_get_event_name (
*
* The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching; when
* stored in a table it really means that we have thus far seen no evidence to
* indicatewhat type is actually going to be stored for this entry.
* indicate
what type is actually going to be stored for this entry.
*/
static
const
char
acpi_gbl_bad_type
[]
=
"UNDEFINED"
;
#define TYPE_NAME_LENGTH 12
/* Maximum length of each string */
...
...
@@ -777,6 +778,11 @@ acpi_ut_init_globals (
ACPI_FUNCTION_TRACE
(
"ut_init_globals"
);
/* Runtime configuration */
acpi_gbl_create_osi_method
=
TRUE
;
acpi_gbl_all_methods_serialized
=
FALSE
;
/* Memory allocation and cache lists */
ACPI_MEMSET
(
acpi_gbl_memory_lists
,
0
,
sizeof
(
struct
acpi_memory_list
)
*
ACPI_NUM_MEM_LISTS
);
...
...
include/acpi/acconfig.h
View file @
47b6ac1d
...
...
@@ -64,7 +64,7 @@
/* Version string */
#define ACPI_CA_VERSION 0x20040
220
#define ACPI_CA_VERSION 0x20040
311
/* Maximum objects in the various object caches */
...
...
@@ -185,6 +185,10 @@
#define ACPI_SMBUS_BUFFER_SIZE 34
/* Number of strings associated with the _OSI reserved method */
#define ACPI_NUM_OSI_STRINGS 4
/******************************************************************************
*
...
...
include/acpi/acglobal.h
View file @
47b6ac1d
...
...
@@ -79,6 +79,14 @@ extern u32 acpi_dbg_layer;
extern
u32
acpi_gbl_nesting_level
;
/*****************************************************************************
*
* Runtime configuration
*
****************************************************************************/
ACPI_EXTERN
u8
acpi_gbl_create_osi_method
;
ACPI_EXTERN
u8
acpi_gbl_all_methods_serialized
;
/*****************************************************************************
*
...
...
@@ -169,6 +177,7 @@ extern const char *acpi_gbl_sleep_state_names[ACPI_
extern
const
char
*
acpi_gbl_highest_dstate_names
[
4
];
extern
const
struct
acpi_opcode_info
acpi_gbl_aml_op_info
[
AML_NUM_OPCODES
];
extern
const
char
*
acpi_gbl_region_types
[
ACPI_NUM_PREDEFINED_REGIONS
];
extern
const
char
*
acpi_gbl_valid_osi_strings
[
ACPI_NUM_OSI_STRINGS
];
/*****************************************************************************
...
...
@@ -179,7 +188,7 @@ extern const char *acpi_gbl_region_types[ACPI_NUM_P
#define NUM_NS_TYPES ACPI_TYPE_INVALID+1
#if defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
#if
!
defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
#define NUM_PREDEFINED_NAMES 10
#else
#define NUM_PREDEFINED_NAMES 9
...
...
include/acpi/acmacros.h
View file @
47b6ac1d
...
...
@@ -681,7 +681,4 @@
#endif
/* ACPI_DBG_TRACK_ALLOCATIONS */
#define ACPI_GET_STACK_POINTER _asm {mov eax, ebx}
#endif
/* ACMACROS_H */
include/acpi/acobject.h
View file @
47b6ac1d
...
...
@@ -180,7 +180,11 @@ struct acpi_object_event
};
#define INFINITE_CONCURRENCY 0xFF
#define ACPI_INFINITE_CONCURRENCY 0xFF
typedef
acpi_status
(
*
ACPI_INTERNAL_METHOD
)
(
struct
acpi_walk_state
*
walk_state
);
struct
acpi_object_method
{
...
...
@@ -190,6 +194,7 @@ struct acpi_object_method
u32
aml_length
;
void
*
semaphore
;
u8
*
aml_start
;
ACPI_INTERNAL_METHOD
implementation
;
u8
concurrency
;
u8
thread_count
;
acpi_owner_id
owning_id
;
...
...
include/acpi/acpixf.h
View file @
47b6ac1d
...
...
@@ -450,7 +450,7 @@ acpi_status asmlinkage
acpi_enter_sleep_state
(
u8
sleep_state
);
acpi_status
acpi_status
asmlinkage
acpi_enter_sleep_state_s4bios
(
void
);
...
...
include/acpi/actypes.h
View file @
47b6ac1d
...
...
@@ -349,7 +349,6 @@ typedef u64 acpi_integer;
/*
* Power state values
*/
#define ACPI_STATE_UNKNOWN (u8) 0xFF
#define ACPI_STATE_S0 (u8) 0
...
...
@@ -393,7 +392,6 @@ typedef u64 acpi_integer;
#define ACPI_NOTIFY_BUS_MODE_MISMATCH (u8) 6
#define ACPI_NOTIFY_POWER_FAULT (u8) 7
/*
* Table types. These values are passed to the table related APIs
*/
...
...
@@ -409,7 +407,6 @@ typedef u32 acpi_table_type;
#define ACPI_TABLE_MAX 6
#define NUM_ACPI_TABLE_TYPES (ACPI_TABLE_MAX+1)
/*
* Types associated with ACPI names and objects. The first group of
* values (up to ACPI_TYPE_EXTERNAL_MAX) correspond to the definition
...
...
@@ -794,7 +791,7 @@ acpi_status (*acpi_init_handler) (
#define ACPI_INIT_DEVICE_INI 1
/* Address Spaces (
Operation Regions
*/
/* Address Spaces (
For Operation Regions)
*/
typedef
acpi_status
(
*
acpi_adr_space_handler
)
(
...
...
include/acpi/acutils.h
View file @
47b6ac1d
...
...
@@ -52,7 +52,6 @@ acpi_status (*acpi_pkg_callback) (
union
acpi_generic_state
*
state
,
void
*
context
);
acpi_status
acpi_ut_walk_package_tree
(
union
acpi_operand_object
*
source_object
,
...
...
@@ -60,7 +59,6 @@ acpi_ut_walk_package_tree (
acpi_pkg_callback
walk_callback
,
void
*
context
);
struct
acpi_pkg_info
{
u8
*
free_space
;
...
...
@@ -475,6 +473,10 @@ acpi_ut_delete_internal_object_list (
#define METHOD_NAME__PRS "_PRS"
acpi_status
acpi_ut_osi_implementation
(
struct
acpi_walk_state
*
walk_state
);
acpi_status
acpi_ut_evaluate_object
(
struct
acpi_namespace_node
*
prefix_node
,
...
...
include/acpi/amlcode.h
View file @
47b6ac1d
...
...
@@ -496,11 +496,17 @@ typedef enum
}
AML_ACCESS_ATTRIBUTE
;
/*
b
it fields in method_flags byte */
/*
B
it fields in method_flags byte */
#define METHOD_FLAGS_ARG_COUNT 0x07
#define METHOD_FLAGS_SERIALIZED 0x08
#define METHOD_FLAGS_SYNCH_LEVEL 0xF0
#define AML_METHOD_ARG_COUNT 0x07
#define AML_METHOD_SERIALIZED 0x08
#define AML_METHOD_SYNCH_LEVEL 0xF0
/* METHOD_FLAGS_ARG_COUNT is not used internally, define additional flags */
#define AML_METHOD_INTERNAL_ONLY 0x01
#define AML_METHOD_RESERVED1 0x02
#define AML_METHOD_RESERVED2 0x04
#endif
/* __AMLCODE_H__ */
include/asm-i386/acpi.h
View file @
47b6ac1d
...
...
@@ -28,6 +28,8 @@
#ifdef __KERNEL__
#include <asm/system.h>
/* defines cmpxchg */
#define COMPILER_DEPENDENT_INT64 long long
#define COMPILER_DEPENDENT_UINT64 unsigned long long
...
...
@@ -61,33 +63,36 @@
* Immediate values in the assembly are preceded by "$" as in "$0x1"
* The final asm parameter are the operation altered non-output registers.
*/
static
inline
int
__acpi_acquire_global_lock
(
unsigned
int
*
lock
)
{
unsigned
int
old
,
new
,
val
;
do
{
old
=
*
lock
;
new
=
(((
old
&
~
0x3
)
+
2
)
+
((
old
>>
1
)
&
0x1
));
val
=
cmpxchg
(
lock
,
old
,
new
);
}
while
(
unlikely
(
val
!=
old
));
return
(
new
<
3
)
?
-
1
:
0
;
}
static
inline
int
__acpi_release_global_lock
(
unsigned
int
*
lock
)
{
unsigned
int
old
,
new
,
val
;
do
{
old
=
*
lock
;
new
=
old
&
~
0x3
;
val
=
cmpxchg
(
lock
,
old
,
new
);
}
while
(
unlikely
(
val
!=
old
));
return
old
&
0x1
;
}
#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
do { \
int dummy; \
asm("1: movl (%1),%%eax;" \
"movl %%eax,%%edx;" \
"andl %2,%%edx;" \
"btsl $0x1,%%edx;" \
"adcl $0x0,%%edx;" \
"lock; cmpxchgl %%edx,(%1);" \
"jnz 1b;" \
"cmpb $0x3,%%dl;" \
"sbbl %%eax,%%eax" \
:"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx"); \
} while(0)
((Acq) = __acpi_acquire_global_lock((unsigned int *) GLptr))
#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \
do { \
int dummy; \
asm("1: movl (%1),%%eax;" \
"movl %%eax,%%edx;" \
"andl %2,%%edx;" \
"lock; cmpxchgl %%edx,(%1);" \
"jnz 1b;" \
"andl $0x1,%%eax" \
:"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \
} while(0)
((Acq) = __acpi_release_global_lock((unsigned int *) GLptr))
/*
* Math helper asm macros
...
...
include/asm-x86_64/acpi.h
View file @
47b6ac1d
...
...
@@ -60,7 +60,7 @@ __acpi_acquire_global_lock (unsigned int *lock)
do
{
old
=
*
lock
;
new
=
(((
old
&
~
0x3
)
+
2
)
+
((
old
>>
1
)
&
0x1
));
val
=
cmpxchg
4_locked
(
lock
,
new
,
old
);
val
=
cmpxchg
(
lock
,
old
,
new
);
}
while
(
unlikely
(
val
!=
old
));
return
(
new
<
3
)
?
-
1
:
0
;
}
...
...
@@ -72,7 +72,7 @@ __acpi_release_global_lock (unsigned int *lock)
do
{
old
=
*
lock
;
new
=
old
&
~
0x3
;
val
=
cmpxchg
4_locked
(
lock
,
new
,
old
);
val
=
cmpxchg
(
lock
,
old
,
new
);
}
while
(
unlikely
(
val
!=
old
));
return
old
&
0x1
;
}
...
...
include/asm-x86_64/system.h
View file @
47b6ac1d
...
...
@@ -276,13 +276,6 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
(unsigned long)(n),sizeof(*(ptr))))
static
inline
__u32
cmpxchg4_locked
(
__u32
*
ptr
,
__u32
old
,
__u32
new
)
{
asm
volatile
(
"lock ; cmpxchgl %k1,%2"
:
"=r"
(
new
)
:
"0"
(
old
),
"m"
(
*
(
__u32
*
)
ptr
)
:
"memory"
);
return
new
;
}
#ifdef CONFIG_SMP
#define smp_mb() mb()
#define smp_rmb() rmb()
...
...
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