diff --git a/kernel/trunk/bus/pci/pci32.inc b/kernel/trunk/bus/pci/pci32.inc index a479b6125e..d2dc6be9fc 100644 --- a/kernel/trunk/bus/pci/pci32.inc +++ b/kernel/trunk/bus/pci/pci32.inc @@ -431,18 +431,21 @@ align 4 pci_mmio_map: and edx,0x0ffff cmp ah,6 - jc @f + jc .bar_0_5 + jz .bar_rom mov eax,-2 ret -@@: +.bar_rom: + mov ah, 8 ; bar6 = Expansion ROM base address +.bar_0_5: push ecx add ebx, 4095 and ebx,-4096 push ebx - mov bl, ah ; bl = BAR# (0..5) + mov bl, ah ; bl = BAR# (0..5), however bl=8 for BAR6 shl bl, 1 shl bl, 1 - add bl, 0x10 ; bl = BARs offset in PCI config. space + add bl, 0x10 ; now bl = BAR offset in PCI config. space mov ax,word [mmio_pci_addr] mov bh, al ; bh = dddddfff mov al, 2 ; al : DW to read diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index a07697c316..38824ce6e9 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -3289,6 +3289,63 @@ IPC входит, например, в известный Interrupt List by Ralf Brown; список вторых должен быть указан в документации по устройству. +====================================================================== +====================== Функция 62, подфункция 11 ===================== +== Инициализировать пользовательский В/В с отображением на память == +====================================================================== +Параметры: + * eax = 62 - номер функции + * bl = 11 - номер подфункции + * cx = адрес PCI-устройства +Возвращаемое значение: + * eax = -1 - доступ к PCI запрещён; + * eax = -2 - доступ к MMIO-блокам устройства не разрешён; + * eax = -3 - ошибка аллокации пользовательской дин. памяти; иначе + * eax = размер доступной динамической памяти. +Замечания: + * Предварительно должен быть разрешён низкоуровневый доступ к PCI + для приложений подфункцией 12 функции 21. + * адрес PCI-устройства должен совпадать с системной переменной + mmio_pci_addr + +====================================================================== +====================== Функция 62, подфункция 12 ===================== +== Выделить диапазон линейных адресов для пользовательского MMIO == +====================================================================== +Параметры: + * eax = 62 - номер функции + * bl = 12 - номер подфункции + * bh = номер BAR-регистра в конфигурационной зоне PCI + * ecx = размер MMIO-блока (в байтах) + * edx = смещение относительно начала MMIO-блока (в 4K-страницах!) +Возвращаемое значение: + * eax = -1 - доступ к PCI запрещён; + * eax = -2 - неверный номер BAR-регистра; + * eax = -3 - BAR не содержит адреса IO; + * eax = -4 - BAR адресует порты IO; + * eax = -5 - ошибка аллокации; иначе + * eax = начальный адрес MMIO в адресном пространстве приложения. +Замечания: + * Предварительно должен быть разрешён низкоуровневый доступ к PCI + для приложений подфункцией 12 функции 21. + * Адрес PCI-устройства задается системной переменной mmio_pci_addr. + * Предоставленный диапазон линейных адресов должен освобождаться + посредством вызова функции 62:13 + +====================================================================== +====================== Функция 62, подфункция 13 ===================== +== Освободить диапазон линейных адресов пользовательского MMIO == +====================================================================== +Параметры: + * eax = 62 - номер функции + * bl = 12 - номер подфункции + * ecx = начальный адрес освобождаемого MMIO-блока в адресном + пространстве приложения +Возвращаемое значение: + * eax = 1 - блок успешно освобожден; +Замечания: + * Предварительно приложению должен быть выделен uMMIO-блок (fn62:12) + ====================================================================== ================ Функция 63 - работа с доской отладки. =============== ====================================================================== diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 19e2f2b1a7..0348513bbb 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -3260,6 +3260,59 @@ Remarks: Ralf Brown; registers of the second type must be listed in the device documentation. +====================================================================== +===================== Function 62, subfunction 11 ==================== +== Initialize user-accessible MMIO channel == +====================================================================== +Parameters: + * eax = 62 - function + * bl = 11 - subfunction + * cx = PCI-address (bbbbbbbb dddddfff) +Returns: + * eax = -1 - PCI access not granted; + * eax = -2 - no user MMIO access to this PCI address; + * eax = -3 - memory allocation error; otherwise + * eax = available user heap size. +Remarks: + * Low-level PCI access must be allowed (fn21:12) + * PCI-address should correspond the system var [mmio_pci_addr] + +====================================================================== +===================== Function 62, subfunction 12 ==================== +== Request user-accessible MMIO address space == +====================================================================== +Parameters: + * eax = 62 - function + * bl = 12 - subfunction + * bh = BAR number in PCI configuration space + * ecx = MMIO-block size needed (bytes) + * edx = MMIO-offset (number of whole 4Kb-pages!) +Returns: + * eax = -1 - user PCI access denied; + * eax = -2 - invalid BAR number; + * eax = -3 - BAR contains no valid IO addres; + * eax = -4 - BAR addresses IO ports; + * eax = -5 - dynamic allocation error; otherwise + * eax = MMIO start address (in application's linear space). +Remarks: + * Low-level PCI access must be allowed (fn21:12) + * The system var [mmio_pci_addr] sets the actual PCI-address + * The granted MMIO addresses should be released after use (fn62:13) + +====================================================================== +===================== Function 62, subfunction 13 ==================== +== Release a block of user MMIO addresses == +====================================================================== +Параметры: + * eax = 62 - function + * bl = 12 - subfunction + * ecx = MMIO start address (in application's linear space). +Returns: + * eax = 1 if the block is successfully released; + * eax = 0 in case of reallocation error; +Remarks: + * A valid uMMIO block should exist at this address (fn62:12) + ====================================================================== ============== Function 63 - work with the debug board. ============== ====================================================================== diff --git a/programs/system/pcidev/trunk/PCIDEV.ASM b/programs/system/pcidev/trunk/PCIDEV.ASM index 8462297359..6d9f7fdc48 100644 --- a/programs/system/pcidev/trunk/PCIDEV.ASM +++ b/programs/system/pcidev/trunk/PCIDEV.ASM @@ -473,11 +473,19 @@ Try_MMIO: mcall 4 jmp mmio_next_bar @@: + cmp bh, '6' ; expansion ROM ? + je @f mov [bar_ram+3], bh mov ebx, [gr_pos] mov edx, bar_ram mcall 4 + jump mmio_dump +@@: + mov ebx, [gr_pos] + mov edx, bar_rom + mcall 4 +mmio_dump: mov edx, eax mov esi, 64 mov ecx, 0x099 ; dump color : blue @@ -490,7 +498,7 @@ Try_MMIO: mmio_next_bar: mov bh, [MMIO_BAR] inc bh - cmp bh,6 + cmp bh,7 je @f mov [MMIO_BAR], bh add [gr_pos], 10 @@ -529,7 +537,7 @@ PCIWin mls \ bar_ram db 'BARx: MMIO block', 0 bar_io db 'BARx: IO ports',0 bar_um db 'BARx: unmapped',0 -bar_rom db 'BAR6: Onboard ROM', 0 ; << no ROM test yet +bar_rom db 'BAR6: Expansion ROM', 0 ;------------------------------------------------------------------ ; UNINITIALIZED DATA AREA