2016-07-28 54 views
0

高速モデルでカイトプロセッサのタイマー割り込みを設定しようとしています。ARM GIC v3でGICR_レジスタを使用する設定

私はGICDを有効にしてタイマ割り込みを有効にしていますが、タイマーが0になると更新中ですが、それをCPUインターフェイスに受信するにはGICRで有効にする必要があります。 GICRで有効にしようとすると、シミュレーションを実行するとレジスタが更新されません。 GICR_IGROUPR0レジスタのみが更新されますが、GICR_ISENABLER0レジスタは更新されません。

なぜ1人の登録者しか更新できないのですか?

GICRレジスタを使用するには特定の設定が必要ですか?なぜ1人のレジスタしか更新できないのですか?

コード:

#define GICC_OFFSET 0x00 
#define GICD_OFFSET 0x00 
#define GICR_OFFSET 0x0100000 
#define GICR_SGI_PPI_OFFSET 0x110000 // for core 0 
/* CBAR is read and then the offset for Distributor and CPU Interfaces   are added */ 
#define GICREG(gic, reg) (*REG32(hal_arm_gic_get_base() + (reg))) 

/* Redistributor control registor GICR_ */ 

#define GICR_CTLR (GICR_OFFSET + 0x00) 

/* Redistributor for SGI and PPI for core 0*/ 
#define GICR_IGROUPR0 (GICR_SGI_PPI_OFFSET + 0x80) 
#define GICR_ISENABLER0 (GICR_SGI_PPI_OFFSET + 0x100) 
#define GICR_ICENABLER0 (GICR_SGI_PPI_OFFSET + 0x180) 
#define GICR_ISPENDR0 (GICR_SGI_PPI_OFFSET + 0x200) 
#define GICR_ICPENDR0 (GICR_SGI_PPI_OFFSET + 0x280) 
#define GICR_ISACTIVER0 (GICR_SGI_PPI_OFFSET + 0x300) 
#define GICR_ICACTIVER0 (GICR_SGI_PPI_OFFSET + 0x380) 
#define GICR_IPRIORITYR(n) (GICR_SGI_PPI_OFFSET + 0x400 + (n) * 4) 
#define GICR_ICFGR0 (GICR_SGI_PPI_OFFSET + 0xc00) 
#define GICR_ICFGR1 (GICR_SGI_PPI_OFFSET + 0xc04) 

/* distribution regs */ 
#define GICD_CTLR    (GICD_OFFSET + 0x000u) 
#define GICD_TYPER    (GICD_OFFSET + 0x004u) 
#define GICD_IIDR    (GICD_OFFSET + 0x008u) 
#define GICD_IGROUPR(n)   (GICD_OFFSET + 0x080u + (n) * 4u) 
#define GICD_ISENABLER(n)  (GICD_OFFSET + 0x100u + (n) * 4u) 
#define GICD_ICENABLER(n)  (GICD_OFFSET + 0x180u + (n) * 4u) 
#define GICD_ISPENDR(n)   (GICD_OFFSET + 0x200u + (n) * 4u) 
#define GICD_ICPENDR(n)   (GICD_OFFSET + 0x280u + (n) * 4u) 
#define GICD_ISACTIVER(n)  (GICD_OFFSET + 0x300u + (n) * 4u) 
#define GICD_ICACTIVER(n)  (GICD_OFFSET + 0x380u + (n) * 4u) 
#define GICD_IPRIORITYR(n)  (GICD_OFFSET + 0x420u + (n) * 4u) 
#define GICD_ITARGETSR(n)  (GICD_OFFSET + 0x800u + (n) * 4u) 
#define GICD_ICFGR(n)   (GICD_OFFSET + 0xc00u + (n) * 4u) 

GIC V3構成:

// Check whether GICv3 system registers are available 
mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 
ubfx r7, r7, #28, #4 
cmp r7, #1 
bne 2f 

// Enable system register accesses 
mrc p15, 4, r7, c12, c9, 5 @ ICC_HSRE 
orr r7, r7, #((1 << 0) | (1 << 3)) 
mcr p15, 4, r7, c12, c9, 5 @ ICC_HSRE 
isb 

// SRE bit could be forced to 0 by firmware. 
// Check whether it sticks before accessing any other sysreg 
mrc p15, 4, r7, c12, c9, 5 @ ICC_HSRE 
tst r7, #ICC_SRE_EL2_SRE 
beq 2f 
mov r7, #0 
mcr p15, 4, r7, c12, c11, 0 @ ICH_HCR 
2: 
mov R0, #0x1 
MRC p15, 0, R0, c12, c12, 6 
orr r0, r0, #0x1 
MCR p15, 0, R0, c12, c12, 6 // Group 0 Enable 
MRC p15, 0, R0, c12, c12, 7 
orr r0, r0, #0x1 
MCR p15, 0, R0, c12, c12, 7 // Group 1 Enable 
+0

'GICR_CTLR'がゼロに追加されていますか?あなたはメモリマップされたアドレスに書き込みますが、私はあなたのプラットフォームに適したGICRベースを持っているとは思いませんか? –

+0

私はPERIPHBASEからGICR_を取得しているので、GICR_の正しいベースを持っており、GICR_IGROUPR0レジスタを更新することができます。シミュレータで直接でも、他のGICR_レジスタを更新することはできません。だから私はGICD_の登録のどこかに問題があるはずだと思っていますか?しかし、私はtrmを読むと、私はGICR設定に関連するものは何も見つかりません。 – user21096

答えて

0

検索と試行の日後、私はそれがARMカイトプロセッサ自体に問題があることがわかりました。 ARMは、パートナー企業向けに開発を開始することを未確認のままリリースしました。

悲しいことにこれを聞いてください。