閱讀GIC-500 Technical Reference Manual筆記


GIC-500是ARM GICv3的一個實現,它只支持ARMv8核和實現了GIC Stream協議的GIC CPU Interface,比如Cortex-A53。

關於GIC有四份相關文檔:《Cortex-A53 TRM》介紹了GIC CPU Interface;《ARMv8-A Architecture Profile》提供了GIC CPU Interface的細節;《GIC-500 TRM》介紹了GICv3的一個實現;《GICv3/4 Architecture Specification》介紹了GIC架構細節規范。

這四份文檔可以分為兩部分:GIC CPU Interface和GIC本身。

1 Introduction

SGIs - Software Generated Interrupts

ITS - Interrupt Translation Service

LPIs - Locality-specific Peripheral Interrupts

SPIs - Shared Peripheral Interrupts

PPIs - Private Peripheral Interrupts

 1.1 About the GIC-500

GIC-500支持高達128核,只支持ARMv8架構的核和GIC Stream Protocol接口的GIC CPU接口,Physical interrupt signals,SGIs,從AXI4 slave端口產生的中斷,ITS提供ID轉換等功能

GIC-500從AXI4 Slave或者Physical interrupt inputs接收中斷,和CPU通過AXI4-Stream接口連接,通過AXI4 Slave端口被編程

GIC CPU interface屬於GIC一部分,但不屬於GIC-500,而更傾向於屬於ARMv8 core的一部分。

GIC-500的Distributor->Redistributor->Cluster->Core的拓撲結構

ARM架構通過MPIDR(Multiprocessor Affinity Register)寄存器給給每個CPU制定一個邏輯地址。

ARMv7支持三層,ARMv8支持四層,MPIDR有着明顯的分層結構,<Aff3>.<Aff2>.<Aff1>.<Aff0>

GIC-500只支持兩層,所以MPIDR的值只能是0.0.c.d,c是process層,d是core層GIC-500支持128 core或者32 processor,並且每processor不超過8 core

 1.3 Features

  • 支持高達128 core
  • affinity-level 1支持高達32 cluster
  • 每cluster高達8 core
  • 16個SGIs,ID0-ID15
  • 16個PPIs,ID16-ID31
  • 基於Affinity的可編程中斷路由
  • 中斷屏蔽和優先級控制
  • 每中斷可配置32個優先級

2 Functional Description

2.1 About the functions

ICB: Interrupt Control Block.

ICB State RAM是保存SPIs、PPIs、SGIs各種配置的地方。同樣LPI State RAM和ITE State RAM是保存LPIs和ITS設置的地方。

2.2 Interfaces

Figure 2-1可以看出GIC-500和外部的接口包括:AXI4 Slave Interface、AXI4 Master Interface、RAM Interfaces、Physical interrupt signals、GIC-500 Stream Protocal Interface

AXI4 Slave Interface:可以通過此接口對GIC-500所有部分編程,包括Distributor、Redistributor、ITS。同時也負責處理message-based中斷,也即通過寫AXI4 slave interface產生的中斷。message-based中斷可以產生SGI/LPI類型的中斷。

AXI4 Master Interface:GIC-500通過此接口訪問主內存,包括ITS的translation tables、ITS command queue、LPI配置表、LPI pending table等。

RAM Interfaces:和各種State RAM接口。

Physical interrupt signals:產生SPIs和PPIs類型中斷的信號,可配置成level-sensitive、edge-triggered。

GIC-500 Stream Protocal Interface:用於發送中斷給CPU核,並且從CPU接收激活中斷的通知。

2.3 Operation

GIC-500可以分成三個主要部分:ITS(將外設message-based中斷翻譯成LPIs)、Distributor(接收Wire interrupts或者編程接口過來的中斷,然后根據優先級發送到CPU Interface)、Redistributor(每CPU核一個Redistributor,保存每個核的PPIs/SGIs/:PIs狀態)。

GIC-500支持不同類型的中斷,主要包括:

SGIs - 是核間中斷,從一個核觸發發送到另外核。一個核上觸發的中斷,並不影響其他核上同樣中斷號,並且每個核的SGI設置都是獨立的。可以通過System register或者GICD_SGIR觸發中斷,共16個獨立的SGIs,ID0-ID15

PPIs - 用於和CPU和緊耦合的外設,因此PPI僅發送到相關的CPU核。一個核上觸發的PPI總段並不會影響其他核相同ID號的PPI,而且每個核的PPI設置也是相互獨立的。

SPIs - 用於不和特定CPU和緊耦合的外設,一個核上觸發的SPI中斷,同時也會激活其他核上的中斷。但是也可以通過編程設置SPI到特定的核。GIC-500只允許一個核響應SPI中斷,SPI的設置是核間共享的。SPI可以被wire input或者AXI4 slave programming interface觸發。GIC-500支持高達960各終端,spi[991:32]。

LPIs - 多用於產生message-based類型中斷的外設,一個LPI同一時刻只能指向一個核。

Interrupt group:Group 0、Group 1 Secure、Group 1 Non-secure。

Interrupt triggering:Level-sensitive(這種類型的中斷會一直pending,直到被asserted)和Edge-triggered(上升沿觸發導致中斷變成pending狀態,直到被CPU interface activated時清pending位)。

Power Management:GIC-500不僅支持對應的核被關閉,同時自身也可以被關閉。通過GICR_WAKER寄存器來設置。

2.4 Clocking and resets

GIC-500僅有一個時鍾輸入clk,和一根reset信號resetn。

3 Programmers Model

3.2 The GIC-500 register map

GICD - GIC Distributor register

GICR - GIC Redistributor register

GITS - GIC Interrupt Translation Service register

4 相關延伸

在每個平台的實現中都會對中斷資源進行定義,這是一個GIC-500對應的中斷控制器設置:

/* 0-15:  SGI (software generated interrupts)
 * 16-31: PPI (private peripheral interrupts)
 * 32+:   SPI (shared peripheral interrupts)
 */

#define GIC_PPI_START 16
#define GIC_SPI_START 32

/*
 * software generated interrupts
 */
#define SGI0_INT                      (0)
#define SGI1_INT                    (1)
#define SGI2_INT                    (2)
#define SGI3_INT                    (3)
#define SGI4_INT                    (4)
#define SGI5_INT                    (5)
#define SGI6_INT                    (6)
#define SGI7_INT                    (7)
#define SGI8_INT                    (8)
#define SGI9_INT                    (9)
#define SGI10_INT                    (10)
#define SGI11_INT                    (11)
#define SGI12_INT                    (12)
#define SGI13_INT                    (13)
#define SGI14_INT                    (14)
#define SGI15_INT                    (15)

/*
 * private peripheral interrupts
 */
...
/*
 * shared peripheral interrupts
 */
#define WDT_INT                        (GIC_SPI_START+0)
...

#define NR_SOC_IRQS                 (GIC_SPI_START+77)

 

更深入的分析,就需要和Linux kernel中GIC相關代碼結合了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM