From nobody Fri Mar 29 06:44:45 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1557504798; cv=none; d=zoho.com; s=zohoarc; b=DBJ51RDmMkjwRh1DuYnXYjPk1XCRgBV7vkWkqkBbGwqiskOjwNu3jvxqIDyE1wYkXORSJJCZ90V0f7OWqs+orjFG/lyEJCymhCRF8V3b7CdKadeyBXjAhP0nrS6wgW8Vx/9Oz9pxh439Onz2PhLWBKnO51A17dpc7yUzvq5XyBU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1557504798; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=QBFXC8BGVdHVTzFwIskgcohX6ISJCXQ9mrmZ32adu4Y=; b=ZvETMULH4vy9X0hLaYSVE0gInrINWXCHvVkW5bLjlXKoSYW8otyeqHGrhOWE6VEHK0osSITF0utri8b3pXFAYEAtML+hj+RO1ZyuPCFq3Vv5zFDiTrJacHzI+tdkU2UEwmt0a9ja4jrrj9WEx/EtxN1hYeL+eKAPMCfwJMG1Pyc= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 155750479811272.16958357356134; Fri, 10 May 2019 09:13:18 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hP87g-0004WE-F2; Fri, 10 May 2019 16:11:48 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hP87f-0004W0-Pe for xen-devel@lists.xenproject.org; Fri, 10 May 2019 16:11:47 +0000 Received: from SMTP03.CITRIX.COM (unknown [162.221.156.55]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 4d22e641-733e-11e9-8980-bc764e045a96; Fri, 10 May 2019 16:11:43 +0000 (UTC) X-Inumbo-ID: 4d22e641-733e-11e9-8980-bc764e045a96 X-IronPort-AV: E=Sophos;i="5.60,453,1549929600"; d="scan'208";a="85330710" From: Roger Pau Monne To: Date: Fri, 10 May 2019 18:10:52 +0200 Message-ID: <20190510161056.48648-2-roger.pau@citrix.com> X-Mailer: git-send-email 2.17.2 (Apple Git-113) In-Reply-To: <20190510161056.48648-1-roger.pau@citrix.com> References: <20190510161056.48648-1-roger.pau@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH 1/5] pci: use pci_sbdf_t in pci_dev X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Kevin Tian , Stefano Stabellini , Wei Liu , Suravee Suthikulpanit , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich , Brian Woods , Roger Pau Monne Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" This patch replaces the seg, bus and devfn fields of the struct and fixes the callers. While there instances of u have also been replaced with uint_t. No functional change intended. Signed-off-by: Roger Pau Monn=C3=A9 --- Cc: Jan Beulich Cc: Andrew Cooper Cc: Wei Liu Cc: George Dunlap Cc: Ian Jackson Cc: Julien Grall Cc: Konrad Rzeszutek Wilk Cc: Stefano Stabellini Cc: Tim Deegan Cc: Suravee Suthikulpanit Cc: Brian Woods Cc: Kevin Tian --- xen/arch/x86/hvm/vmsi.c | 14 +- xen/arch/x86/msi.c | 136 ++++++++-------- xen/drivers/passthrough/amd/iommu_cmd.c | 16 +- xen/drivers/passthrough/amd/iommu_intr.c | 14 +- xen/drivers/passthrough/amd/iommu_map.c | 10 +- xen/drivers/passthrough/amd/pci_amd_iommu.c | 58 ++++--- xen/drivers/passthrough/pci.c | 162 ++++++++++---------- xen/drivers/passthrough/vtd/dmar.c | 12 +- xen/drivers/passthrough/vtd/intremap.c | 8 +- xen/drivers/passthrough/vtd/iommu.c | 34 ++-- xen/drivers/passthrough/vtd/qinval.c | 2 +- xen/drivers/passthrough/vtd/quirks.c | 16 +- xen/drivers/passthrough/vtd/x86/ats.c | 12 +- xen/drivers/passthrough/x86/ats.c | 8 +- xen/drivers/pci/pci.c | 8 +- xen/drivers/vpci/header.c | 74 ++++----- xen/drivers/vpci/msi.c | 21 ++- xen/drivers/vpci/msix.c | 36 +++-- xen/drivers/vpci/vpci.c | 8 +- xen/include/xen/pci.h | 5 +- 20 files changed, 322 insertions(+), 332 deletions(-) diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c index aeb5a70104..15cfe8d057 100644 --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -688,8 +688,8 @@ static int vpci_msi_update(const struct pci_dev *pdev, = uint32_t data, { gdprintk(XENLOG_ERR, "%04x:%02x:%02x.%u: failed to bind PIRQ %u: %d\n", - pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), pirq + i, rc); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, pirq + i, rc); while ( bind.machine_irq-- > pirq ) pt_irq_destroy_bind(pdev->domain, &bind); return rc; @@ -727,9 +727,9 @@ static int vpci_msi_enable(const struct pci_dev *pdev, = uint32_t data, paddr_t table_base, uint32_t mask) { struct msi_info msi_info =3D { - .seg =3D pdev->seg, - .bus =3D pdev->bus, - .devfn =3D pdev->devfn, + .seg =3D pdev->sbdf.seg, + .bus =3D pdev->sbdf.bus, + .devfn =3D pdev->sbdf.extfunc, .table_base =3D table_base, .entry_nr =3D nr, }; @@ -744,8 +744,8 @@ static int vpci_msi_enable(const struct pci_dev *pdev, = uint32_t data, if ( rc ) { gdprintk(XENLOG_ERR, "%04x:%02x:%02x.%u: failed to map PIRQ: %d\n", - pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), rc); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, rc); return rc; } =20 diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index babc4147c4..f30f592ee2 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -124,13 +124,13 @@ static void msix_put_fixmap(struct arch_msix *msix, i= nt idx) =20 static bool memory_decoded(const struct pci_dev *dev) { - u8 bus, slot, func; + uint8_t bus, slot, func; =20 if ( !dev->info.is_virtfn ) { - bus =3D dev->bus; - slot =3D PCI_SLOT(dev->devfn); - func =3D PCI_FUNC(dev->devfn); + bus =3D dev->sbdf.bus; + slot =3D dev->sbdf.dev; + func =3D dev->sbdf.func; } else { @@ -139,14 +139,14 @@ static bool memory_decoded(const struct pci_dev *dev) func =3D PCI_FUNC(dev->info.physfn.devfn); } =20 - return !!(pci_conf_read16(dev->seg, bus, slot, func, PCI_COMMAND) & + return !!(pci_conf_read16(dev->sbdf.seg, bus, slot, func, PCI_COMMAND)= & PCI_COMMAND_MEMORY); } =20 static bool msix_memory_decoded(const struct pci_dev *dev, unsigned int po= s) { - u16 control =3D pci_conf_read16(dev->seg, dev->bus, PCI_SLOT(dev->devf= n), - PCI_FUNC(dev->devfn), msix_control_reg(p= os)); + u16 control =3D pci_conf_read16(dev->sbdf.seg, dev->sbdf.bus, dev->sbd= f.dev, + dev->sbdf.func, msix_control_reg(pos)); =20 if ( !(control & PCI_MSIX_FLAGS_ENABLE) ) return false; @@ -200,10 +200,10 @@ static bool read_msi_msg(struct msi_desc *entry, stru= ct msi_msg *msg) { struct pci_dev *dev =3D entry->dev; int pos =3D entry->msi_attrib.pos; - u16 data, seg =3D dev->seg; - u8 bus =3D dev->bus; - u8 slot =3D PCI_SLOT(dev->devfn); - u8 func =3D PCI_FUNC(dev->devfn); + uint16_t data, seg =3D dev->sbdf.seg; + uint8_t bus =3D dev->sbdf.bus; + uint8_t slot =3D dev->sbdf.dev; + uint8_t func =3D dev->sbdf.func; =20 msg->address_lo =3D pci_conf_read32(seg, bus, slot, func, msi_lower_address_reg(pos)); @@ -265,10 +265,10 @@ static int write_msi_msg(struct msi_desc *entry, stru= ct msi_msg *msg) { struct pci_dev *dev =3D entry->dev; int pos =3D entry->msi_attrib.pos; - u16 seg =3D dev->seg; - u8 bus =3D dev->bus; - u8 slot =3D PCI_SLOT(dev->devfn); - u8 func =3D PCI_FUNC(dev->devfn); + uint16_t seg =3D dev->sbdf.seg; + uint8_t bus =3D dev->sbdf.bus; + uint8_t slot =3D dev->sbdf.dev; + uint8_t func =3D dev->sbdf.func; int nr =3D entry->msi_attrib.entry_nr; =20 ASSERT((msg->data & (entry[-nr].msi.nvec - 1)) =3D=3D nr); @@ -348,10 +348,10 @@ void __msi_set_enable(u16 seg, u8 bus, u8 slot, u8 fu= nc, int pos, int enable) static void msi_set_enable(struct pci_dev *dev, int enable) { int pos; - u16 seg =3D dev->seg; - u8 bus =3D dev->bus; - u8 slot =3D PCI_SLOT(dev->devfn); - u8 func =3D PCI_FUNC(dev->devfn); + uint16_t seg =3D dev->sbdf.seg; + uint8_t bus =3D dev->sbdf.bus; + uint8_t slot =3D dev->sbdf.dev; + uint8_t func =3D dev->sbdf.func; =20 pos =3D pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSI); if ( pos ) @@ -361,10 +361,10 @@ static void msi_set_enable(struct pci_dev *dev, int e= nable) static void msix_set_enable(struct pci_dev *dev, int enable) { int pos; - u16 control, seg =3D dev->seg; - u8 bus =3D dev->bus; - u8 slot =3D PCI_SLOT(dev->devfn); - u8 func =3D PCI_FUNC(dev->devfn); + uint16_t control, seg =3D dev->sbdf.seg; + uint8_t bus =3D dev->sbdf.bus; + uint8_t slot =3D dev->sbdf.dev; + uint8_t func =3D dev->sbdf.func; =20 pos =3D pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSIX); if ( pos ) @@ -388,17 +388,17 @@ static bool msi_set_mask_bit(struct irq_desc *desc, b= ool host, bool guest) { struct msi_desc *entry =3D desc->msi_desc; struct pci_dev *pdev; - u16 seg, control; - u8 bus, slot, func; + uint16_t seg, control; + uint8_t bus, slot, func; bool flag =3D host || guest, maskall; =20 ASSERT(spin_is_locked(&desc->lock)); BUG_ON(!entry || !entry->dev); pdev =3D entry->dev; - seg =3D pdev->seg; - bus =3D pdev->bus; - slot =3D PCI_SLOT(pdev->devfn); - func =3D PCI_FUNC(pdev->devfn); + seg =3D pdev->sbdf.seg; + bus =3D pdev->sbdf.bus; + slot =3D pdev->sbdf.dev; + func =3D pdev->sbdf.func; switch ( entry->msi_attrib.type ) { case PCI_CAP_ID_MSI: @@ -475,9 +475,8 @@ static int msi_get_mask_bit(const struct msi_desc *entr= y) case PCI_CAP_ID_MSI: if ( !entry->msi_attrib.maskbit ) break; - return (pci_conf_read32(entry->dev->seg, entry->dev->bus, - PCI_SLOT(entry->dev->devfn), - PCI_FUNC(entry->dev->devfn), + return (pci_conf_read32(entry->dev->sbdf.seg, entry->dev->sbdf.bus, + entry->dev->sbdf.dev, entry->dev->sbdf.fun= c, entry->msi.mpos) >> entry->msi_attrib.entry_nr) & 1; case PCI_CAP_ID_MSIX: @@ -594,11 +593,11 @@ int setup_msi_irq(struct irq_desc *desc, struct msi_d= esc *msidesc) =20 if ( msidesc->msi_attrib.type =3D=3D PCI_CAP_ID_MSIX ) { - control =3D pci_conf_read16(pdev->seg, pdev->bus, PCI_SLOT(pdev->d= evfn), - PCI_FUNC(pdev->devfn), cpos); + control =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, + pdev->sbdf.dev, pdev->sbdf.func, cpos); if ( !(control & PCI_MSIX_FLAGS_ENABLE) ) - pci_conf_write16(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), cpos, + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.de= v, + pdev->sbdf.func, cpos, control | (PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL)); } @@ -608,8 +607,8 @@ int setup_msi_irq(struct irq_desc *desc, struct msi_des= c *msidesc) : &pci_msi_nonmaskable); =20 if ( !(control & PCI_MSIX_FLAGS_ENABLE) ) - pci_conf_write16(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), cpos, control); + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, cpos, control); =20 return rc; } @@ -689,10 +688,10 @@ static int msi_capability_init(struct pci_dev *dev, struct msi_desc *entry; int pos; unsigned int i, maxvec, mpos; - u16 control, seg =3D dev->seg; - u8 bus =3D dev->bus; - u8 slot =3D PCI_SLOT(dev->devfn); - u8 func =3D PCI_FUNC(dev->devfn); + uint16_t control, seg =3D dev->sbdf.seg; + uint8_t bus =3D dev->sbdf.bus; + uint8_t slot =3D dev->sbdf.dev; + uint8_t func =3D dev->sbdf.func; =20 ASSERT(pcidevs_locked()); pos =3D pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSI); @@ -856,10 +855,10 @@ static int msix_capability_init(struct pci_dev *dev, u64 table_paddr; u32 table_offset; u8 bir, pbus, pslot, pfunc; - u16 seg =3D dev->seg; - u8 bus =3D dev->bus; - u8 slot =3D PCI_SLOT(dev->devfn); - u8 func =3D PCI_FUNC(dev->devfn); + uint16_t seg =3D dev->sbdf.seg; + uint8_t bus =3D dev->sbdf.bus; + uint8_t slot =3D dev->sbdf.dev; + uint8_t func =3D dev->sbdf.func; bool maskall =3D msix->host_maskall; =20 ASSERT(pcidevs_locked()); @@ -913,7 +912,7 @@ static int msix_capability_init(struct pci_dev *dev, pbus =3D dev->info.physfn.bus; pslot =3D PCI_SLOT(dev->info.physfn.devfn); pfunc =3D PCI_FUNC(dev->info.physfn.devfn); - vf =3D PCI_BDF2(dev->bus, dev->devfn); + vf =3D dev->sbdf.bdf; } =20 table_paddr =3D read_pci_mem_bar(seg, pbus, pslot, pfunc, bir, vf); @@ -1172,10 +1171,10 @@ static void _pci_cleanup_msix(struct arch_msix *msi= x) static void __pci_disable_msix(struct msi_desc *entry) { struct pci_dev *dev =3D entry->dev; - u16 seg =3D dev->seg; - u8 bus =3D dev->bus; - u8 slot =3D PCI_SLOT(dev->devfn); - u8 func =3D PCI_FUNC(dev->devfn); + uint16_t seg =3D dev->sbdf.seg; + uint8_t bus =3D dev->sbdf.bus; + uint8_t slot =3D dev->sbdf.dev; + uint8_t func =3D dev->sbdf.func; unsigned int pos =3D pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSIX); u16 control =3D pci_conf_read16(seg, bus, slot, func, @@ -1295,10 +1294,10 @@ void pci_cleanup_msi(struct pci_dev *pdev) int pci_msi_conf_write_intercept(struct pci_dev *pdev, unsigned int reg, unsigned int size, uint32_t *data) { - u16 seg =3D pdev->seg; - u8 bus =3D pdev->bus; - u8 slot =3D PCI_SLOT(pdev->devfn); - u8 func =3D PCI_FUNC(pdev->devfn); + uint16_t seg =3D pdev->sbdf.seg; + uint8_t bus =3D pdev->sbdf.bus; + uint8_t slot =3D pdev->sbdf.dev; + uint8_t func =3D pdev->sbdf.func; struct msi_desc *entry; unsigned int pos; =20 @@ -1365,7 +1364,7 @@ int pci_restore_msi_state(struct pci_dev *pdev) struct msi_desc *entry, *tmp; struct irq_desc *desc; struct msi_msg msg; - u8 slot =3D PCI_SLOT(pdev->devfn), func =3D PCI_FUNC(pdev->devfn); + uint8_t slot =3D pdev->sbdf.dev, func =3D pdev->sbdf.func; unsigned int type =3D 0, pos =3D 0; u16 control =3D 0; =20 @@ -1374,9 +1373,7 @@ int pci_restore_msi_state(struct pci_dev *pdev) if ( !use_msi ) return -EOPNOTSUPP; =20 - ret =3D xsm_resource_setup_pci(XSM_PRIV, - (pdev->seg << 16) | (pdev->bus << 8) | - pdev->devfn); + ret =3D xsm_resource_setup_pci(XSM_PRIV, pdev->sbdf.sbdf); if ( ret ) return ret; =20 @@ -1396,10 +1393,10 @@ int pci_restore_msi_state(struct pci_dev *pdev) bogus: dprintk(XENLOG_ERR, "Restore MSI for %04x:%02x:%02x:%u entry %u not set?\n= ", - pdev->seg, pdev->bus, slot, func, i); + pdev->sbdf.seg, pdev->sbdf.bus, slot, func, i); spin_unlock_irqrestore(&desc->lock, flags); if ( type =3D=3D PCI_CAP_ID_MSIX ) - pci_conf_write16(pdev->seg, pdev->bus, slot, func, + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, slot, fun= c, msix_control_reg(pos), control & ~PCI_MSIX_FLAGS_ENABLE); return -EINVAL; @@ -1414,16 +1411,16 @@ int pci_restore_msi_state(struct pci_dev *pdev) } else if ( !type && entry->msi_attrib.type =3D=3D PCI_CAP_ID_MSIX ) { - control =3D pci_conf_read16(pdev->seg, pdev->bus, slot, func, - msix_control_reg(pos)); - pci_conf_write16(pdev->seg, pdev->bus, slot, func, + control =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, sl= ot, + func, msix_control_reg(pos)); + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, slot, func, msix_control_reg(pos), control | (PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL)); if ( unlikely(!memory_decoded(pdev)) ) { spin_unlock_irqrestore(&desc->lock, flags); - pci_conf_write16(pdev->seg, pdev->bus, slot, func, + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, slot, fun= c, msix_control_reg(pos), control & ~PCI_MSIX_FLAGS_ENABLE); return -ENXIO; @@ -1457,17 +1454,18 @@ int pci_restore_msi_state(struct pci_dev *pdev) { unsigned int cpos =3D msi_control_reg(pos); =20 - control =3D pci_conf_read16(pdev->seg, pdev->bus, slot, func, = cpos) & - ~PCI_MSI_FLAGS_QSIZE; + control =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, sl= ot, + func, cpos) & ~PCI_MSI_FLAGS_QSIZE; multi_msi_enable(control, entry->msi.nvec); - pci_conf_write16(pdev->seg, pdev->bus, slot, func, cpos, contr= ol); + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, slot, func, c= pos, + control); =20 msi_set_enable(pdev, 1); } } =20 if ( type =3D=3D PCI_CAP_ID_MSIX ) - pci_conf_write16(pdev->seg, pdev->bus, slot, func, + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, slot, func, msix_control_reg(pos), control | PCI_MSIX_FLAGS_ENABLE); =20 diff --git a/xen/drivers/passthrough/amd/iommu_cmd.c b/xen/drivers/passthro= ugh/amd/iommu_cmd.c index af3a1fb865..82330c24ba 100644 --- a/xen/drivers/passthrough/amd/iommu_cmd.c +++ b/xen/drivers/passthrough/amd/iommu_cmd.c @@ -289,23 +289,23 @@ void amd_iommu_flush_iotlb(u8 devfn, const struct pci= _dev *pdev, if ( !ats_enabled ) return; =20 - if ( !pci_ats_enabled(pdev->seg, pdev->bus, pdev->devfn) ) + if ( !pci_ats_enabled(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.extfu= nc) ) return; =20 - iommu =3D find_iommu_for_device(pdev->seg, PCI_BDF2(pdev->bus, pdev->d= evfn)); + iommu =3D find_iommu_for_device(pdev->sbdf.seg, pdev->sbdf.bdf); =20 if ( !iommu ) { AMD_IOMMU_DEBUG("%s: Can't find iommu for %04x:%02x:%02x.%u\n", - __func__, pdev->seg, pdev->bus, - PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn)); + __func__, pdev->sbdf.seg, pdev->sbdf.bus, + pdev->sbdf.dev, pdev->sbdf.func); return; } =20 if ( !iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) ) return; =20 - req_id =3D get_dma_requestor_id(iommu->seg, PCI_BDF2(pdev->bus, devfn)= ); + req_id =3D get_dma_requestor_id(iommu->seg, PCI_BDF2(pdev->sbdf.bus, d= evfn)); queueid =3D req_id; maxpend =3D pdev->ats.queue_depth & 0xff; =20 @@ -326,13 +326,13 @@ static void amd_iommu_flush_all_iotlbs(struct domain = *d, daddr_t daddr, =20 for_each_pdev( d, pdev ) { - u8 devfn =3D pdev->devfn; + uint8_t devfn =3D pdev->sbdf.extfunc; =20 do { amd_iommu_flush_iotlb(devfn, pdev, daddr, order); devfn +=3D pdev->phantom_stride; - } while ( devfn !=3D pdev->devfn && - PCI_SLOT(devfn) =3D=3D PCI_SLOT(pdev->devfn) ); + } while ( devfn !=3D pdev->sbdf.extfunc && + PCI_SLOT(devfn) =3D=3D pdev->sbdf.dev ); } } =20 diff --git a/xen/drivers/passthrough/amd/iommu_intr.c b/xen/drivers/passthr= ough/amd/iommu_intr.c index dad2d1e5ab..71594cc27d 100644 --- a/xen/drivers/passthrough/amd/iommu_intr.c +++ b/xen/drivers/passthrough/amd/iommu_intr.c @@ -525,8 +525,8 @@ int amd_iommu_msi_msg_update_ire( unsigned int i, nr =3D 1; u32 data; =20 - bdf =3D pdev ? PCI_BDF2(pdev->bus, pdev->devfn) : hpet_sbdf.bdf; - seg =3D pdev ? pdev->seg : hpet_sbdf.seg; + bdf =3D pdev ? pdev->sbdf.bdf : hpet_sbdf.bdf; + seg =3D pdev ? pdev->sbdf.seg : hpet_sbdf.seg; =20 iommu =3D _find_iommu_for_device(seg, bdf); if ( IS_ERR_OR_NULL(iommu) ) @@ -544,12 +544,12 @@ int amd_iommu_msi_msg_update_ire( if ( !pdev || !pdev->phantom_stride ) break; bdf +=3D pdev->phantom_stride; - } while ( PCI_SLOT(bdf) =3D=3D PCI_SLOT(pdev->devfn) ); + } while ( PCI_SLOT(bdf) =3D=3D pdev->sbdf.dev ); =20 for ( i =3D 0; i < nr; ++i ) msi_desc[i].remap_index =3D -1; if ( pdev ) - bdf =3D PCI_BDF2(pdev->bus, pdev->devfn); + bdf =3D pdev->sbdf.bdf; } =20 if ( !msg ) @@ -562,7 +562,7 @@ int amd_iommu_msi_msg_update_ire( if ( rc || !pdev || !pdev->phantom_stride ) break; bdf +=3D pdev->phantom_stride; - } while ( PCI_SLOT(bdf) =3D=3D PCI_SLOT(pdev->devfn) ); + } while ( PCI_SLOT(bdf) =3D=3D pdev->sbdf.dev ); =20 if ( !rc ) { @@ -579,8 +579,8 @@ void amd_iommu_read_msi_from_ire( { unsigned int offset =3D msg->data & (INTREMAP_ENTRIES - 1); const struct pci_dev *pdev =3D msi_desc->dev; - u16 bdf =3D pdev ? PCI_BDF2(pdev->bus, pdev->devfn) : hpet_sbdf.bdf; - u16 seg =3D pdev ? pdev->seg : hpet_sbdf.seg; + uint16_t bdf =3D pdev ? pdev->sbdf.bdf : hpet_sbdf.bdf; + uint16_t seg =3D pdev ? pdev->sbdf.seg : hpet_sbdf.seg; const u32 *entry; =20 if ( IS_ERR_OR_NULL(_find_iommu_for_device(seg, bdf)) ) diff --git a/xen/drivers/passthrough/amd/iommu_map.c b/xen/drivers/passthro= ugh/amd/iommu_map.c index cbf00e9e72..314d871c9e 100644 --- a/xen/drivers/passthrough/amd/iommu_map.c +++ b/xen/drivers/passthrough/amd/iommu_map.c @@ -324,8 +324,8 @@ static int update_paging_mode(struct domain *d, unsigne= d long dfn) if ( pdev->type =3D=3D DEV_TYPE_PCI_HOST_BRIDGE ) continue; =20 - bdf =3D PCI_BDF2(pdev->bus, pdev->devfn); - iommu =3D find_iommu_for_device(pdev->seg, bdf); + bdf =3D pdev->sbdf.bdf; + iommu =3D find_iommu_for_device(pdev->sbdf.seg, bdf); if ( !iommu ) { AMD_IOMMU_DEBUG("%s Fail to find iommu.\n", __func__); @@ -334,7 +334,7 @@ static int update_paging_mode(struct domain *d, unsigne= d long dfn) =20 spin_lock_irqsave(&iommu->lock, flags); do { - req_id =3D get_dma_requestor_id(pdev->seg, bdf); + req_id =3D get_dma_requestor_id(pdev->sbdf.seg, bdf); table =3D iommu->dev_table.buffer; dte =3D &table[req_id]; =20 @@ -346,8 +346,8 @@ static int update_paging_mode(struct domain *d, unsigne= d long dfn) =20 amd_iommu_flush_device(iommu, req_id); bdf +=3D pdev->phantom_stride; - } while ( PCI_DEVFN2(bdf) !=3D pdev->devfn && - PCI_SLOT(bdf) =3D=3D PCI_SLOT(pdev->devfn) ); + } while ( PCI_DEVFN2(bdf) !=3D pdev->sbdf.extfunc && + PCI_SLOT(bdf) =3D=3D pdev->sbdf.dev ); spin_unlock_irqrestore(&iommu->lock, flags); } =20 diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/pass= through/amd/pci_amd_iommu.c index dbc71ca7d5..0e4c5b4994 100644 --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -94,7 +94,7 @@ static void amd_iommu_setup_domain_device( unsigned long flags; int req_id, valid =3D 1; int dte_i =3D 0; - u8 bus =3D pdev->bus; + uint8_t bus =3D pdev->sbdf.bus; const struct domain_iommu *hd =3D dom_iommu(domain); =20 BUG_ON( !hd->arch.root_table || !hd->arch.paging_mode || @@ -120,7 +120,7 @@ static void amd_iommu_setup_domain_device( dte, page_to_maddr(hd->arch.root_table), domain->domain_id, hd->arch.paging_mode, valid); =20 - if ( pci_ats_device(iommu->seg, bus, pdev->devfn) && + if ( pci_ats_device(iommu->seg, bus, pdev->sbdf.extfunc) && iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) ) dte->i =3D dte_i; =20 @@ -138,10 +138,10 @@ static void amd_iommu_setup_domain_device( =20 ASSERT(pcidevs_locked()); =20 - if ( pci_ats_device(iommu->seg, bus, pdev->devfn) && - !pci_ats_enabled(iommu->seg, bus, pdev->devfn) ) + if ( pci_ats_device(iommu->seg, bus, pdev->sbdf.extfunc) && + !pci_ats_enabled(iommu->seg, bus, pdev->sbdf.extfunc) ) { - if ( devfn =3D=3D pdev->devfn ) + if ( devfn =3D=3D pdev->sbdf.extfunc ) enable_ats_device(pdev, &iommu->ats_devices); =20 amd_iommu_flush_iotlb(devfn, pdev, INV_IOMMU_ALL_PAGES_ADDRESS, 0); @@ -261,7 +261,7 @@ void amd_iommu_disable_domain_device(struct domain *dom= ain, struct amd_iommu_dte *table, *dte; unsigned long flags; int req_id; - u8 bus =3D pdev->bus; + uint8_t bus =3D pdev->sbdf.bus; =20 BUG_ON ( iommu->dev_table.buffer =3D=3D NULL ); req_id =3D get_dma_requestor_id(iommu->seg, PCI_BDF2(bus, devfn)); @@ -274,7 +274,7 @@ void amd_iommu_disable_domain_device(struct domain *dom= ain, dte->tv =3D 0; dte->v =3D 0; =20 - if ( pci_ats_device(iommu->seg, bus, pdev->devfn) && + if ( pci_ats_device(iommu->seg, bus, pdev->sbdf.extfunc) && iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) ) dte->i =3D 0; =20 @@ -289,7 +289,7 @@ void amd_iommu_disable_domain_device(struct domain *dom= ain, =20 ASSERT(pcidevs_locked()); =20 - if ( devfn =3D=3D pdev->devfn && + if ( devfn =3D=3D pdev->sbdf.extfunc && pci_ats_device(iommu->seg, bus, devfn) && pci_ats_enabled(iommu->seg, bus, devfn) ) disable_ats_device(pdev); @@ -299,23 +299,22 @@ static int reassign_device(struct domain *source, str= uct domain *target, u8 devfn, struct pci_dev *pdev) { struct amd_iommu *iommu; - int bdf, rc; + int rc; struct domain_iommu *t =3D dom_iommu(target); =20 - bdf =3D PCI_BDF2(pdev->bus, pdev->devfn); - iommu =3D find_iommu_for_device(pdev->seg, bdf); + iommu =3D find_iommu_for_device(pdev->sbdf.seg, pdev->sbdf.bdf); if ( !iommu ) { AMD_IOMMU_DEBUG("Fail to find iommu." " %04x:%02x:%x02.%x cannot be assigned to dom%d\n", - pdev->seg, pdev->bus, PCI_SLOT(devfn), PCI_FUNC(de= vfn), - target->domain_id); + pdev->sbdf.seg, pdev->sbdf.bus, PCI_SLOT(devfn), + PCI_FUNC(devfn), target->domain_id); return -ENODEV; } =20 amd_iommu_disable_domain_device(source, iommu, devfn, pdev); =20 - if ( devfn =3D=3D pdev->devfn ) + if ( devfn =3D=3D pdev->sbdf.extfunc ) { list_move(&pdev->domain_list, &target->arch.pdev_list); pdev->domain =3D target; @@ -327,8 +326,8 @@ static int reassign_device(struct domain *source, struc= t domain *target, =20 amd_iommu_setup_domain_device(target, iommu, devfn, pdev); AMD_IOMMU_DEBUG("Re-assign %04x:%02x:%02x.%u from dom%d to dom%d\n", - pdev->seg, pdev->bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - source->domain_id, target->domain_id); + pdev->sbdf.seg, pdev->sbdf.bus, PCI_SLOT(devfn), + PCI_FUNC(devfn), source->domain_id, target->domain_id); =20 return 0; } @@ -337,9 +336,9 @@ static int amd_iommu_assign_device(struct domain *d, u8= devfn, struct pci_dev *pdev, u32 flag) { - struct ivrs_mappings *ivrs_mappings =3D get_ivrs_mappings(pdev->seg); - int bdf =3D PCI_BDF2(pdev->bus, devfn); - int req_id =3D get_dma_requestor_id(pdev->seg, bdf); + struct ivrs_mappings *ivrs_mappings =3D get_ivrs_mappings(pdev->sbdf.s= eg); + int bdf =3D PCI_BDF2(pdev->sbdf.bus, devfn); + int req_id =3D get_dma_requestor_id(pdev->sbdf.seg, bdf); =20 if ( ivrs_mappings[req_id].unity_map_enable ) { @@ -420,13 +419,11 @@ static void amd_iommu_domain_destroy(struct domain *d) static int amd_iommu_add_device(u8 devfn, struct pci_dev *pdev) { struct amd_iommu *iommu; - u16 bdf; =20 if ( !pdev->domain ) return -EINVAL; =20 - bdf =3D PCI_BDF2(pdev->bus, pdev->devfn); - iommu =3D find_iommu_for_device(pdev->seg, bdf); + iommu =3D find_iommu_for_device(pdev->sbdf.seg, pdev->sbdf.bdf); if ( unlikely(!iommu) ) { /* Filter bridge devices. */ @@ -434,14 +431,14 @@ static int amd_iommu_add_device(u8 devfn, struct pci_= dev *pdev) is_hardware_domain(pdev->domain) ) { AMD_IOMMU_DEBUG("Skipping host bridge %04x:%02x:%02x.%u\n", - pdev->seg, pdev->bus, PCI_SLOT(devfn), - PCI_FUNC(devfn)); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func); return 0; } =20 AMD_IOMMU_DEBUG("No iommu for %04x:%02x:%02x.%u; cannot be handed = to d%d\n", - pdev->seg, pdev->bus, PCI_SLOT(devfn), PCI_FUNC(de= vfn), - pdev->domain->domain_id); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, pdev->domain->domain_id); return -ENODEV; } =20 @@ -452,18 +449,17 @@ static int amd_iommu_add_device(u8 devfn, struct pci_= dev *pdev) static int amd_iommu_remove_device(u8 devfn, struct pci_dev *pdev) { struct amd_iommu *iommu; - u16 bdf; + if ( !pdev->domain ) return -EINVAL; =20 - bdf =3D PCI_BDF2(pdev->bus, pdev->devfn); - iommu =3D find_iommu_for_device(pdev->seg, bdf); + iommu =3D find_iommu_for_device(pdev->sbdf.seg, pdev->sbdf.bdf); if ( !iommu ) { AMD_IOMMU_DEBUG("Fail to find iommu." " %04x:%02x:%02x.%u cannot be removed from dom%d\n= ", - pdev->seg, pdev->bus, PCI_SLOT(devfn), PCI_FUNC(de= vfn), - pdev->domain->domain_id); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, pdev->domain->domain_id); return -ENODEV; } =20 diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index 8108ed5f9a..8de8d8e110 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -238,10 +238,10 @@ static void check_pdev(const struct pci_dev *pdev) (PCI_STATUS_PARITY | PCI_STATUS_SIG_TARGET_ABORT | \ PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_REC_MASTER_ABORT | \ PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY) - u16 seg =3D pdev->seg; - u8 bus =3D pdev->bus; - u8 dev =3D PCI_SLOT(pdev->devfn); - u8 func =3D PCI_FUNC(pdev->devfn); + uint16_t seg =3D pdev->sbdf.seg; + uint8_t bus =3D pdev->sbdf.bus; + uint8_t dev =3D pdev->sbdf.dev; + uint8_t func =3D pdev->sbdf.func; u16 val; =20 if ( command_mask ) @@ -289,12 +289,12 @@ static void check_pdev(const struct pci_dev *pdev) =20 static void apply_quirks(struct pci_dev *pdev) { - uint16_t vendor =3D pci_conf_read16(pdev->seg, pdev->bus, - PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), PCI_VENDOR_ID= ); - uint16_t device =3D pci_conf_read16(pdev->seg, pdev->bus, - PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), PCI_DEVICE_ID= ); + uint16_t vendor =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, + pdev->sbdf.dev, pdev->sbdf.func, + PCI_VENDOR_ID); + uint16_t device =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, + pdev->sbdf.dev, pdev->sbdf.func, + PCI_DEVICE_ID); static const struct { uint16_t vendor, device; } ignore_bars[] =3D { @@ -332,16 +332,14 @@ static struct pci_dev *alloc_pdev(struct pci_seg *pse= g, u8 bus, u8 devfn) struct pci_dev *pdev; =20 list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) - if ( pdev->bus =3D=3D bus && pdev->devfn =3D=3D devfn ) + if ( pdev->sbdf.bus =3D=3D bus && pdev->sbdf.extfunc =3D=3D devfn ) return pdev; =20 pdev =3D xzalloc(struct pci_dev); if ( !pdev ) return NULL; =20 - *(u16*) &pdev->seg =3D pseg->nr; - *((u8*) &pdev->bus) =3D bus; - *((u8*) &pdev->devfn) =3D devfn; + *(uint32_t *) &pdev->sbdf.sbdf =3D PCI_SBDF3(pseg->nr, bus, devfn); pdev->domain =3D NULL; INIT_LIST_HEAD(&pdev->msi_list); =20 @@ -436,20 +434,18 @@ static void free_pdev(struct pci_seg *pseg, struct pc= i_dev *pdev) /* update bus2bridge */ switch ( pdev->type ) { - u8 dev, func, sec_bus, sub_bus; + uint8_t sec_bus, sub_bus; =20 case DEV_TYPE_PCIe2PCI_BRIDGE: case DEV_TYPE_LEGACY_PCI_BRIDGE: - dev =3D PCI_SLOT(pdev->devfn); - func =3D PCI_FUNC(pdev->devfn); - sec_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func, - PCI_SECONDARY_BUS); - sub_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func, - PCI_SUBORDINATE_BUS); + sec_bus =3D pci_conf_read8(pseg->nr, pdev->sbdf.bus, pdev->sbd= f.dev, + pdev->sbdf.func, PCI_SECONDARY_BUS); + sub_bus =3D pci_conf_read8(pseg->nr, pdev->sbdf.bus, pdev->sbd= f.dev, + pdev->sbdf.func, PCI_SUBORDINATE_BUS); =20 spin_lock(&pseg->bus2bridge_lock); for ( ; sec_bus <=3D sub_bus; sec_bus++ ) - pseg->bus2bridge[sec_bus] =3D pseg->bus2bridge[pdev->bus]; + pseg->bus2bridge[sec_bus] =3D pseg->bus2bridge[pdev->sbdf.= bus]; spin_unlock(&pseg->bus2bridge_lock); break; =20 @@ -539,8 +535,8 @@ struct pci_dev *pci_get_pdev(int seg, int bus, int devf= n) =20 do { list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) - if ( (pdev->bus =3D=3D bus || bus =3D=3D -1) && - (pdev->devfn =3D=3D devfn || devfn =3D=3D -1) ) + if ( (pdev->sbdf.bus =3D=3D bus || bus =3D=3D -1) && + (pdev->sbdf.extfunc =3D=3D devfn || devfn =3D=3D -1) ) return pdev; } while ( radix_tree_gang_lookup(&pci_segments, (void **)&pseg, pseg->nr + 1, 1) ); @@ -588,8 +584,8 @@ struct pci_dev *pci_get_pdev_by_domain(const struct dom= ain *d, int seg, =20 do { list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) - if ( (pdev->bus =3D=3D bus || bus =3D=3D -1) && - (pdev->devfn =3D=3D devfn || devfn =3D=3D -1) && + if ( (pdev->sbdf.bus =3D=3D bus || bus =3D=3D -1) && + (pdev->sbdf.extfunc =3D=3D devfn || devfn =3D=3D -1) && (pdev->domain =3D=3D d) ) return pdev; } while ( radix_tree_gang_lookup(&pci_segments, (void **)&pseg, @@ -605,15 +601,15 @@ struct pci_dev *pci_get_pdev_by_domain(const struct d= omain *d, int seg, static void pci_enable_acs(struct pci_dev *pdev) { int pos; - u16 cap, ctrl, seg =3D pdev->seg; - u8 bus =3D pdev->bus; - u8 dev =3D PCI_SLOT(pdev->devfn); - u8 func =3D PCI_FUNC(pdev->devfn); + uint16_t cap, ctrl, seg =3D pdev->sbdf.seg; + uint8_t bus =3D pdev->sbdf.bus; + uint8_t dev =3D pdev->sbdf.dev; + uint8_t func =3D pdev->sbdf.func; =20 if ( !iommu_enabled ) return; =20 - pos =3D pci_find_ext_capability(seg, bus, pdev->devfn, PCI_EXT_CAP_ID_= ACS); + pos =3D pci_find_ext_capability(seg, bus, pdev->sbdf.extfunc, PCI_EXT_= CAP_ID_ACS); if (!pos) return; =20 @@ -845,7 +841,7 @@ int pci_remove_device(u16 seg, u8 bus, u8 devfn) =20 pcidevs_lock(); list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) - if ( pdev->bus =3D=3D bus && pdev->devfn =3D=3D devfn ) + if ( pdev->sbdf.bus =3D=3D bus && pdev->sbdf.extfunc =3D=3D devfn ) { ret =3D iommu_remove_device(pdev); if ( pdev->domain ) @@ -924,11 +920,11 @@ int pci_release_devices(struct domain *d) } while ( (pdev =3D pci_get_pdev_by_domain(d, -1, -1, -1)) ) { - bus =3D pdev->bus; - devfn =3D pdev->devfn; - if ( deassign_device(d, pdev->seg, bus, devfn) ) + bus =3D pdev->sbdf.bus; + devfn =3D pdev->sbdf.extfunc; + if ( deassign_device(d, pdev->sbdf.seg, bus, devfn) ) printk("domain %d: deassign device (%04x:%02x:%02x.%u) failed!= \n", - d->domain_id, pdev->seg, bus, + d->domain_id, pdev->sbdf.seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); } pcidevs_unlock(); @@ -1047,10 +1043,9 @@ void pci_check_disable_device(u16 seg, u8 bus, u8 de= vfn) =20 /* Tell the device to stop DMAing; we can't rely on the guest to * control it for us. */ - devfn =3D pdev->devfn; - cword =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), + cword =3D pci_conf_read16(seg, bus, pdev->sbdf.dev, pdev->sbdf.func, PCI_COMMAND); - pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), + pci_conf_write16(seg, bus, pdev->sbdf.dev, pdev->sbdf.func, PCI_COMMAND, cword & ~PCI_COMMAND_MASTER); } =20 @@ -1113,7 +1108,7 @@ struct setup_hwdom { static void __hwdom_init setup_one_hwdom_device(const struct setup_hwdom *= ctxt, struct pci_dev *pdev) { - u8 devfn =3D pdev->devfn; + uint8_t devfn =3D pdev->sbdf.extfunc; int err; =20 do { @@ -1121,14 +1116,14 @@ static void __hwdom_init setup_one_hwdom_device(con= st struct setup_hwdom *ctxt, if ( err ) { printk(XENLOG_ERR "setup %04x:%02x:%02x.%u for d%d failed (%d)= \n", - pdev->seg, pdev->bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - ctxt->d->domain_id, err); - if ( devfn =3D=3D pdev->devfn ) + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, ctxt->d->domain_id, err); + if ( devfn =3D=3D pdev->sbdf.extfunc ) return; } devfn +=3D pdev->phantom_stride; - } while ( devfn !=3D pdev->devfn && - PCI_SLOT(devfn) =3D=3D PCI_SLOT(pdev->devfn) ); + } while ( devfn !=3D pdev->sbdf.extfunc && + PCI_SLOT(devfn) =3D=3D pdev->sbdf.dev ); =20 err =3D vpci_add_handlers(pdev); if ( err ) @@ -1203,24 +1198,22 @@ void __hwdom_init setup_hwdom_pci_devices( static int hest_match_pci(const struct acpi_hest_aer_common *p, const struct pci_dev *pdev) { - return ACPI_HEST_SEGMENT(p->bus) =3D=3D pdev->seg && - ACPI_HEST_BUS(p->bus) =3D=3D pdev->bus && - p->device =3D=3D PCI_SLOT(pdev->devfn) && - p->function =3D=3D PCI_FUNC(pdev->devfn); + return ACPI_HEST_SEGMENT(p->bus) =3D=3D pdev->sbdf.seg && + ACPI_HEST_BUS(p->bus) =3D=3D pdev->sbdf.bus && + p->device =3D=3D pdev->sbdf.dev && + p->function =3D=3D pdev->sbdf.func; } =20 static bool_t hest_match_type(const struct acpi_hest_header *hest_hdr, const struct pci_dev *pdev) { - unsigned int pos =3D pci_find_cap_offset(pdev->seg, pdev->bus, - PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), + unsigned int pos =3D pci_find_cap_offset(pdev->sbdf.seg, pdev->sbdf.bu= s, + pdev->sbdf.dev, pdev->sbdf.func, PCI_CAP_ID_EXP); - u8 pcie =3D MASK_EXTR(pci_conf_read16(pdev->seg, pdev->bus, - PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), - pos + PCI_EXP_FLAGS), - PCI_EXP_FLAGS_TYPE); + uint8_t pcie =3D MASK_EXTR(pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.= bus, + pdev->sbdf.dev, pdev->sbdf.fu= nc, + pos + PCI_EXP_FLAGS), + PCI_EXP_FLAGS_TYPE); =20 switch ( hest_hdr->type ) { @@ -1229,8 +1222,8 @@ static bool_t hest_match_type(const struct acpi_hest_= header *hest_hdr, case ACPI_HEST_TYPE_AER_ENDPOINT: return pcie =3D=3D PCI_EXP_TYPE_ENDPOINT; case ACPI_HEST_TYPE_AER_BRIDGE: - return pci_conf_read16(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), PCI_CLASS_DEVICE) = =3D=3D + return pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.= dev, + pdev->sbdf.func, PCI_CLASS_DEVICE) =3D=3D PCI_CLASS_BRIDGE_PCI; } =20 @@ -1289,8 +1282,8 @@ bool_t pcie_aer_get_firmware_first(const struct pci_d= ev *pdev) { struct aer_hest_parse_info info =3D { .pdev =3D pdev }; =20 - return pci_find_cap_offset(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), PCI_CAP_ID_EXP) && + return pci_find_cap_offset(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.= dev, + pdev->sbdf.func, PCI_CAP_ID_EXP) && apei_hest_parse(aer_hest_parse, &info) >=3D 0 && info.firmware_first; } @@ -1306,8 +1299,7 @@ static int _dump_pci_devices(struct pci_seg *pseg, vo= id *arg) list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) { printk("%04x:%02x:%02x.%u - dom %-3d - node %-3d - MSIs < ", - pseg->nr, pdev->bus, - PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn), + pseg->nr, pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf.func, pdev->domain ? pdev->domain->domain_id : -1, (pdev->node !=3D NUMA_NO_NODE) ? pdev->node : -1); list_for_each_entry ( msi, &pdev->msi_list, list ) @@ -1362,19 +1354,20 @@ static int iommu_add_device(struct pci_dev *pdev) if ( !iommu_enabled || !hd->platform_ops ) return 0; =20 - rc =3D hd->platform_ops->add_device(pdev->devfn, pci_to_dev(pdev)); + rc =3D hd->platform_ops->add_device(pdev->sbdf.extfunc, pci_to_dev(pde= v)); if ( rc || !pdev->phantom_stride ) return rc; =20 - for ( devfn =3D pdev->devfn ; ; ) + for ( devfn =3D pdev->sbdf.extfunc ; ; ) { devfn +=3D pdev->phantom_stride; - if ( PCI_SLOT(devfn) !=3D PCI_SLOT(pdev->devfn) ) + if ( PCI_SLOT(devfn) !=3D pdev->sbdf.dev ) return 0; rc =3D hd->platform_ops->add_device(devfn, pci_to_dev(pdev)); if ( rc ) printk(XENLOG_WARNING "IOMMU: add %04x:%02x:%02x.%u failed (%d= )\n", - pdev->seg, pdev->bus, PCI_SLOT(devfn), PCI_FUNC(devfn),= rc); + pdev->sbdf.seg, pdev->sbdf.bus, PCI_SLOT(devfn), + PCI_FUNC(devfn), rc); } } =20 @@ -1398,7 +1391,7 @@ static int iommu_enable_device(struct pci_dev *pdev) static int iommu_remove_device(struct pci_dev *pdev) { const struct domain_iommu *hd; - u8 devfn; + uint8_t devfn; =20 if ( !pdev->domain ) return -EINVAL; @@ -1407,23 +1400,24 @@ static int iommu_remove_device(struct pci_dev *pdev) if ( !iommu_enabled || !hd->platform_ops ) return 0; =20 - for ( devfn =3D pdev->devfn ; pdev->phantom_stride; ) + for ( devfn =3D pdev->sbdf.extfunc ; pdev->phantom_stride; ) { int rc; =20 devfn +=3D pdev->phantom_stride; - if ( PCI_SLOT(devfn) !=3D PCI_SLOT(pdev->devfn) ) + if ( PCI_SLOT(devfn) !=3D pdev->sbdf.dev ) break; rc =3D hd->platform_ops->remove_device(devfn, pci_to_dev(pdev)); if ( !rc ) continue; =20 printk(XENLOG_ERR "IOMMU: remove %04x:%02x:%02x.%u failed (%d)\n", - pdev->seg, pdev->bus, PCI_SLOT(devfn), PCI_FUNC(devfn), rc); + pdev->sbdf.seg, pdev->sbdf.bus, PCI_SLOT(devfn), PCI_FUNC(d= evfn), + rc); return rc; } =20 - return hd->platform_ops->remove_device(pdev->devfn, pci_to_dev(pdev)); + return hd->platform_ops->remove_device(pdev->sbdf.extfunc, pci_to_dev(= pdev)); } =20 /* @@ -1485,7 +1479,7 @@ static int assign_device(struct domain *d, u16 seg, u= 8 bus, u8 devfn, u32 flag) for ( ; pdev->phantom_stride; rc =3D 0 ) { devfn +=3D pdev->phantom_stride; - if ( PCI_SLOT(devfn) !=3D PCI_SLOT(pdev->devfn) ) + if ( PCI_SLOT(devfn) !=3D pdev->sbdf.dev ) break; rc =3D hd->platform_ops->assign_device(d, devfn, pci_to_dev(pdev),= flag); if ( rc ) @@ -1520,7 +1514,7 @@ int deassign_device(struct domain *d, u16 seg, u8 bus= , u8 devfn) while ( pdev->phantom_stride ) { devfn +=3D pdev->phantom_stride; - if ( PCI_SLOT(devfn) !=3D PCI_SLOT(pdev->devfn) ) + if ( PCI_SLOT(devfn) !=3D pdev->sbdf.dev ) break; ret =3D hd->platform_ops->reassign_device(d, hardware_domain, devf= n, pci_to_dev(pdev)); @@ -1532,7 +1526,7 @@ int deassign_device(struct domain *d, u16 seg, u8 bus= , u8 devfn) return ret; } =20 - devfn =3D pdev->devfn; + devfn =3D pdev->sbdf.extfunc; ret =3D hd->platform_ops->reassign_device(d, hardware_domain, devfn, pci_to_dev(pdev)); if ( ret ) @@ -1558,7 +1552,6 @@ static int iommu_get_device_group( const struct domain_iommu *hd =3D dom_iommu(d); struct pci_dev *pdev; int group_id, sdev_id; - u32 bdf; int i =3D 0; const struct iommu_ops *ops =3D hd->platform_ops; =20 @@ -1570,19 +1563,18 @@ static int iommu_get_device_group( pcidevs_lock(); for_each_pdev( d, pdev ) { - if ( (pdev->seg !=3D seg) || - ((pdev->bus =3D=3D bus) && (pdev->devfn =3D=3D devfn)) ) + if ( (pdev->sbdf.seg !=3D seg) || + ((pdev->sbdf.bus =3D=3D bus) && (pdev->sbdf.extfunc =3D=3D de= vfn)) ) continue; =20 - if ( xsm_get_device_group(XSM_HOOK, (seg << 16) | (pdev->bus << 8)= | pdev->devfn) ) + if ( xsm_get_device_group(XSM_HOOK, (seg << 16) | pdev->sbdf.bdf) ) continue; =20 - sdev_id =3D ops->get_device_group_id(seg, pdev->bus, pdev->devfn); + sdev_id =3D ops->get_device_group_id(seg, pdev->sbdf.bus, + pdev->sbdf.extfunc); if ( (sdev_id =3D=3D group_id) && (i < max_sdevs) ) { - bdf =3D 0; - bdf |=3D (pdev->bus & 0xff) << 16; - bdf |=3D (pdev->devfn & 0xff) << 8; + uint32_t bdf =3D pdev->sbdf.bdf; =20 if ( unlikely(copy_to_guest_offset(buf, i, &bdf, 1)) ) { @@ -1618,8 +1610,8 @@ void iommu_dev_iotlb_flush_timeout(struct domain *d, = struct pci_dev *pdev) if ( !d->is_shutting_down && printk_ratelimit() ) printk(XENLOG_ERR "dom%d: ATS device %04x:%02x:%02x.%u flush failed\n", - d->domain_id, pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn)); + d->domain_id, pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.de= v, + pdev->sbdf.func); if ( !is_hardware_domain(d) ) domain_crash(d); =20 diff --git a/xen/drivers/passthrough/vtd/dmar.c b/xen/drivers/passthrough/v= td/dmar.c index 9cc8623e53..effaf93222 100644 --- a/xen/drivers/passthrough/vtd/dmar.c +++ b/xen/drivers/passthrough/vtd/dmar.c @@ -219,18 +219,18 @@ struct acpi_drhd_unit *acpi_find_matched_drhd_unit(co= nst struct pci_dev *pdev) } else if ( pdev->info.is_extfn ) { - bus =3D pdev->bus; + bus =3D pdev->sbdf.bus; devfn =3D 0; } else { - bus =3D pdev->bus; - devfn =3D pdev->devfn; + bus =3D pdev->sbdf.bus; + devfn =3D pdev->sbdf.extfunc; } =20 list_for_each_entry ( drhd, &acpi_drhd_units, list ) { - if ( drhd->segment !=3D pdev->seg ) + if ( drhd->segment !=3D pdev->sbdf.seg ) continue; =20 for (i =3D 0; i < drhd->scope.devices_cnt; i++) @@ -253,10 +253,10 @@ struct acpi_atsr_unit *acpi_find_matched_atsr_unit(co= nst struct pci_dev *pdev) =20 list_for_each_entry ( atsr, &acpi_atsr_units, list ) { - if ( atsr->segment !=3D pdev->seg ) + if ( atsr->segment !=3D pdev->sbdf.seg ) continue; =20 - if ( test_bit(pdev->bus, atsr->scope.buses) ) + if ( test_bit(pdev->sbdf.bus, atsr->scope.buses) ) return atsr; =20 if ( atsr->all_ports ) diff --git a/xen/drivers/passthrough/vtd/intremap.c b/xen/drivers/passthrou= gh/vtd/intremap.c index df0e8ac5cb..0dbf99551e 100644 --- a/xen/drivers/passthrough/vtd/intremap.c +++ b/xen/drivers/passthrough/vtd/intremap.c @@ -483,9 +483,9 @@ static void set_msi_source_id(struct pci_dev *pdev, str= uct iremap_entry *ire) if ( !pdev || !ire ) return; =20 - seg =3D pdev->seg; - bus =3D pdev->bus; - devfn =3D pdev->devfn; + seg =3D pdev->sbdf.seg; + bus =3D pdev->sbdf.bus; + devfn =3D pdev->sbdf.extfunc; switch ( pdev->type ) { unsigned int sq; @@ -517,7 +517,7 @@ static void set_msi_source_id(struct pci_dev *pdev, str= uct iremap_entry *ire) { if ( pdev_type(seg, bus, devfn) =3D=3D DEV_TYPE_PCIe2PCI_BRIDG= E ) set_ire_sid(ire, SVT_VERIFY_BUS, SQ_ALL_16, - (bus << 8) | pdev->bus); + (bus << 8) | pdev->sbdf.bus); else set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_ALL_16, PCI_BDF2(bus, devfn)); diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/= vtd/iommu.c index 7b9e09a084..7b70732863 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1484,7 +1484,7 @@ static int domain_context_mapping(struct domain *doma= in, u8 devfn, { struct acpi_drhd_unit *drhd; int ret =3D 0; - u8 seg =3D pdev->seg, bus =3D pdev->bus, secbus; + uint8_t seg =3D pdev->sbdf.seg, bus =3D pdev->sbdf.bus, secbus; =20 drhd =3D acpi_find_matched_drhd_unit(pdev); if ( !drhd ) @@ -1515,7 +1515,7 @@ static int domain_context_mapping(struct domain *doma= in, u8 devfn, PCI_SLOT(devfn), PCI_FUNC(devfn)); ret =3D domain_context_mapping_one(domain, drhd->iommu, bus, devfn, pdev); - if ( !ret && devfn =3D=3D pdev->devfn && ats_device(pdev, drhd) > = 0 ) + if ( !ret && devfn =3D=3D pdev->sbdf.extfunc && ats_device(pdev, d= rhd) > 0 ) enable_ats_device(pdev, &drhd->iommu->ats_devices); =20 break; @@ -1543,7 +1543,7 @@ static int domain_context_mapping(struct domain *doma= in, u8 devfn, * behind the bridge. Map that id as well if we didn't already. */ if ( !ret && pdev_type(seg, bus, devfn) =3D=3D DEV_TYPE_PCIe2PCI_B= RIDGE && - (secbus !=3D pdev->bus || pdev->devfn !=3D 0) ) + (secbus !=3D pdev->sbdf.bus || pdev->sbdf.extfunc !=3D 0) ) ret =3D domain_context_mapping_one(domain, drhd->iommu, secbus= , 0, pci_get_pdev(seg, secbus, 0)); =20 @@ -1557,7 +1557,7 @@ static int domain_context_mapping(struct domain *doma= in, u8 devfn, break; } =20 - if ( !ret && devfn =3D=3D pdev->devfn ) + if ( !ret && devfn =3D=3D pdev->sbdf.extfunc ) pci_vtd_quirk(pdev); =20 return ret; @@ -1635,7 +1635,8 @@ static int domain_context_unmap(struct domain *domain= , u8 devfn, struct acpi_drhd_unit *drhd; struct iommu *iommu; int ret =3D 0; - u8 seg =3D pdev->seg, bus =3D pdev->bus, tmp_bus, tmp_devfn, secbus; + uint8_t seg =3D pdev->sbdf.seg, bus =3D pdev->sbdf.bus, tmp_bus, tmp_d= evfn, + secbus; int found =3D 0; =20 drhd =3D acpi_find_matched_drhd_unit(pdev); @@ -1665,7 +1666,7 @@ static int domain_context_unmap(struct domain *domain= , u8 devfn, domain->domain_id, seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); ret =3D domain_context_unmap_one(domain, iommu, bus, devfn); - if ( !ret && devfn =3D=3D pdev->devfn && ats_device(pdev, drhd) > = 0 ) + if ( !ret && devfn =3D=3D pdev->sbdf.extfunc && ats_device(pdev, d= rhd) > 0 ) disable_ats_device(pdev); =20 break; @@ -1711,7 +1712,8 @@ static int domain_context_unmap(struct domain *domain= , u8 devfn, */ for_each_pdev ( domain, pdev ) { - if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && pdev->devfn = =3D=3D devfn ) + if ( pdev->sbdf.seg =3D=3D seg && pdev->sbdf.bus =3D=3D bus && + pdev->sbdf.extfunc =3D=3D devfn ) continue; =20 drhd =3D acpi_find_matched_drhd_unit(pdev); @@ -2050,8 +2052,8 @@ static int intel_iommu_add_device(u8 devfn, struct pc= i_dev *pdev) =20 for_each_rmrr_device ( rmrr, bdf, i ) { - if ( rmrr->segment =3D=3D pdev->seg && - PCI_BUS(bdf) =3D=3D pdev->bus && + if ( rmrr->segment =3D=3D pdev->sbdf.seg && + PCI_BUS(bdf) =3D=3D pdev->sbdf.bus && PCI_DEVFN2(bdf) =3D=3D devfn ) { /* @@ -2096,8 +2098,8 @@ static int intel_iommu_remove_device(u8 devfn, struct= pci_dev *pdev) =20 for_each_rmrr_device ( rmrr, bdf, i ) { - if ( rmrr->segment !=3D pdev->seg || - PCI_BUS(bdf) !=3D pdev->bus || + if ( rmrr->segment !=3D pdev->sbdf.seg || + PCI_BUS(bdf) !=3D pdev->sbdf.bus || PCI_DEVFN2(bdf) !=3D devfn ) continue; =20 @@ -2421,8 +2423,8 @@ static int reassign_device_ownership( unsigned int i; =20 for_each_rmrr_device( rmrr, bdf, i ) - if ( rmrr->segment =3D=3D pdev->seg && - PCI_BUS(bdf) =3D=3D pdev->bus && + if ( rmrr->segment =3D=3D pdev->sbdf.seg && + PCI_BUS(bdf) =3D=3D pdev->sbdf.bus && PCI_DEVFN2(bdf) =3D=3D devfn ) { /* @@ -2451,7 +2453,7 @@ static int reassign_device_ownership( return ret; } =20 - if ( devfn =3D=3D pdev->devfn ) + if ( devfn =3D=3D pdev->sbdf.extfunc ) { list_move(&pdev->domain_list, &target->arch.pdev_list); pdev->domain =3D target; @@ -2474,8 +2476,8 @@ static int intel_iommu_assign_device( if ( list_empty(&acpi_drhd_units) ) return -ENODEV; =20 - seg =3D pdev->seg; - bus =3D pdev->bus; + seg =3D pdev->sbdf.seg; + bus =3D pdev->sbdf.bus; /* * In rare cases one given rmrr is shared by multiple devices but * obviously this would put the security of a system at risk. So diff --git a/xen/drivers/passthrough/vtd/qinval.c b/xen/drivers/passthrough= /vtd/qinval.c index 01447cf9a8..8015d16531 100644 --- a/xen/drivers/passthrough/vtd/qinval.c +++ b/xen/drivers/passthrough/vtd/qinval.c @@ -257,7 +257,7 @@ int qinval_device_iotlb_sync(struct iommu *iommu, struc= t pci_dev *pdev, qinval_entry->q.dev_iotlb_inv_dsc.lo.res_1 =3D 0; qinval_entry->q.dev_iotlb_inv_dsc.lo.max_invs_pend =3D pdev->ats.queue= _depth; qinval_entry->q.dev_iotlb_inv_dsc.lo.res_2 =3D 0; - qinval_entry->q.dev_iotlb_inv_dsc.lo.sid =3D PCI_BDF2(pdev->bus, pdev-= >devfn); + qinval_entry->q.dev_iotlb_inv_dsc.lo.sid =3D pdev->sbdf.bdf; qinval_entry->q.dev_iotlb_inv_dsc.lo.res_3 =3D 0; =20 qinval_entry->q.dev_iotlb_inv_dsc.hi.size =3D size; diff --git a/xen/drivers/passthrough/vtd/quirks.c b/xen/drivers/passthrough= /vtd/quirks.c index d6db862678..fa811605ee 100644 --- a/xen/drivers/passthrough/vtd/quirks.c +++ b/xen/drivers/passthrough/vtd/quirks.c @@ -413,10 +413,10 @@ int me_wifi_quirk(struct domain *domain, u8 bus, u8 d= evfn, int map) =20 void pci_vtd_quirk(const struct pci_dev *pdev) { - int seg =3D pdev->seg; - int bus =3D pdev->bus; - int dev =3D PCI_SLOT(pdev->devfn); - int func =3D PCI_FUNC(pdev->devfn); + int seg =3D pdev->sbdf.seg; + int bus =3D pdev->sbdf.bus; + int dev =3D pdev->sbdf.dev; + int func =3D pdev->sbdf.func; int pos; bool_t ff; u32 val, val2; @@ -454,11 +454,11 @@ void pci_vtd_quirk(const struct pci_dev *pdev) /* Sandybridge-EP (Romley) */ case 0x3c00: /* host bridge */ case 0x3c01 ... 0x3c0b: /* root ports */ - pos =3D pci_find_ext_capability(seg, bus, pdev->devfn, + pos =3D pci_find_ext_capability(seg, bus, pdev->sbdf.extfunc, PCI_EXT_CAP_ID_ERR); if ( !pos ) { - pos =3D pci_find_ext_capability(seg, bus, pdev->devfn, + pos =3D pci_find_ext_capability(seg, bus, pdev->sbdf.extfunc, PCI_EXT_CAP_ID_VNDR); while ( pos ) { @@ -468,8 +468,8 @@ void pci_vtd_quirk(const struct pci_dev *pdev) pos +=3D PCI_VNDR_HEADER; break; } - pos =3D pci_find_next_ext_capability(seg, bus, pdev->devfn= , pos, - PCI_EXT_CAP_ID_VNDR); + pos =3D pci_find_next_ext_capability(seg, bus, pdev->sbdf.= extfunc, + pos, PCI_EXT_CAP_ID_VND= R); } ff =3D 0; } diff --git a/xen/drivers/passthrough/vtd/x86/ats.c b/xen/drivers/passthroug= h/vtd/x86/ats.c index 1a3adb4acb..e0904df5b6 100644 --- a/xen/drivers/passthrough/vtd/x86/ats.c +++ b/xen/drivers/passthrough/vtd/x86/ats.c @@ -57,8 +57,8 @@ int ats_device(const struct pci_dev *pdev, const struct a= cpi_drhd_unit *drhd) return 0; =20 ats_drhd =3D find_ats_dev_drhd(drhd->iommu); - pos =3D pci_find_ext_capability(pdev->seg, pdev->bus, pdev->devfn, - PCI_EXT_CAP_ID_ATS); + pos =3D pci_find_ext_capability(pdev->sbdf.seg, pdev->sbdf.bus, + pdev->sbdf.extfunc, PCI_EXT_CAP_ID_ATS); =20 if ( pos && (ats_drhd =3D=3D NULL) ) { @@ -79,19 +79,19 @@ static int device_in_domain(const struct iommu *iommu, int tt, found =3D 0; =20 root_entry =3D (struct root_entry *) map_vtd_domain_page(iommu->root_m= addr); - if ( !root_entry || !root_present(root_entry[pdev->bus]) ) + if ( !root_entry || !root_present(root_entry[pdev->sbdf.bus]) ) goto out; =20 ctxt_entry =3D (struct context_entry *) - map_vtd_domain_page(root_entry[pdev->bus].val); + map_vtd_domain_page(root_entry[pdev->sbdf.bus].val); =20 if ( ctxt_entry =3D=3D NULL ) goto out; =20 - if ( context_domain_id(ctxt_entry[pdev->devfn]) !=3D did ) + if ( context_domain_id(ctxt_entry[pdev->sbdf.extfunc]) !=3D did ) goto out; =20 - tt =3D context_translation_type(ctxt_entry[pdev->devfn]); + tt =3D context_translation_type(ctxt_entry[pdev->sbdf.extfunc]); if ( tt !=3D CONTEXT_TT_DEV_IOTLB ) goto out; =20 diff --git a/xen/drivers/passthrough/x86/ats.c b/xen/drivers/passthrough/x8= 6/ats.c index 59c163459a..ddaec72d19 100644 --- a/xen/drivers/passthrough/x86/ats.c +++ b/xen/drivers/passthrough/x86/ats.c @@ -23,8 +23,8 @@ boolean_param("ats", ats_enabled); int enable_ats_device(struct pci_dev *pdev, struct list_head *ats_list) { u32 value; - u16 seg =3D pdev->seg; - u8 bus =3D pdev->bus, devfn =3D pdev->devfn; + uint16_t seg =3D pdev->sbdf.seg; + uint16_t bus =3D pdev->sbdf.bus, devfn =3D pdev->sbdf.extfunc; int pos; =20 pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS); @@ -76,8 +76,8 @@ int enable_ats_device(struct pci_dev *pdev, struct list_h= ead *ats_list) void disable_ats_device(struct pci_dev *pdev) { u32 value; - u16 seg =3D pdev->seg; - u8 bus =3D pdev->bus, devfn =3D pdev->devfn; + uint16_t seg =3D pdev->sbdf.seg; + uint8_t bus =3D pdev->sbdf.bus, devfn =3D pdev->sbdf.extfunc; =20 BUG_ON(!pdev->ats.cap_pos); =20 diff --git a/xen/drivers/pci/pci.c b/xen/drivers/pci/pci.c index 1c808d6632..a3223a2b29 100644 --- a/xen/drivers/pci/pci.c +++ b/xen/drivers/pci/pci.c @@ -117,10 +117,10 @@ int pci_find_next_ext_capability(int seg, int bus, in= t devfn, int start, int cap =20 void pci_intx(const struct pci_dev *pdev, bool enable) { - uint16_t seg =3D pdev->seg; - uint8_t bus =3D pdev->bus; - uint8_t slot =3D PCI_SLOT(pdev->devfn); - uint8_t func =3D PCI_FUNC(pdev->devfn); + uint16_t seg =3D pdev->sbdf.seg; + uint8_t bus =3D pdev->sbdf.bus; + uint8_t slot =3D pdev->sbdf.dev; + uint8_t func =3D pdev->sbdf.func; uint16_t cmd =3D pci_conf_read16(seg, bus, slot, func, PCI_COMMAND); =20 if ( enable ) diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index efb6ca90e3..74d70a4278 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -85,7 +85,6 @@ static void modify_decoding(const struct pci_dev *pdev, u= int16_t cmd, bool rom_only) { struct vpci_header *header =3D &pdev->vpci->header; - uint8_t slot =3D PCI_SLOT(pdev->devfn), func =3D PCI_FUNC(pdev->devfn); bool map =3D cmd & PCI_COMMAND_MEMORY; unsigned int i; =20 @@ -113,7 +112,8 @@ static void modify_decoding(const struct pci_dev *pdev,= uint16_t cmd, (map ? PCI_ROM_ADDRESS_ENABLE : 0); =20 header->bars[i].enabled =3D header->rom_enabled =3D map; - pci_conf_write32(pdev->seg, pdev->bus, slot, func, rom_pos, va= l); + pci_conf_write32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.de= v, + pdev->sbdf.func, rom_pos, val); return; } =20 @@ -123,8 +123,8 @@ static void modify_decoding(const struct pci_dev *pdev,= uint16_t cmd, } =20 if ( !rom_only ) - pci_conf_write16(pdev->seg, pdev->bus, slot, func, PCI_COMMAND, - cmd); + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, PCI_COMMAND, cmd); else ASSERT_UNREACHABLE(); } @@ -335,8 +335,8 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) static void cmd_write(const struct pci_dev *pdev, unsigned int reg, uint32_t cmd, void *data) { - uint8_t slot =3D PCI_SLOT(pdev->devfn), func =3D PCI_FUNC(pdev->devfn); - uint16_t current_cmd =3D pci_conf_read16(pdev->seg, pdev->bus, slot, f= unc, + uint16_t current_cmd =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bu= s, + pdev->sbdf.dev, pdev->sbdf.func, reg); =20 /* @@ -352,14 +352,14 @@ static void cmd_write(const struct pci_dev *pdev, uns= igned int reg, */ modify_bars(pdev, cmd, false); else - pci_conf_write16(pdev->seg, pdev->bus, slot, func, reg, cmd); + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, reg, cmd); } =20 static void bar_write(const struct pci_dev *pdev, unsigned int reg, uint32_t val, void *data) { struct vpci_bar *bar =3D data; - uint8_t slot =3D PCI_SLOT(pdev->devfn), func =3D PCI_FUNC(pdev->devfn); bool hi =3D false; =20 if ( bar->type =3D=3D VPCI_BAR_MEM64_HI ) @@ -371,15 +371,15 @@ static void bar_write(const struct pci_dev *pdev, uns= igned int reg, else val &=3D PCI_BASE_ADDRESS_MEM_MASK; =20 - if ( pci_conf_read16(pdev->seg, pdev->bus, slot, func, PCI_COMMAND) & - PCI_COMMAND_MEMORY ) + if ( pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, PCI_COMMAND) & PCI_COMMAND_MEMOR= Y ) { /* If the value written is the current one avoid printing a warnin= g. */ if ( val !=3D (uint32_t)(bar->addr >> (hi ? 32 : 0)) ) gprintk(XENLOG_WARNING, "%04x:%02x:%02x.%u: ignored BAR %lu write with memory = decoding enabled\n", - pdev->seg, pdev->bus, slot, func, - bar - pdev->vpci->header.bars + hi); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, bar - pdev->vpci->header.bars + hi); return; } =20 @@ -399,8 +399,8 @@ static void bar_write(const struct pci_dev *pdev, unsig= ned int reg, val |=3D bar->prefetchable ? PCI_BASE_ADDRESS_MEM_PREFETCH : 0; } =20 - pci_conf_write32(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), reg, val); + pci_conf_write32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, reg, val); } =20 static void rom_write(const struct pci_dev *pdev, unsigned int reg, @@ -408,8 +408,8 @@ static void rom_write(const struct pci_dev *pdev, unsig= ned int reg, { struct vpci_header *header =3D &pdev->vpci->header; struct vpci_bar *rom =3D data; - uint8_t slot =3D PCI_SLOT(pdev->devfn), func =3D PCI_FUNC(pdev->devfn); - uint16_t cmd =3D pci_conf_read16(pdev->seg, pdev->bus, slot, func, + uint16_t cmd =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, + pdev->sbdf.dev, pdev->sbdf.func, PCI_COMMAND); bool new_enabled =3D val & PCI_ROM_ADDRESS_ENABLE; =20 @@ -417,7 +417,8 @@ static void rom_write(const struct pci_dev *pdev, unsig= ned int reg, { gprintk(XENLOG_WARNING, "%04x:%02x:%02x.%u: ignored ROM BAR write with memory deco= ding enabled\n", - pdev->seg, pdev->bus, slot, func); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func); return; } =20 @@ -432,7 +433,8 @@ static void rom_write(const struct pci_dev *pdev, unsig= ned int reg, { /* Just update the ROM BAR field. */ header->rom_enabled =3D new_enabled; - pci_conf_write32(pdev->seg, pdev->bus, slot, func, reg, val); + pci_conf_write32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, reg, val); } /* * Pass PCI_COMMAND_MEMORY or 0 to signal a map/unmap request, note th= at @@ -455,19 +457,15 @@ static void rom_write(const struct pci_dev *pdev, uns= igned int reg, =20 static int init_bars(struct pci_dev *pdev) { - uint8_t slot =3D PCI_SLOT(pdev->devfn), func =3D PCI_FUNC(pdev->devfn); uint16_t cmd; uint64_t addr, size; unsigned int i, num_bars, rom_reg; struct vpci_header *header =3D &pdev->vpci->header; struct vpci_bar *bars =3D header->bars; - pci_sbdf_t sbdf =3D { - .sbdf =3D PCI_SBDF3(pdev->seg, pdev->bus, pdev->devfn), - }; int rc; =20 - switch ( pci_conf_read8(pdev->seg, pdev->bus, slot, func, PCI_HEADER_T= YPE) - & 0x7f ) + switch ( pci_conf_read8(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, PCI_HEADER_TYPE) & 0x7f ) { case PCI_HEADER_TYPE_NORMAL: num_bars =3D PCI_HEADER_NORMAL_NR_BARS; @@ -493,9 +491,11 @@ static int init_bars(struct pci_dev *pdev) return 0; =20 /* Disable memory decoding before sizing. */ - cmd =3D pci_conf_read16(pdev->seg, pdev->bus, slot, func, PCI_COMMAND); + cmd =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, PCI_COMMAND); if ( cmd & PCI_COMMAND_MEMORY ) - pci_conf_write16(pdev->seg, pdev->bus, slot, func, PCI_COMMAND, + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, PCI_COMMAND, cmd & ~PCI_COMMAND_MEMORY); =20 for ( i =3D 0; i < num_bars; i++ ) @@ -510,15 +510,16 @@ static int init_bars(struct pci_dev *pdev) 4, &bars[i]); if ( rc ) { - pci_conf_write16(pdev->seg, pdev->bus, slot, func, - PCI_COMMAND, cmd); + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbd= f.dev, + pdev->sbdf.func, PCI_COMMAND, cmd); return rc; } =20 continue; } =20 - val =3D pci_conf_read32(pdev->seg, pdev->bus, slot, func, reg); + val =3D pci_conf_read32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf= .dev, + pdev->sbdf.func, reg); if ( (val & PCI_BASE_ADDRESS_SPACE) =3D=3D PCI_BASE_ADDRESS_SPACE_= IO ) { bars[i].type =3D VPCI_BAR_IO; @@ -530,12 +531,12 @@ static int init_bars(struct pci_dev *pdev) else bars[i].type =3D VPCI_BAR_MEM32; =20 - rc =3D pci_size_mem_bar(sbdf, reg, &addr, &size, + rc =3D pci_size_mem_bar(pdev->sbdf, reg, &addr, &size, (i =3D=3D num_bars - 1) ? PCI_BAR_LAST : 0); if ( rc < 0 ) { - pci_conf_write16(pdev->seg, pdev->bus, slot, func, PCI_COMMAND, - cmd); + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.de= v, + pdev->sbdf.func, PCI_COMMAND, cmd); return rc; } =20 @@ -553,14 +554,14 @@ static int init_bars(struct pci_dev *pdev) &bars[i]); if ( rc ) { - pci_conf_write16(pdev->seg, pdev->bus, slot, func, PCI_COMMAND, - cmd); + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.de= v, + pdev->sbdf.func, PCI_COMMAND, cmd); return rc; } } =20 /* Check expansion ROM. */ - rc =3D pci_size_mem_bar(sbdf, rom_reg, &addr, &size, PCI_BAR_ROM); + rc =3D pci_size_mem_bar(pdev->sbdf, rom_reg, &addr, &size, PCI_BAR_ROM= ); if ( rc > 0 && size ) { struct vpci_bar *rom =3D &header->bars[num_bars]; @@ -568,7 +569,8 @@ static int init_bars(struct pci_dev *pdev) rom->type =3D VPCI_BAR_ROM; rom->size =3D size; rom->addr =3D addr; - header->rom_enabled =3D pci_conf_read32(pdev->seg, pdev->bus, slot= , func, + header->rom_enabled =3D pci_conf_read32(pdev->sbdf.seg, pdev->sbdf= .bus, + pdev->sbdf.dev, pdev->sbdf.f= unc, rom_reg) & PCI_ROM_ADDRESS_E= NABLE; =20 rc =3D vpci_add_register(pdev->vpci, vpci_hw_read32, rom_write, ro= m_reg, diff --git a/xen/drivers/vpci/msi.c b/xen/drivers/vpci/msi.c index 8f15ad7bf2..dfc894dcc6 100644 --- a/xen/drivers/vpci/msi.c +++ b/xen/drivers/vpci/msi.c @@ -77,9 +77,8 @@ static void control_write(const struct pci_dev *pdev, uns= igned int reg, msi->vectors =3D vectors; msi->enabled =3D new_enabled; =20 - pci_conf_write16(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), reg, - control_read(pdev, reg, data)); + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, reg, control_read(pdev, reg, data)); } =20 static void update_msi(const struct pci_dev *pdev, struct vpci_msi *msi) @@ -187,8 +186,8 @@ static void mask_write(const struct pci_dev *pdev, unsi= gned int reg, =20 static int init_msi(struct pci_dev *pdev) { - uint8_t slot =3D PCI_SLOT(pdev->devfn), func =3D PCI_FUNC(pdev->devfn); - unsigned int pos =3D pci_find_cap_offset(pdev->seg, pdev->bus, slot, f= unc, + unsigned int pos =3D pci_find_cap_offset(pdev->sbdf.seg, pdev->sbdf.bu= s, + pdev->sbdf.dev, pdev->sbdf.func, PCI_CAP_ID_MSI); uint16_t control; int ret; @@ -211,8 +210,8 @@ static int init_msi(struct pci_dev *pdev) return ret; =20 /* Get the maximum number of vectors the device supports. */ - control =3D pci_conf_read16(pdev->seg, pdev->bus, slot, func, - msi_control_reg(pos)); + control =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf= .dev, + pdev->sbdf.func, msi_control_reg(pos)); =20 /* * FIXME: I've only been able to test this code with devices using a s= ingle @@ -293,8 +292,8 @@ void vpci_dump_msi(void) msi =3D pdev->vpci->msi; if ( msi && msi->enabled ) { - printk("%04x:%02x:%02x.%u MSI\n", pdev->seg, pdev->bus, - PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn)); + printk("%04x:%02x:%02x.%u MSI\n", pdev->sbdf.seg, + pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf.func); =20 printk(" enabled: %d 64-bit: %d", msi->enabled, msi->address64); @@ -311,8 +310,8 @@ void vpci_dump_msi(void) { int rc; =20 - printk("%04x:%02x:%02x.%u MSI-X\n", pdev->seg, pdev->bus, - PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn)); + printk("%04x:%02x:%02x.%u MSI-X\n", pdev->sbdf.seg, + pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf.func); =20 printk(" entries: %u maskall: %d enabled: %d\n", msix->max_entries, msix->masked, msix->enabled); diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c index af3ffa087d..04431715f5 100644 --- a/xen/drivers/vpci/msix.c +++ b/xen/drivers/vpci/msix.c @@ -42,7 +42,6 @@ static uint32_t control_read(const struct pci_dev *pdev, = unsigned int reg, static int update_entry(struct vpci_msix_entry *entry, const struct pci_dev *pdev, unsigned int nr) { - uint8_t slot =3D PCI_SLOT(pdev->devfn), func =3D PCI_FUNC(pdev->devfn); int rc =3D vpci_msix_arch_disable_entry(entry, pdev); =20 /* Ignore ENOENT, it means the entry wasn't setup. */ @@ -50,7 +49,8 @@ static int update_entry(struct vpci_msix_entry *entry, { gprintk(XENLOG_WARNING, "%04x:%02x:%02x.%u: unable to disable entry %u for update:= %d\n", - pdev->seg, pdev->bus, slot, func, nr, rc); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf= .func, + nr, rc); return rc; } =20 @@ -61,7 +61,8 @@ static int update_entry(struct vpci_msix_entry *entry, { gprintk(XENLOG_WARNING, "%04x:%02x:%02x.%u: unable to enable entry %u: %d\n", - pdev->seg, pdev->bus, slot, func, nr, rc); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf= .func, + nr, rc); /* Entry is likely not properly configured. */ return rc; } @@ -72,7 +73,6 @@ static int update_entry(struct vpci_msix_entry *entry, static void control_write(const struct pci_dev *pdev, unsigned int reg, uint32_t val, void *data) { - uint8_t slot =3D PCI_SLOT(pdev->devfn), func =3D PCI_FUNC(pdev->devfn); struct vpci_msix *msix =3D data; bool new_masked =3D val & PCI_MSIX_FLAGS_MASKALL; bool new_enabled =3D val & PCI_MSIX_FLAGS_ENABLE; @@ -135,7 +135,8 @@ static void control_write(const struct pci_dev *pdev, u= nsigned int reg, default: gprintk(XENLOG_WARNING, "%04x:%02x:%02x.%u: unable to disable entry %u: %d= \n", - pdev->seg, pdev->bus, slot, func, i, rc); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, i, rc); return; } } @@ -146,7 +147,8 @@ static void control_write(const struct pci_dev *pdev, u= nsigned int reg, =20 val =3D control_read(pdev, reg, data); if ( pci_msi_conf_write_intercept(msix->pdev, reg, 2, &val) >=3D 0 ) - pci_conf_write16(pdev->seg, pdev->bus, slot, func, reg, val); + pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, reg, val); } =20 static struct vpci_msix *msix_find(const struct domain *d, unsigned long a= ddr) @@ -181,7 +183,7 @@ static bool access_allowed(const struct pci_dev *pdev, = unsigned long addr, =20 gprintk(XENLOG_WARNING, "%04x:%02x:%02x.%u: unaligned or invalid size MSI-X table acce= ss\n", - pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->de= vfn)); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf.fun= c); =20 return false; } @@ -433,8 +435,8 @@ int vpci_make_msix_hole(const struct pci_dev *pdev) gprintk(XENLOG_WARNING, "%04x:%02x:%02x.%u: existing mapping (mfn: %" PRI_= mfn "type: %d) at %#lx clobbers MSIX MMIO area\n", - pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), mfn_x(mfn), t, start); + pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, mfn_x(mfn), t, start); return -EEXIST; } put_gfn(d, start); @@ -447,18 +449,18 @@ int vpci_make_msix_hole(const struct pci_dev *pdev) static int init_msix(struct pci_dev *pdev) { struct domain *d =3D pdev->domain; - uint8_t slot =3D PCI_SLOT(pdev->devfn), func =3D PCI_FUNC(pdev->devfn); unsigned int msix_offset, i, max_entries; uint16_t control; int rc; =20 - msix_offset =3D pci_find_cap_offset(pdev->seg, pdev->bus, slot, func, + msix_offset =3D pci_find_cap_offset(pdev->sbdf.seg, pdev->sbdf.bus, + pdev->sbdf.dev, pdev->sbdf.func, PCI_CAP_ID_MSIX); if ( !msix_offset ) return 0; =20 - control =3D pci_conf_read16(pdev->seg, pdev->bus, slot, func, - msix_control_reg(msix_offset)); + control =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf= .dev, + pdev->sbdf.func, msix_control_reg(msix_offse= t)); =20 max_entries =3D msix_table_size(control); =20 @@ -470,11 +472,11 @@ static int init_msix(struct pci_dev *pdev) pdev->vpci->msix->pdev =3D pdev; =20 pdev->vpci->msix->tables[VPCI_MSIX_TABLE] =3D - pci_conf_read32(pdev->seg, pdev->bus, slot, func, - msix_table_offset_reg(msix_offset)); + pci_conf_read32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, msix_table_offset_reg(msix_offset= )); pdev->vpci->msix->tables[VPCI_MSIX_PBA] =3D - pci_conf_read32(pdev->seg, pdev->bus, slot, func, - msix_pba_offset_reg(msix_offset)); + pci_conf_read32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, msix_pba_offset_reg(msix_offset)); =20 for ( i =3D 0; i < pdev->vpci->msix->max_entries; i++) { diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c index 82607bdb9a..9a060c108e 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -114,15 +114,15 @@ static void vpci_ignored_write(const struct pci_dev *= pdev, unsigned int reg, uint32_t vpci_hw_read16(const struct pci_dev *pdev, unsigned int reg, void *data) { - return pci_conf_read16(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), reg); + return pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, reg); } =20 uint32_t vpci_hw_read32(const struct pci_dev *pdev, unsigned int reg, void *data) { - return pci_conf_read32(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), reg); + return pci_conf_read32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, + pdev->sbdf.func, reg); } =20 int vpci_add_register(struct vpci *vpci, vpci_read_t *read_handler, diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index 8b21e8dc84..1cf54eb466 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -80,9 +80,8 @@ struct pci_dev { struct arch_msix *msix; =20 struct domain *domain; - const u16 seg; - const u8 bus; - const u8 devfn; + + const pci_sbdf_t sbdf; =20 u8 phantom_stride; =20 --=20 2.17.2 (Apple Git-113) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Fri Mar 29 06:44:45 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1557504787; cv=none; d=zoho.com; s=zohoarc; b=fpCHZGBWNJHUpBMyUPAb2BDpVXhSWilq82i0zvjFN21hO3+nuYd5aV0RDLGudH0+4G0+DRHmNyltDapuB5bQOPoDrcZXHdiAcFYbXciBYO9Xsw+ghdv/CkkdAFxeFODl2zbnS2+CyLuzjjDwntfPn8KdPoYxkwr2d51Kb6YxwP4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1557504787; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=kgYFkjFJ/c6OH/fBTyOg9yMd6JDaSCmDYVUs50tI5YA=; b=Zdhz/6PXV1CJxD6+P198NGgMIPRHOjZSnv1C+ReWuYKoY7tzVhXkKOxWI7Q60YnrPkkFdA6rBdHfnQto+SRn2CrY3zhRygFRIqADv0KvbYFS2h+EN1HYoIKioPpX9nVnBtICYJbtywTewvGdMcxrE/M2tm1XfINMDE+2BDTg4fA= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1557504787339326.1468636694093; Fri, 10 May 2019 09:13:07 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hP87f-0004Vg-43; Fri, 10 May 2019 16:11:47 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hP87d-0004VU-EV for xen-devel@lists.xenproject.org; Fri, 10 May 2019 16:11:45 +0000 Received: from SMTP03.CITRIX.COM (unknown [162.221.156.55]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 4dc7a623-733e-11e9-8980-bc764e045a96; Fri, 10 May 2019 16:11:44 +0000 (UTC) X-Inumbo-ID: 4dc7a623-733e-11e9-8980-bc764e045a96 X-IronPort-AV: E=Sophos;i="5.60,453,1549929600"; d="scan'208";a="85330714" From: Roger Pau Monne To: Date: Fri, 10 May 2019 18:10:53 +0200 Message-ID: <20190510161056.48648-3-roger.pau@citrix.com> X-Mailer: git-send-email 2.17.2 (Apple Git-113) In-Reply-To: <20190510161056.48648-1-roger.pau@citrix.com> References: <20190510161056.48648-1-roger.pau@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH 2/5] pci: use function generation macros for pci_config_{write, read} X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Andrew Cooper , Wei Liu , Jan Beulich , Roger Pau Monne Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" This avoids code duplication between the helpers. No functional change intended. Signed-off-by: Roger Pau Monn=C3=A9 Reviewed-by: Jan Beulich --- Cc: Jan Beulich Cc: Andrew Cooper Cc: Wei Liu --- xen/arch/x86/x86_64/pci.c | 140 ++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 83 deletions(-) diff --git a/xen/arch/x86/x86_64/pci.c b/xen/arch/x86/x86_64/pci.c index 6e3f5cf203..4f77beb119 100644 --- a/xen/arch/x86/x86_64/pci.c +++ b/xen/arch/x86/x86_64/pci.c @@ -11,95 +11,69 @@ #define PCI_CONF_ADDRESS(bus, dev, func, reg) \ (0x80000000 | (bus << 16) | (dev << 11) | (func << 8) | (reg & ~3)) =20 -uint8_t pci_conf_read8( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg) -{ - u32 value; - - if ( seg || reg > 255 ) - { - pci_mmcfg_read(seg, bus, PCI_DEVFN(dev, func), reg, 1, &value); - return value; - } - else - { - BUG_ON((bus > 255) || (dev > 31) || (func > 7)); - return pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & = 3, 1); +#define GEN_PCI_CONF_READ(s) = \ + uint ## s ## _t pci_conf_read ## s (unsigned int seg, unsigned int bus= , \ + unsigned int dev, unsigned int fun= c, \ + unsigned int reg) = \ + { = \ + uint32_t value; = \ + = \ + BUILD_BUG_ON(s !=3D 8 && s !=3D 16 && s !=3D 32); = \ + if ( seg || reg > 255 ) = \ + pci_mmcfg_read(seg, bus, PCI_DEVFN(dev, func), reg, s / 8, &va= lue);\ + else = \ + { = \ + BUG_ON((bus > 255) || (dev > 31) || (func > 7)); = \ + value =3D pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg),= \ + reg & (4 - s / 8), s / 8); = \ + } = \ + = \ + return value; = \ } -} =20 -uint16_t pci_conf_read16( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg) -{ - u32 value; +/* Grep fodder */ +#define pci_conf_read8 +#define pci_conf_read16 +#define pci_conf_read32 =20 - if ( seg || reg > 255 ) - { - pci_mmcfg_read(seg, bus, PCI_DEVFN(dev, func), reg, 2, &value); - return value; - } - else - { - BUG_ON((bus > 255) || (dev > 31) || (func > 7)); - return pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & = 2, 2); - } -} +#undef pci_conf_read8 +#undef pci_conf_read16 +#undef pci_conf_read32 =20 -uint32_t pci_conf_read32( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg) -{ - u32 value; +GEN_PCI_CONF_READ(8) +GEN_PCI_CONF_READ(16) +GEN_PCI_CONF_READ(32) =20 - if ( seg || reg > 255 ) - { - pci_mmcfg_read(seg, bus, PCI_DEVFN(dev, func), reg, 4, &value); - return value; - } - else - { - BUG_ON((bus > 255) || (dev > 31) || (func > 7)); - return pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg), 0, 4); - } -} +#undef GEN_PCI_CONF_READ =20 -void pci_conf_write8( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg, uint8_t data) -{ - if ( seg || reg > 255 ) - pci_mmcfg_write(seg, bus, PCI_DEVFN(dev, func), reg, 1, data); - else - { - BUG_ON((bus > 255) || (dev > 31) || (func > 7)); - pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & 3, 1, = data); +#define GEN_PCI_CONF_WRITE(s) = \ + void pci_conf_write ## s (unsigned int seg, unsigned int bus, = \ + unsigned int dev, unsigned int func, = \ + unsigned int reg, uint ## s ## _t data) = \ + { = \ + BUILD_BUG_ON(s !=3D 8 && s !=3D 16 && s !=3D 32); = \ + if ( seg || reg > 255 ) = \ + pci_mmcfg_write(seg, bus, PCI_DEVFN(dev, func), reg, s / 8, da= ta); \ + else = \ + { = \ + BUG_ON((bus > 255) || (dev > 31) || (func > 7)); = \ + pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), = \ + reg & (4 - s / 8), s / 8, data); = \ + } = \ } -} =20 -void pci_conf_write16( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg, uint16_t data) -{ - if ( seg || reg > 255 ) - pci_mmcfg_write(seg, bus, PCI_DEVFN(dev, func), reg, 2, data); - else - { - BUG_ON((bus > 255) || (dev > 31) || (func > 7)); - pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & 2, 2, = data); - } -} +/* Grep fodder */ +#define pci_conf_write8 +#define pci_conf_write16 +#define pci_conf_write32 + +#undef pci_conf_write8 +#undef pci_conf_write16 +#undef pci_conf_write32 + +GEN_PCI_CONF_WRITE(8) +GEN_PCI_CONF_WRITE(16) +GEN_PCI_CONF_WRITE(32) + +#undef GEN_PCI_CONF_WRITE =20 -void pci_conf_write32( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg, uint32_t data) -{ - if ( seg || reg > 255 ) - pci_mmcfg_write(seg, bus, PCI_DEVFN(dev, func), reg, 4, data); - else - { - BUG_ON((bus > 255) || (dev > 31) || (func > 7)); - pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), 0, 4, data); - } -} --=20 2.17.2 (Apple Git-113) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Fri Mar 29 06:44:45 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1557504811; cv=none; d=zoho.com; s=zohoarc; b=LeyqtHnFdlgUqgJaJAEb5+pKqV+0mr53sKI4FTdwNqoVUjSbEvnOtLM9OioSlBknrfwhXItfzcF5G5+l0YKinFeQXE1C6DrcQjVgD1DLjJfhm9NLLEfxqWoozPIdCJYYxO15IhS4Vqu9oNaRP59qicMh+ERYDNp1u7Qod9DF40k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1557504811; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=ki1AcY1iE3JJOtiz8YZ6jMyINLbSEqKSbEZWZStidRQ=; b=YzpZQxUwd5DUZ0mUccDhywyz82HaVlmduYKJvOwL3Wptv+VfUUn3HRzaJceeu4LJyCfC+SDqwfx6ctWwdyTtIjo1XoRxoQliL8LBv6KNfNCIVqJTRLNXV9c9Jl0Q7TGB1djuDabez9OlPdn9r818FcksPmVpuuz85Om2I/lsPyU= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1557504811534529.7682048008924; Fri, 10 May 2019 09:13:31 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hP87s-0004aT-3F; Fri, 10 May 2019 16:12:00 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hP87q-0004Zu-HX for xen-devel@lists.xenproject.org; Fri, 10 May 2019 16:11:58 +0000 Received: from SMTP03.CITRIX.COM (unknown [162.221.156.55]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 53189c88-733e-11e9-8980-bc764e045a96; Fri, 10 May 2019 16:11:53 +0000 (UTC) X-Inumbo-ID: 53189c88-733e-11e9-8980-bc764e045a96 X-IronPort-AV: E=Sophos;i="5.60,453,1549929600"; d="scan'208";a="85330717" From: Roger Pau Monne To: Date: Fri, 10 May 2019 18:10:54 +0200 Message-ID: <20190510161056.48648-4-roger.pau@citrix.com> X-Mailer: git-send-email 2.17.2 (Apple Git-113) In-Reply-To: <20190510161056.48648-1-roger.pau@citrix.com> References: <20190510161056.48648-1-roger.pau@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH 3/5] pci: switch pci_conf_{read/write} to use pci_sbdf_t X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Kevin Tian , Stefano Stabellini , Wei Liu , Suravee Suthikulpanit , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich , Brian Woods , Roger Pau Monne Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" pci_dev already uses pci_sbdf_t, so propagate the usage of the type to pci_conf functions in order to shorten the calls when made from a pci_dev struct. No functional change intended. Signed-off-by: Roger Pau Monn=C3=A9 --- Cc: Jan Beulich Cc: Andrew Cooper Cc: Wei Liu Cc: George Dunlap Cc: Ian Jackson Cc: Julien Grall Cc: Konrad Rzeszutek Wilk Cc: Stefano Stabellini Cc: Tim Deegan Cc: Suravee Suthikulpanit Cc: Brian Woods Cc: Kevin Tian --- xen/arch/x86/cpu/amd.c | 27 ++-- xen/arch/x86/dmi_scan.c | 9 +- xen/arch/x86/mm.c | 2 +- xen/arch/x86/msi.c | 177 +++++++++------------ xen/arch/x86/oprofile/op_model_athlon.c | 12 +- xen/arch/x86/x86_64/mmconf-fam10h.c | 13 +- xen/arch/x86/x86_64/mmconfig-shared.c | 26 +-- xen/arch/x86/x86_64/pci.c | 32 ++-- xen/drivers/acpi/reboot.c | 8 +- xen/drivers/char/ehci-dbgp.c | 75 +++++---- xen/drivers/char/ns16550.c | 80 +++++----- xen/drivers/passthrough/amd/iommu_detect.c | 3 +- xen/drivers/passthrough/amd/iommu_init.c | 26 +-- xen/drivers/passthrough/ats.h | 4 +- xen/drivers/passthrough/pci.c | 106 +++++------- xen/drivers/passthrough/vtd/dmar.c | 18 ++- xen/drivers/passthrough/vtd/quirks.c | 69 ++++---- xen/drivers/passthrough/x86/ats.c | 15 +- xen/drivers/pci/pci.c | 43 +++-- xen/drivers/video/vga.c | 21 +-- xen/drivers/vpci/header.c | 53 ++---- xen/drivers/vpci/msi.c | 6 +- xen/drivers/vpci/msix.c | 12 +- xen/drivers/vpci/vpci.c | 42 ++--- xen/include/xen/pci.h | 29 ++-- 25 files changed, 444 insertions(+), 464 deletions(-) diff --git a/xen/arch/x86/cpu/amd.c b/xen/arch/x86/cpu/amd.c index e19a5ead3e..014d88925c 100644 --- a/xen/arch/x86/cpu/amd.c +++ b/xen/arch/x86/cpu/amd.c @@ -417,15 +417,21 @@ static void disable_c1_ramping(void) int node, nr_nodes; =20 /* Read the number of nodes from the first Northbridge. */ - nr_nodes =3D ((pci_conf_read32(0, 0, 0x18, 0x0, 0x60)>>4)&0x07)+1; + nr_nodes =3D ((pci_conf_read32(PCI_SBDF_T(0, 0, 0x18, 0), + 0x60)>>4)&0x07)+1; for (node =3D 0; node < nr_nodes; node++) { + const pci_sbdf_t sbdf =3D { + .dev =3D 0x18 + node, + .func =3D 0x3 + }; + /* PMM7: bus=3D0, dev=3D0x18+node, function=3D0x3, register=3D0x87. */ - pmm7 =3D pci_conf_read8(0, 0, 0x18+node, 0x3, 0x87); + pmm7 =3D pci_conf_read8(sbdf, 0x87); /* Invalid read means we've updated every Northbridge. */ if (pmm7 =3D=3D 0xFF) break; pmm7 &=3D 0xFC; /* clear pmm7[1:0] */ - pci_conf_write8(0, 0, 0x18+node, 0x3, 0x87, pmm7); + pci_conf_write8(sbdf, 0x87, pmm7); printk ("AMD: Disabling C1 Clock Ramping Node #%x\n", node); } } @@ -696,8 +702,13 @@ static void init_amd(struct cpuinfo_x86 *c) =20 if (c->x86 =3D=3D 0x16 && c->x86_model <=3D 0xf) { if (c =3D=3D &boot_cpu_data) { - l =3D pci_conf_read32(0, 0, 0x18, 0x3, 0x58); - h =3D pci_conf_read32(0, 0, 0x18, 0x3, 0x5c); + const pci_sbdf_t sbdf =3D { + .dev =3D 0x18, + .func =3D 0x3, + }; + + l =3D pci_conf_read32(sbdf, 0x58); + h =3D pci_conf_read32(sbdf, 0x5c); if ((l & 0x1f) | (h & 0x1)) printk(KERN_WARNING "Applying workaround for erratum 792: %s%s%s\n", @@ -706,12 +717,10 @@ static void init_amd(struct cpuinfo_x86 *c) (h & 0x1) ? "clearing D18F3x5C[0]" : ""); =20 if (l & 0x1f) - pci_conf_write32(0, 0, 0x18, 0x3, 0x58, - l & ~0x1f); + pci_conf_write32(sbdf, 0x58, l & ~0x1f); =20 if (h & 0x1) - pci_conf_write32(0, 0, 0x18, 0x3, 0x5c, - h & ~0x1); + pci_conf_write32(sbdf, 0x5c, h & ~0x1); } =20 rdmsrl(MSR_AMD64_LS_CFG, value); diff --git a/xen/arch/x86/dmi_scan.c b/xen/arch/x86/dmi_scan.c index fcdf2d3952..59557fa57b 100644 --- a/xen/arch/x86/dmi_scan.c +++ b/xen/arch/x86/dmi_scan.c @@ -468,16 +468,19 @@ static __init int broken_toshiba_keyboard(struct dmi_= blacklist *d) static int __init ich10_bios_quirk(struct dmi_system_id *d) { u32 port, smictl; + const pci_sbdf_t sbdf =3D { + .dev =3D 0x1f, + }; =20 - if ( pci_conf_read16(0, 0, 0x1f, 0, PCI_VENDOR_ID) !=3D 0x8086 ) + if ( pci_conf_read16(sbdf, PCI_VENDOR_ID) !=3D 0x8086 ) return 0; =20 - switch ( pci_conf_read16(0, 0, 0x1f, 0, PCI_DEVICE_ID) ) { + switch ( pci_conf_read16(sbdf, PCI_DEVICE_ID) ) { case 0x3a14: case 0x3a16: case 0x3a18: case 0x3a1a: - port =3D (pci_conf_read16(0, 0, 0x1f, 0, 0x40) & 0xff80) + 0x30; + port =3D (pci_conf_read16(sbdf, 0x40) & 0xff80) + 0x30; smictl =3D inl(port); /* turn off LEGACY_USB{,2}_EN if enabled */ if ( smictl & 0x20008 ) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 45fadbab61..37d8141ed2 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -5984,7 +5984,7 @@ const struct platform_bad_page *__init get_platform_b= adpages(unsigned int *array } =20 *array_size =3D ARRAY_SIZE(snb_bad_pages); - igd_id =3D pci_conf_read32(0, 0, 2, 0, 0); + igd_id =3D pci_conf_read32(PCI_SBDF_T(0, 0, 2, 0), 0); if ( IS_SNB_GFX(igd_id) ) return snb_bad_pages; =20 diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index f30f592ee2..ad4a72d56b 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -124,29 +124,20 @@ static void msix_put_fixmap(struct arch_msix *msix, i= nt idx) =20 static bool memory_decoded(const struct pci_dev *dev) { - uint8_t bus, slot, func; + pci_sbdf_t sbdf =3D dev->sbdf; =20 - if ( !dev->info.is_virtfn ) + if ( dev->info.is_virtfn ) { - bus =3D dev->sbdf.bus; - slot =3D dev->sbdf.dev; - func =3D dev->sbdf.func; - } - else - { - bus =3D dev->info.physfn.bus; - slot =3D PCI_SLOT(dev->info.physfn.devfn); - func =3D PCI_FUNC(dev->info.physfn.devfn); + sbdf.bus =3D dev->info.physfn.bus; + sbdf.extfunc =3D dev->info.physfn.devfn; } =20 - return !!(pci_conf_read16(dev->sbdf.seg, bus, slot, func, PCI_COMMAND)= & - PCI_COMMAND_MEMORY); + return !!(pci_conf_read16(sbdf, PCI_COMMAND) & PCI_COMMAND_MEMORY); } =20 static bool msix_memory_decoded(const struct pci_dev *dev, unsigned int po= s) { - u16 control =3D pci_conf_read16(dev->sbdf.seg, dev->sbdf.bus, dev->sbd= f.dev, - dev->sbdf.func, msix_control_reg(pos)); + u16 control =3D pci_conf_read16(dev->sbdf, msix_control_reg(pos)); =20 if ( !(control & PCI_MSIX_FLAGS_ENABLE) ) return false; @@ -200,25 +191,20 @@ static bool read_msi_msg(struct msi_desc *entry, stru= ct msi_msg *msg) { struct pci_dev *dev =3D entry->dev; int pos =3D entry->msi_attrib.pos; - uint16_t data, seg =3D dev->sbdf.seg; - uint8_t bus =3D dev->sbdf.bus; - uint8_t slot =3D dev->sbdf.dev; - uint8_t func =3D dev->sbdf.func; + uint16_t data; =20 - msg->address_lo =3D pci_conf_read32(seg, bus, slot, func, + msg->address_lo =3D pci_conf_read32(dev->sbdf, msi_lower_address_reg(pos)); if ( entry->msi_attrib.is_64 ) { - msg->address_hi =3D pci_conf_read32(seg, bus, slot, func, + msg->address_hi =3D pci_conf_read32(dev->sbdf, msi_upper_address_reg(pos)); - data =3D pci_conf_read16(seg, bus, slot, func, - msi_data_reg(pos, 1)); + data =3D pci_conf_read16(dev->sbdf, msi_data_reg(pos, 1)); } else { msg->address_hi =3D 0; - data =3D pci_conf_read16(seg, bus, slot, func, - msi_data_reg(pos, 0)); + data =3D pci_conf_read16(dev->sbdf, msi_data_reg(pos, 0)); } msg->data =3D data; break; @@ -265,28 +251,22 @@ static int write_msi_msg(struct msi_desc *entry, stru= ct msi_msg *msg) { struct pci_dev *dev =3D entry->dev; int pos =3D entry->msi_attrib.pos; - uint16_t seg =3D dev->sbdf.seg; - uint8_t bus =3D dev->sbdf.bus; - uint8_t slot =3D dev->sbdf.dev; - uint8_t func =3D dev->sbdf.func; int nr =3D entry->msi_attrib.entry_nr; =20 ASSERT((msg->data & (entry[-nr].msi.nvec - 1)) =3D=3D nr); if ( nr ) return 0; =20 - pci_conf_write32(seg, bus, slot, func, msi_lower_address_reg(pos), - msg->address_lo); + pci_conf_write32(dev->sbdf, msi_lower_address_reg(pos), msg->addre= ss_lo); if ( entry->msi_attrib.is_64 ) { - pci_conf_write32(seg, bus, slot, func, msi_upper_address_reg(p= os), + pci_conf_write32(dev->sbdf, msi_upper_address_reg(pos), msg->address_hi); - pci_conf_write16(seg, bus, slot, func, msi_data_reg(pos, 1), + pci_conf_write16(dev->sbdf, msi_data_reg(pos, 1), msg->data); } else - pci_conf_write16(seg, bus, slot, func, msi_data_reg(pos, 0), - msg->data); + pci_conf_write16(dev->sbdf, msi_data_reg(pos, 0), msg->data); break; } case PCI_CAP_ID_MSIX: @@ -337,12 +317,18 @@ void set_msi_affinity(struct irq_desc *desc, const cp= umask_t *mask) =20 void __msi_set_enable(u16 seg, u8 bus, u8 slot, u8 func, int pos, int enab= le) { - u16 control =3D pci_conf_read16(seg, bus, slot, func, pos + PCI_MSI_FL= AGS); + const pci_sbdf_t sbdf =3D { + .seg =3D seg, + .bus =3D bus, + .dev =3D slot, + .func =3D func, + }; + uint16_t control =3D pci_conf_read16(sbdf, pos + PCI_MSI_FLAGS); =20 control &=3D ~PCI_MSI_FLAGS_ENABLE; if ( enable ) control |=3D PCI_MSI_FLAGS_ENABLE; - pci_conf_write16(seg, bus, slot, func, pos + PCI_MSI_FLAGS, control); + pci_conf_write16(sbdf, pos + PCI_MSI_FLAGS, control); } =20 static void msi_set_enable(struct pci_dev *dev, int enable) @@ -369,11 +355,11 @@ static void msix_set_enable(struct pci_dev *dev, int = enable) pos =3D pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSIX); if ( pos ) { - control =3D pci_conf_read16(seg, bus, slot, func, msix_control_reg= (pos)); + control =3D pci_conf_read16(dev->sbdf, msix_control_reg(pos)); control &=3D ~PCI_MSIX_FLAGS_ENABLE; if ( enable ) control |=3D PCI_MSIX_FLAGS_ENABLE; - pci_conf_write16(seg, bus, slot, func, msix_control_reg(pos), cont= rol); + pci_conf_write16(dev->sbdf, msix_control_reg(pos), control); } } =20 @@ -406,20 +392,20 @@ static bool msi_set_mask_bit(struct irq_desc *desc, b= ool host, bool guest) { u32 mask_bits; =20 - mask_bits =3D pci_conf_read32(seg, bus, slot, func, entry->msi= .mpos); + mask_bits =3D pci_conf_read32(pdev->sbdf, entry->msi.mpos); mask_bits &=3D ~((u32)1 << entry->msi_attrib.entry_nr); mask_bits |=3D (u32)flag << entry->msi_attrib.entry_nr; - pci_conf_write32(seg, bus, slot, func, entry->msi.mpos, mask_b= its); + pci_conf_write32(pdev->sbdf, entry->msi.mpos, mask_bits); } break; case PCI_CAP_ID_MSIX: maskall =3D pdev->msix->host_maskall; - control =3D pci_conf_read16(seg, bus, slot, func, + control =3D pci_conf_read16(pdev->sbdf, msix_control_reg(entry->msi_attrib.pos)); if ( unlikely(!(control & PCI_MSIX_FLAGS_ENABLE)) ) { pdev->msix->host_maskall =3D 1; - pci_conf_write16(seg, bus, slot, func, + pci_conf_write16(pdev->sbdf, msix_control_reg(entry->msi_attrib.pos), control | (PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL)); @@ -453,7 +439,7 @@ static bool msi_set_mask_bit(struct irq_desc *desc, boo= l host, bool guest) pdev->msix->host_maskall =3D maskall; if ( maskall || pdev->msix->guest_maskall ) control |=3D PCI_MSIX_FLAGS_MASKALL; - pci_conf_write16(seg, bus, slot, func, + pci_conf_write16(pdev->sbdf, msix_control_reg(entry->msi_attrib.pos), control); return flag; default: @@ -475,9 +461,7 @@ static int msi_get_mask_bit(const struct msi_desc *entr= y) case PCI_CAP_ID_MSI: if ( !entry->msi_attrib.maskbit ) break; - return (pci_conf_read32(entry->dev->sbdf.seg, entry->dev->sbdf.bus, - entry->dev->sbdf.dev, entry->dev->sbdf.fun= c, - entry->msi.mpos) >> + return (pci_conf_read32(entry->dev->sbdf, entry->msi.mpos) >> entry->msi_attrib.entry_nr) & 1; case PCI_CAP_ID_MSIX: if ( unlikely(!msix_memory_decoded(entry->dev, @@ -593,11 +577,9 @@ int setup_msi_irq(struct irq_desc *desc, struct msi_de= sc *msidesc) =20 if ( msidesc->msi_attrib.type =3D=3D PCI_CAP_ID_MSIX ) { - control =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, - pdev->sbdf.dev, pdev->sbdf.func, cpos); + control =3D pci_conf_read16(pdev->sbdf, cpos); if ( !(control & PCI_MSIX_FLAGS_ENABLE) ) - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.de= v, - pdev->sbdf.func, cpos, + pci_conf_write16(pdev->sbdf, cpos, control | (PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL)); } @@ -607,8 +589,7 @@ int setup_msi_irq(struct irq_desc *desc, struct msi_des= c *msidesc) : &pci_msi_nonmaskable); =20 if ( !(control & PCI_MSIX_FLAGS_ENABLE) ) - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, cpos, control); + pci_conf_write16(pdev->sbdf, cpos, control); =20 return rc; } @@ -697,7 +678,7 @@ static int msi_capability_init(struct pci_dev *dev, pos =3D pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSI); if ( !pos ) return -ENODEV; - control =3D pci_conf_read16(seg, bus, slot, func, msi_control_reg(pos)= ); + control =3D pci_conf_read16(dev->sbdf, msi_control_reg(pos)); maxvec =3D multi_msi_capable(control); if ( nvec > maxvec ) return maxvec; @@ -733,9 +714,9 @@ static int msi_capability_init(struct pci_dev *dev, u32 maskbits; =20 /* All MSIs are unmasked by default, Mask them all */ - maskbits =3D pci_conf_read32(seg, bus, slot, func, mpos); + maskbits =3D pci_conf_read32(dev->sbdf, mpos); maskbits |=3D ~(u32)0 >> (32 - maxvec); - pci_conf_write32(seg, bus, slot, func, mpos, maskbits); + pci_conf_write32(dev->sbdf, mpos, maskbits); } list_add_tail(&entry->list, &dev->msi_list); =20 @@ -751,7 +732,7 @@ static int msi_capability_init(struct pci_dev *dev, pci_intx(dev, false); control |=3D PCI_MSI_FLAGS_ENABLE; } - pci_conf_write16(seg, bus, slot, func, msi_control_reg(pos), control); + pci_conf_write16(dev->sbdf, msi_control_reg(pos), control); =20 return 0; } @@ -761,6 +742,12 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, = u8 func, u8 bir, int vf) u8 limit; u32 addr, base =3D PCI_BASE_ADDRESS_0; u64 disp =3D 0; + const pci_sbdf_t sbdf =3D { + .seg =3D seg, + .bus =3D bus, + .dev =3D slot, + .func =3D func, + }; =20 if ( vf >=3D 0 ) { @@ -768,13 +755,10 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot,= u8 func, u8 bir, int vf) unsigned int pos =3D pci_find_ext_capability(seg, bus, PCI_DEVFN(slot, func), PCI_EXT_CAP_ID_SRIOV); - u16 ctrl =3D pci_conf_read16(seg, bus, slot, func, pos + PCI_SRIOV= _CTRL); - u16 num_vf =3D pci_conf_read16(seg, bus, slot, func, - pos + PCI_SRIOV_NUM_VF); - u16 offset =3D pci_conf_read16(seg, bus, slot, func, - pos + PCI_SRIOV_VF_OFFSET); - u16 stride =3D pci_conf_read16(seg, bus, slot, func, - pos + PCI_SRIOV_VF_STRIDE); + u16 ctrl =3D pci_conf_read16(sbdf, pos + PCI_SRIOV_CTRL); + u16 num_vf =3D pci_conf_read16(sbdf, pos + PCI_SRIOV_NUM_VF); + u16 offset =3D pci_conf_read16(sbdf, pos + PCI_SRIOV_VF_OFFSET); + u16 stride =3D pci_conf_read16(sbdf, pos + PCI_SRIOV_VF_STRIDE); =20 if ( !pdev || !pos || !(ctrl & PCI_SRIOV_CTRL_VFE) || @@ -799,8 +783,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, u= 8 func, u8 bir, int vf) disp =3D vf * pdev->vf_rlen[bir]; limit =3D PCI_SRIOV_NUM_BARS; } - else switch ( pci_conf_read8(seg, bus, slot, func, - PCI_HEADER_TYPE) & 0x7f ) + else switch ( pci_conf_read8(sbdf, PCI_HEADER_TYPE) & 0x7f ) { case PCI_HEADER_TYPE_NORMAL: limit =3D 6; @@ -817,7 +800,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, u= 8 func, u8 bir, int vf) =20 if ( bir >=3D limit ) return 0; - addr =3D pci_conf_read32(seg, bus, slot, func, base + bir * 4); + addr =3D pci_conf_read32(sbdf, base + bir * 4); if ( (addr & PCI_BASE_ADDRESS_SPACE) =3D=3D PCI_BASE_ADDRESS_SPACE_IO ) return 0; if ( (addr & PCI_BASE_ADDRESS_MEM_TYPE_MASK) =3D=3D PCI_BASE_ADDRESS_M= EM_TYPE_64 ) @@ -826,8 +809,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, u= 8 func, u8 bir, int vf) if ( ++bir >=3D limit ) return 0; return addr + disp + - ((u64)pci_conf_read32(seg, bus, slot, func, - base + bir * 4) << 32); + ((uint64_t)pci_conf_read32(sbdf, base + bir * 4) << 32); } return (addr & PCI_BASE_ADDRESS_MEM_MASK) + disp; } @@ -863,7 +845,7 @@ static int msix_capability_init(struct pci_dev *dev, =20 ASSERT(pcidevs_locked()); =20 - control =3D pci_conf_read16(seg, bus, slot, func, msix_control_reg(pos= )); + control =3D pci_conf_read16(dev->sbdf, msix_control_reg(pos)); /* * Ensure MSI-X interrupts are masked during setup. Some devices requi= re * MSI-X to be enabled before we can touch the MSI-X registers. We need @@ -871,13 +853,13 @@ static int msix_capability_init(struct pci_dev *dev, * fully set up. */ msix->host_maskall =3D 1; - pci_conf_write16(seg, bus, slot, func, msix_control_reg(pos), + pci_conf_write16(dev->sbdf, msix_control_reg(pos), control | (PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL)); =20 if ( unlikely(!memory_decoded(dev)) ) { - pci_conf_write16(seg, bus, slot, func, msix_control_reg(pos), + pci_conf_write16(dev->sbdf, msix_control_reg(pos), control & ~PCI_MSIX_FLAGS_ENABLE); return -ENXIO; } @@ -887,7 +869,7 @@ static int msix_capability_init(struct pci_dev *dev, entry =3D alloc_msi_entry(1); if ( !entry ) { - pci_conf_write16(seg, bus, slot, func, msix_control_reg(pos), + pci_conf_write16(dev->sbdf, msix_control_reg(pos), control & ~PCI_MSIX_FLAGS_ENABLE); return -ENOMEM; } @@ -895,8 +877,7 @@ static int msix_capability_init(struct pci_dev *dev, } =20 /* Locate MSI-X table region */ - table_offset =3D pci_conf_read32(seg, bus, slot, func, - msix_table_offset_reg(pos)); + table_offset =3D pci_conf_read32(dev->sbdf, msix_table_offset_reg(pos)= ); bir =3D (u8)(table_offset & PCI_MSIX_BIRMASK); table_offset &=3D ~PCI_MSIX_BIRMASK; =20 @@ -921,7 +902,7 @@ static int msix_capability_init(struct pci_dev *dev, { if ( !msi || !msi->table_base ) { - pci_conf_write16(seg, bus, slot, func, msix_control_reg(pos), + pci_conf_write16(dev->sbdf, msix_control_reg(pos), control & ~PCI_MSIX_FLAGS_ENABLE); xfree(entry); return -ENXIO; @@ -942,8 +923,7 @@ static int msix_capability_init(struct pci_dev *dev, WARN_ON(rangeset_overlaps_range(mmio_ro_ranges, msix->table.first, msix->table.last)); =20 - pba_offset =3D pci_conf_read32(seg, bus, slot, func, - msix_pba_offset_reg(pos)); + pba_offset =3D pci_conf_read32(dev->sbdf, msix_pba_offset_reg(pos)= ); bir =3D (u8)(pba_offset & PCI_MSIX_BIRMASK); pba_paddr =3D read_pci_mem_bar(seg, pbus, pslot, pfunc, bir, vf); WARN_ON(!pba_paddr); @@ -965,7 +945,7 @@ static int msix_capability_init(struct pci_dev *dev, =20 if ( idx < 0 ) { - pci_conf_write16(seg, bus, slot, func, msix_control_reg(pos), + pci_conf_write16(dev->sbdf, msix_control_reg(pos), control & ~PCI_MSIX_FLAGS_ENABLE); xfree(entry); return idx; @@ -1041,7 +1021,7 @@ static int msix_capability_init(struct pci_dev *dev, maskall =3D 0; } msix->host_maskall =3D maskall; - pci_conf_write16(seg, bus, slot, func, msix_control_reg(pos), control); + pci_conf_write16(dev->sbdf, msix_control_reg(pos), control); =20 return 0; } @@ -1130,8 +1110,7 @@ static int __pci_enable_msix(struct msi_info *msi, st= ruct msi_desc **desc) if ( !pdev || !pos ) return -ENODEV; =20 - control =3D pci_conf_read16(msi->seg, msi->bus, slot, func, - msix_control_reg(pos)); + control =3D pci_conf_read16(pdev->sbdf, msix_control_reg(pos)); nr_entries =3D multi_msix_capable(control); if ( msi->entry_nr >=3D nr_entries ) return -EINVAL; @@ -1177,14 +1156,14 @@ static void __pci_disable_msix(struct msi_desc *ent= ry) uint8_t func =3D dev->sbdf.func; unsigned int pos =3D pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSIX); - u16 control =3D pci_conf_read16(seg, bus, slot, func, - msix_control_reg(entry->msi_attrib.pos)); + uint16_t control =3D pci_conf_read16(dev->sbdf, + msix_control_reg(entry->msi_attrib.= pos)); bool maskall =3D dev->msix->host_maskall; =20 if ( unlikely(!(control & PCI_MSIX_FLAGS_ENABLE)) ) { dev->msix->host_maskall =3D 1; - pci_conf_write16(seg, bus, slot, func, msix_control_reg(pos), + pci_conf_write16(dev->sbdf, msix_control_reg(pos), control | (PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL)); } @@ -1203,7 +1182,7 @@ static void __pci_disable_msix(struct msi_desc *entry) dev->msix->host_maskall =3D maskall; if ( maskall || dev->msix->guest_maskall ) control |=3D PCI_MSIX_FLAGS_MASKALL; - pci_conf_write16(seg, bus, slot, func, msix_control_reg(pos), control); + pci_conf_write16(dev->sbdf, msix_control_reg(pos), control); =20 _pci_cleanup_msix(dev->msix); } @@ -1235,8 +1214,7 @@ int pci_prepare_msix(u16 seg, u8 bus, u8 devfn, bool = off) } else { - u16 control =3D pci_conf_read16(seg, bus, slot, func, - msix_control_reg(pos)); + uint16_t control =3D pci_conf_read16(pdev->sbdf, msix_control_reg(= pos)); =20 rc =3D msix_capability_init(pdev, pos, NULL, NULL, multi_msix_capable(control)); @@ -1337,7 +1315,7 @@ int pci_msi_conf_write_intercept(struct pci_dev *pdev= , unsigned int reg, if ( reg < entry->msi.mpos || reg >=3D entry->msi.mpos + 4 || size= !=3D 4 ) return -EACCES; =20 - cntl =3D pci_conf_read16(seg, bus, slot, func, msi_control_reg(pos= )); + cntl =3D pci_conf_read16(pdev->sbdf, msi_control_reg(pos)); unused =3D ~(uint32_t)0 >> (32 - multi_msi_capable(cntl)); for ( pos =3D 0; pos < entry->msi.nvec; ++pos, ++entry ) { @@ -1396,8 +1374,7 @@ int pci_restore_msi_state(struct pci_dev *pdev) pdev->sbdf.seg, pdev->sbdf.bus, slot, func, i); spin_unlock_irqrestore(&desc->lock, flags); if ( type =3D=3D PCI_CAP_ID_MSIX ) - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, slot, fun= c, - msix_control_reg(pos), + pci_conf_write16(pdev->sbdf, msix_control_reg(pos), control & ~PCI_MSIX_FLAGS_ENABLE); return -EINVAL; } @@ -1411,17 +1388,14 @@ int pci_restore_msi_state(struct pci_dev *pdev) } else if ( !type && entry->msi_attrib.type =3D=3D PCI_CAP_ID_MSIX ) { - control =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, sl= ot, - func, msix_control_reg(pos)); - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, slot, func, - msix_control_reg(pos), + control =3D pci_conf_read16(pdev->sbdf, msix_control_reg(pos)); + pci_conf_write16(pdev->sbdf, msix_control_reg(pos), control | (PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL)); if ( unlikely(!memory_decoded(pdev)) ) { spin_unlock_irqrestore(&desc->lock, flags); - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, slot, fun= c, - msix_control_reg(pos), + pci_conf_write16(pdev->sbdf, msix_control_reg(pos), control & ~PCI_MSIX_FLAGS_ENABLE); return -ENXIO; } @@ -1454,19 +1428,16 @@ int pci_restore_msi_state(struct pci_dev *pdev) { unsigned int cpos =3D msi_control_reg(pos); =20 - control =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, sl= ot, - func, cpos) & ~PCI_MSI_FLAGS_QSIZE; + control =3D pci_conf_read16(pdev->sbdf, cpos) & ~PCI_MSI_FLAGS= _QSIZE; multi_msi_enable(control, entry->msi.nvec); - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, slot, func, c= pos, - control); + pci_conf_write16(pdev->sbdf, cpos, control); =20 msi_set_enable(pdev, 1); } } =20 if ( type =3D=3D PCI_CAP_ID_MSIX ) - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, slot, func, - msix_control_reg(pos), + pci_conf_write16(pdev->sbdf, msix_control_reg(pos), control | PCI_MSIX_FLAGS_ENABLE); =20 return 0; diff --git a/xen/arch/x86/oprofile/op_model_athlon.c b/xen/arch/x86/oprofil= e/op_model_athlon.c index 3d6e26f636..33f7394979 100644 --- a/xen/arch/x86/oprofile/op_model_athlon.c +++ b/xen/arch/x86/oprofile/op_model_athlon.c @@ -463,7 +463,13 @@ static int __init init_ibs_nmi(void) for (bus =3D 0; bus < 256; bus++) { for (dev =3D 0; dev < 32; dev++) { for (func =3D 0; func < 8; func++) { - id =3D pci_conf_read32(0, bus, dev, func, PCI_VENDOR_ID); + const pci_sbdf_t sbdf =3D { + .bus =3D bus, + .dev =3D dev, + .func =3D func, + }; + =20 + id =3D pci_conf_read32(sbdf, PCI_VENDOR_ID); =20 vendor_id =3D id & 0xffff; dev_id =3D (id >> 16) & 0xffff; @@ -471,10 +477,10 @@ static int __init init_ibs_nmi(void) if ((vendor_id =3D=3D PCI_VENDOR_ID_AMD) && (dev_id =3D=3D PCI_DEVICE_ID_AMD_10H_NB_MISC)) { =20 - pci_conf_write32(0, bus, dev, func, IBSCTL, + pci_conf_write32(sbdf, IBSCTL, IBSCTL_LVTOFFSETVAL | APIC_EILVT_LVTOFF_IBS); =20 - value =3D pci_conf_read32(0, bus, dev, func, IBSCTL); + value =3D pci_conf_read32(sbdf, IBSCTL); =20 if (value !=3D (IBSCTL_LVTOFFSETVAL | APIC_EILVT_LVTOFF_IBS)) { diff --git a/xen/arch/x86/x86_64/mmconf-fam10h.c b/xen/arch/x86/x86_64/mmco= nf-fam10h.c index ed0acb9968..e7f02de894 100644 --- a/xen/arch/x86/x86_64/mmconf-fam10h.c +++ b/xen/arch/x86/x86_64/mmconf-fam10h.c @@ -38,21 +38,22 @@ static struct pci_hostbridge_probe pci_probes[] =3D { #define BASE_VALID(b) ((b) + SIZE <=3D (0xfdULL<<32) || (b) >=3D (1ULL<<40= )) static void __init get_fam10h_pci_mmconf_base(void) { - unsigned int i, j, bus, slot, hi_mmio_num; + unsigned int i, j, hi_mmio_num; u32 address; u64 val, tom2, start, end; struct range { u64 start, end; } range[8]; + pci_sbdf_t sbdf =3D { }; =20 for (i =3D 0; i < ARRAY_SIZE(pci_probes); i++) { u32 id; u16 device; u16 vendor; =20 - bus =3D pci_probes[i].bus; - slot =3D pci_probes[i].slot; - id =3D pci_conf_read32(0, bus, slot, 0, PCI_VENDOR_ID); + sbdf.bus =3D pci_probes[i].bus; + sbdf.dev =3D pci_probes[i].slot; + id =3D pci_conf_read32(sbdf, PCI_VENDOR_ID); =20 vendor =3D id & 0xffff; device =3D (id>>16) & 0xffff; @@ -83,12 +84,12 @@ static void __init get_fam10h_pci_mmconf_base(void) * above 4G */ for (hi_mmio_num =3D i =3D 0; i < 8; i++) { - val =3D pci_conf_read32(0, bus, slot, 1, 0x80 + (i << 3)); + val =3D pci_conf_read32(sbdf, 0x80 + (i << 3)); if (!(val & 3)) continue; =20 start =3D (val & 0xffffff00) << 8; /* 39:16 on 31:8*/ - val =3D pci_conf_read32(0, bus, slot, 1, 0x84 + (i << 3)); + val =3D pci_conf_read32(sbdf, 0x84 + (i << 3)); end =3D ((val & 0xffffff00) << 8) | 0xffff; /* 39:16 on 31:8*/ =20 if (end < tom2) diff --git a/xen/arch/x86/x86_64/mmconfig-shared.c b/xen/arch/x86/x86_64/mm= config-shared.c index 9e1c81dcd2..284a788fcd 100644 --- a/xen/arch/x86/x86_64/mmconfig-shared.c +++ b/xen/arch/x86/x86_64/mmconfig-shared.c @@ -63,10 +63,8 @@ custom_param("mmcfg", parse_mmcfg); =20 static const char __init *pci_mmcfg_e7520(void) { - u32 win; - win =3D pci_conf_read16(0, 0, 0, 0, 0xce); + uint32_t win =3D pci_conf_read16(PCI_SBDF_T(0, 0, 0, 0), 0xce) & 0xf00= 0; =20 - win =3D win & 0xf000; if(win =3D=3D 0x0000 || win =3D=3D 0xf000) pci_mmcfg_config_num =3D 0; else { @@ -89,7 +87,7 @@ static const char __init *pci_mmcfg_intel_945(void) =20 pci_mmcfg_config_num =3D 1; =20 - pciexbar =3D pci_conf_read32(0, 0, 0, 0, 0x48); + pciexbar =3D pci_conf_read32(PCI_SBDF_T(0, 0, 0, 0), 0x48); =20 /* Enable bit */ if (!(pciexbar & 1)) @@ -212,15 +210,18 @@ static const char __init *pci_mmcfg_nvidia_mcp55(void) for (i =3D bus =3D 0; bus < 256; bus++) { u32 l, extcfg; u16 vendor, device; + const pci_sbdf_t sbdf =3D { + .bus =3D bus, + }; =20 - l =3D pci_conf_read32(0, bus, 0, 0, 0); + l =3D pci_conf_read32(sbdf, 0); vendor =3D l & 0xffff; device =3D (l >> 16) & 0xffff; =20 if (PCI_VENDOR_ID_NVIDIA !=3D vendor || 0x0369 !=3D device) continue; =20 - extcfg =3D pci_conf_read32(0, bus, 0, 0, extcfg_regnum); + extcfg =3D pci_conf_read32(sbdf, extcfg_regnum); =20 if (extcfg & extcfg_enable_mask) i++; @@ -238,15 +239,18 @@ static const char __init *pci_mmcfg_nvidia_mcp55(void) u32 l, extcfg; u16 vendor, device; int size_index; + const pci_sbdf_t sbdf =3D { + .bus =3D bus, + }; =20 - l =3D pci_conf_read32(0, bus, 0, 0, 0); + l =3D pci_conf_read32(sbdf, 0); vendor =3D l & 0xffff; device =3D (l >> 16) & 0xffff; =20 if (PCI_VENDOR_ID_NVIDIA !=3D vendor || 0x0369 !=3D device) continue; =20 - extcfg =3D pci_conf_read32(0, bus, 0, 0, extcfg_regnum); + extcfg =3D pci_conf_read32(sbdf, extcfg_regnum); =20 if (!(extcfg & extcfg_enable_mask)) continue; @@ -300,7 +304,6 @@ static struct pci_mmcfg_hostbridge_probe pci_mmcfg_prob= es[] __initdata =3D { static int __init pci_mmcfg_check_hostbridge(void) { u32 l; - u32 bus, devfn; u16 vendor, device; int i; const char *name; @@ -310,9 +313,8 @@ static int __init pci_mmcfg_check_hostbridge(void) name =3D NULL; =20 for (i =3D 0; !name && i < ARRAY_SIZE(pci_mmcfg_probes); i++) { - bus =3D pci_mmcfg_probes[i].bus; - devfn =3D pci_mmcfg_probes[i].devfn; - l =3D pci_conf_read32(0, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), 0); + l =3D pci_conf_read32(PCI_SBDF3_T(0, pci_mmcfg_probes[i].bus, + pci_mmcfg_probes[i].devfn), 0); vendor =3D l & 0xffff; device =3D (l >> 16) & 0xffff; =20 diff --git a/xen/arch/x86/x86_64/pci.c b/xen/arch/x86/x86_64/pci.c index 4f77beb119..342c2aa8e6 100644 --- a/xen/arch/x86/x86_64/pci.c +++ b/xen/arch/x86/x86_64/pci.c @@ -8,25 +8,20 @@ #include #include =20 -#define PCI_CONF_ADDRESS(bus, dev, func, reg) \ - (0x80000000 | (bus << 16) | (dev << 11) | (func << 8) | (reg & ~3)) +#define PCI_CONF_ADDRESS(bdf, reg) (0x80000000 | (bdf << 8) | (reg & ~3)) =20 #define GEN_PCI_CONF_READ(s) = \ - uint ## s ## _t pci_conf_read ## s (unsigned int seg, unsigned int bus= , \ - unsigned int dev, unsigned int fun= c, \ - unsigned int reg) = \ + uint ## s ## _t pci_conf_read ## s (pci_sbdf_t sbdf, unsigned int reg= ) \ { = \ uint32_t value; = \ = \ BUILD_BUG_ON(s !=3D 8 && s !=3D 16 && s !=3D 32); = \ - if ( seg || reg > 255 ) = \ - pci_mmcfg_read(seg, bus, PCI_DEVFN(dev, func), reg, s / 8, &va= lue);\ + if ( sbdf.seg || reg > 255 ) = \ + pci_mmcfg_read(sbdf.seg, sbdf.bus, sbdf.extfunc, reg, s / 8, = \ + &value); = \ else = \ - { = \ - BUG_ON((bus > 255) || (dev > 31) || (func > 7)); = \ - value =3D pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg),= \ + value =3D pci_conf_read(PCI_CONF_ADDRESS(sbdf.bdf, reg), = \ reg & (4 - s / 8), s / 8); = \ - } = \ = \ return value; = \ } @@ -47,19 +42,16 @@ GEN_PCI_CONF_READ(32) #undef GEN_PCI_CONF_READ =20 #define GEN_PCI_CONF_WRITE(s) = \ - void pci_conf_write ## s (unsigned int seg, unsigned int bus, = \ - unsigned int dev, unsigned int func, = \ - unsigned int reg, uint ## s ## _t data) = \ + void pci_conf_write ## s (pci_sbdf_t sbdf, unsigned int reg, = \ + uint ## s ## _t data) = \ { = \ BUILD_BUG_ON(s !=3D 8 && s !=3D 16 && s !=3D 32); = \ - if ( seg || reg > 255 ) = \ - pci_mmcfg_write(seg, bus, PCI_DEVFN(dev, func), reg, s / 8, da= ta); \ + if ( sbdf.seg || reg > 255 ) = \ + pci_mmcfg_write(sbdf.seg, sbdf.bus, sbdf.extfunc, reg, s / 8, = \ + data); = \ else = \ - { = \ - BUG_ON((bus > 255) || (dev > 31) || (func > 7)); = \ - pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), = \ + pci_conf_write(PCI_CONF_ADDRESS(sbdf.bdf, reg), = \ reg & (4 - s / 8), s / 8, data); = \ - } = \ } =20 /* Grep fodder */ diff --git a/xen/drivers/acpi/reboot.c b/xen/drivers/acpi/reboot.c index 72d06fd8e5..919239faa1 100644 --- a/xen/drivers/acpi/reboot.c +++ b/xen/drivers/acpi/reboot.c @@ -23,11 +23,9 @@ void acpi_reboot(void) case ACPI_ADR_SPACE_PCI_CONFIG: printk("Resetting with ACPI PCI RESET_REG.\n"); /* Write the value that resets us. */ - pci_conf_write8(0, 0, - (rr->address >> 32) & 31, - (rr->address >> 16) & 7, - (rr->address & 255), - reset_value); + pci_conf_write8(PCI_SBDF_T(0, 0, (rr->address >> 32) & 31, + (rr->address >> 16) & 7), + (rr->address & 255), reset_value); break; case ACPI_ADR_SPACE_SYSTEM_MEMORY: case ACPI_ADR_SPACE_SYSTEM_IO: diff --git a/xen/drivers/char/ehci-dbgp.c b/xen/drivers/char/ehci-dbgp.c index 475dc41767..4cd4157353 100644 --- a/xen/drivers/char/ehci-dbgp.c +++ b/xen/drivers/char/ehci-dbgp.c @@ -682,7 +682,8 @@ static int dbgp_control_msg(struct ehci_dbgp *dbgp, uns= igned int devnum, =20 static unsigned int __init __find_dbgp(u8 bus, u8 slot, u8 func) { - u32 class =3D pci_conf_read32(0, bus, slot, func, PCI_CLASS_REVISION); + uint32_t class =3D pci_conf_read32(PCI_SBDF_T(0, bus, slot, func), + PCI_CLASS_REVISION); =20 if ( (class >> 8) !=3D PCI_CLASS_SERIAL_USB_EHCI ) return 0; @@ -713,8 +714,9 @@ static unsigned int __init find_dbgp(struct ehci_dbgp *= dbgp, cap =3D __find_dbgp(bus, slot, func); if ( !cap || ehci_num-- ) { - if ( !func && !(pci_conf_read8(0, bus, slot, func, - PCI_HEADER_TYPE) & 0x80= ) ) + if ( !func && + !(pci_conf_read8(PCI_SBDF_T(0, bus, slot, func), + PCI_HEADER_TYPE) & 0x80) ) break; continue; } @@ -1006,17 +1008,22 @@ static set_debug_port_t __read_mostly set_debug_por= t =3D default_set_debug_port; =20 static void nvidia_set_debug_port(struct ehci_dbgp *dbgp, unsigned int por= t) { - u32 dword =3D pci_conf_read32(0, dbgp->bus, dbgp->slot, dbgp->func, 0x= 74); + const pci_sbdf_t sbdf =3D { + .bus =3D dbgp->bus, + .dev =3D dbgp->slot, + .func =3D dbgp->func, + }; + uint32_t dword =3D pci_conf_read32(sbdf, 0x74); =20 dword &=3D ~(0x0f << 12); dword |=3D (port & 0x0f) << 12; - pci_conf_write32(0, dbgp->bus, dbgp->slot, dbgp->func, 0x74, dword); + pci_conf_write32(sbdf, 0x74, dword); dbgp_printk("set debug port to %u\n", port); } =20 static void __init detect_set_debug_port(struct ehci_dbgp *dbgp) { - if ( pci_conf_read16(0, dbgp->bus, dbgp->slot, dbgp->func, + if ( pci_conf_read16(PCI_SBDF_T(0, dbgp->bus, dbgp->slot, dbgp->func), PCI_VENDOR_ID) =3D=3D 0x10de ) { dbgp_printk("using nvidia set_debug_port\n"); @@ -1035,17 +1042,22 @@ static void ehci_dbgp_bios_handoff(struct ehci_dbgp= *dbgp, u32 hcc_params) u32 cap; unsigned int offset =3D HCC_EXT_CAPS(hcc_params); int msec; + const pci_sbdf_t sbdf =3D { + .bus =3D dbgp->bus, + .dev =3D dbgp->slot, + .func =3D dbgp->func, + }; =20 if ( !offset ) return; =20 - cap =3D pci_conf_read32(0, dbgp->bus, dbgp->slot, dbgp->func, offset); + cap =3D pci_conf_read32(sbdf, offset); dbgp_printk("dbgp: EHCI BIOS state %08x\n", cap); =20 if ( (cap & 0xff) =3D=3D 1 && (cap & EHCI_USBLEGSUP_BIOS) ) { dbgp_printk("dbgp: BIOS handoff\n"); - pci_conf_write8(0, dbgp->bus, dbgp->slot, dbgp->func, offset + 3, = 1); + pci_conf_write8(sbdf, offset + 3, 1); } =20 /* if boot firmware now owns EHCI, spin till it hands it over. */ @@ -1054,7 +1066,7 @@ static void ehci_dbgp_bios_handoff(struct ehci_dbgp *= dbgp, u32 hcc_params) { mdelay(10); msec -=3D 10; - cap =3D pci_conf_read32(0, dbgp->bus, dbgp->slot, dbgp->func, offs= et); + cap =3D pci_conf_read32(sbdf, offset); } =20 if ( cap & EHCI_USBLEGSUP_BIOS ) @@ -1062,12 +1074,11 @@ static void ehci_dbgp_bios_handoff(struct ehci_dbgp= *dbgp, u32 hcc_params) /* well, possibly buggy BIOS... try to shut it down, * and hope nothing goes too wrong */ dbgp_printk("dbgp: BIOS handoff failed: %08x\n", cap); - pci_conf_write8(0, dbgp->bus, dbgp->slot, dbgp->func, offset + 2, = 0); + pci_conf_write8(sbdf, offset + 2, 0); } =20 /* just in case, always disable EHCI SMIs */ - pci_conf_write8(0, dbgp->bus, dbgp->slot, dbgp->func, - offset + EHCI_USBLEGCTLSTS, 0); + pci_conf_write8(sbdf, offset + EHCI_USBLEGCTLSTS, 0); } =20 static int ehci_dbgp_setup(struct ehci_dbgp *dbgp) @@ -1306,19 +1317,21 @@ static void __init ehci_dbgp_init_preirq(struct ser= ial_port *port) struct ehci_dbgp *dbgp =3D port->uart; u32 debug_port, offset; void __iomem *ehci_bar; + const pci_sbdf_t sbdf =3D { + .bus =3D dbgp->bus, + .dev =3D dbgp->slot, + .func =3D dbgp->func, + }; =20 - debug_port =3D pci_conf_read32(0, dbgp->bus, dbgp->slot, dbgp->func, - dbgp->cap); + debug_port =3D pci_conf_read32(sbdf, dbgp->cap); offset =3D (debug_port >> 16) & 0xfff; =20 /* double check if the mem space is enabled */ - dbgp->pci_cr =3D pci_conf_read8(0, dbgp->bus, dbgp->slot, dbgp->func, - PCI_COMMAND); + dbgp->pci_cr =3D pci_conf_read8(sbdf, PCI_COMMAND); if ( !(dbgp->pci_cr & PCI_COMMAND_MEMORY) ) { dbgp->pci_cr |=3D PCI_COMMAND_MEMORY; - pci_conf_write16(0, dbgp->bus, dbgp->slot, dbgp->func, PCI_COMMAND, - dbgp->pci_cr); + pci_conf_write16(sbdf, PCI_COMMAND, dbgp->pci_cr); dbgp_printk("MMIO for EHCI enabled\n"); } =20 @@ -1415,8 +1428,8 @@ static void ehci_dbgp_suspend(struct serial_port *por= t) stop_timer(&dbgp->timer); dbgp->timer.expires =3D 0; =20 - dbgp->pci_cr =3D pci_conf_read16(0, dbgp->bus, dbgp->slot, dbgp->func, - PCI_COMMAND); + dbgp->pci_cr =3D pci_conf_read16(PCI_SBDF_T(0, dbgp->bus, dbgp->slot, + dbgp->func), PCI_COMMAND); =20 dbgp->state =3D dbgp_unsafe; } @@ -1424,14 +1437,17 @@ static void ehci_dbgp_suspend(struct serial_port *p= ort) static void ehci_dbgp_resume(struct serial_port *port) { struct ehci_dbgp *dbgp =3D port->uart; + const pci_sbdf_t sbdf =3D { + .bus =3D dbgp->bus, + .dev =3D dbgp->slot, + .func =3D dbgp->func, + }; =20 if ( !dbgp->ehci_debug ) return; =20 - pci_conf_write32(0, dbgp->bus, dbgp->slot, dbgp->func, dbgp->bar, - dbgp->bar_val); - pci_conf_write16(0, dbgp->bus, dbgp->slot, dbgp->func, - PCI_COMMAND, dbgp->pci_cr); + pci_conf_write32(sbdf, dbgp->bar, dbgp->bar_val); + pci_conf_write16(sbdf, PCI_COMMAND, dbgp->pci_cr); =20 ehci_dbgp_setup_preirq(dbgp); ehci_dbgp_setup_postirq(dbgp); @@ -1459,6 +1475,11 @@ void __init ehci_dbgp_init(void) struct ehci_dbgp *dbgp =3D &ehci_dbgp; u32 debug_port, offset, bar_val; const char *e; + const pci_sbdf_t sbdf =3D { + .bus =3D dbgp->bus, + .dev =3D dbgp->slot, + .func =3D dbgp->func, + }; =20 if ( strncmp(opt_dbgp, "ehci", 4) ) return; @@ -1502,8 +1523,7 @@ void __init ehci_dbgp_init(void) else return; =20 - debug_port =3D pci_conf_read32(0, dbgp->bus, dbgp->slot, dbgp->func, - dbgp->cap); + debug_port =3D pci_conf_read32(sbdf, dbgp->cap); dbgp->bar =3D (debug_port >> 29) & 0x7; dbgp->bar =3D ((dbgp->bar - 1) * 4) + PCI_BASE_ADDRESS_0; offset =3D (debug_port >> 16) & 0xfff; @@ -1514,8 +1534,7 @@ void __init ehci_dbgp_init(void) return; } =20 - dbgp->bar_val =3D bar_val =3D pci_conf_read32(0, dbgp->bus, dbgp->slot, - dbgp->func, dbgp->bar); + dbgp->bar_val =3D bar_val =3D pci_conf_read32(sbdf, dbgp->bar); dbgp_printk("bar_val: %08x\n", bar_val); if ( bar_val & ~PCI_BASE_ADDRESS_MEM_MASK ) { diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c index 189e121b7e..698984d879 100644 --- a/xen/drivers/char/ns16550.c +++ b/xen/drivers/char/ns16550.c @@ -620,20 +620,23 @@ static int ns16550_getc(struct serial_port *port, cha= r *pc) static void pci_serial_early_init(struct ns16550 *uart) { #ifdef CONFIG_HAS_PCI + const pci_sbdf_t sbdf =3D { + .bus =3D uart->pb_bdf[0], + .dev =3D uart->pb_bdf[1], + .func =3D uart->pb_bdf[2], + }; + if ( !uart->ps_bdf_enable || uart->io_base >=3D 0x10000 ) return; =20 if ( uart->pb_bdf_enable ) - pci_conf_write16(0, uart->pb_bdf[0], uart->pb_bdf[1], uart->pb_bdf= [2], - PCI_IO_BASE, + pci_conf_write16(sbdf, PCI_IO_BASE, (uart->io_base & 0xF000) | ((uart->io_base & 0xF000) >> 8)); =20 - pci_conf_write32(0, uart->ps_bdf[0], uart->ps_bdf[1], uart->ps_bdf[2], - PCI_BASE_ADDRESS_0, + pci_conf_write32(sbdf, PCI_BASE_ADDRESS_0, uart->io_base | PCI_BASE_ADDRESS_SPACE_IO); - pci_conf_write16(0, uart->ps_bdf[0], uart->ps_bdf[1], uart->ps_bdf[2], - PCI_COMMAND, PCI_COMMAND_IO); + pci_conf_write16(sbdf, PCI_COMMAND, PCI_COMMAND_IO); #endif } =20 @@ -846,8 +849,9 @@ static void ns16550_suspend(struct serial_port *port) =20 #ifdef CONFIG_HAS_PCI if ( uart->bar ) - uart->cr =3D pci_conf_read16(0, uart->ps_bdf[0], uart->ps_bdf[1], - uart->ps_bdf[2], PCI_COMMAND); + uart->cr =3D pci_conf_read16(PCI_SBDF_T(0, uart->ps_bdf[0], + uart->ps_bdf[1], uart->ps_bd= f[2]), + PCI_COMMAND); #endif } =20 @@ -855,20 +859,22 @@ static void _ns16550_resume(struct serial_port *port) { #ifdef CONFIG_HAS_PCI struct ns16550 *uart =3D port->uart; + const pci_sbdf_t sbdf =3D { + .bus =3D uart->ps_bdf[0], + .dev =3D uart->ps_bdf[1], + .func =3D uart->ps_bdf[2], + }; =20 if ( uart->bar ) { - pci_conf_write32(0, uart->ps_bdf[0], uart->ps_bdf[1], uart->ps_bdf[= 2], - PCI_BASE_ADDRESS_0 + uart->bar_idx*4, uart->bar); + pci_conf_write32(sbdf, PCI_BASE_ADDRESS_0 + uart->bar_idx*4, uart->= bar); =20 /* If 64 bit BAR, write higher 32 bits to BAR+4 */ if ( uart->bar & PCI_BASE_ADDRESS_MEM_TYPE_64 ) - pci_conf_write32(0, uart->ps_bdf[0], - uart->ps_bdf[1], uart->ps_bdf[2], - PCI_BASE_ADDRESS_0 + (uart->bar_idx+1)*4, uart->ba= r64); + pci_conf_write32(sbdf, PCI_BASE_ADDRESS_0 + (uart->bar_idx+1)*= 4, + uart->bar64); =20 - pci_conf_write16(0, uart->ps_bdf[0], uart->ps_bdf[1], uart->ps_bdf[= 2], - PCI_COMMAND, uart->cr); + pci_conf_write16(sbdf, PCI_COMMAND, uart->cr); } #endif =20 @@ -1063,11 +1069,16 @@ pci_uart_config(struct ns16550 *uart, bool_t skip_a= mt, unsigned int idx) uint32_t bar, bar_64 =3D 0, len, len_64; u64 size =3D 0; const struct ns16550_config_param *param =3D uart_param; + const pci_sbdf_t sbdf =3D { + .bus =3D b, + .dev =3D d, + .func =3D f, + }; =20 - nextf =3D (f || (pci_conf_read16(0, b, d, f, PCI_HEADER_TY= PE) & + nextf =3D (f || (pci_conf_read16(sbdf, PCI_HEADER_TYPE) & 0x80)) ? f + 1 : 8; =20 - switch ( pci_conf_read16(0, b, d, f, PCI_CLASS_DEVICE) ) + switch ( pci_conf_read16(sbdf, PCI_CLASS_DEVICE) ) { case 0x0700: /* single port serial */ case 0x0702: /* multi port serial */ @@ -1084,8 +1095,8 @@ pci_uart_config(struct ns16550 *uart, bool_t skip_amt= , unsigned int idx) /* Check for params in uart_config lookup table */ for ( i =3D 0; i < ARRAY_SIZE(uart_config); i++ ) { - u16 vendor =3D pci_conf_read16(0, b, d, f, PCI_VENDOR_= ID); - u16 device =3D pci_conf_read16(0, b, d, f, PCI_DEVICE_= ID); + uint16_t vendor =3D pci_conf_read16(sbdf, PCI_VENDOR_I= D); + uint16_t device =3D pci_conf_read16(sbdf, PCI_DEVICE_I= D); =20 if ( uart_config[i].vendor_id =3D=3D vendor && uart_config[i].dev_id =3D=3D device ) @@ -1108,28 +1119,25 @@ pci_uart_config(struct ns16550 *uart, bool_t skip_a= mt, unsigned int idx) } =20 uart->io_base =3D 0; - bar =3D pci_conf_read32(0, b, d, f, - PCI_BASE_ADDRESS_0 + bar_idx*4); + bar =3D pci_conf_read32(sbdf, PCI_BASE_ADDRESS_0 + bar_idx= *4); =20 /* MMIO based */ if ( param->mmio && !(bar & PCI_BASE_ADDRESS_SPACE_IO) ) { - pci_conf_write32(0, b, d, f, - PCI_BASE_ADDRESS_0 + bar_idx*4, ~0u); - len =3D pci_conf_read32(0, b, d, f, PCI_BASE_ADDRESS_0= + bar_idx*4); - pci_conf_write32(0, b, d, f, - PCI_BASE_ADDRESS_0 + bar_idx*4, bar); + pci_conf_write32(sbdf, PCI_BASE_ADDRESS_0 + bar_idx*4,= ~0u); + len =3D pci_conf_read32(sbdf, PCI_BASE_ADDRESS_0 + bar= _idx*4); + pci_conf_write32(sbdf, PCI_BASE_ADDRESS_0 + bar_idx*4,= bar); =20 /* Handle 64 bit BAR if found */ if ( bar & PCI_BASE_ADDRESS_MEM_TYPE_64 ) { - bar_64 =3D pci_conf_read32(0, b, d, f, + bar_64 =3D pci_conf_read32(sbdf, PCI_BASE_ADDRESS_0 + (bar_idx+1)*4); - pci_conf_write32(0, b, d, f, + pci_conf_write32(sbdf, PCI_BASE_ADDRESS_0 + (bar_idx+1)*4, ~0= u); - len_64 =3D pci_conf_read32(0, b, d, f, + len_64 =3D pci_conf_read32(sbdf, PCI_BASE_ADDRESS_0 + (bar_idx+1)*4); - pci_conf_write32(0, b, d, f, + pci_conf_write32(sbdf, PCI_BASE_ADDRESS_0 + (bar_idx+1)*4, ba= r_64); size =3D ((u64)~0 << 32) | PCI_BASE_ADDRESS_MEM_M= ASK; size &=3D ((u64)len_64 << 32) | len; @@ -1143,11 +1151,9 @@ pci_uart_config(struct ns16550 *uart, bool_t skip_am= t, unsigned int idx) /* IO based */ else if ( !param->mmio && (bar & PCI_BASE_ADDRESS_SPACE_IO= ) ) { - pci_conf_write32(0, b, d, f, - PCI_BASE_ADDRESS_0 + bar_idx*4, ~0u); - len =3D pci_conf_read32(0, b, d, f, PCI_BASE_ADDRESS_0= ); - pci_conf_write32(0, b, d, f, - PCI_BASE_ADDRESS_0 + bar_idx*4, bar); + pci_conf_write32(sbdf, PCI_BASE_ADDRESS_0 + bar_idx*4,= ~0u); + len =3D pci_conf_read32(sbdf, PCI_BASE_ADDRESS_0); + pci_conf_write32(sbdf, PCI_BASE_ADDRESS_0 + bar_idx*4,= bar); size =3D len & PCI_BASE_ADDRESS_IO_MASK; =20 uart->io_base =3D bar & ~PCI_BASE_ADDRESS_SPACE_IO; @@ -1188,8 +1194,8 @@ pci_uart_config(struct ns16550 *uart, bool_t skip_amt= , unsigned int idx) uart->bar64 =3D bar_64; uart->io_size =3D max(8U << param->reg_shift, param->uart_offset); - uart->irq =3D pci_conf_read8(0, b, d, f, PCI_INTERRUPT_PIN= ) ? - pci_conf_read8(0, b, d, f, PCI_INTERRUPT_LINE) : 0; + uart->irq =3D pci_conf_read8(sbdf, PCI_INTERRUPT_PIN) ? + pci_conf_read8(sbdf, PCI_INTERRUPT_LINE) : 0; =20 return 0; } diff --git a/xen/drivers/passthrough/amd/iommu_detect.c b/xen/drivers/passt= hrough/amd/iommu_detect.c index 3c5d4de1a3..e8d8ec59bd 100644 --- a/xen/drivers/passthrough/amd/iommu_detect.c +++ b/xen/drivers/passthrough/amd/iommu_detect.c @@ -48,7 +48,8 @@ static int __init get_iommu_capabilities( { u8 type; =20 - iommu->cap.header =3D pci_conf_read32(seg, bus, dev, func, cap_ptr); + iommu->cap.header =3D pci_conf_read32(PCI_SBDF_T(seg, bus, dev, func), + cap_ptr); type =3D get_field_from_reg_u32(iommu->cap.header, PCI_CAP_TYPE_MASK, PCI_CAP_TYPE_SHIFT); =20 diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthr= ough/amd/iommu_init.c index 17f39552a9..fe0516f788 100644 --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -798,8 +798,7 @@ static bool_t __init set_iommu_interrupt_handler(struct= amd_iommu *iommu) PCI_SLOT(iommu->bdf), PCI_FUNC(iommu->bdf)); return 0; } - control =3D pci_conf_read16(iommu->seg, PCI_BUS(iommu->bdf), - PCI_SLOT(iommu->bdf), PCI_FUNC(iommu->bdf), + control =3D pci_conf_read16(iommu->msi.dev->sbdf, iommu->msi.msi_attrib.pos + PCI_MSI_FLAGS); iommu->msi.msi.nvec =3D 1; if ( is_mask_bit_support(control) ) @@ -835,6 +834,10 @@ static bool_t __init set_iommu_interrupt_handler(struc= t amd_iommu *iommu) static void amd_iommu_erratum_746_workaround(struct amd_iommu *iommu) { u32 value; + const pci_sbdf_t sbdf =3D { + .seg =3D iommu->seg, + .bdf =3D iommu->bdf, + }; u8 bus =3D PCI_BUS(iommu->bdf); u8 dev =3D PCI_SLOT(iommu->bdf); u8 func =3D PCI_FUNC(iommu->bdf); @@ -844,22 +847,22 @@ static void amd_iommu_erratum_746_workaround(struct a= md_iommu *iommu) (boot_cpu_data.x86_model > 0x1f) ) return; =20 - pci_conf_write32(iommu->seg, bus, dev, func, 0xf0, 0x90); - value =3D pci_conf_read32(iommu->seg, bus, dev, func, 0xf4); + pci_conf_write32(sbdf, 0xf0, 0x90); + value =3D pci_conf_read32(sbdf, 0xf4); =20 if ( value & (1 << 2) ) return; =20 /* Select NB indirect register 0x90 and enable writing */ - pci_conf_write32(iommu->seg, bus, dev, func, 0xf0, 0x90 | (1 << 8)); + pci_conf_write32(sbdf, 0xf0, 0x90 | (1 << 8)); =20 - pci_conf_write32(iommu->seg, bus, dev, func, 0xf4, value | (1 << 2)); + pci_conf_write32(sbdf, 0xf4, value | (1 << 2)); printk(XENLOG_INFO "AMD-Vi: Applying erratum 746 workaround for IOMMU at %04x:%02x= :%02x.%u\n", iommu->seg, bus, dev, func); =20 /* Clear the enable writing bit */ - pci_conf_write32(iommu->seg, bus, dev, func, 0xf0, 0x90); + pci_conf_write32(sbdf, 0xf0, 0x90); } =20 static void enable_iommu(struct amd_iommu *iommu) @@ -1203,7 +1206,12 @@ static bool_t __init amd_sp5100_erratum28(void) =20 for (bus =3D 0; bus < 256; bus++) { - id =3D pci_conf_read32(0, bus, 0x14, 0, PCI_VENDOR_ID); + const pci_sbdf_t sbdf =3D { + .bus =3D bus, + .dev =3D 0x14, + }; + + id =3D pci_conf_read32(sbdf, PCI_VENDOR_ID); =20 vendor_id =3D id & 0xffff; dev_id =3D (id >> 16) & 0xffff; @@ -1212,7 +1220,7 @@ static bool_t __init amd_sp5100_erratum28(void) if (vendor_id !=3D 0x1002 || dev_id !=3D 0x4385) continue; =20 - byte =3D pci_conf_read8(0, bus, 0x14, 0, 0xad); + byte =3D pci_conf_read8(sbdf, 0xad); if ( (byte >> 3) & 1 ) { printk(XENLOG_WARNING "AMD-Vi: SP5100 erratum 28 detected, dis= abling IOMMU.\n" diff --git a/xen/drivers/passthrough/ats.h b/xen/drivers/passthrough/ats.h index bee13911c0..e83a45d16e 100644 --- a/xen/drivers/passthrough/ats.h +++ b/xen/drivers/passthrough/ats.h @@ -35,8 +35,8 @@ static inline int pci_ats_enabled(int seg, int bus, int d= evfn) pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS); BUG_ON(!pos); =20 - value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - pos + ATS_REG_CTL); + value =3D pci_conf_read16(PCI_SBDF3_T(seg, bus, devfn), pos + ATS_REG_= CTL); + return value & ATS_ENABLE; } =20 diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index 8de8d8e110..94fb3a183d 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -246,36 +246,34 @@ static void check_pdev(const struct pci_dev *pdev) =20 if ( command_mask ) { - val =3D pci_conf_read16(seg, bus, dev, func, PCI_COMMAND); + val =3D pci_conf_read16(pdev->sbdf, PCI_COMMAND); if ( val & command_mask ) - pci_conf_write16(seg, bus, dev, func, PCI_COMMAND, - val & ~command_mask); - val =3D pci_conf_read16(seg, bus, dev, func, PCI_STATUS); + pci_conf_write16(pdev->sbdf, PCI_COMMAND, val & ~command_mask); + val =3D pci_conf_read16(pdev->sbdf, PCI_STATUS); if ( val & PCI_STATUS_CHECK ) { printk(XENLOG_INFO "%04x:%02x:%02x.%u status %04x -> %04x\n", seg, bus, dev, func, val, val & ~PCI_STATUS_CHECK); - pci_conf_write16(seg, bus, dev, func, PCI_STATUS, - val & PCI_STATUS_CHECK); + pci_conf_write16(pdev->sbdf, PCI_STATUS, val & PCI_STATUS_CHEC= K); } } =20 - switch ( pci_conf_read8(seg, bus, dev, func, PCI_HEADER_TYPE) & 0x7f ) + switch ( pci_conf_read8(pdev->sbdf, PCI_HEADER_TYPE) & 0x7f ) { case PCI_HEADER_TYPE_BRIDGE: if ( !bridge_ctl_mask ) break; - val =3D pci_conf_read16(seg, bus, dev, func, PCI_BRIDGE_CONTROL); + val =3D pci_conf_read16(pdev->sbdf, PCI_BRIDGE_CONTROL); if ( val & bridge_ctl_mask ) - pci_conf_write16(seg, bus, dev, func, PCI_BRIDGE_CONTROL, + pci_conf_write16(pdev->sbdf, PCI_BRIDGE_CONTROL, val & ~bridge_ctl_mask); - val =3D pci_conf_read16(seg, bus, dev, func, PCI_SEC_STATUS); + val =3D pci_conf_read16(pdev->sbdf, PCI_SEC_STATUS); if ( val & PCI_STATUS_CHECK ) { printk(XENLOG_INFO "%04x:%02x:%02x.%u secondary status %04x -> %04x\n", seg, bus, dev, func, val, val & ~PCI_STATUS_CHECK); - pci_conf_write16(seg, bus, dev, func, PCI_SEC_STATUS, + pci_conf_write16(pdev->sbdf, PCI_SEC_STATUS, val & PCI_STATUS_CHECK); } break; @@ -289,12 +287,8 @@ static void check_pdev(const struct pci_dev *pdev) =20 static void apply_quirks(struct pci_dev *pdev) { - uint16_t vendor =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, - pdev->sbdf.dev, pdev->sbdf.func, - PCI_VENDOR_ID); - uint16_t device =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, - pdev->sbdf.dev, pdev->sbdf.func, - PCI_DEVICE_ID); + uint16_t vendor =3D pci_conf_read16(pdev->sbdf, PCI_VENDOR_ID); + uint16_t device =3D pci_conf_read16(pdev->sbdf, PCI_DEVICE_ID); static const struct { uint16_t vendor, device; } ignore_bars[] =3D { @@ -368,10 +362,8 @@ static struct pci_dev *alloc_pdev(struct pci_seg *pseg= , u8 bus, u8 devfn) =20 case DEV_TYPE_PCIe2PCI_BRIDGE: case DEV_TYPE_LEGACY_PCI_BRIDGE: - sec_bus =3D pci_conf_read8(pseg->nr, bus, PCI_SLOT(devfn), - PCI_FUNC(devfn), PCI_SECONDARY_BUS); - sub_bus =3D pci_conf_read8(pseg->nr, bus, PCI_SLOT(devfn), - PCI_FUNC(devfn), PCI_SUBORDINATE_BUS); + sec_bus =3D pci_conf_read8(pdev->sbdf, PCI_SECONDARY_BUS); + sub_bus =3D pci_conf_read8(pdev->sbdf, PCI_SUBORDINATE_BUS); =20 spin_lock(&pseg->bus2bridge_lock); for ( ; sec_bus <=3D sub_bus; sec_bus++ ) @@ -387,8 +379,7 @@ static struct pci_dev *alloc_pdev(struct pci_seg *pseg,= u8 bus, u8 devfn) pos =3D pci_find_cap_offset(pseg->nr, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), PCI_CAP_ID_EXP); BUG_ON(!pos); - cap =3D pci_conf_read16(pseg->nr, bus, PCI_SLOT(devfn), - PCI_FUNC(devfn), pos + PCI_EXP_DEVCAP); + cap =3D pci_conf_read16(pdev->sbdf, pos + PCI_EXP_DEVCAP); if ( cap & PCI_EXP_DEVCAP_PHANTOM ) { pdev->phantom_stride =3D 8 >> MASK_EXTR(cap, @@ -438,10 +429,8 @@ static void free_pdev(struct pci_seg *pseg, struct pci= _dev *pdev) =20 case DEV_TYPE_PCIe2PCI_BRIDGE: case DEV_TYPE_LEGACY_PCI_BRIDGE: - sec_bus =3D pci_conf_read8(pseg->nr, pdev->sbdf.bus, pdev->sbd= f.dev, - pdev->sbdf.func, PCI_SECONDARY_BUS); - sub_bus =3D pci_conf_read8(pseg->nr, pdev->sbdf.bus, pdev->sbd= f.dev, - pdev->sbdf.func, PCI_SUBORDINATE_BUS); + sec_bus =3D pci_conf_read8(pdev->sbdf, PCI_SECONDARY_BUS); + sub_bus =3D pci_conf_read8(pdev->sbdf, PCI_SUBORDINATE_BUS); =20 spin_lock(&pseg->bus2bridge_lock); for ( ; sec_bus <=3D sub_bus; sec_bus++ ) @@ -603,8 +592,6 @@ static void pci_enable_acs(struct pci_dev *pdev) int pos; uint16_t cap, ctrl, seg =3D pdev->sbdf.seg; uint8_t bus =3D pdev->sbdf.bus; - uint8_t dev =3D pdev->sbdf.dev; - uint8_t func =3D pdev->sbdf.func; =20 if ( !iommu_enabled ) return; @@ -613,8 +600,8 @@ static void pci_enable_acs(struct pci_dev *pdev) if (!pos) return; =20 - cap =3D pci_conf_read16(seg, bus, dev, func, pos + PCI_ACS_CAP); - ctrl =3D pci_conf_read16(seg, bus, dev, func, pos + PCI_ACS_CTRL); + cap =3D pci_conf_read16(pdev->sbdf, pos + PCI_ACS_CAP); + ctrl =3D pci_conf_read16(pdev->sbdf, pos + PCI_ACS_CTRL); =20 /* Source Validation */ ctrl |=3D (cap & PCI_ACS_SV); @@ -628,7 +615,7 @@ static void pci_enable_acs(struct pci_dev *pdev) /* Upstream Forwarding */ ctrl |=3D (cap & PCI_ACS_UF); =20 - pci_conf_write16(seg, bus, dev, func, pos + PCI_ACS_CTRL, ctrl); + pci_conf_write16(pdev->sbdf, pos + PCI_ACS_CTRL, ctrl); } =20 static int iommu_add_device(struct pci_dev *pdev); @@ -639,8 +626,7 @@ unsigned int pci_size_mem_bar(pci_sbdf_t sbdf, unsigned= int pos, uint64_t *paddr, uint64_t *psize, unsigned int flags) { - uint32_t hi =3D 0, bar =3D pci_conf_read32(sbdf.seg, sbdf.bus, sbdf.de= v, - sbdf.func, pos); + uint32_t hi =3D 0, bar =3D pci_conf_read32(sbdf, pos); uint64_t size; bool is64bits =3D !(flags & PCI_BAR_ROM) && (bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK) =3D=3D PCI_BASE_ADDRESS_MEM= _TYPE_64; @@ -650,7 +636,7 @@ unsigned int pci_size_mem_bar(pci_sbdf_t sbdf, unsigned= int pos, ASSERT(!((flags & PCI_BAR_VF) && (flags & PCI_BAR_ROM))); ASSERT((flags & PCI_BAR_ROM) || (bar & PCI_BASE_ADDRESS_SPACE) =3D=3D PCI_BASE_ADDRESS_SPACE_ME= MORY); - pci_conf_write32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, pos, ~0); + pci_conf_write32(sbdf, pos, ~0); if ( is64bits ) { if ( flags & PCI_BAR_LAST ) @@ -662,20 +648,18 @@ unsigned int pci_size_mem_bar(pci_sbdf_t sbdf, unsign= ed int pos, *psize =3D 0; return 1; } - hi =3D pci_conf_read32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, po= s + 4); - pci_conf_write32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, pos + 4,= ~0); + hi =3D pci_conf_read32(sbdf, pos + 4); + pci_conf_write32(sbdf, pos + 4, ~0); } - size =3D pci_conf_read32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, - pos) & mask; + size =3D pci_conf_read32(sbdf, pos) & mask; if ( is64bits ) { - size |=3D (uint64_t)pci_conf_read32(sbdf.seg, sbdf.bus, sbdf.dev, - sbdf.func, pos + 4) << 32; - pci_conf_write32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, pos + 4,= hi); + size |=3D (uint64_t)pci_conf_read32(sbdf, pos + 4) << 32; + pci_conf_write32(sbdf, pos + 4, hi); } else if ( size ) size |=3D (uint64_t)~0 << 32; - pci_conf_write32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, pos, bar); + pci_conf_write32(sbdf, pos, bar); size =3D -size; =20 if ( paddr ) @@ -745,7 +729,7 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, { unsigned int pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_SRIOV); - u16 ctrl =3D pci_conf_read16(seg, bus, slot, func, pos + PCI_SRIOV= _CTRL); + u16 ctrl =3D pci_conf_read16(pdev->sbdf, pos + PCI_SRIOV_CTRL); =20 if ( !pos ) /* Nothing */; @@ -757,10 +741,7 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, for ( i =3D 0; i < PCI_SRIOV_NUM_BARS; ) { unsigned int idx =3D pos + PCI_SRIOV_BAR + i * 4; - u32 bar =3D pci_conf_read32(seg, bus, slot, func, idx); - pci_sbdf_t sbdf =3D { - .sbdf =3D PCI_SBDF3(seg, bus, devfn), - }; + uint32_t bar =3D pci_conf_read32(pdev->sbdf, idx); =20 if ( (bar & PCI_BASE_ADDRESS_SPACE) =3D=3D PCI_BASE_ADDRESS_SPACE_IO ) @@ -771,7 +752,7 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, seg, bus, slot, func, i); continue; } - ret =3D pci_size_mem_bar(sbdf, idx, NULL, &pdev->vf_rlen[i= ], + ret =3D pci_size_mem_bar(pdev->sbdf, idx, NULL, &pdev->vf_= rlen[i], PCI_BAR_VF | ((i =3D=3D PCI_SRIOV_NUM_BARS - 1) ? PCI_BAR_LAST : 0)); @@ -940,14 +921,20 @@ enum pdev_type pdev_type(u16 seg, u8 bus, u8 devfn) u16 class_device, creg; u8 d =3D PCI_SLOT(devfn), f =3D PCI_FUNC(devfn); int pos =3D pci_find_cap_offset(seg, bus, d, f, PCI_CAP_ID_EXP); + const pci_sbdf_t sbdf =3D { + .seg =3D seg, + .bus =3D bus, + .dev =3D d, + .func =3D f, + }; =20 - class_device =3D pci_conf_read16(seg, bus, d, f, PCI_CLASS_DEVICE); + class_device =3D pci_conf_read16(sbdf, PCI_CLASS_DEVICE); switch ( class_device ) { case PCI_CLASS_BRIDGE_PCI: if ( !pos ) return DEV_TYPE_LEGACY_PCI_BRIDGE; - creg =3D pci_conf_read16(seg, bus, d, f, pos + PCI_EXP_FLAGS); + creg =3D pci_conf_read16(sbdf, pos + PCI_EXP_FLAGS); switch ( (creg & PCI_EXP_FLAGS_TYPE) >> 4 ) { case PCI_EXP_TYPE_PCI_BRIDGE: @@ -1011,7 +998,7 @@ bool_t __init pci_device_detect(u16 seg, u8 bus, u8 de= v, u8 func) { u32 vendor; =20 - vendor =3D pci_conf_read32(seg, bus, dev, func, PCI_VENDOR_ID); + vendor =3D pci_conf_read32(PCI_SBDF_T(seg, bus, dev, func), PCI_VENDOR= _ID); /* some broken boards return 0 or ~0 if a slot is empty: */ if ( (vendor =3D=3D 0xffffffff) || (vendor =3D=3D 0x00000000) || (vendor =3D=3D 0x0000ffff) || (vendor =3D=3D 0xffff0000) ) @@ -1043,10 +1030,8 @@ void pci_check_disable_device(u16 seg, u8 bus, u8 de= vfn) =20 /* Tell the device to stop DMAing; we can't rely on the guest to * control it for us. */ - cword =3D pci_conf_read16(seg, bus, pdev->sbdf.dev, pdev->sbdf.func, - PCI_COMMAND); - pci_conf_write16(seg, bus, pdev->sbdf.dev, pdev->sbdf.func, - PCI_COMMAND, cword & ~PCI_COMMAND_MASTER); + cword =3D pci_conf_read16(pdev->sbdf, PCI_COMMAND); + pci_conf_write16(pdev->sbdf, PCI_COMMAND, cword & ~PCI_COMMAND_MASTER); } =20 /* @@ -1079,7 +1064,7 @@ static int __init _scan_pci_devices(struct pci_seg *p= seg, void *arg) return -ENOMEM; } =20 - if ( !func && !(pci_conf_read8(pseg->nr, bus, dev, func, + if ( !func && !(pci_conf_read8(pdev->sbdf, PCI_HEADER_TYPE) & 0x80) ) break; } @@ -1210,9 +1195,7 @@ static bool_t hest_match_type(const struct acpi_hest_= header *hest_hdr, unsigned int pos =3D pci_find_cap_offset(pdev->sbdf.seg, pdev->sbdf.bu= s, pdev->sbdf.dev, pdev->sbdf.func, PCI_CAP_ID_EXP); - uint8_t pcie =3D MASK_EXTR(pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.= bus, - pdev->sbdf.dev, pdev->sbdf.fu= nc, - pos + PCI_EXP_FLAGS), + uint8_t pcie =3D MASK_EXTR(pci_conf_read16(pdev->sbdf, pos + PCI_EXP_F= LAGS), PCI_EXP_FLAGS_TYPE); =20 switch ( hest_hdr->type ) @@ -1222,8 +1205,7 @@ static bool_t hest_match_type(const struct acpi_hest_= header *hest_hdr, case ACPI_HEST_TYPE_AER_ENDPOINT: return pcie =3D=3D PCI_EXP_TYPE_ENDPOINT; case ACPI_HEST_TYPE_AER_BRIDGE: - return pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.= dev, - pdev->sbdf.func, PCI_CLASS_DEVICE) =3D=3D + return pci_conf_read16(pdev->sbdf, PCI_CLASS_DEVICE) =3D=3D PCI_CLASS_BRIDGE_PCI; } =20 diff --git a/xen/drivers/passthrough/vtd/dmar.c b/xen/drivers/passthrough/v= td/dmar.c index effaf93222..9d30188ab9 100644 --- a/xen/drivers/passthrough/vtd/dmar.c +++ b/xen/drivers/passthrough/vtd/dmar.c @@ -348,7 +348,7 @@ static int __init acpi_parse_dev_scope( =20 while ( --depth > 0 ) { - bus =3D pci_conf_read8(seg, bus, path->dev, path->fn, + bus =3D pci_conf_read8(PCI_SBDF_T(seg, bus, path->dev, path->f= n), PCI_SECONDARY_BUS); path++; } @@ -356,10 +356,16 @@ static int __init acpi_parse_dev_scope( switch ( acpi_scope->entry_type ) { case ACPI_DMAR_SCOPE_TYPE_BRIDGE: - sec_bus =3D pci_conf_read8(seg, bus, path->dev, path->fn, - PCI_SECONDARY_BUS); - sub_bus =3D pci_conf_read8(seg, bus, path->dev, path->fn, - PCI_SUBORDINATE_BUS); + { + const pci_sbdf_t sbdf =3D { + .seg =3D seg, + .bus =3D bus, + .dev =3D path->dev, + .func =3D path->fn, + }; + + sec_bus =3D pci_conf_read8(sbdf, PCI_SECONDARY_BUS); + sub_bus =3D pci_conf_read8(sbdf, PCI_SUBORDINATE_BUS); if ( iommu_verbose ) printk(VTDPREFIX " bridge: %04x:%02x:%02x.%u start=3D%x sec=3D%x sub= =3D%x\n", @@ -368,7 +374,7 @@ static int __init acpi_parse_dev_scope( =20 dmar_scope_add_buses(scope, sec_bus, sub_bus); break; - + } case ACPI_DMAR_SCOPE_TYPE_HPET: if ( iommu_verbose ) printk(VTDPREFIX " MSI HPET: %04x:%02x:%02x.%u\n", diff --git a/xen/drivers/passthrough/vtd/quirks.c b/xen/drivers/passthrough= /vtd/quirks.c index fa811605ee..48c7384b82 100644 --- a/xen/drivers/passthrough/vtd/quirks.c +++ b/xen/drivers/passthrough/vtd/quirks.c @@ -61,6 +61,14 @@ static bool_t __read_mostly is_snb_gfx; static u8 *__read_mostly igd_reg_va; static spinlock_t igd_lock; =20 +static const pci_sbdf_t igd_sbdf =3D { + .dev =3D IGD_DEV, +}; + +static const pci_sbdf_t ioh_sbdf =3D { + .dev =3D IOH_DEV, +}; + /* * QUIRK to workaround Xen boot issue on Calpella/Ironlake OEM BIOS * not enabling VT-d properly in IGD. The workaround is to not enabling @@ -74,7 +82,7 @@ int is_igd_vt_enabled_quirk(void) return 1; =20 /* integrated graphics on Intel platforms is located at 0:2.0 */ - ggc =3D pci_conf_read16(0, 0, IGD_DEV, 0, GGC); + ggc =3D pci_conf_read16(igd_sbdf, GGC); return ( ggc & GGC_MEMORY_VT_ENABLED ? 1 : 0 ); } =20 @@ -88,12 +96,12 @@ static void __init cantiga_b3_errata_init(void) u16 vid; u8 did_hi, rid; =20 - vid =3D pci_conf_read16(0, 0, IGD_DEV, 0, 0); + vid =3D pci_conf_read16(igd_sbdf, 0); if ( vid !=3D 0x8086 ) return; =20 - did_hi =3D pci_conf_read8(0, 0, IGD_DEV, 0, 3); - rid =3D pci_conf_read8(0, 0, IGD_DEV, 0, 8); + did_hi =3D pci_conf_read8(igd_sbdf, 3); + rid =3D pci_conf_read8(igd_sbdf, 8); =20 if ( (did_hi =3D=3D 0x2A) && (rid =3D=3D 0x7) ) is_cantiga_b3 =3D 1; @@ -128,9 +136,9 @@ static void __init map_igd_reg(void) if ( igd_reg_va ) return; =20 - igd_mmio =3D pci_conf_read32(0, 0, IGD_DEV, 0, PCI_BASE_ADDRESS_1); + igd_mmio =3D pci_conf_read32(igd_sbdf, PCI_BASE_ADDRESS_1); igd_mmio <<=3D 32; - igd_mmio +=3D pci_conf_read32(0, 0, IGD_DEV, 0, PCI_BASE_ADDRESS_0); + igd_mmio +=3D pci_conf_read32(igd_sbdf, PCI_BASE_ADDRESS_0); igd_reg_va =3D ioremap(igd_mmio & IGD_BAR_MASK, 0x3000); } =20 @@ -279,9 +287,14 @@ static void __init tylersburg_intremap_quirk(void) =20 for ( bus =3D 0; bus < 0x100; bus++ ) { + const pci_sbdf_t sbdf =3D { + .bus =3D bus, + .dev =3D 20, + }; + /* Match on System Management Registers on Device 20 Function 0 */ - device =3D pci_conf_read32(0, bus, 20, 0, PCI_VENDOR_ID); - rev =3D pci_conf_read8(0, bus, 20, 0, PCI_REVISION_ID); + device =3D pci_conf_read32(sbdf, PCI_VENDOR_ID); + rev =3D pci_conf_read8(sbdf, PCI_REVISION_ID); =20 if ( rev =3D=3D 0x13 && device =3D=3D 0x342e8086 ) { @@ -296,8 +309,8 @@ static void __init tylersburg_intremap_quirk(void) /* initialize platform identification flags */ void __init platform_quirks_init(void) { - ioh_id =3D pci_conf_read32(0, 0, IOH_DEV, 0, 0); - igd_id =3D pci_conf_read32(0, 0, IGD_DEV, 0, 0); + ioh_id =3D pci_conf_read32(ioh_sbdf, 0); + igd_id =3D pci_conf_read32(igd_sbdf, 0); =20 /* Mobile 4 Series Chipset neglects to set RWBF capability. */ if ( ioh_id =3D=3D 0x2a408086 ) @@ -356,15 +369,15 @@ int me_wifi_quirk(struct domain *domain, u8 bus, u8 d= evfn, int map) u32 id; int rc =3D 0; =20 - id =3D pci_conf_read32(0, 0, 0, 0, 0); + id =3D pci_conf_read32(PCI_SBDF_T(0, 0, 0, 0), 0); if ( IS_CTG(id) ) { /* quit if ME does not exist */ - if ( pci_conf_read32(0, 0, 3, 0, 0) =3D=3D 0xffffffff ) + if ( pci_conf_read32(PCI_SBDF_T(0, 0, 3, 0), 0) =3D=3D 0xffffffff ) return 0; =20 /* if device is WLAN device, map ME phantom device 0:3.7 */ - id =3D pci_conf_read32(0, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), 0= ); + id =3D pci_conf_read32(PCI_SBDF3_T(0, bus, devfn), 0); switch (id) { case 0x42328086: @@ -384,11 +397,11 @@ int me_wifi_quirk(struct domain *domain, u8 bus, u8 d= evfn, int map) else if ( IS_ILK(id) || IS_CPT(id) ) { /* quit if ME does not exist */ - if ( pci_conf_read32(0, 0, 22, 0, 0) =3D=3D 0xffffffff ) + if ( pci_conf_read32(PCI_SBDF_T(0, 0, 22, 0), 0) =3D=3D 0xffffffff= ) return 0; =20 /* if device is WLAN device, map ME phantom device 0:22.7 */ - id =3D pci_conf_read32(0, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), 0= ); + id =3D pci_conf_read32(PCI_SBDF3_T(0, bus, devfn), 0); switch (id) { case 0x00878086: /* Kilmer Peak */ @@ -424,11 +437,11 @@ void pci_vtd_quirk(const struct pci_dev *pdev) paddr_t pa; const char *action; =20 - if ( pci_conf_read16(seg, bus, dev, func, PCI_VENDOR_ID) !=3D + if ( pci_conf_read16(pdev->sbdf, PCI_VENDOR_ID) !=3D PCI_VENDOR_ID_INTEL ) return; =20 - switch ( pci_conf_read16(seg, bus, dev, func, PCI_DEVICE_ID) ) + switch ( pci_conf_read16(pdev->sbdf, PCI_DEVICE_ID) ) { /* * Mask reporting Intel VT-d faults to IOH core logic: @@ -439,8 +452,8 @@ void pci_vtd_quirk(const struct pci_dev *pdev) case 0x342e: /* Tylersburg chipset (Nehalem / Westmere systems) */ case 0x3728: /* Xeon C5500/C3500 (JasperForest) */ case 0x3c28: /* Sandybridge */ - val =3D pci_conf_read32(seg, bus, dev, func, 0x1AC); - pci_conf_write32(seg, bus, dev, func, 0x1AC, val | (1 << 31)); + val =3D pci_conf_read32(pdev->sbdf, 0x1AC); + pci_conf_write32(pdev->sbdf, 0x1AC, val | (1 << 31)); printk(XENLOG_INFO "Masked VT-d error signaling on %04x:%02x:%02x.= %u\n", seg, bus, dev, func); break; @@ -462,7 +475,7 @@ void pci_vtd_quirk(const struct pci_dev *pdev) PCI_EXT_CAP_ID_VNDR); while ( pos ) { - val =3D pci_conf_read32(seg, bus, dev, func, pos + PCI_VND= R_HEADER); + val =3D pci_conf_read32(pdev->sbdf, pos + PCI_VNDR_HEADER); if ( PCI_VNDR_HEADER_ID(val) =3D=3D 4 && PCI_VNDR_HEADER_R= EV(val) =3D=3D 1 ) { pos +=3D PCI_VNDR_HEADER; @@ -482,15 +495,15 @@ void pci_vtd_quirk(const struct pci_dev *pdev) break; } =20 - val =3D pci_conf_read32(seg, bus, dev, func, pos + PCI_ERR_UNCOR_M= ASK); - val2 =3D pci_conf_read32(seg, bus, dev, func, pos + PCI_ERR_COR_MA= SK); + val =3D pci_conf_read32(pdev->sbdf, pos + PCI_ERR_UNCOR_MASK); + val2 =3D pci_conf_read32(pdev->sbdf, pos + PCI_ERR_COR_MASK); if ( (val & PCI_ERR_UNC_UNSUP) && (val2 & PCI_ERR_COR_ADV_NFAT) ) action =3D "Found masked"; else if ( !ff ) { - pci_conf_write32(seg, bus, dev, func, pos + PCI_ERR_UNCOR_MASK, + pci_conf_write32(pdev->sbdf, pos + PCI_ERR_UNCOR_MASK, val | PCI_ERR_UNC_UNSUP); - pci_conf_write32(seg, bus, dev, func, pos + PCI_ERR_COR_MASK, + pci_conf_write32(pdev->sbdf, pos + PCI_ERR_COR_MASK, val2 | PCI_ERR_COR_ADV_NFAT); action =3D "Masked"; } @@ -498,8 +511,8 @@ void pci_vtd_quirk(const struct pci_dev *pdev) action =3D "Must not mask"; =20 /* XPUNCERRMSK Send Completion with Unsupported Request */ - val =3D pci_conf_read32(seg, bus, dev, func, 0x20c); - pci_conf_write32(seg, bus, dev, func, 0x20c, val | (1 << 4)); + val =3D pci_conf_read32(pdev->sbdf, 0x20c); + pci_conf_write32(pdev->sbdf, 0x20c, val | (1 << 4)); =20 printk(XENLOG_INFO "%s UR signaling on %04x:%02x:%02x.%u\n", action, seg, bus, dev, func); @@ -515,8 +528,8 @@ void pci_vtd_quirk(const struct pci_dev *pdev) case 0x1610: case 0x1614: case 0x1618: /* Broadwell */ case 0x1900: case 0x1904: case 0x1908: case 0x190c: case 0x190f: /* Sk= ylake */ case 0x1910: case 0x1918: case 0x191f: /* Skylake */ - bar =3D pci_conf_read32(seg, bus, dev, func, 0x6c); - bar =3D (bar << 32) | pci_conf_read32(seg, bus, dev, func, 0x68); + bar =3D pci_conf_read32(pdev->sbdf, 0x6c); + bar =3D (bar << 32) | pci_conf_read32(pdev->sbdf, 0x68); pa =3D bar & 0x7ffffff000UL; /* bits 12...38 */ if ( (bar & 1) && pa && page_is_ram_type(paddr_to_pfn(pa), RAM_TYPE_RESERVED) ) diff --git a/xen/drivers/passthrough/x86/ats.c b/xen/drivers/passthrough/x8= 6/ats.c index ddaec72d19..c3203793a6 100644 --- a/xen/drivers/passthrough/x86/ats.c +++ b/xen/drivers/passthrough/x86/ats.c @@ -34,8 +34,7 @@ int enable_ats_device(struct pci_dev *pdev, struct list_h= ead *ats_list) dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS capability found\n", seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); =20 - value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn), - PCI_FUNC(devfn), pos + ATS_REG_CTL); + value =3D pci_conf_read16(pdev->sbdf, pos + ATS_REG_CTL); if ( value & ATS_ENABLE ) { struct pci_dev *other; @@ -51,15 +50,13 @@ int enable_ats_device(struct pci_dev *pdev, struct list= _head *ats_list) if ( !(value & ATS_ENABLE) ) { value |=3D ATS_ENABLE; - pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - pos + ATS_REG_CTL, value); + pci_conf_write16(pdev->sbdf, pos + ATS_REG_CTL, value); } =20 if ( pos ) { pdev->ats.cap_pos =3D pos; - value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn), - PCI_FUNC(devfn), pos + ATS_REG_CAP); + value =3D pci_conf_read16(pdev->sbdf, pos + ATS_REG_CAP); pdev->ats.queue_depth =3D value & ATS_QUEUE_DEPTH_MASK ?: ATS_QUEUE_DEPTH_MASK + 1; list_add(&pdev->ats.list, ats_list); @@ -81,11 +78,9 @@ void disable_ats_device(struct pci_dev *pdev) =20 BUG_ON(!pdev->ats.cap_pos); =20 - value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - pdev->ats.cap_pos + ATS_REG_CTL); + value =3D pci_conf_read16(pdev->sbdf, pdev->ats.cap_pos + ATS_REG_CTL); value &=3D ~ATS_ENABLE; - pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - pdev->ats.cap_pos + ATS_REG_CTL, value); + pci_conf_write16(pdev->sbdf, pdev->ats.cap_pos + ATS_REG_CTL, value); =20 list_del(&pdev->ats.list); =20 diff --git a/xen/drivers/pci/pci.c b/xen/drivers/pci/pci.c index a3223a2b29..3d2acf6f77 100644 --- a/xen/drivers/pci/pci.c +++ b/xen/drivers/pci/pci.c @@ -14,19 +14,25 @@ int pci_find_cap_offset(u16 seg, u8 bus, u8 dev, u8 fun= c, u8 cap) int max_cap =3D 48; u8 pos =3D PCI_CAPABILITY_LIST; u16 status; - - status =3D pci_conf_read16(seg, bus, dev, func, PCI_STATUS); + const pci_sbdf_t sbdf =3D { + .seg =3D seg, + .bus =3D bus, + .dev =3D dev, + .func =3D func, + }; + + status =3D pci_conf_read16(sbdf, PCI_STATUS); if ( (status & PCI_STATUS_CAP_LIST) =3D=3D 0 ) return 0; =20 while ( max_cap-- ) { - pos =3D pci_conf_read8(seg, bus, dev, func, pos); + pos =3D pci_conf_read8(sbdf, pos); if ( pos < 0x40 ) break; =20 pos &=3D ~3; - id =3D pci_conf_read8(seg, bus, dev, func, pos + PCI_CAP_LIST_ID); + id =3D pci_conf_read8(sbdf, pos + PCI_CAP_LIST_ID); =20 if ( id =3D=3D 0xff ) break; @@ -43,16 +49,20 @@ int pci_find_next_cap(u16 seg, u8 bus, unsigned int dev= fn, u8 pos, int cap) { u8 id; int ttl =3D 48; + const pci_sbdf_t sbdf =3D { + .seg =3D seg, + .bus =3D bus, + .extfunc =3D devfn, + }; =20 while ( ttl-- ) { - pos =3D pci_conf_read8(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),= pos); + pos =3D pci_conf_read8(sbdf, pos); if ( pos < 0x40 ) break; =20 pos &=3D ~3; - id =3D pci_conf_read8(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - pos + PCI_CAP_LIST_ID); + id =3D pci_conf_read8(sbdf, pos + PCI_CAP_LIST_ID); =20 if ( id =3D=3D 0xff ) break; @@ -90,11 +100,14 @@ int pci_find_ext_capability(int seg, int bus, int devf= n, int cap) */ int pci_find_next_ext_capability(int seg, int bus, int devfn, int start, i= nt cap) { - u32 header; int ttl =3D 480; /* 3840 bytes, minimum 8 bytes per capability */ int pos =3D max(start, 0x100); - - header =3D pci_conf_read32(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),= pos); + const pci_sbdf_t sbdf =3D { + .seg =3D seg, + .bus =3D bus, + .extfunc =3D devfn, + }; + uint32_t header =3D pci_conf_read32(sbdf, pos); =20 /* * If we have no capabilities, this is indicated by cap ID, @@ -110,24 +123,20 @@ int pci_find_next_ext_capability(int seg, int bus, in= t devfn, int start, int cap pos =3D PCI_EXT_CAP_NEXT(header); if ( pos < 0x100 ) break; - header =3D pci_conf_read32(seg, bus, PCI_SLOT(devfn), PCI_FUNC(dev= fn), pos); + header =3D pci_conf_read32(sbdf, pos); } return 0; } =20 void pci_intx(const struct pci_dev *pdev, bool enable) { - uint16_t seg =3D pdev->sbdf.seg; - uint8_t bus =3D pdev->sbdf.bus; - uint8_t slot =3D pdev->sbdf.dev; - uint8_t func =3D pdev->sbdf.func; - uint16_t cmd =3D pci_conf_read16(seg, bus, slot, func, PCI_COMMAND); + uint16_t cmd =3D pci_conf_read16(pdev->sbdf, PCI_COMMAND); =20 if ( enable ) cmd &=3D ~PCI_COMMAND_INTX_DISABLE; else cmd |=3D PCI_COMMAND_INTX_DISABLE; - pci_conf_write16(seg, bus, slot, func, PCI_COMMAND, cmd); + pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd); } =20 const char *__init parse_pci(const char *s, unsigned int *seg_p, diff --git a/xen/drivers/video/vga.c b/xen/drivers/video/vga.c index 6a64fd9013..59f9c9de6f 100644 --- a/xen/drivers/video/vga.c +++ b/xen/drivers/video/vga.c @@ -121,10 +121,8 @@ void __init video_endboot(void) pcidevs_unlock(); =20 if ( !pdev || - pci_conf_read16(0, bus, PCI_SLOT(devfn), PCI_FUNC(dev= fn), - PCI_CLASS_DEVICE) !=3D 0x0300 || - !(pci_conf_read16(0, bus, PCI_SLOT(devfn), - PCI_FUNC(devfn), PCI_COMMAND) & + pci_conf_read16(pdev->sbdf, PCI_CLASS_DEVICE) !=3D 0x= 0300 || + !(pci_conf_read16(pdev->sbdf, PCI_COMMAND) & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) ) continue; =20 @@ -136,21 +134,24 @@ void __init video_endboot(void) b =3D 0; break; case 1: - switch ( pci_conf_read8(0, b, PCI_SLOT(df), - PCI_FUNC(df), - PCI_HEADER_TYPE) ) + { + const pci_sbdf_t sbdf =3D { + .bus =3D b, + .extfunc =3D df, + }; + + switch ( pci_conf_read8(sbdf, PCI_HEADER_TYPE) ) { case PCI_HEADER_TYPE_BRIDGE: case PCI_HEADER_TYPE_CARDBUS: - if ( pci_conf_read16(0, b, PCI_SLOT(df), - PCI_FUNC(df), - PCI_BRIDGE_CONTROL) & + if ( pci_conf_read16(sbdf, PCI_BRIDGE_CONTROL)= & PCI_BRIDGE_CTL_VGA ) continue; break; } break; } + } break; } if ( !b ) diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index 74d70a4278..d693b1376c 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -112,8 +112,7 @@ static void modify_decoding(const struct pci_dev *pdev,= uint16_t cmd, (map ? PCI_ROM_ADDRESS_ENABLE : 0); =20 header->bars[i].enabled =3D header->rom_enabled =3D map; - pci_conf_write32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.de= v, - pdev->sbdf.func, rom_pos, val); + pci_conf_write32(pdev->sbdf, rom_pos, val); return; } =20 @@ -123,8 +122,7 @@ static void modify_decoding(const struct pci_dev *pdev,= uint16_t cmd, } =20 if ( !rom_only ) - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, PCI_COMMAND, cmd); + pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd); else ASSERT_UNREACHABLE(); } @@ -335,9 +333,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) static void cmd_write(const struct pci_dev *pdev, unsigned int reg, uint32_t cmd, void *data) { - uint16_t current_cmd =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bu= s, - pdev->sbdf.dev, pdev->sbdf.func, - reg); + uint16_t current_cmd =3D pci_conf_read16(pdev->sbdf, reg); =20 /* * Let Dom0 play with all the bits directly except for the memory @@ -352,8 +348,7 @@ static void cmd_write(const struct pci_dev *pdev, unsig= ned int reg, */ modify_bars(pdev, cmd, false); else - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, reg, cmd); + pci_conf_write16(pdev->sbdf, reg, cmd); } =20 static void bar_write(const struct pci_dev *pdev, unsigned int reg, @@ -371,8 +366,7 @@ static void bar_write(const struct pci_dev *pdev, unsig= ned int reg, else val &=3D PCI_BASE_ADDRESS_MEM_MASK; =20 - if ( pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, PCI_COMMAND) & PCI_COMMAND_MEMOR= Y ) + if ( pci_conf_read16(pdev->sbdf, PCI_COMMAND) & PCI_COMMAND_MEMORY ) { /* If the value written is the current one avoid printing a warnin= g. */ if ( val !=3D (uint32_t)(bar->addr >> (hi ? 32 : 0)) ) @@ -399,8 +393,7 @@ static void bar_write(const struct pci_dev *pdev, unsig= ned int reg, val |=3D bar->prefetchable ? PCI_BASE_ADDRESS_MEM_PREFETCH : 0; } =20 - pci_conf_write32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, reg, val); + pci_conf_write32(pdev->sbdf, reg, val); } =20 static void rom_write(const struct pci_dev *pdev, unsigned int reg, @@ -408,9 +401,7 @@ static void rom_write(const struct pci_dev *pdev, unsig= ned int reg, { struct vpci_header *header =3D &pdev->vpci->header; struct vpci_bar *rom =3D data; - uint16_t cmd =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, - pdev->sbdf.dev, pdev->sbdf.func, - PCI_COMMAND); + uint16_t cmd =3D pci_conf_read16(pdev->sbdf, PCI_COMMAND); bool new_enabled =3D val & PCI_ROM_ADDRESS_ENABLE; =20 if ( (cmd & PCI_COMMAND_MEMORY) && header->rom_enabled && new_enabled ) @@ -433,8 +424,7 @@ static void rom_write(const struct pci_dev *pdev, unsig= ned int reg, { /* Just update the ROM BAR field. */ header->rom_enabled =3D new_enabled; - pci_conf_write32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, reg, val); + pci_conf_write32(pdev->sbdf, reg, val); } /* * Pass PCI_COMMAND_MEMORY or 0 to signal a map/unmap request, note th= at @@ -464,8 +454,7 @@ static int init_bars(struct pci_dev *pdev) struct vpci_bar *bars =3D header->bars; int rc; =20 - switch ( pci_conf_read8(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, PCI_HEADER_TYPE) & 0x7f ) + switch ( pci_conf_read8(pdev->sbdf, PCI_HEADER_TYPE) & 0x7f ) { case PCI_HEADER_TYPE_NORMAL: num_bars =3D PCI_HEADER_NORMAL_NR_BARS; @@ -491,12 +480,9 @@ static int init_bars(struct pci_dev *pdev) return 0; =20 /* Disable memory decoding before sizing. */ - cmd =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, PCI_COMMAND); + cmd =3D pci_conf_read16(pdev->sbdf, PCI_COMMAND); if ( cmd & PCI_COMMAND_MEMORY ) - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, PCI_COMMAND, - cmd & ~PCI_COMMAND_MEMORY); + pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd & ~PCI_COMMAND_MEMOR= Y); =20 for ( i =3D 0; i < num_bars; i++ ) { @@ -510,16 +496,14 @@ static int init_bars(struct pci_dev *pdev) 4, &bars[i]); if ( rc ) { - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbd= f.dev, - pdev->sbdf.func, PCI_COMMAND, cmd); + pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd); return rc; } =20 continue; } =20 - val =3D pci_conf_read32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf= .dev, - pdev->sbdf.func, reg); + val =3D pci_conf_read32(pdev->sbdf, reg); if ( (val & PCI_BASE_ADDRESS_SPACE) =3D=3D PCI_BASE_ADDRESS_SPACE_= IO ) { bars[i].type =3D VPCI_BAR_IO; @@ -535,8 +519,7 @@ static int init_bars(struct pci_dev *pdev) (i =3D=3D num_bars - 1) ? PCI_BAR_LAST : 0); if ( rc < 0 ) { - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.de= v, - pdev->sbdf.func, PCI_COMMAND, cmd); + pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd); return rc; } =20 @@ -554,8 +537,7 @@ static int init_bars(struct pci_dev *pdev) &bars[i]); if ( rc ) { - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.de= v, - pdev->sbdf.func, PCI_COMMAND, cmd); + pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd); return rc; } } @@ -569,9 +551,8 @@ static int init_bars(struct pci_dev *pdev) rom->type =3D VPCI_BAR_ROM; rom->size =3D size; rom->addr =3D addr; - header->rom_enabled =3D pci_conf_read32(pdev->sbdf.seg, pdev->sbdf= .bus, - pdev->sbdf.dev, pdev->sbdf.f= unc, - rom_reg) & PCI_ROM_ADDRESS_E= NABLE; + header->rom_enabled =3D pci_conf_read32(pdev->sbdf, rom_reg) & + PCI_ROM_ADDRESS_ENABLE; =20 rc =3D vpci_add_register(pdev->vpci, vpci_hw_read32, rom_write, ro= m_reg, 4, rom); diff --git a/xen/drivers/vpci/msi.c b/xen/drivers/vpci/msi.c index dfc894dcc6..4f2e55f3fd 100644 --- a/xen/drivers/vpci/msi.c +++ b/xen/drivers/vpci/msi.c @@ -77,8 +77,7 @@ static void control_write(const struct pci_dev *pdev, uns= igned int reg, msi->vectors =3D vectors; msi->enabled =3D new_enabled; =20 - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, reg, control_read(pdev, reg, data)); + pci_conf_write16(pdev->sbdf, reg, control_read(pdev, reg, data)); } =20 static void update_msi(const struct pci_dev *pdev, struct vpci_msi *msi) @@ -210,8 +209,7 @@ static int init_msi(struct pci_dev *pdev) return ret; =20 /* Get the maximum number of vectors the device supports. */ - control =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf= .dev, - pdev->sbdf.func, msi_control_reg(pos)); + control =3D pci_conf_read16(pdev->sbdf, msi_control_reg(pos)); =20 /* * FIXME: I've only been able to test this code with devices using a s= ingle diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c index 04431715f5..47d569121f 100644 --- a/xen/drivers/vpci/msix.c +++ b/xen/drivers/vpci/msix.c @@ -147,8 +147,7 @@ static void control_write(const struct pci_dev *pdev, u= nsigned int reg, =20 val =3D control_read(pdev, reg, data); if ( pci_msi_conf_write_intercept(msix->pdev, reg, 2, &val) >=3D 0 ) - pci_conf_write16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, reg, val); + pci_conf_write16(pdev->sbdf, reg, val); } =20 static struct vpci_msix *msix_find(const struct domain *d, unsigned long a= ddr) @@ -459,8 +458,7 @@ static int init_msix(struct pci_dev *pdev) if ( !msix_offset ) return 0; =20 - control =3D pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf= .dev, - pdev->sbdf.func, msix_control_reg(msix_offse= t)); + control =3D pci_conf_read16(pdev->sbdf, msix_control_reg(msix_offset)); =20 max_entries =3D msix_table_size(control); =20 @@ -472,11 +470,9 @@ static int init_msix(struct pci_dev *pdev) pdev->vpci->msix->pdev =3D pdev; =20 pdev->vpci->msix->tables[VPCI_MSIX_TABLE] =3D - pci_conf_read32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, msix_table_offset_reg(msix_offset= )); + pci_conf_read32(pdev->sbdf, msix_table_offset_reg(msix_offset)); pdev->vpci->msix->tables[VPCI_MSIX_PBA] =3D - pci_conf_read32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, msix_pba_offset_reg(msix_offset)); + pci_conf_read32(pdev->sbdf, msix_pba_offset_reg(msix_offset)); =20 for ( i =3D 0; i < pdev->vpci->msix->max_entries; i++) { diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c index 9a060c108e..afe0c38396 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -114,15 +114,13 @@ static void vpci_ignored_write(const struct pci_dev *= pdev, unsigned int reg, uint32_t vpci_hw_read16(const struct pci_dev *pdev, unsigned int reg, void *data) { - return pci_conf_read16(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, reg); + return pci_conf_read16(pdev->sbdf, reg); } =20 uint32_t vpci_hw_read32(const struct pci_dev *pdev, unsigned int reg, void *data) { - return pci_conf_read32(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, reg); + return pci_conf_read32(pdev->sbdf, reg); } =20 int vpci_add_register(struct vpci *vpci, vpci_read_t *read_handler, @@ -212,7 +210,7 @@ static uint32_t vpci_read_hw(pci_sbdf_t sbdf, unsigned = int reg, switch ( size ) { case 4: - data =3D pci_conf_read32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, = reg); + data =3D pci_conf_read32(sbdf, reg); break; =20 case 3: @@ -222,26 +220,22 @@ static uint32_t vpci_read_hw(pci_sbdf_t sbdf, unsigne= d int reg, */ if ( reg & 1 ) { - data =3D pci_conf_read8(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.fun= c, - reg); - data |=3D pci_conf_read16(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.f= unc, - reg + 1) << 8; + data =3D pci_conf_read8(sbdf, reg); + data |=3D pci_conf_read16(sbdf, reg + 1) << 8; } else { - data =3D pci_conf_read16(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.fu= nc, - reg); - data |=3D pci_conf_read8(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.fu= nc, - reg + 2) << 16; + data =3D pci_conf_read16(sbdf, reg); + data |=3D pci_conf_read8(sbdf, reg + 2) << 16; } break; =20 case 2: - data =3D pci_conf_read16(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, = reg); + data =3D pci_conf_read16(sbdf, reg); break; =20 case 1: - data =3D pci_conf_read8(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, r= eg); + data =3D pci_conf_read8(sbdf, reg); break; =20 default: @@ -259,7 +253,7 @@ static void vpci_write_hw(pci_sbdf_t sbdf, unsigned int= reg, unsigned int size, switch ( size ) { case 4: - pci_conf_write32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, reg, dat= a); + pci_conf_write32(sbdf, reg, data); break; =20 case 3: @@ -269,26 +263,22 @@ static void vpci_write_hw(pci_sbdf_t sbdf, unsigned i= nt reg, unsigned int size, */ if ( reg & 1 ) { - pci_conf_write8(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, reg, - data); - pci_conf_write16(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, reg = + 1, - data >> 8); + pci_conf_write8(sbdf, reg, data); + pci_conf_write16(sbdf, reg + 1, data >> 8); } else { - pci_conf_write16(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, reg, - data); - pci_conf_write8(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, reg += 2, - data >> 16); + pci_conf_write16(sbdf, reg, data); + pci_conf_write8(sbdf, reg + 2, data >> 16); } break; =20 case 2: - pci_conf_write16(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, reg, dat= a); + pci_conf_write16(sbdf, reg, data); break; =20 case 1: - pci_conf_write8(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, reg, data= ); + pci_conf_write8(sbdf, reg, data); break; =20 default: diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index 1cf54eb466..9908d0fe5d 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -58,6 +58,11 @@ typedef union { }; } pci_sbdf_t; =20 +#define PCI_SBDF_T(s, b, d, f) \ + ((pci_sbdf_t) { .seg =3D (s), .bus =3D (b), .dev =3D (d), .func =3D (f= ) }) +#define PCI_SBDF3_T(s, b, e) \ + ((pci_sbdf_t) { .seg =3D (s), .bus =3D (b), .extfunc =3D (e) }) + struct pci_dev_info { /* * VF's 'is_extfn' field is used to indicate whether its PF is an exte= nded @@ -159,24 +164,12 @@ struct pci_dev *pci_get_pdev_by_domain(const struct d= omain *, int seg, int bus, int devfn); void pci_check_disable_device(u16 seg, u8 bus, u8 devfn); =20 -uint8_t pci_conf_read8( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg); -uint16_t pci_conf_read16( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg); -uint32_t pci_conf_read32( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg); -void pci_conf_write8( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg, uint8_t data); -void pci_conf_write16( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg, uint16_t data); -void pci_conf_write32( - unsigned int seg, unsigned int bus, unsigned int dev, unsigned int fun= c, - unsigned int reg, uint32_t data); +uint8_t pci_conf_read8(pci_sbdf_t sbdf, unsigned int reg); +uint16_t pci_conf_read16(pci_sbdf_t sbdf, unsigned int reg); +uint32_t pci_conf_read32(pci_sbdf_t sbdf, unsigned int reg); +void pci_conf_write8(pci_sbdf_t sbdf, unsigned int reg, uint8_t data); +void pci_conf_write16(pci_sbdf_t sbdf, unsigned int reg, uint16_t data); +void pci_conf_write32(pci_sbdf_t sbdf, unsigned int reg, uint32_t data); uint32_t pci_conf_read(uint32_t cf8, uint8_t offset, uint8_t bytes); void pci_conf_write(uint32_t cf8, uint8_t offset, uint8_t bytes, uint32_t = data); int pci_mmcfg_read(unsigned int seg, unsigned int bus, --=20 2.17.2 (Apple Git-113) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Fri Mar 29 06:44:45 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1557504811; cv=none; d=zoho.com; s=zohoarc; b=FWzql2/2fTy00rHi/Qwy3julGDzwGLavevvDy0C+R/FPBhSV92RTX4MBjmh+4aWMRHqFaVFn8Iamw+4XFaf2XGCmBMF9IXlo3W0FsuImLa4OWW2XbBCu7VTcematz0mgpYz6AHGdGZiXaJyYNPJoAEk6HDKMzjn7FPgxXaW79aQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1557504811; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=9z5OH8+g5zrMS+7gVnD8KJZYmE4EghfjwD+HVD3UhY8=; b=WSGhRw3k9nvNHTcTFgh0b1ji8QUiLvOYdxEIXCBNzX5n/ie8TTQCwzIk3cSftp3lJcRLnNqsZlNWHpeaVUOOqlAt/1jFO8Gl1Rlk/neajWBa2q4j7v52RIeJrAVBImoc81yhqcvQq+33RBrdQ5ivQxqYXBWafqVqfavR70J5g7E= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1557504811819916.8653746656206; Fri, 10 May 2019 09:13:31 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hP87u-0004bu-ME; Fri, 10 May 2019 16:12:02 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hP87t-0004bZ-W6 for xen-devel@lists.xenproject.org; Fri, 10 May 2019 16:12:02 +0000 Received: from SMTP03.CITRIX.COM (unknown [162.221.156.55]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 55bcd062-733e-11e9-8b48-dfb1199aaba5; Fri, 10 May 2019 16:11:58 +0000 (UTC) X-Inumbo-ID: 55bcd062-733e-11e9-8b48-dfb1199aaba5 X-IronPort-AV: E=Sophos;i="5.60,453,1549929600"; d="scan'208";a="85330719" From: Roger Pau Monne To: Date: Fri, 10 May 2019 18:10:55 +0200 Message-ID: <20190510161056.48648-5-roger.pau@citrix.com> X-Mailer: git-send-email 2.17.2 (Apple Git-113) In-Reply-To: <20190510161056.48648-1-roger.pau@citrix.com> References: <20190510161056.48648-1-roger.pau@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH 4/5] print: introduce a format specifier for pci_sbdf_t X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Kevin Tian , Stefano Stabellini , Wei Liu , Suravee Suthikulpanit , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich , Brian Woods , Roger Pau Monne Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" The new format specifier is '%pp', and prints a pci_sbdf_t using the seg:bus:dev.func format. Replace all SBDFs printed using '%04x:%02x:%02x.%u' to use the new format specifier. No functional change expected. Signed-off-by: Roger Pau Monn=C3=A9 --- Cc: Andrew Cooper Cc: George Dunlap Cc: Ian Jackson Cc: Jan Beulich Cc: Julien Grall Cc: Konrad Rzeszutek Wilk Cc: Stefano Stabellini Cc: Tim Deegan Cc: Wei Liu Cc: Suravee Suthikulpanit Cc: Brian Woods Cc: Kevin Tian --- docs/misc/printk-formats.txt | 5 + xen/arch/x86/hvm/vmsi.c | 10 +- xen/arch/x86/msi.c | 35 +++--- xen/common/vsprintf.c | 18 +++ xen/drivers/passthrough/amd/iommu_acpi.c | 17 ++- xen/drivers/passthrough/amd/iommu_cmd.c | 5 +- xen/drivers/passthrough/amd/iommu_detect.c | 5 +- xen/drivers/passthrough/amd/iommu_init.c | 11 +- xen/drivers/passthrough/amd/iommu_intr.c | 8 +- xen/drivers/passthrough/amd/pci_amd_iommu.c | 31 +++-- xen/drivers/passthrough/pci.c | 121 ++++++++------------ xen/drivers/passthrough/vtd/dmar.c | 26 ++--- xen/drivers/passthrough/vtd/intremap.c | 11 +- xen/drivers/passthrough/vtd/iommu.c | 74 +++++------- xen/drivers/passthrough/vtd/quirks.c | 23 ++-- xen/drivers/passthrough/vtd/utils.c | 6 +- xen/drivers/passthrough/x86/ats.c | 13 +-- xen/drivers/vpci/header.c | 10 +- xen/drivers/vpci/msi.c | 6 +- xen/drivers/vpci/msix.c | 25 ++-- xen/include/xen/pci.h | 2 + 21 files changed, 197 insertions(+), 265 deletions(-) diff --git a/docs/misc/printk-formats.txt b/docs/misc/printk-formats.txt index 080f498f65..8f666f696a 100644 --- a/docs/misc/printk-formats.txt +++ b/docs/misc/printk-formats.txt @@ -48,3 +48,8 @@ Domain and vCPU information: The domain part as above, with the vcpu_id printed in decim= al. e.g. d0v1 d[IDLE]v0 + +PCI: + + %pp PCI device address in S:B:D.F format from a pci_sbdf_t. + e.g. 0004:02:00.0 diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c index 15cfe8d057..6f4641afbc 100644 --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -686,10 +686,8 @@ static int vpci_msi_update(const struct pci_dev *pdev,= uint32_t data, =20 if ( rc ) { - gdprintk(XENLOG_ERR, - "%04x:%02x:%02x.%u: failed to bind PIRQ %u: %d\n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, pirq + i, rc); + gdprintk(XENLOG_ERR, "%pp: failed to bind PIRQ %u: %d\n", + &pdev->sbdf, pirq + i, rc); while ( bind.machine_irq-- > pirq ) pt_irq_destroy_bind(pdev->domain, &bind); return rc; @@ -743,9 +741,7 @@ static int vpci_msi_enable(const struct pci_dev *pdev, = uint32_t data, &msi_info); if ( rc ) { - gdprintk(XENLOG_ERR, "%04x:%02x:%02x.%u: failed to map PIRQ: %d\n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, rc); + gdprintk(XENLOG_ERR, "%pp: failed to map PIRQ: %d\n", &pdev->sbdf,= rc); return rc; } =20 diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index ad4a72d56b..6832211772 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -432,8 +432,8 @@ static bool msi_set_mask_bit(struct irq_desc *desc, boo= l host, bool guest) { pdev->msix->warned =3D domid; printk(XENLOG_G_WARNING - "cannot mask IRQ %d: masking MSI-X on Dom%d's %04x:= %02x:%02x.%u\n", - desc->irq, domid, seg, bus, slot, func); + "cannot mask IRQ %d: masking MSI-X on Dom%d's %pp\n= ", + desc->irq, domid, &pdev->sbdf); } } pdev->msix->host_maskall =3D maskall; @@ -991,11 +991,10 @@ static int msix_capability_init(struct pci_dev *dev, struct domain *d =3D dev->domain ?: currd; =20 if ( !is_hardware_domain(currd) || d !=3D currd ) - printk("%s use of MSI-X on %04x:%02x:%02x.%u by Dom%d\n", + printk("%s use of MSI-X on %pp by Dom%d\n", is_hardware_domain(currd) ? XENLOG_WARNING "Potentially insecure" - : XENLOG_ERR "Insecure", - seg, bus, slot, func, d->domain_id); + : XENLOG_ERR "Insecure", &dev->sbdf, d->domain_id); if ( !is_hardware_domain(d) && /* Assume a domain without memory has no mappings yet. */ (!is_hardware_domain(currd) || d->tot_pages) ) @@ -1050,18 +1049,15 @@ static int __pci_enable_msi(struct msi_info *msi, s= truct msi_desc **desc) old_desc =3D find_msi_entry(pdev, msi->irq, PCI_CAP_ID_MSI); if ( old_desc ) { - printk(XENLOG_ERR "irq %d already mapped to MSI on %04x:%02x:%02x.= %u\n", - msi->irq, msi->seg, msi->bus, - PCI_SLOT(msi->devfn), PCI_FUNC(msi->devfn)); + printk(XENLOG_ERR "irq %d already mapped to MSI on %pp\n", + msi->irq, &pdev->sbdf); return -EEXIST; } =20 old_desc =3D find_msi_entry(pdev, -1, PCI_CAP_ID_MSIX); if ( old_desc ) { - printk(XENLOG_WARNING "MSI-X already in use on %04x:%02x:%02x.%u\n= ", - msi->seg, msi->bus, - PCI_SLOT(msi->devfn), PCI_FUNC(msi->devfn)); + printk(XENLOG_WARNING "MSI-X already in use on %pp\n", &pdev->sbdf= ); __pci_disable_msix(old_desc); } =20 @@ -1118,16 +1114,15 @@ static int __pci_enable_msix(struct msi_info *msi, = struct msi_desc **desc) old_desc =3D find_msi_entry(pdev, msi->irq, PCI_CAP_ID_MSIX); if ( old_desc ) { - printk(XENLOG_ERR "irq %d already mapped to MSI-X on %04x:%02x:%02= x.%u\n", - msi->irq, msi->seg, msi->bus, slot, func); + printk(XENLOG_ERR "irq %d already mapped to MSI-X on %pp\n", + msi->irq, &pdev->sbdf); return -EEXIST; } =20 old_desc =3D find_msi_entry(pdev, -1, PCI_CAP_ID_MSI); if ( old_desc ) { - printk(XENLOG_WARNING "MSI already in use on %04x:%02x:%02x.%u\n", - msi->seg, msi->bus, slot, func); + printk(XENLOG_WARNING "MSI already in use on %pp\n", &pdev->sbdf); __pci_disable_msi(old_desc); } =20 @@ -1175,8 +1170,8 @@ static void __pci_disable_msix(struct msi_desc *entry) else if ( !(control & PCI_MSIX_FLAGS_MASKALL) ) { printk(XENLOG_WARNING - "cannot disable IRQ %d: masking MSI-X on %04x:%02x:%02x.%u\= n", - entry->irq, seg, bus, slot, func); + "cannot disable IRQ %d: masking MSI-X on %pp\n", + entry->irq, &dev->sbdf); maskall =3D true; } dev->msix->host_maskall =3D maskall; @@ -1342,7 +1337,6 @@ int pci_restore_msi_state(struct pci_dev *pdev) struct msi_desc *entry, *tmp; struct irq_desc *desc; struct msi_msg msg; - uint8_t slot =3D pdev->sbdf.dev, func =3D pdev->sbdf.func; unsigned int type =3D 0, pos =3D 0; u16 control =3D 0; =20 @@ -1369,9 +1363,8 @@ int pci_restore_msi_state(struct pci_dev *pdev) if (desc->msi_desc !=3D entry) { bogus: - dprintk(XENLOG_ERR, - "Restore MSI for %04x:%02x:%02x:%u entry %u not set?\n= ", - pdev->sbdf.seg, pdev->sbdf.bus, slot, func, i); + dprintk(XENLOG_ERR, "Restore MSI for %pp entry %u not set?\n", + &pdev->sbdf, i); spin_unlock_irqrestore(&desc->lock, flags); if ( type =3D=3D PCI_CAP_ID_MSIX ) pci_conf_write16(pdev->sbdf, msix_control_reg(pos), diff --git a/xen/common/vsprintf.c b/xen/common/vsprintf.c index 352d43b425..b30ed08687 100644 --- a/xen/common/vsprintf.c +++ b/xen/common/vsprintf.c @@ -392,6 +392,20 @@ static char *print_vcpu(char *str, char *end, const st= ruct vcpu *v) return number(str + 1, end, v->vcpu_id, 10, -1, -1, 0); } =20 +static char *print_pci_addr(char *str, char *end, const pci_sbdf_t *sbdf) +{ + str =3D number(str, end, sbdf->seg, 16, 4, -1, ZEROPAD); + if ( str < end ) + *str =3D ':'; + str =3D number(str + 1, end, sbdf->bus, 16, 2, -1, ZEROPAD); + if ( str < end ) + *str =3D ':'; + str =3D number(str + 1, end, sbdf->dev, 16, 2, -1, ZEROPAD); + if ( str < end ) + *str =3D '.'; + return number(str + 1, end, sbdf->func, 10, -1, -1, 0); +} + static char *pointer(char *str, char *end, const char **fmt_ptr, const void *arg, int field_width, int precision, int flags) @@ -519,6 +533,10 @@ static char *pointer(char *str, char *end, const char = **fmt_ptr, case 'v': /* dv from a struct vcpu */ ++*fmt_ptr; return print_vcpu(str, end, arg); + + case 'p': /* PCI SBDF. */ + ++*fmt_ptr; + return print_pci_addr(str, end, arg); } =20 if ( field_width =3D=3D -1 ) diff --git a/xen/drivers/passthrough/amd/iommu_acpi.c b/xen/drivers/passthr= ough/amd/iommu_acpi.c index 64d10481d7..d900feef09 100644 --- a/xen/drivers/passthrough/amd/iommu_acpi.c +++ b/xen/drivers/passthrough/amd/iommu_acpi.c @@ -717,9 +717,8 @@ static u16 __init parse_ivhd_device_special( return 0; } =20 - AMD_IOMMU_DEBUG("IVHD Special: %04x:%02x:%02x.%u variety %#x handle %#= x\n", - seg, PCI_BUS(bdf), PCI_SLOT(bdf), PCI_FUNC(bdf), - special->variety, special->handle); + AMD_IOMMU_DEBUG("IVHD Special: %pp variety %#x handle %#x\n", + &PCI_SBDF2_T(seg, bdf), special->variety, special->han= dle); add_ivrs_mapping_entry(bdf, bdf, special->header.data_setting, iommu); =20 switch ( special->variety ) @@ -742,9 +741,9 @@ static u16 __init parse_ivhd_device_special( if ( idx < nr_ioapic_sbdf ) { AMD_IOMMU_DEBUG("IVHD: Command line override present for IO-AP= IC %#x" - "(IVRS: %#x devID %04x:%02x:%02x.%u)\n", - ioapic_sbdf[idx].id, special->handle, seg, - PCI_BUS(bdf), PCI_SLOT(bdf), PCI_FUNC(bdf)); + "(IVRS: %#x devID %pp)\n", + ioapic_sbdf[idx].id, special->handle, + &PCI_SBDF2_T(seg, bdf)); break; } =20 @@ -814,9 +813,9 @@ static u16 __init parse_ivhd_device_special( break; case HPET_CMDL: AMD_IOMMU_DEBUG("IVHD: Command line override present for HPET = %#x " - "(IVRS: %#x devID %04x:%02x:%02x.%u)\n", - hpet_sbdf.id, special->handle, seg, PCI_BUS(bd= f), - PCI_SLOT(bdf), PCI_FUNC(bdf)); + "(IVRS: %#x devID %pp)\n", + hpet_sbdf.id, special->handle, + &PCI_SBDF2_T(seg, bdf)); break; case HPET_NONE: /* set device id of hpet */ diff --git a/xen/drivers/passthrough/amd/iommu_cmd.c b/xen/drivers/passthro= ugh/amd/iommu_cmd.c index 82330c24ba..9bbc5a5545 100644 --- a/xen/drivers/passthrough/amd/iommu_cmd.c +++ b/xen/drivers/passthrough/amd/iommu_cmd.c @@ -296,9 +296,8 @@ void amd_iommu_flush_iotlb(u8 devfn, const struct pci_d= ev *pdev, =20 if ( !iommu ) { - AMD_IOMMU_DEBUG("%s: Can't find iommu for %04x:%02x:%02x.%u\n", - __func__, pdev->sbdf.seg, pdev->sbdf.bus, - pdev->sbdf.dev, pdev->sbdf.func); + AMD_IOMMU_DEBUG("%s: Can't find iommu for %pp\n", + __func__, &pdev->sbdf); return; } =20 diff --git a/xen/drivers/passthrough/amd/iommu_detect.c b/xen/drivers/passt= hrough/amd/iommu_detect.c index e8d8ec59bd..91f5ea6bff 100644 --- a/xen/drivers/passthrough/amd/iommu_detect.c +++ b/xen/drivers/passthrough/amd/iommu_detect.c @@ -153,9 +153,8 @@ int __init amd_iommu_detect_one_acpi( =20 rt =3D pci_ro_device(iommu->seg, bus, PCI_DEVFN(dev, func)); if ( rt ) - printk(XENLOG_ERR - "Could not mark config space of %04x:%02x:%02x.%u read-only= (%d)\n", - iommu->seg, bus, dev, func, rt); + printk(XENLOG_ERR "Could not mark config space of %pp read-only (%= d)\n", + &PCI_SBDF2_T(iommu->seg, iommu->bdf), rt); =20 list_add_tail(&iommu->list, &amd_iommu_head); rt =3D 0; diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthr= ough/amd/iommu_init.c index fe0516f788..f39c67949f 100644 --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -793,9 +793,8 @@ static bool_t __init set_iommu_interrupt_handler(struct= amd_iommu *iommu) pcidevs_unlock(); if ( !iommu->msi.dev ) { - AMD_IOMMU_DEBUG("IOMMU: no pdev for %04x:%02x:%02x.%u\n", - iommu->seg, PCI_BUS(iommu->bdf), - PCI_SLOT(iommu->bdf), PCI_FUNC(iommu->bdf)); + AMD_IOMMU_DEBUG("IOMMU: no pdev for %pp\n", + &PCI_SBDF2_T(iommu->seg, iommu->bdf)); return 0; } control =3D pci_conf_read16(iommu->msi.dev->sbdf, @@ -838,9 +837,6 @@ static void amd_iommu_erratum_746_workaround(struct amd= _iommu *iommu) .seg =3D iommu->seg, .bdf =3D iommu->bdf, }; - u8 bus =3D PCI_BUS(iommu->bdf); - u8 dev =3D PCI_SLOT(iommu->bdf); - u8 func =3D PCI_FUNC(iommu->bdf); =20 if ( (boot_cpu_data.x86 !=3D 0x15) || (boot_cpu_data.x86_model < 0x10) || @@ -858,8 +854,7 @@ static void amd_iommu_erratum_746_workaround(struct amd= _iommu *iommu) =20 pci_conf_write32(sbdf, 0xf4, value | (1 << 2)); printk(XENLOG_INFO - "AMD-Vi: Applying erratum 746 workaround for IOMMU at %04x:%02x= :%02x.%u\n", - iommu->seg, bus, dev, func); + "AMD-Vi: Applying erratum 746 workaround for IOMMU at %pp\n", &= sbdf); =20 /* Clear the enable writing bit */ pci_conf_write32(sbdf, 0xf0, 0x90); diff --git a/xen/drivers/passthrough/amd/iommu_intr.c b/xen/drivers/passthr= ough/amd/iommu_intr.c index 71594cc27d..eca8decc05 100644 --- a/xen/drivers/passthrough/amd/iommu_intr.c +++ b/xen/drivers/passthrough/amd/iommu_intr.c @@ -511,8 +511,7 @@ static struct amd_iommu *_find_iommu_for_device(int seg= , int bdf) if ( iommu ) return iommu; =20 - AMD_IOMMU_DEBUG("No IOMMU for MSI dev =3D %04x:%02x:%02x.%u\n", - seg, PCI_BUS(bdf), PCI_SLOT(bdf), PCI_FUNC(bdf)); + AMD_IOMMU_DEBUG("No IOMMU for MSI dev =3D %pp\n", &PCI_SBDF2_T(seg, bd= f)); return ERR_PTR(-EINVAL); } =20 @@ -687,10 +686,7 @@ static int dump_intremap_mapping(u16 seg, struct ivrs_= mappings *ivrs_mapping) if ( !ivrs_mapping ) return 0; =20 - printk(" %04x:%02x:%02x:%u:\n", seg, - PCI_BUS(ivrs_mapping->dte_requestor_id), - PCI_SLOT(ivrs_mapping->dte_requestor_id), - PCI_FUNC(ivrs_mapping->dte_requestor_id)); + printk(" %pp:\n", &PCI_SBDF2_T(seg,ivrs_mapping->dte_requestor_id)); =20 spin_lock_irqsave(&(ivrs_mapping->intremap_lock), flags); dump_intremap_table(ivrs_mapping->intremap_table); diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/pass= through/amd/pci_amd_iommu.c index 0e4c5b4994..5787dff914 100644 --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -52,9 +52,8 @@ struct amd_iommu *find_iommu_for_device(int seg, int bdf) tmp.dte_requestor_id =3D bdf; ivrs_mappings[bdf] =3D tmp; =20 - printk(XENLOG_WARNING "%04x:%02x:%02x.%u not found in ACPI tab= les;" - " using same IOMMU as function 0\n", - seg, PCI_BUS(bdf), PCI_SLOT(bdf), PCI_FUNC(bdf)); + printk(XENLOG_WARNING "%pp not found in ACPI tables;" + " using same IOMMU as function 0\n", &PCI_SBDF2_T(seg, = bdf)); =20 /* write iommu field last */ ivrs_mappings[bdf].iommu =3D ivrs_mappings[bd0].iommu; @@ -306,9 +305,9 @@ static int reassign_device(struct domain *source, struc= t domain *target, if ( !iommu ) { AMD_IOMMU_DEBUG("Fail to find iommu." - " %04x:%02x:%x02.%x cannot be assigned to dom%d\n", - pdev->sbdf.seg, pdev->sbdf.bus, PCI_SLOT(devfn), - PCI_FUNC(devfn), target->domain_id); + " %pp cannot be assigned to dom%d\n", + &PCI_SBDF3_T(pdev->sbdf.seg, pdev->sbdf.bus, devfn= ), + target->domain_id); return -ENODEV; } =20 @@ -325,9 +324,9 @@ static int reassign_device(struct domain *source, struc= t domain *target, return rc; =20 amd_iommu_setup_domain_device(target, iommu, devfn, pdev); - AMD_IOMMU_DEBUG("Re-assign %04x:%02x:%02x.%u from dom%d to dom%d\n", - pdev->sbdf.seg, pdev->sbdf.bus, PCI_SLOT(devfn), - PCI_FUNC(devfn), source->domain_id, target->domain_id); + AMD_IOMMU_DEBUG("Re-assign %pp from dom%d to dom%d\n", + &PCI_SBDF3_T(pdev->sbdf.seg, pdev->sbdf.bus, devfn), + source->domain_id, target->domain_id); =20 return 0; } @@ -430,15 +429,12 @@ static int amd_iommu_add_device(u8 devfn, struct pci_= dev *pdev) if ( pdev->type =3D=3D DEV_TYPE_PCI_HOST_BRIDGE && is_hardware_domain(pdev->domain) ) { - AMD_IOMMU_DEBUG("Skipping host bridge %04x:%02x:%02x.%u\n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func); + AMD_IOMMU_DEBUG("Skipping host bridge %pp\n", &pdev->sbdf); return 0; } =20 - AMD_IOMMU_DEBUG("No iommu for %04x:%02x:%02x.%u; cannot be handed = to d%d\n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, pdev->domain->domain_id); + AMD_IOMMU_DEBUG("No iommu for %pp; cannot be handed to d%d\n", + &pdev->sbdf, pdev->domain->domain_id); return -ENODEV; } =20 @@ -457,9 +453,8 @@ static int amd_iommu_remove_device(u8 devfn, struct pci= _dev *pdev) if ( !iommu ) { AMD_IOMMU_DEBUG("Fail to find iommu." - " %04x:%02x:%02x.%u cannot be removed from dom%d\n= ", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, pdev->domain->domain_id); + " %pp cannot be removed from dom%d\n", + &pdev->sbdf, pdev->domain->domain_id); return -ENODEV; } =20 diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index 94fb3a183d..a9667ca21c 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -238,10 +238,6 @@ static void check_pdev(const struct pci_dev *pdev) (PCI_STATUS_PARITY | PCI_STATUS_SIG_TARGET_ABORT | \ PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_REC_MASTER_ABORT | \ PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY) - uint16_t seg =3D pdev->sbdf.seg; - uint8_t bus =3D pdev->sbdf.bus; - uint8_t dev =3D pdev->sbdf.dev; - uint8_t func =3D pdev->sbdf.func; u16 val; =20 if ( command_mask ) @@ -252,8 +248,8 @@ static void check_pdev(const struct pci_dev *pdev) val =3D pci_conf_read16(pdev->sbdf, PCI_STATUS); if ( val & PCI_STATUS_CHECK ) { - printk(XENLOG_INFO "%04x:%02x:%02x.%u status %04x -> %04x\n", - seg, bus, dev, func, val, val & ~PCI_STATUS_CHECK); + printk(XENLOG_INFO "%pp status %04x -> %04x\n", + &pdev->sbdf, val, val & ~PCI_STATUS_CHECK); pci_conf_write16(pdev->sbdf, PCI_STATUS, val & PCI_STATUS_CHEC= K); } } @@ -270,9 +266,8 @@ static void check_pdev(const struct pci_dev *pdev) val =3D pci_conf_read16(pdev->sbdf, PCI_SEC_STATUS); if ( val & PCI_STATUS_CHECK ) { - printk(XENLOG_INFO - "%04x:%02x:%02x.%u secondary status %04x -> %04x\n", - seg, bus, dev, func, val, val & ~PCI_STATUS_CHECK); + printk(XENLOG_INFO "%pp secondary status %04x -> %04x\n", + &pdev->sbdf, val, val & ~PCI_STATUS_CHECK); pci_conf_write16(pdev->sbdf, PCI_SEC_STATUS, val & PCI_STATUS_CHECK); } @@ -409,8 +404,8 @@ static struct pci_dev *alloc_pdev(struct pci_seg *pseg,= u8 bus, u8 devfn) break; =20 default: - printk(XENLOG_WARNING "%04x:%02x:%02x.%u: unknown type %d\n", - pseg->nr, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), pdev->= type); + printk(XENLOG_WARNING "%pp: unknown type %d\n", + &pdev->sbdf, pdev->type); break; } =20 @@ -642,9 +637,9 @@ unsigned int pci_size_mem_bar(pci_sbdf_t sbdf, unsigned= int pos, if ( flags & PCI_BAR_LAST ) { printk(XENLOG_WARNING - "%sdevice %04x:%02x:%02x.%u with 64-bit %sBAR in last s= lot\n", - (flags & PCI_BAR_VF) ? "SR-IOV " : "", sbdf.seg, sbdf.b= us, - sbdf.dev, sbdf.func, (flags & PCI_BAR_VF) ? "vf " : ""); + "%sdevice %pp with 64-bit %sBAR in last slot\n", + (flags & PCI_BAR_VF) ? "SR-IOV " : "", &sbdf, + (flags & PCI_BAR_VF) ? "vf " : ""); *psize =3D 0; return 1; } @@ -674,7 +669,7 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, { struct pci_seg *pseg; struct pci_dev *pdev; - unsigned int slot =3D PCI_SLOT(devfn), func =3D PCI_FUNC(devfn); + unsigned int func =3D PCI_FUNC(devfn); const char *pdev_type; int ret; bool pf_is_extfn =3D false; @@ -747,9 +742,8 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, PCI_BASE_ADDRESS_SPACE_IO ) { printk(XENLOG_WARNING - "SR-IOV device %04x:%02x:%02x.%u with vf BAR%u" - " in IO space\n", - seg, bus, slot, func, i); + "SR-IOV device %pp with vf BAR%u in IO space\n", + &pdev->sbdf, i); continue; } ret =3D pci_size_mem_bar(pdev->sbdf, idx, NULL, &pdev->vf_= rlen[i], @@ -762,9 +756,9 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, } else printk(XENLOG_WARNING - "SR-IOV device %04x:%02x:%02x.%u has its virtual" + "SR-IOV device %pp has its virtual" " functions already enabled (%04x)\n", - seg, bus, slot, func, ctrl); + &pdev->sbdf, ctrl); } =20 check_pdev(pdev); @@ -791,15 +785,13 @@ out: pcidevs_unlock(); if ( !ret ) { - printk(XENLOG_DEBUG "PCI add %s %04x:%02x:%02x.%u\n", pdev_type, - seg, bus, slot, func); + printk(XENLOG_DEBUG "PCI add %s %pp\n", pdev_type, &pdev->sbdf); while ( pdev->phantom_stride ) { func +=3D pdev->phantom_stride; if ( PCI_SLOT(func) ) break; - printk(XENLOG_DEBUG "PCI phantom %04x:%02x:%02x.%u\n", - seg, bus, slot, func); + printk(XENLOG_DEBUG "PCI phantom %pp\n", &pdev->sbdf); } } return ret; @@ -829,8 +821,8 @@ int pci_remove_device(u16 seg, u8 bus, u8 devfn) list_del(&pdev->domain_list); pci_cleanup_msi(pdev); free_pdev(pseg, pdev); - printk(XENLOG_DEBUG "PCI remove device %04x:%02x:%02x.%u\n", - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + printk(XENLOG_DEBUG "PCI remove device %pp\n", + &PCI_SBDF3_T(seg, bus, devfn)); break; } =20 @@ -889,7 +881,6 @@ static int pci_clean_dpci_irqs(struct domain *d) int pci_release_devices(struct domain *d) { struct pci_dev *pdev; - u8 bus, devfn; int ret; =20 pcidevs_lock(); @@ -900,14 +891,10 @@ int pci_release_devices(struct domain *d) return ret; } while ( (pdev =3D pci_get_pdev_by_domain(d, -1, -1, -1)) ) - { - bus =3D pdev->sbdf.bus; - devfn =3D pdev->sbdf.extfunc; - if ( deassign_device(d, pdev->sbdf.seg, bus, devfn) ) - printk("domain %d: deassign device (%04x:%02x:%02x.%u) failed!= \n", - d->domain_id, pdev->sbdf.seg, bus, - PCI_SLOT(devfn), PCI_FUNC(devfn)); - } + if ( deassign_device(d, pdev->sbdf.seg, pdev->sbdf.bus, + pdev->sbdf.extfunc) ) + printk("domain %d: deassign device (%pp) failed!\n", + d->domain_id, &pdev->sbdf); pcidevs_unlock(); =20 return 0; @@ -1059,8 +1046,8 @@ static int __init _scan_pci_devices(struct pci_seg *p= seg, void *arg) pdev =3D alloc_pdev(pseg, bus, PCI_DEVFN(dev, func)); if ( !pdev ) { - printk(XENLOG_WARNING "%04x:%02x:%02x.%u: alloc_pdev f= ailed\n", - pseg->nr, bus, dev, func); + printk(XENLOG_WARNING "%pp: alloc_pdev failed\n", + &PCI_SBDF_T(pseg->nr, bus, dev, func)); return -ENOMEM; } =20 @@ -1100,9 +1087,8 @@ static void __hwdom_init setup_one_hwdom_device(const= struct setup_hwdom *ctxt, err =3D ctxt->handler(devfn, pdev); if ( err ) { - printk(XENLOG_ERR "setup %04x:%02x:%02x.%u for d%d failed (%d)= \n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, ctxt->d->domain_id, err); + printk(XENLOG_ERR "setup %pp for d%d failed (%d)\n", + &pdev->sbdf, ctxt->d->domain_id, err); if ( devfn =3D=3D pdev->sbdf.extfunc ) return; } @@ -1143,9 +1129,8 @@ static int __hwdom_init _setup_hwdom_pci_devices(stru= ct pci_seg *pseg, void *arg pdev->domain =3D dom_xen; } else if ( pdev->domain !=3D ctxt->d ) - printk(XENLOG_WARNING "Dom%d owning %04x:%02x:%02x.%u?\n", - pdev->domain->domain_id, pseg->nr, bus, - PCI_SLOT(devfn), PCI_FUNC(devfn)); + printk(XENLOG_WARNING "Dom%d owning %pp?\n", + pdev->domain->domain_id, &pdev->sbdf); =20 if ( iommu_verbose ) { @@ -1280,8 +1265,8 @@ static int _dump_pci_devices(struct pci_seg *pseg, vo= id *arg) =20 list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) { - printk("%04x:%02x:%02x.%u - dom %-3d - node %-3d - MSIs < ", - pseg->nr, pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf.func, + printk("%pp - dom %-3d - node %-3d - MSIs < ", + &pdev->sbdf, pdev->domain ? pdev->domain->domain_id : -1, (pdev->node !=3D NUMA_NO_NODE) ? pdev->node : -1); list_for_each_entry ( msi, &pdev->msi_list, list ) @@ -1347,9 +1332,8 @@ static int iommu_add_device(struct pci_dev *pdev) return 0; rc =3D hd->platform_ops->add_device(devfn, pci_to_dev(pdev)); if ( rc ) - printk(XENLOG_WARNING "IOMMU: add %04x:%02x:%02x.%u failed (%d= )\n", - pdev->sbdf.seg, pdev->sbdf.bus, PCI_SLOT(devfn), - PCI_FUNC(devfn), rc); + printk(XENLOG_WARNING "IOMMU: add %pp failed (%d)\n", + &pdev->sbdf, rc); } } =20 @@ -1393,9 +1377,8 @@ static int iommu_remove_device(struct pci_dev *pdev) if ( !rc ) continue; =20 - printk(XENLOG_ERR "IOMMU: remove %04x:%02x:%02x.%u failed (%d)\n", - pdev->sbdf.seg, pdev->sbdf.bus, PCI_SLOT(devfn), PCI_FUNC(d= evfn), - rc); + printk(XENLOG_ERR "IOMMU: remove %pp failed (%d)\n", + &pdev->sbdf, rc); return rc; } =20 @@ -1465,9 +1448,8 @@ static int assign_device(struct domain *d, u16 seg, u= 8 bus, u8 devfn, u32 flag) break; rc =3D hd->platform_ops->assign_device(d, devfn, pci_to_dev(pdev),= flag); if ( rc ) - printk(XENLOG_G_WARNING "d%d: assign %04x:%02x:%02x.%u failed = (%d)\n", - d->domain_id, seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn= ), - rc); + printk(XENLOG_G_WARNING "d%d: assign %pp failed (%d)\n", + d->domain_id, &PCI_SBDF3_T(seg, bus, devfn), rc); } =20 done: @@ -1503,8 +1485,8 @@ int deassign_device(struct domain *d, u16 seg, u8 bus= , u8 devfn) if ( !ret ) continue; =20 - printk(XENLOG_G_ERR "d%d: deassign %04x:%02x:%02x.%u failed (%d)\n= ", - d->domain_id, seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), r= et); + printk(XENLOG_G_ERR "d%d: deassign %pp failed (%d)\n", + d->domain_id, &PCI_SBDF3_T(seg, bus, devfn), ret); return ret; } =20 @@ -1513,9 +1495,8 @@ int deassign_device(struct domain *d, u16 seg, u8 bus= , u8 devfn) pci_to_dev(pdev)); if ( ret ) { - dprintk(XENLOG_G_ERR, - "d%d: deassign device (%04x:%02x:%02x.%u) failed\n", - d->domain_id, seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + dprintk(XENLOG_G_ERR, "d%d: deassign device (%pp) failed\n", + d->domain_id, &PCI_SBDF3_T(seg, bus, devfn)); return ret; } =20 @@ -1590,10 +1571,8 @@ void iommu_dev_iotlb_flush_timeout(struct domain *d,= struct pci_dev *pdev) _pci_hide_device(pdev); =20 if ( !d->is_shutting_down && printk_ratelimit() ) - printk(XENLOG_ERR - "dom%d: ATS device %04x:%02x:%02x.%u flush failed\n", - d->domain_id, pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.de= v, - pdev->sbdf.func); + printk(XENLOG_ERR "dom%d: ATS device %pp flush failed\n", + d->domain_id, &pdev->sbdf); if ( !is_hardware_domain(d) ) domain_crash(d); =20 @@ -1682,9 +1661,8 @@ int iommu_do_pci_domctl( { if ( ret ) { - printk(XENLOG_G_INFO - "%04x:%02x:%02x.%u already assigned, or non-existen= t\n", - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + printk(XENLOG_G_INFO "%pp already assigned, or non-existen= t\n", + &PCI_SBDF3_T(seg, bus, devfn)); ret =3D -EINVAL; } break; @@ -1696,9 +1674,8 @@ int iommu_do_pci_domctl( "h", u_domctl); else if ( ret ) printk(XENLOG_G_ERR "XEN_DOMCTL_assign_device: " - "assign %04x:%02x:%02x.%u to dom%d failed (%d)\n", - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - d->domain_id, ret); + "assign %pp to dom%d failed (%d)\n", + &PCI_SBDF3_T(seg, bus, devfn), d->domain_id, ret); =20 break; =20 @@ -1732,10 +1709,8 @@ int iommu_do_pci_domctl( ret =3D deassign_device(d, seg, bus, devfn); pcidevs_unlock(); if ( ret ) - printk(XENLOG_G_ERR - "deassign %04x:%02x:%02x.%u from dom%d failed (%d)\n", - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - d->domain_id, ret); + printk(XENLOG_G_ERR "deassign %pp from dom%d failed (%d)\n", + &PCI_SBDF3_T(seg, bus, devfn), d->domain_id, ret); =20 break; =20 diff --git a/xen/drivers/passthrough/vtd/dmar.c b/xen/drivers/passthrough/v= td/dmar.c index 9d30188ab9..911494752f 100644 --- a/xen/drivers/passthrough/vtd/dmar.c +++ b/xen/drivers/passthrough/vtd/dmar.c @@ -367,18 +367,16 @@ static int __init acpi_parse_dev_scope( sec_bus =3D pci_conf_read8(sbdf, PCI_SECONDARY_BUS); sub_bus =3D pci_conf_read8(sbdf, PCI_SUBORDINATE_BUS); if ( iommu_verbose ) - printk(VTDPREFIX - " bridge: %04x:%02x:%02x.%u start=3D%x sec=3D%x sub= =3D%x\n", - seg, bus, path->dev, path->fn, - acpi_scope->bus, sec_bus, sub_bus); + printk(VTDPREFIX " bridge: %pp start=3D%x sec=3D%x sub=3D%= x\n", + &sbdf, acpi_scope->bus, sec_bus, sub_bus); =20 dmar_scope_add_buses(scope, sec_bus, sub_bus); break; } case ACPI_DMAR_SCOPE_TYPE_HPET: if ( iommu_verbose ) - printk(VTDPREFIX " MSI HPET: %04x:%02x:%02x.%u\n", - seg, bus, path->dev, path->fn); + printk(VTDPREFIX " MSI HPET: %pp\n", + &PCI_SBDF_T(seg, bus, path->dev, path->fn)); =20 if ( drhd ) { @@ -399,8 +397,8 @@ static int __init acpi_parse_dev_scope( =20 case ACPI_DMAR_SCOPE_TYPE_ENDPOINT: if ( iommu_verbose ) - printk(VTDPREFIX " endpoint: %04x:%02x:%02x.%u\n", - seg, bus, path->dev, path->fn); + printk(VTDPREFIX " endpoint: %pp\n", + &PCI_SBDF_T(seg, bus, path->dev, path->fn)); =20 if ( drhd ) { @@ -413,8 +411,8 @@ static int __init acpi_parse_dev_scope( =20 case ACPI_DMAR_SCOPE_TYPE_IOAPIC: if ( iommu_verbose ) - printk(VTDPREFIX " IOAPIC: %04x:%02x:%02x.%u\n", - seg, bus, path->dev, path->fn); + printk(VTDPREFIX " IOAPIC: %pp\n", + &PCI_SBDF_T(seg, bus, path->dev, path->fn)); =20 if ( drhd ) { @@ -543,8 +541,8 @@ acpi_parse_one_drhd(struct acpi_dmar_header *header) =20 if ( !pci_device_detect(drhd->segment, b, d, f) ) printk(XENLOG_WARNING VTDPREFIX - " Non-existent device (%04x:%02x:%02x.%u) in this D= RHD's scope!\n", - drhd->segment, b, d, f); + " Non-existent device (%pp) in this DRHD's scope!\n= ", + &PCI_SBDF_T(drhd->segment, b, d, f)); } =20 acpi_register_drhd_unit(dmaru); @@ -580,9 +578,9 @@ static int register_one_rmrr(struct acpi_rmrr_unit *rmr= ru) if ( pci_device_detect(rmrru->segment, b, d, f) =3D=3D 0 ) { dprintk(XENLOG_WARNING VTDPREFIX, - " Non-existent device (%04x:%02x:%02x.%u) is reported" + " Non-existent device (%pp) is reported" " in RMRR (%"PRIx64", %"PRIx64")'s scope!\n", - rmrru->segment, b, d, f, + &PCI_SBDF_T(rmrru->segment, b, d, f), rmrru->base_address, rmrru->end_address); ignore =3D true; } diff --git a/xen/drivers/passthrough/vtd/intremap.c b/xen/drivers/passthrou= gh/vtd/intremap.c index 0dbf99551e..bdf3758549 100644 --- a/xen/drivers/passthrough/vtd/intremap.c +++ b/xen/drivers/passthrough/vtd/intremap.c @@ -524,16 +524,13 @@ static void set_msi_source_id(struct pci_dev *pdev, s= truct iremap_entry *ire) } else dprintk(XENLOG_WARNING VTDPREFIX, - "d%d: no upstream bridge for %04x:%02x:%02x.%u\n", - pdev->domain->domain_id, - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + "d%d: no upstream bridge for %pp\n", + pdev->domain->domain_id, &pdev->sbdf); break; =20 default: - dprintk(XENLOG_WARNING VTDPREFIX, - "d%d: unknown(%u): %04x:%02x:%02x.%u\n", - pdev->domain->domain_id, pdev->type, - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + dprintk(XENLOG_WARNING VTDPREFIX, "d%d: unknown(%u): %pp\n", + pdev->domain->domain_id, pdev->type, &pdev->sbdf); break; } } diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/= vtd/iommu.c index 7b70732863..3942df04b5 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -882,27 +882,24 @@ static int iommu_page_fault_do_one(struct iommu *iomm= u, int type, { case DMA_REMAP: printk(XENLOG_G_WARNING VTDPREFIX - "DMAR:[%s] Request device [%04x:%02x:%02x.%u] " + "DMAR:[%s] Request device [%pp] " "fault addr %"PRIx64", iommu reg =3D %p\n", (type ? "DMA Read" : "DMA Write"), - seg, PCI_BUS(source_id), PCI_SLOT(source_id), - PCI_FUNC(source_id), addr, iommu->reg); + &PCI_SBDF2_T(seg, source_id), addr, iommu->reg); kind =3D "DMAR"; break; case INTR_REMAP: printk(XENLOG_G_WARNING VTDPREFIX - "INTR-REMAP: Request device [%04x:%02x:%02x.%u] " + "INTR-REMAP: Request device [%pp] " "fault index %"PRIx64", iommu reg =3D %p\n", - seg, PCI_BUS(source_id), PCI_SLOT(source_id), - PCI_FUNC(source_id), addr >> 48, iommu->reg); + &PCI_SBDF2_T(seg, source_id), addr >> 48, iommu->reg); kind =3D "INTR-REMAP"; break; default: printk(XENLOG_G_WARNING VTDPREFIX - "UNKNOWN: Request device [%04x:%02x:%02x.%u] " + "UNKNOWN: Request device [%pp] " "fault addr %"PRIx64", iommu reg =3D %p\n", - seg, PCI_BUS(source_id), PCI_SLOT(source_id), - PCI_FUNC(source_id), addr, iommu->reg); + &PCI_SBDF2_T(seg, source_id), addr, iommu->reg); kind =3D "UNKNOWN"; break; } @@ -1354,10 +1351,8 @@ int domain_context_mapping_one( { if ( pdev->domain !=3D domain ) { - printk(XENLOG_G_INFO VTDPREFIX - "d%d: %04x:%02x:%02x.%u owned by d%d!", - domain->domain_id, - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), + printk(XENLOG_G_INFO VTDPREFIX "d%d: %pp owned by d%d!", + domain->domain_id, &PCI_SBDF3_T(seg, bus, devfn), pdev->domain ? pdev->domain->domain_id : -1); res =3D -EINVAL; } @@ -1370,17 +1365,15 @@ int domain_context_mapping_one( if ( cdomain < 0 ) { printk(XENLOG_G_WARNING VTDPREFIX - "d%d: %04x:%02x:%02x.%u mapped, but can't find owne= r!\n", - domain->domain_id, - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + "d%d: %pp mapped, but can't find owner!\n", + domain->domain_id, &PCI_SBDF3_T(seg, bus, devfn)); res =3D -EINVAL; } else if ( cdomain !=3D domain->domain_id ) { printk(XENLOG_G_INFO VTDPREFIX - "d%d: %04x:%02x:%02x.%u already mapped to d%d!", - domain->domain_id, - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), + "d%d: %pp already mapped to d%d!", + domain->domain_id, &PCI_SBDF3_T(seg, bus, devfn), cdomain); res =3D -EINVAL; } @@ -1496,9 +1489,8 @@ static int domain_context_mapping(struct domain *doma= in, u8 devfn, { case DEV_TYPE_PCI_HOST_BRIDGE: if ( iommu_debug ) - printk(VTDPREFIX "d%d:Hostbridge: skip %04x:%02x:%02x.%u map\n= ", - domain->domain_id, seg, bus, - PCI_SLOT(devfn), PCI_FUNC(devfn)); + printk(VTDPREFIX "d%d:Hostbridge: skip %pp map\n", + domain->domain_id, &pdev->sbdf); if ( !is_hardware_domain(domain) ) return -EPERM; break; @@ -1510,9 +1502,8 @@ static int domain_context_mapping(struct domain *doma= in, u8 devfn, =20 case DEV_TYPE_PCIe_ENDPOINT: if ( iommu_debug ) - printk(VTDPREFIX "d%d:PCIe: map %04x:%02x:%02x.%u\n", - domain->domain_id, seg, bus, - PCI_SLOT(devfn), PCI_FUNC(devfn)); + printk(VTDPREFIX "d%d:PCIe: map %pp\n", + domain->domain_id, &PCI_SBDF3_T(seg, bus, devfn)); ret =3D domain_context_mapping_one(domain, drhd->iommu, bus, devfn, pdev); if ( !ret && devfn =3D=3D pdev->sbdf.extfunc && ats_device(pdev, d= rhd) > 0 ) @@ -1522,9 +1513,8 @@ static int domain_context_mapping(struct domain *doma= in, u8 devfn, =20 case DEV_TYPE_PCI: if ( iommu_debug ) - printk(VTDPREFIX "d%d:PCI: map %04x:%02x:%02x.%u\n", - domain->domain_id, seg, bus, - PCI_SLOT(devfn), PCI_FUNC(devfn)); + printk(VTDPREFIX "d%d:PCI: map %pp\n", + domain->domain_id, &PCI_SBDF3_T(seg, bus, devfn)); =20 ret =3D domain_context_mapping_one(domain, drhd->iommu, bus, devfn, pdev); @@ -1550,9 +1540,8 @@ static int domain_context_mapping(struct domain *doma= in, u8 devfn, break; =20 default: - dprintk(XENLOG_ERR VTDPREFIX, "d%d:unknown(%u): %04x:%02x:%02x.%u\= n", - domain->domain_id, pdev->type, - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + dprintk(XENLOG_ERR VTDPREFIX, "d%d:unknown(%u): %pp\n", + domain->domain_id, pdev->type, &PCI_SBDF3_T(seg, bus, devf= n)); ret =3D -EINVAL; break; } @@ -1648,9 +1637,8 @@ static int domain_context_unmap(struct domain *domain= , u8 devfn, { case DEV_TYPE_PCI_HOST_BRIDGE: if ( iommu_debug ) - printk(VTDPREFIX "d%d:Hostbridge: skip %04x:%02x:%02x.%u unmap= \n", - domain->domain_id, seg, bus, - PCI_SLOT(devfn), PCI_FUNC(devfn)); + printk(VTDPREFIX "d%d:Hostbridge: skip %pp unmap\n", + domain->domain_id, &pdev->sbdf); if ( !is_hardware_domain(domain) ) return -EPERM; goto out; @@ -1662,9 +1650,8 @@ static int domain_context_unmap(struct domain *domain= , u8 devfn, =20 case DEV_TYPE_PCIe_ENDPOINT: if ( iommu_debug ) - printk(VTDPREFIX "d%d:PCIe: unmap %04x:%02x:%02x.%u\n", - domain->domain_id, seg, bus, - PCI_SLOT(devfn), PCI_FUNC(devfn)); + printk(VTDPREFIX "d%d:PCIe: unmap %pp\n", + domain->domain_id, &PCI_SBDF3_T(seg, bus, devfn)); ret =3D domain_context_unmap_one(domain, iommu, bus, devfn); if ( !ret && devfn =3D=3D pdev->sbdf.extfunc && ats_device(pdev, d= rhd) > 0 ) disable_ats_device(pdev); @@ -1673,8 +1660,8 @@ static int domain_context_unmap(struct domain *domain= , u8 devfn, =20 case DEV_TYPE_PCI: if ( iommu_debug ) - printk(VTDPREFIX "d%d:PCI: unmap %04x:%02x:%02x.%u\n", - domain->domain_id, seg, bus, PCI_SLOT(devfn), PCI_FUNC(= devfn)); + printk(VTDPREFIX "d%d:PCI: unmap %pp\n", + domain->domain_id, &PCI_SBDF3_T(seg, bus, devfn)); ret =3D domain_context_unmap_one(domain, iommu, bus, devfn); if ( ret ) break; @@ -1699,9 +1686,8 @@ static int domain_context_unmap(struct domain *domain= , u8 devfn, break; =20 default: - dprintk(XENLOG_ERR VTDPREFIX, "d%d:unknown(%u): %04x:%02x:%02x.%u\= n", - domain->domain_id, pdev->type, - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + dprintk(XENLOG_ERR VTDPREFIX, "d%d:unknown(%u): %pp\n", + domain->domain_id, pdev->type, &PCI_SBDF3_T(seg, bus, devf= n)); ret =3D -EINVAL; goto out; } @@ -2499,11 +2485,11 @@ static int intel_iommu_assign_device( bool_t relaxed =3D !!(flag & XEN_DOMCTL_DEV_RDM_RELAXED); =20 printk(XENLOG_GUEST "%s" VTDPREFIX - " It's %s to assign %04x:%02x:%02x.%u" + " It's %s to assign %pp" " with shared RMRR at %"PRIx64" for Dom%d.\n", relaxed ? XENLOG_WARNING : XENLOG_ERR, relaxed ? "risky" : "disallowed", - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), + &PCI_SBDF3_T(seg, bus, devfn), rmrr->base_address, d->domain_id); if ( !relaxed ) return -EPERM; diff --git a/xen/drivers/passthrough/vtd/quirks.c b/xen/drivers/passthrough= /vtd/quirks.c index 48c7384b82..0302c503fb 100644 --- a/xen/drivers/passthrough/vtd/quirks.c +++ b/xen/drivers/passthrough/vtd/quirks.c @@ -428,8 +428,6 @@ void pci_vtd_quirk(const struct pci_dev *pdev) { int seg =3D pdev->sbdf.seg; int bus =3D pdev->sbdf.bus; - int dev =3D pdev->sbdf.dev; - int func =3D pdev->sbdf.func; int pos; bool_t ff; u32 val, val2; @@ -454,8 +452,7 @@ void pci_vtd_quirk(const struct pci_dev *pdev) case 0x3c28: /* Sandybridge */ val =3D pci_conf_read32(pdev->sbdf, 0x1AC); pci_conf_write32(pdev->sbdf, 0x1AC, val | (1 << 31)); - printk(XENLOG_INFO "Masked VT-d error signaling on %04x:%02x:%02x.= %u\n", - seg, bus, dev, func); + printk(XENLOG_INFO "Masked VT-d error signaling on %pp\n", &pdev->= sbdf); break; =20 /* Tylersburg (EP)/Boxboro (MP) chipsets (NHM-EP/EX, WSM-EP/EX) */ @@ -490,8 +487,7 @@ void pci_vtd_quirk(const struct pci_dev *pdev) ff =3D pcie_aer_get_firmware_first(pdev); if ( !pos ) { - printk(XENLOG_WARNING "%04x:%02x:%02x.%u without AER capabilit= y?\n", - seg, bus, dev, func); + printk(XENLOG_WARNING "%pp without AER capability?\n", &pdev->= sbdf); break; } =20 @@ -514,8 +510,7 @@ void pci_vtd_quirk(const struct pci_dev *pdev) val =3D pci_conf_read32(pdev->sbdf, 0x20c); pci_conf_write32(pdev->sbdf, 0x20c, val | (1 << 4)); =20 - printk(XENLOG_INFO "%s UR signaling on %04x:%02x:%02x.%u\n", - action, seg, bus, dev, func); + printk(XENLOG_INFO "%s UR signaling on %pp\n", action, &pdev->sbdf= ); break; =20 case 0x0040: case 0x0044: case 0x0048: /* Nehalem/Westmere */ @@ -540,16 +535,16 @@ void pci_vtd_quirk(const struct pci_dev *pdev) { __set_bit(0x1c8 * 8 + 20, va); iounmap(va); - printk(XENLOG_INFO "Masked UR signaling on %04x:%02x:%02x.= %u\n", - seg, bus, dev, func); + printk(XENLOG_INFO "Masked UR signaling on %pp\n", + &pdev->sbdf); } else - printk(XENLOG_ERR "Could not map %"PRIpaddr" for %04x:%02x= :%02x.%u\n", - pa, seg, bus, dev, func); + printk(XENLOG_ERR "Could not map %"PRIpaddr" for %pp\n", + pa, &pdev->sbdf); } else - printk(XENLOG_WARNING "Bogus DMIBAR %#"PRIx64" on %04x:%02x:%0= 2x.%u\n", - bar, seg, bus, dev, func); + printk(XENLOG_WARNING "Bogus DMIBAR %#"PRIx64" on %pp\n", + bar, &pdev->sbdf); break; } } diff --git a/xen/drivers/passthrough/vtd/utils.c b/xen/drivers/passthrough/= vtd/utils.c index 94a6e4eec9..5665bf7697 100644 --- a/xen/drivers/passthrough/vtd/utils.c +++ b/xen/drivers/passthrough/vtd/utils.c @@ -95,9 +95,9 @@ void print_vtd_entries(struct iommu *iommu, int bus, int = devfn, u64 gmfn) u64 *l, val; u32 l_index, level; =20 - printk("print_vtd_entries: iommu #%u dev %04x:%02x:%02x.%u gmfn %"PRI_= gfn"\n", - iommu->index, iommu->intel->drhd->segment, bus, - PCI_SLOT(devfn), PCI_FUNC(devfn), gmfn); + printk("print_vtd_entries: iommu #%u dev %pp gmfn %"PRI_gfn"\n", + iommu->index, &PCI_SBDF3_T(iommu->intel->drhd->segment, bus, de= vfn), + gmfn); =20 if ( iommu->root_maddr =3D=3D 0 ) { diff --git a/xen/drivers/passthrough/x86/ats.c b/xen/drivers/passthrough/x8= 6/ats.c index c3203793a6..cfd610229d 100644 --- a/xen/drivers/passthrough/x86/ats.c +++ b/xen/drivers/passthrough/x86/ats.c @@ -31,8 +31,7 @@ int enable_ats_device(struct pci_dev *pdev, struct list_h= ead *ats_list) BUG_ON(!pos); =20 if ( iommu_verbose ) - dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS capability found\n", - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + dprintk(XENLOG_INFO, "%pp: ATS capability found\n", &pdev->sbdf); =20 value =3D pci_conf_read16(pdev->sbdf, pos + ATS_REG_CTL); if ( value & ATS_ENABLE ) @@ -63,9 +62,8 @@ int enable_ats_device(struct pci_dev *pdev, struct list_h= ead *ats_list) } =20 if ( iommu_verbose ) - dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS %s enabled\n", - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - pos ? "is" : "was"); + dprintk(XENLOG_INFO, "%pp: ATS %s enabled\n", + &pdev->sbdf, pos ? "is" : "was"); =20 return pos; } @@ -73,8 +71,6 @@ int enable_ats_device(struct pci_dev *pdev, struct list_h= ead *ats_list) void disable_ats_device(struct pci_dev *pdev) { u32 value; - uint16_t seg =3D pdev->sbdf.seg; - uint8_t bus =3D pdev->sbdf.bus, devfn =3D pdev->sbdf.extfunc; =20 BUG_ON(!pdev->ats.cap_pos); =20 @@ -85,6 +81,5 @@ void disable_ats_device(struct pci_dev *pdev) list_del(&pdev->ats.list); =20 if ( iommu_verbose ) - dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS is disabled\n", - seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + dprintk(XENLOG_INFO, "%pp: ATS is disabled\n", &pdev->sbdf); } diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index d693b1376c..ddda881366 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -371,9 +371,8 @@ static void bar_write(const struct pci_dev *pdev, unsig= ned int reg, /* If the value written is the current one avoid printing a warnin= g. */ if ( val !=3D (uint32_t)(bar->addr >> (hi ? 32 : 0)) ) gprintk(XENLOG_WARNING, - "%04x:%02x:%02x.%u: ignored BAR %lu write with memory = decoding enabled\n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, bar - pdev->vpci->header.bars + hi); + "%pp: ignored BAR %lu write with memory decoding enabl= ed\n", + &pdev->sbdf, bar - pdev->vpci->header.bars + hi); return; } =20 @@ -407,9 +406,8 @@ static void rom_write(const struct pci_dev *pdev, unsig= ned int reg, if ( (cmd & PCI_COMMAND_MEMORY) && header->rom_enabled && new_enabled ) { gprintk(XENLOG_WARNING, - "%04x:%02x:%02x.%u: ignored ROM BAR write with memory deco= ding enabled\n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func); + "%pp: ignored ROM BAR write with memory decoding enabled\n= ", + &pdev->sbdf); return; } =20 diff --git a/xen/drivers/vpci/msi.c b/xen/drivers/vpci/msi.c index 4f2e55f3fd..2bdae48edf 100644 --- a/xen/drivers/vpci/msi.c +++ b/xen/drivers/vpci/msi.c @@ -290,8 +290,7 @@ void vpci_dump_msi(void) msi =3D pdev->vpci->msi; if ( msi && msi->enabled ) { - printk("%04x:%02x:%02x.%u MSI\n", pdev->sbdf.seg, - pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf.func); + printk("%pp MSI\n", &pdev->sbdf); =20 printk(" enabled: %d 64-bit: %d", msi->enabled, msi->address64); @@ -308,8 +307,7 @@ void vpci_dump_msi(void) { int rc; =20 - printk("%04x:%02x:%02x.%u MSI-X\n", pdev->sbdf.seg, - pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf.func); + printk("%pp MSI-X\n", &pdev->sbdf); =20 printk(" entries: %u maskall: %d enabled: %d\n", msix->max_entries, msix->masked, msix->enabled); diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c index 47d569121f..1006b01f4b 100644 --- a/xen/drivers/vpci/msix.c +++ b/xen/drivers/vpci/msix.c @@ -48,9 +48,8 @@ static int update_entry(struct vpci_msix_entry *entry, if ( rc && rc !=3D -ENOENT ) { gprintk(XENLOG_WARNING, - "%04x:%02x:%02x.%u: unable to disable entry %u for update:= %d\n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf= .func, - nr, rc); + "%pp: unable to disable entry %u for update: %d\n", + &pdev->sbdf, nr, rc); return rc; } =20 @@ -59,10 +58,8 @@ static int update_entry(struct vpci_msix_entry *entry, VPCI_MSIX_TABLE)); if ( rc ) { - gprintk(XENLOG_WARNING, - "%04x:%02x:%02x.%u: unable to enable entry %u: %d\n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf= .func, - nr, rc); + gprintk(XENLOG_WARNING, "%pp: unable to enable entry %u: %d\n", + &pdev->sbdf, nr, rc); /* Entry is likely not properly configured. */ return rc; } @@ -133,10 +130,8 @@ static void control_write(const struct pci_dev *pdev, = unsigned int reg, /* Ignore non-present entry. */ break; default: - gprintk(XENLOG_WARNING, - "%04x:%02x:%02x.%u: unable to disable entry %u: %d= \n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, i, rc); + gprintk(XENLOG_WARNING, "%pp: unable to disable entry %u: = %d\n", + &pdev->sbdf, i, rc); return; } } @@ -181,8 +176,7 @@ static bool access_allowed(const struct pci_dev *pdev, = unsigned long addr, return true; =20 gprintk(XENLOG_WARNING, - "%04x:%02x:%02x.%u: unaligned or invalid size MSI-X table acce= ss\n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, pdev->sbdf.fun= c); + "%pp: unaligned or invalid size MSI-X table access\n", &pdev->= sbdf); =20 return false; } @@ -432,10 +426,9 @@ int vpci_make_msix_hole(const struct pci_dev *pdev) default: put_gfn(d, start); gprintk(XENLOG_WARNING, - "%04x:%02x:%02x.%u: existing mapping (mfn: %" PRI_= mfn + "%pp: existing mapping (mfn: %" PRI_mfn "type: %d) at %#lx clobbers MSIX MMIO area\n", - pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.dev, - pdev->sbdf.func, mfn_x(mfn), t, start); + &pdev->sbdf, mfn_x(mfn), t, start); return -EEXIST; } put_gfn(d, start); diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index 9908d0fe5d..5e345c417f 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -60,6 +60,8 @@ typedef union { =20 #define PCI_SBDF_T(s, b, d, f) \ ((pci_sbdf_t) { .seg =3D (s), .bus =3D (b), .dev =3D (d), .func =3D (f= ) }) +#define PCI_SBDF2_T(s, b) \ + ((pci_sbdf_t) { .seg =3D (s), .bdf =3D (b) }) #define PCI_SBDF3_T(s, b, e) \ ((pci_sbdf_t) { .seg =3D (s), .bus =3D (b), .extfunc =3D (e) }) =20 --=20 2.17.2 (Apple Git-113) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Fri Mar 29 06:44:45 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1557504809; cv=none; d=zoho.com; s=zohoarc; b=duXVUGjne0CvTj7u94UILAGN2ysoChEVmHwsUOTFJfOhoo/tmacAMLR047vPjO7S18fT40FcsVqbfUDyUDRPShfLyvhS/yACi/vsanHXqCpaaa8NgMECdXtWXVZoY8HNw/yGTuzyLUa+6XbT26hwxYuuJ0Asx9Oyyv0NngHER1A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1557504809; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=uyPyQHfnFRAztEvebhZ4iQ5diCieuYHPq/l1RSNRw5g=; b=ndYCSeYNXGuL9MjGFriQDrR2/n6DGuXu74RmxzC4ZPXoepB335jptpxyX5JJ4di484fr+EDZZjN74FSaEqpnGv9MD6tmp3Aqx3/5xxNeozxvBZdNntGkzQU5y3/KEcbfUoqYRHaxo3217/TUJuUejZtc+hSpqLJ7iI+nA0WxUII= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 155750480988968.84806980435201; Fri, 10 May 2019 09:13:29 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hP87z-0004fh-7J; Fri, 10 May 2019 16:12:07 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hP87x-0004f8-BA for xen-devel@lists.xenproject.org; Fri, 10 May 2019 16:12:05 +0000 Received: from SMTP03.CITRIX.COM (unknown [162.221.156.55]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 585e520a-733e-11e9-8edb-efea701647df; Fri, 10 May 2019 16:12:02 +0000 (UTC) X-Inumbo-ID: 585e520a-733e-11e9-8edb-efea701647df X-IronPort-AV: E=Sophos;i="5.60,453,1549929600"; d="scan'208";a="85330726" From: Roger Pau Monne To: Date: Fri, 10 May 2019 18:10:56 +0200 Message-ID: <20190510161056.48648-6-roger.pau@citrix.com> X-Mailer: git-send-email 2.17.2 (Apple Git-113) In-Reply-To: <20190510161056.48648-1-roger.pau@citrix.com> References: <20190510161056.48648-1-roger.pau@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH 5/5] pci: switch PCI capabilities related functions to use pci_sbdf_t X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Kevin Tian , Stefano Stabellini , Wei Liu , Suravee Suthikulpanit , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich , Brian Woods , Roger Pau Monne Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Since pci_dev already has a pci_sbdf_t field switch the capability related functions SBDF parameters to a single pci_sbdf_t parameter. No functional change expected. Signed-off-by: Roger Pau Monn=C3=A9 --- Cc: Jan Beulich Cc: Andrew Cooper Cc: Wei Liu Cc: George Dunlap Cc: Ian Jackson Cc: Julien Grall Cc: Konrad Rzeszutek Wilk Cc: Stefano Stabellini Cc: Tim Deegan Cc: Suravee Suthikulpanit Cc: Brian Woods Cc: Kevin Tian --- xen/arch/x86/msi.c | 42 ++++++---------------- xen/drivers/char/ehci-dbgp.c | 3 +- xen/drivers/passthrough/amd/iommu_detect.c | 2 +- xen/drivers/passthrough/ats.h | 12 +++++-- xen/drivers/passthrough/pci.c | 22 +++++------- xen/drivers/passthrough/vtd/quirks.c | 12 +++---- xen/drivers/passthrough/vtd/x86/ats.c | 3 +- xen/drivers/passthrough/x86/ats.c | 4 +-- xen/drivers/pci/pci.c | 31 +++++----------- xen/drivers/vpci/msi.c | 4 +-- xen/drivers/vpci/msix.c | 4 +-- xen/include/xen/pci.h | 9 ++--- 12 files changed, 52 insertions(+), 96 deletions(-) diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index 6832211772..27ea11b769 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -339,7 +339,7 @@ static void msi_set_enable(struct pci_dev *dev, int ena= ble) uint8_t slot =3D dev->sbdf.dev; uint8_t func =3D dev->sbdf.func; =20 - pos =3D pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSI); + pos =3D pci_find_cap_offset(dev->sbdf, PCI_CAP_ID_MSI); if ( pos ) __msi_set_enable(seg, bus, slot, func, pos, enable); } @@ -347,12 +347,9 @@ static void msi_set_enable(struct pci_dev *dev, int en= able) static void msix_set_enable(struct pci_dev *dev, int enable) { int pos; - uint16_t control, seg =3D dev->sbdf.seg; - uint8_t bus =3D dev->sbdf.bus; - uint8_t slot =3D dev->sbdf.dev; - uint8_t func =3D dev->sbdf.func; + uint16_t control; =20 - pos =3D pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSIX); + pos =3D pci_find_cap_offset(dev->sbdf, PCI_CAP_ID_MSIX); if ( pos ) { control =3D pci_conf_read16(dev->sbdf, msix_control_reg(pos)); @@ -669,13 +666,10 @@ static int msi_capability_init(struct pci_dev *dev, struct msi_desc *entry; int pos; unsigned int i, maxvec, mpos; - uint16_t control, seg =3D dev->sbdf.seg; - uint8_t bus =3D dev->sbdf.bus; - uint8_t slot =3D dev->sbdf.dev; - uint8_t func =3D dev->sbdf.func; + uint16_t control; =20 ASSERT(pcidevs_locked()); - pos =3D pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSI); + pos =3D pci_find_cap_offset(dev->sbdf, PCI_CAP_ID_MSI); if ( !pos ) return -ENODEV; control =3D pci_conf_read16(dev->sbdf, msi_control_reg(pos)); @@ -752,9 +746,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, u= 8 func, u8 bir, int vf) if ( vf >=3D 0 ) { struct pci_dev *pdev =3D pci_get_pdev(seg, bus, PCI_DEVFN(slot, fu= nc)); - unsigned int pos =3D pci_find_ext_capability(seg, bus, - PCI_DEVFN(slot, func), - PCI_EXT_CAP_ID_SRIOV); + unsigned int pos =3D pci_find_ext_capability(sbdf, PCI_EXT_CAP_ID_= SRIOV); u16 ctrl =3D pci_conf_read16(sbdf, pos + PCI_SRIOV_CTRL); u16 num_vf =3D pci_conf_read16(sbdf, pos + PCI_SRIOV_NUM_VF); u16 offset =3D pci_conf_read16(sbdf, pos + PCI_SRIOV_VF_OFFSET); @@ -1096,13 +1088,12 @@ static int __pci_enable_msix(struct msi_info *msi, = struct msi_desc **desc) int pos, nr_entries; struct pci_dev *pdev; u16 control; - u8 slot =3D PCI_SLOT(msi->devfn); - u8 func =3D PCI_FUNC(msi->devfn); struct msi_desc *old_desc; =20 ASSERT(pcidevs_locked()); pdev =3D pci_get_pdev(msi->seg, msi->bus, msi->devfn); - pos =3D pci_find_cap_offset(msi->seg, msi->bus, slot, func, PCI_CAP_ID= _MSIX); + pos =3D pci_find_cap_offset(PCI_SBDF3_T(msi->seg, msi->bus, msi->devfn= ), + PCI_CAP_ID_MSIX); if ( !pdev || !pos ) return -ENODEV; =20 @@ -1145,12 +1136,7 @@ static void _pci_cleanup_msix(struct arch_msix *msix) static void __pci_disable_msix(struct msi_desc *entry) { struct pci_dev *dev =3D entry->dev; - uint16_t seg =3D dev->sbdf.seg; - uint8_t bus =3D dev->sbdf.bus; - uint8_t slot =3D dev->sbdf.dev; - uint8_t func =3D dev->sbdf.func; - unsigned int pos =3D pci_find_cap_offset(seg, bus, slot, func, - PCI_CAP_ID_MSIX); + unsigned int pos =3D pci_find_cap_offset(dev->sbdf, PCI_CAP_ID_MSIX); uint16_t control =3D pci_conf_read16(dev->sbdf, msix_control_reg(entry->msi_attrib.= pos)); bool maskall =3D dev->msix->host_maskall; @@ -1186,8 +1172,7 @@ int pci_prepare_msix(u16 seg, u8 bus, u8 devfn, bool = off) { int rc; struct pci_dev *pdev; - u8 slot =3D PCI_SLOT(devfn), func =3D PCI_FUNC(devfn); - unsigned int pos =3D pci_find_cap_offset(seg, bus, slot, func, + unsigned int pos =3D pci_find_cap_offset(PCI_SBDF3_T(seg, bus, devfn), PCI_CAP_ID_MSIX); =20 if ( !use_msi ) @@ -1267,10 +1252,6 @@ void pci_cleanup_msi(struct pci_dev *pdev) int pci_msi_conf_write_intercept(struct pci_dev *pdev, unsigned int reg, unsigned int size, uint32_t *data) { - uint16_t seg =3D pdev->sbdf.seg; - uint8_t bus =3D pdev->sbdf.bus; - uint8_t slot =3D pdev->sbdf.dev; - uint8_t func =3D pdev->sbdf.func; struct msi_desc *entry; unsigned int pos; =20 @@ -1278,8 +1259,7 @@ int pci_msi_conf_write_intercept(struct pci_dev *pdev= , unsigned int reg, { entry =3D find_msi_entry(pdev, -1, PCI_CAP_ID_MSIX); pos =3D entry ? entry->msi_attrib.pos - : pci_find_cap_offset(seg, bus, slot, func, - PCI_CAP_ID_MSIX); + : pci_find_cap_offset(pdev->sbdf, PCI_CAP_ID_MSIX); ASSERT(pos); =20 if ( reg >=3D pos && reg < msix_pba_offset_reg(pos) + 4 ) diff --git a/xen/drivers/char/ehci-dbgp.c b/xen/drivers/char/ehci-dbgp.c index 4cd4157353..27bd4b935d 100644 --- a/xen/drivers/char/ehci-dbgp.c +++ b/xen/drivers/char/ehci-dbgp.c @@ -688,7 +688,8 @@ static unsigned int __init __find_dbgp(u8 bus, u8 slot,= u8 func) if ( (class >> 8) !=3D PCI_CLASS_SERIAL_USB_EHCI ) return 0; =20 - return pci_find_cap_offset(0, bus, slot, func, PCI_CAP_ID_EHCI_DEBUG); + return pci_find_cap_offset(PCI_SBDF_T(0, bus, slot, func), + PCI_CAP_ID_EHCI_DEBUG); } =20 static unsigned int __init find_dbgp(struct ehci_dbgp *dbgp, diff --git a/xen/drivers/passthrough/amd/iommu_detect.c b/xen/drivers/passt= hrough/amd/iommu_detect.c index 91f5ea6bff..3b36827c14 100644 --- a/xen/drivers/passthrough/amd/iommu_detect.c +++ b/xen/drivers/passthrough/amd/iommu_detect.c @@ -30,7 +30,7 @@ static int __init get_iommu_msi_capabilities( { int pos; =20 - pos =3D pci_find_cap_offset(seg, bus, dev, func, PCI_CAP_ID_MSI); + pos =3D pci_find_cap_offset(PCI_SBDF_T(seg, bus, dev, func), PCI_CAP_I= D_MSI); =20 if ( !pos ) return -ENODEV; diff --git a/xen/drivers/passthrough/ats.h b/xen/drivers/passthrough/ats.h index e83a45d16e..3b996c748a 100644 --- a/xen/drivers/passthrough/ats.h +++ b/xen/drivers/passthrough/ats.h @@ -31,11 +31,16 @@ static inline int pci_ats_enabled(int seg, int bus, int= devfn) { u32 value; int pos; + const pci_sbdf_t sbdf =3D { + .seg =3D seg, + .bus =3D bus, + .extfunc =3D devfn, + }; =20 - pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS); + pos =3D pci_find_ext_capability(sbdf, PCI_EXT_CAP_ID_ATS); BUG_ON(!pos); =20 - value =3D pci_conf_read16(PCI_SBDF3_T(seg, bus, devfn), pos + ATS_REG_= CTL); + value =3D pci_conf_read16(sbdf, pos + ATS_REG_CTL); =20 return value & ATS_ENABLE; } @@ -45,7 +50,8 @@ static inline int pci_ats_device(int seg, int bus, int de= vfn) if ( !ats_enabled ) return 0; =20 - return pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS); + return pci_find_ext_capability(PCI_SBDF3_T(seg, bus, devfn), + PCI_EXT_CAP_ID_ATS); } =20 #endif /* _ATS_H_ */ diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index a9667ca21c..cfe2dda733 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -332,8 +332,7 @@ static struct pci_dev *alloc_pdev(struct pci_seg *pseg,= u8 bus, u8 devfn) pdev->domain =3D NULL; INIT_LIST_HEAD(&pdev->msi_list); =20 - if ( pci_find_cap_offset(pseg->nr, bus, PCI_SLOT(devfn), PCI_FUNC(devf= n), - PCI_CAP_ID_MSIX) ) + if ( pci_find_cap_offset(pdev->sbdf, PCI_CAP_ID_MSIX) ) { struct arch_msix *msix =3D xzalloc(struct arch_msix); =20 @@ -371,8 +370,7 @@ static struct pci_dev *alloc_pdev(struct pci_seg *pseg,= u8 bus, u8 devfn) break; =20 case DEV_TYPE_PCIe_ENDPOINT: - pos =3D pci_find_cap_offset(pseg->nr, bus, PCI_SLOT(devfn), - PCI_FUNC(devfn), PCI_CAP_ID_EXP); + pos =3D pci_find_cap_offset(pdev->sbdf, PCI_CAP_ID_EXP); BUG_ON(!pos); cap =3D pci_conf_read16(pdev->sbdf, pos + PCI_EXP_DEVCAP); if ( cap & PCI_EXP_DEVCAP_PHANTOM ) @@ -585,13 +583,12 @@ struct pci_dev *pci_get_pdev_by_domain(const struct d= omain *d, int seg, static void pci_enable_acs(struct pci_dev *pdev) { int pos; - uint16_t cap, ctrl, seg =3D pdev->sbdf.seg; - uint8_t bus =3D pdev->sbdf.bus; + uint16_t cap, ctrl; =20 if ( !iommu_enabled ) return; =20 - pos =3D pci_find_ext_capability(seg, bus, pdev->sbdf.extfunc, PCI_EXT_= CAP_ID_ACS); + pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ACS); if (!pos) return; =20 @@ -722,7 +719,7 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, =20 if ( !pdev->info.is_virtfn && !pdev->vf_rlen[0] ) { - unsigned int pos =3D pci_find_ext_capability(seg, bus, devfn, + unsigned int pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_SRIOV); u16 ctrl =3D pci_conf_read16(pdev->sbdf, pos + PCI_SRIOV_CTRL); =20 @@ -907,13 +904,13 @@ enum pdev_type pdev_type(u16 seg, u8 bus, u8 devfn) { u16 class_device, creg; u8 d =3D PCI_SLOT(devfn), f =3D PCI_FUNC(devfn); - int pos =3D pci_find_cap_offset(seg, bus, d, f, PCI_CAP_ID_EXP); const pci_sbdf_t sbdf =3D { .seg =3D seg, .bus =3D bus, .dev =3D d, .func =3D f, }; + int pos =3D pci_find_cap_offset(sbdf, PCI_CAP_ID_EXP); =20 class_device =3D pci_conf_read16(sbdf, PCI_CLASS_DEVICE); switch ( class_device ) @@ -1177,9 +1174,7 @@ static int hest_match_pci(const struct acpi_hest_aer_= common *p, static bool_t hest_match_type(const struct acpi_hest_header *hest_hdr, const struct pci_dev *pdev) { - unsigned int pos =3D pci_find_cap_offset(pdev->sbdf.seg, pdev->sbdf.bu= s, - pdev->sbdf.dev, pdev->sbdf.func, - PCI_CAP_ID_EXP); + unsigned int pos =3D pci_find_cap_offset(pdev->sbdf, PCI_CAP_ID_EXP); uint8_t pcie =3D MASK_EXTR(pci_conf_read16(pdev->sbdf, pos + PCI_EXP_F= LAGS), PCI_EXP_FLAGS_TYPE); =20 @@ -1249,8 +1244,7 @@ bool_t pcie_aer_get_firmware_first(const struct pci_d= ev *pdev) { struct aer_hest_parse_info info =3D { .pdev =3D pdev }; =20 - return pci_find_cap_offset(pdev->sbdf.seg, pdev->sbdf.bus, pdev->sbdf.= dev, - pdev->sbdf.func, PCI_CAP_ID_EXP) && + return pci_find_cap_offset(pdev->sbdf, PCI_CAP_ID_EXP) && apei_hest_parse(aer_hest_parse, &info) >=3D 0 && info.firmware_first; } diff --git a/xen/drivers/passthrough/vtd/quirks.c b/xen/drivers/passthrough= /vtd/quirks.c index 0302c503fb..289d43f0fe 100644 --- a/xen/drivers/passthrough/vtd/quirks.c +++ b/xen/drivers/passthrough/vtd/quirks.c @@ -426,8 +426,6 @@ int me_wifi_quirk(struct domain *domain, u8 bus, u8 dev= fn, int map) =20 void pci_vtd_quirk(const struct pci_dev *pdev) { - int seg =3D pdev->sbdf.seg; - int bus =3D pdev->sbdf.bus; int pos; bool_t ff; u32 val, val2; @@ -464,12 +462,10 @@ void pci_vtd_quirk(const struct pci_dev *pdev) /* Sandybridge-EP (Romley) */ case 0x3c00: /* host bridge */ case 0x3c01 ... 0x3c0b: /* root ports */ - pos =3D pci_find_ext_capability(seg, bus, pdev->sbdf.extfunc, - PCI_EXT_CAP_ID_ERR); + pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ERR); if ( !pos ) { - pos =3D pci_find_ext_capability(seg, bus, pdev->sbdf.extfunc, - PCI_EXT_CAP_ID_VNDR); + pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_VND= R); while ( pos ) { val =3D pci_conf_read32(pdev->sbdf, pos + PCI_VNDR_HEADER); @@ -478,8 +474,8 @@ void pci_vtd_quirk(const struct pci_dev *pdev) pos +=3D PCI_VNDR_HEADER; break; } - pos =3D pci_find_next_ext_capability(seg, bus, pdev->sbdf.= extfunc, - pos, PCI_EXT_CAP_ID_VND= R); + pos =3D pci_find_next_ext_capability(pdev->sbdf, pos, + PCI_EXT_CAP_ID_VNDR); } ff =3D 0; } diff --git a/xen/drivers/passthrough/vtd/x86/ats.c b/xen/drivers/passthroug= h/vtd/x86/ats.c index e0904df5b6..260b06a856 100644 --- a/xen/drivers/passthrough/vtd/x86/ats.c +++ b/xen/drivers/passthrough/vtd/x86/ats.c @@ -57,8 +57,7 @@ int ats_device(const struct pci_dev *pdev, const struct a= cpi_drhd_unit *drhd) return 0; =20 ats_drhd =3D find_ats_dev_drhd(drhd->iommu); - pos =3D pci_find_ext_capability(pdev->sbdf.seg, pdev->sbdf.bus, - pdev->sbdf.extfunc, PCI_EXT_CAP_ID_ATS); + pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS); =20 if ( pos && (ats_drhd =3D=3D NULL) ) { diff --git a/xen/drivers/passthrough/x86/ats.c b/xen/drivers/passthrough/x8= 6/ats.c index cfd610229d..bfbd50100a 100644 --- a/xen/drivers/passthrough/x86/ats.c +++ b/xen/drivers/passthrough/x86/ats.c @@ -23,11 +23,9 @@ boolean_param("ats", ats_enabled); int enable_ats_device(struct pci_dev *pdev, struct list_head *ats_list) { u32 value; - uint16_t seg =3D pdev->sbdf.seg; - uint16_t bus =3D pdev->sbdf.bus, devfn =3D pdev->sbdf.extfunc; int pos; =20 - pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS); + pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS); BUG_ON(!pos); =20 if ( iommu_verbose ) diff --git a/xen/drivers/pci/pci.c b/xen/drivers/pci/pci.c index 3d2acf6f77..e902a0aace 100644 --- a/xen/drivers/pci/pci.c +++ b/xen/drivers/pci/pci.c @@ -8,18 +8,12 @@ #include #include =20 -int pci_find_cap_offset(u16 seg, u8 bus, u8 dev, u8 func, u8 cap) +int pci_find_cap_offset(pci_sbdf_t sbdf, unsigned int cap) { u8 id; int max_cap =3D 48; u8 pos =3D PCI_CAPABILITY_LIST; u16 status; - const pci_sbdf_t sbdf =3D { - .seg =3D seg, - .bus =3D bus, - .dev =3D dev, - .func =3D func, - }; =20 status =3D pci_conf_read16(sbdf, PCI_STATUS); if ( (status & PCI_STATUS_CAP_LIST) =3D=3D 0 ) @@ -45,15 +39,10 @@ int pci_find_cap_offset(u16 seg, u8 bus, u8 dev, u8 fun= c, u8 cap) return 0; } =20 -int pci_find_next_cap(u16 seg, u8 bus, unsigned int devfn, u8 pos, int cap) +int pci_find_next_cap(pci_sbdf_t sbdf, unsigned int pos, unsigned int cap) { u8 id; int ttl =3D 48; - const pci_sbdf_t sbdf =3D { - .seg =3D seg, - .bus =3D bus, - .extfunc =3D devfn, - }; =20 while ( ttl-- ) { @@ -83,9 +72,9 @@ int pci_find_next_cap(u16 seg, u8 bus, unsigned int devfn= , u8 pos, int cap) * within the device's PCI configuration space or 0 if the device does * not support it. */ -int pci_find_ext_capability(int seg, int bus, int devfn, int cap) +int pci_find_ext_capability(pci_sbdf_t sbdf, unsigned int cap) { - return pci_find_next_ext_capability(seg, bus, devfn, 0, cap); + return pci_find_next_ext_capability(sbdf, 0, cap); } =20 /** @@ -98,15 +87,11 @@ int pci_find_ext_capability(int seg, int bus, int devfn= , int cap) * within the device's PCI configuration space or 0 if the device does * not support it. */ -int pci_find_next_ext_capability(int seg, int bus, int devfn, int start, i= nt cap) +int pci_find_next_ext_capability(pci_sbdf_t sbdf, unsigned int start, + unsigned int cap) { - int ttl =3D 480; /* 3840 bytes, minimum 8 bytes per capability */ - int pos =3D max(start, 0x100); - const pci_sbdf_t sbdf =3D { - .seg =3D seg, - .bus =3D bus, - .extfunc =3D devfn, - }; + unsigned int ttl =3D 480; /* 3840 bytes, minimum 8 bytes per capabilit= y */ + unsigned int pos =3D max(start, 0x100u); uint32_t header =3D pci_conf_read32(sbdf, pos); =20 /* diff --git a/xen/drivers/vpci/msi.c b/xen/drivers/vpci/msi.c index 2bdae48edf..2a366828a1 100644 --- a/xen/drivers/vpci/msi.c +++ b/xen/drivers/vpci/msi.c @@ -185,9 +185,7 @@ static void mask_write(const struct pci_dev *pdev, unsi= gned int reg, =20 static int init_msi(struct pci_dev *pdev) { - unsigned int pos =3D pci_find_cap_offset(pdev->sbdf.seg, pdev->sbdf.bu= s, - pdev->sbdf.dev, pdev->sbdf.func, - PCI_CAP_ID_MSI); + unsigned int pos =3D pci_find_cap_offset(pdev->sbdf, PCI_CAP_ID_MSI); uint16_t control; int ret; =20 diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c index 1006b01f4b..44dbb086fd 100644 --- a/xen/drivers/vpci/msix.c +++ b/xen/drivers/vpci/msix.c @@ -445,9 +445,7 @@ static int init_msix(struct pci_dev *pdev) uint16_t control; int rc; =20 - msix_offset =3D pci_find_cap_offset(pdev->sbdf.seg, pdev->sbdf.bus, - pdev->sbdf.dev, pdev->sbdf.func, - PCI_CAP_ID_MSIX); + msix_offset =3D pci_find_cap_offset(pdev->sbdf, PCI_CAP_ID_MSIX); if ( !msix_offset ) return 0; =20 diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index 5e345c417f..937465f5b5 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -178,10 +178,11 @@ int pci_mmcfg_read(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 *value); int pci_mmcfg_write(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 value); -int pci_find_cap_offset(u16 seg, u8 bus, u8 dev, u8 func, u8 cap); -int pci_find_next_cap(u16 seg, u8 bus, unsigned int devfn, u8 pos, int cap= ); -int pci_find_ext_capability(int seg, int bus, int devfn, int cap); -int pci_find_next_ext_capability(int seg, int bus, int devfn, int pos, int= cap); +int pci_find_cap_offset(pci_sbdf_t sbdf, unsigned int cap); +int pci_find_next_cap(pci_sbdf_t sbdf, unsigned int pos, unsigned int cap); +int pci_find_ext_capability(pci_sbdf_t sbdf, unsigned int cap); +int pci_find_next_ext_capability(pci_sbdf_t sbdf, unsigned int pos, + unsigned int cap); const char *parse_pci(const char *, unsigned int *seg, unsigned int *bus, unsigned int *dev, unsigned int *func); const char *parse_pci_seg(const char *, unsigned int *seg, unsigned int *b= us, --=20 2.17.2 (Apple Git-113) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel