PowerPC PCI-E調試相關資料小結

    最近在PowerPC的板子上加一個FPGA,需要用PCI-E連接,就調試了PCI-E。由於vxWorks本身已經將驅動寫好了,使用時直接調用即可,但是很快就出現了問題:一開始直接使用mmap的方式映射FPGA的總線上到應用程序的內存空間中嘗試讀寫,這種方法比較簡單,不需要內核與應用程序之間的拷貝,效率也應該不錯。然而實際測試中速度卻相當的慢,上網搜索原因,才發現PCI-E默認傳輸每次只能傳四個字節的包!!要想傳大包提高效率,就必須要使用DMA傳輸,否則只能每次發送四個字節。

    因此換用DMA方式,也比較好理解,PCI-E上有一個DMA描述符,內容和傳統DMA類似,只是多配置了一個DMA傳輸鏈,換用之後速度有了不小的改觀。

    下面是在調試過程中看到的一些比較讓人糾結的概念,列舉如下,加深自己的理解。本人菜鳥,所以大多數內容都是根據網上的資料整改的,還望海涵。

MSI 中斷與傳統中斷

    PCI-E支持兩種中斷:傳統INTx中斷和MSI中斷。 比較兩種中斷能讓我們瞭解PCI規範發展的來龍去脈,也能使我們把握PCI發展的技術方向。

    MSI 是 Message Signaled Interrupt (MSI) 的縮寫,PCI-E設備寫一個特定消息到特定地址,從而觸發一個CPU中斷。MSI 相對於傳統中斷有三個主要優勢:

1、共享中斷帶來的性能損失:

    傳統中斷的中斷引腳常常被多個設備共享. 當中斷觸發時, 內核必須依次觸發每個設備相應的中斷處理,這必將損失系統的整體性能.  每個MSI中斷屬於設備所獨有,因此不會產生共享中斷帶來的性能損失。

2、傳統中斷超前產生,實際數據並未真正達到:

    衆所周之,中斷通常是設備發送完數據後,給CPU一箇中斷通知CPU進行處理。但是這種看似簡單的應用如果是傳統中斷也會產生問題,那就是,中斷已經產生,並且數據也已經從設備發出,但是實際上並沒有到達主存。這時候CPU是讀不到它想要的數據的。在這種情況下,CPU必須從設備端讀取寄存器來知道數據是否真的已經到達目的地,PCI事物排序規則確保該寄存器只有在數據真實到達之前纔會更新。這是傳統中斷的另一弊端,而MSI中斷因爲與數據包共享同一通路並且有嚴格的先後順序,所以不會出現這種問題,更不需要更新和查詢設備端寄存器,從而節省了很多開銷。

3、每個設備最多隻有四個傳統中斷引腳:

    對於多功能PCI設備而言,每一個功能最多隻有一箇中斷引腳。設備驅動程序必須查詢設備產生的具體事件,勢必降低中斷處理速度。而一個設備可以支持最多32個MSI中斷,每個中斷有其特定功能,譬如,一些一場情況和錯誤處理有其單獨的中斷能讓驅動程序處理如數據收發中斷更有效。

 

物理地址和總線地址

    這兩個概念主要出現在DMA傳輸中,二者的差別主要是在引入了IOMMU後。在DMA操作的時候,CPU訪問的物理地址會被IOMMU再做一次轉換,轉換後的地址稱爲總線地址。在沒有IOMMU的情況下,物理地址和總線地址是相等的。

    總線地址在外圍總線和內存之間使用,通常它們與處理器使用的物理地址相同(如X86平臺),但這麼做不是必需的.一些計算機體系架構提供了I/O內存管理單元(IOMMU),它實現總線和主內存之間的重新映射。

    在PowerPC平臺上,使用linux內核函數dma_alloc_coherent分配DMA內存時,函數會同時返回總線地址供DMA使用和內核虛擬地址供CPU使用。可以說該函數封裝了總線地址和內核虛擬地址的映射,從而在驅動開發時能方便的對DMA編程。

 

內核邏輯地址和內核虛擬地址

    虛擬地址是CPU核心通過MMU頁表訪問的地址,其地址範圍是3G-4G(無特殊設置),跟用戶態的0-3G的用戶虛擬地址相對應。在3G-4G這段範圍內,有段子集3G -3G+main_memory_size,這段主存大小的虛擬地址空間,由於在MMU頁表映射時是採用的是平坦的線性映射,在LDD裏有專門的稱呼:內核邏輯地址。

    在內核代碼裏,對於內核邏輯地址,可以通過簡單的偏移(3G)獲取對應的物理地址,在內核中是__ph()宏完成這部分功能。

    對於內核虛擬地址,是通過virt_to_phy()來獲取物理地址的。

 

PCI-E的outbound和inbound

    這個見於pcie設備和系統內存互訪問時,outbound是指CPU到設備方向;inbound指Device --> RC(CPU端)方向。從這個概念上說,設備(device)都是外部的,沒有內部設備之說。CPU讀寫RC 端的寄存器時,還是屬於片上系統的範圍,所以既不是inbound 也不是outbound。

    簡單的說,如果CPU讀寫PCI BAR 的總線地址,就是outbound,如果設備讀寫CPU端的主存,就是inbound。

 

Local Memory Map

    Local Memory Map,是指CPU在訪問Memory 和 IO 空間時看到的36位地址空間。即使這些Memory 或IO 空間物理上位於remote設備端,但是從CPU看來,經過memory map之後他們仍然是本地的。所以“Local Memory Map”,真是言簡而意賅的一個專業術語,簡短三個字,卻讓人好生佩服。
Local Memory Map的映射在PowerPC中是由LAW(Local Access Window)定義的。

Local Access Window
    MPC83xx共有10個Local Access Windows。每一個window map一個memory region到一個特定的Target controller,如eLBC,DDR,PCI controller等。這裏我所關心的正是其中的PCI、PCIE 控制器。

 

硬件中斷號和軟件中斷號

這個已經在前面闡述過了,見博文:《Linux中PowerPC的中斷原理》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章