rt-thread/components/mm/mm_memblock.h

96 lines
2.6 KiB
C

/*
* Copyright (c) 2006-2023, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-09-07 zmshahaha the first version
*/
#ifndef __MM_MEMBLOCK_H__
#define __MM_MEMBLOCK_H__
#include "mm_page.h"
#include <rtdef.h>
enum mmblk_flag
{
MEMBLOCK_NONE = 0x0, /**< normal region */
MEMBLOCK_HOTPLUG = 0x1, /**< hotpluggable region */
MEMBLOCK_NOMAP = 0x2, /**< don't add to kernel direct mapping */
};
typedef rt_uint32_t mmblk_flag_t;
/**
* @struct rt_mmblk_reg
*
* @brief A structure representing a region in rt_memblock
*/
struct rt_mmblk_reg
{
rt_region_t memreg; /**< used to indicate the extent of this area */
mmblk_flag_t flags; /**< the flag of the region */
rt_bool_t alloc; /**< is the node allocated */
rt_slist_t node; /**< hook on rt_memblock */
};
/**
* @struct rt_memblock
*
* @brief A structure representing physical memory block
*/
struct rt_memblock
{
rt_slist_t reg_list; /**< store the regions of the memory block */
};
/**
* @brief Add a physical address range to the overall memory region
*
* @note The newly added region is strictly prohibited from overlapping with existing regions.
*
* @param name the name of the region
* @param start the beginning of the physical address range
* @param end the size of the physical address range
* @param flags the flags of the region
*/
rt_err_t rt_memblock_add_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags);
/**
* @brief Add a physical address range to the reserved memory region
*
* @note The newly added region is strictly prohibited from overlapping with existing regions.
*
* @param name the name of the reseved region
* @param start the beginning of the physical address range
* @param end the size of the physical address range
* @param flags the flags of the region
*/
rt_err_t rt_memblock_reserve_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags);
/**
* @brief To conclude the management of memory by the memblock.
*
* @note This function will free all usable to buddy system and map all memory without
* specified MEMBLOCK_NOMAP.
*/
void rt_memblock_setup_memory_environment(void);
/**
* @brief Get the memory memblock.
*
* @return Overall memory memblock.
*/
struct rt_memblock *rt_memblock_get_memory(void);
/**
* @brief Get the reserved memory memblock.
*
* @return Reserved memory memblock.
*/
struct rt_memblock *rt_memblock_get_reserved(void);
#endif /* __MM_MEMBLOCK_H__ */