blob: fd5c56a47e3b4c149acdec471871197a4dfec2db [file] [log] [blame]
/*
* Copyright (c) 2024 Analog Devices, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/devicetree.h>
#include <zephyr/storage/flash_map.h>
#include <zephyr/arch/arm/cortex_m/arm_mpu_mem_cfg.h>
/*
* Define noncacheable flash region attributes using noncacheable SRAM memory
* attribute index.
*/
#define MAX32_FLASH_NON_CACHEABLE(base, size) \
{ \
.rbar = RO_Msk | NON_SHAREABLE_Msk, \
.mair_idx = MPU_MAIR_INDEX_SRAM_NOCACHE, \
.r_limit = REGION_LIMIT_ADDR(base, size), \
}
#define MAX32_MPU_REGION(name, base, attr, size) MPU_REGION_ENTRY(name, (base), attr((base), size))
/*
* The MPU regions are defined in the following way:
* - Cacheable flash region
* - Non-cacheable flash region, i.e., storage area at the end of the flash
* - SRAM region
* If the storage partition is not defined, the flash region spans the whole
* flash.
*/
static const struct arm_mpu_region mpu_regions[] = {
#if FIXED_PARTITION_EXISTS(storage_partition)
#define STORAGE_ADDR (CONFIG_FLASH_BASE_ADDRESS + FIXED_PARTITION_OFFSET(storage_partition))
#define STORAGE_SIZE (FIXED_PARTITION_SIZE(storage_partition) >> 10)
MAX32_MPU_REGION("FLASH", CONFIG_FLASH_BASE_ADDRESS, REGION_FLASH_ATTR,
KB(CONFIG_FLASH_SIZE - STORAGE_SIZE)),
MAX32_MPU_REGION("STORAGE", STORAGE_ADDR, MAX32_FLASH_NON_CACHEABLE, KB(STORAGE_SIZE)),
#else
MAX32_MPU_REGION("FLASH", CONFIG_FLASH_BASE_ADDRESS, REGION_FLASH_ATTR,
KB(CONFIG_FLASH_SIZE)),
#endif
MAX32_MPU_REGION("SRAM", CONFIG_SRAM_BASE_ADDRESS, REGION_RAM_ATTR, KB(CONFIG_SRAM_SIZE)),
};
const struct arm_mpu_config mpu_config = {
.num_regions = ARRAY_SIZE(mpu_regions),
.mpu_regions = mpu_regions,
};