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

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

set svn:mime-type to files

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