|
@@ -236,6 +236,24 @@ static const struct ptp_clock_info mlx4_en_ptp_clock_info = {
|
|
|
.enable = mlx4_en_phc_enable,
|
|
|
};
|
|
|
|
|
|
+#define MLX4_EN_WRAP_AROUND_SEC 10ULL
|
|
|
+
|
|
|
+/* This function calculates the max shift that enables the user range
|
|
|
+ * of MLX4_EN_WRAP_AROUND_SEC values in the cycles register.
|
|
|
+ */
|
|
|
+static u32 freq_to_shift(u16 freq)
|
|
|
+{
|
|
|
+ u32 freq_khz = freq * 1000;
|
|
|
+ u64 max_val_cycles = freq_khz * 1000 * MLX4_EN_WRAP_AROUND_SEC;
|
|
|
+ u64 max_val_cycles_rounded = is_power_of_2(max_val_cycles + 1) ?
|
|
|
+ max_val_cycles : roundup_pow_of_two(max_val_cycles) - 1;
|
|
|
+ /* calculate max possible multiplier in order to fit in 64bit */
|
|
|
+ u64 max_mul = div_u64(0xffffffffffffffffULL, max_val_cycles_rounded);
|
|
|
+
|
|
|
+ /* This comes from the reverse of clocksource_khz2mult */
|
|
|
+ return ilog2(div_u64(max_mul * freq_khz, 1000000));
|
|
|
+}
|
|
|
+
|
|
|
void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev)
|
|
|
{
|
|
|
struct mlx4_dev *dev = mdev->dev;
|
|
@@ -254,12 +272,7 @@ void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev)
|
|
|
memset(&mdev->cycles, 0, sizeof(mdev->cycles));
|
|
|
mdev->cycles.read = mlx4_en_read_clock;
|
|
|
mdev->cycles.mask = CLOCKSOURCE_MASK(48);
|
|
|
- /* Using shift to make calculation more accurate. Since current HW
|
|
|
- * clock frequency is 427 MHz, and cycles are given using a 48 bits
|
|
|
- * register, the biggest shift when calculating using u64, is 14
|
|
|
- * (max_cycles * multiplier < 2^64)
|
|
|
- */
|
|
|
- mdev->cycles.shift = 14;
|
|
|
+ mdev->cycles.shift = freq_to_shift(dev->caps.hca_core_clock);
|
|
|
mdev->cycles.mult =
|
|
|
clocksource_khz2mult(1000 * dev->caps.hca_core_clock, mdev->cycles.shift);
|
|
|
mdev->nominal_c_mult = mdev->cycles.mult;
|