[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 ...

+ Reply to Thread
Results 1 to 5 of 5

Thread: [PATCH 0/3] SGI RTC: add clocksource/clockevent driver and timer bios calls

  1. [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/

  2. [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/

  3. [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/

  4. 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/

  5. 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/

+ Reply to Thread