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; 171d09cf29SJoseph Chen bool fixup; 181d09cf29SJoseph Chen u64 base_u64[MEM_RESV_COUNT]; /* 4GB+ */ 191d09cf29SJoseph Chen u64 size_u64[MEM_RESV_COUNT]; 20483d0493SJoseph Chen }; 21483d0493SJoseph Chen 22*a3320facSJoseph Chen #ifdef CONFIG_BIDRAM 23483d0493SJoseph Chen /** 24483d0493SJoseph Chen * bidram_initr() - Initial bidram after relocation. 25483d0493SJoseph Chen * 26483d0493SJoseph Chen * @return 0 on success, otherwise error 27483d0493SJoseph Chen */ 28483d0493SJoseph Chen int bidram_initr(void); 29483d0493SJoseph Chen 30483d0493SJoseph Chen /** 31483d0493SJoseph Chen * bidram_get_ram_size() - Initial bidram and get ram size. 32483d0493SJoseph Chen * 33483d0493SJoseph Chen * @parse_fn: function to parse ddr memory regions 34483d0493SJoseph Chen * 35483d0493SJoseph Chen * @return ram size, 0 on success, otherwise the effect ram size. 36483d0493SJoseph Chen */ 37483d0493SJoseph Chen phys_size_t bidram_get_ram_size(void); 38483d0493SJoseph Chen 39483d0493SJoseph Chen /** 40483d0493SJoseph Chen * bidram_gen_gd_bi_dram() - Update gd->bd->bi_dram[] according to bidram state. 41483d0493SJoseph Chen */ 42483d0493SJoseph Chen void bidram_gen_gd_bi_dram(void); 43483d0493SJoseph Chen 44483d0493SJoseph Chen /** 45483d0493SJoseph Chen * bidram_reserve() - Reserve bidram region 46483d0493SJoseph Chen * 47483d0493SJoseph Chen * @id: memblk id 48483d0493SJoseph Chen * @base: region base address 49483d0493SJoseph Chen * @size: region size 50483d0493SJoseph Chen * 51483d0493SJoseph Chen * @return 0 on success, otherwise error 52483d0493SJoseph Chen */ 53483d0493SJoseph Chen int bidram_reserve(enum memblk_id id, phys_addr_t base, phys_size_t size); 54483d0493SJoseph Chen 55483d0493SJoseph Chen /** 56483d0493SJoseph Chen * bidram_reserve_by_name() - Reserve bidram region by name 57483d0493SJoseph Chen * 58483d0493SJoseph Chen * @name: region name 59483d0493SJoseph Chen * @base: region base address 60483d0493SJoseph Chen * @size: region size 61483d0493SJoseph Chen * 62483d0493SJoseph Chen * @return 0 on success, otherwise error 63483d0493SJoseph Chen */ 64483d0493SJoseph Chen int bidram_reserve_by_name(const char *name, phys_addr_t base, phys_size_t size); 65483d0493SJoseph Chen 66483d0493SJoseph Chen /** 67483d0493SJoseph Chen * bidram_dump_all() - Dump all bidram stat 68483d0493SJoseph Chen */ 69483d0493SJoseph Chen void bidram_dump(void); 70483d0493SJoseph Chen 71483d0493SJoseph Chen /** 721d09cf29SJoseph Chen * bidram_fixup() - Fixup bi_dram[] for 4GB+ memory 731d09cf29SJoseph Chen * 741d09cf29SJoseph Chen * @return 0 on success, otherwise error 751d09cf29SJoseph Chen */ 761d09cf29SJoseph Chen int bidram_fixup(void); 771d09cf29SJoseph Chen 781d09cf29SJoseph Chen /** 791d09cf29SJoseph Chen * bidram_append_size() - Append 4GB+ memory 801d09cf29SJoseph Chen * 811d09cf29SJoseph Chen * @return 4GB+ size 821d09cf29SJoseph Chen */ 831d09cf29SJoseph Chen u64 bidram_append_size(void); 841d09cf29SJoseph Chen 851d09cf29SJoseph Chen /** 86fc7ff0f0SJoseph Chen * bidram_reserved_is_overlap() - Check outside memory is overlap with reserved 87fc7ff0f0SJoseph Chen * 88fc7ff0f0SJoseph Chen * @base: region base address 89fc7ff0f0SJoseph Chen * @size: region size 90fc7ff0f0SJoseph Chen * 91fc7ff0f0SJoseph Chen * @return memblk struct when overlap, otherwise NULL 92fc7ff0f0SJoseph Chen */ 93fc7ff0f0SJoseph Chen struct memblock *bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size); 94fc7ff0f0SJoseph Chen 95fc7ff0f0SJoseph Chen /** 96483d0493SJoseph Chen * board_bidram_parse_fn() - Weak function for board to implement 97483d0493SJoseph Chen */ 98483d0493SJoseph Chen parse_fn_t board_bidram_parse_fn(void); 99483d0493SJoseph Chen 100483d0493SJoseph Chen /** 101483d0493SJoseph Chen * board_bidram_reserve() - Weak function for board to implement 102483d0493SJoseph Chen * 103483d0493SJoseph Chen * @bidram: global bidram point, ignored 104483d0493SJoseph Chen * 105483d0493SJoseph Chen * @return 0 on success, otherwise error 106483d0493SJoseph Chen */ 107483d0493SJoseph Chen int board_bidram_reserve(struct bidram *bidram); 108*a3320facSJoseph Chen #else 109*a3320facSJoseph Chen static inline int bidram_initr(void) { return 0; } 110*a3320facSJoseph Chen static inline phys_size_t bidram_get_ram_size(void) { return 0; } 111*a3320facSJoseph Chen static inline void bidram_gen_gd_bi_dram(void) { } 112*a3320facSJoseph Chen static inline int bidram_reserve(enum memblk_id id, phys_addr_t base, 113*a3320facSJoseph Chen phys_size_t size) { return 0; } 114*a3320facSJoseph Chen static inline int bidram_reserve_by_name(const char *name, phys_addr_t base, 115*a3320facSJoseph Chen phys_size_t size) { return 0; } 116*a3320facSJoseph Chen static inline void bidram_dump(void) {} 117*a3320facSJoseph Chen static inline int bidram_fixup(void) { return 0; } 118*a3320facSJoseph Chen static inline u64 bidram_append_size(void) { return 0; } 119*a3320facSJoseph Chen static inline parse_fn_t board_bidram_parse_fn(void) { return NULL; } 120*a3320facSJoseph Chen static inline int board_bidram_reserve(struct bidram *bidram) { return 0; } 121*a3320facSJoseph Chen static inline struct memblock * 122*a3320facSJoseph Chen bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size) 123*a3320facSJoseph Chen { 124*a3320facSJoseph Chen return NULL; 125*a3320facSJoseph Chen } 126*a3320facSJoseph Chen 127*a3320facSJoseph Chen #endif 128483d0493SJoseph Chen 129483d0493SJoseph Chen #endif /* _BIDRAM_H */ 130