xref: /minix/minix/include/ddekit/pci.h (revision 83133719)
1 #ifndef _DDEKIT_PCI_H
2 #define _DDEKIT_PCI_H
3 #include <ddekit/ddekit.h>
4 
5 #include <ddekit/types.h>
6 
7 /** \defgroup DDEKit_pci */
8 
9 /** Our version of PCI_ANY_ID */
10 #define DDEKIT_PCI_ANY_ID    (~0)
11 
12 /** Copy of L4IO_PCIDEV_RES */
13 #define DDEKIT_PCIDEV_RES	 12
14 
15 struct ddekit_pci_dev;
16 
17 /** PCI resource descriptor. Copied from generic_io.
18  *
19  * XXX!
20  */
21 typedef struct ddekit_pci_resource {
22 	unsigned long start;
23 	unsigned long end;
24 	unsigned long flags;
25 } ddekit_pci_res_t;
26 
27 void ddekit_pci_init(void);
28 
29 int ddekit_pci_get_device(int nr, int *bus, int *slot, int *func);
30 
31 int ddekit_pci_read(int bus, int slot, int func, int pos, int len,
32 	ddekit_uint32_t *val);
33 int ddekit_pci_write(int bus, int slot, int func, int pos, int len,
34 	ddekit_uint32_t val);
35 
36 /** Read byte from PCI config space.
37  *
38  * \ingroup DDEKit_pci
39  *
40  * \param bus      bus ID
41  * \param slot     slot #
42  * \param func     function #
43  * \param pos      offset in config space
44  * \retval val     read value
45  *
46  * \return 0       success
47  */
48 int ddekit_pci_readb(int bus, int slot, int func, int pos,
49 	ddekit_uint8_t *val);
50 
51 /** Read word from PCI config space.
52  *
53  * \ingroup DDEKit_pci
54  *
55  * \param bus      bus ID
56  * \param slot     slot #
57  * \param func     function #
58  * \param pos      offset in config space
59  * \retval val     read value
60  *
61  * \return 0       success
62  */
63 int ddekit_pci_readw(int bus, int slot, int func, int pos,
64 	ddekit_uint16_t *val);
65 
66 /** Read dword from PCI config space.
67  *
68  * \ingroup DDEKit_pci
69  *
70  * \param bus      bus ID
71  * \param slot     slot #
72  * \param func     function #
73  * \param pos      offset in config space
74  * \retval val     read value
75  *
76  * \return 0       success
77  */
78 int ddekit_pci_readl(int bus, int slot, int func, int pos,
79 	ddekit_uint32_t *val);
80 
81 /** Write byte to PCI config space.
82  *
83  * \ingroup DDEKit_pci
84  *
85  * \param bus      bus ID
86  * \param slot     slot #
87  * \param func     function #
88  * \param pos      offset in config space
89  * \retval val     value to write
90  *
91  * \return 0       success
92  */
93 int ddekit_pci_writeb(int bus, int slot, int func, int pos,
94 	ddekit_uint8_t val);
95 
96 /** Write word to PCI config space.
97  *
98  * \ingroup DDEKit_pci
99  *
100  * \param bus      bus ID
101  * \param slot     slot #
102  * \param func     function #
103  * \param pos      offset in config space
104  * \retval val     value to write
105  *
106  * \return 0       success
107  */
108 int ddekit_pci_writew(int bus, int slot, int func, int pos,
109 	ddekit_uint16_t val);
110 
111 /** Write word to PCI config space.
112  *
113  * \ingroup DDEKit_pci
114  *
115  * \param bus      bus ID
116  * \param slot     slot #
117  * \param func     function #
118  * \param pos      offset in config space
119  * \retval val     value to write
120  *
121  * \return 0       success
122  */
123 int ddekit_pci_writel(int bus, int slot, int func, int pos,
124 	ddekit_uint32_t val);
125 
126 /** Find a PCI device.
127  *
128  * \ingroup DDEKit_pci
129  *
130  * \param bus	pointer to bus number or \ref DDEKIT_PCI_ANY_ID
131  * \param slot  pointer to slot number (devfn >> DEVFN_SLOTSHIFT) or \ref DDEKIT_PCI_ANY_ID
132  * \param func  pointer to func number (devfc & DEVFN_FUNCMASK) or \ref DDEKIT_PCI_ANY_ID
133  * \param start search device list only behind this device (excluding it!), NULL
134  *              searches whole device list
135  *
136  * \retval bus      bus number
137  * \retval slot     slot number
138  * \retval func     function number
139  *
140  * \return device   a valid PCI device
141  * \return NULL     if no device found
142  */
143 struct ddekit_pci_dev * ddekit_pci_find_device(int *bus, int *slot, int
144 	*func, struct ddekit_pci_dev *start);
145 
146 /** Enable PCI device
147  * \ingroup DDEKit_pci
148  */
149 int ddekit_pci_enable_device(struct ddekit_pci_dev *dev);
150 
151 /** Disable PCI device
152  * \ingroup DDEKit_pci
153  */
154 int ddekit_pci_disable_device(struct ddekit_pci_dev *dev);
155 
156 /** Enable bus-mastering for device.
157  * \ingroup DDEKit_pci
158  */
159 void ddekit_pci_set_master(struct ddekit_pci_dev *dev);
160 
161 /** Get device vendor ID.
162  * \ingroup DDEKit_pci
163  */
164 unsigned short ddekit_pci_get_vendor(struct ddekit_pci_dev *dev);
165 
166 /** Get device ID.
167  * \ingroup DDEKit_pci
168  */
169 unsigned short ddekit_pci_get_device_id(struct ddekit_pci_dev *dev);
170 
171 /** Get device subvendor ID.
172  * \ingroup DDEKit_pci
173  */
174 unsigned short ddekit_pci_get_sub_vendor(struct ddekit_pci_dev *dev);
175 
176 /** Get subdevice ID.
177  * \ingroup DDEKit_pci
178  */
179 unsigned short ddekit_pci_get_sub_device(struct ddekit_pci_dev *dev);
180 
181 /** Get device class ID.
182  * \ingroup DDEKit_pci
183  */
184 unsigned ddekit_pci_get_dev_class(struct ddekit_pci_dev *dev);
185 
186 /** Get device's IRQ number.
187  * \ingroup DDEKit_pci
188  */
189 unsigned long ddekit_pci_get_irq(struct ddekit_pci_dev *dev);
190 
191 /** Get device name.
192  * \ingroup DDEKit_pci
193  */
194 char *ddekit_pci_get_name(struct ddekit_pci_dev *dev);
195 
196 /** Get device's slot name.
197  * \ingroup DDEKit_pci
198  */
199 char *ddekit_pci_get_slot_name(struct ddekit_pci_dev *dev);
200 
201 /** Get one of the device's resources.
202  * \ingroup DDEKit_pci
203  */
204 ddekit_pci_res_t *ddekit_pci_get_resource(struct ddekit_pci_dev *dev,
205 	unsigned int idx);
206 
207 int ddekit_pci_irq_enable(int bus, int slot, int func, int pin, int
208 	*irq);
209 
210 #endif
211