mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 00:20:32 +00:00
ptp: mlx5: convert to .adjfine and adjust_by_scaled_ppm
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>
This commit is contained in:
parent
6ed795965e
commit
d8aad3f369
1 changed files with 6 additions and 16 deletions
|
@ -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));
|
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_clock *clock = container_of(ptp, struct mlx5_clock, ptp_info);
|
||||||
struct mlx5_timer *timer = &clock->timer;
|
struct mlx5_timer *timer = &clock->timer;
|
||||||
struct mlx5_core_dev *mdev;
|
struct mlx5_core_dev *mdev;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int neg_adj = 0;
|
u32 mult;
|
||||||
u32 diff;
|
|
||||||
u64 adj;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
mdev = container_of(clock, struct mlx5_core_dev, clock);
|
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)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (delta < 0) {
|
mult = (u32)adjust_by_scaled_ppm(timer->nominal_c_mult, scaled_ppm);
|
||||||
neg_adj = 1;
|
|
||||||
delta = -delta;
|
|
||||||
}
|
|
||||||
|
|
||||||
adj = timer->nominal_c_mult;
|
|
||||||
adj *= delta;
|
|
||||||
diff = div_u64(adj, 1000000000ULL);
|
|
||||||
|
|
||||||
write_seqlock_irqsave(&clock->lock, flags);
|
write_seqlock_irqsave(&clock->lock, flags);
|
||||||
timecounter_read(&timer->tc);
|
timecounter_read(&timer->tc);
|
||||||
timer->cycles.mult = neg_adj ? timer->nominal_c_mult - diff :
|
timer->cycles.mult = mult;
|
||||||
timer->nominal_c_mult + diff;
|
|
||||||
mlx5_update_clock_info_page(mdev);
|
mlx5_update_clock_info_page(mdev);
|
||||||
write_sequnlock_irqrestore(&clock->lock, flags);
|
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_per_out = 0,
|
||||||
.n_pins = 0,
|
.n_pins = 0,
|
||||||
.pps = 0,
|
.pps = 0,
|
||||||
.adjfreq = mlx5_ptp_adjfreq,
|
.adjfine = mlx5_ptp_adjfine,
|
||||||
.adjtime = mlx5_ptp_adjtime,
|
.adjtime = mlx5_ptp_adjtime,
|
||||||
.gettimex64 = mlx5_ptp_gettimex,
|
.gettimex64 = mlx5_ptp_gettimex,
|
||||||
.settime64 = mlx5_ptp_settime,
|
.settime64 = mlx5_ptp_settime,
|
||||||
|
|
Loading…
Reference in a new issue