Re: [PATCH 1/3] ia64: convert to use clocksource code

From: Peter Keilty
Date: Fri Apr 27 2007 - 09:40:38 EST


Chris Wright wrote:

* Peter Keilty (peter.keilty@xxxxxx) wrote:


diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index 6077300..35ad71f 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -480,10 +480,12 @@ #endif
/* Get end time (ticks) */
t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);

+#ifndef CONFIG_IA64
#ifdef CONFIG_GENERIC_TIME
/* TSC halts in C2, so notify users */
mark_tsc_unstable();
#endif
+#endif



Is this a better description of the dependency?

#if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86_TSC)


yes, ok.



/* Re-enable interrupts */
local_irq_enable();
current_thread_info()->status |= TS_POLLING;
@@ -522,10 +524,12 @@ #endif
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0);
}

+#ifndef CONFIG_IA64
#ifdef CONFIG_GENERIC_TIME
/* TSC halts in C3, so notify users */
mark_tsc_unstable();
#endif
+#endif



ditto



/* Re-enable interrupts */
local_irq_enable();
current_thread_info()->status |= TS_POLLING;
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
index 0be700f..5ea7d3e 100644
--- a/drivers/char/hpet.c
+++ b/drivers/char/hpet.c
@@ -29,6 +29,7 @@ #include <linux/wait.h>
#include <linux/bcd.h>
#include <linux/seq_file.h>
#include <linux/bitops.h>
+#include <linux/clocksource.h>

#include <asm/current.h>
#include <asm/uaccess.h>
@@ -51,8 +52,34 @@ #define HPET_DRIFT (500)

#define HPET_RANGE_SIZE 1024 /* from HPET spec */

+#if BITS_PER_LONG == 64
+#define write_counter(V, MC) writeq(V, MC)
+#define read_counter(MC) readq(MC)
+#else
+#define write_counter(V, MC) writel(V, MC)
+#define read_counter(MC) readl(MC)
+#endif
+
static u32 hpet_nhpet, hpet_max_freq = HPET_USER_FREQ;

+static void __iomem *hpet_mc_ptr;



CodingStyle nit: we don't need all this _ptr...



+static cycle_t read_hpet(void)
+{
+ return (cycle_t)read_counter((void __iomem *)hpet_mc_ptr);
+}
+
+static struct clocksource clocksource_hpet = {
+ .name = "hpet",
+ .rating = 300,
+ .read = read_hpet,
+ .mask = 0xffffffffffffffffLL,
+ .mult = 0, /*to be caluclated*/
+ .shift = 10,
+ .is_continuous = 1,
+};
+static struct clocksource *hpet_clocksource_p;



and _p naming.



+
/* A lock for concurrent access by app and isr hpet activity. */
static DEFINE_SPINLOCK(hpet_lock);
/* A lock for concurrent intermodule access to hpet and isr hpet activity. */
@@ -79,7 +106,7 @@ struct hpets {
struct hpets *hp_next;
struct hpet __iomem *hp_hpet;
unsigned long hp_hpet_phys;
- struct time_interpolator *hp_interpolator;
+ struct clocksource *hp_clocksource;
unsigned long long hp_tick_freq;
unsigned long hp_delta;
unsigned int hp_ntimer;
@@ -94,13 +121,6 @@ #define HPET_IE 0x0002 /* interrupt en
#define HPET_PERIODIC 0x0004
#define HPET_SHARED_IRQ 0x0008

-#if BITS_PER_LONG == 64
-#define write_counter(V, MC) writeq(V, MC)
-#define read_counter(MC) readq(MC)
-#else
-#define write_counter(V, MC) writel(V, MC)
-#define read_counter(MC) readl(MC)
-#endif

#ifndef readq
static inline unsigned long long readq(void __iomem *addr)
@@ -737,27 +757,6 @@ static ctl_table dev_root[] = {

static struct ctl_table_header *sysctl_header;

-static void hpet_register_interpolator(struct hpets *hpetp)
-{
-#ifdef CONFIG_TIME_INTERPOLATION
- struct time_interpolator *ti;
-
- ti = kzalloc(sizeof(*ti), GFP_KERNEL);
- if (!ti)
- return;
-
- ti->source = TIME_SOURCE_MMIO64;
- ti->shift = 10;
- ti->addr = &hpetp->hp_hpet->hpet_mc;
- ti->frequency = hpetp->hp_tick_freq;
- ti->drift = HPET_DRIFT;
- ti->mask = -1;
-
- hpetp->hp_interpolator = ti;
- register_time_interpolator(ti);
-#endif
-}
-
/*
* Adjustment for when arming the timer with
* initial conditions. That is, main counter
@@ -909,7 +908,14 @@ int hpet_alloc(struct hpet_data *hdp)
}

hpetp->hp_delta = hpet_calibrate(hpetp);
- hpet_register_interpolator(hpetp);
+
+ if (!hpet_clocksource_p) {
+ clocksource_hpet.fsys_mmio_ptr = hpet_mc_ptr = &hpetp->hp_hpet->hpet_mc;
+ clocksource_hpet.mult = clocksource_hz2mult(hpetp->hp_tick_freq,
+ clocksource_hpet.shift);
+ clocksource_register(&clocksource_hpet);
+ hpet_clocksource_p = hpetp->hp_clocksource = &clocksource_hpet;
+ }



This looks like a change in behaviour for non-ia64. Now i386 and x86_64
will get this clocksource twice (and this one has a higher rating).
Doesn't look like this will even compile since fsys_mmio_ptr (more


Yes need to change setting for fsys_mmio just for ia64.
I will check the load multiple clocksources, before it was limited.

extraneous _ptr suffix) is ia64 only? And sparc64 is left out in
the cold.



return 0;
}
@@ -995,7 +1001,7 @@ static int hpet_acpi_add(struct acpi_dev

static int hpet_acpi_remove(struct acpi_device *device, int type)
{
- /* XXX need to unregister interpolator, dealloc mem, etc */
+ /* XXX need to unregister clocksource, dealloc mem, etc */
return -EINVAL;
}

diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
index daa4940..a20b4d6 100644
--- a/include/linux/clocksource.h
+++ b/include/linux/clocksource.h
@@ -61,6 +61,9 @@ struct clocksource {
u32 shift;
unsigned long flags;
cycle_t (*vread)(void);
+#ifdef CONFIG_IA64
+ void *fsys_mmio_ptr; /* used by fsyscall asm code */
+#endif

/* timekeeping specific data, ignore */
cycle_t cycle_last, cycle_interval;


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/