From f138c2f662a323686c1c0dc097c203f5fe267f22 Mon Sep 17 00:00:00 2001 From: "Artem Jerdev (art_zh)" Date: Wed, 29 May 2013 23:16:18 +0000 Subject: [PATCH] Fusion frequencies detection git-svn-id: svn://kolibrios.org@3573 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/branches/Kolibri-A/trunk/bus/HT.inc | 40 +++++--- kernel/branches/Kolibri-A/trunk/const.inc | 1 - kernel/branches/Kolibri-A/trunk/kernel.asm | 101 ++++++++++++++------- 3 files changed, 98 insertions(+), 44 deletions(-) diff --git a/kernel/branches/Kolibri-A/trunk/bus/HT.inc b/kernel/branches/Kolibri-A/trunk/bus/HT.inc index e9fb8c208a..07f2c0bebc 100644 --- a/kernel/branches/Kolibri-A/trunk/bus/HT.inc +++ b/kernel/branches/Kolibri-A/trunk/bus/HT.inc @@ -298,25 +298,41 @@ sys_rdmsr: pop edx ecx ret +;------------------------------------------------ +uglobal + +align 4 +diff16 "apic_data : ", 0, $ +apic_data: + + .counter dd ? + .ticks dd ? + .t_freq dd ? +endg + apic_timer_reset: - xor eax, eax - mov [apic_data+0], eax + mov eax, [pll_frequency.osc] + 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 eax, [ebx] - and eax, 0xFFFEFF00 - or eax, 0x0000003F ; int vector + norestart - mov [ebx], eax - mov dword[apic_data + 8], 100000000 + mov edx, [ebx] + and edx, 0xFFFEFF00 + or edx, 0x0002003F ; int vector + restart + mov [ebx], edx + mov dword [LAPIC_BAR + 0x380], eax ; load APICTIC ret apic_timer_int: push eax - inc dword [apic_data + 0] - mov eax, [apic_data + 8] - mov dword [LAPIC_BAR + 0x380], eax ; load APICTIC - mov dword [LAPIC_BAR + 0x0B0], 0 ; end of interrupt -; mov dword [LAPIC_BAR + 0x420], 0x3F ; end of interrupt + inc dword [apic_data.counter] +; mov eax, [apic_data.ticks] +; mov dword [LAPIC_BAR + 0x380], eax ; reload APICTIC + mov dword [LAPIC_BAR + 0x0B0], 0 ; end of interrupt +; mov dword [LAPIC_BAR + 0x420], 0x3F ; end of interrupt pop eax iretd diff --git a/kernel/branches/Kolibri-A/trunk/const.inc b/kernel/branches/Kolibri-A/trunk/const.inc index c7ce881b21..e9771fd7a4 100644 --- a/kernel/branches/Kolibri-A/trunk/const.inc +++ b/kernel/branches/Kolibri-A/trunk/const.inc @@ -273,7 +273,6 @@ FONT_I equ (OS_BASE+0x005E600) TMP_STACK_TOP equ 0x006C000 -apic_data equ (OS_BASE+0x006D000) mmio_pte equ 0x006E000 sys_pgdir equ (OS_BASE+0x006F000) diff --git a/kernel/branches/Kolibri-A/trunk/kernel.asm b/kernel/branches/Kolibri-A/trunk/kernel.asm index 96ac7f8b5d..3a7190e889 100644 --- a/kernel/branches/Kolibri-A/trunk/kernel.asm +++ b/kernel/branches/Kolibri-A/trunk/kernel.asm @@ -628,51 +628,90 @@ include 'detect/disks.inc' mov [SLOT_BASE+APPDATA.cursor+256],eax - ; READ TSC / SECOND == Fusion only! + ; READ TSC / SECOND === Fusion fam.14h only! === - cli - mov edx, PCIe_CONFIG_SPACE + 0xE0 - mov eax, 0x013080F0 ; BIOS timer reg. - mov [edx], eax - add dl, 4 - mov edi, edx - mov eax, [edi] ; old microseconds - inc eax ; next precise microsecond - mov esi, eax - @@: - mov eax, [edi] - cmp eax, esi - jne @b +uglobal +align 4 +diff16 "pll_freq : ", 0, $ +pll_frequency: + .main dd ? + .divd dd ? + .nclk dd ? + .osc dd ? +endg + mov ecx, 0xC0010064 ; P0-state register + rdmsr + and eax, 0x000001F3 + 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 - sub eax, ebp - mov ebx, 50000 - mul ebx ; clks per second - sti + mov eax, [PCIe_CONFIG_SPACE + 0xC30D4] ; bdf: 0.18.3; reg.0xD4 + and eax, 0x0000003F ; 100 * (16 + bits[5:0]) = MHz + add al, 16 + imul eax, 100 + 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 ebx, 1000000 + div ebx + 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 + - mov [CPU_FREQ],eax ; save tsc / sec - mov ebx, 1000000 - div ebx - mov [stall_mcs], eax ; PRINT CPU FREQUENCY mov esi, boot_cpufreq call boot_log + mov eax, [CPU_FREQ] + xor edx, edx + mov ebx, 1000000 + div ebx mov ebx, eax movzx ecx, word [boot_y] add ecx, (10+17*6) shl 16 - 10 ; 'CPU frequency is ' mov edx, 0xFFFFFF xor edi,edi mov eax, 0x00040000 - inc edi + inc edi call display_number_force ; SET VARIABLES