作為實作failover的重要器件,8717PCIE switch既支援virtual switch mode, 也支援basic mode,此外它的DMA、位址視窗也有不同的配置方式。而多塊8717卡既可組合成單NT的Active-Passive模式,也可以組合成雙NT的Active-Active模式,而這些都依賴于 8717 switch上的EEPROM的正确設定。是以,在調試階段,工程師常常需要修改它的設定,一有不慎,就可能燒入錯誤的EEPROM設定,導緻PCIE switch無法正常工作,嚴重的甚至導緻BIOS 都無法啟動。那麼出現這種嚴重的情況,該如何恢複呢?
首先,我們可以咨詢闆卡的技術支援,一般來說他們會根據闆卡的型号和BIOS的版本号,提供一個recover的BIOS版本。如果實在無法恢複,他們可能會建議需要更換或者維修闆卡了。如果已經不在保修期,可能還需要收費。除此之外,我們還可以咨詢PLX8717的技術支援,他們通常會碰到多種8717啟動或者設定的問題,能提供非常有參考價值的建議。總結這些恢複的方法,不外乎下面幾種:
1、通過recover BIOS image進行恢複,這種方法适用于bios image被損壞或者誤燒寫的情況。以超威的某些主機闆為例,可以把一個命名為super.rom的BIOS映像放到usb flash盤的根目錄下,重新開機機器後同時輸入ctrl+Home鍵,直至BIOS在螢幕上列印出“enter recover mode...”,然後釋放ctrl和 home按鍵;
2、如果确定是EEPROM燒寫錯誤導緻的無法啟動,有I2C/SPI燒寫器且确認EEPROM晶片能重新焊上去的情況下,可以找到主機闆上出問題的EEPROM,把它吹下來,放在燒寫器裡,然後連接配接SDK或者直接燒寫EEPROM晶片;
3、如果上面的條件都不具備,可以找到出問題的EEPROM晶片,根據晶片型号或者闆卡原理圖确定晶片的SO和GND引腳,利用飛線,在BIOS枚舉階段把它短接,然後等到OS起來,進入作業系統,斷開SO和 GND引腳, 利用SDK重新燒寫EEPROM。
理論上來講,這些方法都可以恢複EEPROM,使得系統能夠重新啟動,但無論是吹下EEPROM晶片還是利用飛線短接SO和GND,硬體上都是比較麻煩的改動,都需要使用烙鐵,那麼有沒有比較簡便的方法呢?下面分享下本人針對EEPROM錯誤設定導緻BIOS無法啟動的兩次經曆。
我們使用的是超威最新的伺服器,一套伺服器上有兩個節點,每個節點都有一個8717,我們配置成單NT的模式。第一次發生在把8717 Link Port節點的 Bar2/3 視窗大小從2M到128M之後,發現重新開機機器後BIOS停留在”Enumearete PCI bus …... 91”這個地方,無法繼續往下走。我們嘗試了reboot機器、power reset機器都不管用,link port這一端的節點始終無法通過PCI 枚舉這一階段。辛苦嘗試了一天沒有任何進展,在下班的時候人已精疲力盡,正在快要放棄的時候,突然想起8717 databook裡講到的:對link port節點而言,8717就是一個PCIE裝置。也就是說對link port端 的節點,8717可以當作一張卡,那麼我就可以通過關掉 virtual port端的節點來“拔”掉這個卡,這樣link port端節點理論上可以起來。根據這個推斷,馬上進行了實驗,關掉virtual port端節點,然後重新開機link port端節點,果不其然,link port端節點順利啟動!接着重新開機virtual port端節點,通過virtual port端節點的SDK軟體更新Link port端bar2/3 size的設定到預設值,再重新開機link port端機器,發現它和預期的一樣成功啟動!
大約過了一周之後,由于在更新8717 EEPROM過程中的一次魯莽大意,系統BIOS又停留在“Enumerate PCI bus … 91”就再沒法往下走了,但這次我們沒有上次那麼幸運,因為這次出問題的設定在virtual port一側的節點,virtual port所在的NTB就一直在這側節點上,根本無法通過link port端節點的shut down來“拔”掉virtual port。我們先根據技術支援提供的recover BIOS image 進行恢複,反複嘗試了好幾次,沒有任何效果,這個應該是因為recover BIOS也無法skip掉對NTB virtual port的pci 掃描和枚舉。接着嘗試bypass 8717 EEPROM晶片的辦法,但找了幾圈,沒有找到晶片所在的位置,是以通過短接EEPROM SO和GND引腳的辦法一時也行不通。加之手頭上也沒有EEPROM/SPI程式設計器,也不敢冒險把EEPROM吹下來。隻好嘗試軟體的辦法。結合之前的工作經驗,想到一個可以嘗試的辦法就是BIOS裡禁止掉對8717所在的PCIE root complex的枚舉,先確定BIOS能成功啟動到OS,再在OS裡對PCIE rescan重新掃描出所有的PCIE 裝置,這樣一定能夠檢測出virtual port,然後加載相應驅動用SDK更新EEPROM。為此,我在link port端的BIOS的setup menu裡尋找disable 8717所在的IIO端口的選項,非常遺憾沒有找到,隻是看到了一些修改link width/speed設定的選項,雖然感覺希望不大,我還是把它的Link speed從8GT/s修改成2.5GT/s,同時把它16個pcie lan的設定從auto變成4個pciex4,希望這樣的修改設會讓8717和IIO的link traning 失敗。很快做了實驗,發現8717所在的IIO port的Link speed果然變成了2.5GT/s,但是NT link port依然存在,這就意味着在virtual port一側,我也無法在bios裡bypass 對8717NT virtual port的PCI枚舉了,這樣“Enumerate PCI bus ….”的問題勢必繼續存在。最後沒有辦法,隻好依據8717 support的建議,買來電烙鐵,打開主機闆,尋找8717 EEPROM的位置,開始準備短接EEPROM的SO和GND引腳。非常不巧 的是,我們恁是沒找到那塊 EEPROM,但柳暗花明又一村,我們意外在8717晶片附近找到了一個disable/enable PLX的手冊上根本就沒提到的跳線!根據闆卡上的說明,我們在跳線pin上插上了延長的導線,引到主機外,先disable PLX,使得系統能夠通過BIOS的PCI自檢和枚舉,順利進入OS,然後通過延長的導線使能PLX,接着讓8717所在的IIO 重新掃描所有下面的pcie裝置,順利找到了8717下面的upstream port,但是沒有掃描出virtual port,雖然這時SDK可以發現8717的EEPROM,但我用它燒寫的時候發現失敗了。分析了原因,可能是因為手動rescan有些設定不太對,為此我重新做了上面的實驗,不同的是,這次在BISO啟動之後、核心加載之前就重新enable EEPROM,讓核心自己去枚舉所有的裝置。作業系統起來之後,依然可以看到8717的upsteram,但是無法找到virtual port,高興的是這時候SDK能夠重新燒錄virtual port端的EEPROM了。我們把他恢複到預設的正确設定,重新開機機器,再沒有看到那個讨厭的“Enumearte PCI bus …..” hang 了。
總結兩次恢複8717的經驗和教訓,第一條教訓就是燒寫橋片的EEPROM 必須慎之又慎,千萬不能冒進、馬虎,否則恢複過程相當痛苦和麻煩,第二條就是如果碰到EEPROM導緻系統無法啟動的問題,首先需要定位出問題的端口:到底是在virtual port還是link port,如果隻是在link port,可以通過shutdown virtual port端來讓link port端順利啟動,也可以通過僅僅修改virtual port端的EEPROM設定重新開機後來恢複。當然如果問題在virtual port一側,需要先找到bypass/skip PLX橋片或者EEPROM的方法,確定系統能夠再次進入系統之後,再使能PLX或EEPROM,接着嘗試通過軟體恢複EEPROM到正确的設定。
本文轉自存儲之廚51CTO部落格,原文連結:http://blog.51cto.com/xiamachao/1719003 ,如需轉載請自行聯系原作者