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 9ffa8f8b7SJoseph Chen #include <asm/types.h> 10ffa8f8b7SJoseph Chen 11ffa8f8b7SJoseph Chen #define MAX_SYSMEM_REGIONS 64 12ffa8f8b7SJoseph Chen 13ffa8f8b7SJoseph Chen #undef MAX_LMB_REGIONS 14ffa8f8b7SJoseph Chen #define MAX_LMB_REGIONS MAX_SYSMEM_REGIONS 15ffa8f8b7SJoseph Chen 16*2c9d1179SJoseph Chen /* 17*2c9d1179SJoseph Chen * CONFIG_SYS_FDT_PAD default value is sync with bootm framework in: 18*2c9d1179SJoseph Chen * common/image-fdt.c 19*2c9d1179SJoseph Chen */ 20*2c9d1179SJoseph Chen #ifndef CONFIG_SYS_FDT_PAD 21*2c9d1179SJoseph Chen #define CONFIG_SYS_FDT_PAD 0x3000 22*2c9d1179SJoseph Chen #endif 23*2c9d1179SJoseph Chen 24ffa8f8b7SJoseph Chen struct sysmem_property { 25ffa8f8b7SJoseph Chen const char *name; 26ffa8f8b7SJoseph Chen phys_addr_t base; 27ffa8f8b7SJoseph Chen phys_size_t size; 28ffa8f8b7SJoseph Chen struct list_head node; 29ffa8f8b7SJoseph Chen }; 30ffa8f8b7SJoseph Chen 31ffa8f8b7SJoseph Chen struct sysmem { 32ffa8f8b7SJoseph Chen struct lmb lmb; 33ffa8f8b7SJoseph Chen struct list_head allocated_head; 34ffa8f8b7SJoseph Chen struct list_head reserved_head; 35ffa8f8b7SJoseph Chen ulong allocated_cnt; 36ffa8f8b7SJoseph Chen bool has_init; 37ffa8f8b7SJoseph Chen }; 38ffa8f8b7SJoseph Chen 39ffa8f8b7SJoseph Chen /** 40ffa8f8b7SJoseph Chen * sysmem_init() - Sysmem initialization 41ffa8f8b7SJoseph Chen * 42ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 43ffa8f8b7SJoseph Chen */ 44ffa8f8b7SJoseph Chen int sysmem_init(void); 45ffa8f8b7SJoseph Chen 46ffa8f8b7SJoseph Chen /** 47ffa8f8b7SJoseph Chen * sysmem_add() - Add sysmem region 48ffa8f8b7SJoseph Chen * 49ffa8f8b7SJoseph Chen * @base: region base address 50ffa8f8b7SJoseph Chen * @size: region size 51ffa8f8b7SJoseph Chen * 52ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 53ffa8f8b7SJoseph Chen */ 54ffa8f8b7SJoseph Chen int sysmem_add(phys_addr_t base, phys_size_t size); 55ffa8f8b7SJoseph Chen 56ffa8f8b7SJoseph Chen /** 57ffa8f8b7SJoseph Chen * sysmem_reserve() - Reserve sysmem region 58ffa8f8b7SJoseph Chen * 59ffa8f8b7SJoseph Chen * @name: region name 60ffa8f8b7SJoseph Chen * @base: region base address 61ffa8f8b7SJoseph Chen * @size: region size 62ffa8f8b7SJoseph Chen * 63ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 64ffa8f8b7SJoseph Chen */ 65ffa8f8b7SJoseph Chen int sysmem_reserve(const char *name, phys_addr_t base, phys_size_t size); 66ffa8f8b7SJoseph Chen 67ffa8f8b7SJoseph Chen /** 68ffa8f8b7SJoseph Chen * sysmem_alloc() - Alloc sysmem region at anywhere 69ffa8f8b7SJoseph Chen * 70ffa8f8b7SJoseph Chen * @name: region name 71ffa8f8b7SJoseph Chen * @size: region size 72ffa8f8b7SJoseph Chen * 73ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 74ffa8f8b7SJoseph Chen */ 75ffa8f8b7SJoseph Chen void *sysmem_alloc(const char *name, phys_size_t size); 76ffa8f8b7SJoseph Chen 77ffa8f8b7SJoseph Chen /** 78ffa8f8b7SJoseph Chen * sysmem_alloc_align() - Alloc sysmem region at anywhere with addr align down 79ffa8f8b7SJoseph Chen * 80ffa8f8b7SJoseph Chen * @name: region name 81ffa8f8b7SJoseph Chen * @size: region size 82ffa8f8b7SJoseph Chen * @align: region base address align (down) 83ffa8f8b7SJoseph Chen * 84ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 85ffa8f8b7SJoseph Chen */ 86ffa8f8b7SJoseph Chen void *sysmem_alloc_align(const char *name, phys_size_t size, ulong align); 87ffa8f8b7SJoseph Chen 88ffa8f8b7SJoseph Chen /** 89ffa8f8b7SJoseph Chen * sysmem_alloc_base() - Alloc sysmem region at the expect addr 90ffa8f8b7SJoseph Chen * 91ffa8f8b7SJoseph Chen * @name: region name 92ffa8f8b7SJoseph Chen * @base: region base 93ffa8f8b7SJoseph Chen * @size: region size 94ffa8f8b7SJoseph Chen * 95ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 96ffa8f8b7SJoseph Chen */ 97ffa8f8b7SJoseph Chen void *sysmem_alloc_base(const char *name, phys_addr_t base, phys_size_t size); 98ffa8f8b7SJoseph Chen 99ffa8f8b7SJoseph Chen /** 100ffa8f8b7SJoseph Chen * sysmem_alloc_align_base() - Alloc sysmem region at the expect addr with align down 101ffa8f8b7SJoseph Chen * 102ffa8f8b7SJoseph Chen * @name: region name 103ffa8f8b7SJoseph Chen * @base: region base 104ffa8f8b7SJoseph Chen * @size: region size 105ffa8f8b7SJoseph Chen * @align: region base address align (down) 106ffa8f8b7SJoseph Chen * 107ffa8f8b7SJoseph Chen * @return NULL on error, otherwise the allocated region address ptr 108ffa8f8b7SJoseph Chen */ 109ffa8f8b7SJoseph Chen void *sysmem_alloc_align_base(const char *name, phys_addr_t base, 110ffa8f8b7SJoseph Chen phys_size_t size, ulong align); 111ffa8f8b7SJoseph Chen 112ffa8f8b7SJoseph Chen /** 113ffa8f8b7SJoseph Chen * sysmem_free() - Free sysmem region 114ffa8f8b7SJoseph Chen * 115ffa8f8b7SJoseph Chen * @base: region base 116ffa8f8b7SJoseph Chen * 117ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 118ffa8f8b7SJoseph Chen */ 119ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base); 120ffa8f8b7SJoseph Chen 121ffa8f8b7SJoseph Chen /** 122ffa8f8b7SJoseph Chen * sysmem_check() - Check sysmem regions 123ffa8f8b7SJoseph Chen * 124ffa8f8b7SJoseph Chen * @return 0 on okay, otherwise something wrong 125ffa8f8b7SJoseph Chen */ 126ffa8f8b7SJoseph Chen int sysmem_check(void); 127ffa8f8b7SJoseph Chen 128ffa8f8b7SJoseph Chen /** 129ffa8f8b7SJoseph Chen * sysmem_dump_all() - Dump all sysmem stat 130ffa8f8b7SJoseph Chen */ 131ffa8f8b7SJoseph Chen void sysmem_dump(void); 132ffa8f8b7SJoseph Chen 133ffa8f8b7SJoseph Chen /** 134ffa8f8b7SJoseph Chen * sysmem_dump_check() - Dump all sysmem stat and check overflow 135ffa8f8b7SJoseph Chen */ 136ffa8f8b7SJoseph Chen int sysmem_dump_check(void); 137ffa8f8b7SJoseph Chen 138ffa8f8b7SJoseph Chen /** 139ffa8f8b7SJoseph Chen * board_sysmem_reserve() - Weak function for board to implement 140ffa8f8b7SJoseph Chen * 141ffa8f8b7SJoseph Chen * @sysmem: global sysmem point, ignored 142ffa8f8b7SJoseph Chen * 143ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 144ffa8f8b7SJoseph Chen */ 145ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem); 146ffa8f8b7SJoseph Chen 147ffa8f8b7SJoseph Chen /** 148ffa8f8b7SJoseph Chen * arch_sysmem_reserve() - Weak function for arch to implement 149ffa8f8b7SJoseph Chen * 150ffa8f8b7SJoseph Chen * @sysmem: global sysmem point, ignored 151ffa8f8b7SJoseph Chen * 152ffa8f8b7SJoseph Chen * @return 0 on success, otherwise error 153ffa8f8b7SJoseph Chen */ 154ffa8f8b7SJoseph Chen int arch_sysmem_reserve(struct sysmem *sysmem); 155ffa8f8b7SJoseph Chen 156ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */ 157