Kevin O'Connor | faa8b6f | 2008-03-21 13:32:34 -0400 | [diff] [blame] | 1 | #ifndef __PCI_H |
| 2 | #define __PCI_H |
| 3 | |
Kevin O'Connor | a0dc296 | 2008-03-16 14:29:32 -0400 | [diff] [blame] | 4 | #include "types.h" // u32 |
| 5 | |
Kevin O'Connor | 5fdaa03 | 2008-08-31 11:06:27 -0400 | [diff] [blame] | 6 | static inline u8 pci_bdf_to_bus(u16 bdf) { |
| 7 | return bdf >> 8; |
| 8 | } |
Kevin O'Connor | be19cdc | 2008-11-09 15:33:47 -0500 | [diff] [blame] | 9 | static inline u8 pci_bdf_to_devfn(u16 bdf) { |
| 10 | return bdf & 0xff; |
| 11 | } |
Kevin O'Connor | 5fdaa03 | 2008-08-31 11:06:27 -0400 | [diff] [blame] | 12 | static inline u8 pci_bdf_to_dev(u16 bdf) { |
| 13 | return (bdf >> 3) & 0x1f; |
| 14 | } |
| 15 | static inline u8 pci_bdf_to_fn(u16 bdf) { |
| 16 | return bdf & 0x07; |
| 17 | } |
Kevin O'Connor | 423a04d | 2009-02-05 21:16:39 -0500 | [diff] [blame] | 18 | static inline u16 pci_to_bdf(int bus, int dev, int fn) { |
| 19 | return (bus<<8) | (dev<<3) | fn; |
| 20 | } |
Kevin O'Connor | 0f803e4 | 2008-05-24 23:07:16 -0400 | [diff] [blame] | 21 | |
Kevin O'Connor | be19cdc | 2008-11-09 15:33:47 -0500 | [diff] [blame] | 22 | void pci_config_writel(u16 bdf, u32 addr, u32 val); |
| 23 | void pci_config_writew(u16 bdf, u32 addr, u16 val); |
| 24 | void pci_config_writeb(u16 bdf, u32 addr, u8 val); |
| 25 | u32 pci_config_readl(u16 bdf, u32 addr); |
| 26 | u16 pci_config_readw(u16 bdf, u32 addr); |
| 27 | u8 pci_config_readb(u16 bdf, u32 addr); |
Kevin O'Connor | 59f0283 | 2009-10-12 10:09:15 -0400 | [diff] [blame] | 28 | void pci_config_maskw(u16 bdf, u32 addr, u16 off, u16 on); |
Kevin O'Connor | 0f803e4 | 2008-05-24 23:07:16 -0400 | [diff] [blame] | 29 | |
Kevin O'Connor | 04eece2 | 2009-07-19 19:05:30 -0400 | [diff] [blame] | 30 | int pci_find_vga(); |
Kevin O'Connor | 4132e02 | 2008-12-04 19:39:10 -0500 | [diff] [blame] | 31 | int pci_find_device(u16 vendid, u16 devid); |
| 32 | int pci_find_class(u16 classid); |
Kevin O'Connor | be19cdc | 2008-11-09 15:33:47 -0500 | [diff] [blame] | 33 | |
Kevin O'Connor | e633832 | 2008-11-29 20:31:49 -0500 | [diff] [blame] | 34 | int pci_next(int bdf, int *pmax); |
Kevin O'Connor | 4132e02 | 2008-12-04 19:39:10 -0500 | [diff] [blame] | 35 | #define foreachpci(BDF, MAX) \ |
| 36 | for (MAX=0x0100, BDF=pci_next(0, &MAX) \ |
| 37 | ; BDF >= 0 \ |
Kevin O'Connor | e633832 | 2008-11-29 20:31:49 -0500 | [diff] [blame] | 38 | ; BDF=pci_next(BDF+1, &MAX)) |
Kevin O'Connor | faa8b6f | 2008-03-21 13:32:34 -0400 | [diff] [blame] | 39 | |
Kevin O'Connor | d25810a | 2008-06-12 22:16:35 -0400 | [diff] [blame] | 40 | // pirtable.c |
| 41 | void create_pirtable(); |
| 42 | |
Kevin O'Connor | 061d137 | 2008-06-11 22:39:46 -0400 | [diff] [blame] | 43 | |
| 44 | /**************************************************************** |
| 45 | * PIR table |
| 46 | ****************************************************************/ |
| 47 | |
Kevin O'Connor | 51358db | 2008-12-28 21:50:29 -0500 | [diff] [blame] | 48 | extern u16 PirOffset; |
| 49 | |
Kevin O'Connor | 061d137 | 2008-06-11 22:39:46 -0400 | [diff] [blame] | 50 | struct link_info { |
| 51 | u8 link; |
| 52 | u16 bitmap; |
| 53 | } PACKED; |
| 54 | |
| 55 | struct pir_slot { |
| 56 | u8 bus; |
| 57 | u8 dev; |
| 58 | struct link_info links[4]; |
| 59 | u8 slot_nr; |
| 60 | u8 reserved; |
| 61 | } PACKED; |
| 62 | |
Kevin O'Connor | d25810a | 2008-06-12 22:16:35 -0400 | [diff] [blame] | 63 | struct pir_header { |
| 64 | u32 signature; |
| 65 | u16 version; |
| 66 | u16 size; |
| 67 | u8 router_bus; |
| 68 | u8 router_devfunc; |
| 69 | u16 exclusive_irqs; |
| 70 | u32 compatible_devid; |
| 71 | u32 miniport_data; |
| 72 | u8 reserved[11]; |
| 73 | u8 checksum; |
| 74 | struct pir_slot slots[0]; |
| 75 | } PACKED; |
| 76 | |
| 77 | #define PIR_SIGNATURE 0x52495024 // $PIR |
| 78 | |
Kevin O'Connor | 061d137 | 2008-06-11 22:39:46 -0400 | [diff] [blame] | 79 | |
Kevin O'Connor | faa8b6f | 2008-03-21 13:32:34 -0400 | [diff] [blame] | 80 | #endif |