1891ВМ12Я 0 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба 21 minutes ago, makc said: Распишите в удобоваримом для человека виде отправляемый TLP в виде массива 32-битных значений, чтобы можно было удобно читать и сверять со стандартом и давайте разбираться с ним device->mrd_drv = dma_alloc_coherent(&device->pci->dev, 1024, &device->mrd_fpga, GFP_DMA); dev_info(&device->pci->dev, "mrd drv= 0x%016llX, fpga= 0x%016llX !\n", device->mrd_drv, device->mrd_fpga); writel(device->mrd_fpga, device->mmio + 0x6A0); writel(0, device->mmio + 0x6A4); writel(0x05000020, device->mmio + 0x6A8); writel(0x000000CC, device->mmio + 0x6AC); Вот что я отсылаю: превое слово адрес, второе нули (32 битное), затем третье с BDF и 32 слова DW, в конце tag СС. Остальное нули. Нули же означают тип запроса MRd Младшие биты адреса точно нулевые, но там же AT (address type), но оно 00: Address in the request is untranslated - верно? Далее адрес 30 бит, второе DW там нули, хотя запрос поддерживает 64 битную адресацию. На этой же системе в обход порта эти 32 битные адреса работают как надо. BDF - точно верный, хоть задаю вручную, но совпадает с lspci (в боевой прошивке через драйвер это задаю). Word count 0x20 - это 32 слова или 128 байт. Далее Req Type 0000 Memory Read Request. Poisoned 0 Про tag не ясно, но я пробовал и счетчик, чтобы не совпадали. Completer ID = 0-0-0, ведь рут всегда ноль? Или вот тут как раз и ошибка, что какие то мосты понимают что ноль это до рута, а какие то нет? Requester ID Enable у меня ноль, но может для этого моста надо именно указать requester id иначе оно не найдет обратную дорогу по BDF устройства??? В первых постах этой темы я отметил что у меня это ноль. Начинаю догадываться что это причина Далее нулевые TC (transaction class) и Attr, почитал пока не вижу тут потенциальной проблемы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба 20 минут назад, 1891ВМ12Я сказал: Младшие биты адреса точно нулевые, но там же AT (address type), но оно 00: Address in the request is untranslated - верно? Да. 20 минут назад, 1891ВМ12Я сказал: BDF - точно верный, хоть задаю вручную, но совпадает с lspci (в боевой прошивке через драйвер это задаю). Word count 0x20 - это 32 слова или 128 байт. Далее Req Type 0000 Memory Read Request. Poisoned 0 BDF нет смысла задавать, т.к. судя по документации если Requester ID Enable == 1'b0, то "IP uses Bus and Device numbers captured from received Configuration requests and the client supplies Function numbers in the descriptor to be populated as the Requester ID field in the TLP header." 22 минуты назад, 1891ВМ12Я сказал: Про tag не ясно, но я пробовал и счетчик, чтобы не совпадали. 0 должно быть хорошо. 22 минуты назад, 1891ВМ12Я сказал: Completer ID = 0-0-0, ведь рут всегда ноль? "This field is applicable only to Configuration requests and messages routed by ID. " - это не ваш случай, поэтому нули. 25 минут назад, 1891ВМ12Я сказал: Requester ID Enable у меня ноль, но может для этого моста надо именно указать requester id иначе оно не найдет обратную дорогу по BDF устройства??? В первых постах этой темы я отметил что у меня это ноль. Начинаю догадываться что это причина Нет, дело не в этом, т.к. для Endpoint mode и должен быть 0 - данные маршрутизации будут браться из конфигурационного пространства вашего устройства (см. выше). Вы привели данные, которые должны попадать на вход PCIe EP. Но что в действительности проходит через AXI вы смотрели в анализаторе? Вот это бы и хотелось увидеть, чтобы делать выводы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба 15 minutes ago, makc said: Вы привели данные, которые должны попадать на вход PCIe EP. Но что в действительности проходит через AXI вы смотрели в анализаторе? Вот это бы и хотелось увидеть, чтобы делать выводы. То есть приведенный мной MRd запрос всё же не содержит ошибок? Эти слова на AXI загоняются так: 201: if(s_axis_rq_tready == 4'b1111) begin state <= 202; mrd_tag <= mrd_tag + 1; if(use_raw) begin s_axis_rq_tdata <= mrd_raw[127:0]; end else begin ... end s_axis_rq_tuser <= {4'b0, 4'b0}; s_axis_rq_tkeep <= 8'h0F; s_axis_rq_tvalid <= 1; s_axis_rq_tlast <= 1; m_axis_rc_tready <= 1; end 202: begin if(s_axis_rq_tready == 4'b1111) begin s_axis_rq_tuser <= 0; // i60 s_axis_rq_tkeep <= 8'h00; s_axis_rq_tvalid <= 0; s_axis_rq_tlast <= 0; s_axis_rq_tdata <= 0; end Ждем что ready и снимаем данные и флаги. mrd_raw это 4 DW которые пишутся из драйвера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба 8 минут назад, 1891ВМ12Я сказал: s_axis_rq_tuser <= {4'b0, 4'b0}; Вот эта строчка вызывает у меня большие сомнения, по-моему там должно быть {4'hF, 4'hF} или вроде того, т.к. это задаёт Byte Enable для формирования заголовка TLP на шине. См. картинку ниже и далее текст стандарта: А у вас получается, что вы хотите передать в первом и последнем слове приблизительно ничего. Похоже мосту это не нравится. 😉 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба 24 minutes ago, makc said: А у вас получается, что вы хотите передать в первом и последнем слове приблизительно ничего. Похоже мосту это не нравится. 😉 Ох, там еще пишут "The valid bytes in the first and last Dwords of the data block to be read must be indicated using first_be[3:0] and last_be[3:0], respectively". Там выше я писал что это тоже подозреваю но почему то подумал что это относится конкретно к этому запросу, а не ответу. Но не подумал что ведь именно читающий должен хотеть наложить маску на слова которые читаются. Немедленно ставлю выпекать новую прошу! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба 14 минут назад, 1891ВМ12Я сказал: Ох, там еще пишут "The valid bytes in the first and last Dwords of the data block to be read must be indicated using first_be[3:0] and last_be[3:0], respectively". Там выше я писал что это тоже подозреваю но почему то подумал что это относится конкретно к этому запросу, а не ответу. Но не подумал что ведь именно читающий должен хотеть наложить маску на слова которые читаются. Немедленно ставлю выпекать новую прошу! Да, нужно аккуратно формировать эти BE, т.к. некоторые их сочетания дают совершенно неожиданные результаты. 🤦♂️ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба Just now, makc said: Да, нужно аккуратно формировать эти BE, т.к. некоторые их сочетания дают совершенно неожиданные результаты. 🤦♂️ Я просто считал что это относится к данному конкретному TLP, а раз у меня запрос на чтение, без данных, то нет последующих слов, а значит не следует говорить что у запроса без данных есть какие то данные. Во всех других местах у меня эти first last byte enable корректные. И не вспомнил я балбес про картинку, не подумал что ядру надо как то понимать как заполнить эти поля, откуда то брать это... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба 11 часов назад, 1891ВМ12Я сказал: Немедленно ставлю выпекать новую прошу! Испеклась? Заработало? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 31 марта, 2023 Опубликовано 31 марта, 2023 · Жалоба 12 hours ago, makc said: Испеклась? Заработало? Только что проверил! Да, действительно заработало через PCI-E Switch! Данная проблема ушла. Благодарю всех за помощь и советы! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться