source: EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/gic_kernel_impl.h@ 321

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

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 12.5 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 0U
70#define GIC_INTNO_PPI0 16U
71#define GIC_INTNO_SPI0 32U
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 * 割込みのコンフィグレーション
274 */
275Inline void
276gicd_config(INTNO intno, uint_t config)
277{
278 uint_t shift = (intno % 16) * 2;
279 uint32_t reg;
280
281 reg = sil_rew_mem(GICD_ICFGR(intno / 16));
282 reg &= ~(0x03U << shift);
283 reg |= (config << shift);
284 sil_wrw_mem(GICD_ICFGR(intno / 16), reg);
285}
286
287/*
288 * 割込みグループの設定(セキュリティ拡張)
289 */
290Inline void
291gicd_config_group(INTNO intno, uint_t group)
292{
293 uint_t shift = intno % 32;
294 uint32_t reg;
295
296 reg = sil_rew_mem(GICD_IGROUPR(intno / 32));
297 reg &= ~(0x01U << shift);
298 reg |= (group << shift);
299 sil_wrw_mem(GICD_IGROUPR(intno / 32), reg);
300}
301
302/*
303 * 割込み要求ラインに対する割込み優先度の設定(priは内部表現)
304 */
305Inline void
306gicd_set_priority(INTNO intno, uint_t pri)
307{
308 uint_t shift = (intno % 4) * 8;
309 uint32_t reg;
310
311 reg = sil_rew_mem(GICD_IPRIORITYR(intno / 4));
312 reg &= ~(0xffU << shift);
313 reg |= (pri << shift);
314 sil_wrw_mem(GICD_IPRIORITYR(intno / 4), reg);
315}
316
317/*
318 * 割込みターゲットプロセッサの設定
319 *
320 * prcsは,ターゲットとするプロセッサを表すビットのビット毎論理和で指
321 * 定する.
322 * プロセッサ0 : 0x01
323 * プロセッサ1 : 0x02
324 * プロセッサ2 : 0x04
325 * プロセッサ3 : 0x08
326 */
327Inline void
328gicd_set_target(INTNO intno, uint_t prcs)
329{
330 uint_t shift = (intno % 4) * 8;
331 uint32_t reg;
332
333 reg = sil_rew_mem(GICD_ITARGETSR(intno / 4));
334 reg &= ~(0xffU << shift);
335 reg |= (prcs << shift);
336 sil_wrw_mem(GICD_ITARGETSR(intno / 4), reg);
337}
338
339/*
340 * ディストリビュータの初期化
341 */
342extern void gicd_initialize(void);
343
344/*
345 * ディストリビュータの終了
346 */
347extern void gicd_terminate(void);
348
349#endif /* TOPPERS_MACRO_ONLY */
350
351/*
352 * 割込み番号の範囲の判定
353 */
354#define VALID_INTNO(intno) (TMIN_INTNO <= (intno) && (intno) <= TMAX_INTNO)
355
356/*
357 * 割込み要求ラインのための標準的な初期化情報を生成する
358 */
359#define USE_INTINIB_TABLE
360
361/*
362 * 割込み要求ライン設定テーブルを生成する
363 */
364#define USE_INTCFG_TABLE
365
366/*
367 * コア依存部
368 */
369#include "core_kernel_impl.h"
370
371/*
372 * ターゲット非依存部に提供する関数
373 */
374#ifndef TOPPERS_MACRO_ONLY
375
376/*
377 * 割込み優先度マスクの設定
378 */
379Inline void
380t_set_ipm(PRI intpri)
381{
382 gicc_set_priority(INT_IPM(intpri));
383}
384
385/*
386 * 割込み優先度マスクの参照
387 */
388Inline PRI
389t_get_ipm(void)
390{
391 return(EXT_IPM(gicc_get_priority()));
392}
393
394/*
395 * 割込み要求禁止フラグのセット
396 *
397 * intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのセッ
398 * トし,割込みを禁止する.割込み属性が設定されていない割込み要求ライ
399 * ンが指定された場合には,falseを返す.
400 */
401Inline bool_t
402disable_int(INTNO intno)
403{
404 if (intcfg_table[intno] == 0U) {
405 return(false);
406 }
407 gicd_disable_int(intno);
408 return(true);
409}
410
411/*
412 * 割込み要求禁止フラグのクリア
413 *
414 * intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのクリ
415 * アし,割込みを許可する.割込み属性が設定されていない割込み要求ライ
416 * ンが指定された場合には,falseを返す.
417 */
418Inline bool_t
419enable_int(INTNO intno)
420{
421 if (intcfg_table[intno] == 0U) {
422 return(false);
423 }
424 gicd_enable_int(intno);
425 return(true);
426}
427
428/*
429 * 割込み要求のクリア
430 */
431Inline void
432clear_int(INTNO intno)
433{
434 gicd_clear_pending(intno);
435}
436
437/*
438 * 割込み要求のチェック
439 */
440Inline bool_t
441probe_int(INTNO intno)
442{
443 return(gicd_probe_pending(intno));
444}
445
446/*
447 * 割込み要求のセット
448 */
449Inline void
450raise_int(INTNO intno)
451{
452 gicd_set_pending(intno);
453}
454
455#endif /* TOPPERS_MACRO_ONLY */
456#endif /* TOPPERS_GIC_KERNEL_IMPL_H */
Note: See TracBrowser for help on using the repository browser.