mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
Cluster pm notifications without level information increases difficulty and complexity for the registered drivers to figure out when the last coherency level is going into power collapse. Send notifications with level information that allows the registered drivers to easily determine the cluster level that is going in/out of power collapse. There is an issue with this implementation. GIC driver saves and restores the distributed registers as part of cluster notifications. On newer platforms there are multiple cluster levels are defined (e.g l2, cci etc). These cluster level notifications can happen independently. On MSM platforms GIC is still active while the cluster sleeps in idle, causing the GIC state to be overwritten with an incorrect previous state of the interrupts. This leads to a system hang. Do not save and restore on any L2 and higher cache coherency level sleep entry and exit. Change-Id: I31918d6383f19e80fe3b064cfaf0b55e16b97eb6 Signed-off-by: Archana Sathyakumar <asathyak@codeaurora.org> Signed-off-by: Murali Nalajala <mnalajal@codeaurora.org> Signed-off-by: Mahesh Sivasubramanian <msivasub@codeaurora.org> Signed-off-by: Stepan Moskovchenko <stepanm@codeaurora.org>
110 lines
2.9 KiB
C
110 lines
2.9 KiB
C
/*
|
|
* Copyright (C) 2011 Google, Inc.
|
|
*
|
|
* Author:
|
|
* Colin Cross <ccross@android.com>
|
|
*
|
|
* This software is licensed under the terms of the GNU General Public
|
|
* License version 2, as published by the Free Software Foundation, and
|
|
* may be copied, distributed, and modified under those terms.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
*/
|
|
|
|
#ifndef _LINUX_CPU_PM_H
|
|
#define _LINUX_CPU_PM_H
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/notifier.h>
|
|
|
|
/*
|
|
* When a CPU goes to a low power state that turns off power to the CPU's
|
|
* power domain, the contents of some blocks (floating point coprocessors,
|
|
* interrupt controllers, caches, timers) in the same power domain can
|
|
* be lost. The cpm_pm notifiers provide a method for platform idle, suspend,
|
|
* and hotplug implementations to notify the drivers for these blocks that
|
|
* they may be reset.
|
|
*
|
|
* All cpu_pm notifications must be called with interrupts disabled.
|
|
*
|
|
* The notifications are split into two classes: CPU notifications and CPU
|
|
* cluster notifications.
|
|
*
|
|
* CPU notifications apply to a single CPU and must be called on the affected
|
|
* CPU. They are used to save per-cpu context for affected blocks.
|
|
*
|
|
* CPU cluster notifications apply to all CPUs in a single power domain. They
|
|
* are used to save any global context for affected blocks, and must be called
|
|
* after all the CPUs in the power domain have been notified of the low power
|
|
* state.
|
|
*/
|
|
|
|
/*
|
|
* Event codes passed as unsigned long val to notifier calls
|
|
*/
|
|
enum cpu_pm_event {
|
|
/* A single cpu is entering a low power state */
|
|
CPU_PM_ENTER,
|
|
|
|
/* A single cpu failed to enter a low power state */
|
|
CPU_PM_ENTER_FAILED,
|
|
|
|
/* A single cpu is exiting a low power state */
|
|
CPU_PM_EXIT,
|
|
|
|
/* A cpu power domain is entering a low power state */
|
|
CPU_CLUSTER_PM_ENTER,
|
|
|
|
/* A cpu power domain failed to enter a low power state */
|
|
CPU_CLUSTER_PM_ENTER_FAILED,
|
|
|
|
/* A cpu power domain is exiting a low power state */
|
|
CPU_CLUSTER_PM_EXIT,
|
|
};
|
|
|
|
#ifdef CONFIG_CPU_PM
|
|
int cpu_pm_register_notifier(struct notifier_block *nb);
|
|
int cpu_pm_unregister_notifier(struct notifier_block *nb);
|
|
int cpu_pm_enter(void);
|
|
int cpu_pm_exit(void);
|
|
int cpu_cluster_pm_enter(unsigned long aff_level);
|
|
int cpu_cluster_pm_exit(unsigned long aff_level);
|
|
|
|
#else
|
|
|
|
static inline int cpu_pm_register_notifier(struct notifier_block *nb)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int cpu_pm_unregister_notifier(struct notifier_block *nb)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int cpu_pm_enter(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int cpu_pm_exit(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int cpu_cluster_pm_enter(unsigned long aff_level)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int cpu_cluster_pm_exit(unsigned long aff_level)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
#endif
|