source: EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/arm.c@ 429

Last change on this file since 429 was 429, checked in by coas-nagasima, 4 years ago

ASP3, TINET, mbed を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.4 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2006-2015 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 *
8 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17 * の無保証規定を掲載すること.
18 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20 * と.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24 * 報告すること.
25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29 * 免責すること.
30 *
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35 * の責任を負わない.
36 *
37 * $Id$
38 */
39
40/*
41 * ARMコアサポートモジュール
42 */
43
44#include "arm.h"
45
46/*
47 * キャッシュの操作
48 */
49
50/*
51 * データキャッシュのイネーブル
52 */
53void
54arm_enable_dcache(void)
55{
56 uint32_t reg;
57
58 CP15_READ_SCTLR(reg);
59 if ((reg & CP15_SCTLR_DCACHE) == 0U) {
60 arm_invalidate_dcache();
61
62 reg |= CP15_SCTLR_DCACHE;
63 CP15_WRITE_SCTLR(reg);
64 }
65}
66
67/*
68 * データキャッシュのディスエーブル
69 *
70 * データキャッシュが無効な状態でclean_and_invalidateを実行すると暴走
71 * する場合があるため,データキャッシュの状態を判断して,無効な場合は,
72 * 無効化のみを行う.
73 */
74void
75arm_disable_dcache(void)
76{
77 uint32_t reg;
78
79 CP15_READ_SCTLR(reg);
80 if ((reg & CP15_SCTLR_DCACHE) == 0U) {
81 arm_invalidate_dcache();
82 }
83 else {
84 reg &= ~CP15_SCTLR_DCACHE;
85 CP15_WRITE_SCTLR(reg);
86
87 arm_clean_and_invalidate_dcache();
88 }
89}
90
91/*
92 * 命令キャッシュのイネーブル
93 */
94void
95arm_enable_icache(void)
96{
97 uint32_t reg;
98
99 CP15_READ_SCTLR(reg);
100 if ((reg & CP15_SCTLR_ICACHE) == 0U) {
101 arm_invalidate_icache();
102
103 reg |= CP15_SCTLR_ICACHE;
104 CP15_WRITE_SCTLR(reg);
105 }
106}
107
108/*
109 * 命令キャッシュのディスエーブル
110 */
111void
112arm_disable_icache(void)
113{
114 uint32_t reg;
115
116 CP15_READ_SCTLR(reg);
117 reg &= ~CP15_SCTLR_ICACHE;
118 CP15_WRITE_SCTLR(reg);
119
120 arm_invalidate_icache();
121}
122
123/*
124 * ARMv5におけるデータキャッシュのクリーンと無効化
125 */
126#if __TARGET_ARCH_ARM <= 5
127
128void
129armv5_clean_and_invalidate_dcache(void)
130{
131 ARMV5_CLEAN_AND_INVALIDATE_DCACHE();
132}
133
134#endif /* __TARGET_ARCH_ARM <= 5 */
135
136/*
137 * ARMv7におけるデータキャッシュの無効化
138 *
139 * バリアを2か所に入れているのは,ARMアーキテクチャリファレンスマニュ
140 * アルのサンプルコードを踏襲した.
141 */
142#if __TARGET_ARCH_ARM == 7
143
144void
145armv7_invalidate_dcache(void)
146{
147 uint32_t clidr, ccsidr;
148 uint32_t level, no_levels;
149 uint32_t way, no_ways, shift_way;
150 uint32_t set, no_sets, shift_set;
151 uint32_t waylevel, setwaylevel;
152
153 CP15_READ_CLIDR(clidr);
154 no_levels = (clidr >> 24) & 0x07U;
155 for (level = 0; level < no_levels; level++) {
156 if (((clidr >> (level * 3)) & 0x07U) >= 0x02U) {
157 CP15_WRITE_CSSELR(level << 1);
158 inst_sync_barrier();
159 CP15_READ_CCSIDR(ccsidr);
160 no_sets = ((ccsidr >> 13) & 0x7fffU) + 1;
161 shift_set = (ccsidr & 0x07U) + 4;
162 no_ways = ((ccsidr >> 3) & 0x3ffU) + 1;
163 shift_way = count_leading_zero(no_ways - 1);
164
165 for (way = 0; way < no_ways; way++) {
166 waylevel = (way << shift_way) | (level << 1);
167 for (set = 0; set < no_sets; set++) {
168 setwaylevel = waylevel | (set << shift_set);
169 CP15_WRITE_DCISW(setwaylevel);
170 }
171 }
172 }
173 }
174 data_sync_barrier();
175}
176
177#endif /* __TARGET_ARCH_ARM == 7 */
178
179/*
180 * ARMv7におけるデータキャッシュのクリーンと無効化
181 *
182 * バリアを2か所に入れているのは,ARMアーキテクチャリファレンスマニュ
183 * アルのサンプルコードを踏襲した.
184 */
185#if __TARGET_ARCH_ARM == 7
186
187void
188armv7_clean_and_invalidate_dcache(void)
189{
190 uint32_t clidr, ccsidr;
191 uint32_t level, no_levels;
192 uint32_t way, no_ways, shift_way;
193 uint32_t set, no_sets, shift_set;
194 uint32_t waylevel, setwaylevel;
195
196 CP15_READ_CLIDR(clidr);
197 no_levels = (clidr >> 24) & 0x07U;
198 for (level = 0; level < no_levels; level++) {
199 if (((clidr >> (level * 3)) & 0x07U) >= 0x02U) {
200 CP15_WRITE_CSSELR(level << 1);
201 inst_sync_barrier();
202 CP15_READ_CCSIDR(ccsidr);
203 no_sets = ((ccsidr >> 13) & 0x7fffU) + 1;
204 shift_set = (ccsidr & 0x07U) + 4;
205 no_ways = ((ccsidr >> 3) & 0x3ffU) + 1;
206 shift_way = count_leading_zero(no_ways - 1);
207
208 for (way = 0; way < no_ways; way++) {
209 waylevel = (way << shift_way) | (level << 1);
210 for (set = 0; set < no_sets; set++) {
211 setwaylevel = waylevel | (set << shift_set);
212 CP15_WRITE_DCCISW(setwaylevel);
213 }
214 }
215 }
216 }
217 data_sync_barrier();
218}
219
220#endif /* __TARGET_ARCH_ARM == 7 */
Note: See TracBrowser for help on using the repository browser.