карамболь 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба Здравствуйте. Ситуация следующая: 1. На PS формирую данные 2. На PL реализован контроллер DMA и регистры управления 3. Когда PS подготовила данные, они копируются в буфер, который формируется в драйвере функцией dmam_alloc_coherent 4. После копирования данных, PS стартует DMA В результате данные оказываются испорченными. Подозреваю, что перед началам транзакции с помощью DMA, требуется некоторые манипуляции с кэшем, чтобы данные были принудительно сброшены из кэша с буфер на DDR. Вопрос - как это сделать ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба соответствующей функцией из библиотеки / ну или на асме. лень искать точнее... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба 16 minutes ago, Alex77 said: соответствующей функцией из библиотеки / ну или на асме. лень искать точнее... да вот и мне не найти никак... А код на асме, это который в исходниках (cache.S) лежит ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 2 июня, 2023 Опубликовано 2 июня, 2023 (изменено) · Жалоба как вариант file:///D:/xilinx/Vitis/2022.2/data/embeddedsw/XilinxProcessorIPLib/drivers/zdma_v1_15/examples/xzdma_simple_example.c ну или для самых "ленивых" BSP and Libraries Document Collection (UG643) услуга читать вслух - будет дорого 🙂 Изменено 2 июня, 2023 пользователем Alex77 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба 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. Видимо, выпилили... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 1 3 июня, 2023 Опубликовано 3 июня, 2023 · Жалоба Ultrascale имеет когерентные порты, работа через которые позволяет обойтись без инвалидации кэша. По крайней мере в baremetal это работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 3 июня, 2023 Опубликовано 3 июня, 2023 · Жалоба 46 minutes ago, sonycman said: Ultrascale имеет когерентные порты, работа через которые позволяет обойтись без инвалидации кэша. По крайней мере в baremetal это работает. есть 2 интерфейса HPC, но они оба заняты VCU Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 6 июня, 2023 Опубликовано 6 июня, 2023 · Жалоба Поделюсь, может кому пригодится... 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, ядро должно возвращать непрерывную область памяти, кэширование которой запрещено. Т.е. в ручном управлении кэшем необходимости нет. Но это видимо не так ? Буду весьма благодарен, если кто-нибудь сочтет нужным просветить меня в этих вопросах Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 234 6 июня, 2023 Опубликовано 6 июня, 2023 · Жалоба https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841683/Linux+Reserved+Memory читали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 6 июня, 2023 Опубликовано 6 июня, 2023 · Жалоба 28 minutes ago, makc said: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841683/Linux+Reserved+Memory читали? нет... мимо прошло Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 6 июня, 2023 Опубликовано 6 июня, 2023 · Жалоба 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 не обнаружено Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться