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 <[email protected]> 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 40 struct pci_device_mapping; 41 42 int pci_fill_capabilities_generic( struct pci_device * dev ); 43 int pci_device_generic_unmap_range(struct pci_device *dev, 44 struct pci_device_mapping *map); 45 46 struct 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 int (*map_legacy)(struct pci_device *dev, pciaddr_t base, pciaddr_t size, 82 unsigned map_flags, void **addr); 83 int (*unmap_legacy)(struct pci_device *dev, void *addr, pciaddr_t size); 84 }; 85 86 struct pci_device_mapping { 87 pciaddr_t base; 88 pciaddr_t size; 89 unsigned region; 90 unsigned flags; 91 void *memory; 92 }; 93 94 struct pci_io_handle { 95 pciaddr_t base; 96 pciaddr_t size; 97 int fd; 98 }; 99 100 struct pci_device_private { 101 struct pci_device base; 102 const char * device_string; 103 104 uint8_t header_type; 105 106 /** 107 * \name PCI Capabilities 108 */ 109 /*@{*/ 110 const struct pci_agp_info * agp; /**< AGP capability information. */ 111 /*@}*/ 112 113 /** 114 * Base address of the device's expansion ROM. 115 */ 116 pciaddr_t rom_base; 117 118 /** 119 * \name Bridge information. 120 */ 121 /*@{*/ 122 union { 123 struct pci_bridge_info * pci; 124 struct pci_pcmcia_bridge_info * pcmcia; 125 } bridge; 126 /*@}*/ 127 128 /** 129 * \name Mappings active on this device. 130 */ 131 /*@{*/ 132 struct pci_device_mapping *mappings; 133 unsigned num_mappings; 134 /*@}*/ 135 }; 136 137 138 /** 139 * Base type for tracking PCI subsystem information. 140 */ 141 struct pci_system { 142 /** 143 * Platform dependent implementations of specific API routines. 144 */ 145 const struct pci_system_methods * methods; 146 147 /** 148 * Number of known devices in the system. 149 */ 150 size_t num_devices; 151 152 /** 153 * Array of known devices. 154 */ 155 struct pci_device_private * devices; 156 157 #ifdef HAVE_MTRR 158 int mtrr_fd; 159 #endif 160 int vgaarb_fd; 161 int vga_count; 162 struct pci_device *vga_target; 163 struct pci_device *vga_default_dev; 164 }; 165 166 extern struct pci_system * pci_sys; 167 168 extern int pci_system_linux_sysfs_create( void ); 169 extern int pci_system_freebsd_create( void ); 170 extern int pci_system_netbsd_create( void ); 171 extern int pci_system_openbsd_create( void ); 172 extern void pci_system_openbsd_init_dev_mem( int ); 173 extern int pci_system_solx_devfs_create( void ); 174 extern int pci_system_x86_create( void ); 175 extern void pci_io_cleanup( void ); 176