【PCIE-2】---PCIE配置空間及訪問方式簡介


  對新手來說,第一步了解PCIE的相關基本概念,第二步了解PCIE配置空間,第三步深入研究PCIE設備枚舉方式。本章主要總結第二步的PCIE配置空間

按照國際慣例,先提問題:

1. 什么是PCIE的配置空間?

2. PCIE設備的配置空間有多大?     PCI和PCIE的配置空間有何區別與聯系?

3. 如何訪問PCIE設備的配置空間?

4. 有幾種類型,都包含什么內容?

帶着上述問題,來進行該部分的總結:

 

什么是PCIE的配置空間?

  每個PCIE設備都有自己的獨立的一段配置空間,該部分空間是這個設備的(可能是一段e2prom),系統會給這個設備分配一段內存空間,CPU訪問這段內存空間即訪問對此設備的配置空間。設備在出廠時,配置空間是有默認初始值的。

PCIE設備的配置空間有多大? PCI和PCIE的配置空間有何區別聯系?

  早期的PCI時期,系統為每個PCI設備分配的內存大小僅有256個Bytes。到后來的PCIE時期,隨着設備性能增強,PCIE設備的配置空間擴展至4K個Bytes。在這里需要注意:

  PCIE一共支持256條Bus,32個Dev,8個Fun。因此在滿負載的情況下,共需內存大小 = 4k * 256 *32*8 = 256K Bytes = 256M,這個256M的內存空間是為PCIE設備准備的空間系統不可用,這也是你的內存條實際可用的總是會小於標稱的主要原因之一。

  PCIE設備發展向前兼容PCI,每個設備的配置空間的前256個Byte是PCI空間,后(4k-256)個Byte的空間是PCIE擴展空間,這是二者的主要區別,另外一個區別就要引出下面的一個問題:

PCI/PCIE設備配置空間的訪問方式----IO訪問  &  內存訪問

  X86系統中,對PCIE設備配置空間的地址映射一般有兩種方式:內存映射和IO映射。因此開發者也可以通過內存訪問或者IO訪問來訪問其配置空間

  PCIE設備的訪問離不開其Bus,Dev,Fun的編號方式,如下圖寄存器所示,Bit[23:16]用來存放Bus號,共8Bit,因此解釋了上述表述為何一共有256條Bus,Bit[15:11]存放Dev,共5bit可存32個Dev,Bit[10:8]存放Bus,共3Bit可存8個Fun。這也就也是了為何上述PCIE設備數一共是256個Bus,32個Dev和8個Fun

  

   無論是采用IO還是內存的方式來訪問配置空間,都離不開上面的圖,下面具體介紹:  

1. IO訪問

  IO應該是Intel X86架構的獨有產物了,簡單可理解為一段存儲空間,用戶通過IN/OUT指令來訪問(內存的話,需要用MOVE指令來進行訪問),部分設備可以映射到IO空間中,開發者通過IO端口訪問這個設備,比如現在介紹的這個:通過CF8 / CFC端口。用戶可通過這組端口來對PCIE的前256個Byte進行訪問,一個指定地址,一個指定數據。代碼如下:

1 /*Access PCI Config Space in IO method*/
2 Address = BIT31|((BUS & 0XFF)<< 16)|((DEV & 0x1F)<<11)|((Fun & 0x7) << 8);
3 IoWrite32(0xCF8, address); //將要讀取的地址寫入到CF8
4 Date32 = IoRead32(0xcfc); //從CFC端口讀出address的數據

  注: IO訪問僅能讀取到前256個Byte,256Byte后的空間需要用內存訪問

2. 內存訪問

  這個其實與IO訪問大同小異,配置空間全部映射到內存中,用戶在確定設備地址后,即可通過內存讀寫的方式進行訪問,如下代碼:

1 /*Write date*/
2 MmioWrite32(PcieBaseAdd + Bus<<16 + Dev<<11 + Fun<<8 + offset, date); //PcieBaseAdd為PCIE在內存中的基地址
3 
4 /*Read date*/ 
5 Value = MmioRead32(PcieBaseAdd + Bus<<16 + Dev<<11 + Fun<<8 + offset);

PCIE配置空間集中類型,都包含什么內容

  配置空間主要有兩種,開發者也是搞清楚這兩種即可,一是Type0:設備空間     二是Type1: Bridge空間

  橋設備空間如下圖所示:下面介紹其中主要內容以及作用:(端點設備空間布局與Bridge空間類似,會簡單一些,沒有一堆Bus Num設備寄存器,CPU一般通過判斷Header確定該設備是什么設備)

                        

  DID&VID:    設備及廠商ID,出場固定且每個設備都不應,枚舉設備時通常判斷此VID來判斷設備是否存在。

  Class Code: 該寄存器是只讀的,通常用來表示該設備類型。用法如下:

    ClassClde Register共3個byte,位於配置空間的[0A:08],分別表示BaseClass, Sub-Class, InterFace

    舉個簡單的例子--使用RW工具查看筆者自己筆記本的Pcie Memory設備的Config空間,如下圖:

               

               

    可以看到該設備的ClassCode Register的值是0x058000,對照PCIE Spec查看,可以看到:

      Add[0A] = 05

      Add[09] = 80

      Add[08] = 00

    05表明該設備是一個Memory的Controller,具體內存子類是其他類型,不屬於RAM&Flash,如下圖:

              

     而Add[08]表示該設備不同的接口,含有多種接口的才會表示出來,如下顯示設備的會含有不同的Interface:

         

  HeaderType: 標明Config空間的類型,同時也標明了Config空間的layout,共有三種:00H--普通端點設備,01H--Bridge設備,02H--CardBus bridges(此外,若該寄存器的Bit7為0.則表明該設備是一個單功能設備 )

  BAR0 & BAR1: 設備空間的基地址

  Subordinate Bus Number: 從屬Bus號,即該Bus下最大的Bus號。

  Secondary Bus Number: 該Bridge下接的Bus號

  Primary Bus Number:     該Bridge上接的Bus號

  Memory Limit:   此設備所分配的內存大小?

  Memroy Base:  此設備在內從中分配的基地址?

 


  

 

 

 

  

 


免責聲明!

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



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