diff --git a/programs/system/gmon/HWM_HUDSON.INC b/programs/system/gmon/HWM_HUDSON.INC new file mode 100644 index 000000000..272d74704 --- /dev/null +++ b/programs/system/gmon/HWM_HUDSON.INC @@ -0,0 +1,298 @@ +; +; Ghost Monitor - гвЁ«Ёв  (бваҐбб) вҐбвЁа®ў ­Ёп Ё ¬®­Ёв®аЁ­Ј  бЁб⥬л +; Copyright (C) 2005, 2006, 2007 Mihailov Ilia (ghost.nsk@mail.ru) +; All Right Reserved + +; +; ЃЁЎ«Ё®вҐЄ  ¤«п зЁЇ®ў Hudson +; +; +; +; | Chip name | ID Vin Fanin PWM Temp ISA SMBus +msg_A50: db 'AMD Hudson A50', 0 ; 0x20|0x21 9 3 2 3 + + +msg_A55: db 'AMD Hudson A55', 0 ; 0x20|0x21 9 3 2 3 + + + +msg_amdunk: db 'Unknown AMD', 0 ; other, non zero ;-) + +uglobal +wb_fans_num db 0 +endg + +;----------------------------------- +hudson_init: +; OUT - CF = 1 - error + + mov ebx, 0xF00C3000 + mov eax, [ebx] + cmp eax, 0x17031022 + jne .not_found ; not a Fusion! + + mov byte[wb_fans_num], 3 + mov edx, msg_A55 +@@: mov [hwm_chip_name], edx + mov dword[hwm_enable],1 + mov al, 0xE6 + mov bl, 0x0A + call pm2write ; init PWM_Control register + + + clc + ret +.not_found: stc + ret + +;----------------------------------- +hudson_getparam: + call hudson_get_temp + call hudson_get_fan_speed + mov edi, hudson_coeff + call hudson_get_volt + fld dword[V12] + fld dword[hudson_n12v_const] + faddp st1, st0 + fstp dword[V12] + ret +;----------------------------------- +hudson_get_temp: + ; temp 1 + mov ebx, 0xF00C3000 + mov eax, [ebx+0xA4] + mov edx, eax + shr edx, 24 + mov [hwm_temps], dl ; integer degrees + mov edx, eax + shr edx, 21 + and dl, 7 ; 1/8th fractions of degree + cmp dl, 3 ; round 3/8 upto 0.4 + jb .corrected + inc dl + cmp dl, 8 ; 7/8 ~ 0.9 + jb .corrected + inc dl +.corrected: + mov [hwm_temps + 1], dl + + ; temp 2 (3 SYSTIN) + xor ebx, ebx + mov al, 0x95 + call pm2read + mov bl, al + mov al, 0x96 ; SB internal sensor + call pm2read + mov bh, al + mov [hudson_temp_read], ebx + fild dword[hudson_temp_read] + fmul dword[hudson_temp_coef] + fidiv dword[hudson_int_64] + fadd dword[hudson_temp_offs] + fimul dword[hudson_int_2] + fistp dword[hudson_temp_read] + mov bx, word[hudson_temp_read] + mov ax, bx + xor bh, bh + shr eax, 1 + mov byte[hwm_temps + 2], al + or bl, 1 + jz @f + mov bh, 5 + mov byte[hwm_temps + 3], bh + + + ; temp 3 (VTIN) + xor ebx, ebx + mov al, 0xA1 + call pm2read + mov bl, al + mov al, 0xA2 ; temp sensor #2 + call pm2read + mov bh, al + mov [hudson_temp_read], ebx + fild dword[hudson_temp_read] + fmul dword[hudson_temp_coef] + fidiv dword[hudson_int_64] + fadd dword[hudson_temp_offs] + fimul dword[hudson_int_2] + fistp dword[hudson_temp_read] + mov bx, word[hudson_temp_read] + mov ax, bx + xor bh, bh + shr eax, 1 + mov byte[hwm_temps + 4], al + or bl, 1 + jz @f + mov bh, 5 + mov byte[hwm_temps + 5], bh + + + mov ecx, 3 + mov esi, hwm_temps +hudson_check_temp: + cmp word[esi + ecx * 2 - 2], 0x057F + jne hudson_temp_ok + mov word[esi + ecx * 2 - 2], 0 +hudson_temp_ok: + loop hudson_check_temp + + ret +;----------------------------------- +hudson_get_fan_speed: + ; fan1 + mov al, 0x47 + call [IO_Read] + and al, 0x30 + shr al, 4 + mov ebx, 1 + mov cl, al + shl ebx, cl ; <- div1 + xor eax, eax + mov al, 0x28 + call [IO_Read] + cmp al, 255 + jne @f + xor eax, eax ; ??? + ret ; ??? +@@: mul ebx + mov ebx, eax + mov eax, 1350000 + xor edx, edx + test ebx, ebx + jz .div0 + div ebx + mov [hwm_rpms], eax + + mov al, 0x47 + call [IO_Read] + shr al, 6 + mov ebx, 1 + mov cl, al + shl ebx, cl ; <- div2 + xor eax, eax + mov al, 0x29 + call [IO_Read] + cmp al, 255 + jne @f + xor eax, eax +.div0: + ret +@@: mul ebx + mov ebx, eax + mov eax, 1350000 + xor edx, edx + test ebx, ebx + jz .div0 + div ebx + mov [hwm_rpms + 4], eax + + mov al, 0x4B + call [IO_Read] + shr al, 6 + mov ebx, 1 + mov cl, al + shl ebx, cl ; <- div3 + xor eax, eax + mov al, 0x2A + call [IO_Read] + cmp al, 255 + jne @f + xor eax, eax + ret +@@: mul ebx + mov ebx, eax + mov eax, 1350000 + xor edx, edx + test ebx, ebx + jz .div0 + div ebx + mov [hwm_rpms + 8], eax + + cmp byte[wb_fans_num], 3 + jna .wb_f_e + + mov al, 0x59 + call [IO_Read] + and al, 3 + mov ebx, 1 + mov cl, al + shl ebx, cl ; <- div4, ¤®ЇЁб вм гзсв DIV_B2 + xor eax, eax + mov al, 0x3F + call [IO_Read] + cmp al, 255 + jne @f + xor eax, eax + ret +@@: mul ebx + mov ebx, eax + mov eax, 1350000 + xor edx, edx + test ebx, ebx + jz .div0 + div ebx + mov [hwm_rpms + 12], eax + + mov al, 0x59 + call [IO_Read] + shr al, 2 + and al, 3 + mov ebx, 1 + mov cl, al + shl ebx, cl ; <- div5, ¤®ЇЁб вм гзсв DIV_B2 + xor eax, eax + mov al, 0x4e ; ‚лЎЁа Ґ¬ bank 5 + mov bl, 5 + call [IO_Write] + mov al, 0x53 + call [IO_Read] + cmp al, 255 + jne @f + xor eax, eax + ret +@@: mul ebx + mov ebx, eax + mov eax, 1350000 + xor edx, edx + test ebx, ebx + jz .wb_f_e + div ebx + mov [hwm_rpms + 16], eax + +.wb_f_e: + ret +;----------------------------------- +hudson_get_volt: + ;mov edi, wb_coeff ; <-- possible differences for miscellaneous chip + mov esi, hwm_voltages + xor ecx, ecx +@@: mov eax, ecx + add al, 0x20 + call [IO_Read] + fld dword [edi + ecx * 4] + push eax + fild dword [esp] + fmulp st1, st0 + fstp dword [esi + ecx * 4] + pop eax + inc ecx + cmp ecx, 7 + jb @b + ret + +align 4 +hudson_coeff: dd 0.016 ; Vcore + dd 0.016 ; Vin0 + dd 0.016 ; Vin1 (+3.3V) + dd 0.02688 ; AVcc (+5V) + dd 0.0608 ; Vin2 (+12V) + dd 0.0822857142857145 ; -12V + dd -0.02408 ; -5V ; false + +hudson_n12v_const dd -14.9142857142857 + +hudson_temp_offs dd -273.65 +hudson_temp_coef dd 0.517 +hudson_temp_read dd 0 +hudson_int_2 dd 2 +hudson_int_64 dd 64 + + + diff --git a/programs/system/gmon/hwm.inc b/programs/system/gmon/hwm.inc index ee1e14b1f..1ed2fc167 100644 --- a/programs/system/gmon/hwm.inc +++ b/programs/system/gmon/hwm.inc @@ -16,7 +16,7 @@ end if include 'hwm_wb.inc' include 'hwm_it87.inc' include 'hwm_uguru.inc' -;include 'hwm_via686.inc' +;include 'hwm_hudson.inc' uglobal hwm_enable: @@ -52,14 +52,18 @@ hwm_chip_name dd hwm_unk ; HWMGetParam - список, процедур получения параметров ; оба эти списка должны соответствовать друг другу по ; по порядку процедур -HWMProbe: dd wb_init +HWMProbe: + dd wb_init dd it87_init dd uGuru_init +; dd hudson_init dd 0 ; <- конец списка -HWMGetParam: dd wb_getparam +HWMGetParam: + dd wb_getparam dd it87_getparam dd uGuru_getparam +; dd hudson_getparam ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= hwm_init: