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* 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* 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 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) */ 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) */ 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 */ 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 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 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 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 */ 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 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 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 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