SysFn62/ru: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
|||
(13 intermediate revisions by 3 users not shown) | |||
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 [[SysFn21/ru|функции 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 [[SysFn21/ru|функции 21]]. | |||
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. | |||
* Если PCI BIOS не поддерживается, то значение al неопределено. | * Если PCI BIOS не поддерживается, то значение al неопределено. | ||
=== Подфункция 2 - Получить механизм обращения к конфигурационному пространству PCI. === | === Подфункция 2 - Получить механизм обращения к конфигурационному пространству PCI. === | ||
Параметры: | ''Параметры:'' | ||
* eax = 62 - номер функции | |||
* bl = 2 - номер подфункции | |||
Возвращаемое значение: | |||
''Возвращаемое значение:'' | |||
* eax = -1 - доступ к PCI запрещён; иначе | |||
* al = механизм (1 или 2); прочие байты eax разрушаются | |||
''Замечания:'' | |||
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 [[SysFn21/ru|функции 21]]. | |||
* Механизм обращения выбирается в соответствии с характеристиками оборудования. | |||
* Подфункции чтения и записи автоматически работают с выбранным механизмом. | |||
=== подфункции 4,5,6 - прочитать PCI-регистр. === | === подфункции 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 [[SysFn21/ru|функции 21]]. | |||
* Механизм доступа 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/]); список вторых должен быть указан в документации по устройству. | |||
=== подфункции 8,9,10 - записать в PCI-регистр. === | === подфункции 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 [[SysFn21/ru|функции 21]]. | |||
Замечания: | * Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2. | ||
* Некоторые регистры стандартны и существуют для всех устройств, некоторые определяются конкретным устройством. Список первых входит, например, в известный Interrupt List by Ralf Brown; список вторых должен быть указан в документации по устройству. | |||
---- | |||
=== подфункция 11 - инициализировать доступ к MMIO === | === подфункция 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 [[SysFn21/ru|функции 21]]. | |||
* В стандартном ядре значение cx (BDF-адрес устройства) должно совпадать с системной ''константой'' mmio_pci_addr. | |||
* В embedded-ядре параметр cx устанавливает новое значение системной ''переменной'' mmio_pci_addr. | |||
=== подфункция 12 - получить линейный адрес MMIO-блока === | === подфункция 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 [[SysFn21/ru|функции 21]]. | |||
* Адрес PCI-устройства задается системной константой (в embedded-версии ядра - системной ''переменной'') mmio_pci_addr. | |||
* Предоставленный диапазон линейных адресов должен освобождаться посредством вызова подфункции 13 | |||
==== специальная подподфункция 12-DA - получить линейный адрес статического DMA-буфера ==== | |||
Вызов подфункции 12 с bh=0xDA используется в [[EmbeddedKOS/ru|embedded]]-версиях КолибриОС для высокоскоростной передачи данных в режиме захвата шины (Bus Master DMA). | |||
Подробное описание функции приведено [[SubFn62-DA/ru|здесь]]. | |||
=== подфункция 13 - освободить линейные адреса MMIO === | === подфункция 13 - освободить линейные адреса MMIO === | ||
Параметры: | ''Параметры:'' | ||
* eax = 62 - номер функции | |||