Page 1 of 1
PCI express
Posted: Mon May 17, 2010 1:11 pm
by art_zh
Набросал болванку нового модуля (/bus/pci/pcie.inc) расширенного конфигуратора
PCI express.
Расширенное конфигурационное поле (4Кб на bdf-адрес вместо стандартного 1Кб, доступного через порты CF8-CFC) необходимо PCIe-устройствам для полноценного управления питанием, коррекции ошибок и контроля виртуального канала.
Расширенный конфигуратор будет также очень полезен и для работы с "нормальными" PCI-устройствами, позволяя непосредственно (в обход портов и BIOS32) читать и записывать cfg-регистры.
Характерная особенность расширенного конфигуратора - отображение bdf-адреса на некоторый связный диапазон адресов:
Code: Select all
bits[27:20] = bus; (only 2-3 LSbits actually used in most desktop systems)
bits[19:15] = device;
bits[14:12] = function;
bits[11: 8] = extended register number; (PCIe/PCIX only)
bits[ 7: 2] = register number;
bits[ 1: 0] = used to generate Byte Enables
В линейном адресном пространстве Колибри эти адреса маппятся на блок PCIe_CONFIG_SPACE.
Реальная RAM-память при этом не используется, поскольку весь диапазон изначально находится в MMIO-пространстве физических адресов.
Линейное пространство PCIe_CONFIG_SPACE выровнено по 4М-границе и в
предварительной (туповатой, но вполне безопасной) версии маппится двумя "большими" PDE-страницами, что достаточно для работы с восемью PCI-шинами (bus# 0..7). Потом доработаю "чистый" маппинг, сейчас дел невпроворот.
NB: Я попытался реализовать
непосредственное чтение адреса конфигуратора,
в обход заморочек ACPI. На реальных атлонах этот способ работает, в эмуляторе (VBox) - нет.
Сейчас
pci_ext_config привязана к AMD архитектуре, явно используя регистры контроля HT-канала (fn 0.18:1) - см.
http://www.amd.com/us-en/assets/content ... /32559.pdf, гл.4.4.
Как добраться до PCIe-конфигуратора на пнях - пока не интересовался. Может, кто подскажет?
Re: PCI express
Posted: Tue May 18, 2010 3:04 am
by XVilka
Я подскажу. Чуть позже. Не дам в обиду Интел. Быть и ему во встраиваемой KolibriOS!

Re: PCI express
Posted: Tue Jun 08, 2010 6:39 pm
by art_zh
xvilka
Не дождался. В svn.1487 добавил возможность ручной конфигурации адреса и размера PCIe ext config.
Code: Select all
mmio_pcie_cfg_addr dd 0xD0000000 ; not defined by default
mmio_pcie_cfg_lim dd 0xD05FFFFF ; 1 bus needs 1Mb
В соответствии со стандартами PCI-SIG, 32-битный базовый адрес должен быть выровнен по
очень крутой границе 0x10000000 и иметь размер ровно 0x10000000 байт на каждый хост (256 шин, по мегабайту на шину).
В реальных системах физический размер PCIe-пространства гораздо скромнее (в лаптопах 2-3 шины, в бюджетных десктопах 6-8, на крутых серверах 8-16 шин), но все производители так или иначе обязаны придерживаться этого стандарта. Мне пока что встречались три варианта конфигурации: 0xF0000000, 0xD0000000 и 0xE0000000. См. sysinfo чтобы зря не долбиться.
Re: PCI express
Posted: Wed Jun 09, 2010 7:02 pm
by XVilka
вот что говорят интеловцы
ftp://download.intel.com/design/intarch ... 321090.pdf
именно PCIe для всех их продуктов
P.S. сорри что так долго - проблемы не дают расслабиться ни на минуту.
Re: PCI express
Posted: Mon Jun 28, 2010 12:26 am
by art_zh
Спасибо за информацию. В принципе, PCIe.inc довольно легко можно дополнить соответствующим кодом. Но у меня сейчас ни времени, ни интелов под рукой нет.
На атлонах и так всё работает... если, конечно, шина PCIe реально присутствует в системе.
Ну и если не забыли подключить модуль к сборке в kernel32.inc и вызвать его при инициализации ядра.
См. пример в branches/Kolibri-A.
Кстати, в Колибри-А весь сервис сисфункции 62 будет завязан на прямое чтение/запись через PCIe-зону, в обход старых конфигурационных портов.
Re: PCI express
Posted: Wed Aug 11, 2010 1:33 pm
by art_zh
Для реализации полноценного PCIe-сервиса приходится серьёзно копаться в регистровой модели Северного моста.
Так, в мосте AMD RS780 функции PCIe раскиданы по шести (!!) конфигурационным пространствам.
Для упрощения отладки предлагается набор утилит [svn=]kernel/branches/Kolibri-A/utilities/rs780[/svn],
который также может быть полезен для ковыряния в регистрах встроенного GPU и микроконтроллера.
Функционально все утилиты однотипны и отличаются только принципом доступа к конкретному пространству и спецификой нумерации регистров.
Просматривать регистровые поля можно страницами по 16 регистров, верхний регистр можно редактировать.
"Длинная" кнопка разбита на 32 секции, отвечающих за установку/сброс отдельных битов выбранного регистра.
Re: PCI express
Posted: Wed Aug 11, 2010 7:37 pm
by XVilka
Отличная работа!
И хорошая заготовка для других подобных утилит (например для usb)
Наверно было бы хорошо включение их в основную ветку
и назвать как-нибудь соответственно - "hwutils" или что-то в этом роде.
А что имелось ввиду под микроконтроллером? Или просто общий случай устройства?
Re: PCI express
Posted: Wed Aug 11, 2010 9:11 pm
by Asper
XVilka wrote:Отличная работа!
Согласен, замечательная работа! Работа в направлении железа идёт полным ходом.
Re: PCI express
Posted: Wed Aug 11, 2010 9:42 pm
by art_zh
Надеюсь, базовый код действительно может будет кому-нибудь небесполезен в повседневной долбёжке с разным железом.
Правда, здесь доступ везде идёт через pcie-адреса, да ещё и с привязкой к конкретному Мосту.
XVilka wrote:Наверно было бы хорошо включение их в основную ветку и назвать как-нибудь соответственно - "hwutils" или что-то в этом роде.
На другом железе будут свои особенные заморочки; на старых платформах придется читать конфигурационные регистры через функцию 62. К тому же официальное ядро сейчас позволяет работать только с одним устройством.
Так что в транк включать нет смысла: всё равно каждый будет перекраивать код под свою задачу. В ветке /Kolibri-A программы на своем месте:
1) они заточены под базовый чипсет и могут быть реально полезны другим разработчикам этой ветки;
2) только в этом ядре приложение может (на свой страх и риск) напрямую работать с
несколькими устройствами и менять
любой регистр в конфигспейсе. В транке такие вещи совершенно недопустимы.
XVilka wrote:А что имелось ввиду под микроконтроллером? Или просто общий случай устройства?
В состав RS780 входят несколько устройств, каждое из которых имеет по крайней мере одно конфигурационное пространство. Это два GPU, четыре P2P-шины (PCIe, HT, A-Link), контроллер DDR2/3-памяти, ACPI, ФАПЧ-генераторы, и еще какой-то недокументированный микроконтроллер, доступ к которому производится через регистры bdf0.0.0: 0x70/74.
А "общий случай" внешнего PCIe-устройства - в верхнем правом углу (XLX_TST.ASM). Типичный эндпойнт, в данном случае нестандартный видеограббер на FPGA. Простенькое устройство, но время от времени дает сбой в линии. Интересно его отлаживать в связке с регистрами сопряжённого с ним моста (внизу справа) и базового контроллера (в центре).
Re: PCI express
Posted: Mon Oct 11, 2010 1:02 pm
by XVilka
По поводу недокументированного микроконтроллера. Для всех чипсетов выше RS700 - есть встроенный 8051-совместимый микроконтроллер со своей прошивкой внутри.
Вот прилагаю то что удалось считать с RS700