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 Jaszczykvoid 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 Jaszczykint 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