小華的部落格: [我所知道的BIOS]->[Chipset Config] 5

搜尋此網誌

網頁

星期四, 9月 27, 2007

[我所知道的BIOS]->[Chipset Config] 5

一旦正確的頻率供給給system後, BIOS便依據既定的POST table(類似行程表)來做事. 首先,與chipset最為相關的便是 [chipset config stage]. 意即,在此階段BIOS必須對 chipset registers填入正確的值,俾使其正常運作. 一般而言,要config下列的 devices:
- NB(還記得前面有提過北橋內部約可分 4 blocks; "有些" blocks 需要 在此 program...)
- SB(即 PCI-ISA bridge)
- ACPI registers
- USB registers
- SATA registers
- PATA registers
...

* 在此所謂的 registers指的是: PCI config registers(除了ACPI registers以外). PCI spec所定義的 PCI config registers 00~3Fh 為 PCI header part,這個範圍的registers並不是此階段的主要工作(當然還是會touch,只是不多),而是稍後BIOS PCI kernel的事情.此階段將 focus on :offset 40h以後的 registers,因為,這些是 device specific的部分,是 chipset自己加function/feature之處 !!!

* ACPI registers通常透過 IO 來存取
Ex. // assume ACPI Base is 800h,要 access ACPI Reg55h
mov dx, 855h
in al, dx ; <- al = ACPI Reg55h's value

* 上述所列的 devices多為 PCI device,也都有唯一的PFA(PCI Function Address,即 bus#,device#,func#),也因此,只要對 device 下 PCI configuration read/write便可以 config device registers.

Ex. 假設: set SATA register offset 52h bit3 = 1;SATA controller PFA is (0,4,3)
=> 簡單的 assembly can be:

mov eax, 80002750h
mov dx, 0cf8h
out dx, eax

mov dx, 0cfeh
in al, dx
or al, 00001000b
out dx, al

事實上每家BIOS都 maintain many "tables" 來說明: 哪一個 device 中的哪些 registers要填?值.相關的 access routine都已經寫好. Programmer只需更改表裡面的值即可 ^_^

*當有人要求改 register setting時,我們必須知道三件事:
1. why (為什麼要改?)
2. what(改成何值?)
3. when(什麼點改?)

*對於 BIOS kernel與 OEM coding的人言,這部分會是較少碰觸的,因為,這些code會由 chipset porting的人負責撰寫及維護.

8 則留言:

chwu0715 提到...

無意間發現你的部落格

很多文章都覺得受益良多

我也剛接觸這門領域不久

很多東西都似懂非懂

不知對於一個新人而言

有沒有什麼好的訓練方式

可以及早進入狀況

小華的部落格 提到...

現在的BIOS有分成Legacy BIOS(組合語言)與UEFI BIOS(C語言),但是這兩種BIOS對於一個剛接觸的新手來說就只是Win98跟WinXp使用方式的差別而已,介面不同,但是要做的事情幾乎一樣。

所以我的建議是多去了解這些工具的用法(組合語言指令/C語言用法)還有多看看Intel IA32 Architecture guide vol1~3(目前最新版是IA64),因為了解系統架構才是最基本的。

如果要快速上手的話,你就先必須知道"設定方式",例如: 如何填CMOS/PCI Register(CF8/CF9),還有如何調整PIRQ/GPIO/ASL Code...等,如何透過SMbus/LPC存取? 何謂KBC/EC? 又要如何把OpROM 載入到記憶體,然後把控制權交給OpROM,執行後又把控制權還給BIOS/CPU Microcode如何更新?...etc. 這些都是基本OEM BIOS會做的事情,至於BIOS核心就必須很了解IA32架構你才有辦法去做。

chwu0715 提到...

首先感謝你的回覆

1.目前接觸的是Legacy BIOS(組合語言)

2.IA32的系統架構有在看,目前也在積極補強一些相關的spec知識,不過還是要有實際做過才有感覺,對我而言如果只是光看的話無法深刻的體會

3.關於你說的設定方式,有的有碰過,像是PCI,ASL code,SMBUS/LPC, CPU Microcode更新,我會去補強你所提到而我沒碰到的部份

4.進入這行的感想是對於一些硬體的知識比以前來的了解,辛苦的是要一直摸索找方向,雖然東西很多要K,問題就在於太多東西反而有時不知從何著手 @@!

5.再次感謝你所提供的意見

匿名 提到...

PCI Register 是 cf8 cfc Index ,Data

PT 提到...

關於SATA register offset 52h bit3 = 1;SATA controller PFA is (0,4,3)
mov eax, 80002750h
依照我的理解方式是
10000000^00000000^00100^011^01010000
所以應該是80002350h


詢問大大 這樣是否有錯?

小華的部落格 提到...

恩恩~~沒錯啦~

Raven W 提到...

哈囉~~板主您好:
由於最近在考慮未來的方向!
想請教一下!!!
BIOS & EC 是一樣的工作內容嗎?
還是其實差異很大?
可以麻煩板主告訴我 EC 的工作內容大概是什麼嗎?

Howard 提到...

Hi tonyya : 6年過去了,tonyya應該也成為一位很厲害的BIOS工程師了吧,我才剛進這行3個月,也非本科系出身,之前更沒做過相關工作,想請問您當出入門的那些資料還有留著嗎?是否有機會能夠分享一下呢?不知道應該去哪裡搜尋這些資料!謝謝~