pciaccess_private.h revision 28d65773
1/* 2 * (C) Copyright IBM Corporation 2006 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * on the rights to use, copy, modify, merge, publish, distribute, sub 9 * license, and/or sell copies of the Software, and to permit persons to whom 10 * the Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19 * IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 */ 24 25/** 26 * \file pciaccess_private.h 27 * Functions and datastructures that are private to the pciaccess library. 28 * 29 * \author Ian Romanick <idr@us.ibm.com> 30 */ 31 32#if defined(__GNUC__) && (__GNUC__ >= 4) 33# define _pci_hidden __attribute__((visibility("hidden"))) 34#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) 35# define _pci_hidden __hidden 36#else /* not gcc >= 4 and not Sun Studio >= 8 */ 37# define _pci_hidden 38#endif /* GNUC >= 4 */ 39 40struct pci_device_mapping; 41 42int pci_fill_capabilities_generic( struct pci_device * dev ); 43int pci_device_generic_unmap_range(struct pci_device *dev, 44 struct pci_device_mapping *map); 45 46struct pci_system_methods { 47 void (*destroy)( void ); 48 void (*destroy_device)( struct pci_device * dev ); 49 int (*read_rom)( struct pci_device * dev, void * buffer ); 50 int (*probe)( struct pci_device * dev ); 51 int (*map_range)(struct pci_device *dev, struct pci_device_mapping *map); 52 int (*unmap_range)(struct pci_device * dev, 53 struct pci_device_mapping *map); 54 55 int (*read)(struct pci_device * dev, void * data, pciaddr_t offset, 56 pciaddr_t size, pciaddr_t * bytes_read ); 57 58 int (*write)(struct pci_device * dev, const void * data, pciaddr_t offset, 59 pciaddr_t size, pciaddr_t * bytes_written ); 60 61 int (*fill_capabilities)( struct pci_device * dev ); 62 void (*enable)( struct pci_device *dev ); 63 int (*boot_vga)( struct pci_device *dev ); 64 int (*has_kernel_driver)( struct pci_device *dev ); 65 struct pci_io_handle *(*open_device_io)( struct pci_io_handle *handle, 66 struct pci_device *dev, int bar, 67 pciaddr_t base, pciaddr_t size ); 68 struct pci_io_handle *(*open_legacy_io)( struct pci_io_handle *handle, 69 struct pci_device *dev, 70 pciaddr_t base, pciaddr_t size ); 71 void (*close_io)( struct pci_device *dev, struct pci_io_handle *handle ); 72 uint32_t (*read32)( struct pci_io_handle *handle, uint32_t reg ); 73 uint16_t (*read16)( struct pci_io_handle *handle, uint32_t reg ); 74 uint8_t (*read8)( struct pci_io_handle *handle, uint32_t reg ); 75 void (*write32)( struct pci_io_handle *handle, uint32_t reg, 76 uint32_t data ); 77 void (*write16)( struct pci_io_handle *handle, uint32_t reg, 78 uint16_t data ); 79 void (*write8)( struct pci_io_handle *handle, uint32_t reg, uint8_t data ); 80}; 81 82struct pci_device_mapping { 83 pciaddr_t base; 84 pciaddr_t size; 85 unsigned region; 86 unsigned flags; 87 void *memory; 88}; 89 90struct pci_io_handle { 91 pciaddr_t base; 92 pciaddr_t size; 93 int fd; 94}; 95 96struct pci_device_private { 97 struct pci_device base; 98 const char * device_string; 99 100 uint8_t header_type; 101 102 /** 103 * \name PCI Capabilities 104 */ 105 /*@{*/ 106 const struct pci_agp_info * agp; /**< AGP capability information. */ 107 /*@}*/ 108 109 /** 110 * Base address of the device's expansion ROM. 111 */ 112 pciaddr_t rom_base; 113 114 /** 115 * \name Bridge information. 116 */ 117 /*@{*/ 118 union { 119 struct pci_bridge_info * pci; 120 struct pci_pcmcia_bridge_info * pcmcia; 121 } bridge; 122 /*@}*/ 123 124 /** 125 * \name Mappings active on this device. 126 */ 127 /*@{*/ 128 struct pci_device_mapping *mappings; 129 unsigned num_mappings; 130 /*@}*/ 131}; 132 133 134/** 135 * Base type for tracking PCI subsystem information. 136 */ 137struct pci_system { 138 /** 139 * Platform dependent implementations of specific API routines. 140 */ 141 const struct pci_system_methods * methods; 142 143 /** 144 * Number of known devices in the system. 145 */ 146 size_t num_devices; 147 148 /** 149 * Array of known devices. 150 */ 151 struct pci_device_private * devices; 152 153#ifdef HAVE_MTRR 154 int mtrr_fd; 155#endif 156 int vgaarb_fd; 157 int vga_count; 158 struct pci_device *vga_target; 159 struct pci_device *vga_default_dev; 160}; 161 162extern struct pci_system * pci_sys; 163 164extern int pci_system_linux_sysfs_create( void ); 165extern int pci_system_freebsd_create( void ); 166extern int pci_system_netbsd_create( void ); 167extern int pci_system_openbsd_create( void ); 168extern void pci_system_openbsd_init_dev_mem( int ); 169extern int pci_system_solx_devfs_create( void ); 170extern int pci_system_x86_create( void ); 171extern void pci_io_cleanup( void ); 172