Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PCIe Cyclone V
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
torik
Всем привает.

Есть плата с Cyclone V. К плисине подключен компьютер стандарта COM Express. Плисина - endpoint. Сперва включается плисина, затем она включает комп. Все работает. Затем, если перезагружаем комп (линукс, через консоль), то после его загрузки чтение данных из BAR0 идет с ошибкой, смещение какое-то нелепое. Опять перезагрузить - ошибка может уйти, а может остаться.
Такое впечатление, что проблема в корке PCIe. Запись в BAR0 из компа проходит без ошибок. Но и при чтении смотрю шину корки PCIe, там все нормально, а комп получает другие данные!

Когда комп перезагружается, он дергает nreset для корки PCI, с нее тоже ресет выходит, но ошибка возникает.
Можно ли еще какую-то переинициализацию дли корки замутить?
Настройки PCIe корки менял на все возможные варианты, не помогает...

Описание логики ошибки:
Проводится вычитка по одному байту с двух смещений, А и В, с ожидаемыми значениями А1 и В1.
Если смещения находятся в пределах одного 64-битного слова - всё хорошо, результаты идентичны ожидаемым.
Если же нет, то:
1) вычитаем байт со смещения А тысячу раз
2) вычитаем байт со смещением А 30 раз - каждый раз получим значение А1
3) вычитаем байт со смещением В 8 раз - каждый раз получим то же значение А1
4) вычитаем байт со смещением В - получим значение В1
5) вычитаем байт со смещением В 30 раз - каждый раз получим В1
6) вычитаем байт со смещением А 8 раз - каждый раз получим то же значение В1
7) вычитаем байт со смещением А - получим значение А1
8) вычитаем байт со смещением А 30 раз - каждый раз получим А1
Итого - задержка на 8 байт. От времени между чтениями не зависит.
AVR
Может глупость сморожу, но может там какая-то синхронизация нужна? Некий sync дернуть? Какая ОС?
Был ли опыт написания драйвера для PCI до этого?

А может Linux попробовать - повторится ли ошибка? В Linux проще PCI драйвер писать, и быть может легче будет отладить...
torik
На компе линукс крутится. Драйвер самодельный. Раньше под виндой на windriver такого глюка не было.


Цитата
Некий sync дернуть?

А конкретнее, что там можно дернуть?
RobFPGA
Приветствую!

Судя по всему у Вас внутри шина данных из PCIe 64 бита (что там - Avalon?) и наверно что-что не так с логикой чтения при адресах не кратных 4 или 8. Может не сбрасывается шина корректно по ресету и остаются "старые данные" дающие сдвижку.
Ну и наверное WinDrv мог имитировать чтение байта с невыровненым адресом через чтение слова а Вы наверное в своем драйвере пытаетесь читать байт напрямую.

Удачи! Rob.
Kuzmi4
Цитата(torik @ May 29 2018, 13:08) *
...
3) вычитаем байт со смещением В 8 раз - каждый раз получим то же значение А1
...

А что видно на портах корки в этой время?
torik
Цитата
а Вы наверное в своем драйвере пытаетесь читать байт напрямую.

Да, мы читаем байты напрямую.

Цитата
Судя по всему у Вас внутри шина данных из PCIe 64 бита (что там - Avalon?)

Цитата
А что видно на портах корки в этой время?

Да, авалон, но на нем все выглядит как надо во время чтения. Даже ресет, который генерит PCIe заведен на модули к ней подключенные.
torik
Сделали чтение через BAR0 исключительно 64битными словами. Все равно не помогло.
AVR
Цитата(torik @ May 30 2018, 15:09) *
Сделали чтение через BAR0 исключительно 64битными словами. Все равно не помогло.

Ваш драйвер в зачаточном состоянии? Нет там ничего секретного? Тогда предлагаю его вывалить сюда напосмотреть.
torik
Во-первых - заказчик категорически против)))
Во-вторых - запаришься смотреть исходники, там очень много специфических вещей, не имеющих отношения непосредственно к обмену...
AVR
Цитата(torik @ May 30 2018, 16:46) *
Во-первых - заказчик категорически против)))
Во-вторых - запаришься смотреть исходники, там очень много специфических вещей, не имеющих отношения непосредственно к обмену...

Тогда совет номер 1: сделать минимальный драйвер-пример для отладки данной конкретной проблемы, и выложить его для всех. Тем более речь про такую ерунду как BARы.
torik
Цитата
Тогда совет номер 1

Попробуем.


У альтеры есть пример драйвера под линукс?
AVR
Цитата(torik @ May 30 2018, 17:00) *
У альтеры есть пример драйвера под линукс?

Причем тут альтера? Простейший драйвер для PCI он и в африке таковой, от производителя ПЛИС не зависит.
Готового примера не встречал, разве что очень устаревшее и переусложненное.
Могу мою заготовку предоставить вечером (сейчас нет возможности).
torik
Код
При загрузке драйвера:

int init_mmio(struct pci_dev* pdev, u8 __iomem **bar)
{
    int ret = -EINVAL;
    u64 resource_flags = 0;
    
    resource_flags = pci_resource_flags(pdev, BAR_OFFSET);
    dev_info(&pdev->dev, "pci_resource_flags: 0x%llX", resource_flags);
    if (!(resource_flags & IORESOURCE_MEM)) {
        dev_err(&pdev->dev, "No IORESOURCE_MEM");
        goto error;
    }
    
    ret = pci_request_regions(pdev, "electronix_sample");
    if (ret != 0) {
        dev_err(&pdev->dev, "pci_request_regions failed");
        goto error;
    }
    
    *bar = pcim_iomap(pdev, BAR_OFFSET, BAR_SIZE);
    if (!*bar) {
        dev_err(&pdev->dev, "pcim_iomap failed");
        goto pci_release_regions;
    }
    dev_info(&pdev->dev, "init_mmio succeed");
    return 0;
    
pci_release_regions:
    pci_release_regions(pdev);
error:
    return ret;
}

