1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright(c) 2018 Intel Corporation. All rights reserved.
4  *
5  * Author: Tomasz Lauda <tomasz.lauda@linux.intel.com>
6  *         Janusz Jankowski <janusz.jankowski@linux.intel.com>
7  */
8 
9 /**
10  * \file xtos/include/sof/lib/pm_runtime.h
11  * \brief Runtime power management header file
12  * \author Tomasz Lauda <tomasz.lauda@linux.intel.com>
13  */
14 
15 #ifndef __SOF_LIB_PM_RUNTIME_H__
16 #define __SOF_LIB_PM_RUNTIME_H__
17 
18 #include <platform/lib/pm_runtime.h>
19 #include <rtos/sof.h>
20 #include <rtos/spinlock.h>
21 #include <sof/trace/trace.h>
22 #include <user/trace.h>
23 #include <stdint.h>
24 
25 /** \addtogroup pm_runtime PM Runtime
26  *  PM runtime specification.
27  *  @{
28  */
29 
30 /* PM runtime flags */
31 
32 #define RPM_ASYNC		0x01	/**< Request is asynchronous */
33 
34 /** \brief Runtime power management context */
35 enum pm_runtime_context {
36 	PM_RUNTIME_HOST_DMA_L1 = 0,	/**< Host DMA L1 */
37 	SSP_CLK,			/**< SSP Clock */
38 	SSP_POW,			/**< SSP Power */
39 	DMIC_CLK,			/**< DMIC Clock */
40 	DMIC_POW,			/**< DMIC Power */
41 	DW_DMAC_CLK,			/**< DW DMAC Clock */
42 	CORE_MEMORY_POW,		/**< Core Memory power */
43 	CORE_HP_CLK,			/**< High Performance Clock*/
44 	PM_RUNTIME_DSP			/**< DSP */
45 };
46 
47 /** \brief Runtime power management data. */
48 struct pm_runtime_data {
49 	struct k_spinlock lock;	/**< lock mechanism */
50 	void *platform_data;	/**< platform specific data */
51 #if CONFIG_DSP_RESIDENCY_COUNTERS
52 	struct r_counters_data *r_counters; /**< diagnostic DSP residency counters */
53 #endif
54 };
55 
56 #if CONFIG_DSP_RESIDENCY_COUNTERS
57 /**
58  * \brief DSP residency counters
59  * R0, R1, R2 are DSP residency counters which can be used differently
60  * based on platform implementation.
61  * In general R0 is the highest power consumption state while R2 is
62  * the lowest power consumption state. See platform specific pm_runtime.h
63  * for the platform HW specific mapping.
64  */
65 enum dsp_r_state {
66 	r0_r_state = 0,
67 	r1_r_state,
68 	r2_r_state
69 };
70 
71 /** \brief Diagnostic DSP residency counters data */
72 struct r_counters_data {
73 	enum dsp_r_state cur_r_state;	/**< current dsp_r_state */
74 	uint64_t ts;					/**< dsp_r_state timestamp */
75 };
76 #endif
77 
78 /**
79  * \brief Initializes runtime power management.
80  */
81 void pm_runtime_init(struct sof *sof);
82 
83 /**
84  * \brief Retrieves power management resource (async).
85  *
86  * \param[in] context Type of power management context.
87  * \param[in] index Index of the device.
88  */
89 void pm_runtime_get(enum pm_runtime_context context, uint32_t index);
90 
91 /**
92  * \brief Retrieves power management resource.
93  *
94  * \param[in] context Type of power management context.
95  * \param[in] index Index of the device.
96  */
97 void pm_runtime_get_sync(enum pm_runtime_context context, uint32_t index);
98 
99 /**
100  * \brief Releases power management resource (async).
101  *
102  * \param[in] context Type of power management context.
103  * \param[in] index Index of the device.
104  */
105 void pm_runtime_put(enum pm_runtime_context context, uint32_t index);
106 
107 /**
108  * \brief Releases power management resource.
109  *
110  * \param[in] context Type of power management context.
111  * \param[in] index Index of the device.
112  */
113 void pm_runtime_put_sync(enum pm_runtime_context context, uint32_t index);
114 
115 /**
116  * \brief Enables power management operations for the resource.
117  *
118  * \param[in] context Type of power management context.
119  * \param[in] index Index of the device.
120  */
121 void pm_runtime_enable(enum pm_runtime_context context, uint32_t index);
122 
123 /**
124  * \brief Disables power management operations for the resource.
125  *
126  * \param[in] context Type of power management context.
127  * \param[in] index Index of the device.
128  */
129 void pm_runtime_disable(enum pm_runtime_context context, uint32_t index);
130 
131 /**
132  * \brief Reports state of the power managed resource.
133  *
134  * @param context Type of power management context.
135  * @param index Index of the resource.
136  *
137  * @return true if the resource is active or pm disabled, false otherwise.
138  */
139 bool pm_runtime_is_active(enum pm_runtime_context context, uint32_t index);
140 
141 /**
142  * \brief Retrieves pointer to runtime power management data.
143  *
144  * @return Runtime power management data pointer.
145  */
pm_runtime_data_get(void)146 static inline struct pm_runtime_data *pm_runtime_data_get(void)
147 {
148 	return sof_get()->prd;
149 }
150 
151 #if CONFIG_DSP_RESIDENCY_COUNTERS
152 /**
153  * \brief Initializes DSP residency counters.
154  *
155  * \param[in] context Type of power management context.
156  */
157 void init_dsp_r_state(enum dsp_r_state);
158 
159 /**
160  * \brief Reports DSP residency state.
161  *
162  * \param[in] new state
163  */
164 void report_dsp_r_state(enum dsp_r_state);
165 
166 /**
167  * \brief Retrieves current DSP residency state.
168  *
169  * @return active DSP residency state
170  */
171 enum dsp_r_state get_dsp_r_state(void);
172 #endif
173 
174 /** @}*/
175 
176 #endif /* __SOF_LIB_PM_RUNTIME_H__ */
177