• M
    drm/radeon: fix combios tables on older cards · cef1d00c
    Mark Kettenis 提交于
    Noticed that my old Radeon 7500 hung after printing
    
       drm: GPU not posted. posting now...
    
    when it wasn't selected as the primary card the BIOS.  Some digging
    revealed that it was hanging in combios_parse_mmio_table() while
    parsing the ASIC INIT 3 table.  Looking at the BIOS ROM for the card,
    it becomes obvious that there is no ASIC INIT 3 table in the BIOS.
    The code is just processing random garbage.  No surprise it hangs!
    
    Why do I say that there is no ASIC INIT 3 table is the BIOS?  This
    table is found through the MISC INFO table.  The MISC INFO table can
    be found at offset 0x5e in the COMBIOS header.  But the header is
    smaller than that.  The COMBIOS header starts at offset 0x126.  The
    standard PCI Data Structure (the bit that starts with 'PCIR') lives at
    offset 0x180.  That means that the COMBIOS header can not be larger
    than 0x5a bytes and therefore cannot contain a MISC INFO table.
    
    I looked at a dozen or so BIOS images, some my own, some downloaded from:
    
        <http://www.techpowerup.com/vgabios/index.php?manufacturer=ATI&page=1>
    
    It is fairly obvious that the size of the COMBIOS header can be found
    at offset 0x6 of the header.  Not sure if it is a 16-bit number or
    just an 8-bit number, but that doesn't really matter since the tables
    seems to be always smaller than 256 bytes.
    
    So I think combios_get_table_offset() should check if the requested
    table is present.  This can be done by checking the offset against the
    size of the header.  See the diff below.  The diff is against the WIP
    OpenBSD codebase that roughly corresponds to Linux 3.8.13 at this
    point.  But I don't think this bit of the code changed much since
    then.
    
    For what it is worth:
    Signed-off-by: NMark Kettenis <kettenis@openbsd.org>
    Signed-off-by: NAlex Deucher <alexander.deucher@amd.com>
    Cc: stable@vger.kernel.org
    cef1d00c
radeon_combios.c 102.1 KB