Moved x86 specific files into the arch/i386 directory. Modified files as needed.
[akaros.git] / kern / arch / i386 / pci.h
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * See LICENSE for details.
4  */
5
6 #ifndef ROS_INC_PCI_H
7 #define ROS_INC_PCI_H
8
9 #define pci_debug(...) // printk(__VA_ARGS__)  
10
11 // Macro for creating the address fed to the PCI config register 
12 // Several generations away from OSDev inline code.
13 #define MK_CONFIG_ADDR(BUS, DEV, FUNC, REG) (unsigned long)( (BUS << 16) | (DEV << 11) | \
14                                                              (FUNC << 8) | REG  | \
15                                                              ((uint32_t)0x80000000))
16
17 // General PCI Magic numbers yanked from OSDev / BSD. Yay magic!
18 #define PCI_CONFIG_ADDR     0xCF8
19 #define PCI_CONFIG_DATA     0xCFC
20 #define INVALID_VENDOR_ID   0xFFFF
21
22 #define INVALID_IRQ                     0xFFFF
23 #define INVALID_BUS                     0xFFFF
24 #define INVALID_LINE            0x0000
25
26 #define PCI_IO_MASK         0xFFF8
27 #define PCI_MEM_MASK        0xFFFFFFF0
28 #define PCI_IRQ_MASK            0xFF
29 #define PCI_LINE_MASK           0xFF00
30 #define PCI_LINE_SHFT           0x8
31 #define PCI_VENDOR_MASK         0xFFFF
32 #define PCI_DEVICE_OFFSET       0x10
33 #define PCI_IRQ_REG                     0x3c
34
35 #define PCI_MAX_BUS                     256
36 #define PCI_MAX_DEV                     32
37 #define PCI_MAX_FUNC            8
38 #define PCI_BAR_IO_MASK         0x1
39 #define NUM_IRQS                        256
40
41 // Offset used for indexing IRQs. Why isnt this defined elsewhere?
42 #define KERNEL_IRQ_OFFSET       32
43
44 // Run the PCI Code to loop over the PCI BARs. For now we don't use the BARs, dont check em.
45 #define CHECK_BARS                      0
46
47 typedef struct PCIIRQENTRY {
48         uint16_t bus; // Bus larger than 255 denotes invalid entry.
49                                   // This is why bus is 16 bits not 8.
50         uint8_t dev;
51         uint8_t func;
52         uint8_t line;
53 } pci_irq_entry_t;
54
55 typedef struct PCIDEVENTRY {
56         uint16_t dev_id; 
57         uint16_t ven_id;
58 } pci_dev_entry_t;
59
60 void pci_init();
61
62 #endif /* !ROS_INC_PCI_H */