[PATCH 0/3] SGI RTC: add clocksource/clockevent driver and timer bios calls - Kernel
This is a discussion on [PATCH 0/3] SGI RTC: add clocksource/clockevent driver and timer bios calls - Kernel ; The following patchset provides a driver and bios call framework for
synchronized RTC clocksource and clockevents for SGI systems.
With these patches, a module can be installed that registers the system-wide
synchronized RTC clocksource and timers as both a clocksource ...
-
[PATCH 0/3] SGI RTC: add clocksource/clockevent driver and timer bios calls
The following patchset provides a driver and bios call framework for
synchronized RTC clocksource and clockevents for SGI systems.
With these patches, a module can be installed that registers the system-wide
synchronized RTC clocksource and timers as both a clocksource and clockevents
device running in high resolution mode.
[PATCH 1/3] SGI RTC: add clocksource driver
[PATCH 2/3] SGI RTC: add bios framework for RTC timer operations
[PATCH 3/3] SGI RTC: add RTC system interrupt
These patches should be installed on top of the following:
http://marc.info/?l=linux-kernel&m=122461934110503&w=2
http://marc.info/?l=linux-kernel&m=122461934110506&w=2
http://marc.info/?l=linux-kernel&m=122461934210509&w=2
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
-
[PATCH 3/3] SGI RTC: add RTC system interrupt
This patch allocates a system interrupt vector for architecture specific
use in implementing RTC timer interrupts.
Signed-off-by: Dimitri Sivanich
Index: linux/arch/x86/kernel/entry_64.S
================================================== =================
--- linux.orig/arch/x86/kernel/entry_64.S 2008-10-21 12:06:52.000000000 -0500
+++ linux/arch/x86/kernel/entry_64.S 2008-10-21 12:10:47.000000000 -0500
@@ -858,6 +858,10 @@ ENTRY(apic_timer_interrupt)
apicinterrupt LOCAL_TIMER_VECTOR,smp_apic_timer_interrupt
END(apic_timer_interrupt)
+ENTRY(uv_rtc_timer_intr)
+ apicinterrupt RTC_TIMER_VECTOR,uv_rtc_timer_interrupt
+END(uv_rtc_timer_intr)
+
ENTRY(uv_bau_message_intr1)
apicinterrupt 220,uv_bau_message_interrupt
END(uv_bau_message_intr1)
Index: linux/arch/x86/kernel/irqinit_64.c
================================================== =================
--- linux.orig/arch/x86/kernel/irqinit_64.c 2008-10-21 12:06:52.000000000 -0500
+++ linux/arch/x86/kernel/irqinit_64.c 2008-10-21 12:10:47.000000000 -0500
@@ -205,6 +205,9 @@ static void __init apic_intr_init(void)
/* self generated IPI for local APIC timer */
alloc_intr_gate(LOCAL_TIMER_VECTOR, apic_timer_interrupt);
+ /* IPI for RTC timers */
+ alloc_intr_gate(RTC_TIMER_VECTOR, uv_rtc_timer_intr);
+
/* IPI vectors for APIC spurious and error interrupts */
alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt);
alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt);
Index: linux/include/asm-x86/irq_vectors.h
================================================== =================
--- linux.orig/include/asm-x86/irq_vectors.h 2008-10-21 12:06:52.000000000 -0500
+++ linux/include/asm-x86/irq_vectors.h 2008-10-21 12:10:47.000000000 -0500
@@ -90,6 +90,7 @@
* sources per level' errata.
*/
#define LOCAL_TIMER_VECTOR 0xef
+#define RTC_TIMER_VECTOR 0xee
/*
* First APIC vector available to drivers: (vectors 0x30-0xee) we
Index: linux/arch/x86/kernel/genx2apic_uv_x.c
================================================== =================
--- linux.orig/arch/x86/kernel/genx2apic_uv_x.c 2008-10-21 12:06:52.000000000 -0500
+++ linux/arch/x86/kernel/genx2apic_uv_x.c 2008-10-21 12:10:47.000000000 -0500
@@ -22,6 +22,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -356,6 +357,46 @@ static __init void uv_rtc_init(void)
sn_rtc_cycles_per_second = ticks_per_sec;
}
+/* Function pointer for RTC interrupt handling */
+static void (*uv_rtc_interrupt_extension)(void);
+
+int
+uv_rtc_reg_extension(void (*fn)(void))
+{
+ if (uv_rtc_interrupt_extension)
+ return 1;
+
+ uv_rtc_interrupt_extension = fn;
+ return 0;
+}
+EXPORT_SYMBOL_GPL(uv_rtc_reg_extension);
+
+void
+uv_rtc_unreg_extension(void)
+{
+ if (uv_rtc_interrupt_extension)
+ uv_rtc_interrupt_extension = NULL;
+}
+EXPORT_SYMBOL_GPL(uv_rtc_unreg_extension);
+
+void uv_rtc_timer_interrupt(struct pt_regs *regs)
+{
+ struct pt_regs *old_regs = set_irq_regs(regs);
+
+ ack_APIC_irq();
+
+ exit_idle();
+
+ irq_enter();
+
+ if (uv_rtc_interrupt_extension)
+ uv_rtc_interrupt_extension();
+
+ irq_exit();
+
+ set_irq_regs(old_regs);
+}
+
/*
* Called on each cpu to initialize the per_cpu UV data area.
* ZZZ hotplug not supported yet
Index: linux/include/asm-x86/genapic_64.h
================================================== =================
--- linux.orig/include/asm-x86/genapic_64.h 2008-10-21 12:06:52.000000000 -0500
+++ linux/include/asm-x86/genapic_64.h 2008-10-21 12:10:47.000000000 -0500
@@ -49,6 +49,8 @@ extern int is_uv_system(void);
extern struct genapic apic_x2apic_uv_x;
DECLARE_PER_CPU(int, x2apic_extra_bits);
+extern int uv_rtc_reg_extension(void (*fn)(void));
+extern void uv_rtc_unreg_extension(void);
extern void uv_cpu_init(void);
extern void uv_system_init(void);
extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip);
Index: linux/include/asm-x86/hw_irq.h
================================================== =================
--- linux.orig/include/asm-x86/hw_irq.h 2008-10-21 12:06:52.000000000 -0500
+++ linux/include/asm-x86/hw_irq.h 2008-10-21 12:10:47.000000000 -0500
@@ -29,6 +29,7 @@
/* Interrupt handlers registered during init_IRQ */
extern void apic_timer_interrupt(void);
+extern void uv_rtc_timer_intr(void);
extern void error_interrupt(void);
extern void spurious_interrupt(void);
extern void thermal_interrupt(void);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
-
[PATCH 2/3] SGI RTC: add bios framework for RTC timer operations
This patch provides a bios call framework for implementing SGI RTC timer
functions.
Signed-off-by: Dimitri Sivanich
Index: linux/arch/x86/kernel/bios_uv.c
================================================== =================
--- linux.orig/arch/x86/kernel/bios_uv.c 2008-10-21 12:09:46.000000000 -0500
+++ linux/arch/x86/kernel/bios_uv.c 2008-10-21 12:10:46.000000000 -0500
@@ -160,6 +160,66 @@ s64 uv_bios_freq_base(u64 clock_type, u6
}
EXPORT_SYMBOL_GPL(uv_bios_freq_base);
+int uv_bios_rtct(enum uv_bios_rtct_cmd which, void *a1, void *a2, void *a3,
+ void *a4, void *a5)
+{
+ int rc = 0;
+
+ switch (which) {
+ case UV_RTC_MASK:
+ rc = uv_bios_call(UV_BIOS_RTC_MASK, (u64)a1, 0, 0, 0, 0);
+ break;
+ case UV_RTC_READ:
+ rc = uv_bios_call(UV_BIOS_RTC_READ, (u64)a1, 0, 0, 0, 0);
+ break;
+ case UV_RTC_EVT_INIT:
+ rc = uv_bios_call(UV_BIOS_RTC_EVT_INIT, (u64)a1, (u64)a2,
+ (u64)a3, (u64)a4, (u64)a5);
+ break;
+ case UV_RTC_EVT_SET:
+ {
+ u64 apicid = per_cpu(x86_cpu_to_apicid, *(int *)a1);
+ rc = uv_bios_call(UV_BIOS_RTC_EVT_SET, apicid, (u64)a2, 0, 0,
+ 0);
+ }
+ break;
+ case UV_RTC_EVT_UNSET:
+ {
+ u64 apicid = per_cpu(x86_cpu_to_apicid, *(int *)a1);
+ rc = uv_bios_call(UV_BIOS_RTC_EVT_UNSET, apicid, 0, 0, 0, 0);
+ }
+ break;
+ case UV_RTC_EVT_ACK:
+ {
+ u64 apicid = per_cpu(x86_cpu_to_apicid, *(int *)a1);
+ rc = uv_bios_call(UV_BIOS_RTC_EVT_ACK, apicid, 0, 0, 0, 0);
+ }
+ break;
+ case UV_RTC_EVT_START:
+ {
+ u64 apicid = per_cpu(x86_cpu_to_apicid, *(int *)a1);
+ rc = uv_bios_call(UV_BIOS_RTC_EVT_START, apicid, 0, 0, 0, 0);
+ }
+ break;
+ case UV_RTC_EVT_STOP:
+ {
+ u64 apicid = per_cpu(x86_cpu_to_apicid, *(int *)a1);
+ rc = uv_bios_call(UV_BIOS_RTC_EVT_STOP, apicid, 0, 0, 0, 0);
+ }
+ break;
+ case UV_RTC_EVT_RESUME:
+ {
+ u64 apicid = per_cpu(x86_cpu_to_apicid, *(int *)a1);
+ rc = uv_bios_call(UV_BIOS_RTC_EVT_RESUME, apicid, 0, 0, 0, 0);
+ }
+ break;
+ default:
+ rc = -1;
+ }
+
+ return rc;
+}
+EXPORT_SYMBOL_GPL(uv_bios_rtct);
#ifdef CONFIG_EFI
void uv_bios_init(void)
Index: linux/include/asm-x86/uv/bios.h
================================================== =================
--- linux.orig/include/asm-x86/uv/bios.h 2008-10-21 12:09:46.000000000 -0500
+++ linux/include/asm-x86/uv/bios.h 2008-10-21 12:10:46.000000000 -0500
@@ -36,7 +36,16 @@ enum uv_bios_cmd {
UV_BIOS_WATCHLIST_ALLOC,
UV_BIOS_WATCHLIST_FREE,
UV_BIOS_MEMPROTECT,
- UV_BIOS_GET_PARTITION_ADDR
+ UV_BIOS_GET_PARTITION_ADDR,
+ UV_BIOS_RTC_MASK,
+ UV_BIOS_RTC_READ,
+ UV_BIOS_RTC_EVT_INIT,
+ UV_BIOS_RTC_EVT_SET,
+ UV_BIOS_RTC_EVT_UNSET,
+ UV_BIOS_RTC_EVT_ACK,
+ UV_BIOS_RTC_EVT_START,
+ UV_BIOS_RTC_EVT_STOP,
+ UV_BIOS_RTC_EVT_RESUME
};
/*
@@ -66,6 +75,22 @@ enum {
BIOS_FREQ_BASE_REALTIME_CLOCK = 2
};
+/*
+ * Values for the BIOS rtct calls. It is passed as the first argument
+ * in the uv_bios_rtct call.
+ */
+enum uv_bios_rtct_cmd {
+ UV_RTC_MASK,
+ UV_RTC_READ,
+ UV_RTC_EVT_INIT,
+ UV_RTC_EVT_SET,
+ UV_RTC_EVT_UNSET,
+ UV_RTC_EVT_ACK,
+ UV_RTC_EVT_START,
+ UV_RTC_EVT_STOP,
+ UV_RTC_EVT_RESUME
+};
+
union partition_info_u {
u64 val;
struct {
@@ -106,6 +131,9 @@ extern int uv_bios_mq_watchlist_free(int
extern s64 uv_bios_change_memprotect(u64, u64, enum uv_memprotect);
extern s64 uv_bios_reserved_page_pa(u64, u64 *, u64 *, u64 *);
+extern int uv_bios_rtct(enum uv_bios_rtct_cmd, void *, void *, void *,
+ void *, void *);
+
extern void uv_bios_init(void);
extern unsigned long sn_rtc_cycles_per_second;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
-
Re: [PATCH 0/3] SGI RTC: add clocksource/clockevent driver and timer bios calls
* Dimitri Sivanich wrote:
> The following patchset provides a driver and bios call framework for
> synchronized RTC clocksource and clockevents for SGI systems.
>
> With these patches, a module can be installed that registers the system-wide
> synchronized RTC clocksource and timers as both a clocksource and clockevents
> device running in high resolution mode.
>
>
> [PATCH 1/3] SGI RTC: add clocksource driver
> [PATCH 2/3] SGI RTC: add bios framework for RTC timer operations
> [PATCH 3/3] SGI RTC: add RTC system interrupt
hm, i dont really like the direction of this.
Why isnt there a native Linux driver offered for this? This isnt about
memory discovery or device discovery, where BIOS interaction might be
acceptable (and might be unavoidable). This is about hardware interfaces
and drivers, and the last thing we want there is BIOSes.
Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
-
Re: [PATCH 0/3] SGI RTC: add clocksource/clockevent driver and timer bios calls
On Wed, Oct 22, 2008 at 08:36:13AM +0200, Ingo Molnar wrote:
>
> * Dimitri Sivanich wrote:
>
> > The following patchset provides a driver and bios call framework for
> > synchronized RTC clocksource and clockevents for SGI systems.
> >
> > With these patches, a module can be installed that registers the system-wide
> > synchronized RTC clocksource and timers as both a clocksource and clockevents
> > device running in high resolution mode.
> >
> >
> > [PATCH 1/3] SGI RTC: add clocksource driver
> > [PATCH 2/3] SGI RTC: add bios framework for RTC timer operations
> > [PATCH 3/3] SGI RTC: add RTC system interrupt
>
> hm, i dont really like the direction of this.
>
> Why isnt there a native Linux driver offered for this? This isnt about
> memory discovery or device discovery, where BIOS interaction might be
> acceptable (and might be unavoidable). This is about hardware interfaces
> and drivers, and the last thing we want there is BIOSes.
Ingo,
I'm perfectly willing to do this with a native Linux driver. My reason for doing it the above way was that as the hardware interfaces change, we wouldn't have to be pulling all of those hardware interface changes into the community kernel.
I'll try to get a new patchset submitted for the native driver tomorrow.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/