Thread (3 messages) 3 messages, 2 authors, 2007-09-17

Re: [PATCH] kexec: reenable HPET before kexec

From: Konstantin Baydarov <hidden>
Date: 2007-09-17 09:41:05
Also in: kexec, lkml

Possibly related (same subject, not in this thread)

On Fri, 31 Aug 2007 14:31:51 +0400
Konstantin Baydarov [off-list ref] wrote:
quoted hunk ↗ jump to hunk
On Thu, 30 Aug 2007 12:04:33 -0600
ebiederm@xmission.com (Eric W. Biederman) wrote:
quoted
I was assuming that CLOCK_EVT_MODE_SHUTDOWN just mapped
to the shutdown method of the clock events or something else.
But it shutdown means something different in this context we
can certainly find a better place to hook into the device
tree and call shutdown methods.   Especially if that will
make the code simpler.
Agree. I've got rig from timekeeping. Now I'm using system device
tree shutdown interface, as you suggested. I've added HPET system
device class with shutdown method and HPET device to sysdev.
quoted
This is a design feature.  machine_crash_shutdown is not really 
supposed to disable any hardware.  There is a very minimal set that
we haven't been able to figure out how to get the kernels
initialization routines to deal with properly.  Which is a
temporary justification for not doing more now.  If we can't find
anyway to make the initialization code more robust for the hpet we
can revisit this.
So you suggest to check if HPET is present in HPET init code even if
HPET disabled in boot kernel command line or APIC is disabled. And if
HPET is present and kernel not going to use it - disable HPET
interrupts?
quoted
Please remove the CONFIG_KEXEC.  We need to do this on a reboot also
so we don't confuse the BIOS.  BIOS's frequently but not always
can just reset the board to avoid complications like this, but if
we need a shutdown method we need a shutdown method.  The kexec
case just exercises things more.
Removed CONFIG_KEXEC.

So here is new version of fix. Patch against 2.6.23-rc3.
Eric, review please. Thanks.

Signed-off-by: Konstantin Baydarov <redacted>

 arch/i386/kernel/hpet.c |   48
++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48
insertions(+)

Index: linux-2.6.23-rc3/arch/i386/kernel/hpet.c
===================================================================
--- linux-2.6.23-rc3.orig/arch/i386/kernel/hpet.c
+++ linux-2.6.23-rc3/arch/i386/kernel/hpet.c
@@ -144,11 +144,31 @@ static void hpet_enable_int(void)
 {
 	unsigned long cfg = hpet_readl(HPET_CFG);
 
+	if (hpet_legacy_int_enabled)
+		return;
+
 	cfg |= HPET_CFG_LEGACY;
 	hpet_writel(cfg, HPET_CFG);
 	hpet_legacy_int_enabled = 1;
 }
 
+static void hpet_disable_int(void)
+{
+	unsigned long cfg;
+
+	if (!hpet_legacy_int_enabled)
+		return;
+
+	if (!is_hpet_capable())
+		return;
+
+	cfg = hpet_readl(HPET_CFG);
+	cfg &= ~HPET_CFG_LEGACY;
+	hpet_writel(cfg, HPET_CFG);
+	hpet_legacy_int_enabled = 0;
+
+}
+
 static void hpet_set_mode(enum clock_event_mode mode,
 			  struct clock_event_device *evt)
 {
@@ -551,3 +571,31 @@ irqreturn_t hpet_rtc_interrupt(int irq, 
 	return IRQ_HANDLED;
 }
 #endif
+
+static int hpet_shutdown(struct sys_device *dev)
+{
+	/* We need this to make PIT works in KEXECuted kernel */
+	hpet_disable_int();
+
+	return 0;
+}
+
+static struct sysdev_class hpet_sysdev_class = {
+	set_kset_name("hpet"),
+	.shutdown = hpet_shutdown,
+};
+
+static struct sys_device device_hpet = {
+	.id	= 0,
+	.cls	= &hpet_sysdev_class,
+};
+
+static int __init hpet_init_sysfs(void)
+{
+	int error = sysdev_class_register(&hpet_sysdev_class);
+	if (!error)
+		error = sysdev_register(&device_hpet);
+	return error;
+}
+
+device_initcall(hpet_init_sysfs);
-
To unsubscribe from this list: send the line "unsubscribe
linux-rt-users" in the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
  Eric, can you tell me, when are you going to review last version of fix?
  Thanks.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help