/* SPDX-License-Identifier: Apache-2.0
 *
 * Copyright (c) 2021 Lexmark International, Inc.
 */

#include <zephyr/kernel.h>
#include <zephyr/arch/arm/mpu/arm_mpu.h>

#define MPUTYPE_READ_ONLY \
	{ \
		.rasr = (P_RO_U_RO_Msk \
				| (7 << MPU_RASR_TEX_Pos) \
				| MPU_RASR_C_Msk \
				| MPU_RASR_B_Msk \
				| MPU_RASR_XN_Msk) \
	}

#define MPUTYPE_READ_ONLY_PRIV \
	{ \
		.rasr = (P_RO_U_RO_Msk \
				| (5 << MPU_RASR_TEX_Pos) \
				| MPU_RASR_B_Msk) \
	}

#define MPUTYPE_PRIV_WBWACACHE_XN \
	{ \
		.rasr = (P_RW_U_NA_Msk \
				| (5 << MPU_RASR_TEX_Pos) \
				| MPU_RASR_B_Msk \
				| MPU_RASR_XN_Msk) \
	}

#define MPUTYPE_PRIV_DEVICE \
	{ \
		.rasr = (P_RW_U_NA_Msk \
				| (2 << MPU_RASR_TEX_Pos)) \
	}

extern uint32_t _image_rom_end_order;
static const struct arm_mpu_region mpu_regions[] = {
	MPU_REGION_ENTRY("FLASH0",
			0xc0000000,
			REGION_32M,
			MPUTYPE_READ_ONLY),

	MPU_REGION_ENTRY("SRAM_PRIV",
			0x00000000,
			REGION_2G,
			MPUTYPE_PRIV_WBWACACHE_XN),

	MPU_REGION_ENTRY("SRAM",
			0x00000000,
			((uint32_t)&_image_rom_end_order),
			MPUTYPE_READ_ONLY_PRIV),

	MPU_REGION_ENTRY("REGISTERS",
			0xf8000000,
			REGION_128M,
			MPUTYPE_PRIV_DEVICE),
};

const struct arm_mpu_config mpu_config = {
	.num_regions = ARRAY_SIZE(mpu_regions),
	.mpu_regions = mpu_regions,
};
