All of lore.kernel.org
 help / color / mirror / Atom feed
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);

  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.