Reorganize build system
[qemu/aliguori.git] / devices / pci_device.c
blobe0201ef69156b4e4619c364ac1449b2a7623defb
1 #include "qemu/pci_device.h"
2 #include "qemu/pci_bus.h"
3 #include "hw/pci_regs.h"
5 void pci_device_initialize(PciDevice *obj, const char *id)
7 type_initialize(obj, TYPE_PCI_DEVICE, id);
10 void pci_device_finalize(PciDevice *obj)
12 type_finalize(obj);
15 void pci_device_visit(PciDevice *device, Visitor *v, const char *name, Error **errp)
17 device_visit(DEVICE(device), v, name, errp);
20 static void pci_device_initfn(TypeInstance *inst)
22 PciDevice *obj = PCI_DEVICE(inst);
24 plug_add_property_socket(PLUG(obj), "bus", (Plug **)&obj->bus, TYPE_PCI_BUS);
27 uint32_t pci_device_config_read_std(PciDevice *device, uint8_t offset, int size)
29 if (size == 1) {
30 return device->config[offset];
31 } else if (size == 2) {
32 return (device->config[offset] << 0) | (device->config[offset + 1] << 8);
33 } else if (size == 4) {
34 return (device->config[offset] << 0) | (device->config[offset + 1] << 8) |
35 (device->config[offset + 2] << 16) | (device->config[offset + 3] << 24);
36 } else {
37 return ~0;
41 void pci_device_config_write_std(PciDevice *device, uint8_t offset, int size, uint32_t value)
43 if (size == 1) {
44 device->config[offset] = value & 0xFF;
45 } else if (size == 2) {
46 device->config[offset] = value & 0xFF;
47 device->config[offset + 1] = (value >> 8) & 0xFF;
48 } else if (size == 4) {
49 device->config[offset] = value & 0xFF;
50 device->config[offset + 1] = (value >> 8) & 0xFF;
51 device->config[offset + 2] = (value >> 16) & 0xFF;
52 device->config[offset + 3] = (value >> 24) & 0xFF;
56 static void pci_device_class_initfn(TypeClass *class)
58 PciDeviceClass *pci_class = PCI_DEVICE_CLASS(class);
60 pci_class->config_read = pci_device_config_read_std;
61 pci_class->config_write = pci_device_config_write_std;
64 uint32_t pci_device_config_read(PciDevice *device, uint8_t offset, int size)
66 return PCI_DEVICE_GET_CLASS(device)->config_read(device, offset, size);
69 void pci_device_config_write(PciDevice *device, uint8_t offset, int size, uint32_t value)
71 PCI_DEVICE_GET_CLASS(device)->config_write(device, offset, size, value);
74 uint64_t pci_device_read(PciDevice *device, uint64_t offset, int size, bool ioio)
76 return PCI_DEVICE_GET_CLASS(device)->read(device, offset, size, ioio);
79 void pci_device_write(PciDevice *device, uint64_t offset, int size, uint64_t value, bool ioio)
81 PCI_DEVICE_GET_CLASS(device)->write(device, offset, size, value, ioio);
84 uint64_t pci_device_region_read(PciDevice *device, int region, uint64_t offset, int size)
86 return PCI_DEVICE_GET_CLASS(device)->region_read(device, region, offset, size);
89 void pci_device_region_write(PciDevice *device, int region, uint64_t offset, int size, uint64_t value)
91 PCI_DEVICE_GET_CLASS(device)->region_write(device, region, offset, size, value);
94 bool pci_device_is_target(PciDevice *device, uint64_t addr, int size, bool ioio)
96 /* FIXME */
97 return false;
100 void pci_device_set_vendor_id(PciDevice *device, uint16_t value)
102 pci_device_config_write(device, PCI_VENDOR_ID, 2, value);
105 uint16_t pci_device_get_vendor_id(PciDevice *device)
107 return pci_device_config_read(device, PCI_VENDOR_ID, 2);
110 void pci_device_set_device_id(PciDevice *device, uint16_t value)
112 pci_device_config_write(device, PCI_DEVICE_ID, 2, value);
115 uint16_t pci_device_get_device_id(PciDevice *device)
117 return pci_device_config_read(device, PCI_DEVICE_ID, 2);
120 void pci_device_set_command(PciDevice *device, uint16_t value)
122 pci_device_config_write(device, PCI_COMMAND, 2, value);
125 uint16_t pci_device_get_command(PciDevice *device)
127 return pci_device_config_read(device, PCI_COMMAND, 2);
130 void pci_device_set_status(PciDevice *device, uint16_t value)
132 pci_device_config_write(device, PCI_STATUS, 2, value);
135 uint16_t pci_device_get_status(PciDevice *device)
137 return pci_device_config_read(device, PCI_STATUS, 2);
140 void pci_device_set_class_revision(PciDevice *device, uint8_t value)
142 pci_device_config_write(device, PCI_CLASS_REVISION, 1, value);
145 uint8_t pci_device_get_class_revision(PciDevice *device)
147 return pci_device_config_read(device, PCI_CLASS_REVISION, 1);
150 void pci_device_set_class_prog(PciDevice *device, uint8_t value)
152 pci_device_config_write(device, PCI_CLASS_PROG, 1, value);
155 uint8_t pci_device_get_class_prog(PciDevice *device)
157 return pci_device_config_read(device, PCI_CLASS_PROG, 1);
160 void pci_device_set_class_device(PciDevice *device, uint16_t value)
162 pci_device_config_write(device, PCI_CLASS_DEVICE, 2, value);
165 uint16_t pci_device_get_class_device(PciDevice *device)
167 return pci_device_config_read(device, PCI_CLASS_DEVICE, 2);
170 void pci_device_set_cache_line_size(PciDevice *device, uint8_t value)
172 pci_device_config_write(device, PCI_CACHE_LINE_SIZE, 1, value);
175 uint8_t pci_device_get_cache_line_size(PciDevice *device)
177 return pci_device_config_read(device, PCI_CACHE_LINE_SIZE, 1);
180 void pci_device_set_latency_timer(PciDevice *device, uint8_t value)
182 pci_device_config_write(device, PCI_LATENCY_TIMER, 1, value);
185 uint8_t pci_device_get_latency_timer(PciDevice *device)
187 return pci_device_config_read(device, PCI_LATENCY_TIMER, 1);
190 void pci_device_set_header_type(PciDevice *device, uint8_t value)
192 pci_device_config_write(device, PCI_HEADER_TYPE, 1, value);
195 uint8_t pci_device_get_header_type(PciDevice *device)
197 return pci_device_config_read(device, PCI_HEADER_TYPE, 1);
200 void pci_device_set_bist(PciDevice *device, uint8_t value)
202 pci_device_config_write(device, PCI_BIST, 1, value);
205 uint8_t pci_device_get_bist(PciDevice *device)
207 return pci_device_config_read(device, PCI_BIST, 1);
210 static TypeInfo pci_device_info = {
211 .name = TYPE_PCI_DEVICE,
212 .parent = TYPE_DEVICE,
213 .instance_size = sizeof(PciDevice),
214 .class_size = sizeof(PciDeviceClass),
215 .instance_init = pci_device_initfn,
216 .class_init = pci_device_class_initfn,
219 static void register_devices(void)
221 type_register_static(&pci_device_info);
224 device_init(register_devices);