[PATCH/RFC] Enable HPET on VIA8237 southbridge

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

if you have that chip on your mainboard and want to play with it's
hpet, this might get you going.

   Karsten
Enable HPET on VIA8237 southbridge

Some BIOSs don't enable the hpet on that chip.
The patch enables it before all the other pci devices.

The hpet's hardware address is set to 0xFED00000,
if the VIA8237 has been identified.

This IS DANGEROUS.
I.e. because the hardware address might be assigned
later in the boot process to somthing else.

Tested succesfully on an K8T800/AMD64 Mobo.
One exception: Timer1 says it can do PERIODIC mode,
but this doesn't work here. One shot is ok.

Signed-off-by: Karsten Wiese <[email protected]>


diff -ur linux-2.6.13-RT/arch/i386/kernel/time_hpet.c linux-2.6.13-RT-kw/arch/i386/kernel/time_hpet.c
--- linux-2.6.13-RT/arch/i386/kernel/time_hpet.c	2005-09-19 15:49:17.000000000 +0200
+++ linux-2.6.13-RT-kw/arch/i386/kernel/time_hpet.c	2005-09-24 00:58:37.000000000 +0200
@@ -223,11 +223,74 @@
 	return use_hpet;
 }
 
+#define HPET_HACK_ENABLE_DANGEROUS 1
+
+#ifdef HPET_HACK_ENABLE_DANGEROUS
+union conf_address {
+	struct {
+		u8	reg;
+		u8	func:	3;
+		u8	dev:	5;
+		u8	bus;
+		u8	reserved:7;
+		u8	enable:	1;
+	} bits;
+	u32	dword;
+};
+
+#include <linux/pci_ids.h>
+
+static void is_hpet_via8237(void)
+{
+	union conf_address ca = {
+		.bits.reg = 0,
+		.bits.dev = 17,
+		.bits.enable = 1
+	};
+	union {
+		struct {
+			u8 control;
+			u8 address[3];
+		} hpet;
+		unsigned raw;
+	} hpet;
+	u32 vendor_id, control;
+
+	control = inl(0xcf8);
+	printk("%X\n", control);
+	outl(ca.dword, 0xcf8);
+	vendor_id = inl(0xcfc);
+	if (vendor_id == (PCI_VENDOR_ID_VIA + (PCI_DEVICE_ID_VIA_8237 << 16))) {
+		hpet.raw = 0xFED00000;
+		hpet.hpet.control = 0x80;
+		ca.bits.reg = 0x68;
+		outl(ca.dword, 0xcf8);
+		outl(hpet.raw, 0xcfc);
+		outl(ca.dword, 0xcf8);
+		hpet_address = (inl(0xcfc) & 0xFFFFFF00);
+		printk(KERN_WARNING "time.c: WARNING: Enabled VIA8237 HPET "
+		       "at %#lx.\n", hpet_address);
+	}
+}
+
+#else
+
+static void is_hpet_via8237(void)
+{
+}
+
+#endif
+
+
 int is_hpet_capable(void)
 {
-	if (!boot_hpet_disable && hpet_address)
-		return 1;
-	return 0;
+	if (boot_hpet_disable)
+		return 0;
+
+        if (!hpet_address)
+		is_hpet_via8237();
+
+	return hpet_address;
 }
 
 static int __init hpet_setup(char* str)

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux