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". 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: > + * 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);