Я пытаюсь загрузить файл в 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).
Отсюда я не понимаю, почему мой первый, или хотя бы вторая попытка не удалась. Когда дело доходит до третьей отчаянной попытки, я не уверен, что будет сделано, но комментарии приветствуются. Спасибо