1、PCIE 鏈路訓練、枚舉掃描、配置BAR的順序?
上電覆位後,首先進行鏈路訓練,之後進行枚舉掃描、最後進行基地址寄存器BAR的配置。
完成基地址配置後,就可以通過memory TLP讀寫進行寄存器的訪問了。
2、鏈路訓練、枚舉掃描、配置BAR的過程
PCIE首先進行鏈路訓練,上電覆位後,鏈路訓練狀態機進入L0狀態時鏈路訓練完成後進入gen1模式,如果雙方支持更高的速率,則立即進行gen2/3、4速率的訓練,當鏈路訓練狀態機再次進入L0狀態,鏈路訓練完成。
鏈路訓練完成開始進行枚舉掃描,枚舉掃描主要目的是CPU需要知道系統中有哪些PCIE 設備,並且爲每個設備分配總線號。PCIE的配置讀TLP報文中包含響應設備的bus_number、function_number以及device_number,因此PCIE設備需要知道自己的bus_number是多少。
枚舉掃描過程中,CPU會通過配置讀TLP讀取PCIE配置空間的的verdor id和頭標類型寄存器以及其他配置寄存器,此時PCIE返回的讀返回TLP報文中complete_id(bus_number、function_number、device_number)爲全0,因此此時PCIE不知道自己的bus_number。枚舉過程中,CPU完成對PCIE的配置讀後,會發起配置寫TLP,此時PCIE接受到CPU發來的配第一次置寫TLP,會從TLP中解析出bus_number字段存下來。隨後的配置讀TLP返回中,就會使用bus_number、和function_number和device_number拼接成complete_id。
枚舉掃描完成後,會配置基地址寄存器,給PCIE分配地址空間。通過對BA0/1、BAR2/3等基地址寄存器先進行寫全32’hffff_ffff,得到信息確認PCIE想申請32bit地址還是64bit地址以及向獲得的地址空間,從而分配基地址。