diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-04-28 23:40:17 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-04-28 23:40:17 -0400 |
| commit | 79dba2eaa771c3173957eccfd288e0e0d12e4d3f (patch) | |
| tree | 4cafc47b8eaed5d40b2d8705c9f9036fe6b463d3 | |
| parent | d9e80b7de91db05c1c4d2e5ebbfd70b3b3ba0e0f (diff) | |
| parent | 48728e077480910df45baabc5f87b04276348c90 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6
* '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
| -rw-r--r-- | arch/x86/pci/acpi.c | 40 | ||||
| -rw-r--r-- | arch/x86/pci/i386.c | 3 |
2 files changed, 5 insertions, 38 deletions
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 44f83ce02470..31930fd30ea9 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
| @@ -121,30 +121,6 @@ count_resource(struct acpi_resource *acpi_res, void *data) | |||
| 121 | return AE_OK; | 121 | return AE_OK; |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | static void | ||
| 125 | align_resource(struct acpi_device *bridge, struct resource *res) | ||
| 126 | { | ||
| 127 | int align = (res->flags & IORESOURCE_MEM) ? 16 : 4; | ||
| 128 | |||
| 129 | /* | ||
| 130 | * Host bridge windows are not BARs, but the decoders on the PCI side | ||
| 131 | * that claim this address space have starting alignment and length | ||
| 132 | * constraints, so fix any obvious BIOS goofs. | ||
| 133 | */ | ||
| 134 | if (!IS_ALIGNED(res->start, align)) { | ||
| 135 | dev_printk(KERN_DEBUG, &bridge->dev, | ||
| 136 | "host bridge window %pR invalid; " | ||
| 137 | "aligning start to %d-byte boundary\n", res, align); | ||
| 138 | res->start &= ~(align - 1); | ||
| 139 | } | ||
| 140 | if (!IS_ALIGNED(res->end + 1, align)) { | ||
| 141 | dev_printk(KERN_DEBUG, &bridge->dev, | ||
| 142 | "host bridge window %pR invalid; " | ||
| 143 | "aligning end to %d-byte boundary\n", res, align); | ||
| 144 | res->end = ALIGN(res->end, align) - 1; | ||
| 145 | } | ||
| 146 | } | ||
| 147 | |||
| 148 | static acpi_status | 124 | static acpi_status |
| 149 | setup_resource(struct acpi_resource *acpi_res, void *data) | 125 | setup_resource(struct acpi_resource *acpi_res, void *data) |
| 150 | { | 126 | { |
| @@ -154,7 +130,7 @@ setup_resource(struct acpi_resource *acpi_res, void *data) | |||
| 154 | acpi_status status; | 130 | acpi_status status; |
| 155 | unsigned long flags; | 131 | unsigned long flags; |
| 156 | struct resource *root, *conflict; | 132 | struct resource *root, *conflict; |
| 157 | u64 start, end, max_len; | 133 | u64 start, end; |
| 158 | 134 | ||
| 159 | status = resource_to_addr(acpi_res, &addr); | 135 | status = resource_to_addr(acpi_res, &addr); |
| 160 | if (!ACPI_SUCCESS(status)) | 136 | if (!ACPI_SUCCESS(status)) |
| @@ -171,19 +147,8 @@ setup_resource(struct acpi_resource *acpi_res, void *data) | |||
| 171 | } else | 147 | } else |
| 172 | return AE_OK; | 148 | return AE_OK; |
| 173 | 149 | ||
| 174 | max_len = addr.maximum - addr.minimum + 1; | ||
| 175 | if (addr.address_length > max_len) { | ||
| 176 | dev_printk(KERN_DEBUG, &info->bridge->dev, | ||
| 177 | "host bridge window length %#llx doesn't fit in " | ||
| 178 | "%#llx-%#llx, trimming\n", | ||
| 179 | (unsigned long long) addr.address_length, | ||
| 180 | (unsigned long long) addr.minimum, | ||
| 181 | (unsigned long long) addr.maximum); | ||
| 182 | addr.address_length = max_len; | ||
| 183 | } | ||
| 184 | |||
| 185 | start = addr.minimum + addr.translation_offset; | 150 | start = addr.minimum + addr.translation_offset; |
| 186 | end = start + addr.address_length - 1; | 151 | end = addr.maximum + addr.translation_offset; |
| 187 | 152 | ||
| 188 | res = &info->res[info->res_num]; | 153 | res = &info->res[info->res_num]; |
| 189 | res->name = info->name; | 154 | res->name = info->name; |
| @@ -191,7 +156,6 @@ setup_resource(struct acpi_resource *acpi_res, void *data) | |||
| 191 | res->start = start; | 156 | res->start = start; |
| 192 | res->end = end; | 157 | res->end = end; |
| 193 | res->child = NULL; | 158 | res->child = NULL; |
| 194 | align_resource(info->bridge, res); | ||
| 195 | 159 | ||
| 196 | if (!pci_use_crs) { | 160 | if (!pci_use_crs) { |
| 197 | dev_printk(KERN_DEBUG, &info->bridge->dev, | 161 | dev_printk(KERN_DEBUG, &info->bridge->dev, |
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 46fd43f79103..97da2ba9344b 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
| @@ -72,6 +72,9 @@ pcibios_align_resource(void *data, const struct resource *res, | |||
| 72 | return start; | 72 | return start; |
| 73 | if (start & 0x300) | 73 | if (start & 0x300) |
| 74 | start = (start + 0x3ff) & ~0x3ff; | 74 | start = (start + 0x3ff) & ~0x3ff; |
| 75 | } else if (res->flags & IORESOURCE_MEM) { | ||
| 76 | if (start < BIOS_END) | ||
| 77 | start = BIOS_END; | ||
| 75 | } | 78 | } |
| 76 | return start; | 79 | return start; |
| 77 | } | 80 | } |
