PCIe в режиме Root Complex

Здравствуйте.

Необходима работа PCIe в режиме RC. Правильно я понимаю, что:

  1. Внешняя терминация на PCI_RX не обязательна, т.к. есть внутренние терминаторы, которые можно вкючить\отключить в драйвере.
  2. По-умолчанию внутренние терминаторы выключены?
  3. PCI_REF_CLK - это вход процессора.
  4. PCI_REF_CLK имеет тип HCSL.
  5. Если использовать тактовый генератор\fanout LPHCSL, то никакие внешние терминаторы\смещение уровней для PCE_REF_CLK не нужны?
  6. CLK_REQ - это выход процессора?
  7. При наличии внешнего CLK_REQ (как, например, в SMARC) выход CLK_REQ процессора можно не использовать (никуда не подключать)?
  8. PCI_PERSTN использовать нельзя, его надо притянуть к земле, а в качестве PERST# использовать GPIO?
  9. PCI_WAKE выход процессора оставить неподключённым.
  10. если нужен PCI_WAKE сигнал (например со SMARC разъёма), то его нужно завести на GPIO.
  11. PCI_APP_LTSSM_EN можно не подключать, т.к. он имеет встроенный Pull Down.

Заранее благодарю за ответ.

Чуть отвечу
1 Не обязательна, управление через драйвер отсутствует.
2 Терминаторы включены по умолчанию.
3 Вход.
6 Выход.
7 В режиме RC не активен, можно не подключать.
8 PCI_PERSTN использовать можно, но не рекомендуется, т.к. он ещё и на контроллер зведен как сигнал сброса, поэтому лучше GPIO.
9 Выход, в режиме RC не активен, можно не подключать.
10 Да нужно, причем лучше на GPIO с прерыванием(GPIOx_PORTА).
11 Подтяжка по сбросу выключена (РП $6.3.51 Регистр CMOS_MIX_REN_CTL).

Не могли бы вы нумерацию ответов привести в соответствие с нумерацией вопросов? А то мне чего-то не сопоставить некоторые…

Подправил.

Спасибо.
4. 5. Может быть, есть данные Vil, Vih, Vcm для входов PCI_REF_CLK, USB_REF_CLK ?

  1. т.е. PCI_PERSTN - это вход в режиме RC?

Если он заведён на контроллер в качестве сброса, а рекомендуется подтянуть к земле - это не будет значить, что будет сброс всегда? Или он по перепаду срабатывает?

Если использовать GPIO, то кто и когда его будет дёргать? Драйвер? Какое именно GPIO дёргать - это настраивается или где-то жёстко привязано?

В таблице указано, что есть pull down… Хотя вы говорите, что по сбросу он выключен. Отсюда возникает вопрос - можно ли верить этим табличкам, или это единичная неточночть, или надо всё перепроверять, или лучше везде ставить внешние pu\pd?

Вообще, вход LTSSM_EN - это “разрешение начала процедуры…” - правильно будет поставить pull down, как на схеме отладки (запретить начало процедуры…), остальное сделает драйвер?

При загрузке драйверов выводы PCIx_PERSTN переводятся в “программный контроль”(см. РП $6.3.56 Регистр PCIE_PERSTn_CTL) при котором, в том числе, вывод становится выходом и начинает драйвить то что установлено в поле PCIх_PERSTn.
GPIO дёргает драйвер. Используемый GPIO задаётся через свойство “reset-gpios” в DTS платы. Вот как это на SMARC объявлено - linux/arch/arm64/boot/dts/elvees/mcom03r-elvmc03smarc-r3.0.0.dtsi at mcom03-6.6.y · elvees/linux · GitHub

Это ведь относится к выводам “блока PCIe” внутри чипа, а не внешним выводам чипа?

Т.е. по поводу PCI0_PERSTN, PCIE1_PERSTN резюме:

  1. Выводы чипа PCI0_PERSTN, PCIE1_PERSTN притянуть к земле
  2. Требуемые PERSTN0, PERSTN1 завести на любые GPIO, прописать их в DTS, драйвер, когда загрузится, будет ими дёргать

Так?

“Внешний” вывод чипа соединён с внутренним выводом блока PCIe, схема подключения была бы нагляднее чем слова, но её у меня нет. При “программном контроле” включается выходной буфер внешнего вывода PCIx_PERSTN, значение бита(PCIх_PERSTn) передаётся на выходной буфер PCIx_PERSTN, после чего сигнал с выходного буфера поступает на входной буфер вывода(он не выключаемый) и уже от туда идёт на вход сброса контроллера PCIe, надеюсь совсем не запутал.

Да.

Да, драйвер сам запускает LTSSM и не смотрит на состояние вывода.