Board.KolibriOS.org

Official KolibriOS board
It is currently Sat Dec 14, 2019 5:08 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 10 posts ] 
Author Message
 Post subject: PCI express
PostPosted: Mon May 17, 2010 1:11 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1359
Набросал болванку нового модуля (/bus/pci/pcie.inc) расширенного конфигуратора PCI express.

Расширенное конфигурационное поле (4Кб на bdf-адрес вместо стандартного 1Кб, доступного через порты CF8-CFC) необходимо PCIe-устройствам для полноценного управления питанием, коррекции ошибок и контроля виртуального канала.

Расширенный конфигуратор будет также очень полезен и для работы с "нормальными" PCI-устройствами, позволяя непосредственно (в обход портов и BIOS32) читать и записывать cfg-регистры.

Характерная особенность расширенного конфигуратора - отображение bdf-адреса на некоторый связный диапазон адресов:

Code:
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_type/white_papers_and_tech_docs/32559.pdf, гл.4.4.
Как добраться до PCIe-конфигуратора на пнях - пока не интересовался. Может, кто подскажет?


Top
   
 Post subject: Re: PCI express
PostPosted: Tue May 18, 2010 3:04 am 
Offline
User avatar

Joined: Tue Aug 25, 2009 4:45 pm
Posts: 796
Я подскажу. Чуть позже. Не дам в обиду Интел. Быть и ему во встраиваемой KolibriOS! :)


Top
   
 Post subject: Re: PCI express
PostPosted: Tue Jun 08, 2010 6:39 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1359
xvilka
Не дождался. В svn.1487 добавил возможность ручной конфигурации адреса и размера PCIe ext config.
Code:
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 чтобы зря не долбиться.


Top
   
 Post subject: Re: PCI express
PostPosted: Wed Jun 09, 2010 7:02 pm 
Offline
User avatar

Joined: Tue Aug 25, 2009 4:45 pm
Posts: 796
вот что говорят интеловцы ftp://download.intel.com/design/intarch ... 321090.pdf

именно PCIe для всех их продуктов

P.S. сорри что так долго - проблемы не дают расслабиться ни на минуту.


Top
   
 Post subject: Re: PCI express
PostPosted: Mon Jun 28, 2010 12:26 am 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1359
Спасибо за информацию. В принципе, PCIe.inc довольно легко можно дополнить соответствующим кодом. Но у меня сейчас ни времени, ни интелов под рукой нет.
На атлонах и так всё работает... если, конечно, шина PCIe реально присутствует в системе.
Ну и если не забыли подключить модуль к сборке в kernel32.inc и вызвать его при инициализации ядра.
См. пример в branches/Kolibri-A.
Кстати, в Колибри-А весь сервис сисфункции 62 будет завязан на прямое чтение/запись через PCIe-зону, в обход старых конфигурационных портов.


Top
   
 Post subject: Re: PCI express
PostPosted: Wed Aug 11, 2010 1:33 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1359
Для реализации полноценного PCIe-сервиса приходится серьёзно копаться в регистровой модели Северного моста.
Так, в мосте AMD RS780 функции PCIe раскиданы по шести (!!) конфигурационным пространствам.

Для упрощения отладки предлагается набор утилит [svn=]kernel/branches/Kolibri-A/utilities/rs780[/svn],
который также может быть полезен для ковыряния в регистрах встроенного GPU и микроконтроллера.

Функционально все утилиты однотипны и отличаются только принципом доступа к конкретному пространству и спецификой нумерации регистров.
Просматривать регистровые поля можно страницами по 16 регистров, верхний регистр можно редактировать.
"Длинная" кнопка разбита на 32 секции, отвечающих за установку/сброс отдельных битов выбранного регистра.


Attachments:
RS780.png
RS780.png [ 77.44 KiB | Viewed 12577 times ]
Top
   
 Post subject: Re: PCI express
PostPosted: Wed Aug 11, 2010 7:37 pm 
Offline
User avatar

Joined: Tue Aug 25, 2009 4:45 pm
Posts: 796
Отличная работа!
И хорошая заготовка для других подобных утилит (например для usb)

Наверно было бы хорошо включение их в основную ветку
и назвать как-нибудь соответственно - "hwutils" или что-то в этом роде.

А что имелось ввиду под микроконтроллером? Или просто общий случай устройства?


Top
   
 Post subject: Re: PCI express
PostPosted: Wed Aug 11, 2010 9:11 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
XVilka wrote:
Отличная работа!

Согласен, замечательная работа! Работа в направлении железа идёт полным ходом.


Top
   
 Post subject: Re: PCI express
PostPosted: Wed Aug 11, 2010 9:42 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1359
:D
Надеюсь, базовый код действительно может будет кому-нибудь небесполезен в повседневной долбёжке с разным железом.
Правда, здесь доступ везде идёт через 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. Простенькое устройство, но время от времени дает сбой в линии. Интересно его отлаживать в связке с регистрами сопряжённого с ним моста (внизу справа) и базового контроллера (в центре).

_________________
Узкий специалист подобен флюсу: полнота его - односторонняя.
Козьма Прутков


Top
   
 Post subject: Re: PCI express
PostPosted: Mon Oct 11, 2010 1:02 pm 
Offline
User avatar

Joined: Tue Aug 25, 2009 4:45 pm
Posts: 796
По поводу недокументированного микроконтроллера. Для всех чипсетов выше RS700 - есть встроенный 8051-совместимый микроконтроллер со своей прошивкой внутри.

Вот прилагаю то что удалось считать с RS700


Attachments:
File comment: RS700 assembler code
imc.asm.gz [13.47 KiB]
Downloaded 143 times
Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 10 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited