1 /* 2 * Copyright (c) 2025, Arm Limited. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <stdint.h> 8 9 #include <common/debug.h> 10 11 #include <plat/common/platform.h> 12 #include <services/rmmd_svc.h> 13 14 #define MEMRESERVE_FLAG_LOCALCPU (1U << 0) 15 #define MEMRESERVE_NR_FLAGS 1U 16 #define MEMRESERVE_FLAGS_MASK GENMASK(MEMRESERVE_NR_FLAGS - 1, 0) 17 18 #define MEMRESERVE_ALIGNMENT_SHIFT 56U 19 #define MEMRESERVE_ALIGNMENT(x) (1ULL << ((x) >> MEMRESERVE_ALIGNMENT_SHIFT)) 20 #define MEMRESERVE_FLAGS(x) ((x) & GENMASK(MEMRESERVE_ALIGNMENT_SHIFT - 1, 0)) 21 22 #pragma weak plat_rmmd_reserve_memory 23 uintptr_t plat_rmmd_reserve_memory(size_t size, unsigned long alignment) 24 { 25 return 0; 26 } 27 28 int rmmd_reserve_memory(size_t size, uint64_t *arg) 29 { 30 unsigned long alignment = MEMRESERVE_ALIGNMENT(*arg); 31 uint64_t flags = MEMRESERVE_FLAGS(*arg); 32 uintptr_t addr; 33 34 VERBOSE("%s(%ld, 0x%lx);\n", __func__, size, *arg); 35 36 /* Any unknown flag forces an error return. */ 37 if ((flags & ~MEMRESERVE_FLAGS_MASK) != 0U) { 38 return E_RMM_INVAL; 39 } 40 41 addr = plat_rmmd_reserve_memory(size, alignment); 42 if (addr == 0UL) { 43 return E_RMM_NOMEM; 44 } 45 46 *arg = addr; 47 48 return E_RMM_OK; 49 } 50