[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 5/9] xen/pci: split code to size BARs from pci_add_device
On Fri, Jul 14, 2017 at 04:33:20AM -0600, Jan Beulich wrote: > >>> On 30.06.17 at 17:01, <roger.pau@xxxxxxxxxx> wrote: > > So that it can be called from outside in order to get the size of regular > > PCI > > BARs. This will be required in order to map the BARs from PCI devices into > > PVH > > Dom0 p2m. > > > > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> > > > > --- a/xen/drivers/passthrough/pci.c > > +++ b/xen/drivers/passthrough/pci.c > > @@ -588,6 +588,54 @@ static void pci_enable_acs(struct pci_dev *pdev) > > pci_conf_write16(seg, bus, dev, func, pos + PCI_ACS_CTRL, ctrl); > > } > > > > +int pci_size_mem_bar(unsigned int seg, unsigned int bus, unsigned int slot, > > + unsigned int func, unsigned int pos, bool last, > > + uint64_t *paddr, uint64_t *psize) > > +{ > > + uint32_t hi = 0, bar = pci_conf_read32(seg, bus, slot, func, pos); > > + uint64_t addr, size; > > + > > + ASSERT((bar & PCI_BASE_ADDRESS_SPACE) == > > PCI_BASE_ADDRESS_SPACE_MEMORY); > > + pci_conf_write32(seg, bus, slot, func, pos, ~0); > > + if ( (bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == > > + PCI_BASE_ADDRESS_MEM_TYPE_64 ) > > + { > > + if ( last ) > > + { > > + printk(XENLOG_WARNING > > + "device %04x:%02x:%02x.%u with 64-bit BAR in last > > slot\n", > > This message needs to tell what kind of slot is being processed (just > like the original did). The original message is: "SR-IOV device %04x:%02x:%02x.%u with 64-bit vf BAR in last slot" I guess you would like to have the "vf" again, in which case I will add a bool vf parameter to the function that's only going to be used here. IMHO I'm not really sure it's worth it because I don't find it that informative. I though that just knowing the device sbdf is enough. > > + seg, bus, slot, func); > > + return -EINVAL; > > + } > > + hi = pci_conf_read32(seg, bus, slot, func, pos + 4); > > + pci_conf_write32(seg, bus, slot, func, pos + 4, ~0); > > + } > > + size = pci_conf_read32(seg, bus, slot, func, pos) & > > + PCI_BASE_ADDRESS_MEM_MASK; > > + if ( (bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == > > + PCI_BASE_ADDRESS_MEM_TYPE_64 ) > > + { > > + size |= (u64)pci_conf_read32(seg, bus, slot, func, pos + 4) << 32; > > uint64_t > > > + pci_conf_write32(seg, bus, slot, func, pos + 4, hi); > > + } > > + else if ( size ) > > + size |= (u64)~0 << 32; > > Again (and more below). Yes, I think I've fixed all of them. > > + pci_conf_write32(seg, bus, slot, func, pos, bar); > > + size = -(size); > > Stray parentheses. > > > + addr = (bar & PCI_BASE_ADDRESS_MEM_MASK) | ((u64)hi << 32); > > + > > + if ( paddr ) > > + *paddr = addr; > > + if ( psize ) > > + *psize = size; > > Is it reasonable to expect the caller to not care about the size? Not at the moment, so I guess ASSERT(psize) would be better. > > @@ -663,38 +710,12 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, > > seg, bus, slot, func, i); > > continue; > > } > > - pci_conf_write32(seg, bus, slot, func, idx, ~0); > > - if ( (bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == > > - PCI_BASE_ADDRESS_MEM_TYPE_64 ) > > - { > > - if ( i >= PCI_SRIOV_NUM_BARS ) > > - { > > - printk(XENLOG_WARNING > > - "SR-IOV device %04x:%02x:%02x.%u with > > 64-bit" > > - " vf BAR in last slot\n", > > - seg, bus, slot, func); > > - break; > > - } > > - hi = pci_conf_read32(seg, bus, slot, func, idx + 4); > > - pci_conf_write32(seg, bus, slot, func, idx + 4, ~0); > > - } > > - pdev->vf_rlen[i] = pci_conf_read32(seg, bus, slot, func, > > idx) & > > - PCI_BASE_ADDRESS_MEM_MASK; > > - if ( (bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == > > - PCI_BASE_ADDRESS_MEM_TYPE_64 ) > > - { > > - pdev->vf_rlen[i] |= (u64)pci_conf_read32(seg, bus, > > - slot, func, > > - idx + 4) << > > 32; > > - pci_conf_write32(seg, bus, slot, func, idx + 4, hi); > > - } > > - else if ( pdev->vf_rlen[i] ) > > - pdev->vf_rlen[i] |= (u64)~0 << 32; > > - pci_conf_write32(seg, bus, slot, func, idx, bar); > > - pdev->vf_rlen[i] = -pdev->vf_rlen[i]; > > - if ( (bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == > > - PCI_BASE_ADDRESS_MEM_TYPE_64 ) > > - ++i; > > + ret = pci_size_mem_bar(seg, bus, slot, func, idx, > > + i == PCI_SRIOV_NUM_BARS - 1, NULL, > > + &pdev->vf_rlen[i]); > > + if ( ret < 0 ) > > + break; > > ASSERT(ret) ? Really? This is different from the previous behavior, that would just break out of the loop in this situation. And on non-debug builds we would end up decreasing i, which is not good. Thanks for the review, Roger. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |