PCI express

Internal structure and you change requests/suggestions
  • Я подскажу. Чуть позже. Не дам в обиду Интел. Быть и ему во встраиваемой KolibriOS! :)
  • 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 чтобы зря не долбиться.
  • вот что говорят интеловцы ftp://download.intel.com/design/intarch ... 321090.pdf

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

    P.S. сорри что так долго - проблемы не дают расслабиться ни на минуту.
  • Спасибо за информацию. В принципе, PCIe.inc довольно легко можно дополнить соответствующим кодом. Но у меня сейчас ни времени, ни интелов под рукой нет.
    На атлонах и так всё работает... если, конечно, шина PCIe реально присутствует в системе.
    Ну и если не забыли подключить модуль к сборке в kernel32.inc и вызвать его при инициализации ядра.
    См. пример в branches/Kolibri-A.
    Кстати, в Колибри-А весь сервис сисфункции 62 будет завязан на прямое чтение/запись через PCIe-зону, в обход старых конфигурационных портов.
  • Для реализации полноценного PCIe-сервиса приходится серьёзно копаться в регистровой модели Северного моста.
    Так, в мосте AMD RS780 функции PCIe раскиданы по шести (!!) конфигурационным пространствам.

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

    Функционально все утилиты однотипны и отличаются только принципом доступа к конкретному пространству и спецификой нумерации регистров.
    Просматривать регистровые поля можно страницами по 16 регистров, верхний регистр можно редактировать.
    "Длинная" кнопка разбита на 32 секции, отвечающих за установку/сброс отдельных битов выбранного регистра.
    Attachments
    RS780.png
    RS780.png (77.44 KiB)
    Viewed 16241 times
  • Отличная работа!
    И хорошая заготовка для других подобных утилит (например для usb)

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

    А что имелось ввиду под микроконтроллером? Или просто общий случай устройства?
  • XVilka wrote:Отличная работа!
    Согласен, замечательная работа! Работа в направлении железа идёт полным ходом.
  • :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. Простенькое устройство, но время от времени дает сбой в линии. Интересно его отлаживать в связке с регистрами сопряжённого с ним моста (внизу справа) и базового контроллера (в центре).
    Евангелие от Иоанна: стих 1

    Code: Select all

    ; В начале было Слово:
    B32:        mov     ax, os_stack       ; Selector for os
    [/size]
  • По поводу недокументированного микроконтроллера. Для всех чипсетов выше RS700 - есть встроенный 8051-совместимый микроконтроллер со своей прошивкой внутри.

    Вот прилагаю то что удалось считать с RS700
    Attachments
    imc.asm.gz (13.47 KiB)
    RS700 assembler code
    Downloaded 294 times
  • Who is online

    Users browsing this forum: No registered users and 19 guests