forked from KolibriOS/kolibrios
sound.asm: patch BIOS bug for ICH0
add USE_IRQ_REMAP conditional directive git-svn-id: svn://kolibrios.org@566 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
d2d9121bbf
commit
5ddaca390b
@ -519,7 +519,7 @@ align 4
|
|||||||
;èñïîëüçîâàíèÿ. Îøèáêà
|
;èñïîëüçîâàíèÿ. Îøèáêà
|
||||||
.alloc:
|
.alloc:
|
||||||
call alloc_page
|
call alloc_page
|
||||||
and eax, eax
|
test eax, eax
|
||||||
jz .fail
|
jz .fail
|
||||||
|
|
||||||
stdcall map_page,[ebp-4],eax,dword PG_UW
|
stdcall map_page,[ebp-4],eax,dword PG_UW
|
||||||
@ -563,7 +563,7 @@ align 4
|
|||||||
; copy-on-write protection
|
; copy-on-write protection
|
||||||
|
|
||||||
call alloc_page
|
call alloc_page
|
||||||
and eax, eax
|
test eax, eax
|
||||||
jz .fail
|
jz .fail
|
||||||
|
|
||||||
push eax
|
push eax
|
||||||
@ -787,7 +787,6 @@ proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
|
|||||||
jz .no_ipc_area
|
jz .no_ipc_area
|
||||||
|
|
||||||
mov ebx, edi
|
mov ebx, edi
|
||||||
; add edi, new_app_base
|
|
||||||
and ebx, 0xFFF
|
and ebx, 0xFFF
|
||||||
mov [dst_offset], ebx
|
mov [dst_offset], ebx
|
||||||
|
|
||||||
@ -812,9 +811,8 @@ proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
|
|||||||
cmp dword [edi], 0
|
cmp dword [edi], 0
|
||||||
jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now
|
jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now
|
||||||
|
|
||||||
mov ebx, dword [edi+4]
|
mov edx, dword [edi+4]
|
||||||
mov edx, ebx
|
lea ebx, [edx+8]
|
||||||
add ebx, 8
|
|
||||||
add ebx, [msg_size]
|
add ebx, [msg_size]
|
||||||
cmp ebx, [buf_size]
|
cmp ebx, [buf_size]
|
||||||
ja .buffer_overflow ;esi<0 - not enough memory in buffer
|
ja .buffer_overflow ;esi<0 - not enough memory in buffer
|
||||||
@ -1138,7 +1136,7 @@ proc create_ring_buffer stdcall, size:dword, flags:dword
|
|||||||
mov edi, [buf_ptr]
|
mov edi, [buf_ptr]
|
||||||
mov ebx, [buf_ptr]
|
mov ebx, [buf_ptr]
|
||||||
mov edx, ecx
|
mov edx, ecx
|
||||||
shl edx, 2
|
shl edx, 2
|
||||||
shr edi, 10
|
shr edi, 10
|
||||||
@@:
|
@@:
|
||||||
mov [page_tabs+edi], eax
|
mov [page_tabs+edi], eax
|
||||||
@ -1147,7 +1145,7 @@ proc create_ring_buffer stdcall, size:dword, flags:dword
|
|||||||
invlpg [ebx+esi]
|
invlpg [ebx+esi]
|
||||||
add eax, 0x1000
|
add eax, 0x1000
|
||||||
add ebx, 0x1000
|
add ebx, 0x1000
|
||||||
add edi, 4
|
add edi, 4
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz @B
|
jnz @B
|
||||||
|
|
||||||
|
@ -47,10 +47,15 @@ iglobal
|
|||||||
dd except_16, e17,e18, except_19
|
dd except_16, e17,e18, except_19
|
||||||
times 12 dd unknown_interrupt
|
times 12 dd unknown_interrupt
|
||||||
|
|
||||||
dd irq0 , irq_serv.irq_1, p_irq2 , p_irq3 ;irq_serv.irq_3
|
dd irq0, irq_serv.irq_1, p_irq2
|
||||||
dd p_irq4 ,irq_serv.irq_5,p_irq6,irq_serv.irq_7
|
if USE_COM_IRQ
|
||||||
dd irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10
|
dd irq_serv.irq_3, irq_serv.irq_4
|
||||||
dd irq_serv.irq_11,irq_serv.irq_12,irqD ,p_irq14,p_irq15
|
else
|
||||||
|
dd p_irq3, p_irq4
|
||||||
|
end if
|
||||||
|
dd irq_serv.irq_5, p_irq6, irq_serv.irq_7
|
||||||
|
dd irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10
|
||||||
|
dd irq_serv.irq_11, irq_serv.irq_12,irqD ,p_irq14,p_irq15
|
||||||
|
|
||||||
times 16 dd unknown_interrupt
|
times 16 dd unknown_interrupt
|
||||||
|
|
||||||
|
@ -13,18 +13,24 @@ include 'imports.inc'
|
|||||||
|
|
||||||
API_VERSION equ 0x01000100
|
API_VERSION equ 0x01000100
|
||||||
|
|
||||||
DEBUG equ 1
|
DEBUG equ 1
|
||||||
|
DEBUG_IRQ equ 0
|
||||||
|
|
||||||
|
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
|
||||||
|
IRQ_REMAP equ 0
|
||||||
|
IRQ_LINE equ 0
|
||||||
|
|
||||||
REMAP_IRQ equ 0
|
|
||||||
IRQ_LINE equ 0
|
|
||||||
|
|
||||||
;irq 0,1,2,8,12,13 íåäîñòóïíû
|
;irq 0,1,2,8,12,13 íåäîñòóïíû
|
||||||
; FEDCBA9876543210
|
; FEDCBA9876543210
|
||||||
VALID_IRQ equ 1100111011111000b
|
VALID_IRQ equ 1100111011111000b
|
||||||
ATTCH_IRQ equ 0000111010100000b
|
ATTCH_IRQ equ 0000111010100000b
|
||||||
|
|
||||||
|
if USE_COM_IRQ
|
||||||
|
ATTCH_IRQ equ 0000111010111000b
|
||||||
|
end if
|
||||||
|
|
||||||
CPU_FREQ equ 2600d
|
CPU_FREQ equ 2600d
|
||||||
|
|
||||||
BIT0 EQU 0x00000001
|
BIT0 EQU 0x00000001
|
||||||
BIT1 EQU 0x00000002
|
BIT1 EQU 0x00000002
|
||||||
@ -314,11 +320,6 @@ proc START stdcall, state:dword
|
|||||||
test eax, eax
|
test eax, eax
|
||||||
jz .fail
|
jz .fail
|
||||||
|
|
||||||
; if DEBUG
|
|
||||||
; mov esi, msgInitCodec
|
|
||||||
; call SysMsgBoardStr
|
|
||||||
; end if
|
|
||||||
|
|
||||||
call init_codec
|
call init_codec
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .fail
|
jz .fail
|
||||||
@ -328,17 +329,38 @@ proc START stdcall, state:dword
|
|||||||
|
|
||||||
mov esi, msgPrimBuff
|
mov esi, msgPrimBuff
|
||||||
call SysMsgBoardStr
|
call SysMsgBoardStr
|
||||||
|
|
||||||
call create_primary_buff
|
call create_primary_buff
|
||||||
|
mov esi, msgDone
|
||||||
|
call SysMsgBoardStr
|
||||||
|
|
||||||
if REMAP_IRQ
|
if IRQ_REMAP
|
||||||
|
pushf
|
||||||
|
cli
|
||||||
|
|
||||||
; call get_LPC_bus ;ïðîâåðêà íà èíòåëëîâñêèé ÷èïñåò
|
mov ebx, [ctrl.int_line]
|
||||||
; cmp eax, -1 ;ìîæíî ïðîïóñòèòü
|
in al, 0xA1
|
||||||
; jz .fail
|
mov ah, al
|
||||||
mov [lpc_bus], 0 ;eax
|
in al, 0x21
|
||||||
call remap_irq
|
test ebx, ebx
|
||||||
end if
|
jz .skip
|
||||||
|
bts ax, bx
|
||||||
|
.skip
|
||||||
|
bts ax, IRQ_LINE
|
||||||
|
out 0x21, al
|
||||||
|
mov al, ah
|
||||||
|
out 0xA1, al
|
||||||
|
|
||||||
|
stdcall PciWrite8, 0, 0xF8, 0x61, IRQ_LINE
|
||||||
|
|
||||||
|
mov dx, 0x4d0
|
||||||
|
in al, dx
|
||||||
|
bts ax, IRQ_LINE
|
||||||
|
out dx, al
|
||||||
|
mov [ctrl.int_line], IRQ_LINE
|
||||||
|
popf
|
||||||
|
mov esi, msgRemap
|
||||||
|
call SysMsgBoardStr
|
||||||
|
end if
|
||||||
|
|
||||||
mov eax, VALID_IRQ
|
mov eax, VALID_IRQ
|
||||||
mov ebx, [ctrl.int_line]
|
mov ebx, [ctrl.int_line]
|
||||||
@ -450,32 +472,13 @@ restore inp_size
|
|||||||
restore output
|
restore output
|
||||||
restore out_size
|
restore out_size
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc remap_irq ;for Intel chipsets ONLY !!!
|
|
||||||
mov eax, VALID_IRQ
|
|
||||||
bt eax, IRQ_LINE
|
|
||||||
jnc .exit
|
|
||||||
|
|
||||||
mov edx, 0x4D0
|
|
||||||
in ax,dx
|
|
||||||
bts ax, IRQ_LINE
|
|
||||||
out dx, aX
|
|
||||||
|
|
||||||
stdcall PciWrite8, dword 0, dword 0xF8, dword 0x61, dword IRQ_LINE
|
|
||||||
mov [ctrl.int_line], IRQ_LINE
|
|
||||||
|
|
||||||
.exit:
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc ac97_irq
|
proc ac97_irq
|
||||||
|
|
||||||
; if DEBUG
|
if DEBUG_IRQ
|
||||||
; mov esi, msgIRQ
|
mov esi, msgIRQ
|
||||||
; call SysMsgBoardStr
|
call SysMsgBoardStr
|
||||||
; end if
|
end if
|
||||||
|
|
||||||
mov edx, PCM_OUT_CR_REG
|
mov edx, PCM_OUT_CR_REG
|
||||||
mov al, 0x10; 0x10
|
mov al, 0x10; 0x10
|
||||||
@ -685,45 +688,6 @@ proc detect_controller
|
|||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
|
||||||
proc get_LPC_bus ;for Intel chipsets ONLY !!!
|
|
||||||
locals
|
|
||||||
last_bus dd ?
|
|
||||||
bus dd ?
|
|
||||||
endl
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
mov [bus], eax
|
|
||||||
inc eax
|
|
||||||
call PciApi
|
|
||||||
cmp eax, -1
|
|
||||||
je .err
|
|
||||||
|
|
||||||
mov [last_bus], eax
|
|
||||||
.next_bus:
|
|
||||||
stdcall PciRead32, [bus], dword 0xF8, dword 0
|
|
||||||
test eax, eax
|
|
||||||
jz .next
|
|
||||||
cmp eax, -1
|
|
||||||
je .next
|
|
||||||
|
|
||||||
cmp eax, 0x24D08086
|
|
||||||
je .found
|
|
||||||
.next:
|
|
||||||
mov eax, [bus]
|
|
||||||
inc eax
|
|
||||||
cmp eax, [last_bus]
|
|
||||||
mov [bus], eax
|
|
||||||
jna .next_bus
|
|
||||||
.err:
|
|
||||||
xor eax, eax
|
|
||||||
dec eax
|
|
||||||
ret
|
|
||||||
.found:
|
|
||||||
mov eax, [bus]
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc init_controller
|
proc init_controller
|
||||||
|
|
||||||
@ -785,8 +749,24 @@ proc init_controller
|
|||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
call SysMsgBoardStr
|
||||||
|
|
||||||
|
;;patch for some ugly BIOS
|
||||||
|
cmp [ctrl.vendor], VID_INTEL
|
||||||
|
jne .default
|
||||||
|
|
||||||
|
mov esi, msgIrqMap
|
||||||
|
call SysMsgBoardStr
|
||||||
|
stdcall PciRead8, 0, 0xF8, 0x61
|
||||||
|
and eax, 0xFF
|
||||||
|
call dword2str
|
||||||
|
call SysMsgBoardStr
|
||||||
|
btr eax, 7 ;when bit 7 set remap disabled
|
||||||
|
jnc @F
|
||||||
|
xor eax, eax
|
||||||
|
jmp @F
|
||||||
|
.default:
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
|
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
|
@@:
|
||||||
mov [ctrl.int_line], eax
|
mov [ctrl.int_line], eax
|
||||||
|
|
||||||
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41
|
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41
|
||||||
@ -1466,10 +1446,13 @@ msgInvIRQ db 'IRQ line not assigned or invalid', 13,10, 0
|
|||||||
msgPlay db 'start play', 13,10,0
|
msgPlay db 'start play', 13,10,0
|
||||||
msgStop db 'stop play', 13,10,0
|
msgStop db 'stop play', 13,10,0
|
||||||
;msgNotify db 'call notify',13,10,0
|
;msgNotify db 'call notify',13,10,0
|
||||||
;msgIRQ db 'AC97 IRQ', 13,10,0
|
msgIRQ db 'AC97 IRQ', 13,10,0
|
||||||
msgInitCtrl db 'init controller',13,10,0
|
msgInitCtrl db 'init controller',13,10,0
|
||||||
;msgInitCodec db 'init codec',13,10,0
|
;msgInitCodec db 'init codec',13,10,0
|
||||||
msgPrimBuff db 'create primary buffer',13,10,0
|
msgPrimBuff db 'create primary buffer ...',0
|
||||||
|
msgDone db 'done',13,10,0
|
||||||
|
msgRemap db 'Remap IRQ',13,10,0
|
||||||
|
msgIrqMap db 'irq remap ',0
|
||||||
;msgReg db 'set service handler',13,10,0
|
;msgReg db 'set service handler',13,10,0
|
||||||
msgOk db 'service installed',13,10,0
|
msgOk db 'service installed',13,10,0
|
||||||
msgCold db 'cold reset',13,10,0
|
msgCold db 'cold reset',13,10,0
|
||||||
|
@ -57,6 +57,8 @@ include 'macros.inc'
|
|||||||
|
|
||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
|
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
|
||||||
|
|
||||||
include "proc32.inc"
|
include "proc32.inc"
|
||||||
include "kglobals.inc"
|
include "kglobals.inc"
|
||||||
include "lang.inc"
|
include "lang.inc"
|
||||||
|
Loading…
Reference in New Issue
Block a user