__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 | resource_size_t | 126 | resource_size_t |
| 127 | pcibios_align_resource(void *data, const struct resource *res, | 127 | pcibios_align_resource(void *data, const struct resource *res, |
| 128 | const struct resource *empty_res, | ||
| 128 | resource_size_t size, resource_size_t align) | 129 | resource_size_t size, resource_size_t align) |
| 129 | { | 130 | { |
| 130 | struct pci_dev *dev = data; | 131 | struct pci_dev *dev = data; |
| @@ -560,7 +560,9 @@ char * __init pcibios_setup(char *str) · 559 unmodified lines | |||
| 560 | * which might be mirrored at 0x0100-0x03ff.. | 560 | * which might be mirrored at 0x0100-0x03ff.. |
| 561 | */ | 561 | */ |
| 562 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | 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 | struct pci_dev *dev = data; | 567 | struct pci_dev *dev = data; |
| 566 | resource_size_t start = res->start; | 568 | resource_size_t start = res->start; |
| @@ -27,7 +27,9 @@ · 26 unmodified lines | |||
| 27 | * which might be mirrored at 0x0100-0x03ff.. | 27 | * which might be mirrored at 0x0100-0x03ff.. |
| 28 | */ | 28 | */ |
| 29 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | 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 | resource_size_t start = res->start; | 34 | resource_size_t start = res->start; |
| 33 | 35 | ||
| @@ -22,7 +22,8 @@ · 21 unmodified lines | |||
| 22 | * which might have be mirrored at 0x0100-0x03ff.. | 22 | * which might have be mirrored at 0x0100-0x03ff.. |
| 23 | */ | 23 | */ |
| 24 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | 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 | struct pci_dev *dev = data; | 28 | struct pci_dev *dev = data; |
| 28 | resource_size_t start = res->start; | 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 | resource_size_t | 53 | resource_size_t |
| 54 | pcibios_align_resource(void *data, const struct resource *res, | 54 | pcibios_align_resource(void *data, const struct resource *res, |
| 55 | const struct resource *empty_res, | ||
| 55 | resource_size_t size, resource_size_t align) | 56 | resource_size_t size, resource_size_t align) |
| 56 | { | 57 | { |
| 57 | struct pci_dev *dev = data; | 58 | struct pci_dev *dev = data; |
| @@ -196,7 +196,9 @@ void __ref pcibios_init_bridge(struct pci_dev *dev) · 195 unmodified lines | |||
| 196 | * than res->start. | 196 | * than res->start. |
| 197 | */ | 197 | */ |
| 198 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | 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 | resource_size_t mask, align, start = res->start; | 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 | * which might have be mirrored at 0x0100-0x03ff.. | 1132 | * which might have be mirrored at 0x0100-0x03ff.. |
| 1133 | */ | 1133 | */ |
| 1134 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | 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 | struct pci_dev *dev = data; | 1139 | struct pci_dev *dev = data; |
| 1138 | resource_size_t start = res->start; | 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 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | 268 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, |
| 269 | const struct resource *empty_res, | ||
| 269 | resource_size_t size, | 270 | resource_size_t size, |
| 270 | resource_size_t align) | 271 | resource_size_t align) |
| 271 | { | 272 | { |
| @@ -168,7 +168,9 @@ subsys_initcall(pcibios_init); · 167 unmodified lines | |||
| 168 | * modulo 0x400. | 168 | * modulo 0x400. |
| 169 | */ | 169 | */ |
| 170 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | 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 | struct pci_dev *dev = data; | 175 | struct pci_dev *dev = data; |
| 174 | struct pci_channel *hose = dev->sysdata; | 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 | resource_size_t | 154 | resource_size_t |
| 155 | pcibios_align_resource(void *data, const struct resource *res, | 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 | struct pci_dev *dev = data; | 159 | struct pci_dev *dev = data; |
| 159 | resource_size_t start = res->start; | 160 | resource_size_t start = res->start; |
| @@ -39,6 +39,7 @@ · 38 unmodified lines | |||
| 39 | */ | 39 | */ |
| 40 | resource_size_t | 40 | resource_size_t |
| 41 | pcibios_align_resource(void *data, const struct resource *res, | 41 | pcibios_align_resource(void *data, const struct resource *res, |
| 42 | const struct resource *empty_res, | ||
| 42 | resource_size_t size, resource_size_t align) | 43 | resource_size_t size, resource_size_t align) |
| 43 | { | 44 | { |
| 44 | struct pci_dev *dev = data; | 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 | resource_size_t __weak pcibios_align_resource(void *data, | 252 | resource_size_t __weak pcibios_align_resource(void *data, |
| 253 | const struct resource *res, | 253 | const struct resource *res, |
| 254 | const struct resource *empty_res, | ||
| 254 | resource_size_t size, | 255 | resource_size_t size, |
| 255 | resource_size_t align) | 256 | resource_size_t align) |
| 256 | { | 257 | { |
| 257 | return res->start; | 258 | return res->start; |
| 258 | } | 259 | } |
| 259 | 260 | ||
| 260 | static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev, | 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 | static resource_size_t | 603 | static resource_size_t |
| 604 | pcmcia_align(void *align_data, const struct resource *res, | 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 | struct pcmcia_align_data *data = align_data; | 608 | struct pcmcia_align_data *data = align_data; |
| 608 | struct resource_map *m; | 609 | struct resource_map *m; |
| @@ -202,6 +202,7 @@ enum { · 201 unmodified lines | |||
| 202 | * typedef resource_alignf - Resource alignment callback | 202 | * typedef resource_alignf - Resource alignment callback |
| 203 | * @data: Private data used by the callback | 203 | * @data: Private data used by the callback |
| 204 | * @res: Resource candidate range (an empty resource space) | 204 | * @res: Resource candidate range (an empty resource space) |
| 205 | * @empty_res: Empty resource range without alignment applied | ||
| 205 | * @size: The minimum size of the empty space | 206 | * @size: The minimum size of the empty space |
| 206 | * @align: Alignment from the constraints | 207 | * @align: Alignment from the constraints |
| 207 | * | 208 | * |
| @@ -212,6 +213,7 @@ enum { · 4 unmodified lines | |||
| 212 | */ | 213 | */ |
| 213 | typedef resource_size_t (*resource_alignf)(void *data, | 214 | typedef resource_size_t (*resource_alignf)(void *data, |
| 214 | const struct resource *res, | 215 | const struct resource *res, |
| 216 | const struct resource *empty_res, | ||
| 215 | resource_size_t size, | 217 | resource_size_t size, |
| 216 | resource_size_t align); | 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 | char *pcibios_setup(char *str); | 1206 | char *pcibios_setup(char *str); |
| 1207 | 1207 | ||
| 1208 | /* Used only when drivers/pci/setup.c is used */ | 1208 | /* Used only when drivers/pci/setup.c is used */ |
| 1209 | resource_size_t pcibios_align_resource(void *, const struct resource *, | 1209 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, |
| 1210 | resource_size_t, | 1210 | const struct resource *empty_res, |
| 1211 | resource_size_t); | 1211 | resource_size_t size, |
| 1212 | resource_size_t align); | ||
| 1212 | 1213 | ||
| 1213 | /* Generic PCI functions used internally */ | 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 | alloc.flags = avail.flags; | 759 | alloc.flags = avail.flags; |
| 760 | if (alignf) { | 760 | if (alignf) { |
| 761 | alloc.start = alignf(constraint->alignf_data, | 761 | alloc.start = alignf(constraint->alignf_data, |
| 762 | &avail, size, constraint->align); | 762 | &avail, &tmp, |
| 763 | size, constraint->align); | ||
| 763 | } else { | 764 | } else { |
| 764 | alloc.start = avail.start; | 765 | alloc.start = avail.start; |
| 765 | } | 766 | } |