Skip to content

Commit 50d2827

Browse files
author
Fox Snowpatch
committed
1 parent 4f37907 commit 50d2827

18 files changed

Lines changed: 149 additions & 46 deletions

File tree

arch/alpha/kernel/pci.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final);
125125

126126
resource_size_t
127127
pcibios_align_resource(void *data, const struct resource *res,
128+
const struct resource *empty_res,
128129
resource_size_t size, resource_size_t align)
129130
{
130131
struct pci_dev *dev = data;

arch/arm/kernel/bios32.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,9 @@ char * __init pcibios_setup(char *str)
560560
* which might be mirrored at 0x0100-0x03ff..
561561
*/
562562
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
563-
resource_size_t size, resource_size_t align)
563+
const struct resource *empty_res,
564+
resource_size_t size,
565+
resource_size_t align)
564566
{
565567
struct pci_dev *dev = data;
566568
resource_size_t start = res->start;
@@ -569,14 +571,15 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,
569571
if (res->flags & IORESOURCE_IO && start & 0x300)
570572
start = (start + 0x3ff) & ~0x3ff;
571573

572-
start = (start + align - 1) & ~(align - 1);
573-
574574
host_bridge = pci_find_host_bridge(dev->bus);
575575

576576
if (host_bridge->align_resource)
577577
return host_bridge->align_resource(dev, res,
578578
start, size, align);
579579

580+
if (res->flags & IORESOURCE_MEM)
581+
return pci_align_resource(dev, res, empty_res, size, align);
582+
580583
return start;
581584
}
582585

arch/m68k/kernel/pcibios.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,18 @@
2727
* which might be mirrored at 0x0100-0x03ff..
2828
*/
2929
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
30-
resource_size_t size, resource_size_t align)
30+
const struct resource *empty_res,
31+
resource_size_t size,
32+
resource_size_t align)
3133
{
34+
struct pci_dev *dev = data;
3235
resource_size_t start = res->start;
3336

3437
if ((res->flags & IORESOURCE_IO) && (start & 0x300))
3538
start = (start + 0x3ff) & ~0x3ff;
3639

37-
start = (start + align - 1) & ~(align - 1);
40+
if (res->flags & IORESOURCE_MEM)
41+
return pci_align_resource(dev, res, empty_res, size, align);
3842

3943
return start;
4044
}

arch/mips/pci/pci-generic.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
* which might have be mirrored at 0x0100-0x03ff..
2323
*/
2424
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
25-
resource_size_t size, resource_size_t align)
25+
const struct resource *empty_res,
26+
resource_size_t size, resource_size_t align)
2627
{
2728
struct pci_dev *dev = data;
2829
resource_size_t start = res->start;
@@ -31,14 +32,15 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,
3132
if (res->flags & IORESOURCE_IO && start & 0x300)
3233
start = (start + 0x3ff) & ~0x3ff;
3334

34-
start = (start + align - 1) & ~(align - 1);
35-
3635
host_bridge = pci_find_host_bridge(dev->bus);
3736

3837
if (host_bridge->align_resource)
3938
return host_bridge->align_resource(dev, res,
4039
start, size, align);
4140

41+
if (res->flags & IORESOURCE_MEM)
42+
return pci_align_resource(dev, res, empty_res, size, align);
43+
4244
return start;
4345
}
4446

