__find_resource_space() calculates the full extent of empty space but only passes the aligned space to resource_alignf callback. In some situations, the callback may choose take advantage of the free space before the requested alignment. Pass the full extent of the calculated empty space to resource_alignf callback as an additional parameter.
Unified · Split
| @@ -125,6 +125,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final); · 124 unmodified lines | ||
| 125 | 125 | |
| 126 | 126 | resource_size_t |
| 127 | 127 | pcibios_align_resource(void *data, const struct resource *res, |
| 128 | + const struct resource *empty_res, | |
| 128 | 129 | resource_size_t size, resource_size_t align) |
| 129 | 130 | { |
| 130 | 131 | struct pci_dev *dev = data; |
| @@ -560,7 +560,9 @@ char * __init pcibios_setup(char *str) · 559 unmodified lines | ||
| 560 | 560 | * which might be mirrored at 0x0100-0x03ff.. |
| 561 | 561 | */ |
| 562 | 562 | 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) | |
| 564 | 566 | { |
| 565 | 567 | struct pci_dev *dev = data; |
| 566 | 568 | resource_size_t start = res->start; |
| @@ -27,7 +27,9 @@ · 26 unmodified lines | ||
| 27 | 27 | * which might be mirrored at 0x0100-0x03ff.. |
| 28 | 28 | */ |
| 29 | 29 | 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) | |
| 31 | 33 | { |
| 32 | 34 | resource_size_t start = res->start; |
| 33 | 35 | |
| @@ -22,7 +22,8 @@ · 21 unmodified lines | ||
| 22 | 22 | * which might have be mirrored at 0x0100-0x03ff.. |
| 23 | 23 | */ |
| 24 | 24 | 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) | |
| 26 | 27 | { |
| 27 | 28 | struct pci_dev *dev = data; |
| 28 | 29 | resource_size_t start = res->start; |
| @@ -52,6 +52,7 @@ unsigned long pci_address_to_pio(phys_addr_t address) · 51 unmodified lines | ||
| 52 | 52 | */ |
| 53 | 53 | resource_size_t |
| 54 | 54 | pcibios_align_resource(void *data, const struct resource *res, |
| 55 | + const struct resource *empty_res, | |
| 55 | 56 | resource_size_t size, resource_size_t align) |
| 56 | 57 | { |
| 57 | 58 | struct pci_dev *dev = data; |
| @@ -196,7 +196,9 @@ void __ref pcibios_init_bridge(struct pci_dev *dev) · 195 unmodified lines | ||
| 196 | 196 | * than res->start. |
| 197 | 197 | */ |
| 198 | 198 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, |
| 199 | − resource_size_t size, resource_size_t alignment) | |
| 199 | + const struct resource *empty_res, | |
| 200 | + resource_size_t size, | |
| 201 | + resource_size_t alignment) | |
| 200 | 202 | { |
| 201 | 203 | resource_size_t mask, align, start = res->start; |
| 202 | 204 | |
| @@ -1132,7 +1132,9 @@ static int skip_isa_ioresource_align(struct pci_dev *dev) · 1131 unmodified lines | ||
| 1132 | 1132 | * which might have be mirrored at 0x0100-0x03ff.. |
| 1133 | 1133 | */ |
| 1134 | 1134 | 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) | |
| 1136 | 1138 | { |
| 1137 | 1139 | struct pci_dev *dev = data; |
| 1138 | 1140 | resource_size_t start = res->start; |
| @@ -266,6 +266,7 @@ static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len) · 265 unmodified lines | ||
| 266 | 266 | } |
| 267 | 267 | |
| 268 | 268 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, |
| 269 | + const struct resource *empty_res, | |
| 269 | 270 | resource_size_t size, |
| 270 | 271 | resource_size_t align) |
| 271 | 272 | { |
| @@ -168,7 +168,9 @@ subsys_initcall(pcibios_init); · 167 unmodified lines | ||
| 168 | 168 | * modulo 0x400. |
| 169 | 169 | */ |
| 170 | 170 | 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) | |
| 172 | 174 | { |
| 173 | 175 | struct pci_dev *dev = data; |
| 174 | 176 | struct pci_channel *hose = dev->sysdata; |
| @@ -153,7 +153,8 @@ skip_isa_ioresource_align(struct pci_dev *dev) { · 152 unmodified lines | ||
| 153 | 153 | */ |
| 154 | 154 | resource_size_t |
| 155 | 155 | 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) | |
| 157 | 158 | { |
| 158 | 159 | struct pci_dev *dev = data; |
| 159 | 160 | resource_size_t start = res->start; |
| @@ -39,6 +39,7 @@ · 38 unmodified lines | ||
| 39 | 39 | */ |
| 40 | 40 | resource_size_t |
| 41 | 41 | pcibios_align_resource(void *data, const struct resource *res, |
| 42 | + const struct resource *empty_res, | |
| 42 | 43 | resource_size_t size, resource_size_t align) |
| 43 | 44 | { |
| 44 | 45 | struct pci_dev *dev = data; |
| @@ -251,10 +251,11 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev, · 250 unmodified lines | ||
| 251 | 251 | */ |
| 252 | 252 | resource_size_t __weak pcibios_align_resource(void *data, |
| 253 | 253 | const struct resource *res, |
| 254 | + const struct resource *empty_res, | |
| 254 | 255 | resource_size_t size, |
| 255 | 256 | resource_size_t align) |
| 256 | 257 | { |
| 257 | − return res->start; | |
| 258 | + return res->start; | |
| 258 | 259 | } |
| 259 | 260 | |
| 260 | 261 | static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev, |
| @@ -602,7 +602,8 @@ static resource_size_t pcmcia_common_align(struct pcmcia_align_data *align_data, · 601 unmodified lines | ||
| 602 | 602 | |
| 603 | 603 | static resource_size_t |
| 604 | 604 | pcmcia_align(void *align_data, const struct resource *res, |
| 605 | − resource_size_t size, resource_size_t align) | |
| 605 | + const struct resource *empty_res, | |
| 606 | + resource_size_t size, resource_size_t align) | |
| 606 | 607 | { |
| 607 | 608 | struct pcmcia_align_data *data = align_data; |
| 608 | 609 | struct resource_map *m; |
| @@ -202,6 +202,7 @@ enum { · 201 unmodified lines | ||
| 202 | 202 | * typedef resource_alignf - Resource alignment callback |
| 203 | 203 | * @data: Private data used by the callback |
| 204 | 204 | * @res: Resource candidate range (an empty resource space) |
| 205 | + * @empty_res: Empty resource range without alignment applied | |
| 205 | 206 | * @size: The minimum size of the empty space |
| 206 | 207 | * @align: Alignment from the constraints |
| 207 | 208 | * |
| @@ -212,6 +213,7 @@ enum { · 4 unmodified lines | ||
| 212 | 213 | */ |
| 213 | 214 | typedef resource_size_t (*resource_alignf)(void *data, |
| 214 | 215 | const struct resource *res, |
| 216 | + const struct resource *empty_res, | |
| 215 | 217 | resource_size_t size, |
| 216 | 218 | resource_size_t align); |
| 217 | 219 | |
| @@ -1206,9 +1206,10 @@ int __must_check pcibios_enable_device(struct pci_dev *, int mask); · 1205 unmodified lines | ||
| 1206 | 1206 | char *pcibios_setup(char *str); |
| 1207 | 1207 | |
| 1208 | 1208 | /* Used only when drivers/pci/setup.c is used */ |
| 1209 | −resource_size_t pcibios_align_resource(void *, const struct resource *, | |
| 1210 | − resource_size_t, | |
| 1211 | − resource_size_t); | |
| 1209 | +resource_size_t pcibios_align_resource(void *data, const struct resource *res, | |
| 1210 | + const struct resource *empty_res, | |
| 1211 | + resource_size_t size, | |
| 1212 | + resource_size_t align); | |
| 1212 | 1213 | |
| 1213 | 1214 | /* Generic PCI functions used internally */ |
| 1214 | 1215 | |
| @@ -759,7 +759,8 @@ static int __find_resource_space(struct resource *root, struct resource *old, · 758 unmodified lines | ||
| 759 | 759 | alloc.flags = avail.flags; |
| 760 | 760 | if (alignf) { |
| 761 | 761 | alloc.start = alignf(constraint->alignf_data, |
| 762 | − &avail, size, constraint->align); | |
| 762 | + &avail, &tmp, | |
| 763 | + size, constraint->align); | |
| 763 | 764 | } else { |
| 764 | 765 | alloc.start = avail.start; |
| 765 | 766 | } |