lkml.org 
[lkml]   [2010]   [Jan]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] PM / i915: Skip kernel VT switch during suspend/resume if KMS is used
    Date
    From: Rafael J. Wysocki <rjw@sisk.pl>

    If a non-KMS graphics driver is used, the kernel carries out a VT
    switch during suspend/resume to avoid possible problems with freezing
    X at a wrong time and to cause X to repaint everything after resume.

    This is not necessary any more if the KMS is used, so skip the kernel
    VT switch during suspend/resume for i915 in the KMS mode.

    Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
    ---

    Hi,

    I've been testing this patch for over a week and haven't seen a single problem
    related to it during this time.

    Are there any objections to it?

    Rafael

    ---
    drivers/gpu/drm/i915/i915_drv.c | 4 ++++
    include/linux/suspend.h | 9 +++++++++
    kernel/power/suspend.c | 16 +++++++++++++---
    3 files changed, 26 insertions(+), 3 deletions(-)

    Index: linux-2.6/include/linux/suspend.h
    ===================================================================
    --- linux-2.6.orig/include/linux/suspend.h
    +++ linux-2.6/include/linux/suspend.h
    @@ -116,6 +116,13 @@ struct platform_suspend_ops {
    };

    #ifdef CONFIG_SUSPEND
    +extern bool vt_switch_enabled;
    +
    +static inline void disable_suspend_vt_switch(void)
    +{
    + vt_switch_enabled = false;
    +}
    +
    /**
    * suspend_set_ops - set platform dependent suspend operations
    * @ops: The new suspend operations to set.
    @@ -143,6 +150,8 @@ extern void arch_suspend_enable_irqs(voi

    extern int pm_suspend(suspend_state_t state);
    #else /* !CONFIG_SUSPEND */
    +static inline void disable_suspend_vt_switch(void) {}
    +
    #define suspend_valid_only_mem NULL

    static inline void suspend_set_ops(struct platform_suspend_ops *ops) {}
    Index: linux-2.6/kernel/power/suspend.c
    ===================================================================
    --- linux-2.6.orig/kernel/power/suspend.c
    +++ linux-2.6/kernel/power/suspend.c
    @@ -18,6 +18,13 @@

    #include "power.h"

    +/*
    + * If set, switch to a new VT before suspend and switch back to the original
    + * one during resume.
    + */
    +bool vt_switch_enabled = true;
    +EXPORT_SYMBOL_GPL(vt_switch_enabled);
    +
    const char *const pm_states[PM_SUSPEND_MAX] = {
    [PM_SUSPEND_STANDBY] = "standby",
    [PM_SUSPEND_MEM] = "mem",
    @@ -82,7 +89,8 @@ static int suspend_prepare(void)
    if (!suspend_ops || !suspend_ops->enter)
    return -EPERM;

    - pm_prepare_console();
    + if (vt_switch_enabled)
    + pm_prepare_console();

    error = pm_notifier_call_chain(PM_SUSPEND_PREPARE);
    if (error)
    @@ -100,7 +108,8 @@ static int suspend_prepare(void)
    usermodehelper_enable();
    Finish:
    pm_notifier_call_chain(PM_POST_SUSPEND);
    - pm_restore_console();
    + if (vt_switch_enabled)
    + pm_restore_console();
    return error;
    }

    @@ -238,7 +247,8 @@ static void suspend_finish(void)
    suspend_thaw_processes();
    usermodehelper_enable();
    pm_notifier_call_chain(PM_POST_SUSPEND);
    - pm_restore_console();
    + if (vt_switch_enabled)
    + pm_restore_console();
    }

    /**
    Index: linux-2.6/drivers/gpu/drm/i915/i915_drv.c
    ===================================================================
    --- linux-2.6.orig/drivers/gpu/drm/i915/i915_drv.c
    +++ linux-2.6/drivers/gpu/drm/i915/i915_drv.c
    @@ -28,6 +28,7 @@
    */

    #include <linux/device.h>
    +#include <linux/suspend.h>
    #include "drmP.h"
    #include "drm.h"
    #include "i915_drm.h"
    @@ -549,6 +550,9 @@ static int __init i915_init(void)
    driver.driver_features &= ~DRIVER_MODESET;
    #endif

    + if (driver.driver_features & DRIVER_MODESET)
    + disable_suspend_vt_switch();
    +
    return drm_init(&driver);
    }


    \
     
     \ /
      Last update: 2010-01-24 00:57    [W:0.027 / U:0.600 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site