提交 bb686609 编写于 作者: H Hideo Saito 提交者: Paul Mundt

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: NHideo Saito <saito@densan.co.jp>
Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
上级 be521466
...@@ -214,6 +214,12 @@ pciauto_setup_bars(struct pci_channel *hose, ...@@ -214,6 +214,12 @@ pciauto_setup_bars(struct pci_channel *hose,
continue; 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 #ifdef CONFIG_PCI_AUTO_UPDATE_RESOURCES
/* Write it out and update our limit */ /* Write it out and update our limit */
early_write_config_dword(hose, top_bus, current_bus, pci_devfn, early_write_config_dword(hose, top_bus, current_bus, pci_devfn,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册