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