source: asp3_wo_tecs/trunk/arch/arm_gcc/common/gic_kernel_impl.h@ 306

Last change on this file since 306 was 306, checked in by ertl-honda, 7 years ago

3.1.0を反映

File size: 12.4 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 *
8 * 上記著作権者
9は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20 * 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22 * の無保証規定を掲載すること.
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24 * 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26 * と.
27 * (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
31 * (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34 * 報告すること.
35 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36 * 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40 * 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42 * å…
43è²¬ã™ã‚‹ã“と.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50 * の責任を負わない.
51 *
52 * $Id: gic_kernel_impl.h 714 2016-03-31 05:52:19Z ertl-hiro $
53 */
54
55/*
56 * カーネルの割込みコントローラ依存部(GIC用)
57 *
58 * このヘッダファイルは,target_kernel_impl.h(または,そこからインク
59 * ルードされるファイル)のみからインクルードされる.他のファイルから
60 * 直接インクルードしてはならない.
61 */
62
63#ifndef TOPPERS_GIC_KERNEL_IMPL_H
64#define TOPPERS_GIC_KERNEL_IMPL_H
65
66#include <sil.h>
67#include "arm.h"
68
69/*
70 * 割込み番号の数,最小値と最大値
71 */
72#define TNUM_INTNO GIC_TNUM_INTNO
73#define TMIN_INTNO UINT_C(0)
74#define TMAX_INTNO (GIC_TNUM_INTNO - 1)
75
76/*
77 * 割込みハンドラ番号の数
78 */
79#define TNUM_INHNO GIC_TNUM_INTNO
80
81/*
82 * 割込み番号の定義
83 */
84#define GIC_INTNO_SGI0 0U
85#define GIC_INTNO_PPI0 16U
86#define GIC_INTNO_SPI0 32U
87
88/*
89 * 割込み優å…
90ˆåº¦ã®æ“ä½œ
91 *
92 * 割込み優å…
93ˆåº¦ã®å†…
94部表現は,uint_t型で表し,0が最高優å…
95ˆåº¦ã§ï¼Œå€¤ãŒå¤§ã
96 * いほど優å…
97ˆåº¦ãŒä¸‹ãŒã‚‹ã‚‚のとする.GICのレジスタ構成と整合させるために,
98 * 優å…
99ˆåº¦ã®æ®µæ•°ãŒ256段階の時にあわせて表す.
100 */
101#define GIC_PRI_LEVEL (TMAX_INTPRI - TMIN_INTPRI + 2)
102
103#if GIC_PRI_LEVEL == 16
104#define GIC_PRI_SHIFT 4
105#define GIC_PRI_MASK UINT_C(0x0f)
106#elif GIC_PRI_LEVEL == 32
107#define GIC_PRI_SHIFT 3
108#define GIC_PRI_MASK UINT_C(0x1f)
109#elif GIC_PRI_LEVEL == 64
110#define GIC_PRI_SHIFT 2
111#define GIC_PRI_MASK UINT_C(0x3f)
112#elif GIC_PRI_LEVEL == 128
113#define GIC_PRI_SHIFT 1
114#define GIC_PRI_MASK UINT_C(0x7f)
115#elif GIC_PRI_LEVEL == 256
116#define GIC_PRI_SHIFT 0
117#define GIC_PRI_MASK UINT_C(0xff)
118#else
119#error Invalid number of priority levels for GIC.
120#endif /* GIC_PRI_LEVEL == 16 */
121
122/* 外部表現への変換 */
123#define EXT_IPM(pri) \
124 (((PRI)((pri) >> GIC_PRI_SHIFT)) - (GIC_PRI_LEVEL - 1))
125
126/* 内
127部表現への変換 */
128#define INT_IPM(ipm) \
129 (((uint_t)((ipm) + (GIC_PRI_LEVEL - 1))) << GIC_PRI_SHIFT)
130
131/*
132 * GICレジスタのアドレスを定義するためのマクロ
133 *
134 * GICレジスタのアドレスを,アセンブリ言語からも参ç…
135§ã§ãã‚‹ã‚ˆã†ã«ã™ã‚‹ãŸ
136 * めのマクロ.
137 */
138#ifndef GIC_REG
139#define GIC_REG(base, offset) ((uint32_t *)((base) + (offset ## U)))
140#endif /* GIC_REG */
141
142/*
143 * CPUインタフェース関連の定義
144 */
145#define GICC_CTLR GIC_REG(GICC_BASE, 0x00)
146#define GICC_PMR GIC_REG(GICC_BASE, 0x04)
147#define GICC_BPR GIC_REG(GICC_BASE, 0x08)
148#define GICC_IAR GIC_REG(GICC_BASE, 0x0C)
149#define GICC_EOIR GIC_REG(GICC_BASE, 0x10)
150#define GICC_RPR GIC_REG(GICC_BASE, 0x14)
151#define GICC_HPIR GIC_REG(GICC_BASE, 0x18)
152
153/*
154 * CPUインタフェース制御レジスタ(GICC_CTLR)の設定値(GICv1でセキュリ
155 * ティ拡張がない場合)
156 */
157#define GICC_CTLR_DISABLE UINT_C(0x00)
158#define GICC_CTLR_ENABLE UINT_C(0x01)
159
160/*
161 * CPUインタフェース制御レジスタ(GICC_CTLR)の設定値(GICv2でセキュリ
162 * ティ拡張がない場合か,拡張がある場合のセキュアモード)
163 */
164#ifdef TOPPERS_SAFEG_SECURE
165#define GICC_CTLR_ENABLEGRP0 UINT_C(0x01)
166#define GICC_CTLR_ENABLEGRP1 UINT_C(0x02)
167#define GICC_CTLR_FIQEN UINT_C(0x08)
168#define GICC_CTLR_CBPR UINT_C(0x10)
169#endif /* TOPPERS_SAFEG_SECURE */
170
171/*
172 * ディストリビュータ関連の定義
173 */
174#define GICD_CTLR GIC_REG(GICD_BASE, 0x000)
175#define GICD_TYPER GIC_REG(GICD_BASE, 0x004)
176#define GICD_IIDR GIC_REG(GICD_BASE, 0x008)
177#define GICD_IGROUPR(n) GIC_REG(GICD_BASE, 0x080 + (n) * 4)
178#define GICD_ISENABLER(n) GIC_REG(GICD_BASE, 0x100 + (n) * 4)
179#define GICD_ICENABLER(n) GIC_REG(GICD_BASE, 0x180 + (n) * 4)
180#define GICD_ISPENDR(n) GIC_REG(GICD_BASE, 0x200 + (n) * 4)
181#define GICD_ICPENDR(n) GIC_REG(GICD_BASE, 0x280 + (n) * 4)
182#define GICD_ISACTIVER(n) GIC_REG(GICD_BASE, 0x300 + (n) * 4)
183#define GICD_ICACTIVER(n) GIC_REG(GICD_BASE, 0x380 + (n) * 4)
184#define GICD_IPRIORITYR(n) GIC_REG(GICD_BASE, 0x400 + (n) * 4)
185#define GICD_ITARGETSR(n) GIC_REG(GICD_BASE, 0x800 + (n) * 4)
186#define GICD_ICFGR(n) GIC_REG(GICD_BASE, 0xc00 + (n) * 4)
187#define GICD_NSCAR(n) GIC_REG(GICD_BASE, 0xe00 + (n) * 4)
188#define GICD_SGIR GIC_REG(GICD_BASE, 0xf00)
189#define GICD_CPENDSGIR(n) GIC_REG(GICD_BASE, 0xf10 + (n) * 4)
190#define GICD_SPENDSGIR(n) GIC_REG(GICD_BASE, 0xf20 + (n) * 4)
191
192/*
193 * ディストリビュータ制御レジスタ(GICD_CTLR)の設定値
194 */
195#define GICD_CTLR_DISABLE UINT_C(0x00)
196#define GICD_CTLR_ENABLE UINT_C(0x01)
197
198/*
199 * 割込みコンフィギュレーションレジスタ(GICD_ICFGRn)の設定値
200 *
201 * 第1ビットは,ARM11 MPCoreおよびGICの早い時期の実装
202では割込みの通知
203 * å…
204ˆãƒ—ロセッサを設定するために使用されている.
205 */
206#define GICD_ICFGRn_LEVEL UINT_C(0x00)
207#define GICD_ICFGRn_EDGE UINT_C(0x02)
208#ifdef GIC_ARM11MPCORE
209#define GICD_ICFGRn_N_N UINT_C(0x00)
210#define GICD_ICFGRn_1_N UINT_C(0x01)
211#endif /* GIC_ARM11MPCORE */
212
213#ifndef TOPPERS_MACRO_ONLY
214
215/*
216 * CPUインタフェースの操作
217 */
218
219/*
220 * 割込み優å…
221ˆåº¦ãƒžã‚¹ã‚¯ã‚’設定(priは内
222部表現)
223 */
224Inline void
225gicc_set_priority(uint_t pri)
226{
227 sil_wrw_mem(GICC_PMR, pri);
228}
229
230/*
231 * 割込み優å…
232ˆåº¦ãƒžã‚¹ã‚¯ã‚’取得(内
233部表現で返す)
234 */
235Inline uint_t
236gicc_get_priority(void)
237{
238 return(sil_rew_mem(GICC_PMR));
239}
240
241/*
242 * CPUインタフェースの初期化
243 */
244extern void gicc_initialize(void);
245
246/*
247 * CPUインタフェースの終了
248 */
249extern void gicc_terminate(void);
250
251/*
252 * ディストリビュータの操作
253 */
254
255/*
256 * 割込み禁止(割込みイネーブルのクリア)
257 */
258Inline void
259gicd_disable_int(INTNO intno)
260{
261 sil_wrw_mem(GICD_ICENABLER(intno / 32), (1U << (intno % 32)));
262}
263
264/*
265 * 割込み許可(割込みイネーブルのセット)
266 */
267Inline void
268gicd_enable_int(INTNO intno)
269{
270 sil_wrw_mem(GICD_ISENABLER(intno / 32), (1U << (intno % 32)));
271}
272
273/*
274 * 割込みペンディングのクリア
275 */
276Inline void
277gicd_clear_pending(INTNO intno)
278{
279 sil_wrw_mem(GICD_ICPENDR(intno / 32), (1U << (intno % 32)));
280}
281
282/*
283 * 割込みペンディングのセット
284 */
285Inline void
286gicd_set_pending(INTNO intno)
287{
288 sil_wrw_mem(GICD_ISPENDR(intno / 32), (1U << (intno % 32)));
289}
290
291/*
292 * 割込みペンディングのチェック
293 */
294Inline bool_t
295gicd_probe_pending(INTNO intno)
296{
297 return((sil_rew_mem(GICD_ISPENDR(intno / 32)) & (1U << (intno % 32)))
298 != 0U);
299}
300
301/*
302 * 割込みのコンフィグレーション
303 */
304Inline void
305gicd_config(INTNO intno, uint_t config)
306{
307 uint_t shift = (intno % 16) * 2;
308 uint32_t reg;
309
310 reg = sil_rew_mem(GICD_ICFGR(intno / 16));
311 reg &= ~(0x03U << shift);
312 reg |= (config << shift);
313 sil_wrw_mem(GICD_ICFGR(intno / 16), reg);
314}
315
316/*
317 * 割込みグループの設定(セキュリティ拡張)
318 */
319Inline void
320gicd_config_group(INTNO intno, uint_t group)
321{
322 uint_t shift = intno % 32;
323 uint32_t reg;
324
325 reg = sil_rew_mem(GICD_IGROUPR(intno / 32));
326 reg &= ~(0x01U << shift);
327 reg |= (group << shift);
328 sil_wrw_mem(GICD_IGROUPR(intno / 32), reg);
329}
330
331/*
332 * 割込み要求ラインに対する割込み優å…
333ˆåº¦ã®è¨­å®šï¼ˆpriは内
334部表現)
335 */
336Inline void
337gicd_set_priority(INTNO intno, uint_t pri)
338{
339 uint_t shift = (intno % 4) * 8;
340 uint32_t reg;
341
342 reg = sil_rew_mem(GICD_IPRIORITYR(intno / 4));
343 reg &= ~(0xffU << shift);
344 reg |= (pri << shift);
345 sil_wrw_mem(GICD_IPRIORITYR(intno / 4), reg);
346}
347
348/*
349 * 割込みターゲットプロセッサの設定
350 *
351 * prcsは,ターゲットとするプロセッサを表すビットのビット毎論理和で指
352 * 定する.
353 * プロセッサ0 : 0x01
354 * プロセッサ1 : 0x02
355 * プロセッサ2 : 0x04
356 * プロセッサ3 : 0x08
357 */
358Inline void
359gicd_set_target(INTNO intno, uint_t prcs)
360{
361 uint_t shift = (intno % 4) * 8;
362 uint32_t reg;
363
364 reg = sil_rew_mem(GICD_ITARGETSR(intno / 4));
365 reg &= ~(0xffU << shift);
366 reg |= (prcs << shift);
367 sil_wrw_mem(GICD_ITARGETSR(intno / 4), reg);
368}
369
370/*
371 * ディストリビュータの初期化
372 */
373extern void gicd_initialize(void);
374
375/*
376 * ディストリビュータの終了
377 */
378extern void gicd_terminate(void);
379
380#endif /* TOPPERS_MACRO_ONLY */
381
382/*
383 * 割込み番号の範囲の判定
384 */
385#define VALID_INTNO(intno) (TMIN_INTNO <= (intno) && (intno) <= TMAX_INTNO)
386
387/*
388 * 割込み要求ラインのための標準的な初期化情
389報を生成する
390 */
391#define USE_INTINIB_TABLE
392
393/*
394 * 割込み要求ライン設定テーブルを生成する
395 */
396#define USE_INTCFG_TABLE
397
398/*
399 * コア依存部
400 */
401#include "core_kernel_impl.h"
402
403/*
404 * ターゲット非依存部に提供する関数
405 */
406#ifndef TOPPERS_MACRO_ONLY
407
408/*
409 * 割込み優å…
410ˆåº¦ãƒžã‚¹ã‚¯ã®è¨­å®š
411 */
412Inline void
413t_set_ipm(PRI intpri)
414{
415 gicc_set_priority(INT_IPM(intpri));
416}
417
418/*
419 * 割込み優å…
420ˆåº¦ãƒžã‚¹ã‚¯ã®å‚ç…
421§
422 */
423Inline PRI
424t_get_ipm(void)
425{
426 return(EXT_IPM(gicc_get_priority()));
427}
428
429/*
430 * 割込み要求禁止フラグのセット
431 *
432 * intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのセッ
433 * トし,割込みを禁止する.割込み属性が設定されていない割込み要求ライ
434 * ンが指定された場合には,falseを返す.
435 */
436Inline bool_t
437disable_int(INTNO intno)
438{
439 if (intcfg_table[intno] == 0U) {
440 return(false);
441 }
442 gicd_disable_int(intno);
443 return(true);
444}
445
446/*
447 * 割込み要求禁止フラグのクリア
448 *
449 * intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのクリ
450 * アし,割込みを許可する.割込み属性が設定されていない割込み要求ライ
451 * ンが指定された場合には,falseを返す.
452 */
453Inline bool_t
454enable_int(INTNO intno)
455{
456 if (intcfg_table[intno] == 0U) {
457 return(false);
458 }
459 gicd_enable_int(intno);
460 return(true);
461}
462
463/*
464 * 割込み要求のクリア
465 */
466Inline void
467clear_int(INTNO intno)
468{
469 gicd_clear_pending(intno);
470}
471
472/*
473 * 割込み要求のチェック
474 */
475Inline bool_t
476probe_int(INTNO intno)
477{
478 return(gicd_probe_pending(intno));
479}
480
481#endif /* TOPPERS_MACRO_ONLY */
482#endif /* TOPPERS_GIC_KERNEL_IMPL_H */
Note: See TracBrowser for help on using the repository browser.