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

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

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

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