問題描述:
由於我們的系統比較特別,有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.