soc/intel/alderlake: Add ADL-P 4+4 with 28W TDP
[coreboot.git] / src / cpu / intel / car / non-evict / cache_as_ram.S
blobd47fa725f105c4cf2ab212c752f2682492954f79
1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <cpu/intel/post_codes.h>
4 #include <cpu/x86/mtrr.h>
5 #include <cpu/x86/cache.h>
6 #include <cpu/x86/post_code.h>
8 #define NoEvictMod_MSR 0x2e0
9 #define BBL_CR_CTL3_MSR 0x11e
11 .section .init
12 .global bootblock_pre_c_entry
14 #include <cpu/intel/car/cache_as_ram_symbols.inc>
16 .code32
17 _cache_as_ram_setup:
19 bootblock_pre_c_entry:
20         movl    $cache_as_ram, %esp /* return address */
21         jmp     check_mtrr /* Check if CPU properly reset */
23 cache_as_ram:
24         post_code(POST_BOOTBLOCK_CAR)
26         /* Send INIT IPI to all excluding ourself. */
27         movl    $0x000C4500, %eax
28         movl    $0xFEE00300, %esi
29         movl    %eax, (%esi)
31         /* All CPUs need to be in Wait for SIPI state */
32 wait_for_sipi:
33         movl    (%esi), %eax
34         bt      $12, %eax
35         jc      wait_for_sipi
37         post_code(POST_SOC_SET_DEF_MTRR_TYPE)
38         /* Clean-up MTRR_DEF_TYPE_MSR. */
39         movl    $MTRR_DEF_TYPE_MSR, %ecx
40         xorl    %eax, %eax
41         xorl    %edx, %edx
42         wrmsr
44         post_code(POST_SOC_CLEAR_FIXED_MTRRS)
45         /* Clear/disable fixed MTRRs */
46         mov     $fixed_mtrr_list, %ebx
47         xor     %eax, %eax
48         xor     %edx, %edx
50 clear_fixed_mtrr:
51         movzwl  (%ebx), %ecx
52         wrmsr
53         add     $2, %ebx
54         cmp     $fixed_mtrr_list_end, %ebx
55         jl      clear_fixed_mtrr
57         /* Zero out all variable range MTRRs. */
58         movl    $MTRR_CAP_MSR, %ecx
59         rdmsr
60         andl    $0xff, %eax
61         shl     $1, %eax
62         movl    %eax, %edi
63         movl    $0x200, %ecx
64         xorl    %eax, %eax
65         xorl    %edx, %edx
66 clear_var_mtrrs:
67         wrmsr
68         add     $1, %ecx
69         dec     %edi
70         jnz     clear_var_mtrrs
72         /* Determine CPU_ADDR_BITS and load PHYSMASK high word to %edx. */
73         movl    $0x80000008, %eax
74         cpuid
75         movb    %al, %cl
76         sub     $32, %cl
77         movl    $1, %edx
78         shl     %cl, %edx
79         subl    $1, %edx
81         /* Preload high word of address mask (in %edx) for Variable
82          * MTRRs 0 and 1.
83          */
84 addrsize_set_high:
85         xorl    %eax, %eax
86         movl    $MTRR_PHYS_MASK(0), %ecx
87         wrmsr
88         movl    $MTRR_PHYS_MASK(1), %ecx
89         wrmsr
91         post_code(POST_SOC_SET_MTRR_BASE)
92         /* Set Cache-as-RAM base address. */
93         movl    $(MTRR_PHYS_BASE(0)), %ecx
94         movl    car_mtrr_start, %eax
95         orl     $MTRR_TYPE_WRBACK, %eax
96         xorl    %edx, %edx
97         wrmsr
99         post_code(POST_SOC_SET_MTRR_MASK)
100         /* Set Cache-as-RAM mask. */
101         movl    $(MTRR_PHYS_MASK(0)), %ecx
102         rdmsr
103         mov     car_mtrr_mask, %eax
104         orl     $MTRR_PHYS_MASK_VALID, %eax
105         wrmsr
107         /* Enable cache for our code in Flash because we do XIP here */
108         movl    $MTRR_PHYS_BASE(1), %ecx
109         xorl    %edx, %edx
110         mov     rom_mtrr_base, %eax
111         orl     $MTRR_TYPE_WRPROT, %eax
112         wrmsr
114         movl    $MTRR_PHYS_MASK(1), %ecx
115         rdmsr
116         mov     rom_mtrr_mask, %eax
117         orl     $MTRR_PHYS_MASK_VALID, %eax
118         wrmsr
120         post_code(POST_SOC_ENABLE_MTRRS)
122         /* Enable MTRR. */
123         movl    $MTRR_DEF_TYPE_MSR, %ecx
124         rdmsr
125         orl     $MTRR_DEF_TYPE_EN, %eax
126         wrmsr
128 #if CONFIG(CPU_HAS_L2_ENABLE_MSR)
129         /*
130          * Enable the L2 cache. Currently this assumes that this
131          * only affect socketed CPU's for which this is always valid,
132          * hence the static preprocesser.
133          */
134         movl    $BBL_CR_CTL3_MSR, %ecx
135         rdmsr
136         orl     $0x100, %eax
137         wrmsr
138 #endif
140         /* Enable cache (CR0.CD = 0, CR0.NW = 0). */
141         movl    %cr0, %eax
142         andl    $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
143         invd
144         movl    %eax, %cr0
146 #if CONFIG(MICROCODE_UPDATE_PRE_RAM)
147 update_microcode:
148         /* put the return address in %esp */
149         movl    $end_microcode_update, %esp
150         jmp     update_bsp_microcode
151 end_microcode_update:
152 #endif
153         /* Disable caching to change MTRR's. */
154         movl    %cr0, %eax
155         orl     $CR0_CacheDisable, %eax
156         movl    %eax, %cr0
158         /* Clear the mask valid to disable the MTRR */
159         movl    $MTRR_PHYS_MASK(1), %ecx
160         rdmsr
161         andl    $(~MTRR_PHYS_MASK_VALID), %eax
162         wrmsr
164         /* Enable cache. */
165         movl    %cr0, %eax
166         andl    $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
167         invd
168         movl    %eax, %cr0
170         /* enable the 'no eviction' mode */
171         movl    $NoEvictMod_MSR, %ecx
172         rdmsr
173         orl     $1, %eax
174         andl    $~2, %eax
175         wrmsr
177         /* Clear the cache memory region. This will also fill up the cache. */
178         cld
179         xorl    %eax, %eax
180         movl    $_car_mtrr_start, %edi
181         movl    $_car_mtrr_size, %ecx
182         shr     $2, %ecx
183         rep     stosl
185         /* enable the 'no eviction run' state */
186         movl    $NoEvictMod_MSR, %ecx
187         rdmsr
188         orl     $3, %eax
189         wrmsr
191         post_code(POST_SOC_DISABLE_CACHE)
192         /* Enable Cache-as-RAM mode by disabling cache. */
193         movl    %cr0, %eax
194         orl     $CR0_CacheDisable, %eax
195         movl    %eax, %cr0
197         movl    $MTRR_PHYS_MASK(1), %ecx
198         rdmsr
199         orl     $MTRR_PHYS_MASK_VALID, %eax
200         wrmsr
202         post_code(POST_SOC_ENABLE_CACHE)
203         /* Enable cache. */
204         movl    %cr0, %eax
205         andl    $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
206         movl    %eax, %cr0
208         /* Setup the stack. */
209         mov     $_ecar_stack, %esp
211         /* Need to align stack to 16 bytes at call instruction. Account for
212         the pushes below. */
213         andl    $0xfffffff0, %esp
215 #if ENV_X86_64
217         #include <cpu/x86/64bit/entry64.inc>
219         movd    %mm2, %rdi
220         shlq    $32, %rdi
221         movd    %mm1, %rsi
222         or      %rsi, %rdi
223         movd    %mm0, %rsi
225 #else
226         subl    $4, %esp
227         /* push TSC and BIST to stack */
228         movd    %mm0, %eax
229         pushl   %eax    /* BIST */
230         movd    %mm2, %eax
231         pushl   %eax    /* tsc[63:32] */
232         movd    %mm1, %eax
233         pushl   %eax    /* tsc[31:0] */
234 #endif
236 before_c_entry:
237         post_code(POST_BOOTBLOCK_BEFORE_C_ENTRY)
238         call    bootblock_c_entry_bist
240         /* Should never see this postcode */
241         post_code(POST_DEAD_CODE)
244 .Lhlt:
245         hlt
246         jmp     .Lhlt
248 fixed_mtrr_list:
249         .word   MTRR_FIX_64K_00000
250         .word   MTRR_FIX_16K_80000
251         .word   MTRR_FIX_16K_A0000
252         .word   MTRR_FIX_4K_C0000
253         .word   MTRR_FIX_4K_C8000
254         .word   MTRR_FIX_4K_D0000
255         .word   MTRR_FIX_4K_D8000
256         .word   MTRR_FIX_4K_E0000
257         .word   MTRR_FIX_4K_E8000
258         .word   MTRR_FIX_4K_F0000
259         .word   MTRR_FIX_4K_F8000
260 fixed_mtrr_list_end:
262 _cache_as_ram_setup_end: