mirror of
https://github.com/apache/nuttx.git
synced 2026-03-23 14:05:12 +08:00
mm/gran: add gran_alloc_align API
for arm-v7a, possible region with 4K and need align with 16K. Signed-off-by: buxiasen <buxiasen@xiaomi.com>
This commit is contained in:
@@ -81,4 +81,51 @@ FAR void *gran_alloc(GRAN_HANDLE handle, size_t size)
|
||||
return (FAR void *)retp;
|
||||
}
|
||||
|
||||
FAR void *gran_alloc_align(GRAN_HANDLE handle, size_t size, size_t align)
|
||||
{
|
||||
FAR gran_t *gran = (FAR gran_t *)handle;
|
||||
uintptr_t retp;
|
||||
size_t nalign;
|
||||
size_t ngran;
|
||||
size_t naligned_up;
|
||||
int posi;
|
||||
int ret;
|
||||
|
||||
DEBUGASSERT(gran);
|
||||
nalign = NGRANULE(gran, align);
|
||||
ngran = NGRANULE(gran, size);
|
||||
|
||||
naligned_up = ngran + (nalign - 1);
|
||||
if (!naligned_up || naligned_up > gran->ngranules)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = gran_enter_critical(gran);
|
||||
if (ret < 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
posi = gran_search(gran, naligned_up);
|
||||
if (posi >= 0)
|
||||
{
|
||||
posi = (posi + nalign - 1) & ~(nalign - 1);
|
||||
gran_set(gran, posi, ngran);
|
||||
}
|
||||
|
||||
gran_leave_critical(gran);
|
||||
if (posi < 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
retp = gran->heapstart + (posi << gran->log2gran);
|
||||
graninfo("heap=%"PRIxPTR" posi=%d retp=%"PRIxPTR" size=%zu n=%zu\n",
|
||||
gran->heapstart, posi, retp, size, ngran);
|
||||
DEBUGASSERT(retp >= gran->heapstart);
|
||||
DEBUGASSERT(retp < gran->heapstart + GRANBYTE(gran));
|
||||
return (FAR void *)retp;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_GRAN */
|
||||
|
||||
@@ -150,6 +150,30 @@ uintptr_t mm_pgalloc(unsigned int npages)
|
||||
return (uintptr_t)gran_alloc(g_pgalloc, (size_t)npages << MM_PGSHIFT);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: mm_pgalloc_align
|
||||
*
|
||||
* Description:
|
||||
* Allocate page memory from the page memory pool.
|
||||
*
|
||||
* Input Parameters:
|
||||
* npages - The number of pages to allocate, each of size CONFIG_MM_PGSIZE.
|
||||
* align - The number of pages to align, each of size CONFIG_MM_PGSIZE.
|
||||
*
|
||||
* Returned Value:
|
||||
* On success, a non-zero, physical address of the allocated page memory
|
||||
* is returned. Zero is returned on failure. NOTE: This is an unmapped
|
||||
* physical address and cannot be used until it is appropriately mapped.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
uintptr_t mm_pgalloc_align(unsigned int npages, unsigned int align)
|
||||
{
|
||||
size_t alloc_size = (size_t)npages << MM_PGSHIFT;
|
||||
size_t align_size = (size_t)align << MM_PGSHIFT;
|
||||
return (uintptr_t)gran_alloc_align(g_pgalloc, alloc_size, align_size);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: mm_pgfree
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user