drivers: mm: Add module for tracking page usage

Adds a module for tracking page usage within a memory bank.

Signed-off-by: Peter Mitsis <peter.mitsis@intel.com>
This commit is contained in:
Peter Mitsis 2023-01-25 21:36:24 -05:00 committed by Fabio Baltieri
commit 87899c07f7
3 changed files with 150 additions and 1 deletions

View file

@ -3,7 +3,7 @@
zephyr_library()
zephyr_include_directories(${ZEPHYR_BASE}/drivers)
zephyr_library_sources(mm_drv_common.c)
zephyr_library_sources(mm_drv_common.c mm_drv_bank.c)
zephyr_library_sources_ifdef(
CONFIG_MM_DRV_INTEL_ADSP_TLB

61
drivers/mm/mm_drv_bank.c Normal file
View file

@ -0,0 +1,61 @@
/*
* Copyright (c) 2023 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief Module for tracking page use within memory banks
*
* The memory management drivers may use the routines within this module
* to track page use within their memory banks. This information in turn
* could be leveraged by them to determine when to power them on or off to
* better conserve energy.
*/
#include <zephyr/kernel.h>
#include <zephyr/drivers/mm/mm_drv_bank.h>
#include <zephyr/sys/mem_stats.h>
void sys_mm_drv_bank_init(struct mem_drv_bank *bank, uint32_t bank_pages)
{
bank->unmapped_pages = bank_pages;
bank->mapped_pages = 0;
bank->max_mapped_pages = 0;
}
uint32_t sys_mm_drv_bank_page_mapped(struct mem_drv_bank *bank)
{
bank->unmapped_pages--;
bank->mapped_pages++;
if (bank->mapped_pages > bank->max_mapped_pages) {
bank->max_mapped_pages = bank->mapped_pages;
}
return bank->mapped_pages;
}
uint32_t sys_mm_drv_bank_page_unmapped(struct mem_drv_bank *bank)
{
bank->unmapped_pages++;
bank->mapped_pages--;
return bank->unmapped_pages;
}
void sys_mm_drv_bank_stats_get(struct mem_drv_bank *bank,
struct sys_memory_stats *stats)
{
stats->free_bytes = bank->unmapped_pages *
CONFIG_MM_DRV_PAGE_SIZE;
stats->allocated_bytes = bank->mapped_pages *
CONFIG_MM_DRV_PAGE_SIZE;
stats->max_allocated_bytes = bank->max_mapped_pages *
CONFIG_MM_DRV_PAGE_SIZE;
}
void sys_mm_drv_bank_stats_reset_max(struct mem_drv_bank *bank)
{
bank->max_mapped_pages = bank->mapped_pages;
}