小華的部落格: 2008/1/20 - 2008/1/27

搜尋此網誌

星期四, 1月 24, 2008

2MB SPI Flash Part

這幾天為了換2MB 的SPI Flash part 真的有夠緊張的,因為急著要給產線使用,因此要在3天內把BIOS code porting 好,今天剛好把code給改好了,所以順便留下筆記給自己以後參考。

檢查項目:

1. ICH 能不能把Cycle 轉送到SPI/LPC ,預設是PCI
2.ICH 轉送的位址範圍是否支援到2MB
預設為PCI時,CPU cycle會轉送到 PCI Bus從4G頂端往下 4MB,如果改成轉送到 SPI/LPC時,需設定D0/D8暫存器,並且選擇哪一個Range需要被轉送到LPC/SPI 介面 (即BIOS Size,或Mapping 大小)。

3.EC 是否能支援到2MB ,華x 的EC chip需設定其內部暫存器,一共3個,分別是:
(1) 控制BIOS size大小的暫存器(i386 mode)
(2) SPI 暫存器 (告知EC底下的SPI Flash Part的大小)
(3)??? 暫存器(忘記叫啥名稱了,設定值需要跟BIOS size設定的一樣)

4. 目前是使用SPI cmd去Write/Erase ,但是讀取的時候是使用mapping方式,也就是直接存取線性位址內的資料就可以讀取到BIOS ROM內的資料(其他的就是HW動作做掉,當CPU讀取線性位址時,會把位址轉給LPC介面下的EC,EC內的LPC 介面會有SHM介面,此介面會把此位址訊號轉成SPI實體位址,並透過SPI Controller將資料讀取出來,所以這部份是EC支援),除了這個方式外,還可以自己撰寫SPIRead() routine,不過一般BIOS從Power on開始,這個Routine都還不能執行,因此Power on後,都是EC負責把BIOS ROM資料Mapping 到線性位址。

ex:

線性位址方式讀取BIOS ROM資料 : Memcpy (buffer , address , size);
SPI cmd方式讀取BIOS ROM資料 : SPIRead(buffer,address,size);

void SPIRead(...)
{
SPITransfer(OPCODE=Read , buffer , address,size);
}

星期一, 1月 21, 2008

EFI ㄧ些小筆記

紀錄一些EFI中有關Firmware Device 內的專有名詞的解釋。
如下圖所示,這是EFI 模組化後在Firmware Device 內擺放一些模組化的範例圖:


其中:
1.FD=Firmware Device,他是一個實體的物體容器,用來儲存EFI code以及一些資料。

2.FV=Firmware volume ,卷,他是類似檔案系統的一種管理方式。
1 個FD中可以有很多個 FV

3.ㄧ般常見的FV :
(a) 儲存EFI code,你的BIOS Code可能會分成好幾個不同的FV
(b) 非揮發性資料,像是一些NV Store 變數、config 文件...等。

4. FFS = Firmware File System ,每一個FV都遵循這種檔案格式。
1 個FV 內可以有很多個FFS。

5. Section = 每一個FFS內還可以分成不同的Section。

FD > FV > FFS > Section

Reference
www.intel.com

A20 Gate v.s A20 Mask

前面文章中有提到A20的一些相關資訊,這邊我就畫一張圖來描述清楚一些概念。

對於圖中我們要區分的是A20 Gate與A20 Mask這兩種不同名詞分別所代表的意義為何。

以下是我自己畫的圖:



這邊描述幾個相關的硬體介面電路所代表的意義: 上圖中可以看到有一個A20 Gate (OR 邏輯匣),他分別有兩支source pin,分別連接到南僑與KBC,且分別由Port 92h與KBC控制狀態,另外還有一支輸出pin連接到CPU的A20 Mask接腳。

A20M # 的由來: The Intel 80486 added a special pin named A20M#, which when asserted low forces bit 20 of the physical address to be zero for all on-chip cache or external memory accesses. 看的出來從80486後就改成CPU自己搞....XD

A20 Gate: 一個可以用軟體控制的邏輯匣(AND/OR)...以前A20 gate 輸出腳是接到A20位址線(AND匣,其中一支src pin是接到KBC),後來改接到如上圖的 CPU A20M# 後變成OR匣 (這邊我不確定是否正確,因為我來不及參與過去^^)

A20 Gate 只針對A20有影響,對於其他的A21~A31都沒影響。

補充資料:

我曾經看過某個EC Datasheet,裡面有提到有關Port 92h的相關敘述,由於我並不是EC Engineer ,所以只能想像一下可能的實體電路圖:


這張圖裡面的重點在於EC本身也支援Port 92h功能,也就是說可以設定南橋把Port 92h cycle往EC送(選擇使用EC的Port 92h,此時南橋的Port 92h就失去功效),而EC內有一些組態暫存器,其中有一個是用來控制是否要開啟Port 92h功能,簡單說就是你可以選擇要使用ICH/EC 所提供的Port 92h功能,而使用EC的Port 92h功能時你就必須去設定ICH組態暫存器以及把EC內的Port92_EN_bit 打開。

如果你選擇EC內的Port 92h功能時,從圖中可以看見EC內部也有一個A20 Gate,而他的Source pin是跟KBC電路連接在一起,所以控制的方式會如同我前面畫的那張圖ㄧ樣的控制方式。

這部分補充資料是我自己想像所畫出來的圖,實際的電路圖還是要EC Engineer才能夠回答,所以僅供大家參考一下。

Reference

維基百科