Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:25

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * Copyright (c) 2011 embedded brains GmbH & Co. KG
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted provided that the following conditions
0008  * are met:
0009  * 1. Redistributions of source code must retain the above copyright
0010  *    notice, this list of conditions and the following disclaimer.
0011  * 2. Redistributions in binary form must reproduce the above copyright
0012  *    notice, this list of conditions and the following disclaimer in the
0013  *    documentation and/or other materials provided with the distribution.
0014  *
0015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0025  * POSSIBILITY OF SUCH DAMAGE.
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 }