lkml.org 
[lkml]   [2007]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch-mm 19/33] x86_64: prepare apic code for clock events
    Change __setup_APIC_LVTT so it takes the arguments which are necessary
    for the later clock events switch.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Chris Wright <chrisw@sous-sol.org>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

    ---
    arch/x86_64/kernel/apic.c | 23 +++++++++++++++--------
    1 file changed, 15 insertions(+), 8 deletions(-)

    Index: linux-2.6.22-rc6-mm/arch/x86_64/kernel/apic.c
    ===================================================================
    --- linux-2.6.22-rc6-mm.orig/arch/x86_64/kernel/apic.c 2007-07-15 17:33:43.000000000 +0200
    +++ linux-2.6.22-rc6-mm/arch/x86_64/kernel/apic.c 2007-07-15 17:48:59.000000000 +0200
    @@ -760,14 +760,14 @@ void __init init_apic_mappings(void)

    #define APIC_DIVISOR 16

    -static void __setup_APIC_LVTT(unsigned int clocks)
    +static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen)
    {
    unsigned int lvtt_value, tmp_value;
    - int cpu = smp_processor_id();
    -
    - lvtt_value = APIC_LVT_TIMER_PERIODIC | LOCAL_TIMER_VECTOR;

    - if (cpu_isset(cpu, timer_interrupt_broadcast_ipi_mask))
    + lvtt_value = LOCAL_TIMER_VECTOR;
    + if (!oneshot)
    + lvtt_value |= APIC_LVT_TIMER_PERIODIC;
    + if (!irqen)
    lvtt_value |= APIC_LVT_MASKED;

    apic_write(APIC_LVTT, lvtt_value);
    @@ -780,12 +780,14 @@ static void __setup_APIC_LVTT(unsigned i
    & ~(APIC_TDR_DIV_1 | APIC_TDR_DIV_TMBASE))
    | APIC_TDR_DIV_16);

    - apic_write(APIC_TMICT, clocks/APIC_DIVISOR);
    + if (!oneshot)
    + apic_write(APIC_TMICT, clocks/APIC_DIVISOR);
    }

    static void setup_APIC_timer(unsigned int clocks)
    {
    unsigned long flags;
    + int irqen;

    local_irq_save(flags);

    @@ -808,7 +810,10 @@ static void setup_APIC_timer(unsigned in
    c2 |= inb_p(0x40) << 8;
    } while (c2 - c1 < 300);
    }
    - __setup_APIC_LVTT(clocks);
    +
    + irqen = ! cpu_isset(smp_processor_id(),
    + timer_interrupt_broadcast_ipi_mask);
    + __setup_APIC_LVTT(clocks, 0, irqen);
    /* Turn off PIT interrupt if we use APIC timer as main timer.
    Only works with the PM timer right now
    TBD fix it for HPET too. */
    @@ -846,8 +851,10 @@ static int __init calibrate_APIC_clock(v
    * Put whatever arbitrary (but long enough) timeout
    * value into the APIC clock, we just want to get the
    * counter running for calibration.
    + *
    + * No interrupt enable !
    */
    - __setup_APIC_LVTT(4000000000);
    + __setup_APIC_LVTT(4000000000, 0, 0);

    apic_start = apic_read(APIC_TMCCT);
    #ifdef CONFIG_X86_PM_TIMER
    --

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

    \
     
     \ /
      Last update: 2007-07-15 18:15    [W:4.394 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site