PCI總線


注:本博客內容主要摘自<PCI Express 體系結構導讀>

一、PCI總線作用

  PCI總線是PC機廣泛使用的外圍高速總線接口,顯卡、網卡、聲卡等高速設備都通過PCI總線接到CPU。

二、PCI總線組成

2.1 x86架構的PCI總線結構

  x86架構采用南北橋結構,北橋集成了AGP控制器可以接顯卡,集成了ddr控制器可以接內存條,集成了PCI總線控制器(HOST主橋)可以接PCI設備。南橋主要接一些低速設備,如USB、LAN、ATA等。如下所示:

  x86架構的PCI總線結構如下所示:

 

2.2 SOC架構的PCI總線結構

而在soc架構的芯片中,HOST主橋則集成在soc中,soc中包含有PCI總線控制器,這個控制器就可以認為是HOST主橋。下圖是freescale的PowerPC處理器,型號為MPC8584,采用soc架構,如下所示:

          圖2.2   MPC8548處理器拓撲圖

2.3PCI設備

  PCI總線有三種類型設備,分別是PCI主設備、PCI從設備、PCI橋設備。PCI從設備只能被動接受來自主橋和其它PCI從設備的讀寫請求,而PIC主設備可以通過總線仲裁獲得總線使用權。PCI設備即可作為主設備也可作為從設備,在PCI總線中的主設備和從設備統稱為PCI Agent,如聲卡、網卡都輸入PCI Agent。PCI橋設備是特殊的PCI設備,用來擴展PCI總線,PCI橋存在使得系統大規模互聯稱為可能。

  PCI橋使得PCI總線有極大的擴展性,一條PCI總線能連接的PCI設備是有數量限制的, 如果需要連接更多的PCI設備,就需要用PCI橋來擴展PCI總線。每一個PCI橋都可以擴展出一條PCI總線,圖2.3所示:

              圖2.3 使用PCI橋擴展PCI總線

 2.4 HOST主橋

  在PCI體系中,有兩類橋,一類是PCI主橋,另外一類是PCI橋設備。HOST主橋的基本功能是完成存儲器域到pci域的轉換和管理pci設備的配置空間。不同處理器對HOST主橋的處理並不相同,x86體系中,HOST主橋集成在北橋中,而soc體系的芯片將HOST主橋集成在soc中。

 三、PCI總線的總線號和設備號分配

  PCI總線使用地址譯碼的方式進行數據傳遞,采用ID譯碼的方式進行配置信息傳遞。每一個PCI設備都有一個BAR(基地址)寄存器,系統通過BAR+偏移地址的方式訪問PCI設備的存儲空間。ID譯碼方式使用PCI設備的ID號,ID號=總線號+設備號+功能號。系統首先需要在初始化時分配PCI總線的總線號、設備號,這樣才能通過ID號訪問PCI設備的配置空間,配置PCI設備。PCI總線初始化指的是系統上電初始化PCI總線時分配PCI總線號、設備號、配置PCI設備Base Address寄存器等初始化操作。

3.1 PCI Agent 和PCI橋的配置空間

  在系統上的初始化時,cpu會通過HOST主橋去配置PCI Agent和PCI橋的配置寄存器,PCI 設備的配置寄存器的初始值通常存儲在PCI設備的E2PROM中,PCI設備上的后會自動加載E2PROM中的信息去配置好相關寄存器。

  1、PCI Agent的配置寄存器

  PCI Agent的配置寄存器如下所示:

  

(1)Device ID(r)和Vendor ID(r):其值有PCISIG組織分配。Vendor ID代表PCI設備的廠商,Device ID代表這個廠商生產具體設備的標號

(2)Revision ID(r):表示PCI設備版本號

(3)Class ID(r):用於將PIC設備分類,有三個字段組成,分別為Base Class Code、Sub Class Code、Inerface。Base Class Code代表設備類型,如顯卡、網卡、PCI橋等。Sub Class Code則對這些設備進行進一步細分。Inerface表示編程接口。如一個正“正向譯碼”的橋設備Class ID這三個字段分別為0x06、0x04、0x01。

(4)Command (rw)寄存器:該寄存器是PCI設備的命令寄存器

(5)Status(rw)寄存器:該寄存器是PCI設備的狀態寄存器

(6)Header Type(r)寄存器:第7位為1表示PCI設備是多功能設備,為0表示單功能設備。0~6位為配置空間類型,0表示PCI Agent配置空間,1表示PCI 橋配置空間。軟件系統用該寄存器區分不同配置空間。

(7)Base Address(rw)寄存器:PCI設備在PCI總線域的基地址寄存,處理器在訪問PCI設備時需要通過“Base Address+偏移地址訪問”。這個寄存器值是有處理器在初始化PCI總線時分配給PCI設備的。

注:其它寄存說明可參考<PCI Express 體系結構導讀>

   2、PCI橋的配置寄存器

  PCI橋配置寄存器如下所示:

  

Device ID(r)、Vendor ID(r)、Revision ID(r)、Class ID(r)、Command (rw)、Status(rw)、Header Type(r)、Base Address(rw)這些寄存器功能和PCI Agent一樣。

(1)Subordinate Bus Number(rw)、Secondary Bus Number(rw)和Primary Bus Number(rw)寄存器:Subordinate Bus Number寄存器存放當前PCI 橋下面編號最大的PCI 總線號,Secondary Bus Number寄存存放當前PCI 橋下面編號最小的PCI 總線號,PCI橋能管理的總線號在Secondary Bus Number~Subordinate Bus Number之間,Primary Bus Number寄存器存放PCI橋上游的PIC總線號。這些寄存器都有系統在初始化時遍歷總線設置。

(2)Memory Base(rw)和Memory Limit(rw)寄存器:這兩個寄存器存放該PCI橋管理的PCI Agent設備的起始及地址和空間大小

3.2 PCI總線BUS號初始化

  系統在上電初始化時系統會使用DFS算法遍歷PCI總線,分配總線號,即初始化PCI橋設備的Subordinate Bus Number(rw)、Secondary Bus Number(rw)和Primary Bus Number(rw)寄存器。。具體過程見<PCI Express 體系結構導讀>2.4.3章節。總線號分配完成后如下所示:

  

 3.3 PCI總線Device號分配

   一條PCI總線上有各種PCI設備,每一個PCI設備在總線上有唯一一個設備號,系統通過“總線號+設備號”定位到需要訪問的設備。PCI寄存器中並沒有“設備號”寄存器,HOST主橋通過IDSEL引腳選擇PCI設備,IDSEL相當於PCI設備的片選信號。HOST主橋並沒有獨立的片選信號引腳去連接每個PCI設備的片選信號,而是將PIC設備的IDSEL信號與AD[31:11]信號相連。通常將AD[31:16]與片選信號相連接。比如主板上有5個PIC卡槽,可以接5個PIC設備,第一個PIC設備的IDSEL信號連接到AD16,表示設備0,HOST主橋只要拉高AD16就選中了設備0。第二個PIC設備的IDSEL信號連接到AD17,表示設備1,HOST主橋只要拉高AD11就選中了設備1,依次類推。由此可將,PIC總線的Device是有硬件連接決定的,即IDSEL信號與AD[31:11]信號的連接情況。

  

 

 四、PCI總線的配置空間訪問

   PCI總線的配置空間是3.2節介紹的PCI設備的配置寄存器。PCI總線通過ID尋址的方式訪問PCI設備的配置空間。ID號有總線號、設備號和功能號組成,總線號和設備號的分配見3.2和3.3節。功能號與PCI設備的體設計相關。系統訪問PCI設備的寄存器是通過ID+寄存器號完成的。PCI總線定義了Type 00h和Type 01h這兩種配置請求,因為Type 00h請求用來訪問與HOST 主橋或PCI橋直接相連的PCI Agent,Type 01h請求用來訪問隔着PCI 橋的PCI Agent。Type 01通過PCI橋時,最終會轉換為Type 00h請求。如圖2.3所示,PCI主橋可以使用Type 00h配置請求訪問PCI設備01,而使用Type 01h請求通過PCI橋1、2或則3轉換為Type 00h配置請求后,訪問PCI總線樹上的PCI設備11、21、22、31或32.

  x86處理器用CONFIG_ADDRESS和CONFIG_DAT這兩個寄存器訪問pci總線的配置空間。

  

             圖4.1 CONFIG_ADDRESS寄存器

但Enable位為1時,HOST主橋將對這個寄存器的讀寫訪問轉換為PCI配置讀寫總線事務。當把PCI設備的ID號寫入到CONFIG_ADDRESS寄存器,且使能Enable位為1時,這個寄存器的內容將復制到PCI的AD[31:0]總線上,如圖4.2和4.3所示分別為Type 01h和Type 00h的配置請求;

  

        圖4.2 CONFIG_ADDRESS寄存器與Type 01h配置請求

         圖4.3 CONFIG_ADDRESS寄存器與Type 00h配置請求

從圖總可以看出,Type 01h配請求把CONFIG_ADDRESS寄存器的第0位設置為1,表示Type 01h請求,然后把寄存器中的內容全部復制到AD[31:0]中。Type 00h請求把CONFIG_ADDRESS寄存器的第0位設置為0,表示Type 00h請求,Bus Number並沒有復制到AD[31:0]中,因為Type 00h請求是訪問與HOST 主橋或PCI橋直接相連的PCI Agent,所以不需要總線號。AD[31:11]與Device Number的字段有關,AD[31:11]有且一位為1,為1的那位即為PCI 設備的片選信號,詳情見3.3節。

 

五、PCI總線的數據交換

  PCI處理器和PCI Agent以及PCI Agent和PCI Agent之間可以使用存儲器讀寫和I/O讀寫事務進行數據交換。PCI 橋並不之間參與數據交換,而是轉發來之HOST 主橋或則PCI Agent設備的數據。PCI總線通過地址尋址訪問PCI 設備的存儲空間,每個PCI設備都有一個基地址寄存器Base Address,PCI總線通過“BAR+偏移地址”的形式來訪問PIC設備的存儲空間。

5.1 存儲器域與PCI總線域

  HOST主橋的主要作用就是隔離存儲器域和PCI總線域,實現存儲器域和PIC總線域相互轉換。存儲器域指的是cpu能直接訪問到的空間,在x86架構中南橋和北橋都能被cpu直接訪問,都是屬於存儲器。在soc架構中,ddr控制器,pci控制器、usb控制器等這些外圍設備也能被cpu直接訪問,也屬於存儲器域。PIC總線域只有PCI Agent、PCI橋和HOST主橋能直接訪問,cpu要想訪問PCI總線域需要通過HOST主橋完成存儲器域到PCI域的地址轉換,PCI設備要想訪問存儲器域也要通過HOST主橋將PCI域地址轉成存儲器域地址。

   

5.2 存儲器地址和PCI總線地址的轉換

  假設所有PCI Agent只使用BAR0寄存器,每個PCI Agent有16MB的存儲空間(0x0100-0000),而且PCI橋不占用PCI總線的地址空間。一共有8個PCI Agent設備,總共需要占用8*16=128MB的地址空間,在PCI總線上分配的空間地址范圍為0x7000-0000~0x77FF-FFFF。系統不能直接訪問PIC 總線域的空間,需要進行地址映射,假設在存儲器域中將0xF000-0000~0xF7FF-FFFF(128MB)這都地址空間映射到了PIC總線的0x7000-0000~0x77FF-FFFF地址空間。但處理器訪問0xF000-0000~0xF7FF-FFFF這段空間時,HOST主橋會認領這個存儲器訪問,並將該存儲器訪問使用的物理地址轉換為0x7000-0000~0x77FF-FFFF這段地址。

  但PCI設備使用DMA訪問存儲器地址空間時,處理器同樣需要將存儲器域的地址映射到PIC總線域的地址。假設在一個處理器系統中,DDR為2GB,器存儲器地址范圍為0x0000-0000~0x7FFF-FFFF,這段地址將映射到PCI總線的0x8000-0000~0xFFFF-FFFF。PCI設備進行DMA傳輸時,必須使用0x8000-0000~0xFFFF-FFFF這段地址,HOST主橋才能認領這個總線事務,並將這個地址轉換為存儲器域地址,並與0x0000-0000~0x7FFF-FFFF這段空間進行數據交換。

    

                   圖5.1 存儲器域PCI總線域的地址映射關系

 

5.3 PCI Agent BAR寄存器和PCI橋Base、Limit寄存器的初始化

  系統在訪問PCI設備的存儲空間之前,需要對PCI Agent BAR寄存器和PCI橋Base、LImit寄存器進行初始化。系統使用DFS算法遍歷PCI總線時,完成對這些寄存器的初始化。

  

            圖5.2 BAR寄存器的初始化

 5.4 處理器向PCI設備寫數據

  下面以圖5.2為例,說明處理器向PCI 設備11寫數據的過程。PCI設備11的PCI總線地址范圍是0x7300-0000~0x73FF-FFFF,這段地址在存儲器域的對應地址范圍是0xF300-000~0xF3FF-FFFF。下面假設處理器要向PCI設備11的0x7300-0008地址寫數據。

  (1)PIC域的0x7300-0008地址對應的處理器域地址是0xF300-0008,因為處理器不能直接訪問PCI域,所以處理器訪問的是0xF300-0008這個地址,當處理器訪問這個地址時,HOST主橋會認領這個訪問請求,因為這個地址映射到了PCI總線域。

  (2)PCI主橋將0xF300-0008這個存儲器域地址轉換為0x7300-0008的PCI域地址,並向PCI總線0發起一次寫訪問。

  (3)0x7300-0008這個地址在PCI橋1的Memory Base寄存器值和Memory Limit寄存器值之間,PCI橋1就認為這個地址在它的管理范圍之內,所以就認領了這個任務,並向PCI總線1轉發了這次任務。

  (4)0x7300-0008這個地址剛在是PCI總線1的PCI設備11的地址空間,PCI設備11就接受了這次寫訪問請求。

5.5 PCI設備的DMA操作

   下面以PCI設備11向存儲器域0x1000-0000~0x1000-FFFF寫數據為例說明PCI設備向處理器發送數據工程

  (1)因為PCI設備不能直接訪問0x1000-0000~0x1000-FFFF這段存儲器域空間,它只能通過訪問映射到這段存儲器域空間的0x9000-0000~0x9000-FFFF PCI域空間進行訪問。

  (2)PCI設備11向PCI總線1發送存儲器寫請求事務,PCI橋1接受到這個事務請求后,發現自己不能處理這個事務,就將這個事務請求向上游總線轉發,也就是PCI總線0.

  (3)HOST主橋發現0x9000-0000~0x9000-FFFF這段地址空間已經映射到了存儲器域的空間,已是將這個PCI域總線地址空間轉換為0x1000-0000~0x1000-FFFF存儲器域地址空間。

  (4)存器控制器將從HOST主橋接受數據,並將寫入存儲器。


免責聲明!

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



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