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