source: ssp_aarch64/trunk/arm64_gcc/gic_config.h@ 353

Last change on this file since 353 was 353, checked in by nmir-saito, 6 years ago

initial import

File size: 9.5 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 * Copyright (C) 2018 by Naoki Saito
8 * Nagoya Municipal Industrial Research Institute, JAPAN
9 *
10 * 上記著作権者
11は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再é…
14å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22 * 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24 * の無保証規定を掲載すること.
25 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26 * 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
28 * と.
29 * (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著
32 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
33 * (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
36 * 報告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 * 害からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者
43およびTOPPERSプロジェクトを
44 * å…
45è²¬ã™ã‚‹ã“と.
46 *
47 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52 * の責任を負わない.
53 *
54 * $Id: gic_config.h 714 2018-05-29 05:52:19Z saito $
55 */
56
57/*
58 * カーネルの割込みコントローラ依存部(GIC用)
59 *
60 * このヘッダファイルは,target_config.h(または,そこからインクルード
61 * されるファイル)のみからインクルードされる.
62 * 他のファイルから直接インクルードしてはならない.
63 */
64
65#ifndef TOPPERS_GIC_KERNEL_IMPL_H
66#define TOPPERS_GIC_KERNEL_IMPL_H
67
68#include <sil.h>
69#include "arm64.h"
70
71/*
72 * 割込み番号の定義
73 */
74#define GIC_INTNO_PPI0 16U
75#define GIC_INTNO_SPI0 32U
76
77/*
78 * 割込み優å…
79ˆåº¦ã®æ“ä½œ
80 *
81 * 割込み優å…
82ˆåº¦ã®å†…
83部表現は,uint_t型で表し,0が最高優å…
84ˆåº¦ã§ï¼Œå€¤ãŒå¤§ã
85 * いほど優å…
86ˆåº¦ãŒä¸‹ãŒã‚‹ã‚‚のとする.GICのレジスタ構成と整合させるために,
87 * 優å…
88ˆåº¦ã®æ®µæ•°ãŒ256段階の時にあわせて表す.
89 */
90#define GIC_PRI_LEVEL (TMAX_INTPRI - TMIN_INTPRI + 2)
91
92#if GIC_PRI_LEVEL == 16
93#define GIC_PRI_SHIFT 4
94#define GIC_PRI_MASK UINT_C(0x0f)
95#elif GIC_PRI_LEVEL == 32
96#define GIC_PRI_SHIFT 3
97#define GIC_PRI_MASK UINT_C(0x1f)
98#elif GIC_PRI_LEVEL == 64
99#define GIC_PRI_SHIFT 2
100#define GIC_PRI_MASK UINT_C(0x3f)
101#elif GIC_PRI_LEVEL == 128
102#define GIC_PRI_SHIFT 1
103#define GIC_PRI_MASK UINT_C(0x7f)
104#elif GIC_PRI_LEVEL == 256
105#define GIC_PRI_SHIFT 0
106#define GIC_PRI_MASK UINT_C(0xff)
107#else
108#error Invalid number of priority levels for GIC.
109#endif /* GIC_PRI_LEVEL == 16 */
110
111/* 外部表現への変換 */
112#define EXT_IPM(pri) \
113 (((PRI)((pri) >> GIC_PRI_SHIFT)) - (GIC_PRI_LEVEL - 1))
114
115/* 内
116部表現への変換 */
117#define INT_IPM(ipm) \
118 (((uint_t)((ipm) + (GIC_PRI_LEVEL - 1))) << GIC_PRI_SHIFT)
119
120/*
121 * GICレジスタのアドレスを定義するためのマクロ
122 *
123 * GICレジスタのアドレスを,アセンブリ言語からも参ç…
124§ã§ãã‚‹ã‚ˆã†ã«ã™ã‚‹ãŸ
125 * めのマクロ.
126 */
127#ifndef GIC_REG
128#define GIC_REG(base, offset) ((uint32_t *)(uintptr_t)((base) + (offset ## U)))
129#endif /* GIC_REG */
130
131/*
132 * CPUインタフェース関連の定義
133 */
134#define GICC_CTLR GIC_REG(GICC_BASE, 0x00)
135#define GICC_PMR GIC_REG(GICC_BASE, 0x04)
136#define GICC_BPR GIC_REG(GICC_BASE, 0x08)
137#define GICC_IAR GIC_REG(GICC_BASE, 0x0C)
138#define GICC_EOIR GIC_REG(GICC_BASE, 0x10)
139#define GICC_RPR GIC_REG(GICC_BASE, 0x14)
140#define GICC_HPIR GIC_REG(GICC_BASE, 0x18)
141
142/*
143 * CPUインタフェース制御レジスタ(GICC_CTLR)の設定値
144 * (GICv1でセキュリティ拡張がない場合)
145 */
146#define GICC_CTLR_DISABLE UINT_C(0x00)
147#define GICC_CTLR_ENABLE UINT_C(0x01)
148
149/*
150 * ディストリビュータ関連の定義
151 */
152#define GICD_CTLR GIC_REG(GICD_BASE, 0x000)
153#define GICD_TYPER GIC_REG(GICD_BASE, 0x004)
154#define GICD_IIDR GIC_REG(GICD_BASE, 0x008)
155#define GICD_IGROUPR(n) GIC_REG(GICD_BASE, 0x080 + (n) * 4)
156#define GICD_ISENABLER(n) GIC_REG(GICD_BASE, 0x100 + (n) * 4)
157#define GICD_ICENABLER(n) GIC_REG(GICD_BASE, 0x180 + (n) * 4)
158#define GICD_ISPENDR(n) GIC_REG(GICD_BASE, 0x200 + (n) * 4)
159#define GICD_ICPENDR(n) GIC_REG(GICD_BASE, 0x280 + (n) * 4)
160#define GICD_ISACTIVER(n) GIC_REG(GICD_BASE, 0x300 + (n) * 4)
161#define GICD_ICACTIVER(n) GIC_REG(GICD_BASE, 0x380 + (n) * 4)
162#define GICD_IPRIORITYR(n) GIC_REG(GICD_BASE, 0x400 + (n) * 4)
163#define GICD_ITARGETSR(n) GIC_REG(GICD_BASE, 0x800 + (n) * 4)
164#define GICD_ICFGR(n) GIC_REG(GICD_BASE, 0xc00 + (n) * 4)
165#define GICD_NSCAR(n) GIC_REG(GICD_BASE, 0xe00 + (n) * 4)
166#define GICD_SGIR GIC_REG(GICD_BASE, 0xf00)
167#define GICD_CPENDSGIR(n) GIC_REG(GICD_BASE, 0xf10 + (n) * 4)
168#define GICD_SPENDSGIR(n) GIC_REG(GICD_BASE, 0xf20 + (n) * 4)
169
170/*
171 * ディストリビュータ制御レジスタ(GICD_CTLR)の設定値
172 */
173#define GICD_CTLR_DISABLE UINT_C(0x00)
174#define GICD_CTLR_ENABLE UINT_C(0x01)
175
176/*
177 * 割込みコンフィギュレーションレジスタ(GICD_ICFGRn)の設定値
178 */
179#define GICD_ICFGRn_LEVEL UINT_C(0x00)
180#define GICD_ICFGRn_EDGE UINT_C(0x02)
181
182#ifndef TOPPERS_MACRO_ONLY
183
184/*
185 * CPUインタフェースの操作
186 */
187
188/*
189 * 割込み優å…
190ˆåº¦ãƒžã‚¹ã‚¯ã‚’設定(priは内
191部表現)
192 */
193Inline void
194gicc_set_priority(uint_t pri)
195{
196 sil_wrw_mem(GICC_PMR, pri);
197}
198
199/*
200 * 割込み優å…
201ˆåº¦ãƒžã‚¹ã‚¯ã‚’取得(内
202部表現で返す)
203 */
204Inline uint_t
205gicc_get_priority(void)
206{
207 return(sil_rew_mem(GICC_PMR));
208}
209
210/*
211 * CPUインタフェースの初期化
212 */
213extern void gicc_initialize(void);
214
215/*
216 * CPUインタフェースの終了
217 */
218extern void gicc_terminate(void);
219
220/*
221 * ディストリビュータの操作
222 */
223
224/*
225 * 割込み禁止(割込みイネーブルのクリア)
226 */
227Inline void
228gicd_disable_int(INTNO intno)
229{
230 sil_wrw_mem(GICD_ICENABLER(intno / 32), (1U << (intno % 32)));
231}
232
233/*
234 * 割込み許可(割込みイネーブルのセット)
235 */
236Inline void
237gicd_enable_int(INTNO intno)
238{
239 sil_wrw_mem(GICD_ISENABLER(intno / 32), (1U << (intno % 32)));
240}
241
242/*
243 * 割込みペンディングのクリア
244 */
245Inline void
246gicd_clear_pending(INTNO intno)
247{
248 sil_wrw_mem(GICD_ICPENDR(intno / 32), (1U << (intno % 32)));
249}
250
251/*
252 * 割込みペンディングのセット
253 */
254Inline void
255gicd_set_pending(INTNO intno)
256{
257 sil_wrw_mem(GICD_ISPENDR(intno / 32), (1U << (intno % 32)));
258}
259
260/*
261 * 割込みペンディングのチェック
262 */
263Inline bool_t
264gicd_probe_pending(INTNO intno)
265{
266 return((sil_rew_mem(GICD_ISPENDR(intno / 32)) & (1U << (intno % 32))) != 0U);
267}
268
269/*
270 * 割込みのコンフィグレーション
271 */
272Inline void
273gicd_config(INTNO intno, uint_t config)
274{
275 uint_t shift = (intno % 16) * 2;
276 uint32_t reg;
277
278 reg = sil_rew_mem(GICD_ICFGR(intno / 16));
279 reg &= ~(0x03U << shift);
280 reg |= (config << shift);
281 sil_wrw_mem(GICD_ICFGR(intno / 16), reg);
282}
283
284/*
285 * 割込み要求ラインに対する割込み優å…
286ˆåº¦ã®è¨­å®šï¼ˆpriは内
287部表現)
288 */
289Inline void
290gicd_set_priority(INTNO intno, uint_t pri)
291{
292 uint_t shift = (intno % 4) * 8;
293 uint32_t reg;
294
295 reg = sil_rew_mem(GICD_IPRIORITYR(intno / 4));
296 reg &= ~(0xffU << shift);
297 reg |= (pri << shift);
298 sil_wrw_mem(GICD_IPRIORITYR(intno / 4), reg);
299}
300
301/*
302 * 割込みターゲットプロセッサの設定
303 *
304 * prcsは,ターゲットとするプロセッサを表すビットのビット毎論理和で指
305 * 定する.
306 * プロセッサ0 : 0x01
307 * プロセッサ1 : 0x02
308 * プロセッサ2 : 0x04
309 * プロセッサ3 : 0x08
310 */
311Inline void
312gicd_set_target(INTNO intno, uint_t prcs)
313{
314 uint_t shift = (intno % 4) * 8;
315 uint32_t reg;
316
317 reg = sil_rew_mem(GICD_ITARGETSR(intno / 4));
318 reg &= ~(0xffU << shift);
319 reg |= (prcs << shift);
320 sil_wrw_mem(GICD_ITARGETSR(intno / 4), reg);
321}
322
323/*
324 * ディストリビュータの初期化
325 */
326extern void gicd_initialize(void);
327
328/*
329 * ディストリビュータの終了
330 */
331extern void gicd_terminate(void);
332
333/*
334 * 例外å…
335¥å£ã®GIC操作(gic_support.S)
336 */
337extern void gic_exc_entry(void);
338
339/*
340 * 割込みå…
341¥å£ã®GIC操作(gic_support.S)
342 */
343extern void gic_int_entry(void);
344
345
346
347#endif /* TOPPERS_MACRO_ONLY */
348#endif /* TOPPERS_GIC_KERNEL_IMPL_H */
Note: See TracBrowser for help on using the repository browser.