Message ID | 75623ef8-5aa1-b864-7398-b7980accaf32@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | IOMMU: assorted follow-on to XSA-400 | expand |
On Mon, Apr 11, 2022 at 11:42:05AM +0200, Jan Beulich wrote: > At their use sites the numeric suffixes are at least odd to read, first > and foremost for PCI_DEVFN2() where the suffix doesn't even match the > number of arguments. Make use of count_args() such that a single flavor > each suffices (leaving aside helper macros, which aren't supposed to be > used from the outside). > > In parse_ppr_log_entry() take the opportunity and drop two local > variables and convert an assignment to an initializer. > > In VT-d code fold a number of bus+devfn comparison pairs into a single > BDF comparison. > > No change to generated code for the vast majority of the adjustments. > > Signed-off-by: Jan Beulich <jbeulich@suse.com> Nice. Reviewed-by: Roger Pau Monné <roger.pau@citrix.com> Thanks, Roger.
> From: Jan Beulich <jbeulich@suse.com> > Sent: Monday, April 11, 2022 5:42 PM > > At their use sites the numeric suffixes are at least odd to read, first > and foremost for PCI_DEVFN2() where the suffix doesn't even match the > number of arguments. Make use of count_args() such that a single flavor > each suffices (leaving aside helper macros, which aren't supposed to be > used from the outside). > > In parse_ppr_log_entry() take the opportunity and drop two local > variables and convert an assignment to an initializer. > > In VT-d code fold a number of bus+devfn comparison pairs into a single > BDF comparison. > > No change to generated code for the vast majority of the adjustments. > > Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> > > --- a/xen/arch/x86/mm.c > +++ b/xen/arch/x86/mm.c > @@ -4902,7 +4902,7 @@ int cf_check mmcfg_intercept_write( > if ( pci_conf_write_intercept(mmio_ctxt->seg, mmio_ctxt->bdf, > offset, bytes, p_data) >= 0 ) > pci_mmcfg_write(mmio_ctxt->seg, PCI_BUS(mmio_ctxt->bdf), > - PCI_DEVFN2(mmio_ctxt->bdf), offset, bytes, > + PCI_DEVFN(mmio_ctxt->bdf), offset, bytes, > *(uint32_t *)p_data); > > return X86EMUL_OKAY; > --- a/xen/arch/x86/pci.c > +++ b/xen/arch/x86/pci.c > @@ -90,7 +90,7 @@ int pci_conf_write_intercept(unsigned in > > pcidevs_lock(); > > - pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN2(bdf)); > + pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN(bdf)); > if ( pdev ) > rc = pci_msi_conf_write_intercept(pdev, reg, size, data); > > --- a/xen/arch/x86/x86_64/mmconfig-shared.c > +++ b/xen/arch/x86/x86_64/mmconfig-shared.c > @@ -313,7 +313,7 @@ static int __init pci_mmcfg_check_hostbr > for (i = 0; !name && i < ARRAY_SIZE(pci_mmcfg_probes); i++) { > bus = pci_mmcfg_probes[i].bus; > devfn = pci_mmcfg_probes[i].devfn; > - l = pci_conf_read32(PCI_SBDF3(0, bus, devfn), 0); > + l = pci_conf_read32(PCI_SBDF(0, bus, devfn), 0); > vendor = l & 0xffff; > device = (l >> 16) & 0xffff; > > --- a/xen/common/compat/memory.c > +++ b/xen/common/compat/memory.c > @@ -27,8 +27,8 @@ static int cf_check get_reserved_device_ > xen_pfn_t start, xen_ulong_t nr, u32 id, void *ctxt) > { > struct get_reserved_device_memory *grdm = ctxt; > - uint32_t sbdf = PCI_SBDF3(grdm->map.dev.pci.seg, grdm- > >map.dev.pci.bus, > - grdm->map.dev.pci.devfn).sbdf; > + uint32_t sbdf = PCI_SBDF(grdm->map.dev.pci.seg, grdm- > >map.dev.pci.bus, > + grdm->map.dev.pci.devfn).sbdf; > > if ( !(grdm->map.flags & XENMEM_RDM_ALL) && (sbdf != id) ) > return 0; > --- a/xen/common/memory.c > +++ b/xen/common/memory.c > @@ -1055,8 +1055,8 @@ static int cf_check get_reserved_device_ > xen_pfn_t start, xen_ulong_t nr, u32 id, void *ctxt) > { > struct get_reserved_device_memory *grdm = ctxt; > - uint32_t sbdf = PCI_SBDF3(grdm->map.dev.pci.seg, grdm- > >map.dev.pci.bus, > - grdm->map.dev.pci.devfn).sbdf; > + uint32_t sbdf = PCI_SBDF(grdm->map.dev.pci.seg, grdm- > >map.dev.pci.bus, > + grdm->map.dev.pci.devfn).sbdf; > > if ( !(grdm->map.flags & XENMEM_RDM_ALL) && (sbdf != id) ) > return 0; > --- a/xen/drivers/passthrough/amd/iommu_acpi.c > +++ b/xen/drivers/passthrough/amd/iommu_acpi.c > @@ -96,7 +96,7 @@ static void __init add_ivrs_mapping_entr > > if ( !ivrs_mappings[alias_id].intremap_table ) > panic("No memory for %pp's IRT\n", > - &PCI_SBDF2(iommu->seg, alias_id)); > + &PCI_SBDF(iommu->seg, alias_id)); > } > } > > @@ -790,7 +790,7 @@ static u16 __init parse_ivhd_device_spec > } > > AMD_IOMMU_DEBUG("IVHD Special: %pp variety %#x handle %#x\n", > - &PCI_SBDF2(seg, bdf), special->variety, special->handle); > + &PCI_SBDF(seg, bdf), special->variety, special->handle); > add_ivrs_mapping_entry(bdf, bdf, special->header.data_setting, 0, true, > iommu); > > @@ -816,7 +816,7 @@ static u16 __init parse_ivhd_device_spec > AMD_IOMMU_DEBUG("IVHD: Command line override present for IO- > APIC %#x" > "(IVRS: %#x devID %pp)\n", > ioapic_sbdf[idx].id, special->handle, > - &PCI_SBDF2(seg, bdf)); > + &PCI_SBDF(seg, bdf)); > break; > } > > @@ -888,7 +888,7 @@ static u16 __init parse_ivhd_device_spec > AMD_IOMMU_DEBUG("IVHD: Command line override present for > HPET %#x " > "(IVRS: %#x devID %pp)\n", > hpet_sbdf.id, special->handle, > - &PCI_SBDF2(seg, bdf)); > + &PCI_SBDF(seg, bdf)); > break; > case HPET_NONE: > /* set device id of hpet */ > --- a/xen/drivers/passthrough/amd/iommu_cmd.c > +++ b/xen/drivers/passthrough/amd/iommu_cmd.c > @@ -40,7 +40,7 @@ static void send_iommu_command(struct am > IOMMU_RING_BUFFER_PTR_MASK) ) > { > printk_once(XENLOG_ERR "AMD IOMMU %pp: no cmd slot available\n", > - &PCI_SBDF2(iommu->seg, iommu->bdf)); > + &PCI_SBDF(iommu->seg, iommu->bdf)); > cpu_relax(); > } > > @@ -84,7 +84,7 @@ static void flush_command_buffer(struct > threshold |= threshold << 1; > printk(XENLOG_WARNING > "AMD IOMMU %pp: %scompletion wait taking too long\n", > - &PCI_SBDF2(iommu->seg, iommu->bdf), > + &PCI_SBDF(iommu->seg, iommu->bdf), > timeout_base ? "iotlb " : ""); > timeout = 0; > } > @@ -94,7 +94,7 @@ static void flush_command_buffer(struct > if ( !timeout ) > printk(XENLOG_WARNING > "AMD IOMMU %pp: %scompletion wait took %lums\n", > - &PCI_SBDF2(iommu->seg, iommu->bdf), > + &PCI_SBDF(iommu->seg, iommu->bdf), > timeout_base ? "iotlb " : "", > (NOW() - start) / 10000000); > } > @@ -292,14 +292,14 @@ void amd_iommu_flush_iotlb(u8 devfn, con > if ( !iommu ) > { > AMD_IOMMU_WARN("can't find IOMMU for %pp\n", > - &PCI_SBDF3(pdev->seg, pdev->bus, devfn)); > + &PCI_SBDF(pdev->seg, pdev->bus, devfn)); > return; > } > > if ( !iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) ) > return; > > - req_id = get_dma_requestor_id(iommu->seg, PCI_BDF2(pdev->bus, > devfn)); > + req_id = get_dma_requestor_id(iommu->seg, PCI_BDF(pdev->bus, > devfn)); > queueid = req_id; > maxpend = pdev->ats.queue_depth & 0xff; > > --- a/xen/drivers/passthrough/amd/iommu_detect.c > +++ b/xen/drivers/passthrough/amd/iommu_detect.c > @@ -231,7 +231,7 @@ int __init amd_iommu_detect_one_acpi( > rt = pci_ro_device(iommu->seg, bus, PCI_DEVFN(dev, func)); > if ( rt ) > printk(XENLOG_ERR "Could not mark config space of %pp read-only > (%d)\n", > - &PCI_SBDF2(iommu->seg, iommu->bdf), rt); > + &PCI_SBDF(iommu->seg, iommu->bdf), rt); > > list_add_tail(&iommu->list, &amd_iommu_head); > rt = 0; > --- a/xen/drivers/passthrough/amd/iommu_init.c > +++ b/xen/drivers/passthrough/amd/iommu_init.c > @@ -562,7 +562,7 @@ static void cf_check parse_event_log_ent > > printk(XENLOG_ERR "AMD-Vi: %s: %pp d%u addr %016"PRIx64 > " flags %#x%s%s%s%s%s%s%s%s%s%s\n", > - code_str, &PCI_SBDF2(iommu->seg, device_id), > + code_str, &PCI_SBDF(iommu->seg, device_id), > domain_id, addr, flags, > (flags & 0xe00) ? " ??" : "", > (flags & 0x100) ? " TR" : "", > @@ -578,7 +578,7 @@ static void cf_check parse_event_log_ent > for ( bdf = 0; bdf < ivrs_bdf_entries; bdf++ ) > if ( get_dma_requestor_id(iommu->seg, bdf) == device_id ) > pci_check_disable_device(iommu->seg, PCI_BUS(bdf), > - PCI_DEVFN2(bdf)); > + PCI_DEVFN(bdf)); > } > else > printk(XENLOG_ERR "%s %08x %08x %08x %08x\n", > @@ -631,18 +631,13 @@ static void iommu_check_event_log(struct > > static void cf_check parse_ppr_log_entry(struct amd_iommu *iommu, u32 > entry[]) > { > - > - u16 device_id; > - u8 bus, devfn; > - struct pci_dev *pdev; > - > /* here device_id is physical value */ > - device_id = iommu_get_devid_from_cmd(entry[0]); > - bus = PCI_BUS(device_id); > - devfn = PCI_DEVFN2(device_id); > + uint16_t device_id = iommu_get_devid_from_cmd(entry[0]); > + struct pci_dev *pdev; > > pcidevs_lock(); > - pdev = pci_get_real_pdev(iommu->seg, bus, devfn); > + pdev = pci_get_real_pdev(iommu->seg, PCI_BUS(device_id), > + PCI_DEVFN(device_id)); > pcidevs_unlock(); > > if ( pdev ) > @@ -751,12 +746,12 @@ static bool_t __init set_iommu_interrupt > > pcidevs_lock(); > iommu->msi.dev = pci_get_pdev(iommu->seg, PCI_BUS(iommu->bdf), > - PCI_DEVFN2(iommu->bdf)); > + PCI_DEVFN(iommu->bdf)); > pcidevs_unlock(); > if ( !iommu->msi.dev ) > { > AMD_IOMMU_WARN("no pdev for %pp\n", > - &PCI_SBDF2(iommu->seg, iommu->bdf)); > + &PCI_SBDF(iommu->seg, iommu->bdf)); > return 0; > } > > @@ -778,7 +773,7 @@ static bool_t __init set_iommu_interrupt > hw_irq_controller *handler; > u16 control; > > - control = pci_conf_read16(PCI_SBDF2(iommu->seg, iommu->bdf), > + control = pci_conf_read16(PCI_SBDF(iommu->seg, iommu->bdf), > iommu->msi.msi_attrib.pos + PCI_MSI_FLAGS); > > iommu->msi.msi.nvec = 1; > @@ -842,22 +837,22 @@ static void amd_iommu_erratum_746_workar > (boot_cpu_data.x86_model > 0x1f) ) > return; > > - pci_conf_write32(PCI_SBDF2(iommu->seg, iommu->bdf), 0xf0, 0x90); > - value = pci_conf_read32(PCI_SBDF2(iommu->seg, iommu->bdf), 0xf4); > + pci_conf_write32(PCI_SBDF(iommu->seg, iommu->bdf), 0xf0, 0x90); > + value = pci_conf_read32(PCI_SBDF(iommu->seg, iommu->bdf), 0xf4); > > if ( value & (1 << 2) ) > return; > > /* Select NB indirect register 0x90 and enable writing */ > - pci_conf_write32(PCI_SBDF2(iommu->seg, iommu->bdf), 0xf0, 0x90 | (1 > << 8)); > + pci_conf_write32(PCI_SBDF(iommu->seg, iommu->bdf), 0xf0, 0x90 | (1 << > 8)); > > - pci_conf_write32(PCI_SBDF2(iommu->seg, iommu->bdf), 0xf4, value | (1 > << 2)); > + pci_conf_write32(PCI_SBDF(iommu->seg, iommu->bdf), 0xf4, value | (1 > << 2)); > printk(XENLOG_INFO > "AMD-Vi: Applying erratum 746 workaround for IOMMU at %pp\n", > - &PCI_SBDF2(iommu->seg, iommu->bdf)); > + &PCI_SBDF(iommu->seg, iommu->bdf)); > > /* Clear the enable writing bit */ > - pci_conf_write32(PCI_SBDF2(iommu->seg, iommu->bdf), 0xf0, 0x90); > + pci_conf_write32(PCI_SBDF(iommu->seg, iommu->bdf), 0xf0, 0x90); > } > > static void enable_iommu(struct amd_iommu *iommu) > @@ -1288,7 +1283,7 @@ static int __init cf_check amd_iommu_set > if ( !pci_init ) > continue; > pcidevs_lock(); > - pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN2(bdf)); > + pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN(bdf)); > pcidevs_unlock(); > } > > --- a/xen/drivers/passthrough/amd/iommu_intr.c > +++ b/xen/drivers/passthrough/amd/iommu_intr.c > @@ -604,7 +604,7 @@ static struct amd_iommu *_find_iommu_for > if ( iommu ) > return iommu; > > - AMD_IOMMU_DEBUG("No IOMMU for MSI dev = %pp\n", > &PCI_SBDF2(seg, bdf)); > + AMD_IOMMU_DEBUG("No IOMMU for MSI dev = %pp\n", > &PCI_SBDF(seg, bdf)); > return ERR_PTR(-EINVAL); > } > > @@ -814,7 +814,7 @@ static void dump_intremap_table(const st > if ( ivrs_mapping ) > { > printk(" %pp:\n", > - &PCI_SBDF2(iommu->seg, ivrs_mapping->dte_requestor_id)); > + &PCI_SBDF(iommu->seg, ivrs_mapping->dte_requestor_id)); > ivrs_mapping = NULL; > } > > --- a/xen/drivers/passthrough/amd/iommu_map.c > +++ b/xen/drivers/passthrough/amd/iommu_map.c > @@ -534,7 +534,7 @@ int cf_check amd_iommu_get_reserved_devi > > for ( bdf = 0; bdf < ivrs_bdf_entries; ++bdf ) > { > - pci_sbdf_t sbdf = PCI_SBDF2(seg, bdf); > + pci_sbdf_t sbdf = PCI_SBDF(seg, bdf); > const struct ivrs_unity_map *um = ivrs_mappings[bdf].unity_map; > unsigned int req = ivrs_mappings[bdf].dte_requestor_id; > const struct amd_iommu *iommu = ivrs_mappings[bdf].iommu; > @@ -563,7 +563,7 @@ int cf_check amd_iommu_get_reserved_devi > * the same alias ID. > */ > if ( bdf != req && ivrs_mappings[req].iommu && > - func(0, 0, PCI_SBDF2(seg, req).sbdf, ctxt) ) > + func(0, 0, PCI_SBDF(seg, req).sbdf, ctxt) ) > continue; > > if ( global == pending ) > --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c > +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c > @@ -53,7 +53,7 @@ struct amd_iommu *find_iommu_for_device( > ivrs_mappings[bdf] = tmp; > > printk(XENLOG_WARNING "%pp not found in ACPI tables;" > - " using same IOMMU as function 0\n", &PCI_SBDF2(seg, bdf)); > + " using same IOMMU as function 0\n", &PCI_SBDF(seg, bdf)); > > /* write iommu field last */ > ivrs_mappings[bdf].iommu = ivrs_mappings[bd0].iommu; > @@ -144,7 +144,7 @@ static int __must_check amd_iommu_setup_ > | (ivrs_dev->unity_map ? SET_ROOT_WITH_UNITY_MAP : 0); > > /* get device-table entry */ > - req_id = get_dma_requestor_id(iommu->seg, PCI_BDF2(bus, devfn)); > + req_id = get_dma_requestor_id(iommu->seg, PCI_BDF(bus, devfn)); > table = iommu->dev_table.buffer; > dte = &table[req_id]; > ivrs_dev = &get_ivrs_mappings(iommu->seg)[req_id]; > @@ -202,7 +202,7 @@ static int __must_check amd_iommu_setup_ > * presence. But let's deal with that case only if it is actually > * found in the wild. > */ > - if ( req_id != PCI_BDF2(bus, devfn) && > + if ( req_id != PCI_BDF(bus, devfn) && > (sr_flags & SET_ROOT_WITH_UNITY_MAP) ) > rc = -EOPNOTSUPP; > else > @@ -231,7 +231,7 @@ static int __must_check amd_iommu_setup_ > (any_pdev_behind_iommu(pdev->domain, pdev, iommu) || > pdev->phantom_stride) ) > AMD_IOMMU_WARN(" %pp: reassignment may cause %pd data > corruption\n", > - &PCI_SBDF3(pdev->seg, bus, devfn), pdev->domain); > + &PCI_SBDF(pdev->seg, bus, devfn), pdev->domain); > > /* > * Check remaining settings are still in place from an earlier call > @@ -414,7 +414,7 @@ static void amd_iommu_disable_domain_dev > disable_ats_device(pdev); > > BUG_ON ( iommu->dev_table.buffer == NULL ); > - req_id = get_dma_requestor_id(iommu->seg, PCI_BDF2(bus, devfn)); > + req_id = get_dma_requestor_id(iommu->seg, PCI_BDF(bus, devfn)); > table = iommu->dev_table.buffer; > dte = &table[req_id]; > > @@ -461,7 +461,7 @@ static int cf_check reassign_device( > if ( !iommu ) > { > AMD_IOMMU_WARN("failed to find IOMMU: %pp cannot be assigned > to %pd\n", > - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), target); > + &PCI_SBDF(pdev->seg, pdev->bus, devfn), target); > return -ENODEV; > } > > @@ -488,7 +488,7 @@ static int cf_check reassign_device( > if ( !is_hardware_domain(source) ) > { > const struct ivrs_mappings *ivrs_mappings = get_ivrs_mappings(pdev- > >seg); > - unsigned int bdf = PCI_BDF2(pdev->bus, devfn); > + unsigned int bdf = PCI_BDF(pdev->bus, devfn); > > rc = amd_iommu_reserve_domain_unity_unmap( > source, > @@ -498,7 +498,7 @@ static int cf_check reassign_device( > } > > AMD_IOMMU_DEBUG("Re-assign %pp from %pd to %pd\n", > - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), source, target); > + &PCI_SBDF(pdev->seg, pdev->bus, devfn), source, target); > > return 0; > } > @@ -507,7 +507,7 @@ static int cf_check amd_iommu_assign_dev > struct domain *d, u8 devfn, struct pci_dev *pdev, u32 flag) > { > struct ivrs_mappings *ivrs_mappings = get_ivrs_mappings(pdev->seg); > - int bdf = PCI_BDF2(pdev->bus, devfn); > + unsigned int bdf = PCI_BDF(pdev->bus, devfn); > int req_id = get_dma_requestor_id(pdev->seg, bdf); > int rc = amd_iommu_reserve_domain_unity_map( > d, ivrs_mappings[req_id].unity_map, flag); > @@ -575,12 +575,12 @@ static int cf_check amd_iommu_add_device > } > > AMD_IOMMU_WARN("no IOMMU for %pp; cannot be handed > to %pd\n", > - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), pdev->domain); > + &PCI_SBDF(pdev->seg, pdev->bus, devfn), pdev->domain); > return -ENODEV; > } > > ivrs_mappings = get_ivrs_mappings(pdev->seg); > - bdf = PCI_BDF2(pdev->bus, devfn); > + bdf = PCI_BDF(pdev->bus, devfn); > if ( !ivrs_mappings || > !ivrs_mappings[ivrs_mappings[bdf].dte_requestor_id].valid ) > return -EPERM; > @@ -618,7 +618,7 @@ static int cf_check amd_iommu_add_device > ivrs_mappings[ivrs_mappings[bdf].dte_requestor_id].unity_map, > 0) ) > AMD_IOMMU_WARN("%pd: unity mapping failed for %pp\n", > - pdev->domain, &PCI_SBDF2(pdev->seg, bdf)); > + pdev->domain, &PCI_SBDF(pdev->seg, bdf)); > > if ( iommu_quarantine && pdev->arch.pseudo_domid == > DOMID_INVALID ) > { > @@ -651,20 +651,20 @@ static int cf_check amd_iommu_remove_dev > if ( !iommu ) > { > AMD_IOMMU_WARN("failed to find IOMMU: %pp cannot be removed > from %pd\n", > - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), pdev->domain); > + &PCI_SBDF(pdev->seg, pdev->bus, devfn), pdev->domain); > return -ENODEV; > } > > amd_iommu_disable_domain_device(pdev->domain, iommu, devfn, > pdev); > > ivrs_mappings = get_ivrs_mappings(pdev->seg); > - bdf = PCI_BDF2(pdev->bus, devfn); > + bdf = PCI_BDF(pdev->bus, devfn); > > if ( amd_iommu_reserve_domain_unity_unmap( > pdev->domain, > ivrs_mappings[ivrs_mappings[bdf].dte_requestor_id].unity_map) ) > AMD_IOMMU_WARN("%pd: unity unmapping failed for %pp\n", > - pdev->domain, &PCI_SBDF2(pdev->seg, bdf)); > + pdev->domain, &PCI_SBDF(pdev->seg, bdf)); > > amd_iommu_quarantine_teardown(pdev); > > @@ -681,7 +681,7 @@ static int cf_check amd_iommu_remove_dev > > static int cf_check amd_iommu_group_id(u16 seg, u8 bus, u8 devfn) > { > - int bdf = PCI_BDF2(bus, devfn); > + unsigned int bdf = PCI_BDF(bus, devfn); > > return (bdf < ivrs_bdf_entries) ? get_dma_requestor_id(seg, bdf) : bdf; > } > --- a/xen/drivers/passthrough/ats.h > +++ b/xen/drivers/passthrough/ats.h > @@ -35,7 +35,7 @@ static inline int pci_ats_enabled(int se > pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS); > BUG_ON(!pos); > > - value = pci_conf_read16(PCI_SBDF3(seg, bus, devfn), pos + ATS_REG_CTL); > + value = pci_conf_read16(PCI_SBDF(seg, bus, devfn), pos + ATS_REG_CTL); > > return value & ATS_ENABLE; > } > --- a/xen/drivers/passthrough/pci.c > +++ b/xen/drivers/passthrough/pci.c > @@ -553,7 +553,7 @@ int __init pci_ro_device(int seg, int bu > memset(pseg->ro_map, 0, sz); > } > > - __set_bit(PCI_BDF2(bus, devfn), pseg->ro_map); > + __set_bit(PCI_BDF(bus, devfn), pseg->ro_map); > _pci_hide_device(pdev); > > return 0; > @@ -957,7 +957,7 @@ static int deassign_device(struct domain > out: > if ( ret ) > printk(XENLOG_G_ERR "%pd: deassign (%pp) failed (%d)\n", > - d, &PCI_SBDF3(seg, bus, devfn), ret); > + d, &PCI_SBDF(seg, bus, devfn), ret); > > return ret; > } > @@ -1406,7 +1406,7 @@ static int iommu_add_device(struct pci_d > rc = iommu_call(hd->platform_ops, add_device, devfn, > pci_to_dev(pdev)); > if ( rc ) > printk(XENLOG_WARNING "IOMMU: add %pp failed (%d)\n", > - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), rc); > + &PCI_SBDF(pdev->seg, pdev->bus, devfn), rc); > } > } > > @@ -1452,7 +1452,7 @@ static int iommu_remove_device(struct pc > continue; > > printk(XENLOG_ERR "IOMMU: remove %pp failed (%d)\n", > - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), rc); > + &PCI_SBDF(pdev->seg, pdev->bus, devfn), rc); > return rc; > } > > @@ -1536,7 +1536,7 @@ static int assign_device(struct domain * > done: > if ( rc ) > printk(XENLOG_G_WARNING "%pd: assign (%pp) failed (%d)\n", > - d, &PCI_SBDF3(seg, bus, devfn), rc); > + d, &PCI_SBDF(seg, bus, devfn), rc); > /* The device is assigned to dom_io so mark it as quarantined */ > else if ( d == dom_io ) > pdev->quarantine = true; > @@ -1647,7 +1647,7 @@ int iommu_do_pci_domctl( > > seg = domctl->u.get_device_group.machine_sbdf >> 16; > bus = PCI_BUS(domctl->u.get_device_group.machine_sbdf); > - devfn = PCI_DEVFN2(domctl->u.get_device_group.machine_sbdf); > + devfn = PCI_DEVFN(domctl->u.get_device_group.machine_sbdf); > max_sdevs = domctl->u.get_device_group.max_sdevs; > sdevs = domctl->u.get_device_group.sdev_array; > > @@ -1697,7 +1697,7 @@ int iommu_do_pci_domctl( > > seg = machine_sbdf >> 16; > bus = PCI_BUS(machine_sbdf); > - devfn = PCI_DEVFN2(machine_sbdf); > + devfn = PCI_DEVFN(machine_sbdf); > > pcidevs_lock(); > ret = device_assigned(seg, bus, devfn); > @@ -1706,7 +1706,7 @@ int iommu_do_pci_domctl( > if ( ret ) > { > printk(XENLOG_G_INFO "%pp already assigned, or non-existent\n", > - &PCI_SBDF3(seg, bus, devfn)); > + &PCI_SBDF(seg, bus, devfn)); > ret = -EINVAL; > } > } > @@ -1742,7 +1742,7 @@ int iommu_do_pci_domctl( > > seg = machine_sbdf >> 16; > bus = PCI_BUS(machine_sbdf); > - devfn = PCI_DEVFN2(machine_sbdf); > + devfn = PCI_DEVFN(machine_sbdf); > > pcidevs_lock(); > ret = deassign_device(d, seg, bus, devfn); > --- a/xen/drivers/passthrough/vtd/dmar.c > +++ b/xen/drivers/passthrough/vtd/dmar.c > @@ -222,7 +222,7 @@ struct acpi_drhd_unit *acpi_find_matched > continue; > > for (i = 0; i < drhd->scope.devices_cnt; i++) > - if ( drhd->scope.devices[i] == PCI_BDF2(bus, devfn) ) > + if ( drhd->scope.devices[i] == PCI_BDF(bus, devfn) ) > return drhd; > > if ( test_bit(bus, drhd->scope.buses) ) > @@ -1062,7 +1062,7 @@ int cf_check intel_iommu_get_reserved_de > > rc = func(PFN_DOWN(rmrr->base_address), > PFN_UP(rmrr->end_address) - PFN_DOWN(rmrr->base_address), > - PCI_SBDF2(rmrr->segment, bdf).sbdf, ctxt); > + PCI_SBDF(rmrr->segment, bdf).sbdf, ctxt); > > if ( unlikely(rc < 0) ) > return rc; > --- a/xen/drivers/passthrough/vtd/intremap.c > +++ b/xen/drivers/passthrough/vtd/intremap.c > @@ -498,7 +498,7 @@ static void set_msi_source_id(struct pci > case 4: sq = SQ_13_IGNORE_1; break; > default: sq = SQ_ALL_16; break; > } > - set_ire_sid(ire, SVT_VERIFY_SID_SQ, sq, PCI_BDF2(bus, devfn)); > + set_ire_sid(ire, SVT_VERIFY_SID_SQ, sq, PCI_BDF(bus, devfn)); > break; > > case DEV_TYPE_PCI: > @@ -508,7 +508,7 @@ static void set_msi_source_id(struct pci > if ( ret == 0 ) /* integrated PCI device */ > { > set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_ALL_16, > - PCI_BDF2(bus, devfn)); > + PCI_BDF(bus, devfn)); > } > else if ( ret == 1 ) /* find upstream bridge */ > { > @@ -517,7 +517,7 @@ static void set_msi_source_id(struct pci > (bus << 8) | pdev->bus); > else > set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_ALL_16, > - PCI_BDF2(bus, devfn)); > + PCI_BDF(bus, devfn)); > } > else > dprintk(XENLOG_WARNING VTDPREFIX, > --- a/xen/drivers/passthrough/vtd/iommu.c > +++ b/xen/drivers/passthrough/vtd/iommu.c > @@ -938,21 +938,21 @@ static int iommu_page_fault_do_one(struc > "DMAR:[%s] Request device [%pp] " > "fault addr %"PRIx64"\n", > (type ? "DMA Read" : "DMA Write"), > - &PCI_SBDF2(seg, source_id), addr); > + &PCI_SBDF(seg, source_id), addr); > kind = "DMAR"; > break; > case INTR_REMAP: > printk(XENLOG_G_WARNING VTDPREFIX > "INTR-REMAP: Request device [%pp] " > "fault index %"PRIx64"\n", > - &PCI_SBDF2(seg, source_id), addr >> 48); > + &PCI_SBDF(seg, source_id), addr >> 48); > kind = "INTR-REMAP"; > break; > default: > printk(XENLOG_G_WARNING VTDPREFIX > "UNKNOWN: Request device [%pp] " > "fault addr %"PRIx64"\n", > - &PCI_SBDF2(seg, source_id), addr); > + &PCI_SBDF(seg, source_id), addr); > kind = "UNKNOWN"; > break; > } > @@ -961,7 +961,7 @@ static int iommu_page_fault_do_one(struc > kind, fault_reason, reason); > > if ( iommu_verbose && fault_type == DMA_REMAP ) > - print_vtd_entries(iommu, PCI_BUS(source_id), PCI_DEVFN2(source_id), > + print_vtd_entries(iommu, PCI_BUS(source_id), PCI_DEVFN(source_id), > addr >> PAGE_SHIFT); > > return 0; > @@ -1039,7 +1039,7 @@ static void __do_iommu_page_fault(struct > source_id, guest_addr); > > pci_check_disable_device(iommu->drhd->segment, > - PCI_BUS(source_id), PCI_DEVFN2(source_id)); > + PCI_BUS(source_id), PCI_DEVFN(source_id)); > > fault_index++; > if ( fault_index > cap_num_fault_regs(iommu->cap) ) > @@ -1541,7 +1541,7 @@ int domain_context_mapping_one( > check_cleanup_domid_map(domain, pdev, iommu); > printk(XENLOG_ERR > "%pp: unexpected context entry %016lx_%016lx > (expected %016lx_%016lx)\n", > - &PCI_SBDF3(seg, bus, devfn), > + &PCI_SBDF(seg, bus, devfn), > (uint64_t)(res >> 64), (uint64_t)res, > (uint64_t)(old >> 64), (uint64_t)old); > rc = -EILSEQ; > @@ -1571,7 +1571,7 @@ int domain_context_mapping_one( > if ( !(mode & (MAP_OWNER_DYING | MAP_SINGLE_DEVICE)) ) > printk(XENLOG_WARNING VTDPREFIX > " %pp: reassignment may cause %pd data corruption\n", > - &PCI_SBDF3(seg, bus, devfn), prev_dom); > + &PCI_SBDF(seg, bus, devfn), prev_dom); > > write_atomic(&context->lo, lctxt.lo); > /* No barrier should be needed between these two. */ > @@ -1581,7 +1581,7 @@ int domain_context_mapping_one( > iommu_sync_cache(context, sizeof(struct context_entry)); > spin_unlock(&iommu->lock); > > - rc = iommu_flush_context_device(iommu, prev_did, PCI_BDF2(bus, > devfn), > + rc = iommu_flush_context_device(iommu, prev_did, PCI_BDF(bus, devfn), > DMA_CCMD_MASK_NOBIT, !prev_dom); > flush_dev_iotlb = !!find_ats_dev_drhd(iommu); > ret = iommu_flush_iotlb_dsi(iommu, prev_did, !prev_dom, > flush_dev_iotlb); > @@ -1688,7 +1688,7 @@ static int domain_context_mapping(struct > case DEV_TYPE_PCI_HOST_BRIDGE: > if ( iommu_debug ) > printk(VTDPREFIX "%pd:Hostbridge: skip %pp map\n", > - domain, &PCI_SBDF3(seg, bus, devfn)); > + domain, &PCI_SBDF(seg, bus, devfn)); > if ( !is_hardware_domain(domain) ) > return -EPERM; > break; > @@ -1712,7 +1712,7 @@ static int domain_context_mapping(struct > > if ( iommu_debug ) > printk(VTDPREFIX "%pd:PCIe: map %pp\n", > - domain, &PCI_SBDF3(seg, bus, devfn)); > + domain, &PCI_SBDF(seg, bus, devfn)); > ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn, > pdev, > DEVICE_DOMID(domain, pdev), pgd_maddr, > mode); > @@ -1737,7 +1737,7 @@ static int domain_context_mapping(struct > > if ( iommu_debug ) > printk(VTDPREFIX "%pd:PCI: map %pp\n", > - domain, &PCI_SBDF3(seg, bus, devfn)); > + domain, &PCI_SBDF(seg, bus, devfn)); > > ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn, > pdev, DEVICE_DOMID(domain, pdev), > @@ -1802,7 +1802,7 @@ static int domain_context_mapping(struct > > default: > dprintk(XENLOG_ERR VTDPREFIX, "%pd:unknown(%u): %pp\n", > - domain, pdev->type, &PCI_SBDF3(seg, bus, devfn)); > + domain, pdev->type, &PCI_SBDF(seg, bus, devfn)); > ret = -EINVAL; > break; > } > @@ -1851,7 +1851,7 @@ int domain_context_unmap_one( > iommu_sync_cache(context, sizeof(struct context_entry)); > > rc = iommu_flush_context_device(iommu, iommu_domid, > - PCI_BDF2(bus, devfn), > + PCI_BDF(bus, devfn), > DMA_CCMD_MASK_NOBIT, 0); > > flush_dev_iotlb = !!find_ats_dev_drhd(iommu); > @@ -1910,7 +1910,7 @@ static const struct acpi_drhd_unit *doma > case DEV_TYPE_PCI_HOST_BRIDGE: > if ( iommu_debug ) > printk(VTDPREFIX "%pd:Hostbridge: skip %pp unmap\n", > - domain, &PCI_SBDF3(seg, bus, devfn)); > + domain, &PCI_SBDF(seg, bus, devfn)); > return ERR_PTR(is_hardware_domain(domain) ? 0 : -EPERM); > > case DEV_TYPE_PCIe_BRIDGE: > @@ -1924,7 +1924,7 @@ static const struct acpi_drhd_unit *doma > > if ( iommu_debug ) > printk(VTDPREFIX "%pd:PCIe: unmap %pp\n", > - domain, &PCI_SBDF3(seg, bus, devfn)); > + domain, &PCI_SBDF(seg, bus, devfn)); > ret = domain_context_unmap_one(domain, iommu, bus, devfn); > if ( !ret && devfn == pdev->devfn && ats_device(pdev, drhd) > 0 ) > disable_ats_device(pdev); > @@ -1937,7 +1937,7 @@ static const struct acpi_drhd_unit *doma > > if ( iommu_debug ) > printk(VTDPREFIX "%pd:PCI: unmap %pp\n", > - domain, &PCI_SBDF3(seg, bus, devfn)); > + domain, &PCI_SBDF(seg, bus, devfn)); > ret = domain_context_unmap_one(domain, iommu, bus, devfn); > if ( ret ) > break; > @@ -1970,7 +1970,7 @@ static const struct acpi_drhd_unit *doma > > default: > dprintk(XENLOG_ERR VTDPREFIX, "%pd:unknown(%u): %pp\n", > - domain, pdev->type, &PCI_SBDF3(seg, bus, devfn)); > + domain, pdev->type, &PCI_SBDF(seg, bus, devfn)); > return ERR_PTR(-EINVAL); > } > > @@ -2181,9 +2181,7 @@ static int cf_check intel_iommu_add_devi > > for_each_rmrr_device ( rmrr, bdf, i ) > { > - if ( rmrr->segment == pdev->seg && > - PCI_BUS(bdf) == pdev->bus && > - PCI_DEVFN2(bdf) == devfn ) > + if ( rmrr->segment == pdev->seg && bdf == PCI_BDF(pdev->bus, devfn) ) > { > /* > * iommu_add_device() is only called for the hardware > @@ -2239,9 +2237,7 @@ static int cf_check intel_iommu_remove_d > > for_each_rmrr_device ( rmrr, bdf, i ) > { > - if ( rmrr->segment != pdev->seg || > - PCI_BUS(bdf) != pdev->bus || > - PCI_DEVFN2(bdf) != devfn ) > + if ( rmrr->segment != pdev->seg || bdf != PCI_BDF(pdev->bus, devfn) ) > continue; > > /* > @@ -2668,8 +2664,7 @@ static int cf_check reassign_device_owne > > for_each_rmrr_device( rmrr, bdf, i ) > if ( rmrr->segment == pdev->seg && > - PCI_BUS(bdf) == pdev->bus && > - PCI_DEVFN2(bdf) == devfn ) > + bdf == PCI_BDF(pdev->bus, devfn) ) > { > /* > * Any RMRR flag is always ignored when remove a device, > @@ -2713,9 +2708,7 @@ static int cf_check intel_iommu_assign_d > */ > for_each_rmrr_device( rmrr, bdf, i ) > { > - if ( rmrr->segment == seg && > - PCI_BUS(bdf) == bus && > - PCI_DEVFN2(bdf) == devfn && > + if ( rmrr->segment == seg && bdf == PCI_BDF(bus, devfn) && > rmrr->scope.devices_cnt > 1 ) > { > bool_t relaxed = !!(flag & XEN_DOMCTL_DEV_RDM_RELAXED); > @@ -2725,7 +2718,7 @@ static int cf_check intel_iommu_assign_d > " with shared RMRR at %"PRIx64" for %pd.\n", > relaxed ? XENLOG_WARNING : XENLOG_ERR, > relaxed ? "risky" : "disallowed", > - &PCI_SBDF3(seg, bus, devfn), rmrr->base_address, d); > + &PCI_SBDF(seg, bus, devfn), rmrr->base_address, d); > if ( !relaxed ) > return -EPERM; > } > @@ -2737,9 +2730,7 @@ static int cf_check intel_iommu_assign_d > /* Setup rmrr identity mapping */ > for_each_rmrr_device( rmrr, bdf, i ) > { > - if ( rmrr->segment == seg && > - PCI_BUS(bdf) == bus && > - PCI_DEVFN2(bdf) == devfn ) > + if ( rmrr->segment == seg && bdf == PCI_BDF(bus, devfn) ) > { > ret = iommu_identity_mapping(d, p2m_access_rw, rmrr- > >base_address, > rmrr->end_address, flag); > @@ -2762,9 +2753,7 @@ static int cf_check intel_iommu_assign_d > > for_each_rmrr_device( rmrr, bdf, i ) > { > - if ( rmrr->segment == seg && > - PCI_BUS(bdf) == bus && > - PCI_DEVFN2(bdf) == devfn ) > + if ( rmrr->segment == seg && bdf == PCI_BDF(bus, devfn) ) > { > int rc = iommu_identity_mapping(d, p2m_access_x, > rmrr->base_address, > @@ -2791,7 +2780,7 @@ static int cf_check intel_iommu_group_id > if ( find_upstream_bridge(seg, &bus, &devfn, &secbus) < 0 ) > return -ENODEV; > > - return PCI_BDF2(bus, devfn); > + return PCI_BDF(bus, devfn); > } > > static int __must_check cf_check vtd_suspend(void) > --- a/xen/drivers/passthrough/vtd/quirks.c > +++ b/xen/drivers/passthrough/vtd/quirks.c > @@ -115,7 +115,7 @@ bool is_azalia_tlb_enabled(const struct > return true; > > /* Check for the specific device. */ > - sbdf = PCI_SBDF2(drhd->segment, drhd->scope.devices[0]); > + sbdf = PCI_SBDF(drhd->segment, drhd->scope.devices[0]); > if ( pci_conf_read16(sbdf, PCI_VENDOR_ID) != PCI_VENDOR_ID_INTEL || > pci_conf_read16(sbdf, PCI_DEVICE_ID) != 0x3a3e ) > return true; > @@ -446,7 +446,7 @@ int me_wifi_quirk(struct domain *domain, > return 0; > > /* if device is WLAN device, map ME phantom device 0:3.7 */ > - id = pci_conf_read32(PCI_SBDF3(0, bus, devfn), 0); > + id = pci_conf_read32(PCI_SBDF(0, bus, devfn), 0); > switch (id) > { > case 0x42328086: > @@ -470,7 +470,7 @@ int me_wifi_quirk(struct domain *domain, > return 0; > > /* if device is WLAN device, map ME phantom device 0:22.7 */ > - id = pci_conf_read32(PCI_SBDF3(0, bus, devfn), 0); > + id = pci_conf_read32(PCI_SBDF(0, bus, devfn), 0); > switch (id) > { > case 0x00878086: /* Kilmer Peak */ > --- a/xen/drivers/passthrough/vtd/utils.c > +++ b/xen/drivers/passthrough/vtd/utils.c > @@ -96,7 +96,7 @@ void print_vtd_entries(struct vtd_iommu > u32 l_index, level; > > printk("print_vtd_entries: iommu #%u dev %pp gmfn %"PRI_gfn"\n", > - iommu->index, &PCI_SBDF3(iommu->drhd->segment, bus, devfn), > + iommu->index, &PCI_SBDF(iommu->drhd->segment, bus, devfn), > gmfn); > > if ( iommu->root_maddr == 0 ) > --- a/xen/drivers/pci/pci.c > +++ b/xen/drivers/pci/pci.c > @@ -46,12 +46,12 @@ int pci_find_next_cap(u16 seg, u8 bus, u > > while ( ttl-- ) > { > - pos = pci_conf_read8(PCI_SBDF3(seg, bus, devfn), pos); > + pos = pci_conf_read8(PCI_SBDF(seg, bus, devfn), pos); > if ( pos < 0x40 ) > break; > > pos &= ~3; > - id = pci_conf_read8(PCI_SBDF3(seg, bus, devfn), pos + > PCI_CAP_LIST_ID); > + id = pci_conf_read8(PCI_SBDF(seg, bus, devfn), pos + PCI_CAP_LIST_ID); > > if ( id == 0xff ) > break; > @@ -93,7 +93,7 @@ int pci_find_next_ext_capability(int seg > int ttl = 480; /* 3840 bytes, minimum 8 bytes per capability */ > int pos = max(start, 0x100); > > - header = pci_conf_read32(PCI_SBDF3(seg, bus, devfn), pos); > + header = pci_conf_read32(PCI_SBDF(seg, bus, devfn), pos); > > /* > * If we have no capabilities, this is indicated by cap ID, > @@ -109,7 +109,7 @@ int pci_find_next_ext_capability(int seg > pos = PCI_EXT_CAP_NEXT(header); > if ( pos < 0x100 ) > break; > - header = pci_conf_read32(PCI_SBDF3(seg, bus, devfn), pos); > + header = pci_conf_read32(PCI_SBDF(seg, bus, devfn), pos); > } > return 0; > } > @@ -162,7 +162,7 @@ const char *__init parse_pci_seg(const c > else > func = 0; > if ( seg != (seg_p ? (u16)seg : 0) || > - bus != PCI_BUS(PCI_BDF2(bus, 0)) || > + bus != PCI_BUS(PCI_BDF(bus, 0)) || > dev != PCI_SLOT(PCI_DEVFN(dev, 0)) || > func != PCI_FUNC(PCI_DEVFN(0, func)) ) > return NULL; > --- a/xen/drivers/video/vga.c > +++ b/xen/drivers/video/vga.c > @@ -122,9 +122,9 @@ void __init video_endboot(void) > pcidevs_unlock(); > > if ( !pdev || > - pci_conf_read16(PCI_SBDF3(0, bus, devfn), > + pci_conf_read16(PCI_SBDF(0, bus, devfn), > PCI_CLASS_DEVICE) != 0x0300 || > - !(pci_conf_read16(PCI_SBDF3(0, bus, devfn), PCI_COMMAND) & > + !(pci_conf_read16(PCI_SBDF(0, bus, devfn), PCI_COMMAND) & > (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) ) > continue; > > @@ -136,12 +136,12 @@ void __init video_endboot(void) > b = 0; > break; > case 1: > - switch ( pci_conf_read8(PCI_SBDF3(0, b, df), > + switch ( pci_conf_read8(PCI_SBDF(0, b, df), > PCI_HEADER_TYPE) ) > { > case PCI_HEADER_TYPE_BRIDGE: > case PCI_HEADER_TYPE_CARDBUS: > - if ( pci_conf_read16(PCI_SBDF3(0, b, df), > + if ( pci_conf_read16(PCI_SBDF(0, b, df), > PCI_BRIDGE_CONTROL) & > PCI_BRIDGE_CTL_VGA ) > continue; > --- a/xen/include/xen/pci.h > +++ b/xen/include/xen/pci.h > @@ -29,16 +29,21 @@ > #define PCI_BUS(bdf) (((bdf) >> 8) & 0xff) > #define PCI_SLOT(bdf) (((bdf) >> 3) & 0x1f) > #define PCI_FUNC(bdf) ((bdf) & 0x07) > -#define PCI_DEVFN(d,f) ((((d) & 0x1f) << 3) | ((f) & 0x07)) > -#define PCI_DEVFN2(bdf) ((bdf) & 0xff) > -#define PCI_BDF(b,d,f) ((((b) & 0xff) << 8) | PCI_DEVFN(d,f)) > -#define PCI_BDF2(b,df) ((((b) & 0xff) << 8) | ((df) & 0xff)) > -#define PCI_SBDF(s,b,d,f) \ > - ((pci_sbdf_t){ .sbdf = (((s) & 0xffff) << 16) | PCI_BDF(b, d, f) }) > -#define PCI_SBDF2(s,bdf) \ > + > +#define PCI_DEVFN1_(df) ((df) & 0xff) > +#define PCI_DEVFN2_(d, f) ((((d) & 0x1f) << 3) | ((f) & 7)) > +#define PCI_SBDF4_(s, b, d, f...) \ > + ((pci_sbdf_t){ .sbdf = (((s) & 0xffff) << 16) | PCI_BDF(b, d, ##f) }) > +#define PCI_SBDF3_ PCI_SBDF4_ > +#define PCI_SBDF2_(s, bdf) \ > ((pci_sbdf_t){ .sbdf = (((s) & 0xffff) << 16) | ((bdf) & 0xffff) }) > -#define PCI_SBDF3(s,b,df) \ > - ((pci_sbdf_t){ .sbdf = (((s) & 0xffff) << 16) | PCI_BDF2(b, df) }) > + > +#define PCI__(what, nr) PCI_##what##nr##_ > +#define PCI_(what, nr) PCI__(what, nr) > + > +#define PCI_DEVFN(d, f...) PCI_(DEVFN, count_args(d, ##f))(d, ##f) > +#define PCI_BDF(b, d, f...) ((((b) & 0xff) << 8) | PCI_DEVFN(d, ##f)) > +#define PCI_SBDF(s, b, d...) PCI_(SBDF, count_args(s, b, ##d))(s, b, ##d) > > #define ECAM_REG_OFFSET(addr) ((addr) & 0x00000fff) >
--- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -4902,7 +4902,7 @@ int cf_check mmcfg_intercept_write( if ( pci_conf_write_intercept(mmio_ctxt->seg, mmio_ctxt->bdf, offset, bytes, p_data) >= 0 ) pci_mmcfg_write(mmio_ctxt->seg, PCI_BUS(mmio_ctxt->bdf), - PCI_DEVFN2(mmio_ctxt->bdf), offset, bytes, + PCI_DEVFN(mmio_ctxt->bdf), offset, bytes, *(uint32_t *)p_data); return X86EMUL_OKAY; --- a/xen/arch/x86/pci.c +++ b/xen/arch/x86/pci.c @@ -90,7 +90,7 @@ int pci_conf_write_intercept(unsigned in pcidevs_lock(); - pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN2(bdf)); + pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN(bdf)); if ( pdev ) rc = pci_msi_conf_write_intercept(pdev, reg, size, data); --- a/xen/arch/x86/x86_64/mmconfig-shared.c +++ b/xen/arch/x86/x86_64/mmconfig-shared.c @@ -313,7 +313,7 @@ static int __init pci_mmcfg_check_hostbr for (i = 0; !name && i < ARRAY_SIZE(pci_mmcfg_probes); i++) { bus = pci_mmcfg_probes[i].bus; devfn = pci_mmcfg_probes[i].devfn; - l = pci_conf_read32(PCI_SBDF3(0, bus, devfn), 0); + l = pci_conf_read32(PCI_SBDF(0, bus, devfn), 0); vendor = l & 0xffff; device = (l >> 16) & 0xffff; --- a/xen/common/compat/memory.c +++ b/xen/common/compat/memory.c @@ -27,8 +27,8 @@ static int cf_check get_reserved_device_ xen_pfn_t start, xen_ulong_t nr, u32 id, void *ctxt) { struct get_reserved_device_memory *grdm = ctxt; - uint32_t sbdf = PCI_SBDF3(grdm->map.dev.pci.seg, grdm->map.dev.pci.bus, - grdm->map.dev.pci.devfn).sbdf; + uint32_t sbdf = PCI_SBDF(grdm->map.dev.pci.seg, grdm->map.dev.pci.bus, + grdm->map.dev.pci.devfn).sbdf; if ( !(grdm->map.flags & XENMEM_RDM_ALL) && (sbdf != id) ) return 0; --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -1055,8 +1055,8 @@ static int cf_check get_reserved_device_ xen_pfn_t start, xen_ulong_t nr, u32 id, void *ctxt) { struct get_reserved_device_memory *grdm = ctxt; - uint32_t sbdf = PCI_SBDF3(grdm->map.dev.pci.seg, grdm->map.dev.pci.bus, - grdm->map.dev.pci.devfn).sbdf; + uint32_t sbdf = PCI_SBDF(grdm->map.dev.pci.seg, grdm->map.dev.pci.bus, + grdm->map.dev.pci.devfn).sbdf; if ( !(grdm->map.flags & XENMEM_RDM_ALL) && (sbdf != id) ) return 0; --- a/xen/drivers/passthrough/amd/iommu_acpi.c +++ b/xen/drivers/passthrough/amd/iommu_acpi.c @@ -96,7 +96,7 @@ static void __init add_ivrs_mapping_entr if ( !ivrs_mappings[alias_id].intremap_table ) panic("No memory for %pp's IRT\n", - &PCI_SBDF2(iommu->seg, alias_id)); + &PCI_SBDF(iommu->seg, alias_id)); } } @@ -790,7 +790,7 @@ static u16 __init parse_ivhd_device_spec } AMD_IOMMU_DEBUG("IVHD Special: %pp variety %#x handle %#x\n", - &PCI_SBDF2(seg, bdf), special->variety, special->handle); + &PCI_SBDF(seg, bdf), special->variety, special->handle); add_ivrs_mapping_entry(bdf, bdf, special->header.data_setting, 0, true, iommu); @@ -816,7 +816,7 @@ static u16 __init parse_ivhd_device_spec AMD_IOMMU_DEBUG("IVHD: Command line override present for IO-APIC %#x" "(IVRS: %#x devID %pp)\n", ioapic_sbdf[idx].id, special->handle, - &PCI_SBDF2(seg, bdf)); + &PCI_SBDF(seg, bdf)); break; } @@ -888,7 +888,7 @@ static u16 __init parse_ivhd_device_spec AMD_IOMMU_DEBUG("IVHD: Command line override present for HPET %#x " "(IVRS: %#x devID %pp)\n", hpet_sbdf.id, special->handle, - &PCI_SBDF2(seg, bdf)); + &PCI_SBDF(seg, bdf)); break; case HPET_NONE: /* set device id of hpet */ --- a/xen/drivers/passthrough/amd/iommu_cmd.c +++ b/xen/drivers/passthrough/amd/iommu_cmd.c @@ -40,7 +40,7 @@ static void send_iommu_command(struct am IOMMU_RING_BUFFER_PTR_MASK) ) { printk_once(XENLOG_ERR "AMD IOMMU %pp: no cmd slot available\n", - &PCI_SBDF2(iommu->seg, iommu->bdf)); + &PCI_SBDF(iommu->seg, iommu->bdf)); cpu_relax(); } @@ -84,7 +84,7 @@ static void flush_command_buffer(struct threshold |= threshold << 1; printk(XENLOG_WARNING "AMD IOMMU %pp: %scompletion wait taking too long\n", - &PCI_SBDF2(iommu->seg, iommu->bdf), + &PCI_SBDF(iommu->seg, iommu->bdf), timeout_base ? "iotlb " : ""); timeout = 0; } @@ -94,7 +94,7 @@ static void flush_command_buffer(struct if ( !timeout ) printk(XENLOG_WARNING "AMD IOMMU %pp: %scompletion wait took %lums\n", - &PCI_SBDF2(iommu->seg, iommu->bdf), + &PCI_SBDF(iommu->seg, iommu->bdf), timeout_base ? "iotlb " : "", (NOW() - start) / 10000000); } @@ -292,14 +292,14 @@ void amd_iommu_flush_iotlb(u8 devfn, con if ( !iommu ) { AMD_IOMMU_WARN("can't find IOMMU for %pp\n", - &PCI_SBDF3(pdev->seg, pdev->bus, devfn)); + &PCI_SBDF(pdev->seg, pdev->bus, devfn)); return; } if ( !iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) ) return; - req_id = get_dma_requestor_id(iommu->seg, PCI_BDF2(pdev->bus, devfn)); + req_id = get_dma_requestor_id(iommu->seg, PCI_BDF(pdev->bus, devfn)); queueid = req_id; maxpend = pdev->ats.queue_depth & 0xff; --- a/xen/drivers/passthrough/amd/iommu_detect.c +++ b/xen/drivers/passthrough/amd/iommu_detect.c @@ -231,7 +231,7 @@ int __init amd_iommu_detect_one_acpi( rt = pci_ro_device(iommu->seg, bus, PCI_DEVFN(dev, func)); if ( rt ) printk(XENLOG_ERR "Could not mark config space of %pp read-only (%d)\n", - &PCI_SBDF2(iommu->seg, iommu->bdf), rt); + &PCI_SBDF(iommu->seg, iommu->bdf), rt); list_add_tail(&iommu->list, &amd_iommu_head); rt = 0; --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -562,7 +562,7 @@ static void cf_check parse_event_log_ent printk(XENLOG_ERR "AMD-Vi: %s: %pp d%u addr %016"PRIx64 " flags %#x%s%s%s%s%s%s%s%s%s%s\n", - code_str, &PCI_SBDF2(iommu->seg, device_id), + code_str, &PCI_SBDF(iommu->seg, device_id), domain_id, addr, flags, (flags & 0xe00) ? " ??" : "", (flags & 0x100) ? " TR" : "", @@ -578,7 +578,7 @@ static void cf_check parse_event_log_ent for ( bdf = 0; bdf < ivrs_bdf_entries; bdf++ ) if ( get_dma_requestor_id(iommu->seg, bdf) == device_id ) pci_check_disable_device(iommu->seg, PCI_BUS(bdf), - PCI_DEVFN2(bdf)); + PCI_DEVFN(bdf)); } else printk(XENLOG_ERR "%s %08x %08x %08x %08x\n", @@ -631,18 +631,13 @@ static void iommu_check_event_log(struct static void cf_check parse_ppr_log_entry(struct amd_iommu *iommu, u32 entry[]) { - - u16 device_id; - u8 bus, devfn; - struct pci_dev *pdev; - /* here device_id is physical value */ - device_id = iommu_get_devid_from_cmd(entry[0]); - bus = PCI_BUS(device_id); - devfn = PCI_DEVFN2(device_id); + uint16_t device_id = iommu_get_devid_from_cmd(entry[0]); + struct pci_dev *pdev; pcidevs_lock(); - pdev = pci_get_real_pdev(iommu->seg, bus, devfn); + pdev = pci_get_real_pdev(iommu->seg, PCI_BUS(device_id), + PCI_DEVFN(device_id)); pcidevs_unlock(); if ( pdev ) @@ -751,12 +746,12 @@ static bool_t __init set_iommu_interrupt pcidevs_lock(); iommu->msi.dev = pci_get_pdev(iommu->seg, PCI_BUS(iommu->bdf), - PCI_DEVFN2(iommu->bdf)); + PCI_DEVFN(iommu->bdf)); pcidevs_unlock(); if ( !iommu->msi.dev ) { AMD_IOMMU_WARN("no pdev for %pp\n", - &PCI_SBDF2(iommu->seg, iommu->bdf)); + &PCI_SBDF(iommu->seg, iommu->bdf)); return 0; } @@ -778,7 +773,7 @@ static bool_t __init set_iommu_interrupt hw_irq_controller *handler; u16 control; - control = pci_conf_read16(PCI_SBDF2(iommu->seg, iommu->bdf), + control = pci_conf_read16(PCI_SBDF(iommu->seg, iommu->bdf), iommu->msi.msi_attrib.pos + PCI_MSI_FLAGS); iommu->msi.msi.nvec = 1; @@ -842,22 +837,22 @@ static void amd_iommu_erratum_746_workar (boot_cpu_data.x86_model > 0x1f) ) return; - pci_conf_write32(PCI_SBDF2(iommu->seg, iommu->bdf), 0xf0, 0x90); - value = pci_conf_read32(PCI_SBDF2(iommu->seg, iommu->bdf), 0xf4); + pci_conf_write32(PCI_SBDF(iommu->seg, iommu->bdf), 0xf0, 0x90); + value = pci_conf_read32(PCI_SBDF(iommu->seg, iommu->bdf), 0xf4); if ( value & (1 << 2) ) return; /* Select NB indirect register 0x90 and enable writing */ - pci_conf_write32(PCI_SBDF2(iommu->seg, iommu->bdf), 0xf0, 0x90 | (1 << 8)); + pci_conf_write32(PCI_SBDF(iommu->seg, iommu->bdf), 0xf0, 0x90 | (1 << 8)); - pci_conf_write32(PCI_SBDF2(iommu->seg, iommu->bdf), 0xf4, value | (1 << 2)); + pci_conf_write32(PCI_SBDF(iommu->seg, iommu->bdf), 0xf4, value | (1 << 2)); printk(XENLOG_INFO "AMD-Vi: Applying erratum 746 workaround for IOMMU at %pp\n", - &PCI_SBDF2(iommu->seg, iommu->bdf)); + &PCI_SBDF(iommu->seg, iommu->bdf)); /* Clear the enable writing bit */ - pci_conf_write32(PCI_SBDF2(iommu->seg, iommu->bdf), 0xf0, 0x90); + pci_conf_write32(PCI_SBDF(iommu->seg, iommu->bdf), 0xf0, 0x90); } static void enable_iommu(struct amd_iommu *iommu) @@ -1288,7 +1283,7 @@ static int __init cf_check amd_iommu_set if ( !pci_init ) continue; pcidevs_lock(); - pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN2(bdf)); + pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN(bdf)); pcidevs_unlock(); } --- a/xen/drivers/passthrough/amd/iommu_intr.c +++ b/xen/drivers/passthrough/amd/iommu_intr.c @@ -604,7 +604,7 @@ static struct amd_iommu *_find_iommu_for if ( iommu ) return iommu; - AMD_IOMMU_DEBUG("No IOMMU for MSI dev = %pp\n", &PCI_SBDF2(seg, bdf)); + AMD_IOMMU_DEBUG("No IOMMU for MSI dev = %pp\n", &PCI_SBDF(seg, bdf)); return ERR_PTR(-EINVAL); } @@ -814,7 +814,7 @@ static void dump_intremap_table(const st if ( ivrs_mapping ) { printk(" %pp:\n", - &PCI_SBDF2(iommu->seg, ivrs_mapping->dte_requestor_id)); + &PCI_SBDF(iommu->seg, ivrs_mapping->dte_requestor_id)); ivrs_mapping = NULL; } --- a/xen/drivers/passthrough/amd/iommu_map.c +++ b/xen/drivers/passthrough/amd/iommu_map.c @@ -534,7 +534,7 @@ int cf_check amd_iommu_get_reserved_devi for ( bdf = 0; bdf < ivrs_bdf_entries; ++bdf ) { - pci_sbdf_t sbdf = PCI_SBDF2(seg, bdf); + pci_sbdf_t sbdf = PCI_SBDF(seg, bdf); const struct ivrs_unity_map *um = ivrs_mappings[bdf].unity_map; unsigned int req = ivrs_mappings[bdf].dte_requestor_id; const struct amd_iommu *iommu = ivrs_mappings[bdf].iommu; @@ -563,7 +563,7 @@ int cf_check amd_iommu_get_reserved_devi * the same alias ID. */ if ( bdf != req && ivrs_mappings[req].iommu && - func(0, 0, PCI_SBDF2(seg, req).sbdf, ctxt) ) + func(0, 0, PCI_SBDF(seg, req).sbdf, ctxt) ) continue; if ( global == pending ) --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -53,7 +53,7 @@ struct amd_iommu *find_iommu_for_device( ivrs_mappings[bdf] = tmp; printk(XENLOG_WARNING "%pp not found in ACPI tables;" - " using same IOMMU as function 0\n", &PCI_SBDF2(seg, bdf)); + " using same IOMMU as function 0\n", &PCI_SBDF(seg, bdf)); /* write iommu field last */ ivrs_mappings[bdf].iommu = ivrs_mappings[bd0].iommu; @@ -144,7 +144,7 @@ static int __must_check amd_iommu_setup_ | (ivrs_dev->unity_map ? SET_ROOT_WITH_UNITY_MAP : 0); /* get device-table entry */ - req_id = get_dma_requestor_id(iommu->seg, PCI_BDF2(bus, devfn)); + req_id = get_dma_requestor_id(iommu->seg, PCI_BDF(bus, devfn)); table = iommu->dev_table.buffer; dte = &table[req_id]; ivrs_dev = &get_ivrs_mappings(iommu->seg)[req_id]; @@ -202,7 +202,7 @@ static int __must_check amd_iommu_setup_ * presence. But let's deal with that case only if it is actually * found in the wild. */ - if ( req_id != PCI_BDF2(bus, devfn) && + if ( req_id != PCI_BDF(bus, devfn) && (sr_flags & SET_ROOT_WITH_UNITY_MAP) ) rc = -EOPNOTSUPP; else @@ -231,7 +231,7 @@ static int __must_check amd_iommu_setup_ (any_pdev_behind_iommu(pdev->domain, pdev, iommu) || pdev->phantom_stride) ) AMD_IOMMU_WARN(" %pp: reassignment may cause %pd data corruption\n", - &PCI_SBDF3(pdev->seg, bus, devfn), pdev->domain); + &PCI_SBDF(pdev->seg, bus, devfn), pdev->domain); /* * Check remaining settings are still in place from an earlier call @@ -414,7 +414,7 @@ static void amd_iommu_disable_domain_dev disable_ats_device(pdev); BUG_ON ( iommu->dev_table.buffer == NULL ); - req_id = get_dma_requestor_id(iommu->seg, PCI_BDF2(bus, devfn)); + req_id = get_dma_requestor_id(iommu->seg, PCI_BDF(bus, devfn)); table = iommu->dev_table.buffer; dte = &table[req_id]; @@ -461,7 +461,7 @@ static int cf_check reassign_device( if ( !iommu ) { AMD_IOMMU_WARN("failed to find IOMMU: %pp cannot be assigned to %pd\n", - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), target); + &PCI_SBDF(pdev->seg, pdev->bus, devfn), target); return -ENODEV; } @@ -488,7 +488,7 @@ static int cf_check reassign_device( if ( !is_hardware_domain(source) ) { const struct ivrs_mappings *ivrs_mappings = get_ivrs_mappings(pdev->seg); - unsigned int bdf = PCI_BDF2(pdev->bus, devfn); + unsigned int bdf = PCI_BDF(pdev->bus, devfn); rc = amd_iommu_reserve_domain_unity_unmap( source, @@ -498,7 +498,7 @@ static int cf_check reassign_device( } AMD_IOMMU_DEBUG("Re-assign %pp from %pd to %pd\n", - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), source, target); + &PCI_SBDF(pdev->seg, pdev->bus, devfn), source, target); return 0; } @@ -507,7 +507,7 @@ static int cf_check amd_iommu_assign_dev struct domain *d, u8 devfn, struct pci_dev *pdev, u32 flag) { struct ivrs_mappings *ivrs_mappings = get_ivrs_mappings(pdev->seg); - int bdf = PCI_BDF2(pdev->bus, devfn); + unsigned int bdf = PCI_BDF(pdev->bus, devfn); int req_id = get_dma_requestor_id(pdev->seg, bdf); int rc = amd_iommu_reserve_domain_unity_map( d, ivrs_mappings[req_id].unity_map, flag); @@ -575,12 +575,12 @@ static int cf_check amd_iommu_add_device } AMD_IOMMU_WARN("no IOMMU for %pp; cannot be handed to %pd\n", - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), pdev->domain); + &PCI_SBDF(pdev->seg, pdev->bus, devfn), pdev->domain); return -ENODEV; } ivrs_mappings = get_ivrs_mappings(pdev->seg); - bdf = PCI_BDF2(pdev->bus, devfn); + bdf = PCI_BDF(pdev->bus, devfn); if ( !ivrs_mappings || !ivrs_mappings[ivrs_mappings[bdf].dte_requestor_id].valid ) return -EPERM; @@ -618,7 +618,7 @@ static int cf_check amd_iommu_add_device ivrs_mappings[ivrs_mappings[bdf].dte_requestor_id].unity_map, 0) ) AMD_IOMMU_WARN("%pd: unity mapping failed for %pp\n", - pdev->domain, &PCI_SBDF2(pdev->seg, bdf)); + pdev->domain, &PCI_SBDF(pdev->seg, bdf)); if ( iommu_quarantine && pdev->arch.pseudo_domid == DOMID_INVALID ) { @@ -651,20 +651,20 @@ static int cf_check amd_iommu_remove_dev if ( !iommu ) { AMD_IOMMU_WARN("failed to find IOMMU: %pp cannot be removed from %pd\n", - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), pdev->domain); + &PCI_SBDF(pdev->seg, pdev->bus, devfn), pdev->domain); return -ENODEV; } amd_iommu_disable_domain_device(pdev->domain, iommu, devfn, pdev); ivrs_mappings = get_ivrs_mappings(pdev->seg); - bdf = PCI_BDF2(pdev->bus, devfn); + bdf = PCI_BDF(pdev->bus, devfn); if ( amd_iommu_reserve_domain_unity_unmap( pdev->domain, ivrs_mappings[ivrs_mappings[bdf].dte_requestor_id].unity_map) ) AMD_IOMMU_WARN("%pd: unity unmapping failed for %pp\n", - pdev->domain, &PCI_SBDF2(pdev->seg, bdf)); + pdev->domain, &PCI_SBDF(pdev->seg, bdf)); amd_iommu_quarantine_teardown(pdev); @@ -681,7 +681,7 @@ static int cf_check amd_iommu_remove_dev static int cf_check amd_iommu_group_id(u16 seg, u8 bus, u8 devfn) { - int bdf = PCI_BDF2(bus, devfn); + unsigned int bdf = PCI_BDF(bus, devfn); return (bdf < ivrs_bdf_entries) ? get_dma_requestor_id(seg, bdf) : bdf; } --- a/xen/drivers/passthrough/ats.h +++ b/xen/drivers/passthrough/ats.h @@ -35,7 +35,7 @@ static inline int pci_ats_enabled(int se pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS); BUG_ON(!pos); - value = pci_conf_read16(PCI_SBDF3(seg, bus, devfn), pos + ATS_REG_CTL); + value = pci_conf_read16(PCI_SBDF(seg, bus, devfn), pos + ATS_REG_CTL); return value & ATS_ENABLE; } --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -553,7 +553,7 @@ int __init pci_ro_device(int seg, int bu memset(pseg->ro_map, 0, sz); } - __set_bit(PCI_BDF2(bus, devfn), pseg->ro_map); + __set_bit(PCI_BDF(bus, devfn), pseg->ro_map); _pci_hide_device(pdev); return 0; @@ -957,7 +957,7 @@ static int deassign_device(struct domain out: if ( ret ) printk(XENLOG_G_ERR "%pd: deassign (%pp) failed (%d)\n", - d, &PCI_SBDF3(seg, bus, devfn), ret); + d, &PCI_SBDF(seg, bus, devfn), ret); return ret; } @@ -1406,7 +1406,7 @@ static int iommu_add_device(struct pci_d rc = iommu_call(hd->platform_ops, add_device, devfn, pci_to_dev(pdev)); if ( rc ) printk(XENLOG_WARNING "IOMMU: add %pp failed (%d)\n", - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), rc); + &PCI_SBDF(pdev->seg, pdev->bus, devfn), rc); } } @@ -1452,7 +1452,7 @@ static int iommu_remove_device(struct pc continue; printk(XENLOG_ERR "IOMMU: remove %pp failed (%d)\n", - &PCI_SBDF3(pdev->seg, pdev->bus, devfn), rc); + &PCI_SBDF(pdev->seg, pdev->bus, devfn), rc); return rc; } @@ -1536,7 +1536,7 @@ static int assign_device(struct domain * done: if ( rc ) printk(XENLOG_G_WARNING "%pd: assign (%pp) failed (%d)\n", - d, &PCI_SBDF3(seg, bus, devfn), rc); + d, &PCI_SBDF(seg, bus, devfn), rc); /* The device is assigned to dom_io so mark it as quarantined */ else if ( d == dom_io ) pdev->quarantine = true; @@ -1647,7 +1647,7 @@ int iommu_do_pci_domctl( seg = domctl->u.get_device_group.machine_sbdf >> 16; bus = PCI_BUS(domctl->u.get_device_group.machine_sbdf); - devfn = PCI_DEVFN2(domctl->u.get_device_group.machine_sbdf); + devfn = PCI_DEVFN(domctl->u.get_device_group.machine_sbdf); max_sdevs = domctl->u.get_device_group.max_sdevs; sdevs = domctl->u.get_device_group.sdev_array; @@ -1697,7 +1697,7 @@ int iommu_do_pci_domctl( seg = machine_sbdf >> 16; bus = PCI_BUS(machine_sbdf); - devfn = PCI_DEVFN2(machine_sbdf); + devfn = PCI_DEVFN(machine_sbdf); pcidevs_lock(); ret = device_assigned(seg, bus, devfn); @@ -1706,7 +1706,7 @@ int iommu_do_pci_domctl( if ( ret ) { printk(XENLOG_G_INFO "%pp already assigned, or non-existent\n", - &PCI_SBDF3(seg, bus, devfn)); + &PCI_SBDF(seg, bus, devfn)); ret = -EINVAL; } } @@ -1742,7 +1742,7 @@ int iommu_do_pci_domctl( seg = machine_sbdf >> 16; bus = PCI_BUS(machine_sbdf); - devfn = PCI_DEVFN2(machine_sbdf); + devfn = PCI_DEVFN(machine_sbdf); pcidevs_lock(); ret = deassign_device(d, seg, bus, devfn); --- a/xen/drivers/passthrough/vtd/dmar.c +++ b/xen/drivers/passthrough/vtd/dmar.c @@ -222,7 +222,7 @@ struct acpi_drhd_unit *acpi_find_matched continue; for (i = 0; i < drhd->scope.devices_cnt; i++) - if ( drhd->scope.devices[i] == PCI_BDF2(bus, devfn) ) + if ( drhd->scope.devices[i] == PCI_BDF(bus, devfn) ) return drhd; if ( test_bit(bus, drhd->scope.buses) ) @@ -1062,7 +1062,7 @@ int cf_check intel_iommu_get_reserved_de rc = func(PFN_DOWN(rmrr->base_address), PFN_UP(rmrr->end_address) - PFN_DOWN(rmrr->base_address), - PCI_SBDF2(rmrr->segment, bdf).sbdf, ctxt); + PCI_SBDF(rmrr->segment, bdf).sbdf, ctxt); if ( unlikely(rc < 0) ) return rc; --- a/xen/drivers/passthrough/vtd/intremap.c +++ b/xen/drivers/passthrough/vtd/intremap.c @@ -498,7 +498,7 @@ static void set_msi_source_id(struct pci case 4: sq = SQ_13_IGNORE_1; break; default: sq = SQ_ALL_16; break; } - set_ire_sid(ire, SVT_VERIFY_SID_SQ, sq, PCI_BDF2(bus, devfn)); + set_ire_sid(ire, SVT_VERIFY_SID_SQ, sq, PCI_BDF(bus, devfn)); break; case DEV_TYPE_PCI: @@ -508,7 +508,7 @@ static void set_msi_source_id(struct pci if ( ret == 0 ) /* integrated PCI device */ { set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_ALL_16, - PCI_BDF2(bus, devfn)); + PCI_BDF(bus, devfn)); } else if ( ret == 1 ) /* find upstream bridge */ { @@ -517,7 +517,7 @@ static void set_msi_source_id(struct pci (bus << 8) | pdev->bus); else set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_ALL_16, - PCI_BDF2(bus, devfn)); + PCI_BDF(bus, devfn)); } else dprintk(XENLOG_WARNING VTDPREFIX, --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -938,21 +938,21 @@ static int iommu_page_fault_do_one(struc "DMAR:[%s] Request device [%pp] " "fault addr %"PRIx64"\n", (type ? "DMA Read" : "DMA Write"), - &PCI_SBDF2(seg, source_id), addr); + &PCI_SBDF(seg, source_id), addr); kind = "DMAR"; break; case INTR_REMAP: printk(XENLOG_G_WARNING VTDPREFIX "INTR-REMAP: Request device [%pp] " "fault index %"PRIx64"\n", - &PCI_SBDF2(seg, source_id), addr >> 48); + &PCI_SBDF(seg, source_id), addr >> 48); kind = "INTR-REMAP"; break; default: printk(XENLOG_G_WARNING VTDPREFIX "UNKNOWN: Request device [%pp] " "fault addr %"PRIx64"\n", - &PCI_SBDF2(seg, source_id), addr); + &PCI_SBDF(seg, source_id), addr); kind = "UNKNOWN"; break; } @@ -961,7 +961,7 @@ static int iommu_page_fault_do_one(struc kind, fault_reason, reason); if ( iommu_verbose && fault_type == DMA_REMAP ) - print_vtd_entries(iommu, PCI_BUS(source_id), PCI_DEVFN2(source_id), + print_vtd_entries(iommu, PCI_BUS(source_id), PCI_DEVFN(source_id), addr >> PAGE_SHIFT); return 0; @@ -1039,7 +1039,7 @@ static void __do_iommu_page_fault(struct source_id, guest_addr); pci_check_disable_device(iommu->drhd->segment, - PCI_BUS(source_id), PCI_DEVFN2(source_id)); + PCI_BUS(source_id), PCI_DEVFN(source_id)); fault_index++; if ( fault_index > cap_num_fault_regs(iommu->cap) ) @@ -1541,7 +1541,7 @@ int domain_context_mapping_one( check_cleanup_domid_map(domain, pdev, iommu); printk(XENLOG_ERR "%pp: unexpected context entry %016lx_%016lx (expected %016lx_%016lx)\n", - &PCI_SBDF3(seg, bus, devfn), + &PCI_SBDF(seg, bus, devfn), (uint64_t)(res >> 64), (uint64_t)res, (uint64_t)(old >> 64), (uint64_t)old); rc = -EILSEQ; @@ -1571,7 +1571,7 @@ int domain_context_mapping_one( if ( !(mode & (MAP_OWNER_DYING | MAP_SINGLE_DEVICE)) ) printk(XENLOG_WARNING VTDPREFIX " %pp: reassignment may cause %pd data corruption\n", - &PCI_SBDF3(seg, bus, devfn), prev_dom); + &PCI_SBDF(seg, bus, devfn), prev_dom); write_atomic(&context->lo, lctxt.lo); /* No barrier should be needed between these two. */ @@ -1581,7 +1581,7 @@ int domain_context_mapping_one( iommu_sync_cache(context, sizeof(struct context_entry)); spin_unlock(&iommu->lock); - rc = iommu_flush_context_device(iommu, prev_did, PCI_BDF2(bus, devfn), + rc = iommu_flush_context_device(iommu, prev_did, PCI_BDF(bus, devfn), DMA_CCMD_MASK_NOBIT, !prev_dom); flush_dev_iotlb = !!find_ats_dev_drhd(iommu); ret = iommu_flush_iotlb_dsi(iommu, prev_did, !prev_dom, flush_dev_iotlb); @@ -1688,7 +1688,7 @@ static int domain_context_mapping(struct case DEV_TYPE_PCI_HOST_BRIDGE: if ( iommu_debug ) printk(VTDPREFIX "%pd:Hostbridge: skip %pp map\n", - domain, &PCI_SBDF3(seg, bus, devfn)); + domain, &PCI_SBDF(seg, bus, devfn)); if ( !is_hardware_domain(domain) ) return -EPERM; break; @@ -1712,7 +1712,7 @@ static int domain_context_mapping(struct if ( iommu_debug ) printk(VTDPREFIX "%pd:PCIe: map %pp\n", - domain, &PCI_SBDF3(seg, bus, devfn)); + domain, &PCI_SBDF(seg, bus, devfn)); ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn, pdev, DEVICE_DOMID(domain, pdev), pgd_maddr, mode); @@ -1737,7 +1737,7 @@ static int domain_context_mapping(struct if ( iommu_debug ) printk(VTDPREFIX "%pd:PCI: map %pp\n", - domain, &PCI_SBDF3(seg, bus, devfn)); + domain, &PCI_SBDF(seg, bus, devfn)); ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn, pdev, DEVICE_DOMID(domain, pdev), @@ -1802,7 +1802,7 @@ static int domain_context_mapping(struct default: dprintk(XENLOG_ERR VTDPREFIX, "%pd:unknown(%u): %pp\n", - domain, pdev->type, &PCI_SBDF3(seg, bus, devfn)); + domain, pdev->type, &PCI_SBDF(seg, bus, devfn)); ret = -EINVAL; break; } @@ -1851,7 +1851,7 @@ int domain_context_unmap_one( iommu_sync_cache(context, sizeof(struct context_entry)); rc = iommu_flush_context_device(iommu, iommu_domid, - PCI_BDF2(bus, devfn), + PCI_BDF(bus, devfn), DMA_CCMD_MASK_NOBIT, 0); flush_dev_iotlb = !!find_ats_dev_drhd(iommu); @@ -1910,7 +1910,7 @@ static const struct acpi_drhd_unit *doma case DEV_TYPE_PCI_HOST_BRIDGE: if ( iommu_debug ) printk(VTDPREFIX "%pd:Hostbridge: skip %pp unmap\n", - domain, &PCI_SBDF3(seg, bus, devfn)); + domain, &PCI_SBDF(seg, bus, devfn)); return ERR_PTR(is_hardware_domain(domain) ? 0 : -EPERM); case DEV_TYPE_PCIe_BRIDGE: @@ -1924,7 +1924,7 @@ static const struct acpi_drhd_unit *doma if ( iommu_debug ) printk(VTDPREFIX "%pd:PCIe: unmap %pp\n", - domain, &PCI_SBDF3(seg, bus, devfn)); + domain, &PCI_SBDF(seg, bus, devfn)); ret = domain_context_unmap_one(domain, iommu, bus, devfn); if ( !ret && devfn == pdev->devfn && ats_device(pdev, drhd) > 0 ) disable_ats_device(pdev); @@ -1937,7 +1937,7 @@ static const struct acpi_drhd_unit *doma if ( iommu_debug ) printk(VTDPREFIX "%pd:PCI: unmap %pp\n", - domain, &PCI_SBDF3(seg, bus, devfn)); + domain, &PCI_SBDF(seg, bus, devfn)); ret = domain_context_unmap_one(domain, iommu, bus, devfn); if ( ret ) break; @@ -1970,7 +1970,7 @@ static const struct acpi_drhd_unit *doma default: dprintk(XENLOG_ERR VTDPREFIX, "%pd:unknown(%u): %pp\n", - domain, pdev->type, &PCI_SBDF3(seg, bus, devfn)); + domain, pdev->type, &PCI_SBDF(seg, bus, devfn)); return ERR_PTR(-EINVAL); } @@ -2181,9 +2181,7 @@ static int cf_check intel_iommu_add_devi for_each_rmrr_device ( rmrr, bdf, i ) { - if ( rmrr->segment == pdev->seg && - PCI_BUS(bdf) == pdev->bus && - PCI_DEVFN2(bdf) == devfn ) + if ( rmrr->segment == pdev->seg && bdf == PCI_BDF(pdev->bus, devfn) ) { /* * iommu_add_device() is only called for the hardware @@ -2239,9 +2237,7 @@ static int cf_check intel_iommu_remove_d for_each_rmrr_device ( rmrr, bdf, i ) { - if ( rmrr->segment != pdev->seg || - PCI_BUS(bdf) != pdev->bus || - PCI_DEVFN2(bdf) != devfn ) + if ( rmrr->segment != pdev->seg || bdf != PCI_BDF(pdev->bus, devfn) ) continue; /* @@ -2668,8 +2664,7 @@ static int cf_check reassign_device_owne for_each_rmrr_device( rmrr, bdf, i ) if ( rmrr->segment == pdev->seg && - PCI_BUS(bdf) == pdev->bus && - PCI_DEVFN2(bdf) == devfn ) + bdf == PCI_BDF(pdev->bus, devfn) ) { /* * Any RMRR flag is always ignored when remove a device, @@ -2713,9 +2708,7 @@ static int cf_check intel_iommu_assign_d */ for_each_rmrr_device( rmrr, bdf, i ) { - if ( rmrr->segment == seg && - PCI_BUS(bdf) == bus && - PCI_DEVFN2(bdf) == devfn && + if ( rmrr->segment == seg && bdf == PCI_BDF(bus, devfn) && rmrr->scope.devices_cnt > 1 ) { bool_t relaxed = !!(flag & XEN_DOMCTL_DEV_RDM_RELAXED); @@ -2725,7 +2718,7 @@ static int cf_check intel_iommu_assign_d " with shared RMRR at %"PRIx64" for %pd.\n", relaxed ? XENLOG_WARNING : XENLOG_ERR, relaxed ? "risky" : "disallowed", - &PCI_SBDF3(seg, bus, devfn), rmrr->base_address, d); + &PCI_SBDF(seg, bus, devfn), rmrr->base_address, d); if ( !relaxed ) return -EPERM; } @@ -2737,9 +2730,7 @@ static int cf_check intel_iommu_assign_d /* Setup rmrr identity mapping */ for_each_rmrr_device( rmrr, bdf, i ) { - if ( rmrr->segment == seg && - PCI_BUS(bdf) == bus && - PCI_DEVFN2(bdf) == devfn ) + if ( rmrr->segment == seg && bdf == PCI_BDF(bus, devfn) ) { ret = iommu_identity_mapping(d, p2m_access_rw, rmrr->base_address, rmrr->end_address, flag); @@ -2762,9 +2753,7 @@ static int cf_check intel_iommu_assign_d for_each_rmrr_device( rmrr, bdf, i ) { - if ( rmrr->segment == seg && - PCI_BUS(bdf) == bus && - PCI_DEVFN2(bdf) == devfn ) + if ( rmrr->segment == seg && bdf == PCI_BDF(bus, devfn) ) { int rc = iommu_identity_mapping(d, p2m_access_x, rmrr->base_address, @@ -2791,7 +2780,7 @@ static int cf_check intel_iommu_group_id if ( find_upstream_bridge(seg, &bus, &devfn, &secbus) < 0 ) return -ENODEV; - return PCI_BDF2(bus, devfn); + return PCI_BDF(bus, devfn); } static int __must_check cf_check vtd_suspend(void) --- a/xen/drivers/passthrough/vtd/quirks.c +++ b/xen/drivers/passthrough/vtd/quirks.c @@ -115,7 +115,7 @@ bool is_azalia_tlb_enabled(const struct return true; /* Check for the specific device. */ - sbdf = PCI_SBDF2(drhd->segment, drhd->scope.devices[0]); + sbdf = PCI_SBDF(drhd->segment, drhd->scope.devices[0]); if ( pci_conf_read16(sbdf, PCI_VENDOR_ID) != PCI_VENDOR_ID_INTEL || pci_conf_read16(sbdf, PCI_DEVICE_ID) != 0x3a3e ) return true; @@ -446,7 +446,7 @@ int me_wifi_quirk(struct domain *domain, return 0; /* if device is WLAN device, map ME phantom device 0:3.7 */ - id = pci_conf_read32(PCI_SBDF3(0, bus, devfn), 0); + id = pci_conf_read32(PCI_SBDF(0, bus, devfn), 0); switch (id) { case 0x42328086: @@ -470,7 +470,7 @@ int me_wifi_quirk(struct domain *domain, return 0; /* if device is WLAN device, map ME phantom device 0:22.7 */ - id = pci_conf_read32(PCI_SBDF3(0, bus, devfn), 0); + id = pci_conf_read32(PCI_SBDF(0, bus, devfn), 0); switch (id) { case 0x00878086: /* Kilmer Peak */ --- a/xen/drivers/passthrough/vtd/utils.c +++ b/xen/drivers/passthrough/vtd/utils.c @@ -96,7 +96,7 @@ void print_vtd_entries(struct vtd_iommu u32 l_index, level; printk("print_vtd_entries: iommu #%u dev %pp gmfn %"PRI_gfn"\n", - iommu->index, &PCI_SBDF3(iommu->drhd->segment, bus, devfn), + iommu->index, &PCI_SBDF(iommu->drhd->segment, bus, devfn), gmfn); if ( iommu->root_maddr == 0 ) --- a/xen/drivers/pci/pci.c +++ b/xen/drivers/pci/pci.c @@ -46,12 +46,12 @@ int pci_find_next_cap(u16 seg, u8 bus, u while ( ttl-- ) { - pos = pci_conf_read8(PCI_SBDF3(seg, bus, devfn), pos); + pos = pci_conf_read8(PCI_SBDF(seg, bus, devfn), pos); if ( pos < 0x40 ) break; pos &= ~3; - id = pci_conf_read8(PCI_SBDF3(seg, bus, devfn), pos + PCI_CAP_LIST_ID); + id = pci_conf_read8(PCI_SBDF(seg, bus, devfn), pos + PCI_CAP_LIST_ID); if ( id == 0xff ) break; @@ -93,7 +93,7 @@ int pci_find_next_ext_capability(int seg int ttl = 480; /* 3840 bytes, minimum 8 bytes per capability */ int pos = max(start, 0x100); - header = pci_conf_read32(PCI_SBDF3(seg, bus, devfn), pos); + header = pci_conf_read32(PCI_SBDF(seg, bus, devfn), pos); /* * If we have no capabilities, this is indicated by cap ID, @@ -109,7 +109,7 @@ int pci_find_next_ext_capability(int seg pos = PCI_EXT_CAP_NEXT(header); if ( pos < 0x100 ) break; - header = pci_conf_read32(PCI_SBDF3(seg, bus, devfn), pos); + header = pci_conf_read32(PCI_SBDF(seg, bus, devfn), pos); } return 0; } @@ -162,7 +162,7 @@ const char *__init parse_pci_seg(const c else func = 0; if ( seg != (seg_p ? (u16)seg : 0) || - bus != PCI_BUS(PCI_BDF2(bus, 0)) || + bus != PCI_BUS(PCI_BDF(bus, 0)) || dev != PCI_SLOT(PCI_DEVFN(dev, 0)) || func != PCI_FUNC(PCI_DEVFN(0, func)) ) return NULL; --- a/xen/drivers/video/vga.c +++ b/xen/drivers/video/vga.c @@ -122,9 +122,9 @@ void __init video_endboot(void) pcidevs_unlock(); if ( !pdev || - pci_conf_read16(PCI_SBDF3(0, bus, devfn), + pci_conf_read16(PCI_SBDF(0, bus, devfn), PCI_CLASS_DEVICE) != 0x0300 || - !(pci_conf_read16(PCI_SBDF3(0, bus, devfn), PCI_COMMAND) & + !(pci_conf_read16(PCI_SBDF(0, bus, devfn), PCI_COMMAND) & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) ) continue; @@ -136,12 +136,12 @@ void __init video_endboot(void) b = 0; break; case 1: - switch ( pci_conf_read8(PCI_SBDF3(0, b, df), + switch ( pci_conf_read8(PCI_SBDF(0, b, df), PCI_HEADER_TYPE) ) { case PCI_HEADER_TYPE_BRIDGE: case PCI_HEADER_TYPE_CARDBUS: - if ( pci_conf_read16(PCI_SBDF3(0, b, df), + if ( pci_conf_read16(PCI_SBDF(0, b, df), PCI_BRIDGE_CONTROL) & PCI_BRIDGE_CTL_VGA ) continue; --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -29,16 +29,21 @@ #define PCI_BUS(bdf) (((bdf) >> 8) & 0xff) #define PCI_SLOT(bdf) (((bdf) >> 3) & 0x1f) #define PCI_FUNC(bdf) ((bdf) & 0x07) -#define PCI_DEVFN(d,f) ((((d) & 0x1f) << 3) | ((f) & 0x07)) -#define PCI_DEVFN2(bdf) ((bdf) & 0xff) -#define PCI_BDF(b,d,f) ((((b) & 0xff) << 8) | PCI_DEVFN(d,f)) -#define PCI_BDF2(b,df) ((((b) & 0xff) << 8) | ((df) & 0xff)) -#define PCI_SBDF(s,b,d,f) \ - ((pci_sbdf_t){ .sbdf = (((s) & 0xffff) << 16) | PCI_BDF(b, d, f) }) -#define PCI_SBDF2(s,bdf) \ + +#define PCI_DEVFN1_(df) ((df) & 0xff) +#define PCI_DEVFN2_(d, f) ((((d) & 0x1f) << 3) | ((f) & 7)) +#define PCI_SBDF4_(s, b, d, f...) \ + ((pci_sbdf_t){ .sbdf = (((s) & 0xffff) << 16) | PCI_BDF(b, d, ##f) }) +#define PCI_SBDF3_ PCI_SBDF4_ +#define PCI_SBDF2_(s, bdf) \ ((pci_sbdf_t){ .sbdf = (((s) & 0xffff) << 16) | ((bdf) & 0xffff) }) -#define PCI_SBDF3(s,b,df) \ - ((pci_sbdf_t){ .sbdf = (((s) & 0xffff) << 16) | PCI_BDF2(b, df) }) + +#define PCI__(what, nr) PCI_##what##nr##_ +#define PCI_(what, nr) PCI__(what, nr) + +#define PCI_DEVFN(d, f...) PCI_(DEVFN, count_args(d, ##f))(d, ##f) +#define PCI_BDF(b, d, f...) ((((b) & 0xff) << 8) | PCI_DEVFN(d, ##f)) +#define PCI_SBDF(s, b, d...) PCI_(SBDF, count_args(s, b, ##d))(s, b, ##d) #define ECAM_REG_OFFSET(addr) ((addr) & 0x00000fff)
At their use sites the numeric suffixes are at least odd to read, first and foremost for PCI_DEVFN2() where the suffix doesn't even match the number of arguments. Make use of count_args() such that a single flavor each suffices (leaving aside helper macros, which aren't supposed to be used from the outside). In parse_ppr_log_entry() take the opportunity and drop two local variables and convert an assignment to an initializer. In VT-d code fold a number of bus+devfn comparison pairs into a single BDF comparison. No change to generated code for the vast majority of the adjustments. Signed-off-by: Jan Beulich <jbeulich@suse.com>