• Jacob Keller's avatar
    ice: add and use roundup_u64 instead of open coding equivalent · 1d4ce389
    Jacob Keller authored
    In ice_ptp_cfg_clkout(), the ice driver needs to calculate the nearest next
    second of a current time value specified in nanoseconds. It implements this
    using div64_u64, because the time value is a u64. It could use div_u64
    since NSEC_PER_SEC is smaller than 32-bits.
    
    Ideally this would be implemented directly with roundup(), but that can't
    work on all platforms due to a division which requires using the specific
    macros and functions due to platform restrictions, and to ensure that the
    most appropriate and fast instructions are used.
    
    The kernel doesn't currently provide any 64-bit equivalents for doing
    roundup. Attempting to use roundup() on a 32-bit platform will result in a
    link failure due to not having a direct 64-bit division.
    
    The closest equivalent for this is DIV64_U64_ROUND_UP, which does a
    division always rounding up. However, this only computes the division, and
    forces use of the div64_u64 in cases where the divisor is a 32bit value and
    could make use of div_u64.
    
    Introduce DIV_U64_ROUND_UP based on div_u64, and then use it to implement
    roundup_u64 which takes a u64 input value and a u32 rounding value.
    
    The name roundup_u64 matches the naming scheme of div_u64, and future
    patches could implement roundup64_u64 if they need to round by a multiple
    that is greater than 32-bits.
    
    Replace the logic in ice_ptp.c which does this equivalent with the newly
    added roundup_u64.
    Tested-by: default avatarPucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com>
    Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Link: https://lore.kernel.org/r/20240607-next-2024-06-03-intel-next-batch-v3-2-d1470cee3347@intel.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    1d4ce389
math64.h 9 KB