From nobody Tue Apr 30 06:24:20 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499809562841641.3230360039787; Tue, 11 Jul 2017 14:46:02 -0700 (PDT) Received: from localhost ([::1]:49051 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dV2yn-0006wn-7J for importer@patchew.org; Tue, 11 Jul 2017 17:46:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54257) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dV2xf-0006HX-Ek for qemu-devel@nongnu.org; Tue, 11 Jul 2017 17:44:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dV2xc-00007Q-Ld for qemu-devel@nongnu.org; Tue, 11 Jul 2017 17:44:51 -0400 Received: from chuckie.co.uk ([82.165.15.123]:35092 helo=s16892447.onlinehome-server.info) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dV2xc-00006Y-ET for qemu-devel@nongnu.org; Tue, 11 Jul 2017 17:44:48 -0400 Received: from host109-153-193-12.range109-153.btcentralplus.com ([109.153.193.12] helo=kentang.home) by s16892447.onlinehome-server.info with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1dV2xX-0003e1-4D; Tue, 11 Jul 2017 22:44:44 +0100 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, mst@redhat.com, armbru@redhat.com, marcel@redhat.com Date: Tue, 11 Jul 2017 22:44:32 +0100 Message-Id: <1499809473-28481-2-git-send-email-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1499809473-28481-1-git-send-email-mark.cave-ayland@ilande.co.uk> References: <1499809473-28481-1-git-send-email-mark.cave-ayland@ilande.co.uk> X-SA-Exim-Connect-IP: 109.153.193.12 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk X-SA-Exim-Version: 4.2.1 (built Sun, 08 Jan 2012 02:45:44 +0000) X-SA-Exim-Scanned: Yes (on s16892447.onlinehome-server.info) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 82.165.15.123 Subject: [Qemu-devel] [PATCHv2 1/2] pci: move check for existing devfn into new pci_bus_devfn_available() helper X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Also touch up the logic in do_pci_register_device() accordingly. Signed-off-by: Mark Cave-Ayland --- hw/pci/pci.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 0c6f74a..04e6edb 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -951,6 +951,15 @@ uint16_t pci_requester_id(PCIDevice *dev) return pci_req_id_cache_extract(&dev->requester_id_cache); } =20 +static bool pci_bus_devfn_available(PCIBus *bus, int devfn) +{ + if (bus->devices[devfn]) { + return false; + } else { + return true; + } +} + /* -1 for devfn means auto assign */ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, const char *name, int devfn, @@ -974,14 +983,15 @@ static PCIDevice *do_pci_register_device(PCIDevice *p= ci_dev, PCIBus *bus, if (devfn < 0) { for(devfn =3D bus->devfn_min ; devfn < ARRAY_SIZE(bus->devices); devfn +=3D PCI_FUNC_MAX) { - if (!bus->devices[devfn]) + if (pci_bus_devfn_available(bus, devfn)) { goto found; + } } error_setg(errp, "PCI: no slot/function available for %s, all in u= se", name); return NULL; found: ; - } else if (bus->devices[devfn]) { + } else if (!pci_bus_devfn_available(bus, devfn)) { error_setg(errp, "PCI: slot %d function %d not available for %s," " in use by %s", PCI_SLOT(devfn), PCI_FUNC(devfn), name, --=20 1.7.10.4 From nobody Tue Apr 30 06:24:20 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499809659022950.7025841566694; Tue, 11 Jul 2017 14:47:39 -0700 (PDT) Received: from localhost ([::1]:49054 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dV30L-0007uC-TU for importer@patchew.org; Tue, 11 Jul 2017 17:47:37 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54256) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dV2xf-0006HW-Ee for qemu-devel@nongnu.org; Tue, 11 Jul 2017 17:44:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dV2xc-00007A-D6 for qemu-devel@nongnu.org; Tue, 11 Jul 2017 17:44:51 -0400 Received: from chuckie.co.uk ([82.165.15.123]:35089 helo=s16892447.onlinehome-server.info) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dV2xc-00006Q-5m for qemu-devel@nongnu.org; Tue, 11 Jul 2017 17:44:48 -0400 Received: from host109-153-193-12.range109-153.btcentralplus.com ([109.153.193.12] helo=kentang.home) by s16892447.onlinehome-server.info with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1dV2xY-0003e1-95; Tue, 11 Jul 2017 22:44:45 +0100 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, mst@redhat.com, armbru@redhat.com, marcel@redhat.com Date: Tue, 11 Jul 2017 22:44:33 +0100 Message-Id: <1499809473-28481-3-git-send-email-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1499809473-28481-1-git-send-email-mark.cave-ayland@ilande.co.uk> References: <1499809473-28481-1-git-send-email-mark.cave-ayland@ilande.co.uk> X-SA-Exim-Connect-IP: 109.153.193.12 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk X-SA-Exim-Version: 4.2.1 (built Sun, 08 Jan 2012 02:45:44 +0000) X-SA-Exim-Scanned: Yes (on s16892447.onlinehome-server.info) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 82.165.15.123 Subject: [Qemu-devel] [PATCHv2 2/2] pci: add reserved slot check to do_pci_register_device() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add a new slot_reserved_mask bitmask to PCIBus indicating whether or not ea= ch PCI slot on the bus is reserved. Ensure that it is initialised to zero to maintain the existing behaviour that all slots are available by default, and add the additional check with appropriate error reporting to do_pci_register_device(). Signed-off-by: Mark Cave-Ayland --- hw/pci/pci.c | 22 +++++++++++++++++++--- include/hw/pci/pci_bus.h | 1 + 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 04e6edb..3ce25f7 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -371,6 +371,7 @@ static void pci_bus_init(PCIBus *bus, DeviceState *pare= nt, { assert(PCI_FUNC(devfn_min) =3D=3D 0); bus->devfn_min =3D devfn_min; + bus->slot_reserved_mask =3D 0x0; bus->address_space_mem =3D address_space_mem; bus->address_space_io =3D address_space_io; =20 @@ -960,6 +961,15 @@ static bool pci_bus_devfn_available(PCIBus *bus, int d= evfn) } } =20 +static bool pci_bus_devfn_reserved(PCIBus *bus, int devfn) +{ + if (bus->slot_reserved_mask & (1UL << PCI_SLOT(devfn))) { + return true; + } else { + return false; + } +} + /* -1 for devfn means auto assign */ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, const char *name, int devfn, @@ -983,14 +993,20 @@ static PCIDevice *do_pci_register_device(PCIDevice *p= ci_dev, PCIBus *bus, if (devfn < 0) { for(devfn =3D bus->devfn_min ; devfn < ARRAY_SIZE(bus->devices); devfn +=3D PCI_FUNC_MAX) { - if (pci_bus_devfn_available(bus, devfn)) { + if (pci_bus_devfn_available(bus, devfn) && + !pci_bus_devfn_reserved(bus, devfn)) { goto found; } } - error_setg(errp, "PCI: no slot/function available for %s, all in u= se", - name); + error_setg(errp, "PCI: no slot/function available for %s, all in u= se " + "or reserved", name); return NULL; found: ; + } else if (pci_bus_devfn_reserved(bus, devfn)) { + error_setg(errp, "PCI: slot %d function %d not available for %s," + " reserved", + PCI_SLOT(devfn), PCI_FUNC(devfn), name); + return NULL; } else if (!pci_bus_devfn_available(bus, devfn)) { error_setg(errp, "PCI: slot %d function %d not available for %s," " in use by %s", diff --git a/include/hw/pci/pci_bus.h b/include/hw/pci/pci_bus.h index 5484a9b..bc34fd0 100644 --- a/include/hw/pci/pci_bus.h +++ b/include/hw/pci/pci_bus.h @@ -23,6 +23,7 @@ struct PCIBus { PCIIOMMUFunc iommu_fn; void *iommu_opaque; uint8_t devfn_min; + uint32_t slot_reserved_mask; pci_set_irq_fn set_irq; pci_map_irq_fn map_irq; pci_route_irq_fn route_intx_to_irq; --=20 1.7.10.4