From 7e646b56a10f7eb14ba8943a4cb015ad1ee43773 Mon Sep 17 00:00:00 2001 From: Daniel DeGrasse Date: Mon, 17 Jul 2023 17:58:40 -0500 Subject: [PATCH] soc: arm: nxp_imx: rt: enable SOC fixed MPU regions, add SDRAM0 region Enable SOC fixed MPU regions by default for the RT10xx/RT11xx SOC lines. Additionally, add code to handle defining the SDRAM0 region as device type (non cacheable, non shareable). This behavior can be disabled with CONFIG_NXP_IMX_EXTERNAL_SDRAM=y. Set this Kconfig for all boards in tree using SDRAM. This will resolve an issue present on the RT11xx series where the core may execute speculative prefetches to the SDRAM region when no SDRAM is present on the board, resulting in the system faulting. Signed-off-by: Daniel DeGrasse --- boards/arm/mimxrt1020_evk/Kconfig.defconfig | 3 +++ boards/arm/mimxrt1024_evk/Kconfig.defconfig | 3 +++ boards/arm/mimxrt1040_evk/Kconfig.defconfig | 3 +++ boards/arm/mimxrt1050_evk/Kconfig.defconfig | 3 +++ boards/arm/mimxrt1060_evk/Kconfig.defconfig | 3 +++ boards/arm/mimxrt1062_fmurt6/Kconfig.defconfig | 3 +++ boards/arm/mimxrt1064_evk/Kconfig.defconfig | 3 +++ boards/arm/mimxrt1160_evk/Kconfig.defconfig | 3 +++ boards/arm/mimxrt1170_evk/Kconfig.defconfig | 3 +++ boards/arm/mm_feather/Kconfig.defconfig | 3 +++ boards/arm/mm_swiftio/Kconfig.defconfig | 3 +++ doc/releases/release-notes-3.5.rst | 1 + soc/arm/nxp_imx/rt/CMakeLists.txt | 4 ++-- soc/arm/nxp_imx/rt/Kconfig.series | 3 ++- soc/arm/nxp_imx/rt/Kconfig.soc | 8 ++++++++ soc/arm/nxp_imx/rt/mpu_regions.c | 16 +++++++++++++++- 16 files changed, 61 insertions(+), 4 deletions(-) diff --git a/boards/arm/mimxrt1020_evk/Kconfig.defconfig b/boards/arm/mimxrt1020_evk/Kconfig.defconfig index a9524ed455f..4ecf9c39c1d 100644 --- a/boards/arm/mimxrt1020_evk/Kconfig.defconfig +++ b/boards/arm/mimxrt1020_evk/Kconfig.defconfig @@ -15,6 +15,9 @@ endchoice config DEVICE_CONFIGURATION_DATA default y +config NXP_IMX_EXTERNAL_SDRAM + default y + if NETWORKING config NET_L2_ETHERNET diff --git a/boards/arm/mimxrt1024_evk/Kconfig.defconfig b/boards/arm/mimxrt1024_evk/Kconfig.defconfig index 26f5e06810a..704743ded71 100644 --- a/boards/arm/mimxrt1024_evk/Kconfig.defconfig +++ b/boards/arm/mimxrt1024_evk/Kconfig.defconfig @@ -15,6 +15,9 @@ endchoice config DEVICE_CONFIGURATION_DATA default y +config NXP_IMX_EXTERNAL_SDRAM + default y + config I2C_MCUX_LPI2C_BUS_RECOVERY default y depends on I2C_MCUX_LPI2C && PINCTRL diff --git a/boards/arm/mimxrt1040_evk/Kconfig.defconfig b/boards/arm/mimxrt1040_evk/Kconfig.defconfig index c9adb66fc31..683da9279ed 100644 --- a/boards/arm/mimxrt1040_evk/Kconfig.defconfig +++ b/boards/arm/mimxrt1040_evk/Kconfig.defconfig @@ -13,4 +13,7 @@ endchoice config DEVICE_CONFIGURATION_DATA default y +config NXP_IMX_EXTERNAL_SDRAM + default y + endif # BOARD_MIMXRT1040_EVK diff --git a/boards/arm/mimxrt1050_evk/Kconfig.defconfig b/boards/arm/mimxrt1050_evk/Kconfig.defconfig index dc245ececa1..f59f3de75c3 100644 --- a/boards/arm/mimxrt1050_evk/Kconfig.defconfig +++ b/boards/arm/mimxrt1050_evk/Kconfig.defconfig @@ -16,6 +16,9 @@ endchoice config DEVICE_CONFIGURATION_DATA default y +config NXP_IMX_EXTERNAL_SDRAM + default y + if FLASH config FLASH_MCUX_FLEXSPI_HYPERFLASH diff --git a/boards/arm/mimxrt1060_evk/Kconfig.defconfig b/boards/arm/mimxrt1060_evk/Kconfig.defconfig index 332a0b758b2..c0116651515 100644 --- a/boards/arm/mimxrt1060_evk/Kconfig.defconfig +++ b/boards/arm/mimxrt1060_evk/Kconfig.defconfig @@ -17,6 +17,9 @@ endchoice config DEVICE_CONFIGURATION_DATA default y +config NXP_IMX_EXTERNAL_SDRAM + default y + if FLASH config FLASH_MCUX_FLEXSPI_NOR diff --git a/boards/arm/mimxrt1062_fmurt6/Kconfig.defconfig b/boards/arm/mimxrt1062_fmurt6/Kconfig.defconfig index ea12512b60e..8e349eb07ed 100644 --- a/boards/arm/mimxrt1062_fmurt6/Kconfig.defconfig +++ b/boards/arm/mimxrt1062_fmurt6/Kconfig.defconfig @@ -15,6 +15,9 @@ endchoice config DEVICE_CONFIGURATION_DATA default y +config NXP_IMX_EXTERNAL_SDRAM + default y + if NETWORKING config NET_L2_ETHERNET diff --git a/boards/arm/mimxrt1064_evk/Kconfig.defconfig b/boards/arm/mimxrt1064_evk/Kconfig.defconfig index 18e70a2ce53..8a574dc2f0e 100644 --- a/boards/arm/mimxrt1064_evk/Kconfig.defconfig +++ b/boards/arm/mimxrt1064_evk/Kconfig.defconfig @@ -15,6 +15,9 @@ endchoice config DEVICE_CONFIGURATION_DATA default y +config NXP_IMX_EXTERNAL_SDRAM + default y + config KSCAN default y if LVGL diff --git a/boards/arm/mimxrt1160_evk/Kconfig.defconfig b/boards/arm/mimxrt1160_evk/Kconfig.defconfig index b3525cf5114..9f7f09e84c2 100644 --- a/boards/arm/mimxrt1160_evk/Kconfig.defconfig +++ b/boards/arm/mimxrt1160_evk/Kconfig.defconfig @@ -19,6 +19,9 @@ endchoice config DEVICE_CONFIGURATION_DATA default y if CPU_CORTEX_M7 +config NXP_IMX_EXTERNAL_SDRAM + default y if CPU_CORTEX_M7 + if SECOND_CORE_MCUX && BOARD_MIMXRT1160_EVK_CM4 config BUILD_OUTPUT_INFO_HEADER diff --git a/boards/arm/mimxrt1170_evk/Kconfig.defconfig b/boards/arm/mimxrt1170_evk/Kconfig.defconfig index 3c8c1d57885..867999f701c 100644 --- a/boards/arm/mimxrt1170_evk/Kconfig.defconfig +++ b/boards/arm/mimxrt1170_evk/Kconfig.defconfig @@ -22,6 +22,9 @@ endchoice config DEVICE_CONFIGURATION_DATA default y if CPU_CORTEX_M7 +config NXP_IMX_EXTERNAL_SDRAM + default y if CPU_CORTEX_M7 + if SECOND_CORE_MCUX && CPU_CORTEX_M4 config BUILD_OUTPUT_INFO_HEADER diff --git a/boards/arm/mm_feather/Kconfig.defconfig b/boards/arm/mm_feather/Kconfig.defconfig index 1a75f9241fa..80201fdcb86 100644 --- a/boards/arm/mm_feather/Kconfig.defconfig +++ b/boards/arm/mm_feather/Kconfig.defconfig @@ -16,6 +16,9 @@ endchoice config DEVICE_CONFIGURATION_DATA default y +config NXP_IMX_EXTERNAL_SDRAM + default y + config DISK_DRIVER_SDMMC default y if DISK_DRIVERS diff --git a/boards/arm/mm_swiftio/Kconfig.defconfig b/boards/arm/mm_swiftio/Kconfig.defconfig index 92ac1f7b76f..95fe8e06d9c 100644 --- a/boards/arm/mm_swiftio/Kconfig.defconfig +++ b/boards/arm/mm_swiftio/Kconfig.defconfig @@ -16,6 +16,9 @@ endchoice config DEVICE_CONFIGURATION_DATA default y +config NXP_IMX_EXTERNAL_SDRAM + default y + config DISK_DRIVER_SDMMC default y if DISK_DRIVERS diff --git a/doc/releases/release-notes-3.5.rst b/doc/releases/release-notes-3.5.rst index 9d481dbe4f9..8ff9daa2343 100644 --- a/doc/releases/release-notes-3.5.rst +++ b/doc/releases/release-notes-3.5.rst @@ -96,6 +96,7 @@ Boards & SoC Support * i.MX RT SOCs no longer enable CONFIG_DEVICE_CONFIGURATION_DATA by default. boards using external SDRAM should set CONFIG_DEVICE_CONFIGURATION_DATA + and CONFIG_NXP_IMX_EXTERNAL_SDRAM to enabled. * Added support for these ARC boards: diff --git a/soc/arm/nxp_imx/rt/CMakeLists.txt b/soc/arm/nxp_imx/rt/CMakeLists.txt index ceb7468fcf6..ee8708e827f 100644 --- a/soc/arm/nxp_imx/rt/CMakeLists.txt +++ b/soc/arm/nxp_imx/rt/CMakeLists.txt @@ -9,9 +9,9 @@ zephyr_sources_ifdef(CONFIG_SOC_SERIES_IMX_RT10XX soc_rt10xx.c) zephyr_linker_sources_ifdef(CONFIG_NXP_IMX_RT_BOOT_HEADER ROM_START SORT_KEY 0 boot_header.ld) -# Enable custom OCRAM noncacheable region +# Add custom mpu regions +zephyr_sources(mpu_regions.c) zephyr_linker_sources_ifdef(CONFIG_OCRAM_NOCACHE SECTIONS sections.ld) -zephyr_sources_ifdef(CONFIG_OCRAM_NOCACHE mpu_regions.c) zephyr_linker_section_configure( SECTION .rom_start diff --git a/soc/arm/nxp_imx/rt/Kconfig.series b/soc/arm/nxp_imx/rt/Kconfig.series index 0a94b3963b1..65edffe3cd5 100644 --- a/soc/arm/nxp_imx/rt/Kconfig.series +++ b/soc/arm/nxp_imx/rt/Kconfig.series @@ -1,6 +1,6 @@ # iMX RT series -# Copyright (c) 2017-2021, NXP +# Copyright (c) 2017-2021,2023 NXP # SPDX-License-Identifier: Apache-2.0 config SOC_SERIES_IMX_RT @@ -9,5 +9,6 @@ config SOC_SERIES_IMX_RT select SOC_FAMILY_IMX select CLOCK_CONTROL select HAS_PM + select CPU_HAS_CUSTOM_FIXED_SOC_MPU_REGIONS help Enable support for i.MX RT MCU series diff --git a/soc/arm/nxp_imx/rt/Kconfig.soc b/soc/arm/nxp_imx/rt/Kconfig.soc index a0567de26c1..f38abbd3959 100644 --- a/soc/arm/nxp_imx/rt/Kconfig.soc +++ b/soc/arm/nxp_imx/rt/Kconfig.soc @@ -795,6 +795,14 @@ config OCRAM_NOCACHE Creates linker section and MPU region for OCRAM region with noncacheable attribute. OCRAM memory is useful for fast DMA transfers. +config NXP_IMX_EXTERNAL_SDRAM + bool "Allow access to external SDRAM region" + help + Enable access to external SDRAM region managed by the SEMC. This + setting should be enabled when the application uses SDRAM, or + an MPU region will be defined to disable cached access to the + SDRAM memory space. + config SECOND_CORE_MCUX bool "Dual core operation on the RT11xx series" depends on SOC_SERIES_IMX_RT11XX diff --git a/soc/arm/nxp_imx/rt/mpu_regions.c b/soc/arm/nxp_imx/rt/mpu_regions.c index e6108b7a327..8a4f36586b0 100644 --- a/soc/arm/nxp_imx/rt/mpu_regions.c +++ b/soc/arm/nxp_imx/rt/mpu_regions.c @@ -1,10 +1,13 @@ /* - * Copyright (c) 2022 NXP + * Copyright 2022-2023 NXP * * SPDX-License-Identifier: Apache-2.0 */ +#define SDRAM_BASE_ADDR 0x80000000 + #include +#include #include "../../common/cortex_m/arm_mpu_mem_cfg.h" #define IS_CHOSEN_SRAM(x) (DT_DEP_ORD(DT_NODELABEL(x)) == DT_DEP_ORD(DT_CHOSEN(zephyr_sram))) @@ -31,7 +34,18 @@ static const struct arm_mpu_region mpu_regions[] = { DT_REG_ADDR(DT_NODELABEL(ocram)), REGION_RAM_NOCACHE_ATTR(REGION_256K)), #endif + +#ifndef CONFIG_NXP_IMX_EXTERNAL_SDRAM + /* + * Region 3 - mark SDRAM0 as device type memory to prevent core + * from executing speculative prefetches against this region when + * no SDRAM is present. + */ + MPU_REGION_ENTRY("SDRAM0", SDRAM_BASE_ADDR, REGION_IO_ATTR(REGION_512M)), #endif + + /* DT-defined regions */ + DT_MEMORY_ATTR_APPLY(ARM_MPU_REGION_INIT) }; const struct arm_mpu_config mpu_config = {