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: Yinghai Lu <yinghai@kernel.org> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
Родитель
f7ac356dc3
Коммит
c7f4bbc92f
|
@ -232,9 +232,8 @@ struct pci_check_idx_range {
|
|||
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;
|
||||
u16 command;
|
||||
struct resource *r;
|
||||
|
@ -246,14 +245,13 @@ static void __init pcibios_allocate_resources(int pass)
|
|||
#endif
|
||||
};
|
||||
|
||||
for_each_pci_dev(dev) {
|
||||
pci_read_config_word(dev, PCI_COMMAND, &command);
|
||||
for (i = 0; i < ARRAY_SIZE(idx_range); i++)
|
||||
pci_read_config_word(dev, PCI_COMMAND, &command);
|
||||
for (i = 0; i < ARRAY_SIZE(idx_range); i++)
|
||||
for (idx = idx_range[i].start; idx <= idx_range[i].end; idx++) {
|
||||
r = &dev->resource[idx];
|
||||
if (r->parent) /* Already allocated */
|
||||
if (r->parent) /* Already allocated */
|
||||
continue;
|
||||
if (!r->start) /* Address not assigned at all */
|
||||
if (!r->start) /* Address not assigned at all */
|
||||
continue;
|
||||
if (r->flags & IORESOURCE_IO)
|
||||
disabled = !(command & PCI_COMMAND_IO);
|
||||
|
@ -272,23 +270,29 @@ static void __init pcibios_allocate_resources(int pass)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (!pass) {
|
||||
r = &dev->resource[PCI_ROM_RESOURCE];
|
||||
if (r->flags & IORESOURCE_ROM_ENABLE) {
|
||||
/* Turn the ROM off, leave the resource region,
|
||||
* but keep it unregistered. */
|
||||
u32 reg;
|
||||
dev_dbg(&dev->dev, "disabling ROM %pR\n", r);
|
||||
r->flags &= ~IORESOURCE_ROM_ENABLE;
|
||||
pci_read_config_dword(dev,
|
||||
dev->rom_base_reg, ®);
|
||||
pci_write_config_dword(dev, dev->rom_base_reg,
|
||||
if (!pass) {
|
||||
r = &dev->resource[PCI_ROM_RESOURCE];
|
||||
if (r->flags & IORESOURCE_ROM_ENABLE) {
|
||||
/* Turn the ROM off, leave the resource region,
|
||||
* but keep it unregistered. */
|
||||
u32 reg;
|
||||
dev_dbg(&dev->dev, "disabling ROM %pR\n", r);
|
||||
r->flags &= ~IORESOURCE_ROM_ENABLE;
|
||||
pci_read_config_dword(dev, dev->rom_base_reg, ®);
|
||||
pci_write_config_dword(dev, dev->rom_base_reg,
|
||||
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)
|
||||
{
|
||||
struct pci_dev *dev = NULL;
|
||||
|
|
Загрузка…
Ссылка в новой задаче