]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
hw/pci-host/aspeed_pcie: Drop AST2600 PCIe root device
authorJamin Lin <jamin_lin@aspeedtech.com>
Tue, 27 Jan 2026 03:23:38 +0000 (11:23 +0800)
committerCédric Le Goater <clg@redhat.com>
Wed, 4 Feb 2026 07:24:29 +0000 (08:24 +0100)
AST2600 PCIe previously exposed a root bus at 0x80 with both a
root device at 80:00.0 and a root port at 80:08.0.

Recent ASPEED SDK PCIe driver updates decided to remove the root
device and keep only a single root port. This behavior has already
been accepted by the upstream Linux kernel.

Update the QEMU PCIe model accordingly by dropping the root device
implementation and related properties. AST2600 now matches the
AST2700 PCIe topology and no longer supports the legacy RC_L
layout.

Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Link: https://lore.kernel.org/qemu-devel/20260127032348.2238527-3-jamin_lin@aspeedtech.com
Signed-off-by: Cédric Le Goater <clg@redhat.com>
hw/pci-host/aspeed_pcie.c
include/hw/pci-host/aspeed_pcie.h

index 83a1c7075c398ee1af97b53ada98e9192cd9e7a4..4fdda959396fc3daf7dc83f8dd3ca45f384e3ed0 100644 (file)
 #include "hw/pci/msi.h"
 #include "trace.h"
 
-/*
- * PCIe Root Device
- * This device exists only on AST2600.
- */
-
-static void aspeed_pcie_root_device_class_init(ObjectClass *klass,
-                                               const void *data)
-{
-    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
-    DeviceClass *dc = DEVICE_CLASS(klass);
-
-    set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
-    dc->desc = "ASPEED PCIe Root Device";
-    k->vendor_id = PCI_VENDOR_ID_ASPEED;
-    k->device_id = 0x2600;
-    k->class_id = PCI_CLASS_BRIDGE_HOST;
-    k->subsystem_vendor_id = k->vendor_id;
-    k->subsystem_id = k->device_id;
-    k->revision = 0;
-
-    /*
-     * PCI-facing part of the host bridge,
-     * not usable without the host-facing part
-     */
-    dc->user_creatable = false;
-}
-
-static const TypeInfo aspeed_pcie_root_device_info = {
-    .name = TYPE_ASPEED_PCIE_ROOT_DEVICE,
-    .parent = TYPE_PCI_DEVICE,
-    .instance_size = sizeof(AspeedPCIERootDeviceState),
-    .class_init = aspeed_pcie_root_device_class_init,
-    .interfaces = (const InterfaceInfo[]) {
-        { INTERFACE_CONVENTIONAL_PCI_DEVICE },
-        { },
-    },
-};
-
 /*
  * PCIe Root Port
  */
@@ -291,18 +253,6 @@ static void aspeed_pcie_rc_realize(DeviceState *dev, Error **errp)
                                 &rc->dram_alias);
     pci_setup_iommu(pci->bus, &aspeed_pcie_rc_iommu_ops, rc);
 
-    /* setup root device */
-    if (rc->has_rd) {
-        object_initialize_child(OBJECT(rc), "root_device", &rc->root_device,
-                                TYPE_ASPEED_PCIE_ROOT_DEVICE);
-        qdev_prop_set_int32(DEVICE(&rc->root_device), "addr",
-                            PCI_DEVFN(0, 0));
-        qdev_prop_set_bit(DEVICE(&rc->root_device), "multifunction", false);
-        if (!qdev_realize(DEVICE(&rc->root_device), BUS(pci->bus), errp)) {
-            return;
-        }
-    }
-
     /* setup root port */
     qdev_prop_set_int32(DEVICE(&rc->root_port), "addr", rc->rp_addr);
     qdev_prop_set_uint16(DEVICE(&rc->root_port), "chassis", cfg->id);
@@ -334,7 +284,6 @@ static void aspeed_pcie_rc_instance_init(Object *obj)
 
 static const Property aspeed_pcie_rc_props[] = {
     DEFINE_PROP_UINT32("bus-nr", AspeedPCIERcState, bus_nr, 0),
-    DEFINE_PROP_BOOL("has-rd", AspeedPCIERcState, has_rd, 0),
     DEFINE_PROP_UINT32("rp-addr", AspeedPCIERcState, rp_addr, 0),
     DEFINE_PROP_UINT32("msi-addr", AspeedPCIERcState, msi_addr, 0),
     DEFINE_PROP_UINT64("dram-base", AspeedPCIERcState, dram_base, 0),
@@ -704,9 +653,6 @@ static void aspeed_pcie_cfg_realize(DeviceState *dev, Error **errp)
     object_property_set_int(OBJECT(&s->rc), "bus-nr",
                             apc->rc_bus_nr,
                             &error_abort);
-    object_property_set_bool(OBJECT(&s->rc), "has-rd",
-                            apc->rc_has_rd,
-                            &error_abort);
     object_property_set_int(OBJECT(&s->rc), "rp-addr",
                             apc->rc_rp_addr,
                             &error_abort);
@@ -746,7 +692,6 @@ static void aspeed_pcie_cfg_class_init(ObjectClass *klass, const void *data)
     apc->nr_regs = 0x100 >> 2;
     apc->rc_msi_addr = 0x1e77005C;
     apc->rc_bus_nr = 0x80;
-    apc->rc_has_rd = true;
     apc->rc_rp_addr = PCI_DEVFN(8, 0);
 }
 
@@ -867,7 +812,6 @@ static void aspeed_2700_pcie_cfg_class_init(ObjectClass *klass,
     apc->nr_regs = 0x100 >> 2;
     apc->rc_msi_addr = 0x000000F0;
     apc->rc_bus_nr = 0;
-    apc->rc_has_rd = false;
     apc->rc_rp_addr = PCI_DEVFN(0, 0);
 }
 
@@ -1041,7 +985,6 @@ static const TypeInfo aspeed_2700_pcie_phy_info = {
 static void aspeed_pcie_register_types(void)
 {
     type_register_static(&aspeed_pcie_rc_info);
-    type_register_static(&aspeed_pcie_root_device_info);
     type_register_static(&aspeed_pcie_root_port_info);
     type_register_static(&aspeed_pcie_cfg_info);
     type_register_static(&aspeed_2700_pcie_cfg_info);
index e660119a455efcc4b10c1f9b96f17e4c3d10c9c5..fde5816ea30c12a0ed1bc9fde8da5b48ed69f607 100644 (file)
@@ -50,13 +50,6 @@ typedef struct AspeedPCIERootPortState {
     PCIESlot parent_obj;
 } AspeedPCIERootPortState;
 
-#define TYPE_ASPEED_PCIE_ROOT_DEVICE "aspeed.pcie-root-device"
-OBJECT_DECLARE_SIMPLE_TYPE(AspeedPCIERootDeviceState, ASPEED_PCIE_ROOT_DEVICE);
-
-struct AspeedPCIERootDeviceState {
-    PCIBridge parent_obj;
-};
-
 #define TYPE_ASPEED_PCIE_RC "aspeed.pcie-rc"
 OBJECT_DECLARE_SIMPLE_TYPE(AspeedPCIERcState, ASPEED_PCIE_RC);
 
@@ -78,10 +71,8 @@ struct AspeedPCIERcState {
     uint32_t rp_addr;
     uint32_t bus_nr;
     char name[16];
-    bool has_rd;
     qemu_irq irq;
 
-    AspeedPCIERootDeviceState root_device;
     AspeedPCIERootPortState root_port;
 };