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:
Joseph Chen 2019-05-07 18:45:08 +08:00
parent f6e1530165
commit 3bee194f53
2 changed files with 48 additions and 1 deletions

View File

@ -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)
{ {

View File

@ -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;