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

Peter Keilty
2007-04-27T13:39:33Z

Chris Wright wrote:

>* Peter Keilty (peter.keilty@hp.com) 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;
>>
>>