From: Len Brown <len.brown@intel.com>
To: linux-acpi@vger.kernel.org
Cc: Thomas Renninger <trenn@suse.de>, Len Brown <len.brown@intel.com>
Subject: [PATCH 7/9] ACPI: Only use IPI on known broken machines (AMD, Dothan/BaniasPentium M)
Date: Tue, 20 Mar 2007 11:27:09 -0400 [thread overview]
Message-ID: <11744044372247-git-send-email-len.brown@intel.com> (raw)
Message-ID: <25496caec111481161e7f06bbfa12a533c43cc6f.1174404137.git.len.brown@intel.com> (raw)
In-Reply-To: <11744044363481-git-send-email-len.brown@intel.com>
In-Reply-To: <a1fdcc0d2714b6622e3fd5c00db1635213d6c41a.1174404136.git.len.brown@intel.com>
From: Thomas Renninger <trenn@suse.de>
Use IPI for blacklisted CPUs, add parameter IPI vs LAPIC
Currently, Linux disables lapic timer for all machines with C2 and higher
C-state support.
According to Intel only specific Intel models (Banias/Dothan) are broken
in respect of not waking up from C2 with lapic.
However, I am not sure about the naming of the parameter and how it
could/should get integrated into the dyntick part
(CONFIG_GENERIC_CLOCKEVENTS). There, a more fine grained check (TSC
still running?, ..) is needed? Does this make sense (always use
CLOCK_EVT_NOTIFY_BROADCAST_ON, but use OFF if forced by use_ipi=0:
clockevents_notify(use_ipi ? CLOCK_EVT_NOTIFY_BROADCAST_ON :
CLOCK_EVT_NOTIFY_BROADCAST_OFF, &pr->id);
Signed-off-by: Thomas Renninger <trenn@suse.de>
Signed-off-by: Len Brown <len.brown@intel.com>
---
drivers/acpi/processor_idle.c | 38 +++++++++++++++++++++++++++++---------
1 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index 6077300..562124e 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -89,6 +89,12 @@ module_param(nocst, uint, 0000);
static unsigned int bm_history __read_mostly =
(HZ >= 800 ? 0xFFFFFFFF : ((1U << (HZ / 25)) - 1));
module_param(bm_history, uint, 0644);
+
+static unsigned use_ipi = 2;
+module_param(use_ipi, uint, 0644);
+MODULE_PARM_DESC(use_ipi, "IPI (vs. LAPIC) irqs for not waking up from C2/C3"
+ " machines. 0=apic, 1=ipi, 2=auto\n");
+
/* --------------------------------------------------------------------------
Power Management
-------------------------------------------------------------------------- */
@@ -260,9 +266,8 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
/*
* Some BIOS implementations switch to C3 in the published C2 state.
- * This seems to be a common problem on AMD boxen, but other vendors
- * are affected too. We pick the most conservative approach: we assume
- * that the local APIC stops in both C2 and C3.
+ * This seems to be a common problem on AMD boxen and Intel Dothan/Banias
+ * Pentium M machines.
*/
static void acpi_timer_check_state(int state, struct acpi_processor *pr,
struct acpi_processor_cx *cx)
@@ -276,8 +281,17 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr,
if (pwr->timer_broadcast_on_state < state)
return;
- if (cx->type >= ACPI_STATE_C2)
- pr->power.timer_broadcast_on_state = state;
+ if (cx->type >= ACPI_STATE_C2) {
+ if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
+ pr->power.timer_broadcast_on_state = state;
+ else if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
+ boot_cpu_data.x86 == 6) &&
+ (boot_cpu_data.x86_model == 13 ||
+ boot_cpu_data.x86_model == 9))
+ {
+ pr->power.timer_broadcast_on_state = state;
+ }
+ }
}
static void acpi_propagate_timer_broadcast(struct acpi_processor *pr)
@@ -292,10 +306,16 @@ static void acpi_propagate_timer_broadcast(struct acpi_processor *pr)
#else
cpumask_t mask = cpumask_of_cpu(pr->id);
- if (pr->power.timer_broadcast_on_state < INT_MAX)
+ if (use_ipi == 0)
on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1);
- else
+ else if (use_ipi == 1)
on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1);
+ else {
+ if (pr->power.timer_broadcast_on_state < INT_MAX)
+ on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1);
+ else
+ on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1);
+ }
#endif
}
@@ -1013,13 +1033,13 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
case ACPI_STATE_C2:
acpi_processor_power_verify_c2(cx);
- if (cx->valid)
+ if (cx->valid && use_ipi != 0 && use_ipi != 1)
acpi_timer_check_state(i, pr, cx);
break;
case ACPI_STATE_C3:
acpi_processor_power_verify_c3(pr, cx);
- if (cx->valid)
+ if (cx->valid && use_ipi != 0 && use_ipi != 1)
acpi_timer_check_state(i, pr, cx);
break;
}
--
1.5.0.3.382.g34572
next prev parent reply other threads:[~2007-03-20 15:27 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-20 15:27 ACPI patches for release onto Linux-2.6.21-rc4 Len Brown
2007-03-20 15:27 ` [PATCH 1/9] ACPI: Add support to parse 2nd MADT Len Brown
2007-03-20 15:27 ` Len Brown
2007-03-20 15:27 ` [PATCH 2/9] ACPI: resolve HP nx6125 S3 immediate wakeup regression Len Brown
2007-03-20 15:27 ` Len Brown
2007-03-20 15:27 ` [PATCH 3/9] sony-laptop: MAINTAINERS fix entry, add L: and W: Len Brown
2007-03-20 15:27 ` Len Brown
2007-03-20 15:27 ` [PATCH 4/9] ACPICA: revert "acpi_serialize" changes Len Brown
2007-03-20 15:27 ` Len Brown
2007-03-20 15:27 ` [PATCH 5/9] ACPI: parse 2nd MADT by default Len Brown
2007-03-20 15:27 ` Len Brown
2007-03-20 15:27 ` [PATCH 6/9] ACPI: ibm-acpi: allow module to load when acpi notifiers can't be set (v2) Len Brown
2007-03-20 15:27 ` Len Brown
2007-03-20 15:27 ` Len Brown [this message]
2007-03-20 15:27 ` [PATCH 7/9] ACPI: Only use IPI on known broken machines (AMD, Dothan/BaniasPentium M) Len Brown
2007-03-20 15:27 ` [PATCH 8/9] ACPI: IA64: fix allnoconfig build Len Brown
2007-03-20 15:27 ` Len Brown
2007-03-20 15:27 ` [PATCH 9/9] ACPI: IA64: fix %ll build warnings Len Brown
2007-03-20 15:27 ` Len Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11744044372247-git-send-email-len.brown@intel.com \
--to=len.brown@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=trenn@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.