bloggerads

2015年12月5日 星期六

UEFI : programming notes


UEFI是Intel為了取代傳統的Bios而定義的一個架構並將其open source,而Bios vendor基於Intel release的UEFI原始碼下去增加功能以及維護。晶片廠/系統廠的target則是使用Bios vendor提供微調過的版本來撰寫自己特定功能的DXE driver以及PEI階段晶片的Internal setting, 還有安裝一些特定的SMI handle來處理板子相關的硬體問題。

UEFI一共分成SEC->PEI->DXE->BDS->TSL->RT->AL這幾種階段。
我們會將晶片的一些driving 值寫在PEI stage。DXE階段大部分Bios Vendor都有提供相對應的driver。目前只有碰到為了寫Option Rom或做實驗才針對這個device去寫DXE driver。

焦點回到PEI->DXE這兩個關鍵的階段並列出一些重要的觀念:

1.  在boot時,PEI的階段基本上會有兩條路,一條是正常開機呼叫到的function,另一種則是S3 resume呼叫到的function,而Bios 在S3不做DXE init。因此如果是為了加code來patch 問題,必須知道patch的點

2.  PEI 裡面的程式都是叫做module, PEIM, 這些module有些是有相依性的。PEI和PEI互相溝通的橋梁就是PPI,透過這個interface, (*PeiServices)->LocatePpi(), 可以去呼叫已被安裝的service以及去讀取外部的參數

3.  在PEI到DXE時,會透過HOB, (*PeiServices)->GetHobList去得到由PEI階段pass過來的資料

4. 在x86架構就是使用PCI架構及其定義的三種空間, (CFG space / MMIO / IO space),基本上掌握住這三種空間的access方式,加code就不會太難。在早期legacy Bios + DOS的年代要access就是: MMIO 透過指標,IO及CFG space透過IN/OUT指令就可以完成了。UEFI的架構則最好是透過PEI service/ DXE protocol來做。DXE的部分就是使用 EFI PCI IO PROTOCOL 這個protocol



+   typedef struct _EFI_PCI_IO_PROTOCOL 
+   {
+       EFI_PCI_IO_PROTOCOL_POLL_IO_MEM        PollMem;
+       EFI_PCI_IO_PROTOCOL_POLL_IO_MEM        PollIo;
+       EFI_PCI_IO_PROTOCOL_ACCESS                  Mem;
+       EFI_PCI_IO_PROTOCOL_ACCESS                  Io;
+       EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS     Pci;
+       EFI_PCI_IO_PROTOCOL_COPY_MEM           CopyMem;
+       EFI_PCI_IO_PROTOCOL_MAP                Map;
+       EFI_PCI_IO_PROTOCOL_UNMAP              Unmap;
+       EFI_PCI_IO_PROTOCOL_ALLOCATE_BUFFER    AllocateBuffer;
+       EFI_PCI_IO_PROTOCOL_FREE_BUFFER        FreeBuffer;
+       EFI_PCI_IO_PROTOCOL_FLUSH              Flush;
+       EFI_PCI_IO_PROTOCOL_GET_LOCATION       GetLocation;
+       EFI_PCI_IO_PROTOCOL_ATTRIBUTES         Attributes;
+       EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES GetBarAttributes;
+       EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES SetBarAttributes;
+       UINT64                                 RomSize;
+       VOID                                   *RomImage;
+   } EFI_PCI_IO_PROTOCOL;

上述用紅字顯示的就是access這三種空間的方法,詳細請參考UEFI open source code。

1 則留言: