This is an automated email from the ASF dual-hosted git repository.

GUIDINGLI pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 4afb7f91ad2f9b4d4f1af70c5159010093459fd2
Author: zhangyu117 <[email protected]>
AuthorDate: Mon Aug 31 10:07:31 2026 +0800

    arch/tricore: mpu: per-set flags array and cpuset in mpu_region_s
    
    Refactor kflags/uflags into a per-set flags[] array indexed by set
    number, and add a cpuset field to filter regions per CPU. Rewrite
    mpu_initialize to loop over all protection sets.
    
    Signed-off-by: zhangyu117 <[email protected]>
---
 arch/tricore/src/common/tricore_mpu.c | 49 +++++++++++++++++++----------------
 arch/tricore/src/common/tricore_mpu.h |  6 ++---
 2 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/arch/tricore/src/common/tricore_mpu.c 
b/arch/tricore/src/common/tricore_mpu.c
index d8c3b6d1f98..5eebc548087 100644
--- a/arch/tricore/src/common/tricore_mpu.c
+++ b/arch/tricore/src/common/tricore_mpu.c
@@ -1207,38 +1207,43 @@ void mpu_set_active_set(unsigned int set)
 void mpu_initialize(const struct mpu_region_s *table, size_t count)
 {
   const struct mpu_region_s *conf;
-  unsigned int kset = mpu_alloc_set();
-#ifdef CONFIG_BUILD_PROTECTED
-  unsigned int uset = mpu_alloc_set();
-#endif
+  unsigned int cpu = this_cpu();
   unsigned int region;
-  size_t index;
+  int set;
+  int index;
 
   mpu_control(false);
   for (index = 0; index < count; index++)
     {
       conf = &table[index];
 
-      if ((conf->kflags & REGION_TYPE_MASK) == REGION_TYPE_CODE)
-        {
-          region = mpu_alloccoderegion();
-          mpu_modify_code_region(region, conf->base, conf->size);
-          mpu_modify_code_set(kset, region, conf->kflags);
-#ifdef CONFIG_BUILD_PROTECTED
-          mpu_modify_code_set(uset, region, conf->uflags);
-#endif
-        }
-      else
+      if (conf->cpuset & (1 << cpu))
         {
-          region = mpu_allocdataregion();
-          mpu_modify_data_region(region, conf->base, conf->size);
-          mpu_modify_data_set(kset, region, conf->kflags);
-    #ifdef CONFIG_BUILD_PROTECTED
-          mpu_modify_data_set(uset, region, conf->uflags);
-    #endif
+          /* Allocate new region based on type */
+
+          if ((conf->flags[0] & REGION_TYPE_MASK) == REGION_TYPE_CODE)
+            {
+              region = mpu_alloccoderegion();
+              mpu_modify_code_region(region, conf->base, conf->size);
+            }
+          else if ((conf->flags[0] & REGION_TYPE_MASK) == REGION_TYPE_DATA)
+            {
+              region = mpu_allocdataregion();
+              mpu_modify_data_region(region, conf->base, conf->size);
+            }
+          else
+            {
+              continue;
+            }
+
+          /* Set permissions for each protection set */
+
+          for (set = 0; set < CONFIG_ARCH_MPU_NSETS; set++)
+            {
+              mpu_modify_region(set, region, 0, 0, conf->flags[set]);
+            }
         }
     }
 
-  mpu_set_active_set(kset);
   mpu_control(true);
 }
diff --git a/arch/tricore/src/common/tricore_mpu.h 
b/arch/tricore/src/common/tricore_mpu.h
index 4ddb597d3af..a3221d8f7d3 100644
--- a/arch/tricore/src/common/tricore_mpu.h
+++ b/arch/tricore/src/common/tricore_mpu.h
@@ -55,9 +55,9 @@
 struct mpu_region_s
 {
   uintptr_t base;
-  size_t size;
-  int kflags;
-  int uflags;
+  size_t    size;
+  uint32_t  cpuset;
+  int       flags[CONFIG_ARCH_MPU_NSETS];
 };
 
 /****************************************************************************

Reply via email to