SysFn62/ru: Difference between revisions
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. | ||
* адрес | * В стандартном ядре значение 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 = смещение | * 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. | |||
Данная подподфункция открывает доступ ''приложению'' к этой области. | |||
* | --- | ||
* | |||
* Предоставленный диапазон линейных адресов должен освобождаться посредством вызова | ''Параметры:'' | ||
* 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-блок ( | |||
{{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)
|