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; 17483d0493SJoseph Chen }; 18483d0493SJoseph Chen 19483d0493SJoseph Chen /** 20483d0493SJoseph Chen * bidram_initr() - Initial bidram after relocation. 21483d0493SJoseph Chen * 22483d0493SJoseph Chen * @return 0 on success, otherwise error 23483d0493SJoseph Chen */ 24483d0493SJoseph Chen int bidram_initr(void); 25483d0493SJoseph Chen 26483d0493SJoseph Chen /** 27483d0493SJoseph Chen * bidram_get_ram_size() - Initial bidram and get ram size. 28483d0493SJoseph Chen * 29483d0493SJoseph Chen * @parse_fn: function to parse ddr memory regions 30483d0493SJoseph Chen * 31483d0493SJoseph Chen * @return ram size, 0 on success, otherwise the effect ram size. 32483d0493SJoseph Chen */ 33483d0493SJoseph Chen phys_size_t bidram_get_ram_size(void); 34483d0493SJoseph Chen 35483d0493SJoseph Chen /** 36483d0493SJoseph Chen * bidram_gen_gd_bi_dram() - Update gd->bd->bi_dram[] according to bidram state. 37483d0493SJoseph Chen */ 38483d0493SJoseph Chen void bidram_gen_gd_bi_dram(void); 39483d0493SJoseph Chen 40483d0493SJoseph Chen /** 41483d0493SJoseph Chen * bidram_reserve() - Reserve bidram region 42483d0493SJoseph Chen * 43483d0493SJoseph Chen * @id: memblk id 44483d0493SJoseph Chen * @base: region base address 45483d0493SJoseph Chen * @size: region size 46483d0493SJoseph Chen * 47483d0493SJoseph Chen * @return 0 on success, otherwise error 48483d0493SJoseph Chen */ 49483d0493SJoseph Chen int bidram_reserve(enum memblk_id id, phys_addr_t base, phys_size_t size); 50483d0493SJoseph Chen 51483d0493SJoseph Chen /** 52483d0493SJoseph Chen * bidram_reserve_by_name() - Reserve bidram region by name 53483d0493SJoseph Chen * 54483d0493SJoseph Chen * @name: region name 55483d0493SJoseph Chen * @base: region base address 56483d0493SJoseph Chen * @size: region size 57483d0493SJoseph Chen * 58483d0493SJoseph Chen * @return 0 on success, otherwise error 59483d0493SJoseph Chen */ 60483d0493SJoseph Chen int bidram_reserve_by_name(const char *name, phys_addr_t base, phys_size_t size); 61483d0493SJoseph Chen 62483d0493SJoseph Chen /** 63483d0493SJoseph Chen * bidram_dump_all() - Dump all bidram stat 64483d0493SJoseph Chen */ 65483d0493SJoseph Chen void bidram_dump(void); 66483d0493SJoseph Chen 67483d0493SJoseph Chen /** 68*fc7ff0f0SJoseph Chen * bidram_reserved_is_overlap() - Check outside memory is overlap with reserved 69*fc7ff0f0SJoseph Chen * 70*fc7ff0f0SJoseph Chen * @base: region base address 71*fc7ff0f0SJoseph Chen * @size: region size 72*fc7ff0f0SJoseph Chen * 73*fc7ff0f0SJoseph Chen * @return memblk struct when overlap, otherwise NULL 74*fc7ff0f0SJoseph Chen */ 75*fc7ff0f0SJoseph Chen struct memblock *bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size); 76*fc7ff0f0SJoseph Chen 77*fc7ff0f0SJoseph Chen /** 78483d0493SJoseph Chen * board_bidram_parse_fn() - Weak function for board to implement 79483d0493SJoseph Chen */ 80483d0493SJoseph Chen parse_fn_t board_bidram_parse_fn(void); 81483d0493SJoseph Chen 82483d0493SJoseph Chen /** 83483d0493SJoseph Chen * board_bidram_reserve() - Weak function for board to implement 84483d0493SJoseph Chen * 85483d0493SJoseph Chen * @bidram: global bidram point, ignored 86483d0493SJoseph Chen * 87483d0493SJoseph Chen * @return 0 on success, otherwise error 88483d0493SJoseph Chen */ 89483d0493SJoseph Chen int board_bidram_reserve(struct bidram *bidram); 90483d0493SJoseph Chen 91483d0493SJoseph Chen #endif /* _BIDRAM_H */ 92