lib: sysmem: add sysmem_can_alloc() interface
Check if the region can be sysmem allocated. Change-Id: I26a524c1597bee65ab1282da5ec373b9603866ba Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
This commit is contained in:
parent
f6e1530165
commit
3bee194f53
|
|
@ -93,6 +93,16 @@ void *sysmem_alloc_base_by_name(const char *name,
|
||||||
void *sysmem_fdt_reserve_alloc_base(const char *name,
|
void *sysmem_fdt_reserve_alloc_base(const char *name,
|
||||||
phys_addr_t base, phys_size_t size);
|
phys_addr_t base, phys_size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sysmem_can_alloc() - Check if the region can be allocated
|
||||||
|
*
|
||||||
|
* @base: region base
|
||||||
|
* @size: region size
|
||||||
|
*
|
||||||
|
* @return true on okay.
|
||||||
|
*/
|
||||||
|
bool sysmem_can_alloc(phys_size_t base, phys_size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sysmem_free() - Free allocated sysmem region
|
* sysmem_free() - Free allocated sysmem region
|
||||||
*
|
*
|
||||||
|
|
@ -128,6 +138,11 @@ static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size)
|
||||||
return malloc(size);
|
return malloc(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool sysmem_can_alloc(phys_size_t base, phys_size_t size)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void *sysmem_alloc_base(enum memblk_id id,
|
static inline void *sysmem_alloc_base(enum memblk_id id,
|
||||||
phys_addr_t base, phys_size_t size)
|
phys_addr_t base, phys_size_t size)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
34
lib/sysmem.c
34
lib/sysmem.c
|
|
@ -354,7 +354,7 @@ static void *sysmem_alloc_align_base(enum memblk_id id,
|
||||||
name, (ulong)base, (ulong)(base + size),
|
name, (ulong)base, (ulong)(base + size),
|
||||||
(ulong)paddr, (ulong)(paddr + size));
|
(ulong)paddr, (ulong)(paddr + size));
|
||||||
/* Free what we don't want allocated region */
|
/* Free what we don't want allocated region */
|
||||||
if (lmb_free(&sysmem->lmb, paddr, alloc_size))
|
if (lmb_free(&sysmem->lmb, paddr, alloc_size) < 0)
|
||||||
SYSMEM_E("Failed to free \"%s\"\n", name);
|
SYSMEM_E("Failed to free \"%s\"\n", name);
|
||||||
|
|
||||||
goto out;
|
goto out;
|
||||||
|
|
@ -435,6 +435,38 @@ void *sysmem_fdt_reserve_alloc_base(const char *name,
|
||||||
return paddr;
|
return paddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool sysmem_can_alloc(phys_size_t base, phys_size_t size)
|
||||||
|
{
|
||||||
|
struct sysmem *sysmem = &plat_sysmem;
|
||||||
|
phys_addr_t alloc_base;
|
||||||
|
phys_addr_t paddr;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!sysmem_has_init())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* LMB is align down alloc mechanism */
|
||||||
|
alloc_base = base + size;
|
||||||
|
paddr = __lmb_alloc_base(&sysmem->lmb,
|
||||||
|
size,
|
||||||
|
SYSMEM_ALLOC_NO_ALIGN,
|
||||||
|
alloc_base);
|
||||||
|
if (paddr) {
|
||||||
|
/* If free failed, return false */
|
||||||
|
ret = lmb_free(&sysmem->lmb, base, size);
|
||||||
|
if (ret < 0) {
|
||||||
|
SYSMEM_E("Can't free at 0x%08lx - 0x%08lx, ret=%d\n",
|
||||||
|
(ulong)base, (ulong)(base + size), ret);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SYSMEM_D("Can't alloc at 0x%08lx - 0x%08lx\n",
|
||||||
|
(ulong)base, (ulong)(base + size));
|
||||||
|
}
|
||||||
|
|
||||||
|
return (paddr == base) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
int sysmem_free(phys_addr_t base)
|
int sysmem_free(phys_addr_t base)
|
||||||
{
|
{
|
||||||
struct sysmem *sysmem = &plat_sysmem;
|
struct sysmem *sysmem = &plat_sysmem;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue