二、PCI總線命令

1、總線命令

總線命令的作用是用來規定主、從設備之間的傳輸類型,它出現於地址期的C/BE[3..0]#線上。這裏的主設備是指通過仲裁而獲得總線控制權的設備;從設備是指在C/BE[3..0]#上出現命令的同時,被AD[31..0]線上的地址所選中的設備。

1.1、總線命令編碼

下表給出了總線命令的編碼及類型說明。其中,命令編碼中的“1”表示高電平,“0”表示低電平。

C/BE[3..0]# 命令類型說明
0 0 0 0 中斷應答(中斷識別)
0 0 0 1 特殊週期
0 0 1 0 I/O讀(從I/O口地址張讀數據)
0 0 1 1 I/O寫(從I/O地址空間寫數據)
0 1 0 0 保留
0 1 0 1 保留
0 1 1 0 存儲器讀(從內存空間映像中讀數據)
0 1 1 1 存儲器寫(向內存空間映像中寫數據)
1 0 0 0 保留
1 0 0 1 保留
1 0 1 0 配置讀
1 0 1 1 配置寫
1 1 0 0 存儲器多行讀
1 1 0 1 雙地址週期
1 1 1 0 存儲器一行讀
1 1 1 1 存儲器寫並無效

下面對各條命令作較爲詳細的說明。

1、中斷應答命令

中斷應答命令是一個讀命令,並且對中斷控制器的尋址採用隱含方式,也就是說,該地址是邏輯地址而不明顯出現於地址期,回送的中斷矢量的長度由字節使能信號來表示。如下圖所示,途中互相指着對方尾部的兩個小箭頭表示過度週期,該週期的設定,是爲了避免當一個設備停止驅動該信號而兩一個設備開始驅動時可能發生的衝突。

上圖說明了一個X86的中斷應答在PCI總線上進行的情況。這僅作爲一個例子,其中的字節使能是單一字節。一般情況下,字節使能信號用來確定哪些字節是傳輸中要設計的。從圖中可以看出,在地址期,儘管AD[31..0]中不含有有效地址,但必須將它們驅動到穩定狀態。在中斷應答過程中,PAR信號是有效的,而且別用來進行奇偶校驗。對中斷應答命令的響應只能是一個設備,並且響應的設別必鬚髮出響應的DEVSEL#信號,同時在TRDY#信號有效時必須返回中斷向量。另外中斷應答週期於其它週期一樣可插入等待週期。

由於PCI總線中的中斷應答採用的是單個週期,這與傳統的8259雙週期的應答是不同的,因此在橋路應把處理機的雙週期格式變換成PCI上的單次格式,這隻要將處理機上送出的第一個中斷應答請求丟掉即可。

2、特殊週期命令

該命令的作用是爲PCI提供一個簡單的信息廣播機制。它不但能報告處理機的狀態,而且可用來作爲PCI設備間邏輯的側面連接信號(當這些信號不要求精確的時間關係或物理信號同步時)。

特殊週期命令不包含目標地址,而是以廣播的形式發給所有設備。每個接收設備必須自我確定廣播的消息是否適合於它。在特殊週期命令期,不允許PCI設備發出DEVSEL#信號。也就是說,此類對話不需要目標設備的應答,同時負責譯碼的橋也不能將特殊週期命令傳到它的下級總線上,更不能跨橋傳播特殊週期命令。

一個特殊命令週期可以包含可選的由消息決定的數據,它不是由PCI序列器來解釋,而是根據需要傳給與PCI序列器相連的應用硬件。在大多數情況下,顯式的尋址信息時由PCI總線上的三種物理地址空間之一來處理,而不是用特殊週期命令。

特殊週期命令也像其它總線命令一樣,具有一個地址期和一個數據期。地址期開始於FRAME#信號的建立,結束於FRAME#和IRDY#信號的同時撤銷。該命令與其它總線命令的唯一區別就是沒有目標設備響應信號DEVSEL#。

該命令在地址期除了命令字外不含其它有效信息,也沒有地址信息,但是,AD[31..0]要驅動到穩定的電平,併產生奇偶檢驗位。在數據期,AD[31..0]山更罕有消息類型和一個可選的數據字段,消息用AD[15..0]這低16位編碼表示,可選的數據字段用AD[31..16]這高16位編碼表示,但高16位並非所有消息都需要。在特殊週期內無固定的從設備。消息和數據僅在IRDY#有效後的第一個時鐘內有效,以後數據期中所含信息及時序關係由消息來決定。

在地址期中,當C/BE[3..0]# = 0001時,表示時特殊週期命令,而AD[31..0]被驅動位隨機值且忽略不計。在數據期,C/BE[3..0]#要有效,而AD[31..0]各位的情況如下:

1)當AD[15..0] = 0000H時爲SHUTDOWN;

2)當AD[15..0] = 0001H時爲HALT;

3)當AD[15..0] = 0002H時爲X86有關消息;

4)當AD[15..0] = 0003H~FFFH保留;

5)而AD[31..16]含有消息所決定的可選數據字段。

PCI總線定序器啓動該命令的方式與其它命令相同,但終止該命令要由主設備完成。當從設備得到主設備的終止信息時,就知道一次訪問已文成。在這種情況下,配置空間的狀態寄存器的“接收主設備終止位”不能置1。特殊週期命令的完成最快也要5個時鐘週期,同時還要附加一個時鐘週期作爲下一個訪問開始之前的過度週期。

3、I/O讀命令

該命令用來從一個映射到I/O地址i空間的設備中讀取數據。AD[31..0]上提供一個字節地址,全部32位必須完全譯碼;而字節使能信號表示傳送數的多少,必須與字節地址一致。

4、保留命令

該類編碼是爲將來的用途而保留的。PCI的任何設備都不能將它們挪作它用,任何設備也不允許對保留命令編碼作出反應。如果接口中使用了一條保留命令,通常要由主設備終止操作來結束本此訪問。

5、I/O寫命令

該命令用來向一個映射到I/O地址空間的設備寫入數據。全部32位地址必須參加譯碼,字節使能信號表示數據長度,且必須和字節地址一致。

6、存儲器讀命令

該命令用來從一個映射到存儲器地址空間的設備讀取數據。如果能保證無副作用產生時,從設備可以位該命令進行預先讀取。另外,目標設備也要保證在本次PCI傳輸之後保存於臨時緩衝器中的數的一致性(包括數據次序)。這個緩衝器在任何同步事件(如更新I/O狀態寄存器或存儲器標誌)通過此訪問通路之前必須被置爲無效。

7、存儲器寫命令

該命令用來向一個映射到存儲器空間的設備寫入數據。當從設備發出“準備好”信號後,它已經準備對所設計的數據的一致性(包括次序)負責。因此,對於該命令的實現可採用完全同步的方式,或採用其它方法。但應保證任何同步事件通過該訪問路徑之前使數據緩衝區被沖洗。也就是說,主設備在使用了該命令之後可以立即創造一個同步事件。

8、配置讀命令

該命令用來從每個設備的配置空間讀取數據。如果一個設備的IDESEL引腳有效,且AD[1..0] = 00時,那麼該設備即被選定位配置讀命令的目標。在一個配置命令的地址期內,AD[4..2]用於從每個設備的配置空間中的64個雙字寄存器中選出一個。AD[31..11]無意義,AD[10..8]表示一個多功能設備的哪個功能設備被選中。

9、配置寫命令

該命令用來向每個設備的配置空間寫入數據。一個設備被選中的條件是:它的IDSEL信號有效且AD[1..0] = 00。其餘和配置讀命令相同。

10、存儲器多行讀命令

該命令的作用是試圖在主設備斷開連接之前預讀取多行Cache數據。存儲器控制器應保證,只要FRAME#有效,就連續不斷的以流水方式發存儲器請求。該命令預定用於大塊連續數據的傳輸,如果一個對軟件透明的緩衝器來暫存數據的話,通過順序地預讀一個附件的Cache行,可使存儲器系統得到某些性能上的改善。

11、雙地址週期(DAC)命令

該命令用來給支持64位尋址的設備發送64位地址。發送過程需要兩個時鐘週期。對於只有32位尋址能力設備,不得以任何方式對該命令作出反應,只能把它當作保留命令。

12、存儲器一行讀命令

該命令與存儲器讀命令基本相同,不同之處在於它還表示主設備試圖完成多於兩個32位的PCI數據期。此命令也預定用於大塊連續數據的傳輸。這樣存儲器系統的性能會得到一些改進,道理是響應一次請求不僅僅完成一個存儲器的讀週期,而是一直讀到一個Cache的行邊界。和存儲器讀命令的情形一樣,預取緩衝器必須在任何同步事件通過訪問通路之前變爲無效。

13、存儲器寫並無效命令

該命令在語義上與存儲器寫命令相同,不同點是它要保證最小的傳輸量是一個告訴緩存(Cache)的行,也就是說,主設備要在一次PCI傳輸中將尋址的Cache行每個字節都寫入。如果要傳輸下一行的所有字節,允許主設備跨邊界寫入。該命令同時要求主設備的配置寄存器指出Cache行的尺寸。存儲器寫並無效命令也是保證Cache一致性的措施。

1.2、命令使用規則 

配置讀命令和配置寫命令要求所有的PCI設備都以目標設備的形式給予響應,其它所有命令都爲可選項。再PCI總線上執行I/O讀命令時,應保證其執行順序。CPI上的設備應具有可在定位功能或寄存器,以便通過配置寄存器將它們映射到存儲器空間,所有的主、從設備都可根據需要來實現選項命令。但是,某個設備實現了基本的存儲器命令,那麼,它就必須支持所有的存儲器命令,否則,就必須利用別名將這些爲優化性能而設的命令(存儲器一行讀、存儲器多行讀及存儲器寫並無效命令)轉變爲基本的存儲器命令。例如,一個從設備可以不實現存儲器一行讀命令,但是它必須能接受該命令的請求,並按存儲器讀命令來處理。同理,一個從設備可以不實現存儲器寫並無效命令,但它必須能接受該命令的請求,並按存儲器寫命令來處理。

對於系統存儲器的塊數據讀寫,建議在主設備支持的情況下儘量採用存儲器寫並無效命令和存儲器行讀命令。如果主設備確實不能支持上述優化性能的命令,可採用存儲器讀寫命令。

對於使用存儲器讀命令的主設備,所有命令都可進行任何長度的訪問,但最好遵循下述用法原則。儘管存儲器寫並無效命令的實現,要求具有Cache行長度寄存器,但存儲器讀命令最好也使用它。下面是在有和沒有行長度寄存器情況下的用法建議:

1)具有Cache行長度寄存器時

存儲器讀命令用來讀半行或更少;存儲器一行讀用來讀取半行以上到三行;存儲器多行用來讀取三行以上。

2)無Cache行長度寄存器時

存儲器讀命令用於1~2次的數據突然傳輸;存儲器一行讀用於3~12次的數據突發傳輸;存儲器多行讀命令用於13次或更多數據的突發傳輸。

 

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