日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ATF:Gicv源码解读系列-gicv2_spis_configure_defaults

發布時間:2024/1/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 interface

SPIs從源通過分發器路由到目標再分發器和相關的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位寄存器。


后面這段比較 重要,解釋了為什么這句代碼這么寫的。如果為中斷的安全狀態啟用了關聯路由,則與中斷對應的位與GICD_IGRPMODR<n>中的等效位連接,以形成定義中斷組的2位字段。GICD_IGRPMODR<n>中描述了該字段的編碼。如果針對中斷的安全狀態禁用了關聯路由,則:?對應的GICD_IGRPMODR<n>位為RES0。?對于安全中斷,中斷為安全組0。?對于非安全中斷,中斷為非安全組1。對于INTID m,當DIV和MOD是整數除法和模運算時:?對應的GICD_IGROUP<n>編號n由n=m DIV 32給出。?所需GICD_IGROUP的偏移量為(0x080+(4*n))。?此寄存器中所需的組修飾符位的位數為m MOD 32。通常,所有GICD_IGROUPR<n>和GICD_IGRPMODR<n>寄存器的重置值均為0,**因此所有中斷均為組0,除非通過對適當寄存器的安全訪問將其重新編程為組1。**這里是手動把所有的都寫成了1,每個中斷對于每個pe,所以需要循環。應該是這個中斷,對于所有的PE都是1。中斷是循環量。

/* 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。