source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/arm.c@ 352

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

arm向けASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 5.5 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 * レベル0のキャッシュのみを無効化する.
140 */
141#if __TARGET_ARCH_ARM == 7
142
143void
144armv7_invalidate_dcache(void)
145{
146 uint32_t reg;
147 uint32_t way, no_ways, shift_way;
148 uint32_t set, no_sets, shift_set;
149
150 CP15_WRITE_CSSELR(0U);
151 CP15_READ_CCSIDR(reg);
152 no_sets = ((reg >> 13) & 0x7fffU) + 1;
153 shift_set = (reg & 0x07U) + 4;
154 no_ways = ((reg >> 3) & 0x3ffU) + 1;
155 shift_way = count_leading_zero(no_ways);
156
157 for (way = 0; way < no_ways; way++){
158 for (set = 0; set < no_sets; set++) {
159 reg = (way << shift_way) | (set << shift_set);
160 CP15_WRITE_DCISW(reg);
161 }
162 }
163}
164
165#endif /* __TARGET_ARCH_ARM == 7 */
166
167/*
168 * ARMv7におけるデータキャッシュのクリーンと無効化
169 *
170 * レベル0のキャッシュのみをクリーンと無効化する.
171 */
172#if __TARGET_ARCH_ARM == 7
173
174void
175armv7_clean_and_invalidate_dcache(void)
176{
177 uint32_t reg;
178 uint32_t way, no_ways, shift_way;
179 uint32_t set, no_sets, shift_set;
180
181 CP15_WRITE_CSSELR(0U);
182 CP15_READ_CCSIDR(reg);
183 no_sets = ((reg >> 13) & 0x7fffU) + 1;
184 shift_set = (reg & 0x07U) + 4;
185 no_ways = ((reg >> 3) & 0x3ffU) + 1;
186 shift_way = count_leading_zero(no_ways);
187
188 for (way = 0; way < no_ways; way++){
189 for (set = 0; set < no_sets; set++) {
190 reg = (way << shift_way) | (set << shift_set);
191 CP15_WRITE_DCCISW(reg);
192 }
193 }
194}
195
196#endif /* __TARGET_ARCH_ARM == 7 */
Note: See TracBrowser for help on using the repository browser.