Skip to content
Snippets Groups Projects
Forked from Alex Deucher / linux
Source project has a limited visibility.
  • Ulf Hansson's avatar
    670c90de
    cpuidle: psci: Enable suspend-to-idle for PSCI OSI mode · 670c90de
    Ulf Hansson authored
    
    To select domain idlestates for cpuidle-psci when OSI mode has been
    enabled, the PM domains via genpd are being managed through runtime PM.
    This works fine for the regular idlepath, but it doesn't during system wide
    suspend. More precisely, the domain idlestates becomes temporarily
    disabled, which is because the PM core disables runtime PM for devices
    during system wide suspend.
    
    Later in the system suspend phase, genpd intends to deal with this from its
    ->suspend_noirq() callback, but this doesn't work as expected for a device
    corresponding to a CPU, because the domain idlestates needs to be selected
    on a per CPU basis (the PM core doesn't invoke the callbacks like that).
    
    To address this problem, let's enable the syscore flag for the
    corresponding CPU device that becomes successfully attached to its PM
    domain (applicable only in OSI mode). This informs the PM core to skip
    invoke the system wide suspend/resume callbacks for the device, thus also
    prevents genpd from screwing up its internal state of it.
    
    Moreover, to properly select a domain idlestate for the CPUs during
    suspend-to-idle, let's assign a specific ->enter_s2idle() callback for the
    corresponding domain idlestate (applicable only in OSI mode). From that
    callback, let's invoke dev_pm_genpd_suspend|resume(), as this allows a
    domain idlestate to be selected for the current CPU by genpd.
    
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    670c90de
    History
    cpuidle: psci: Enable suspend-to-idle for PSCI OSI mode
    Ulf Hansson authored
    
    To select domain idlestates for cpuidle-psci when OSI mode has been
    enabled, the PM domains via genpd are being managed through runtime PM.
    This works fine for the regular idlepath, but it doesn't during system wide
    suspend. More precisely, the domain idlestates becomes temporarily
    disabled, which is because the PM core disables runtime PM for devices
    during system wide suspend.
    
    Later in the system suspend phase, genpd intends to deal with this from its
    ->suspend_noirq() callback, but this doesn't work as expected for a device
    corresponding to a CPU, because the domain idlestates needs to be selected
    on a per CPU basis (the PM core doesn't invoke the callbacks like that).
    
    To address this problem, let's enable the syscore flag for the
    corresponding CPU device that becomes successfully attached to its PM
    domain (applicable only in OSI mode). This informs the PM core to skip
    invoke the system wide suspend/resume callbacks for the device, thus also
    prevents genpd from screwing up its internal state of it.
    
    Moreover, to properly select a domain idlestate for the CPUs during
    suspend-to-idle, let's assign a specific ->enter_s2idle() callback for the
    corresponding domain idlestate (applicable only in OSI mode). From that
    callback, let's invoke dev_pm_genpd_suspend|resume(), as this allows a
    domain idlestate to be selected for the current CPU by genpd.
    
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>