xref: /rk3399_ARM-atf/plat/xilinx/versal_net/pm_service/pm_client.c (revision 047b1b9afce13993db8363f55be6e0cbfb69bf0d)
10654ab7fSJay Buddhabhatti /*
20654ab7fSJay Buddhabhatti  * Copyright (c) 2022, Xilinx, Inc. All rights reserved.
3*5cac1d85SRonak Jain  * Copyright (c) 2022-2025, Advanced Micro Devices, Inc. All rights reserved.
40654ab7fSJay Buddhabhatti  *
50654ab7fSJay Buddhabhatti  * SPDX-License-Identifier: BSD-3-Clause
60654ab7fSJay Buddhabhatti  */
70654ab7fSJay Buddhabhatti 
80654ab7fSJay Buddhabhatti /*
90654ab7fSJay Buddhabhatti  * APU specific definition of processors in the subsystem as well as functions
100654ab7fSJay Buddhabhatti  * for getting information about and changing state of the APU.
110654ab7fSJay Buddhabhatti  */
120654ab7fSJay Buddhabhatti 
130654ab7fSJay Buddhabhatti #include <assert.h>
140654ab7fSJay Buddhabhatti 
158a4a551cSBoyan Karatotev #include <drivers/arm/gic.h>
160654ab7fSJay Buddhabhatti #include <lib/bakery_lock.h>
170654ab7fSJay Buddhabhatti #include <lib/mmio.h>
180b3a2cf0SJay Buddhabhatti #include <lib/spinlock.h>
1901a326abSPrasad Kummari #include <lib/utils.h>
200654ab7fSJay Buddhabhatti #include <plat/common/platform.h>
210654ab7fSJay Buddhabhatti 
220654ab7fSJay Buddhabhatti #include <plat_ipi.h>
230654ab7fSJay Buddhabhatti #include <platform_def.h>
240654ab7fSJay Buddhabhatti #include "pm_api_sys.h"
250654ab7fSJay Buddhabhatti #include "pm_client.h"
260654ab7fSJay Buddhabhatti #include <versal_net_def.h>
270654ab7fSJay Buddhabhatti 
283cbe0ae5SMaheedhar Bollapalli #define UNDEFINED_CPUID		(~0U)
290654ab7fSJay Buddhabhatti 
DEFINE_RENAME_SYSREG_RW_FUNCS(cpu_pwrctrl_val,S3_0_C15_C2_7)300654ab7fSJay Buddhabhatti DEFINE_RENAME_SYSREG_RW_FUNCS(cpu_pwrctrl_val, S3_0_C15_C2_7)
310b3a2cf0SJay Buddhabhatti 
320b3a2cf0SJay Buddhabhatti spinlock_t pm_client_secure_lock;
330b3a2cf0SJay Buddhabhatti static inline void pm_client_lock_get(void)
340b3a2cf0SJay Buddhabhatti {
350b3a2cf0SJay Buddhabhatti 	spin_lock(&pm_client_secure_lock);
360b3a2cf0SJay Buddhabhatti }
370b3a2cf0SJay Buddhabhatti 
pm_client_lock_release(void)380b3a2cf0SJay Buddhabhatti static inline void pm_client_lock_release(void)
390b3a2cf0SJay Buddhabhatti {
400b3a2cf0SJay Buddhabhatti 	spin_unlock(&pm_client_secure_lock);
410b3a2cf0SJay Buddhabhatti }
420654ab7fSJay Buddhabhatti 
430654ab7fSJay Buddhabhatti static const struct pm_ipi apu_ipi = {
44068b0bc6SMichal Simek 	.local_ipi_id = IPI_LOCAL_ID,
45068b0bc6SMichal Simek 	.remote_ipi_id = IPI_REMOTE_ID,
46bfd06265SMichal Simek 	.buffer_base = IPI_BUFFER_LOCAL_BASE,
470654ab7fSJay Buddhabhatti };
480654ab7fSJay Buddhabhatti 
490654ab7fSJay Buddhabhatti /* Order in pm_procs_all array must match cpu ids */
500654ab7fSJay Buddhabhatti static const struct pm_proc pm_procs_all[] = {
510654ab7fSJay Buddhabhatti 	{
520654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER0_ACPU_0,
530654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
540654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
550654ab7fSJay Buddhabhatti 	},
560654ab7fSJay Buddhabhatti 	{
570654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER0_ACPU_1,
580654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
590654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
600654ab7fSJay Buddhabhatti 	},
610654ab7fSJay Buddhabhatti 	{
620654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER0_ACPU_2,
630654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
640654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
650654ab7fSJay Buddhabhatti 	},
660654ab7fSJay Buddhabhatti 	{
670654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER0_ACPU_3,
680654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
690654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
700654ab7fSJay Buddhabhatti 	},
710654ab7fSJay Buddhabhatti 	{
720654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER1_ACPU_0,
730654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
740654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
750654ab7fSJay Buddhabhatti 	},
760654ab7fSJay Buddhabhatti 	{
770654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER1_ACPU_1,
780654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
790654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
800654ab7fSJay Buddhabhatti 	},
810654ab7fSJay Buddhabhatti 	{
820654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER1_ACPU_2,
830654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
840654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
850654ab7fSJay Buddhabhatti 	},
860654ab7fSJay Buddhabhatti 	{
870654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER1_ACPU_3,
880654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
890654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
900654ab7fSJay Buddhabhatti 	},
910654ab7fSJay Buddhabhatti 	{
920654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER2_ACPU_0,
930654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
940654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
950654ab7fSJay Buddhabhatti 	},
960654ab7fSJay Buddhabhatti 	{
970654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER2_ACPU_1,
980654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
990654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
1000654ab7fSJay Buddhabhatti 	},
1010654ab7fSJay Buddhabhatti 	{
1020654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER2_ACPU_2,
1030654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
1040654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
1050654ab7fSJay Buddhabhatti 	},
1060654ab7fSJay Buddhabhatti 	{
1070654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER2_ACPU_3,
1080654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
1090654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
1100654ab7fSJay Buddhabhatti 	},
1110654ab7fSJay Buddhabhatti 	{
1120654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER3_ACPU_0,
1130654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
1140654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
1150654ab7fSJay Buddhabhatti 	},
1160654ab7fSJay Buddhabhatti 	{
1170654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER3_ACPU_1,
1180654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
1190654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
1200654ab7fSJay Buddhabhatti 	},
1210654ab7fSJay Buddhabhatti 	{
1220654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER3_ACPU_2,
1230654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
1240654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
1250654ab7fSJay Buddhabhatti 	},
1260654ab7fSJay Buddhabhatti 	{
1270654ab7fSJay Buddhabhatti 		.node_id = PM_DEV_CLUSTER3_ACPU_3,
1280654ab7fSJay Buddhabhatti 		.ipi = &apu_ipi,
1290654ab7fSJay Buddhabhatti 		.pwrdn_mask = 0,
1300654ab7fSJay Buddhabhatti 	}
1310654ab7fSJay Buddhabhatti };
1320654ab7fSJay Buddhabhatti 
1330654ab7fSJay Buddhabhatti const struct pm_proc *primary_proc = &pm_procs_all[0];
1340654ab7fSJay Buddhabhatti 
1350654ab7fSJay Buddhabhatti /**
136de7ed953SPrasad Kummari  * pm_get_proc() - returns pointer to the proc structure.
137de7ed953SPrasad Kummari  * @cpuid: id of the cpu whose proc struct pointer should be returned.
1380654ab7fSJay Buddhabhatti  *
139de7ed953SPrasad Kummari  * Return: Pointer to a proc structure if proc is found, otherwise NULL.
140de7ed953SPrasad Kummari  *
1410654ab7fSJay Buddhabhatti  */
pm_get_proc(uint32_t cpuid)1420654ab7fSJay Buddhabhatti const struct pm_proc *pm_get_proc(uint32_t cpuid)
1430654ab7fSJay Buddhabhatti {
1440654ab7fSJay Buddhabhatti 	if (cpuid < ARRAY_SIZE(pm_procs_all)) {
1450654ab7fSJay Buddhabhatti 		return &pm_procs_all[cpuid];
1460654ab7fSJay Buddhabhatti 	}
1470654ab7fSJay Buddhabhatti 
1480654ab7fSJay Buddhabhatti 	NOTICE("ERROR: cpuid: %d proc NULL\n", cpuid);
1490654ab7fSJay Buddhabhatti 	return NULL;
1500654ab7fSJay Buddhabhatti }
1510654ab7fSJay Buddhabhatti 
1520654ab7fSJay Buddhabhatti /**
153de7ed953SPrasad Kummari  * irq_to_pm_node_idx - Get PM node index corresponding to the interrupt number.
154de7ed953SPrasad Kummari  * @irq: Interrupt number.
155c38d90f7SJay Buddhabhatti  *
156de7ed953SPrasad Kummari  * Return: PM node index corresponding to the specified interrupt.
157de7ed953SPrasad Kummari  *
158c38d90f7SJay Buddhabhatti  */
irq_to_pm_node_idx(uint32_t irq)159c38d90f7SJay Buddhabhatti enum pm_device_node_idx irq_to_pm_node_idx(uint32_t irq)
160c38d90f7SJay Buddhabhatti {
161c38d90f7SJay Buddhabhatti 	enum pm_device_node_idx dev_idx = XPM_NODEIDX_DEV_MIN;
162c38d90f7SJay Buddhabhatti 
163c38d90f7SJay Buddhabhatti 	assert(irq <= IRQ_MAX);
164c38d90f7SJay Buddhabhatti 
165c38d90f7SJay Buddhabhatti 	switch (irq) {
166c38d90f7SJay Buddhabhatti 	case 20:
167c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_GPIO;
168c38d90f7SJay Buddhabhatti 		break;
169c38d90f7SJay Buddhabhatti 	case 21:
170c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_I2C_0;
171c38d90f7SJay Buddhabhatti 		break;
172c38d90f7SJay Buddhabhatti 	case 22:
173c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_I2C_1;
174c38d90f7SJay Buddhabhatti 		break;
175c38d90f7SJay Buddhabhatti 	case 23:
176c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_SPI_0;
177c38d90f7SJay Buddhabhatti 		break;
178c38d90f7SJay Buddhabhatti 	case 24:
179c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_SPI_1;
180c38d90f7SJay Buddhabhatti 		break;
181c38d90f7SJay Buddhabhatti 	case 25:
182c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_UART_0;
183c38d90f7SJay Buddhabhatti 		break;
184c38d90f7SJay Buddhabhatti 	case 26:
185c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_UART_1;
186c38d90f7SJay Buddhabhatti 		break;
187c38d90f7SJay Buddhabhatti 	case 27:
188c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_CAN_FD_0;
189c38d90f7SJay Buddhabhatti 		break;
190c38d90f7SJay Buddhabhatti 	case 28:
191c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_CAN_FD_1;
192c38d90f7SJay Buddhabhatti 		break;
193c38d90f7SJay Buddhabhatti 	case 29:
194c38d90f7SJay Buddhabhatti 	case 30:
195c38d90f7SJay Buddhabhatti 	case 31:
196c38d90f7SJay Buddhabhatti 	case 32:
197c38d90f7SJay Buddhabhatti 	case 33:
198c38d90f7SJay Buddhabhatti 	case 98:
199c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_USB_0;
200c38d90f7SJay Buddhabhatti 		break;
201c38d90f7SJay Buddhabhatti 	case 34:
202c38d90f7SJay Buddhabhatti 	case 35:
203c38d90f7SJay Buddhabhatti 	case 36:
204c38d90f7SJay Buddhabhatti 	case 37:
205c38d90f7SJay Buddhabhatti 	case 38:
206c38d90f7SJay Buddhabhatti 	case 99:
207c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_USB_1;
208c38d90f7SJay Buddhabhatti 		break;
209c38d90f7SJay Buddhabhatti 	case 39:
210c38d90f7SJay Buddhabhatti 	case 40:
211c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_GEM_0;
212c38d90f7SJay Buddhabhatti 		break;
213c38d90f7SJay Buddhabhatti 	case 41:
214c38d90f7SJay Buddhabhatti 	case 42:
215c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_GEM_1;
216c38d90f7SJay Buddhabhatti 		break;
217c38d90f7SJay Buddhabhatti 	case 43:
218c38d90f7SJay Buddhabhatti 	case 44:
219c38d90f7SJay Buddhabhatti 	case 45:
220c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_TTC_0;
221c38d90f7SJay Buddhabhatti 		break;
222c38d90f7SJay Buddhabhatti 	case 46:
223c38d90f7SJay Buddhabhatti 	case 47:
224c38d90f7SJay Buddhabhatti 	case 48:
225c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_TTC_1;
226c38d90f7SJay Buddhabhatti 		break;
227c38d90f7SJay Buddhabhatti 	case 49:
228c38d90f7SJay Buddhabhatti 	case 50:
229c38d90f7SJay Buddhabhatti 	case 51:
230c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_TTC_2;
231c38d90f7SJay Buddhabhatti 		break;
232c38d90f7SJay Buddhabhatti 	case 52:
233c38d90f7SJay Buddhabhatti 	case 53:
234c38d90f7SJay Buddhabhatti 	case 54:
235c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_TTC_3;
236c38d90f7SJay Buddhabhatti 		break;
237c38d90f7SJay Buddhabhatti 	case 72:
238c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_ADMA_0;
239c38d90f7SJay Buddhabhatti 		break;
240c38d90f7SJay Buddhabhatti 	case 73:
241c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_ADMA_1;
242c38d90f7SJay Buddhabhatti 		break;
243c38d90f7SJay Buddhabhatti 	case 74:
244c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_ADMA_2;
245c38d90f7SJay Buddhabhatti 		break;
246c38d90f7SJay Buddhabhatti 	case 75:
247c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_ADMA_3;
248c38d90f7SJay Buddhabhatti 		break;
249c38d90f7SJay Buddhabhatti 	case 76:
250c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_ADMA_4;
251c38d90f7SJay Buddhabhatti 		break;
252c38d90f7SJay Buddhabhatti 	case 77:
253c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_ADMA_5;
254c38d90f7SJay Buddhabhatti 		break;
255c38d90f7SJay Buddhabhatti 	case 78:
256c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_ADMA_6;
257c38d90f7SJay Buddhabhatti 		break;
258c38d90f7SJay Buddhabhatti 	case 79:
259c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_ADMA_7;
260c38d90f7SJay Buddhabhatti 		break;
261c38d90f7SJay Buddhabhatti 	case 184:
262c38d90f7SJay Buddhabhatti 	case 185:
263c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_SDIO_0;
264c38d90f7SJay Buddhabhatti 		break;
265c38d90f7SJay Buddhabhatti 	case 186:
266c38d90f7SJay Buddhabhatti 	case 187:
267c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_SDIO_1;
268c38d90f7SJay Buddhabhatti 		break;
269c38d90f7SJay Buddhabhatti 	case 200:
270c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_RTC;
271c38d90f7SJay Buddhabhatti 		break;
272c38d90f7SJay Buddhabhatti 	default:
273c38d90f7SJay Buddhabhatti 		dev_idx = XPM_NODEIDX_DEV_MIN;
274c38d90f7SJay Buddhabhatti 		break;
275c38d90f7SJay Buddhabhatti 	}
276c38d90f7SJay Buddhabhatti 
277c38d90f7SJay Buddhabhatti 	return dev_idx;
278c38d90f7SJay Buddhabhatti }
279c38d90f7SJay Buddhabhatti 
280c38d90f7SJay Buddhabhatti /**
281de7ed953SPrasad Kummari  * pm_client_suspend() - Client-specific suspend actions. This function
282de7ed953SPrasad Kummari  *                       should contain any PU-specific actions required
283de7ed953SPrasad Kummari  *                       prior to sending suspend request to PMU. Actions
284de7ed953SPrasad Kummari  *                       taken depend on the state system is suspending to.
285de7ed953SPrasad Kummari  * @proc: processor which need to suspend.
286de7ed953SPrasad Kummari  * @state: desired suspend state.
287*5cac1d85SRonak Jain  * @flag: 0 - Call from secure source.
288*5cac1d85SRonak Jain  *	  1 - Call from non-secure source.
2890654ab7fSJay Buddhabhatti  *
2900654ab7fSJay Buddhabhatti  */
pm_client_suspend(const struct pm_proc * proc,uint32_t state,uint32_t flag)291*5cac1d85SRonak Jain void pm_client_suspend(const struct pm_proc *proc, uint32_t state, uint32_t flag)
2920654ab7fSJay Buddhabhatti {
2930654ab7fSJay Buddhabhatti 	uint32_t cpu_id = plat_my_core_pos();
2940654ab7fSJay Buddhabhatti 	uintptr_t val;
2950654ab7fSJay Buddhabhatti 
2960b3a2cf0SJay Buddhabhatti 	pm_client_lock_get();
2970654ab7fSJay Buddhabhatti 
298c38d90f7SJay Buddhabhatti 	if (state == PM_STATE_SUSPEND_TO_RAM) {
299*5cac1d85SRonak Jain 		pm_client_set_wakeup_sources((uint32_t)proc->node_id, flag);
300c38d90f7SJay Buddhabhatti 	}
3010654ab7fSJay Buddhabhatti 
3020654ab7fSJay Buddhabhatti 	val = read_cpu_pwrctrl_val();
3030654ab7fSJay Buddhabhatti 	val |= CORE_PWRDN_EN_BIT_MASK;
3040654ab7fSJay Buddhabhatti 	write_cpu_pwrctrl_val(val);
3050654ab7fSJay Buddhabhatti 
3060654ab7fSJay Buddhabhatti 	isb();
3070654ab7fSJay Buddhabhatti 
3082d056db4SJay Buddhabhatti 	/* Enable power down interrupt */
3090654ab7fSJay Buddhabhatti 	mmio_write_32(APU_PCIL_CORE_X_IEN_POWER_REG(cpu_id),
3100654ab7fSJay Buddhabhatti 		      APU_PCIL_CORE_X_IEN_POWER_MASK);
31139fffe55SJay Buddhabhatti 	/* Enable wake interrupt */
31239fffe55SJay Buddhabhatti 	mmio_write_32(APU_PCIL_CORE_X_IEN_WAKE_REG(cpu_id),
31339fffe55SJay Buddhabhatti 		      APU_PCIL_CORE_X_IEN_WAKE_MASK);
3140654ab7fSJay Buddhabhatti 
3150b3a2cf0SJay Buddhabhatti 	pm_client_lock_release();
3160654ab7fSJay Buddhabhatti }
3170654ab7fSJay Buddhabhatti 
3180654ab7fSJay Buddhabhatti /**
319de7ed953SPrasad Kummari  * pm_get_cpuid() - get the local cpu ID for a global node ID.
320de7ed953SPrasad Kummari  * @nid: node id of the processor.
3210654ab7fSJay Buddhabhatti  *
322de7ed953SPrasad Kummari  * Return: the cpu ID (starting from 0) for the subsystem.
323de7ed953SPrasad Kummari  *
3240654ab7fSJay Buddhabhatti  */
pm_get_cpuid(uint32_t nid)3250654ab7fSJay Buddhabhatti static uint32_t pm_get_cpuid(uint32_t nid)
3260654ab7fSJay Buddhabhatti {
3273dc93e51SMaheedhar Bollapalli 	uint32_t ret = UNDEFINED_CPUID;
328d51c8e4cSMaheedhar Bollapalli 	uint32_t i;
3293dc93e51SMaheedhar Bollapalli 
330d51c8e4cSMaheedhar Bollapalli 	for (i = 0; i < ARRAY_SIZE(pm_procs_all); i++) {
3310654ab7fSJay Buddhabhatti 		if (pm_procs_all[i].node_id == nid) {
3323dc93e51SMaheedhar Bollapalli 			ret = i;
3333dc93e51SMaheedhar Bollapalli 			break;
3340654ab7fSJay Buddhabhatti 		}
3350654ab7fSJay Buddhabhatti 	}
3363dc93e51SMaheedhar Bollapalli 	return ret;
3370654ab7fSJay Buddhabhatti }
3380654ab7fSJay Buddhabhatti 
3390654ab7fSJay Buddhabhatti /**
340de7ed953SPrasad Kummari  * pm_client_wakeup() - Client-specific wakeup actions.
341de7ed953SPrasad Kummari  * @proc: Processor which need to wakeup.
3420654ab7fSJay Buddhabhatti  *
3430654ab7fSJay Buddhabhatti  * This function should contain any PU-specific actions
344de7ed953SPrasad Kummari  * required for waking up another APU core.
3450654ab7fSJay Buddhabhatti  *
3460654ab7fSJay Buddhabhatti  */
pm_client_wakeup(const struct pm_proc * proc)3470654ab7fSJay Buddhabhatti void pm_client_wakeup(const struct pm_proc *proc)
3480654ab7fSJay Buddhabhatti {
3490654ab7fSJay Buddhabhatti 	uint32_t cpuid = pm_get_cpuid(proc->node_id);
3505f0f7e47SJay Buddhabhatti 	uintptr_t val;
3510654ab7fSJay Buddhabhatti 
3520654ab7fSJay Buddhabhatti 	if (cpuid == UNDEFINED_CPUID) {
3530654ab7fSJay Buddhabhatti 		return;
3540654ab7fSJay Buddhabhatti 	}
3550654ab7fSJay Buddhabhatti 
3560b3a2cf0SJay Buddhabhatti 	pm_client_lock_get();
3570654ab7fSJay Buddhabhatti 
3585f0f7e47SJay Buddhabhatti 	/* Clear powerdown request */
3595f0f7e47SJay Buddhabhatti 	val = read_cpu_pwrctrl_val();
3605f0f7e47SJay Buddhabhatti 	val &= ~CORE_PWRDN_EN_BIT_MASK;
3615f0f7e47SJay Buddhabhatti 	write_cpu_pwrctrl_val(val);
3625f0f7e47SJay Buddhabhatti 
3635f0f7e47SJay Buddhabhatti 	isb();
3645f0f7e47SJay Buddhabhatti 
3655f0f7e47SJay Buddhabhatti 	/* Disabled power down interrupt */
3665f0f7e47SJay Buddhabhatti 	mmio_write_32(APU_PCIL_CORE_X_IDS_POWER_REG(cpuid),
3675f0f7e47SJay Buddhabhatti 			APU_PCIL_CORE_X_IDS_POWER_MASK);
368e663f09bSJay Buddhabhatti 	/* Disable wake interrupt */
369e663f09bSJay Buddhabhatti 	mmio_write_32(APU_PCIL_CORE_X_IDS_WAKE_REG(cpuid),
370e663f09bSJay Buddhabhatti 		      APU_PCIL_CORE_X_IDS_WAKE_MASK);
3710654ab7fSJay Buddhabhatti 
3720b3a2cf0SJay Buddhabhatti 	pm_client_lock_release();
3730654ab7fSJay Buddhabhatti }
374