Home | History | Annotate | Download | only in psci
      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