You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

181 lines
4.1 KiB

/* SPDX-License-Identifier: GPL-2.0+ */
/*
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
*/
#ifndef _SYSMEM_H
#define _SYSMEM_H
#include <memblk.h>
#include <malloc.h>
/*
* CONFIG_SYS_FDT_PAD default value is sync with bootm framework in:
* common/image-fdt.c
*/
#ifndef CONFIG_SYS_FDT_PAD
#define CONFIG_SYS_FDT_PAD 0x3000
#endif
struct sysmem {
struct lmb lmb;
struct list_head allocated_head;
struct list_head kmem_resv_head;
ulong allocated_cnt;
ulong kmem_resv_cnt;
bool has_initf;
bool has_initr;
};
#ifdef CONFIG_SYSMEM
/**
* sysmem_has_init() - Is sysmem initialized
*
* @return true or false
*/
bool sysmem_has_init(void);
/**
* sysmem_init() - Sysmem initialization
*
* @return 0 on success, otherwise error
*/
int sysmem_init(void);
/**
* sysmem_initr() - Sysmem initialization after relocation
*
* @return 0 on success, otherwise error
*/
int sysmem_initr(void);
/**
* sysmem_alloc() - Alloc sysmem region at anywhere
*
* @id: memblk id
* @size: region size
*
* @return NULL on error, otherwise the allocated region address ptr
*/
void *sysmem_alloc(enum memblk_id id, phys_size_t size);
/**
* sysmem_alloc_by_name() - Alloc sysmem region by name at the expect addr
*
* @name: memblk name
* @size: region size
*
* @return NULL on error, otherwise the allocated region address ptr
*/
void *sysmem_alloc_by_name(const char *name, phys_size_t size);
/**
* sysmem_alloc_base() - Alloc sysmem region at the expect addr
*
* @id: memblk id
* @base: region base
* @size: region size
*
* @return NULL on error, otherwise the allocated region address ptr
*/
void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size);
/**
* sysmem_alloc_base_by_name() - Alloc sysmem region at the expect addr by name
*
* @name: memblk name
* @base: region base
* @size: region size
*
* @return NULL on error, otherwise the allocated region address ptr
*/
void *sysmem_alloc_base_by_name(const char *name,
phys_addr_t base, phys_size_t size);
/**
* sysmem_fdt_reserve_alloc_base() - Alloc sysmem region at the expect addr by name,
* called only for reserve memory from fdt.
*
* @name: memblk name
* @base: region base
* @size: region size
*
* @return NULL on error, otherwise the allocated region address ptr
*/
void *sysmem_fdt_reserve_alloc_base(const char *name,
phys_addr_t base, phys_size_t size);
/**
* sysmem_alloc_temporary_mem() - Alloc a temporary shared memory buffer
*
* @size: region size
*
* @return 0 on failed, otherwise allocated addr.
*/
ulong sysmem_alloc_temporary_mem(phys_size_t size);
/**
* sysmem_free() - Free allocated sysmem region
*
* @base: region base
*
* @return 0 on success, otherwise error
*/
int sysmem_free(phys_addr_t base);
/**
* sysmem_dump() - Dump all sysmem region state
*/
void sysmem_dump(void);
/**
* sysmem_overflow_check() - Sysmem regions overflow check
*/
void sysmem_overflow_check(void);
/**
* board_sysmem_reserve() - Weak function for board to implement
*
* @sysmem: global sysmem point, ignored
*
* @return 0 on success, otherwise error
*/
int board_sysmem_reserve(struct sysmem *sysmem);
#else
static inline bool sysmem_has_init(void) { return false; }
static inline int sysmem_init(void) { return 0; }
static inline int sysmem_initr(void) { return 0; }
static inline int sysmem_free(phys_addr_t base) { return 0; }
static inline void sysmem_dump(void) {}
static inline void sysmem_overflow_check(void) {}
__weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; }
static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size)
{
return malloc(size);
}
static inline ulong sysmem_alloc_temporary_mem(phys_size_t size)
{
return 0;
}
static inline void *sysmem_alloc_base(enum memblk_id id,
phys_addr_t base, phys_size_t size)
{
return (void *)base;
}
static inline void *sysmem_alloc_base_by_name(const char *name,
phys_addr_t base,
phys_size_t size)
{
return (void *)base;
}
static inline void *sysmem_fdt_reserve_alloc_base(const char *name,
phys_addr_t base,
phys_size_t size)
{
return (void *)base;
}
#endif /* CONFIG_SYSMEM */
#endif /* _SYSMEM_H */