1ffa8f8b7SJoseph Chen /* SPDX-License-Identifier: GPL-2.0+ */ 2ffa8f8b7SJoseph Chen /* 3ffa8f8b7SJoseph Chen * (C) Copyright 2019 Rockchip Electronics Co., Ltd 4ffa8f8b7SJoseph Chen */ 5ffa8f8b7SJoseph Chen 6ffa8f8b7SJoseph Chen #ifndef _SYSMEM_H 7ffa8f8b7SJoseph Chen #define _SYSMEM_H 8ffa8f8b7SJoseph Chen 96e15146eSJoseph Chen #include <memblk.h> 10*dcb404a6SJoseph Chen #include <malloc.h> 11ffa8f8b7SJoseph Chen 122c9d1179SJoseph Chen /* 132c9d1179SJoseph Chen * CONFIG_SYS_FDT_PAD default value is sync with bootm framework in: 142c9d1179SJoseph Chen * common/image-fdt.c 152c9d1179SJoseph Chen */ 162c9d1179SJoseph Chen #ifndef CONFIG_SYS_FDT_PAD 172c9d1179SJoseph Chen #define CONFIG_SYS_FDT_PAD 0x3000 182c9d1179SJoseph Chen #endif 192c9d1179SJoseph Chen 20ffa8f8b7SJoseph Chen struct sysmem { 21ffa8f8b7SJoseph Chen struct lmb lmb; 22ffa8f8b7SJoseph Chen struct list_head allocated_head; 23ffa8f8b7SJoseph Chen ulong allocated_cnt; 246e15146eSJoseph Chen bool has_initf; 256e15146eSJoseph Chen bool has_initr; 26ffa8f8b7SJoseph Chen }; 27ffa8f8b7SJoseph Chen 286e15146eSJoseph Chen #ifdef CONFIG_SYSMEM 296e15146eSJoseph Chen /** 306e15146eSJoseph Chen * sysmem_has_init() - Is sysmem initialized 316e15146eSJoseph Chen * 326e15146eSJoseph Chen * @return true or false 336e15146eSJoseph Chen */ 346e15146eSJoseph Chen bool sysmem_has_init(void); 356e15146eSJoseph Chen 36ffa8f8b7SJoseph Chen /** 37ffa8f8b7SJoseph Chen * sysmem_init() - Sysmem initialization 38ffa8f8b7SJoseph Chen * 39ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 40ffa8f8b7SJoseph Chen */ 41ffa8f8b7SJoseph Chen int sysmem_init(void); 42ffa8f8b7SJoseph Chen 43ffa8f8b7SJoseph Chen /** 446e15146eSJoseph Chen * sysmem_initr() - Sysmem initialization after relocation 45ffa8f8b7SJoseph Chen * 46ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 47ffa8f8b7SJoseph Chen */ 486e15146eSJoseph Chen int sysmem_initr(void); 49ffa8f8b7SJoseph Chen 50ffa8f8b7SJoseph Chen /** 51ffa8f8b7SJoseph Chen * sysmem_alloc() - Alloc sysmem region at anywhere 52ffa8f8b7SJoseph Chen * 536e15146eSJoseph Chen * @id: memblk id 54ffa8f8b7SJoseph Chen * @size: region size 55ffa8f8b7SJoseph Chen * 56ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 57ffa8f8b7SJoseph Chen */ 586e15146eSJoseph Chen void *sysmem_alloc(enum memblk_id id, phys_size_t size); 59ffa8f8b7SJoseph Chen 60ffa8f8b7SJoseph Chen /** 61ffa8f8b7SJoseph Chen * sysmem_alloc_base() - Alloc sysmem region at the expect addr 62ffa8f8b7SJoseph Chen * 636e15146eSJoseph Chen * @id: memblk id 64ffa8f8b7SJoseph Chen * @base: region base 65ffa8f8b7SJoseph Chen * @size: region size 66ffa8f8b7SJoseph Chen * 67ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 68ffa8f8b7SJoseph Chen */ 696e15146eSJoseph Chen void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size); 70ffa8f8b7SJoseph Chen 71ffa8f8b7SJoseph Chen /** 726e15146eSJoseph Chen * sysmem_alloc_base_by_name() - Alloc sysmem region at the expect addr by name 73ffa8f8b7SJoseph Chen * 746e15146eSJoseph Chen * @name: memblk name 75ffa8f8b7SJoseph Chen * @base: region base 76ffa8f8b7SJoseph Chen * @size: region size 77ffa8f8b7SJoseph Chen * 78ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 79ffa8f8b7SJoseph Chen */ 806e15146eSJoseph Chen void *sysmem_alloc_base_by_name(const char *name, 816e15146eSJoseph Chen phys_addr_t base, phys_size_t size); 82ffa8f8b7SJoseph Chen 83ffa8f8b7SJoseph Chen /** 846e15146eSJoseph Chen * sysmem_fdt_reserve_alloc_base() - Alloc sysmem region at the expect addr by name, 856e15146eSJoseph Chen * called only for reserve memory from fdt. 866e15146eSJoseph Chen * 876e15146eSJoseph Chen * @name: memblk name 886e15146eSJoseph Chen * @base: region base 896e15146eSJoseph Chen * @size: region size 906e15146eSJoseph Chen * 916e15146eSJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 926e15146eSJoseph Chen */ 936e15146eSJoseph Chen void *sysmem_fdt_reserve_alloc_base(const char *name, 946e15146eSJoseph Chen phys_addr_t base, phys_size_t size); 956e15146eSJoseph Chen 966e15146eSJoseph Chen /** 976e15146eSJoseph Chen * sysmem_free() - Free allocated sysmem region 98ffa8f8b7SJoseph Chen * 99ffa8f8b7SJoseph Chen * @base: region base 100ffa8f8b7SJoseph Chen * 101ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 102ffa8f8b7SJoseph Chen */ 103ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base); 104ffa8f8b7SJoseph Chen 105ffa8f8b7SJoseph Chen /** 1066e15146eSJoseph Chen * sysmem_dump() - Dump all sysmem region state and check overflow 107ffa8f8b7SJoseph Chen */ 108ffa8f8b7SJoseph Chen void sysmem_dump(void); 109ffa8f8b7SJoseph Chen 110ffa8f8b7SJoseph Chen /** 111ffa8f8b7SJoseph Chen * board_sysmem_reserve() - Weak function for board to implement 112ffa8f8b7SJoseph Chen * 113ffa8f8b7SJoseph Chen * @sysmem: global sysmem point, ignored 114ffa8f8b7SJoseph Chen * 115ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 116ffa8f8b7SJoseph Chen */ 117ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem); 1186e15146eSJoseph Chen #else 1196e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; } 1206e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; } 1216e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; } 1226e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; } 1236e15146eSJoseph Chen static inline void sysmem_dump(void) {} 1246e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; } 125*dcb404a6SJoseph Chen 126*dcb404a6SJoseph Chen static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size) 127*dcb404a6SJoseph Chen { 128*dcb404a6SJoseph Chen return malloc(size); 129*dcb404a6SJoseph Chen } 130*dcb404a6SJoseph Chen 1316e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id, 1326e15146eSJoseph Chen phys_addr_t base, phys_size_t size) 1336e15146eSJoseph Chen { 1346e15146eSJoseph Chen return (void *)base; 1356e15146eSJoseph Chen } 1366e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name, 1376e15146eSJoseph Chen phys_addr_t base, 1386e15146eSJoseph Chen phys_size_t size) 1396e15146eSJoseph Chen { 1406e15146eSJoseph Chen return (void *)base; 1416e15146eSJoseph Chen } 1426e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name, 1436e15146eSJoseph Chen phys_addr_t base, 1446e15146eSJoseph Chen phys_size_t size) 1456e15146eSJoseph Chen { 1466e15146eSJoseph Chen return (void *)base; 1476e15146eSJoseph Chen } 1486e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */ 149ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */ 150