[U-Boot] [PATCH 04/16] dm: board: Add a uclass for init functions

Simon Glass sjg at chromium.org
Wed Mar 22 13:05:42 UTC 2017


Hi Igor,

On 20 March 2017 at 01:54, Igor Grinberg <grinberg at compulab.co.il> wrote:
>
> On 03/19/17 20:59, Simon Glass wrote:
>> Add a uclass to handle board init. This allows drivers to be provided to
>> perform the various phases of init. Functions are provided to call all
>> devices that can handle a particular phase.
>>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> ---
>>
>>  common/Kconfig                    |  31 +++++++
>>  common/init/Makefile              |   1 +
>>  common/init/board-uclass.c        | 108 ++++++++++++++++++++++++
>>  include/asm-generic/global_data.h |   5 ++
>>  include/board.h                   | 170 ++++++++++++++++++++++++++++++++++++++
>>  include/dm/uclass-id.h            |   1 +
>>  6 files changed, 316 insertions(+)
>>  create mode 100644 common/init/board-uclass.c
>>  create mode 100644 include/board.h
>
> [...]
>
>> diff --git a/include/board.h b/include/board.h
>> new file mode 100644
>> index 0000000000..0975f5ac12
>> --- /dev/null
>> +++ b/include/board.h
>
> [...]
>
>> +/* Operations for the board driver */
>> +struct board_ops {
>> +     /**
>> +     * phase() - Execute a phase of board init
>> +     *
>> +      * @dev:        Device to use
>> +     * @phase:       Phase to execute
>> +     * @return 0 if done, -ENOSYS if not supported (which is often fine),
>> +             BOARD_PHASE_CLAIMED if this was handled and that processing
>> +             of this phase should stop (i.e. do not send it to other
>> +             devices), other error if something went wrong
>> +     */
>> +     int (*phase)(struct udevice *dev, enum board_phase_t phase);
>
> That looks a bit tiny interface.
> This will force all the boards to define switch to figure out what the
> current phase is... This might cause a problem (probably #ifdefs) in the board
> code as some code will be available in SPL and some not.
>
> I would prefer a wider interface instead of a single entry point to any
> kind of flexibility to the board driver.

Yes that certainly seems nicer.

But it means we might have ~20 or so methods in the interface. Do you
think most of them would be used? Also I am thinking a linker list
idea might help with code size, and would need some sort of 'phase'
parameter I think.

>
>> +
>> +     /**
>> +      * get_desc() - Get a description string for a board
>> +      *
>> +      * @dev:        Device to check (UCLASS_BOARD)
>> +      * @buf:        Buffer to place string
>> +      * @size:       Size of string space
>> +      * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error
>> +      */
>> +     int (*get_desc)(struct udevice *dev, char *buf, int size);
>> +};
>> +
>> +#define board_get_ops(dev)        ((struct board_ops *)(dev)->driver->ops)
>> +
>
> [...]
>
>
> --
> Regards,
> Igor.

Regards,
Simon


More information about the U-Boot mailing list