i386: prepare sharing the hpet code with x86_64

2007-10-12 Thread Linux Kernel Mailing List
Gitweb: 
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=06a24dec10bc4014fc0974670627efed68f5da27
Commit: 06a24dec10bc4014fc0974670627efed68f5da27
Parent: d371698efd45c3664fd1726780c360f02e1f9580
Author: Thomas Gleixner [EMAIL PROTECTED]
AuthorDate: Fri Oct 12 23:04:06 2007 +0200
Committer:  Thomas Gleixner [EMAIL PROTECTED]
CommitDate: Fri Oct 12 23:04:06 2007 +0200

i386: prepare sharing the hpet code with x86_64

The hpet implementations of i386 and x8664 has been mostly the same
before the clock events conversion of i386. The clock events
conversion of i386 hpet is already done. So it makes sense to share
the code for the x86_64 clock events conversion.

Abstract out the mapping functions.

Signed-off-by: Thomas Gleixner [EMAIL PROTECTED]
Signed-off-by: Chris Wright [EMAIL PROTECTED]
Signed-off-by: Ingo Molnar [EMAIL PROTECTED]
Signed-off-by: Arjan van de Ven [EMAIL PROTECTED]
---
 arch/x86/kernel/hpet_32.c |   24 
 1 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kernel/hpet_32.c b/arch/x86/kernel/hpet_32.c
index 533d493..748abf0 100644
--- a/arch/x86/kernel/hpet_32.c
+++ b/arch/x86/kernel/hpet_32.c
@@ -8,10 +8,9 @@
 #include linux/delay.h
 
 #include asm/hpet.h
+#include asm/i8253.h
 #include asm/io.h
 
-extern struct clock_event_device *global_clock_event;
-
 #define HPET_MASK  CLOCKSOURCE_MASK(32)
 #define HPET_SHIFT 22
 
@@ -22,7 +21,7 @@ extern struct clock_event_device *global_clock_event;
  * HPET address is set in acpi/boot.c, when an ACPI entry exists
  */
 unsigned long hpet_address;
-static void __iomem * hpet_virt_address;
+static void __iomem *hpet_virt_address;
 
 static inline unsigned long hpet_readl(unsigned long a)
 {
@@ -34,6 +33,17 @@ static inline void hpet_writel(unsigned long d, unsigned 
long a)
writel(d, hpet_virt_address + a);
 }
 
+static inline void hpet_set_mapping(void)
+{
+   hpet_virt_address = ioremap_nocache(hpet_address, HPET_MMAP_SIZE);
+}
+
+static inline void hpet_clear_mapping(void)
+{
+   iounmap(hpet_virt_address);
+   hpet_virt_address = NULL;
+}
+
 /*
  * HPET command line enable / disable
  */
@@ -83,7 +93,7 @@ static void hpet_reserve_platform_timers(unsigned long id)
 
memset(hd, 0, sizeof (hd));
hd.hd_phys_address = hpet_address;
-   hd.hd_address = hpet_virt_address;
+   hd.hd_address = hpet;
hd.hd_nirqs = nrtimers;
hd.hd_flags = HPET_DATA_PLATFORM;
hpet_reserve_timer(hd, 0);
@@ -238,7 +248,7 @@ int __init hpet_enable(void)
if (!is_hpet_capable())
return 0;
 
-   hpet_virt_address = ioremap_nocache(hpet_address, HPET_MMAP_SIZE);
+   hpet_set_mapping();
 
/*
 * Read the period and check for a sane value:
@@ -334,13 +344,11 @@ int __init hpet_enable(void)
return 0;
 
 out_nohpet:
-   iounmap(hpet_virt_address);
-   hpet_virt_address = NULL;
+   hpet_clear_mapping();
boot_hpet_disable = 1;
return 0;
 }
 
-
 #ifdef CONFIG_HPET_EMULATE_RTC
 
 /* HPET in LegacyReplacement Mode eats up RTC interrupt line. When, HPET
-
To unsubscribe from this list: send the line unsubscribe git-commits-head in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


i386: prepare sharing the hpet code with x86_64

2007-10-12 Thread Linux Kernel Mailing List
Gitweb: 
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=28769149c285e0a392d2e601ae0cc71ffc345f7d
Commit: 28769149c285e0a392d2e601ae0cc71ffc345f7d
Parent: 06a24dec10bc4014fc0974670627efed68f5da27
Author: Thomas Gleixner [EMAIL PROTECTED]
AuthorDate: Fri Oct 12 23:04:06 2007 +0200
Committer:  Thomas Gleixner [EMAIL PROTECTED]
CommitDate: Fri Oct 12 23:04:06 2007 +0200

i386: prepare sharing the hpet code with x86_64

Add the x8664 specific bits (mapping) to share the hpet code later.

Move the reserve_platform_timer call to late init. This is necessary
for x86_64, as hpet enable() is called before memory is setup. i386
calls it in late_time_init, but it does not hurt to do it later for
both.

Pull in the x8664 hpet disable command line option as well.

Signed-off-by: Thomas Gleixner [EMAIL PROTECTED]
Signed-off-by: Ingo Molnar [EMAIL PROTECTED]
Signed-off-by: Arjan van de Ven [EMAIL PROTECTED]
---
 arch/x86/kernel/hpet_32.c |   59 -
 1 files changed, 58 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kernel/hpet_32.c b/arch/x86/kernel/hpet_32.c
index 748abf0..dbe0e1d 100644
--- a/arch/x86/kernel/hpet_32.c
+++ b/arch/x86/kernel/hpet_32.c
@@ -1,5 +1,6 @@
 #include linux/clocksource.h
 #include linux/clockchips.h
+#include linux/delay.h
 #include linux/errno.h
 #include linux/hpet.h
 #include linux/init.h
@@ -7,6 +8,7 @@
 #include linux/pm.h
 #include linux/delay.h
 
+#include asm/fixmap.h
 #include asm/hpet.h
 #include asm/i8253.h
 #include asm/io.h
@@ -23,6 +25,10 @@
 unsigned long hpet_address;
 static void __iomem *hpet_virt_address;
 
+/* Temporary hack. Cleanup after x86_64 clock events conversion */
+#undef hpet_readl
+#undef hpet_writel
+
 static inline unsigned long hpet_readl(unsigned long a)
 {
return readl(hpet_virt_address + a);
@@ -33,6 +39,24 @@ static inline void hpet_writel(unsigned long d, unsigned 
long a)
writel(d, hpet_virt_address + a);
 }
 
+#ifdef CONFIG_X86_64
+
+#include asm/pgtable.h
+
+static inline void hpet_set_mapping(void)
+{
+   set_fixmap_nocache(FIX_HPET_BASE, hpet_address);
+   __set_fixmap(VSYSCALL_HPET, hpet_address, PAGE_KERNEL_VSYSCALL_NOCACHE);
+   hpet_virt_address = (void __iomem *)fix_to_virt(FIX_HPET_BASE);
+}
+
+static inline void hpet_clear_mapping(void)
+{
+   hpet_virt_address = NULL;
+}
+
+#else
+
 static inline void hpet_set_mapping(void)
 {
hpet_virt_address = ioremap_nocache(hpet_address, HPET_MMAP_SIZE);
@@ -43,6 +67,7 @@ static inline void hpet_clear_mapping(void)
iounmap(hpet_virt_address);
hpet_virt_address = NULL;
 }
+#endif
 
 /*
  * HPET command line enable / disable
@@ -59,6 +84,13 @@ static int __init hpet_setup(char* str)
 }
 __setup(hpet=, hpet_setup);
 
+static int __init disable_hpet(char *str)
+{
+   boot_hpet_disable = 1;
+   return 1;
+}
+__setup(nohpet, disable_hpet);
+
 static inline int is_hpet_capable(void)
 {
return (!boot_hpet_disable  hpet_address);
@@ -225,6 +257,13 @@ static cycle_t read_hpet(void)
return (cycle_t)hpet_readl(HPET_COUNTER);
 }
 
+#ifdef CONFIG_X86_64
+static cycle_t __vsyscall_fn vread_hpet(void)
+{
+   return readl((const void __iomem *)fix_to_virt(VSYSCALL_HPET) + 0xf0);
+}
+#endif
+
 static struct clocksource clocksource_hpet = {
.name   = hpet,
.rating = 250,
@@ -233,6 +272,9 @@ static struct clocksource clocksource_hpet = {
.shift  = HPET_SHIFT,
.flags  = CLOCK_SOURCE_IS_CONTINUOUS,
.resume = hpet_start_counter,
+#ifdef CONFIG_X86_64
+   .vread  = vread_hpet,
+#endif
 };
 
 /*
@@ -331,7 +373,6 @@ int __init hpet_enable(void)
 
if (id  HPET_ID_LEGSUP) {
hpet_enable_int();
-   hpet_reserve_platform_timers(id);
/*
 * Start hpet with the boot cpu mask and make it
 * global after the IO_APIC has been initialized.
@@ -349,6 +390,22 @@ out_nohpet:
return 0;
 }
 
+/*
+ * Needs to be late, as the reserve_timer code calls kalloc !
+ *
+ * Not a problem on i386 as hpet_enable is called from late_time_init,
+ * but on x86_64 it is necessary !
+ */
+static __init int hpet_late_init(void)
+{
+   if (!is_hpet_capable())
+   return -ENODEV;
+
+   hpet_reserve_platform_timers(hpet_readl(HPET_ID));
+   return 0;
+}
+fs_initcall(hpet_late_init);
+
 #ifdef CONFIG_HPET_EMULATE_RTC
 
 /* HPET in LegacyReplacement Mode eats up RTC interrupt line. When, HPET
-
To unsubscribe from this list: send the line unsubscribe git-commits-head in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html