1483d0493SJoseph Chen /* SPDX-License-Identifier: GPL-2.0+ */ 2483d0493SJoseph Chen /* 3483d0493SJoseph Chen * (C) Copyright 2019 Rockchip Electronics Co., Ltd 4483d0493SJoseph Chen */ 5483d0493SJoseph Chen 6483d0493SJoseph Chen #ifndef _BIDRAM_H 7483d0493SJoseph Chen #define _BIDRAM_H 8483d0493SJoseph Chen 9483d0493SJoseph Chen #include <memblk.h> 10483d0493SJoseph Chen 11483d0493SJoseph Chen typedef struct memblock *(*parse_fn_t)(int *); 12483d0493SJoseph Chen 13483d0493SJoseph Chen struct bidram { 14483d0493SJoseph Chen struct lmb lmb; 15483d0493SJoseph Chen struct list_head reserved_head; 16483d0493SJoseph Chen bool has_init; 17*1d09cf29SJoseph Chen bool fixup; 18*1d09cf29SJoseph Chen u64 base_u64[MEM_RESV_COUNT]; /* 4GB+ */ 19*1d09cf29SJoseph Chen u64 size_u64[MEM_RESV_COUNT]; 20483d0493SJoseph Chen }; 21483d0493SJoseph Chen 22483d0493SJoseph Chen /** 23483d0493SJoseph Chen * bidram_initr() - Initial bidram after relocation. 24483d0493SJoseph Chen * 25483d0493SJoseph Chen * @return 0 on success, otherwise error 26483d0493SJoseph Chen */ 27483d0493SJoseph Chen int bidram_initr(void); 28483d0493SJoseph Chen 29483d0493SJoseph Chen /** 30483d0493SJoseph Chen * bidram_get_ram_size() - Initial bidram and get ram size. 31483d0493SJoseph Chen * 32483d0493SJoseph Chen * @parse_fn: function to parse ddr memory regions 33483d0493SJoseph Chen * 34483d0493SJoseph Chen * @return ram size, 0 on success, otherwise the effect ram size. 35483d0493SJoseph Chen */ 36483d0493SJoseph Chen phys_size_t bidram_get_ram_size(void); 37483d0493SJoseph Chen 38483d0493SJoseph Chen /** 39483d0493SJoseph Chen * bidram_gen_gd_bi_dram() - Update gd->bd->bi_dram[] according to bidram state. 40483d0493SJoseph Chen */ 41483d0493SJoseph Chen void bidram_gen_gd_bi_dram(void); 42483d0493SJoseph Chen 43483d0493SJoseph Chen /** 44483d0493SJoseph Chen * bidram_reserve() - Reserve bidram region 45483d0493SJoseph Chen * 46483d0493SJoseph Chen * @id: memblk id 47483d0493SJoseph Chen * @base: region base address 48483d0493SJoseph Chen * @size: region size 49483d0493SJoseph Chen * 50483d0493SJoseph Chen * @return 0 on success, otherwise error 51483d0493SJoseph Chen */ 52483d0493SJoseph Chen int bidram_reserve(enum memblk_id id, phys_addr_t base, phys_size_t size); 53483d0493SJoseph Chen 54483d0493SJoseph Chen /** 55483d0493SJoseph Chen * bidram_reserve_by_name() - Reserve bidram region by name 56483d0493SJoseph Chen * 57483d0493SJoseph Chen * @name: region name 58483d0493SJoseph Chen * @base: region base address 59483d0493SJoseph Chen * @size: region size 60483d0493SJoseph Chen * 61483d0493SJoseph Chen * @return 0 on success, otherwise error 62483d0493SJoseph Chen */ 63483d0493SJoseph Chen int bidram_reserve_by_name(const char *name, phys_addr_t base, phys_size_t size); 64483d0493SJoseph Chen 65483d0493SJoseph Chen /** 66483d0493SJoseph Chen * bidram_dump_all() - Dump all bidram stat 67483d0493SJoseph Chen */ 68483d0493SJoseph Chen void bidram_dump(void); 69483d0493SJoseph Chen 70483d0493SJoseph Chen /** 71*1d09cf29SJoseph Chen * bidram_fixup() - Fixup bi_dram[] for 4GB+ memory 72*1d09cf29SJoseph Chen * 73*1d09cf29SJoseph Chen * @return 0 on success, otherwise error 74*1d09cf29SJoseph Chen */ 75*1d09cf29SJoseph Chen int bidram_fixup(void); 76*1d09cf29SJoseph Chen 77*1d09cf29SJoseph Chen /** 78*1d09cf29SJoseph Chen * bidram_append_size() - Append 4GB+ memory 79*1d09cf29SJoseph Chen * 80*1d09cf29SJoseph Chen * @return 4GB+ size 81*1d09cf29SJoseph Chen */ 82*1d09cf29SJoseph Chen u64 bidram_append_size(void); 83*1d09cf29SJoseph Chen 84*1d09cf29SJoseph Chen /** 85fc7ff0f0SJoseph Chen * bidram_reserved_is_overlap() - Check outside memory is overlap with reserved 86fc7ff0f0SJoseph Chen * 87fc7ff0f0SJoseph Chen * @base: region base address 88fc7ff0f0SJoseph Chen * @size: region size 89fc7ff0f0SJoseph Chen * 90fc7ff0f0SJoseph Chen * @return memblk struct when overlap, otherwise NULL 91fc7ff0f0SJoseph Chen */ 92fc7ff0f0SJoseph Chen struct memblock *bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size); 93fc7ff0f0SJoseph Chen 94fc7ff0f0SJoseph Chen /** 95483d0493SJoseph Chen * board_bidram_parse_fn() - Weak function for board to implement 96483d0493SJoseph Chen */ 97483d0493SJoseph Chen parse_fn_t board_bidram_parse_fn(void); 98483d0493SJoseph Chen 99483d0493SJoseph Chen /** 100483d0493SJoseph Chen * board_bidram_reserve() - Weak function for board to implement 101483d0493SJoseph Chen * 102483d0493SJoseph Chen * @bidram: global bidram point, ignored 103483d0493SJoseph Chen * 104483d0493SJoseph Chen * @return 0 on success, otherwise error 105483d0493SJoseph Chen */ 106483d0493SJoseph Chen int board_bidram_reserve(struct bidram *bidram); 107483d0493SJoseph Chen 108483d0493SJoseph Chen #endif /* _BIDRAM_H */ 109