1/*
2 * (C) Copyright IBM Corporation 2006
3 * Copyright 2009 Red Hat, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * on the rights to use, copy, modify, merge, publish, distribute, sub
10 * license, and/or sell copies of the Software, and to permit persons to whom
11 * the Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
20 * IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
24 */
25/*
26 * Copyright (c) 2007 Paulo R. Zanoni, Tiago Vignatti
27 *
28 * Permission is hereby granted, free of charge, to any person
29 * obtaining a copy of this software and associated documentation
30 * files (the "Software"), to deal in the Software without
31 * restriction, including without limitation the rights to use,
32 * copy, modify, merge, publish, distribute, sublicense, and/or sell
33 * copies of the Software, and to permit persons to whom the
34 * Software is furnished to do so, subject to the following
35 * conditions:
36 *
37 * The above copyright notice and this permission notice shall be
38 * included in all copies or substantial portions of the Software.
39 *
40 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
41 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
42 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
43 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
44 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
45 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
46 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
47 * OTHER DEALINGS IN THE SOFTWARE.
48 *
49 */
50
51/**
52 * \file pciaccess.h
53 *
54 * \author Ian Romanick <idr@us.ibm.com>
55 */
56
57#ifndef PCIACCESS_H
58#define PCIACCESS_H
59
60#include <inttypes.h>
61
62#if (__GNUC__ >= 3) || (__SUNPRO_C >= 0x5130)
63#define __deprecated __attribute__((deprecated))
64#else
65#define __deprecated
66#endif
67
68typedef uint64_t pciaddr_t;
69
70struct pci_device;
71struct pci_device_iterator;
72struct pci_id_match;
73struct pci_slot_match;
74
75#ifdef __cplusplus
76extern "C" {
77#endif
78
79int pci_device_has_kernel_driver(struct pci_device *dev);
80
81int pci_device_is_boot_vga(struct pci_device *dev);
82
83int pci_device_read_rom(struct pci_device *dev, void *buffer);
84
85int  __deprecated pci_device_map_region(struct pci_device *dev,
86    unsigned region, int write_enable);
87
88int __deprecated pci_device_unmap_region(struct pci_device *dev,
89    unsigned region);
90
91int pci_device_map_range(struct pci_device *dev, pciaddr_t base,
92    pciaddr_t size, unsigned map_flags, void **addr);
93
94int pci_device_unmap_range(struct pci_device *dev, void *memory,
95    pciaddr_t size);
96
97int __deprecated pci_device_map_memory_range(struct pci_device *dev,
98    pciaddr_t base, pciaddr_t size, int write_enable, void **addr);
99
100int __deprecated pci_device_unmap_memory_range(struct pci_device *dev,
101    void *memory, pciaddr_t size);
102
103int pci_device_probe(struct pci_device *dev);
104
105const struct pci_agp_info *pci_device_get_agp_info(struct pci_device *dev);
106
107const struct pci_bridge_info *pci_device_get_bridge_info(
108    struct pci_device *dev);
109
110const struct pci_pcmcia_bridge_info *pci_device_get_pcmcia_bridge_info(
111    struct pci_device *dev);
112
113int pci_device_get_bridge_buses(struct pci_device *dev, int *primary_bus,
114    int *secondary_bus, int *subordinate_bus);
115
116int pci_system_init(void);
117
118void pci_system_init_dev_mem(int fd);
119
120void pci_system_cleanup(void);
121
122struct pci_device_iterator *pci_slot_match_iterator_create(
123    const struct pci_slot_match *match);
124
125struct pci_device_iterator *pci_id_match_iterator_create(
126    const struct pci_id_match *match);
127
128void pci_iterator_destroy(struct pci_device_iterator *iter);
129
130struct pci_device *pci_device_next(struct pci_device_iterator *iter);
131
132struct pci_device *pci_device_find_by_slot(uint32_t domain, uint32_t bus,
133    uint32_t dev, uint32_t func);
134
135struct pci_device *pci_device_get_parent_bridge(struct pci_device *dev);
136
137void pci_get_strings(const struct pci_id_match *m,
138    const char **device_name, const char **vendor_name,
139    const char **subdevice_name, const char **subvendor_name);
140const char *pci_device_get_device_name(const struct pci_device *dev);
141const char *pci_device_get_subdevice_name(const struct pci_device *dev);
142const char *pci_device_get_vendor_name(const struct pci_device *dev);
143const char *pci_device_get_subvendor_name(const struct pci_device *dev);
144
145void pci_device_enable(struct pci_device *dev);
146void pci_device_disable(struct pci_device *dev);
147
148int pci_device_cfg_read    (struct pci_device *dev, void *data,
149    pciaddr_t offset, pciaddr_t size, pciaddr_t *bytes_read);
150int pci_device_cfg_read_u8 (struct pci_device *dev, uint8_t  *data,
151    pciaddr_t offset);
152int pci_device_cfg_read_u16(struct pci_device *dev, uint16_t *data,
153    pciaddr_t offset);
154int pci_device_cfg_read_u32(struct pci_device *dev, uint32_t *data,
155    pciaddr_t offset);
156
157int pci_device_cfg_write    (struct pci_device *dev, const void *data,
158    pciaddr_t offset, pciaddr_t size, pciaddr_t *bytes_written);
159int pci_device_cfg_write_u8 (struct pci_device *dev, uint8_t  data,
160    pciaddr_t offset);
161int pci_device_cfg_write_u16(struct pci_device *dev, uint16_t data,
162    pciaddr_t offset);
163int pci_device_cfg_write_u32(struct pci_device *dev, uint32_t data,
164    pciaddr_t offset);
165int pci_device_cfg_write_bits(struct pci_device *dev, uint32_t mask,
166    uint32_t data, pciaddr_t offset);
167
168#ifdef __cplusplus
169}
170#endif
171
172/**
173 * \name Mapping flags passed to \c pci_device_map_range
174 */
175/*@{*/
176#define PCI_DEV_MAP_FLAG_WRITABLE       (1U<<0)
177#define PCI_DEV_MAP_FLAG_WRITE_COMBINE  (1U<<1)
178#define PCI_DEV_MAP_FLAG_CACHABLE       (1U<<2)
179/*@}*/
180
181
182#define PCI_MATCH_ANY  (~0U)
183
184/**
185 * Compare two PCI ID values (either vendor or device).  This is used
186 * internally to compare the fields of \c pci_id_match to the fields of
187 * \c pci_device.
188 */
189#define PCI_ID_COMPARE(a, b) \
190    (((a) == PCI_MATCH_ANY) || ((a) == (b)))
191
192/**
193 */
194struct pci_id_match {
195    /**
196     * \name Device / vendor matching controls
197     *
198     * Control the search based on the device, vendor, subdevice, or subvendor
199     * IDs.  Setting any of these fields to \c PCI_MATCH_ANY will cause the
200     * field to not be used in the comparison.
201     */
202    /*@{*/
203    uint32_t    vendor_id;
204    uint32_t    device_id;
205    uint32_t    subvendor_id;
206    uint32_t    subdevice_id;
207    /*@}*/
208
209
210    /**
211     * \name Device class matching controls
212     *
213     */
214    /*@{*/
215    uint32_t    device_class;
216    uint32_t    device_class_mask;
217    /*@}*/
218
219    intptr_t    match_data;
220};
221
222
223/**
224 */
225struct pci_slot_match {
226    /**
227     * \name Device slot matching controls
228     *
229     * Control the search based on the domain, bus, slot, and function of
230     * the device.  Setting any of these fields to \c PCI_MATCH_ANY will cause
231     * the field to not be used in the comparison.
232     */
233    /*@{*/
234    uint32_t    domain;
235    uint32_t    bus;
236    uint32_t    dev;
237    uint32_t    func;
238    /*@}*/
239
240    intptr_t    match_data;
241};
242
243/**
244 * BAR descriptor for a PCI device.
245 */
246struct pci_mem_region {
247    /**
248     * When the region is mapped, this is the pointer to the memory.
249     *
250     * This field is \b only set when the deprecated \c pci_device_map_region
251     * interface is used.  Use \c pci_device_map_range instead.
252     *
253     * \deprecated
254     */
255    void *memory;
256
257
258    /**
259     * Base physical address of the region within its bus / domain.
260     *
261     * \warning
262     * This address is really only useful to other devices in the same
263     * domain.  It's probably \b not the address applications will ever
264     * use.
265     *
266     * \warning
267     * Most (all?) platform back-ends leave this field unset.
268     */
269    pciaddr_t bus_addr;
270
271
272    /**
273     * Base physical address of the region from the CPU's point of view.
274     *
275     * This address is typically passed to \c pci_device_map_range to create
276     * a mapping of the region to the CPU's virtual address space.
277     */
278    pciaddr_t base_addr;
279
280
281    /**
282     * Size, in bytes, of the region.
283     */
284    pciaddr_t size;
285
286
287    /**
288     * Is the region I/O ports or memory?
289     */
290    unsigned is_IO:1;
291
292    /**
293     * Is the memory region prefetchable?
294     *
295     * \note
296     * This can only be set if \c is_IO is not set.
297     */
298    unsigned is_prefetchable:1;
299
300
301    /**
302     * Is the memory at a 64-bit address?
303     *
304     * \note
305     * This can only be set if \c is_IO is not set.
306     */
307    unsigned is_64:1;
308};
309
310
311/**
312 * PCI device.
313 *
314 * Contains all of the information about a particular PCI device.
315 *
316 * This structure - like everything else in libpciaccess - is allocated
317 * by the library itself. Do not embed this structure in other structs,
318 * or otherwise allocate them yourself.
319 */
320struct pci_device {
321    /**
322     * \name Device bus identification.
323     *
324     * Complete bus identification, including domain, of the device.  On
325     * platforms that do not support PCI domains (e.g., 32-bit x86 hardware),
326     * the domain will always be zero.
327     *
328     * The domain_16 field is provided for binary compatibility with older
329     * libpciaccess.
330     */
331    /*@{*/
332    uint16_t    domain_16;
333    uint8_t     bus;
334    uint8_t     dev;
335    uint8_t     func;
336    /*@}*/
337
338
339    /**
340     * \name Vendor / device ID
341     *
342     * The vendor ID, device ID, and sub-IDs for the device.
343     */
344    /*@{*/
345    uint16_t    vendor_id;
346    uint16_t    device_id;
347    uint16_t    subvendor_id;
348    uint16_t    subdevice_id;
349    /*@}*/
350
351    /**
352     * Device's class, subclass, and programming interface packed into a
353     * single 32-bit value.  The class is at bits [23:16], subclass is at
354     * bits [15:8], and programming interface is at [7:0].
355     */
356    uint32_t    device_class;
357
358
359    /**
360     * Device revision number, as read from the configuration header.
361     */
362    uint8_t     revision;
363
364
365    /**
366     * BAR descriptors for the device.
367     */
368    struct pci_mem_region regions[6];
369
370
371    /**
372     * Size, in bytes, of the device's expansion ROM.
373     */
374    pciaddr_t   rom_size;
375
376
377    /**
378     * IRQ associated with the device.  If there is no IRQ, this value will
379     * be -1.
380     */
381    int irq;
382
383
384    /**
385     * Storage for user data.  Users of the library can store arbitrary
386     * data in this pointer.  The library will not use it for any purpose.
387     * It is the user's responsibility to free this memory before destroying
388     * the \c pci_device structure.
389     */
390    intptr_t user_data;
391
392    /**
393      * Used by the VGA arbiter. Type of resource decoded by the device and
394      * the file descriptor (/dev/vga_arbiter). */
395    int vgaarb_rsrc;
396
397
398    /**
399     * PCI domain value (full 32 bits)
400     */
401    uint32_t    domain;
402};
403
404
405/**
406 * Description of the AGP capability of the device.
407 *
408 * \sa pci_device_get_agp_info
409 */
410struct pci_agp_info {
411    /**
412     * Offset of the AGP registers in the devices configuration register
413     * space.  This is generally used so that the offset of the AGP command
414     * register can be determined.
415     */
416    unsigned    config_offset;
417
418
419    /**
420     * \name AGP major / minor version.
421     */
422    /*@{*/
423    uint8_t	major_version;
424    uint8_t     minor_version;
425    /*@}*/
426
427    /**
428     * Logical OR of the supported AGP rates.  For example, a value of 0x07
429     * means that the device can support 1x, 2x, and 4x.  A value of 0x0c
430     * means that the device can support 8x and 4x.
431     */
432    uint8_t    rates;
433
434    unsigned int    fast_writes:1;  /**< Are fast-writes supported? */
435    unsigned int    addr64:1;
436    unsigned int    htrans:1;
437    unsigned int    gart64:1;
438    unsigned int    coherent:1;
439    unsigned int    sideband:1;     /**< Is side-band addressing supported? */
440    unsigned int    isochronus:1;
441
442    uint8_t    async_req_size;
443    uint8_t    calibration_cycle_timing;
444    uint8_t    max_requests;
445};
446
447/**
448 * Description of a PCI-to-PCI bridge device.
449 *
450 * \sa pci_device_get_bridge_info
451 */
452struct pci_bridge_info {
453    uint8_t    primary_bus;
454    uint8_t    secondary_bus;
455    uint8_t    subordinate_bus;
456    uint8_t    secondary_latency_timer;
457
458    uint8_t     io_type;
459    uint8_t     mem_type;
460    uint8_t     prefetch_mem_type;
461
462    uint16_t    secondary_status;
463    uint16_t    bridge_control;
464
465    uint32_t    io_base;
466    uint32_t    io_limit;
467
468    uint32_t    mem_base;
469    uint32_t    mem_limit;
470
471    uint64_t    prefetch_mem_base;
472    uint64_t    prefetch_mem_limit;
473};
474
475/**
476 * Description of a PCI-to-PCMCIA bridge device.
477 *
478 * \sa pci_device_get_pcmcia_bridge_info
479 */
480struct pci_pcmcia_bridge_info {
481    uint8_t    primary_bus;
482    uint8_t    card_bus;
483    uint8_t    subordinate_bus;
484    uint8_t    cardbus_latency_timer;
485
486    uint16_t    secondary_status;
487    uint16_t    bridge_control;
488
489    struct {
490	uint32_t    base;
491	uint32_t    limit;
492    } io[2];
493
494    struct {
495	uint32_t    base;
496	uint32_t    limit;
497    } mem[2];
498
499};
500
501
502/**
503 * VGA Arbiter definitions, functions and related.
504 */
505
506/* Legacy VGA regions */
507#define VGA_ARB_RSRC_NONE       0x00
508#define VGA_ARB_RSRC_LEGACY_IO  0x01
509#define VGA_ARB_RSRC_LEGACY_MEM 0x02
510/* Non-legacy access */
511#define VGA_ARB_RSRC_NORMAL_IO  0x04
512#define VGA_ARB_RSRC_NORMAL_MEM 0x08
513
514int  pci_device_vgaarb_init         (void);
515void pci_device_vgaarb_fini         (void);
516int  pci_device_vgaarb_set_target   (struct pci_device *dev);
517/* use the targeted device */
518int  pci_device_vgaarb_decodes      (int new_vga_rsrc);
519int  pci_device_vgaarb_lock         (void);
520int  pci_device_vgaarb_trylock      (void);
521int  pci_device_vgaarb_unlock       (void);
522/* return the current device count + resource decodes for the device */
523int pci_device_vgaarb_get_info	    (struct pci_device *dev, int *vga_count, int *rsrc_decodes);
524
525/*
526 * I/O space access.
527 */
528
529struct pci_io_handle;
530
531struct pci_io_handle *pci_device_open_io(struct pci_device *dev, pciaddr_t base,
532					 pciaddr_t size);
533struct pci_io_handle *pci_legacy_open_io(struct pci_device *dev, pciaddr_t base,
534					 pciaddr_t size);
535void pci_device_close_io(struct pci_device *dev, struct pci_io_handle *handle);
536uint32_t pci_io_read32(struct pci_io_handle *handle, uint32_t reg);
537uint16_t pci_io_read16(struct pci_io_handle *handle, uint32_t reg);
538uint8_t pci_io_read8(struct pci_io_handle *handle, uint32_t reg);
539void pci_io_write32(struct pci_io_handle *handle, uint32_t reg, uint32_t data);
540void pci_io_write16(struct pci_io_handle *handle, uint32_t reg, uint16_t data);
541void pci_io_write8(struct pci_io_handle *handle, uint32_t reg, uint8_t data);
542
543/*
544 * Legacy memory access
545 */
546
547int pci_device_map_legacy(struct pci_device *dev, pciaddr_t base,
548			  pciaddr_t size, unsigned map_flags, void **addr);
549int pci_device_unmap_legacy(struct pci_device *dev, void *addr, pciaddr_t size);
550
551#endif /* PCIACCESS_H */
552