• Hideo Saito's avatar
    sh: Fix PCI BAR address-space wraparound. · bb686609
    Hideo Saito authored
    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: default avatarHideo Saito <saito@densan.co.jp>
    Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
    bb686609
pci-auto.c 16.4 KB