pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 1 | #ifndef QEMU_PCI_H |
| 2 | #define QEMU_PCI_H |
| 3 | |
aliguori | 376253e | 2009-03-05 23:01:23 +0000 | [diff] [blame] | 4 | #include "qemu-common.h" |
| 5 | |
Paul Brook | 6b1b92d | 2009-05-14 22:35:07 +0100 | [diff] [blame] | 6 | #include "qdev.h" |
| 7 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 8 | /* PCI includes legacy ISA access. */ |
| 9 | #include "isa.h" |
| 10 | |
| 11 | /* PCI bus */ |
| 12 | |
Anthony Liguori | c227f09 | 2009-10-01 16:12:16 -0500 | [diff] [blame] | 13 | extern target_phys_addr_t pci_mem_base; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 14 | |
aliguori | 3ae8061 | 2009-02-11 15:19:46 +0000 | [diff] [blame] | 15 | #define PCI_DEVFN(slot, func) ((((slot) & 0x1f) << 3) | ((func) & 0x07)) |
| 16 | #define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f) |
| 17 | #define PCI_FUNC(devfn) ((devfn) & 0x07) |
| 18 | |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 19 | /* Class, Vendor and Device IDs from Linux's pci_ids.h */ |
| 20 | #include "pci_ids.h" |
blueswir1 | 173a543 | 2009-02-01 19:26:20 +0000 | [diff] [blame] | 21 | |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 22 | /* QEMU-specific Vendor and Device ID definitions */ |
aliguori | 6f338c3 | 2009-02-11 15:21:54 +0000 | [diff] [blame] | 23 | |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 24 | /* IBM (0x1014) */ |
| 25 | #define PCI_DEVICE_ID_IBM_440GX 0x027f |
blueswir1 | 4ebcf88 | 2009-02-01 12:01:04 +0000 | [diff] [blame] | 26 | #define PCI_DEVICE_ID_IBM_OPENPIC2 0xffff |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 27 | |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 28 | /* Hitachi (0x1054) */ |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 29 | #define PCI_VENDOR_ID_HITACHI 0x1054 |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 30 | #define PCI_DEVICE_ID_HITACHI_SH7751R 0x350e |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 31 | |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 32 | /* Apple (0x106b) */ |
blueswir1 | 4ebcf88 | 2009-02-01 12:01:04 +0000 | [diff] [blame] | 33 | #define PCI_DEVICE_ID_APPLE_343S1201 0x0010 |
| 34 | #define PCI_DEVICE_ID_APPLE_UNI_N_I_PCI 0x001e |
| 35 | #define PCI_DEVICE_ID_APPLE_UNI_N_PCI 0x001f |
blueswir1 | 4ebcf88 | 2009-02-01 12:01:04 +0000 | [diff] [blame] | 36 | #define PCI_DEVICE_ID_APPLE_UNI_N_KEYL 0x0022 |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 37 | #define PCI_DEVICE_ID_APPLE_IPID_USB 0x003f |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 38 | |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 39 | /* Realtek (0x10ec) */ |
| 40 | #define PCI_DEVICE_ID_REALTEK_8029 0x8029 |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 41 | |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 42 | /* Xilinx (0x10ee) */ |
| 43 | #define PCI_DEVICE_ID_XILINX_XC2VP30 0x0300 |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 44 | |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 45 | /* Marvell (0x11ab) */ |
| 46 | #define PCI_DEVICE_ID_MARVELL_GT6412X 0x4620 |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 47 | |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 48 | /* QEMU/Bochs VGA (0x1234) */ |
blueswir1 | 4ebcf88 | 2009-02-01 12:01:04 +0000 | [diff] [blame] | 49 | #define PCI_VENDOR_ID_QEMU 0x1234 |
| 50 | #define PCI_DEVICE_ID_QEMU_VGA 0x1111 |
| 51 | |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 52 | /* VMWare (0x15ad) */ |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 53 | #define PCI_VENDOR_ID_VMWARE 0x15ad |
| 54 | #define PCI_DEVICE_ID_VMWARE_SVGA2 0x0405 |
| 55 | #define PCI_DEVICE_ID_VMWARE_SVGA 0x0710 |
| 56 | #define PCI_DEVICE_ID_VMWARE_NET 0x0720 |
| 57 | #define PCI_DEVICE_ID_VMWARE_SCSI 0x0730 |
| 58 | #define PCI_DEVICE_ID_VMWARE_IDE 0x1729 |
| 59 | |
aliguori | cef3017 | 2009-03-28 17:29:07 +0000 | [diff] [blame] | 60 | /* Intel (0x8086) */ |
aliguori | a770dc7 | 2009-03-13 15:02:23 +0000 | [diff] [blame] | 61 | #define PCI_DEVICE_ID_INTEL_82551IT 0x1209 |
Stefan Weil | d6fd1e6 | 2009-09-01 22:16:10 +0200 | [diff] [blame] | 62 | #define PCI_DEVICE_ID_INTEL_82557 0x1229 |
aurel32 | 74c62ba | 2009-03-02 16:42:23 +0000 | [diff] [blame] | 63 | |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 64 | /* Red Hat / Qumranet (for QEMU) -- see pci-ids.txt */ |
aliguori | d350d97 | 2008-12-11 21:15:42 +0000 | [diff] [blame] | 65 | #define PCI_VENDOR_ID_REDHAT_QUMRANET 0x1af4 |
| 66 | #define PCI_SUBVENDOR_ID_REDHAT_QUMRANET 0x1af4 |
| 67 | #define PCI_SUBDEVICE_ID_QEMU 0x1100 |
| 68 | |
| 69 | #define PCI_DEVICE_ID_VIRTIO_NET 0x1000 |
| 70 | #define PCI_DEVICE_ID_VIRTIO_BLOCK 0x1001 |
| 71 | #define PCI_DEVICE_ID_VIRTIO_BALLOON 0x1002 |
aliguori | 14d50be | 2009-01-26 15:22:46 +0000 | [diff] [blame] | 72 | #define PCI_DEVICE_ID_VIRTIO_CONSOLE 0x1003 |
aliguori | d350d97 | 2008-12-11 21:15:42 +0000 | [diff] [blame] | 73 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 74 | typedef void PCIConfigWriteFunc(PCIDevice *pci_dev, |
| 75 | uint32_t address, uint32_t data, int len); |
| 76 | typedef uint32_t PCIConfigReadFunc(PCIDevice *pci_dev, |
| 77 | uint32_t address, int len); |
| 78 | typedef void PCIMapIORegionFunc(PCIDevice *pci_dev, int region_num, |
| 79 | uint32_t addr, uint32_t size, int type); |
aliguori | 5851e08 | 2009-02-11 15:21:10 +0000 | [diff] [blame] | 80 | typedef int PCIUnregisterFunc(PCIDevice *pci_dev); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 81 | |
| 82 | #define PCI_ADDRESS_SPACE_MEM 0x00 |
| 83 | #define PCI_ADDRESS_SPACE_IO 0x01 |
| 84 | #define PCI_ADDRESS_SPACE_MEM_PREFETCH 0x08 |
| 85 | |
| 86 | typedef struct PCIIORegion { |
| 87 | uint32_t addr; /* current PCI mapping address. -1 means not mapped */ |
| 88 | uint32_t size; |
| 89 | uint8_t type; |
| 90 | PCIMapIORegionFunc *map_func; |
| 91 | } PCIIORegion; |
| 92 | |
| 93 | #define PCI_ROM_SLOT 6 |
| 94 | #define PCI_NUM_REGIONS 7 |
| 95 | |
aliguori | cef3017 | 2009-03-28 17:29:07 +0000 | [diff] [blame] | 96 | /* Declarations from linux/pci_regs.h */ |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 97 | #define PCI_VENDOR_ID 0x00 /* 16 bits */ |
| 98 | #define PCI_DEVICE_ID 0x02 /* 16 bits */ |
| 99 | #define PCI_COMMAND 0x04 /* 16 bits */ |
| 100 | #define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */ |
| 101 | #define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */ |
Michael S. Tsirkin | b7ee160 | 2009-06-21 19:45:18 +0300 | [diff] [blame] | 102 | #define PCI_COMMAND_MASTER 0x4 /* Enable bus master */ |
aliguori | cef3017 | 2009-03-28 17:29:07 +0000 | [diff] [blame] | 103 | #define PCI_STATUS 0x06 /* 16 bits */ |
| 104 | #define PCI_REVISION_ID 0x08 /* 8 bits */ |
Michael S. Tsirkin | bd4b65e | 2009-06-21 19:49:40 +0300 | [diff] [blame] | 105 | #define PCI_CLASS_PROG 0x09 /* Reg. Level Programming Interface */ |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 106 | #define PCI_CLASS_DEVICE 0x0a /* Device class */ |
Michael S. Tsirkin | b7ee160 | 2009-06-21 19:45:18 +0300 | [diff] [blame] | 107 | #define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */ |
| 108 | #define PCI_LATENCY_TIMER 0x0d /* 8 bits */ |
aliguori | cef3017 | 2009-03-28 17:29:07 +0000 | [diff] [blame] | 109 | #define PCI_HEADER_TYPE 0x0e /* 8 bits */ |
Isaku Yamahata | 6407f37 | 2009-05-03 19:03:00 +0000 | [diff] [blame] | 110 | #define PCI_HEADER_TYPE_NORMAL 0 |
| 111 | #define PCI_HEADER_TYPE_BRIDGE 1 |
| 112 | #define PCI_HEADER_TYPE_CARDBUS 2 |
| 113 | #define PCI_HEADER_TYPE_MULTI_FUNCTION 0x80 |
Michael S. Tsirkin | b7ee160 | 2009-06-21 19:45:18 +0300 | [diff] [blame] | 114 | #define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */ |
| 115 | #define PCI_PRIMARY_BUS 0x18 /* Primary bus number */ |
| 116 | #define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */ |
| 117 | #define PCI_SEC_STATUS 0x1e /* Secondary status register, only bit 14 used */ |
aliguori | cef3017 | 2009-03-28 17:29:07 +0000 | [diff] [blame] | 118 | #define PCI_SUBSYSTEM_VENDOR_ID 0x2c /* 16 bits */ |
| 119 | #define PCI_SUBSYSTEM_ID 0x2e /* 16 bits */ |
Michael S. Tsirkin | 5330de0 | 2009-09-16 13:40:57 +0300 | [diff] [blame] | 120 | #define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */ |
| 121 | #define PCI_ROM_ADDRESS_ENABLE 0x01 |
Michael S. Tsirkin | b7ee160 | 2009-06-21 19:45:18 +0300 | [diff] [blame] | 122 | #define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list entry */ |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 123 | #define PCI_INTERRUPT_LINE 0x3c /* 8 bits */ |
| 124 | #define PCI_INTERRUPT_PIN 0x3d /* 8 bits */ |
| 125 | #define PCI_MIN_GNT 0x3e /* 8 bits */ |
| 126 | #define PCI_MAX_LAT 0x3f /* 8 bits */ |
| 127 | |
Michael S. Tsirkin | 6f4cbd3 | 2009-06-21 19:45:40 +0300 | [diff] [blame] | 128 | /* Capability lists */ |
| 129 | #define PCI_CAP_LIST_ID 0 /* Capability ID */ |
| 130 | #define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */ |
| 131 | |
aliguori | cef3017 | 2009-03-28 17:29:07 +0000 | [diff] [blame] | 132 | #define PCI_REVISION 0x08 /* obsolete, use PCI_REVISION_ID */ |
| 133 | #define PCI_SUBVENDOR_ID 0x2c /* obsolete, use PCI_SUBSYSTEM_VENDOR_ID */ |
| 134 | #define PCI_SUBDEVICE_ID 0x2e /* obsolete, use PCI_SUBSYSTEM_ID */ |
| 135 | |
aurel32 | 8098ed4 | 2008-12-18 22:43:33 +0000 | [diff] [blame] | 136 | /* Bits in the PCI Status Register (PCI 2.3 spec) */ |
| 137 | #define PCI_STATUS_RESERVED1 0x007 |
| 138 | #define PCI_STATUS_INT_STATUS 0x008 |
Michael S. Tsirkin | 6f4cbd3 | 2009-06-21 19:45:40 +0300 | [diff] [blame] | 139 | #define PCI_STATUS_CAP_LIST 0x010 |
aurel32 | 8098ed4 | 2008-12-18 22:43:33 +0000 | [diff] [blame] | 140 | #define PCI_STATUS_66MHZ 0x020 |
| 141 | #define PCI_STATUS_RESERVED2 0x040 |
| 142 | #define PCI_STATUS_FAST_BACK 0x080 |
| 143 | #define PCI_STATUS_DEVSEL 0x600 |
| 144 | |
| 145 | #define PCI_STATUS_RESERVED_MASK_LO (PCI_STATUS_RESERVED1 | \ |
| 146 | PCI_STATUS_INT_STATUS | PCI_STATUS_CAPABILITIES | \ |
| 147 | PCI_STATUS_66MHZ | PCI_STATUS_RESERVED2 | PCI_STATUS_FAST_BACK) |
| 148 | |
| 149 | #define PCI_STATUS_RESERVED_MASK_HI (PCI_STATUS_DEVSEL >> 8) |
| 150 | |
aurel32 | 475dc65 | 2008-12-18 22:43:40 +0000 | [diff] [blame] | 151 | /* Bits in the PCI Command Register (PCI 2.3 spec) */ |
| 152 | #define PCI_COMMAND_RESERVED 0xf800 |
| 153 | |
| 154 | #define PCI_COMMAND_RESERVED_MASK_HI (PCI_COMMAND_RESERVED >> 8) |
| 155 | |
Michael S. Tsirkin | b7ee160 | 2009-06-21 19:45:18 +0300 | [diff] [blame] | 156 | /* Size of the standard PCI config header */ |
| 157 | #define PCI_CONFIG_HEADER_SIZE 0x40 |
| 158 | /* Size of the standard PCI config space */ |
| 159 | #define PCI_CONFIG_SPACE_SIZE 0x100 |
| 160 | |
Michael S. Tsirkin | 02eb84d | 2009-06-21 19:49:54 +0300 | [diff] [blame] | 161 | /* Bits in cap_present field. */ |
| 162 | enum { |
| 163 | QEMU_PCI_CAP_MSIX = 0x1, |
| 164 | }; |
| 165 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 166 | struct PCIDevice { |
Paul Brook | 6b1b92d | 2009-05-14 22:35:07 +0100 | [diff] [blame] | 167 | DeviceState qdev; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 168 | /* PCI config space */ |
Michael S. Tsirkin | b7ee160 | 2009-06-21 19:45:18 +0300 | [diff] [blame] | 169 | uint8_t config[PCI_CONFIG_SPACE_SIZE]; |
| 170 | |
Michael S. Tsirkin | bd4b65e | 2009-06-21 19:49:40 +0300 | [diff] [blame] | 171 | /* Used to enable config checks on load. Note that writeable bits are |
| 172 | * never checked even if set in cmask. */ |
| 173 | uint8_t cmask[PCI_CONFIG_SPACE_SIZE]; |
| 174 | |
Michael S. Tsirkin | b7ee160 | 2009-06-21 19:45:18 +0300 | [diff] [blame] | 175 | /* Used to implement R/W bytes */ |
| 176 | uint8_t wmask[PCI_CONFIG_SPACE_SIZE]; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 177 | |
Michael S. Tsirkin | 6f4cbd3 | 2009-06-21 19:45:40 +0300 | [diff] [blame] | 178 | /* Used to allocate config space for capabilities. */ |
| 179 | uint8_t used[PCI_CONFIG_SPACE_SIZE]; |
| 180 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 181 | /* the following fields are read only */ |
| 182 | PCIBus *bus; |
Gerd Hoffmann | 54586bd | 2009-08-03 17:35:19 +0200 | [diff] [blame] | 183 | uint32_t devfn; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 184 | char name[64]; |
| 185 | PCIIORegion io_regions[PCI_NUM_REGIONS]; |
| 186 | |
| 187 | /* do not access the following fields */ |
| 188 | PCIConfigReadFunc *config_read; |
| 189 | PCIConfigWriteFunc *config_write; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 190 | |
| 191 | /* IRQ objects for the INTA-INTD pins. */ |
| 192 | qemu_irq *irq; |
| 193 | |
| 194 | /* Current IRQ levels. Used internally by the generic PCI code. */ |
| 195 | int irq_state[4]; |
Michael S. Tsirkin | 02eb84d | 2009-06-21 19:49:54 +0300 | [diff] [blame] | 196 | |
| 197 | /* Capability bits */ |
| 198 | uint32_t cap_present; |
| 199 | |
| 200 | /* Offset of MSI-X capability in config space */ |
| 201 | uint8_t msix_cap; |
| 202 | |
| 203 | /* MSI-X entries */ |
| 204 | int msix_entries_nr; |
| 205 | |
| 206 | /* Space to store MSIX table */ |
| 207 | uint8_t *msix_table_page; |
| 208 | /* MMIO index used to map MSIX table and pending bit entries. */ |
| 209 | int msix_mmio_index; |
| 210 | /* Reference-count for entries actually in use by driver. */ |
| 211 | unsigned *msix_entry_used; |
| 212 | /* Region including the MSI-X table */ |
| 213 | uint32_t msix_bar_size; |
Juan Quintela | f16c4ab | 2009-08-20 19:42:38 +0200 | [diff] [blame] | 214 | /* Version id needed for VMState */ |
| 215 | int32_t version_id; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 216 | }; |
| 217 | |
| 218 | PCIDevice *pci_register_device(PCIBus *bus, const char *name, |
| 219 | int instance_size, int devfn, |
| 220 | PCIConfigReadFunc *config_read, |
| 221 | PCIConfigWriteFunc *config_write); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 222 | |
Avi Kivity | 28c2c26 | 2009-06-14 11:38:53 +0300 | [diff] [blame] | 223 | void pci_register_bar(PCIDevice *pci_dev, int region_num, |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 224 | uint32_t size, int type, |
| 225 | PCIMapIORegionFunc *map_func); |
| 226 | |
Michael S. Tsirkin | 6f4cbd3 | 2009-06-21 19:45:40 +0300 | [diff] [blame] | 227 | int pci_add_capability(PCIDevice *pci_dev, uint8_t cap_id, uint8_t cap_size); |
| 228 | |
| 229 | void pci_del_capability(PCIDevice *pci_dev, uint8_t cap_id, uint8_t cap_size); |
| 230 | |
| 231 | void pci_reserve_capability(PCIDevice *pci_dev, uint8_t offset, uint8_t size); |
| 232 | |
| 233 | uint8_t pci_find_capability(PCIDevice *pci_dev, uint8_t cap_id); |
| 234 | |
| 235 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 236 | uint32_t pci_default_read_config(PCIDevice *d, |
| 237 | uint32_t address, int len); |
| 238 | void pci_default_write_config(PCIDevice *d, |
| 239 | uint32_t address, uint32_t val, int len); |
| 240 | void pci_device_save(PCIDevice *s, QEMUFile *f); |
| 241 | int pci_device_load(PCIDevice *s, QEMUFile *f); |
| 242 | |
Juan Quintela | 5d4e84c | 2009-08-28 15:28:17 +0200 | [diff] [blame] | 243 | typedef void (*pci_set_irq_fn)(void *opaque, int irq_num, int level); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 244 | typedef int (*pci_map_irq_fn)(PCIDevice *pci_dev, int irq_num); |
Gerd Hoffmann | ee995ff | 2009-09-25 21:42:44 +0200 | [diff] [blame] | 245 | typedef int (*pci_hotplug_fn)(PCIDevice *pci_dev, int state); |
Gerd Hoffmann | 21eea4b | 2009-09-16 22:25:31 +0200 | [diff] [blame] | 246 | void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent, |
| 247 | const char *name, int devfn_min); |
| 248 | PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min); |
| 249 | void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, |
| 250 | void *irq_opaque, int nirq); |
Gerd Hoffmann | ee995ff | 2009-09-25 21:42:44 +0200 | [diff] [blame] | 251 | void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug); |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 252 | PCIBus *pci_register_bus(DeviceState *parent, const char *name, |
| 253 | pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, |
Juan Quintela | 5d4e84c | 2009-08-28 15:28:17 +0200 | [diff] [blame] | 254 | void *irq_opaque, int devfn_min, int nirq); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 255 | |
Markus Armbruster | 5607c38 | 2009-06-18 15:14:08 +0200 | [diff] [blame] | 256 | PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model, |
| 257 | const char *default_devaddr); |
Markus Armbruster | 07caea3 | 2009-09-25 03:53:51 +0200 | [diff] [blame] | 258 | PCIDevice *pci_nic_init_nofail(NICInfo *nd, const char *default_model, |
| 259 | const char *default_devaddr); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 260 | void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len); |
| 261 | uint32_t pci_data_read(void *opaque, uint32_t addr, int len); |
| 262 | int pci_bus_num(PCIBus *s); |
| 263 | void pci_for_each_device(int bus_num, void (*fn)(PCIDevice *d)); |
aliguori | 3ae8061 | 2009-02-11 15:19:46 +0000 | [diff] [blame] | 264 | PCIBus *pci_find_bus(int bus_num); |
| 265 | PCIDevice *pci_find_device(int bus_num, int slot, int function); |
Markus Armbruster | 49bd145 | 2009-09-25 03:53:49 +0200 | [diff] [blame] | 266 | PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 267 | |
Jan Kiszka | e9283f8 | 2009-06-26 00:04:00 +0200 | [diff] [blame] | 268 | int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp, |
| 269 | unsigned *slotp); |
aliguori | 880345c | 2009-02-11 15:21:48 +0000 | [diff] [blame] | 270 | |
aliguori | 376253e | 2009-03-05 23:01:23 +0000 | [diff] [blame] | 271 | void pci_info(Monitor *mon); |
blueswir1 | 480b9f2 | 2009-01-27 19:15:31 +0000 | [diff] [blame] | 272 | PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 273 | pci_map_irq_fn map_irq, const char *name); |
| 274 | |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 275 | static inline void |
Michael S. Tsirkin | 64d50b8 | 2009-06-21 19:50:57 +0300 | [diff] [blame] | 276 | pci_set_byte(uint8_t *config, uint8_t val) |
| 277 | { |
| 278 | *config = val; |
| 279 | } |
| 280 | |
| 281 | static inline uint8_t |
| 282 | pci_get_byte(uint8_t *config) |
| 283 | { |
| 284 | return *config; |
| 285 | } |
| 286 | |
| 287 | static inline void |
Michael S. Tsirkin | 14e1255 | 2009-06-21 19:45:30 +0300 | [diff] [blame] | 288 | pci_set_word(uint8_t *config, uint16_t val) |
| 289 | { |
| 290 | cpu_to_le16wu((uint16_t *)config, val); |
| 291 | } |
| 292 | |
| 293 | static inline uint16_t |
| 294 | pci_get_word(uint8_t *config) |
| 295 | { |
| 296 | return le16_to_cpupu((uint16_t *)config); |
| 297 | } |
| 298 | |
| 299 | static inline void |
| 300 | pci_set_long(uint8_t *config, uint32_t val) |
| 301 | { |
| 302 | cpu_to_le32wu((uint32_t *)config, val); |
| 303 | } |
| 304 | |
| 305 | static inline uint32_t |
| 306 | pci_get_long(uint8_t *config) |
| 307 | { |
| 308 | return le32_to_cpupu((uint32_t *)config); |
| 309 | } |
| 310 | |
| 311 | static inline void |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 312 | pci_config_set_vendor_id(uint8_t *pci_config, uint16_t val) |
| 313 | { |
Michael S. Tsirkin | 14e1255 | 2009-06-21 19:45:30 +0300 | [diff] [blame] | 314 | pci_set_word(&pci_config[PCI_VENDOR_ID], val); |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 315 | } |
| 316 | |
| 317 | static inline void |
| 318 | pci_config_set_device_id(uint8_t *pci_config, uint16_t val) |
| 319 | { |
Michael S. Tsirkin | 14e1255 | 2009-06-21 19:45:30 +0300 | [diff] [blame] | 320 | pci_set_word(&pci_config[PCI_DEVICE_ID], val); |
aliguori | deb5439 | 2009-01-26 15:37:35 +0000 | [diff] [blame] | 321 | } |
| 322 | |
blueswir1 | 173a543 | 2009-02-01 19:26:20 +0000 | [diff] [blame] | 323 | static inline void |
| 324 | pci_config_set_class(uint8_t *pci_config, uint16_t val) |
| 325 | { |
Michael S. Tsirkin | 14e1255 | 2009-06-21 19:45:30 +0300 | [diff] [blame] | 326 | pci_set_word(&pci_config[PCI_CLASS_DEVICE], val); |
blueswir1 | 173a543 | 2009-02-01 19:26:20 +0000 | [diff] [blame] | 327 | } |
| 328 | |
Gerd Hoffmann | 81a322d | 2009-08-14 10:36:05 +0200 | [diff] [blame] | 329 | typedef int (*pci_qdev_initfn)(PCIDevice *dev); |
Gerd Hoffmann | 0aab0d3 | 2009-06-30 14:12:07 +0200 | [diff] [blame] | 330 | typedef struct { |
| 331 | DeviceInfo qdev; |
| 332 | pci_qdev_initfn init; |
Gerd Hoffmann | e3936fa | 2009-09-25 21:42:38 +0200 | [diff] [blame] | 333 | PCIUnregisterFunc *exit; |
Gerd Hoffmann | 0aab0d3 | 2009-06-30 14:12:07 +0200 | [diff] [blame] | 334 | PCIConfigReadFunc *config_read; |
| 335 | PCIConfigWriteFunc *config_write; |
| 336 | } PCIDeviceInfo; |
| 337 | |
| 338 | void pci_qdev_register(PCIDeviceInfo *info); |
| 339 | void pci_qdev_register_many(PCIDeviceInfo *info); |
Paul Brook | 6b1b92d | 2009-05-14 22:35:07 +0100 | [diff] [blame] | 340 | |
Markus Armbruster | 499cf10 | 2009-09-25 03:53:53 +0200 | [diff] [blame] | 341 | PCIDevice *pci_create(PCIBus *bus, int devfn, const char *name); |
Paul Brook | 6b1b92d | 2009-05-14 22:35:07 +0100 | [diff] [blame] | 342 | PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name); |
| 343 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 344 | /* lsi53c895a.c */ |
ths | e4bcb14 | 2007-12-02 04:51:10 +0000 | [diff] [blame] | 345 | #define LSI_MAX_DEVS 7 |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 346 | |
| 347 | /* vmware_vga.c */ |
Paul Brook | fbe1b59 | 2009-05-13 17:56:25 +0100 | [diff] [blame] | 348 | void pci_vmsvga_init(PCIBus *bus); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 349 | |
| 350 | /* usb-uhci.c */ |
| 351 | void usb_uhci_piix3_init(PCIBus *bus, int devfn); |
| 352 | void usb_uhci_piix4_init(PCIBus *bus, int devfn); |
| 353 | |
| 354 | /* usb-ohci.c */ |
Gerd Hoffmann | 5b19d9a | 2009-08-31 14:24:03 +0200 | [diff] [blame] | 355 | void usb_ohci_init_pci(struct PCIBus *bus, int devfn); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 356 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 357 | /* prep_pci.c */ |
| 358 | PCIBus *pci_prep_init(qemu_irq *pic); |
| 359 | |
| 360 | /* apb_pci.c */ |
Anthony Liguori | c227f09 | 2009-10-01 16:12:16 -0500 | [diff] [blame] | 361 | PCIBus *pci_apb_init(target_phys_addr_t special_base, |
| 362 | target_phys_addr_t mem_base, |
blueswir1 | c190ea0 | 2009-01-10 11:33:32 +0000 | [diff] [blame] | 363 | qemu_irq *pic, PCIBus **bus2, PCIBus **bus3); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 364 | |
aurel32 | b79e175 | 2008-12-07 22:46:42 +0000 | [diff] [blame] | 365 | /* sh_pci.c */ |
| 366 | PCIBus *sh_pci_register_bus(pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, |
Juan Quintela | 5d4e84c | 2009-08-28 15:28:17 +0200 | [diff] [blame] | 367 | void *pic, int devfn_min, int nirq); |
aurel32 | b79e175 | 2008-12-07 22:46:42 +0000 | [diff] [blame] | 368 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 369 | #endif |