Note: Vendor ACPI Driver on Windows

之前寫了一些 ACPI Driver 相關的紀錄, 最近看到USB Type C connector for Windows 10 如果不做PD State Machine,下面也需要ACPI Driver 去協調 MCU/EC 所以整理一下手上有的資料 順便重新整理一下網路上很多消失的檔案

ACPIDriver Vista — 這個是Microsoft 最早提供的文件,不過根據實際經驗應該Windows XP 就支援這些功能
ACPI in Vista — 這是早期 WinHEC 2006 的 Presatations
BIOS implement of UCSI — Intel 這是Intel 講如何實作USB Type C Connector System Interface

older WDM/DDK Sample from Windows 2000

這邊提供實際原始碼的實作內容

Older WDM driver implement – 實作了Customer GPIO Button/Indicator LED, 應該是 Intel 用來Demo MID (Mobile Internal Device)做的
Current WDF Driver implement for UCSI - 這就是Microsoft 實作UCSI 的參考Driver了 可以搭配Intel 文件跟 Microsoft 網站資料一起看

下面是想更了解UCSI可以參考的資料
https://www.usb.org/developers/presentations/  — 2017 USB Developer Days  in Taipei

Update:
Linux 下的實作也有 Intel 提交的標準
https://github.com/torvalds/linux/tree/master/drivers/usb/typec/ucsi
所以盡可能透過在使用ACPI/ASL implement 去做這個功能,這樣Windows/Linux 下都有inbox driver 不用另外提供特殊的 customization driver
不過要透過標準UCSI 有一個地方考慮的是成本, 標準UCSI 界面是由 ACPI + EC + PD Controller 構成的,需要付出比較多的成本,目前已經有一個新的方式透過提供軟體的TCPM 取代PD Controller 如下圖 這個架構仍然需要一個MCU 去控制Type C 的界面行為, 系統透過I2C之類的下PD Policy 的行為給MCU

TCPCx

ref. https://www.mail-archive.com/linux-usb@vger.kernel.org/msg92179.html

廣告

Note: new version DumpSMBIOS for Win7/Win8 , use GetSystemFirmwareTable() API

多年前, 我剛開始學習BIOS 的相關資訊時, 曾經寫過一個DumpSMBIOS, 程式基本是建立在Legacy BIOS 下面的設定, 所以是從 0xE000 ~ 0xF000 Segments 中去查找相關資訊,

最近因為工作需求, 需要讀取SMBIOS Table 內的相關資訊, 而執行環境又限定在Win7 跟Win 8之上, 所以採用了 GetSystemFirmwareTable() 去讀取, 因為如果是XP SP2 (32bits) 則只能透過WMI介面去讀取了

而GetSystemFiremwareTable MSDN 沒有太多的資訊說明(要自己看memory dump資料判斷), 所以寫了一個測試用的code 放在 github 上, 有需要的人歡迎自取! 基本上是把之前寫的code 稍微改一下就可以用了, 主要是增加 Unicode 的支援, 跟為了相容 VC2013 的型態檢查

下面的資訊是程式在 Win7 32bit/VisualBox 4.3 執行的結果, 也在實機上測試過 Win7/Win8 執行 x64

———————————————————————————————————————————————————–

We need prepare 457 bytes for recevie SMBIOS/DMI Table
SMBIOS version:2.5
DMI Revision:25
Total length: 449
DMI at address aa390
-=======================================================-
========== BIOS information ==========
Vendor: innotek GmbH
Version: VirtualBox
BIOS Starting Segment: 0xE000
Release Date: 12/01/2006
Image Size: 128K
-=======================================================-
========== System information ==========
Manufacturer: innotek GmbH
Product Name: VirtualBox
Version: 1.2
Serial Number: 0
UUID: 0A04CA8F-8B0E-45BD-AB29-F975CACECE29
SKU Number: Null String
Family: Virtual Machine
-=======================================================-
========== Base Board information ==========
Length: 0xF
Manufacturer: Oracle Corporation
Product Name: VirtualBox
Version: 1.2
Serial Number: 0
Asset Tag Number: Null String
Location in Chassis: Null String
-=======================================================-
========== System Enclosure information ==========
Length: 0xD
Manufacturer: Oracle Corporation
Version: Null String
Serial Number: Null String
Asset Tag Number: Null String
-=======================================================-
========== OEM String ==========
OEM String: vboxRev_96996
-=======================================================-
========== BIOS information ==========
Vendor: Null String
Version:
BIOS Starting Segment: 0x6E00
Release Date: i
Image Size: 14080K
System BIOS version: 0.9
EC Firmware version: 0.0

Note: ACPI 5.0 introduction Hardware-reduced ACPI

ACPI 從 5.0 開始支援非 x86 系統, 如現在最熱門的ARM, 為此他必須移除本來x86系統下由Intel 主導的HW相關設計, 如原本的ACPI Controller 的 GPE 區塊, ACPI 規範稱此為 Hardward-reduced ACPI, 可以看出這是Microsoft為了讓 Windows 8 可以跨x86 & ARM 兩種不同平台的努力(由規格中的提案人可得知, MSFT-0001 HW-reduced ACPI, 另外可以該提案後的影響章節直接快速定位到想要了解的部分)

下面是 3.11.1的內容

ACPI offers an alternative platform interface model that removes ACPI hardware requirements for platforms that do not implement the PC Architecture. In the Hardware-reduced ACPI model, the Fixed hardware interface requirements of Chapter 4 are removed, and Generic hardware interfaces are used instead. This provides the level of flexibility needed to innovate and differentiate in low-power hardware designs while enabling support by multiple Operating Systems.

  • UEFI firmware interface for boot (Legacy BIOS is not supported).
  • Boot in ACPI mode only (ACPI Enable, ACPI Disable, SMI_CMD and Legacy mode are not
    supported)
  • No hardware resource sharing between OSPM and other asynchronous operating environments, such as UEFI Runtime Services or System Management Mode. (The Global Lock is not supported)
  • No dependence on OS-support for maintaining cache coherency across processor sleep states (Bus Master Reload and Arbiter Disable are not supported)

由上可以看出 UEFI + ACPI mode only 可以看出已經拋棄x86 PC 相容的包袱(沒有LegacyBIOS ACPI 必須在 E/F Segement的要求, ARM 本身也沒有 SMI的設計),  沒有SM/Runtime Services 主要應該MSFT不想要系統中還有一個可以讓 OS有不知不覺的管理層, 這樣對MSFT來說增加了被Rookit的風險, 最後應該可以有更理想的電源管理方式

Hardward-reduced ACPI 主要影響的章節

  • 3.11.x,
  • 4, 4.1.x, 4.3.7,
  • 5.2.9, 5.2.9.1,
  • 6.4.2.1, 6.4.3.6,
  • 7.2.11, 7.3.4,
  • 9.6,
  • 12, 12.1, 12.6, 12.11, 12.11.1,
  • 15, 15.1.x, 15.3, 15.3.1.x,
  • 18.5.55, 18.5.57

Note: About Integrated USB Device & System Fund 0200 WHQL item

Win7 有個測試項目 Single computer Display Object item (SystemFund-0200) , 專門測試系統內建的周邊是否有正確報告. 整合式的周邊因為不能被使用者任意移除所以不會出現在 Device & Printer 的ICON 列表中, 或者是出現在可以安全移除的裝置中!

一般BIOS 工程師會遇到的是 SATA & USB port, SATA 會有對應的控制 bit  可以設定, USB  則要透過 ACPI 去宣告 port 的屬性

Microsoft 已經提供有下列一些文件解釋

要補註的是 ACPI Spec. 應該要參考 4.x (Page 362 at 4.0a), 主要差異在於3.x中提到的 Integrated HUB 的Device Object 已經移除, 如果ASL code中有這一層, 實際上測試是錯誤的
非正式的做法是 _UPC 傳回的是 unconnectable
目前正式做法就是同時透過 _UPC & _PLD 宣告成 connectable, 與 invisiable, Microsoft 有提供下圖的流程解釋