2017年5月5日 星期五

UEFI 基本架構

Introduction UEFI 

UEFI是英文Extensible Firmware Interfaces的縮寫, 由Intel提出的. 以下有幾個重要的名稱跟UEFI架構息息相關 (Key Concepts) :


UEFI System Table
Data structure with data information tables to interface with the systems.
System table含有許多的資料結構, 涵蓋active console devices, Runtime Service , Boot Service , system configuration tables such as ACPI, SMBIOS, and the SAL System Table.
當中Boot Service則在ExitBootService之後無法使用,而Runtime Service則在進入OS後仍可使用.



Handle database and Protocol
Callable interface that are registered.
Handle Database 是由Handles和Protocols组成的,可以被任何UEFI Image訪問。在執行完ExitBootServices之後,Handle Database就不存在了。
Handle由一個或多個Protocol所組成, 而Protocol由GUID來表示,每個Protocol都有自定義的GUID.



UEFI Image
The executable content format. The UEFI image主要包含 :
(1) UEFI Application : like OS loader 
(2) UEFI Driver : like UEFI boot service driver and UEFI runtime service driver

這當中使用的memory與退出返回的方式有差異 :

退出或返回时的Action不同:
(A) UEFI Applications:当Image退出或返回时,这种Image会被自动卸载,其内存资源和状态会被释放。
(B) UEFI OS Loader:这是一种特殊类型的Application,通常不会退出或返回,相反的,它会调用gBS-
      >ExitBootService()来把平台的控制权从固件交给OS。
(C) UEFI Boot Service Drivers:这种Image的内存资源和状态在进入操作系统之前都被保存,当OS 
      Loader调用gBS->ExitBootService()时被释放。
(D) UEFI Runtime Drivers:这种Image的内存资源和状态会一直存在。这些Images和UEFI OS并存,并
     且能够被支持UEFI的OS调用。

UEFI Event
Legacy post is Interrupt, EFI post is Event. 
一个UEFI Image可以对Event做以下的事情:
1). 创建一个Event                                                          //CreateEvent()
2). 销毁一个Event                                                          //CloseEvent()
3). 查看一个Event是否处在Signaled状态                       //CheckEvent()
4). 等待一个Event进入Signaled状态                              //WaitForEvent()
5). 请求一个Event从Waiting状态进入到Signaled状态    //SignalEvent()
UEFI沒有中斷INT所以導入event. UEFI Driver经常使用Timer Events来允许Driver周期性的轮询Device。


SMBUS

INTEL SMBUS Protocol


在Bar(0x10)MMIO 或 Bar(0x20)IO的位置都可以


1.Offset:00h下FFh //reset
2.Offset:04h下smbus address (read bit0:1 , Ex : read memory DIMM0 address A1h)
3.Offset:03h下要讀的byte的index
4.Offset:02h下48h read byte command, 4Ch read word command, 54h read block command)
5.Offset:05讀取spd data


針對DDR4 SPD 超過256byte的讀法需要做Switch page (先下dummy cmd to switch page在下正常的SPD address to read)


#define SPD_PAGE_ADDRESS_0           (0x6C)
#define SPD_PAGE_ADDRESS_1           (0x6E)


//Dummy cmd to switch
offset 00 下ff 先清status
offset 04 下6e page1
offset 02 下48 會看到offset00 變44 or 42


//Normal read SPD data from page1 - index 40h
再來讀index 40
offset 00 下 ff 清status
offset 04 下 a1
offset 03 下 40
offset 02 下 48

看offset00 應該要42 表 success

參考資料 :
  1. Trying to read DDR4 SPD? They have 2 pages of 256 bytes each, and you need a dummy write to a special predefined address 0x6E to switch all SPD chips to page 1 (where your byte 320 is located), and than write to 0x6C switch them back to page 0 (to prevent an SPD read failure during next boot). Read this datasheet on page 12 for more info.

關於SMBUS讀取SPD前, 須注意是否有 SPDWD.

SPD Write Disable (SPDWD): When this bit is set to 1, writes to SMBus addresses

2017年5月4日 星期四

UEFI Compiler environment setup step by step

#############################################################################
#                                                                                                                                                                               #
#  UEFI Compiler environment setup step by step (tool chain UDK2017 + Microsoft VS2015 Free)   #
#                                                                                                                                                                               #
#############################################################################

1. Download Visual Studio 2015 Community Edition (FREE) and Installed.

2. Download UDK2017 Tool kit (Choose one) and unzip to your WORKSPACE
    SVN export http://edk2.svn.sourceforge.net/svnroot/edk2/branches/UDK2017

3. Download edk2-BaseTools-win32 and unzip to your  
    WORKSPACE\UDK2017\BaseTools\Bin\Win32
    SVN export https://svn.code.sf.net/p/edk2-toolbinaries/code/trunk/Win32

4. Download Nasm tools for compiler. Excute the file and copy nasm.exe into your  
    WORKSPACE\UDK2017\BaseTools\Bin\Win32

5. Download VC compiler tools and override to your
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

6. Setup your EDK2 compiler
   A) Run Developer Command Propmt for VS2015
   B) Change path to your WORKSPACE  (ex D:\UDK2017)
   C) Run Edk2setup
   D) Change compiler environment D:\UEFI\UDK2017\Conf\target.txt
      ACTIVE_PLATFORM       = MdePkg/MdePkg.dsc
      TARGET                              = RELEASE
      TARGET_ARCH                = X64
      TOOL_CHAIN_TAG          = VS2015x86

7. Run build in VS command line at your WORKSPACE path.

Note. 2017.05.05 First Create the note.


UEFI 基本架構

Introduction  UEFI   UEFI是英文Extensible Firmware Interfaces的縮寫,  由Intel提出的.  以下有幾個重要的名稱跟UEFI架構息息相關 (Key Concepts) : UEFI System Table Dat...