реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> PCIe Cyclone V, ошибка при чтении из BAR0
torik
сообщение May 29 2018, 10:08
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 112
Регистрация: 1-11-05
Пользователь №: 10 359



Всем привает.

Есть плата с 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 байт. От времени между чтениями не зависит.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
AVR
сообщение May 29 2018, 13:01
Сообщение #2


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 271
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Может глупость сморожу, но может там какая-то синхронизация нужна? Некий sync дернуть? Какая ОС?
Был ли опыт написания драйвера для PCI до этого?

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


--------------------
Go to the top of the page
 
+Quote Post
torik
сообщение May 29 2018, 13:05
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 112
Регистрация: 1-11-05
Пользователь №: 10 359



На компе линукс крутится. Драйвер самодельный. Раньше под виндой на windriver такого глюка не было.


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

А конкретнее, что там можно дернуть?


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение May 29 2018, 13:21
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 072
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

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

Удачи! Rob.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение May 29 2018, 13:27
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 289
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



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

А что видно на портах корки в этой время?
Go to the top of the page
 
+Quote Post
torik
сообщение May 29 2018, 13:42
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 112
Регистрация: 1-11-05
Пользователь №: 10 359



Цитата
а Вы наверное в своем драйвере пытаетесь читать байт напрямую.

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

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

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

Да, авалон, но на нем все выглядит как надо во время чтения. Даже ресет, который генерит PCIe заведен на модули к ней подключенные.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
torik
сообщение May 30 2018, 12:09
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 112
Регистрация: 1-11-05
Пользователь №: 10 359



Сделали чтение через BAR0 исключительно 64битными словами. Все равно не помогло.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
AVR
сообщение May 30 2018, 12:49
Сообщение #8


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 271
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



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

Ваш драйвер в зачаточном состоянии? Нет там ничего секретного? Тогда предлагаю его вывалить сюда напосмотреть.


--------------------
Go to the top of the page
 
+Quote Post
torik
сообщение May 30 2018, 13:46
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 112
Регистрация: 1-11-05
Пользователь №: 10 359



Во-первых - заказчик категорически против)))
Во-вторых - запаришься смотреть исходники, там очень много специфических вещей, не имеющих отношения непосредственно к обмену...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
AVR
сообщение May 30 2018, 13:51
Сообщение #10


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 271
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



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

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


--------------------
Go to the top of the page
 
+Quote Post
torik
сообщение May 30 2018, 14:00
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 112
Регистрация: 1-11-05
Пользователь №: 10 359



Цитата
Тогда совет номер 1

Попробуем.


У альтеры есть пример драйвера под линукс?


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
AVR
сообщение May 30 2018, 14:20
Сообщение #12


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 271
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



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

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


--------------------
Go to the top of the page
 
+Quote Post
torik
сообщение May 30 2018, 14:37
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 112
Регистрация: 1-11-05
Пользователь №: 10 359



Код
При загрузке драйвера:

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


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
AVR
сообщение May 31 2018, 05:41
Сообщение #14


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 271
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Нужен компилируемый пример. Пусть Vendor ID там будет исправлен на AAAA, чтоб враги не догадались.


--------------------
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение May 31 2018, 06:15
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 289
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Цитата(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

К сожалению именно с авалоновской версией корки не работал потому вряд ли что смогу по делу подсказать..
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2018 - 05:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.0095 секунд с 7
ELECTRONIX ©2004-2016