netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: lakshmi.sowjanya.d@intel.com
Cc: tglx@linutronix.de, jstultz@google.com, giometti@enneenne.com,
	corbet@lwn.net, linux-kernel@vger.kernel.org, x86@kernel.org,
	netdev@vger.kernel.org, linux-doc@vger.kernel.org,
	intel-wired-lan@lists.osuosl.org, eddie.dong@intel.com,
	christopher.s.hall@intel.com, jesse.brandeburg@intel.com,
	davem@davemloft.net, alexandre.torgue@foss.st.com,
	joabreu@synopsys.com, mcoquelin.stm32@gmail.com, perex@perex.cz,
	linux-sound@vger.kernel.org, anthony.l.nguyen@intel.com,
	peter.hilber@opensynergy.com, pandith.n@intel.com,
	subramanian.mohan@intel.com, thejesh.reddy.t.r@intel.com
Subject: Re: [PATCH v8 10/12] pps: generators: Add PPS Generator TIO Driver
Date: Mon, 13 May 2024 14:18:48 +0300	[thread overview]
Message-ID: <ZkH3GP2b9WTz9W3W@smile.fi.intel.com> (raw)
In-Reply-To: <20240513103813.5666-11-lakshmi.sowjanya.d@intel.com>

On Mon, May 13, 2024 at 04:08:11PM +0530, lakshmi.sowjanya.d@intel.com wrote:
> From: Lakshmi Sowjanya D <lakshmi.sowjanya.d@intel.com>
> 
> The Intel Timed IO PPS generator driver outputs a PPS signal using
> dedicated hardware that is more accurate than software actuated PPS.
> The Timed IO hardware generates output events using the ART timer.
> The ART timer period varies based on platform type, but is less than 100
> nanoseconds for all current platforms. Timed IO output accuracy is
> within 1 ART period.
> 
> PPS output is enabled by writing '1' the 'enable' sysfs attribute. The
> driver uses hrtimers to schedule a wake-up 10 ms before each event
> (edge) target time. At wakeup, the driver converts the target time in
> terms of CLOCK_REALTIME to ART trigger time and writes this to the Timed
> IO hardware. The Timed IO hardware generates an event precisely at the
> requested system time without software involvement.

...

> +static ssize_t enable_store(struct device *dev, struct device_attribute *attr, const char *buf,
> +			    size_t count)
> +{
> +	struct pps_tio *tio = dev_get_drvdata(dev);
> +	bool enable;
> +	int err;

(1)

> +	err = kstrtobool(buf, &enable);
> +	if (err)
> +		return err;
> +
> +	guard(spinlock_irqsave)(&tio->lock);
> +	if (enable && !tio->enabled) {

> +		if (!timekeeping_clocksource_has_base(CSID_X86_ART)) {
> +			dev_err(tio->dev, "PPS cannot be started as clock is not related to ART");

Why not simply dev_err(dev, ...)?

> +			return -EPERM;
> +		}

I'm wondering if we can move this check to (1) above.
Because currently it's a good question if we are able to stop PPS which was run
by somebody else without this check done.

I.o.w. this sounds too weird to me and reading the code doesn't give any hint
if it's even possible. And if it is, are we supposed to touch that since it was
definitely *not* us who ran it.

> +		pps_tio_direction_output(tio);
> +		hrtimer_start(&tio->timer, first_event(tio), HRTIMER_MODE_ABS);
> +		tio->enabled = true;
> +	} else if (!enable && tio->enabled) {
> +		hrtimer_cancel(&tio->timer);
> +		pps_tio_disable(tio);
> +		tio->enabled = false;
> +	}
> +	return count;
> +}

...

> +static int pps_tio_probe(struct platform_device *pdev)
> +{

	struct device *dev = &pdev->dev;

> +	struct pps_tio *tio;
> +
> +	if (!(cpu_feature_enabled(X86_FEATURE_TSC_KNOWN_FREQ) &&
> +	      cpu_feature_enabled(X86_FEATURE_ART))) {
> +		dev_warn(&pdev->dev, "TSC/ART is not enabled");

		dev_warn(dev, "TSC/ART is not enabled");

> +		return -ENODEV;
> +	}
> +
> +	tio = devm_kzalloc(&pdev->dev, sizeof(*tio), GFP_KERNEL);

	tio = devm_kzalloc(dev, sizeof(*tio), GFP_KERNEL);


> +	if (!tio)
> +		return -ENOMEM;
> +
> +	tio->dev = &pdev->dev;

	tio->dev = dev;

> +	tio->base = devm_platform_ioremap_resource(pdev, 0);
> +	if (IS_ERR(tio->base))
> +		return PTR_ERR(tio->base);

> +	pps_tio_disable(tio);

This...

> +	hrtimer_init(&tio->timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
> +	tio->timer.function = hrtimer_callback;
> +	spin_lock_init(&tio->lock);

> +	tio->enabled = false;

...and this should go together, which makes me look at the enabled flag over
the code and it seems there are a few places where you missed to sync it with
the reality.

I would think of something like this:

	pps_tio_direction_output() ==> true
	pps_tio_disable(tio) ==> false

where "==> X" means assignment of enabled flag.

And perhaps this:

	tio->enabled = pps_generate_next_pulse(tio, expires + SAFE_TIME_NS);
	if (!tio->enabled)
		...

But the above is just thinking out loudly, you may find the better approach(es).

> +	platform_set_drvdata(pdev, tio);
> +
> +	return 0;
> +}

-- 
With Best Regards,
Andy Shevchenko



  reply	other threads:[~2024-05-13 11:18 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-13 10:38 [PATCH v8 00/12] Add support for Intel PPS Generator lakshmi.sowjanya.d
2024-05-13 10:38 ` [PATCH v8 01/12] timekeeping: Add base clock properties in clocksource structure lakshmi.sowjanya.d
2024-05-13 10:38 ` [PATCH v8 02/12] x86/tsc: Update tsc/art values in the base clock structure lakshmi.sowjanya.d
2024-05-13 10:38 ` [PATCH v8 03/12] e1000e: remove convert_art_to_tsc() lakshmi.sowjanya.d
2024-05-13 10:38 ` [PATCH v8 04/12] igc: remove convert_art_ns_to_tsc() lakshmi.sowjanya.d
2024-05-13 10:38 ` [PATCH v8 05/12] stmmac: intel: remove convert_art_to_tsc() lakshmi.sowjanya.d
2024-05-13 10:38 ` [PATCH v8 06/12] ALSA: hda: " lakshmi.sowjanya.d
2024-05-13 10:38 ` [PATCH v8 07/12] ice/ptp: " lakshmi.sowjanya.d
2024-05-13 10:38 ` [PATCH v8 08/12] x86/tsc: Remove art to tsc conversion functions which are obsolete lakshmi.sowjanya.d
2024-05-13 10:38 ` [PATCH v8 09/12] timekeeping: Add function to convert realtime to base clock lakshmi.sowjanya.d
2024-05-13 10:38 ` [PATCH v8 10/12] pps: generators: Add PPS Generator TIO Driver lakshmi.sowjanya.d
2024-05-13 11:18   ` Andy Shevchenko [this message]
2024-05-13 11:20     ` Andy Shevchenko
2024-05-27 11:48     ` D, Lakshmi Sowjanya
2024-05-27 14:34       ` Andy Shevchenko
2024-05-30  5:52         ` D, Lakshmi Sowjanya
2024-05-30  8:38           ` Andy Shevchenko
2024-05-13 10:38 ` [PATCH v8 11/12] Documentation: driver-api: pps: Add Intel Timed I/O PPS generator lakshmi.sowjanya.d
2024-05-15 11:16   ` Bagas Sanjaya
2024-05-13 10:38 ` [PATCH v8 12/12] ABI: pps: Add ABI documentation for Intel TIO lakshmi.sowjanya.d
2024-05-13 11:22   ` Andy Shevchenko
2024-05-27 11:53     ` D, Lakshmi Sowjanya
2024-05-27 14:37       ` Andy Shevchenko

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=ZkH3GP2b9WTz9W3W@smile.fi.intel.com \
    --to=andriy.shevchenko@linux.intel.com \
    --cc=alexandre.torgue@foss.st.com \
    --cc=anthony.l.nguyen@intel.com \
    --cc=christopher.s.hall@intel.com \
    --cc=corbet@lwn.net \
    --cc=davem@davemloft.net \
    --cc=eddie.dong@intel.com \
    --cc=giometti@enneenne.com \
    --cc=intel-wired-lan@lists.osuosl.org \
    --cc=jesse.brandeburg@intel.com \
    --cc=joabreu@synopsys.com \
    --cc=jstultz@google.com \
    --cc=lakshmi.sowjanya.d@intel.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sound@vger.kernel.org \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=pandith.n@intel.com \
    --cc=perex@perex.cz \
    --cc=peter.hilber@opensynergy.com \
    --cc=subramanian.mohan@intel.com \
    --cc=tglx@linutronix.de \
    --cc=thejesh.reddy.t.r@intel.com \
    --cc=x86@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).