218e99
From 8b91f65b26d0dd19fe47ba4ffea86081657fadf9 Mon Sep 17 00:00:00 2001
218e99
From: Kevin Wolf <kwolf@redhat.com>
218e99
Date: Wed, 6 Nov 2013 14:41:16 +0100
218e99
Subject: [PATCH 40/81] pci-host: Consistently set cannot_instantiate_with_device_add_yet
218e99
218e99
RH-Author: Kevin Wolf <kwolf@redhat.com>
218e99
Message-id: <1383748882-22831-12-git-send-email-kwolf@redhat.com>
218e99
Patchwork-id: 55537
218e99
O-Subject: [RHEL-7.0 qemu-kvm PATCH v2 11/17] pci-host: Consistently set cannot_instantiate_with_device_add_yet
218e99
Bugzilla: 1001216
218e99
RH-Acked-by: Marcel Apfelbaum <marcel.a@redhat.com>
218e99
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
218e99
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
218e99
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
218e99
218e99
From: Markus Armbruster <armbru@redhat.com>
218e99
218e99
Many PCI host bridges consist of a sysbus device and a PCI device.
218e99
You need both for the thing to work.  Arguably, these bridges should
218e99
be modelled as a single, composite devices instead of pairs of
218e99
seemingly independent devices you can only use together, but we're not
218e99
there, yet.
218e99
218e99
Since the sysbus part can't be instantiated with device_add, yet,
218e99
permitting it with the PCI part is useless.  We shouldn't offer
218e99
useless options to the user, so let's set
218e99
cannot_instantiate_with_device_add_yet for them.
218e99
218e99
It's already set for Bonito, grackle, i440FX, and raven.  Document
218e99
why.
218e99
218e99
Set it for the others: dec-21154, e500-host-bridge, gt64120_pci, mch,
218e99
pbm-pci, ppc4xx-host-bridge, sh_pci_host, u3-agp, uni-north-agp,
218e99
uni-north-internal-pci, uni-north-pci, and versatile_pci_host.
218e99
218e99
Signed-off-by: Markus Armbruster <armbru@redhat.com>
218e99
Reviewed-by: Marcel Apfelbaum <marcel.a@redhat.com>
218e99
(cherry picked from pending upstream submission)
218e99
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
218e99
---
218e99
 hw/mips/gt64xxx_pci.c   |  6 ++++++
218e99
 hw/pci-host/apb.c       |  6 ++++++
218e99
 hw/pci-host/bonito.c    |  6 +++++-
218e99
 hw/pci-host/dec.c       |  6 ++++++
218e99
 hw/pci-host/grackle.c   |  6 +++++-
218e99
 hw/pci-host/piix.c      |  6 +++++-
218e99
 hw/pci-host/ppce500.c   |  5 +++++
218e99
 hw/pci-host/prep.c      |  6 +++++-
218e99
 hw/pci-host/q35.c       |  5 +++++
218e99
 hw/pci-host/uninorth.c  | 24 ++++++++++++++++++++++++
218e99
 hw/pci-host/versatile.c |  6 ++++++
218e99
 hw/ppc/ppc4xx_pci.c     |  5 +++++
218e99
 hw/sh4/sh_pci.c         |  6 ++++++
218e99
 13 files changed, 89 insertions(+), 4 deletions(-)
218e99
218e99
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
218e99
---
218e99
 hw/mips/gt64xxx_pci.c   |    6 ++++++
218e99
 hw/pci-host/apb.c       |    6 ++++++
218e99
 hw/pci-host/bonito.c    |    6 +++++-
218e99
 hw/pci-host/dec.c       |    6 ++++++
218e99
 hw/pci-host/grackle.c   |    6 +++++-
218e99
 hw/pci-host/piix.c      |    6 +++++-
218e99
 hw/pci-host/ppce500.c   |    5 +++++
218e99
 hw/pci-host/prep.c      |    6 +++++-
218e99
 hw/pci-host/q35.c       |    5 +++++
218e99
 hw/pci-host/uninorth.c  |   24 ++++++++++++++++++++++++
218e99
 hw/pci-host/versatile.c |    6 ++++++
218e99
 hw/ppc/ppc4xx_pci.c     |    5 +++++
218e99
 hw/sh4/sh_pci.c         |    6 ++++++
218e99
 13 files changed, 89 insertions(+), 4 deletions(-)
218e99
218e99
diff --git a/hw/mips/gt64xxx_pci.c b/hw/mips/gt64xxx_pci.c
218e99
index 189e865..3813495 100644
218e99
--- a/hw/mips/gt64xxx_pci.c
218e99
+++ b/hw/mips/gt64xxx_pci.c
218e99
@@ -1150,12 +1150,18 @@ static int gt64120_pci_init(PCIDevice *d)
218e99
 static void gt64120_pci_class_init(ObjectClass *klass, void *data)
218e99
 {
218e99
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
218e99
+    DeviceClass *dc = DEVICE_CLASS(klass);
218e99
 
218e99
     k->init = gt64120_pci_init;
218e99
     k->vendor_id = PCI_VENDOR_ID_MARVELL;
218e99
     k->device_id = PCI_DEVICE_ID_MARVELL_GT6412X;
218e99
     k->revision = 0x10;
218e99
     k->class_id = PCI_CLASS_BRIDGE_HOST;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo gt64120_pci_info = {
218e99
diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c
218e99
index 5ac7556..a296dcf 100644
218e99
--- a/hw/pci-host/apb.c
218e99
+++ b/hw/pci-host/apb.c
218e99
@@ -557,11 +557,17 @@ static int pbm_pci_host_init(PCIDevice *d)
218e99
 static void pbm_pci_host_class_init(ObjectClass *klass, void *data)
218e99
 {
218e99
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
218e99
+    DeviceClass *dc = DEVICE_CLASS(klass);
218e99
 
218e99
     k->init = pbm_pci_host_init;
218e99
     k->vendor_id = PCI_VENDOR_ID_SUN;
218e99
     k->device_id = PCI_DEVICE_ID_SUN_SABRE;
218e99
     k->class_id = PCI_CLASS_BRIDGE_HOST;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo pbm_pci_host_info = {
218e99
diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
218e99
index c2a056a..021e652 100644
218e99
--- a/hw/pci-host/bonito.c
218e99
+++ b/hw/pci-host/bonito.c
218e99
@@ -811,8 +811,12 @@ static void bonito_class_init(ObjectClass *klass, void *data)
218e99
     k->revision = 0x01;
218e99
     k->class_id = PCI_CLASS_BRIDGE_HOST;
218e99
     dc->desc = "Host bridge";
218e99
-    dc->cannot_instantiate_with_device_add_yet = true; /* FIXME explain why */
218e99
     dc->vmsd = &vmstate_bonito;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo bonito_info = {
218e99
diff --git a/hw/pci-host/dec.c b/hw/pci-host/dec.c
218e99
index cff458b..aebb240 100644
218e99
--- a/hw/pci-host/dec.c
218e99
+++ b/hw/pci-host/dec.c
218e99
@@ -116,6 +116,7 @@ static int dec_21154_pci_host_init(PCIDevice *d)
218e99
 static void dec_21154_pci_host_class_init(ObjectClass *klass, void *data)
218e99
 {
218e99
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
218e99
+    DeviceClass *dc = DEVICE_CLASS(klass);
218e99
 
218e99
     k->init = dec_21154_pci_host_init;
218e99
     k->vendor_id = PCI_VENDOR_ID_DEC;
218e99
@@ -123,6 +124,11 @@ static void dec_21154_pci_host_class_init(ObjectClass *klass, void *data)
218e99
     k->revision = 0x02;
218e99
     k->class_id = PCI_CLASS_BRIDGE_PCI;
218e99
     k->is_bridge = 1;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo dec_21154_pci_host_info = {
218e99
diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c
218e99
index 4643beb..315965d 100644
218e99
--- a/hw/pci-host/grackle.c
218e99
+++ b/hw/pci-host/grackle.c
218e99
@@ -130,7 +130,11 @@ static void grackle_pci_class_init(ObjectClass *klass, void *data)
218e99
     k->device_id = PCI_DEVICE_ID_MOTOROLA_MPC106;
218e99
     k->revision  = 0x00;
218e99
     k->class_id  = PCI_CLASS_BRIDGE_HOST;
218e99
-    dc->cannot_instantiate_with_device_add_yet = true; /* FIXME explain why */
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo grackle_pci_info = {
218e99
diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
218e99
index 20cc682..56fc7be 100644
218e99
--- a/hw/pci-host/piix.c
218e99
+++ b/hw/pci-host/piix.c
218e99
@@ -618,8 +618,12 @@ static void i440fx_class_init(ObjectClass *klass, void *data)
218e99
     k->revision = 0x02;
218e99
     k->class_id = PCI_CLASS_BRIDGE_HOST;
218e99
     dc->desc = "Host bridge";
218e99
-    dc->cannot_instantiate_with_device_add_yet = true; /* FIXME explain why */
218e99
     dc->vmsd = &vmstate_i440fx;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo i440fx_info = {
218e99
diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
218e99
index 0d0a001..2dcd668 100644
218e99
--- a/hw/pci-host/ppce500.c
218e99
+++ b/hw/pci-host/ppce500.c
218e99
@@ -387,6 +387,11 @@ static void e500_host_bridge_class_init(ObjectClass *klass, void *data)
218e99
     k->device_id = PCI_DEVICE_ID_MPC8533E;
218e99
     k->class_id = PCI_CLASS_PROCESSOR_POWERPC;
218e99
     dc->desc = "Host bridge";
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo e500_host_bridge_info = {
218e99
diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
218e99
index cdb401f..3e94d07 100644
218e99
--- a/hw/pci-host/prep.c
218e99
+++ b/hw/pci-host/prep.c
218e99
@@ -196,7 +196,11 @@ static void raven_class_init(ObjectClass *klass, void *data)
218e99
     k->class_id = PCI_CLASS_BRIDGE_HOST;
218e99
     dc->desc = "PReP Host Bridge - Motorola Raven";
218e99
     dc->vmsd = &vmstate_raven;
218e99
-    dc->cannot_instantiate_with_device_add_yet = true; /* FIXME explain why */
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo raven_info = {
218e99
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
218e99
index 5f8e7ff..ed934c3 100644
218e99
--- a/hw/pci-host/q35.c
218e99
+++ b/hw/pci-host/q35.c
218e99
@@ -295,6 +295,11 @@ static void mch_class_init(ObjectClass *klass, void *data)
218e99
     k->device_id = PCI_DEVICE_ID_INTEL_Q35_MCH;
218e99
     k->revision = MCH_HOST_BRIDGE_REVISION_DEFUALT;
218e99
     k->class_id = PCI_CLASS_BRIDGE_HOST;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo mch_info = {
218e99
diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
218e99
index fff235d..defdaa5 100644
218e99
--- a/hw/pci-host/uninorth.c
218e99
+++ b/hw/pci-host/uninorth.c
218e99
@@ -351,12 +351,18 @@ static int unin_internal_pci_host_init(PCIDevice *d)
218e99
 static void unin_main_pci_host_class_init(ObjectClass *klass, void *data)
218e99
 {
218e99
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
218e99
+    DeviceClass *dc = DEVICE_CLASS(klass);
218e99
 
218e99
     k->init      = unin_main_pci_host_init;
218e99
     k->vendor_id = PCI_VENDOR_ID_APPLE;
218e99
     k->device_id = PCI_DEVICE_ID_APPLE_UNI_N_PCI;
218e99
     k->revision  = 0x00;
218e99
     k->class_id  = PCI_CLASS_BRIDGE_HOST;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo unin_main_pci_host_info = {
218e99
@@ -369,12 +375,18 @@ static const TypeInfo unin_main_pci_host_info = {
218e99
 static void u3_agp_pci_host_class_init(ObjectClass *klass, void *data)
218e99
 {
218e99
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
218e99
+    DeviceClass *dc = DEVICE_CLASS(klass);
218e99
 
218e99
     k->init      = u3_agp_pci_host_init;
218e99
     k->vendor_id = PCI_VENDOR_ID_APPLE;
218e99
     k->device_id = PCI_DEVICE_ID_APPLE_U3_AGP;
218e99
     k->revision  = 0x00;
218e99
     k->class_id  = PCI_CLASS_BRIDGE_HOST;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo u3_agp_pci_host_info = {
218e99
@@ -387,12 +399,18 @@ static const TypeInfo u3_agp_pci_host_info = {
218e99
 static void unin_agp_pci_host_class_init(ObjectClass *klass, void *data)
218e99
 {
218e99
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
218e99
+    DeviceClass *dc = DEVICE_CLASS(klass);
218e99
 
218e99
     k->init      = unin_agp_pci_host_init;
218e99
     k->vendor_id = PCI_VENDOR_ID_APPLE;
218e99
     k->device_id = PCI_DEVICE_ID_APPLE_UNI_N_AGP;
218e99
     k->revision  = 0x00;
218e99
     k->class_id  = PCI_CLASS_BRIDGE_HOST;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo unin_agp_pci_host_info = {
218e99
@@ -405,12 +423,18 @@ static const TypeInfo unin_agp_pci_host_info = {
218e99
 static void unin_internal_pci_host_class_init(ObjectClass *klass, void *data)
218e99
 {
218e99
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
218e99
+    DeviceClass *dc = DEVICE_CLASS(klass);
218e99
 
218e99
     k->init      = unin_internal_pci_host_init;
218e99
     k->vendor_id = PCI_VENDOR_ID_APPLE;
218e99
     k->device_id = PCI_DEVICE_ID_APPLE_UNI_N_I_PCI;
218e99
     k->revision  = 0x00;
218e99
     k->class_id  = PCI_CLASS_BRIDGE_HOST;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo unin_internal_pci_host_info = {
218e99
diff --git a/hw/pci-host/versatile.c b/hw/pci-host/versatile.c
218e99
index 2f996d9..76d6cce 100644
218e99
--- a/hw/pci-host/versatile.c
218e99
+++ b/hw/pci-host/versatile.c
218e99
@@ -467,11 +467,17 @@ static int versatile_pci_host_init(PCIDevice *d)
218e99
 static void versatile_pci_host_class_init(ObjectClass *klass, void *data)
218e99
 {
218e99
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
218e99
+    DeviceClass *dc = DEVICE_CLASS(klass);
218e99
 
218e99
     k->init = versatile_pci_host_init;
218e99
     k->vendor_id = PCI_VENDOR_ID_XILINX;
218e99
     k->device_id = PCI_DEVICE_ID_XILINX_XC2VP30;
218e99
     k->class_id = PCI_CLASS_PROCESSOR_CO;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo versatile_pci_host_info = {
218e99
diff --git a/hw/ppc/ppc4xx_pci.c b/hw/ppc/ppc4xx_pci.c
218e99
index 599539b..ebe7efe 100644
218e99
--- a/hw/ppc/ppc4xx_pci.c
218e99
+++ b/hw/ppc/ppc4xx_pci.c
218e99
@@ -380,6 +380,11 @@ static void ppc4xx_host_bridge_class_init(ObjectClass *klass, void *data)
218e99
     k->vendor_id    = PCI_VENDOR_ID_IBM;
218e99
     k->device_id    = PCI_DEVICE_ID_IBM_440GX;
218e99
     k->class_id     = PCI_CLASS_BRIDGE_OTHER;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo ppc4xx_host_bridge_info = {
218e99
diff --git a/hw/sh4/sh_pci.c b/hw/sh4/sh_pci.c
218e99
index d213a90..f9c49c1 100644
218e99
--- a/hw/sh4/sh_pci.c
218e99
+++ b/hw/sh4/sh_pci.c
218e99
@@ -150,10 +150,16 @@ static int sh_pci_host_init(PCIDevice *d)
218e99
 static void sh_pci_host_class_init(ObjectClass *klass, void *data)
218e99
 {
218e99
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
218e99
+    DeviceClass *dc = DEVICE_CLASS(klass);
218e99
 
218e99
     k->init = sh_pci_host_init;
218e99
     k->vendor_id = PCI_VENDOR_ID_HITACHI;
218e99
     k->device_id = PCI_DEVICE_ID_HITACHI_SH7751R;
218e99
+    /*
218e99
+     * PCI-facing part of the host bridge, not usable without the
218e99
+     * host-facing part, which can't be device_add'ed, yet.
218e99
+     */
218e99
+    dc->cannot_instantiate_with_device_add_yet = true;
218e99
 }
218e99
 
218e99
 static const TypeInfo sh_pci_host_info = {
218e99
-- 
218e99
1.7.1
218e99