提交 c7f4bbc9 编写于 作者: Y Yinghai Lu 提交者: Bjorn Helgaas

x86/PCI: Factor out pcibios_allocate_dev_resources()

Factor pcibios_allocate_dev_resources() out of
pcibios_allocate_resources().  Currently we only allocate these
resources at boot-time with a for_each_pci_dev() loop.  Eventually
we'll use pcibios_allocate_dev_resources() for hot-added devices, too.

[bhelgaas: changelog]
Signed-off-by: NYinghai Lu <yinghai@kernel.org>
Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
上级 f7ac356d
...@@ -232,9 +232,8 @@ struct pci_check_idx_range { ...@@ -232,9 +232,8 @@ struct pci_check_idx_range {
int end; int end;
}; };
static void __init pcibios_allocate_resources(int pass) static void __init pcibios_allocate_dev_resources(struct pci_dev *dev, int pass)
{ {
struct pci_dev *dev = NULL;
int idx, disabled, i; int idx, disabled, i;
u16 command; u16 command;
struct resource *r; struct resource *r;
...@@ -246,14 +245,13 @@ static void __init pcibios_allocate_resources(int pass) ...@@ -246,14 +245,13 @@ static void __init pcibios_allocate_resources(int pass)
#endif #endif
}; };
for_each_pci_dev(dev) { pci_read_config_word(dev, PCI_COMMAND, &command);
pci_read_config_word(dev, PCI_COMMAND, &command); for (i = 0; i < ARRAY_SIZE(idx_range); i++)
for (i = 0; i < ARRAY_SIZE(idx_range); i++)
for (idx = idx_range[i].start; idx <= idx_range[i].end; idx++) { for (idx = idx_range[i].start; idx <= idx_range[i].end; idx++) {
r = &dev->resource[idx]; r = &dev->resource[idx];
if (r->parent) /* Already allocated */ if (r->parent) /* Already allocated */
continue; continue;
if (!r->start) /* Address not assigned at all */ if (!r->start) /* Address not assigned at all */
continue; continue;
if (r->flags & IORESOURCE_IO) if (r->flags & IORESOURCE_IO)
disabled = !(command & PCI_COMMAND_IO); disabled = !(command & PCI_COMMAND_IO);
...@@ -272,23 +270,29 @@ static void __init pcibios_allocate_resources(int pass) ...@@ -272,23 +270,29 @@ static void __init pcibios_allocate_resources(int pass)
} }
} }
} }
if (!pass) { if (!pass) {
r = &dev->resource[PCI_ROM_RESOURCE]; r = &dev->resource[PCI_ROM_RESOURCE];
if (r->flags & IORESOURCE_ROM_ENABLE) { if (r->flags & IORESOURCE_ROM_ENABLE) {
/* Turn the ROM off, leave the resource region, /* Turn the ROM off, leave the resource region,
* but keep it unregistered. */ * but keep it unregistered. */
u32 reg; u32 reg;
dev_dbg(&dev->dev, "disabling ROM %pR\n", r); dev_dbg(&dev->dev, "disabling ROM %pR\n", r);
r->flags &= ~IORESOURCE_ROM_ENABLE; r->flags &= ~IORESOURCE_ROM_ENABLE;
pci_read_config_dword(dev, pci_read_config_dword(dev, dev->rom_base_reg, &reg);
dev->rom_base_reg, &reg); pci_write_config_dword(dev, dev->rom_base_reg,
pci_write_config_dword(dev, dev->rom_base_reg,
reg & ~PCI_ROM_ADDRESS_ENABLE); reg & ~PCI_ROM_ADDRESS_ENABLE);
}
} }
} }
} }
static void __init pcibios_allocate_resources(int pass)
{
struct pci_dev *dev = NULL;
for_each_pci_dev(dev)
pcibios_allocate_dev_resources(dev, pass);
}
static int __init pcibios_assign_resources(void) static int __init pcibios_assign_resources(void)
{ {
struct pci_dev *dev = NULL; struct pci_dev *dev = NULL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册