Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0dde1c08 authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

PCI: Don't reassign resources that are already aligned



The "pci=resource_alignment=" kernel argument designates devices for which
we want alignment greater than is required by the PCI specs.  Previously we
set IORESOURCE_UNSET for every MEM resource of those devices, even if the
resource was *already* sufficiently aligned.

If a resource is already sufficiently aligned, leave it alone and don't try
to reassign it.

Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 81a5e70e
Loading
Loading
Loading
Loading
+19 −21
Original line number Diff line number Diff line
@@ -5065,30 +5065,28 @@ static void pci_request_resource_alignment(struct pci_dev *dev, int bar,
	}

	size = resource_size(r);
	if (size < align) {
	if (size >= align)
		return;

	/*
		 * Increase the size of the resource.  BARs are aligned on
		 * their size, so when we reallocate space for this
		 * resource, we'll allocate it with the larger alignment.
		 * It also prevents assignment of any other BARs inside the
		 * size.  If we're requesting page alignment, this means no
		 * other BARs will share the page.
		 *
		 * This makes the resource larger than the hardware BAR,
		 * which may break drivers that compute things based on the
		 * resource size, e.g., to find registers at a fixed offset
		 * before the end of the BAR.  We hope users don't request
		 * alignment for such devices.
		 */
		size = align;
	 * Increase the size of the resource.  BARs are aligned on their
	 * size, so when we reallocate space for this resource, we'll
	 * allocate it with the larger alignment.  It also prevents
	 * assignment of any other BARs inside the size.  If we're
	 * requesting page alignment, this means no other BARs will share
	 * the page.
	 *
	 * This makes the resource larger than the hardware BAR, which may
	 * break drivers that compute things based on the resource size,
	 * e.g., to find registers at a fixed offset before the end of the
	 * BAR.  We hope users don't request alignment for such devices.
	 */
	dev_info(&dev->dev, "BAR%d %pR: requesting alignment to %#llx\n",
		 bar, r, (unsigned long long)align);

	}
	r->flags |= IORESOURCE_UNSET;
	r->end = size - 1;
	r->start = 0;
	r->end = align - 1;
	r->flags |= IORESOURCE_UNSET;
}

/*