SysFn62/ru

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Функция 62 - пользовательский доступ к PCI.

Подфункция 0 - получить версию PCI-интерфейса.

Параметры:

  • eax = 62 - номер функции
  • bl = 0 - номер подфункции

Возвращаемое значение:

  • eax = -1 - доступ к PCI запрещён; иначе
  • ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
  • старшее слово eax обнулено

Замечания:

  • Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
  • Если PCI BIOS не поддерживается, то значение ax неопределено.

Подфункция 1 - получить номер последней PCI-шины.

Параметры:

  • eax = 62 - номер функции
  • bl = 1 - номер подфункции

Возвращаемое значение:

  • eax = -1 - доступ к PCI запрещён; иначе
  • al = номер последней PCI-шины; оставшиеся байты eax разрушаются

Замечания:

  • Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
  • Если PCI BIOS не поддерживается, то значение al неопределено.

Подфункция 2 - Получить механизм обращения к конфигурационному пространству PCI.

Параметры:

  • eax = 62 - номер функции
  • bl = 2 - номер подфункции

Возвращаемое значение:

  • eax = -1 - доступ к PCI запрещён; иначе
  • al = механизм (1 или 2); прочие байты eax разрушаются

Замечания:

  • Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
  • Механизм обращения выбирается в соответствии с характеристиками оборудования.
  • Подфункции чтения и записи автоматически работают с выбранным механизмом.

подфункции 4,5,6 - прочитать PCI-регистр.

Параметры:

  • eax = 62 - номер функции
  • bl = 4 - читать байт
  • bl = 5 - читать слово
  • bl = 6 - читать двойное слово
  • bh = номер PCI-шины
  • ch = dddddfff, где ddddd = номер устройства на шине, :fff = номер функции устройства
  • cl = номер регистра (должен быть чётным для bl=5, делиться на 4 для bl=6)

Возвращаемое значение:

  • eax = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры); иначе
  • al/ax/eax (в зависимости от запрошенного размера) содержит данные; оставшаяся часть регистра eax разрушается

Замечания:

  • Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
  • Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2.
  • Некоторые регистры стандартны и существуют для всех устройств, некоторые определяются конкретным устройством. Список первых входит, например, в известный Interrupt List by Ralf Brown ([1], [2]); список вторых должен быть указан в документации по устройству.

подфункции 8,9,10 - записать в PCI-регистр.

Параметры:

  • eax = 62 - номер функции
  • bl = 8 - писать байт
  • bl = 9 - писать слово
  • bl = 10 - писать двойное слово
  • bh = номер PCI-шины
  • ch = dddddfff, где ddddd = номер устройства на шине, :fff = номер функции устройства
  • cl = номер регистра (должен быть чётным для bl=9, делиться на 4 для bl=10)
  • dl/dx/edx (в зависимости от запрошенного размера) содержит данные для записи

Возвращаемое значение:

  • eax = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры)
  • eax = 0 - успешно

Замечания:

  • Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
  • Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2.
  • Некоторые регистры стандартны и существуют для всех устройств, некоторые определяются конкретным устройством. Список первых входит, например, в известный Interrupt List by Ralf Brown; список вторых должен быть указан в документации по устройству.

подфункция 11 - инициализировать доступ к MMIO

Параметры:

  • eax = 62 - номер функции
  • bl = 11 - номер подфункции;
  • cx = BDF-адрес PCI-устройства (Bus:8, Device:5, Function:3 = bbbbbbbb dddddfff)

Возвращаемое значение:

  • eax = -1 - доступ к PCI запрещён;
  • eax = -2 - доступ к MMIO-блокам устройства не разрешён;
  • eax = -3 - ошибка аллокации пользовательской дин. памяти; иначе
  • eax = размер доступной динамической памяти.

Замечания:

  • Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
  • В стандартном ядре значение cx (BDF-адрес устройства) должно совпадать с системной константой mmio_pci_addr.
  • В embedded-ядре параметр cx устанавливает новое значение системной переменной mmio_pci_addr.

подфункция 12 - получить линейный адрес MMIO-блока

Параметры:

  • eax = 62 - номер функции
  • bl = 12 - номер подфункции
  • bh = номер BAR-регистра в конфигурационной зоне PCI
  • ecx = размер запрашиваемого MMIO-блока (в байтах)
  • edx = смещение (в 4K-страницах!) в физическом MMIO-блоке

Возвращаемое значение:

  • eax = -1 - доступ к PCI запрещён;
  • eax = -2 - неверный номер BAR-регистра;
  • eax = -3 - BAR не содержит адреса IO;
  • eax = -4 - BAR адресует порты IO;
  • eax = -5 - ошибка аллокации; иначе
  • eax = начальный адрес MMIO в адресном пространстве приложения.

Замечания:

  • Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
  • Адрес PCI-устройства задается системной константой (в embedded-версии ядра - системной переменной) mmio_pci_addr.
  • Предоставленный диапазон линейных адресов должен освобождаться посредством вызова подфункции 13

специальная подподфункция 12-DA - получить линейный адрес статического DMA-буфера

Вызов подфункции 12 с bh=0xDA используется в embedded-версиях КолибриОС для высокоскоростной передачи данных в режиме захвата шины (Bus Master DMA).

Подробное описание функции приведено здесь.

подфункция 13 - освободить линейные адреса MMIO

Параметры:

  • eax = 62 - номер функции
  • bl = 13 - номер подфункции
  • ecx = начальный адрес освобождаемого MMIO-блока в адресном пространстве приложения

Возвращаемое значение:

  • eax = 1 - блок успешно освобожден;

Замечания:

  • Предварительно приложению должен быть выделен uMMIO-блок (подфункцией 12)