Перейти к содержанию
    

Zynq Ultrascale + PL DMA + cache

Здравствуйте. Ситуация следующая:

1. На PS формирую данные

2. На PL реализован контроллер DMA и регистры управления

3. Когда PS подготовила данные, они копируются в буфер, который формируется в драйвере функцией dmam_alloc_coherent

4. После копирования данных, PS стартует DMA 

 

В результате данные оказываются испорченными.

Подозреваю, что перед началам транзакции с помощью DMA, требуется некоторые манипуляции с кэшем, чтобы данные были принудительно сброшены из кэша с буфер на DDR.

Вопрос - как это сделать ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, Alex77 said:

соответствующей функцией из библиотеки / ну или на асме. лень искать точнее...

да вот и мне не найти никак... А код на асме, это который в исходниках (cache.S) лежит ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как вариант

file:///D:/xilinx/Vitis/2022.2/data/embeddedsw/XilinxProcessorIPLib/drivers/zdma_v1_15/examples/xzdma_simple_example.c

ну или для самых "ленивых"

BSP and Libraries Document Collection (UG643)
услуга читать вслух - будет дорого

🙂

Изменено пользователем Alex77

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, Alex77 said:

как вариант

file:///D:/xilinx/Vitis/2022.2/data/embeddedsw/XilinxProcessorIPLib/drivers/zdma_v1_15/examples/xzdma_simple_example.c

ну или для самых "ленивых"

BSP and Libraries Document Collection (UG643)
услуга читать вслух - будет дорого

🙂

 

да, у меня была мысль использовать код из baremetall библиотеки. Вроде в 32-х разрядных системах не было таких проблем. Полагал, что можно использовать - EL0 accessibility to cache maintenance instructions. Видимо, выпилили...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ultrascale имеет когерентные порты, работа через которые позволяет обойтись без инвалидации кэша.

По крайней мере в baremetal это работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

46 minutes ago, sonycman said:

Ultrascale имеет когерентные порты, работа через которые позволяет обойтись без инвалидации кэша.

По крайней мере в baremetal это работает.

есть 2 интерфейса HPC, но они оба заняты VCU

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделюсь, может кому пригодится...

1. Повесил проблемный интерфейс на HPC, на сигналы  AхCACHE повесил константы. Результат - артефакты с чтением предыдущих данных исчезли

https://support.xilinx.com/s/article/69446?language=en_US

2. Изначально использовался порт HP. Для программного управления кэшем использовал в драйвере функции отсюда https://memotut.com/how-to-cache-enable-access-to-fpga-memory-from-linux-1580e/

Результат положительный. Кэш сбрасывается в ОЗУ перед стартом ДМА из ОЗУ в PL.

Решил остановиться на первом варианте, т.к. нет уверенности в надежности решения в пункте 2.

 

Пысы. Для себя так и не понял, каким образом разработчик должен обеспечить согласование кэша и ОЗУ при использовании порта HP. Использование ассемблерных вставок в коде драйвера не кажется мне разумным, иначе разработчики ядра предоставили бы такую возможность (может я плохо искал ?).

Кстати, модуль VCU, как раз, использует порт HP для ДМА транзакций, но работая с H265, я никаких артефактов не наблюдал. Поверхностное изучение кода драйвера VCU не дало никого объяснения, явных признаков управления кэшем я там не обнаружил

Пысы2 Всегда полагал, что при динамическом выделении памяти с помощью функции dma_alloc_coherent, ядро должно возвращать непрерывную область памяти, кэширование которой запрещено.

Т.е. в ручном управлении кэшем необходимости нет. Но это видимо не так ?

 

Буду весьма благодарен, если кто-нибудь сочтет нужным просветить меня в этих вопросах

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 minutes ago, makc said:

нет... мимо прошло 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 minutes ago, карамболь said:

нет... мимо прошло 

вот из DTS для VCU

vcu_0: vcu@80000000 {
            #address-cells = <2>;
            #clock-cells = <1>;
            #size-cells = <2>;
            clock-names = "pll_ref", "aclk", "vcu_core_enc", "vcu_core_dec", "vcu_mcu_enc", "vcu_mcu_dec";
            clocks = <&misc_clk_0>, <&zynqmp_clk 71>, <&vcu_0 1>, <&vcu_0 2>, <&vcu_0 3>, <&vcu_0 4>;
            compatible = "xlnx,vcu-1.2", "xlnx,vcu";
            interrupt-names = "vcu_host_interrupt";
            interrupt-parent = <&gic>;
            interrupts = <0 89 4>;
            ranges ;
            reg = <0x0 0x80040000 0x0 0x1000>, <0x0 0x80041000 0x0 0x1000>;
            reg-names = "vcu_slcr", "logicore";
            encoder: al5e@80000000 {
                compatible = "al,al5e-1.2", "al,al5e";
                interrupt-parent = <&gic>;
                interrupts = <0 89 4>;
                reg = <0x0 0x80000000 0x0 0x10000>;
            };
        };

reserved-memory в DTS не обнаружено

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...