xref: /rk3399_ARM-atf/services/std_svc/rmmd/rmmd_mem.c (revision aed7dc81a1d20fc7cbb5d96f73ec9f6979ccdf5c)
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