c34e348ffebd5f5a22ab91a33ad87a3593632405
[seabios.git] / src / pci.h
1 #ifndef __PCI_H
2 #define __PCI_H
3
4 #include "types.h" // u32
5
6 static inline u8 pci_bdf_to_bus(u16 bdf) {
7     return bdf >> 8;
8 }
9 static inline u8 pci_bdf_to_devfn(u16 bdf) {
10     return bdf & 0xff;
11 }
12 static inline u16 pci_bdf_to_busdev(u16 bdf) {
13     return bdf & ~0x07;
14 }
15 static inline u8 pci_bdf_to_dev(u16 bdf) {
16     return (bdf >> 3) & 0x1f;
17 }
18 static inline u8 pci_bdf_to_fn(u16 bdf) {
19     return bdf & 0x07;
20 }
21 static inline u16 pci_to_bdf(int bus, int dev, int fn) {
22     return (bus<<8) | (dev<<3) | fn;
23 }
24 static inline u16 pci_bus_devfn_to_bdf(int bus, u16 devfn) {
25     return (bus << 8) | devfn;
26 }
27
28 void pci_config_writel(u16 bdf, u32 addr, u32 val);
29 void pci_config_writew(u16 bdf, u32 addr, u16 val);
30 void pci_config_writeb(u16 bdf, u32 addr, u8 val);
31 u32 pci_config_readl(u16 bdf, u32 addr);
32 u16 pci_config_readw(u16 bdf, u32 addr);
33 u8 pci_config_readb(u16 bdf, u32 addr);
34 void pci_config_maskw(u16 bdf, u32 addr, u16 off, u16 on);
35
36 struct pci_device *pci_find_device(u16 vendid, u16 devid);
37 struct pci_device *pci_find_class(u16 classid);
38
39 struct pci_device {
40     u16 bdf;
41     u8 rootbus;
42     struct pci_device *next;
43     struct pci_device *parent;
44
45     // Configuration space device information
46     u16 vendor, device;
47     u16 class;
48     u8 prog_if, revision;
49     u8 header_type;
50     u8 secondary_bus;
51
52     // Local information on device.
53     int have_driver;
54 };
55 extern struct pci_device *PCIDevices;
56 extern int MaxPCIBus;
57 void pci_probe(void);
58 static inline u32 pci_classprog(struct pci_device *pci) {
59     return (pci->class << 8) | pci->prog_if;
60 }
61
62 #define foreachpci(PCI)                         \
63     for (PCI=PCIDevices; PCI; PCI=PCI->next)
64
65 int pci_next(int bdf, int bus);
66 #define foreachbdf(BDF, BUS)                                    \
67     for (BDF=pci_next(pci_bus_devfn_to_bdf((BUS), 0)-1, (BUS))  \
68          ; BDF >= 0                                             \
69          ; BDF=pci_next(BDF, (BUS)))
70
71 #define PCI_ANY_ID      (~0)
72 struct pci_device_id {
73     u32 vendid;
74     u32 devid;
75     u32 class;
76     u32 class_mask;
77     void (*func)(struct pci_device *pci, void *arg);
78 };
79
80 #define PCI_DEVICE(vendor_id, device_id, init_func)     \
81     {                                                   \
82         .vendid = (vendor_id),                          \
83         .devid = (device_id),                           \
84         .class = PCI_ANY_ID,                            \
85         .class_mask = 0,                                \
86         .func = (init_func)                             \
87     }
88
89 #define PCI_DEVICE_CLASS(vendor_id, device_id, class_code, init_func)   \
90     {                                                                   \
91         .vendid = (vendor_id),                                          \
92         .devid = (device_id),                                           \
93         .class = (class_code),                                          \
94         .class_mask = ~0,                                               \
95         .func = (init_func)                                             \
96     }
97
98 #define PCI_DEVICE_END                          \
99     {                                           \
100         .vendid = 0,                            \
101     }
102
103 int pci_init_device(const struct pci_device_id *ids
104                     , struct pci_device *pci, void *arg);
105 struct pci_device *pci_find_init_device(const struct pci_device_id *ids
106                                         , void *arg);
107 void pci_reboot(void);
108
109 // helper functions to access pci mmio bars from real mode
110 u32 pci_readl(u32 addr);
111 void pci_writel(u32 addr, u32 val);
112
113 // pirtable.c
114 void create_pirtable(void);
115
116
117 /****************************************************************
118  * PIR table
119  ****************************************************************/
120
121 extern u16 PirOffset;
122
123 struct link_info {
124     u8 link;
125     u16 bitmap;
126 } PACKED;
127
128 struct pir_slot {
129     u8 bus;
130     u8 dev;
131     struct link_info links[4];
132     u8 slot_nr;
133     u8 reserved;
134 } PACKED;
135
136 struct pir_header {
137     u32 signature;
138     u16 version;
139     u16 size;
140     u8 router_bus;
141     u8 router_devfunc;
142     u16 exclusive_irqs;
143     u32 compatible_devid;
144     u32 miniport_data;
145     u8 reserved[11];
146     u8 checksum;
147     struct pir_slot slots[0];
148 } PACKED;
149
150 #define PIR_SIGNATURE 0x52495024 // $PIR
151
152
153 #endif