devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Brüns, Stefan" <Stefan.Bruens@rwth-aachen.de>
To: Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: "linux-sunxi@googlegroups.com" <linux-sunxi@googlegroups.com>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"dmaengine@vger.kernel.org" <dmaengine@vger.kernel.org>,
	Vinod Koul <vinod.koul@intel.com>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Chen-Yu Tsai <wens@csie.org>, Rob Herring <robh+dt@kernel.org>,
	Code Kipper <codekipper@gmail.com>,
	Andre Przywara <andre.przywara@arm.com>
Subject: Re: [PATCH v2 07/10] dmaengine: sun6i: Retrieve channel count/max request from devicetree
Date: Tue, 19 Sep 2017 16:17:59 +0000	[thread overview]
Message-ID: <6028407.VKu5LCmQv0@sbruens-linux> (raw)
In-Reply-To: <20170919142508.woslovwjtecgygpo@flea.lan>

On Dienstag, 19. September 2017 16:25:08 CEST Maxime Ripard wrote:
> On Mon, Sep 18, 2017 at 02:09:43PM +0000, Brüns, Stefan wrote:
> > On Montag, 18. September 2017 10:18:24 CEST you wrote:
> > > Hi,
> > > 
> > > On Sun, Sep 17, 2017 at 05:19:53AM +0200, Stefan Brüns wrote:
> > > > +	ret = of_property_read_u32(np, "dma-channels", &sdc->num_pchans);
> > > > +	if (ret && !sdc->num_pchans) {
> > > > +		dev_err(&pdev->dev, "Can't get dma-channels.\n");
> > > > +		return ret;
> > > > +	}
> > > > +
> > > > +	if (sdc->num_pchans > DMA_MAX_CHANNELS) {
> > > > +		dev_err(&pdev->dev, "Number of dma-channels out of range.\n");
> > > > +		return -EINVAL;
> > > > +	}
> > > > +
> > > > +	ret = of_property_read_u32(np, "dma-requests", &sdc->max_request);
> > > > +	if (ret && !sdc->max_request) {
> > > > +		dev_info(&pdev->dev, "Missing dma-requests, using %u.\n",
> > > > +			 DMA_CHAN_MAX_DRQ);
> > > > +		sdc->max_request = DMA_CHAN_MAX_DRQ;
> > > > +	}
> > > > +
> > > > +	if (sdc->max_request > DMA_CHAN_MAX_DRQ) {
> > > > +		dev_err(&pdev->dev, "Value of dma-requests out of range.\n");
> > > > +		return -EINVAL;
> > > > +	}
> > > 
> > > I'm not really convinced about these two checks. They don't catch all
> > > errors (the range between the actual number of channels / DRQ and the
> > > maximum allowed per the registers), they might increase in the future
> > > too, and if we want to make that check actually working, we would have
> > > to duplicate the number of requests and channels into the driver.
> > 
> > 1. If these values increase, we have a new register layout and and
> > need a new compatible anyway.
> 
> And you want to store a new maximum attached to the compatible? Isn't
> that exactly the situation you're trying to get away from?

Yes, and no. H3, H5, A64 and R40 have the exact same register layout, but 
different number of channels and ports. They could share a compatible (if DMA 
channels were generalized), and we already have several register offsets/
widths (implicitly via the callbacks) attached to the compatible (so these 
don't need generalization via DT).

Now, we could also move everything that is currently attached to the 
compatible, i.e. clock gate register offset, burst widths/lengths etc. into 
the devicetree binding, but that would just be too much.

The idea is to find a middle ground here, using common patterns in the 
existing SoCs. The register layout has hardly changed, while the number of DMA 
channels and ports changes all the time. Moving the number of DMA channels and 
ports to the DT is trivial, and a pattern also found in other DMA controller 
drivers. *If* the number of dma channels and ports is ever increased, 
exceeding the current maximum, this would amount to major changes in the 
driver and maybe even warrant a completely new driver.

> > 2. As long as the the limits are adhered to, no other registers/register
> > fields are overwritten. As the channel number and port are used to
> > calculate memory offsets bounds checking is IMHO a good idea.
> 
> And this is true for many other resources, starting with the one
> defined in reg. We don't error check every register range, clock
> index, reset line, interrupt, DMA channel, the memory size, etc. yet
> you could make the same argument.
> 
> The DT has to be right, and we have to trust it. Otherwise we can just
> throw it away.

So your argument here basically is - don't do any checks on DT provided 
values, these are always correct. So, following this argument, not only the 
range check, but also the of_property_read return values should be ignored, as 
the DT is correct, thus of_property_read will never return an error.

That clearly does not match the implementation of drivers throughout the 
various subsystems for DT properties, which is in general - do all the checks 
that can be done, trust everything you can not verify.

Kind regards,

Stefan

  parent reply	other threads:[~2017-09-19 16:17 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-17  3:19 [PATCH v2 00/10] dmaengine: sun6i: Fixes for H3/A83T, enable A64 Stefan Brüns
     [not found] ` <20170917031956.28010-1-stefan.bruens-vA1bhqPz9FBZXbeN9DUtxg@public.gmane.org>
2017-09-17  3:19   ` [PATCH v2 01/10] dmaengine: sun6i: Correct setting of clock autogating register for A83T/H3 Stefan Brüns
     [not found]     ` <20170917031956.28010-2-stefan.bruens-vA1bhqPz9FBZXbeN9DUtxg@public.gmane.org>
2017-09-18  7:57       ` Maxime Ripard
2017-09-17  3:19   ` [PATCH v2 02/10] dmaengine: sun6i: Correct burst length field offsets for H3 Stefan Brüns
     [not found]     ` <20170917031956.28010-3-stefan.bruens-vA1bhqPz9FBZXbeN9DUtxg@public.gmane.org>
2017-09-18  7:58       ` Maxime Ripard
2017-09-17  3:19   ` [PATCH v2 03/10] dmaengine: sun6i: Restructure code to allow extension for new SoCs Stefan Brüns
     [not found]     ` <20170917031956.28010-4-stefan.bruens-vA1bhqPz9FBZXbeN9DUtxg@public.gmane.org>
2017-09-18  8:08       ` Maxime Ripard
2017-09-17  3:19   ` [PATCH v2 04/10] dmaengine: sun6i: Enable additional burst lengths/widths on H3 Stefan Brüns
     [not found]     ` <20170917031956.28010-5-stefan.bruens-vA1bhqPz9FBZXbeN9DUtxg@public.gmane.org>
2017-09-18  8:09       ` Maxime Ripard
2017-09-17  3:19   ` [PATCH v2 05/10] dmaengine: sun6i: Move number of pchans/vchans/request to device struct Stefan Brüns
     [not found]     ` <20170917031956.28010-6-stefan.bruens-vA1bhqPz9FBZXbeN9DUtxg@public.gmane.org>
2017-09-18  8:12       ` Maxime Ripard
2017-09-17  3:19   ` [PATCH v2 06/10] arm64: allwinner: a64: Add devicetree binding for DMA controller Stefan Brüns
     [not found]     ` <20170917031956.28010-7-stefan.bruens-vA1bhqPz9FBZXbeN9DUtxg@public.gmane.org>
2017-09-18  8:11       ` Maxime Ripard
     [not found]         ` <20170918081134.obpoaiwd7dgzdcak-ZC1Zs529Oq4@public.gmane.org>
2017-09-18 13:38           ` Brüns, Stefan
2017-09-20 20:53       ` Rob Herring
2017-09-23 23:34         ` Stefan Bruens
     [not found]           ` <1673036.ZUJy1pffid-KVr1ISHqF63jSbz6xCtQhw@public.gmane.org>
2017-09-25  4:12             ` Rob Herring
2017-09-17  3:19   ` [PATCH v2 07/10] dmaengine: sun6i: Retrieve channel count/max request from devicetree Stefan Brüns
     [not found]     ` <20170917031956.28010-8-stefan.bruens-vA1bhqPz9FBZXbeN9DUtxg@public.gmane.org>
2017-09-18  8:18       ` Maxime Ripard
2017-09-17  3:19   ` [PATCH v2 08/10] dmaengine: sun6i: Add support for Allwinner A64 and compatibles Stefan Brüns
     [not found]     ` <20170917031956.28010-9-stefan.bruens-vA1bhqPz9FBZXbeN9DUtxg@public.gmane.org>
2017-09-18  8:19       ` Maxime Ripard
2017-09-17  3:19   ` [PATCH v2 09/10] arm64: allwinner: a64: Add device node for DMA controller Stefan Brüns
2017-09-17  3:19   ` [PATCH v2 10/10] arm64: allwinner: a64: add dma controller references to spi nodes Stefan Brüns
     [not found] ` <2791817.czGZyN6WKS@sbruens-linux>
     [not found]   ` <20170919142508.woslovwjtecgygpo@flea.lan>
2017-09-19 16:17     ` Brüns, Stefan [this message]
2017-09-22 21:30       ` [PATCH v2 07/10] dmaengine: sun6i: Retrieve channel count/max request from devicetree Maxime Ripard
     [not found]         ` <20170922213027.xpnaut3an5or6edl-YififvaboMKzQB+pC5nmwQ@public.gmane.org>
2017-09-23  0:00           ` Brüns, Stefan
2017-09-27  9:09             ` Maxime Ripard
2017-09-27 23:10               ` Stefan Bruens

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=6028407.VKu5LCmQv0@sbruens-linux \
    --to=stefan.bruens@rwth-aachen.de \
    --cc=andre.przywara@arm.com \
    --cc=codekipper@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dmaengine@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sunxi@googlegroups.com \
    --cc=maxime.ripard@free-electrons.com \
    --cc=robh+dt@kernel.org \
    --cc=vinod.koul@intel.com \
    --cc=wens@csie.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).