Re: [RFC PATCH 2/2] ASoc: tas2563: DSP Firmware loading support

From: Mark Brown
Date: Fri Jun 12 2020 - 13:46:58 EST


On Fri, Jun 12, 2020 at 12:30:29PM -0500, Dan Murphy wrote:
> On 6/9/20 12:50 PM, Mark Brown wrote:
> > On Tue, Jun 09, 2020 at 12:28:41PM -0500, Dan Murphy wrote:

> > > + /* Reset Page to 0 */
> > > + ret = regmap_write(tas2562->regmap, TAS2562_PAGE_CTRL, 0);
> > > + if (ret)
> > > + return ret;

> > Why?

> Well the reason to set this back to page 0 is that is where the book
> register is.

> So setting this back to page 0 set the Book register appropriately.

Oh dear, usually the paging register is always visible :/

> > This manual paging doesn't fill me with with joy especially with regard
> > to caching and doing the books behind the back of regmap. I didn't spot
> > anything disabling cache or anything in the code. I think you should
> > either bypass the cache while doing this or teach regmap about the
> > books (which may require core updates, I can't remember if the range
> > code copes with nested levels of paging - I remember thinking about it).

> Yeah. After reading this and thinking about this for a couple days.  This
> actually has contention issues with the ALSA controls.

> There needs to also be some locks put into place.

That's not too surprising for something like this.

> I prefer to disable the cache.  Not sure how many other devices use Books
> and pages for register maps besides TI.

> Adding that to regmap might be to specific to our devices.

Single level pages are in there already, TI is a big user but I've seen
this from other vendors too. I do remember some discussion of multi
level paging before, I think with a TI part, and I *think* it already
happens to work without needing to do anything but I'd need to go back
and check and it's 7pm on a Friday night. IIRC if one paging register
is within another paged region the code manages to recurse and sort
things out, but I could be wrong. I agree that it's a bit specialist if
it needs anything non-trivial and something driver local would be
reasonable.

> > > + tas2562->fw_data->fw_hdr = devm_kzalloc(tas2562->dev, hdr_size,
> > > + GFP_KERNEL);
> > > + if (!tas2562->fw_data->fw_hdr)
> > > + return -ENOMEM;
> > > +
> > > + memcpy(tas2562->fw_data->fw_hdr, &fw->data[0], hdr_size);

> > Should validate that the firmware is actually at least hdr_size big, and
> > similarly for all the other lengths we get from the header we should
> > check that there's actually enough data in the file. ATM we just
> > blindly copy.

> I will have to look into doing this.  I blindly copy this data because there
> is really not a viable and reliable way to check sizes against the
> structures.

Yeah, that's reasonable - I was just thinking about checking it against
the size of the file to make sure it doesn't actually overflow the
buffer and corrupt things or crash. Obviously sanity checking is good
but there's limits on what's sensible.

Attachment: signature.asc
Description: PGP signature