PCIe 列舉過程

2021-10-10 08:00:53 字數 2945 閱讀 7806

列舉的第乙個過程是rc端通過向bus上發起配置空間訪問獲取整個匯流排拓撲上的裝置資訊。

簡單說來就是去遍歷每個bus,以及bus下device的配置空間。如果讀到有效的device id值(非全f)則認為發現了可用的裝置。

bus device function這3個number的分配是很有意思的事情。對於每個pcie裝置來說,配置空間中並沒有暫存器可以用來配置或者修改bdf number。那麼這3個值在到底是怎麼確定的呢。

經典的說法是,bdf number是由pcie匯流排的硬體拓撲來決定的。這個說法按照pcie的規範來說沒有問題,但前提條件是必須先按照規範對整個匯流排進行列舉。在列舉之前,實際上每個裝置的bdf number是不確定的。[注1]

function number是用於多function裝置用於區分裝置中具體訪問的是哪個function的。那麼對於大部分單function的裝置來說,function number就固定為0;對於多個function的device或者支援虛擬function的device,function number也是由device內部來進行管理和區分的,不需要通過匯流排列舉來確定。

為支援id路由,每個pcie裝置(端點和交換開關)中都應設定有貯存裝置匯流排號和裝置號的暫存器,復位時,該暫存器清0,每當裝置在它的原級鏈路上檢測到乙個type0的 config transaction 事務包時,它就從該tlp頭標中的第8~9位元組「捕獲」匯流排號和裝置 號作為它自己的bus和device號,並貯存入上述匯流排號和裝置號暫存器。所以說在接收至少乙個 type0配置訪問事務包以前,裝置不會響應除配置週期以外的任何事務。pcie協 議中沒有定義貯存匯流排號和裝置號資訊的配置空間單元,只是規定了它必須做這件事。

兩個對接的pcie裝置,主裝置是rc端,從裝置是ep端,那麼上電復位後,ep是如何獲取自身的bus number的呢?

在這樣的乙個pcie結構中,上電復位後,rc端發起乙個對ep的配置訪問事務,ep會解析配置請求中的bus number,並儲存下來,作為自身的bus number號。之後就可以相應其他tlp事務了。也就是說,上電復位後,ep必須先接收到乙個配置請求,然後才能響應其他tlp事務。

@【注1】,這裡提一點,如果沒有按照規範對裝置進行列舉。對於rc直接接乙個ep device的情況,在裸機的環境下實際上rc的driver可以為對端ep分配任意的bus和device number。因為pcie是點對點連線,第一筆type0的 config transaction 事務的bus和device number無論是何值,都會被對端ep接收到,並儲存下來作為自己的bus和device number。後續用這個bus和device number就可以訪問對端的ep裝置,直到ep裝置復位。

前面內容已經說明了乙個裝置的bdf number的確定,那麼列舉的過程也就是rc的系統軟體通過配置空間訪問來確定以及掃瞄整個匯流排拓撲的過程。

列舉的第乙個過程是rc端通過向bus上發起配置空間訪問獲取整個匯流排拓撲上的裝置資訊。

簡單說來就是去遍歷每個bus,以及bus下device的配置空間。如果讀到有效的device id值(非全f)則認為發現了可用的裝置。

bus device function這3個number的分配是很有意思的事情。對於每個pcie裝置來說,配置空間中並沒有暫存器可以用來配置或者修改bdf number。那麼這3個值在到底是怎麼確定的呢。

經典的說法是,bdf number是由pcie匯流排的硬體拓撲來決定的。這個說法按照pcie的規範來說沒有問題,但前提條件是必須先按照規範對整個匯流排進行列舉。在列舉之前,實際上每個裝置的bdf number是不確定的。[注1]

function number是用於多function裝置用於區分裝置中具體訪問的是哪個function的。那麼對於大部分單function的裝置來說,function number就固定為0;對於多個function的device或者支援虛擬function的device,function number也是由device內部來進行管理和區分的,不需要通過匯流排列舉來確定。

為支援id路由,每個pcie裝置(端點和交換開關)中都應設定有貯存裝置匯流排號和裝置號的暫存器,復位時,該暫存器清0,每當裝置在它的原級鏈路上檢測到乙個type0的 config transaction 事務包時,它就從該tlp頭標中的第8~9位元組「捕獲」匯流排號和裝置 號作為它自己的bus和device號,並貯存入上述匯流排號和裝置號暫存器。所以說在接收至少乙個 type0配置訪問事務包以前,裝置不會響應除配置週期以外的任何事務。pcie協 議中沒有定義貯存匯流排號和裝置號資訊的配置空間單元,只是規定了它必須做這件事。

兩個對接的pcie裝置,主裝置是rc端,從裝置是ep端,那麼上電復位後,ep是如何獲取自身的bus number的呢?

在這樣的乙個pcie結構中,上電復位後,rc端發起乙個對ep的配置訪問事務,ep會解析配置請求中的bus number,並儲存下來,作為自身的bus number號。之後就可以相應其他tlp事務了。也就是說,上電復位後,ep必須先接收到乙個配置請求,然後才能響應其他tlp事務。

@【注1】,這裡提一點,如果沒有按照規範對裝置進行列舉。對於rc直接接乙個ep device的情況,在裸機的環境下實際上rc的driver可以為對端ep分配任意的bus和device number。因為pcie是點對點連線,第一筆type0的 config transaction 事務的bus和device number無論是何值,都會被對端ep接收到,並儲存下來作為自己的bus和device number。後續用這個bus和device number就可以訪問對端的ep裝置,直到ep裝置復位。

前面內容已經說明了乙個裝置的bdf number的確定,那麼列舉的過程也就是rc的系統軟體通過配置空間訪問來確定以及掃瞄整個匯流排拓撲的過程。

USB列舉過程詳述

本系統中所謂usb裝置與主機是通過檢測vcc上拉電阻的變化來確定是否有裝置連線的。在d12內部整合了1.5k 的上拉電阻,預設狀態下不與vcc相連,程式執行時可以向d12傳送連線命令使1.5k 電阻連線到vcc,這樣主機便檢測到有裝置連線。它的列舉過程分析如下。裝置連線到匯流排後,裝置從匯流排獲得5...

USB裝置列舉過程

當裝置連線到主機時,按照以下順序進行列舉 1.連線了裝置的hub 在host 查詢其狀態改變端點時返回對應的bitmap,告知host 某個port 狀態發生了改變。2.主機向hub 查詢該port 的狀態,得知有裝置連線,並知道了該裝置的基本特性。3.主機等待 至少100ms 裝置上電穩定,然後向...

USB列舉過程(1)

總的過程 host檢測到device,reset 獲取裝置描述符 host發獲取裝置描述符請求 setup data0 divice返回裝置描述符 in ack host說明已獲取裝置描述符 out data0空資料 lsb先發 對裝置reset,開始設定新位址 新位址 out data0 new ...