一 旦正确的频率供给给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系列整理(转载小华的部落格) 查看评论