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:
parent
68008aa9d7
commit
1de87953e6
4 changed files with 113 additions and 0 deletions
|
|
@ -200,6 +200,29 @@ FAR void *gran_reserve(GRAN_HANDLE handle, uintptr_t start, size_t size);
|
||||||
|
|
||||||
FAR void *gran_alloc(GRAN_HANDLE handle, size_t size);
|
FAR void *gran_alloc(GRAN_HANDLE handle, size_t size);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: gran_alloc_align
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Allocate memory from the granule heap.
|
||||||
|
*
|
||||||
|
* NOTE: The current implementation also restricts the maximum allocation
|
||||||
|
* size to 32 granules. That restriction could be eliminated with some
|
||||||
|
* additional coding effort.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* handle - The handle previously returned by gran_initialize
|
||||||
|
* size - The size of the memory region to allocate.
|
||||||
|
* align - The size of the memory region to align.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* On success, a non-NULL pointer to the allocated memory is returned;
|
||||||
|
* NULL is returned on failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
FAR void *gran_alloc_align(GRAN_HANDLE handle, size_t size, size_t align);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: gran_free
|
* Name: gran_free
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -166,6 +166,25 @@ void mm_pgreserve(uintptr_t start, size_t size);
|
||||||
|
|
||||||
uintptr_t mm_pgalloc(unsigned int npages);
|
uintptr_t mm_pgalloc(unsigned int npages);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* 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);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: mm_pgfree
|
* Name: mm_pgfree
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -81,4 +81,51 @@ FAR void *gran_alloc(GRAN_HANDLE handle, size_t size)
|
||||||
return (FAR void *)retp;
|
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 */
|
#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);
|
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
|
* Name: mm_pgfree
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue