# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1209979061 -3600
# Node ID e39cf97647af69cd0b09f4e91e539e26194b8a9f
# Parent 26c60aa94b9f715027cf32cf5163ae9305e1abd4
Isolate Xen PM related code in dom0 with #ifdef CONFIG_XEN to avoid
breaking native.
Signed-off-by: Wei Gang <gang.wei@xxxxxxxxx>
---
arch/i386/kernel/acpi/processor.c | 19 +++++++----
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | 2 +
drivers/acpi/processor_core.c | 45 ++++++++++++++++++++++++++++
drivers/acpi/processor_idle.c | 25 +++++++++++++++
drivers/acpi/processor_perflib.c | 8 +++-
include/acpi/processor.h | 8 +++-
6 files changed, 95 insertions(+), 12 deletions(-)
diff -r 26c60aa94b9f -r e39cf97647af arch/i386/kernel/acpi/processor.c
--- a/arch/i386/kernel/acpi/processor.c Mon May 05 10:14:25 2008 +0100
+++ b/arch/i386/kernel/acpi/processor.c Mon May 05 10:17:41 2008 +0100
@@ -59,16 +59,21 @@ static void init_intel_pdc(struct acpi_p
return;
}
-/*
- * Initialize _PDC data based on the CPU vendor. As a work-around, just
- * use cpu0's cpuinfo for all processors. Further work is required
- * to expose xen hypervisor interface of getting physical cpuinfo to dom0
- * kerneland then arch_acpi_processor_init_pdc can set _PDC parameters
- * according to Xen's phys information.
- */
+/* Initialize _PDC data based on the CPU vendor */
void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
{
+#ifdef CONFIG_XEN
+ /*
+ * As a work-around, just use cpu0's cpuinfo for all processors.
+ * Further work is required to expose xen hypervisor interface of
+ * getting physical cpuinfo to dom0 kernel and then
+ * arch_acpi_processor_init_pdc can set _PDC parameters according
+ * to Xen's phys information.
+ */
unsigned int cpu = 0;
+#else
+ unsigned int cpu = pr->id;
+#endif /* CONFIG_XEN */
struct cpuinfo_x86 *c = cpu_data + cpu;
pr->pdc = NULL;
diff -r 26c60aa94b9f -r e39cf97647af arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
--- a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c Mon May 05 10:14:25
2008 +0100
+++ b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c Mon May 05 10:17:41
2008 +0100
@@ -568,6 +568,7 @@ acpi_cpufreq_init (void)
{
dprintk("acpi_cpufreq_init\n");
+#ifdef CONFIG_XEN
/*
* This effectively blocks in-kernel cpufreq driver to interfere
* external control logic
@@ -576,6 +577,7 @@ acpi_cpufreq_init (void)
printk("CPUFREQ is controllerd externally...exit then!\n");
return -1;
}
+#endif /* CONFIG_XEN */
acpi_cpufreq_early_init_acpi();
diff -r 26c60aa94b9f -r e39cf97647af drivers/acpi/processor_core.c
--- a/drivers/acpi/processor_core.c Mon May 05 10:14:25 2008 +0100
+++ b/drivers/acpi/processor_core.c Mon May 05 10:17:41 2008 +0100
@@ -474,9 +474,14 @@ static int acpi_processor_get_info(struc
* they are physically not present.
*/
if (cpu_index == -1) {
+#ifdef CONFIG_XEN
if (ACPI_FAILURE
(acpi_processor_hotadd_init(pr->handle, &pr->id)) &&
!processor_cntl_external()) {
+#else
+ if (ACPI_FAILURE
+ (acpi_processor_hotadd_init(pr->handle, &pr->id))) {
+#endif /* CONFIG_XEN */
printk(KERN_ERR PREFIX
"Getting cpuindex for acpiid 0x%x\n",
pr->acpi_id);
@@ -518,7 +523,11 @@ static int acpi_processor_get_info(struc
return 0;
}
+#ifdef CONFIG_XEN
static void *processor_device_array[NR_ACPI_CPUS];
+#else
+static void *processor_device_array[NR_CPUS];
+#endif /* CONFIG_XEN */
static int acpi_processor_start(struct acpi_device *device)
{
@@ -530,29 +539,48 @@ static int acpi_processor_start(struct a
pr = acpi_driver_data(device);
result = acpi_processor_get_info(pr);
+#ifdef CONFIG_XEN
if (result ||
((pr->id == -1) && !processor_cntl_external())) {
+#else
+ if (result) {
+#endif /* CONFIG_XEN */
/* Processor is physically not present */
return 0;
}
+#ifdef CONFIG_XEN
BUG_ON(!processor_cntl_external() &&
((pr->id >= NR_CPUS) || (pr->id < 0)));
+#else
+ BUG_ON((pr->id >= NR_CPUS) || (pr->id < 0));
+#endif /* CONFIG_XEN */
/*
* Buggy BIOS check
* ACPI id of processors can be reported wrongly by the BIOS.
* Don't trust it blindly
*/
+#ifdef CONFIG_XEN
if (processor_device_array[pr->acpi_id] != NULL &&
processor_device_array[pr->acpi_id] != (void *)device) {
+#else
+ if (processor_device_array[pr->id] != NULL &&
+ processor_device_array[pr->id] != (void *)device) {
+#endif /* CONFIG_XEN */
printk(KERN_WARNING "BIOS reported wrong ACPI id"
"for the processor\n");
return -ENODEV;
}
+#ifdef CONFIG_XEN
processor_device_array[pr->acpi_id] = (void *)device;
if (pr->id != -1)
processors[pr->id] = pr;
+#else
+ processor_device_array[pr->id] = (void *)device;
+
+ processors[pr->id] = pr;
+#endif /* CONFIG_XEN */
result = acpi_processor_add_fs(device);
if (result)
@@ -663,8 +691,13 @@ static int acpi_processor_remove(struct
acpi_processor_remove_fs(device);
+#ifdef CONFIG_XEN
if (pr->id != -1)
processors[pr->id] = NULL;
+#else
+ processors[pr->id] = NULL;
+#endif /* CONFIG_XEN */
+
kfree(pr);
@@ -718,9 +751,11 @@ int acpi_processor_device_add(acpi_handl
if (!pr)
return -ENODEV;
+#ifdef CONFIG_XEN
if (processor_cntl_external())
processor_notify_external(pr,
PROCESSOR_HOTPLUG, HOTPLUG_TYPE_ADD);
+#endif /* CONFIG_XEN */
if ((pr->id >= 0) && (pr->id < NR_CPUS)) {
kobject_uevent(&(*device)->kobj, KOBJ_ONLINE);
@@ -760,9 +795,11 @@ acpi_processor_hotplug_notify(acpi_handl
break;
}
+#ifdef CONFIG_XEN
if (processor_cntl_external())
processor_notify_external(pr,
PROCESSOR_HOTPLUG, HOTPLUG_TYPE_ADD);
+#endif /* CONFIG_XEN */
if (pr->id >= 0 && (pr->id < NR_CPUS)) {
kobject_uevent(&device->kobj, KOBJ_OFFLINE);
@@ -793,13 +830,19 @@ acpi_processor_hotplug_notify(acpi_handl
return;
}
+#ifdef CONFIG_XEN
if ((pr->id >= 0) && (pr->id < NR_CPUS)
&& (cpu_present(pr->id)))
+#else
+ if ((pr->id < NR_CPUS) && (cpu_present(pr->id)))
+#endif /* CONFIG_XEN */
kobject_uevent(&device->kobj, KOBJ_OFFLINE);
+#ifdef CONFIG_XEN
if (processor_cntl_external())
processor_notify_external(pr, PROCESSOR_HOTPLUG,
HOTPLUG_TYPE_REMOVE);
+#endif /* CONFIG_XEN */
break;
default:
@@ -865,8 +908,10 @@ static acpi_status acpi_processor_hotadd
static int acpi_processor_handle_eject(struct acpi_processor *pr)
{
+#ifdef CONFIG_XEN
if (pr->id == -1)
return (0);
+#endif /* CONFIG_XEN */
if (cpu_online(pr->id)) {
return (-EINVAL);
diff -r 26c60aa94b9f -r e39cf97647af drivers/acpi/processor_idle.c
--- a/drivers/acpi/processor_idle.c Mon May 05 10:14:25 2008 +0100
+++ b/drivers/acpi/processor_idle.c Mon May 05 10:17:41 2008 +0100
@@ -714,12 +714,17 @@ static int acpi_processor_get_power_info
(reg->space_id != ACPI_ADR_SPACE_FIXED_HARDWARE))
continue;
+#ifdef CONFIG_XEN
if (!processor_pm_external())
cx.address = (reg->space_id ==
ACPI_ADR_SPACE_FIXED_HARDWARE) ?
0 : reg->address;
else
cx.address = reg->address;
+#else
+ cx.address = (reg->space_id == ACPI_ADR_SPACE_FIXED_HARDWARE) ?
+ 0 : reg->address;
+#endif /* CONFIG_XEN */
/* There should be an easy way to extract an integer... */
obj = (union acpi_object *)&(element->package.elements[1]);
@@ -728,11 +733,17 @@ static int acpi_processor_get_power_info
cx.type = obj->integer.value;
+#ifdef CONFIG_XEN
/* Following check doesn't apply to external control case */
if (!processor_pm_external())
if ((cx.type != ACPI_STATE_C1) &&
(reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO))
continue;
+#else
+ if ((cx.type != ACPI_STATE_C1) &&
+ (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO))
+ continue;
+#endif /* CONFIG_XEN */
if ((cx.type < ACPI_STATE_C2) || (cx.type > ACPI_STATE_C3))
continue;
@@ -997,16 +1008,24 @@ int acpi_processor_cst_has_changed(struc
return -ENODEV;
/* Fall back to the default idle loop */
+#ifdef CONFIG_XEN
if (!processor_pm_external())
pm_idle = pm_idle_save;
+#else
+ pm_idle = pm_idle_save;
+#endif /* CONFIG_XEN */
synchronize_sched(); /* Relies on interrupts forcing exit from idle.
*/
pr->flags.power = 0;
result = acpi_processor_get_power_info(pr);
+#ifdef CONFIG_XEN
if (processor_pm_external())
processor_notify_external(pr,
PROCESSOR_PM_CHANGE, PM_TYPE_IDLE);
else if ((pr->flags.power == 1) && (pr->flags.power_setup_done))
+#else
+ if ((pr->flags.power == 1) && (pr->flags.power_setup_done))
+#endif /* CONFIG_XEN */
pm_idle = acpi_processor_idle;
return result;
@@ -1138,7 +1157,11 @@ int acpi_processor_power_init(struct acp
pr->power.states[i].type);
printk(")\n");
+#ifdef CONFIG_XEN
if (!processor_pm_external() && (pr->id == 0)) {
+#else
+ if (pr->id == 0) {
+#endif /* CONFIG_XEN */
pm_idle_save = pm_idle;
pm_idle = acpi_processor_idle;
}
@@ -1157,9 +1180,11 @@ int acpi_processor_power_init(struct acp
pr->flags.power_setup_done = 1;
+#ifdef CONFIG_XEN
if (processor_pm_external())
processor_notify_external(pr,
PROCESSOR_PM_INIT, PM_TYPE_IDLE);
+#endif /* CONFIG_XEN */
return 0;
}
diff -r 26c60aa94b9f -r e39cf97647af drivers/acpi/processor_perflib.c
--- a/drivers/acpi/processor_perflib.c Mon May 05 10:14:25 2008 +0100
+++ b/drivers/acpi/processor_perflib.c Mon May 05 10:17:41 2008 +0100
@@ -136,11 +136,13 @@ int acpi_processor_ppc_has_changed(struc
int ret = acpi_processor_get_platform_limit(pr);
if (ret < 0)
return (ret);
- else if (!processor_pmperf_external())
- return cpufreq_update_policy(pr->id);
- else
+#ifdef CONFIG_XEN
+ else if (processor_pmperf_external())
return processor_notify_external(pr,
PROCESSOR_PM_CHANGE, PM_TYPE_PERF);
+#endif /* CONFIG_XEN */
+ else
+ return cpufreq_update_policy(pr->id);
}
void acpi_processor_ppc_init(void)
diff -r 26c60aa94b9f -r e39cf97647af include/acpi/processor.h
--- a/include/acpi/processor.h Mon May 05 10:14:25 2008 +0100
+++ b/include/acpi/processor.h Mon May 05 10:17:41 2008 +0100
@@ -21,7 +21,9 @@
#define ACPI_PSD_REV0_REVISION 0 /* Support for _PSD as in ACPI 3.0 */
#define ACPI_PSD_REV0_ENTRIES 5
+#ifdef CONFIG_XEN
#define NR_ACPI_CPUS 256
+#endif /* CONFIG_XEN */
/*
* Types of coordination defined in ACPI 3.0. Same macros can be used across
@@ -294,6 +296,7 @@ static inline void acpi_thermal_cpufreq_
}
#endif
+#ifdef CONFIG_XEN
/*
* Following are interfaces geared to external processor PM control
* logic like a VMM
@@ -365,5 +368,6 @@ static inline int processor_extcntl_init
return -EINVAL;
}
#endif /* CONFIG_PROCESSOR_EXTERNAL_CONTROL */
-
-#endif
+#endif /* CONFIG_XEN */
+
+#endif
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|