All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: Tony Nguyen <anthony.l.nguyen@intel.com>
Cc: davem@davemloft.net, Jacob Keller <jacob.e.keller@intel.com>,
	netdev@vger.kernel.org, sassmann@redhat.com,
	richardcochran@gmail.com,
	Tony Brelinski <tonyx.brelinski@intel.com>
Subject: Re: [PATCH net-next 5/8] ice: register 1588 PTP clock device object for E810 devices
Date: Fri, 11 Jun 2021 14:18:00 -0700	[thread overview]
Message-ID: <20210611141800.5ebe1d4e@kicinski-fedora-pc1c0hjn.dhcp.thefacebook.com> (raw)
In-Reply-To: <20210611162000.2438023-6-anthony.l.nguyen@intel.com>

On Fri, 11 Jun 2021 09:19:57 -0700 Tony Nguyen wrote:
> +static u64
> +ice_ptp_read_src_clk_reg(struct ice_pf *pf, struct ptp_system_timestamp *sts)
> +{
> +	struct ice_hw *hw = &pf->hw;
> +	u32 hi, lo, lo2;
> +	u8 tmr_idx;
> +
> +	tmr_idx = ice_get_ptp_src_clock_index(hw);
> +	/* Read the system timestamp pre PHC read */
> +	if (sts)
> +		ptp_read_system_prets(sts);
> +
> +	lo = rd32(hw, GLTSYN_TIME_L(tmr_idx));
> +
> +	/* Read the system timestamp post PHC read */
> +	if (sts)
> +		ptp_read_system_postts(sts);
> +
> +	hi = rd32(hw, GLTSYN_TIME_H(tmr_idx));
> +	lo2 = rd32(hw, GLTSYN_TIME_L(tmr_idx));
> +
> +	if (lo2 < lo) {
> +		/* if TIME_L rolled over read TIME_L again and update
> +		 * system timestamps
> +		 */
> +		if (sts)
> +			ptp_read_system_prets(sts);
> +		lo = rd32(hw, GLTSYN_TIME_L(tmr_idx));
> +		if (sts)
> +			ptp_read_system_postts(sts);

ptp_read_system* helpers already check for NULL sts.


> +static int ice_ptp_adjfine(struct ptp_clock_info *info, long scaled_ppm)
> +{
> +	struct ice_pf *pf = ptp_info_to_pf(info);
> +	u64 freq, divisor = 1000000ULL;
> +	struct ice_hw *hw = &pf->hw;
> +	s64 incval, diff;
> +	int neg_adj = 0;
> +	int err;
> +
> +	incval = ICE_PTP_NOMINAL_INCVAL_E810;
> +
> +	if (scaled_ppm < 0) {
> +		neg_adj = 1;
> +		scaled_ppm = -scaled_ppm;
> +	}
> +
> +	while ((u64)scaled_ppm > div_u64(U64_MAX, incval)) {
> +		/* handle overflow by scaling down the scaled_ppm and
> +		 * the divisor, losing some precision
> +		 */
> +		scaled_ppm >>= 2;
> +		divisor >>= 2;
> +	}

I have a question regarding ppm overflows.

We have the max_adj field in struct ptp_clock_info which is checked
against ppb, but ppb is a signed 32 bit and scaled_ppm is a long,
meaning values larger than S32_MAX << 16 / 1000 will overflow 
the ppb calculation, and therefore the check.

Are we okay with that? Is my math off? Did I miss some part 
of the kernel which filters crazy high scaled_ppm/freq?

Since dialed_freq is updated regardless of return value of .adjfine 
the driver has no clear way to reject bad scaled_ppm.

> +	freq = (incval * (u64)scaled_ppm) >> 16;
> +	diff = div_u64(freq, divisor);

  reply	other threads:[~2021-06-11 21:19 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-11 16:19 [PATCH net-next 0/8][pull request] 100GbE Intel Wired LAN Driver Updates 2021-06-11 Tony Nguyen
2021-06-11 16:19 ` [PATCH net-next 1/8] ice: add support for sideband messages Tony Nguyen
2021-06-11 16:19 ` [PATCH net-next 2/8] ice: process 1588 PTP capabilities during initialization Tony Nguyen
2021-06-11 16:19 ` [PATCH net-next 3/8] ice: add support for set/get of driver-stored firmware parameters Tony Nguyen
2021-06-11 16:19 ` [PATCH net-next 4/8] ice: add low level PTP clock access functions Tony Nguyen
2021-06-11 16:19 ` [PATCH net-next 5/8] ice: register 1588 PTP clock device object for E810 devices Tony Nguyen
2021-06-11 21:18   ` Jakub Kicinski [this message]
2021-06-14 16:43     ` Jacob Keller
2021-06-14 18:08       ` Jakub Kicinski
2021-06-14 19:50         ` Keller, Jacob E
2021-06-14 20:48           ` Jakub Kicinski
2021-06-14 20:51             ` Jacob Keller
2021-06-14 22:25               ` Jakub Kicinski
2021-06-14 18:12       ` Richard Cochran
2021-06-14 18:50         ` Jakub Kicinski
2021-06-14 19:48           ` Keller, Jacob E
2021-06-15  5:08           ` Richard Cochran
2021-06-11 16:19 ` [PATCH net-next 6/8] ice: report the PTP clock index in ethtool .get_ts_info Tony Nguyen
2021-06-11 16:19 ` [PATCH net-next 7/8] ice: enable receive hardware timestamping Tony Nguyen
2021-06-11 16:20 ` [PATCH net-next 8/8] ice: enable transmit timestamps for E810 devices Tony Nguyen
2021-06-11 21:00 ` [PATCH net-next 0/8][pull request] 100GbE Intel Wired LAN Driver Updates 2021-06-11 patchwork-bot+netdevbpf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210611141800.5ebe1d4e@kicinski-fedora-pc1c0hjn.dhcp.thefacebook.com \
    --to=kuba@kernel.org \
    --cc=anthony.l.nguyen@intel.com \
    --cc=davem@davemloft.net \
    --cc=jacob.e.keller@intel.com \
    --cc=netdev@vger.kernel.org \
    --cc=richardcochran@gmail.com \
    --cc=sassmann@redhat.com \
    --cc=tonyx.brelinski@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.