diff options
Diffstat (limited to 'src/vendorcode/amd/agesa/f10/cpcar.inc')
-rwxr-xr-x | src/vendorcode/amd/agesa/f10/cpcar.inc | 477 |
1 files changed, 477 insertions, 0 deletions
diff --git a/src/vendorcode/amd/agesa/f10/cpcar.inc b/src/vendorcode/amd/agesa/f10/cpcar.inc new file mode 100755 index 0000000000..1a692c4475 --- /dev/null +++ b/src/vendorcode/amd/agesa/f10/cpcar.inc @@ -0,0 +1,477 @@ +;***************************************************************************** +; AMD Generic Encapsulated Software Architecture +; +; $Workfile:: cpcar.inc +; +; Description: CPCAR.INC - AGESA cache-as-RAM setup Include File +; +;***************************************************************************** +; +; Copyright (c) 2011, Advanced Micro Devices, Inc. +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; * Neither the name of Advanced Micro Devices, Inc. nor the names of +; its contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +; DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY +; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +; +;***************************************************************************** + +CORE0_STACK_BASE_ADDR EQU 40000h ;base address for primary cores stack +CORE1_STACK_BASE_ADDR EQU 60000h ;base address for AP cores +CORE0_STACK_SIZE EQU 4000h ;16KB for primary cores +CORE1_STACK_SIZE EQU 1000h ;4KB for each AP cores + +AMD_MTRR_FIX64k_00000 EQU 250h +AMD_MTRR_FIX16k_80000 EQU 258h +AMD_MTRR_FIX16k_A0000 EQU 259h +AMD_MTRR_FIX4k_C0000 EQU 268h +AMD_MTRR_FIX4k_C8000 EQU 269h +AMD_MTRR_FIX4k_D0000 EQU 26Ah +AMD_MTRR_FIX4k_D8000 EQU 26Bh +AMD_MTRR_FIX4k_E0000 EQU 26Ch +AMD_MTRR_FIX4k_E8000 EQU 26Dh +AMD_MTRR_FIX4k_F0000 EQU 26Eh +AMD_MTRR_FIX4k_F8000 EQU 26Fh +AMD_MTRR_DEFTYPE EQU 2FFh + +AMD_MTRR_VARIABLE_BASE6 EQU 020Ch + +TOP_MEM EQU 0C001001Ah + +MtrrFixDramEn EQU 18 +MtrrFixDramModEn EQU 19 +MtrrVarDramEn EQU 20 + +WB_DRAM_TYPE EQU 1Eh + +HWCR EQU 0C0010015h + INVD_WBINVD EQU 4 + +LS_CFG EQU 0C0011020h + DisStreamSt EQU 28 + +IC_CFG EQU 0C0011021h + DIS_SPEC_TLB_RLD EQU 9 + DIS_IND EQU 14 + +BU_CFG2 EQU 0C001102Ah + ClLinesToNbDis EQU 15 + +DC_DIS_SPEC_TLB_RLD EQU 4 ; disable speculative TLB reloads +DIS_CLR_WBTOL2_SMC_HIT EQU 8 ; self modifying code check buffer bit +DIS_HW_PF EQU 13 ; hardware prefetches bit +IC_DIS_SPEC_TLB_RLD EQU 9 ; disable speculative TLB reloads + +CR0_CD EQU 40000000h ; CR0[30] = Cache Disable +CR0_NW EQU 20000000h ; CR0[29] = Not Writethrough + +; CPUID Functions + +CPUID_MODEL EQU 1 +AMD_CPUID_FMF EQU 80000001h ; Family Model Features information + +NB_CFG EQU 0C001001Fh + bEnableCF8ExtCfg EQU 00004000h ; [46] + bInitAPICCPUIDLo EQU 00400000h ; [54] + +MTRR_SYS_CFG EQU 0C0010010h + ChxToDirtyDis EQU 16 + SysUcLockEn EQU 17 + MtrrFixDramEn EQU 18 + MtrrFixDramModEn EQU 19 + MtrrVarDramEn EQU 20 + MtrrTom2En EQU 21 + +PERF_COUNTER3 EQU 0C0010007h ; Performance event counter three +PERF_CONTROL3 EQU 0C0010003h ; Performance event control three +PERF_CONTROL3_RESERVE_L EQU 00200000h ; Preserve the reserved bits +PERF_CONTROL3_RESERVE_H EQU 0FCF0h ; Preserve the reserved bits +CONFIG_EVENT_L EQU 0F0E2h ; All cores with level detection +CONFIG_EVENT_H EQU 4 ; Increment count by number of event + ; occured in clock cycle +EVENT_ENABLE EQU 22 ; Enable the event + +;;*************************************************************************** +;; +;; CPU MACROS - PUBLIC +;; +;;*************************************************************************** +_WRMSR macro + db 0Fh, 30h + endm +_RDMSR macro + db 0Fh, 32h + endm + +;---------------------------------------------- +; +; AMD_DISABLE_STACK_FAMILY_HOOK Macro - Stackless +; +;---------------------------------------------- +AMD_DISABLE_STACK_FAMILY_HOOK MACRO + + AMD_DISABLE_STACK_FAMILY_HOOK_F10 + AMD_DISABLE_STACK_FAMILY_HOOK_F14 + +ENDM + +AMD_DISABLE_STACK_FAMILY_HOOK_F10 MACRO + + local cl_line_to_nb_enable_exit + + AMD_CPUID CPUID_MODEL + shr eax, 20 ; AL = cpu extended family + cmp al, 01h ; Is this family 10h? + jnz cl_line_to_nb_enable_exit ; Br if no + + ; For Family 10h, clear BU_CFG2[15] ClLinesToNbDis bit to Re-Enable L3 cache + ; Warning: icache for ROM (IO space) is disabled + mov ecx, 0C001102Ah ; BU_CFG2 + _RDMSR + btr eax, 15 + btr edx, 3 + _WRMSR + + ; * MSRC001_1021[DIS_IND]=0. Disable indirect branch predictor. + mov ecx, IC_CFG ; IC_CFG + _RDMSR + btr eax, DIS_IND ; turn off Disable indirect branch predictor + _WRMSR + + ;-------------------------------------------------------------------------- + ; Begin critical sequence in which EAX, BX, ECX, and EDX must be preserved. + ;-------------------------------------------------------------------------- + + ; Disable INVD_WBINVD across the invd instruction. + mov cx, 0015h ; HWCR + _RDMSR + mov bx, ax ; save INVD -> WBINVD bit + and al, 0EFh ; disable INVD -> WBINVD conversion + _WRMSR + + invd ; Clear the cache tag RAMs + + ; Restore INVD_WBINVD + mov ax, bx ; restore INVD -> WBINVD bit + _WRMSR + + ;-------------------------------------------------------------------------- + ; End critical sequence in which EAX, BX, ECX, and EDX must be preserved. + ;-------------------------------------------------------------------------- + + mov ecx, PERF_CONTROL3 ; Select the event control three + _RDMSR ; Retrieve the current value + btc eax, EVENT_ENABLE ; Is event enable, complement it as well + jnc cl_line_to_nb_enable_exit ; No + cmp ax, CONFIG_EVENT_L ; Is the lower part of event set to capture the CAR Corruption + jne cl_line_to_nb_enable_exit ; No + cmp dl, CONFIG_EVENT_H ; Is the upper part of event set to capture the CAR Corruption + jne cl_line_to_nb_enable_exit ; No + _WRMSR ; Disable the event + +cl_line_to_nb_enable_exit: +ENDM + +AMD_DISABLE_STACK_FAMILY_HOOK_F14 MACRO + + local fam14_enable_stack_hook_exit + + ; + ; For Family 14h + ; + ; Restore the following configuration state: + ; * MSRC001_0015[INVD_WBINVD]=1. + ; * MSRC001_1020[DisStreamSt]=0. + ; * MSRC001_1021[DIS_SPEC_TLB_RLD]=0. + ; * MSRC001_1022[DIS_HW_PF]=0. + ; + ; When BIOS is done executing from WP-IO the following steps are followed: + ; * MSRC001_102A[ClLinesToNbDis]=1. + + AMD_CPUID CPUID_MODEL + shr eax, 20 ; AL = cpu extended family + cmp al, 05h ; Is this family 10h? + jnz fam14_enable_stack_hook_exit ; Br if no + + ; * MSRC001_0015[INVD_WBINVD]=0. + mov ecx, HWCR + _RDMSR + bts eax, INVD_WBINVD ; turn off Convert INVD to WBINVD bit + _WRMSR + ; * MSRC001_1020[DisStreamSt]=1. + mov ecx, LS_CFG + _RDMSR + btr eax, DisStreamSt ; turn on Streaming store functionality disabled bit + _WRMSR + ; * MSRC001_1021[DIS_SPEC_TLB_RLD]=1. Disable speculative ITLB reloads. + inc ecx ; mov ecx, IC_CFG + _RDMSR + btr eax, DIS_SPEC_TLB_RLD ; turn on Disable speculative TLB reloads bit + _WRMSR + ; * MSRC001_1022[DIS_HW_PF]=1. + inc ecx + _RDMSR + btr eax, DIS_HW_PF ; turn on Disable hardware prefetches bit + _WRMSR + +fam14_enable_stack_hook_exit: +ENDM + +;--------------------------------------------------- +; +; AMD_ENABLE_STACK_FAMILY_HOOK Macro - Stackless +; +;--------------------------------------------------- +AMD_ENABLE_STACK_FAMILY_HOOK MACRO + + AMD_ENABLE_STACK_FAMILY_HOOK_F10 + AMD_ENABLE_STACK_FAMILY_HOOK_F14 + +ENDM + +AMD_ENABLE_STACK_FAMILY_HOOK_F10 MACRO + + local cl_line_to_nb_disable_exit + + AMD_CPUID CPUID_MODEL + shr eax, 20 ; AL = cpu extended family + cmp al, 01h ; Is this family 10h? + jnz cl_line_to_nb_disable_exit ; Br if no + + ; For Family 10h, set BU_CFG2[15] ClLinesToNbDis bit to disable L3 cache + ; Allow BIOS ROM to be cached in the IC + mov ecx, 0C001102Ah ; BU_CFG2 + _RDMSR + bts eax, 15 + bts edx, 3 + _WRMSR + + mov cx, 0015h ; HWCR + _RDMSR + and al, 0EFh ; disable INVD -> WBINVD conversion + _WRMSR + + ; * MSRC001_1021[DIS_IND]=1. Disable indirect branch predictor. + mov ecx, IC_CFG ; IC_CFG + _RDMSR + bts eax, DIS_IND ; turn on Disable indirect branch predictor + _WRMSR + + .if (di == 0) ;core 0 + mov ecx, PERF_COUNTER3 ; Select performance counter three + ; to count number of CAR Corruption + xor eax, eax ; Initialize the lower part of the counter to zero + xor edx, edx ; Initializa the upper part of the counter to zero + _WRMSR ; Save it + mov ecx, PERF_CONTROL3 ; Select the event control three + _RDMSR ; Get the current setting + and eax, PERF_CONTROL3_RESERVE_L ; Preserve the reserved bits + or eax, CONFIG_EVENT_L ; Set the lower part of event register to + ; select CAR Corruption occurred by any cores + and dx, PERF_CONTROL3_RESERVE_H ; Preserve the reserved bits + or dx, CONFIG_EVENT_H ; Set the upper part of event register + _WRMSR ; Save it + bts eax, EVENT_ENABLE ; Enable it + _WRMSR ; Save it + .endif + +cl_line_to_nb_disable_exit: +ENDM + +AMD_ENABLE_STACK_FAMILY_HOOK_F14 MACRO + + local fam14_enable_stack_hook_exit + + ; + ; For Family 14h + ; + ; The following requirements must be satisfied prior to using the cache as general storage: + ; * Paging must be disabled. + ; * MSRC001_0015[INVD_WBINVD]=0. + ; * MSRC001_1020[DisStreamSt]=1. + ; * MSRC001_1021[DIS_SPEC_TLB_RLD]=1. Disable speculative ITLB reloads. + ; * MSRC001_1022[DIS_HW_PF]=1. + ; * MSRC001_102A[ClLinesToNbDis]=1. + + AMD_CPUID CPUID_MODEL + shr eax, 20 ; AL = cpu extended family + cmp al, 05h ; Is this family 10h? + jnz fam14_enable_stack_hook_exit ; Br if no + + ; * MSRC001_0015[INVD_WBINVD]=0. + mov ecx, HWCR + _RDMSR + btr eax, INVD_WBINVD ; turn off Convert INVD to WBINVD bit + _WRMSR + ; * MSRC001_1020[DisStreamSt]=1. + mov ecx, LS_CFG + _RDMSR + bts eax, DisStreamSt ; turn on Streaming store functionality disabled bit + _WRMSR + ; * MSRC001_1021[DIS_SPEC_TLB_RLD]=1. Disable speculative ITLB reloads. + inc ecx ; mov ecx, IC_CFG + _RDMSR + bts eax, DIS_SPEC_TLB_RLD ; turn on Disable speculative TLB reloads bit + _WRMSR + ; * MSRC001_1022[DIS_HW_PF]=1. + inc ecx + _RDMSR + bts eax, DIS_HW_PF ; turn on Disable hardware prefetches bit + _WRMSR + ; * MSRC001_102A[ClLinesToNbDis]=1. + mov ecx, BU_CFG2 + _RDMSR + bts eax, ClLinesToNbDis ; turn on DC and IC caches WT/WP-IO, but L2 does not. + _WRMSR + +fam14_enable_stack_hook_exit: +ENDM + +;--------------------------------------------------- +; +; GET_NODE_ID_CORE_ID Macro - Stackless +; +; Macro returns: +; SI= NODE ID +; DI= CORE ID +;--------------------------------------------------- +GET_NODE_ID_CORE_ID MACRO + + GET_NODE_ID_CORE_ID_F10 + GET_NODE_ID_CORE_ID_F12 + GET_NODE_ID_CORE_ID_F14 + +ENDM + +GET_NODE_ID_CORE_ID_F10 MACRO + + local node_core_f10_exit + + cmp si, -1 ; Has node/core already been discovered? + jnz node_core_f10_exit ; Br if yes + + AMD_CPUID CPUID_MODEL + shr eax, 20 ; AL = cpu extended family + cmp al, 01h ; Is this family 10h? + jnz node_core_f10_exit ; Br if no + + mov ecx, 1Bh ; APIC Base MSR + _RDMSR + xor si, si ; Assume BSC + xor di, di + test ah, 1 ; Is this the BSC? + jnz node_core_f10_exit ; Br if yes + mov ecx, 0C0000408h ; Read the family 10h mailbox + _RDMSR + mov si, dx ; SI = raw mailbox contents + shr ebx, 24 ; BL = Initial APIC ID + mov di, bx ; DI = Initial APIC ID + + AMD_CPUID 80000008h + shr ch, 4 ; CH = ApicIdSize + inc cl ; CL = Number of enabled cores in the socket + mov bx, cx + + mov ecx, NB_CFG + _RDMSR ; EDX bit 54-32=26 is InitApicIdCpuIdLo bit + + mov cl, bh ; CL = APIC ID size + mov al, 1 ; Convert APIC ID size to an AND mask + shl al, cl ; AL = 2^APIC ID size + dec al ; AL = mask for relative core number + xor ah, ah ; AX = mask for relative core number + bt edx, 54-32 ; InitApicId == 1? + .if (!carry?) ; Br if yes + mov ch, 8 ; Calculate core number shift count + sub ch, cl ; CH = core shift count + mov cl, ch + shr di, cl ; Right justify core number + .endif + and di, ax ; DI = socket-relative core number + + mov cx, si ; CX = raw mailbox value + shr cx, 10 ; CL[1:0] = ModuleType + and cl, 3 ; Isolate ModuleType + xor bh, bh ; BX = Number of enabled cores in the socket + shr bx, cl ; BX = Number of enabled cores per node + xor dx, dx ; Clear upper word for div + mov ax, di ; AX = socket-relative core number + div bx ; DX = node-relative core number + mov di, dx ; DI = node-relative core number + and si, 000Fh ; SI = node number +node_core_f10_exit: +ENDM + +GET_NODE_ID_CORE_ID_F12 MACRO + + local node_core_f12_exit + + cmp si, -1 ; Has node/core already been discovered? + jnz node_core_f12_exit ; Br if yes + + AMD_CPUID CPUID_MODEL + shr eax, 20 ; AL = cpu extended family + cmp al, 03h ; Is this family 10h? + jnz node_core_f12_exit ; Br if no + + xor si, si ; Node must be 0 + shr ebx, 24 ; CPUID_0000_0001_EBX[31:24]: initial local APIC physical ID + mov di, bx ; DI = core number +node_core_f12_exit: +ENDM + +GET_NODE_ID_CORE_ID_F14 MACRO + + local node_core_f14_exit + + cmp si, -1 ; Has node/core already been discovered? + jnz node_core_f14_exit ; Br if yes + + AMD_CPUID CPUID_MODEL + shr eax, 20 ; AL = cpu extended family + cmp al, 05h ; Is this family 14h? + jnz node_core_f14_exit ; Br if no + + xor si, si ; Node must be 0 + mov ecx, 1Bh ; APIC Base MSR + _RDMSR + xor di, di ; Assume BSC + test ah, 1 ; Is this the BSC? + jnz node_core_f14_exit ; Br if yes + inc di ; Set core to 1 +node_core_f14_exit: +ENDM + + +AMD_CPUID MACRO arg0 + IFB <arg0> + mov eax, 1 + db 0Fh, 0A2h ; Execute instruction + bswap eax + xchg al, ah ; Ext model in al now + rol eax, 8 ; Ext model in ah, model in al + and ax, 0FFCFh ; Keep 23:16, 7:6, 3:0 + ELSE + mov eax, arg0 + db 0Fh, 0A2h + ENDIF +ENDM + |