On Mon, Oct 28, 2024 at 11:50:31AM -0500, Bjorn Helgaas wrote: > On Fri, Oct 25, 2024 at 11:50:37PM +0200, Michał Winiarski wrote: > > Drivers could leverage the fact that the VF BAR MMIO reservation is > > created for total number of VFs supported by the device by resizing the > > BAR to larger size when smaller number of VFs is enabled. > > > > Add a pci_iov_vf_bar_set_size() function to control the size and a > > pci_iov_vf_bar_get_sizes() helper to get the VF BAR sizes that will > > allow up to num_vfs to be successfully enabled with the current > > underlying reservation size. > > ... > > > + * pci_iov_vf_bar_get_sizes - get VF BAR sizes that allow to create up to num_vfs > > + * @dev: the PCI device > > + * @resno: the resource number > > + * @num_vfs: number of VFs > > + * > > + * Get the sizes of a VF resizable BAR that can fit up to num_vfs within the > > + * resource that reserves the MMIO space (originally up to total_VFs) the as > > + * bitmask defined in the spec (bit 0=1MB, bit 19=512GB). > > This sentence doesn't quite parse; something is missing around "the as". Yeah, typo, "the" should be removed. > I'm guessing you mean to say something about the return value being a > bitmask of VF BAR sizes that can be accommodated if num_vfs are > enabled? If so, maybe combine it with the following paragraph: I'll change it to: "Get the sizes of a VF resizable BAR that can be accomodated within the resource that reserves the MMIO space if num_vfs are enabled. Returns 0 if BAR isn't resizable, otherwise returns a bitmask in format defined in the spec (bit 0=1MB, bit 19=512GB)." -Michał > > > + * Returns 0 if BAR isn't resizable. > > + * > > + */ > > +u32 pci_iov_vf_bar_get_sizes(struct pci_dev *dev, int resno, int num_vfs) > > +{ > > + resource_size_t size; > > + u32 sizes; > > + int i; > > + > > + sizes = pci_rebar_get_possible_sizes(dev, resno); > > + if (!sizes) > > + return 0; > > + > > + while (sizes > 0) { > > + i = __fls(sizes); > > + size = pci_rebar_size_to_bytes(i); > > + > > + if (size * num_vfs <= pci_resource_len(dev, resno)) > > + break; > > + > > + sizes &= ~BIT(i); > > + } > > + > > + return sizes; > > +} > > +EXPORT_SYMBOL_GPL(pci_iov_vf_bar_get_sizes);