feat: PCI bus probing
[lunaix-os.git] / lunaix-os / includes / hal / pci.h
1 #ifndef __LUNAIX_PCI_H
2 #define __LUNAIX_PCI_H
3
4 #include <hal/io.h>
5 #include <lunaix/ds/llist.h>
6
7 #define PCI_CONFIG_ADDR 0xcf8
8 #define PCI_CONFIG_DATA 0xcfc
9
10 #define PCI_TDEV 0x0
11 #define PCI_TPCIBRIDGE 0x1
12 #define PCI_TCARDBRIDGE 0x2
13
14 #define PCI_VENDOR_INVLD 0xffff
15
16 #define PCI_REG_VENDER 0x0
17 #define PCI_REG_DEV 0x1
18 #define PCI_REG_HDRTYPE 0x7
19
20 #define PCI_ADDRESS(bus, dev, funct, reg)                                      \
21     (((bus)&0xff) << 16) | (((dev)&0xff) << 11) | (((funct)&0xff) << 8) |      \
22       (((reg)&0xff) << 2) | 0x80000000
23
24 typedef unsigned int pci_reg_t;
25
26 // PCI device header format
27 // Ref: "PCI Local Bus Specification, Rev.3, Section 6.1"
28
29 struct pci_device
30 {
31     struct llist_header dev_chain;
32     uint16_t vendor;
33     uint16_t deviceId;
34     uint32_t class_code;
35     uint8_t bus;
36     uint8_t dev;
37     uint8_t function;
38     uint8_t type;
39     uint8_t intr_line;
40     uint8_t intr_pintype;
41     uint32_t bars[6];
42 };
43
44 // PCI Configuration Space (C-Space) r/w:
45 //      Refer to "PCI Local Bus Specification, Rev.3, Section 3.2.2.3.2"
46
47 inline pci_reg_t
48 pci_read_cspace(int bus, int dev, int funct, int reg)
49 {
50     io_outl(PCI_CONFIG_ADDR, PCI_ADDRESS(bus, dev, funct, reg));
51     return io_inl(PCI_CONFIG_DATA);
52 }
53
54 inline void
55 pci_write_cspace(int bus, int dev, int funct, int reg, pci_reg_t data)
56 {
57     io_outl(PCI_CONFIG_ADDR, PCI_ADDRESS(bus, dev, funct, reg));
58     io_outl(PCI_CONFIG_DATA, data);
59 }
60
61 void
62 pci_probe();
63
64 void
65 pci_init();
66
67 void
68 pci_print_device();
69
70 struct pci_device*
71 pci_get_device(uint16_t vendorId, uint16_t deviceId);
72
73 #endif /* __LUNAIX_PCI_H */