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
da3df858
Commit
da3df858
authored
Dec 24, 2009
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'pdc' into release
parents
309ddc53
e59897fe
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
114 additions
and
220 deletions
+114
-220
arch/ia64/include/asm/acpi.h
arch/ia64/include/asm/acpi.h
+6
-0
arch/ia64/kernel/Makefile
arch/ia64/kernel/Makefile
+0
-4
arch/ia64/kernel/acpi-processor.c
arch/ia64/kernel/acpi-processor.c
+0
-85
arch/x86/include/asm/acpi.h
arch/x86/include/asm/acpi.h
+26
-0
arch/x86/kernel/acpi/Makefile
arch/x86/kernel/acpi/Makefile
+1
-1
arch/x86/kernel/acpi/processor.c
arch/x86/kernel/acpi/processor.c
+0
-101
drivers/acpi/processor_core.c
drivers/acpi/processor_core.c
+1
-1
drivers/acpi/processor_pdc.c
drivers/acpi/processor_pdc.c
+79
-22
include/acpi/processor.h
include/acpi/processor.h
+1
-6
No files found.
arch/ia64/include/asm/acpi.h
View file @
da3df858
...
...
@@ -132,6 +132,12 @@ extern int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS];
extern
int
__initdata
nid_to_pxm_map
[
MAX_NUMNODES
];
#endif
static
inline
bool
arch_has_acpi_pdc
(
void
)
{
return
true
;
}
static
inline
void
arch_acpi_set_pdc_bits
(
u32
*
buf
)
{
buf
[
2
]
|=
ACPI_PDC_EST_CAPABILITY_SMP
;
}
#define acpi_unlazy_tlb(x)
#ifdef CONFIG_ACPI_NUMA
...
...
arch/ia64/kernel/Makefile
View file @
da3df858
...
...
@@ -18,10 +18,6 @@ obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o
obj-$(CONFIG_IA64_HP_ZX1)
+=
acpi-ext.o
obj-$(CONFIG_IA64_HP_ZX1_SWIOTLB)
+=
acpi-ext.o
ifneq
($(CONFIG_ACPI_PROCESSOR),)
obj-y
+=
acpi-processor.o
endif
obj-$(CONFIG_IA64_PALINFO)
+=
palinfo.o
obj-$(CONFIG_IOSAPIC)
+=
iosapic.o
obj-$(CONFIG_MODULES)
+=
module.o
...
...
arch/ia64/kernel/acpi-processor.c
deleted
100644 → 0
View file @
309ddc53
/*
* arch/ia64/kernel/acpi-processor.c
*
* Copyright (C) 2005 Intel Corporation
* Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
* - Added _PDC for platforms with Intel CPUs
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/acpi.h>
#include <acpi/processor.h>
#include <asm/acpi.h>
static
void
init_intel_pdc
(
struct
acpi_processor
*
pr
)
{
struct
acpi_object_list
*
obj_list
;
union
acpi_object
*
obj
;
u32
*
buf
;
/* allocate and initialize pdc. It will be used later. */
obj_list
=
kmalloc
(
sizeof
(
struct
acpi_object_list
),
GFP_KERNEL
);
if
(
!
obj_list
)
{
printk
(
KERN_ERR
"Memory allocation error
\n
"
);
return
;
}
obj
=
kmalloc
(
sizeof
(
union
acpi_object
),
GFP_KERNEL
);
if
(
!
obj
)
{
printk
(
KERN_ERR
"Memory allocation error
\n
"
);
kfree
(
obj_list
);
return
;
}
buf
=
kmalloc
(
12
,
GFP_KERNEL
);
if
(
!
buf
)
{
printk
(
KERN_ERR
"Memory allocation error
\n
"
);
kfree
(
obj
);
kfree
(
obj_list
);
return
;
}
buf
[
0
]
=
ACPI_PDC_REVISION_ID
;
buf
[
1
]
=
1
;
buf
[
2
]
=
ACPI_PDC_EST_CAPABILITY_SMP
;
/*
* The default of PDC_SMP_T_SWCOORD bit is set for IA64 cpu so
* that OSPM is capable of native ACPI throttling software
* coordination using BIOS supplied _TSD info.
*/
buf
[
2
]
|=
ACPI_PDC_SMP_T_SWCOORD
;
obj
->
type
=
ACPI_TYPE_BUFFER
;
obj
->
buffer
.
length
=
12
;
obj
->
buffer
.
pointer
=
(
u8
*
)
buf
;
obj_list
->
count
=
1
;
obj_list
->
pointer
=
obj
;
pr
->
pdc
=
obj_list
;
return
;
}
/* Initialize _PDC data based on the CPU vendor */
void
arch_acpi_processor_init_pdc
(
struct
acpi_processor
*
pr
)
{
pr
->
pdc
=
NULL
;
init_intel_pdc
(
pr
);
return
;
}
EXPORT_SYMBOL
(
arch_acpi_processor_init_pdc
);
void
arch_acpi_processor_cleanup_pdc
(
struct
acpi_processor
*
pr
)
{
if
(
pr
->
pdc
)
{
kfree
(
pr
->
pdc
->
pointer
->
buffer
.
pointer
);
kfree
(
pr
->
pdc
->
pointer
);
kfree
(
pr
->
pdc
);
pr
->
pdc
=
NULL
;
}
}
EXPORT_SYMBOL
(
arch_acpi_processor_cleanup_pdc
);
arch/x86/include/asm/acpi.h
View file @
da3df858
...
...
@@ -142,6 +142,32 @@ static inline unsigned int acpi_processor_cstate_check(unsigned int max_cstate)
return
max_cstate
;
}
static
inline
bool
arch_has_acpi_pdc
(
void
)
{
struct
cpuinfo_x86
*
c
=
&
cpu_data
(
0
);
return
(
c
->
x86_vendor
==
X86_VENDOR_INTEL
||
c
->
x86_vendor
==
X86_VENDOR_CENTAUR
);
}
static
inline
void
arch_acpi_set_pdc_bits
(
u32
*
buf
)
{
struct
cpuinfo_x86
*
c
=
&
cpu_data
(
0
);
buf
[
2
]
|=
ACPI_PDC_C_CAPABILITY_SMP
;
if
(
cpu_has
(
c
,
X86_FEATURE_EST
))
buf
[
2
]
|=
ACPI_PDC_EST_CAPABILITY_SWSMP
;
if
(
cpu_has
(
c
,
X86_FEATURE_ACPI
))
buf
[
2
]
|=
ACPI_PDC_T_FFH
;
/*
* If mwait/monitor is unsupported, C2/C3_FFH will be disabled
*/
if
(
!
cpu_has
(
c
,
X86_FEATURE_MWAIT
))
buf
[
2
]
&=
~
(
ACPI_PDC_C_C2C3_FFH
);
}
#else
/* !CONFIG_ACPI */
#define acpi_lapic 0
...
...
arch/x86/kernel/acpi/Makefile
View file @
da3df858
...
...
@@ -4,7 +4,7 @@ obj-$(CONFIG_ACPI) += boot.o
obj-$(CONFIG_ACPI_SLEEP)
+=
sleep.o wakeup_rm.o wakeup_
$(BITS)
.o
ifneq
($(CONFIG_ACPI_PROCESSOR),)
obj-y
+=
cstate.o
processor.o
obj-y
+=
cstate.o
endif
$(obj)/wakeup_rm.o
:
$(obj)/realmode/wakeup.bin
...
...
arch/x86/kernel/acpi/processor.c
deleted
100644 → 0
View file @
309ddc53
/*
* Copyright (C) 2005 Intel Corporation
* Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
* - Added _PDC for platforms with Intel CPUs
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/acpi.h>
#include <acpi/processor.h>
#include <asm/acpi.h>
static
void
init_intel_pdc
(
struct
acpi_processor
*
pr
,
struct
cpuinfo_x86
*
c
)
{
struct
acpi_object_list
*
obj_list
;
union
acpi_object
*
obj
;
u32
*
buf
;
/* allocate and initialize pdc. It will be used later. */
obj_list
=
kmalloc
(
sizeof
(
struct
acpi_object_list
),
GFP_KERNEL
);
if
(
!
obj_list
)
{
printk
(
KERN_ERR
"Memory allocation error
\n
"
);
return
;
}
obj
=
kmalloc
(
sizeof
(
union
acpi_object
),
GFP_KERNEL
);
if
(
!
obj
)
{
printk
(
KERN_ERR
"Memory allocation error
\n
"
);
kfree
(
obj_list
);
return
;
}
buf
=
kmalloc
(
12
,
GFP_KERNEL
);
if
(
!
buf
)
{
printk
(
KERN_ERR
"Memory allocation error
\n
"
);
kfree
(
obj
);
kfree
(
obj_list
);
return
;
}
buf
[
0
]
=
ACPI_PDC_REVISION_ID
;
buf
[
1
]
=
1
;
buf
[
2
]
=
ACPI_PDC_C_CAPABILITY_SMP
;
/*
* The default of PDC_SMP_T_SWCOORD bit is set for intel x86 cpu so
* that OSPM is capable of native ACPI throttling software
* coordination using BIOS supplied _TSD info.
*/
buf
[
2
]
|=
ACPI_PDC_SMP_T_SWCOORD
;
if
(
cpu_has
(
c
,
X86_FEATURE_EST
))
buf
[
2
]
|=
ACPI_PDC_EST_CAPABILITY_SWSMP
;
if
(
cpu_has
(
c
,
X86_FEATURE_ACPI
))
buf
[
2
]
|=
ACPI_PDC_T_FFH
;
/*
* If mwait/monitor is unsupported, C2/C3_FFH will be disabled
*/
if
(
!
cpu_has
(
c
,
X86_FEATURE_MWAIT
))
buf
[
2
]
&=
~
(
ACPI_PDC_C_C2C3_FFH
);
obj
->
type
=
ACPI_TYPE_BUFFER
;
obj
->
buffer
.
length
=
12
;
obj
->
buffer
.
pointer
=
(
u8
*
)
buf
;
obj_list
->
count
=
1
;
obj_list
->
pointer
=
obj
;
pr
->
pdc
=
obj_list
;
return
;
}
/* Initialize _PDC data based on the CPU vendor */
void
arch_acpi_processor_init_pdc
(
struct
acpi_processor
*
pr
)
{
struct
cpuinfo_x86
*
c
=
&
cpu_data
(
pr
->
id
);
pr
->
pdc
=
NULL
;
if
(
c
->
x86_vendor
==
X86_VENDOR_INTEL
||
c
->
x86_vendor
==
X86_VENDOR_CENTAUR
)
init_intel_pdc
(
pr
,
c
);
return
;
}
EXPORT_SYMBOL
(
arch_acpi_processor_init_pdc
);
void
arch_acpi_processor_cleanup_pdc
(
struct
acpi_processor
*
pr
)
{
if
(
pr
->
pdc
)
{
kfree
(
pr
->
pdc
->
pointer
->
buffer
.
pointer
);
kfree
(
pr
->
pdc
->
pointer
);
kfree
(
pr
->
pdc
);
pr
->
pdc
=
NULL
;
}
}
EXPORT_SYMBOL
(
arch_acpi_processor_cleanup_pdc
);
drivers/acpi/processor_core.c
View file @
da3df858
...
...
@@ -763,7 +763,7 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device)
}
/* _PDC call should be done before doing anything else (if reqd.). */
acpi_processor_set_pdc
(
pr
);
acpi_processor_set_pdc
(
pr
->
handle
);
#ifdef CONFIG_CPU_FREQ
acpi_processor_ppc_has_changed
(
pr
,
0
);
...
...
drivers/acpi/processor_pdc.c
View file @
da3df858
/*
* Copyright (C) 2005 Intel Corporation
* Copyright (C) 2009 Hewlett-Packard Development Company, L.P.
*
* Alex Chiang <achiang@hp.com>
* - Unified x86/ia64 implementations
* Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
* - Added _PDC for platforms with Intel CPUs
*/
#include <linux/dmi.h>
#include <acpi/acpi_drivers.h>
...
...
@@ -33,17 +42,66 @@ static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = {
{},
};
static
void
acpi_set_pdc_bits
(
u32
*
buf
)
{
buf
[
0
]
=
ACPI_PDC_REVISION_ID
;
buf
[
1
]
=
1
;
/* Enable coordination with firmware's _TSD info */
buf
[
2
]
=
ACPI_PDC_SMP_T_SWCOORD
;
/* Twiddle arch-specific bits needed for _PDC */
arch_acpi_set_pdc_bits
(
buf
);
}
static
struct
acpi_object_list
*
acpi_processor_alloc_pdc
(
void
)
{
struct
acpi_object_list
*
obj_list
;
union
acpi_object
*
obj
;
u32
*
buf
;
/* allocate and initialize pdc. It will be used later. */
obj_list
=
kmalloc
(
sizeof
(
struct
acpi_object_list
),
GFP_KERNEL
);
if
(
!
obj_list
)
{
printk
(
KERN_ERR
"Memory allocation error
\n
"
);
return
NULL
;
}
obj
=
kmalloc
(
sizeof
(
union
acpi_object
),
GFP_KERNEL
);
if
(
!
obj
)
{
printk
(
KERN_ERR
"Memory allocation error
\n
"
);
kfree
(
obj_list
);
return
NULL
;
}
buf
=
kmalloc
(
12
,
GFP_KERNEL
);
if
(
!
buf
)
{
printk
(
KERN_ERR
"Memory allocation error
\n
"
);
kfree
(
obj
);
kfree
(
obj_list
);
return
NULL
;
}
acpi_set_pdc_bits
(
buf
);
obj
->
type
=
ACPI_TYPE_BUFFER
;
obj
->
buffer
.
length
=
12
;
obj
->
buffer
.
pointer
=
(
u8
*
)
buf
;
obj_list
->
count
=
1
;
obj_list
->
pointer
=
obj
;
return
obj_list
;
}
/*
* _PDC is required for a BIOS-OS handshake for most of the newer
* ACPI processor features.
*/
static
int
acpi_processor_eval_pdc
(
struct
acpi_processor
*
pr
)
static
int
acpi_processor_eval_pdc
(
acpi_handle
handle
,
struct
acpi_object_list
*
pdc_in
)
{
struct
acpi_object_list
*
pdc_in
=
pr
->
pdc
;
acpi_status
status
=
AE_OK
;
if
(
!
pdc_in
)
return
status
;
if
(
idle_nomwait
)
{
/*
* If mwait is disabled for CPU C-states, the C2C3_FFH access
...
...
@@ -58,7 +116,7 @@ static int acpi_processor_eval_pdc(struct acpi_processor *pr)
buffer
[
2
]
&=
~
(
ACPI_PDC_C_C2C3_FFH
|
ACPI_PDC_C_C1_FFH
);
}
status
=
acpi_evaluate_object
(
pr
->
handle
,
"_PDC"
,
pdc_in
,
NULL
);
status
=
acpi_evaluate_object
(
handle
,
"_PDC"
,
pdc_in
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
...
...
@@ -67,30 +125,29 @@ static int acpi_processor_eval_pdc(struct acpi_processor *pr)
return
status
;
}
void
acpi_processor_set_pdc
(
struct
acpi_processor
*
pr
)
void
acpi_processor_set_pdc
(
acpi_handle
handle
)
{
arch_acpi_processor_init_pdc
(
pr
);
acpi_processor_eval_pdc
(
pr
);
arch_acpi_processor_cleanup_pdc
(
pr
);
struct
acpi_object_list
*
obj_list
;
if
(
arch_has_acpi_pdc
()
==
false
)
return
;
obj_list
=
acpi_processor_alloc_pdc
();
if
(
!
obj_list
)
return
;
acpi_processor_eval_pdc
(
handle
,
obj_list
);
kfree
(
obj_list
->
pointer
->
buffer
.
pointer
);
kfree
(
obj_list
->
pointer
);
kfree
(
obj_list
);
}
EXPORT_SYMBOL_GPL
(
acpi_processor_set_pdc
);
static
acpi_status
early_init_pdc
(
acpi_handle
handle
,
u32
lvl
,
void
*
context
,
void
**
rv
)
{
struct
acpi_processor
pr
;
pr
.
handle
=
handle
;
/* x86 implementation looks at pr.id to determine some
* CPU capabilites. We can just hard code to 0 since we're
* assuming the CPUs in the system are homogenous and all
* have the same capabilities.
*/
pr
.
id
=
0
;
acpi_processor_set_pdc
(
&
pr
);
acpi_processor_set_pdc
(
handle
);
return
AE_OK
;
}
...
...
include/acpi/processor.h
View file @
da3df858
...
...
@@ -224,8 +224,6 @@ struct acpi_processor {
struct
acpi_processor_throttling
throttling
;
struct
acpi_processor_limit
limit
;
struct
thermal_cooling_device
*
cdev
;
/* the _PDC objects for this processor, if any */
struct
acpi_object_list
*
pdc
;
};
struct
acpi_processor_errata
{
...
...
@@ -257,9 +255,6 @@ int acpi_processor_notify_smm(struct module *calling_module);
DECLARE_PER_CPU
(
struct
acpi_processor
*
,
processors
);
extern
struct
acpi_processor_errata
errata
;
void
arch_acpi_processor_init_pdc
(
struct
acpi_processor
*
pr
);
void
arch_acpi_processor_cleanup_pdc
(
struct
acpi_processor
*
pr
);
#ifdef ARCH_HAS_POWER_INIT
void
acpi_processor_power_init_bm_check
(
struct
acpi_processor_flags
*
flags
,
unsigned
int
cpu
);
...
...
@@ -326,7 +321,7 @@ static inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit)
#endif
/* CONFIG_CPU_FREQ */
/* in processor_pdc.c */
void
acpi_processor_set_pdc
(
struct
acpi_processor
*
pr
);
void
acpi_processor_set_pdc
(
acpi_handle
handle
);
/* in processor_throttling.c */
int
acpi_processor_tstate_has_changed
(
struct
acpi_processor
*
pr
);
...
...
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