| 1 | 2 | alfik | /******************************************************************************
 | 
      
         | 2 |  |  | *                                                                             *
 | 
      
         | 3 |  |  | * License Agreement                                                           *
 | 
      
         | 4 |  |  | *                                                                             *
 | 
      
         | 5 |  |  | * Copyright (c) 2007 Altera Corporation, San Jose, California, USA.           *
 | 
      
         | 6 |  |  | * All rights reserved.                                                        *
 | 
      
         | 7 |  |  | *                                                                             *
 | 
      
         | 8 |  |  | * Permission is hereby granted, free of charge, to any person obtaining a     *
 | 
      
         | 9 |  |  | * copy of this software and associated documentation files (the "Software"),  *
 | 
      
         | 10 |  |  | * to deal in the Software without restriction, including without limitation   *
 | 
      
         | 11 |  |  | * the rights to use, copy, modify, merge, publish, distribute, sublicense,    *
 | 
      
         | 12 |  |  | * and/or sell copies of the Software, and to permit persons to whom the       *
 | 
      
         | 13 |  |  | * Software is furnished to do so, subject to the following conditions:        *
 | 
      
         | 14 |  |  | *                                                                             *
 | 
      
         | 15 |  |  | * The above copyright notice and this permission notice shall be included in  *
 | 
      
         | 16 |  |  | * all copies or substantial portions of the Software.                         *
 | 
      
         | 17 |  |  | *                                                                             *
 | 
      
         | 18 |  |  | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  *
 | 
      
         | 19 |  |  | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    *
 | 
      
         | 20 |  |  | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
 | 
      
         | 21 |  |  | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      *
 | 
      
         | 22 |  |  | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     *
 | 
      
         | 23 |  |  | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER         *
 | 
      
         | 24 |  |  | * DEALINGS IN THE SOFTWARE.                                                   *
 | 
      
         | 25 |  |  | *                                                                             *
 | 
      
         | 26 |  |  | * This agreement shall be governed in all respects by the laws of the State   *
 | 
      
         | 27 |  |  | * of California and by the laws of the United States of America.              *
 | 
      
         | 28 |  |  | *                                                                             *
 | 
      
         | 29 |  |  | ******************************************************************************/
 | 
      
         | 30 |  |  |  
 | 
      
         | 31 |  |  | #include "nios2.h"
 | 
      
         | 32 |  |  | #include "system.h"
 | 
      
         | 33 |  |  |  
 | 
      
         | 34 |  |  | #include "alt_types.h"
 | 
      
         | 35 |  |  | #include "sys/alt_cache.h" 
 | 
      
         | 36 |  |  |  
 | 
      
         | 37 |  |  | /*
 | 
      
         | 38 |  |  |  * The INITDA instruction was added to Nios II in the 8.0 release.
 | 
      
         | 39 |  |  |  *
 | 
      
         | 40 |  |  |  * The INITDA instruction has one of the following possible behaviors
 | 
      
         | 41 |  |  |  * depending on the processor configuration:
 | 
      
         | 42 |  |  |  *  1) Flushes a line by address but does NOT write back dirty data.
 | 
      
         | 43 |  |  |  *     Occurs when a data cache is present that supports INITDA.
 | 
      
         | 44 |  |  |  *     The macro NIOS2_INITDA_SUPPORTED is defined in system.h.
 | 
      
         | 45 |  |  |  *  2) Takes an unimplemented instruction exception.
 | 
      
         | 46 |  |  |  *     Occurs when a data cache is present that doesn't support INITDA.
 | 
      
         | 47 |  |  |  *  3) Performs no operation
 | 
      
         | 48 |  |  |  *     Occurs when there is no data cache present.
 | 
      
         | 49 |  |  |  *     The macro NIOS2_DCACHE_SIZE is 0 in system.h.
 | 
      
         | 50 |  |  |  */
 | 
      
         | 51 |  |  |  
 | 
      
         | 52 |  |  | #define ALT_FLUSH_DATA_NO_WRITEBACK(i) \
 | 
      
         | 53 |  |  |   __asm__ volatile ("initda (%0)" :: "r" (i));
 | 
      
         | 54 |  |  |  
 | 
      
         | 55 |  |  | /*
 | 
      
         | 56 |  |  |  * alt_dcache_flush_no_writeback() is called to flush the data cache for a
 | 
      
         | 57 |  |  |  * memory region of length "len" bytes, starting at address "start".
 | 
      
         | 58 |  |  |  *
 | 
      
         | 59 |  |  |  * Any dirty lines in the data cache are NOT written back to memory.
 | 
      
         | 60 |  |  |  * Make sure you really want this behavior.  If you aren't 100% sure,
 | 
      
         | 61 |  |  |  * use the alt_dcache_flush() routine instead.
 | 
      
         | 62 |  |  |  */
 | 
      
         | 63 |  |  |  
 | 
      
         | 64 |  |  | void alt_dcache_flush_no_writeback (void* start, alt_u32 len)
 | 
      
         | 65 |  |  | {
 | 
      
         | 66 |  |  | #if defined(NIOS2_INITDA_SUPPORTED)
 | 
      
         | 67 |  |  |  
 | 
      
         | 68 |  |  |   char* i;
 | 
      
         | 69 |  |  |   char* end = ((char*) start) + len;
 | 
      
         | 70 |  |  |  
 | 
      
         | 71 |  |  |   for (i = start; i < end; i+= NIOS2_DCACHE_LINE_SIZE)
 | 
      
         | 72 |  |  |   {
 | 
      
         | 73 |  |  |     ALT_FLUSH_DATA_NO_WRITEBACK(i);
 | 
      
         | 74 |  |  |   }
 | 
      
         | 75 |  |  |  
 | 
      
         | 76 |  |  |   /*
 | 
      
         | 77 |  |  |    * For an unaligned flush request, we've got one more line left.
 | 
      
         | 78 |  |  |    * Note that this is dependent on NIOS2_DCACHE_LINE_SIZE to be a
 | 
      
         | 79 |  |  |    * multiple of 2 (which it always is).
 | 
      
         | 80 |  |  |    */
 | 
      
         | 81 |  |  |  
 | 
      
         | 82 |  |  |   if (((alt_u32) start) & (NIOS2_DCACHE_LINE_SIZE - 1))
 | 
      
         | 83 |  |  |   {
 | 
      
         | 84 |  |  |     ALT_FLUSH_DATA_NO_WRITEBACK(i);
 | 
      
         | 85 |  |  |   }
 | 
      
         | 86 |  |  |  
 | 
      
         | 87 |  |  | #endif /* NIOS2_INITDA_SUPPORTED */
 | 
      
         | 88 |  |  | }
 |