ptp: mlx5: convert to .adjfine and adjust_by_scaled_ppm
authorJacob Keller <jacob.e.keller@intel.com>
Fri, 28 Oct 2022 11:04:16 +0000 (04:04 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 31 Oct 2022 11:14:16 +0000 (11:14 +0000)
The mlx5 implementation of .adjfreq is implemented in terms of a
straight forward "base * ppb / 1 billion" calculation.

Convert this to the .adjfine interface and use adjust_by_scaled_ppm for the
calculation  of the new mult value.

Note that the mlx5_ptp_adjfreq_real_time function expects input in terms of
ppb, so use the scaled_ppm_to_ppb to convert before passing to this
function.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Shirly Ohnona <shirlyo@nvidia.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Cc: Gal Pressman <gal@nvidia.com>
Cc: Saeed Mahameed <saeedm@nvidia.com>
Cc: Leon Romanovsky <leon@kernel.org>
Cc: Aya Levin <ayal@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c

index d3a9ae8..69cfe60 100644 (file)
@@ -339,35 +339,25 @@ static int mlx5_ptp_adjfreq_real_time(struct mlx5_core_dev *mdev, s32 freq)
        return mlx5_set_mtutc(mdev, in, sizeof(in));
 }
 
-static int mlx5_ptp_adjfreq(struct ptp_clock_info *ptp, s32 delta)
+static int mlx5_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
 {
        struct mlx5_clock *clock = container_of(ptp, struct mlx5_clock, ptp_info);
        struct mlx5_timer *timer = &clock->timer;
        struct mlx5_core_dev *mdev;
        unsigned long flags;
-       int neg_adj = 0;
-       u32 diff;
-       u64 adj;
+       u32 mult;
        int err;
 
        mdev = container_of(clock, struct mlx5_core_dev, clock);
-       err = mlx5_ptp_adjfreq_real_time(mdev, delta);
+       err = mlx5_ptp_adjfreq_real_time(mdev, scaled_ppm_to_ppb(scaled_ppm));
        if (err)
                return err;
 
-       if (delta < 0) {
-               neg_adj = 1;
-               delta = -delta;
-       }
-
-       adj = timer->nominal_c_mult;
-       adj *= delta;
-       diff = div_u64(adj, 1000000000ULL);
+       mult = (u32)adjust_by_scaled_ppm(timer->nominal_c_mult, scaled_ppm);
 
        write_seqlock_irqsave(&clock->lock, flags);
        timecounter_read(&timer->tc);
-       timer->cycles.mult = neg_adj ? timer->nominal_c_mult - diff :
-                                      timer->nominal_c_mult + diff;
+       timer->cycles.mult = mult;
        mlx5_update_clock_info_page(mdev);
        write_sequnlock_irqrestore(&clock->lock, flags);
 
@@ -697,7 +687,7 @@ static const struct ptp_clock_info mlx5_ptp_clock_info = {
        .n_per_out      = 0,
        .n_pins         = 0,
        .pps            = 0,
-       .adjfreq        = mlx5_ptp_adjfreq,
+       .adjfine        = mlx5_ptp_adjfine,
        .adjtime        = mlx5_ptp_adjtime,
        .gettimex64     = mlx5_ptp_gettimex,
        .settime64      = mlx5_ptp_settime,