summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHideo Saito <saito@densan.co.jp>2007-03-12 14:50:49 +0900
committerPaul Mundt <lethal@linux-sh.org>2007-03-12 14:50:49 +0900
commitbb68660943fc0dc2a5fa634243f3c6b7fb715626 (patch)
tree726f8f7acc53670d54d28841321a81f4e57693ab
parentbe521466feb3bb1cd89de82a2b1d080e9ebd3cb6 (diff)
downloadblackbird-op-linux-bb68660943fc0dc2a5fa634243f3c6b7fb715626.tar.gz
blackbird-op-linux-bb68660943fc0dc2a5fa634243f3c6b7fb715626.zip
sh: Fix PCI BAR address-space wraparound.
When a SH7751R system includes a card that has wide range space like a graphics card, the pci-pci bridge controller can't set the correct address range. For example, when *lower_limit is 0xfd000000 and bar_size is 0x4000000, in the following code at arch/sh/drivers/pci/pci-auto.c, 0x0 is set in bar_value. pciauto_setup_bars() { ... bar_value = ((*lower_limit - 1) & ~(bar_size - 1)) + bar_size; ... *lower_limit = bar_value + bar_size; } As a result, 0x4000000 is set in *lower_limit, but this value is wrong. The following patch avoids this problem by checking the range of the value and refusing to update the BAR if the calculated value ends up being bogus. Signed-off-by: Hideo Saito <saito@densan.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
-rw-r--r--arch/sh/drivers/pci/pci-auto.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/sh/drivers/pci/pci-auto.c b/arch/sh/drivers/pci/pci-auto.c
index ecf16344f94a..224e007736fb 100644
--- a/arch/sh/drivers/pci/pci-auto.c
+++ b/arch/sh/drivers/pci/pci-auto.c
@@ -214,6 +214,12 @@ retry:
continue;
}
+ if (bar_value < *lower_limit || (bar_value + bar_size) >= *upper_limit) {
+ DBG(" unavailable -- skipping, value %x size %x\n",
+ bar_value, bar_size);
+ continue;
+ }
+
#ifdef CONFIG_PCI_AUTO_UPDATE_RESOURCES
/* Write it out and update our limit */
early_write_config_dword(hose, top_bus, current_bus, pci_devfn,
OpenPOWER on IntegriCloud