| #ifndef __PCI_H |
| #define __PCI_H |
| |
| #include "types.h" // u32 |
| |
| typedef struct PCIDevice { |
| u8 bus; |
| u8 devfn; |
| } PCIDevice; |
| |
| static inline PCIDevice pci_bd(u8 bus, u8 devfn) { |
| struct PCIDevice d = {bus, devfn}; |
| return d; |
| } |
| static inline u16 pci_to_bdf(PCIDevice d) { |
| return (d.bus << 8) | d.devfn; |
| } |
| static inline u8 pci_bdf_to_bus(u16 bdf) { |
| return bdf >> 8; |
| } |
| static inline u8 pci_bdf_to_dev(u16 bdf) { |
| return (bdf >> 3) & 0x1f; |
| } |
| static inline u8 pci_bdf_to_fn(u16 bdf) { |
| return bdf & 0x07; |
| } |
| |
| void pci_config_writel(PCIDevice d, u32 addr, u32 val); |
| void pci_config_writew(PCIDevice d, u32 addr, u16 val); |
| void pci_config_writeb(PCIDevice d, u32 addr, u8 val); |
| u32 pci_config_readl(PCIDevice d, u32 addr); |
| u16 pci_config_readw(PCIDevice d, u32 addr); |
| u8 pci_config_readb(PCIDevice d, u32 addr); |
| |
| int pci_find_device(u16 vendid, u16 devid, int index, PCIDevice *dev); |
| int pci_find_classprog(u32 classprog, int index, PCIDevice *dev); |
| int pci_find_class(u16 classid, int index, PCIDevice *dev); |
| |
| // pirtable.c |
| void create_pirtable(); |
| |
| |
| /**************************************************************** |
| * PCI definitions |
| ****************************************************************/ |
| |
| #define PCI_VENDOR_ID 0x00 /* 16 bits */ |
| #define PCI_DEVICE_ID 0x02 /* 16 bits */ |
| #define PCI_COMMAND 0x04 /* 16 bits */ |
| #define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */ |
| #define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */ |
| #define PCI_CLASS_PROG 0x09 |
| #define PCI_CLASS_DEVICE 0x0a /* Device class */ |
| #define PCI_BASE_ADDR_0 0x10 |
| #define PCI_BASE_ADDR_1 0x14 |
| #define PCI_BASE_ADDR_2 0x18 |
| #define PCI_BASE_ADDR_3 0x1c |
| #define PCI_BASE_ADDR_4 0x20 |
| #define PCI_BASE_ADDR_5 0x24 |
| #define PCI_INTERRUPT_LINE 0x3c /* 8 bits */ |
| #define PCI_INTERRUPT_PIN 0x3d /* 8 bits */ |
| #define PCI_MIN_GNT 0x3e /* 8 bits */ |
| #define PCI_MAX_LAT 0x3f /* 8 bits */ |
| |
| #define PCI_VENDOR_ID_INTEL 0x8086 |
| #define PCI_VENDOR_ID_IBM 0x1014 |
| #define PCI_VENDOR_ID_APPLE 0x106b |
| |
| #define PCI_DEVICE_ID_INTEL_82441 0x1237 |
| #define PCI_DEVICE_ID_INTEL_82371SB_0 0x7000 |
| #define PCI_DEVICE_ID_INTEL_82371SB_1 0x7010 |
| #define PCI_DEVICE_ID_INTEL_82371AB_3 0x7113 |
| |
| |
| /**************************************************************** |
| * PIR table |
| ****************************************************************/ |
| |
| struct link_info { |
| u8 link; |
| u16 bitmap; |
| } PACKED; |
| |
| struct pir_slot { |
| u8 bus; |
| u8 dev; |
| struct link_info links[4]; |
| u8 slot_nr; |
| u8 reserved; |
| } PACKED; |
| |
| struct pir_header { |
| u32 signature; |
| u16 version; |
| u16 size; |
| u8 router_bus; |
| u8 router_devfunc; |
| u16 exclusive_irqs; |
| u32 compatible_devid; |
| u32 miniport_data; |
| u8 reserved[11]; |
| u8 checksum; |
| struct pir_slot slots[0]; |
| } PACKED; |
| |
| #define PIR_SIGNATURE 0x52495024 // $PIR |
| |
| |
| #endif |