1 /*
2  * Copyright (c) 2015-2022, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef CSS_PM_H
8 #define CSS_PM_H
9 
10 #include <cdefs.h>
11 #include <stdint.h>
12 
13 #include <lib/psci/psci.h>
14 
15 /* SGI used to trigger per-core power down request */
16 #define CSS_CPU_PWR_DOWN_REQ_INTR	ARM_IRQ_SEC_SGI_7
17 
18 /* Macros to read the CSS power domain state */
19 #define CSS_CORE_PWR_STATE(state)	(state)->pwr_domain_state[ARM_PWR_LVL0]
20 #define CSS_CLUSTER_PWR_STATE(state)	(state)->pwr_domain_state[ARM_PWR_LVL1]
21 
css_system_pwr_state(const psci_power_state_t * state)22 static inline unsigned int css_system_pwr_state(const psci_power_state_t *state)
23 {
24 #if (PLAT_MAX_PWR_LVL == CSS_SYSTEM_PWR_DMN_LVL)
25 	return state->pwr_domain_state[CSS_SYSTEM_PWR_DMN_LVL];
26 #else
27 	return 0;
28 #endif
29 }
30 
31 int css_pwr_domain_on(u_register_t mpidr);
32 void css_pwr_domain_on_finish(const psci_power_state_t *target_state);
33 void css_pwr_domain_on_finish_late(const psci_power_state_t *target_state);
34 void css_pwr_domain_off(const psci_power_state_t *target_state);
35 void css_pwr_domain_suspend(const psci_power_state_t *target_state);
36 void css_pwr_domain_suspend_finish(
37 				const psci_power_state_t *target_state);
38 void __dead2 css_system_off(void);
39 void __dead2 css_system_reset(void);
40 void css_cpu_standby(plat_local_state_t cpu_state);
41 void css_get_sys_suspend_power_state(psci_power_state_t *req_state);
42 int css_node_hw_state(u_register_t mpidr, unsigned int power_level);
43 void css_setup_cpu_pwr_down_intr(void);
44 int css_reboot_interrupt_handler(uint32_t intr_raw, uint32_t flags,
45 		void *handle, void *cookie);
46 
47 /*
48  * This mapping array has to be exported by the platform. Each element at
49  * a given index maps that core to an SCMI power domain.
50  */
51 extern const uint32_t plat_css_core_pos_to_scmi_dmn_id_map[];
52 
53 #define SCMI_DOMAIN_ID_MASK		U(0xFFFF)
54 #define SCMI_CHANNEL_ID_MASK		U(0xFFFF)
55 #define SCMI_CHANNEL_ID_SHIFT		U(16)
56 
57 #define SET_SCMI_CHANNEL_ID(n)		(((n) & SCMI_CHANNEL_ID_MASK) << \
58 					 SCMI_CHANNEL_ID_SHIFT)
59 #define SET_SCMI_DOMAIN_ID(n)		((n) & SCMI_DOMAIN_ID_MASK)
60 #define GET_SCMI_CHANNEL_ID(n)		(((n) >> SCMI_CHANNEL_ID_SHIFT) & \
61 					 SCMI_CHANNEL_ID_MASK)
62 #define GET_SCMI_DOMAIN_ID(n)		((n) & SCMI_DOMAIN_ID_MASK)
63 
64 #endif /* CSS_PM_H */
65