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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[gic]-ARM gicv2和gicv3的中断模型总结

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [gic]-ARM gicv2和gicv3的中断模型总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈

文章目錄

      • GICV2
        • 1、gicv2的中斷模型
        • 2、gicv2寄存器
          • (1)、Distributor register
          • (2)、CPU interface register
        • 3、中斷處理的過程
      • GICV3
        • 1、gicv3的中斷模型
        • 2、gicv3的寄存器
        • 3、中斷處理的過程


★★★ 友情鏈接 : 個人博客導讀首頁—點擊此處 ★★★

GICV2

1、gicv2的中斷模型

在SOC中,中斷產生后,怎么講信息發送給CPU的呢,如下圖所示,畫了一個簡要說明:

ARM CORE只有4根線用于接受中斷,nIRQ、nFIQ、nvIRQ、nvFIQ. 未enable hypevisor時,我們只看nIRQ、nFIQ就可以了;
SOC中的所有中斷都接到gic上,然后gic再輸出nIRQ、nFIQ、nvIRQ、nvFIQ四根信號給ARM core;
ARM CORE在收到中斷信號后,會通過AXI總線去讀寫GIC的寄存器(軟件上是通過memory-map的方式去讀寫),繼而獲取是哪個中斷號產生的中斷。

當一個device需要使用中斷,該device會輸出一個中斷信號線,該中斷線會接到gic上,gic中的cpu interface組件中的GICC_IAR寄存器就會跟著發生變化, 例如:
指紋模組產生了一個中斷,該中斷線接到了gic上,gic收到該中斷后,相應的GICC_IAR寄存器就會發送變化。 這些都是由ASIC來設計的,例如我們由一個指紋中斷,中斷號是59,所謂的該中斷號是59,其實就是該引腳產生中斷信號后,相應的GICC_IAR寄存器會被寫入59數值。

2、gicv2寄存器

(1)、Distributor register

(2)、CPU interface register

3、中斷處理的過程

在中斷產生后,ARM Core接收到IRQ或FIQ信號會跳轉到ARM的IRQ/FIQ異步異常向量表.
該向量表是在linux kernel開機初始化時設置,在該向量表的處理中,會跳轉到gicv2的hander函數:gic_handle_irq()

static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) {u32 irqstat, irqnr;struct gic_chip_data *gic = &gic_data[0];void __iomem *cpu_base = gic_data_cpu_base(gic);do {irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK);irqnr = irqstat & GICC_IAR_INT_ID_MASK;if (likely(irqnr > 15 && irqnr < 1021)) {if (static_key_true(&supports_deactivate))writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);handle_domain_irq(gic->domain, irqnr, regs);continue;}if (irqnr < 16) {writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);if (static_key_true(&supports_deactivate))writel_relaxed(irqstat, cpu_base + GIC_CPU_DEACTIVATE); #ifdef CONFIG_SMP/** Ensure any shared data written by the CPU sending* the IPI is read after we've read the ACK register* on the GIC.** Pairs with the write barrier in gic_raise_softirq*/smp_rmb();handle_IPI(irqnr, regs); #endifcontinue;}break;} while (1); }

我們剖析一下這段代碼:
irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK);
irqnr = irqstat & GICC_IAR_INT_ID_MASK;
GIC_CPU_INTACK是0X0C,對應gicv2文檔中的GICC_IAR,也就是讀取gic中的物理中斷號

if (likely(irqnr > 15 && irqnr < 1021)) 如果是PPI/SPI中斷,則執行handle_domain_irq()

if (irqnr < 16)如果是SGI中斷,則會執行后面的handle_IPI()

GICV3

1、gicv3的中斷模型


在gicv3中,發生了很大的變化,原gicv2組件中的cpu interface移到了ARM Core中,
ARM Core通過系統寄存器的方式訪問cpu interface寄存器(msr/mrs指令),不再是memory-map方式了。
當然了,訪問destributor/redestributor還是通過memory-map方式.
gic同ARM Core的接口,也變成了AXI stream.

當有中斷進來時,gic組件會通過AXI Stream傳輸信息給cpu interface,cpu interface仲裁后,再將FIQ/IRQ信號發送給真正的ARM CORE.

2、gicv3的寄存器

gicv3有組件中:detributor、redetributor、its再gicv3中, cpu interface挪到了ARM Core中
gicv3的寄存器有兩種訪問方式:一類是通過memory-map方式訪問、一類是通過系統寄存器方式訪問;

  • GICD 開頭的寄存器是detributor寄存器,只能通過memory-map方式
  • GICR 開頭的寄存器是redetributor寄存器,只能通過memory-map方式
  • GITS 開頭的寄存器是its寄存器,只能通過memory-map方式
  • GICC 開頭的寄存器是cpu interface寄存器,可以通過memory-map方式
  • ICC 開頭的寄存器是cpu interface寄存器,可以通過系統寄存器方式訪問 —— 對于cpu
    interface寄存器,我們一般采取這種訪問

3、中斷處理的過程

在中斷產生后,ARM Core接收到IRQ或FIQ信號會跳轉到ARM的IRQ/FIQ異步異常向量表.
該向量表是在linux kernel開機初始化時設置,在該向量表的處理中,會跳轉到gicv2的hander函數:gic_handle_irq()

static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) {u32 irqnr;do {irqnr = gic_read_iar();if (likely(irqnr > 15 && irqnr < 1020) || irqnr >= 8192) {int err;if (static_key_true(&supports_deactivate))gic_write_eoir(irqnr);err = handle_domain_irq(gic_data.domain, irqnr, regs);if (err) {WARN_ONCE(true, "Unexpected interrupt received!\n");if (static_key_true(&supports_deactivate)) {if (irqnr < 8192)gic_write_dir(irqnr);} else {gic_write_eoir(irqnr);}}continue;}if (irqnr < 16) {gic_write_eoir(irqnr);if (static_key_true(&supports_deactivate))gic_write_dir(irqnr); #ifdef CONFIG_SMP/** Unlike GICv2, we don't need an smp_rmb() here.* The control dependency from gic_read_iar to* the ISB in gic_write_eoir is enough to ensure* that any shared data read by handle_IPI will* be read after the ACK.*/handle_IPI(irqnr, regs); #elseWARN_ONCE(true, "Unexpected SGI received!\n"); #endifcontinue;}} while (irqnr != ICC_IAR1_EL1_SPURIOUS); }

我們剖析一下這段代碼:
irqnr = gic_read_iar() 使用mrs指令讀取cpu interface寄存器中的ICC_IAR_EL1寄存器,該寄存器記錄著物理中斷號;
if (likely(irqnr > 15 && irqnr < 1020) || irqnr >= 8192) 如果是PPI、SPI、LPI中斷
if (irqnr < 16)如果是SGI中斷,則會執行后面的handle_IPI()

總結

以上是生活随笔為你收集整理的[gic]-ARM gicv2和gicv3的中断模型总结的全部內容,希望文章能夠幫你解決所遇到的問題。

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