[PATCH 0/7] Add SE HMBSC board support

Sumit Garg sumit.garg at linaro.org
Tue Dec 26 10:27:57 CET 2023


On Fri, 22 Dec 2023 at 23:04, Caleb Connolly <caleb.connolly at linaro.org> wrote:
>
> [snip]
>
> >>>> Sumit, could you rebase this series on my generic board support? [1] in
> >>>> it's current form this series conflicts, and includes some of the major
> >>>> anti-patterns I'm trying to move away from in mach-snapdragon.
> >>>
> >>> Although, I haven't gone through your series but I was expecting those
> >>> conflicts. Let's work together to make this series compatible on top
> >>> of yours.
> >>>
> >>>>
> >>>> You should not have to introduce a new CONFIG_TARGET_XYZ variable, and
> >>>> from what I can tell you shouldn't even need to add the board/schneider
> >>>> directory at all, you can just set the following in your defconfig:
> >>>>
> >>>> CONFIG_SYS_BOARD="dragonboard410c"
> >>>
> >>> This is simply a misnomer, its HMIBSC board. I suppose we should
> >>> rather separate the SoC specific bits into mach-snapdragon and let
> >>> different boards use them.
> >>
> >> Is there any reason why you can't just use the existing db410c board
> >> code as-is? I don't see why you want to duplicate it.
> >
> > I don't want to duplicate it but rather we should make the common
> > parts as part of arch/arm/mach-snapdragon/ and let derivative boards
> > use them. The HMIBSC board is an industrial board which doesn't need
> > any generic distro boot but rather FIT booting with OTA updates via
> > RAUC [1] along with U-boot environment protection. Doesn't that make
> > it different from db410c?
>
> Right, your series does this board specific configuration in the board
> header file (include/configs/hmibsc.h) and in the defconfig.
>
> The actual board code in board/schneider/hmibsc/hmibsc.c is directly
> copied from board/qualcomm/dragonboard410c/dragonboard410c.c with just
> the copyright changed, the serial number code removed, and a style fix
> to a comment. Ignoring for a moment the copyright issue which would
> definitely need to be fixed,

Ah, I should have retained the copyright.

> what I'm suggesting that you do is just use
> the board code from db410c.

This is just initial board support, a direct copy would just limit any
further board support extensions.

>
> The way I have designed the generic board support is so that two similar
> boards can share the same board code but with different config headers,
> from what I can tell this would work just fine for you.

As I have mentioned earlier, the proper way to share code among boards
is to have something like following:

arch/arm/mach-snapdragon/board_apq8016.c

You can take examples from arch/arm/mach-meson/board-*.c. If you don't
want to do it as part of your series then let me know I will include
it in this series.

>
> --- board/qualcomm/dragonboard410c/dragonboard410c.c
> +++ board/schneider/hmibsc/hmibsc.c
> @@ -2,5 +2,5 @@
>  /*
> - * Board init file for Dragonboard 410C
> + * Board init file for SE HMIBSC
>   *
> - * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski at gmail.com>
> + * (C) Copyright 2023 Sumit Garg <sumit.garg at linaro.org>
>   */
> @@ -8,3 +8,2 @@
>  #include <button.h>
> -#include <common.h>
>  #include <cpu_func.h>
> @@ -137,7 +136,2 @@
>  {
> -       char serial[16];
> -
> -       memset(serial, 0, 16);
> -       snprintf(serial, 13, "%x", msm_board_serial());
> -       env_set("serial#", serial);
>         return 0;
> @@ -145,3 +139,4 @@
>
> -/* Fixup of DTB for Linux Kernel
> +/*
> + * Fixup of DTB for Linux Kernel
>   * 1. Fixup installed DRAM.
> @@ -165,3 +160,2 @@
>
> -
>         if (!eth_env_get_enetaddr("btaddr", mac)) {
> @@ -169,5 +163,6 @@
>
> -/* The BD address is same as WLAN MAC address but with
> - * least significant bit flipped.
> - */
> +               /*
> +                * The BD address is same as WLAN MAC address but with
> +                * least significant bit flipped.
> +                */
>                 mac[0] ^= 0x01;
>
> >
> > [1] https://rauc.io/
> >
> >>
> >> The only reason the db410c and db820c have their board code is because
> >> they're old platforms and already supported. For adding new support
> >> there needs to be some very strong justification to have board-specific
> >> C code.
> >>
> >> I think it would be nice to make the db410c code go away, or be toggled
> >> at runtime, probably most of it will just work and not break any other
> >> boards anyway. The db820c code is just part of what should be in the
> >> pinctrl driver...
> >>
> >> Let's move away from this old model and towards having more generic
> >> U-Boot images. This will snowball towards making future bringup even easier.
> >
> > As I have mentioned in the other thread, we should give alternatives
> > to the board code as well. How would you handle the following?
> >
> > - Fastboot mode entry on a button press.
>
> This can be nicely handled through CONFIG_AUTOBOOT. I currently use
> AUTOBOOT_STOP_STR but that's quite limited (only works for the power
> button with "\r"). Probably the right solution here is to use
> CONFIG_AUTOBOOT_USE_MENUKEY and introduce support for
> CONFIG_AUTOBOOT_MENUBUTTON to allow specifying a named button instead of
> an ASCII code. One would then configure "menucmd" in the U-Boot
> environment to launch fastboot.

