📄 pmupost.asm
字号:
test al,80h
jnz short @F ;No
xor al, al ;all mode disable
@@:
ret
CT_PMU_TIMER_STATUS Endp
;[]========================================================================[]
;Procedure: Ct_PM_Final_Init
;
;Function : PM initialization before boot
;
;Input : None
;
;Output : None
;
;Registers: Please preserve all registers
;
;Note : 1. Call from POST 82
; 2. Stack available
;[]========================================================================[]
Public Ct_PM_Final_Init
Ct_PM_Final_Init Proc Near
ifdef Move_F000_PMU_INIT_To_E000
Post_Func_Call E000_Ct_PM_Final_Init
else; Move_F000_PMU_INIT_To_E000
ifdef Have_Conserve_Item
mov si,offset Conserve_Mode_Item
call GetItem_Value
mov bl,al
shl bl,4
else; Have_Conserve_Item
xor bl,bl
endif; Have_Conserve_Item
mov cx,VT586_ACPI + 53h
call Get_Set_PMU_OR
mov cl, 30h
call Set_PMIO_Clear
;R67 mov ah,0 ; Clear Y-M-D Alarm Setting.
mov al,32h ;R67 Set ACPI Century Field
call Get_Cmos ;R67 to the year of Now !
mov ah,al ;R67
mov al,7fh ;
call Set_Cmos ;
xchg al,ah ; Clear M-D Alarm Setting.
mov al,7eh ;
call Set_Cmos ;
xchg al,ah ;
mov al,7dh ;
call Set_Cmos ;
ifdef Disable_ExtSMI_SW_In_POST
mov cl, 01h ; Clear Power Buttom Status
call Get_PMIO ;
call Set_PMIO ;
Post_Func_call Delay_About_1_Second
mov cl, 01h ;
call Get_PMIO ;
call Set_PMIO ;
mov cl, 03h ; Enable Power Buttom
mov bl, 01h ;
call Get_Set_PMIO_OR ;
endif; Disable_ExtSMI_SW_In_POST
;R01A - starts
ifdef VT596
IFDEF Thermal_Enable
mov cx,VT586_ACPI + 4ch
;R08 mov bl,70h
;R08 call E000_Get_Set_PMU_OR
mov bl,0D0h ;R08
call Get_Set_PMU_OR ;R08
ifndef Thermal_Active_By_High ;R08
mov cl,2ch ;R08
mov bl,40h ;R08
call Get_Set_PMIO_OR ;R08
endif; Thermal_Active_By_High ;R08
ENDIF;Thermal_Enable
endif; VT596
;R01A - ends
endif; Move_F000_PMU_INIT_To_E000
ret
Ct_PM_Final_Init Endp
;[]========================================================================[]
;Procedure: Ct_PM_Init
;
;Function : Special PM init which the standard code can't do
;
;Input : DS = DGROUP
; ES = PM_RAM
;
;Output : None
;
;Note : 1. Call from POST 79S (PM initialization)
; 2. Stack available
; 3. Don't destroy any SEGMENT registers!
;[]========================================================================[]
ASSUME ES:PM_RAM
ASSUME DS:DGROUP
Public Ct_PM_Init
Ct_PM_Init Proc Near
ifdef Move_F000_PMU_INIT_To_E000
Post_Func_Call E000_Ct_Pm_Init
else; Move_F000_PMU_INIT_To_E000
pusha
push ds
push es
pop ds
;--------------- Set 32bit Timer for ACPI ------------------------
;R39 mov cx, VT586_ACPI + 41h
;R39 mov bl, 08h
;R39 call Get_Set_PMU_OR
mov si, offset DGROUP:Alarm_Item
call GetItem_Value ;get setup setting
mov bl,al
mov si, offset DGROUP:PWRBTN_OVRD_Item
call GetItem_Value ;get setup setting
shl al,1
or bl,al
mov PM_RAM:[ALARM_RESUME], bl
mov si, offset DGROUP:Ring_Item ; Set Ring Resume
call GetItem_Value ; By Setup Item
mov bh,al ;R32
shl al,3
or PM_RAM:[ALARM_RESUME], al
ifndef VT596 ;R32
mov cl, 27h
mov bl,not 04h
call Get_Set_PMIO_AND
else; VT596 ;R32
mov cl, 25h ;R32
mov bl,not 01h ;R32
call Get_Set_PMIO ;R32
endif; VT596 ;R32
ifdef Set_APM_According_PM_Setup
call PM_Option_Check ; If PM set Disable
jc short @f ; No, Jmp !
or byte ptr PM_RAM:[ALARM_RESUME],80h ; Set Flag to be PM Disable ?
@@:
endif; Set_APM_According_PM_Setup
ifdef ABIT_Have_Suspend_Fan_Item
mov si, offset DGROUP:Fan_Item
call GetItem_Value
shl al,2
or PM_RAM:[ALARM_RESUME], al
endif; ABIT_Have_Suspend_Fan_Item
;--------------- Save miscellaneous setup settings ---------------
mov si,offset DGROUP:Doze_Timer_Item
mov di,offset PM_RAM:DOZE_TIME
;R62 start
call Timer_Transfer
mov si,offset DGROUP:Susp_Timer_Item
mov di,offset PM_RAM:SUSPEND_TIME
call Timer_Transfer
;R62 end
;R62 mov cx,2
;R62
;R62 Prg_Next_Item:
;R62
;R62 call GetItem_Value ;get setup setting
;R62 xor ah,ah
;R62 shl ax,1
;R62 mov bx,offset Timer_Value ;value table
;R62 add bx,ax ;translate
;R62 mov ax,cs:[bx] ;into reg. value
;R62 mov es:[di],ax ;save value in PM_RAM
;R62
;R62 add si,ITEM_SIZE
;R62 inc di
;R62 inc di
;R62 loop short Prg_Next_Item
mov ax,PM_RAM:[DOZE_Time]
mov PM_RAM:[Doze_Setting],ax
mov ax,PM_RAM:[SUSPEND_TIME]
mov PM_RAM:[Suspend_Setting],ax
;Primary/Secondary Setting
;R62 mov si,offset DGROUP:IRQ3_Event_Item
;R62 mov cx,13
;R62 xor bx, bx
;R62 xor dx,dx
;R62 set_pri:
;R62 call GetItem_Value
;R62 or bl, al
;R62 and bl, 11111101b
;R62 shr al, 1
;R62 or dl, al
;R62 pri:
;R62 add si, ITEM_SIZE
;R62 ror bx, 1
;R62 ror dx, 1
;R62 loop set_pri
;R62 start
mov di,offset DGROUP:IRQ_Evnt_TBL
mov cx,IRQ_Evnt_TBL_Len
xor bx, bx
xor dx,dx
set_pri:
mov si,word ptr CS:[DI]
push di
call GetItem_Value
pop di
or bl, al
and bl, 11111101b
shr al, 1
or dl, al
pri:
add di, 2
ror bx, 1
ror dx, 1
loop short set_pri
;R62 end
test byte ptr FLOPPY_TYPE[bp],0ffH ; no floppy installed ?
jnz short Fdd_Attach
and bl,NOT 01000000b ;disable IRQ6 primary event
Fdd_Attach:
;R23A ifdef Cover_Garbage_IRQ12 ;R23 - starts
;R23A test bh,10h
;R23A jz short W_IRQ12_Dis
;R23A or PM_RAM:[ALARM_RESUME], 80h ;Wake Event IRQ12 Enabled.
;R23A and bh,not 10h
;R23A W_IRQ12_Dis:
;R23A endif; Cover_Garbage_IRQ12 ;R23 - ends
ifdef VT686 ;R52A
or bl,00000010b ;R52A Always Enable IRQ1(Keyboard Event).
endif; VT686 ;R52A
push dx
mov cx, VT586_ACPI + 44h
mov al, bl
call Set_PMU
mov cx, VT586_ACPI + 45h
mov al, bh
call Set_PMU
pop dx
mov bx, dx
mov cx, VT586_ACPI + 46h
mov al, bl
call Set_PMU
mov cx, VT586_ACPI + 47h
mov al, bh
call Set_PMU
;APM option
mov si,offset DGROUP:Wait_APM_Item
call GetItem_Value
mov PM_RAM:[Wait_APM_Flag],al
;video off option
mov si,offset Video_Off_Item
call GetItem_value
mov PM_RAM:[Video_Off_Mode],al
;Read DOZE timer setup value and store in SM RAM
;Read Suspend timer setup value and store in SM RAM
;Set Conserve Mode
mov cx, VT586_ACPI + 53h
mov al, 88h ; But the first conserve mode will on afer
call Set_PMU ; first doze state
mov PM_RAM:[PM_MODE1],FULL_ON
post_func_call Update_PM_Timer
;enable primary activity monitor
post_func_call End_Pmi_Handler ;clear status
ifdef Break_Suspend_In_Mouse_CMOS
mov si,offset Mouse_Irq_Item
call GetItem_Value
shl al,2
mov PM_RAM:[MISC_CNTL1],al
endif; Break_Suspend_In_Mouse_CMOS
ifdef HDD_PWRDOWN_IN_SUSPEND
ifdef HDD_PWRDOWN_IN_SUSPEND_After_1Min
mov si,offset HDD_Power_Item
Call GetItem_Value
mov byte ptr PM_RAM:[HDD_OFF_Timer],al
cmp al,0
jz short @f
post_func_call HDD_Timer_Restore
@@:
endif; HDD_PWRDOWN_IN_SUSPEND_After_1Min
endif; HDD_PWRDOWN_IN_SUSPEND
mov cl, 2ch
;R08 mov al, 1
;R08 call Set_PMIO
;R16 mov bx, 01e0h ;R08
mov bx, 01e4h ;R16
call Get_Set_PMIO ;R08
;Set CPU type
ifdef VT686 ;R52A - starts
mov si,offset Evt_INTR_Item
call F000_Getitem_Value
mov bl,00000000b ; set primary activity
test al,1
jz short @F
mov bl,00000010b
@@:
mov PM_RAM:[VT586PM_I34h_Value],bl ;default
mov cl, 34h
call E000_Set_PMIO
mov si,offset Evt_HDD_Item
call F000_GetItem_Value
or al,al
jz short No_Evt_HDD
or PM_RAM:[VT586PM_I34h_Value],00011100b
No_Evt_HDD:
mov si,offset Evt_DMA_Item
call F000_GetItem_Value
or PM_RAM:[VT586PM_I34h_Value],al
mov si,offset Evt_LPT_COM_Item
call F000_GetItem_Value
or al,al
jz short No_Evt_LPT_COM
or PM_RAM:[VT586PM_I34h_Value],11100000b
No_Evt_LPT_COM:
mov si,offset M_Evt_VGA_Item
call F000_GetItem_Value
mov cl, 35h
call E000_Set_PMIO
else; VT686 ;R52A - ends
mov si,offset Evt_INTR_Item
call Getitem_Value
mov bl,10000000b ; set primary activity
test al,1
jz short @F
mov bl,10000010b
@@:
mov al,bl
mov PM_RAM:[VT586PM_I34h_Value],al ;default
mov cl, 34h
call Set_PMIO
mov si,offset Evt_HDD_Item
call GetItem_Value
shl al,3
or PM_RAM:[VT586PM_I34h_Value],al
mov si,offset Evt_DMA_Item
call GetItem_Value
or PM_RAM:[VT586PM_I34h_Value],al
;R52A mov si,offset Evt_INTR_Item
;R52A call GetItem_Value
;R52A shl al,1
;R52A or PM_RAM:[VT586PM_I34h_Value],al
mov si,offset Evt_LPT_COM_Item
call GetItem_Value
shl al,5
or PM_RAM:[VT586PM_I34h_Value],al
mov si,offset M_Evt_VGA_Item
call GetItem_Value
;R52Aifndef VT686 ;R52
shl al,4
or PM_RAM:[VT586PM_I34h_Value],al
;R52A;R52 - starts
;R52Aelse; VT686
;R52A mov cl, 35h
;R52A call E000_Set_PMIO
;R52Aendif; VT686
;R52A;R52 - ends
endif; VT686 ;R52A
mov cl, 38h
mov al, 01h
call Set_PMIO
ifdef Have_Fan_Control_Item_In_GPO_Low
Have_Fan_Control_Item_In_GPO EQU 1
endif; Have_Fan_Control_Item_In_GPO_Low
ifdef Have_Fan_Control_Item_In_GPO_High
Have_Fan_Control_Item_In_GPO EQU 1
endif; Have_Fan_Control_Item_In_GPO_High
ifdef Have_Fan_Control_Item_In_GPO
extrn Fan_Control_Item:near
mov si, offset DGROUP:Fan_Control_Item
call GetItem_Value ;save suspend--> fan
shl al,7 ;stop ?
or PM_RAM:[Video_Off_Mode],al
endif; Have_Fan_Control_Item_In_GPO
ifdef ACPI_SUPPORT ;
mov cl, 2ah ; Enable Software SMI
mov bl, 40h ;
call Get_Set_PMIO_OR ;
endif ;ACPI_SUPPORT ;
push ds
mov ax,G_RAM
mov ds,ax
assume ds:G_RAM
mov bl,byte ptr ds:[hardware]
pop ds
mov byte ptr PM_RAM:[PS2_INST],bl
pop ds
popa
endif; Move_F000_PMU_INIT_To_E000
ret
Ct_PM_Init Endp
ifndef Move_F000_PMU_INIT_To_E000
;R62 start
;==================================================[]
;Input: SI = item offset
; DI = timer setting offset in PM_RAM
;==================================================[]
Timer_Transfer proc near
call GetItem_Value ;get setup setting
xor ah,ah
shl ax,1
mov bx,offset Timer_Value ;value table
add bx,ax ;translate
mov ax,cs:[bx] ;into reg. value
mov es:[di],ax ;save value in PM_RAM
ret
Timer_Transfer ENDP
IRQ_Evnt_TBL:
dw offset IRQ3_Event_Item
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -