PCI: endpoint: pci-epf-vntb: Simplify ctrl/SPAD space allocation
authorJerome Brunet <jbrunet@baylibre.com>
Thu, 24 Apr 2025 08:34:05 +0000 (10:34 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 28 May 2025 21:47:37 +0000 (16:47 -0500)
When allocating the shared ctrl/SPAD space, epf_ntb_config_spad_bar_alloc()
should not try to handle the size quirks for underlying BAR, whether it is
fixed size or alignment. This is already handled by pci_epf_alloc_space().

Also, when handling the alignment, this allocates more space than
necessary. For example, with a SPAD size of 1024B and a ctrl size of 308B,
the space necessary is 1332B. If the alignment is 1MB,
epf_ntb_config_spad_bar_alloc() tries to allocate 2MB where 1MB would have
been more than enough.

Drop the handling of the BAR size quirks and let pci_epf_alloc_space()
handle that. Just make sure the 32bits SPAD register are aligned on 32bits.

Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://patch.msgid.link/20250424-pci-ep-size-alignment-v5-2-2d4ec2af23f5@baylibre.com
drivers/pci/endpoint/functions/pci-epf-vntb.c

index 874cb097b093ae645bbc4bf3c9d28ca812d7689d..e4da3fdb000723e3adad01f0ddf230ecc0e572a7 100644 (file)
@@ -408,11 +408,9 @@ static void epf_ntb_config_spad_bar_free(struct epf_ntb *ntb)
  */
 static int epf_ntb_config_spad_bar_alloc(struct epf_ntb *ntb)
 {
-       size_t align;
        enum pci_barno barno;
        struct epf_ntb_ctrl *ctrl;
        u32 spad_size, ctrl_size;
-       u64 size;
        struct pci_epf *epf = ntb->epf;
        struct device *dev = &epf->dev;
        u32 spad_count;
@@ -422,31 +420,13 @@ static int epf_ntb_config_spad_bar_alloc(struct epf_ntb *ntb)
                                                                epf->func_no,
                                                                epf->vfunc_no);
        barno = ntb->epf_ntb_bar[BAR_CONFIG];
-       size = epc_features->bar[barno].fixed_size;
-       align = epc_features->align;
-
-       if ((!IS_ALIGNED(size, align)))
-               return -EINVAL;
-
        spad_count = ntb->spad_count;
 
-       ctrl_size = sizeof(struct epf_ntb_ctrl);
+       ctrl_size = ALIGN(sizeof(struct epf_ntb_ctrl), sizeof(u32));
        spad_size = 2 * spad_count * sizeof(u32);
 
-       if (!align) {
-               ctrl_size = roundup_pow_of_two(ctrl_size);
-               spad_size = roundup_pow_of_two(spad_size);
-       } else {
-               ctrl_size = ALIGN(ctrl_size, align);
-               spad_size = ALIGN(spad_size, align);
-       }
-
-       if (!size)
-               size = ctrl_size + spad_size;
-       else if (size < ctrl_size + spad_size)
-               return -EINVAL;
-
-       base = pci_epf_alloc_space(epf, size, barno, epc_features, 0);
+       base = pci_epf_alloc_space(epf, ctrl_size + spad_size,
+                                  barno, epc_features, 0);
        if (!base) {
                dev_err(dev, "Config/Status/SPAD alloc region fail\n");
                return -ENOMEM;