追踨法蘭克

2018年11月13日 星期二

ACPI (3) ACPI Hardware Model

ACPI 前面寫了一些文章,都是參考ACPI Spec 裡面所提到的。 這一章 是ACPI Hardware Model, 故名思義,HW 要Support 這些暫存器才能支援ACPI的功能, 以Intel 為例,這些都是基本的暫存器,還有可能有更多的擴充功能,是屬於Intel Hardware confidential, 也就是非Common 的部分,這裡不會探討。

 
 
(1)PM1 Event Registers
1. PM1a Event Block 這是必需的暫存器,只要support ACPI 的Hardware,如Intel, 一定要實作這些暫存器,他有以下功能:
  • Power Management timer control/status
  • Porocessor power state control/status
  • Global Lock related interfaces
  • Power or Sleep button (fixed register interfaces)
  • System power state control(sleeping/wake control)
2. PM1b Event Block  是 可選擇性的暫存器,可有可無。

這些暫存器 每個block 是32 bit 的指標指向之,而存在FADT 內。如果不支援PM1b Event Block,指標為0.

PM1 Group 就是以上五件事的 Enable / Status, Length 各位32bits 一半,為16bits. 通常會有PM1a, PM1b 不一定有的,可以參考Intel 的Spec.

(2). PM1 Control Registers
PM1 control 暫存器 一樣是包含兩個block,
1. PM1a Control Block 是必需的暫存器,只要support ACPI 的Hardware,如Intel, 一定要實作這些暫存器,他有以下功能:
  • SCI/SMI routing control/status for power management and genernal-purpose events
  • Processor power state control/status
  • Global Lock related interfaces
2. PM1b Control Block 是 可選擇性的暫存器,可有可無。

這些暫存器 每個block 是32 bit 的指標指向之,而存在FADT 內。如果不支援PM1b Control Block,指標為0.

PM1 control register block 必須有一個最小的大小為 2 bytes(16bits)

(3)PM2 Control Register 是 可選擇性的暫存器,可有可無。

(4) PM Timer Register : PM Timer Block 是 選擇性的暫存器,可有可無。當Hardware實作時,會回傳時間. 是唯讀的暫存器,以Intel 為例 運作在3.579545MHz.

(5) Processor Control Block: 這是一個選擇性的暫存器,每一個處理器一個block.

(6) Genernal-Purpose Event Registers: 這個暫存器可以控制Enable/顯示Status,經由 GPIO 接收外部的SCI Event,如_LXX, _EXX, _QXX (_QXX 是透過 EC 或SMBUS 轉接的相關ROOT Event ). (所接入的SCI Event 可能是 LID、Power Button、Sleep Button、Battery、Thermal、PCIE Hotplug、PCIE wake up event等等)這都要看HW 怎麼設計,來決定怎麼處理。





2018年10月31日 星期三

無版權BIOS研究

近期和同業BIOS討論 寫書的事情,內容已深入淺出加實際範例的方式,經過了一個星期,他決定與我聯播BIOS部落格經營一段時間,我們都是電腦大廠的員工,十年BIOS 工作經驗。 格友們有興趣,可以和我們討論合作的可能,或是支持、贊助我們。

Frank Tsai: 廣達電腦
https://frankuefi.blogspot.com/
Cloud Dai: 和碩電腦
https://clouddai.blogspot.com/

2018年4月9日 星期一

S3 會做的事情

當 SLP_TYPx 暫存器 填入S3的值(在\_S3可以找到 Name(\_S3, Package(4){0x5,0x0,0,0}),將會做以下事情:



1. 把Memory的Refresh Rate降到最低(low-power auto-refresh or self-refresh state)

2. 各種Device在Memory的資訊分別存到系統其它地方。

3. 將系統電源移除,僅有部分Device的資訊存在Memory(部分供電),唯一運作的clock只有RTC clock

4. 初始化 cpu,如msr和mtrr。

5. 初始化 cache contorller 至初始開機大小和組態

6. 開啟 memory controller 至 可接受的Memory 存取

7. 跳至 waking vector.

2016年5月24日 星期二

GDT - Global Descriptor Table

在SEC 階段,我們會設定一些暫存器,讓CPU動起來,且會把cache當作Ram來使用,讓此階段的assembly可以正常運作。

以x86為例: flat32.asm

這段程式做了三件事情
1. 初始化GDT (Global Descriptor Table)
2. 切換至16 bit Protected mode
3. 切換至32 bit Protected mode

2015年8月8日 星期六

SMBIOS (System Management BIOS)

SMBIOS (System Management BIOS) 是一個標準 由 DMTF所開發,這個標準的目的是允許作業系統去獲取電腦的資訊。
在設定SMBIOS方面,我們會在Memory的某個地方建立一個Table. 經由解析這個Table,它是可以存取電腦資訊和電腦屬性。

SMBIOS 在 BIOS 會設定之,在POST 階段於各硬體Module 會依據不同的type 存於Memory 中。

SMBIOS Entry Point Table的位置