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; 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 /** 973bee194fSJoseph Chen * sysmem_can_alloc() - Check if the region can be allocated 983bee194fSJoseph Chen * 993bee194fSJoseph Chen * @base: region base 1003bee194fSJoseph Chen * @size: region size 1013bee194fSJoseph Chen * 1023bee194fSJoseph Chen * @return true on okay. 1033bee194fSJoseph Chen */ 1043bee194fSJoseph Chen bool sysmem_can_alloc(phys_size_t base, phys_size_t size); 1053bee194fSJoseph Chen 1063bee194fSJoseph Chen /** 1076e15146eSJoseph Chen * sysmem_free() - Free allocated sysmem region 108ffa8f8b7SJoseph Chen * 109ffa8f8b7SJoseph Chen * @base: region base 110ffa8f8b7SJoseph Chen * 111ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 112ffa8f8b7SJoseph Chen */ 113ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base); 114ffa8f8b7SJoseph Chen 115ffa8f8b7SJoseph Chen /** 116*2c66f6f3SJoseph Chen * sysmem_dump() - Dump all sysmem region state 117ffa8f8b7SJoseph Chen */ 118ffa8f8b7SJoseph Chen void sysmem_dump(void); 119ffa8f8b7SJoseph Chen 120ffa8f8b7SJoseph Chen /** 121*2c66f6f3SJoseph Chen * sysmem_overflow_check() - Sysmem regions overflow check 122*2c66f6f3SJoseph Chen */ 123*2c66f6f3SJoseph Chen void sysmem_overflow_check(void); 124*2c66f6f3SJoseph Chen 125*2c66f6f3SJoseph Chen /** 126ffa8f8b7SJoseph Chen * board_sysmem_reserve() - Weak function for board to implement 127ffa8f8b7SJoseph Chen * 128ffa8f8b7SJoseph Chen * @sysmem: global sysmem point, ignored 129ffa8f8b7SJoseph Chen * 130ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 131ffa8f8b7SJoseph Chen */ 132ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem); 1336e15146eSJoseph Chen #else 1346e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; } 1356e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; } 1366e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; } 1376e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; } 1386e15146eSJoseph Chen static inline void sysmem_dump(void) {} 139*2c66f6f3SJoseph Chen void sysmem_overflow_check(void) {} 140*2c66f6f3SJoseph Chen 1416e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; } 142dcb404a6SJoseph Chen 143dcb404a6SJoseph Chen static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size) 144dcb404a6SJoseph Chen { 145dcb404a6SJoseph Chen return malloc(size); 146dcb404a6SJoseph Chen } 147dcb404a6SJoseph Chen 1483bee194fSJoseph Chen static inline bool sysmem_can_alloc(phys_size_t base, phys_size_t size) 1493bee194fSJoseph Chen { 1503bee194fSJoseph Chen return true; 1513bee194fSJoseph Chen } 1523bee194fSJoseph Chen 1536e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id, 1546e15146eSJoseph Chen phys_addr_t base, phys_size_t size) 1556e15146eSJoseph Chen { 1566e15146eSJoseph Chen return (void *)base; 1576e15146eSJoseph Chen } 1586e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name, 1596e15146eSJoseph Chen phys_addr_t base, 1606e15146eSJoseph Chen phys_size_t size) 1616e15146eSJoseph Chen { 1626e15146eSJoseph Chen return (void *)base; 1636e15146eSJoseph Chen } 1646e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name, 1656e15146eSJoseph Chen phys_addr_t base, 1666e15146eSJoseph Chen phys_size_t size) 1676e15146eSJoseph Chen { 1686e15146eSJoseph Chen return (void *)base; 1696e15146eSJoseph Chen } 1706e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */ 171ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */ 172