mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
resource: Pass full extent of empty space to resource_alignf callback
__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. Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Tested-by: Xifer <xiferdev@gmail.com> Link: https://patch.msgid.link/20260324165633.4583-3-ilpo.jarvinen@linux.intel.com
This commit is contained in:
committed by
Bjorn Helgaas
parent
edfaa81d5d
commit
f699bcc8bc
@@ -125,6 +125,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final);
|
||||
|
||||
resource_size_t
|
||||
pcibios_align_resource(void *data, const struct resource *res,
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
struct pci_dev *dev = data;
|
||||
|
||||
@@ -560,7 +560,9 @@ char * __init pcibios_setup(char *str)
|
||||
* which might be mirrored at 0x0100-0x03ff..
|
||||
*/
|
||||
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size,
|
||||
resource_size_t align)
|
||||
{
|
||||
struct pci_dev *dev = data;
|
||||
resource_size_t start = res->start;
|
||||
|
||||
@@ -27,7 +27,9 @@
|
||||
* which might be mirrored at 0x0100-0x03ff..
|
||||
*/
|
||||
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size,
|
||||
resource_size_t align)
|
||||
{
|
||||
resource_size_t start = res->start;
|
||||
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
* which might have be mirrored at 0x0100-0x03ff..
|
||||
*/
|
||||
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
struct pci_dev *dev = data;
|
||||
resource_size_t start = res->start;
|
||||
|
||||
@@ -52,6 +52,7 @@ unsigned long pci_address_to_pio(phys_addr_t address)
|
||||
*/
|
||||
resource_size_t
|
||||
pcibios_align_resource(void *data, const struct resource *res,
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
struct pci_dev *dev = data;
|
||||
|
||||
@@ -196,7 +196,9 @@ void __ref pcibios_init_bridge(struct pci_dev *dev)
|
||||
* than res->start.
|
||||
*/
|
||||
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t alignment)
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size,
|
||||
resource_size_t alignment)
|
||||
{
|
||||
resource_size_t mask, align, start = res->start;
|
||||
|
||||
|
||||
@@ -1132,7 +1132,9 @@ static int skip_isa_ioresource_align(struct pci_dev *dev)
|
||||
* which might have be mirrored at 0x0100-0x03ff..
|
||||
*/
|
||||
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size,
|
||||
resource_size_t align)
|
||||
{
|
||||
struct pci_dev *dev = data;
|
||||
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)
|
||||
}
|
||||
|
||||
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size,
|
||||
resource_size_t align)
|
||||
{
|
||||
|
||||
@@ -168,7 +168,9 @@ subsys_initcall(pcibios_init);
|
||||
* modulo 0x400.
|
||||
*/
|
||||
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size,
|
||||
resource_size_t align)
|
||||
{
|
||||
struct pci_dev *dev = data;
|
||||
struct pci_channel *hose = dev->sysdata;
|
||||
|
||||
@@ -153,7 +153,8 @@ skip_isa_ioresource_align(struct pci_dev *dev) {
|
||||
*/
|
||||
resource_size_t
|
||||
pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
struct pci_dev *dev = data;
|
||||
resource_size_t start = res->start;
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
*/
|
||||
resource_size_t
|
||||
pcibios_align_resource(void *data, const struct resource *res,
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
struct pci_dev *dev = data;
|
||||
|
||||
@@ -251,10 +251,11 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev,
|
||||
*/
|
||||
resource_size_t __weak pcibios_align_resource(void *data,
|
||||
const struct resource *res,
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size,
|
||||
resource_size_t align)
|
||||
{
|
||||
return res->start;
|
||||
return res->start;
|
||||
}
|
||||
|
||||
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,
|
||||
|
||||
static resource_size_t
|
||||
pcmcia_align(void *align_data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
struct pcmcia_align_data *data = align_data;
|
||||
struct resource_map *m;
|
||||
|
||||
@@ -202,6 +202,7 @@ enum {
|
||||
* typedef resource_alignf - Resource alignment callback
|
||||
* @data: Private data used by the callback
|
||||
* @res: Resource candidate range (an empty resource space)
|
||||
* @empty_res: Empty resource range without alignment applied
|
||||
* @size: The minimum size of the empty space
|
||||
* @align: Alignment from the constraints
|
||||
*
|
||||
@@ -212,6 +213,7 @@ enum {
|
||||
*/
|
||||
typedef resource_size_t (*resource_alignf)(void *data,
|
||||
const struct resource *res,
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size,
|
||||
resource_size_t align);
|
||||
|
||||
|
||||
@@ -1206,9 +1206,10 @@ int __must_check pcibios_enable_device(struct pci_dev *, int mask);
|
||||
char *pcibios_setup(char *str);
|
||||
|
||||
/* Used only when drivers/pci/setup.c is used */
|
||||
resource_size_t pcibios_align_resource(void *, const struct resource *,
|
||||
resource_size_t,
|
||||
resource_size_t);
|
||||
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
const struct resource *empty_res,
|
||||
resource_size_t size,
|
||||
resource_size_t align);
|
||||
|
||||
/* Generic PCI functions used internally */
|
||||
|
||||
|
||||
@@ -759,7 +759,8 @@ static int __find_resource_space(struct resource *root, struct resource *old,
|
||||
alloc.flags = avail.flags;
|
||||
if (alignf) {
|
||||
alloc.start = alignf(constraint->alignf_data,
|
||||
&avail, size, constraint->align);
|
||||
&avail, &tmp,
|
||||
size, constraint->align);
|
||||
} else {
|
||||
alloc.start = avail.start;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user