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 9*6e15146eSJoseph Chen #include <memblk.h> 10ffa8f8b7SJoseph Chen 112c9d1179SJoseph Chen /* 122c9d1179SJoseph Chen * CONFIG_SYS_FDT_PAD default value is sync with bootm framework in: 132c9d1179SJoseph Chen * common/image-fdt.c 142c9d1179SJoseph Chen */ 152c9d1179SJoseph Chen #ifndef CONFIG_SYS_FDT_PAD 162c9d1179SJoseph Chen #define CONFIG_SYS_FDT_PAD 0x3000 172c9d1179SJoseph Chen #endif 182c9d1179SJoseph Chen 19ffa8f8b7SJoseph Chen struct sysmem { 20ffa8f8b7SJoseph Chen struct lmb lmb; 21ffa8f8b7SJoseph Chen struct list_head allocated_head; 22ffa8f8b7SJoseph Chen ulong allocated_cnt; 23*6e15146eSJoseph Chen bool has_initf; 24*6e15146eSJoseph Chen bool has_initr; 25ffa8f8b7SJoseph Chen }; 26ffa8f8b7SJoseph Chen 27*6e15146eSJoseph Chen #ifdef CONFIG_SYSMEM 28*6e15146eSJoseph Chen /** 29*6e15146eSJoseph Chen * sysmem_has_init() - Is sysmem initialized 30*6e15146eSJoseph Chen * 31*6e15146eSJoseph Chen * @return true or false 32*6e15146eSJoseph Chen */ 33*6e15146eSJoseph Chen bool sysmem_has_init(void); 34*6e15146eSJoseph Chen 35ffa8f8b7SJoseph Chen /** 36ffa8f8b7SJoseph Chen * sysmem_init() - Sysmem initialization 37ffa8f8b7SJoseph Chen * 38ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 39ffa8f8b7SJoseph Chen */ 40ffa8f8b7SJoseph Chen int sysmem_init(void); 41ffa8f8b7SJoseph Chen 42ffa8f8b7SJoseph Chen /** 43*6e15146eSJoseph Chen * sysmem_initr() - Sysmem initialization after relocation 44ffa8f8b7SJoseph Chen * 45ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 46ffa8f8b7SJoseph Chen */ 47*6e15146eSJoseph Chen int sysmem_initr(void); 48ffa8f8b7SJoseph Chen 49ffa8f8b7SJoseph Chen /** 50ffa8f8b7SJoseph Chen * sysmem_alloc() - Alloc sysmem region at anywhere 51ffa8f8b7SJoseph Chen * 52*6e15146eSJoseph Chen * @id: memblk id 53ffa8f8b7SJoseph Chen * @size: region size 54ffa8f8b7SJoseph Chen * 55ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 56ffa8f8b7SJoseph Chen */ 57*6e15146eSJoseph Chen void *sysmem_alloc(enum memblk_id id, phys_size_t size); 58ffa8f8b7SJoseph Chen 59ffa8f8b7SJoseph Chen /** 60ffa8f8b7SJoseph Chen * sysmem_alloc_base() - Alloc sysmem region at the expect addr 61ffa8f8b7SJoseph Chen * 62*6e15146eSJoseph Chen * @id: memblk id 63ffa8f8b7SJoseph Chen * @base: region base 64ffa8f8b7SJoseph Chen * @size: region size 65ffa8f8b7SJoseph Chen * 66ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 67ffa8f8b7SJoseph Chen */ 68*6e15146eSJoseph Chen void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size); 69ffa8f8b7SJoseph Chen 70ffa8f8b7SJoseph Chen /** 71*6e15146eSJoseph Chen * sysmem_alloc_base_by_name() - Alloc sysmem region at the expect addr by name 72ffa8f8b7SJoseph Chen * 73*6e15146eSJoseph Chen * @name: memblk name 74ffa8f8b7SJoseph Chen * @base: region base 75ffa8f8b7SJoseph Chen * @size: region size 76ffa8f8b7SJoseph Chen * 77ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 78ffa8f8b7SJoseph Chen */ 79*6e15146eSJoseph Chen void *sysmem_alloc_base_by_name(const char *name, 80*6e15146eSJoseph Chen phys_addr_t base, phys_size_t size); 81ffa8f8b7SJoseph Chen 82ffa8f8b7SJoseph Chen /** 83*6e15146eSJoseph Chen * sysmem_fdt_reserve_alloc_base() - Alloc sysmem region at the expect addr by name, 84*6e15146eSJoseph Chen * called only for reserve memory from fdt. 85*6e15146eSJoseph Chen * 86*6e15146eSJoseph Chen * @name: memblk name 87*6e15146eSJoseph Chen * @base: region base 88*6e15146eSJoseph Chen * @size: region size 89*6e15146eSJoseph Chen * 90*6e15146eSJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 91*6e15146eSJoseph Chen */ 92*6e15146eSJoseph Chen void *sysmem_fdt_reserve_alloc_base(const char *name, 93*6e15146eSJoseph Chen phys_addr_t base, phys_size_t size); 94*6e15146eSJoseph Chen 95*6e15146eSJoseph Chen /** 96*6e15146eSJoseph Chen * sysmem_free() - Free allocated sysmem region 97ffa8f8b7SJoseph Chen * 98ffa8f8b7SJoseph Chen * @base: region base 99ffa8f8b7SJoseph Chen * 100ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 101ffa8f8b7SJoseph Chen */ 102ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base); 103ffa8f8b7SJoseph Chen 104ffa8f8b7SJoseph Chen /** 105*6e15146eSJoseph Chen * sysmem_dump() - Dump all sysmem region state and check overflow 106ffa8f8b7SJoseph Chen */ 107ffa8f8b7SJoseph Chen void sysmem_dump(void); 108ffa8f8b7SJoseph Chen 109ffa8f8b7SJoseph Chen /** 110ffa8f8b7SJoseph Chen * board_sysmem_reserve() - Weak function for board to implement 111ffa8f8b7SJoseph Chen * 112ffa8f8b7SJoseph Chen * @sysmem: global sysmem point, ignored 113ffa8f8b7SJoseph Chen * 114ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 115ffa8f8b7SJoseph Chen */ 116ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem); 117*6e15146eSJoseph Chen #else 118*6e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; } 119*6e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; } 120*6e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; } 121*6e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; } 122*6e15146eSJoseph Chen static inline void sysmem_dump(void) {} 123*6e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; } 124*6e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id, 125*6e15146eSJoseph Chen phys_addr_t base, phys_size_t size) 126*6e15146eSJoseph Chen { 127*6e15146eSJoseph Chen return (void *)base; 128*6e15146eSJoseph Chen } 129*6e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name, 130*6e15146eSJoseph Chen phys_addr_t base, 131*6e15146eSJoseph Chen phys_size_t size) 132*6e15146eSJoseph Chen { 133*6e15146eSJoseph Chen return (void *)base; 134*6e15146eSJoseph Chen } 135*6e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name, 136*6e15146eSJoseph Chen phys_addr_t base, 137*6e15146eSJoseph Chen phys_size_t size) 138*6e15146eSJoseph Chen { 139*6e15146eSJoseph Chen return (void *)base; 140*6e15146eSJoseph Chen } 141*6e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */ 142ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */ 143