• Ilija Hadzic's avatar
    drm/radeon/kms/blit: fix blit copy for very large buffers · 52b53a0b
    Ilija Hadzic authored
    Evergreen and NI blit copy was broken if the buffer maps to a rectangle
    whose one dimension is 16384 (max dimension allowed by these chips).
    In the mainline kernel, the problem is exposed only when buffers are
    very large (1G), but it's still a problem. The problem could be exposed
    for smaller buffers if anyone modifies the algorithm for rectangle
    construction in r600_blit_create_rect() (the reason why someone would
    modify that algorithm is to tune the performance of buffer moves).
    
    The root cause was in i2f() function which only operated on range between
    0 and 16383. Fix this by extending the range of i2f() function to 0 to
    32767.
    
    While at it improve the function so that the range can be easily
    extended in the future (if it becomes necessary), cleanup lines
    over 80 characters, and replace in-line comments with one strategic
    comment that explains the crux of the function.
    
    Credits to michel@daenzer.net for pointing out the root cause of
    the bug.
    
    v2: Fix I2F_MAX_INPUT constant definition goof and warn only once
        if input argument is out of range. Edit the comment a little
        bit to avoid some linguistic confusion and make it look better
        in general.
    Signed-off-by: default avatarIlija Hadzic <ihadzic@research.bell-labs.com>
    Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    Reviewed-by: default avatarMichel Dänzer <michel@daenzer.net>
    Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
    52b53a0b
r600_blit_kms.c 24.1 KB