lkml.org 
[lkml]   [2006]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] Regard MSRs in lapic_suspend()/lapic_resume()
    Date

    Read/Write APIC_LVTPC and APIC_LVTTHMR only,
    if get_maxlvt() returns certain values.
    This is done like everywhere else in i386/kernel/apic.c,
    so I guess its correct.
    Suspends/Resumes to disk fine and eleminates an smp_error_interrupt()
    here on a K8.

    Signed-off-by: Karsten Wiese <fzu@wemgehoertderstaat.de>
    ---
    arch/i386/kernel/apic.c | 22 ++++++++++++++++++----
    1 files changed, 18 insertions(+), 4 deletions(-)

    diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c
    index 2fd4b7d..776d9be 100644
    --- a/arch/i386/kernel/apic.c
    +++ b/arch/i386/kernel/apic.c
    @@ -647,23 +647,30 @@ static struct {
    static int lapic_suspend(struct sys_device *dev, pm_message_t state)
    {
    unsigned long flags;
    + int maxlvt;

    if (!apic_pm_state.active)
    return 0;

    + maxlvt = get_maxlvt();
    +
    apic_pm_state.apic_id = apic_read(APIC_ID);
    apic_pm_state.apic_taskpri = apic_read(APIC_TASKPRI);
    apic_pm_state.apic_ldr = apic_read(APIC_LDR);
    apic_pm_state.apic_dfr = apic_read(APIC_DFR);
    apic_pm_state.apic_spiv = apic_read(APIC_SPIV);
    apic_pm_state.apic_lvtt = apic_read(APIC_LVTT);
    - apic_pm_state.apic_lvtpc = apic_read(APIC_LVTPC);
    + if (maxlvt >= 4)
    + apic_pm_state.apic_lvtpc = apic_read(APIC_LVTPC);
    apic_pm_state.apic_lvt0 = apic_read(APIC_LVT0);
    apic_pm_state.apic_lvt1 = apic_read(APIC_LVT1);
    apic_pm_state.apic_lvterr = apic_read(APIC_LVTERR);
    apic_pm_state.apic_tmict = apic_read(APIC_TMICT);
    apic_pm_state.apic_tdcr = apic_read(APIC_TDCR);
    - apic_pm_state.apic_thmr = apic_read(APIC_LVTTHMR);
    +#ifdef CONFIG_X86_MCE_P4THERMAL
    + if (maxlvt >= 5)
    + apic_pm_state.apic_thmr = apic_read(APIC_LVTTHMR);
    +#endif

    local_irq_save(flags);
    disable_local_APIC();
    @@ -675,10 +682,13 @@ static int lapic_resume(struct sys_devic
    {
    unsigned int l, h;
    unsigned long flags;
    + int maxlvt;

    if (!apic_pm_state.active)
    return 0;

    + maxlvt = get_maxlvt();
    +
    local_irq_save(flags);

    /*
    @@ -700,8 +710,12 @@ static int lapic_resume(struct sys_devic
    apic_write(APIC_SPIV, apic_pm_state.apic_spiv);
    apic_write(APIC_LVT0, apic_pm_state.apic_lvt0);
    apic_write(APIC_LVT1, apic_pm_state.apic_lvt1);
    - apic_write(APIC_LVTTHMR, apic_pm_state.apic_thmr);
    - apic_write(APIC_LVTPC, apic_pm_state.apic_lvtpc);
    +#ifdef CONFIG_X86_MCE_P4THERMAL
    + if (maxlvt >= 5)
    + apic_write(APIC_LVTTHMR, apic_pm_state.apic_thmr);
    +#endif
    + if (maxlvt >= 4)
    + apic_write(APIC_LVTPC, apic_pm_state.apic_lvtpc);
    apic_write(APIC_LVTT, apic_pm_state.apic_lvtt);
    apic_write(APIC_TDCR, apic_pm_state.apic_tdcr);
    apic_write(APIC_TMICT, apic_pm_state.apic_tmict);
    --
    1.4.2.4
    -
    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: 2006-11-18 03:05    [W:0.028 / U:0.480 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site