ATF:Gicv源码解读系列-gicv2_spis_configure_defaults
1、gicv2_spis_configure_defaults
用來配置SPI的一些默認的屬性,SPI中斷
- SPI:(shared peripheral interrupt),共享外設中斷,該中斷來源于外設,但是該中斷可以對所有的core有效。
在gic的文檔里面有寫這樣一句話,來說明這個中斷。
SPIs are routed from the source through the Distributor to the target Redistributor and the associated CPU interfaceSPIs從源通過分發器路由到目標再分發器和相關的CPU接口,這里有個關鍵詞目標。因此這個目標可以是一個或者多個。
/*******************************************************************************
-
Helper function to configure the default attributes of SPIs.
******************************************************************************/
void gicv2_spis_configure_defaults(uintptr_t gicd_base)
{
unsigned int index, num_ints;num_ints = gicd_read_typer(gicd_base);
1-通過GICD_TYPER獲得最多支持的SPI中斷數量
注:gicd_read_typer(gicd_base);static inline unsigned int gicd_read_typer(uintptr_t base){return mmio_read_32(base + GICD_TYPER);}GICD_TYPER寄存器:提供有關GIC實現支持的功能的信息。它表明:?GIC實施是否支持兩種安全狀態。?GIC實施支持的最大INTID數。?可用作中斷目標的PE數量。num_ints &= TYPER_IT_LINES_NO_MASK; num_ints = (num_ints + 1U) << 5;注the maximum SPI INTID is 32(N+1)-1. For example, 00011 specifies that the maximum SPI INTID is 127.從該字段派生的值指定GIC實現可能支持的最大SPI數。一個實現可能無法實現達到此最大值的所有SPI。/** Treat all SPIs as G1NS by default. The number of interrupts is* calculated as 32 * (IT_LINES + 1). We do 32 at a time.*/ for (index = MIN_SPI_ID; index < num_ints; index += 32U)gicd_write_igroupr(gicd_base, index, ~0U);2-通過IGROUPR設置中斷的分組,對每次pe生效
注*訪問器,用于寫入與中斷“id”對應的GIC分發器IGROUPR,一次32個中斷id。void gicd_write_igroupr(uintptr_t base, unsigned int id, unsigned int val){unsigned int n = id >> IGROUPR_SHIFT;mmio_write_32(base + GICD_IGROUPR + (n << 2), val);}GICD_IGROUPR **控制相應的中斷是在組0還是組1中。**對于SGI和PPI:?當中斷的安全狀態ARE為1時,該中斷的字段為RES0,在這種情況下允許實現RAZ/WI字段。(RAZ/WI:read as zero, write ignored)?GICR_IGROUPR0提供了等效功能。當GICD_CTLR.DS==0時,寄存器為RAZ/WI,用于非安全訪問。與未實現中斷相對應的位是RAZ/WI。筆記當未為安全狀態啟用關聯路由時,訪問GICD_IGROUPR0訪問與GICR_IGROUGR0相同的狀態,并且必須更新與執行訪問的PE關聯的Redistributor狀態。實現必須確保在寫入時掛起的中斷使用舊值或新值,并且必須確保中斷不會丟失或處理多次。變化的影響必須在有限的時間內可見。配置這些寄存器在所有GIC配置中都可用。如果GIC實現支持兩種安全狀態,則這些寄存器是安全的。實現的GICD_IGROUPR<n>寄存器的數量為**GICD_TYPER.ITLinesNumber**+1。寄存器從0開始編號。GICD_IGROUPR0為每個連接的PE存儲。此寄存器為中斷0-31提供組狀態位。屬性GICD_IGROUPR<n>是一個32位寄存器。
/* Setup the default SPI priorities doing four at a time */
for (index = MIN_SPI_ID; index < num_ints; index += 4U)
gicd_write_ipriorityr(gicd_base,
index,
GICD_IPRIORITYR_DEF_VAL)
3-通過GICD_IPRIORITYR設置了每個SPI中斷的優先級
注寄存器:GICD_IPRIORITYR保持相應中斷的優先級,中斷的優先級配置/* Treat all SPIs as level triggered by default, 16 at a time */
for (index = MIN_SPI_ID; index < num_ints; index += 16U)
gicd_write_icfgr(gicd_base, index, 0U);
}
4-通過GICD_ICFGR確定相應的中斷是邊緣觸發的還是電平觸發的。
注:寄存器 GICD_ICFGR確定相應的中斷是邊緣觸發的還是電平觸發的。總結
以上是生活随笔為你收集整理的ATF:Gicv源码解读系列-gicv2_spis_configure_defaults的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高斯滤波的理解与学习
- 下一篇: 网络卡顿怎么办?