mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging
pc, pci, virtio: features, fixes, cleanups A bunch of fixes, cleanus and new features all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # gpg: Signature made Thu 11 Jan 2018 20:04:57 GMT # gpg: using RSA key 0x281F0DB8D28D5469 # gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" # gpg: aka "Michael S. Tsirkin <mst@redhat.com>" # Primary key fingerprint: 0270 606B 6F3C DF3D 0B17 0970 C350 3912 AFBE 8E67 # Subkey fingerprint: 5D09 FD08 71C8 F85B 94CA 8A0D 281F 0DB8 D28D 5469 * remotes/mst/tags/for_upstream: (23 commits) smbus: do not immediately complete commands dump-guest-memory.py: fix "You can't do that without a process to debug" virtio-pci: Don't force Subsystem Vendor ID = Vendor ID intel_iommu: fix error param in string intel_iommu: remove X86_IOMMU_PCI_DEVFN_MAX vhost-user: document memory accesses vhost-user: fix indentation in protocol specification hw/pci-host/xilinx: QOM'ify the AXI-PCIe host bridge hw/pci-host/piix: QOM'ify the IGD Passthrough host bridge tests/pxe-test: Add some extra tests tests/pxe-test: Test net booting over IPv6 in some cases tests/pxe-test: Use table of testcases rather than open-coding tests/pxe-test: Remove unnecessary special case test functions virtio_error: don't invoke status callbacks pci: Eliminate pci_find_primary_bus() pci: Eliminate redundant PCIDevice::bus pointer pci: Add pci_dev_bus_num() helper pci: Move bridge data structures from pci_bus.h to pci_bridge.h pci: Rename root bus initialization functions for clarity tests: add test to check VirtQueue object ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -53,8 +53,8 @@ Depending on the request type, payload can be:
|
||||
|
||||
* A vring state description
|
||||
---------------
|
||||
| index | num |
|
||||
---------------
|
||||
| index | num |
|
||||
---------------
|
||||
|
||||
Index: a 32-bit index
|
||||
Num: a 32-bit number
|
||||
@@ -66,11 +66,14 @@ Depending on the request type, payload can be:
|
||||
|
||||
Index: a 32-bit vring index
|
||||
Flags: a 32-bit vring flags
|
||||
Descriptor: a 64-bit user address of the vring descriptor table
|
||||
Used: a 64-bit user address of the vring used ring
|
||||
Available: a 64-bit user address of the vring available ring
|
||||
Descriptor: a 64-bit ring address of the vring descriptor table
|
||||
Used: a 64-bit ring address of the vring used ring
|
||||
Available: a 64-bit ring address of the vring available ring
|
||||
Log: a 64-bit guest address for logging
|
||||
|
||||
Note that a ring address is an IOVA if VIRTIO_F_IOMMU_PLATFORM has been
|
||||
negotiated. Otherwise it is a user address.
|
||||
|
||||
* Memory regions description
|
||||
---------------------------------------------------
|
||||
| num regions | padding | region0 | ... | region7 |
|
||||
@@ -273,6 +276,30 @@ Once the source has finished migration, rings will be stopped by
|
||||
the source. No further update must be done before rings are
|
||||
restarted.
|
||||
|
||||
Memory access
|
||||
-------------
|
||||
|
||||
The master sends a list of vhost memory regions to the slave using the
|
||||
VHOST_USER_SET_MEM_TABLE message. Each region has two base addresses: a guest
|
||||
address and a user address.
|
||||
|
||||
Messages contain guest addresses and/or user addresses to reference locations
|
||||
within the shared memory. The mapping of these addresses works as follows.
|
||||
|
||||
User addresses map to the vhost memory region containing that user address.
|
||||
|
||||
When the VIRTIO_F_IOMMU_PLATFORM feature has not been negotiated:
|
||||
|
||||
* Guest addresses map to the vhost memory region containing that guest
|
||||
address.
|
||||
|
||||
When the VIRTIO_F_IOMMU_PLATFORM feature has been negotiated:
|
||||
|
||||
* Guest addresses are also called I/O virtual addresses (IOVAs). They are
|
||||
translated to user addresses via the IOTLB.
|
||||
|
||||
* The vhost memory region guest address is not used.
|
||||
|
||||
IOMMU support
|
||||
-------------
|
||||
|
||||
|
||||
+2
-2
@@ -223,7 +223,7 @@ void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
|
||||
{
|
||||
PCIDevice *pdev = PCI_DEVICE(dev);
|
||||
int slot = PCI_SLOT(pdev->devfn);
|
||||
int bsel = acpi_pcihp_get_bsel(pdev->bus);
|
||||
int bsel = acpi_pcihp_get_bsel(pci_get_bus(pdev));
|
||||
if (bsel < 0) {
|
||||
error_setg(errp, "Unsupported bus. Bus doesn't have property '"
|
||||
ACPI_PCIHP_PROP_BSEL "' set");
|
||||
@@ -246,7 +246,7 @@ void acpi_pcihp_device_unplug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
|
||||
{
|
||||
PCIDevice *pdev = PCI_DEVICE(dev);
|
||||
int slot = PCI_SLOT(pdev->devfn);
|
||||
int bsel = acpi_pcihp_get_bsel(pdev->bus);
|
||||
int bsel = acpi_pcihp_get_bsel(pci_get_bus(pdev));
|
||||
if (bsel < 0) {
|
||||
error_setg(errp, "Unsupported bus. Bus doesn't have property '"
|
||||
ACPI_PCIHP_PROP_BSEL "' set");
|
||||
|
||||
+4
-3
@@ -460,9 +460,9 @@ static void piix4_pm_machine_ready(Notifier *n, void *opaque)
|
||||
(memory_region_present(io_as, 0x2f8) ? 0x90 : 0);
|
||||
|
||||
if (s->use_acpi_pci_hotplug) {
|
||||
pci_for_each_bus(d->bus, piix4_update_bus_hotplug, s);
|
||||
pci_for_each_bus(pci_get_bus(d), piix4_update_bus_hotplug, s);
|
||||
} else {
|
||||
piix4_update_bus_hotplug(d->bus, s);
|
||||
piix4_update_bus_hotplug(pci_get_bus(d), s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -535,7 +535,8 @@ static void piix4_pm_realize(PCIDevice *dev, Error **errp)
|
||||
qemu_add_machine_init_done_notifier(&s->machine_ready);
|
||||
qemu_register_reset(piix4_reset, s);
|
||||
|
||||
piix4_acpi_system_hot_add_init(pci_address_space_io(dev), dev->bus, s);
|
||||
piix4_acpi_system_hot_add_init(pci_address_space_io(dev),
|
||||
pci_get_bus(dev), s);
|
||||
|
||||
piix4_pm_add_propeties(s);
|
||||
}
|
||||
|
||||
+8
-22
@@ -162,21 +162,6 @@ static void vmgenid_update_guest(VmGenIdState *vms)
|
||||
}
|
||||
}
|
||||
|
||||
static void vmgenid_set_guid(Object *obj, const char *value, Error **errp)
|
||||
{
|
||||
VmGenIdState *vms = VMGENID(obj);
|
||||
|
||||
if (!strcmp(value, "auto")) {
|
||||
qemu_uuid_generate(&vms->guid);
|
||||
} else if (qemu_uuid_parse(value, &vms->guid) < 0) {
|
||||
error_setg(errp, "'%s. %s': Failed to parse GUID string: %s",
|
||||
object_get_typename(OBJECT(vms)), VMGENID_GUID, value);
|
||||
return;
|
||||
}
|
||||
|
||||
vmgenid_update_guest(vms);
|
||||
}
|
||||
|
||||
/* After restoring an image, we need to update the guest memory and notify
|
||||
* it of a potential change to VM Generation ID
|
||||
*/
|
||||
@@ -224,23 +209,24 @@ static void vmgenid_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
|
||||
qemu_register_reset(vmgenid_handle_reset, vms);
|
||||
|
||||
vmgenid_update_guest(vms);
|
||||
}
|
||||
|
||||
static Property vmgenid_device_properties[] = {
|
||||
DEFINE_PROP_UUID(VMGENID_GUID, VmGenIdState, guid),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static void vmgenid_device_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
dc->vmsd = &vmstate_vmgenid;
|
||||
dc->realize = vmgenid_realize;
|
||||
dc->props = vmgenid_device_properties;
|
||||
dc->hotpluggable = false;
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
|
||||
object_class_property_add_str(klass, VMGENID_GUID, NULL,
|
||||
vmgenid_set_guid, NULL);
|
||||
object_class_property_set_description(klass, VMGENID_GUID,
|
||||
"Set Global Unique Identifier "
|
||||
"(big-endian) or auto for random value",
|
||||
NULL);
|
||||
}
|
||||
|
||||
static const TypeInfo vmgenid_device_info = {
|
||||
|
||||
+4
-4
@@ -881,10 +881,10 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
|
||||
memory_region_add_subregion(addr_space, 0x801fc000000ULL,
|
||||
&s->pchip.reg_io);
|
||||
|
||||
b = pci_register_bus(dev, "pci",
|
||||
typhoon_set_irq, sys_map_irq, s,
|
||||
&s->pchip.reg_mem, &s->pchip.reg_io,
|
||||
0, 64, TYPE_PCI_BUS);
|
||||
b = pci_register_root_bus(dev, "pci",
|
||||
typhoon_set_irq, sys_map_irq, s,
|
||||
&s->pchip.reg_mem, &s->pchip.reg_io,
|
||||
0, 64, TYPE_PCI_BUS);
|
||||
phb->bus = b;
|
||||
qdev_init_nofail(dev);
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "net/hub.h"
|
||||
#include "qapi/visitor.h"
|
||||
#include "chardev/char.h"
|
||||
#include "qemu/uuid.h"
|
||||
|
||||
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
|
||||
Error **errp)
|
||||
@@ -883,6 +884,66 @@ const PropertyInfo qdev_prop_pci_host_devaddr = {
|
||||
.set = set_pci_host_devaddr,
|
||||
};
|
||||
|
||||
/* --- UUID --- */
|
||||
|
||||
static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
QemuUUID *uuid = qdev_get_prop_ptr(dev, prop);
|
||||
char buffer[UUID_FMT_LEN + 1];
|
||||
char *p = buffer;
|
||||
|
||||
qemu_uuid_unparse(uuid, buffer);
|
||||
|
||||
visit_type_str(v, name, &p, errp);
|
||||
}
|
||||
|
||||
#define UUID_VALUE_AUTO "auto"
|
||||
|
||||
static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
QemuUUID *uuid = qdev_get_prop_ptr(dev, prop);
|
||||
Error *local_err = NULL;
|
||||
char *str;
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
return;
|
||||
}
|
||||
|
||||
visit_type_str(v, name, &str, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(str, UUID_VALUE_AUTO)) {
|
||||
qemu_uuid_generate(uuid);
|
||||
} else if (qemu_uuid_parse(str, uuid) < 0) {
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
|
||||
}
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
static void set_default_uuid_auto(Object *obj, const Property *prop)
|
||||
{
|
||||
object_property_set_str(obj, UUID_VALUE_AUTO, prop->name, &error_abort);
|
||||
}
|
||||
|
||||
const PropertyInfo qdev_prop_uuid = {
|
||||
.name = "str",
|
||||
.description = "UUID (aka GUID) or \"" UUID_VALUE_AUTO
|
||||
"\" for random value (default)",
|
||||
.get = get_uuid,
|
||||
.set = set_uuid,
|
||||
.set_default_value = set_default_uuid_auto,
|
||||
};
|
||||
|
||||
/* --- support for array properties --- */
|
||||
|
||||
/* Used as an opaque for the object properties we add for each
|
||||
|
||||
+15
-1
@@ -62,6 +62,9 @@ static void smb_transaction(PMSMBus *s)
|
||||
I2CBus *bus = s->smbus;
|
||||
int ret;
|
||||
|
||||
assert(s->smb_stat & STS_HOST_BUSY);
|
||||
s->smb_stat &= ~STS_HOST_BUSY;
|
||||
|
||||
SMBUS_DPRINTF("SMBus trans addr=0x%02x prot=0x%02x\n", addr, prot);
|
||||
/* Transaction isn't exec if STS_DEV_ERR bit set */
|
||||
if ((s->smb_stat & STS_DEV_ERR) != 0) {
|
||||
@@ -134,6 +137,13 @@ error:
|
||||
|
||||
}
|
||||
|
||||
static void smb_transaction_start(PMSMBus *s)
|
||||
{
|
||||
/* Do not execute immediately the command ; it will be
|
||||
* executed when guest will read SMB_STAT register */
|
||||
s->smb_stat |= STS_HOST_BUSY;
|
||||
}
|
||||
|
||||
static void smb_ioport_writeb(void *opaque, hwaddr addr, uint64_t val,
|
||||
unsigned width)
|
||||
{
|
||||
@@ -149,7 +159,7 @@ static void smb_ioport_writeb(void *opaque, hwaddr addr, uint64_t val,
|
||||
case SMBHSTCNT:
|
||||
s->smb_ctl = val;
|
||||
if (val & 0x40)
|
||||
smb_transaction(s);
|
||||
smb_transaction_start(s);
|
||||
break;
|
||||
case SMBHSTCMD:
|
||||
s->smb_cmd = val;
|
||||
@@ -181,6 +191,10 @@ static uint64_t smb_ioport_readb(void *opaque, hwaddr addr, unsigned width)
|
||||
switch(addr) {
|
||||
case SMBHSTSTS:
|
||||
val = s->smb_stat;
|
||||
if (s->smb_stat & STS_HOST_BUSY) {
|
||||
/* execute command now */
|
||||
smb_transaction(s);
|
||||
}
|
||||
break;
|
||||
case SMBHSTCNT:
|
||||
s->smb_index = 0;
|
||||
|
||||
@@ -186,7 +186,7 @@ static void vtd_reset_context_cache(IntelIOMMUState *s)
|
||||
g_hash_table_iter_init(&bus_it, s->vtd_as_by_busptr);
|
||||
|
||||
while (g_hash_table_iter_next (&bus_it, NULL, (void**)&vtd_bus)) {
|
||||
for (devfn_it = 0; devfn_it < X86_IOMMU_PCI_DEVFN_MAX; ++devfn_it) {
|
||||
for (devfn_it = 0; devfn_it < PCI_DEVFN_MAX; ++devfn_it) {
|
||||
vtd_as = vtd_bus->dev_as[devfn_it];
|
||||
if (!vtd_as) {
|
||||
continue;
|
||||
@@ -1002,7 +1002,7 @@ static void vtd_switch_address_space_all(IntelIOMMUState *s)
|
||||
|
||||
g_hash_table_iter_init(&iter, s->vtd_as_by_busptr);
|
||||
while (g_hash_table_iter_next(&iter, NULL, (void **)&vtd_bus)) {
|
||||
for (i = 0; i < X86_IOMMU_PCI_DEVFN_MAX; i++) {
|
||||
for (i = 0; i < PCI_DEVFN_MAX; i++) {
|
||||
if (!vtd_bus->dev_as[i]) {
|
||||
continue;
|
||||
}
|
||||
@@ -1294,7 +1294,7 @@ static void vtd_context_device_invalidate(IntelIOMMUState *s,
|
||||
vtd_bus = vtd_find_as_from_bus_num(s, bus_n);
|
||||
if (vtd_bus) {
|
||||
devfn = VTD_SID_TO_DEVFN(source_id);
|
||||
for (devfn_it = 0; devfn_it < X86_IOMMU_PCI_DEVFN_MAX; ++devfn_it) {
|
||||
for (devfn_it = 0; devfn_it < PCI_DEVFN_MAX; ++devfn_it) {
|
||||
vtd_as = vtd_bus->dev_as[devfn_it];
|
||||
if (vtd_as && ((devfn_it & mask) == (devfn & mask))) {
|
||||
trace_vtd_inv_desc_cc_device(bus_n, VTD_PCI_SLOT(devfn_it),
|
||||
@@ -2327,7 +2327,7 @@ static void vtd_iommu_notify_flag_changed(IOMMUMemoryRegion *iommu,
|
||||
IntelIOMMUNotifierNode *next_node = NULL;
|
||||
|
||||
if (!s->caching_mode && new & IOMMU_NOTIFIER_MAP) {
|
||||
error_report("We need to set cache_mode=1 for intel-iommu to enable "
|
||||
error_report("We need to set caching-mode=1 for intel-iommu to enable "
|
||||
"device assignment with IOMMU protection.");
|
||||
exit(1);
|
||||
}
|
||||
@@ -2699,7 +2699,7 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s, PCIBus *bus, int devfn)
|
||||
*new_key = (uintptr_t)bus;
|
||||
/* No corresponding free() */
|
||||
vtd_bus = g_malloc0(sizeof(VTDBus) + sizeof(VTDAddressSpace *) * \
|
||||
X86_IOMMU_PCI_DEVFN_MAX);
|
||||
PCI_DEVFN_MAX);
|
||||
vtd_bus->bus = bus;
|
||||
g_hash_table_insert(s->vtd_as_by_busptr, new_key, vtd_bus);
|
||||
}
|
||||
@@ -2982,7 +2982,7 @@ static AddressSpace *vtd_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
IntelIOMMUState *s = opaque;
|
||||
VTDAddressSpace *vtd_as;
|
||||
|
||||
assert(0 <= devfn && devfn < X86_IOMMU_PCI_DEVFN_MAX);
|
||||
assert(0 <= devfn && devfn < PCI_DEVFN_MAX);
|
||||
|
||||
vtd_as = vtd_find_add_as(s, bus, devfn);
|
||||
return &vtd_as->as;
|
||||
|
||||
+2
-6
@@ -394,7 +394,7 @@ static void pc_xen_hvm_init_pci(MachineState *machine)
|
||||
|
||||
static void pc_xen_hvm_init(MachineState *machine)
|
||||
{
|
||||
PCIBus *bus;
|
||||
PCMachineState *pcms = PC_MACHINE(machine);
|
||||
|
||||
if (!xen_enabled()) {
|
||||
error_report("xenfv machine requires the xen accelerator");
|
||||
@@ -402,11 +402,7 @@ static void pc_xen_hvm_init(MachineState *machine)
|
||||
}
|
||||
|
||||
pc_xen_hvm_init_pci(machine);
|
||||
|
||||
bus = pci_find_primary_bus();
|
||||
if (bus != NULL) {
|
||||
pci_create_simple(bus, -1, "xen-platform");
|
||||
}
|
||||
pci_create_simple(pcms->bus, -1, "xen-platform");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -185,11 +185,11 @@ static void platform_fixed_ioport_writew(void *opaque, uint32_t addr, uint32_t v
|
||||
if (val & (UNPLUG_IDE_SCSI_DISKS | UNPLUG_AUX_IDE_DISKS |
|
||||
UNPLUG_NVME_DISKS)) {
|
||||
DPRINTF("unplug disks\n");
|
||||
pci_unplug_disks(pci_dev->bus, val);
|
||||
pci_unplug_disks(pci_get_bus(pci_dev), val);
|
||||
}
|
||||
if (val & UNPLUG_ALL_NICS) {
|
||||
DPRINTF("unplug nics\n");
|
||||
pci_unplug_nics(pci_dev->bus);
|
||||
pci_unplug_nics(pci_get_bus(pci_dev));
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -371,17 +371,17 @@ static void xen_platform_ioport_writeb(void *opaque, hwaddr addr,
|
||||
* If VMDP was to control both disk and LAN it would use 4.
|
||||
* If it controlled just disk or just LAN, it would use 8 below.
|
||||
*/
|
||||
pci_unplug_disks(pci_dev->bus, UNPLUG_IDE_SCSI_DISKS);
|
||||
pci_unplug_nics(pci_dev->bus);
|
||||
pci_unplug_disks(pci_get_bus(pci_dev), UNPLUG_IDE_SCSI_DISKS);
|
||||
pci_unplug_nics(pci_get_bus(pci_dev));
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
switch (val) {
|
||||
case 1:
|
||||
pci_unplug_disks(pci_dev->bus, UNPLUG_IDE_SCSI_DISKS);
|
||||
pci_unplug_disks(pci_get_bus(pci_dev), UNPLUG_IDE_SCSI_DISKS);
|
||||
break;
|
||||
case 2:
|
||||
pci_unplug_nics(pci_dev->bus);
|
||||
pci_unplug_nics(pci_get_bus(pci_dev));
|
||||
break;
|
||||
default:
|
||||
log_writeb(s, (uint32_t)val);
|
||||
|
||||
+5
-5
@@ -162,7 +162,7 @@ static void ich9_cc_write(void *opaque, hwaddr addr,
|
||||
|
||||
ich9_cc_addr_len(&addr, &len);
|
||||
memcpy(lpc->chip_config + addr, &val, len);
|
||||
pci_bus_fire_intx_routing_notifier(lpc->d.bus);
|
||||
pci_bus_fire_intx_routing_notifier(pci_get_bus(&lpc->d));
|
||||
ich9_cc_update(lpc);
|
||||
}
|
||||
|
||||
@@ -218,7 +218,7 @@ static void ich9_lpc_update_pic(ICH9LPCState *lpc, int gsi)
|
||||
int tmp_dis;
|
||||
ich9_lpc_pic_irq(lpc, i, &tmp_irq, &tmp_dis);
|
||||
if (!tmp_dis && tmp_irq == gsi) {
|
||||
pic_level |= pci_bus_get_irq_level(lpc->d.bus, i);
|
||||
pic_level |= pci_bus_get_irq_level(pci_get_bus(&lpc->d), i);
|
||||
}
|
||||
}
|
||||
if (gsi == lpc->sci_gsi) {
|
||||
@@ -246,7 +246,7 @@ static void ich9_lpc_update_apic(ICH9LPCState *lpc, int gsi)
|
||||
|
||||
assert(gsi >= ICH9_LPC_PIC_NUM_PINS);
|
||||
|
||||
level |= pci_bus_get_irq_level(lpc->d.bus, ich9_gsi_to_pirq(gsi));
|
||||
level |= pci_bus_get_irq_level(pci_get_bus(&lpc->d), ich9_gsi_to_pirq(gsi));
|
||||
if (gsi == lpc->sci_gsi) {
|
||||
level |= lpc->sci_level;
|
||||
}
|
||||
@@ -524,10 +524,10 @@ static void ich9_lpc_config_write(PCIDevice *d,
|
||||
ich9_lpc_rcba_update(lpc, rcba_old);
|
||||
}
|
||||
if (ranges_overlap(addr, len, ICH9_LPC_PIRQA_ROUT, 4)) {
|
||||
pci_bus_fire_intx_routing_notifier(lpc->d.bus);
|
||||
pci_bus_fire_intx_routing_notifier(pci_get_bus(&lpc->d));
|
||||
}
|
||||
if (ranges_overlap(addr, len, ICH9_LPC_PIRQE_ROUT, 4)) {
|
||||
pci_bus_fire_intx_routing_notifier(lpc->d.bus);
|
||||
pci_bus_fire_intx_routing_notifier(pci_get_bus(&lpc->d));
|
||||
}
|
||||
if (ranges_overlap(addr, len, ICH9_LPC_GEN_PMCON_1, 8)) {
|
||||
ich9_lpc_pmcon_update(lpc);
|
||||
|
||||
@@ -1171,12 +1171,12 @@ PCIBus *gt64120_register(qemu_irq *pic)
|
||||
phb = PCI_HOST_BRIDGE(dev);
|
||||
memory_region_init(&d->pci0_mem, OBJECT(dev), "pci0-mem", UINT32_MAX);
|
||||
address_space_init(&d->pci0_mem_as, &d->pci0_mem, "pci0-mem");
|
||||
phb->bus = pci_register_bus(dev, "pci",
|
||||
gt64120_pci_set_irq, gt64120_pci_map_irq,
|
||||
pic,
|
||||
&d->pci0_mem,
|
||||
get_system_io(),
|
||||
PCI_DEVFN(18, 0), 4, TYPE_PCI_BUS);
|
||||
phb->bus = pci_register_root_bus(dev, "pci",
|
||||
gt64120_pci_set_irq, gt64120_pci_map_irq,
|
||||
pic,
|
||||
&d->pci0_mem,
|
||||
get_system_io(),
|
||||
PCI_DEVFN(18, 0), 4, TYPE_PCI_BUS);
|
||||
qdev_init_nofail(dev);
|
||||
memory_region_init_io(&d->ISD_mem, OBJECT(dev), &isd_mem_ops, d, "isd-mem", 0x1000);
|
||||
|
||||
|
||||
+1
-1
@@ -2356,7 +2356,7 @@ static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error **errp)
|
||||
vmxnet3_net_init(s);
|
||||
|
||||
if (pci_is_express(pci_dev)) {
|
||||
if (pci_bus_is_express(pci_dev->bus)) {
|
||||
if (pci_bus_is_express(pci_get_bus(pci_dev))) {
|
||||
pcie_endpoint_cap_init(pci_dev, VMXNET3_EXP_EP_OFFSET);
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,8 @@ typedef struct PXBDev {
|
||||
|
||||
static PXBDev *convert_to_pxb(PCIDevice *dev)
|
||||
{
|
||||
return pci_bus_is_express(dev->bus) ? PXB_PCIE_DEV(dev) : PXB_DEV(dev);
|
||||
return pci_bus_is_express(pci_get_bus(dev))
|
||||
? PXB_PCIE_DEV(dev) : PXB_DEV(dev);
|
||||
}
|
||||
|
||||
static GList *pxb_dev_list;
|
||||
@@ -165,7 +166,7 @@ static const TypeInfo pxb_host_info = {
|
||||
*/
|
||||
static void pxb_register_bus(PCIDevice *dev, PCIBus *pxb_bus, Error **errp)
|
||||
{
|
||||
PCIBus *bus = dev->bus;
|
||||
PCIBus *bus = pci_get_bus(dev);
|
||||
int pxb_bus_num = pci_bus_num(pxb_bus);
|
||||
|
||||
if (bus->parent_dev) {
|
||||
@@ -179,12 +180,12 @@ static void pxb_register_bus(PCIDevice *dev, PCIBus *pxb_bus, Error **errp)
|
||||
return;
|
||||
}
|
||||
}
|
||||
QLIST_INSERT_HEAD(&dev->bus->child, pxb_bus, sibling);
|
||||
QLIST_INSERT_HEAD(&pci_get_bus(dev)->child, pxb_bus, sibling);
|
||||
}
|
||||
|
||||
static int pxb_map_irq_fn(PCIDevice *pci_dev, int pin)
|
||||
{
|
||||
PCIDevice *pxb = pci_dev->bus->parent_dev;
|
||||
PCIDevice *pxb = pci_get_bus(pci_dev)->parent_dev;
|
||||
|
||||
/*
|
||||
* The bios does not index the pxb slot number when
|
||||
@@ -229,9 +230,9 @@ static void pxb_dev_realize_common(PCIDevice *dev, bool pcie, Error **errp)
|
||||
|
||||
ds = qdev_create(NULL, TYPE_PXB_HOST);
|
||||
if (pcie) {
|
||||
bus = pci_bus_new(ds, dev_name, NULL, NULL, 0, TYPE_PXB_PCIE_BUS);
|
||||
bus = pci_root_bus_new(ds, dev_name, NULL, NULL, 0, TYPE_PXB_PCIE_BUS);
|
||||
} else {
|
||||
bus = pci_bus_new(ds, "pxb-internal", NULL, NULL, 0, TYPE_PXB_BUS);
|
||||
bus = pci_root_bus_new(ds, "pxb-internal", NULL, NULL, 0, TYPE_PXB_BUS);
|
||||
bds = qdev_create(BUS(bus), "pci-bridge");
|
||||
bds->id = dev_name;
|
||||
qdev_prop_set_uint8(bds, PCI_BRIDGE_DEV_PROP_CHASSIS_NR, pxb->bus_nr);
|
||||
@@ -239,8 +240,8 @@ static void pxb_dev_realize_common(PCIDevice *dev, bool pcie, Error **errp)
|
||||
}
|
||||
|
||||
bus->parent_dev = dev;
|
||||
bus->address_space_mem = dev->bus->address_space_mem;
|
||||
bus->address_space_io = dev->bus->address_space_io;
|
||||
bus->address_space_mem = pci_get_bus(dev)->address_space_mem;
|
||||
bus->address_space_io = pci_get_bus(dev)->address_space_io;
|
||||
bus->map_irq = pxb_map_irq_fn;
|
||||
|
||||
PCI_HOST_BRIDGE(ds)->bus = bus;
|
||||
@@ -271,7 +272,7 @@ err_register_bus:
|
||||
|
||||
static void pxb_dev_realize(PCIDevice *dev, Error **errp)
|
||||
{
|
||||
if (pci_bus_is_express(dev->bus)) {
|
||||
if (pci_bus_is_express(pci_get_bus(dev))) {
|
||||
error_setg(errp, "pxb devices cannot reside on a PCIe bus");
|
||||
return;
|
||||
}
|
||||
@@ -323,7 +324,7 @@ static const TypeInfo pxb_dev_info = {
|
||||
|
||||
static void pxb_pcie_dev_realize(PCIDevice *dev, Error **errp)
|
||||
{
|
||||
if (!pci_bus_is_express(dev->bus)) {
|
||||
if (!pci_bus_is_express(pci_get_bus(dev))) {
|
||||
error_setg(errp, "pxb-pcie devices cannot reside on a PCI bus");
|
||||
return;
|
||||
}
|
||||
|
||||
+5
-5
@@ -433,11 +433,11 @@ static void pci_pbm_realize(DeviceState *dev, Error **errp)
|
||||
memory_region_add_subregion(get_system_memory(), s->mem_base,
|
||||
&s->pci_mmio);
|
||||
|
||||
phb->bus = pci_register_bus(dev, "pci",
|
||||
pci_apb_set_irq, pci_apb_map_irq, s,
|
||||
&s->pci_mmio,
|
||||
&s->pci_ioport,
|
||||
0, 32, TYPE_PCI_BUS);
|
||||
phb->bus = pci_register_root_bus(dev, "pci",
|
||||
pci_apb_set_irq, pci_apb_map_irq, s,
|
||||
&s->pci_mmio,
|
||||
&s->pci_ioport,
|
||||
0, 32, TYPE_PCI_BUS);
|
||||
|
||||
pci_create_simple(phb->bus, 0, "pbm-pci");
|
||||
|
||||
|
||||
@@ -714,10 +714,10 @@ static int bonito_pcihost_initfn(SysBusDevice *dev)
|
||||
{
|
||||
PCIHostState *phb = PCI_HOST_BRIDGE(dev);
|
||||
|
||||
phb->bus = pci_register_bus(DEVICE(dev), "pci",
|
||||
pci_bonito_set_irq, pci_bonito_map_irq, dev,
|
||||
get_system_memory(), get_system_io(),
|
||||
0x28, 32, TYPE_PCI_BUS);
|
||||
phb->bus = pci_register_root_bus(DEVICE(dev), "pci",
|
||||
pci_bonito_set_irq, pci_bonito_map_irq,
|
||||
dev, get_system_memory(), get_system_io(),
|
||||
0x28, 32, TYPE_PCI_BUS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+3
-3
@@ -89,9 +89,9 @@ static void gpex_host_realize(DeviceState *dev, Error **errp)
|
||||
s->irq_num[i] = -1;
|
||||
}
|
||||
|
||||
pci->bus = pci_register_bus(dev, "pcie.0", gpex_set_irq,
|
||||
pci_swizzle_map_irq_fn, s, &s->io_mmio,
|
||||
&s->io_ioport, 0, 4, TYPE_PCIE_BUS);
|
||||
pci->bus = pci_register_root_bus(dev, "pcie.0", gpex_set_irq,
|
||||
pci_swizzle_map_irq_fn, s, &s->io_mmio,
|
||||
&s->io_ioport, 0, 4, TYPE_PCIE_BUS);
|
||||
|
||||
qdev_set_parent_bus(DEVICE(&s->gpex_root), BUS(pci->bus));
|
||||
pci_bus_set_route_irq_fn(pci->bus, gpex_route_intx_pin_to_irq);
|
||||
|
||||
@@ -82,13 +82,13 @@ PCIBus *pci_grackle_init(uint32_t base, qemu_irq *pic,
|
||||
memory_region_add_subregion(address_space_mem, 0x80000000ULL,
|
||||
&d->pci_hole);
|
||||
|
||||
phb->bus = pci_register_bus(dev, NULL,
|
||||
pci_grackle_set_irq,
|
||||
pci_grackle_map_irq,
|
||||
pic,
|
||||
&d->pci_mmio,
|
||||
address_space_io,
|
||||
0, 4, TYPE_PCI_BUS);
|
||||
phb->bus = pci_register_root_bus(dev, NULL,
|
||||
pci_grackle_set_irq,
|
||||
pci_grackle_map_irq,
|
||||
pic,
|
||||
&d->pci_mmio,
|
||||
address_space_io,
|
||||
0, 4, TYPE_PCI_BUS);
|
||||
|
||||
pci_create_simple(phb->bus, 0, "grackle");
|
||||
qdev_init_nofail(dev);
|
||||
|
||||
+27
-32
@@ -361,8 +361,8 @@ PCIBus *i440fx_init(const char *host_type, const char *pci_type,
|
||||
|
||||
dev = qdev_create(NULL, host_type);
|
||||
s = PCI_HOST_BRIDGE(dev);
|
||||
b = pci_bus_new(dev, NULL, pci_address_space,
|
||||
address_space_io, 0, TYPE_PCI_BUS);
|
||||
b = pci_root_bus_new(dev, NULL, pci_address_space,
|
||||
address_space_io, 0, TYPE_PCI_BUS);
|
||||
s->bus = b;
|
||||
object_property_add_child(qdev_get_machine(), "i440fx", OBJECT(dev), NULL);
|
||||
qdev_init_nofail(dev);
|
||||
@@ -512,12 +512,12 @@ static PCIINTxRoute piix3_route_intx_pin_to_irq(void *opaque, int pin)
|
||||
/* irq routing is changed. so rebuild bitmap */
|
||||
static void piix3_update_irq_levels(PIIX3State *piix3)
|
||||
{
|
||||
PCIBus *bus = pci_get_bus(&piix3->dev);
|
||||
int pirq;
|
||||
|
||||
piix3->pic_levels = 0;
|
||||
for (pirq = 0; pirq < PIIX_NUM_PIRQS; pirq++) {
|
||||
piix3_set_irq_level(piix3, pirq,
|
||||
pci_bus_get_irq_level(piix3->dev.bus, pirq));
|
||||
piix3_set_irq_level(piix3, pirq, pci_bus_get_irq_level(bus, pirq));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -529,7 +529,7 @@ static void piix3_write_config(PCIDevice *dev,
|
||||
PIIX3State *piix3 = PIIX3_PCI_DEVICE(dev);
|
||||
int pic_irq;
|
||||
|
||||
pci_bus_fire_intx_routing_notifier(piix3->dev.bus);
|
||||
pci_bus_fire_intx_routing_notifier(pci_get_bus(&piix3->dev));
|
||||
piix3_update_irq_levels(piix3);
|
||||
for (pic_irq = 0; pic_irq < PIIX_NUM_PIC_IRQS; pic_irq++) {
|
||||
piix3_set_irq_pic(piix3, pic_irq);
|
||||
@@ -601,7 +601,7 @@ static int piix3_post_load(void *opaque, int version_id)
|
||||
piix3->pic_levels = 0;
|
||||
for (pirq = 0; pirq < PIIX_NUM_PIRQS; pirq++) {
|
||||
piix3_set_irq_level_internal(piix3, pirq,
|
||||
pci_bus_get_irq_level(piix3->dev.bus, pirq));
|
||||
pci_bus_get_irq_level(pci_get_bus(&piix3->dev), pirq));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -613,7 +613,7 @@ static int piix3_pre_save(void *opaque)
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(piix3->pci_irq_levels_vmstate); i++) {
|
||||
piix3->pci_irq_levels_vmstate[i] =
|
||||
pci_bus_get_irq_level(piix3->dev.bus, i);
|
||||
pci_bus_get_irq_level(pci_get_bus(&piix3->dev), i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -804,60 +804,55 @@ static const IGDHostInfo igd_host_bridge_infos[] = {
|
||||
{0xa8, 4}, /* SNB: base of GTT stolen memory */
|
||||
};
|
||||
|
||||
static int host_pci_config_read(int pos, int len, uint32_t *val)
|
||||
static void host_pci_config_read(int pos, int len, uint32_t *val, Error **errp)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
int config_fd;
|
||||
ssize_t size = sizeof(path);
|
||||
int rc, config_fd;
|
||||
/* Access real host bridge. */
|
||||
int rc = snprintf(path, size, "/sys/bus/pci/devices/%04x:%02x:%02x.%d/%s",
|
||||
0, 0, 0, 0, "config");
|
||||
int ret = 0;
|
||||
|
||||
if (rc >= size || rc < 0) {
|
||||
return -ENODEV;
|
||||
}
|
||||
char *path = g_strdup_printf("/sys/bus/pci/devices/%04x:%02x:%02x.%d/%s",
|
||||
0, 0, 0, 0, "config");
|
||||
|
||||
config_fd = open(path, O_RDWR);
|
||||
if (config_fd < 0) {
|
||||
return -ENODEV;
|
||||
error_setg_errno(errp, errno, "Failed to open: %s", path);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (lseek(config_fd, pos, SEEK_SET) != pos) {
|
||||
ret = -errno;
|
||||
goto out;
|
||||
error_setg_errno(errp, errno, "Failed to seek: %s", path);
|
||||
goto out_close_fd;
|
||||
}
|
||||
|
||||
do {
|
||||
rc = read(config_fd, (uint8_t *)val, len);
|
||||
} while (rc < 0 && (errno == EINTR || errno == EAGAIN));
|
||||
if (rc != len) {
|
||||
ret = -errno;
|
||||
error_setg_errno(errp, errno, "Failed to read: %s", path);
|
||||
}
|
||||
|
||||
out:
|
||||
out_close_fd:
|
||||
close(config_fd);
|
||||
return ret;
|
||||
out:
|
||||
g_free(path);
|
||||
}
|
||||
|
||||
static int igd_pt_i440fx_initfn(struct PCIDevice *pci_dev)
|
||||
static void igd_pt_i440fx_realize(PCIDevice *pci_dev, Error **errp)
|
||||
{
|
||||
uint32_t val = 0;
|
||||
int rc, i, num;
|
||||
int i, num;
|
||||
int pos, len;
|
||||
Error *local_err = NULL;
|
||||
|
||||
num = ARRAY_SIZE(igd_host_bridge_infos);
|
||||
for (i = 0; i < num; i++) {
|
||||
pos = igd_host_bridge_infos[i].offset;
|
||||
len = igd_host_bridge_infos[i].len;
|
||||
rc = host_pci_config_read(pos, len, &val);
|
||||
if (rc) {
|
||||
return -ENODEV;
|
||||
host_pci_config_read(pos, len, &val, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
pci_default_write_config(pci_dev, pos, val, len);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void igd_passthrough_i440fx_class_init(ObjectClass *klass, void *data)
|
||||
@@ -865,7 +860,7 @@ static void igd_passthrough_i440fx_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->init = igd_pt_i440fx_initfn;
|
||||
k->realize = igd_pt_i440fx_realize;
|
||||
dc->desc = "IGD Passthrough Host bridge";
|
||||
}
|
||||
|
||||
|
||||
@@ -460,9 +460,9 @@ static int e500_pcihost_initfn(SysBusDevice *dev)
|
||||
/* PIO lives at the bottom of our bus space */
|
||||
memory_region_add_subregion_overlap(&s->busmem, 0, &s->pio, -2);
|
||||
|
||||
b = pci_register_bus(DEVICE(dev), NULL, mpc85xx_pci_set_irq,
|
||||
mpc85xx_pci_map_irq, s, &s->busmem, &s->pio,
|
||||
PCI_DEVFN(s->first_slot, 0), 4, TYPE_PCI_BUS);
|
||||
b = pci_register_root_bus(DEVICE(dev), NULL, mpc85xx_pci_set_irq,
|
||||
mpc85xx_pci_map_irq, s, &s->busmem, &s->pio,
|
||||
PCI_DEVFN(s->first_slot, 0), 4, TYPE_PCI_BUS);
|
||||
h->bus = b;
|
||||
|
||||
/* Set up PCI view of memory */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user