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