[PATCH] Fix restore of 64-bit PCI BAR's
For 64-bit BAR[i] only pci_dev->resource[i] is valid, ->resource[i+1] slot is unused and contains zeroes in all fields. So when we update a PCI BAR, all we need is just to check that we're going to update a _valid_ resource. Also make sure to write high bits - use "x >> 16 >> 16" (rather than the simpler ">> 32") to avoid warnings on 32-bit architectures where we're not going to have any high bits. Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Родитель
0d317fb72f
Коммит
cf7bee5a0b
|
@ -33,6 +33,11 @@ pci_update_resource(struct pci_dev *dev, struct resource *res, int resno)
|
|||
u32 new, check, mask;
|
||||
int reg;
|
||||
|
||||
/* Ignore resources for unimplemented BARs and unused resource slots
|
||||
for 64 bit BARs. */
|
||||
if (!res->flags)
|
||||
return;
|
||||
|
||||
pcibios_resource_to_bus(dev, ®ion, res);
|
||||
|
||||
pr_debug(" got res [%lx:%lx] bus [%lx:%lx] flags %lx for "
|
||||
|
@ -67,7 +72,7 @@ pci_update_resource(struct pci_dev *dev, struct resource *res, int resno)
|
|||
|
||||
if ((new & (PCI_BASE_ADDRESS_SPACE|PCI_BASE_ADDRESS_MEM_TYPE_MASK)) ==
|
||||
(PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64)) {
|
||||
new = 0; /* currently everyone zeros the high address */
|
||||
new = region.start >> 16 >> 16;
|
||||
pci_write_config_dword(dev, reg + 4, new);
|
||||
pci_read_config_dword(dev, reg + 4, &check);
|
||||
if (check != new) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче