Поле # address-cells и # size-cells в свойстве диапазона наложения дерева устройств - PullRequest
1 голос
/ 05 августа 2020

Я пытаюсь загрузить файл в stratix10 FPGA и сопоставить шины FPGA с помощью встроенного жесткого процессора, ARM работает linux

(Linux 5.4.23-03466-gcc83036e6a78 #1 SMP PREEMPT Wed Aug 5 10:15:00 CEST 2020 aarch64 GNU/Linux).

Это делается с помощью устройства наложения дерева.

Основное дерево устройств содержит: (где [...] указывает на удаленную часть -надеюсь- нет запросов)

#include "socfpga_stratix10.dtsi"

/ {
   [...]
       soc {
                clocks {
                        osc1 {
                                clock-frequency = <25000000>;
                        };
                };

                eccmgr {
                        sdmmca-ecc@ff8c8c00 {
                                compatible = "altr,socfpga-s10-sdmmc-ecc",
                                             "altr,socfpga-sdmmc-ecc";
                                reg = <0xff8c8c00 0x100>;
                                altr,ecc-parent = <&mmc>;
                                interrupts = <14 4>,
                                             <15 4>;
                        };
                };
        };
};

Включенный файл socfpga_stratix10.dtsi содержит:

/{
        soc {
                #address-cells = <1>;
                #size-cells = <1>;
                compatible = "simple-bus";
                device_type = "soc";
                interrupt-parent = <&intc>;
                ranges = <0 0 0 0xffffffff>;

                base_fpga_region {
                        #address-cells = <0x1>;
                        #size-cells = <0x1>;

                        compatible = "fpga-region";
                        fpga-mgr = <&fpga_mgr>;
                };
        [...]
        };
[...]
};

Обратите внимание, что поля #address-cells и #size-cells имеют значение <1> как в родительском (/soc), так и в дочернем (/soc/base_fpga_region) узлах. Моя первоначальная попытка наложения дерева устройств выглядела так:

/dts-v1/;
/plugin/;
/ {
        fragment@1 {
                target-path = "/soc/base_fpga_region";
                __overlay__ {
                        firmware-name = "fpga_image.rbf";
                        config-complete-timeout-us = <3000000>;
                        #address-cells = <1>;                           /* address in the child (fpga region) space are given as 1 U32 values */
                        #size-cells = <1>;                              /* sizes   in the child (fpga region) space are given as 1 U32 values */
                                                                        /* mapping from ARM address to FPGA addresses: */
                                                                        /* see https://www.intel.com/content/www/us/en/programmable/hps/stratix-10/hps.html */
                        ranges = <0x00000000 0x80000000 0x40000000>,    /* hps to FPGA mapping: address 0 of the child bus mapps to address 80000000 in the parent space: length 0x40000 */
                                 <0x00000000 0xf9000000 0x00200000>;    /* lightweight hps to FPGA mapping: 0 maps to parent f9000000. length 1000 */
                };
        };
};

Но когда я компилирую это дерево устройств, я получаю:

arch/arm64/boot/dts/altera/socfpga_stratix10_ovl_load.dts:13.4-14.41: Warning (ranges_format): /fragment@1/__overlay__:ranges: "ranges" property has invalid length (24 bytes) (parent #address-cells == 2, child #address-cells == 1, #size-cells == 1)
arch/arm64/boot/dts/altera/socfpga_stratix10_ovl_load.dts:6.15-15.5: Warning (avoid_default_addr_size): /fragment@1/__overlay__: Relying on default #address-cells value
arch/arm64/boot/dts/altera/socfpga_stratix10_ovl_load.dts:6.15-15.5: Warning (avoid_default_addr_size): /fragment@1/__overlay__: Relying on default #size-cells value

ОК ... в конце концов, компилятор, возможно, мало знает о родительском узле /soc при компиляции моего оверлея и принимает значения по умолчанию для #address-cells и #size-cells ... Поэтому я добавил небольшое напоминание в свой оверлей следующим образом:

dts-v1/;
/plugin/;
/ {
        fragment@0 {
                target-path = "/soc";
                __overlay__ {
                        #address-cells = <1>;                           /* */
                        #size-cells = <1>;                              /* */
                };
        };

        fragment@1 {
                target-path = "/soc/base_fpga_region";
                __overlay__ {
                        firmware-name = "fpga_image.rbf";
                        config-complete-timeout-us = <3000000>;
                        #address-cells = <1>;                           /* address in the child (fpga region) space are given as 1 U32 values */
                        #size-cells = <1>;                              /* sizes   in the child (fpga region) space are given as 1 U32 values */
                                                                        /* mapping from ARM address to FPGA addresses: */
                                                                        /* see https://www.intel.com/content/www/us/en/programmable/hps/stratix-10/hps.html */
                        ranges = <0x00000000 0x80000000 0x40000000>,    /* hps to FPGA mapping: address 0 of the child bus mapps to address 80000000 in the parent space: length 0x40000 */
                                 <0x00000000 0xf9000000 0x00200000>;    /* lightweight hps to FPGA mapping: 0 maps to parent f9000000. length 1000 */
                };
        };
};

Но это не имело никакого значения! Я все еще получаю:

arch/arm64/boot/dts/altera/socfpga_stratix10_ovl_load.dts:21.4-22.41: Warning (ranges_format): /fragment@1/__overlay__:ranges: "ranges" property has invalid length (24 bytes) (parent #address-cells == 2, child #address-cells == 1, #size-cells == 1)
arch/arm64/boot/dts/altera/socfpga_stratix10_ovl_load.dts:14.15-23.5: Warning (avoid_default_addr_size): /fragment@1/__overlay__: Relying on default #address-cells value
arch/arm64/boot/dts/altera/socfpga_stratix10_ovl_load.dts:14.15-23.5: Warning (avoid_default_addr_size): /fragment@1/__overlay__: Relying on default #size-cells value

Это меня немного смущает: теперь явно указан #address-cells родительского /soc узла (дважды: один раз в исходном дереве устройств и один раз в оверлее) ...

Что происходит? что я делаю не так?

В отчаянии я тоже попробовал (обратите внимание на дополнительный ноль для родительского адреса в диапазоне spe c):

/dts-v1/;
/plugin/;
/ {
        fragment@1 {
                target-path = "/soc/base_fpga_region";
                __overlay__ {
                        firmware-name = "fpga_image.rbf";
                        config-complete-timeout-us = <3000000>;
                        #address-cells = <1>;                           /* address in the child (fpga region) space are given as 1 U32 values */
                        #size-cells = <1>;                              /* sizes   in the child (fpga region) space are given as 1 U32 values */
                                                                        /* mapping from ARM address to FPGA addresses: */
                                                                        /* see https://www.intel.com/content/www/us/en/programmable/hps/stratix-10/hps.html */
                        ranges = <0x00000000 0 0x80000000 0x40000000>,  /* hps to FPGA mapping: address 0 of the child bus mapps to address 80000000 in the parent space: length 0x40000 */
                                 <0x00000000 0 0xf9000000 0x00200000>;  /* lightweight hps to FPGA mapping: 0 maps to parent f9000000. length 1000 */
                };
        };
};

который компилируется с обычным предупреждением :

arch/arm64/boot/dts/altera/socfpga_stratix10_ovl_load.dts:6.15-15.5: Warning (avoid_default_addr_size): /fragment@1/__overlay__: Relying on default #address-cells value
arch/arm64/boot/dts/altera/socfpga_stratix10_ovl_load.dts:6.15-15.5: Warning (avoid_default_addr_size): /fragment@1/__overlay__: Relying on default #size-cells value

Но когда я применяю свой оверлей и пытаюсь получить доступ к чему-то в сопоставленной области (например, по адресу 0xF9000000 для облегченной шины), это приводит к Bus Error ... Что, возможно, говорит мне, что даже это было сделано не так, как я хотел ...

В спецификации дерева устройств говорится:

Адрес дочерней шины - это физический адрес в адресном пространстве дочерней шины. Количество ячеек для представления адреса зависит от шины и может быть определено из # адресных ячеек этого узла (узла, в котором появляется свойство диапазонов)

родительская шина -адрес - это физический адрес в адресном пространстве родительской шины. Количество ячеек, представляющих родительский адрес, зависит от шины и может быть определено из свойства # address-cellsproperty узла, определяющего адресное пространство родительского объекта.

Длина определяет размер диапазон в адресном пространстве ребенка. Количество ячеек, представляющих размер, может быть определено из # size-cells этого узла (узла, в котором появляется свойство range).

Отсюда я не понимаю, почему мой первый, или хотя бы вторая попытка не удалась. Когда дело доходит до третьей отчаянной попытки, я не уверен, что будет сделано, но комментарии приветствуются. Спасибо

...