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

Commit 79dba2ea authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6:
  x86/PCI: compute Address Space length rather than using _LEN
  x86/PCI: never allocate PCI MMIO resources below BIOS_END
parents d9e80b7d 48728e07
Loading
Loading
Loading
Loading
+2 −38
Original line number Diff line number Diff line
@@ -121,30 +121,6 @@ count_resource(struct acpi_resource *acpi_res, void *data)
	return AE_OK;
}

static void
align_resource(struct acpi_device *bridge, struct resource *res)
{
	int align = (res->flags & IORESOURCE_MEM) ? 16 : 4;

	/*
	 * Host bridge windows are not BARs, but the decoders on the PCI side
	 * that claim this address space have starting alignment and length
	 * constraints, so fix any obvious BIOS goofs.
	 */
	if (!IS_ALIGNED(res->start, align)) {
		dev_printk(KERN_DEBUG, &bridge->dev,
			   "host bridge window %pR invalid; "
			   "aligning start to %d-byte boundary\n", res, align);
		res->start &= ~(align - 1);
	}
	if (!IS_ALIGNED(res->end + 1, align)) {
		dev_printk(KERN_DEBUG, &bridge->dev,
			   "host bridge window %pR invalid; "
			   "aligning end to %d-byte boundary\n", res, align);
		res->end = ALIGN(res->end, align) - 1;
	}
}

static acpi_status
setup_resource(struct acpi_resource *acpi_res, void *data)
{
@@ -154,7 +130,7 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
	acpi_status status;
	unsigned long flags;
	struct resource *root, *conflict;
	u64 start, end, max_len;
	u64 start, end;

	status = resource_to_addr(acpi_res, &addr);
	if (!ACPI_SUCCESS(status))
@@ -171,19 +147,8 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
	} else
		return AE_OK;

	max_len = addr.maximum - addr.minimum + 1;
	if (addr.address_length > max_len) {
		dev_printk(KERN_DEBUG, &info->bridge->dev,
			   "host bridge window length %#llx doesn't fit in "
			   "%#llx-%#llx, trimming\n",
			   (unsigned long long) addr.address_length,
			   (unsigned long long) addr.minimum,
			   (unsigned long long) addr.maximum);
		addr.address_length = max_len;
	}

	start = addr.minimum + addr.translation_offset;
	end = start + addr.address_length - 1;
	end = addr.maximum + addr.translation_offset;

	res = &info->res[info->res_num];
	res->name = info->name;
@@ -191,7 +156,6 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
	res->start = start;
	res->end = end;
	res->child = NULL;
	align_resource(info->bridge, res);

	if (!pci_use_crs) {
		dev_printk(KERN_DEBUG, &info->bridge->dev,
+3 −0
Original line number Diff line number Diff line
@@ -72,6 +72,9 @@ pcibios_align_resource(void *data, const struct resource *res,
			return start;
		if (start & 0x300)
			start = (start + 0x3ff) & ~0x3ff;
	} else if (res->flags & IORESOURCE_MEM) {
		if (start < BIOS_END)
			start = BIOS_END;
	}
	return start;
}