bloggerads

顯示具有 PCI 相關 標籤的文章。 顯示所有文章
顯示具有 PCI 相關 標籤的文章。 顯示所有文章

2015年12月3日 星期四

MSI Capability (0x05) 和 MSIX Capability (0x11)

MSI (Message Signaled Interrupts) :

MSI的優點是透過軟體的方式來產生中斷而非透過HW Interrupt pin,在線路上比較簡單。透過給定MSI Control Register可以依device的能力(bit3:1)決定要使用1,2,4,...,32個中斷(設定6:4),並在所指定的Message Address寫入含有中斷向量資訊的Message就可以完成。



2014年5月26日 星期一

PCI 相關spec 隨手紀錄 (To Be Continued)

# Type 0 PCI header register介紹
讀外插PCI controller的option Rom需先enable option rom access(ERBAR.bit0=1)
=>先將Expansion Rom BAR bit0設為1再access Expansion Rom BAR address(option rom address)

Bios階段enable MMIO access(command.bit1=1), enable IO access(command.bit0=1) 以及打開Bus Master(command.bit2=1)讓device可以主動發出memory cycle

# Configuration Space accessing

1. 如果是寫DOS的程式,透過 Int 1A 可以 access 超過 0xff 這個範圍

2. CF8, CFC方法: (發 IO transaction)
Read 就是Write address to 0xCF8, Read Dword data from 0xCFC 
Write 就是Write address to 0xCF8, Write Dword data to 0xCFC 



+  // 示範Read, Author: Martin Lee
+  DWORD ReadPci( CFG_ADDRESS  addr)
+  {
+      DWORD val;
+      DWORD daddr = addr.all | BIT(31);
+      WORD  oport = 0xcf8;
+      WORD  iport = 0xcfc;
+      
+      __asm{
+      mov eax, daddr
+      mov  dx, oport
+      out  dx, eax
+      mov  dx, iport
+      in  eax, dx
+      mov DWORD ptr val, eax
+      }
+      return val;
+  }

3. 直接MMIO accessing: (發 Memory transaction)
這個方法必須找到MMIO base address(x86通常都會在E000_0000H,這個位址沒有絕對要看chipset的romsip決定)來算出真正Bus/Device/Function/Register的位址,
                                                            
MMIO Address = MMIO_BASE_Addr + { bus number[27:20], device number[19:15], function number[14:12], extended register number[11:8], register number[7:2], offset [1:0] }.

#define PCIEX_BASE_ADDRESS   0xe0000000 
#define PCIE_CFG_ADDR(bus, dev, func, reg) \
((UINTN)(PCIEX_BASE_ADDRESS + ((bus) << 20) + ((dev) << 15) + ((func) << 12) + (reg) ))

# About PCI to PCI bridge:





2014年4月14日 星期一

PCIe Capability (0x10)



列出常參考的部分:


# Offset 0x0C (Link Capabilities)
=> Link能力
# Offset 0x10 (Link Control)
=> 電源控制 bit[1:0]: ASPM, 00b(Disabled) / 01b(L0s) / 10b(L1) /11b(L0s+L1)

# Offset 0x12 (Link Status)

=> 速度 bit[3:0]: 1=>Gen1(2.5GT), 2=>Gen2(5GT), 3=>Gen3(8GT), Gen1/Gen2採8b/10b編碼,實際速度約打8折
=> 寬度 bit[9:4]: 1/2/4/8/16=>x1/x2/x4/x8/x16 lane