Difference between revisions of "SysFn62/ru"

From KolibriOS wiki
Jump to navigation Jump to search
Line 1: Line 1:
'''Функция 62 - пользовательский доступ к PCI.
+
'''Функция 62''' - пользовательский доступ к PCI.
  
 
=== Подфункция 0 - получить версию PCI-интерфейса. ===
 
=== Подфункция 0 - получить версию PCI-интерфейса. ===
  
 
''Параметры:''
 
''Параметры:''
* eax = 62 - номер функции
+
:* eax = 62 - номер функции
* bl = 0 - номер подфункции
+
:* bl = 0 - номер подфункции
  
 
''Возвращаемое значение:''
 
''Возвращаемое значение:''
* eax = -1 - доступ к PCI запрещён; иначе
+
:* eax = -1 - доступ к PCI запрещён; иначе
* ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
+
:* ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
* старшее слово eax обнулено
+
:* старшее слово eax обнулено
  
 
''Замечания:''
 
''Замечания:''
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
+
:* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 [[SysFn21/ru|функции 21]].
* Если PCI BIOS не поддерживается, то значение ax неопределено.
+
:* Если PCI BIOS не поддерживается, то значение ax неопределено.
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_PCI (62)
 +
::ebx - SSF_GET_VERSION (0)
  
 
=== Подфункция 1 - получить номер последней PCI-шины. ===
 
=== Подфункция 1 - получить номер последней PCI-шины. ===
  
 
''Параметры:''
 
''Параметры:''
* eax = 62 - номер функции
+
:* eax = 62 - номер функции
* bl = 1 - номер подфункции
+
:* bl = 1 - номер подфункции
  
 
''Возвращаемое значение:''
 
''Возвращаемое значение:''
* eax = -1 - доступ к PCI запрещён; иначе
+
:* eax = -1 - доступ к PCI запрещён; иначе
* al = номер последней PCI-шины; оставшиеся байты eax разрушаются
+
:* al = номер последней PCI-шины; оставшиеся байты eax разрушаются
  
 
''Замечания:''
 
''Замечания:''
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
+
:* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 [[SysFn21/ru|функции 21]].
* Если PCI BIOS не поддерживается, то значение al неопределено.
+
:* Если PCI BIOS не поддерживается, то значение al неопределено.
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_PCI (62)
 +
::ebx - SSF_GET_LAST_BUS (1)
  
 
=== Подфункция 2 - Получить механизм обращения к конфигурационному пространству PCI. ===
 
=== Подфункция 2 - Получить механизм обращения к конфигурационному пространству PCI. ===
  
 
''Параметры:''
 
''Параметры:''
* eax = 62 - номер функции
+
:* eax = 62 - номер функции
* bl = 2 - номер подфункции
+
:* bl = 2 - номер подфункции
  
 
''Возвращаемое значение:''
 
''Возвращаемое значение:''
* eax = -1 - доступ к PCI запрещён; иначе
+
:* eax = -1 - доступ к PCI запрещён; иначе
* al = механизм (1 или 2); прочие байты eax разрушаются
+
:* al = механизм (1 или 2); прочие байты eax разрушаются
  
 
''Замечания:''
 
''Замечания:''
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
+
:* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 [[SysFn21/ru|функции 21]].
* Механизм обращения выбирается в соответствии с характеристиками оборудования.
+
:* Механизм обращения выбирается в соответствии с характеристиками оборудования.
* Подфункции чтения и записи автоматически работают с выбранным механизмом.
+
:* Подфункции чтения и записи автоматически работают с выбранным механизмом.
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_PCI (62)
 +
::ebx - SSF_GET_ADRR_MODE (2)
  
 
=== подфункции 4,5,6 - прочитать PCI-регистр. ===
 
=== подфункции 4,5,6 - прочитать PCI-регистр. ===
  
 
''Параметры:''
 
''Параметры:''
* eax = 62 - номер функции
+
:* eax = 62 - номер функции
* bl = 4 - читать байт
+
:* bl = 4 - читать байт
* bl = 5 - читать слово
+
:* bl = 5 - читать слово
* bl = 6 - читать двойное слово
+
:* bl = 6 - читать двойное слово
* bh = номер PCI-шины
+
:* bh = номер PCI-шины
* ch = dddddfff, где ddddd = номер устройства на шине, :fff = номер функции устройства
+
:* ch = dddddfff, где ddddd = номер устройства на шине, :fff = номер функции устройства
* cl = номер регистра (должен быть чётным для bl=5, делиться на 4 для bl=6)
+
:* cl = номер регистра (должен быть чётным для bl=5, делиться на 4 для bl=6)
  
 
''Возвращаемое значение:''
 
''Возвращаемое значение:''
* eax = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры); иначе
+
:* eax = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры); иначе
* al/ax/eax (в зависимости от запрошенного размера) содержит данные; оставшаяся часть регистра eax разрушается
+
:* al/ax/eax (в зависимости от запрошенного размера) содержит данные; оставшаяся часть регистра eax разрушается
  
 
''Замечания:''
 
''Замечания:''
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
+
:* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 [[SysFn21/ru|функции 21]].
* Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2.
+
:* Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2.
* Некоторые регистры стандартны и существуют для всех устройств, некоторые определяются конкретным устройством. Список первых входит, например, в известный Interrupt List by Ralf Brown ([http://www.pobox.com/~ralf/files.html], [ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/]); список вторых должен быть указан в документации по устройству.
+
:* Некоторые регистры стандартны и существуют для всех устройств, некоторые определяются конкретным устройством. Список первых входит, например, в известный Interrupt List by Ralf Brown ([http://www.pobox.com/~ralf/files.html], [ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/]); список вторых должен быть указан в документации по устройству.
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_PCI (62)
 +
::ebx - SSF_READ_BYTE (4), SSF_READ_WORD (5), SSF_READ_DWORD (6)
  
 
=== подфункции 8,9,10 - записать в PCI-регистр. ===
 
=== подфункции 8,9,10 - записать в PCI-регистр. ===
  
 
''Параметры:''
 
''Параметры:''
* eax = 62 - номер функции
+
:* eax = 62 - номер функции
* bl = 8 - писать байт
+
:* bl = 8 - писать байт
* bl = 9 - писать слово
+
:* bl = 9 - писать слово
* bl = 10 - писать двойное слово
+
:* bl = 10 - писать двойное слово
* bh = номер PCI-шины
+
:* bh = номер PCI-шины
* ch = dddddfff, где ddddd = номер устройства на шине, :fff = номер функции устройства
+
:* ch = dddddfff, где ddddd = номер устройства на шине, :fff = номер функции устройства
* cl = номер регистра (должен быть чётным для bl=9, делиться на 4 для bl=10)
+
:* cl = номер регистра (должен быть чётным для bl=9, делиться на 4 для bl=10)
* dl/dx/edx (в зависимости от запрошенного размера) содержит данные для записи
+
:* 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 = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры)
* eax = -2 - доступ к MMIO-блокам устройства не разрешён;
+
:* eax = 0 - успешно
* eax = -3 - ошибка аллокации пользовательской дин. памяти; иначе
 
* eax = размер доступной динамической памяти.
 
  
 
''Замечания:''
 
''Замечания:''
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
+
:* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 [[SysFn21/ru|функции 21]].
* В стандартном ядре значение cx (BDF-адрес устройства) должно совпадать с системной ''константой'' mmio_pci_addr.
+
:* Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2.
* В embedded-ядре параметр cx устанавливает новое значение системной ''переменной'' mmio_pci_addr.
+
:* Некоторые регистры стандартны и существуют для всех устройств, некоторые определяются конкретным устройством. Список первых входит, например, в известный Interrupt List by Ralf Brown; список вторых должен быть указан в документации по устройству.
  
=== подфункция 12 - получить линейный адрес MMIO-блока ===
+
'''Константы для регистров:'''
 
+
::eax - SF_PCI (62)
''Параметры:''
+
::ebx - SSF_WRITE_BYTE (8), SSF_WRITE_WORD (9), SSF_WRITE_DWORD (10)
* 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 используется в [[EmbeddedKOS/ru|embedded]]-версиях КолибриОС для высокоскоростной передачи данных в режиме захвата шины (Bus Master DMA).
 
 
Подробное описание функции приведено [[SubFn62-DA/ru|здесь]].
 
 
 
=== подфункция 13 - освободить линейные адреса MMIO ===
 
 
 
''Параметры:''
 
* eax = 62 - номер функции
 
* bl  = 13 - номер подфункции
 
* ecx = начальный адрес освобождаемого MMIO-блока в адресном пространстве приложения
 
 
 
''Возвращаемое значение:''
 
* eax = 1 - блок успешно освобожден;
 
 
 
''Замечания:''
 
* Предварительно приложению должен быть выделен uMMIO-блок (подфункцией 12)
 
  
 
{{System_functions}}
 
{{System_functions}}
 
[[Category: SysCalls]]
 
[[Category: SysCalls]]

Revision as of 13:42, 18 January 2016

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

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

Параметры:

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

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

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

Замечания:

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

Константы для регистров:

eax - SF_PCI (62)
ebx - SSF_GET_VERSION (0)

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

Параметры:

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

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

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

Замечания:

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

Константы для регистров:

eax - SF_PCI (62)
ebx - SSF_GET_LAST_BUS (1)

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

Параметры:

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

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

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

Замечания:

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

Константы для регистров:

eax - SF_PCI (62)
ebx - SSF_GET_ADRR_MODE (2)

подфункции 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]); список вторых должен быть указан в документации по устройству.

Константы для регистров:

eax - SF_PCI (62)
ebx - SSF_READ_BYTE (4), SSF_READ_WORD (5), SSF_READ_DWORD (6)

подфункции 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; список вторых должен быть указан в документации по устройству.

Константы для регистров:

eax - SF_PCI (62)
ebx - SSF_WRITE_BYTE (8), SSF_WRITE_WORD (9), SSF_WRITE_DWORD (10)