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