All of lore.kernel.org
 help / color / mirror / Atom feed
From: Len Brown <lenb@kernel.org>
To: x86@kernel.org
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>,
	linux-acpi@vger.kernel.org
Subject: [PATCH] x86/hpet: prevent boot hang when hpet=force used on old ICH
Date: Wed, 22 Apr 2009 22:27:40 -0400 (EDT)	[thread overview]
Message-ID: <alpine.LFD.2.00.0904222223200.21119@localhost.localdomain> (raw)

From: Len Brown <len.brown@intel.com>

Linux tells ICH4 users that they can (manually) invoke
"hpet=force" to enable the undocumented HPET.
The HPET becomes available for both clocksource and clockevents.

But as of ff69f2bba67bd45514923aaedbf40fe351787c59
(acpi: fix of pmtimer overflow that make Cx states time incorrect)
the hpet may be used for idle accounting, and
hpet=force on an ICH4 box hangs boot.

It turns out that reading the HPET timer immediately
after return from C3 hangs.

Well, the reason we enable the HPET on these systems
is primarily for clockevents -- the HPET has a longer
maximum timer duration than the PIT.  HPET as a clocksource
is less interesting.

So for "hpet=force" on old ICH, allow HPET clockevents,
but do not allow HPET as a clocksource.

http://bugzilla.kernel.org/show_bug.cgi?id=13087

Signed-off-by: Len Brown <len.brown@intel.com>
---
Ingo/Peter/Thomas,
This regression was filed against ACPI, but the fix is under x86.
I'd wait for Venki's ack on anything related to HPET,
and I can send via your tree or yours, just let me know.

thanks,
-Len

 arch/x86/include/asm/hpet.h |    1 +
 arch/x86/kernel/hpet.c      |    5 +++++
 arch/x86/kernel/quirks.c    |    4 ++++
 3 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/arch/x86/include/asm/hpet.h b/arch/x86/include/asm/hpet.h
index 1c22cb0..39d4e86 100644
--- a/arch/x86/include/asm/hpet.h
+++ b/arch/x86/include/asm/hpet.h
@@ -66,6 +66,7 @@
 extern unsigned long hpet_address;
 extern unsigned long force_hpet_address;
 extern int hpet_force_user;
+extern int hpet_is_forced_old_ich(void);
 extern int is_hpet_enabled(void);
 extern int hpet_enable(void);
 extern void hpet_disable(void);
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
index 3f0019e..8b061c7 100644
--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -752,6 +752,11 @@ static int hpet_clocksource_register(void)
 	u64 start, now;
 	cycle_t t1;
 
+	if (hpet_is_forced_old_ich()) {
+		printk(KERN_WARNING "hpet: hpet=force on old ICH enables clockevents,"
+				" but not clocksource.\n");
+		return -ENODEV;
+	}
 	/* Start the counter */
 	hpet_restart_counter();
 
diff --git a/arch/x86/kernel/quirks.c b/arch/x86/kernel/quirks.c
index e95022e..9e4d73d 100644
--- a/arch/x86/kernel/quirks.c
+++ b/arch/x86/kernel/quirks.c
@@ -253,6 +253,10 @@ static void old_ich_force_enable_hpet(struct pci_dev *dev)
 	dev_printk(KERN_DEBUG, &dev->dev, "Failed to force enable HPET\n");
 }
 
+int hpet_is_forced_old_ich() {
+	return (force_hpet_resume_type == OLD_ICH_FORCE_HPET_RESUME);
+}
+
 /*
  * Undocumented chipset features. Make sure that the user enforced
  * this.
-- 
1.6.3.rc1.34.g0be9b


             reply	other threads:[~2009-04-23  2:27 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-23  2:27 Len Brown [this message]
2009-04-23  6:09 ` [PATCH] x86/hpet: prevent boot hang when hpet=force used on old ICH Ingo Molnar
2009-04-23 23:05   ` Len Brown
2009-04-24 23:45     ` Ingo Molnar
2009-04-23 23:18 ` [PATCH] ACPI/hpet: prevent boot hang when hpet=force used on ICH-4M Len Brown
2009-04-23 23:18   ` Pallipadi, Venkatesh
2009-04-23 23:19   ` [PATCH] HPET: stop soliciting hpet=force users on ICH4M Len Brown
2009-04-23 23:19     ` Pallipadi, Venkatesh
2009-04-24  6:43     ` Ingo Molnar
2009-04-24  6:45     ` [tip:x86/urgent] x86, hpet: Stop " tip-bot for Len Brown
2009-04-24  6:37   ` [PATCH] ACPI/hpet: prevent boot hang when hpet=force used on ICH-4M Ingo Molnar
2009-04-24 14:49     ` 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=alpine.LFD.2.00.0904222223200.21119@localhost.localdomain \
    --to=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=venkatesh.pallipadi@intel.com \
    --cc=x86@kernel.org \
    /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.