1 /* 2 * Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #ifndef __PSCI_COMPAT_H__ 8 #define __PSCI_COMPAT_H__ 9 10 #include <arch.h> 11 #include <platform_def.h> 12 13 #ifndef __ASSEMBLY__ 14 /* 15 * The below declarations are to enable compatibility for the platform ports 16 * using the old platform interface and psci helpers. 17 */ 18 #define PLAT_MAX_PWR_LVL PLATFORM_MAX_AFFLVL 19 #define PLAT_NUM_PWR_DOMAINS PLATFORM_NUM_AFFS 20 21 /******************************************************************************* 22 * PSCI affinity related constants. An affinity instance could 23 * be present or absent physically to cater for asymmetric topologies. 24 ******************************************************************************/ 25 #define PSCI_AFF_ABSENT 0x0 26 #define PSCI_AFF_PRESENT 0x1 27 28 #define PSCI_STATE_ON 0x0 29 #define PSCI_STATE_OFF 0x1 30 #define PSCI_STATE_ON_PENDING 0x2 31 #define PSCI_STATE_SUSPEND 0x3 32 33 /* 34 * Using the compatibility platform interfaces means that the local states 35 * used in psci_power_state_t need to only convey whether its power down 36 * or standby state. The onus is on the platform port to do the right thing 37 * including the state coordination in case multiple power down states are 38 * involved. Hence if we assume 3 generic states viz, run, standby and 39 * power down, we can assign 1 and 2 to standby and power down respectively. 40 */ 41 #define PLAT_MAX_RET_STATE 1 42 #define PLAT_MAX_OFF_STATE 2 43 44 /* 45 * Macro to represent invalid affinity level within PSCI. 46 */ 47 #define PSCI_INVALID_DATA -1 48 49 #define psci_get_pstate_afflvl(pstate) psci_get_pstate_pwrlvl(pstate) 50 51 /* 52 * This array stores the 'power_state' requests of each CPU during 53 * CPU_SUSPEND and SYSTEM_SUSPEND which will be populated by the 54 * compatibility layer when appropriate platform hooks are invoked. 55 */ 56 extern unsigned int psci_power_state_compat[PLATFORM_CORE_COUNT]; 57 58 /******************************************************************************* 59 * Structure populated by platform specific code to export routines which 60 * perform common low level pm functions 61 ******************************************************************************/ 62 typedef struct plat_pm_ops { 63 void (*affinst_standby)(unsigned int power_state); 64 int (*affinst_on)(unsigned long mpidr, 65 unsigned long sec_entrypoint, 66 unsigned int afflvl, 67 unsigned int state); 68 void (*affinst_off)(unsigned int afflvl, unsigned int state); 69 void (*affinst_suspend)(unsigned long sec_entrypoint, 70 unsigned int afflvl, 71 unsigned int state); 72 void (*affinst_on_finish)(unsigned int afflvl, unsigned int state); 73 void (*affinst_suspend_finish)(unsigned int afflvl, 74 unsigned int state); 75 void (*system_off)(void) __dead2; 76 void (*system_reset)(void) __dead2; 77 int (*validate_power_state)(unsigned int power_state); 78 int (*validate_ns_entrypoint)(unsigned long ns_entrypoint); 79 unsigned int (*get_sys_suspend_power_state)(void); 80 } plat_pm_ops_t; 81 82 /******************************************************************************* 83 * Function & Data prototypes to enable compatibility for older platform ports 84 ******************************************************************************/ 85 int psci_get_suspend_stateid_by_mpidr(unsigned long); 86 int psci_get_suspend_stateid(void); 87 int psci_get_suspend_powerstate(void); 88 unsigned int psci_get_max_phys_off_afflvl(void); 89 int psci_get_suspend_afflvl(void); 90 91 #endif /* ____ASSEMBLY__ */ 92 #endif /* __PSCI_COMPAT_H__ */ 93