Search code examples
linux-kernellinux-device-driverembedded-linuxdevice-tree

DTC compile error for #address-cells = <2> case


Below is a part of arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi in linux kernel. This file is included by arch/arm64/boot/dts/arm/fvp-base-revc.dts.

/ {
    smb@8000000 {
        motherboard {
            arm,v2m-memory-map = "rs1";
            compatible = "arm,vexpress,v2m-p1", "simple-bus";
            #address-cells = <2>; /* SMB chipselect number and offset */
            #size-cells = <1>;
            #interrupt-cells = <1>;
            ranges;

            flash@0,00000000 {
                compatible = "arm,vexpress-flash", "cfi-flash";
                reg = <0 0x00000000 0x04000000>,
                      <4 0x00000000 0x04000000>;
                bank-width = <4>;
            };

            ethernet@2,02000000 {
                compatible = "smsc,lan91c111";
                reg = <2 0x02000000 0x10000>;
                interrupts = <15>;
            };

When I compile the fvp-base-revc.dts file (following this method to handle pre-processing : Device tree compiler not recognizes C syntax for include files), it gives me error below.

arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi:20.21-25.6: Warning (simple_bus_reg): /smb@8000000/motherboard/flash@0,00000000: simple-bus unit address format error, expected "0"
arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi:27.24-31.6: Warning (simple_bus_reg): /smb@8000000/motherboard/ethernet@2,02000000: simple-bus unit address format error, expected "202000000"

The dtc is complaining about the address format flash@0,00000000 or ethernet@2,02000000. But because the #address-cells = <2>, the node address should be given by chip select number and the offset (inside the chip select). How can I prevent this error? DTC version is 1.5.0.


Solution

  • I’ve found how to do it.
    For that you should first add CONFIG_ARCH_VEXPRESS and ran ‘make V=1 ARCH=arm64 CROSS_COMPILE=aarch64-none-elf- dtbs |& tee logx’
    Dtbs for ARCH_VEXPRESS are generated in the dts directory. Then you can see the command to make the dtb (in the logx file).
    Below is the command. Lots of options for the dtc(related to unit address too).

    mkdir -p arch/arm64/boot/dts/arm/ ; gcc -E -Wp,-MD,arch/arm64/boot/dts/arm/.fvp-base-revc.dtb.d.pre.tmp -nostdinc -I./scripts/dtc/include-prefixes -undef -D__DTS__ -x assembler-with-cpp -o arch/arm64/boot/dts/arm/.fvp-base-revc.dtb.dts.tmp arch/arm64/boot/dts/arm/fvp-base-revc.dts ; ./scripts/dtc/dtc -O dtb -o arch/arm64/boot/dts/arm/fvp-base-revc.dtb -b 0 -iarch/arm64/boot/dts/arm/ -i./scripts/dtc/include-prefixes -Wno-unit_address_vs_reg -Wno-unit_address_format -Wno-avoid_unnecessary_addr_size -Wno-alias_paths -Wno-graph_child_address -Wno-simple_bus_reg -Wno-unique_unit_address -Wno-pci_device_reg -d arch/arm64/boot/dts/arm/.fvp-base-revc.dtb.d.dtc.tmp arch/arm64/boot/dts/arm/.fvp-base-revc.dtb.dts.tmp ; cat arch/arm64/boot/dts/arm/.fvp-base-revc.dtb.d.pre.tmp arch/arm64/boot/dts/arm/.fvp-base-revc.dtb.d.dtc.tmp > arch/arm64/boot/dts/arm/.fvp-base-revc.dtb.d

    You can use this command to make a specific dtb file.