• Ville Syrjälä's avatar
    drm/dp: Adjust i2c-over-aux retry count based on message size and i2c bus speed · 4efa83c8
    Ville Syrjälä authored
    Calculate the number of retries we should do for each i2c-over-aux
    message based on the time it takes to perform the i2c transfer vs. the
    aux transfer. We assume the shortest possible length for the aux
    transfer, and the longest possible (exluding clock stretching) for the
    i2c transfer.
    
    The DP spec has some examples on how to calculate this, but we don't
    calculate things quite the same way. The spec doesn't account for the
    retry interval (assumes immediate retry on defer), and doesn't assume
    the best/worst case behaviour as we do.
    
    Note that currently we assume 10 kHz speed for the i2c bus. Some real
    world devices (eg. some Apple DP->VGA dongle) fails with less than 16
    retries. and that would correspond to something close to 15 kHz (with
    our method of calculating things) But let's just go for 10 kHz to be
    on the safe side. Ideally we should query/set the i2c bus speed via
    DPCD but for now this should at leaast remove the regression from the
    1->16 byte trasnfer size change. And of course if the sink completes
    the transfer quicker this shouldn't slow things down since we don't
    change the interval between retries.
    
    I did a few experiments with a DP->DVI dongle I have that allows you
    to change the i2c bus speed. Here are the results of me changing the
    actual bus speed and the assumed bus speed and seeing when we start
    to fail the operation:
    
    actual i2c khz          assumed i2c khz         max retries
    1                       1 ok -> 2 fail          211 ok -> 106 fail
    5                       8 ok -> 9 fail          27 ok -> 24 fail
    10                      17 ok -> 18 fail        13 ok -> 12 fail
    100                     210 ok -> 211 fail      2 ok -> 1 fail
    
    So based on that we have a fairly decent safety margin baked into
    the formula to calculate the max number of retries.
    
    Fixes a regression with some DP dongles from:
    commit 1d002fa7
    Author: Simon Farnsworth <simon.farnsworth@onelan.co.uk>
    Date:   Tue Feb 10 18:38:08 2015 +0000
    
        drm/dp: Use large transactions for I2C over AUX
    
    v2: Use best case for AUX and worst case for i2c (Simon Farnsworth)
        Add a define our AUX retry interval and account for it
    v3: Make everything usecs to avoid confusion about units (Daniel)
        Add a comment reminding people about the AUX bitrate (Daniel)
        Use DIV_ROUND_UP() since we're after the "worst" case for i2c
    
    Cc: Simon Farnsworth <simon.farnsworth@onelan.com>
    Cc: moosotc@gmail.com
    Tested-by: moosotc@gmail.com
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91451Reviewed-by: default avatarSimon Farnsworth <simon.farnsworth@onelan.com>
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
    4efa83c8
drm_dp_helper.c 20.7 KB