[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 05/11] pci: split code to size BARs from pci_add_device
>>> On 19.09.17 at 17:29, <roger.pau@xxxxxxxxxx> wrote: > --- a/xen/drivers/passthrough/pci.c > +++ b/xen/drivers/passthrough/pci.c > @@ -603,6 +603,56 @@ static int iommu_add_device(struct pci_dev *pdev); > static int iommu_enable_device(struct pci_dev *pdev); > static int iommu_remove_device(struct pci_dev *pdev); > > +int pci_size_mem_bar(pci_sbdf_t sbdf, unsigned int pos, bool last, > + uint64_t *paddr, uint64_t *psize, unsigned int flags) > +{ > + uint32_t hi = 0, bar = pci_conf_read32(sbdf.seg, sbdf.bus, sbdf.dev, > + sbdf.func, pos); > + uint64_t addr, size; > + bool vf = flags & PCI_BAR_VF; Honestly I'm not convinced of the utility of this variable; same for the "rom" one in the next patch. > + ASSERT((bar & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY); > + pci_conf_write32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, pos, ~0); > + if ( (bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == > + PCI_BASE_ADDRESS_MEM_TYPE_64 ) > + { > + if ( last ) > + { > + printk(XENLOG_WARNING > + "%sdevice %04x:%02x:%02x.%u with 64-bit %sBAR in last > slot\n", > + vf ? "SR-IOV " : "", sbdf.seg, sbdf.bus, sbdf.dev, > sbdf.func, > + vf ? "vf " : ""); > + return -EINVAL; > + } > + hi = pci_conf_read32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, pos + > 4); > + pci_conf_write32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, pos + 4, > ~0); > + } > + size = pci_conf_read32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, pos) & > + PCI_BASE_ADDRESS_MEM_MASK; > + if ( (bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == > + PCI_BASE_ADDRESS_MEM_TYPE_64 ) > + { > + size |= (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); > + } > + else if ( size ) > + size |= (uint64_t)~0 << 32; > + pci_conf_write32(sbdf.seg, sbdf.bus, sbdf.dev, sbdf.func, pos, bar); > + size = -size; > + addr = (bar & PCI_BASE_ADDRESS_MEM_MASK) | ((uint64_t)hi << 32); > + > + if ( paddr ) > + *paddr = addr; You need addr only inside the if() - no need for the local variable, and no need to calculate it unconditionally. > --- a/xen/include/xen/pci.h > +++ b/xen/include/xen/pci.h > @@ -189,6 +189,10 @@ const char *parse_pci(const char *, unsigned int *seg, > unsigned int *bus, > const char *parse_pci_seg(const char *, unsigned int *seg, unsigned int *bus, > unsigned int *dev, unsigned int *func, bool > *def_seg); > > +#define _PCI_BAR_VF 0 > +#define PCI_BAR_VF (1u << _PCI_BAR_VF) Do you really need both? I know we have quite a few cases where flags are being defined this way, but that's usually when bit operations (test_bit() and alike) are intended on the flags fields. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |