Fusion frequencies detection

git-svn-id: svn://kolibrios.org@3573 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Artem Jerdev (art_zh) 2013-05-29 23:16:18 +00:00
parent 65c483cc45
commit f138c2f662
3 changed files with 98 additions and 44 deletions

View File

@ -298,23 +298,39 @@ sys_rdmsr:
pop edx ecx pop edx ecx
ret ret
;------------------------------------------------
uglobal
align 4
diff16 "apic_data : ", 0, $
apic_data:
.counter dd ?
.ticks dd ?
.t_freq dd ?
endg
apic_timer_reset: apic_timer_reset:
xor eax, eax mov eax, [pll_frequency.osc]
mov [apic_data+0], eax shr eax, 1 ; default prescaler - fix it !!
mov [apic_data.t_freq], eax
shr eax, 4 ; 16 per second
mov [apic_data.ticks], eax
mov ebx, LAPIC_BAR+ 0x320 mov ebx, LAPIC_BAR+ 0x320
mov eax, [ebx] mov edx, [ebx]
and eax, 0xFFFEFF00 and edx, 0xFFFEFF00
or eax, 0x0000003F ; int vector + norestart or edx, 0x0002003F ; int vector + restart
mov [ebx], eax mov [ebx], edx
mov dword[apic_data + 8], 100000000 mov dword [LAPIC_BAR + 0x380], eax ; load APICTIC
ret ret
apic_timer_int: apic_timer_int:
push eax push eax
inc dword [apic_data + 0] inc dword [apic_data.counter]
mov eax, [apic_data + 8] ; mov eax, [apic_data.ticks]
mov dword [LAPIC_BAR + 0x380], eax ; load APICTIC ; mov dword [LAPIC_BAR + 0x380], eax ; reload APICTIC
mov dword [LAPIC_BAR + 0x0B0], 0 ; end of interrupt mov dword [LAPIC_BAR + 0x0B0], 0 ; end of interrupt
; mov dword [LAPIC_BAR + 0x420], 0x3F ; end of interrupt ; mov dword [LAPIC_BAR + 0x420], 0x3F ; end of interrupt
pop eax pop eax

View File

@ -273,7 +273,6 @@ FONT_I equ (OS_BASE+0x005E600)
TMP_STACK_TOP equ 0x006C000 TMP_STACK_TOP equ 0x006C000
apic_data equ (OS_BASE+0x006D000)
mmio_pte equ 0x006E000 mmio_pte equ 0x006E000
sys_pgdir equ (OS_BASE+0x006F000) sys_pgdir equ (OS_BASE+0x006F000)

View File

@ -628,44 +628,83 @@ include 'detect/disks.inc'
mov [SLOT_BASE+APPDATA.cursor+256],eax mov [SLOT_BASE+APPDATA.cursor+256],eax
; READ TSC / SECOND == Fusion only! ; READ TSC / SECOND === Fusion fam.14h only! ===
cli uglobal
mov edx, PCIe_CONFIG_SPACE + 0xE0 align 4
mov eax, 0x013080F0 ; BIOS timer reg. diff16 "pll_freq : ", 0, $
mov [edx], eax pll_frequency:
add dl, 4 .main dd ?
mov edi, edx .divd dd ?
mov eax, [edi] ; old microseconds .nclk dd ?
inc eax ; next precise microsecond .osc dd ?
mov esi, eax endg
@@: mov ecx, 0xC0010064 ; P0-state register
mov eax, [edi] rdmsr
cmp eax, esi and eax, 0x000001F3
jne @b xor ebx, ebx
mov bl, al
shr eax, 2 ; divd = 4*((1 + bits[8:4]) + 0.25*(bits[1:0]))
add al, 4
and bl, 3
add al, bl
mov [pll_frequency.divd], eax
rdtsc
mov ebp, eax ; clockmark
add esi, 20 ; wait 20us
@@:
mov eax, [edi]
cmp eax, esi
jne @b
rdtsc mov eax, [PCIe_CONFIG_SPACE + 0xC30D4] ; bdf: 0.18.3; reg.0xD4
sub eax, ebp and eax, 0x0000003F ; 100 * (16 + bits[5:0]) = MHz
mov ebx, 50000 add al, 16
mul ebx ; clks per second imul eax, 100
sti mov [pll_frequency.main], eax
shl eax, 2
xor edx, edx
mov ebx, [pll_frequency.divd]
div ebx
mov ecx, 1000000
push edx
xor edx, edx
mul ecx
mov [CPU_FREQ], eax ; Hz
pop eax
xor edx, edx
mov ecx, 250000 ; remainder in MHz/4
mul ecx
div ebx
add eax, [CPU_FREQ]
mov [CPU_FREQ],eax ; save tsc / sec mov [CPU_FREQ],eax ; save tsc / sec
mov ebx, 1000000 mov ebx, 1000000
div ebx div ebx
mov [stall_mcs], eax mov [stall_mcs], eax ; (core/memory.inc:stall)
mov ebx, [PCIe_CONFIG_SPACE + 0xC30DC] ; bdf: 0.18.3; reg.0xDC
shr ebx, 20
and bx, 0x3F ; NbP0NclkDiv
mov eax, [pll_frequency.main]
shl eax, 2
xor edx, edx
div ebx
push edx
imul eax, 1000000
mov [pll_frequency.nclk], eax ; +-MHz
pop eax
xor edx, edx
imul eax, 1000000
div ebx
add [pll_frequency.nclk], eax ; precise bus clk
mov eax, 200000000
mov [pll_frequency.osc], eax ; 200MHz main oscillator
; PRINT CPU FREQUENCY ; PRINT CPU FREQUENCY
mov esi, boot_cpufreq mov esi, boot_cpufreq
call boot_log call boot_log
mov eax, [CPU_FREQ]
xor edx, edx
mov ebx, 1000000
div ebx
mov ebx, eax mov ebx, eax
movzx ecx, word [boot_y] movzx ecx, word [boot_y]
add ecx, (10+17*6) shl 16 - 10 ; 'CPU frequency is ' add ecx, (10+17*6) shl 16 - 10 ; 'CPU frequency is '