1*fcd41e86SJacky Bai /* SPDX-License-Identifier: BSD-3-Clause */
2*fcd41e86SJacky Bai /**
3*fcd41e86SJacky Bai * Copyright 2019-2024 NXP
4*fcd41e86SJacky Bai *
5*fcd41e86SJacky Bai * KEYWORDS: micro-power uPower driver API
6*fcd41e86SJacky Bai * -----------------------------------------------------------------------------
7*fcd41e86SJacky Bai * PURPOSE: SoC-dependent uPower driver API #defines and typedefs shared
8*fcd41e86SJacky Bai * with the firmware
9*fcd41e86SJacky Bai * -----------------------------------------------------------------------------
10*fcd41e86SJacky Bai * PARAMETERS:
11*fcd41e86SJacky Bai * PARAM NAME RANGE:DESCRIPTION: DEFAULTS: UNITS
12*fcd41e86SJacky Bai * -----------------------------------------------------------------------------
13*fcd41e86SJacky Bai * REUSE ISSUES: no reuse issues
14*fcd41e86SJacky Bai */
15*fcd41e86SJacky Bai
16*fcd41e86SJacky Bai #ifndef UPWR_SOC_DEFS_H
17*fcd41e86SJacky Bai #define UPWR_SOC_DEFS_H
18*fcd41e86SJacky Bai
19*fcd41e86SJacky Bai #include <stdbool.h>
20*fcd41e86SJacky Bai #include <stdint.h>
21*fcd41e86SJacky Bai
22*fcd41e86SJacky Bai #include "upower_defs.h"
23*fcd41e86SJacky Bai
24*fcd41e86SJacky Bai #define UPWR_MU_MSG_SIZE (2U) /* words */
25*fcd41e86SJacky Bai
26*fcd41e86SJacky Bai #ifdef NUM_PMC_SWT_WORDS
27*fcd41e86SJacky Bai #define UPWR_PMC_SWT_WORDS NUM_PMC_SWT_WORDS
28*fcd41e86SJacky Bai #endif
29*fcd41e86SJacky Bai
30*fcd41e86SJacky Bai #ifdef NUM_PMC_RAM_WORDS
31*fcd41e86SJacky Bai #define UPWR_PMC_MEM_WORDS NUM_PMC_RAM_WORDS
32*fcd41e86SJacky Bai #endif
33*fcd41e86SJacky Bai
34*fcd41e86SJacky Bai #ifndef UPWR_DRAM_SHARED_BASE_ADDR
35*fcd41e86SJacky Bai #define UPWR_DRAM_SHARED_BASE_ADDR (0x28330000U)
36*fcd41e86SJacky Bai #endif
37*fcd41e86SJacky Bai
38*fcd41e86SJacky Bai #ifndef UPWR_DRAM_SHARED_SIZE
39*fcd41e86SJacky Bai #define UPWR_DRAM_SHARED_SIZE (2048U)
40*fcd41e86SJacky Bai #endif
41*fcd41e86SJacky Bai
42*fcd41e86SJacky Bai #define UPWR_DRAM_SHARED_ENDPLUS (UPWR_DRAM_SHARED_BASE_ADDR+\
43*fcd41e86SJacky Bai UPWR_DRAM_SHARED_SIZE)
44*fcd41e86SJacky Bai
45*fcd41e86SJacky Bai #ifndef UPWR_API_BUFFER_BASE
46*fcd41e86SJacky Bai #define UPWR_API_BUFFER_BASE (0x28330600U)
47*fcd41e86SJacky Bai #endif
48*fcd41e86SJacky Bai
49*fcd41e86SJacky Bai #ifndef UPWR_API_BUFFER_ENDPLUS
50*fcd41e86SJacky Bai #define UPWR_API_BUFFER_ENDPLUS (UPWR_DRAM_SHARED_ENDPLUS - 64U)
51*fcd41e86SJacky Bai #endif
52*fcd41e86SJacky Bai
53*fcd41e86SJacky Bai #ifndef UPWR_PMC_SWT_WORDS
54*fcd41e86SJacky Bai #define UPWR_PMC_SWT_WORDS (1U)
55*fcd41e86SJacky Bai #endif
56*fcd41e86SJacky Bai
57*fcd41e86SJacky Bai #ifndef UPWR_PMC_MEM_WORDS
58*fcd41e86SJacky Bai #define UPWR_PMC_MEM_WORDS (2U)
59*fcd41e86SJacky Bai #endif
60*fcd41e86SJacky Bai
61*fcd41e86SJacky Bai #define UPWR_OSC_HI_FREQ (64U) // MHz
62*fcd41e86SJacky Bai #define UPWR_OSC_LO_FREQ (16U) // MHz
63*fcd41e86SJacky Bai
64*fcd41e86SJacky Bai #ifndef UPWR_I2C_FREQ
65*fcd41e86SJacky Bai #define UPWR_I2C_FREQ (UPWR_OSC_HI_FREQ * 1000000U)
66*fcd41e86SJacky Bai #endif
67*fcd41e86SJacky Bai
68*fcd41e86SJacky Bai /*
69*fcd41e86SJacky Bai * i.MX8ULP-dependent uPower API Definition
70*fcd41e86SJacky Bai *
71*fcd41e86SJacky Bai * This chapter documents the API definitions that are specific to the
72*fcd41e86SJacky Bai * i.MX8ULP SoC.
73*fcd41e86SJacky Bai *
74*fcd41e86SJacky Bai */
75*fcd41e86SJacky Bai
76*fcd41e86SJacky Bai /**---------------------------------------------------------------
77*fcd41e86SJacky Bai * INITIALIZATION, CONFIGURATION
78*fcd41e86SJacky Bai *
79*fcd41e86SJacky Bai * i.MX8ULP provides only one Message Unit (MU) for each core domain:
80*fcd41e86SJacky Bai * Real Time Domain (RTD) and Application Domain (APD), which has two A35 cores.
81*fcd41e86SJacky Bai * Both A35 cores in APD must share the same API instance, meaning upwr_init
82*fcd41e86SJacky Bai * must be called only once for each domain. The API does not provide any
83*fcd41e86SJacky Bai * mutually exclusion or locking mechanism for concurrent accesses from both
84*fcd41e86SJacky Bai * APD cores, so any API arbitration, if needed, must be implemented by the
85*fcd41e86SJacky Bai * API user code.
86*fcd41e86SJacky Bai *
87*fcd41e86SJacky Bai * A domain must not go to Power Down (PD) or Deep Power Down (DPD) power modes
88*fcd41e86SJacky Bai * with any service still pending (response not received).
89*fcd41e86SJacky Bai *
90*fcd41e86SJacky Bai * Next sections describe the i.MX8ULP particularities of service calls.
91*fcd41e86SJacky Bai *
92*fcd41e86SJacky Bai */
93*fcd41e86SJacky Bai
94*fcd41e86SJacky Bai /**+
95*fcd41e86SJacky Bai * upwr_start()
96*fcd41e86SJacky Bai *
97*fcd41e86SJacky Bai * i.MX8ULP ROM firmware provides only the launch option 0, which has no
98*fcd41e86SJacky Bai * power mode transition support and provides the following services:
99*fcd41e86SJacky Bai * - upwr_xcp_config
100*fcd41e86SJacky Bai * - upwr_xcp_sw_alarm
101*fcd41e86SJacky Bai * - upwr_pwm_param
102*fcd41e86SJacky Bai * - upwr_pwm_power_on
103*fcd41e86SJacky Bai * - upwr_pwm_power-off
104*fcd41e86SJacky Bai * - upwr_pwm_mem_retain
105*fcd41e86SJacky Bai * - upwr_pwm_chng_dom_bias
106*fcd41e86SJacky Bai * - upwr_pwm_chng_mem_bias
107*fcd41e86SJacky Bai *
108*fcd41e86SJacky Bai * i.MX8ULP RAM firmware provides 2 launch options:
109*fcd41e86SJacky Bai *
110*fcd41e86SJacky Bai * 1. starts all tasks, services and power mode ones;
111*fcd41e86SJacky Bai * this is the full-featured firmware option.
112*fcd41e86SJacky Bai * 2. starts only the power mode tasks; services are not available with
113*fcd41e86SJacky Bai * this option, and futher calls to upwr_start (from either domain)
114*fcd41e86SJacky Bai * have no response; this option is mostly used to accelerate power mode
115*fcd41e86SJacky Bai * mixed-signal simulations, and not intended to be used with silicon.
116*fcd41e86SJacky Bai *
117*fcd41e86SJacky Bai * Note: option 0 is also available if the RAM firmware is loaded.
118*fcd41e86SJacky Bai */
119*fcd41e86SJacky Bai
120*fcd41e86SJacky Bai /* service upwr_pwm_set_domain_pmic_rail message argument fields*/
121*fcd41e86SJacky Bai typedef struct {
122*fcd41e86SJacky Bai uint32_t domain : 16U;
123*fcd41e86SJacky Bai uint32_t rail : 16U;
124*fcd41e86SJacky Bai } upwr_pwm_dom_pmic_rail_args;
125*fcd41e86SJacky Bai
126*fcd41e86SJacky Bai #define UPWR_FILL_DOMBIAS_ARGS(dom, bias, args) \
127*fcd41e86SJacky Bai do { \
128*fcd41e86SJacky Bai (args).B.domapply = (args).B.avdapply = 0U; \
129*fcd41e86SJacky Bai switch ((bias)->apply) { \
130*fcd41e86SJacky Bai case BIAS_APPLY_RTD_AVD: \
131*fcd41e86SJacky Bai (args).B.avdapply = 1U; \
132*fcd41e86SJacky Bai /* fall through */ \
133*fcd41e86SJacky Bai case BIAS_APPLY_RTD: \
134*fcd41e86SJacky Bai (dom) = (uint32_t)RTD_DOMAIN; \
135*fcd41e86SJacky Bai (args).B.domapply = 1U; \
136*fcd41e86SJacky Bai break; \
137*fcd41e86SJacky Bai case BIAS_APPLY_APD_AVD: \
138*fcd41e86SJacky Bai (args).B.avdapply = 1U; \
139*fcd41e86SJacky Bai /* fall through */ \
140*fcd41e86SJacky Bai case BIAS_APPLY_APD: \
141*fcd41e86SJacky Bai (dom) = (uint32_t)APD_DOMAIN; \
142*fcd41e86SJacky Bai (args).B.domapply = 1U; \
143*fcd41e86SJacky Bai break; \
144*fcd41e86SJacky Bai case BIAS_APPLY_AVD: \
145*fcd41e86SJacky Bai (args).B.avdapply = 1U; \
146*fcd41e86SJacky Bai break; \
147*fcd41e86SJacky Bai default: \
148*fcd41e86SJacky Bai break; \
149*fcd41e86SJacky Bai } \
150*fcd41e86SJacky Bai (args).B.dommode = (uint32_t)((bias)->dommode); \
151*fcd41e86SJacky Bai (args).B.avdmode = (uint32_t)((bias)->avdmode); \
152*fcd41e86SJacky Bai uint32_t sat = UPWR_BIAS2MILIV((1UL << UPWR_DOMBIAS_RBB_BITS) - 1UL);\
153*fcd41e86SJacky Bai (args).B.domrbbn = ((bias)->dombias.rbbn > sat) ? sat : \
154*fcd41e86SJacky Bai UPWR_BIAS_MILIV((bias)->dombias.rbbn); \
155*fcd41e86SJacky Bai (args).B.domrbbp = ((bias)->dombias.rbbp > sat) ? sat : \
156*fcd41e86SJacky Bai UPWR_BIAS_MILIV((bias)->dombias.rbbp); \
157*fcd41e86SJacky Bai (args).B.avdrbbn = ((bias)->avdbias.rbbn > sat) ? sat : \
158*fcd41e86SJacky Bai UPWR_BIAS_MILIV((bias)->avdbias.rbbn); \
159*fcd41e86SJacky Bai (args).B.avdrbbp = ((bias)->avdbias.rbbp > sat) ? sat : \
160*fcd41e86SJacky Bai UPWR_BIAS_MILIV((bias)->avdbias.rbbp); \
161*fcd41e86SJacky Bai } while (false)
162*fcd41e86SJacky Bai
163*fcd41e86SJacky Bai #define UPWR_FILL_MEMBIAS_ARGS(bias, args) \
164*fcd41e86SJacky Bai do { \
165*fcd41e86SJacky Bai (args).B.en = (bias)->en; \
166*fcd41e86SJacky Bai } while (false)
167*fcd41e86SJacky Bai
168*fcd41e86SJacky Bai
169*fcd41e86SJacky Bai #define UPWR_APD_CORES (2U)
170*fcd41e86SJacky Bai #define UPWR_RTD_CORES (1U)
171*fcd41e86SJacky Bai
172*fcd41e86SJacky Bai #define RTD_DOMAIN (0U)
173*fcd41e86SJacky Bai #define APD_DOMAIN (1U)
174*fcd41e86SJacky Bai #define UPWR_MAIN_DOMAINS (2U)
175*fcd41e86SJacky Bai #define AVD_DOMAIN (2U)
176*fcd41e86SJacky Bai #define UPWR_DOMAIN_COUNT (3U)
177*fcd41e86SJacky Bai #define PSD_DOMAIN (3U)
178*fcd41e86SJacky Bai #define UPWR_ALL_DOMAINS (4U)
179*fcd41e86SJacky Bai
180*fcd41e86SJacky Bai typedef uint32_t soc_domain_t;
181*fcd41e86SJacky Bai
182*fcd41e86SJacky Bai /*=========================================================================
183*fcd41e86SJacky Bai * UNIT CONVERSION MACROS
184*fcd41e86SJacky Bai * These macros convert physical units to the values passed as arguments
185*fcd41e86SJacky Bai * in API functions.
186*fcd41e86SJacky Bai *=========================================================================
187*fcd41e86SJacky Bai */
188*fcd41e86SJacky Bai
189*fcd41e86SJacky Bai #define UPWR_VOLT_MILIV(v) (v) /* voltage in mV to argument value */
190*fcd41e86SJacky Bai #define UPWR_VOLT_MICROV(v)((v) / 1000U) /* voltage in uV to argument value */
191*fcd41e86SJacky Bai #define UPWR_BIAS_MILIV(v) (((v) + 49UL) / 50UL) /* bias voltage(mV) to argument value */
192*fcd41e86SJacky Bai #define UPWR_BIAS2MILIV(v) ((v) * 50UL) /* inverse of UPWR_BIAS_MILIV */
193*fcd41e86SJacky Bai #define UPWR_FREQ_KHZ(f) (f) /* frequency (kHz) to argument value */
194*fcd41e86SJacky Bai
195*fcd41e86SJacky Bai #define UPWR_DOMBIAS_MAX_MV (UPWR_BIAS2MILIV((1U << UPWR_DOMBIAS_RBB_BITS) - 1U))
196*fcd41e86SJacky Bai
197*fcd41e86SJacky Bai /**---------------------------------------------------------------
198*fcd41e86SJacky Bai * EXCEPTION SERVICE GROUP
199*fcd41e86SJacky Bai */
200*fcd41e86SJacky Bai
201*fcd41e86SJacky Bai /**+
202*fcd41e86SJacky Bai * upwr_xcp_config()
203*fcd41e86SJacky Bai *
204*fcd41e86SJacky Bai * The i.MX8ULP uPower configuration struct contains the following bitfields:
205*fcd41e86SJacky Bai *
206*fcd41e86SJacky Bai * - ALARM_INT (1 bit): tells which RTD MU interrupt should be used for alarms;
207*fcd41e86SJacky Bai * 1= MU GPI1; 0= MU GPI0; APD alarms always use GPI0.
208*fcd41e86SJacky Bai * - CFG_IOMUX (1 bit): determintes if uPower configures i.MX8ULP IOMUX for
209*fcd41e86SJacky Bai * I2C and mode pins used to control an external PMIC;
210*fcd41e86SJacky Bai * 1= uPower firmware or PMIC driver configures i.MX8ULP IOMUX and mode pins;
211*fcd41e86SJacky Bai * 0= i.MX8ULP IOMUX and mode pins not configured by uPower;
212*fcd41e86SJacky Bai * - DGNBUFBITS (4 bits): determines the diagnostic buffer size according to
213*fcd41e86SJacky Bai * the formula: size = 2^(DGNBUFBITS+3) bytes;
214*fcd41e86SJacky Bai *
215*fcd41e86SJacky Bai * Defaults are all zeroes; all other bits are reserved, and must be written 0.
216*fcd41e86SJacky Bai */
217*fcd41e86SJacky Bai
218*fcd41e86SJacky Bai typedef union {
219*fcd41e86SJacky Bai uint32_t R;
220*fcd41e86SJacky Bai struct {
221*fcd41e86SJacky Bai uint32_t ALARM_INT : 1U;
222*fcd41e86SJacky Bai uint32_t CFG_IOMUX : 1U;
223*fcd41e86SJacky Bai uint32_t DGNBUFBITS : 4U;
224*fcd41e86SJacky Bai uint32_t RSV : 26U;
225*fcd41e86SJacky Bai } B;
226*fcd41e86SJacky Bai } upwr_xcp_config_t;
227*fcd41e86SJacky Bai
228*fcd41e86SJacky Bai /**+
229*fcd41e86SJacky Bai * upwr_xcp_sw_alarm()
230*fcd41e86SJacky Bai *
231*fcd41e86SJacky Bai * Argument code is defined by the enum upwr_alarm_t, with the values:
232*fcd41e86SJacky Bai * - UPWR_ALARM_INTERNAL: internal software error
233*fcd41e86SJacky Bai * - UPWR_ALARM_EXCEPTION: uPower core exception, either illegal instruction or
234*fcd41e86SJacky Bai * bus error
235*fcd41e86SJacky Bai * - UPWR_ALARM_SLACK: delay path too slow, meaning a timing violation occurred
236*fcd41e86SJacky Bai * or is iminent.
237*fcd41e86SJacky Bai * - UPWR_ALARM_VOLTAGE: one of the measured voltages is below safety margins.
238*fcd41e86SJacky Bai *
239*fcd41e86SJacky Bai * Note that this service emulates an alarm that would normally be issued by
240*fcd41e86SJacky Bai * uPower when it detects one of the causes above. A request to alarm the APD
241*fcd41e86SJacky Bai * domain when it is powered off returns success, but is ineffective.
242*fcd41e86SJacky Bai *
243*fcd41e86SJacky Bai */
244*fcd41e86SJacky Bai
245*fcd41e86SJacky Bai #define UPWR_ALARM_INTERNAL (0U) /* internal error */
246*fcd41e86SJacky Bai #define UPWR_ALARM_EXCEPTION (1U) /* core exception */
247*fcd41e86SJacky Bai #define UPWR_ALARM_SLACK (2U) /* delay path too slow */
248*fcd41e86SJacky Bai #define UPWR_ALARM_VOLTAGE (3U) /* voltage drop */
249*fcd41e86SJacky Bai #define UPWR_ALARM_LAST UPWR_ALARM_VOLTAGE
250*fcd41e86SJacky Bai
251*fcd41e86SJacky Bai typedef uint32_t upwr_alarm_t;
252*fcd41e86SJacky Bai
253*fcd41e86SJacky Bai /**---------------------------------------------------------------
254*fcd41e86SJacky Bai * POWER MANAGEMENT SERVICE GROUP
255*fcd41e86SJacky Bai */
256*fcd41e86SJacky Bai
257*fcd41e86SJacky Bai /* values in mV: */
258*fcd41e86SJacky Bai #define UPWR_RTD_RBBN_MAX (1300U) /* max. RTD Reverse Back Bias N-Well */
259*fcd41e86SJacky Bai #define UPWR_RTD_RBBN_MIN (100U) /* min. RTD Reverse Back Bias N-Well */
260*fcd41e86SJacky Bai
261*fcd41e86SJacky Bai #define UPWR_RTD_RBBP_MAX (1300U) /* max. RTD Reverse Back Bias P-Well */
262*fcd41e86SJacky Bai #define UPWR_RTD_RBBP_MIN (100U) /* min. RTD Reverse Back Bias P-Well */
263*fcd41e86SJacky Bai
264*fcd41e86SJacky Bai /* APD bias can only two values (mV): */
265*fcd41e86SJacky Bai #define UPWR_APD_RBBN_LO (1000U) /* low APD Reverse Back Bias N-Well */
266*fcd41e86SJacky Bai #define UPWR_APD_RBBN_HI (1300U) /* high APD Reverse Back Bias N-Well */
267*fcd41e86SJacky Bai
268*fcd41e86SJacky Bai #define UPWR_APD_RBBP_LO (1000U) /* low APD Reverse Back Bias P-Well */
269*fcd41e86SJacky Bai #define UPWR_APD_RBBP_HI (1300U) /* high APD Reverse Back Bias P-Well */
270*fcd41e86SJacky Bai
271*fcd41e86SJacky Bai /* AVD bias can only two values (mV): */
272*fcd41e86SJacky Bai #define UPWR_AVD_RBBN_LO (1000U) /* low AVD Reverse Back Bias N-Well */
273*fcd41e86SJacky Bai #define UPWR_AVD_RBBN_HI (1300U) /* high AVD Reverse Back Bias N-Well */
274*fcd41e86SJacky Bai
275*fcd41e86SJacky Bai #define UPWR_AVD_RBBP_LO (1000U) /* low AVD Reverse Back Bias P-Well */
276*fcd41e86SJacky Bai #define UPWR_AVD_RBBP_HI (1300U) /* high AVD Reverse Back Bias P-Well */
277*fcd41e86SJacky Bai
278*fcd41e86SJacky Bai /**+
279*fcd41e86SJacky Bai * upwr_pwm_param()
280*fcd41e86SJacky Bai *
281*fcd41e86SJacky Bai * Argument param is defined by the struct/union upwr_pwm_param_t with the
282*fcd41e86SJacky Bai * following i.MX8ULP-specific bitfields:
283*fcd41e86SJacky Bai * - DPD_ALLOW (1 bit): 1= allows uPower power mode to go Deep Power Down (DPD);
284*fcd41e86SJacky Bai * uPower DPD also depends on other conditions, but if this bit is 0 uPower
285*fcd41e86SJacky Bai * won't go DPD even if those conditions are met; it can go either Sleep or
286*fcd41e86SJacky Bai * Deep Sleep (DSL) depending on the other configurations.
287*fcd41e86SJacky Bai * - DSL_DIS (1 bit): if this bit is 1, uPower power mode won't go Deep Sleep
288*fcd41e86SJacky Bai * (DSL) even if the other conditions for that are met;
289*fcd41e86SJacky Bai * it may go Sleep instead.
290*fcd41e86SJacky Bai * - SLP_ALLOW (1 bit): if this bit is 1, uPower power mode will go Sleep if
291*fcd41e86SJacky Bai * the conditions for Partial Active are met; it may also go Deep Sleep if bit
292*fcd41e86SJacky Bai * DSL_DIS=1.
293*fcd41e86SJacky Bai * - DSL_BGAP_OFF (1 bit): 1= turns bandgap off when uPower goes Deep Sleep;
294*fcd41e86SJacky Bai * 0= leaves bandgap on when uPower goes Deep Sleep (DSL).
295*fcd41e86SJacky Bai * - DPD_BGAP_ON (1 bit): 1= leaves bandgap on when uPower goes Deep Power Down
296*fcd41e86SJacky Bai * (DPD); 0= powers off bandgap when uPower goes Deep Power Down (DPD).
297*fcd41e86SJacky Bai *
298*fcd41e86SJacky Bai * Defaults are all zeroes; all other bits are reserved, and must be written 0.
299*fcd41e86SJacky Bai */
300*fcd41e86SJacky Bai
301*fcd41e86SJacky Bai typedef union {
302*fcd41e86SJacky Bai uint32_t R;
303*fcd41e86SJacky Bai struct {
304*fcd41e86SJacky Bai uint32_t DPD_ALLOW : 1U;
305*fcd41e86SJacky Bai uint32_t DSL_DIS : 1U;
306*fcd41e86SJacky Bai uint32_t SLP_ALLOW : 1U;
307*fcd41e86SJacky Bai uint32_t DSL_BGAP_OFF : 1U;
308*fcd41e86SJacky Bai uint32_t DPD_BGAP_ON : 1U;
309*fcd41e86SJacky Bai uint32_t RSV : 27U;
310*fcd41e86SJacky Bai } B;
311*fcd41e86SJacky Bai } upwr_pwm_param_t;
312*fcd41e86SJacky Bai
313*fcd41e86SJacky Bai /**+
314*fcd41e86SJacky Bai * upwr_pwm_chng_reg_voltage()
315*fcd41e86SJacky Bai *
316*fcd41e86SJacky Bai * Argument reg is defined by the enum upwr_pmc_reg_t, with regulator ids:
317*fcd41e86SJacky Bai * - RTD_PMC_REG: RTD regulator
318*fcd41e86SJacky Bai * - APD_PMC_REG: APD regulator
319*fcd41e86SJacky Bai * - RTD_BIAS_PMC_REG: RTD bias regulator
320*fcd41e86SJacky Bai * - APD_BIAS_PMC_REG: APD bias regulator
321*fcd41e86SJacky Bai * - RTD_LVD_PMC_MON: RTD LVD regulator
322*fcd41e86SJacky Bai * - APD_LVD_PMC_MON: APD LVD regulator
323*fcd41e86SJacky Bai * - AVD_LVD_PMC_MON: AVD LVD regulator
324*fcd41e86SJacky Bai *
325*fcd41e86SJacky Bai * Argument volt is defined by the formula:
326*fcd41e86SJacky Bai *
327*fcd41e86SJacky Bai * argument = 92.30797633*V - 55.000138, rounded to the nearest integer,
328*fcd41e86SJacky Bai * where V is the value in Volts, with a minimum of 0.595833 V (argument = 0).
329*fcd41e86SJacky Bai *
330*fcd41e86SJacky Bai */
331*fcd41e86SJacky Bai
332*fcd41e86SJacky Bai /* Regulator ids */
333*fcd41e86SJacky Bai typedef enum {
334*fcd41e86SJacky Bai RTD_PMC_REG,
335*fcd41e86SJacky Bai APD_PMC_REG,
336*fcd41e86SJacky Bai RTD_BIAS_PMC_REG,
337*fcd41e86SJacky Bai APD_BIAS_PMC_REG,
338*fcd41e86SJacky Bai RTD_LVD_PMC_MON,
339*fcd41e86SJacky Bai APD_LVD_PMC_MON,
340*fcd41e86SJacky Bai AVD_LVD_PMC_MON
341*fcd41e86SJacky Bai } upwr_pmc_reg_t;
342*fcd41e86SJacky Bai
343*fcd41e86SJacky Bai /**+
344*fcd41e86SJacky Bai * upwr_pwm_freq_setup()
345*fcd41e86SJacky Bai *
346*fcd41e86SJacky Bai * Argument domain is either RTD_DOMAIN or APD_DOMAIN.
347*fcd41e86SJacky Bai * Arguments nextfq and currfq are to be defined (TBD).
348*fcd41e86SJacky Bai */
349*fcd41e86SJacky Bai
350*fcd41e86SJacky Bai /**+
351*fcd41e86SJacky Bai * upwr_pwm_dom_power_on()
352*fcd41e86SJacky Bai *
353*fcd41e86SJacky Bai * The arguments must comply with the restrictions below, otherwise the service
354*fcd41e86SJacky Bai * is not executed and returns error UPWR_RESP_BAD_REQ:
355*fcd41e86SJacky Bai * - argument domain can only be APD_DOMAIN, because in i.MX8ULP it is not
356*fcd41e86SJacky Bai * possible APD powered on (calling the service) with RTD completely
357*fcd41e86SJacky Bai * powered off.
358*fcd41e86SJacky Bai * - the call can only be made from the RTD domain, for the same reason.
359*fcd41e86SJacky Bai * - argument boot can only be 1, because in i.MX8ULP it is not possible to
360*fcd41e86SJacky Bai * power on the APD domain without starting the core boot.
361*fcd41e86SJacky Bai *
362*fcd41e86SJacky Bai * If APD is already powered on and booting/booted when the service is called,
363*fcd41e86SJacky Bai * it returns success without doing anything.
364*fcd41e86SJacky Bai */
365*fcd41e86SJacky Bai
366*fcd41e86SJacky Bai /**+
367*fcd41e86SJacky Bai * upwr_pwm_boot_start()
368*fcd41e86SJacky Bai *
369*fcd41e86SJacky Bai * The arguments must comply with the restrictions below, otherwise the service
370*fcd41e86SJacky Bai * is not executed and returns error UPWR_RESP_BAD_REQ:
371*fcd41e86SJacky Bai * - argument domain can only be APD_DOMAIN, because in i.MX8ULP it is not
372*fcd41e86SJacky Bai * possible APD powered on (calling the service) with RTD completely
373*fcd41e86SJacky Bai * powered off.
374*fcd41e86SJacky Bai * - the call can only be made from the RTD domain, for the same reason.
375*fcd41e86SJacky Bai *
376*fcd41e86SJacky Bai * If APD is already booted when the service is called, it returns success
377*fcd41e86SJacky Bai * without doing anything. Otherwise, it returns the error UPWR_RESP_BAD_STATE,
378*fcd41e86SJacky Bai * because in i.MX8ULP APD cannot be booted separately from power on.
379*fcd41e86SJacky Bai */
380*fcd41e86SJacky Bai
381*fcd41e86SJacky Bai /**+
382*fcd41e86SJacky Bai * upwr_pwm_power_on(),
383*fcd41e86SJacky Bai * upwr_pwm_power_off(),
384*fcd41e86SJacky Bai * upwr_pwm_mem_retain()
385*fcd41e86SJacky Bai *
386*fcd41e86SJacky Bai * These three service functions use the same arguments:
387*fcd41e86SJacky Bai *
388*fcd41e86SJacky Bai * argument swt is an array of one 32-bit word: uint32_t swt[1];
389*fcd41e86SJacky Bai * naturally the pointer to a single uint32_t variable may be passed.
390*fcd41e86SJacky Bai * Each bit of the word corresponds to a switch, according to the i.MX8ULP
391*fcd41e86SJacky Bai * Reference Manual Rev B draft 2 table 64 Power switch reset state,
392*fcd41e86SJacky Bai * and the following formula:
393*fcd41e86SJacky Bai *
394*fcd41e86SJacky Bai * if switch number < 10 bit number = switch number;
395*fcd41e86SJacky Bai * if switch number > 9 bit number = switch number + 3;
396*fcd41e86SJacky Bai *
397*fcd41e86SJacky Bai * bits 9, 10, 11 and 12 must have the same value (corresponding to switch 9)
398*fcd41e86SJacky Bai *
399*fcd41e86SJacky Bai * Note: this argument is not used in upwr_pwm_mem_retain.
400*fcd41e86SJacky Bai *
401*fcd41e86SJacky Bai * argument mem is an array of two 32-bit words: uint32_t mem[2];
402*fcd41e86SJacky Bai * naturally the pointer to a single uint64_t variable may be passed, since
403*fcd41e86SJacky Bai * both ARM and RISC-V are little endian architectures.
404*fcd41e86SJacky Bai * Each bit of the words corresponds to a memory, according to the i.MX8ULP
405*fcd41e86SJacky Bai * Reference Manual table "Memory Partitions".
406*fcd41e86SJacky Bai *
407*fcd41e86SJacky Bai * Turning a memory completely on (array and peripheral) will automatically
408*fcd41e86SJacky Bai * turn on its power switch, even if not explicitly commanded.
409*fcd41e86SJacky Bai * Turning a memory's power switch off will automatically turn off its array
410*fcd41e86SJacky Bai * and peripheral beforehand, even if not explicitly commanded.
411*fcd41e86SJacky Bai *
412*fcd41e86SJacky Bai * Argument restrictions:
413*fcd41e86SJacky Bai *
414*fcd41e86SJacky Bai * The swt and mem arguments must comply with the restrictions below, otherwise
415*fcd41e86SJacky Bai * the service is not executed (no switch/memory is changed) and returns error
416*fcd41e86SJacky Bai * UPWR_RESP_BAD_REQ:
417*fcd41e86SJacky Bai * 1. one must not put a memory in retention coming from an off state.
418*fcd41e86SJacky Bai * 2. switches 9, 10, 11 and 12 must be turned on/off simultaneously.
419*fcd41e86SJacky Bai * 3. an AVD switch can only be turned off if all AVD switches belong to the
420*fcd41e86SJacky Bai * domain requesting the service (as defined by registers SYSCTRL0,
421*fcd41e86SJacky Bai * LPAV_MASTER_ALLOC_CTRL and LPAV_SLAVE_ALLOC_CTRL);
422*fcd41e86SJacky Bai * there is no such restriction to turn the switch on.
423*fcd41e86SJacky Bai * 4. an AVD memory can only be turned off or put in retention if all
424*fcd41e86SJacky Bai * AVD memories belong to the domain requesting the service
425*fcd41e86SJacky Bai * (as defined by registers SYSCTRL0, LPAV_MASTER_ALLOC_CTRL and
426*fcd41e86SJacky Bai * LPAV_SLAVE_ALLOC_CTRL); there is no such restriction to turn on the
427*fcd41e86SJacky Bai * memories.
428*fcd41e86SJacky Bai * 5. EdgeLock RAMs must not be turned off, unless RTD domain is in
429*fcd41e86SJacky Bai * Deep Power Down (DPD).
430*fcd41e86SJacky Bai * 6. Power Switch 19 must be on to turn on switches 17 (MIPI/DSI),
431*fcd41e86SJacky Bai * 18 (MIPI/CSI), and all AVD power switches.
432*fcd41e86SJacky Bai *
433*fcd41e86SJacky Bai * Service Errors:
434*fcd41e86SJacky Bai *
435*fcd41e86SJacky Bai * Besides the error UPWR_RESP_BAD_REQ caused by violations of the restrictions
436*fcd41e86SJacky Bai * above, the services may fail with error UPWR_RESP_RESOURCE if a power mode
437*fcd41e86SJacky Bai * transition or a similar service is executing at the same time.
438*fcd41e86SJacky Bai * This error should be interpreted as a "try later" response, as the service
439*fcd41e86SJacky Bai * will succeed once those concurrent executions are done, and no other is
440*fcd41e86SJacky Bai * started.
441*fcd41e86SJacky Bai */
442*fcd41e86SJacky Bai
443*fcd41e86SJacky Bai /**+
444*fcd41e86SJacky Bai * upwr_pwm_chng_switch_mem()
445*fcd41e86SJacky Bai *
446*fcd41e86SJacky Bai * The bit numbers in the argument struct mask and on/off state fields
447*fcd41e86SJacky Bai * are the same as for services upwr_pwm_power_on, upwr_pwm_power_off and
448*fcd41e86SJacky Bai * upwr_pwm_mem_retain.
449*fcd41e86SJacky Bai *
450*fcd41e86SJacky Bai * Turning a memory completely on (array and peripheral) will automatically
451*fcd41e86SJacky Bai * turn on its power switch, even if not explicitly commanded.
452*fcd41e86SJacky Bai *
453*fcd41e86SJacky Bai * Argument restrictions:
454*fcd41e86SJacky Bai *
455*fcd41e86SJacky Bai * Same argument restrictions as services upwr_pwm_power_on, upwr_pwm_power_off
456*fcd41e86SJacky Bai * and upwr_pwm_mem_retain, plus the following:
457*fcd41e86SJacky Bai *
458*fcd41e86SJacky Bai * 1. one must not turn a memory peripheral on and a memory array off.
459*fcd41e86SJacky Bai * 2. one must not put a memory in retention and switch its power switch off.
460*fcd41e86SJacky Bai *
461*fcd41e86SJacky Bai * Service Errors:
462*fcd41e86SJacky Bai *
463*fcd41e86SJacky Bai * Besides the error UPWR_RESP_BAD_REQ caused by violations of the restrictions
464*fcd41e86SJacky Bai * above, the service may fail with error UPWR_RESP_RESOURCE if a power mode
465*fcd41e86SJacky Bai * transition or a similar service is executing at the same time.
466*fcd41e86SJacky Bai * This error should be interpreted as a "try later" response, as the service
467*fcd41e86SJacky Bai * will succeed once those concurrent executions are done, and no other is
468*fcd41e86SJacky Bai * started.
469*fcd41e86SJacky Bai */
470*fcd41e86SJacky Bai
471*fcd41e86SJacky Bai /**+
472*fcd41e86SJacky Bai * upwr_pwm_pmode_config()
473*fcd41e86SJacky Bai *
474*fcd41e86SJacky Bai * The same power switch and memory restrictions of service
475*fcd41e86SJacky Bai * upwr_pwm_chng_switch_mem apply between power modes, however they are not
476*fcd41e86SJacky Bai * enforced by this service, that is, it does not return service error.
477*fcd41e86SJacky Bai *
478*fcd41e86SJacky Bai * The default power mode configurations for RTD and APD are documented in the
479*fcd41e86SJacky Bai * i.MX8ULP Reference Manual sections "Power mode details (real-time domain)"
480*fcd41e86SJacky Bai * and "Power mode details (application domain)", respectively.
481*fcd41e86SJacky Bai * If those configurations are satisfactory, this service does not have
482*fcd41e86SJacky Bai * to be called.
483*fcd41e86SJacky Bai *
484*fcd41e86SJacky Bai * Power Mode Configuration Structure:
485*fcd41e86SJacky Bai *
486*fcd41e86SJacky Bai * Follows a description of the power mode configuration structure elements.
487*fcd41e86SJacky Bai * - dom_swts: the same switch configuration structures used in service
488*fcd41e86SJacky Bai * upwr_pwm_chng_switch_mem argument swt.
489*fcd41e86SJacky Bai * - mem_swts: the same memory configuration structures used in service
490*fcd41e86SJacky Bai * upwr_pwm_chng_switch_mem argument mem.
491*fcd41e86SJacky Bai * - regs: an array of structs base_reg_cfg_t (see upower_soc_defs.h),
492*fcd41e86SJacky Bai * one element for each regulator; base_reg_cfg_t has fields
493*fcd41e86SJacky Bai * mode (regulator-dependent), lvl (voltage level in uV),
494*fcd41e86SJacky Bai * comp (regulator-dependent complamentary info).
495*fcd41e86SJacky Bai * - pads: pad configuration in low power; see pad_cfg_t definition below.
496*fcd41e86SJacky Bai * - mons: domain monitors (LVD and HVD) configuration;
497*fcd41e86SJacky Bai * see mon_cfg_t definition below.
498*fcd41e86SJacky Bai * - avd_mons: same as mons for the AVD domain; see mon_cfg_t definition below.
499*fcd41e86SJacky Bai * - dom_bbias: back-bias configuration for the domain;
500*fcd41e86SJacky Bai * see base_bbias_cfg_t definition below.
501*fcd41e86SJacky Bai * - avd_bbias: back-bias configuration for the AVD domain;
502*fcd41e86SJacky Bai * see base_bbias_cfg_t definition below.
503*fcd41e86SJacky Bai * - mem_bbias: back-bias configuration for the memory;
504*fcd41e86SJacky Bai * see base_bbias_cfg_t definition below.
505*fcd41e86SJacky Bai * - mem_fbias: forward-bias configuration for the memory;
506*fcd41e86SJacky Bai * see base_fbias_cfg_t definition below.
507*fcd41e86SJacky Bai * - pmic: PMIC-specific configuration
508*fcd41e86SJacky Bai *
509*fcd41e86SJacky Bai * Structure pad_cfg_t:
510*fcd41e86SJacky Bai *
511*fcd41e86SJacky Bai * Pad control for low power modes (power off, etc), 1 bit per pad segment.
512*fcd41e86SJacky Bai * - rst : put pad segment in reset.
513*fcd41e86SJacky Bai * - iso : put pad segment in isolation.
514*fcd41e86SJacky Bai * - compl: specific pad segment information.
515*fcd41e86SJacky Bai * - msk : select which pads will be updated.
516*fcd41e86SJacky Bai *
517*fcd41e86SJacky Bai * Structure mon_cfg_t:
518*fcd41e86SJacky Bai *
519*fcd41e86SJacky Bai * Configures a voltage monitor and its actions.
520*fcd41e86SJacky Bai * There are monitors for RTD, APD and AVD, monitoring LVD and HVD.
521*fcd41e86SJacky Bai * - lvl : Voltage level (in uV).
522*fcd41e86SJacky Bai * - mode : Mode of monitor (ON, OFF, LP, etc).
523*fcd41e86SJacky Bai * - compl: Extra info for the monitor.
524*fcd41e86SJacky Bai *
525*fcd41e86SJacky Bai * Structure base_bbias_cfg_t:
526*fcd41e86SJacky Bai *
527*fcd41e86SJacky Bai * Configures back-bias (for domain or memory).
528*fcd41e86SJacky Bai * - mode : Back bias mode (OFF, RBB, ARBB, etc).
529*fcd41e86SJacky Bai * - p_lvl: Voltage level of p-well (in mV).
530*fcd41e86SJacky Bai * - n_lvl: Voltage level of n-well (in mV).
531*fcd41e86SJacky Bai * - compl: Complementary bias-specific (enable reset, interrupt, clamp, etc).
532*fcd41e86SJacky Bai *
533*fcd41e86SJacky Bai * Structure base_fbias_cfg_t:
534*fcd41e86SJacky Bai *
535*fcd41e86SJacky Bai * Configure memory forward bias for a memory segment.
536*fcd41e86SJacky Bai *
537*fcd41e86SJacky Bai * - mode : Forward bias mode (OFF, ON).
538*fcd41e86SJacky Bai * - msk : Selects which memory will be updated
539*fcd41e86SJacky Bai *
540*fcd41e86SJacky Bai */
541*fcd41e86SJacky Bai
542*fcd41e86SJacky Bai /*=========================================================================
543*fcd41e86SJacky Bai * Domain bias
544*fcd41e86SJacky Bai *=========================================================================
545*fcd41e86SJacky Bai */
546*fcd41e86SJacky Bai
547*fcd41e86SJacky Bai /**+
548*fcd41e86SJacky Bai * upwr_pwm_chng_dom_bias()
549*fcd41e86SJacky Bai *
550*fcd41e86SJacky Bai * Argument bias is a pointer to a struct with fields:
551*fcd41e86SJacky Bai * - apply: tells to which domains the bias must be applied;
552*fcd41e86SJacky Bai * options are RTD only (BIAS_APPLY_RTD), RTD and AVD (BIAS_APPLY_RTD_AVD),
553*fcd41e86SJacky Bai * APD only (BIAS_APPLY_APD), APD and AVD (BIAS_APPLY_APD_AVD),
554*fcd41e86SJacky Bai * AVD only (BIAS_APPLY_AVD)
555*fcd41e86SJacky Bai * - dommode: bias mode of the main domain (RTD or APD, determined by apply);
556*fcd41e86SJacky Bai * options are disabled (NBB_BIAS_MODE), reverse back bias (RBB_BIAS_MODE),
557*fcd41e86SJacky Bai * asymmetrical forward bias (AFBB_BIAS_MODE), asymmetrical reverse bias
558*fcd41e86SJacky Bai * (ARBB_BIAS_MODE).
559*fcd41e86SJacky Bai * - avdmode: bias mode of Audio-Video Domain (AVD);
560*fcd41e86SJacky Bai * options are the same as dommode.
561*fcd41e86SJacky Bai * - dombias: bias voltage level(s) for the main domain (RTD or APD,
562*fcd41e86SJacky Bai * determined by apply); it is a structure with 2 fields, rbbn and rbbp,
563*fcd41e86SJacky Bai * for the N-well and P-well voltages, respectively; values are in mV.
564*fcd41e86SJacky Bai * - avdbias: bias voltage level(s) for the Audio-Video Domain (AVD);
565*fcd41e86SJacky Bai * same fields as dombias;
566*fcd41e86SJacky Bai *
567*fcd41e86SJacky Bai * Argument restrictions:
568*fcd41e86SJacky Bai *
569*fcd41e86SJacky Bai * Voltage levels must comply with the #define-determined limits/options:
570*fcd41e86SJacky Bai * between UPWR_RTD_RBBN_MIN and UPWR_RTD_RBBN_MAX (inclusive) for RTD N-well;
571*fcd41e86SJacky Bai * between UPWR_RTD_RBBP_MIN and UPWR_RTD_RBBP_MAX (inclusive) for RTD P-well;
572*fcd41e86SJacky Bai * either UPWR_APD_RBBN_LO or UPWR_APD_RBBN_HI for APD N-well;
573*fcd41e86SJacky Bai * either UPWR_APD_RBBP_LO or UPWR_APD_RBBP_HI for APD P-well;
574*fcd41e86SJacky Bai * either UPWR_AVD_RBBN_LO or UPWR_AVD_RBBN_HI for AVD N-well;
575*fcd41e86SJacky Bai * either UPWR_AVD_RBBP_LO or UPWR_AVD_RBBP_HI for AVD P-well;
576*fcd41e86SJacky Bai *
577*fcd41e86SJacky Bai * But note that the limits/options above do not apply to all bias modes:
578*fcd41e86SJacky Bai * rbbn is used and checked only in mode RBB_BIAS_MODE;
579*fcd41e86SJacky Bai * rbbp is used and checked only in modes RBB_BIAS_MODE and ARBB_BIAS_MODE;
580*fcd41e86SJacky Bai * modes AFBB_BIAS_MODE and NBB_BIAS_MODE use or check neither rbbn nor rbbp;
581*fcd41e86SJacky Bai *
582*fcd41e86SJacky Bai * Service error UPWR_RESP_BAD_REQ is returned if the voltage limits/options
583*fcd41e86SJacky Bai * above are violated.
584*fcd41e86SJacky Bai */
585*fcd41e86SJacky Bai
586*fcd41e86SJacky Bai /* argument struct for service upwr_pwm_chng_dom_bias:
587*fcd41e86SJacky Bai */
588*fcd41e86SJacky Bai
589*fcd41e86SJacky Bai typedef enum { /* bias modes (both domain and memory): */
590*fcd41e86SJacky Bai NBB_BIAS_MODE = 0, /* bias disabled */
591*fcd41e86SJacky Bai RBB_BIAS_MODE = 1, /* reverse back bias enabled */
592*fcd41e86SJacky Bai AFBB_BIAS_MODE = 2, /* asymmetrical forward bias */
593*fcd41e86SJacky Bai ARBB_BIAS_MODE = 3 /* asymmetrical reverse bias */
594*fcd41e86SJacky Bai } upwr_bias_mode_t;
595*fcd41e86SJacky Bai
596*fcd41e86SJacky Bai /* Domain Bias config (one per domain) */
597*fcd41e86SJacky Bai
598*fcd41e86SJacky Bai typedef enum {
599*fcd41e86SJacky Bai BIAS_APPLY_RTD, /* apply to RTD only */
600*fcd41e86SJacky Bai BIAS_APPLY_RTD_AVD, /* apply to RTD and AVD */
601*fcd41e86SJacky Bai BIAS_APPLY_APD, /* apply to APD only */
602*fcd41e86SJacky Bai BIAS_APPLY_APD_AVD, /* apply to APD and AVD */
603*fcd41e86SJacky Bai BIAS_APPLY_AVD, /* apply to AVD only */
604*fcd41e86SJacky Bai BIAS_APPLY_COUNT /* number of apply options */
605*fcd41e86SJacky Bai } upwr_bias_apply_t;
606*fcd41e86SJacky Bai
607*fcd41e86SJacky Bai typedef struct {
608*fcd41e86SJacky Bai uint16_t rbbn; /* reverse back bias N well (mV) */
609*fcd41e86SJacky Bai uint16_t rbbp; /* reverse back bias P well (mV) */
610*fcd41e86SJacky Bai } upwr_rbb_t;
611*fcd41e86SJacky Bai
612*fcd41e86SJacky Bai struct upwr_dom_bias_cfg_t {
613*fcd41e86SJacky Bai upwr_bias_apply_t apply; /* bias application option */
614*fcd41e86SJacky Bai upwr_bias_mode_t dommode; /* RTD/APD bias mode config */
615*fcd41e86SJacky Bai upwr_bias_mode_t avdmode; /* AVD bias mode config */
616*fcd41e86SJacky Bai upwr_rbb_t dombias; /* RTD/APD reverse back bias */
617*fcd41e86SJacky Bai upwr_rbb_t avdbias; /* AVD reverse back bias */
618*fcd41e86SJacky Bai };
619*fcd41e86SJacky Bai
620*fcd41e86SJacky Bai /* bias struct used in power mode config definitions */
621*fcd41e86SJacky Bai
622*fcd41e86SJacky Bai /**
623*fcd41e86SJacky Bai * When write power mode transition program, please read below comments carefully.
624*fcd41e86SJacky Bai * The structure and logic is complex, There is a lot of extension and reuse.
625*fcd41e86SJacky Bai *
626*fcd41e86SJacky Bai * First, for mode, extend "uint32_t mode" to a union struct, add support for AVD:
627*fcd41e86SJacky Bai * typedef union {
628*fcd41e86SJacky Bai * uint32_t R;
629*fcd41e86SJacky Bai * struct {
630*fcd41e86SJacky Bai * uint32_t mode : 8;
631*fcd41e86SJacky Bai * uint32_t rsrv_1 : 8;
632*fcd41e86SJacky Bai * uint32_t avd_mode : 8;
633*fcd41e86SJacky Bai * uint32_t rsrv_2 : 8;
634*fcd41e86SJacky Bai * } B;
635*fcd41e86SJacky Bai * } dom_bias_mode_cfg_t;
636*fcd41e86SJacky Bai
637*fcd41e86SJacky Bai Second, if mode is AFBB mode, no need to configure rbbn and rbbp, uPower firmware
638*fcd41e86SJacky Bai will configure all SRAM_AFBB_0 or SRAM_AFBB_1 for corresponding domain.
639*fcd41e86SJacky Bai
640*fcd41e86SJacky Bai Third, if mode is RBB mode, extend "uint32_t rbbn" and "uint32_t rbbp" to a union
641*fcd41e86SJacky Bai struct, add support for AVD:
642*fcd41e86SJacky Bai typedef union {
643*fcd41e86SJacky Bai uint32_t R;
644*fcd41e86SJacky Bai struct {
645*fcd41e86SJacky Bai uint32_t lvl : 8;
646*fcd41e86SJacky Bai uint32_t rsrv_1 : 8;
647*fcd41e86SJacky Bai uint32_t avd_lvl : 8;
648*fcd41e86SJacky Bai uint32_t rsrv_2 : 8;
649*fcd41e86SJacky Bai } B;
650*fcd41e86SJacky Bai } dom_bias_lvl_cfg_t;
651*fcd41e86SJacky Bai
652*fcd41e86SJacky Bai *
653*fcd41e86SJacky Bai */
654*fcd41e86SJacky Bai typedef struct {
655*fcd41e86SJacky Bai uint32_t mode; /* Domain bias mode config, extend to dom_bias_mode_cfg_t to support RTD, APD, AVD */
656*fcd41e86SJacky Bai uint32_t rbbn; /* reverse back bias N well */
657*fcd41e86SJacky Bai uint32_t rbbp; /* reverse back bias P well */
658*fcd41e86SJacky Bai } UPWR_DOM_BIAS_CFG_T;
659*fcd41e86SJacky Bai
660*fcd41e86SJacky Bai /*=========================================================================
661*fcd41e86SJacky Bai * Memory bias
662*fcd41e86SJacky Bai *=========================================================================
663*fcd41e86SJacky Bai */
664*fcd41e86SJacky Bai /**+
665*fcd41e86SJacky Bai * upwr_pwm_chng_mem_bias()
666*fcd41e86SJacky Bai *
667*fcd41e86SJacky Bai * Argument struct contains only the field en, which can be either 1 (bias
668*fcd41e86SJacky Bai * enabled) or 0 (bias disabled).
669*fcd41e86SJacky Bai *
670*fcd41e86SJacky Bai * Argument domain must be either RTD_DOMAIN (Real Time Domain) or APD_DOMAIN
671*fcd41e86SJacky Bai * (Application Domain).
672*fcd41e86SJacky Bai */
673*fcd41e86SJacky Bai
674*fcd41e86SJacky Bai /* Memory Bias config */
675*fcd41e86SJacky Bai struct upwr_mem_bias_cfg_t {
676*fcd41e86SJacky Bai uint32_t en; /* Memory bias enable config */
677*fcd41e86SJacky Bai };
678*fcd41e86SJacky Bai
679*fcd41e86SJacky Bai /* bias struct used in power mode config definitions */
680*fcd41e86SJacky Bai typedef struct {
681*fcd41e86SJacky Bai uint32_t en; /* Memory bias enable config */
682*fcd41e86SJacky Bai } UPWR_MEM_BIAS_CFG_T;
683*fcd41e86SJacky Bai
684*fcd41e86SJacky Bai /* Split different Bias */
685*fcd41e86SJacky Bai struct upwr_pmc_bias_cfg_t {
686*fcd41e86SJacky Bai UPWR_DOM_BIAS_CFG_T dombias_cfg; /* Domain Bias config */
687*fcd41e86SJacky Bai UPWR_MEM_BIAS_CFG_T membias_cfg; /* Memory Bias config */
688*fcd41e86SJacky Bai };
689*fcd41e86SJacky Bai
690*fcd41e86SJacky Bai /*=========================================================================
691*fcd41e86SJacky Bai * Power modes
692*fcd41e86SJacky Bai *=========================================================================
693*fcd41e86SJacky Bai */
694*fcd41e86SJacky Bai
695*fcd41e86SJacky Bai /* from msb->lsb: Azure bit, dual boot bit, low power boot bit */
696*fcd41e86SJacky Bai typedef enum {
697*fcd41e86SJacky Bai SOC_BOOT_SINGLE = 0,
698*fcd41e86SJacky Bai SOC_BOOT_LOW_PWR = 1,
699*fcd41e86SJacky Bai SOC_BOOT_DUAL = 2,
700*fcd41e86SJacky Bai SOC_BOOT_AZURE = 4
701*fcd41e86SJacky Bai } SOC_BOOT_TYPE_T;
702*fcd41e86SJacky Bai
703*fcd41e86SJacky Bai #ifdef UPWR_COMP_RAM
704*fcd41e86SJacky Bai /* Power modes for RTD domain */
705*fcd41e86SJacky Bai typedef enum {
706*fcd41e86SJacky Bai DPD_RTD_PWR_MODE, /* Real Time Deep Power Down mode */
707*fcd41e86SJacky Bai PD_RTD_PWR_MODE, /* Real Time Power Down mode */
708*fcd41e86SJacky Bai DSL_RTD_PWR_MODE, /* Real Time Domain Deep Sleep Mode */
709*fcd41e86SJacky Bai HLD_RTD_PWR_MODE, /* Real Time Domain Hold Mode */
710*fcd41e86SJacky Bai SLP_RTD_PWR_MODE, /* Sleep Mode */
711*fcd41e86SJacky Bai ADMA_RTD_PWR_MODE,/* Active DMA Mode */
712*fcd41e86SJacky Bai ACT_RTD_PWR_MODE, /* Active Domain Mode */
713*fcd41e86SJacky Bai NUM_RTD_PWR_MODES
714*fcd41e86SJacky Bai } upwr_ps_rtd_pwr_mode_t;
715*fcd41e86SJacky Bai
716*fcd41e86SJacky Bai /* Abstract power modes */
717*fcd41e86SJacky Bai typedef enum {
718*fcd41e86SJacky Bai DPD_PWR_MODE,
719*fcd41e86SJacky Bai PD_PWR_MODE,
720*fcd41e86SJacky Bai PACT_PWR_MODE,
721*fcd41e86SJacky Bai DSL_PWR_MODE,
722*fcd41e86SJacky Bai HLD_PWR_MODE,
723*fcd41e86SJacky Bai SLP_PWR_MODE,
724*fcd41e86SJacky Bai ADMA_PWR_MODE,
725*fcd41e86SJacky Bai ACT_PWR_MODE,
726*fcd41e86SJacky Bai NUM_PWR_MODES,
727*fcd41e86SJacky Bai NUM_APD_PWR_MODES = NUM_PWR_MODES,
728*fcd41e86SJacky Bai TRANS_PWR_MODE = NUM_PWR_MODES,
729*fcd41e86SJacky Bai INVALID_PWR_MODE = TRANS_PWR_MODE + 1
730*fcd41e86SJacky Bai } abs_pwr_mode_t;
731*fcd41e86SJacky Bai #else /* UPWR_COMP_RAM */
732*fcd41e86SJacky Bai /* Power modes for RTD domain */
733*fcd41e86SJacky Bai #define DPD_RTD_PWR_MODE (0U) /* Real Time Deep Power Down mode */
734*fcd41e86SJacky Bai #define PD_RTD_PWR_MODE (1U) /* Real Time Power Down mode */
735*fcd41e86SJacky Bai #define DSL_RTD_PWR_MODE (2U) /* Real Time Domain Deep Sleep Mode */
736*fcd41e86SJacky Bai #define HLD_RTD_PWR_MODE (3U) /* Real Time Domain Hold Mode */
737*fcd41e86SJacky Bai #define SLP_RTD_PWR_MODE (4U) /* Sleep Mode */
738*fcd41e86SJacky Bai #define ADMA_RTD_PWR_MODE (5U) /* Active DMA Mode */
739*fcd41e86SJacky Bai #define ACT_RTD_PWR_MODE (6U) /* Active Domain Mode */
740*fcd41e86SJacky Bai #define NUM_RTD_PWR_MODES (7U)
741*fcd41e86SJacky Bai
742*fcd41e86SJacky Bai typedef uint32_t upwr_ps_rtd_pwr_mode_t;
743*fcd41e86SJacky Bai
744*fcd41e86SJacky Bai /* Abstract power modes */
745*fcd41e86SJacky Bai #define DPD_PWR_MODE (0U)
746*fcd41e86SJacky Bai #define PD_PWR_MODE (1U)
747*fcd41e86SJacky Bai #define PACT_PWR_MODE (2U)
748*fcd41e86SJacky Bai #define DSL_PWR_MODE (3U)
749*fcd41e86SJacky Bai #define HLD_PWR_MODE (4U)
750*fcd41e86SJacky Bai #define SLP_PWR_MODE (5U)
751*fcd41e86SJacky Bai #define ADMA_PWR_MODE (6U)
752*fcd41e86SJacky Bai #define ACT_PWR_MODE (7U)
753*fcd41e86SJacky Bai #define NUM_PWR_MODES (8U)
754*fcd41e86SJacky Bai #define NUM_APD_PWR_MODES NUM_PWR_MODES
755*fcd41e86SJacky Bai #define TRANS_PWR_MODE NUM_PWR_MODES
756*fcd41e86SJacky Bai #define INVALID_PWR_MODE (TRANS_PWR_MODE + 1U)
757*fcd41e86SJacky Bai
758*fcd41e86SJacky Bai typedef uint32_t abs_pwr_mode_t;
759*fcd41e86SJacky Bai #endif /* UPWR_COMP_RAM */
760*fcd41e86SJacky Bai
761*fcd41e86SJacky Bai typedef struct {
762*fcd41e86SJacky Bai abs_pwr_mode_t mode;
763*fcd41e86SJacky Bai bool ok;
764*fcd41e86SJacky Bai } pch_trans_t;
765*fcd41e86SJacky Bai
766*fcd41e86SJacky Bai typedef pch_trans_t rtd_trans_t;
767*fcd41e86SJacky Bai
768*fcd41e86SJacky Bai typedef struct {
769*fcd41e86SJacky Bai abs_pwr_mode_t mode;
770*fcd41e86SJacky Bai pch_trans_t core[UPWR_APD_CORES];
771*fcd41e86SJacky Bai } apd_trans_t;
772*fcd41e86SJacky Bai
773*fcd41e86SJacky Bai /* Codes for APD pwr mode as programmed in LPMODE reg */
774*fcd41e86SJacky Bai typedef enum {
775*fcd41e86SJacky Bai ACT_APD_LPM,
776*fcd41e86SJacky Bai SLP_APD_LPM = 1,
777*fcd41e86SJacky Bai DSL_APD_LPM = 3,
778*fcd41e86SJacky Bai PACT_APD_LPM = 7,
779*fcd41e86SJacky Bai PD_APD_LPM = 15,
780*fcd41e86SJacky Bai DPD_APD_LPM = 31,
781*fcd41e86SJacky Bai HLD_APD_LPM = 63
782*fcd41e86SJacky Bai } upwr_apd_lpm_t;
783*fcd41e86SJacky Bai
784*fcd41e86SJacky Bai /* PowerSys low power config */
785*fcd41e86SJacky Bai struct upwr_powersys_cfg_t {
786*fcd41e86SJacky Bai uint32_t lpm_mode; /* Powersys low power mode */
787*fcd41e86SJacky Bai };
788*fcd41e86SJacky Bai
789*fcd41e86SJacky Bai /*=*************************************************************************
790*fcd41e86SJacky Bai * RTD
791*fcd41e86SJacky Bai *=*************************************************************************/
792*fcd41e86SJacky Bai /* Config pmc PADs */
793*fcd41e86SJacky Bai struct upwr_pmc_pad_cfg_t {
794*fcd41e86SJacky Bai uint32_t pad_close; /* PMC PAD close config */
795*fcd41e86SJacky Bai uint32_t pad_reset; /* PMC PAD reset config */
796*fcd41e86SJacky Bai uint32_t pad_tqsleep; /* PMC PAD TQ Sleep config */
797*fcd41e86SJacky Bai };
798*fcd41e86SJacky Bai
799*fcd41e86SJacky Bai /* Config regulator (internal and external) */
800*fcd41e86SJacky Bai struct upwr_reg_cfg_t {
801*fcd41e86SJacky Bai uint32_t volt; /* Regulator voltage config */
802*fcd41e86SJacky Bai uint32_t mode; /* Regulator mode config */
803*fcd41e86SJacky Bai };
804*fcd41e86SJacky Bai
805*fcd41e86SJacky Bai /* Config pmc monitors */
806*fcd41e86SJacky Bai struct upwr_pmc_mon_cfg_t {
807*fcd41e86SJacky Bai uint32_t mon_hvd_en; /* PMC mon HVD */
808*fcd41e86SJacky Bai uint32_t mon_lvd_en; /* PMC mon LVD */
809*fcd41e86SJacky Bai uint32_t mon_lvdlvl; /* PMC mon LVDLVL */
810*fcd41e86SJacky Bai };
811*fcd41e86SJacky Bai
812*fcd41e86SJacky Bai /* Same monitor config for RTD (for compatibility) */
813*fcd41e86SJacky Bai #define upwr_pmc_mon_rtd_cfg_t upwr_pmc_mon_cfg_t
814*fcd41e86SJacky Bai
815*fcd41e86SJacky Bai typedef swt_config_t ps_rtd_swt_cfgs_t[NUM_RTD_PWR_MODES];
816*fcd41e86SJacky Bai typedef swt_config_t ps_apd_swt_cfgs_t[NUM_APD_PWR_MODES];
817*fcd41e86SJacky Bai
818*fcd41e86SJacky Bai /*=*************************************************************************
819*fcd41e86SJacky Bai * APD
820*fcd41e86SJacky Bai *=*************************************************************************/
821*fcd41e86SJacky Bai
822*fcd41e86SJacky Bai /* PowerSys PMIC config */
823*fcd41e86SJacky Bai struct upwr_pmic_cfg_t {
824*fcd41e86SJacky Bai uint32_t volt;
825*fcd41e86SJacky Bai uint32_t mode;
826*fcd41e86SJacky Bai uint32_t mode_msk;
827*fcd41e86SJacky Bai };
828*fcd41e86SJacky Bai
829*fcd41e86SJacky Bai typedef uint32_t offs_t;
830*fcd41e86SJacky Bai
831*fcd41e86SJacky Bai struct ps_apd_pwr_mode_cfg_t {
832*fcd41e86SJacky Bai #ifdef UPWR_SIMULATOR_ONLY
833*fcd41e86SJacky Bai struct upwr_switch_board_t *swt_board_offs;
834*fcd41e86SJacky Bai struct upwr_mem_switches_t *swt_mem_offs;
835*fcd41e86SJacky Bai #else
836*fcd41e86SJacky Bai offs_t swt_board_offs;
837*fcd41e86SJacky Bai offs_t swt_mem_offs;
838*fcd41e86SJacky Bai #endif
839*fcd41e86SJacky Bai struct upwr_pmic_cfg_t pmic_cfg;
840*fcd41e86SJacky Bai struct upwr_pmc_pad_cfg_t pad_cfg;
841*fcd41e86SJacky Bai struct upwr_pmc_bias_cfg_t bias_cfg;
842*fcd41e86SJacky Bai };
843*fcd41e86SJacky Bai
844*fcd41e86SJacky Bai /* Get the pointer to swt config */
845*fcd41e86SJacky Bai static inline struct upwr_switch_board_t*
get_apd_swt_cfg(volatile struct ps_apd_pwr_mode_cfg_t * cfg)846*fcd41e86SJacky Bai get_apd_swt_cfg(volatile struct ps_apd_pwr_mode_cfg_t *cfg)
847*fcd41e86SJacky Bai {
848*fcd41e86SJacky Bai char *ptr;
849*fcd41e86SJacky Bai
850*fcd41e86SJacky Bai ptr = (char *)cfg;
851*fcd41e86SJacky Bai ptr += (uint64_t)cfg->swt_board_offs;
852*fcd41e86SJacky Bai return (struct upwr_switch_board_t *)ptr;
853*fcd41e86SJacky Bai }
854*fcd41e86SJacky Bai
855*fcd41e86SJacky Bai /* Get the pointer to mem config */
856*fcd41e86SJacky Bai static inline struct upwr_mem_switches_t*
get_apd_mem_cfg(volatile struct ps_apd_pwr_mode_cfg_t * cfg)857*fcd41e86SJacky Bai get_apd_mem_cfg(volatile struct ps_apd_pwr_mode_cfg_t *cfg)
858*fcd41e86SJacky Bai {
859*fcd41e86SJacky Bai char *ptr;
860*fcd41e86SJacky Bai
861*fcd41e86SJacky Bai ptr = (char *)cfg;
862*fcd41e86SJacky Bai ptr += (uint64_t)cfg->swt_mem_offs;
863*fcd41e86SJacky Bai return (struct upwr_mem_switches_t *)ptr;
864*fcd41e86SJacky Bai }
865*fcd41e86SJacky Bai
866*fcd41e86SJacky Bai /* Power Mode configuration */
867*fcd41e86SJacky Bai
868*fcd41e86SJacky Bai #define ps_rtd_pwr_mode_cfg_t upwr_power_mode_cfg_t
869*fcd41e86SJacky Bai
870*fcd41e86SJacky Bai /* these typedefs are just for RISC-V sizeof purpose */
871*fcd41e86SJacky Bai typedef uint32_t swt_board_ptr_t;
872*fcd41e86SJacky Bai typedef uint32_t swt_mem_ptr_t;
873*fcd41e86SJacky Bai
874*fcd41e86SJacky Bai struct upwr_power_mode_cfg_t {
875*fcd41e86SJacky Bai #ifdef UPWR_SIMULATOR_ONLY
876*fcd41e86SJacky Bai struct upwr_switch_board_t *swt_board; /* Swt board for mem. */
877*fcd41e86SJacky Bai struct upwr_mem_switches_t *swt_mem; /* Swt to mem. arrays, perif */
878*fcd41e86SJacky Bai #else
879*fcd41e86SJacky Bai #ifdef __LP64__
880*fcd41e86SJacky Bai uint32_t swt_board;
881*fcd41e86SJacky Bai uint32_t swt_mem;
882*fcd41e86SJacky Bai #else
883*fcd41e86SJacky Bai struct upwr_switch_board_t *swt_board; /* Swt board for mem. */
884*fcd41e86SJacky Bai struct upwr_mem_switches_t *swt_mem; /* Swt to mem. arrays, perif */
885*fcd41e86SJacky Bai #endif
886*fcd41e86SJacky Bai #endif
887*fcd41e86SJacky Bai struct upwr_reg_cfg_t in_reg_cfg; /* internal regulator config*/
888*fcd41e86SJacky Bai struct upwr_reg_cfg_t pmic_cfg; /* external regulator - pmic*/
889*fcd41e86SJacky Bai struct upwr_pmc_pad_cfg_t pad_cfg; /* Pad conf for power trans*/
890*fcd41e86SJacky Bai struct upwr_pmc_mon_rtd_cfg_t mon_cfg; /*monitor configuration */
891*fcd41e86SJacky Bai struct upwr_pmc_bias_cfg_t bias_cfg; /* Memory/Domain Bias conf */
892*fcd41e86SJacky Bai struct upwr_powersys_cfg_t pwrsys_lpm_cfg; /* pwrsys low power config*/
893*fcd41e86SJacky Bai };
894*fcd41e86SJacky Bai
upwr_sizeof_pmode_cfg(uint32_t domain)895*fcd41e86SJacky Bai static inline unsigned int upwr_sizeof_pmode_cfg(uint32_t domain)
896*fcd41e86SJacky Bai {
897*fcd41e86SJacky Bai switch (domain) {
898*fcd41e86SJacky Bai case RTD_DOMAIN:
899*fcd41e86SJacky Bai return sizeof(struct upwr_power_mode_cfg_t) +
900*fcd41e86SJacky Bai (sizeof(struct upwr_switch_board_t)*
901*fcd41e86SJacky Bai UPWR_PMC_SWT_WORDS) +
902*fcd41e86SJacky Bai (sizeof(struct upwr_mem_switches_t)*
903*fcd41e86SJacky Bai UPWR_PMC_MEM_WORDS) -
904*fcd41e86SJacky Bai 2U * (sizeof(void *) - sizeof(swt_board_ptr_t));
905*fcd41e86SJacky Bai
906*fcd41e86SJacky Bai /* fall through */
907*fcd41e86SJacky Bai case APD_DOMAIN:
908*fcd41e86SJacky Bai return sizeof(struct ps_apd_pwr_mode_cfg_t) +
909*fcd41e86SJacky Bai (sizeof(struct upwr_switch_board_t)*
910*fcd41e86SJacky Bai UPWR_PMC_SWT_WORDS) +
911*fcd41e86SJacky Bai (sizeof(struct upwr_mem_switches_t)*
912*fcd41e86SJacky Bai UPWR_PMC_MEM_WORDS);
913*fcd41e86SJacky Bai
914*fcd41e86SJacky Bai /* fall through */
915*fcd41e86SJacky Bai default:
916*fcd41e86SJacky Bai break;
917*fcd41e86SJacky Bai }
918*fcd41e86SJacky Bai
919*fcd41e86SJacky Bai return 0;
920*fcd41e86SJacky Bai }
921*fcd41e86SJacky Bai
922*fcd41e86SJacky Bai /*=*************************************************************************
923*fcd41e86SJacky Bai * All configs
924*fcd41e86SJacky Bai *=*************************************************************************/
925*fcd41e86SJacky Bai
926*fcd41e86SJacky Bai /* LVD/HVD monitor config for a single domain */
927*fcd41e86SJacky Bai
928*fcd41e86SJacky Bai /* Domain + AVD monitor config
929*fcd41e86SJacky Bai * For RTD, mapped in mon_cfg.mon_hvd_en
930*fcd41e86SJacky Bai * For APD, mapped temporarily in pad_cfg.pad_tqsleep
931*fcd41e86SJacky Bai */
932*fcd41e86SJacky Bai typedef union upwr_mon_cfg_union_t {
933*fcd41e86SJacky Bai volatile uint32_t R;
934*fcd41e86SJacky Bai struct {
935*fcd41e86SJacky Bai /* Original config, not change */
936*fcd41e86SJacky Bai volatile uint32_t rsrv_1 : 8;
937*fcd41e86SJacky Bai /* DOM */
938*fcd41e86SJacky Bai volatile uint32_t dom_lvd_irq_ena : 1;
939*fcd41e86SJacky Bai volatile uint32_t dom_lvd_rst_ena : 1;
940*fcd41e86SJacky Bai volatile uint32_t dom_hvd_irq_ena : 1;
941*fcd41e86SJacky Bai volatile uint32_t dom_hvd_rst_ena : 1;
942*fcd41e86SJacky Bai volatile uint32_t dom_lvd_lvl : 4;
943*fcd41e86SJacky Bai volatile uint32_t dom_lvd_ena : 1;
944*fcd41e86SJacky Bai volatile uint32_t dom_hvd_ena : 1;
945*fcd41e86SJacky Bai /* AVD */
946*fcd41e86SJacky Bai volatile uint32_t avd_lvd_irq_ena : 1;
947*fcd41e86SJacky Bai volatile uint32_t avd_lvd_rst_ena : 1;
948*fcd41e86SJacky Bai volatile uint32_t avd_hvd_irq_ena : 1;
949*fcd41e86SJacky Bai volatile uint32_t avd_hvd_rst_ena : 1;
950*fcd41e86SJacky Bai volatile uint32_t avd_lvd_lvl : 4;
951*fcd41e86SJacky Bai volatile uint32_t avd_lvd_ena : 1;
952*fcd41e86SJacky Bai volatile uint32_t avd_hvd_ena : 1;
953*fcd41e86SJacky Bai } B;
954*fcd41e86SJacky Bai } upwr_mon_cfg_t;
955*fcd41e86SJacky Bai
956*fcd41e86SJacky Bai /* Get the monitor config word from RAM (domaind and AVD) */
get_mon_cfg(uint8_t dom,void * mode_cfg)957*fcd41e86SJacky Bai static inline uint32_t get_mon_cfg(uint8_t dom, void *mode_cfg)
958*fcd41e86SJacky Bai {
959*fcd41e86SJacky Bai if (dom == RTD_DOMAIN) {
960*fcd41e86SJacky Bai return ((struct ps_rtd_pwr_mode_cfg_t *)mode_cfg)->mon_cfg.mon_hvd_en;
961*fcd41e86SJacky Bai } else {
962*fcd41e86SJacky Bai return ((struct ps_apd_pwr_mode_cfg_t *)mode_cfg)->pad_cfg.pad_tqsleep;
963*fcd41e86SJacky Bai }
964*fcd41e86SJacky Bai }
965*fcd41e86SJacky Bai
966*fcd41e86SJacky Bai /* Set the monitor config word in RAM (domaind and AVD) */
set_mon_cfg(uint8_t dom,void * mode_cfg,upwr_mon_cfg_t mon_cfg)967*fcd41e86SJacky Bai static inline void set_mon_cfg(uint8_t dom, void *mode_cfg,
968*fcd41e86SJacky Bai upwr_mon_cfg_t mon_cfg)
969*fcd41e86SJacky Bai {
970*fcd41e86SJacky Bai uint32_t *cfg;
971*fcd41e86SJacky Bai
972*fcd41e86SJacky Bai if (dom == RTD_DOMAIN) {
973*fcd41e86SJacky Bai cfg = (uint32_t *)&((struct ps_rtd_pwr_mode_cfg_t *)mode_cfg)->mon_cfg.mon_hvd_en;
974*fcd41e86SJacky Bai } else {
975*fcd41e86SJacky Bai cfg = (uint32_t *)&((struct ps_apd_pwr_mode_cfg_t *)mode_cfg)->pad_cfg.pad_tqsleep;
976*fcd41e86SJacky Bai }
977*fcd41e86SJacky Bai
978*fcd41e86SJacky Bai *cfg = mon_cfg.R;
979*fcd41e86SJacky Bai }
980*fcd41e86SJacky Bai
981*fcd41e86SJacky Bai #define PMIC_REG_VALID_TAG 0xAAU
982*fcd41e86SJacky Bai
983*fcd41e86SJacky Bai /**
984*fcd41e86SJacky Bai * limit the max pmic register->value count to 8
985*fcd41e86SJacky Bai * each data cost 4 Bytes, totally 32 Bytes
986*fcd41e86SJacky Bai */
987*fcd41e86SJacky Bai #define MAX_PMIC_REG_COUNT 0x8U
988*fcd41e86SJacky Bai
989*fcd41e86SJacky Bai /**
990*fcd41e86SJacky Bai * the configuration structure for PMIC register setting
991*fcd41e86SJacky Bai *
992*fcd41e86SJacky Bai * @ tag: The TAG number to judge if the data is valid or not, valid tag is PMIC_REG_VALID_TAG
993*fcd41e86SJacky Bai * @ power_mode : corresponding to each domain's power mode
994*fcd41e86SJacky Bai * RTD refer to upwr_ps_rtd_pwr_mode_t
995*fcd41e86SJacky Bai * APD refer to abs_pwr_mode_t
996*fcd41e86SJacky Bai * @ i2c_addr : i2c address
997*fcd41e86SJacky Bai * @ i2c_data : i2c data value
998*fcd41e86SJacky Bai */
999*fcd41e86SJacky Bai struct ps_pmic_reg_data_cfg_t {
1000*fcd41e86SJacky Bai uint32_t tag : 8;
1001*fcd41e86SJacky Bai uint32_t power_mode : 8;
1002*fcd41e86SJacky Bai uint32_t i2c_addr : 8;
1003*fcd41e86SJacky Bai uint32_t i2c_data : 8;
1004*fcd41e86SJacky Bai };
1005*fcd41e86SJacky Bai
1006*fcd41e86SJacky Bai /* Uniformize access to PMIC cfg for RTD and APD */
1007*fcd41e86SJacky Bai
1008*fcd41e86SJacky Bai typedef union {
1009*fcd41e86SJacky Bai struct upwr_reg_cfg_t RTD;
1010*fcd41e86SJacky Bai struct upwr_pmic_cfg_t APD;
1011*fcd41e86SJacky Bai } pmic_cfg_t;
1012*fcd41e86SJacky Bai
1013*fcd41e86SJacky Bai /* Access to PMIC mode mask and AVD mode */
1014*fcd41e86SJacky Bai
1015*fcd41e86SJacky Bai typedef union {
1016*fcd41e86SJacky Bai uint32_t R;
1017*fcd41e86SJacky Bai struct {
1018*fcd41e86SJacky Bai uint8_t mode; /* Domain PMIC mode */
1019*fcd41e86SJacky Bai uint8_t msk; /* Domain PMIC mode mask */
1020*fcd41e86SJacky Bai uint8_t avd_mode; /* AVD PMIC mode */
1021*fcd41e86SJacky Bai uint8_t avd_msk; /* AVD PMIC mode mask */
1022*fcd41e86SJacky Bai } B;
1023*fcd41e86SJacky Bai } pmic_mode_cfg_t;
1024*fcd41e86SJacky Bai
1025*fcd41e86SJacky Bai /* Access RTD, APD and AVD modes and masks */
get_pmic_mode_cfg(uint8_t dom,pmic_cfg_t * cfg)1026*fcd41e86SJacky Bai static inline pmic_mode_cfg_t *get_pmic_mode_cfg(uint8_t dom, pmic_cfg_t *cfg)
1027*fcd41e86SJacky Bai {
1028*fcd41e86SJacky Bai uint32_t *mode_cfg;
1029*fcd41e86SJacky Bai
1030*fcd41e86SJacky Bai if (dom == RTD_DOMAIN) {
1031*fcd41e86SJacky Bai mode_cfg = &cfg->RTD.mode;
1032*fcd41e86SJacky Bai } else {
1033*fcd41e86SJacky Bai mode_cfg = &cfg->APD.mode;
1034*fcd41e86SJacky Bai }
1035*fcd41e86SJacky Bai
1036*fcd41e86SJacky Bai return (pmic_mode_cfg_t *)mode_cfg;
1037*fcd41e86SJacky Bai }
1038*fcd41e86SJacky Bai
get_pmic_mode(uint8_t dom,pmic_cfg_t * cfg)1039*fcd41e86SJacky Bai static inline uint8_t get_pmic_mode(uint8_t dom, pmic_cfg_t *cfg)
1040*fcd41e86SJacky Bai {
1041*fcd41e86SJacky Bai return get_pmic_mode_cfg(dom, cfg)->B.mode;
1042*fcd41e86SJacky Bai }
1043*fcd41e86SJacky Bai
set_pmic_mode(uint8_t dom,pmic_cfg_t * cfg,uint8_t mode)1044*fcd41e86SJacky Bai static inline void set_pmic_mode(uint8_t dom, pmic_cfg_t *cfg, uint8_t mode)
1045*fcd41e86SJacky Bai {
1046*fcd41e86SJacky Bai get_pmic_mode_cfg(dom, cfg)->B.mode = mode;
1047*fcd41e86SJacky Bai }
1048*fcd41e86SJacky Bai
get_pmic_mode_msk(uint8_t dom,pmic_cfg_t * cfg)1049*fcd41e86SJacky Bai static inline uint32_t get_pmic_mode_msk(uint8_t dom, pmic_cfg_t *cfg)
1050*fcd41e86SJacky Bai {
1051*fcd41e86SJacky Bai pmic_mode_cfg_t *mode_cfg;
1052*fcd41e86SJacky Bai
1053*fcd41e86SJacky Bai if (dom == RTD_DOMAIN) {
1054*fcd41e86SJacky Bai mode_cfg = (pmic_mode_cfg_t *)&cfg->RTD.mode;
1055*fcd41e86SJacky Bai return mode_cfg->B.msk;
1056*fcd41e86SJacky Bai } else {
1057*fcd41e86SJacky Bai return cfg->APD.mode_msk;
1058*fcd41e86SJacky Bai }
1059*fcd41e86SJacky Bai }
1060*fcd41e86SJacky Bai
1061*fcd41e86SJacky Bai /* Getters and setters for AVD mode and mask */
get_avd_pmic_mode(uint8_t dom,pmic_cfg_t * cfg)1062*fcd41e86SJacky Bai static inline uint8_t get_avd_pmic_mode(uint8_t dom, pmic_cfg_t *cfg)
1063*fcd41e86SJacky Bai {
1064*fcd41e86SJacky Bai return get_pmic_mode_cfg(dom, cfg)->B.avd_mode;
1065*fcd41e86SJacky Bai }
1066*fcd41e86SJacky Bai
set_avd_pmic_mode(uint8_t dom,pmic_cfg_t * cfg,uint8_t mode)1067*fcd41e86SJacky Bai static inline void set_avd_pmic_mode(uint8_t dom, pmic_cfg_t *cfg, uint8_t mode)
1068*fcd41e86SJacky Bai {
1069*fcd41e86SJacky Bai get_pmic_mode_cfg(dom, cfg)->B.avd_mode = mode;
1070*fcd41e86SJacky Bai }
1071*fcd41e86SJacky Bai
get_avd_pmic_mode_msk(uint8_t dom,pmic_cfg_t * cfg)1072*fcd41e86SJacky Bai static inline uint8_t get_avd_pmic_mode_msk(uint8_t dom, pmic_cfg_t *cfg)
1073*fcd41e86SJacky Bai {
1074*fcd41e86SJacky Bai return get_pmic_mode_cfg(dom, cfg)->B.avd_msk;
1075*fcd41e86SJacky Bai }
1076*fcd41e86SJacky Bai
set_avd_pmic_mode_msk(uint8_t dom,pmic_cfg_t * cfg,uint8_t msk)1077*fcd41e86SJacky Bai static inline void set_avd_pmic_mode_msk(uint8_t dom,
1078*fcd41e86SJacky Bai pmic_cfg_t *cfg,
1079*fcd41e86SJacky Bai uint8_t msk)
1080*fcd41e86SJacky Bai {
1081*fcd41e86SJacky Bai get_pmic_mode_cfg(dom, cfg)->B.avd_msk = msk;
1082*fcd41e86SJacky Bai }
1083*fcd41e86SJacky Bai
1084*fcd41e86SJacky Bai struct ps_delay_cfg_t {
1085*fcd41e86SJacky Bai uint32_t tag : 8U;
1086*fcd41e86SJacky Bai uint32_t rsv : 8U;
1087*fcd41e86SJacky Bai uint32_t exitdelay : 16U; // exit delay in us
1088*fcd41e86SJacky Bai };
1089*fcd41e86SJacky Bai
1090*fcd41e86SJacky Bai #define PS_DELAY_TAG 0xA5U
1091*fcd41e86SJacky Bai
1092*fcd41e86SJacky Bai /* max exit delay = 0xffff = 65535 us = 65.5 ms (it is enough...) */
1093*fcd41e86SJacky Bai /* with 8 bits, 256 -> not enough */
1094*fcd41e86SJacky Bai
1095*fcd41e86SJacky Bai typedef struct ps_delay_cfg_t ps_rtd_delay_cfgs_t[NUM_RTD_PWR_MODES];
1096*fcd41e86SJacky Bai typedef struct ps_delay_cfg_t ps_apd_delay_cfgs_t[NUM_APD_PWR_MODES];
1097*fcd41e86SJacky Bai
1098*fcd41e86SJacky Bai typedef struct ps_rtd_pwr_mode_cfg_t ps_rtd_pwr_mode_cfgs_t[NUM_RTD_PWR_MODES];
1099*fcd41e86SJacky Bai typedef struct ps_apd_pwr_mode_cfg_t ps_apd_pwr_mode_cfgs_t[NUM_APD_PWR_MODES];
1100*fcd41e86SJacky Bai typedef struct ps_pmic_reg_data_cfg_t ps_rtd_pmic_reg_data_cfgs_t[MAX_PMIC_REG_COUNT];
1101*fcd41e86SJacky Bai typedef struct ps_pmic_reg_data_cfg_t ps_apd_pmic_reg_data_cfgs_t[MAX_PMIC_REG_COUNT];
1102*fcd41e86SJacky Bai
1103*fcd41e86SJacky Bai struct ps_pwr_mode_cfg_t {
1104*fcd41e86SJacky Bai ps_rtd_pwr_mode_cfgs_t ps_rtd_pwr_mode_cfg;
1105*fcd41e86SJacky Bai ps_rtd_swt_cfgs_t ps_rtd_swt_cfg;
1106*fcd41e86SJacky Bai ps_apd_pwr_mode_cfgs_t ps_apd_pwr_mode_cfg;
1107*fcd41e86SJacky Bai ps_apd_swt_cfgs_t ps_apd_swt_cfg;
1108*fcd41e86SJacky Bai ps_rtd_pmic_reg_data_cfgs_t ps_rtd_pmic_reg_data_cfg;
1109*fcd41e86SJacky Bai ps_apd_pmic_reg_data_cfgs_t ps_apd_pmic_reg_data_cfg;
1110*fcd41e86SJacky Bai ps_rtd_delay_cfgs_t ps_rtd_delay_cfg;
1111*fcd41e86SJacky Bai ps_apd_delay_cfgs_t ps_apd_delay_cfg;
1112*fcd41e86SJacky Bai
1113*fcd41e86SJacky Bai };
1114*fcd41e86SJacky Bai
1115*fcd41e86SJacky Bai #define UPWR_XCP_MIN_ADDR (0x28350000U)
1116*fcd41e86SJacky Bai #define UPWR_XCP_MAX_ADDR (0x2836FFFCU)
1117*fcd41e86SJacky Bai
1118*fcd41e86SJacky Bai struct upwr_reg_access_t {
1119*fcd41e86SJacky Bai uint32_t addr;
1120*fcd41e86SJacky Bai uint32_t data;
1121*fcd41e86SJacky Bai uint32_t mask; /* mask=0 commands read */
1122*fcd41e86SJacky Bai };
1123*fcd41e86SJacky Bai
1124*fcd41e86SJacky Bai typedef upwr_pointer_msg upwr_xcp_access_msg;
1125*fcd41e86SJacky Bai
1126*fcd41e86SJacky Bai /* unions for the shared memory buffer */
1127*fcd41e86SJacky Bai
1128*fcd41e86SJacky Bai typedef union {
1129*fcd41e86SJacky Bai struct upwr_reg_access_t reg_access;
1130*fcd41e86SJacky Bai } upwr_xcp_union_t;
1131*fcd41e86SJacky Bai
1132*fcd41e86SJacky Bai typedef union {
1133*fcd41e86SJacky Bai struct {
1134*fcd41e86SJacky Bai struct ps_rtd_pwr_mode_cfg_t rtd_struct;
1135*fcd41e86SJacky Bai struct upwr_switch_board_t rtd_switch;
1136*fcd41e86SJacky Bai struct upwr_mem_switches_t rtd_memory;
1137*fcd41e86SJacky Bai } rtd_pwr_mode;
1138*fcd41e86SJacky Bai struct {
1139*fcd41e86SJacky Bai struct ps_apd_pwr_mode_cfg_t apd_struct;
1140*fcd41e86SJacky Bai struct upwr_switch_board_t apd_switch;
1141*fcd41e86SJacky Bai struct upwr_mem_switches_t apd_memory;
1142*fcd41e86SJacky Bai } apd_pwr_mode;
1143*fcd41e86SJacky Bai } upwr_pwm_union_t;
1144*fcd41e86SJacky Bai
1145*fcd41e86SJacky Bai #define MAX_SG_EXCEPT_MEM_SIZE sizeof(upwr_xcp_union_t)
1146*fcd41e86SJacky Bai #define MAX_SG_PWRMGMT_MEM_SIZE sizeof(upwr_pwm_union_t)
1147*fcd41e86SJacky Bai
1148*fcd41e86SJacky Bai /**
1149*fcd41e86SJacky Bai * VOLTM group need shared memory for PMIC IC configuration
1150*fcd41e86SJacky Bai * 256 Bytes is enough for PMIC register array
1151*fcd41e86SJacky Bai */
1152*fcd41e86SJacky Bai #define MAX_SG_VOLTM_MEM_SIZE 256U
1153*fcd41e86SJacky Bai
1154*fcd41e86SJacky Bai #endif /* UPWR_SOC_DEFS_H */
1155