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; 23*50226c8fSJoseph Chen struct list_head kmem_resv_head; 24ffa8f8b7SJoseph Chen ulong allocated_cnt; 25*50226c8fSJoseph 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 /** 63ffa8f8b7SJoseph Chen * sysmem_alloc_base() - Alloc sysmem region at the expect addr 64ffa8f8b7SJoseph Chen * 656e15146eSJoseph Chen * @id: memblk id 66ffa8f8b7SJoseph Chen * @base: region base 67ffa8f8b7SJoseph Chen * @size: region size 68ffa8f8b7SJoseph Chen * 69ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 70ffa8f8b7SJoseph Chen */ 716e15146eSJoseph Chen void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size); 72ffa8f8b7SJoseph Chen 73ffa8f8b7SJoseph Chen /** 746e15146eSJoseph Chen * sysmem_alloc_base_by_name() - Alloc sysmem region at the expect addr by name 75ffa8f8b7SJoseph Chen * 766e15146eSJoseph Chen * @name: memblk name 77ffa8f8b7SJoseph Chen * @base: region base 78ffa8f8b7SJoseph Chen * @size: region size 79ffa8f8b7SJoseph Chen * 80ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 81ffa8f8b7SJoseph Chen */ 826e15146eSJoseph Chen void *sysmem_alloc_base_by_name(const char *name, 836e15146eSJoseph Chen phys_addr_t base, phys_size_t size); 84ffa8f8b7SJoseph Chen 85ffa8f8b7SJoseph Chen /** 866e15146eSJoseph Chen * sysmem_fdt_reserve_alloc_base() - Alloc sysmem region at the expect addr by name, 876e15146eSJoseph Chen * called only for reserve memory from fdt. 886e15146eSJoseph Chen * 896e15146eSJoseph Chen * @name: memblk name 906e15146eSJoseph Chen * @base: region base 916e15146eSJoseph Chen * @size: region size 926e15146eSJoseph Chen * 936e15146eSJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 946e15146eSJoseph Chen */ 956e15146eSJoseph Chen void *sysmem_fdt_reserve_alloc_base(const char *name, 966e15146eSJoseph Chen phys_addr_t base, phys_size_t size); 976e15146eSJoseph Chen 986e15146eSJoseph Chen /** 993bee194fSJoseph Chen * sysmem_can_alloc() - Check if the region can be allocated 1003bee194fSJoseph Chen * 1013bee194fSJoseph Chen * @base: region base 1023bee194fSJoseph Chen * @size: region size 1033bee194fSJoseph Chen * 1043bee194fSJoseph Chen * @return true on okay. 1053bee194fSJoseph Chen */ 1063bee194fSJoseph Chen bool sysmem_can_alloc(phys_size_t base, phys_size_t size); 1073bee194fSJoseph Chen 1083bee194fSJoseph Chen /** 1096e15146eSJoseph Chen * sysmem_free() - Free allocated sysmem region 110ffa8f8b7SJoseph Chen * 111ffa8f8b7SJoseph Chen * @base: region base 112ffa8f8b7SJoseph Chen * 113ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 114ffa8f8b7SJoseph Chen */ 115ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base); 116ffa8f8b7SJoseph Chen 117ffa8f8b7SJoseph Chen /** 1182c66f6f3SJoseph Chen * sysmem_dump() - Dump all sysmem region state 119ffa8f8b7SJoseph Chen */ 120ffa8f8b7SJoseph Chen void sysmem_dump(void); 121ffa8f8b7SJoseph Chen 122ffa8f8b7SJoseph Chen /** 1232c66f6f3SJoseph Chen * sysmem_overflow_check() - Sysmem regions overflow check 1242c66f6f3SJoseph Chen */ 1252c66f6f3SJoseph Chen void sysmem_overflow_check(void); 1262c66f6f3SJoseph Chen 1272c66f6f3SJoseph Chen /** 128ffa8f8b7SJoseph Chen * board_sysmem_reserve() - Weak function for board to implement 129ffa8f8b7SJoseph Chen * 130ffa8f8b7SJoseph Chen * @sysmem: global sysmem point, ignored 131ffa8f8b7SJoseph Chen * 132ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 133ffa8f8b7SJoseph Chen */ 134ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem); 1356e15146eSJoseph Chen #else 1366e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; } 1376e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; } 1386e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; } 1396e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; } 1406e15146eSJoseph Chen static inline void sysmem_dump(void) {} 1412c66f6f3SJoseph Chen void sysmem_overflow_check(void) {} 1422c66f6f3SJoseph Chen 1436e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; } 144dcb404a6SJoseph Chen 145dcb404a6SJoseph Chen static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size) 146dcb404a6SJoseph Chen { 147dcb404a6SJoseph Chen return malloc(size); 148dcb404a6SJoseph Chen } 149dcb404a6SJoseph Chen 1503bee194fSJoseph Chen static inline bool sysmem_can_alloc(phys_size_t base, phys_size_t size) 1513bee194fSJoseph Chen { 1523bee194fSJoseph Chen return true; 1533bee194fSJoseph Chen } 1543bee194fSJoseph Chen 1556e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id, 1566e15146eSJoseph Chen phys_addr_t base, phys_size_t size) 1576e15146eSJoseph Chen { 1586e15146eSJoseph Chen return (void *)base; 1596e15146eSJoseph Chen } 1606e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name, 1616e15146eSJoseph Chen phys_addr_t base, 1626e15146eSJoseph Chen phys_size_t size) 1636e15146eSJoseph Chen { 1646e15146eSJoseph Chen return (void *)base; 1656e15146eSJoseph Chen } 1666e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name, 1676e15146eSJoseph Chen phys_addr_t base, 1686e15146eSJoseph Chen phys_size_t size) 1696e15146eSJoseph Chen { 1706e15146eSJoseph Chen return (void *)base; 1716e15146eSJoseph Chen } 1726e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */ 173ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */ 174