From nobody Sat Apr 20 03:39:10 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1560318943; cv=none; d=zoho.com; s=zohoarc; b=XZ0a9fq5ro99bY7F0CvfPXWLAVprHNU3VnYZT+C+JTqodkMES7JxthdZmwnlwK3qoshQ8x4VGlOr3882uuA39+YBUjf6I8anvG/4AC14SJuXkOE8RcLMK3ylzg25AUSt0n5/0arTRU7Vyb7/nhaJkr1xJ37/+h4LEpRaxOv32qw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1560318943; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=kbJwL/Et9YC5cBJ03697jtekQfI8qmx0upU8Nd8htVM=; b=nrNkVAX58mNKZb6klTZDkzOinaXRFg8cROlk7MaxqS0EiAdl5nRNW4HGVUjeG7uzcZ+daL1tDEHW6EwE0IscyoSfjQHijtzK+VAlbQUATOdraPeH7aPaY678VBL/OYLGWtzYdJZl6jcIchptMHerjeIagP4Op/7txjGJrgk/qM0= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1560318943827847.2390092767749; Tue, 11 Jun 2019 22:55:43 -0700 (PDT) Received: from localhost ([::1]:56840 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hawEW-0002pL-Er for importer@patchew.org; Wed, 12 Jun 2019 01:55:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58502) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1haw8n-0004XM-4N for qemu-devel@nongnu.org; Wed, 12 Jun 2019 01:49:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1haw8k-00073D-SS for qemu-devel@nongnu.org; Wed, 12 Jun 2019 01:49:44 -0400 Received: from ozlabs.org ([203.11.71.1]:60309) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1haw8k-000717-7O; Wed, 12 Jun 2019 01:49:42 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 45NwtR4Cf9z9sPC; Wed, 12 Jun 2019 15:49:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1560318575; bh=Eb6H0LTkCVq9ttPuBWVZZEAnmYMnVgLWdK92LYFslA8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=e1LtqAbaVQtyJaIiHh4l4yhQDSj6KKWxZlf/cwrYEaxOgy4gHi4nAbQt4IQ5wNiY3 RsK0QyXPQVm1YR2f7Fj8wjb6VGoutROPtVXndj+ShxcrTz1LNXYtX3RbWVDFYD1yt8 rrdn4tLB3//gqN0NiSCMdJxrVavpkE+u5quI3HQ0= From: David Gibson To: peter.maydell@linaro.org Date: Wed, 12 Jun 2019 15:49:24 +1000 Message-Id: <20190612054929.21136-9-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190612054929.21136-1-david@gibson.dropbear.id.au> References: <20190612054929.21136-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 08/13] spapr: Don't use bus number for building DRC ids X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, "Michael S . Tsirkin" , aik@ozlabs.ru, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" DRC ids are more or less arbitrary, as long as they're consistent. For PCI, we notionally build them from the phb's index along with PCI bus number, slot and function number. Using bus number is broken, however, because it can change if the guest re-enumerates the PCI topology for whatever reason (e.g. due to hotplug of a bridge, which we don't support yet but want to). Fortunately, there's an alternative. Bridges are required to have a unique non-zero "chassis number" that we can use instead. Adjust the code to use that instead. This looks like it would introduce a guest visible breaking change, but in fact it does not because we don't yet ever use non-zero bus numbers. Both chassis and bus number are always 0 for the root bus, so there's no change for the existing cases. Signed-off-by: David Gibson Acked-by: Michael S. Tsirkin --- hw/ppc/spapr_pci.c | 54 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index 7352028628..9d99bc0b4c 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -1221,23 +1221,40 @@ static const char *dt_name_from_class(uint8_t class= , uint8_t subclass, */ =20 static uint32_t drc_id_from_devfn(SpaprPhbState *phb, - uint32_t busnr, - int32_t devfn) + uint8_t chassis, int32_t devfn) { - return (phb->index << 16) | (busnr << 8) | devfn; + return (phb->index << 16) | (chassis << 8) | devfn; } =20 static SpaprDrc *drc_from_devfn(SpaprPhbState *phb, - uint32_t busnr, int32_t devfn) + uint8_t chassis, int32_t devfn) { return spapr_drc_by_id(TYPE_SPAPR_DRC_PCI, - drc_id_from_devfn(phb, busnr, devfn)); + drc_id_from_devfn(phb, chassis, devfn)); +} + +static uint8_t chassis_from_bus(PCIBus *bus, Error **errp) +{ + if (pci_bus_is_root(bus)) { + return 0; + } else { + PCIDevice *bridge =3D pci_bridge_get_device(bus); + + return object_property_get_uint(OBJECT(bridge), "chassis_nr", errp= ); + } } =20 static SpaprDrc *drc_from_dev(SpaprPhbState *phb, PCIDevice *dev) { - uint32_t busnr =3D pci_bus_num(PCI_BUS(qdev_get_parent_bus(DEVICE(dev)= ))); - return drc_from_devfn(phb, busnr, dev->devfn); + Error *local_err =3D NULL; + uint8_t chassis =3D chassis_from_bus(pci_get_bus(dev), &local_err); + + if (local_err) { + error_report_err(local_err); + return NULL; + } + + return drc_from_devfn(phb, chassis, dev->devfn); } =20 static void add_drcs(SpaprPhbState *phb) @@ -1516,14 +1533,19 @@ static void spapr_pci_plug(HotplugHandler *plug_han= dler, spapr_drc_reset(drc); } else if (PCI_FUNC(pdev->devfn) =3D=3D 0) { int i; + uint8_t chassis =3D chassis_from_bus(pci_get_bus(pdev), &local_err= ); + + if (local_err) { + error_propagate(errp, local_err); + return; + } =20 for (i =3D 0; i < 8; i++) { SpaprDrc *func_drc; SpaprDrcClass *func_drck; SpaprDREntitySense state; =20 - func_drc =3D drc_from_devfn(phb, pci_bus_num(bus), - PCI_DEVFN(slotnr, i)); + func_drc =3D drc_from_devfn(phb, chassis, PCI_DEVFN(slotnr, i)= ); func_drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(func_drc); state =3D func_drck->dr_entity_sense(func_drc); =20 @@ -1571,18 +1593,23 @@ static void spapr_pci_unplug_request(HotplugHandler= *plug_handler, g_assert(drc->dev =3D=3D plugged_dev); =20 if (!spapr_drc_unplug_requested(drc)) { - PCIBus *bus =3D PCI_BUS(qdev_get_parent_bus(DEVICE(pdev))); uint32_t slotnr =3D PCI_SLOT(pdev->devfn); SpaprDrc *func_drc; SpaprDrcClass *func_drck; SpaprDREntitySense state; int i; + Error *local_err =3D NULL; + uint8_t chassis =3D chassis_from_bus(pci_get_bus(pdev), &local_err= ); + + if (local_err) { + error_propagate(errp, local_err); + return; + } =20 /* ensure any other present functions are pending unplug */ if (PCI_FUNC(pdev->devfn) =3D=3D 0) { for (i =3D 1; i < 8; i++) { - func_drc =3D drc_from_devfn(phb, pci_bus_num(bus), - PCI_DEVFN(slotnr, i)); + func_drc =3D drc_from_devfn(phb, chassis, PCI_DEVFN(slotnr= , i)); func_drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(func_drc); state =3D func_drck->dr_entity_sense(func_drc); if (state =3D=3D SPAPR_DR_ENTITY_SENSE_PRESENT @@ -1603,8 +1630,7 @@ static void spapr_pci_unplug_request(HotplugHandler *= plug_handler, */ if (PCI_FUNC(pdev->devfn) =3D=3D 0) { for (i =3D 7; i >=3D 0; i--) { - func_drc =3D drc_from_devfn(phb, pci_bus_num(bus), - PCI_DEVFN(slotnr, i)); + func_drc =3D drc_from_devfn(phb, chassis, PCI_DEVFN(slotnr= , i)); func_drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(func_drc); state =3D func_drck->dr_entity_sense(func_drc); if (state =3D=3D SPAPR_DR_ENTITY_SENSE_PRESENT) { --=20 2.21.0