From: Andreas Herrmann <andreas.herrmann3@amd.com>
To: Mark Hounschell <dmarkh@cfl.rr.com>
Cc: Borislav Petkov <borislav.petkov@amd.com>,
Mark Hounschell <markh@compro.net>,
john stultz <johnstul@us.ibm.com>,
linux-kernel <linux-kernel@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: PROBLEM: Can't boot a (HZ = 1000) kernel using an AMD Phenom-II processor
Date: Fri, 20 Feb 2009 23:28:47 +0100 [thread overview]
Message-ID: <20090220222847.GJ4834@alberich.amd.com> (raw)
In-Reply-To: <499F122E.1080601@cfl.rr.com>
[-- Attachment #1: Type: text/plain, Size: 767 bytes --]
Mark,
Here we go ...
Attached is a compound version against v2.6.28.4 of some
hpet patches that I'd like to submit asap.
Can you please apply this patch and test it on your machine.
By chance I've found a machine wich also hangs with HZ_1000.
And this patch fixes the problem on this machine.
Regards,
Andreas
PS: Please boot with "hpet=verbose" to show the HPET registers
(no additional debug parameter needed this time).
--
Operating | Advanced Micro Devices GmbH
System | Karl-Hammerschmidt-Str. 34, 85609 Dornach b. München, Germany
Research | Geschäftsführer: Jochen Polster, Thomas M. McCoy, Giuliano Meroni
Center | Sitz: Dornach, Gemeinde Aschheim, Landkreis München
(OSRC) | Registergericht München, HRB Nr. 43632
[-- Attachment #2: hpet-cmpound-patch.diff --]
[-- Type: text/plain, Size: 6033 bytes --]
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index c9115c1..a6a4134 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -485,10 +485,12 @@ and is between 256 and 4096 characters. It is defined in the file
Default: 64
hpet= [X86-32,HPET] option to control HPET usage
- Format: { enable (default) | disable | force }
+ Format: { enable (default) | disable | force |
+ verbose }
disable: disable HPET and use PIT instead
force: allow force enabled of undocumented chips (ICH4,
VIA, nVidia)
+ verbose: show contents of HPET registers during setup
com20020= [HW,NET] ARCnet - COM20020 chipset
Format:
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
index 067d8de..85366b2 100644
--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -78,6 +78,7 @@ static inline void hpet_clear_mapping(void)
*/
static int boot_hpet_disable;
int hpet_force_user;
+static int hpet_verbose;
static int __init hpet_setup(char *str)
{
@@ -86,6 +87,8 @@ static int __init hpet_setup(char *str)
boot_hpet_disable = 1;
if (!strncmp("force", str, 5))
hpet_force_user = 1;
+ if (!strncmp("verbose", str, 7))
+ hpet_verbose = 1;
}
return 1;
}
@@ -117,6 +120,43 @@ int is_hpet_enabled(void)
}
EXPORT_SYMBOL_GPL(is_hpet_enabled);
+static void _hpet_print_config(const char *function, int line)
+{
+ u32 i, timers, l, h;
+ printk(KERN_INFO "hpet: %s(%d):\n", function, line);
+ l = hpet_readl(HPET_ID);
+ h = hpet_readl(HPET_PERIOD);
+ timers = ((l & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT) + 1;
+ printk(KERN_INFO "hpet: ID: 0x%x, PERIOD: 0x%x\n", l, h);
+ l = hpet_readl(HPET_CFG);
+ h = hpet_readl(HPET_STATUS);
+ printk(KERN_INFO "hpet: CFG: 0x%x, STATUS: 0x%x\n", l, h);
+ l = hpet_readl(HPET_COUNTER);
+ h = hpet_readl(HPET_COUNTER+4);
+ printk(KERN_INFO "hpet: COUNTER_l: 0x%x, COUNTER_h: 0x%x\n", l, h);
+
+ for (i = 0; i < timers; i++) {
+ l = hpet_readl(HPET_Tn_CFG(i));
+ h = hpet_readl(HPET_Tn_CFG(i)+4);
+ printk(KERN_INFO "hpet: T%d: CFG_l: 0x%x, CFG_h: 0x%x\n",
+ i, l, h);
+ l = hpet_readl(HPET_Tn_CMP(i));
+ h = hpet_readl(HPET_Tn_CMP(i)+4);
+ printk(KERN_INFO "hpet: T%d: CMP_l: 0x%x, CMP_h: 0x%x\n",
+ i, l, h);
+ l = hpet_readl(HPET_Tn_ROUTE(i));
+ h = hpet_readl(HPET_Tn_ROUTE(i)+4);
+ printk(KERN_INFO "hpet: T%d ROUTE_l: 0x%x, ROUTE_h: 0x%x\n",
+ i, l, h);
+ }
+}
+
+#define hpet_print_config() \
+do { \
+ if (hpet_verbose) \
+ _hpet_print_config(__FUNCTION__, __LINE__); \
+} while (0)
+
/*
* When the hpet driver (/dev/hpet) is enabled, we need to reserve
* timer 0 and timer 1 in case of RTC emulation.
@@ -189,27 +229,37 @@ static struct clock_event_device hpet_clockevent = {
.rating = 50,
};
-static void hpet_start_counter(void)
+static void hpet_stop_counter(void)
{
unsigned long cfg = hpet_readl(HPET_CFG);
-
cfg &= ~HPET_CFG_ENABLE;
hpet_writel(cfg, HPET_CFG);
hpet_writel(0, HPET_COUNTER);
hpet_writel(0, HPET_COUNTER + 4);
+}
+
+static void hpet_start_counter(void)
+{
+ unsigned long cfg = hpet_readl(HPET_CFG);
cfg |= HPET_CFG_ENABLE;
hpet_writel(cfg, HPET_CFG);
}
+static void hpet_restart_counter(void)
+{
+ hpet_stop_counter();
+ hpet_start_counter();
+}
+
static void hpet_resume_device(void)
{
force_hpet_resume();
}
-static void hpet_restart_counter(void)
+static void hpet_resume_counter(void)
{
hpet_resume_device();
- hpet_start_counter();
+ hpet_restart_counter();
}
static void hpet_enable_legacy_int(void)
@@ -257,27 +307,21 @@ static int hpet_setup_msi_irq(unsigned int irq);
static void hpet_set_mode(enum clock_event_mode mode,
struct clock_event_device *evt, int timer)
{
- unsigned long cfg, cmp, now;
+ unsigned long cfg;
uint64_t delta;
switch (mode) {
case CLOCK_EVT_MODE_PERIODIC:
+ hpet_stop_counter();
delta = ((uint64_t)(NSEC_PER_SEC/HZ)) * evt->mult;
delta >>= evt->shift;
- now = hpet_readl(HPET_COUNTER);
- cmp = now + (unsigned long) delta;
cfg = hpet_readl(HPET_Tn_CFG(timer));
cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
HPET_TN_SETVAL | HPET_TN_32BIT;
hpet_writel(cfg, HPET_Tn_CFG(timer));
- /*
- * The first write after writing TN_SETVAL to the
- * config register sets the counter value, the second
- * write sets the period.
- */
- hpet_writel(cmp, HPET_Tn_CMP(timer));
- udelay(1);
hpet_writel((unsigned long) delta, HPET_Tn_CMP(timer));
+ hpet_start_counter();
+ hpet_print_config();
break;
case CLOCK_EVT_MODE_ONESHOT:
@@ -304,6 +348,7 @@ static void hpet_set_mode(enum clock_event_mode mode,
irq_set_affinity(hdev->irq, cpumask_of_cpu(hdev->cpu));
enable_irq(hdev->irq);
}
+ hpet_print_config();
break;
}
}
@@ -522,6 +567,7 @@ static void hpet_msi_capability_lookup(unsigned int start_timer)
num_timers = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT);
num_timers++; /* Value read out starts from 0 */
+ hpet_print_config();
hpet_devs = kzalloc(sizeof(struct hpet_dev) * num_timers, GFP_KERNEL);
if (!hpet_devs)
@@ -690,7 +736,7 @@ static struct clocksource clocksource_hpet = {
.mask = HPET_MASK,
.shift = HPET_SHIFT,
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
- .resume = hpet_restart_counter,
+ .resume = hpet_resume_counter,
#ifdef CONFIG_X86_64
.vread = vread_hpet,
#endif
@@ -702,7 +748,7 @@ static int hpet_clocksource_register(void)
cycle_t t1;
/* Start the counter */
- hpet_start_counter();
+ hpet_restart_counter();
/* Verify whether hpet counter works */
t1 = read_hpet();
@@ -788,6 +834,7 @@ int __init hpet_enable(void)
* information and the number of channels
*/
id = hpet_readl(HPET_ID);
+ hpet_print_config();
#ifdef CONFIG_HPET_EMULATE_RTC
/*
@@ -839,6 +886,7 @@ static __init int hpet_late_init(void)
}
hpet_reserve_platform_timers(hpet_readl(HPET_ID));
+ hpet_print_config();
for_each_online_cpu(cpu) {
hpet_cpuhp_notify(NULL, CPU_ONLINE, (void *)(long)cpu);
next prev parent reply other threads:[~2009-02-20 22:29 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-18 12:38 PROBLEM: Can't boot a (HZ = 1000) kernel using an AMD Phenom-II processor Mark Hounschell
2009-01-19 8:48 ` Mark Hounschell
2009-01-19 12:41 ` Bartlomiej Zolnierkiewicz
2009-01-19 14:45 ` Mark Hounschell
2009-01-19 23:05 ` Mark Hounschell
2009-01-19 14:22 ` Borislav Petkov
2009-01-19 14:54 ` Mark Hounschell
2009-01-19 23:14 ` Mark Hounschell
2009-01-20 0:25 ` john stultz
2009-01-20 9:08 ` Mark Hounschell
2009-01-20 9:37 ` Andreas Herrmann
2009-01-20 21:08 ` Mark Hounschell
2009-01-23 9:34 ` Mark Hounschell
2009-01-23 13:04 ` Andreas Herrmann
2009-01-23 14:47 ` Borislav Petkov
2009-01-23 22:24 ` Mark Hounschell
2009-01-23 22:46 ` Mark Hounschell
2009-01-26 18:26 ` Mark Hounschell
2009-01-27 16:38 ` Borislav Petkov
2009-01-28 0:30 ` Mark Hounschell
2009-01-28 0:33 ` Mark Hounschell
2009-01-31 9:15 ` Mark Hounschell
2009-02-02 17:05 ` Borislav Petkov
2009-02-03 9:17 ` Mark Hounschell
2009-02-03 15:11 ` Borislav Petkov
2009-02-03 19:15 ` Mark Hounschell
2009-02-05 17:19 ` Mark Hounschell
2009-02-06 13:52 ` Borislav Petkov
2009-02-06 14:11 ` Mark Hounschell
2009-02-06 17:55 ` Mark Hounschell
2009-02-06 22:20 ` Mark Hounschell
2009-02-09 14:18 ` Borislav Petkov
2009-02-09 15:29 ` Mark Hounschell
2009-02-18 13:11 ` Mark Hounschell
2009-02-18 14:18 ` Borislav Petkov
2009-02-18 16:57 ` Mark Hounschell
2009-02-18 17:42 ` Borislav Petkov
2009-02-18 21:16 ` Mark Hounschell
2009-02-19 10:37 ` Mark Hounschell
2009-02-19 14:11 ` Andreas Herrmann
2009-02-19 15:16 ` Mark Hounschell
2009-02-19 15:19 ` Borislav Petkov
2009-02-19 15:54 ` Mark Hounschell
2009-02-20 11:53 ` Andreas Herrmann
2009-02-20 12:34 ` Ingo Molnar
2009-02-20 21:51 ` Andreas Herrmann
2009-02-20 15:43 ` Mark Hounschell
2009-02-20 16:08 ` Andreas Herrmann
2009-02-20 16:38 ` Andreas Herrmann
2009-02-20 17:09 ` Mark Hounschell
2009-02-20 17:40 ` Mark Hounschell
2009-02-20 18:22 ` Andreas Herrmann
2009-02-20 18:28 ` Mark Hounschell
2009-02-20 19:54 ` Mark Hounschell
2009-02-20 20:27 ` Mark Hounschell
2009-02-20 22:28 ` Andreas Herrmann [this message]
2009-02-21 1:14 ` Mark Hounschell
2009-02-21 13:20 ` Mark Hounschell
2009-02-20 17:06 ` Mark Hounschell
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=20090220222847.GJ4834@alberich.amd.com \
--to=andreas.herrmann3@amd.com \
--cc=borislav.petkov@amd.com \
--cc=dmarkh@cfl.rr.com \
--cc=johnstul@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=markh@compro.net \
--cc=tglx@linutronix.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.