xref: /rk3399_ARM-atf/plat/marvell/armada/common/marvell_pm.c (revision 9935047b2086faa3bf3ccf0b95a76510eb5a160b)
1*a2847172SGrzegorz Jaszczyk /*
2*a2847172SGrzegorz Jaszczyk  * Copyright (C) 2018 Marvell International Ltd.
3*a2847172SGrzegorz Jaszczyk  *
4*a2847172SGrzegorz Jaszczyk  * SPDX-License-Identifier:     BSD-3-Clause
5*a2847172SGrzegorz Jaszczyk  * https://spdx.org/licenses
6*a2847172SGrzegorz Jaszczyk  */
7*a2847172SGrzegorz Jaszczyk 
8*a2847172SGrzegorz Jaszczyk #include <assert.h>
9*a2847172SGrzegorz Jaszczyk 
10*a2847172SGrzegorz Jaszczyk #include <arch_helpers.h>
11*a2847172SGrzegorz Jaszczyk #include <lib/psci/psci.h>
12*a2847172SGrzegorz Jaszczyk 
13*a2847172SGrzegorz Jaszczyk #include <marvell_pm.h>
14*a2847172SGrzegorz Jaszczyk 
15*a2847172SGrzegorz Jaszczyk /* Standard ARM platforms are expected to export plat_arm_psci_pm_ops */
16*a2847172SGrzegorz Jaszczyk extern const plat_psci_ops_t plat_arm_psci_pm_ops;
17*a2847172SGrzegorz Jaszczyk 
18*a2847172SGrzegorz Jaszczyk /*****************************************************************************
19*a2847172SGrzegorz Jaszczyk  * Private function to program the mailbox for a cpu before it is released
20*a2847172SGrzegorz Jaszczyk  * from reset. This function assumes that the mail box base is within
21*a2847172SGrzegorz Jaszczyk  * the MARVELL_SHARED_RAM region
22*a2847172SGrzegorz Jaszczyk  *****************************************************************************
23*a2847172SGrzegorz Jaszczyk  */
marvell_program_mailbox(uintptr_t address)24*a2847172SGrzegorz Jaszczyk void marvell_program_mailbox(uintptr_t address)
25*a2847172SGrzegorz Jaszczyk {
26*a2847172SGrzegorz Jaszczyk 	uintptr_t *mailbox = (void *)PLAT_MARVELL_MAILBOX_BASE;
27*a2847172SGrzegorz Jaszczyk 
28*a2847172SGrzegorz Jaszczyk 	/*
29*a2847172SGrzegorz Jaszczyk 	 * Ensure that the PLAT_MARVELL_MAILBOX_BASE is within
30*a2847172SGrzegorz Jaszczyk 	 * MARVELL_SHARED_RAM region.
31*a2847172SGrzegorz Jaszczyk 	 */
32*a2847172SGrzegorz Jaszczyk 	assert((PLAT_MARVELL_MAILBOX_BASE >= MARVELL_SHARED_RAM_BASE) &&
33*a2847172SGrzegorz Jaszczyk 	       ((PLAT_MARVELL_MAILBOX_BASE + sizeof(*mailbox)) <=
34*a2847172SGrzegorz Jaszczyk 	       (MARVELL_SHARED_RAM_BASE + MARVELL_SHARED_RAM_SIZE)));
35*a2847172SGrzegorz Jaszczyk 
36*a2847172SGrzegorz Jaszczyk 	mailbox[MBOX_IDX_MAGIC] = MVEBU_MAILBOX_MAGIC_NUM;
37*a2847172SGrzegorz Jaszczyk 	mailbox[MBOX_IDX_SEC_ADDR] = address;
38*a2847172SGrzegorz Jaszczyk 
39*a2847172SGrzegorz Jaszczyk 	/* Flush data cache if the mail box shared RAM is cached */
40*a2847172SGrzegorz Jaszczyk #if PLAT_MARVELL_SHARED_RAM_CACHED
41*a2847172SGrzegorz Jaszczyk 	flush_dcache_range((uintptr_t)PLAT_MARVELL_MAILBOX_BASE +
42*a2847172SGrzegorz Jaszczyk 			   8 * MBOX_IDX_MAGIC,
43*a2847172SGrzegorz Jaszczyk 			   2 * sizeof(uint64_t));
44*a2847172SGrzegorz Jaszczyk #endif
45*a2847172SGrzegorz Jaszczyk }
46*a2847172SGrzegorz Jaszczyk 
47*a2847172SGrzegorz Jaszczyk /*****************************************************************************
48*a2847172SGrzegorz Jaszczyk  * The ARM Standard platform definition of platform porting API
49*a2847172SGrzegorz Jaszczyk  * `plat_setup_psci_ops`.
50*a2847172SGrzegorz Jaszczyk  *****************************************************************************
51*a2847172SGrzegorz Jaszczyk  */
plat_setup_psci_ops(uintptr_t sec_entrypoint,const plat_psci_ops_t ** psci_ops)52*a2847172SGrzegorz Jaszczyk int plat_setup_psci_ops(uintptr_t sec_entrypoint,
53*a2847172SGrzegorz Jaszczyk 			const plat_psci_ops_t **psci_ops)
54*a2847172SGrzegorz Jaszczyk {
55*a2847172SGrzegorz Jaszczyk 	*psci_ops = &plat_arm_psci_pm_ops;
56*a2847172SGrzegorz Jaszczyk 
57*a2847172SGrzegorz Jaszczyk 	/* Setup mailbox with entry point. */
58*a2847172SGrzegorz Jaszczyk 	marvell_program_mailbox(sec_entrypoint);
59*a2847172SGrzegorz Jaszczyk 	return 0;
60*a2847172SGrzegorz Jaszczyk }
61