arch/mips/pci/pci-legacy.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ unsigned long pci_address_to_pio(phys_addr_t address)
5252
*/
5353
resource_size_t
5454
pcibios_align_resource(void *data, const struct resource *res,
55+
const struct resource *empty_res,
5556
resource_size_t size, resource_size_t align)
5657
{
5758
struct pci_dev *dev = data;
@@ -69,6 +70,8 @@ pcibios_align_resource(void *data, const struct resource *res,
6970
if (start & 0x300)
7071
start = (start + 0x3ff) & ~0x3ff;
7172
} else if (res->flags & IORESOURCE_MEM) {
73+
start = pci_align_resource(dev, res, empty_res, size, align);
74+
7275
/* Make sure we start at our min on all hoses */
7376
if (start < PCIBIOS_MIN_MEM + hose->mem_resource->start)
7477
start = PCIBIOS_MIN_MEM + hose->mem_resource->start;

arch/parisc/kernel/pci.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* Copyright (C) 1999-2001 Hewlett-Packard Company
99
* Copyright (C) 1999-2001 Grant Grundler
1010
*/
11+
#include <linux/align.h>
1112
#include <linux/eisa.h>
1213
#include <linux/init.h>
1314
#include <linux/module.h>
@@ -196,9 +197,12 @@ void __ref pcibios_init_bridge(struct pci_dev *dev)
196197
* than res->start.
197198
*/
198199
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
199-
resource_size_t size, resource_size_t alignment)
200+
const struct resource *empty_res,
201+
resource_size_t size,
202+
resource_size_t alignment)
200203
{
201-
resource_size_t mask, align, start = res->start;
204+
struct pci_dev *dev = data;
205+
resource_size_t align, start = res->start;
202206

203207
DBG_RES("pcibios_align_resource(%s, (%p) [%lx,%lx]/%x, 0x%lx, 0x%lx)\n",
204208
pci_name(((struct pci_dev *) data)),
@@ -207,11 +211,10 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,
207211

208212
/* If it's not IO, then it's gotta be MEM */
209213
align = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : PCIBIOS_MIN_MEM;
210-
211-
/* Align to largest of MIN or input size */
212-
mask = max(alignment, align) - 1;
213-
start += mask;
214-
start &= ~mask;
214+
if (align > alignment)
215+
start = ALIGN(start, align);
216+
else
217+
start = pci_align_resource(dev, res, empty_res, size, alignment);
215218

216219
return start;
217220
}

arch/powerpc/kernel/pci-common.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1132,7 +1132,9 @@ static int skip_isa_ioresource_align(struct pci_dev *dev)
11321132
* which might have be mirrored at 0x0100-0x03ff..
11331133
*/
11341134
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
1135-
resource_size_t size, resource_size_t align)
1135+
const struct resource *empty_res,
1136+
resource_size_t size,
1137+
resource_size_t align)
11361138
{
11371139
struct pci_dev *dev = data;
11381140
resource_size_t start = res->start;
@@ -1142,6 +1144,8 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,
11421144
return start;
11431145
if (start & 0x300)
11441146
start = (start + 0x3ff) & ~0x3ff;
1147+
} else if (res->flags & IORESOURCE_MEM) {
1148+
start = pci_align_resource(dev, res, empty_res, size, align);
11451149
}
11461150

11471151
return start;

arch/s390/pci/pci.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len)
266266
}
267267

268268
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
269+
const struct resource *empty_res,
269270
resource_size_t size,
270271
resource_size_t align)
271272
{

arch/sh/drivers/pci/pci.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,9 @@ subsys_initcall(pcibios_init);
168168
* modulo 0x400.
169169
*/
170170
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
171-
resource_size_t size, resource_size_t align)
171+
const struct resource *empty_res,
172+
resource_size_t size,
173+
resource_size_t align)
172174
{
173175
struct pci_dev *dev = data;
174176
struct pci_channel *hose = dev->sysdata;
@@ -183,6 +185,8 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,
183185
*/
184186
if (start & 0x300)
185187
start = (start + 0x3ff) & ~0x3ff;
188+
} else (res->flags & IORESOURCE_MEM) {
189+
start = pci_align_resource(dev, res, empty_res, size, align);
186190
}
187191

188192
return start;

arch/x86/pci/i386.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ skip_isa_ioresource_align(struct pci_dev *dev) {
153153
*/
154154
resource_size_t
155155
pcibios_align_resource(void *data, const struct resource *res,
156-
resource_size_t size, resource_size_t align)
156+
const struct resource *empty_res,
157+
resource_size_t size, resource_size_t align)
157158
{
158159
struct pci_dev *dev = data;
159160
resource_size_t start = res->start;
@@ -164,6 +165,8 @@ pcibios_align_resource(void *data, const struct resource *res,
164165
if (start & 0x300)
165166
start = (start + 0x3ff) & ~0x3ff;
166167
} else if (res->flags & IORESOURCE_MEM) {
168+
start = pci_align_resource(dev, res, empty_res, size, align);
169+
167170
/* The low 1MB range is reserved for ISA cards */
168171
if (start < BIOS_END)
169172
start = BIOS_END;

0 commit comments

Comments
 (0)