Won't this break existing users who relied on volume buttons to flash
their board and rather have to purchase a debug uart?

>
> This lets us drop all the weird non-standard keycode handling in board
> code and just configure it in the defconfig instead. I plan to implement
> this eventually but would for sure appreciate it if someone beat me to it.
> > - Configure MAC address for network support.
>
> I believe you mentioned elsewhere some board with the MAC address on an
> i2c EEPROM? The NVMEM framework solves exactly this issue, and U-Boot
> already supports it, just add support to your ethernet driver to
> retrieve its MAC address via NVMEM.

Good to know that.

> > - Setup board serial number.
>
> Same as above, the quick and dirty way to go would be to have
> mach-snapdragon check for an alias defined in DT and expect that alias
> to be an NVMEM cell which contains the serial number. On the Android
> phones this is set in the kernel cmdline from ABL so I would probably
> add some code to mach-snapdragon to check the bootargs for one.

And what about boards where U-Boot starts as the first stage
boot-loader? Is there corresponding DT binding?

>
> >
> > I suppose we don't need #ifdefry in the
> > arch/arm/mach-snapdragon/board.c file, right?
>
> Nope, we aren't that limited on code size, and the runtime overhead of a
> few extra branches is really not significant. If we do need to start
> caring about either of those things then I would rather do this on a
> per-feature basis than per-board.

The examples I gave were only limited to what are currently used by
Qcom boards. But we should be open to future board support extensions
too.

> >
> >>>
> >>>> CONFIG_SYS_CONFIG_NAME="hmibsc"
> >>>>
> >>>> This will use the db410c board code (which yours is just a copy/paste of
> >>>> from what I can tell) and your custom include/configs/hmibsc.h header.
> >>>>
> >>>> The addresses set in your environment file should be allocated
> >>>> automatically at runtime too (see the ("mach-snapdragon: dynamic load
> >>>> addresses") patch).
> >>>>
> >>>> You should also switch to an upstream board DTS based on my series, and
> >>>> drop the "-uboot.dtsi" file.
> >>>
> >>> Unfortunately, currently there isn't any upstream DTS for this board
> >>> but I will check with the SE team regarding their plans. Until then we
> >>> have to use a U-Boot specific DTS file.
> >>
> >> In that case, perhaps we can take whatever DTS they're using in
> >> production, or a version of it, and at least split the U-Boot changes
> >> (if any) out into a separate file as I've done with the other platforms.
> >> This way we stay consistent and can keep track of what U-Boot specific
> >> DTS changes we need.
> >
> > The first step for that is to land that DTS file upstream in the Linux
> > kernel and then we should make a switch. The middle ground here won't
> > be maintainable.
> >
> >>
> >> I guess this is all new territory for us, but imho if we're adding
> >> support for a board that doesn't have an upstream DTS, we should still
> >> follow the same model, open to input here.
> >
> > With the DT rebasing tree, we actually want to make these bits clear.
> > Either the board support is fully upstream and then we make a switch
> > to upstream or you can have a u-boot specific DTS subset compliant
> > with upstream bindings while upstreaming is in progress. There is
> > always ABI risk involved for using half baked board DTS files.
>
> The DTS file submitted in your series is a copy paste of
> dragonboard410c.dts with the serial port adjusted, the LEDs removed, and
> the copyright changed...
>
> This will make it the only board still using the totally made up DTS
> style that all the Qualcomm boards used to use, while everything else is
> standardised on upstream (meaning they #include the SoC and PMIC dtsi
> files).
>
> It doesn't make a difference whether you put the board DT in dt-rebasing
> or if it just goes in U-Boot, it should be a DT derived from upstream
> not some hand-crafted thing which will never be supported. Just copy
> apq8016-sbc.dts when rebasing on my series and it will be fine.

The major bit that I was concerned about previously is if people start
to pass that u-boot specific DT to the kernel directly. But with
dt-rebasing at least we can distinguish among them. So I am fine to
use the format that you have described.

>
> That said, as I'm writing this I've realised that the pinctrl-apq8016
> driver is missing a patch to use the upstream GPIO naming. I'll fix this
> in the next revision of the qualcomm generic support series, but just a
> heads up if you run into that.

Good to know.

-Sumit


More information about the U-Boot mailing list