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

Altera PCI-E - как получить Bus Device Function

Есть полностью рабочий обмен на Cyclone IV GTX на чтение и запись с достаточной скоростью порядка 100 Мбайт/с. Однако есть одна проблема - пришлось захардкодить номер bus-device-function (BDF) в виде константы 16'h0200. Соответственно, если вставить такую карточку в другой слот она очевидно работать не будет. Чтобы работало в любом разъеме любого компьютера - нужно получать свой BDF динамически.

 

Из документации я вижу Configuration Space Register Access Timing. Там говорят что по фронтам на pld_clk будет инкрементироваться адрес tl_cfg_add и выводиться данные по этому адресу на шину tl_cfg_ctl. На адресе F сидит то что мне нужно: cfg_busdev[12:0].

 

reg [3:0] cfg_clock;
wire [3:0] cfg_addr;
wire [31:0] cfg_data;
initial cfg_clock = 0;

pcie_core pcie(
// ...
.pld_clk(cfg_clock[3]),
.tl_cfg_add(cfg_addr),
.tl_cfg_ctl(cfg_data),
// ...
);

reg [15:0] bdf;
initial bdf = 16'h0200;
always @(posedge core_clk_out) begin
cfg_clock <= cfg_clock + 1;
if(cfg_addr == 4'hF) bdf <= {cfg_data[12:0], 3'b0}

Вроде правильно, через делитель задается pld_clk(cfg_clock[3]) и соответственно должен инкрементиться cfg_addr. Когда он станет 4'hF я ловлю нужный bus-device, а device у меня ноль.

 

Однако через signal tap я вижу что пакеты у меня шастают с нулевым BDF и ничего не работает, кажется эта шина не работает вовсе.

 

Там ли я смотрю BDF? Есть ли способ проще, не лежит ли BDF где-то готовенький?

А может возможен обмен и вовсе с нулевым BDF?

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


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

Я поступил так, создал регистр в ПЛИС, при запуске своей проги по PCIE передаю BDF в этот регистр. Потом когда уже начинается работа с платой, ПЛИСка псылает пакеты с этим BDF.

То есть как бы ваш первый вариант, но все же перекомпилить свою программу на си проще, чем проект в квартусе. Опять же в программе с оконным интерфейсом можно сделать настроечное поле для ввода BDF.

А до шины tl_cfg_ctl так и не добрался.

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


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

Я поступил так, создал регистр в ПЛИС, при запуске своей проги по PCIE передаю BDF в этот регистр. Потом когда уже начинается работа с платой, ПЛИСка псылает пакеты с этим BDF.

То есть как бы ваш первый вариант, но все же перекомпилить свою программу на си проще, чем проект в квартусе. Опять же в программе с оконным интерфейсом можно сделать настроечное поле для ввода BDF.

А до шины tl_cfg_ctl так и не добрался.

Нет, извините, это жутчайший костыль, я на такое пойти никак не могу :)

Надеюсь на другие ответы и варианты. К слову, в Lattice (возможно и у Xilinx) BDF доступен как сигналы прямо из корки без всяких хитростей...

Я привел пример с tl_cfg_ctl - допустимо ли работать на такой поделенной частоте?

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


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

Сам же отвечу на свой вопрос. После долгих разбирательств удалось решить проблему. Просто частота pld_clk должна быть допустим 125 МГц, для pld_clk я взял core_clk_out которое вываливается из PCI-E core. Собственно вижу что теперь карточка работает в любом слоте, без костылей ввиду регистра BDF :)

 

Кто еще не сделал так, перенимайте :) Правда, глядя на тайминги в даташите, у меня есть некоторые сомнения в отсутствии метастабильностей в этом месте, что-то не так с этим pld_clk. Надо будет потом забуриться поглубже в доку.

 

upd: А вот и текст из доки: The pld_clk input clock pin is typically connected to the core_clk_out output clock pin.

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


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

А зачем надо было делить core_clk_out на 16?

 

...
.pld_clk(cfg_clock[3]),
...
always @(posedge core_clk_out) begin
cfg_clock <= cfg_clock + 1;
...

 

Вы же в этой теме https://electronix.ru/forum/index.php?showtopic=138904

выложили свой вариант подключения pcie корки, и там .pld_clk(core_clk_out).

 

Как говорится: работает - не трогай.

Вот и я свой костыль пока трогать не буду :biggrin:

 

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


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

А зачем надо было делить core_clk_out на 16?
Чисто из привычки, не люблю когда всё на максимальной частоте напрягается. Оказалось на чуть меньшей оно не работает вовсе. А то, о чем я переживал, оно само внутри частота делится и значения эти конфигурационных регистров не на 125 МГц вылезает, а на во много раз меньшей.

Вот и я свой костыль пока трогать не буду :biggrin:
Да, наверное не стоит. Хотя по факту - 5 строчек кода.

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


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

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

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

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

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

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

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

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

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

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