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
plat_rmmd_reserve_memory(size_t size,unsigned long alignment)23 uintptr_t plat_rmmd_reserve_memory(size_t size, unsigned long alignment)
24 {
25 return 0;
26 }
27
rmmd_reserve_memory(size_t size,uint64_t * arg)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