При выгрузке драйвера:
    pci_release_regions();
    pci_disable_device();
    devres_release_group();

Чтение данных:
    readb(bar[offset]);
    readw(bar[offset]);
    readl(bar[offset]);
    readq(bar[offset]);

pci_resource_flags возвращает:
    IORESOURCE_MEM_64
    IORESOURCE_SIZEALIGN
    IORESOURCE_PREFETCH
    IORESOURCE_MEM
AVR
Нужен компилируемый пример. Пусть Vendor ID там будет исправлен на AAAA, чтоб враги не догадались.
Kuzmi4
Цитата(torik @ May 30 2018, 17:00) *
... пример драйвера под линукс?

Вот примеры от Xilinx:
AR#65444: Xilinx PCI Express DMA Drivers and Software Guide

Что касается именно Altera - вот нашёл:
https://github.com/a4a881d4/sgdma-pcie-driver-demo
На сколько я понял это "4.2.1 Linux Driver" отсюда :
PCI Express in Qsys Example Designs

К сожалению именно с авалоновской версией корки не работал потому вряд ли что смогу по делу подсказать..
RobFPGA
Приветствую!
Цитата(AVR @ May 30 2018, 17:20) *
Причем тут альтера? Простейший драйвер для PCI он и в африке таковой, от производителя ПЛИС не зависит.
...

Вот именно - драйвер скорее все тут ни при чем - так как судя по описанию тут проблемы в железе . Он просто проявил эти проблемы.

Единица обмена по PCIe слово в 4 байта. Если нужно читать/писать байт то используются маски положения этого байта относительно слова с выровненным адресом. То-же и на шине Avalon.
У меня опыт с Avalon пока не велик - но из того что помню там есть рад нюансов (как по мне неприятно-неожиданных) связанных с тем как шина сконфигурирована - одни и тот же набор сигналов шины может вести себя по разному. И поэтому может быть что при чтении одного не выровненного байта на шине Avalon проходит несколько транзакций. Тут по хорошему надо бы на симе с PCIe посмотреть все это - погонять различные транзакции. Ну или прилепив сигналтап на выход Avalon c PCIe и смотреть на живом железе что и как.

Удачи! Rob.
torik
Цитата
Нужен компилируемый пример.

Можно конечно запариться, но что толку - не работает когда перезагружаешь комп при включенной плате, кто это будет повторять.

И еще такое наблюдение: та же самая ошибка происходит, если плата с плисиной не просто перезагружает комп, а отключает и включает ему питание.
Т.е. ломается что-то внутри IP PCIe. И как ее сбросить, починить не понятно.

Цитата
Единица обмена по PCIe слово в 4 байта. Если нужно читать/писать байт то используются маски положения этого байта относительно слова с выровненным адресом. То-же и на шине Avalon.
У меня опыт с Avalon пока не велик - но из того что помню там есть рад нюансов (как по мне неприятно-неожиданных) связанных с тем как шина сконфигурирована - одни и тот же набор сигналов шины может вести себя по разному. И поэтому может быть что при чтении одного не выровненного байта на шине Avalon проходит несколько транзакций. Тут по хорошему надо бы на симе с PCIe посмотреть все это - погонять различные транзакции. Ну или прилепив сигналтап на выход Avalon c PCIe и смотреть на живом железе что и как.

Сигналтаб прикручен именно к Avalon c PCIe. И когда комп читает, на шине все отлично, а вот комп получает другое значение. Попробовали чтение исключительно словами 64 бит - ошибка сохраняется.

И кстати, когда работали с windriver под виндой таких проблем вообще не возникало.
AVR
Цитата(torik @ May 31 2018, 10:48) *
Можно конечно запариться, но что толку - не работает когда перезагружаешь комп при включенной плате, кто это будет повторять. И кстати, когда работали с windriver под виндой таких проблем вообще не возникало.

Раз под виндой проблемы нет - значит железо 100% верное. И дело в драйвере. А Вы не хотите его показывать (урезанный пример). Что значит "кто будет повторять" - мы посмотрим полный код драйвера примера и поймем что не так.
RobFPGA
Приветствую!
Цитата(torik @ May 31 2018, 10:48) *
Т.е. ломается что-то внутри IP PCIe. И как ее сбросить, починить не понятно.
А после перегрузки компа PCIe устройство по новой инициализируете? При этом все нормально проходит?

Цитата(torik @ May 31 2018, 10:48) *
Сигналтаб прикручен именно к Avalon c PCIe. И когда комп читает, на шине все отлично, а вот комп получает другое значение.
Сложно из далека судить по критерию "на шине все отлично". Если все так отлично на Avalon то прикрутите сигналтап дальше по иерархии непосредственно на вход/выход транзакций с логического уровня PCIe и смотрите сырые транзакции там. И сравнивайте что при этом входит и выходит на Avalon.

Цитата(torik @ May 31 2018, 10:48) *
Попробовали чтение исключительно словами 64 бит - ошибка сохраняется.
И кстати, когда работали с windriver под виндой таких проблем вообще не возникало.
Что в винде что в Linux CPU выполняет чтение отмапленой в BAR памяти одинаково.
Если разное поведение при перезагрузке - то значит получается неодинаковые/неполные процедуры инициализации PCIe устройства, при неправильной реализации логики сброса устройства при холодном (после Power on) и теплом старте (только reset PCie) FPGA.

В любом случае гадать без конкретики на гуще (кофейной ли ?) тяжко, а делать на коленке свой проект PCIe на Cyclone V лениво. rolleyes.gif

Удачи! Rob.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.