[PATCH v2 17/33] dtoc: Process driver aliases along with drivers

Johan Jonker jbx6244 at gmail.com
Mon Jun 21 20:39:26 CEST 2021


Hi Simon, Heiko,

With introduction of rockchip-nand-controller.c in Linux and recently
rockchip_nfc.c in U-boot it offers a renewed opportunity to add support
for MK808 with a rk3066 + NAND to boot from.
rk3066 shares /arch/arm/dts/rk3xxx.dtsi with rk3188.
The only 'usable' boot loader now is closed source with proprietary FTL.

As a spinoff to that discussion I've tried to compile for
rk3188-radxarock as an example due to the lack of rk3066 support in next
and enabling the new rockchip_nfc.c driver.
I'm not familiar with Python/U-boot.
Do you have an idea what this error below is about?

Kind regards,

Johan
===

python --version
Python 2.7.13

===

>From rock_defconfig:
CONFIG_SPL_OF_PLATDATA=y

===

git clone -b next
https://source.denx.de/u-boot/custodians/u-boot-rockchip.git
u-boot-next-20210619

make rock_defconfig

make CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- menuconfig

[ ]   Support for NAND controller on Rockchip SoCs (NEW)

Add to rock.h:
#define CONFIG_SYS_MAX_NAND_DEVICE	1

make CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- all

===
mkdir -p spl/dts/
  FDTGREP spl/dts/dt-spl.dtb
  COPY    spl/u-boot-spl.dtb
  CC      spl/./lib/asm-offsets.s
  CC      spl/./arch/arm/lib/asm-offsets.s
  DTOC    spl/dts/dt-plat.c
Traceback (most recent call last):
  File "./tools/dtoc/dtoc", line 112, in <module>
    options.phase, instantiate=options.instantiate)
  File
"~/Downloads/u-boot-next-20210619/tools/dtoc/../dtoc/dtb_platdata.py",
line 1180, in run_steps
    scan.scan_drivers()
  File
"~/Downloads/u-boot-next-20210619/tools/dtoc/../dtoc/src_scan.py", line
649, in scan_drivers
    self.scan_driver(pathname)
  File
"~/Downloads/u-boot-next-20210619/tools/dtoc/../dtoc/src_scan.py", line
608, in scan_driver
    self._parse_driver(fname, buff)
  File
"~/Downloads/u-boot-next-20210619/tools/dtoc/../dtoc/src_scan.py", line
558, in _parse_driver
    self._driver_aliases[m_alias[2]] = m_alias[1]
TypeError: '_sre.SRE_Match' object is not subscriptable
scripts/Makefile.spl:352: recipe for target 'spl/dts/dt-plat.c' failed
make[1]: *** [spl/dts/dt-plat.c] Error 1
Makefile:1977: recipe for target 'spl/u-boot-spl' failed
make: *** [spl/u-boot-spl] Error 2

===

Changed:
self._driver_aliases[m_alias[2]] = m_alias[1]

To:
self._driver_aliases[m_alias.group(2)] = m_alias.group(1)

Is that a correct python change of mine?

===

After that it compiles normal with only this warning.

  DTOC    spl/dts/dt-plat.c
WARNING: the driver rockchip_rk3188_grf was not found in the driver list
WARNING: the driver rockchip_rk3188_pmu was not found in the driver list
WARNING: the driver rockchip_rk3188_uart was not found in the driver list
  DTOC    include/generated/dt-structs-gen.h
WARNING: the driver rockchip_rk3188_grf was not found in the driver list
WARNING: the driver rockchip_rk3188_pmu was not found in the driver list
WARNING: the driver rockchip_rk3188_uart was not found in the driver list
  DTOC    include/generated/dt-decl.h
WARNING: the driver rockchip_rk3188_grf was not found in the driver list
WARNING: the driver rockchip_rk3188_pmu was not found in the driver list
WARNING: the driver rockchip_rk3188_uart was not found in the driver list


On 2/3/21 2:01 PM, Simon Glass wrote:
> Instead of using a separate step for this processing, handle it while
> scanning its associated driver. This allows us to drop the code coverage
> exception in this case.
> 
> Note that only files containing drivers are scanned by dtoc, so aliases
> declared in a file that doesn't hold a driver will not be noticed. It
> would be confusing to put them anywhere other than in the driver that they
> relate to, but update the documentation to say this explicitly, just in
> case.
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> 
> (no changes since v1)
> 
>  doc/driver-model/of-plat.rst               |  3 ++-
>  tools/dtoc/src_scan.py                     | 16 +++++-----------
>  tools/dtoc/test/dtoc_test_scan_drivers.cxx |  4 ++++
>  3 files changed, 11 insertions(+), 12 deletions(-)
> 
> diff --git a/doc/driver-model/of-plat.rst b/doc/driver-model/of-plat.rst
> index 4ef2fe699a4..a5a6e46e3ec 100644
> --- a/doc/driver-model/of-plat.rst
> +++ b/doc/driver-model/of-plat.rst
> @@ -183,7 +183,8 @@ each 'compatible' string.
>  
>  In order to make this a bit more flexible DM_DRIVER_ALIAS macro can be
>  used to declare an alias for a driver name, typically a 'compatible' string.
> -This macro produces no code, but it is by dtoc tool.
> +This macro produces no code, but it is by dtoc tool. It must be located in the
> +same file as its associated driver, ideally just after it.
>  
>  The parent_idx is the index of the parent driver_info structure within its
>  linker list (instantiated by the U_BOOT_DRVINFO() macro). This is used to support
> diff --git a/tools/dtoc/src_scan.py b/tools/dtoc/src_scan.py
> index 206b2b37583..9d161a2cbc7 100644
> --- a/tools/dtoc/src_scan.py
> +++ b/tools/dtoc/src_scan.py
> @@ -387,6 +387,7 @@ class Scanner:
>                  in the file
>              _of_match - updated with each compatible string found in the file
>              _compat_to_driver - Maps compatible string to Driver
> +            _driver_aliases - Maps alias names to driver name
>  
>          Args:
>              fname (str): Filename being parsed (used for warnings)
> @@ -438,6 +439,7 @@ class Scanner:
>  
>          re_phase = re.compile('^\s*DM_PHASE\((.*)\).*$')
>          re_hdr = re.compile('^\s*DM_HEADER\((.*)\).*$')
> +        re_alias = re.compile(r'DM_DRIVER_ALIAS\(\s*(\w+)\s*,\s*(\w+)\s*\)')
>  
>          # Matches the struct name for priv, plat
>          re_priv = self._get_re_for_member('priv_auto')
> @@ -522,8 +524,11 @@ class Scanner:
>                  driver = Driver(driver_name, fname)
>              else:
>                  ids_m = re_ids.search(line)
> +                m_alias = re_alias.match(line)
>                  if ids_m:
>                      ids_name = ids_m.group(1)
> +                elif m_alias:
> +                    self._driver_aliases[m_alias[2]] = m_alias[1]
>  
>          # Make the updates based on what we found
>          self._drivers.update(drivers)
> @@ -557,17 +562,6 @@ class Scanner:
>              if 'UCLASS_DRIVER' in buff:
>                  self._parse_uclass_driver(fname, buff)
>  
> -            # The following re will search for driver aliases declared as
> -            # DM_DRIVER_ALIAS(alias, driver_name)
> -            driver_aliases = re.findall(
> -                r'DM_DRIVER_ALIAS\(\s*(\w+)\s*,\s*(\w+)\s*\)',
> -                buff)
> -
> -            for alias in driver_aliases: # pragma: no cover
> -                if len(alias) != 2:
> -                    continue
> -                self._driver_aliases[alias[1]] = alias[0]
> -
>      def scan_header(self, fname):
>          """Scan a header file to build a list of struct definitions
>  
> diff --git a/tools/dtoc/test/dtoc_test_scan_drivers.cxx b/tools/dtoc/test/dtoc_test_scan_drivers.cxx
> index f448767670e..f370b8951d0 100644
> --- a/tools/dtoc/test/dtoc_test_scan_drivers.cxx
> +++ b/tools/dtoc/test/dtoc_test_scan_drivers.cxx
> @@ -1 +1,5 @@
> +/* Aliases must be in driver files */
> +U_BOOT_DRIVER(sandbox_gpio) {
> +};
> +
>  DM_DRIVER_ALIAS(sandbox_gpio, sandbox_gpio_alias2)
> 


More information about the U-Boot mailing list