Amit Gandhi / mbed-dev

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**************************************************************************//**
bogdanm 0:9b334a45a8ff 2 * @file pl310.c
bogdanm 0:9b334a45a8ff 3 * @brief Implementation of PL310 PrimeCell Level 2 Cache Controller functions
bogdanm 0:9b334a45a8ff 4 * @version
bogdanm 0:9b334a45a8ff 5 * @date 3 December 2014
bogdanm 0:9b334a45a8ff 6 *
bogdanm 0:9b334a45a8ff 7 * @note
bogdanm 0:9b334a45a8ff 8 *
bogdanm 0:9b334a45a8ff 9 ******************************************************************************/
bogdanm 0:9b334a45a8ff 10 /* Copyright (c) 2011 - 2013 ARM LIMITED
bogdanm 0:9b334a45a8ff 11
bogdanm 0:9b334a45a8ff 12 All rights reserved.
bogdanm 0:9b334a45a8ff 13 Redistribution and use in source and binary forms, with or without
bogdanm 0:9b334a45a8ff 14 modification, are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 15 - Redistributions of source code must retain the above copyright
bogdanm 0:9b334a45a8ff 16 notice, this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 17 - Redistributions in binary form must reproduce the above copyright
bogdanm 0:9b334a45a8ff 18 notice, this list of conditions and the following disclaimer in the
bogdanm 0:9b334a45a8ff 19 documentation and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 20 - Neither the name of ARM nor the names of its contributors may be used
bogdanm 0:9b334a45a8ff 21 to endorse or promote products derived from this software without
bogdanm 0:9b334a45a8ff 22 specific prior written permission.
bogdanm 0:9b334a45a8ff 23 *
bogdanm 0:9b334a45a8ff 24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 25 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 26 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
bogdanm 0:9b334a45a8ff 27 ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
bogdanm 0:9b334a45a8ff 28 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
bogdanm 0:9b334a45a8ff 29 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
bogdanm 0:9b334a45a8ff 30 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
bogdanm 0:9b334a45a8ff 31 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
bogdanm 0:9b334a45a8ff 32 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
bogdanm 0:9b334a45a8ff 33 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
bogdanm 0:9b334a45a8ff 34 POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 35 ---------------------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 36 #include "MBRZA1H.h"
bogdanm 0:9b334a45a8ff 37
bogdanm 0:9b334a45a8ff 38 //Cache Sync operation
bogdanm 0:9b334a45a8ff 39 void PL310_Sync(void)
bogdanm 0:9b334a45a8ff 40 {
bogdanm 0:9b334a45a8ff 41 PL310->CACHE_SYNC = 0x0;
bogdanm 0:9b334a45a8ff 42 }
bogdanm 0:9b334a45a8ff 43
bogdanm 0:9b334a45a8ff 44 //return Cache controller cache ID
bogdanm 0:9b334a45a8ff 45 int PL310_GetID (void)
bogdanm 0:9b334a45a8ff 46 {
bogdanm 0:9b334a45a8ff 47 return PL310->CACHE_ID;
bogdanm 0:9b334a45a8ff 48 }
bogdanm 0:9b334a45a8ff 49
bogdanm 0:9b334a45a8ff 50 //return Cache controller cache Type
bogdanm 0:9b334a45a8ff 51 int PL310_GetType (void)
bogdanm 0:9b334a45a8ff 52 {
bogdanm 0:9b334a45a8ff 53 return PL310->CACHE_TYPE;
bogdanm 0:9b334a45a8ff 54 }
bogdanm 0:9b334a45a8ff 55
bogdanm 0:9b334a45a8ff 56 //Invalidate all cache by way
bogdanm 0:9b334a45a8ff 57 void PL310_InvAllByWay (void)
bogdanm 0:9b334a45a8ff 58 {
bogdanm 0:9b334a45a8ff 59 unsigned int assoc;
bogdanm 0:9b334a45a8ff 60
bogdanm 0:9b334a45a8ff 61 if (PL310->AUX_CNT & (1<<16))
bogdanm 0:9b334a45a8ff 62 assoc = 16;
bogdanm 0:9b334a45a8ff 63 else
bogdanm 0:9b334a45a8ff 64 assoc = 8;
bogdanm 0:9b334a45a8ff 65
bogdanm 0:9b334a45a8ff 66 PL310->INV_WAY = (1 << assoc) - 1;
bogdanm 0:9b334a45a8ff 67 while(PL310->INV_WAY & ((1 << assoc) - 1)); //poll invalidate
bogdanm 0:9b334a45a8ff 68
bogdanm 0:9b334a45a8ff 69 PL310_Sync();
bogdanm 0:9b334a45a8ff 70 }
bogdanm 0:9b334a45a8ff 71
bogdanm 0:9b334a45a8ff 72 //Clean and Invalidate all cache by way
bogdanm 0:9b334a45a8ff 73 void PL310_CleanInvAllByWay (void)
bogdanm 0:9b334a45a8ff 74 {
bogdanm 0:9b334a45a8ff 75 unsigned int assoc;
bogdanm 0:9b334a45a8ff 76
bogdanm 0:9b334a45a8ff 77 if (PL310->AUX_CNT & (1<<16))
bogdanm 0:9b334a45a8ff 78 assoc = 16;
bogdanm 0:9b334a45a8ff 79 else
bogdanm 0:9b334a45a8ff 80 assoc = 8;
bogdanm 0:9b334a45a8ff 81
bogdanm 0:9b334a45a8ff 82 PL310->CLEAN_INV_WAY = (1 << assoc) - 1;
bogdanm 0:9b334a45a8ff 83 while(PL310->CLEAN_INV_WAY & ((1 << assoc) - 1)); //poll invalidate
bogdanm 0:9b334a45a8ff 84
bogdanm 0:9b334a45a8ff 85 PL310_Sync();
bogdanm 0:9b334a45a8ff 86 }
bogdanm 0:9b334a45a8ff 87
bogdanm 0:9b334a45a8ff 88 //Enable Cache
bogdanm 0:9b334a45a8ff 89 void PL310_Enable(void)
bogdanm 0:9b334a45a8ff 90 {
bogdanm 0:9b334a45a8ff 91 PL310->CONTROL = 0;
bogdanm 0:9b334a45a8ff 92 PL310->INTERRUPT_CLEAR = 0x000001FFuL;
bogdanm 0:9b334a45a8ff 93 PL310->DEBUG_CONTROL = 0;
bogdanm 0:9b334a45a8ff 94 PL310->DATA_LOCK_0_WAY = 0;
bogdanm 0:9b334a45a8ff 95 PL310->CACHE_SYNC = 0;
bogdanm 0:9b334a45a8ff 96
bogdanm 0:9b334a45a8ff 97 PL310->CONTROL = 0x01;
bogdanm 0:9b334a45a8ff 98 PL310_Sync();
bogdanm 0:9b334a45a8ff 99 }
bogdanm 0:9b334a45a8ff 100 //Disable Cache
bogdanm 0:9b334a45a8ff 101 void PL310_Disable(void)
bogdanm 0:9b334a45a8ff 102 {
bogdanm 0:9b334a45a8ff 103 PL310->CONTROL = 0x00;
bogdanm 0:9b334a45a8ff 104 PL310_Sync();
bogdanm 0:9b334a45a8ff 105 }
bogdanm 0:9b334a45a8ff 106
bogdanm 0:9b334a45a8ff 107 //Invalidate cache by physical address
bogdanm 0:9b334a45a8ff 108 void PL310_InvPa (void *pa)
bogdanm 0:9b334a45a8ff 109 {
bogdanm 0:9b334a45a8ff 110 PL310->INV_LINE_PA = (unsigned int)pa;
bogdanm 0:9b334a45a8ff 111 PL310_Sync();
bogdanm 0:9b334a45a8ff 112 }
bogdanm 0:9b334a45a8ff 113
bogdanm 0:9b334a45a8ff 114 //Clean cache by physical address
bogdanm 0:9b334a45a8ff 115 void PL310_CleanPa (void *pa)
bogdanm 0:9b334a45a8ff 116 {
bogdanm 0:9b334a45a8ff 117 PL310->CLEAN_LINE_PA = (unsigned int)pa;
bogdanm 0:9b334a45a8ff 118 PL310_Sync();
bogdanm 0:9b334a45a8ff 119 }
bogdanm 0:9b334a45a8ff 120
bogdanm 0:9b334a45a8ff 121 //Clean and invalidate cache by physical address
bogdanm 0:9b334a45a8ff 122 void PL310_CleanInvPa (void *pa)
bogdanm 0:9b334a45a8ff 123 {
bogdanm 0:9b334a45a8ff 124 PL310->CLEAN_INV_LINE_PA = (unsigned int)pa;
bogdanm 0:9b334a45a8ff 125 PL310_Sync();
bogdanm 0:9b334a45a8ff 126 }
bogdanm 0:9b334a45a8ff 127
bogdanm 0:9b334a45a8ff 128