mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-24 15:31:22 +01:00

This change adds a simple implementation of sbi_aligned_alloc(), for future use in allocating aligned memory for SMMTT tables. Signed-off-by: Gregor Haas <gregorhaas1997@gmail.com> Reviewed-by: Anup Patel <anup@brainfault.org>
102 lines
2.6 KiB
C
102 lines
2.6 KiB
C
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2023 Ventana Micro Systems Inc.
|
|
*
|
|
* Authors:
|
|
* Anup Patel<apatel@ventanamicro.com>
|
|
*/
|
|
|
|
#ifndef __SBI_HEAP_H__
|
|
#define __SBI_HEAP_H__
|
|
|
|
#include <sbi/sbi_types.h>
|
|
|
|
/* Opaque declaration of heap control struct */
|
|
struct sbi_heap_control;
|
|
|
|
/* Global heap control structure */
|
|
extern struct sbi_heap_control global_hpctrl;
|
|
|
|
/* Alignment of heap base address and size */
|
|
#define HEAP_BASE_ALIGN 1024
|
|
|
|
struct sbi_scratch;
|
|
|
|
/** Allocate from heap area */
|
|
void *sbi_malloc_from(struct sbi_heap_control *hpctrl, size_t size);
|
|
|
|
static inline void *sbi_malloc(size_t size)
|
|
{
|
|
return sbi_malloc_from(&global_hpctrl, size);
|
|
}
|
|
|
|
/** Allocate aligned from heap area */
|
|
void *sbi_aligned_alloc_from(struct sbi_heap_control *hpctrl,
|
|
size_t alignment,size_t size);
|
|
|
|
static inline void *sbi_aligned_alloc(size_t alignment, size_t size)
|
|
{
|
|
return sbi_aligned_alloc_from(&global_hpctrl, alignment, size);
|
|
}
|
|
|
|
/** Zero allocate from heap area */
|
|
void *sbi_zalloc_from(struct sbi_heap_control *hpctrl, size_t size);
|
|
|
|
static inline void *sbi_zalloc(size_t size)
|
|
{
|
|
return sbi_zalloc_from(&global_hpctrl, size);
|
|
}
|
|
|
|
/** Allocate array from heap area */
|
|
static inline void *sbi_calloc(size_t nitems, size_t size)
|
|
{
|
|
return sbi_zalloc(nitems * size);
|
|
}
|
|
|
|
static inline void *sbi_calloc_from(struct sbi_heap_control *hpctrl,
|
|
size_t nitems, size_t size)
|
|
{
|
|
return sbi_zalloc_from(hpctrl, nitems * size);
|
|
}
|
|
|
|
/** Free-up to heap area */
|
|
void sbi_free_from(struct sbi_heap_control *hpctrl, void *ptr);
|
|
|
|
static inline void sbi_free(void *ptr)
|
|
{
|
|
return sbi_free_from(&global_hpctrl, ptr);
|
|
}
|
|
|
|
/** Amount (in bytes) of free space in the heap area */
|
|
unsigned long sbi_heap_free_space_from(struct sbi_heap_control *hpctrl);
|
|
|
|
static inline unsigned long sbi_heap_free_space(void)
|
|
{
|
|
return sbi_heap_free_space_from(&global_hpctrl);
|
|
}
|
|
|
|
/** Amount (in bytes) of used space in the heap area */
|
|
unsigned long sbi_heap_used_space_from(struct sbi_heap_control *hpctrl);
|
|
|
|
static inline unsigned long sbi_heap_used_space(void)
|
|
{
|
|
return sbi_heap_used_space_from(&global_hpctrl);
|
|
}
|
|
|
|
/** Amount (in bytes) of reserved space in the heap area */
|
|
unsigned long sbi_heap_reserved_space_from(struct sbi_heap_control *hpctrl);
|
|
|
|
static inline unsigned long sbi_heap_reserved_space(void)
|
|
{
|
|
return sbi_heap_reserved_space_from(&global_hpctrl);
|
|
}
|
|
|
|
/** Initialize heap area */
|
|
int sbi_heap_init(struct sbi_scratch *scratch);
|
|
int sbi_heap_init_new(struct sbi_heap_control *hpctrl, unsigned long base,
|
|
unsigned long size);
|
|
int sbi_heap_alloc_new(struct sbi_heap_control **hpctrl);
|
|
|
|
#endif
|