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 22a3320facSJoseph 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 /** 79*82a88d5eSXuhui Lin * board_bidram_fixup() - Fixup bi_dram[] based on Soc boards. 80*82a88d5eSXuhui Lin */ 81*82a88d5eSXuhui Lin void board_bidram_fixup(void); 82*82a88d5eSXuhui Lin 83*82a88d5eSXuhui Lin /** 841d09cf29SJoseph Chen * bidram_append_size() - Append 4GB+ memory 851d09cf29SJoseph Chen * 861d09cf29SJoseph Chen * @return 4GB+ size 871d09cf29SJoseph Chen */ 881d09cf29SJoseph Chen u64 bidram_append_size(void); 891d09cf29SJoseph Chen 901d09cf29SJoseph Chen /** 91fc7ff0f0SJoseph Chen * bidram_reserved_is_overlap() - Check outside memory is overlap with reserved 92fc7ff0f0SJoseph Chen * 93fc7ff0f0SJoseph Chen * @base: region base address 94fc7ff0f0SJoseph Chen * @size: region size 95fc7ff0f0SJoseph Chen * 96fc7ff0f0SJoseph Chen * @return memblk struct when overlap, otherwise NULL 97fc7ff0f0SJoseph Chen */ 98fc7ff0f0SJoseph Chen struct memblock *bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size); 99fc7ff0f0SJoseph Chen 100fc7ff0f0SJoseph Chen /** 101483d0493SJoseph Chen * board_bidram_parse_fn() - Weak function for board to implement 102483d0493SJoseph Chen */ 103483d0493SJoseph Chen parse_fn_t board_bidram_parse_fn(void); 104483d0493SJoseph Chen 105483d0493SJoseph Chen /** 106483d0493SJoseph Chen * board_bidram_reserve() - Weak function for board to implement 107483d0493SJoseph Chen * 108483d0493SJoseph Chen * @bidram: global bidram point, ignored 109483d0493SJoseph Chen * 110483d0493SJoseph Chen * @return 0 on success, otherwise error 111483d0493SJoseph Chen */ 112483d0493SJoseph Chen int board_bidram_reserve(struct bidram *bidram); 113a3320facSJoseph Chen #else 114a3320facSJoseph Chen static inline int bidram_initr(void) { return 0; } 115a3320facSJoseph Chen static inline phys_size_t bidram_get_ram_size(void) { return 0; } 116a3320facSJoseph Chen static inline void bidram_gen_gd_bi_dram(void) { } 117a3320facSJoseph Chen static inline int bidram_reserve(enum memblk_id id, phys_addr_t base, 118a3320facSJoseph Chen phys_size_t size) { return 0; } 119a3320facSJoseph Chen static inline int bidram_reserve_by_name(const char *name, phys_addr_t base, 120a3320facSJoseph Chen phys_size_t size) { return 0; } 121a3320facSJoseph Chen static inline void bidram_dump(void) {} 122a3320facSJoseph Chen static inline int bidram_fixup(void) { return 0; } 123a3320facSJoseph Chen static inline u64 bidram_append_size(void) { return 0; } 124a3320facSJoseph Chen static inline parse_fn_t board_bidram_parse_fn(void) { return NULL; } 125a3320facSJoseph Chen static inline int board_bidram_reserve(struct bidram *bidram) { return 0; } 126a3320facSJoseph Chen static inline struct memblock * 127a3320facSJoseph Chen bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size) 128a3320facSJoseph Chen { 129a3320facSJoseph Chen return NULL; 130a3320facSJoseph Chen } 131a3320facSJoseph Chen 132a3320facSJoseph Chen #endif 133483d0493SJoseph Chen 134483d0493SJoseph Chen #endif /* _BIDRAM_H */ 135