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> 10dcb404a6SJoseph 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; 2350226c8fSJoseph Chen struct list_head kmem_resv_head; 24ffa8f8b7SJoseph Chen ulong allocated_cnt; 2550226c8fSJoseph Chen ulong kmem_resv_cnt; 266e15146eSJoseph Chen bool has_initf; 276e15146eSJoseph Chen bool has_initr; 28ffa8f8b7SJoseph Chen }; 29ffa8f8b7SJoseph Chen 306e15146eSJoseph Chen #ifdef CONFIG_SYSMEM 316e15146eSJoseph Chen /** 326e15146eSJoseph Chen * sysmem_has_init() - Is sysmem initialized 336e15146eSJoseph Chen * 346e15146eSJoseph Chen * @return true or false 356e15146eSJoseph Chen */ 366e15146eSJoseph Chen bool sysmem_has_init(void); 376e15146eSJoseph Chen 38ffa8f8b7SJoseph Chen /** 39ffa8f8b7SJoseph Chen * sysmem_init() - Sysmem initialization 40ffa8f8b7SJoseph Chen * 41ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 42ffa8f8b7SJoseph Chen */ 43ffa8f8b7SJoseph Chen int sysmem_init(void); 44ffa8f8b7SJoseph Chen 45ffa8f8b7SJoseph Chen /** 466e15146eSJoseph Chen * sysmem_initr() - Sysmem initialization after relocation 47ffa8f8b7SJoseph Chen * 48ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 49ffa8f8b7SJoseph Chen */ 506e15146eSJoseph Chen int sysmem_initr(void); 51ffa8f8b7SJoseph Chen 52ffa8f8b7SJoseph Chen /** 53ffa8f8b7SJoseph Chen * sysmem_alloc() - Alloc sysmem region at anywhere 54ffa8f8b7SJoseph Chen * 556e15146eSJoseph Chen * @id: memblk id 56ffa8f8b7SJoseph Chen * @size: region size 57ffa8f8b7SJoseph Chen * 58ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 59ffa8f8b7SJoseph Chen */ 606e15146eSJoseph Chen void *sysmem_alloc(enum memblk_id id, phys_size_t size); 61ffa8f8b7SJoseph Chen 62ffa8f8b7SJoseph Chen /** 63acffe332SJoseph Chen * sysmem_alloc_by_name() - Alloc sysmem region by name at the expect addr 64acffe332SJoseph Chen * 65acffe332SJoseph Chen * @name: memblk name 66acffe332SJoseph Chen * @size: region size 67acffe332SJoseph Chen * 68acffe332SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 69acffe332SJoseph Chen */ 70acffe332SJoseph Chen void *sysmem_alloc_by_name(const char *name, phys_size_t size); 71acffe332SJoseph Chen 72acffe332SJoseph Chen /** 73ffa8f8b7SJoseph Chen * sysmem_alloc_base() - Alloc sysmem region at the expect addr 74ffa8f8b7SJoseph Chen * 756e15146eSJoseph Chen * @id: memblk id 76ffa8f8b7SJoseph Chen * @base: region base 77ffa8f8b7SJoseph Chen * @size: region size 78ffa8f8b7SJoseph Chen * 79ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 80ffa8f8b7SJoseph Chen */ 816e15146eSJoseph Chen void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size); 82ffa8f8b7SJoseph Chen 83ffa8f8b7SJoseph Chen /** 846e15146eSJoseph Chen * sysmem_alloc_base_by_name() - Alloc sysmem region at the expect addr by name 85ffa8f8b7SJoseph Chen * 866e15146eSJoseph Chen * @name: memblk name 87ffa8f8b7SJoseph Chen * @base: region base 88ffa8f8b7SJoseph Chen * @size: region size 89ffa8f8b7SJoseph Chen * 90ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 91ffa8f8b7SJoseph Chen */ 926e15146eSJoseph Chen void *sysmem_alloc_base_by_name(const char *name, 936e15146eSJoseph Chen phys_addr_t base, phys_size_t size); 94ffa8f8b7SJoseph Chen 95ffa8f8b7SJoseph Chen /** 966e15146eSJoseph Chen * sysmem_fdt_reserve_alloc_base() - Alloc sysmem region at the expect addr by name, 976e15146eSJoseph Chen * called only for reserve memory from fdt. 986e15146eSJoseph Chen * 996e15146eSJoseph Chen * @name: memblk name 1006e15146eSJoseph Chen * @base: region base 1016e15146eSJoseph Chen * @size: region size 1026e15146eSJoseph Chen * 1036e15146eSJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 1046e15146eSJoseph Chen */ 1056e15146eSJoseph Chen void *sysmem_fdt_reserve_alloc_base(const char *name, 1066e15146eSJoseph Chen phys_addr_t base, phys_size_t size); 1076e15146eSJoseph Chen 1086e15146eSJoseph Chen /** 1093bee194fSJoseph Chen * sysmem_can_alloc() - Check if the region can be allocated 1103bee194fSJoseph Chen * 1113bee194fSJoseph Chen * @base: region base 1123bee194fSJoseph Chen * @size: region size 1133bee194fSJoseph Chen * 1143bee194fSJoseph Chen * @return true on okay. 1153bee194fSJoseph Chen */ 1163bee194fSJoseph Chen bool sysmem_can_alloc(phys_size_t base, phys_size_t size); 1173bee194fSJoseph Chen 1183bee194fSJoseph Chen /** 1196e15146eSJoseph Chen * sysmem_free() - Free allocated sysmem region 120ffa8f8b7SJoseph Chen * 121ffa8f8b7SJoseph Chen * @base: region base 122ffa8f8b7SJoseph Chen * 123ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 124ffa8f8b7SJoseph Chen */ 125ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base); 126ffa8f8b7SJoseph Chen 127ffa8f8b7SJoseph Chen /** 1282c66f6f3SJoseph Chen * sysmem_dump() - Dump all sysmem region state 129ffa8f8b7SJoseph Chen */ 130ffa8f8b7SJoseph Chen void sysmem_dump(void); 131ffa8f8b7SJoseph Chen 132ffa8f8b7SJoseph Chen /** 1332c66f6f3SJoseph Chen * sysmem_overflow_check() - Sysmem regions overflow check 1342c66f6f3SJoseph Chen */ 1352c66f6f3SJoseph Chen void sysmem_overflow_check(void); 1362c66f6f3SJoseph Chen 1372c66f6f3SJoseph Chen /** 138ffa8f8b7SJoseph Chen * board_sysmem_reserve() - Weak function for board to implement 139ffa8f8b7SJoseph Chen * 140ffa8f8b7SJoseph Chen * @sysmem: global sysmem point, ignored 141ffa8f8b7SJoseph Chen * 142ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 143ffa8f8b7SJoseph Chen */ 144ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem); 1456e15146eSJoseph Chen #else 1466e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; } 1476e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; } 1486e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; } 1496e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; } 1506e15146eSJoseph Chen static inline void sysmem_dump(void) {} 151*f3ff8d72SJoseph Chen static inline void sysmem_overflow_check(void) {} 1526e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; } 153dcb404a6SJoseph Chen 154dcb404a6SJoseph Chen static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size) 155dcb404a6SJoseph Chen { 156dcb404a6SJoseph Chen return malloc(size); 157dcb404a6SJoseph Chen } 158dcb404a6SJoseph Chen 1593bee194fSJoseph Chen static inline bool sysmem_can_alloc(phys_size_t base, phys_size_t size) 1603bee194fSJoseph Chen { 1613bee194fSJoseph Chen return true; 1623bee194fSJoseph Chen } 1633bee194fSJoseph Chen 1646e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id, 1656e15146eSJoseph Chen phys_addr_t base, phys_size_t size) 1666e15146eSJoseph Chen { 1676e15146eSJoseph Chen return (void *)base; 1686e15146eSJoseph Chen } 1696e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name, 1706e15146eSJoseph Chen phys_addr_t base, 1716e15146eSJoseph Chen phys_size_t size) 1726e15146eSJoseph Chen { 1736e15146eSJoseph Chen return (void *)base; 1746e15146eSJoseph Chen } 1756e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name, 1766e15146eSJoseph Chen phys_addr_t base, 1776e15146eSJoseph Chen phys_size_t size) 1786e15146eSJoseph Chen { 1796e15146eSJoseph Chen return (void *)base; 1806e15146eSJoseph Chen } 1816e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */ 182ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */ 183