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