]> pd.if.org Git - zos/blob - pci/pci.h
add a readme with a public domain note
[zos] / pci / pci.h
1 #ifndef PCI_H_
2 #define PCI_H_ 1
3
4 char *pci_func_desc(uint8_t class, uint8_t sub, uint8_t prog);
5 void pci_write_config(uint32_t base, uint8_t offset, uint32_t val);
6 uint32_t pci_read_config(uint32_t base, uint8_t offset);
7
8 struct pci_header {
9         uint16_t vendorid;
10         uint16_t deviceid;
11         uint16_t command;
12         uint16_t status;
13         uint8_t  revisionid;
14         uint8_t  progif;
15         uint8_t  subclass;
16         uint8_t  classcode;
17         uint8_t  cachelinesize;
18         uint8_t  latencytimer;
19         uint8_t  headertype;
20         uint8_t  bist;
21 };
22
23 /* header type 0x00 */
24 struct pci_general {
25         struct pci_header header;
26         uint32_t bar0;
27         uint32_t bar1;
28         uint32_t bar2;
29         uint32_t bar3;
30         uint32_t bar4;
31         uint32_t bar5;
32         uint32_t cardbuscispointer;
33         uint16_t subsystemvendorid;
34         uint16_t subsystemid;
35         uint32_t expansionrombaseaddress;
36         uint32_t capabilities_pointer; /* only low 8 bits, remainder reserved */
37         uint32_t reserved38;
38         uint8_t  interrupt_line;
39         uint8_t  interrupt_pin;
40         uint8_t  mingrant;
41         uint8_t  maxlatency;
42 };
43
44 /* header type 0x01 */
45 struct pci_bridge {
46         struct pci_header header;
47         uint32_t bar0;
48         uint32_t bar1;
49         uint8_t  primary_bus_number;
50         uint8_t  secondary_bus_number;
51         uint8_t  subordinate_bus_number;
52         uint8_t  secondary_latency_timer;
53         uint8_t  iobase;
54         uint8_t  iolimit;
55         uint16_t secondary_status;
56         uint16_t memory_base;
57         uint16_t memory_limit;
58         uint16_t prefetchable_memory_base;
59         uint16_t prefetchable_memory_limit;
60         uint8_t  iobase_upper;
61         uint8_t  iolimit_upper;
62         uint32_t capabilities_pointer; /* only low 8 bits, remainder reserved */
63         uint32_t expansion_rom;
64         uint8_t  interrupt_line;
65         uint8_t  interrupt_pin;
66         uint16_t bridge_control;
67 };
68
69 /* header type 0x02 */
70 struct pci_cardbus {
71         struct pci_header header;
72         uint32_t cardbussocket;
73         uint8_t  capoffset;
74         uint8_t  reserved;
75         uint16_t secondary_status;
76         uint8_t  pci_bus;
77         uint8_t  cardbus_bus;
78         uint8_t  subordinate_bus_number;
79         uint8_t  cardbus_latency_timer;
80         uint32_t memory_base0;
81         uint32_t memory_limit0;
82         uint32_t memory_base1;
83         uint32_t memory_limit1;
84         uint32_t io_base0;
85         uint32_t io_limit0;
86         uint32_t io_base1;
87         uint32_t io_limit1;
88         uint8_t  interrupt_line;
89         uint8_t  interrupt_pin;
90         uint16_t bridge_control;
91         uint16_t subsystem_device;
92         uint16_t subsystem_vendor;
93         uint32_t pccard16bitaddr;
94 };
95
96 union pci_device {
97         struct pci_header header;
98         struct pci_general general;
99         struct pci_bridge bridge;
100         struct pci_cardbus cardbus;
101 };
102
103 struct pci_info {
104         union pci_device device;
105         struct pci_info *next;
106         struct pci_info *prev;
107         uint32_t base; /* base address of pci io registers */
108         size_t bar_size[6];
109         void *bar_addr[6];
110 };
111
112 extern struct pci_info *pci_devices;
113
114 void pci_init();
115
116 #endif