xref: /rk3399_ARM-atf/plat/xilinx/zynqmp/pm_service/zynqmp_pm_api_sys.c (revision 047b1b9afce13993db8363f55be6e0cbfb69bf0d)
1a92681d9SJay Buddhabhatti /*
2619bc13eSMichal Simek  * Copyright (c) 2013-2022, Arm Limited and Contributors. All rights reserved.
38ce93ec9SRonak Jain  * Copyright (c) 2022-2025, Advanced Micro Devices, Inc. All rights reserved.
4a92681d9SJay Buddhabhatti  *
5a92681d9SJay Buddhabhatti  * SPDX-License-Identifier: BSD-3-Clause
6a92681d9SJay Buddhabhatti  */
7a92681d9SJay Buddhabhatti 
8a92681d9SJay Buddhabhatti /*
9a92681d9SJay Buddhabhatti  * ZynqMP system level PM-API functions and communication with PMU via
10a92681d9SJay Buddhabhatti  * IPI interrupts
11a92681d9SJay Buddhabhatti  */
12a92681d9SJay Buddhabhatti 
13a92681d9SJay Buddhabhatti #include <arch_helpers.h>
14a92681d9SJay Buddhabhatti #include <plat/common/platform.h>
15*4fd510e0SRonak Jain #include <plat_pm_common.h>
16a92681d9SJay Buddhabhatti 
17a92681d9SJay Buddhabhatti #include "pm_api_clock.h"
18a92681d9SJay Buddhabhatti #include "pm_api_ioctl.h"
19a92681d9SJay Buddhabhatti #include "pm_api_pinctrl.h"
20a92681d9SJay Buddhabhatti #include "pm_client.h"
21a92681d9SJay Buddhabhatti #include "pm_common.h"
22a92681d9SJay Buddhabhatti #include "pm_ipi.h"
23a92681d9SJay Buddhabhatti #include "zynqmp_pm_api_sys.h"
24a92681d9SJay Buddhabhatti 
25a92681d9SJay Buddhabhatti #define PM_QUERY_FEATURE_BITMASK ( \
26a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_CLOCK_GET_NAME) | \
27a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_CLOCK_GET_TOPOLOGY) |	\
28a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS) | \
29a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_CLOCK_GET_PARENTS) | \
30a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_CLOCK_GET_ATTRIBUTES) | \
31a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_PINCTRL_GET_NUM_PINS) | \
32a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_PINCTRL_GET_NUM_FUNCTIONS) | \
33a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_PINCTRL_GET_NUM_FUNCTION_GROUPS) | \
34a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_PINCTRL_GET_FUNCTION_NAME) | \
35a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_PINCTRL_GET_FUNCTION_GROUPS) | \
36a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_PINCTRL_GET_PIN_GROUPS) | \
37a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_CLOCK_GET_NUM_CLOCKS) | \
38a92681d9SJay Buddhabhatti 	(1ULL << (uint64_t)PM_QID_CLOCK_GET_MAX_DIVISOR))
39a92681d9SJay Buddhabhatti 
40a92681d9SJay Buddhabhatti /**
41de7ed953SPrasad Kummari  * typedef eemi_api_dependency - Dependent EEMI APIs which are implemented
42de7ed953SPrasad Kummari  *                               on both the TF-A and firmware.
43de7ed953SPrasad Kummari  * @id: EEMI API id or IOCTL id to be checked.
44de7ed953SPrasad Kummari  * @api_id: Dependent EEMI API.
45a92681d9SJay Buddhabhatti  *
46a92681d9SJay Buddhabhatti  */
47a92681d9SJay Buddhabhatti typedef struct __attribute__((packed)) {
48a92681d9SJay Buddhabhatti 	uint8_t id;
49a92681d9SJay Buddhabhatti 	uint8_t api_id;
50a92681d9SJay Buddhabhatti } eemi_api_dependency;
51a92681d9SJay Buddhabhatti 
52c8be2240SPrasad Kummari /* Dependent APIs for TF-A to check their version from firmware */
53a92681d9SJay Buddhabhatti static const eemi_api_dependency api_dep_table[] = {
54a92681d9SJay Buddhabhatti 	{
556ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_SELF_SUSPEND,
566ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_SELF_SUSPEND,
57a92681d9SJay Buddhabhatti 	},
58a92681d9SJay Buddhabhatti 	{
596ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_REQ_WAKEUP,
606ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_REQ_WAKEUP,
61a92681d9SJay Buddhabhatti 	},
62a92681d9SJay Buddhabhatti 	{
636ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_SET_WAKEUP_SOURCE,
646ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_SET_WAKEUP_SOURCE,
65a92681d9SJay Buddhabhatti 	},
66a92681d9SJay Buddhabhatti 	{
676ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_SYSTEM_SHUTDOWN,
686ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_SYSTEM_SHUTDOWN,
69a92681d9SJay Buddhabhatti 	},
70a92681d9SJay Buddhabhatti 	{
716ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_GET_API_VERSION,
726ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_GET_API_VERSION,
73a92681d9SJay Buddhabhatti 	},
74a92681d9SJay Buddhabhatti 	{
756ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_ENABLE,
766ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_SET_MODE,
77a92681d9SJay Buddhabhatti 	},
78a92681d9SJay Buddhabhatti 	{
796ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_ENABLE,
806ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_CLOCK_ENABLE,
81a92681d9SJay Buddhabhatti 	},
82a92681d9SJay Buddhabhatti 	{
836ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_DISABLE,
846ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_SET_MODE,
85a92681d9SJay Buddhabhatti 	},
86a92681d9SJay Buddhabhatti 	{
876ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_DISABLE,
886ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_CLOCK_DISABLE,
89a92681d9SJay Buddhabhatti 	},
90a92681d9SJay Buddhabhatti 	{
916ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_GETSTATE,
926ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_GET_MODE,
93a92681d9SJay Buddhabhatti 	},
94a92681d9SJay Buddhabhatti 	{
956ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_GETSTATE,
966ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_CLOCK_GETSTATE,
97a92681d9SJay Buddhabhatti 	},
98a92681d9SJay Buddhabhatti 	{
996ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_SETDIVIDER,
1006ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_SET_PARAMETER,
101a92681d9SJay Buddhabhatti 	},
102a92681d9SJay Buddhabhatti 	{
1036ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_SETDIVIDER,
1046ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_CLOCK_SETDIVIDER,
105a92681d9SJay Buddhabhatti 	},
106a92681d9SJay Buddhabhatti 	{
1076ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_GETDIVIDER,
1086ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_GET_PARAMETER,
109a92681d9SJay Buddhabhatti 	},
110a92681d9SJay Buddhabhatti 	{
1116ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_GETDIVIDER,
1126ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_CLOCK_GETDIVIDER,
113a92681d9SJay Buddhabhatti 	},
114a92681d9SJay Buddhabhatti 	{
1156ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_SETPARENT,
1166ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_SET_PARAMETER,
117a92681d9SJay Buddhabhatti 	},
118a92681d9SJay Buddhabhatti 	{
1196ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_SETPARENT,
1206ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_CLOCK_SETPARENT,
121a92681d9SJay Buddhabhatti 	},
122a92681d9SJay Buddhabhatti 	{
1236ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_GETPARENT,
1246ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_GET_PARAMETER,
125a92681d9SJay Buddhabhatti 	},
126a92681d9SJay Buddhabhatti 	{
1276ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_CLOCK_GETPARENT,
1286ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_CLOCK_GETPARENT,
129a92681d9SJay Buddhabhatti 	},
130a92681d9SJay Buddhabhatti 	{
1316ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_PLL_SET_PARAMETER,
1326ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_SET_PARAMETER,
133a92681d9SJay Buddhabhatti 	},
134a92681d9SJay Buddhabhatti 	{
1356ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_PLL_GET_PARAMETER,
1366ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_GET_PARAMETER,
137a92681d9SJay Buddhabhatti 	},
138a92681d9SJay Buddhabhatti 	{
1396ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_PLL_SET_MODE,
1406ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_SET_MODE,
141a92681d9SJay Buddhabhatti 	},
142a92681d9SJay Buddhabhatti 	{
1436ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_PLL_GET_MODE,
1446ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_GET_MODE,
145a92681d9SJay Buddhabhatti 	},
146a92681d9SJay Buddhabhatti 	{
1476ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_REGISTER_ACCESS,
1486ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_WRITE,
149a92681d9SJay Buddhabhatti 	},
150a92681d9SJay Buddhabhatti 	{
1516ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_REGISTER_ACCESS,
1526ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_READ,
153a92681d9SJay Buddhabhatti 	},
154a92681d9SJay Buddhabhatti 	{
1556ae95624SMaheedhar Bollapalli 		.id = (uint8_t)PM_FEATURE_CHECK,
1566ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_FEATURE_CHECK,
157a92681d9SJay Buddhabhatti 	},
158a92681d9SJay Buddhabhatti 	{
1596ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_SET_TAPDELAY_BYPASS,
1606ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_WRITE,
161a92681d9SJay Buddhabhatti 	},
162a92681d9SJay Buddhabhatti 	{
1636ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_SD_DLL_RESET,
1646ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_WRITE,
165a92681d9SJay Buddhabhatti 	},
166a92681d9SJay Buddhabhatti 	{
1676ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_SET_SD_TAPDELAY,
1686ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_WRITE,
169a92681d9SJay Buddhabhatti 	},
170a92681d9SJay Buddhabhatti 	{
1716ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_SET_SD_TAPDELAY,
1726ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_READ,
173a92681d9SJay Buddhabhatti 	},
174a92681d9SJay Buddhabhatti 	{
1756ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_SET_PLL_FRAC_DATA,
1766ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_SET_PARAMETER,
177a92681d9SJay Buddhabhatti 	},
178a92681d9SJay Buddhabhatti 	{
1796ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_GET_PLL_FRAC_DATA,
1806ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_PLL_GET_PARAMETER,
181a92681d9SJay Buddhabhatti 	},
182a92681d9SJay Buddhabhatti 	{
1836ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_WRITE_GGS,
1846ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_WRITE,
185a92681d9SJay Buddhabhatti 	},
186a92681d9SJay Buddhabhatti 	{
1876ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_READ_GGS,
1886ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_READ,
189a92681d9SJay Buddhabhatti 	},
190a92681d9SJay Buddhabhatti 	{
1916ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_WRITE_PGGS,
1926ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_WRITE,
193a92681d9SJay Buddhabhatti 	},
194a92681d9SJay Buddhabhatti 	{
1956ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_READ_PGGS,
1966ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_READ,
197a92681d9SJay Buddhabhatti 	},
198a92681d9SJay Buddhabhatti 	{
1996ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_ULPI_RESET,
2006ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_WRITE,
201a92681d9SJay Buddhabhatti 	},
202a92681d9SJay Buddhabhatti 	{
2036ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_SET_BOOT_HEALTH_STATUS,
2046ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_WRITE,
205a92681d9SJay Buddhabhatti 	},
206a92681d9SJay Buddhabhatti 	{
2076ae95624SMaheedhar Bollapalli 		.id = (uint8_t)IOCTL_AFI,
2086ae95624SMaheedhar Bollapalli 		.api_id = (uint8_t)PM_MMIO_WRITE,
209a92681d9SJay Buddhabhatti 	},
210a92681d9SJay Buddhabhatti };
211a92681d9SJay Buddhabhatti 
212c8be2240SPrasad Kummari /* Expected firmware API version to TF-A */
213c8be2240SPrasad Kummari static const uint8_t tfa_expected_ver_id[] = {
214a92681d9SJay Buddhabhatti 	[PM_SELF_SUSPEND] = FW_API_BASE_VERSION,
215a92681d9SJay Buddhabhatti 	[PM_REQ_WAKEUP] = FW_API_BASE_VERSION,
216a92681d9SJay Buddhabhatti 	[PM_SET_WAKEUP_SOURCE] = FW_API_BASE_VERSION,
217a92681d9SJay Buddhabhatti 	[PM_SYSTEM_SHUTDOWN] = FW_API_BASE_VERSION,
218a92681d9SJay Buddhabhatti 	[PM_GET_API_VERSION] = FW_API_BASE_VERSION,
219a92681d9SJay Buddhabhatti 	[PM_PLL_SET_MODE] = FW_API_BASE_VERSION,
220a92681d9SJay Buddhabhatti 	[PM_PLL_GET_MODE] = FW_API_BASE_VERSION,
221a92681d9SJay Buddhabhatti 	[PM_CLOCK_ENABLE] = FW_API_BASE_VERSION,
222a92681d9SJay Buddhabhatti 	[PM_CLOCK_DISABLE] = FW_API_BASE_VERSION,
223a92681d9SJay Buddhabhatti 	[PM_CLOCK_GETSTATE] = FW_API_BASE_VERSION,
224a92681d9SJay Buddhabhatti 	[PM_PLL_SET_PARAMETER] = FW_API_BASE_VERSION,
225a92681d9SJay Buddhabhatti 	[PM_PLL_GET_PARAMETER] = FW_API_BASE_VERSION,
226a92681d9SJay Buddhabhatti 	[PM_CLOCK_SETDIVIDER] = FW_API_BASE_VERSION,
227a92681d9SJay Buddhabhatti 	[PM_CLOCK_GETDIVIDER] = FW_API_BASE_VERSION,
228a92681d9SJay Buddhabhatti 	[PM_CLOCK_SETPARENT] = FW_API_BASE_VERSION,
229a92681d9SJay Buddhabhatti 	[PM_CLOCK_GETPARENT] = FW_API_BASE_VERSION,
230a92681d9SJay Buddhabhatti 	[PM_MMIO_WRITE] = FW_API_BASE_VERSION,
231a92681d9SJay Buddhabhatti 	[PM_MMIO_READ] = FW_API_BASE_VERSION,
232a92681d9SJay Buddhabhatti 	[PM_FEATURE_CHECK] = FW_API_VERSION_2,
233a92681d9SJay Buddhabhatti };
234a92681d9SJay Buddhabhatti 
235a92681d9SJay Buddhabhatti /* default shutdown/reboot scope is system(2) */
236a92681d9SJay Buddhabhatti static uint32_t pm_shutdown_scope = PMF_SHUTDOWN_SUBTYPE_SYSTEM;
237a92681d9SJay Buddhabhatti 
238a92681d9SJay Buddhabhatti /**
239de7ed953SPrasad Kummari  * pm_get_shutdown_scope() - Get the currently set shutdown scope.
240a92681d9SJay Buddhabhatti  *
241de7ed953SPrasad Kummari  * Return: Shutdown scope value.
242de7ed953SPrasad Kummari  *
243a92681d9SJay Buddhabhatti  */
pm_get_shutdown_scope(void)244a92681d9SJay Buddhabhatti uint32_t pm_get_shutdown_scope(void)
245a92681d9SJay Buddhabhatti {
246a92681d9SJay Buddhabhatti 	return pm_shutdown_scope;
247a92681d9SJay Buddhabhatti }
248a92681d9SJay Buddhabhatti 
249a92681d9SJay Buddhabhatti /**
250de7ed953SPrasad Kummari  * pm_self_suspend() - PM call for processor to suspend itself.
251de7ed953SPrasad Kummari  * @nid: Node id of the processor or subsystem.
252de7ed953SPrasad Kummari  * @latency: Requested maximum wakeup latency (not supported).
253de7ed953SPrasad Kummari  * @state: Requested state.
254de7ed953SPrasad Kummari  * @address: Resume address.
2558ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
2568ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
257a92681d9SJay Buddhabhatti  *
258a92681d9SJay Buddhabhatti  * This is a blocking call, it will return only once PMU has responded.
259a92681d9SJay Buddhabhatti  * On a wakeup, resume address will be automatically set by PMU.
260a92681d9SJay Buddhabhatti  *
261de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
262de7ed953SPrasad Kummari  *
263a92681d9SJay Buddhabhatti  */
pm_self_suspend(enum pm_node_id nid,uint32_t latency,uint32_t state,uintptr_t address,uint32_t flag)264a92681d9SJay Buddhabhatti enum pm_ret_status pm_self_suspend(enum pm_node_id nid,
265a92681d9SJay Buddhabhatti 				   uint32_t latency,
266a92681d9SJay Buddhabhatti 				   uint32_t state,
2678ce93ec9SRonak Jain 				   uintptr_t address,
2688ce93ec9SRonak Jain 				   uint32_t flag)
269a92681d9SJay Buddhabhatti {
2701c43e36aSMaheedhar Bollapalli 	(void)nid;
271a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
272a92681d9SJay Buddhabhatti 	uint32_t cpuid = plat_my_core_pos();
273a92681d9SJay Buddhabhatti 	const struct pm_proc *proc = pm_get_proc(cpuid);
274a92681d9SJay Buddhabhatti 
27520fa9fc8SRonak Jain 	if (proc == NULL) {
27620fa9fc8SRonak Jain 		WARN("Failed to get proc %d\n", cpuid);
27720fa9fc8SRonak Jain 		return PM_RET_ERROR_INTERNAL;
27820fa9fc8SRonak Jain 	}
27920fa9fc8SRonak Jain 
280a92681d9SJay Buddhabhatti 	/*
281a92681d9SJay Buddhabhatti 	 * Do client specific suspend operations
282a92681d9SJay Buddhabhatti 	 * (e.g. set powerdown request bit)
283a92681d9SJay Buddhabhatti 	 */
2845cac1d85SRonak Jain 	pm_client_suspend(proc, state, flag);
285a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
2868ce93ec9SRonak Jain 	PM_PACK_PAYLOAD6(payload, flag, PM_SELF_SUSPEND, proc->node_id,
2878ce93ec9SRonak Jain 			 latency, state, address, (address >> 32));
288a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(proc, payload, NULL, 0);
289a92681d9SJay Buddhabhatti }
290a92681d9SJay Buddhabhatti 
291a92681d9SJay Buddhabhatti /**
292a92681d9SJay Buddhabhatti  * pm_req_suspend() - PM call to request for another PU or subsystem to
293a92681d9SJay Buddhabhatti  *                    be suspended gracefully.
294de7ed953SPrasad Kummari  * @target: Node id of the targeted PU or subsystem.
295de7ed953SPrasad Kummari  * @ack: Flag to specify whether acknowledge is requested.
296de7ed953SPrasad Kummari  * @latency: Requested wakeup latency (not supported).
297de7ed953SPrasad Kummari  * @state: Requested state (not supported).
2988ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
2998ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
300a92681d9SJay Buddhabhatti  *
301de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
302de7ed953SPrasad Kummari  *
303a92681d9SJay Buddhabhatti  */
pm_req_suspend(enum pm_node_id target,enum pm_request_ack ack,uint32_t latency,uint32_t state,uint32_t flag)304a92681d9SJay Buddhabhatti enum pm_ret_status pm_req_suspend(enum pm_node_id target,
305a92681d9SJay Buddhabhatti 				  enum pm_request_ack ack,
3068ce93ec9SRonak Jain 				  uint32_t latency, uint32_t state,
3078ce93ec9SRonak Jain 				  uint32_t flag)
308a92681d9SJay Buddhabhatti {
309a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
3103f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
311a92681d9SJay Buddhabhatti 
312a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
3138ce93ec9SRonak Jain 	PM_PACK_PAYLOAD5(payload, flag, PM_REQ_SUSPEND, target, ack, latency, state);
314a92681d9SJay Buddhabhatti 	if (ack == REQ_ACK_BLOCKING) {
3153f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send_sync(primary_proc, payload, NULL, 0);
316a92681d9SJay Buddhabhatti 	} else {
3173f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send(primary_proc, payload);
318a92681d9SJay Buddhabhatti 	}
3193f6d4794SMaheedhar Bollapalli 
3203f6d4794SMaheedhar Bollapalli 	return ret;
321a92681d9SJay Buddhabhatti }
322a92681d9SJay Buddhabhatti 
323a92681d9SJay Buddhabhatti /**
324a92681d9SJay Buddhabhatti  * pm_req_wakeup() - PM call for processor to wake up selected processor
325de7ed953SPrasad Kummari  *		     or subsystem.
326de7ed953SPrasad Kummari  * @target: Node id of the processor or subsystem to wake up.
327de7ed953SPrasad Kummari  * @ack: Flag to specify whether acknowledge requested.
328de7ed953SPrasad Kummari  * @set_address: Resume address presence indicator.
329de7ed953SPrasad Kummari  *               1 resume address specified, 0 otherwise.
330de7ed953SPrasad Kummari  * @address: Resume address.
3318ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
3328ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
333a92681d9SJay Buddhabhatti  *
334a92681d9SJay Buddhabhatti  * This API function is either used to power up another APU core for SMP
335a92681d9SJay Buddhabhatti  * (by PSCI) or to power up an entirely different PU or subsystem, such
336a92681d9SJay Buddhabhatti  * as RPU0, RPU, or PL_CORE_xx. Resume address for the target PU will be
337a92681d9SJay Buddhabhatti  * automatically set by PMU.
338a92681d9SJay Buddhabhatti  *
339de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
340de7ed953SPrasad Kummari  *
341a92681d9SJay Buddhabhatti  */
pm_req_wakeup(enum pm_node_id target,uint32_t set_address,uintptr_t address,enum pm_request_ack ack,uint32_t flag)342a92681d9SJay Buddhabhatti enum pm_ret_status pm_req_wakeup(enum pm_node_id target,
343a92681d9SJay Buddhabhatti 				 uint32_t set_address,
344a92681d9SJay Buddhabhatti 				 uintptr_t address,
3458ce93ec9SRonak Jain 				 enum pm_request_ack ack,
3468ce93ec9SRonak Jain 				 uint32_t flag)
347a92681d9SJay Buddhabhatti {
348a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
349a92681d9SJay Buddhabhatti 	uint64_t encoded_address;
3503f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
351a92681d9SJay Buddhabhatti 
352a92681d9SJay Buddhabhatti 	/* encode set Address into 1st bit of address */
353a92681d9SJay Buddhabhatti 	encoded_address = address;
354895e8029SMaheedhar Bollapalli 	encoded_address |= (uint32_t)!!set_address;
355a92681d9SJay Buddhabhatti 
356a92681d9SJay Buddhabhatti 	/* Send request to the PMU to perform the wake of the PU */
3578ce93ec9SRonak Jain 	PM_PACK_PAYLOAD5(payload, flag, PM_REQ_WAKEUP, target, encoded_address,
358a92681d9SJay Buddhabhatti 			 encoded_address >> 32, ack);
359a92681d9SJay Buddhabhatti 
360a92681d9SJay Buddhabhatti 	if (ack == REQ_ACK_BLOCKING) {
3613f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send_sync(primary_proc, payload, NULL, 0);
362a92681d9SJay Buddhabhatti 	} else {
3633f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send(primary_proc, payload);
364a92681d9SJay Buddhabhatti 	}
3653f6d4794SMaheedhar Bollapalli 
3663f6d4794SMaheedhar Bollapalli 	return ret;
367a92681d9SJay Buddhabhatti }
368a92681d9SJay Buddhabhatti 
369a92681d9SJay Buddhabhatti /**
370a92681d9SJay Buddhabhatti  * pm_force_powerdown() - PM call to request for another PU or subsystem to
371de7ed953SPrasad Kummari  *                        be powered down forcefully.
372de7ed953SPrasad Kummari  * @target: Node id of the targeted PU or subsystem.
373de7ed953SPrasad Kummari  * @ack: Flag to specify whether acknowledge is requested.
3748ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
3758ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
376a92681d9SJay Buddhabhatti  *
377de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
378de7ed953SPrasad Kummari  *
379a92681d9SJay Buddhabhatti  */
pm_force_powerdown(enum pm_node_id target,enum pm_request_ack ack,uint32_t flag)380a92681d9SJay Buddhabhatti enum pm_ret_status pm_force_powerdown(enum pm_node_id target,
3818ce93ec9SRonak Jain 				      enum pm_request_ack ack,
3828ce93ec9SRonak Jain 				      uint32_t flag)
383a92681d9SJay Buddhabhatti {
384a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
3853f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
386a92681d9SJay Buddhabhatti 
387a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
3888ce93ec9SRonak Jain 	PM_PACK_PAYLOAD3(payload, flag, PM_FORCE_POWERDOWN, target, ack);
389a92681d9SJay Buddhabhatti 
390a92681d9SJay Buddhabhatti 	if (ack == REQ_ACK_BLOCKING) {
3913f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send_sync(primary_proc, payload, NULL, 0);
392a92681d9SJay Buddhabhatti 	} else {
3933f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send(primary_proc, payload);
394a92681d9SJay Buddhabhatti 	}
3953f6d4794SMaheedhar Bollapalli 
3963f6d4794SMaheedhar Bollapalli 	return ret;
397a92681d9SJay Buddhabhatti }
398a92681d9SJay Buddhabhatti 
399a92681d9SJay Buddhabhatti /**
400de7ed953SPrasad Kummari  * pm_set_wakeup_source() - PM call to specify the wakeup source while
401de7ed953SPrasad Kummari  *                          suspended.
402de7ed953SPrasad Kummari  * @target: Node id of the targeted PU or subsystem.
403de7ed953SPrasad Kummari  * @wkup_node: Node id of the wakeup peripheral.
404de7ed953SPrasad Kummari  * @enable: Enable or disable the specified peripheral as wake source.
4058ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
4068ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
407a92681d9SJay Buddhabhatti  *
408de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
409de7ed953SPrasad Kummari  *
410a92681d9SJay Buddhabhatti  */
pm_set_wakeup_source(enum pm_node_id target,enum pm_node_id wkup_node,uint32_t enable,uint32_t flag)411a92681d9SJay Buddhabhatti enum pm_ret_status pm_set_wakeup_source(enum pm_node_id target,
412a92681d9SJay Buddhabhatti 					enum pm_node_id wkup_node,
4138ce93ec9SRonak Jain 					uint32_t enable,
4148ce93ec9SRonak Jain 					uint32_t flag)
415a92681d9SJay Buddhabhatti {
416a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
417a92681d9SJay Buddhabhatti 
4188ce93ec9SRonak Jain 	PM_PACK_PAYLOAD4(payload, flag, PM_SET_WAKEUP_SOURCE, target, wkup_node,
419a92681d9SJay Buddhabhatti 			 enable);
420a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, NULL, 0);
421a92681d9SJay Buddhabhatti }
422a92681d9SJay Buddhabhatti 
423a92681d9SJay Buddhabhatti /**
424de7ed953SPrasad Kummari  * pm_system_shutdown() - PM call to request a system shutdown or restart.
425de7ed953SPrasad Kummari  * @type: Shutdown or restart? 0=shutdown, 1=restart, 2=setscope.
426de7ed953SPrasad Kummari  * @subtype: Scope: 0=APU-subsystem, 1=PS, 2=system.
4278ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
4288ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
429a92681d9SJay Buddhabhatti  *
430de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
431de7ed953SPrasad Kummari  *
432a92681d9SJay Buddhabhatti  */
pm_system_shutdown(uint32_t type,uint32_t subtype,uint32_t flag)4338ce93ec9SRonak Jain enum pm_ret_status pm_system_shutdown(uint32_t type, uint32_t subtype,
4348ce93ec9SRonak Jain 				      uint32_t flag)
435a92681d9SJay Buddhabhatti {
436a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
4373f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
438a92681d9SJay Buddhabhatti 
439895e8029SMaheedhar Bollapalli 	if (type == (uint32_t)PMF_SHUTDOWN_TYPE_SETSCOPE_ONLY) {
440a92681d9SJay Buddhabhatti 		/* Setting scope for subsequent PSCI reboot or shutdown */
441a92681d9SJay Buddhabhatti 		pm_shutdown_scope = subtype;
4423f6d4794SMaheedhar Bollapalli 	} else {
4438ce93ec9SRonak Jain 		PM_PACK_PAYLOAD3(payload, flag, PM_SYSTEM_SHUTDOWN, type, subtype);
4443f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send_non_blocking(primary_proc, payload);
445a92681d9SJay Buddhabhatti 	}
446a92681d9SJay Buddhabhatti 
4473f6d4794SMaheedhar Bollapalli 	return ret;
448a92681d9SJay Buddhabhatti }
449a92681d9SJay Buddhabhatti 
450a92681d9SJay Buddhabhatti /* APIs for managing PM slaves: */
451a92681d9SJay Buddhabhatti 
452a92681d9SJay Buddhabhatti /**
453de7ed953SPrasad Kummari  * pm_req_node() - PM call to request a node with specific capabilities.
454de7ed953SPrasad Kummari  * @nid: Node id of the slave.
455de7ed953SPrasad Kummari  * @capabilities: Requested capabilities of the slave.
456de7ed953SPrasad Kummari  * @qos: Quality of service (not supported).
457de7ed953SPrasad Kummari  * @ack: Flag to specify whether acknowledge is requested.
4588ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
4598ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
460a92681d9SJay Buddhabhatti  *
461de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
462de7ed953SPrasad Kummari  *
463a92681d9SJay Buddhabhatti  */
pm_req_node(enum pm_node_id nid,uint32_t capabilities,uint32_t qos,enum pm_request_ack ack,uint32_t flag)464a92681d9SJay Buddhabhatti enum pm_ret_status pm_req_node(enum pm_node_id nid,
465a92681d9SJay Buddhabhatti 			       uint32_t capabilities,
466a92681d9SJay Buddhabhatti 			       uint32_t qos,
4678ce93ec9SRonak Jain 			       enum pm_request_ack ack,
4688ce93ec9SRonak Jain 			       uint32_t flag)
469a92681d9SJay Buddhabhatti {
470a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
4713f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
472a92681d9SJay Buddhabhatti 
4738ce93ec9SRonak Jain 	PM_PACK_PAYLOAD5(payload, flag, PM_REQ_NODE, nid, capabilities, qos, ack);
474a92681d9SJay Buddhabhatti 
475a92681d9SJay Buddhabhatti 	if (ack == REQ_ACK_BLOCKING) {
4763f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send_sync(primary_proc, payload, NULL, 0);
477a92681d9SJay Buddhabhatti 	} else {
4783f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send(primary_proc, payload);
479a92681d9SJay Buddhabhatti 	}
4803f6d4794SMaheedhar Bollapalli 
4813f6d4794SMaheedhar Bollapalli 	return ret;
482a92681d9SJay Buddhabhatti }
483a92681d9SJay Buddhabhatti 
484a92681d9SJay Buddhabhatti /**
485de7ed953SPrasad Kummari  * pm_set_requirement() - PM call to set requirement for PM slaves.
486de7ed953SPrasad Kummari  * @nid: Node id of the slave.
487de7ed953SPrasad Kummari  * @capabilities: Requested capabilities of the slave.
488de7ed953SPrasad Kummari  * @qos: Quality of service (not supported).
489de7ed953SPrasad Kummari  * @ack: Flag to specify whether acknowledge is requested.
4908ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
4918ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
492a92681d9SJay Buddhabhatti  *
493de7ed953SPrasad Kummari  * This API function is to be used for slaves a PU already has requested.
494a92681d9SJay Buddhabhatti  *
495de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
496de7ed953SPrasad Kummari  *
497a92681d9SJay Buddhabhatti  */
pm_set_requirement(enum pm_node_id nid,uint32_t capabilities,uint32_t qos,enum pm_request_ack ack,uint32_t flag)498a92681d9SJay Buddhabhatti enum pm_ret_status pm_set_requirement(enum pm_node_id nid,
499a92681d9SJay Buddhabhatti 				      uint32_t capabilities,
500a92681d9SJay Buddhabhatti 				      uint32_t qos,
5018ce93ec9SRonak Jain 				      enum pm_request_ack ack,
5028ce93ec9SRonak Jain 				      uint32_t flag)
503a92681d9SJay Buddhabhatti {
504a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
5053f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
506a92681d9SJay Buddhabhatti 
5078ce93ec9SRonak Jain 	PM_PACK_PAYLOAD5(payload, flag, PM_SET_REQUIREMENT, nid, capabilities, qos,
508a92681d9SJay Buddhabhatti 			 ack);
509a92681d9SJay Buddhabhatti 
510a92681d9SJay Buddhabhatti 	if (ack == REQ_ACK_BLOCKING) {
5113f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send_sync(primary_proc, payload, NULL, 0);
512a92681d9SJay Buddhabhatti 	} else {
5133f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send(primary_proc, payload);
514a92681d9SJay Buddhabhatti 	}
5153f6d4794SMaheedhar Bollapalli 
5163f6d4794SMaheedhar Bollapalli 	return ret;
517a92681d9SJay Buddhabhatti }
518a92681d9SJay Buddhabhatti 
519a92681d9SJay Buddhabhatti /* Miscellaneous API functions */
520a92681d9SJay Buddhabhatti 
521a92681d9SJay Buddhabhatti /**
522de7ed953SPrasad Kummari  * pm_get_api_version() - Get version number of PMU PM firmware.
523de7ed953SPrasad Kummari  * @version: Returns 32-bit version number of PMU Power Management Firmware.
5248ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
5258ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
526a92681d9SJay Buddhabhatti  *
527de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
528de7ed953SPrasad Kummari  *
529a92681d9SJay Buddhabhatti  */
pm_get_api_version(uint32_t * version,uint32_t flag)5308ce93ec9SRonak Jain enum pm_ret_status pm_get_api_version(uint32_t *version, uint32_t flag)
531a92681d9SJay Buddhabhatti {
532a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
5338ce93ec9SRonak Jain 	enum pm_ret_status ret;
534a92681d9SJay Buddhabhatti 
535a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
5368ce93ec9SRonak Jain 	PM_PACK_PAYLOAD1(payload, flag, PM_GET_API_VERSION);
5378ce93ec9SRonak Jain 	ret = pm_ipi_send_sync(primary_proc, payload, version, 1);
5388ce93ec9SRonak Jain 	return ret;
539a92681d9SJay Buddhabhatti }
540a92681d9SJay Buddhabhatti 
541a92681d9SJay Buddhabhatti /**
542de7ed953SPrasad Kummari  * pm_get_node_status() - PM call to request a node's current status.
543de7ed953SPrasad Kummari  * @nid: Node id.
544de7ed953SPrasad Kummari  * @ret_buff: Buffer for the return values
545a92681d9SJay Buddhabhatti  *            [0] - Current power state of the node
546a92681d9SJay Buddhabhatti  *            [1] - Current requirements for the node (slave nodes only)
547a92681d9SJay Buddhabhatti  *            [2] - Current usage status for the node (slave nodes only)
5488ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
5498ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
550a92681d9SJay Buddhabhatti  *
551de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
552de7ed953SPrasad Kummari  *
553a92681d9SJay Buddhabhatti  */
pm_get_node_status(enum pm_node_id nid,uint32_t * ret_buff,uint32_t flag)554a92681d9SJay Buddhabhatti enum pm_ret_status pm_get_node_status(enum pm_node_id nid,
5558ce93ec9SRonak Jain 				      uint32_t *ret_buff,
5568ce93ec9SRonak Jain 				      uint32_t flag)
557a92681d9SJay Buddhabhatti {
558a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
559a92681d9SJay Buddhabhatti 
5608ce93ec9SRonak Jain 	PM_PACK_PAYLOAD2(payload, flag, PM_GET_NODE_STATUS, nid);
561a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, ret_buff, 3);
562a92681d9SJay Buddhabhatti }
563a92681d9SJay Buddhabhatti 
564a92681d9SJay Buddhabhatti /**
565de7ed953SPrasad Kummari  * pm_mmio_write() - Perform write to protected mmio.
566de7ed953SPrasad Kummari  * @address: Address to write to.
567de7ed953SPrasad Kummari  * @mask: Mask to apply.
568de7ed953SPrasad Kummari  * @value: Value to write.
5698ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
5708ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
571a92681d9SJay Buddhabhatti  *
572a92681d9SJay Buddhabhatti  * This function provides access to PM-related control registers
573a92681d9SJay Buddhabhatti  * that may not be directly accessible by a particular PU.
574a92681d9SJay Buddhabhatti  *
575de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
576de7ed953SPrasad Kummari  *
577a92681d9SJay Buddhabhatti  */
pm_mmio_write(uintptr_t address,uint32_t mask,uint32_t value,uint32_t flag)578a92681d9SJay Buddhabhatti enum pm_ret_status pm_mmio_write(uintptr_t address,
579a92681d9SJay Buddhabhatti 				 uint32_t mask,
5808ce93ec9SRonak Jain 				 uint32_t value,
5818ce93ec9SRonak Jain 				 uint32_t flag)
582a92681d9SJay Buddhabhatti {
583a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
584a92681d9SJay Buddhabhatti 
585a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
5868ce93ec9SRonak Jain 	PM_PACK_PAYLOAD4(payload, flag, PM_MMIO_WRITE, address, mask, value);
587a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, NULL, 0);
588a92681d9SJay Buddhabhatti }
589a92681d9SJay Buddhabhatti 
590a92681d9SJay Buddhabhatti /**
591de7ed953SPrasad Kummari  * pm_mmio_read() - Read value from protected mmio.
592de7ed953SPrasad Kummari  * @address: Address to write to.
593de7ed953SPrasad Kummari  * @value: Value to write.
5948ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
5958ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
596a92681d9SJay Buddhabhatti  *
597a92681d9SJay Buddhabhatti  * This function provides access to PM-related control registers
598a92681d9SJay Buddhabhatti  * that may not be directly accessible by a particular PU.
599a92681d9SJay Buddhabhatti  *
600de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
601de7ed953SPrasad Kummari  *
602a92681d9SJay Buddhabhatti  */
pm_mmio_read(uintptr_t address,uint32_t * value,uint32_t flag)6038ce93ec9SRonak Jain enum pm_ret_status pm_mmio_read(uintptr_t address, uint32_t *value, uint32_t flag)
604a92681d9SJay Buddhabhatti {
605a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
606a92681d9SJay Buddhabhatti 
607a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
6088ce93ec9SRonak Jain 	PM_PACK_PAYLOAD2(payload, flag, PM_MMIO_READ, address);
609a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, value, 1);
610a92681d9SJay Buddhabhatti }
611a92681d9SJay Buddhabhatti 
612a92681d9SJay Buddhabhatti /**
613de7ed953SPrasad Kummari  * pm_fpga_load() - Load the bitstream into the PL. This function provides
614de7ed953SPrasad Kummari  *                  access to the xilfpga library to load the Bit-stream
615de7ed953SPrasad Kummari  *                  into PL.
616de7ed953SPrasad Kummari  * @address_low: lower 32-bit Linear memory space address.
617de7ed953SPrasad Kummari  * @address_high: higher 32-bit Linear memory space address.
618de7ed953SPrasad Kummari  * @size: Number of 32bit words.
619de7ed953SPrasad Kummari  * @flags: Additional flags or settings for the fpga operation.
6208ce93ec9SRonak Jain  * @security_flag: 0 - Call from secure source.
6218ce93ec9SRonak Jain  *		   1 - Call from non-secure source.
622a92681d9SJay Buddhabhatti  *
623de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
624a92681d9SJay Buddhabhatti  *
625a92681d9SJay Buddhabhatti  */
pm_fpga_load(uint32_t address_low,uint32_t address_high,uint32_t size,uint32_t flags,uint32_t security_flag)626a92681d9SJay Buddhabhatti enum pm_ret_status pm_fpga_load(uint32_t address_low,
627a92681d9SJay Buddhabhatti 				uint32_t address_high,
628a92681d9SJay Buddhabhatti 				uint32_t size,
6298ce93ec9SRonak Jain 				uint32_t flags,
6308ce93ec9SRonak Jain 				uint32_t security_flag)
631a92681d9SJay Buddhabhatti {
632a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
633a92681d9SJay Buddhabhatti 
634a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
6358ce93ec9SRonak Jain 	PM_PACK_PAYLOAD5(payload, security_flag, PM_FPGA_LOAD, address_high,
6368ce93ec9SRonak Jain 			 address_low, size, flags);
637a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, NULL, 0);
638a92681d9SJay Buddhabhatti }
639a92681d9SJay Buddhabhatti 
640a92681d9SJay Buddhabhatti /**
641de7ed953SPrasad Kummari  * pm_fpga_get_status() - Read value from fpga status register.
642de7ed953SPrasad Kummari  * @value: Value to read.
6438ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
6448ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
645a92681d9SJay Buddhabhatti  *
646a92681d9SJay Buddhabhatti  * This function provides access to the xilfpga library to get
647de7ed953SPrasad Kummari  * the fpga status.
648de7ed953SPrasad Kummari  *
649de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
650de7ed953SPrasad Kummari  *
651a92681d9SJay Buddhabhatti  */
pm_fpga_get_status(uint32_t * value,uint32_t flag)6528ce93ec9SRonak Jain enum pm_ret_status pm_fpga_get_status(uint32_t *value, uint32_t flag)
653a92681d9SJay Buddhabhatti {
654a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
655a92681d9SJay Buddhabhatti 
656a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
6578ce93ec9SRonak Jain 	PM_PACK_PAYLOAD1(payload, flag, PM_FPGA_GET_STATUS);
658a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, value, 1);
659a92681d9SJay Buddhabhatti }
660a92681d9SJay Buddhabhatti 
661a92681d9SJay Buddhabhatti /**
662de7ed953SPrasad Kummari  * pm_get_chipid() - Read silicon ID registers.
663de7ed953SPrasad Kummari  * @value: Buffer for return values. Must be large enough to hold 8 bytes.
6648ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
6658ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
666a92681d9SJay Buddhabhatti  *
667de7ed953SPrasad Kummari  * Return: Returns silicon ID registers.
668de7ed953SPrasad Kummari  *
669a92681d9SJay Buddhabhatti  */
pm_get_chipid(uint32_t * value,uint32_t flag)6708ce93ec9SRonak Jain enum pm_ret_status pm_get_chipid(uint32_t *value, uint32_t flag)
671a92681d9SJay Buddhabhatti {
672a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
673a92681d9SJay Buddhabhatti 
674a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
6758ce93ec9SRonak Jain 	PM_PACK_PAYLOAD1(payload, flag, PM_GET_CHIPID);
676a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, value, 2);
677a92681d9SJay Buddhabhatti }
678a92681d9SJay Buddhabhatti 
679a92681d9SJay Buddhabhatti /**
680a92681d9SJay Buddhabhatti  * pm_secure_rsaaes() - Load the secure images.
681de7ed953SPrasad Kummari  * @address_low: lower 32-bit Linear memory space address.
682de7ed953SPrasad Kummari  * @address_high: higher 32-bit Linear memory space address.
683de7ed953SPrasad Kummari  * @size: Number of 32bit words.
684de7ed953SPrasad Kummari  * @flags: Additional flags or settings for the fpga operation.
6858ce93ec9SRonak Jain  * @security_flag: 0 - Call from secure source.
6868ce93ec9SRonak Jain  *		   1 - Call from non-secure source.
687a92681d9SJay Buddhabhatti  *
688de7ed953SPrasad Kummari  * This function provides access to the xilsecure library to load the
689de7ed953SPrasad Kummari  * authenticated, encrypted, and authenticated/encrypted images.
690a92681d9SJay Buddhabhatti  *
691de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
692a92681d9SJay Buddhabhatti  *
693a92681d9SJay Buddhabhatti  */
pm_secure_rsaaes(uint32_t address_low,uint32_t address_high,uint32_t size,uint32_t flags,uint32_t security_flag)694a92681d9SJay Buddhabhatti enum pm_ret_status pm_secure_rsaaes(uint32_t address_low,
695a92681d9SJay Buddhabhatti 				    uint32_t address_high,
696a92681d9SJay Buddhabhatti 				    uint32_t size,
6978ce93ec9SRonak Jain 				    uint32_t flags,
6988ce93ec9SRonak Jain 				    uint32_t security_flag)
699a92681d9SJay Buddhabhatti {
700a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
701a92681d9SJay Buddhabhatti 
702a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
7038ce93ec9SRonak Jain 	PM_PACK_PAYLOAD5(payload, security_flag, PM_SECURE_RSA_AES, address_high,
7048ce93ec9SRonak Jain 			 address_low, size, flags);
705a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, NULL, 0);
706a92681d9SJay Buddhabhatti }
707a92681d9SJay Buddhabhatti 
708a92681d9SJay Buddhabhatti /**
709de7ed953SPrasad Kummari  * pm_aes_engine() - Aes data blob encryption/decryption.
710de7ed953SPrasad Kummari  * @address_low: lower 32-bit address of the AesParams structure.
711de7ed953SPrasad Kummari  * @address_high: higher 32-bit address of the AesParams structure.
712de7ed953SPrasad Kummari  * @value: Returned output value.
7138ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
7148ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
715de7ed953SPrasad Kummari  *
716a92681d9SJay Buddhabhatti  * This function provides access to the xilsecure library to
717a92681d9SJay Buddhabhatti  * encrypt/decrypt data blobs.
718a92681d9SJay Buddhabhatti  *
719de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
720a92681d9SJay Buddhabhatti  *
721a92681d9SJay Buddhabhatti  */
pm_aes_engine(uint32_t address_high,uint32_t address_low,uint32_t * value,uint32_t flag)722a92681d9SJay Buddhabhatti enum pm_ret_status pm_aes_engine(uint32_t address_high,
723a92681d9SJay Buddhabhatti 				 uint32_t address_low,
7248ce93ec9SRonak Jain 				 uint32_t *value,
7258ce93ec9SRonak Jain 				 uint32_t flag)
726a92681d9SJay Buddhabhatti {
727a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
728a92681d9SJay Buddhabhatti 
729a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
7308ce93ec9SRonak Jain 	PM_PACK_PAYLOAD3(payload, flag, PM_SECURE_AES, address_high, address_low);
731a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, value, 1);
732a92681d9SJay Buddhabhatti }
733a92681d9SJay Buddhabhatti 
734a92681d9SJay Buddhabhatti /**
735de7ed953SPrasad Kummari  * pm_get_callbackdata() - Read from IPI response buffer.
736de7ed953SPrasad Kummari  * @data: array of PAYLOAD_ARG_CNT elements.
737de7ed953SPrasad Kummari  * @count: Number of values to return.
738a92681d9SJay Buddhabhatti  *
739a92681d9SJay Buddhabhatti  * Read value from ipi buffer response buffer.
740de7ed953SPrasad Kummari  * Return: Returns status, either success or error.
741de7ed953SPrasad Kummari  *
742a92681d9SJay Buddhabhatti  */
pm_get_callbackdata(uint32_t * data,size_t count)743a92681d9SJay Buddhabhatti enum pm_ret_status pm_get_callbackdata(uint32_t *data, size_t count)
744a92681d9SJay Buddhabhatti {
745a92681d9SJay Buddhabhatti 	enum pm_ret_status ret = PM_RET_SUCCESS;
7463f6d4794SMaheedhar Bollapalli 
747a92681d9SJay Buddhabhatti 	/* Return if interrupt is not from PMU */
7482863b0c4SMaheedhar Bollapalli 	if ((pm_ipi_irq_status(primary_proc) == 0U)) {
7493f6d4794SMaheedhar Bollapalli 		goto exit_label;
750a92681d9SJay Buddhabhatti 	}
751a92681d9SJay Buddhabhatti 
752a92681d9SJay Buddhabhatti 	ret = pm_ipi_buff_read_callb(data, count);
753a92681d9SJay Buddhabhatti 	pm_ipi_irq_clear(primary_proc);
7543f6d4794SMaheedhar Bollapalli 
7553f6d4794SMaheedhar Bollapalli exit_label:
756a92681d9SJay Buddhabhatti 	return ret;
757a92681d9SJay Buddhabhatti }
758a92681d9SJay Buddhabhatti 
759a92681d9SJay Buddhabhatti /**
760de7ed953SPrasad Kummari  * pm_ioctl() - PM IOCTL API for device control and configs.
761de7ed953SPrasad Kummari  * @nid: Node ID of the device.
762de7ed953SPrasad Kummari  * @ioctl_id: ID of the requested IOCTL.
763de7ed953SPrasad Kummari  * @arg1: Argument 1 to requested IOCTL call.
764de7ed953SPrasad Kummari  * @arg2: Argument 2 to requested IOCTL call.
765de7ed953SPrasad Kummari  * @value: Returned output value.
7668ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
7678ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
768a92681d9SJay Buddhabhatti  *
769a92681d9SJay Buddhabhatti  * This function calls IOCTL to firmware for device control and configuration.
770a92681d9SJay Buddhabhatti  *
771de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
772de7ed953SPrasad Kummari  *
773a92681d9SJay Buddhabhatti  */
pm_ioctl(enum pm_node_id nid,uint32_t ioctl_id,uint32_t arg1,uint32_t arg2,uint32_t * value,uint32_t flag)774a92681d9SJay Buddhabhatti enum pm_ret_status pm_ioctl(enum pm_node_id nid,
775a92681d9SJay Buddhabhatti 			    uint32_t ioctl_id,
776a92681d9SJay Buddhabhatti 			    uint32_t arg1,
777a92681d9SJay Buddhabhatti 			    uint32_t arg2,
7788ce93ec9SRonak Jain 			    uint32_t *value,
7798ce93ec9SRonak Jain 			    uint32_t flag)
780a92681d9SJay Buddhabhatti {
7818ce93ec9SRonak Jain 	return pm_api_ioctl(nid, ioctl_id, arg1, arg2, value, flag);
782a92681d9SJay Buddhabhatti }
783a92681d9SJay Buddhabhatti 
784a92681d9SJay Buddhabhatti /**
785de7ed953SPrasad Kummari  * fw_api_version() - Returns API version implemented in firmware.
786de7ed953SPrasad Kummari  * @id: API ID to check.
787de7ed953SPrasad Kummari  * @version: Returned supported API version.
788de7ed953SPrasad Kummari  * @len: Number of words to be returned.
7898ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
7908ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
791a92681d9SJay Buddhabhatti  *
792de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
793de7ed953SPrasad Kummari  *
794a92681d9SJay Buddhabhatti  */
fw_api_version(uint32_t id,uint32_t * version,uint32_t len,uint32_t flag)795a92681d9SJay Buddhabhatti static enum pm_ret_status fw_api_version(uint32_t id, uint32_t *version,
7968ce93ec9SRonak Jain 					 uint32_t len, uint32_t flag)
797a92681d9SJay Buddhabhatti {
798a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
799a92681d9SJay Buddhabhatti 
8008ce93ec9SRonak Jain 	PM_PACK_PAYLOAD2(payload, flag, PM_FEATURE_CHECK, id);
801a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, version, len);
802a92681d9SJay Buddhabhatti }
803a92681d9SJay Buddhabhatti 
804a92681d9SJay Buddhabhatti /**
805de7ed953SPrasad Kummari  * check_api_dependency() -  API to check dependent EEMI API version.
806de7ed953SPrasad Kummari  * @id: EEMI API ID to check.
8078ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
8088ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
809a92681d9SJay Buddhabhatti  *
810de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
811de7ed953SPrasad Kummari  *
812a92681d9SJay Buddhabhatti  */
check_api_dependency(uint8_t id,uint32_t flag)8138ce93ec9SRonak Jain enum pm_ret_status check_api_dependency(uint8_t id, uint32_t flag)
814a92681d9SJay Buddhabhatti {
815a92681d9SJay Buddhabhatti 	uint8_t i;
816eda23fa5SMaheedhar Bollapalli 	uint32_t version_type;
8173f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
818a92681d9SJay Buddhabhatti 
819a92681d9SJay Buddhabhatti 	for (i = 0U; i < ARRAY_SIZE(api_dep_table); i++) {
820a92681d9SJay Buddhabhatti 		if (api_dep_table[i].id == id) {
821a92681d9SJay Buddhabhatti 			if (api_dep_table[i].api_id == 0U) {
822a92681d9SJay Buddhabhatti 				break;
823a92681d9SJay Buddhabhatti 			}
824a92681d9SJay Buddhabhatti 
825a92681d9SJay Buddhabhatti 			ret = fw_api_version(api_dep_table[i].api_id,
8268ce93ec9SRonak Jain 					     &version_type, 1, flag);
8273f6d4794SMaheedhar Bollapalli 			if (ret != PM_RET_SUCCESS) {
8283f6d4794SMaheedhar Bollapalli 				goto exit_label;
829a92681d9SJay Buddhabhatti 			}
830a92681d9SJay Buddhabhatti 
831c8be2240SPrasad Kummari 			/* Check if fw version matches TF-A expected version */
832eda23fa5SMaheedhar Bollapalli 			if (version_type != tfa_expected_ver_id[api_dep_table[i].api_id]) {
8333f6d4794SMaheedhar Bollapalli 				ret = PM_RET_ERROR_NOTSUPPORTED;
8343f6d4794SMaheedhar Bollapalli 				goto exit_label;
835a92681d9SJay Buddhabhatti 			}
836a92681d9SJay Buddhabhatti 		}
837a92681d9SJay Buddhabhatti 	}
838a92681d9SJay Buddhabhatti 
8393f6d4794SMaheedhar Bollapalli exit_label:
8403f6d4794SMaheedhar Bollapalli 	return ret;
841a92681d9SJay Buddhabhatti }
842a92681d9SJay Buddhabhatti 
843a92681d9SJay Buddhabhatti /**
844de7ed953SPrasad Kummari  * feature_check_tfa() - These are API's completely implemented in TF-A.
845de7ed953SPrasad Kummari  * @api_id: API ID to check.
846de7ed953SPrasad Kummari  * @version: Returned supported API version.
847de7ed953SPrasad Kummari  * @bit_mask: Returned supported IOCTL id version.
848a92681d9SJay Buddhabhatti  *
849de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
850de7ed953SPrasad Kummari  *
851a92681d9SJay Buddhabhatti  */
feature_check_tfa(uint32_t api_id,uint32_t * version,uint32_t * bit_mask)852c8be2240SPrasad Kummari static enum pm_ret_status feature_check_tfa(uint32_t api_id, uint32_t *version,
853a92681d9SJay Buddhabhatti 					    uint32_t *bit_mask)
854a92681d9SJay Buddhabhatti {
8553f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_ERROR_NO_FEATURE;
8563f6d4794SMaheedhar Bollapalli 
857a92681d9SJay Buddhabhatti 	switch (api_id) {
858a92681d9SJay Buddhabhatti 	case PM_QUERY_DATA:
859a92681d9SJay Buddhabhatti 		*version = TFA_API_QUERY_DATA_VERSION;
860a92681d9SJay Buddhabhatti 		bit_mask[0] = (uint32_t)(PM_QUERY_FEATURE_BITMASK);
861a92681d9SJay Buddhabhatti 		bit_mask[1] = (uint32_t)(PM_QUERY_FEATURE_BITMASK >> 32);
8623f6d4794SMaheedhar Bollapalli 		ret = PM_RET_SUCCESS;
8633f6d4794SMaheedhar Bollapalli 		break;
864a92681d9SJay Buddhabhatti 	case PM_GET_CALLBACK_DATA:
865a92681d9SJay Buddhabhatti 	case PM_GET_TRUSTZONE_VERSION:
866a92681d9SJay Buddhabhatti 	case PM_SET_SUSPEND_MODE:
867c8be2240SPrasad Kummari 		*version = TFA_API_BASE_VERSION;
8683f6d4794SMaheedhar Bollapalli 		ret = PM_RET_SUCCESS;
8693f6d4794SMaheedhar Bollapalli 		break;
870a92681d9SJay Buddhabhatti 	default:
8713f6d4794SMaheedhar Bollapalli 		break;
872a92681d9SJay Buddhabhatti 	}
8733f6d4794SMaheedhar Bollapalli 
8743f6d4794SMaheedhar Bollapalli 	return ret;
875a92681d9SJay Buddhabhatti }
876a92681d9SJay Buddhabhatti 
877a92681d9SJay Buddhabhatti /**
878de7ed953SPrasad Kummari  * get_tfa_version_for_partial_apis() - Return TF-A version for partially.
879a92681d9SJay Buddhabhatti  *                                      implemented APIs
880de7ed953SPrasad Kummari  * @api_id: API ID to check.
881de7ed953SPrasad Kummari  * @version: Returned supported API version.
882a92681d9SJay Buddhabhatti  *
883de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
884de7ed953SPrasad Kummari  *
885a92681d9SJay Buddhabhatti  */
get_tfa_version_for_partial_apis(uint32_t api_id,uint32_t * version)886c8be2240SPrasad Kummari static enum pm_ret_status get_tfa_version_for_partial_apis(uint32_t api_id,
887a92681d9SJay Buddhabhatti 							   uint32_t *version)
888a92681d9SJay Buddhabhatti {
8893f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_ERROR_ARGS;
8903f6d4794SMaheedhar Bollapalli 
891a92681d9SJay Buddhabhatti 	switch (api_id) {
892a92681d9SJay Buddhabhatti 	case PM_SELF_SUSPEND:
893a92681d9SJay Buddhabhatti 	case PM_REQ_WAKEUP:
894a92681d9SJay Buddhabhatti 	case PM_SET_WAKEUP_SOURCE:
895a92681d9SJay Buddhabhatti 	case PM_SYSTEM_SHUTDOWN:
896a92681d9SJay Buddhabhatti 	case PM_GET_API_VERSION:
897a92681d9SJay Buddhabhatti 	case PM_CLOCK_ENABLE:
898a92681d9SJay Buddhabhatti 	case PM_CLOCK_DISABLE:
899a92681d9SJay Buddhabhatti 	case PM_CLOCK_GETSTATE:
900a92681d9SJay Buddhabhatti 	case PM_CLOCK_SETDIVIDER:
901a92681d9SJay Buddhabhatti 	case PM_CLOCK_GETDIVIDER:
902a92681d9SJay Buddhabhatti 	case PM_CLOCK_SETPARENT:
903a92681d9SJay Buddhabhatti 	case PM_CLOCK_GETPARENT:
904a92681d9SJay Buddhabhatti 	case PM_PLL_SET_PARAMETER:
905a92681d9SJay Buddhabhatti 	case PM_PLL_GET_PARAMETER:
906a92681d9SJay Buddhabhatti 	case PM_PLL_SET_MODE:
907a92681d9SJay Buddhabhatti 	case PM_PLL_GET_MODE:
908a92681d9SJay Buddhabhatti 	case PM_REGISTER_ACCESS:
909c8be2240SPrasad Kummari 		*version = TFA_API_BASE_VERSION;
9103f6d4794SMaheedhar Bollapalli 		ret = PM_RET_SUCCESS;
9113f6d4794SMaheedhar Bollapalli 		break;
912a92681d9SJay Buddhabhatti 	case PM_FEATURE_CHECK:
913a92681d9SJay Buddhabhatti 		*version = FW_API_VERSION_2;
9143f6d4794SMaheedhar Bollapalli 		ret = PM_RET_SUCCESS;
9153f6d4794SMaheedhar Bollapalli 		break;
916a92681d9SJay Buddhabhatti 	default:
9173f6d4794SMaheedhar Bollapalli 		break;
918a92681d9SJay Buddhabhatti 	}
9193f6d4794SMaheedhar Bollapalli 
9203f6d4794SMaheedhar Bollapalli 	return ret;
921a92681d9SJay Buddhabhatti }
922a92681d9SJay Buddhabhatti 
923a92681d9SJay Buddhabhatti /**
924a92681d9SJay Buddhabhatti  * feature_check_partial() - These are API's partially implemented in
925de7ed953SPrasad Kummari  *                           TF-A and firmware both.
926de7ed953SPrasad Kummari  * @api_id: API ID to check.
927de7ed953SPrasad Kummari  * @version: Returned supported API version.
9288ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
9298ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
930a92681d9SJay Buddhabhatti  *
931de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
932de7ed953SPrasad Kummari  *
933a92681d9SJay Buddhabhatti  */
feature_check_partial(uint32_t api_id,uint32_t * version,uint32_t flag)934a92681d9SJay Buddhabhatti static enum pm_ret_status feature_check_partial(uint32_t api_id,
9358ce93ec9SRonak Jain 						uint32_t *version,
9368ce93ec9SRonak Jain 						uint32_t flag)
937a92681d9SJay Buddhabhatti {
938a92681d9SJay Buddhabhatti 	uint32_t status;
9393f6d4794SMaheedhar Bollapalli 	uint32_t ret = PM_RET_ERROR_NO_FEATURE;
940a92681d9SJay Buddhabhatti 
941a92681d9SJay Buddhabhatti 	switch (api_id) {
942a92681d9SJay Buddhabhatti 	case PM_SELF_SUSPEND:
943a92681d9SJay Buddhabhatti 	case PM_REQ_WAKEUP:
944a92681d9SJay Buddhabhatti 	case PM_SET_WAKEUP_SOURCE:
945a92681d9SJay Buddhabhatti 	case PM_SYSTEM_SHUTDOWN:
946a92681d9SJay Buddhabhatti 	case PM_GET_API_VERSION:
947a92681d9SJay Buddhabhatti 	case PM_CLOCK_ENABLE:
948a92681d9SJay Buddhabhatti 	case PM_CLOCK_DISABLE:
949a92681d9SJay Buddhabhatti 	case PM_CLOCK_GETSTATE:
950a92681d9SJay Buddhabhatti 	case PM_CLOCK_SETDIVIDER:
951a92681d9SJay Buddhabhatti 	case PM_CLOCK_GETDIVIDER:
952a92681d9SJay Buddhabhatti 	case PM_CLOCK_SETPARENT:
953a92681d9SJay Buddhabhatti 	case PM_CLOCK_GETPARENT:
954a92681d9SJay Buddhabhatti 	case PM_PLL_SET_PARAMETER:
955a92681d9SJay Buddhabhatti 	case PM_PLL_GET_PARAMETER:
956a92681d9SJay Buddhabhatti 	case PM_PLL_SET_MODE:
957a92681d9SJay Buddhabhatti 	case PM_PLL_GET_MODE:
958a92681d9SJay Buddhabhatti 	case PM_REGISTER_ACCESS:
959a92681d9SJay Buddhabhatti 	case PM_FEATURE_CHECK:
9608ce93ec9SRonak Jain 		status = check_api_dependency(api_id, flag);
9613f6d4794SMaheedhar Bollapalli 		if (status != PM_RET_SUCCESS) {
9623f6d4794SMaheedhar Bollapalli 			ret = status;
9633f6d4794SMaheedhar Bollapalli 		} else {
9643f6d4794SMaheedhar Bollapalli 			ret = get_tfa_version_for_partial_apis(api_id, version);
965a92681d9SJay Buddhabhatti 		}
9663f6d4794SMaheedhar Bollapalli 		break;
967a92681d9SJay Buddhabhatti 	default:
9683f6d4794SMaheedhar Bollapalli 		break;
969a92681d9SJay Buddhabhatti 	}
9703f6d4794SMaheedhar Bollapalli 
9713f6d4794SMaheedhar Bollapalli 	return ret;
972a92681d9SJay Buddhabhatti }
973a92681d9SJay Buddhabhatti 
974a92681d9SJay Buddhabhatti /**
975de7ed953SPrasad Kummari  * pm_feature_check() - Returns the supported API version if supported.
976de7ed953SPrasad Kummari  * @api_id: API ID to check.
977de7ed953SPrasad Kummari  * @version: Returned supported API version.
978de7ed953SPrasad Kummari  * @bit_mask: Returned supported IOCTL id version.
979de7ed953SPrasad Kummari  * @len: Number of bytes to be returned in bit_mask variable.
9808ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
9818ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
982a92681d9SJay Buddhabhatti  *
983de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
984de7ed953SPrasad Kummari  *
985a92681d9SJay Buddhabhatti  */
pm_feature_check(uint32_t api_id,uint32_t * version,uint32_t * bit_mask,uint8_t len,uint32_t flag)986a92681d9SJay Buddhabhatti enum pm_ret_status pm_feature_check(uint32_t api_id, uint32_t *version,
9878ce93ec9SRonak Jain 				    uint32_t *bit_mask, uint8_t len,
9888ce93ec9SRonak Jain 				    uint32_t flag)
989a92681d9SJay Buddhabhatti {
99003fa6f42SJay Buddhabhatti 	uint32_t ret_payload[RET_PAYLOAD_ARG_CNT] = {0U};
9913f6d4794SMaheedhar Bollapalli 	enum pm_ret_status status;
992a92681d9SJay Buddhabhatti 
993c8be2240SPrasad Kummari 	/* Get API version implemented in TF-A */
994c8be2240SPrasad Kummari 	status = feature_check_tfa(api_id, version, bit_mask);
9953f6d4794SMaheedhar Bollapalli 	if (status != PM_RET_ERROR_NO_FEATURE) {
9963f6d4794SMaheedhar Bollapalli 		goto exit_label;
997a92681d9SJay Buddhabhatti 	}
998a92681d9SJay Buddhabhatti 
999c8be2240SPrasad Kummari 	/* Get API version implemented by firmware and TF-A both */
10008ce93ec9SRonak Jain 	status = feature_check_partial(api_id, version, flag);
10013f6d4794SMaheedhar Bollapalli 	if (status != PM_RET_ERROR_NO_FEATURE) {
10023f6d4794SMaheedhar Bollapalli 		goto exit_label;
1003a92681d9SJay Buddhabhatti 	}
1004a92681d9SJay Buddhabhatti 
1005a92681d9SJay Buddhabhatti 	/* Get API version implemented by firmware */
10068ce93ec9SRonak Jain 	status = fw_api_version(api_id, ret_payload, 3, flag);
1007a92681d9SJay Buddhabhatti 	/* IOCTL call may return failure whose ID is not implemented in
1008c8be2240SPrasad Kummari 	 * firmware but implemented in TF-A
1009a92681d9SJay Buddhabhatti 	 */
1010895e8029SMaheedhar Bollapalli 	if ((api_id != (uint32_t)PM_IOCTL) && (status != PM_RET_SUCCESS)) {
10113f6d4794SMaheedhar Bollapalli 		goto exit_label;
1012a92681d9SJay Buddhabhatti 	}
1013a92681d9SJay Buddhabhatti 
1014a92681d9SJay Buddhabhatti 	*version = ret_payload[0];
1015a92681d9SJay Buddhabhatti 
1016c8be2240SPrasad Kummari 	/* Update IOCTL bit mask which are implemented in TF-A */
1017895e8029SMaheedhar Bollapalli 	if ((api_id == (uint32_t)PM_IOCTL) || (api_id == (uint32_t)PM_GET_OP_CHARACTERISTIC)) {
1018895e8029SMaheedhar Bollapalli 		if (len < 2U) {
10193f6d4794SMaheedhar Bollapalli 			status = PM_RET_ERROR_ARGS;
10203f6d4794SMaheedhar Bollapalli 			goto exit_label;
1021a92681d9SJay Buddhabhatti 		}
1022a92681d9SJay Buddhabhatti 		bit_mask[0] = ret_payload[1];
1023a92681d9SJay Buddhabhatti 		bit_mask[1] = ret_payload[2];
1024895e8029SMaheedhar Bollapalli 		if (api_id == (uint32_t)PM_IOCTL) {
1025c8be2240SPrasad Kummari 			/* Get IOCTL's implemented by TF-A */
10268ce93ec9SRonak Jain 			status = tfa_ioctl_bitmask(bit_mask, flag);
1027a92681d9SJay Buddhabhatti 		}
1028a92681d9SJay Buddhabhatti 	} else {
1029a92681d9SJay Buddhabhatti 		/* Requires for MISRA */
1030a92681d9SJay Buddhabhatti 	}
1031a92681d9SJay Buddhabhatti 
10323f6d4794SMaheedhar Bollapalli exit_label:
1033a92681d9SJay Buddhabhatti 	return status;
1034a92681d9SJay Buddhabhatti }
1035a92681d9SJay Buddhabhatti 
1036a92681d9SJay Buddhabhatti /**
1037de7ed953SPrasad Kummari  * pm_clock_get_max_divisor - PM call to get max divisor.
1038de7ed953SPrasad Kummari  * @clock_id: Clock ID.
1039de7ed953SPrasad Kummari  * @div_type: Divisor ID (TYPE_DIV1 or TYPE_DIV2).
1040de7ed953SPrasad Kummari  * @max_div: Maximum supported divisor.
1041a92681d9SJay Buddhabhatti  *
1042a92681d9SJay Buddhabhatti  * This function is used by master to get maximum supported value.
1043a92681d9SJay Buddhabhatti  *
1044a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1045de7ed953SPrasad Kummari  *
1046a92681d9SJay Buddhabhatti  */
pm_clock_get_max_divisor(uint32_t clock_id,uint8_t div_type,uint32_t * max_div)1047a92681d9SJay Buddhabhatti static enum pm_ret_status pm_clock_get_max_divisor(uint32_t clock_id,
1048a92681d9SJay Buddhabhatti 						   uint8_t div_type,
1049a92681d9SJay Buddhabhatti 						   uint32_t *max_div)
1050a92681d9SJay Buddhabhatti {
1051a92681d9SJay Buddhabhatti 	return pm_api_clock_get_max_divisor(clock_id, div_type, max_div);
1052a92681d9SJay Buddhabhatti }
1053a92681d9SJay Buddhabhatti 
1054a92681d9SJay Buddhabhatti /**
1055de7ed953SPrasad Kummari  * pm_clock_get_num_clocks - PM call to request number of clocks.
1056de7ed953SPrasad Kummari  * @nclocks: Number of clocks.
1057a92681d9SJay Buddhabhatti  *
1058a92681d9SJay Buddhabhatti  * This function is used by master to get number of clocks.
1059a92681d9SJay Buddhabhatti  *
1060a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1061de7ed953SPrasad Kummari  *
1062a92681d9SJay Buddhabhatti  */
pm_clock_get_num_clocks(uint32_t * nclocks)1063a92681d9SJay Buddhabhatti static enum pm_ret_status pm_clock_get_num_clocks(uint32_t *nclocks)
1064a92681d9SJay Buddhabhatti {
1065a92681d9SJay Buddhabhatti 	return pm_api_clock_get_num_clocks(nclocks);
1066a92681d9SJay Buddhabhatti }
1067a92681d9SJay Buddhabhatti 
1068a92681d9SJay Buddhabhatti /**
1069de7ed953SPrasad Kummari  * pm_clock_get_name() - PM call to request a clock's name.
1070de7ed953SPrasad Kummari  * @clock_id: Clock ID.
1071de7ed953SPrasad Kummari  * @name: Name of clock (max 16 bytes).
1072a92681d9SJay Buddhabhatti  *
1073a92681d9SJay Buddhabhatti  * This function is used by master to get nmae of clock specified
1074a92681d9SJay Buddhabhatti  * by given clock ID.
1075de7ed953SPrasad Kummari  *
1076a92681d9SJay Buddhabhatti  */
pm_clock_get_name(uint32_t clock_id,char * name)1077a92681d9SJay Buddhabhatti static void pm_clock_get_name(uint32_t clock_id, char *name)
1078a92681d9SJay Buddhabhatti {
1079a92681d9SJay Buddhabhatti 	pm_api_clock_get_name(clock_id, name);
1080a92681d9SJay Buddhabhatti }
1081a92681d9SJay Buddhabhatti 
1082a92681d9SJay Buddhabhatti /**
1083de7ed953SPrasad Kummari  * pm_clock_get_topology() - PM call to request a clock's topology.
1084de7ed953SPrasad Kummari  * @clock_id: Clock ID.
1085de7ed953SPrasad Kummari  * @index: Topology index for next toplogy node.
1086de7ed953SPrasad Kummari  * @topology: Buffer to store nodes in topology and flags.
1087a92681d9SJay Buddhabhatti  *
1088a92681d9SJay Buddhabhatti  * This function is used by master to get topology information for the
1089a92681d9SJay Buddhabhatti  * clock specified by given clock ID. Each response would return 3
1090a92681d9SJay Buddhabhatti  * topology nodes. To get next nodes, caller needs to call this API with
1091a92681d9SJay Buddhabhatti  * index of next node. Index starts from 0.
1092a92681d9SJay Buddhabhatti  *
1093de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
1094de7ed953SPrasad Kummari  *
1095a92681d9SJay Buddhabhatti  */
pm_clock_get_topology(uint32_t clock_id,uint32_t index,uint32_t * topology)1096a92681d9SJay Buddhabhatti static enum pm_ret_status pm_clock_get_topology(uint32_t clock_id,
1097a92681d9SJay Buddhabhatti 						uint32_t index,
1098a92681d9SJay Buddhabhatti 						uint32_t *topology)
1099a92681d9SJay Buddhabhatti {
1100a92681d9SJay Buddhabhatti 	return pm_api_clock_get_topology(clock_id, index, topology);
1101a92681d9SJay Buddhabhatti }
1102a92681d9SJay Buddhabhatti 
1103a92681d9SJay Buddhabhatti /**
1104a92681d9SJay Buddhabhatti  * pm_clock_get_fixedfactor_params() - PM call to request a clock's fixed factor
1105de7ed953SPrasad Kummari  *                                     parameters for fixed clock.
1106de7ed953SPrasad Kummari  * @clock_id: Clock ID.
1107de7ed953SPrasad Kummari  * @mul: Multiplication value.
1108de7ed953SPrasad Kummari  * @div: Divisor value.
1109a92681d9SJay Buddhabhatti  *
1110a92681d9SJay Buddhabhatti  * This function is used by master to get fixed factor parameers for the
1111a92681d9SJay Buddhabhatti  * fixed clock. This API is application only for the fixed clock.
1112a92681d9SJay Buddhabhatti  *
1113de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
1114de7ed953SPrasad Kummari  *
1115a92681d9SJay Buddhabhatti  */
pm_clock_get_fixedfactor_params(uint32_t clock_id,uint32_t * mul,uint32_t * div)1116a92681d9SJay Buddhabhatti static enum pm_ret_status pm_clock_get_fixedfactor_params(uint32_t clock_id,
1117a92681d9SJay Buddhabhatti 							  uint32_t *mul,
1118a92681d9SJay Buddhabhatti 							  uint32_t *div)
1119a92681d9SJay Buddhabhatti {
1120a92681d9SJay Buddhabhatti 	return pm_api_clock_get_fixedfactor_params(clock_id, mul, div);
1121a92681d9SJay Buddhabhatti }
1122a92681d9SJay Buddhabhatti 
1123a92681d9SJay Buddhabhatti /**
1124de7ed953SPrasad Kummari  * pm_clock_get_parents() - PM call to request a clock's first 3 parents.
1125de7ed953SPrasad Kummari  * @clock_id: Clock ID.
1126de7ed953SPrasad Kummari  * @index: Index of next parent.
1127de7ed953SPrasad Kummari  * @parents: Parents of the given clock.
1128a92681d9SJay Buddhabhatti  *
1129a92681d9SJay Buddhabhatti  * This function is used by master to get clock's parents information.
1130a92681d9SJay Buddhabhatti  * This API will return 3 parents with a single response. To get other
1131a92681d9SJay Buddhabhatti  * parents, master should call same API in loop with new parent index
1132a92681d9SJay Buddhabhatti  * till error is returned.
1133a92681d9SJay Buddhabhatti  *
1134a92681d9SJay Buddhabhatti  * E.g First call should have index 0 which will return parents 0, 1 and
1135a92681d9SJay Buddhabhatti  * 2. Next call, index should be 3 which will return parent 3,4 and 5 and
1136a92681d9SJay Buddhabhatti  * so on.
1137a92681d9SJay Buddhabhatti  *
1138de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
1139de7ed953SPrasad Kummari  *
1140a92681d9SJay Buddhabhatti  */
pm_clock_get_parents(uint32_t clock_id,uint32_t index,uint32_t * parents)1141a92681d9SJay Buddhabhatti static enum pm_ret_status pm_clock_get_parents(uint32_t clock_id,
1142a92681d9SJay Buddhabhatti 					       uint32_t index,
1143a92681d9SJay Buddhabhatti 					       uint32_t *parents)
1144a92681d9SJay Buddhabhatti {
1145a92681d9SJay Buddhabhatti 	return pm_api_clock_get_parents(clock_id, index, parents);
1146a92681d9SJay Buddhabhatti }
1147a92681d9SJay Buddhabhatti 
1148a92681d9SJay Buddhabhatti /**
1149de7ed953SPrasad Kummari  * pm_clock_get_attributes() - PM call to request a clock's attributes.
1150de7ed953SPrasad Kummari  * @clock_id: Clock ID.
1151de7ed953SPrasad Kummari  * @attr: Clock attributes.
1152a92681d9SJay Buddhabhatti  *
1153a92681d9SJay Buddhabhatti  * This function is used by master to get clock's attributes
1154a92681d9SJay Buddhabhatti  * (e.g. valid, clock type, etc).
1155a92681d9SJay Buddhabhatti  *
1156de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
1157de7ed953SPrasad Kummari  *
1158a92681d9SJay Buddhabhatti  */
pm_clock_get_attributes(uint32_t clock_id,uint32_t * attr)1159a92681d9SJay Buddhabhatti static enum pm_ret_status pm_clock_get_attributes(uint32_t clock_id,
1160a92681d9SJay Buddhabhatti 						  uint32_t *attr)
1161a92681d9SJay Buddhabhatti {
1162a92681d9SJay Buddhabhatti 	return pm_api_clock_get_attributes(clock_id, attr);
1163a92681d9SJay Buddhabhatti }
1164a92681d9SJay Buddhabhatti 
1165a92681d9SJay Buddhabhatti /**
1166de7ed953SPrasad Kummari  * pm_clock_gate() - Configure clock gate.
1167de7ed953SPrasad Kummari  * @clock_id: Id of the clock to be configured.
1168de7ed953SPrasad Kummari  * @enable: Flag 0=disable (gate the clock), !0=enable (activate the clock).
11698ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
11708ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1171a92681d9SJay Buddhabhatti  *
1172de7ed953SPrasad Kummari  * Return: Error if an argument is not valid or status as returned by the
1173de7ed953SPrasad Kummari  *         PM controller (PMU).
1174de7ed953SPrasad Kummari  *
1175a92681d9SJay Buddhabhatti  */
pm_clock_gate(uint32_t clock_id,uint8_t enable,uint32_t flag)1176a92681d9SJay Buddhabhatti static enum pm_ret_status pm_clock_gate(uint32_t clock_id,
11778ce93ec9SRonak Jain 					uint8_t enable,
11788ce93ec9SRonak Jain 					uint32_t flag)
1179a92681d9SJay Buddhabhatti {
1180a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1181a92681d9SJay Buddhabhatti 	enum pm_ret_status status;
1182a92681d9SJay Buddhabhatti 	enum pm_api_id api_id;
1183a92681d9SJay Buddhabhatti 
1184a92681d9SJay Buddhabhatti 	/* Check if clock ID is valid and return an error if it is not */
1185a92681d9SJay Buddhabhatti 	status = pm_clock_id_is_valid(clock_id);
1186a92681d9SJay Buddhabhatti 	if (status != PM_RET_SUCCESS) {
11873f6d4794SMaheedhar Bollapalli 		goto exit_label;
1188a92681d9SJay Buddhabhatti 	}
1189a92681d9SJay Buddhabhatti 
1190a42e6e44SMaheedhar Bollapalli 	if (enable != 0U) {
1191a92681d9SJay Buddhabhatti 		api_id = PM_CLOCK_ENABLE;
1192a92681d9SJay Buddhabhatti 	} else {
1193a92681d9SJay Buddhabhatti 		api_id = PM_CLOCK_DISABLE;
1194a92681d9SJay Buddhabhatti 	}
1195a92681d9SJay Buddhabhatti 
1196a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
11978ce93ec9SRonak Jain 	PM_PACK_PAYLOAD2(payload, flag, api_id, clock_id);
1198a92681d9SJay Buddhabhatti 	status = pm_ipi_send_sync(primary_proc, payload, NULL, 0);
1199a92681d9SJay Buddhabhatti 
1200a92681d9SJay Buddhabhatti 	/* If action fails due to the lack of permissions filter the error */
1201a92681d9SJay Buddhabhatti 	if (status == PM_RET_ERROR_ACCESS) {
1202a92681d9SJay Buddhabhatti 		status = PM_RET_SUCCESS;
1203a92681d9SJay Buddhabhatti 	}
1204a92681d9SJay Buddhabhatti 
12053f6d4794SMaheedhar Bollapalli exit_label:
1206a92681d9SJay Buddhabhatti 	return status;
1207a92681d9SJay Buddhabhatti }
1208a92681d9SJay Buddhabhatti 
1209a92681d9SJay Buddhabhatti /**
1210de7ed953SPrasad Kummari  * pm_clock_enable() - Enable the clock for given id.
1211de7ed953SPrasad Kummari  * @clock_id: Id of the clock to be enabled.
12128ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
12138ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1214a92681d9SJay Buddhabhatti  *
1215a92681d9SJay Buddhabhatti  * This function is used by master to enable the clock
1216a92681d9SJay Buddhabhatti  * including peripherals and PLL clocks.
1217a92681d9SJay Buddhabhatti  *
1218de7ed953SPrasad Kummari  * Return: Error if an argument is not valid or status as returned by the
1219de7ed953SPrasad Kummari  *         pm_clock_gate.
1220de7ed953SPrasad Kummari  *
1221a92681d9SJay Buddhabhatti  */
pm_clock_enable(uint32_t clock_id,uint32_t flag)12228ce93ec9SRonak Jain enum pm_ret_status pm_clock_enable(uint32_t clock_id, uint32_t flag)
1223a92681d9SJay Buddhabhatti {
1224a92681d9SJay Buddhabhatti 	struct pm_pll *pll;
12253f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
1226a92681d9SJay Buddhabhatti 
1227a92681d9SJay Buddhabhatti 	/* First try to handle it as a PLL */
1228a92681d9SJay Buddhabhatti 	pll = pm_clock_get_pll(clock_id);
1229aaf6e762SMaheedhar Bollapalli 	if (pll != NULL) {
12308ce93ec9SRonak Jain 		ret = pm_clock_pll_enable(pll, flag);
12313f6d4794SMaheedhar Bollapalli 	} else {
1232a92681d9SJay Buddhabhatti 
1233a92681d9SJay Buddhabhatti 		/* It's an on-chip clock, PMU should configure clock's gate */
12348ce93ec9SRonak Jain 		ret = pm_clock_gate(clock_id, 1, flag);
12353f6d4794SMaheedhar Bollapalli 	}
12363f6d4794SMaheedhar Bollapalli 
12373f6d4794SMaheedhar Bollapalli 	return ret;
1238a92681d9SJay Buddhabhatti }
1239a92681d9SJay Buddhabhatti 
1240a92681d9SJay Buddhabhatti /**
1241de7ed953SPrasad Kummari  * pm_clock_disable - Disable the clock for given id.
1242de7ed953SPrasad Kummari  * @clock_id: Id of the clock to be disable.
12438ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
12448ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1245a92681d9SJay Buddhabhatti  *
1246a92681d9SJay Buddhabhatti  * This function is used by master to disable the clock
1247a92681d9SJay Buddhabhatti  * including peripherals and PLL clocks.
1248a92681d9SJay Buddhabhatti  *
1249de7ed953SPrasad Kummari  * Return: Error if an argument is not valid or status as returned by the
1250a92681d9SJay Buddhabhatti  *         pm_clock_gate
1251de7ed953SPrasad Kummari  *
1252a92681d9SJay Buddhabhatti  */
pm_clock_disable(uint32_t clock_id,uint32_t flag)12538ce93ec9SRonak Jain enum pm_ret_status pm_clock_disable(uint32_t clock_id, uint32_t flag)
1254a92681d9SJay Buddhabhatti {
1255a92681d9SJay Buddhabhatti 	struct pm_pll *pll;
12563f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
1257a92681d9SJay Buddhabhatti 
1258a92681d9SJay Buddhabhatti 	/* First try to handle it as a PLL */
1259a92681d9SJay Buddhabhatti 	pll = pm_clock_get_pll(clock_id);
1260aaf6e762SMaheedhar Bollapalli 	if (pll != NULL) {
12618ce93ec9SRonak Jain 		ret = pm_clock_pll_disable(pll, flag);
12623f6d4794SMaheedhar Bollapalli 	} else {
1263a92681d9SJay Buddhabhatti 
1264a92681d9SJay Buddhabhatti 		/* It's an on-chip clock, PMU should configure clock's gate */
12658ce93ec9SRonak Jain 		ret = pm_clock_gate(clock_id, 0, flag);
12663f6d4794SMaheedhar Bollapalli 	}
12673f6d4794SMaheedhar Bollapalli 
12683f6d4794SMaheedhar Bollapalli 	return ret;
1269a92681d9SJay Buddhabhatti }
1270a92681d9SJay Buddhabhatti 
1271a92681d9SJay Buddhabhatti /**
1272de7ed953SPrasad Kummari  * pm_clock_getstate - Get the clock state for given id.
1273de7ed953SPrasad Kummari  * @clock_id: Id of the clock to be queried.
1274de7ed953SPrasad Kummari  * @state: 1/0 (Enabled/Disabled).
12758ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
12768ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1277a92681d9SJay Buddhabhatti  *
1278a92681d9SJay Buddhabhatti  * This function is used by master to get the state of clock
1279a92681d9SJay Buddhabhatti  * including peripherals and PLL clocks.
1280a92681d9SJay Buddhabhatti  *
1281a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1282de7ed953SPrasad Kummari  *
1283a92681d9SJay Buddhabhatti  */
pm_clock_getstate(uint32_t clock_id,uint32_t * state,uint32_t flag)1284a92681d9SJay Buddhabhatti enum pm_ret_status pm_clock_getstate(uint32_t clock_id,
12858ce93ec9SRonak Jain 				     uint32_t *state,
12868ce93ec9SRonak Jain 				     uint32_t flag)
1287a92681d9SJay Buddhabhatti {
1288a92681d9SJay Buddhabhatti 	struct pm_pll *pll;
1289a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1290a92681d9SJay Buddhabhatti 	enum pm_ret_status status;
1291a92681d9SJay Buddhabhatti 
1292a92681d9SJay Buddhabhatti 	/* First try to handle it as a PLL */
1293a92681d9SJay Buddhabhatti 	pll = pm_clock_get_pll(clock_id);
1294aaf6e762SMaheedhar Bollapalli 	if (pll != NULL) {
12958ce93ec9SRonak Jain 		status = pm_clock_pll_get_state(pll, state, flag);
12963f6d4794SMaheedhar Bollapalli 		goto exit_label;
1297aaf6e762SMaheedhar Bollapalli 	}
1298a92681d9SJay Buddhabhatti 	/* Check if clock ID is a valid on-chip clock */
1299a92681d9SJay Buddhabhatti 	status = pm_clock_id_is_valid(clock_id);
1300a92681d9SJay Buddhabhatti 	if (status != PM_RET_SUCCESS) {
13013f6d4794SMaheedhar Bollapalli 		goto exit_label;
1302a92681d9SJay Buddhabhatti 	}
1303a92681d9SJay Buddhabhatti 
1304a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
13058ce93ec9SRonak Jain 	PM_PACK_PAYLOAD2(payload, flag, PM_CLOCK_GETSTATE, clock_id);
13063f6d4794SMaheedhar Bollapalli 	status = pm_ipi_send_sync(primary_proc, payload, state, 1);
13073f6d4794SMaheedhar Bollapalli 
13083f6d4794SMaheedhar Bollapalli exit_label:
13093f6d4794SMaheedhar Bollapalli 	return status;
1310a92681d9SJay Buddhabhatti }
1311a92681d9SJay Buddhabhatti 
1312a92681d9SJay Buddhabhatti /**
1313de7ed953SPrasad Kummari  * pm_clock_setdivider - Set the clock divider for given id.
1314de7ed953SPrasad Kummari  * @clock_id: Id of the clock.
1315de7ed953SPrasad Kummari  * @divider: divider value.
13168ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
13178ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1318a92681d9SJay Buddhabhatti  *
1319a92681d9SJay Buddhabhatti  * This function is used by master to set divider for any clock
1320a92681d9SJay Buddhabhatti  * to achieve desired rate.
1321a92681d9SJay Buddhabhatti  *
1322a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1323de7ed953SPrasad Kummari  *
1324a92681d9SJay Buddhabhatti  */
pm_clock_setdivider(uint32_t clock_id,uint32_t divider,uint32_t flag)1325a92681d9SJay Buddhabhatti enum pm_ret_status pm_clock_setdivider(uint32_t clock_id,
13268ce93ec9SRonak Jain 				       uint32_t divider,
13278ce93ec9SRonak Jain 				       uint32_t flag)
1328a92681d9SJay Buddhabhatti {
1329a92681d9SJay Buddhabhatti 	enum pm_ret_status status;
1330a92681d9SJay Buddhabhatti 	enum pm_node_id nid;
1331a92681d9SJay Buddhabhatti 	enum pm_clock_div_id div_id;
1332a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1333a92681d9SJay Buddhabhatti 	const uint32_t div0 = 0xFFFF0000;
1334a92681d9SJay Buddhabhatti 	const uint32_t div1 = 0x0000FFFF;
1335a92681d9SJay Buddhabhatti 	uint32_t val;
1336a92681d9SJay Buddhabhatti 
1337a92681d9SJay Buddhabhatti 	/* Get PLL node ID using PLL clock ID */
1338a92681d9SJay Buddhabhatti 	status = pm_clock_get_pll_node_id(clock_id, &nid);
1339a92681d9SJay Buddhabhatti 	if (status == PM_RET_SUCCESS) {
13408ce93ec9SRonak Jain 		status = pm_pll_set_parameter(nid, PM_PLL_PARAM_FBDIV, divider,
13418ce93ec9SRonak Jain 					      flag);
13423f6d4794SMaheedhar Bollapalli 		goto exit_label;
1343a92681d9SJay Buddhabhatti 	}
1344a92681d9SJay Buddhabhatti 
1345a92681d9SJay Buddhabhatti 	/* Check if clock ID is a valid on-chip clock */
1346a92681d9SJay Buddhabhatti 	status = pm_clock_id_is_valid(clock_id);
1347a92681d9SJay Buddhabhatti 	if (status != PM_RET_SUCCESS) {
13483f6d4794SMaheedhar Bollapalli 		goto exit_label;
1349a92681d9SJay Buddhabhatti 	}
1350a92681d9SJay Buddhabhatti 
1351a92681d9SJay Buddhabhatti 	if (div0 == (divider & div0)) {
1352a92681d9SJay Buddhabhatti 		div_id = PM_CLOCK_DIV0_ID;
1353a92681d9SJay Buddhabhatti 		val = divider & ~div0;
1354a92681d9SJay Buddhabhatti 	} else if (div1 == (divider & div1)) {
1355a92681d9SJay Buddhabhatti 		div_id = PM_CLOCK_DIV1_ID;
1356a92681d9SJay Buddhabhatti 		val = (divider & ~div1) >> 16;
1357a92681d9SJay Buddhabhatti 	} else {
13583f6d4794SMaheedhar Bollapalli 		status = PM_RET_ERROR_ARGS;
13593f6d4794SMaheedhar Bollapalli 		goto exit_label;
1360a92681d9SJay Buddhabhatti 	}
1361a92681d9SJay Buddhabhatti 
1362a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
13638ce93ec9SRonak Jain 	PM_PACK_PAYLOAD4(payload, flag, PM_CLOCK_SETDIVIDER, clock_id, div_id, val);
13643f6d4794SMaheedhar Bollapalli 	status = pm_ipi_send_sync(primary_proc, payload, NULL, 0);
13653f6d4794SMaheedhar Bollapalli 
13663f6d4794SMaheedhar Bollapalli exit_label:
13673f6d4794SMaheedhar Bollapalli 	return status;
1368a92681d9SJay Buddhabhatti }
1369a92681d9SJay Buddhabhatti 
1370a92681d9SJay Buddhabhatti /**
1371de7ed953SPrasad Kummari  * pm_clock_getdivider - Get the clock divider for given id.
1372de7ed953SPrasad Kummari  * @clock_id: Id of the clock.
1373de7ed953SPrasad Kummari  * @divider: divider value.
13748ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
13758ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1376a92681d9SJay Buddhabhatti  *
1377a92681d9SJay Buddhabhatti  * This function is used by master to get divider values
1378a92681d9SJay Buddhabhatti  * for any clock.
1379a92681d9SJay Buddhabhatti  *
1380a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1381de7ed953SPrasad Kummari  *
1382a92681d9SJay Buddhabhatti  */
pm_clock_getdivider(uint32_t clock_id,uint32_t * divider,uint32_t flag)1383a92681d9SJay Buddhabhatti enum pm_ret_status pm_clock_getdivider(uint32_t clock_id,
13848ce93ec9SRonak Jain 				       uint32_t *divider,
13858ce93ec9SRonak Jain 				       uint32_t flag)
1386a92681d9SJay Buddhabhatti {
13873f6d4794SMaheedhar Bollapalli 	enum pm_ret_status status = PM_RET_SUCCESS;
1388a92681d9SJay Buddhabhatti 	enum pm_node_id nid;
1389a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1390a92681d9SJay Buddhabhatti 	uint32_t val;
1391a92681d9SJay Buddhabhatti 
1392a92681d9SJay Buddhabhatti 	/* Get PLL node ID using PLL clock ID */
1393a92681d9SJay Buddhabhatti 	status = pm_clock_get_pll_node_id(clock_id, &nid);
1394a92681d9SJay Buddhabhatti 	if (status == PM_RET_SUCCESS) {
13958ce93ec9SRonak Jain 		status = pm_pll_get_parameter(nid, PM_PLL_PARAM_FBDIV, divider,
13968ce93ec9SRonak Jain 					      flag);
13973f6d4794SMaheedhar Bollapalli 		goto exit_label;
1398a92681d9SJay Buddhabhatti 	}
1399a92681d9SJay Buddhabhatti 
1400a92681d9SJay Buddhabhatti 	/* Check if clock ID is a valid on-chip clock */
1401a92681d9SJay Buddhabhatti 	status = pm_clock_id_is_valid(clock_id);
1402a92681d9SJay Buddhabhatti 	if (status != PM_RET_SUCCESS) {
14033f6d4794SMaheedhar Bollapalli 		goto exit_label;
1404a92681d9SJay Buddhabhatti 	}
1405a92681d9SJay Buddhabhatti 
1406a42e6e44SMaheedhar Bollapalli 	if ((pm_clock_has_div(clock_id, PM_CLOCK_DIV0_ID)) != 0U) {
1407a92681d9SJay Buddhabhatti 		/* Send request to the PMU to get div0 */
14088ce93ec9SRonak Jain 		PM_PACK_PAYLOAD3(payload, flag, PM_CLOCK_GETDIVIDER, clock_id,
1409a92681d9SJay Buddhabhatti 				 PM_CLOCK_DIV0_ID);
1410a92681d9SJay Buddhabhatti 		status = pm_ipi_send_sync(primary_proc, payload, &val, 1);
1411a92681d9SJay Buddhabhatti 		if (status != PM_RET_SUCCESS) {
14123f6d4794SMaheedhar Bollapalli 			goto exit_label;
1413a92681d9SJay Buddhabhatti 		}
1414a92681d9SJay Buddhabhatti 		*divider = val;
1415a92681d9SJay Buddhabhatti 	}
1416a92681d9SJay Buddhabhatti 
1417a42e6e44SMaheedhar Bollapalli 	if ((pm_clock_has_div(clock_id, PM_CLOCK_DIV1_ID)) != 0U) {
1418a92681d9SJay Buddhabhatti 		/* Send request to the PMU to get div1 */
14198ce93ec9SRonak Jain 		PM_PACK_PAYLOAD3(payload, flag, PM_CLOCK_GETDIVIDER, clock_id,
1420a92681d9SJay Buddhabhatti 				 PM_CLOCK_DIV1_ID);
1421a92681d9SJay Buddhabhatti 		status = pm_ipi_send_sync(primary_proc, payload, &val, 1);
1422a92681d9SJay Buddhabhatti 		if (status != PM_RET_SUCCESS) {
14233f6d4794SMaheedhar Bollapalli 			goto exit_label;
1424a92681d9SJay Buddhabhatti 		}
1425a92681d9SJay Buddhabhatti 		*divider |= val << 16;
1426a92681d9SJay Buddhabhatti 	}
14273f6d4794SMaheedhar Bollapalli exit_label:
1428a92681d9SJay Buddhabhatti 	return status;
1429a92681d9SJay Buddhabhatti }
1430a92681d9SJay Buddhabhatti 
1431a92681d9SJay Buddhabhatti /**
1432de7ed953SPrasad Kummari  * pm_clock_setparent - Set the clock parent for given id.
1433de7ed953SPrasad Kummari  * @clock_id: Id of the clock.
1434de7ed953SPrasad Kummari  * @parent_index: Index of the parent clock into clock's parents array.
14358ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
14368ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1437a92681d9SJay Buddhabhatti  *
1438a92681d9SJay Buddhabhatti  * This function is used by master to set parent for any clock.
1439a92681d9SJay Buddhabhatti  *
1440a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1441de7ed953SPrasad Kummari  *
1442a92681d9SJay Buddhabhatti  */
pm_clock_setparent(uint32_t clock_id,uint32_t parent_index,uint32_t flag)1443a92681d9SJay Buddhabhatti enum pm_ret_status pm_clock_setparent(uint32_t clock_id,
14448ce93ec9SRonak Jain 				      uint32_t parent_index,
14458ce93ec9SRonak Jain 				      uint32_t flag)
1446a92681d9SJay Buddhabhatti {
1447a92681d9SJay Buddhabhatti 	struct pm_pll *pll;
1448a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1449a92681d9SJay Buddhabhatti 	enum pm_ret_status status;
1450a92681d9SJay Buddhabhatti 
1451a92681d9SJay Buddhabhatti 	/* First try to handle it as a PLL */
1452a92681d9SJay Buddhabhatti 	pll = pm_clock_get_pll_by_related_clk(clock_id);
1453aaf6e762SMaheedhar Bollapalli 	if (pll != NULL) {
14548ce93ec9SRonak Jain 		status = pm_clock_pll_set_parent(pll, clock_id, parent_index,
14558ce93ec9SRonak Jain 						 flag);
14563f6d4794SMaheedhar Bollapalli 		goto exit_label;
1457a92681d9SJay Buddhabhatti 	}
1458a92681d9SJay Buddhabhatti 
1459a92681d9SJay Buddhabhatti 	/* Check if clock ID is a valid on-chip clock */
1460a92681d9SJay Buddhabhatti 	status = pm_clock_id_is_valid(clock_id);
1461a92681d9SJay Buddhabhatti 	if (status != PM_RET_SUCCESS) {
14623f6d4794SMaheedhar Bollapalli 		goto exit_label;
1463a92681d9SJay Buddhabhatti 	}
1464a92681d9SJay Buddhabhatti 
1465a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
14668ce93ec9SRonak Jain 	PM_PACK_PAYLOAD3(payload, flag, PM_CLOCK_SETPARENT, clock_id, parent_index);
14673f6d4794SMaheedhar Bollapalli 	status = pm_ipi_send_sync(primary_proc, payload, NULL, 0);
14683f6d4794SMaheedhar Bollapalli 
14693f6d4794SMaheedhar Bollapalli exit_label:
14703f6d4794SMaheedhar Bollapalli 	return status;
1471a92681d9SJay Buddhabhatti }
1472a92681d9SJay Buddhabhatti 
1473a92681d9SJay Buddhabhatti /**
1474de7ed953SPrasad Kummari  * pm_clock_getparent - Get the clock parent for given id.
1475de7ed953SPrasad Kummari  * @clock_id: Id of the clock.
1476de7ed953SPrasad Kummari  * @parent_index: parent index.
14778ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
14788ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1479a92681d9SJay Buddhabhatti  *
1480a92681d9SJay Buddhabhatti  * This function is used by master to get parent index
1481a92681d9SJay Buddhabhatti  * for any clock.
1482a92681d9SJay Buddhabhatti  *
1483a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1484de7ed953SPrasad Kummari  *
1485a92681d9SJay Buddhabhatti  */
pm_clock_getparent(uint32_t clock_id,uint32_t * parent_index,uint32_t flag)1486a92681d9SJay Buddhabhatti enum pm_ret_status pm_clock_getparent(uint32_t clock_id,
14878ce93ec9SRonak Jain 				      uint32_t *parent_index,
14888ce93ec9SRonak Jain 				      uint32_t flag)
1489a92681d9SJay Buddhabhatti {
1490a92681d9SJay Buddhabhatti 	struct pm_pll *pll;
1491a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1492a92681d9SJay Buddhabhatti 	enum pm_ret_status status;
1493a92681d9SJay Buddhabhatti 
1494a92681d9SJay Buddhabhatti 	/* First try to handle it as a PLL */
1495a92681d9SJay Buddhabhatti 	pll = pm_clock_get_pll_by_related_clk(clock_id);
1496aaf6e762SMaheedhar Bollapalli 	if (pll != NULL) {
14978ce93ec9SRonak Jain 		status = pm_clock_pll_get_parent(pll, clock_id, parent_index,
14988ce93ec9SRonak Jain 						 flag);
14993f6d4794SMaheedhar Bollapalli 		goto exit_label;
1500a92681d9SJay Buddhabhatti 	}
1501a92681d9SJay Buddhabhatti 
1502a92681d9SJay Buddhabhatti 	/* Check if clock ID is a valid on-chip clock */
1503a92681d9SJay Buddhabhatti 	status = pm_clock_id_is_valid(clock_id);
1504a92681d9SJay Buddhabhatti 	if (status != PM_RET_SUCCESS) {
15053f6d4794SMaheedhar Bollapalli 		goto exit_label;
1506a92681d9SJay Buddhabhatti 	}
1507a92681d9SJay Buddhabhatti 
1508a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
15098ce93ec9SRonak Jain 	PM_PACK_PAYLOAD2(payload, flag, PM_CLOCK_GETPARENT, clock_id);
15103f6d4794SMaheedhar Bollapalli 	status = pm_ipi_send_sync(primary_proc, payload, parent_index, 1);
15113f6d4794SMaheedhar Bollapalli 
15123f6d4794SMaheedhar Bollapalli exit_label:
15133f6d4794SMaheedhar Bollapalli 	return status;
1514a92681d9SJay Buddhabhatti }
1515a92681d9SJay Buddhabhatti 
1516a92681d9SJay Buddhabhatti /**
1517de7ed953SPrasad Kummari  * pm_pinctrl_get_num_pins - PM call to request number of pins.
1518de7ed953SPrasad Kummari  * @npins: Number of pins.
1519a92681d9SJay Buddhabhatti  *
1520de7ed953SPrasad Kummari  * This function is used by master to get number of pins.
1521a92681d9SJay Buddhabhatti  *
1522a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1523de7ed953SPrasad Kummari  *
1524a92681d9SJay Buddhabhatti  */
pm_pinctrl_get_num_pins(uint32_t * npins)1525a92681d9SJay Buddhabhatti static enum pm_ret_status pm_pinctrl_get_num_pins(uint32_t *npins)
1526a92681d9SJay Buddhabhatti {
1527a92681d9SJay Buddhabhatti 	return pm_api_pinctrl_get_num_pins(npins);
1528a92681d9SJay Buddhabhatti }
1529a92681d9SJay Buddhabhatti 
1530a92681d9SJay Buddhabhatti /**
1531de7ed953SPrasad Kummari  * pm_pinctrl_get_num_functions - PM call to request number of functions.
1532de7ed953SPrasad Kummari  * @nfuncs: Number of functions.
1533a92681d9SJay Buddhabhatti  *
1534de7ed953SPrasad Kummari  * This function is used by master to get number of functions.
1535a92681d9SJay Buddhabhatti  *
1536a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1537de7ed953SPrasad Kummari  *
1538a92681d9SJay Buddhabhatti  */
pm_pinctrl_get_num_functions(uint32_t * nfuncs)1539a92681d9SJay Buddhabhatti static enum pm_ret_status pm_pinctrl_get_num_functions(uint32_t *nfuncs)
1540a92681d9SJay Buddhabhatti {
1541a92681d9SJay Buddhabhatti 	return pm_api_pinctrl_get_num_functions(nfuncs);
1542a92681d9SJay Buddhabhatti }
1543a92681d9SJay Buddhabhatti 
1544a92681d9SJay Buddhabhatti /**
1545a92681d9SJay Buddhabhatti  * pm_pinctrl_get_num_function_groups - PM call to request number of
1546de7ed953SPrasad Kummari  *                                      function groups.
1547de7ed953SPrasad Kummari  * @fid: Id of function.
1548de7ed953SPrasad Kummari  * @ngroups: Number of function groups.
1549a92681d9SJay Buddhabhatti  *
1550a92681d9SJay Buddhabhatti  * This function is used by master to get number of function groups specified
1551de7ed953SPrasad Kummari  * by given function Id.
1552a92681d9SJay Buddhabhatti  *
1553a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1554de7ed953SPrasad Kummari  *
1555a92681d9SJay Buddhabhatti  */
pm_pinctrl_get_num_function_groups(uint32_t fid,uint32_t * ngroups)1556a92681d9SJay Buddhabhatti static enum pm_ret_status pm_pinctrl_get_num_function_groups(uint32_t fid,
1557a92681d9SJay Buddhabhatti 							     uint32_t *ngroups)
1558a92681d9SJay Buddhabhatti {
1559a92681d9SJay Buddhabhatti 	return pm_api_pinctrl_get_num_func_groups(fid, ngroups);
1560a92681d9SJay Buddhabhatti }
1561a92681d9SJay Buddhabhatti 
1562a92681d9SJay Buddhabhatti /**
1563de7ed953SPrasad Kummari  * pm_pinctrl_get_function_name - PM call to request function name.
1564de7ed953SPrasad Kummari  * @fid: Id of function.
1565de7ed953SPrasad Kummari  * @name: Name of function.
1566a92681d9SJay Buddhabhatti  *
1567a92681d9SJay Buddhabhatti  * This function is used by master to get name of function specified
1568de7ed953SPrasad Kummari  * by given function Id.
1569de7ed953SPrasad Kummari  *
1570a92681d9SJay Buddhabhatti  */
pm_pinctrl_get_function_name(uint32_t fid,char * name)1571a92681d9SJay Buddhabhatti static void pm_pinctrl_get_function_name(uint32_t fid, char *name)
1572a92681d9SJay Buddhabhatti {
1573a92681d9SJay Buddhabhatti 	pm_api_pinctrl_get_function_name(fid, name);
1574a92681d9SJay Buddhabhatti }
1575a92681d9SJay Buddhabhatti 
1576a92681d9SJay Buddhabhatti /**
1577de7ed953SPrasad Kummari  * pm_pinctrl_get_function_groups - PM call to request function groups.
1578de7ed953SPrasad Kummari  * @fid: Id of function.
1579de7ed953SPrasad Kummari  * @index: Index of next function groups.
1580de7ed953SPrasad Kummari  * @groups: Function groups.
1581a92681d9SJay Buddhabhatti  *
1582a92681d9SJay Buddhabhatti  * This function is used by master to get function groups specified
1583a92681d9SJay Buddhabhatti  * by given function Id. This API will return 6 function groups with
1584a92681d9SJay Buddhabhatti  * a single response. To get other function groups, master should call
1585a92681d9SJay Buddhabhatti  * same API in loop with new function groups index till error is returned.
1586a92681d9SJay Buddhabhatti  *
1587a92681d9SJay Buddhabhatti  * E.g First call should have index 0 which will return function groups
1588a92681d9SJay Buddhabhatti  * 0, 1, 2, 3, 4 and 5. Next call, index should be 6 which will return
1589a92681d9SJay Buddhabhatti  * function groups 6, 7, 8, 9, 10 and 11 and so on.
1590a92681d9SJay Buddhabhatti  *
1591a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1592de7ed953SPrasad Kummari  *
1593a92681d9SJay Buddhabhatti  */
pm_pinctrl_get_function_groups(uint32_t fid,uint32_t index,uint16_t * groups)1594a92681d9SJay Buddhabhatti static enum pm_ret_status pm_pinctrl_get_function_groups(uint32_t fid,
1595a92681d9SJay Buddhabhatti 							 uint32_t index,
1596a92681d9SJay Buddhabhatti 							 uint16_t *groups)
1597a92681d9SJay Buddhabhatti {
1598a92681d9SJay Buddhabhatti 	return pm_api_pinctrl_get_function_groups(fid, index, groups);
1599a92681d9SJay Buddhabhatti }
1600a92681d9SJay Buddhabhatti 
1601a92681d9SJay Buddhabhatti /**
1602de7ed953SPrasad Kummari  * pm_pinctrl_get_pin_groups - PM call to request pin groups.
1603de7ed953SPrasad Kummari  * @pin_id: Id of pin.
1604de7ed953SPrasad Kummari  * @index: Index of next pin groups.
1605de7ed953SPrasad Kummari  * @groups: pin groups.
1606a92681d9SJay Buddhabhatti  *
1607a92681d9SJay Buddhabhatti  * This function is used by master to get pin groups specified
1608a92681d9SJay Buddhabhatti  * by given pin Id. This API will return 6 pin groups with
1609a92681d9SJay Buddhabhatti  * a single response. To get other pin groups, master should call
1610a92681d9SJay Buddhabhatti  * same API in loop with new pin groups index till error is returned.
1611a92681d9SJay Buddhabhatti  *
1612a92681d9SJay Buddhabhatti  * E.g First call should have index 0 which will return pin groups
1613a92681d9SJay Buddhabhatti  * 0, 1, 2, 3, 4 and 5. Next call, index should be 6 which will return
1614a92681d9SJay Buddhabhatti  * pin groups 6, 7, 8, 9, 10 and 11 and so on.
1615a92681d9SJay Buddhabhatti  *
1616a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1617de7ed953SPrasad Kummari  *
1618a92681d9SJay Buddhabhatti  */
pm_pinctrl_get_pin_groups(uint32_t pin_id,uint32_t index,uint16_t * groups)1619a92681d9SJay Buddhabhatti static enum pm_ret_status pm_pinctrl_get_pin_groups(uint32_t pin_id,
1620a92681d9SJay Buddhabhatti 						    uint32_t index,
1621a92681d9SJay Buddhabhatti 						    uint16_t *groups)
1622a92681d9SJay Buddhabhatti {
1623a92681d9SJay Buddhabhatti 	return pm_api_pinctrl_get_pin_groups(pin_id, index, groups);
1624a92681d9SJay Buddhabhatti }
1625a92681d9SJay Buddhabhatti 
1626a92681d9SJay Buddhabhatti /**
1627de7ed953SPrasad Kummari  * pm_query_data() - PM API for querying firmware data.
1628de7ed953SPrasad Kummari  * @qid:  represents the query identifiers for PM.
1629de7ed953SPrasad Kummari  * @arg1: Argument 1 to requested IOCTL call.
1630de7ed953SPrasad Kummari  * @arg2: Argument 2 to requested IOCTL call.
1631de7ed953SPrasad Kummari  * @arg3: Argument 3 to requested IOCTL call.
1632de7ed953SPrasad Kummari  * @data: Returned output data.
16338ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
16348ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1635a92681d9SJay Buddhabhatti  *
1636a92681d9SJay Buddhabhatti  * This function returns requested data.
1637de7ed953SPrasad Kummari  *
1638a92681d9SJay Buddhabhatti  */
pm_query_data(enum pm_query_ids qid,uint32_t arg1,uint32_t arg2,uint32_t arg3,uint32_t * data,uint32_t flag)163992f7de1eSJay Buddhabhatti void pm_query_data(enum pm_query_ids qid, uint32_t arg1, uint32_t arg2,
16408ce93ec9SRonak Jain 		   uint32_t arg3, uint32_t *data, uint32_t flag)
1641a92681d9SJay Buddhabhatti {
16421c43e36aSMaheedhar Bollapalli 	(void)arg3;
16438ce93ec9SRonak Jain 	(void)flag;
16448ce93ec9SRonak Jain 
1645a92681d9SJay Buddhabhatti 	switch (qid) {
1646a92681d9SJay Buddhabhatti 	case PM_QID_CLOCK_GET_NAME:
1647a92681d9SJay Buddhabhatti 		pm_clock_get_name(arg1, (char *)data);
1648a92681d9SJay Buddhabhatti 		break;
1649a92681d9SJay Buddhabhatti 	case PM_QID_CLOCK_GET_TOPOLOGY:
16506ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_clock_get_topology(arg1, arg2, &data[1]);
1651a92681d9SJay Buddhabhatti 		break;
1652a92681d9SJay Buddhabhatti 	case PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS:
16536ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_clock_get_fixedfactor_params(arg1, &data[1],
1654a92681d9SJay Buddhabhatti 							  &data[2]);
1655a92681d9SJay Buddhabhatti 		break;
1656a92681d9SJay Buddhabhatti 	case PM_QID_CLOCK_GET_PARENTS:
16576ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_clock_get_parents(arg1, arg2, &data[1]);
1658a92681d9SJay Buddhabhatti 		break;
1659a92681d9SJay Buddhabhatti 	case PM_QID_CLOCK_GET_ATTRIBUTES:
16606ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_clock_get_attributes(arg1, &data[1]);
1661a92681d9SJay Buddhabhatti 		break;
1662a92681d9SJay Buddhabhatti 	case PM_QID_PINCTRL_GET_NUM_PINS:
16636ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_pinctrl_get_num_pins(&data[1]);
1664a92681d9SJay Buddhabhatti 		break;
1665a92681d9SJay Buddhabhatti 	case PM_QID_PINCTRL_GET_NUM_FUNCTIONS:
16666ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_pinctrl_get_num_functions(&data[1]);
1667a92681d9SJay Buddhabhatti 		break;
1668a92681d9SJay Buddhabhatti 	case PM_QID_PINCTRL_GET_NUM_FUNCTION_GROUPS:
16696ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_pinctrl_get_num_function_groups(arg1, &data[1]);
1670a92681d9SJay Buddhabhatti 		break;
1671a92681d9SJay Buddhabhatti 	case PM_QID_PINCTRL_GET_FUNCTION_NAME:
1672a92681d9SJay Buddhabhatti 		pm_pinctrl_get_function_name(arg1, (char *)data);
1673a92681d9SJay Buddhabhatti 		break;
1674a92681d9SJay Buddhabhatti 	case PM_QID_PINCTRL_GET_FUNCTION_GROUPS:
16756ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_pinctrl_get_function_groups(arg1, arg2,
1676a92681d9SJay Buddhabhatti 							 (uint16_t *)&data[1]);
1677a92681d9SJay Buddhabhatti 		break;
1678a92681d9SJay Buddhabhatti 	case PM_QID_PINCTRL_GET_PIN_GROUPS:
16796ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_pinctrl_get_pin_groups(arg1, arg2,
1680a92681d9SJay Buddhabhatti 						    (uint16_t *)&data[1]);
1681a92681d9SJay Buddhabhatti 		break;
1682a92681d9SJay Buddhabhatti 	case PM_QID_CLOCK_GET_NUM_CLOCKS:
16836ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_clock_get_num_clocks(&data[1]);
1684a92681d9SJay Buddhabhatti 		break;
1685a92681d9SJay Buddhabhatti 
1686a92681d9SJay Buddhabhatti 	case PM_QID_CLOCK_GET_MAX_DIVISOR:
16876ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)pm_clock_get_max_divisor(arg1, (uint8_t)arg2, &data[1]);
1688a92681d9SJay Buddhabhatti 		break;
1689a92681d9SJay Buddhabhatti 	default:
16906ae95624SMaheedhar Bollapalli 		data[0] = (uint32_t)PM_RET_ERROR_ARGS;
1691a92681d9SJay Buddhabhatti 		WARN("Unimplemented query service call: 0x%x\n", qid);
1692a92681d9SJay Buddhabhatti 		break;
1693a92681d9SJay Buddhabhatti 	}
1694a92681d9SJay Buddhabhatti }
1695a92681d9SJay Buddhabhatti 
pm_sha_hash(uint32_t address_high,uint32_t address_low,uint32_t size,uint32_t flags,uint32_t security_flag)1696a92681d9SJay Buddhabhatti enum pm_ret_status pm_sha_hash(uint32_t address_high,
1697a92681d9SJay Buddhabhatti 			       uint32_t address_low,
1698a92681d9SJay Buddhabhatti 			       uint32_t size,
16998ce93ec9SRonak Jain 			       uint32_t flags,
17008ce93ec9SRonak Jain 			       uint32_t security_flag)
1701a92681d9SJay Buddhabhatti {
1702a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1703a92681d9SJay Buddhabhatti 
1704a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
17058ce93ec9SRonak Jain 	PM_PACK_PAYLOAD5(payload, security_flag, PM_SECURE_SHA, address_high,
17068ce93ec9SRonak Jain 			 address_low, size, flags);
1707a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, NULL, 0);
1708a92681d9SJay Buddhabhatti }
1709a92681d9SJay Buddhabhatti 
pm_rsa_core(uint32_t address_high,uint32_t address_low,uint32_t size,uint32_t flags,uint32_t security_flag)1710a92681d9SJay Buddhabhatti enum pm_ret_status pm_rsa_core(uint32_t address_high,
1711a92681d9SJay Buddhabhatti 			       uint32_t address_low,
1712a92681d9SJay Buddhabhatti 			       uint32_t size,
17138ce93ec9SRonak Jain 			       uint32_t flags,
17148ce93ec9SRonak Jain 			       uint32_t security_flag)
1715a92681d9SJay Buddhabhatti {
1716a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1717a92681d9SJay Buddhabhatti 
1718a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
17198ce93ec9SRonak Jain 	PM_PACK_PAYLOAD5(payload, security_flag, PM_SECURE_RSA, address_high,
17208ce93ec9SRonak Jain 			 address_low, size, flags);
1721a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, NULL, 0);
1722a92681d9SJay Buddhabhatti }
1723a92681d9SJay Buddhabhatti 
pm_secure_image(uint32_t address_low,uint32_t address_high,uint32_t key_lo,uint32_t key_hi,uint32_t * value,uint32_t flag)1724a92681d9SJay Buddhabhatti enum pm_ret_status pm_secure_image(uint32_t address_low,
1725a92681d9SJay Buddhabhatti 				   uint32_t address_high,
1726a92681d9SJay Buddhabhatti 				   uint32_t key_lo,
1727a92681d9SJay Buddhabhatti 				   uint32_t key_hi,
17288ce93ec9SRonak Jain 				   uint32_t *value,
17298ce93ec9SRonak Jain 				   uint32_t flag)
1730a92681d9SJay Buddhabhatti {
1731a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1732a92681d9SJay Buddhabhatti 
1733a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
17348ce93ec9SRonak Jain 	PM_PACK_PAYLOAD5(payload, flag, PM_SECURE_IMAGE, address_high,
17358ce93ec9SRonak Jain 			 address_low, key_hi, key_lo);
1736a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, value, 2);
1737a92681d9SJay Buddhabhatti }
1738a92681d9SJay Buddhabhatti 
1739a92681d9SJay Buddhabhatti /**
1740de7ed953SPrasad Kummari  * pm_fpga_read - Perform the fpga configuration readback.
1741de7ed953SPrasad Kummari  * @reg_numframes: Configuration register offset (or) Number of frames to read.
1742de7ed953SPrasad Kummari  * @address_low: lower 32-bit Linear memory space address.
1743de7ed953SPrasad Kummari  * @address_high: higher 32-bit Linear memory space address.
1744de7ed953SPrasad Kummari  * @readback_type: Type of fpga readback operation.
1745de7ed953SPrasad Kummari  *		   0 -- Configuration Register readback.
1746de7ed953SPrasad Kummari  *		   1 -- Configuration Data readback.
1747de7ed953SPrasad Kummari  * @value: Value to read.
17488ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
17498ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1750a92681d9SJay Buddhabhatti  *
1751a92681d9SJay Buddhabhatti  * This function provides access to the xilfpga library to read
1752a92681d9SJay Buddhabhatti  * the PL configuration.
1753a92681d9SJay Buddhabhatti  *
1754a92681d9SJay Buddhabhatti  * Return: Returns status, either success or error+reason.
1755de7ed953SPrasad Kummari  *
1756a92681d9SJay Buddhabhatti  */
pm_fpga_read(uint32_t reg_numframes,uint32_t address_low,uint32_t address_high,uint32_t readback_type,uint32_t * value,uint32_t flag)1757a92681d9SJay Buddhabhatti enum pm_ret_status pm_fpga_read(uint32_t reg_numframes,
1758a92681d9SJay Buddhabhatti 				uint32_t address_low,
1759a92681d9SJay Buddhabhatti 				uint32_t address_high,
1760a92681d9SJay Buddhabhatti 				uint32_t readback_type,
17618ce93ec9SRonak Jain 				uint32_t *value,
17628ce93ec9SRonak Jain 				uint32_t flag)
1763a92681d9SJay Buddhabhatti {
1764a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1765a92681d9SJay Buddhabhatti 
1766a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
17678ce93ec9SRonak Jain 	PM_PACK_PAYLOAD5(payload, flag, PM_FPGA_READ, reg_numframes, address_low,
1768a92681d9SJay Buddhabhatti 			 address_high, readback_type);
1769a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, value, 1);
1770a92681d9SJay Buddhabhatti }
1771a92681d9SJay Buddhabhatti 
1772a92681d9SJay Buddhabhatti /*
1773de7ed953SPrasad Kummari  * pm_pll_set_parameter() - Set the PLL parameter value.
1774de7ed953SPrasad Kummari  * @nid: Node id of the target PLL.
1775de7ed953SPrasad Kummari  * @param_id: ID of the PLL parameter.
1776de7ed953SPrasad Kummari  * @value: Parameter value to be set.
17778ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
17788ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1779a92681d9SJay Buddhabhatti  *
1780a92681d9SJay Buddhabhatti  * Setting the parameter will have physical effect once the PLL mode is set to
1781a92681d9SJay Buddhabhatti  * integer or fractional.
1782a92681d9SJay Buddhabhatti  *
1783de7ed953SPrasad Kummari  * Return: Error if an argument is not valid or status as returned by the
1784de7ed953SPrasad Kummari  *         PM controller (PMU).
1785de7ed953SPrasad Kummari  *
1786a92681d9SJay Buddhabhatti  */
pm_pll_set_parameter(enum pm_node_id nid,enum pm_pll_param param_id,uint32_t value,uint32_t flag)1787a92681d9SJay Buddhabhatti enum pm_ret_status pm_pll_set_parameter(enum pm_node_id nid,
1788a92681d9SJay Buddhabhatti 					enum pm_pll_param param_id,
17898ce93ec9SRonak Jain 					uint32_t value,
17908ce93ec9SRonak Jain 					uint32_t flag)
1791a92681d9SJay Buddhabhatti {
1792a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
17933f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = 0;
1794a92681d9SJay Buddhabhatti 
1795a92681d9SJay Buddhabhatti 	/* Check if given node ID is a PLL node */
17965b542313SMaheedhar Bollapalli 	if ((nid < NODE_APLL) || (nid > NODE_IOPLL)) {
17973f6d4794SMaheedhar Bollapalli 		ret = PM_RET_ERROR_ARGS;
17983f6d4794SMaheedhar Bollapalli 		goto exit_label;
1799a92681d9SJay Buddhabhatti 	}
1800a92681d9SJay Buddhabhatti 
1801a92681d9SJay Buddhabhatti 	/* Check if parameter ID is valid and return an error if it's not */
1802a92681d9SJay Buddhabhatti 	if (param_id >= PM_PLL_PARAM_MAX) {
18033f6d4794SMaheedhar Bollapalli 		ret = PM_RET_ERROR_ARGS;
18043f6d4794SMaheedhar Bollapalli 		goto exit_label;
1805a92681d9SJay Buddhabhatti 	}
1806a92681d9SJay Buddhabhatti 
1807a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
18088ce93ec9SRonak Jain 	PM_PACK_PAYLOAD4(payload, flag, PM_PLL_SET_PARAMETER, nid, param_id, value);
18093f6d4794SMaheedhar Bollapalli 	ret = pm_ipi_send_sync(primary_proc, payload, NULL, 0);
18103f6d4794SMaheedhar Bollapalli 
18113f6d4794SMaheedhar Bollapalli exit_label:
18123f6d4794SMaheedhar Bollapalli 	return ret;
1813a92681d9SJay Buddhabhatti }
1814a92681d9SJay Buddhabhatti 
1815a92681d9SJay Buddhabhatti /**
1816de7ed953SPrasad Kummari  * pm_pll_get_parameter() - Get the PLL parameter value.
1817de7ed953SPrasad Kummari  * @nid: Node id of the target PLL.
1818de7ed953SPrasad Kummari  * @param_id: ID of the PLL parameter.
1819de7ed953SPrasad Kummari  * @value: Location to store the parameter value.
18208ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
18218ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1822a92681d9SJay Buddhabhatti  *
1823de7ed953SPrasad Kummari  * Return: Error if an argument is not valid or status as returned by the
1824de7ed953SPrasad Kummari  *         PM controller (PMU).
1825de7ed953SPrasad Kummari  *
1826a92681d9SJay Buddhabhatti  */
pm_pll_get_parameter(enum pm_node_id nid,enum pm_pll_param param_id,uint32_t * value,uint32_t flag)1827a92681d9SJay Buddhabhatti enum pm_ret_status pm_pll_get_parameter(enum pm_node_id nid,
1828a92681d9SJay Buddhabhatti 					enum pm_pll_param param_id,
18298ce93ec9SRonak Jain 					uint32_t *value, uint32_t flag)
1830a92681d9SJay Buddhabhatti {
1831a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
18323f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
1833a92681d9SJay Buddhabhatti 
1834a92681d9SJay Buddhabhatti 	/* Check if given node ID is a PLL node */
18355b542313SMaheedhar Bollapalli 	if ((nid < NODE_APLL) || (nid > NODE_IOPLL)) {
18363f6d4794SMaheedhar Bollapalli 		ret = PM_RET_ERROR_ARGS;
18373f6d4794SMaheedhar Bollapalli 		goto exit_label;
1838a92681d9SJay Buddhabhatti 	}
1839a92681d9SJay Buddhabhatti 
1840a92681d9SJay Buddhabhatti 	/* Check if parameter ID is valid and return an error if it's not */
1841a92681d9SJay Buddhabhatti 	if (param_id >= PM_PLL_PARAM_MAX) {
18423f6d4794SMaheedhar Bollapalli 		ret = PM_RET_ERROR_ARGS;
18433f6d4794SMaheedhar Bollapalli 		goto exit_label;
1844a92681d9SJay Buddhabhatti 	}
1845a92681d9SJay Buddhabhatti 
1846a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
18478ce93ec9SRonak Jain 	PM_PACK_PAYLOAD3(payload, flag, PM_PLL_GET_PARAMETER, nid, param_id);
18483f6d4794SMaheedhar Bollapalli 	ret = pm_ipi_send_sync(primary_proc, payload, value, 1);
18493f6d4794SMaheedhar Bollapalli 
18503f6d4794SMaheedhar Bollapalli exit_label:
18513f6d4794SMaheedhar Bollapalli 	return ret;
1852a92681d9SJay Buddhabhatti }
1853a92681d9SJay Buddhabhatti 
1854a92681d9SJay Buddhabhatti /**
1855de7ed953SPrasad Kummari  * pm_pll_set_mode() - Set the PLL mode.
1856de7ed953SPrasad Kummari  * @nid: Node id of the target PLL.
1857de7ed953SPrasad Kummari  * @mode: PLL mode to be set.
18588ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
18598ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1860a92681d9SJay Buddhabhatti  *
1861a92681d9SJay Buddhabhatti  * If reset mode is set the PM controller will first bypass the PLL and then
1862a92681d9SJay Buddhabhatti  * assert the reset. If integer or fractional mode is set the PM controller will
1863a92681d9SJay Buddhabhatti  * ensure that the complete PLL programming sequence is satisfied. After this
1864a92681d9SJay Buddhabhatti  * function returns success the PLL is locked and its bypass is deasserted.
1865a92681d9SJay Buddhabhatti  *
1866de7ed953SPrasad Kummari  * Return: Error if an argument is not valid or status as returned by the
1867de7ed953SPrasad Kummari  *         PM controller (PMU).
1868de7ed953SPrasad Kummari  *
1869a92681d9SJay Buddhabhatti  */
pm_pll_set_mode(enum pm_node_id nid,enum pm_pll_mode mode,uint32_t flag)18708ce93ec9SRonak Jain enum pm_ret_status pm_pll_set_mode(enum pm_node_id nid, enum pm_pll_mode mode,
18718ce93ec9SRonak Jain 				   uint32_t flag)
1872a92681d9SJay Buddhabhatti {
1873a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
18743f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
1875a92681d9SJay Buddhabhatti 
1876a92681d9SJay Buddhabhatti 	/* Check if given node ID is a PLL node */
18775b542313SMaheedhar Bollapalli 	if ((nid < NODE_APLL) || (nid > NODE_IOPLL)) {
18783f6d4794SMaheedhar Bollapalli 		ret = PM_RET_ERROR_ARGS;
18793f6d4794SMaheedhar Bollapalli 		goto exit_label;
1880a92681d9SJay Buddhabhatti 	}
1881a92681d9SJay Buddhabhatti 
1882a92681d9SJay Buddhabhatti 	/* Check if PLL mode is valid */
1883a92681d9SJay Buddhabhatti 	if (mode >= PM_PLL_MODE_MAX) {
18843f6d4794SMaheedhar Bollapalli 		ret = PM_RET_ERROR_ARGS;
18853f6d4794SMaheedhar Bollapalli 		goto exit_label;
1886a92681d9SJay Buddhabhatti 	}
1887a92681d9SJay Buddhabhatti 
1888a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
18898ce93ec9SRonak Jain 	PM_PACK_PAYLOAD3(payload, flag, PM_PLL_SET_MODE, nid, mode);
18903f6d4794SMaheedhar Bollapalli 	ret = pm_ipi_send_sync(primary_proc, payload, NULL, 0);
18913f6d4794SMaheedhar Bollapalli 
18923f6d4794SMaheedhar Bollapalli exit_label:
18933f6d4794SMaheedhar Bollapalli 	return ret;
1894a92681d9SJay Buddhabhatti }
1895a92681d9SJay Buddhabhatti 
1896a92681d9SJay Buddhabhatti /**
1897de7ed953SPrasad Kummari  * pm_pll_get_mode() - Get the PLL mode.
1898de7ed953SPrasad Kummari  * @nid: Node id of the target PLL.
1899de7ed953SPrasad Kummari  * @mode: Location to store the mode of the PLL.
19008ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
19018ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1902a92681d9SJay Buddhabhatti  *
1903de7ed953SPrasad Kummari  * Return: Error if an argument is not valid or status as returned by the
1904de7ed953SPrasad Kummari  *         PM controller (PMU).
1905de7ed953SPrasad Kummari  *
1906a92681d9SJay Buddhabhatti  */
pm_pll_get_mode(enum pm_node_id nid,enum pm_pll_mode * mode,uint32_t flag)19078ce93ec9SRonak Jain enum pm_ret_status pm_pll_get_mode(enum pm_node_id nid, enum pm_pll_mode *mode,
19088ce93ec9SRonak Jain 				   uint32_t flag)
1909a92681d9SJay Buddhabhatti {
1910a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
19113f6d4794SMaheedhar Bollapalli 	enum pm_ret_status ret = PM_RET_SUCCESS;
1912a92681d9SJay Buddhabhatti 
1913a92681d9SJay Buddhabhatti 	/* Check if given node ID is a PLL node */
19145b542313SMaheedhar Bollapalli 	if ((nid < NODE_APLL) || (nid > NODE_IOPLL)) {
19153f6d4794SMaheedhar Bollapalli 		ret = PM_RET_ERROR_ARGS;
19163f6d4794SMaheedhar Bollapalli 	} else {
1917a92681d9SJay Buddhabhatti 		/* Send request to the PMU */
19188ce93ec9SRonak Jain 		PM_PACK_PAYLOAD2(payload, flag, PM_PLL_GET_MODE, nid);
19193f6d4794SMaheedhar Bollapalli 		ret = pm_ipi_send_sync(primary_proc, payload, mode, 1);
19203f6d4794SMaheedhar Bollapalli 	}
19213f6d4794SMaheedhar Bollapalli 
19223f6d4794SMaheedhar Bollapalli 	return ret;
1923a92681d9SJay Buddhabhatti }
1924a92681d9SJay Buddhabhatti 
1925a92681d9SJay Buddhabhatti /**
1926de7ed953SPrasad Kummari  * pm_register_access() -  PM API for register read/write access data.
1927de7ed953SPrasad Kummari  * @register_access_id: Register_access_id which says register read/write.
1928de7ed953SPrasad Kummari  * @address: Address of the register to be accessed.
1929de7ed953SPrasad Kummari  * @mask: Mask value to be used while writing value.
1930de7ed953SPrasad Kummari  * @value: Value to be written to register.
1931de7ed953SPrasad Kummari  * @out: Returned output data.
19328ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
19338ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1934a92681d9SJay Buddhabhatti  *
1935a92681d9SJay Buddhabhatti  * This function returns requested data.
1936a92681d9SJay Buddhabhatti  *
1937de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
1938de7ed953SPrasad Kummari  *
1939a92681d9SJay Buddhabhatti  */
pm_register_access(uint32_t register_access_id,uint32_t address,uint32_t mask,uint32_t value,uint32_t * out,uint32_t flag)1940a92681d9SJay Buddhabhatti enum pm_ret_status pm_register_access(uint32_t register_access_id,
1941a92681d9SJay Buddhabhatti 				      uint32_t address,
1942a92681d9SJay Buddhabhatti 				      uint32_t mask,
1943a92681d9SJay Buddhabhatti 				      uint32_t value,
19448ce93ec9SRonak Jain 				      uint32_t *out,
19458ce93ec9SRonak Jain 				      uint32_t flag)
1946a92681d9SJay Buddhabhatti {
1947a92681d9SJay Buddhabhatti 	enum pm_ret_status ret;
1948a92681d9SJay Buddhabhatti 
1949a92681d9SJay Buddhabhatti 	if (((ZYNQMP_CSU_BASEADDR & address) != ZYNQMP_CSU_BASEADDR) &&
1950a92681d9SJay Buddhabhatti 			((CSUDMA_BASE & address) != CSUDMA_BASE) &&
1951a92681d9SJay Buddhabhatti 			((RSA_CORE_BASE & address) != RSA_CORE_BASE) &&
1952a92681d9SJay Buddhabhatti 			((PMU_GLOBAL_BASE & address) != PMU_GLOBAL_BASE)) {
19533f6d4794SMaheedhar Bollapalli 		ret = PM_RET_ERROR_ACCESS;
19543f6d4794SMaheedhar Bollapalli 		goto exit_label;
1955a92681d9SJay Buddhabhatti 	}
1956a92681d9SJay Buddhabhatti 
1957a92681d9SJay Buddhabhatti 	switch (register_access_id) {
1958a92681d9SJay Buddhabhatti 	case CONFIG_REG_WRITE:
19598ce93ec9SRonak Jain 		ret = pm_mmio_write(address, mask, value, flag);
1960a92681d9SJay Buddhabhatti 		break;
1961a92681d9SJay Buddhabhatti 	case CONFIG_REG_READ:
19628ce93ec9SRonak Jain 		ret = pm_mmio_read(address, out, flag);
1963a92681d9SJay Buddhabhatti 		break;
1964a92681d9SJay Buddhabhatti 	default:
1965a92681d9SJay Buddhabhatti 		ret = PM_RET_ERROR_ARGS;
1966a92681d9SJay Buddhabhatti 		WARN("Unimplemented register_access call\n\r");
1967a92681d9SJay Buddhabhatti 		break;
1968a92681d9SJay Buddhabhatti 	}
19693f6d4794SMaheedhar Bollapalli 
19703f6d4794SMaheedhar Bollapalli exit_label:
1971a92681d9SJay Buddhabhatti 	return ret;
1972a92681d9SJay Buddhabhatti }
1973a92681d9SJay Buddhabhatti 
1974a92681d9SJay Buddhabhatti /**
1975de7ed953SPrasad Kummari  * pm_efuse_access() - To program or read efuse bits. This function provides
1976de7ed953SPrasad Kummari  *                     access to the xilskey library to program/read
1977a92681d9SJay Buddhabhatti  *                     efuse bits.
1978de7ed953SPrasad Kummari  * @address_low: lower 32-bit Linear memory space address.
1979de7ed953SPrasad Kummari  * @address_high: higher 32-bit Linear memory space address.
1980de7ed953SPrasad Kummari  * @value: Returned output value.
19818ce93ec9SRonak Jain  * @flag: 0 - Call from secure source.
19828ce93ec9SRonak Jain  *	  1 - Call from non-secure source.
1983a92681d9SJay Buddhabhatti  *
1984de7ed953SPrasad Kummari  * Return: Returns status, either success or error+reason.
1985a92681d9SJay Buddhabhatti  *
1986a92681d9SJay Buddhabhatti  */
pm_efuse_access(uint32_t address_high,uint32_t address_low,uint32_t * value,uint32_t flag)1987a92681d9SJay Buddhabhatti enum pm_ret_status pm_efuse_access(uint32_t address_high,
1988a92681d9SJay Buddhabhatti 				   uint32_t address_low,
19898ce93ec9SRonak Jain 				   uint32_t *value,
19908ce93ec9SRonak Jain 				   uint32_t flag)
1991a92681d9SJay Buddhabhatti {
1992a92681d9SJay Buddhabhatti 	uint32_t payload[PAYLOAD_ARG_CNT];
1993a92681d9SJay Buddhabhatti 
1994a92681d9SJay Buddhabhatti 	/* Send request to the PMU */
19958ce93ec9SRonak Jain 	PM_PACK_PAYLOAD3(payload, flag, PM_EFUSE_ACCESS, address_high, address_low);
1996a92681d9SJay Buddhabhatti 
1997a92681d9SJay Buddhabhatti 	return pm_ipi_send_sync(primary_proc, payload, value, 1);
1998a92681d9SJay Buddhabhatti }
1999