- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/gic_kernel_impl.h
r321 r429 3 3 * Toyohashi Open Platform for Embedded Real-Time Systems 4 4 * 5 * Copyright (C) 2006-201 7by Embedded and Real-Time Systems Laboratory5 * Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory 6 6 * Graduate School of Information Science, Nagoya Univ., JAPAN 7 7 * … … 67 67 * 割込み番号の定義 68 68 */ 69 #define GIC_INTNO_SGI0 0U70 #define GIC_INTNO_PPI0 16U71 #define GIC_INTNO_SPI0 32U69 #define GIC_INTNO_SGI0 UINT_C(0) 70 #define GIC_INTNO_PPI0 UINT_C(16) 71 #define GIC_INTNO_SPI0 UINT_C(32) 72 72 73 73 /* … … 126 126 #define GICC_EOIR GIC_REG(GICC_BASE, 0x10) 127 127 #define GICC_RPR GIC_REG(GICC_BASE, 0x14) 128 #define GICC_HP IR GIC_REG(GICC_BASE, 0x18)128 #define GICC_HPPIR GIC_REG(GICC_BASE, 0x18) 129 129 130 130 /* … … 198 198 gicc_set_priority(uint_t pri) 199 199 { 200 sil_ wrw_mem(GICC_PMR, pri);200 sil_swrw_mem(GICC_PMR, pri); 201 201 } 202 202 … … 230 230 gicd_disable_int(INTNO intno) 231 231 { 232 sil_ wrw_mem(GICD_ICENABLER(intno / 32), (1U << (intno % 32)));232 sil_swrw_mem(GICD_ICENABLER(intno / 32), (1U << (intno % 32))); 233 233 } 234 234 … … 239 239 gicd_enable_int(INTNO intno) 240 240 { 241 sil_ wrw_mem(GICD_ISENABLER(intno / 32), (1U << (intno % 32)));241 sil_swrw_mem(GICD_ISENABLER(intno / 32), (1U << (intno % 32))); 242 242 } 243 243 … … 248 248 gicd_clear_pending(INTNO intno) 249 249 { 250 sil_ wrw_mem(GICD_ICPENDR(intno / 32), (1U << (intno % 32)));250 sil_swrw_mem(GICD_ICPENDR(intno / 32), (1U << (intno % 32))); 251 251 } 252 252 … … 257 257 gicd_set_pending(INTNO intno) 258 258 { 259 sil_ wrw_mem(GICD_ISPENDR(intno / 32), (1U << (intno % 32)));259 sil_swrw_mem(GICD_ISPENDR(intno / 32), (1U << (intno % 32))); 260 260 } 261 261 … … 271 271 272 272 /* 273 * ソフトウェア生成割込み(SGI)の生成 274 */ 275 Inline void 276 gicd_raise_sgi(INTNO intno) 277 { 278 sil_swrw_mem(GICD_SGIR, (0x02000000 | intno)); 279 } 280 281 /* 273 282 * 割込みのコンフィグレーション 274 283 */ … … 279 288 uint32_t reg; 280 289 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); 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 } 285 296 } 286 297 … … 318 329 * 割込みターゲットプロセッサの設定 319 330 * 320 * prcsは,ターゲットとするプロセッサを表すビットのビット毎論理和で指321 * 定する.331 * affinityは,ターゲットとするプロセッサを表すビットのビット毎論理和 332 * で指定する. 322 333 * プロセッサ0 : 0x01 323 334 * プロセッサ1 : 0x02 … … 326 337 */ 327 338 Inline void 328 gicd_set_target(INTNO intno, uint_t prcs)339 gicd_set_target(INTNO intno, uint_t affinity) 329 340 { 330 341 uint_t shift = (intno % 4) * 8; … … 333 344 reg = sil_rew_mem(GICD_ITARGETSR(intno / 4)); 334 345 reg &= ~(0xffU << shift); 335 reg |= ( prcs<< shift);346 reg |= (affinity << shift); 336 347 sil_wrw_mem(GICD_ITARGETSR(intno / 4), reg); 337 348 } … … 373 384 */ 374 385 #ifndef TOPPERS_MACRO_ONLY 386 387 /* 388 * 割込み属性の設定のチェック 389 */ 390 Inline bool_t 391 check_intno_cfg(INTNO intno) 392 { 393 return(intcfg_table[intno] != 0U); 394 } 375 395 376 396 /* … … 393 413 394 414 /* 415 * 割込み要求禁止フラグが操作できる割込み番号の範囲の判定 416 */ 417 #ifdef GIC_SUPPORT_DISABLE_SGI 418 #define VALID_INTNO_DISINT(intno) VALID_INTNO(intno) 419 #else /* GIC_SUPPORT_DISABLE_SGI */ 420 #define VALID_INTNO_DISINT(intno) \ 421 (GIC_INTNO_PPI0 <= (intno) && (intno) <= TMAX_INTNO) 422 #endif /* GIC_SUPPORT_DISABLE_SGI */ 423 424 /* 395 425 * 割込み要求禁止フラグのセット 396 * 397 * intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのセッ 398 * トし,割込みを禁止する.割込み属性が設定されていない割込み要求ライ 399 * ンが指定された場合には,falseを返す. 400 */ 401 Inline bool_t 426 */ 427 Inline void 402 428 disable_int(INTNO intno) 403 429 { 404 if (intcfg_table[intno] == 0U) {405 return(false);406 }407 430 gicd_disable_int(intno); 408 return(true);409 431 } 410 432 411 433 /* 412 434 * 割込み要求禁止フラグのクリア 413 * 414 * intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのクリ 415 * アし,割込みを許可する.割込み属性が設定されていない割込み要求ライ 416 * ンが指定された場合には,falseを返す. 435 */ 436 Inline void 437 enable_int(INTNO intno) 438 { 439 gicd_enable_int(intno); 440 } 441 442 /* 443 * 割込み要求がクリアできる割込み番号の範囲の判定 444 */ 445 #define VALID_INTNO_CLRINT(intno) \ 446 (GIC_INTNO_PPI0 <= (intno) && (intno) <= TMAX_INTNO) 447 448 /* 449 * 割込み要求がクリアできる状態か? 417 450 */ 418 451 Inline bool_t 419 enable_int(INTNO intno) 420 { 421 if (intcfg_table[intno] == 0U) { 422 return(false); 452 check_intno_clear(INTNO intno) 453 { 454 return(true); 455 } 456 457 /* 458 * 割込み要求のクリア 459 */ 460 Inline void 461 clear_int(INTNO intno) 462 { 463 gicd_clear_pending(intno); 464 } 465 466 /* 467 * 割込みが要求できる状態か? 468 */ 469 Inline bool_t 470 check_intno_raise(INTNO intno) 471 { 472 return(true); 473 } 474 475 /* 476 * 割込みの要求 477 */ 478 Inline void 479 raise_int(INTNO intno) 480 { 481 if (intno < GIC_INTNO_PPI0) { 482 gicd_raise_sgi(intno); 423 483 } 424 gicd_enable_int(intno); 425 return(true); 426 } 427 428 /* 429 * 割込み要求のクリア 430 */ 431 Inline void 432 clear_int(INTNO intno) 433 { 434 gicd_clear_pending(intno); 484 else { 485 gicd_set_pending(intno); 486 } 435 487 } 436 488 … … 444 496 } 445 497 446 /*447 * 割込み要求のセット448 */449 Inline void450 raise_int(INTNO intno)451 {452 gicd_set_pending(intno);453 }454 455 498 #endif /* TOPPERS_MACRO_ONLY */ 456 499 #endif /* TOPPERS_GIC_KERNEL_IMPL_H */
Note:
See TracChangeset
for help on using the changeset viewer.