SysFn62/ru: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
mNo edit summary
(sysfn 62: extended version)
Line 4: Line 4:


''Параметры:''
''Параметры:''
* eax = 62 - номер функции
* eax = 62 - номер функции
* bl = 0 - номер подфункции
* bl = 0 - номер подфункции


''Возвращаемое значение:''
''Возвращаемое значение:''
* eax = -1 - доступ к PCI запрещён; иначе
* eax = -1 - доступ к PCI запрещён; иначе
* ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
* ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
Line 15: Line 13:


''Замечания:''
''Замечания:''
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
* Если PCI BIOS не поддерживается, то значение ax неопределено.
* Если PCI BIOS не поддерживается, то значение ax неопределено.
Line 22: Line 19:


''Параметры:''
''Параметры:''
* 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 функции 21.
* Если PCI BIOS не поддерживается, то значение al неопределено.
* Если PCI BIOS не поддерживается, то значение al неопределено.
Line 39: Line 33:


''Параметры:''
''Параметры:''
* 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 функции 21.
* Механизм обращения выбирается в соответствии с характеристиками оборудования.
* Механизм обращения выбирается в соответствии с характеристиками оборудования.
Line 57: Line 48:


''Параметры:''
''Параметры:''
* eax = 62 - номер функции
* eax = 62 - номер функции
* bl = 4 - читать байт
* bl = 4 - читать байт
Line 63: Line 53:
* bl = 6 - читать двойное слово
* bl = 6 - читать двойное слово
* bh = номер PCI-шины
* bh = номер PCI-шины
* ch = dddddfff, где ddddd = номер устройства на шине,
* ch = dddddfff, где ddddd = номер устройства на шине, :fff = номер функции устройства
: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 функции 21.
* Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2.
* Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2.
Line 81: Line 68:


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


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


''Замечания:''
''Замечания:''
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
* Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2.
* Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2.
Line 108: Line 91:


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


''Возвращаемое значение:''
''Возвращаемое значение:''
* eax = -1 - доступ к PCI запрещён;  
* eax = -1 - доступ к PCI запрещён;  
* eax = -2 - доступ к MMIO-блокам устройства не разрешён;  
* eax = -2 - доступ к MMIO-блокам устройства не разрешён;  
Line 121: Line 102:


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


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


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


''Возвращаемое значение:''
''Возвращаемое значение:''
* eax = -1 - доступ к PCI запрещён;  
* eax = -1 - доступ к PCI запрещён;  
* eax = -2 - неверный номер BAR-регистра;  
* eax = -2 - неверный номер BAR-регистра;  
Line 145: Line 124:


''Замечания:''
''Замечания:''
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
* Адрес PCI-устройства задается системной константой (в embedded-версии ядра - системной ''переменной'') mmio_pci_addr.
* Предоставленный диапазон линейных адресов должен освобождаться посредством вызова подфункции 13
==== специальная подподфункция 12-DA - получить линейный адрес статического DMA-буфера ====
Вызов подфункции 12 с bh=0xDA используется в [[EmbeddedKOS/ru|embedded]]-версиях КолибриОС для тестирования высокоскоростных PCI-устройств в режиме прямого доступа к памяти (DMA).
Поскольку для PCI-устройств нет единого, четко определенного стандарта DMA-операций, программист предварительно должен обеспечить контроль и организацию режимов захвата системной шины в соответствии с техническим описанием и регистровой моделью конкретного устройства.
В частности, регистр DMA-адреса ''устройства'' должен указывать на блок адресов в пределах системной области STATIC_DMA_BUFFER. 
Данная подподфункция открывает доступ ''приложению'' к этой области.


* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21.
---
* Адрес PCI-устройства задается системной переменной mmio_pci_addr.
 
* Предоставленный диапазон линейных адресов должен освобождаться посредством вызова функции 62:13
''Параметры:''
* eax = 62 - номер функции
* bx  = 0xDA0C - номер под+подфункции
* ecx = размер запрашиваемого DMA-блока (в байтах)
* edx = смещение (в 4K-страницах!) относительно начала системной области STATIC_DMA_BUFFER
 
''Возвращаемое значение:''
* eax = -1 - доступ к PCI запрещён;
* eax = -2 - пользовательский ПДП не поддерживается в этой версии ядра;
* eax = -3 - недопустимое смещение (попытка доступа к "закрытой" странице ядерной памяти);
* eax = -4 - недопустимый размер блока (пересекает верхнюю границу области STATIC_DMA_BUFFER);
* eax = -5 - ошибка аллокации; иначе
* eax = начальный адрес DMA-блока в адресном пространстве приложения.
 
''Замечания:''
* Пользовательский ПДП-сервис используется исключительно для отладки драйверов новых устройств и не включен в стандартное ядро KolibriOS.
* Предоставленный диапазон линейных адресов должен освобождаться посредством вызова подфункции 13


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


''Параметры:''
''Параметры:''
* eax = 62 - номер функции
* eax = 62 - номер функции
* bl  = 13 - номер подфункции
* bl  = 13 - номер подфункции
Line 159: Line 165:


''Возвращаемое значение:''
''Возвращаемое значение:''
* eax = 1 - блок успешно освобожден;  
* eax = 1 - блок успешно освобожден;  


''Замечания:''
''Замечания:''
 
* Предварительно приложению должен быть выделен uMMIO-блок (подфункцией 12)
* Предварительно приложению должен быть выделен uMMIO-блок (fn62:12)


{{System_functions}}
{{System_functions}}
[[Category: SysCalls]]
[[Category: SysCalls]]

Revision as of 14:22, 11 April 2010

Функция 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-версиях КолибриОС для тестирования высокоскоростных PCI-устройств в режиме прямого доступа к памяти (DMA).

Поскольку для PCI-устройств нет единого, четко определенного стандарта DMA-операций, программист предварительно должен обеспечить контроль и организацию режимов захвата системной шины в соответствии с техническим описанием и регистровой моделью конкретного устройства.

В частности, регистр DMA-адреса устройства должен указывать на блок адресов в пределах системной области STATIC_DMA_BUFFER. Данная подподфункция открывает доступ приложению к этой области.

---

Параметры:

  • eax = 62 - номер функции
  • bx = 0xDA0C - номер под+подфункции
  • ecx = размер запрашиваемого DMA-блока (в байтах)
  • edx = смещение (в 4K-страницах!) относительно начала системной области STATIC_DMA_BUFFER

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

  • eax = -1 - доступ к PCI запрещён;
  • eax = -2 - пользовательский ПДП не поддерживается в этой версии ядра;
  • eax = -3 - недопустимое смещение (попытка доступа к "закрытой" странице ядерной памяти);
  • eax = -4 - недопустимый размер блока (пересекает верхнюю границу области STATIC_DMA_BUFFER);
  • eax = -5 - ошибка аллокации; иначе
  • eax = начальный адрес DMA-блока в адресном пространстве приложения.

Замечания:

  • Пользовательский ПДП-сервис используется исключительно для отладки драйверов новых устройств и не включен в стандартное ядро KolibriOS.
  • Предоставленный диапазон линейных адресов должен освобождаться посредством вызова подфункции 13

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

Параметры:

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

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

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

Замечания:

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