File indexing completed on 2025-05-11 08:24:25
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031
0032 #include <rtems/score/nios2-utility.h>
0033
0034 static bool _Nios2_MPU_Is_region_disabled(
0035 const Nios2_MPU_Configuration *config,
0036 uint32_t mpubase,
0037 uint32_t mpuacc
0038 )
0039 {
0040 bool disabled = false;
0041
0042 if ( config->region_uses_limit ) {
0043 disabled = (mpubase & NIOS2_MPUBASE_BASE_MASK)
0044 > (mpuacc & NIOS2_MPUACC_LIMIT_MASK);
0045 } else {
0046 disabled = (mpuacc & NIOS2_MPUACC_MASK_MASK) == 0;
0047 }
0048
0049 return disabled;
0050 }
0051
0052 int _Nios2_MPU_Get_disabled_region_index(
0053 const Nios2_MPU_Configuration *config,
0054 bool data,
0055 int begin,
0056 int end
0057 )
0058 {
0059 int index = -1;
0060 int count = _Nios2_MPU_Get_region_count( config, data );
0061
0062 if ( end < 0 || count < end ) {
0063 end = count;
0064 }
0065
0066 if ( begin >= 0 ) {
0067 int i = 0;
0068
0069 for ( i = begin; i < end && index < 0; ++i ) {
0070 uint32_t mpubase = 0;
0071 uint32_t mpuacc = 0;
0072
0073 _Nios2_MPU_Get_region_registers( i, data, &mpubase, &mpuacc );
0074
0075 if ( _Nios2_MPU_Is_region_disabled( config, mpubase, mpuacc ) ) {
0076 index = i;
0077 }
0078 }
0079 }
0080
0081 return index;
0082 }
0083
0084 bool _Nios2_MPU_Add_region(
0085 const Nios2_MPU_Configuration *config,
0086 const Nios2_MPU_Region_descriptor *desc,
0087 bool force
0088 )
0089 {
0090 bool ok = true;
0091 int index = desc->index;
0092 bool data = desc->data;
0093 uint32_t mpubase = 0;
0094 uint32_t mpuacc = 0;
0095
0096 if ( _Nios2_MPU_Is_valid_index( config, index, data ) ) {
0097 if ( !force ) {
0098 _Nios2_MPU_Get_region_registers( index, data, &mpubase, &mpuacc );
0099 ok = _Nios2_MPU_Is_region_disabled( config, mpubase, mpuacc );
0100 }
0101
0102 if ( ok ) {
0103 ok = _Nios2_MPU_Setup_region_registers(
0104 config,
0105 desc,
0106 &mpubase,
0107 &mpuacc
0108 );
0109 if ( ok ) {
0110 _Nios2_Set_ctlreg_mpubase(mpubase);
0111 _Nios2_Set_ctlreg_mpuacc(mpuacc);
0112 }
0113 }
0114 } else {
0115 ok = false;
0116 }
0117
0118 return ok;
0119 }