source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/gic_kernel_impl.h@ 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-chdr;charset=UTF-8
File size: 12.6 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2006-2017 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 * カーネルの割込みコントローラ依存部(GIC用)
42 *
43 * このヘッダファイルは,target_kernel_impl.h(または,そこからインク
44 * ルードされるファイル)のみからインクルードされる.他のファイルから
45 * 直接インクルードしてはならない.
46 */
47
48#ifndef TOPPERS_GIC_KERNEL_IMPL_H
49#define TOPPERS_GIC_KERNEL_IMPL_H
50
51#include <sil.h>
52#include "arm.h"
53
54/*
55 * 割込み番号の数,最小値と最大値
56 */
57#define TNUM_INTNO GIC_TNUM_INTNO
58#define TMIN_INTNO UINT_C(0)
59#define TMAX_INTNO (GIC_TNUM_INTNO - 1)
60
61/*
62 * 割込みハンドラ番号の数
63 */
64#define TNUM_INHNO GIC_TNUM_INTNO
65
66/*
67 * 割込み番号の定義
68 */
69#define GIC_INTNO_SGI0 UINT_C(0)
70#define GIC_INTNO_PPI0 UINT_C(16)
71#define GIC_INTNO_SPI0 UINT_C(32)
72
73/*
74 * 割込み優先度の操作
75 *
76 * 割込み優先度の内部表現は,uint_t型で表し,0が最高優先度で,値が大き
77 * いほど優先度が下がるものとする.GICのレジスタ構成と整合させるために,
78 * 優先度の段数が256段階の時にあわせて表す.
79 */
80#define GIC_PRI_LEVEL (TMAX_INTPRI - TMIN_INTPRI + 2)
81
82#if GIC_PRI_LEVEL == 16
83#define GIC_PRI_SHIFT 4
84#define GIC_PRI_MASK UINT_C(0x0f)
85#elif GIC_PRI_LEVEL == 32
86#define GIC_PRI_SHIFT 3
87#define GIC_PRI_MASK UINT_C(0x1f)
88#elif GIC_PRI_LEVEL == 64
89#define GIC_PRI_SHIFT 2
90#define GIC_PRI_MASK UINT_C(0x3f)
91#elif GIC_PRI_LEVEL == 128
92#define GIC_PRI_SHIFT 1
93#define GIC_PRI_MASK UINT_C(0x7f)
94#elif GIC_PRI_LEVEL == 256
95#define GIC_PRI_SHIFT 0
96#define GIC_PRI_MASK UINT_C(0xff)
97#else
98#error Invalid number of priority levels for GIC.
99#endif /* GIC_PRI_LEVEL == 16 */
100
101/* 外部表現への変換 */
102#define EXT_IPM(pri) \
103 (((PRI)((pri) >> GIC_PRI_SHIFT)) - (GIC_PRI_LEVEL - 1))
104
105/* 内部表現への変換 */
106#define INT_IPM(ipm) \
107 (((uint_t)((ipm) + (GIC_PRI_LEVEL - 1))) << GIC_PRI_SHIFT)
108
109/*
110 * GICレジスタのアドレスを定義するためのマクロ
111 *
112 * GICレジスタのアドレスを,アセンブリ言語からも参照できるようにするた
113 * めのマクロ.
114 */
115#ifndef GIC_REG
116#define GIC_REG(base, offset) ((uint32_t *)((base) + (offset ## U)))
117#endif /* GIC_REG */
118
119/*
120 * CPUインタフェース関連の定義
121 */
122#define GICC_CTLR GIC_REG(GICC_BASE, 0x00)
123#define GICC_PMR GIC_REG(GICC_BASE, 0x04)
124#define GICC_BPR GIC_REG(GICC_BASE, 0x08)
125#define GICC_IAR GIC_REG(GICC_BASE, 0x0C)
126#define GICC_EOIR GIC_REG(GICC_BASE, 0x10)
127#define GICC_RPR GIC_REG(GICC_BASE, 0x14)
128#define GICC_HPIR GIC_REG(GICC_BASE, 0x18)
129
130/*
131 * CPUインタフェース制御レジスタ(GICC_CTLR)の設定値(GICv1でセキュリ
132 * ティ拡張がない場合)
133 */
134#define GICC_CTLR_DISABLE UINT_C(0x00)
135#define GICC_CTLR_ENABLE UINT_C(0x01)
136
137/*
138 * CPUインタフェース制御レジスタ(GICC_CTLR)の設定値(GICv2でセキュリ
139 * ティ拡張がない場合か,拡張がある場合のセキュアモード)
140 */
141#ifdef TOPPERS_SAFEG_SECURE
142#define GICC_CTLR_ENABLEGRP0 UINT_C(0x01)
143#define GICC_CTLR_ENABLEGRP1 UINT_C(0x02)
144#define GICC_CTLR_FIQEN UINT_C(0x08)
145#define GICC_CTLR_CBPR UINT_C(0x10)
146#endif /* TOPPERS_SAFEG_SECURE */
147
148/*
149 * ディストリビュータ関連の定義
150 */
151#define GICD_CTLR GIC_REG(GICD_BASE, 0x000)
152#define GICD_TYPER GIC_REG(GICD_BASE, 0x004)
153#define GICD_IIDR GIC_REG(GICD_BASE, 0x008)
154#define GICD_IGROUPR(n) GIC_REG(GICD_BASE, 0x080 + (n) * 4)
155#define GICD_ISENABLER(n) GIC_REG(GICD_BASE, 0x100 + (n) * 4)
156#define GICD_ICENABLER(n) GIC_REG(GICD_BASE, 0x180 + (n) * 4)
157#define GICD_ISPENDR(n) GIC_REG(GICD_BASE, 0x200 + (n) * 4)
158#define GICD_ICPENDR(n) GIC_REG(GICD_BASE, 0x280 + (n) * 4)
159#define GICD_ISACTIVER(n) GIC_REG(GICD_BASE, 0x300 + (n) * 4)
160#define GICD_ICACTIVER(n) GIC_REG(GICD_BASE, 0x380 + (n) * 4)
161#define GICD_IPRIORITYR(n) GIC_REG(GICD_BASE, 0x400 + (n) * 4)
162#define GICD_ITARGETSR(n) GIC_REG(GICD_BASE, 0x800 + (n) * 4)
163#define GICD_ICFGR(n) GIC_REG(GICD_BASE, 0xc00 + (n) * 4)
164#define GICD_NSCAR(n) GIC_REG(GICD_BASE, 0xe00 + (n) * 4)
165#define GICD_SGIR GIC_REG(GICD_BASE, 0xf00)
166#define GICD_CPENDSGIR(n) GIC_REG(GICD_BASE, 0xf10 + (n) * 4)
167#define GICD_SPENDSGIR(n) GIC_REG(GICD_BASE, 0xf20 + (n) * 4)
168
169/*
170 * ディストリビュータ制御レジスタ(GICD_CTLR)の設定値
171 */
172#define GICD_CTLR_DISABLE UINT_C(0x00)
173#define GICD_CTLR_ENABLE UINT_C(0x01)
174
175/*
176 * 割込みコンフィギュレーションレジスタ(GICD_ICFGRn)の設定値
177 *
178 * 第1ビットは,ARM11 MPCoreおよびGICの早い時期の実装では割込みの通知
179 * 先プロセッサを設定するために使用されている.
180 */
181#define GICD_ICFGRn_LEVEL UINT_C(0x00)
182#define GICD_ICFGRn_EDGE UINT_C(0x02)
183#ifdef GIC_ARM11MPCORE
184#define GICD_ICFGRn_N_N UINT_C(0x00)
185#define GICD_ICFGRn_1_N UINT_C(0x01)
186#endif /* GIC_ARM11MPCORE */
187
188#ifndef TOPPERS_MACRO_ONLY
189
190/*
191 * CPUインタフェースの操作
192 */
193
194/*
195 * 割込み優先度マスクを設定(priは内部表現)
196 */
197Inline void
198gicc_set_priority(uint_t pri)
199{
200 sil_wrw_mem(GICC_PMR, pri);
201}
202
203/*
204 * 割込み優先度マスクを取得(内部表現で返す)
205 */
206Inline uint_t
207gicc_get_priority(void)
208{
209 return(sil_rew_mem(GICC_PMR));
210}
211
212/*
213 * CPUインタフェースの初期化
214 */
215extern void gicc_initialize(void);
216
217/*
218 * CPUインタフェースの終了
219 */
220extern void gicc_terminate(void);
221
222/*
223 * ディストリビュータの操作
224 */
225
226/*
227 * 割込み禁止(割込みイネーブルのクリア)
228 */
229Inline void
230gicd_disable_int(INTNO intno)
231{
232 sil_wrw_mem(GICD_ICENABLER(intno / 32), (1U << (intno % 32)));
233}
234
235/*
236 * 割込み許可(割込みイネーブルのセット)
237 */
238Inline void
239gicd_enable_int(INTNO intno)
240{
241 sil_wrw_mem(GICD_ISENABLER(intno / 32), (1U << (intno % 32)));
242}
243
244/*
245 * 割込みペンディングのクリア
246 */
247Inline void
248gicd_clear_pending(INTNO intno)
249{
250 sil_wrw_mem(GICD_ICPENDR(intno / 32), (1U << (intno % 32)));
251}
252
253/*
254 * 割込みペンディングのセット
255 */
256Inline void
257gicd_set_pending(INTNO intno)
258{
259 sil_wrw_mem(GICD_ISPENDR(intno / 32), (1U << (intno % 32)));
260}
261
262/*
263 * 割込みペンディングのチェック
264 */
265Inline bool_t
266gicd_probe_pending(INTNO intno)
267{
268 return((sil_rew_mem(GICD_ISPENDR(intno / 32)) & (1U << (intno % 32)))
269 != 0U);
270}
271
272/*
273 * ソフトウェア生成割込み(SGI)の生成
274 */
275Inline void
276gicd_raise_sgi(INTNO intno)
277{
278 sil_wrw_mem(GICD_SGIR, (0x02000000 | intno));
279}
280
281/*
282 * 割込みのコンフィグレーション
283 */
284Inline void
285gicd_config(INTNO intno, uint_t config)
286{
287 uint_t shift = (intno % 16) * 2;
288 uint32_t reg;
289
290 if (intno >= GIC_INTNO_PPI0) {
291 reg = sil_rew_mem(GICD_ICFGR(intno / 16));
292 reg &= ~(0x03U << shift);
293 reg |= (config << shift);
294 sil_wrw_mem(GICD_ICFGR(intno / 16), reg);
295 }
296}
297
298/*
299 * 割込みグループの設定(セキュリティ拡張)
300 */
301Inline void
302gicd_config_group(INTNO intno, uint_t group)
303{
304 uint_t shift = intno % 32;
305 uint32_t reg;
306
307 reg = sil_rew_mem(GICD_IGROUPR(intno / 32));
308 reg &= ~(0x01U << shift);
309 reg |= (group << shift);
310 sil_wrw_mem(GICD_IGROUPR(intno / 32), reg);
311}
312
313/*
314 * 割込み要求ラインに対する割込み優先度の設定(priは内部表現)
315 */
316Inline void
317gicd_set_priority(INTNO intno, uint_t pri)
318{
319 uint_t shift = (intno % 4) * 8;
320 uint32_t reg;
321
322 reg = sil_rew_mem(GICD_IPRIORITYR(intno / 4));
323 reg &= ~(0xffU << shift);
324 reg |= (pri << shift);
325 sil_wrw_mem(GICD_IPRIORITYR(intno / 4), reg);
326}
327
328/*
329 * 割込みターゲットプロセッサの設定
330 *
331 * prcsは,ターゲットとするプロセッサを表すビットのビット毎論理和で指
332 * 定する.
333 * プロセッサ0 : 0x01
334 * プロセッサ1 : 0x02
335 * プロセッサ2 : 0x04
336 * プロセッサ3 : 0x08
337 */
338Inline void
339gicd_set_target(INTNO intno, uint_t prcs)
340{
341 uint_t shift = (intno % 4) * 8;
342 uint32_t reg;
343
344 reg = sil_rew_mem(GICD_ITARGETSR(intno / 4));
345 reg &= ~(0xffU << shift);
346 reg |= (prcs << shift);
347 sil_wrw_mem(GICD_ITARGETSR(intno / 4), reg);
348}
349
350/*
351 * ディストリビュータの初期化
352 */
353extern void gicd_initialize(void);
354
355/*
356 * ディストリビュータの終了
357 */
358extern void gicd_terminate(void);
359
360#endif /* TOPPERS_MACRO_ONLY */
361
362/*
363 * 割込み番号の範囲の判定
364 */
365#define VALID_INTNO(intno) (TMIN_INTNO <= (intno) && (intno) <= TMAX_INTNO)
366
367/*
368 * 割込み要求ラインのための標準的な初期化情報を生成する
369 */
370#define USE_INTINIB_TABLE
371
372/*
373 * 割込み要求ライン設定テーブルを生成する
374 */
375#define USE_INTCFG_TABLE
376
377/*
378 * コア依存部
379 */
380#include "core_kernel_impl.h"
381
382/*
383 * ターゲット非依存部に提供する関数
384 */
385#ifndef TOPPERS_MACRO_ONLY
386
387/*
388 * 割込み属性の設定のチェック
389 */
390Inline bool_t
391check_intno_cfg(INTNO intno)
392{
393 return(intcfg_table[intno] != 0U);
394}
395
396/*
397 * 割込み優先度マスクの設定
398 */
399Inline void
400t_set_ipm(PRI intpri)
401{
402 gicc_set_priority(INT_IPM(intpri));
403}
404
405/*
406 * 割込み優先度マスクの参照
407 */
408Inline PRI
409t_get_ipm(void)
410{
411 return(EXT_IPM(gicc_get_priority()));
412}
413
414/*
415 * 割込み要求禁止フラグのセット
416 */
417Inline void
418disable_int(INTNO intno)
419{
420 gicd_disable_int(intno);
421}
422
423/*
424 * 割込み要求禁止フラグのクリア
425 */
426Inline void
427enable_int(INTNO intno)
428{
429 gicd_enable_int(intno);
430}
431
432/*
433 * 割込み要求がクリアできる割込み番号の範囲の判定
434 */
435#define VALID_INTNO_CLRINT(intno) \
436 (GIC_INTNO_PPI0 <= (intno) && (intno) <= TMAX_INTNO)
437
438/*
439 * 割込み要求がクリアできる状態か?
440 */
441Inline bool_t
442check_intno_clear(INTNO intno)
443{
444 return(true);
445}
446
447/*
448 * 割込み要求のクリア
449 */
450Inline void
451clear_int(INTNO intno)
452{
453 gicd_clear_pending(intno);
454}
455
456/*
457 * 割込みが要求できる状態か?
458 */
459Inline bool_t
460check_intno_raise(INTNO intno)
461{
462 return(true);
463}
464
465/*
466 * 割込みの要求
467 */
468Inline void
469raise_int(INTNO intno)
470{
471 if (intno < GIC_INTNO_PPI0) {
472 gicd_raise_sgi(intno);
473 }
474 else {
475 gicd_set_pending(intno);
476 }
477}
478
479/*
480 * 割込み要求のチェック
481 */
482Inline bool_t
483probe_int(INTNO intno)
484{
485 return(gicd_probe_pending(intno));
486}
487
488#endif /* TOPPERS_MACRO_ONLY */
489#endif /* TOPPERS_GIC_KERNEL_IMPL_H */
Note: See TracBrowser for help on using the repository browser.