Как AXI4 может поддерживать модель заказа производителя / потребителя PCIE?
PCIE использует модель заказа производителя / потребителя, но AXI4 использует другую модель заказа. Каналы чтения и записи AXI4 независимы.
Например, такая система,
ЦП <-> Контроллер PCIE <-> Мост PCIE AXI <-> AXI4 с ведомыми устройствами DEC и DDR (модуль DEC подключен к ведомому порту данных AXI40 и порту регистра APB, модуль памяти DDR подключен к ведомому порту данных AXI41)
CPU выполняет следующие две операции:
1.CPU writes data to DDR
2.CPU writes DEC APB register to start DEC
Поскольку записи в память PCIE (как с возможностью предварительной загрузки, так и без нее) отправляются, то есть без ответов, мост PCIE AXI Bridge будет выполнять две вышеуказанные операции последовательно с одним и тем же идентификатором, но не дожидаясь BRESP. Прежде чем данные достигнут DDR, DEC, возможно, увидела запись регистра APB и начала считывать данные, поэтому данные могут быть старыми и недействительными.
Эту проблему с порядком можно решить, записав данные и прочитав их следующим образом:
1.CPU writes data to DDR
2.CPU read the same data back
3.CPU writes DEC APB register to start DEC
Но это неэффективно.
Итак, как мы можем решить эту проблему с заказом, когда соединены PCIE и AXI4? Что лучше решить эту проблему с упорядочиванием на стороне PCIE или на стороне межсоединения AXI?
1 ответ
Когда я смотрю на драйверы устройств с кодом Linux Kennel, я вижу ту же проблему, пишите в этот регистр, а затем в этот, но как я узнаю, что первое выполнено? Во многих случаях драйвер просто прочитает либо тот же регистр, либо регистр, который должен показать побочный эффект. Например, устройства nvme могут быть сброшены посредством записи одного регистра, но вы не знаете, что операция завершена, пока чтение другого регистра не вернет определенное значение. Обратите внимание на функцию nvme_enable_ctrl, которая записывает 32 регистра, а затем сразу останавливается, пока чтение не вернет определенное значение. Поэтому я бы посоветовал следовать решениям прошлой разработки вместо того, чтобы оборачивать свое собственное решение.
https://elixir.bootlin.com/linux/latest/source/drivers/nvme/host/core.c