On 5/6/20 16:29, Walter Lozano wrote:
Hi Tom,

On 5/6/20 13:32, Tom Rini wrote:
On Fri, Jun 05, 2020 at 01:18:00PM -0300, Walter Lozano wrote:
Hi Tom,

On 5/6/20 11:20, Tom Rini wrote:
On Thu, Jun 04, 2020 at 09:13:06PM -0600, Simon Glass wrote:
Hi Tom,

On Tue, 2 Jun 2020 at 07:53, Tom Rini <tr...@konsulko.com> wrote:
On Mon, Jun 01, 2020 at 05:55:31PM -0300, Walter Lozano wrote:
Hi Simon,

On 26/5/20 15:39, Walter Lozano wrote:
Hi Simon,

On 25/5/20 18:40, Simon Glass wrote:
Hi Tom,

On Mon, 25 May 2020 at 14:57, Tom Rini <tr...@konsulko.com> wrote:
On Mon, May 25, 2020 at 02:34:20PM -0600, Simon Glass wrote:
Hi Tom,

On Mon, 25 May 2020 at 13:47, Tom Rini <tr...@konsulko.com> wrote:
On Mon, May 25, 2020 at 09:35:44AM -0600, Simon Glass wrote:

This patch provides the documentation for a proposed
enhancement to driver
model to reduce overhead in SPL.

The actual patches are not included here because
they are based on some
pending work by Walter Lozano which is not in final form.

For now, the source tree is available at:

https://gitlab.denx.de/u-boot/custodians/u-boot-dm/-/tree/dtoc-working


Comments welcome!
So here's my worry.  It's not clear, aside from the device tree, how
much re-use of existing code we get with this.  It feels
like it might
be fairly minimal.  And at that point, are we not perhaps making too much work for ourselves compared with just excepting that there will
need to be a place for non-abstracted-framework drivers?
What do we do
about TPL, when we get to the point of everything being
converted to DM
and as-needed tiny-DM but there's still TPL drivers?
The reason we have
SPL_FRAMEWORK as a symbol today is that we already had some
SoCs/architectures (primarily PowerPC) that had "SPL" but it was very
centric to the SoCs in question.

The interface for example for mmc is:
int spl_mmc_load_image(struct spl_image_info *spl_image, struct
spl_boot_device *bootdev) and neither part of that is
inherently DM.  So
let it be MMC_TINY for the non-DM case and regular DM_MMC for the DM
case.  I wonder if we could clean that up code a little
if we let it be
separate.

The interface for example for spi is:
int spl_spi_load_image(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev) and well, the same
thing.  Or maybe we
can even push that up to the spi_flash_load() call.

But my worry is that a different set of abstractions here are still going to bring us in more overhead than writing drivers for the
functionality we need directly, and if we define what's
allowed in this
limited case well, that might be good enough.
Some boards (e.g. x86) Need to read multiple things from the SPI flash
(such as FSP binaries), so I still think we will want a generic
reading interface.

You could be right, but my hunch is that there is value in having things more generic and the cost should be minimal. The value is that hopefully writing a few C functions in the SPI driver will be enough to enable tiny SPI on an SoC, reusing much of the code in the driver (only the reading bits!). We won't need as much special-case code and an entirely different way of configuring these devices for TPL/SPL.

It has been interesting digging into the Zephyr model. It's drivers are very basic and thus small. But there is still value in using the
device tree to assemble things.

Anyway I'm not really sure at this point. It is just a hunch. I don't think we can know all this until we have a bit more information. Perhaps with a board with SPI, MMC and serial converted we would get a
better picture?
I think it's absolutely the case that we'll have to convert something and see how it looks, then convert something else and see if it still looks good enough.  At a high enough level there's not really too much of a difference between what it sounds like you're proposing and what I'm proposing.  Possibly even in a progmatic way too.  We have (I think anyhow) fairly static board configurations in this case so we don't so much need to "probe" for possible drivers be told what our device
hierarchy is and to initialize what we're going to use.
Yes, we may end up with special, separate code anyway, since if you end up refactoring the driver so much (and putting tiny-dm tentacles
into it) that it becomes harder to maintain, it isn't a win.

