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
)
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
)
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);
41 void pci_device_config_write_std(PciDevice
*device
, uint8_t offset
, int size
, uint32_t value
)
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
)
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
);