小華的部落格: 2014/1/5 - 2014/1/12

bloggerads_Head

搜尋此網誌

星期二, 1月 07, 2014

UEFI Gop driver and PlatformGopPolicy

最近在除錯我自己從無到有DIY出來的EDKI codebase的問題,所以在這邊留一下筆記來記錄一下UEFI Gop driver遇到的問題~

問題描述: 
由於我們的系統比較特別,有eDP Panel 跟LVDS Panel(銷庫存),所以外掛了一顆eDP-LVDS IC,導致點亮VGA的方式變得複雜了點,另外我的CODEBASE目前還很陽春,所以只支援UEFI mode,也就是我要直接上UEFI GopDriver,而執行到UEFI Gop Driver後系統就當機了,為了這個問題所以把這隻Gop driver 反組譯,然後大致追了一下,然後把追CODE的筆記紀錄在下面!

筆記:
1) 他是一個EFI driver model driver,所以從DriverBinding Start()追進去看他做了甚麼事情
2) 底下是我整理的資料,因為沒有他的Source code,完全靠反組譯去猜測出底下的順序與動作,所以僅供參考,並不一定正確!
3)Root cause: 還不清楚,還在追...哈!

DriverBinding->Start()
{
   1..asm{RDTSC};
   2.ProgramIGD();
        a. OpenProtocol(Pciio) //準備用來讀取PCI Regs
        b. Pciio->Attributes(Enable BusMatser,MMIO,IOBASE) //啟動IGD設備
        c. OpenProtocol(DevicePath) 
        d.LocateProtocol (PlatformGopPolicy) //要求Platform firmware(也就是BIOS)提供VBT/Lid/Dock 的資訊
        e. PlatformGopPolicy->GetVbt(Address,Size);
        f. Config/Read IGD PCI Regs (DeviceId,RevisionId...etc)
        g.Read  Pch DeviceId and RevisionId.
        h.Init MMIO regs   // 目前還找不到相關文件說明這些暫存器在幹嘛
        i.Out 0x3c2,0x67
        j.Config MMIO regs 
        k. PlatformGopPolicy->PlatformLidStatus()
        l.  PlatformGopPolicy->PlatformDockStatus() if PlatformGopPolicy's revision > 0x0001 otherwise, ignore it.
        m.Create DDEV LinkedList (Display Device) //應該是參考Vbt去建立出來的資訊 CRT->eDP->EFP1->EFP2->EFP3
        n.Walk DDEV LinkedList to find out predefined DDEV and then try to enable it. (Hangup here.) //我當機在這裡
        o.Others //還沒追...應該是去產生一些protocol (EDID,brightness...etc) 或是devicepath 
   3.asm{RDTSC};
}

4)會被產生出來的Protocol掛自Child Handle上: 
a.DevicePath (09576E91-6D3F-11D2-8E39-00A0C969723B)
b.Undocument protocol (39487C79-236D-4666-87E5-09547CAAE1BC) : 不知道是幹嘛的...
c.EdidDiscovered (1C0C34F6-D380-41FA-A049-8AD06C1A66AA): 用來表示於顯示設備使用這個EDID.
d.GraphicOutput(9042A9DE-23DC-4A38-96FB-7ADED080516A):用來顯示影像
e.EdidActiveProtocol(BD8C1056-9F36-44EC-92A8-A6337F817986) : 正在顯示的設備使用這個EDID

如果SizeOfEdid !=0 代表EDID資料應該是有效的,應該可以檢查此Handle上面有沒有EDID Protocol來得到顯示設備的EDID,就像是Legacy 時呼叫INT 10h.