Basically I started out similar to what you are saying, with the idea
of just direct calls into the driver (e.g. the driver implements
serial_putc() and spi_read_flash()). But then I figured it is a very small overhead to retain some sort of driver model, so I thought I'd
try that.

I'll fiddle with this again in a week or so...
Thanks for this proposal.

I'm very interested in see where this implementation leads us, as I always felt that some work could be done in order to reduce the overhead of DM support in TPL/SPL. I'll review this work and hopefully come back
to you with some comments.

In the same sense, I feel that maybe we can add some additional
intelligence to dtoc in order to produce a more customized code for TPL/SPL, maybe relaying in some custom stuff in u-boot.dtsi, but this is
only a feeling.


I've been checking your work and found it very interesting. Let me share
some comments


I really like the trade-off between size and features in this implementation and the way you get rid of not very useful data, such as strings and class
overhead.


I see that you parse drivers in order to build the relationship between drivers and compatible strings among other things. I faced a similar requirement in the series I proposed, however, I proposed the use of a U_BOOT_DRIVER_ALIAS in order to explicitly declare the alias. Then main reason behind this were to make code cleaner, avoid a lot of parsing and having to take into account possible valid C code which is not cover by the
parsing.

I have no problem with your approach, on the contrary I like the idea of improving dtoc, but I think that if we take this path, we should put some constrains and to document them to avoid unexpected behavior. Most of the constrains maybe already used by all the drivers, like the way we declare
compatible strings, however any limitation in the parsing should be
documented.


The same goes for parsing config files which is also a nice improvement. I feel that every step we give adding intelligence to dtoc is a step towards
footprint improvement.
Would this allow us to make progress towards the idea of being able to discard compatibles (and referenced data) that won't be used at run time
given the dts files for the boards we'll support at run time?
Do you mean just the compatible strings, or do you mean whole drivers?
Compatible and data.  One of the "this is ugly but works" patches to
reduce size on i.MX families was to guard compatible string + data (see
drivers/mmc/fsl_esdhc_imx.c for example) with compile time checks.  If
we could automate that somehow, that would be good.
Could you point to the "ugly but works" patch in order to have better
context?
http://patchwork.ozlabs.org/project/uboot/patch/20200525202429.2146-1-ag...@denx.de/
Thanks for pointing at it, now the context is clear.
Regarding drivers/mmc/fsl_esdhc_imx.c I have been working in adding
OF_PLATDATA support to it in order to reduce the SPL footprint on iMX6,
which I think it could be a first step for further improvements.

https://patchwork.ozlabs.org/project/uboot/list/?series=167495&state=*
Note that we're not talking about just SPL here.  We have platforms that
very specifically care about full U-Boot size.  In addition, we care in
general about the overall binary size.  Think of it this way, especially
in the case the i.MX patch above shows.  Why should a 32bit i.MX6
platform grow in binary size as part of adding support for the latest
64bit i.MX8 part, when we're talking about just adding some form or
another of a table.

I see your point and the example is very clear. Let me think about this, as I said I think there are a lot of room for improvements if we add a bit more of intelligence to dtoc.


Following the discussion related to [PATCH v1 00/15] add basic driver support for broadcom NS3 soc

https://patchwork.ozlabs.org/project/uboot/list/?series=177442

As I mentioned in the other thread, there might be some possible improvements like

1- Use OF_PLATDATA, which already works and is being improved, to convert DTB to C structures, however this require driver support.

2- Improve dtoc to generate configuration variables based on DTB, to allow to enable some pieces of code only if DTB contains specific properties, this could be useful to avoid adding configuration options than have to match with DTB properties in order to work.

3- Improve dtoc to generate C code based on DTB information, for instance the list of compatible strings. The specific example of compatible strings makes sense only if we don't support OF_PLATDATA.

4- Improve dtoc to filter nodes from DTB, however I still see some need of manual work in order to specify which nodes to keep, similar to the u-boot.dtsi approach. Maybe with some additional intelligence, only nodes that have a driver enabled you be kept? However, this could checked carefully as it could lead to issues at runtime difficult to debug.

Regards,

Walter

Reply via email to