• Jacob Keller's avatar
    i40e: use mul_u64_u64_div_u64 for PTP frequency calculation · 3626a690
    Jacob Keller authored
    The i40e device has a different clock rate depending on the current link
    speed. This requires using a different increment rate for the PTP clock
    registers. For slower link speeds, the base increment value is larger.
    Directly multiplying the larger increment value by the parts per billion
    adjustment might overflow.
    
    To avoid this, the i40e implementation defaults to using the lower
    increment value and then multiplying the adjustment afterwards. This causes
    a loss of precision for lower link speeds.
    
    We can fix this by using mul_u64_u64_div_u64 instead of performing the
    multiplications using standard C operations. On X86, this will use special
    instructions that perform the multiplication and division with 128bit
    intermediate values. For other architectures, the fallback implementation
    will limit the loss of precision for large values. Small adjustments don't
    overflow anyways and won't lose precision at all.
    
    This allows first multiplying the base increment value and then performing
    the adjustment calculation, since we no longer fear overflowing. It also
    makes it easier to convert to the even more precise .adjfine implementation
    in a following change.
    Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    3626a690
i40e_ptp.c 45.1 KB