mb/google/rex/var/kanix: Add Synaptics touchpad
[coreboot2.git] / src / cpu / intel / car / non-evict / cache_as_ram.S
blob9485cd44fb94c7e413b14b967c7693d8f5dba3af
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>
7 #include <cpu/x86/64bit/entry64.inc>
9 #define NoEvictMod_MSR 0x2e0
10 #define BBL_CR_CTL3_MSR 0x11e
12 .section .init
13 .global bootblock_pre_c_entry
15 #include <cpu/intel/car/cache_as_ram_symbols.inc>
17 .code32
18 _cache_as_ram_setup:
20 bootblock_pre_c_entry:
21         movl    $cache_as_ram, %esp /* return address */
22         jmp     check_mtrr /* Check if CPU properly reset */
24 cache_as_ram:
25         post_code(POSTCODE_BOOTBLOCK_CAR)
27         /* Send INIT IPI to all excluding ourself. */
28         movl    $0x000C4500, %eax
29         movl    $0xFEE00300, %esi
30         movl    %eax, (%esi)
32         /* All CPUs need to be in Wait for SIPI state */
33 wait_for_sipi:
34         movl    (%esi), %eax
35         bt      $12, %eax
36         jc      wait_for_sipi
38         post_code(POSTCODE_SOC_SET_DEF_MTRR_TYPE)
39         /* Clean-up MTRR_DEF_TYPE_MSR. */
40         movl    $MTRR_DEF_TYPE_MSR, %ecx
41         xorl    %eax, %eax
42         xorl    %edx, %edx
43         wrmsr
45         post_code(POSTCODE_SOC_CLEAR_FIXED_MTRRS)
46         /* Clear/disable fixed MTRRs */
47         mov     $fixed_mtrr_list, %ebx
48         xor     %eax, %eax
49         xor     %edx, %edx
51 clear_fixed_mtrr:
52         movzwl  (%ebx), %ecx
53         wrmsr
54         add     $2, %ebx
55         cmp     $fixed_mtrr_list_end, %ebx
56         jl      clear_fixed_mtrr
58         /* Zero out all variable range MTRRs. */
59         movl    $MTRR_CAP_MSR, %ecx
60         rdmsr
61         andl    $0xff, %eax
62         shl     $1, %eax
63         movl    %eax, %edi
64         movl    $0x200, %ecx
65         xorl    %eax, %eax
66         xorl    %edx, %edx
67 clear_var_mtrrs:
68         wrmsr
69         add     $1, %ecx
70         dec     %edi
71         jnz     clear_var_mtrrs
73         /* Determine CPU_ADDR_BITS and load PHYSMASK high word to %edx. */
74         movl    $0x80000008, %eax
75         cpuid
76         movb    %al, %cl
77         sub     $32, %cl
78         movl    $1, %edx
79         shl     %cl, %edx
80         subl    $1, %edx
82         /* Preload high word of address mask (in %edx) for Variable
83          * MTRRs 0 and 1.
84          */
85 addrsize_set_high:
86         xorl    %eax, %eax
87         movl    $MTRR_PHYS_MASK(0), %ecx
88         wrmsr
89         movl    $MTRR_PHYS_MASK(1), %ecx
90         wrmsr
92         post_code(POSTCODE_SOC_SET_MTRR_BASE)
93         /* Set Cache-as-RAM base address. */
94         movl    $(MTRR_PHYS_BASE(0)), %ecx
95         movl    car_mtrr_start, %eax
96         orl     $MTRR_TYPE_WRBACK, %eax
97         xorl    %edx, %edx
98         wrmsr
100         post_code(POSTCODE_SOC_SET_MTRR_MASK)
101         /* Set Cache-as-RAM mask. */
102         movl    $(MTRR_PHYS_MASK(0)), %ecx
103         rdmsr
104         mov     car_mtrr_mask, %eax
105         orl     $MTRR_PHYS_MASK_VALID, %eax
106         wrmsr
108         /* Enable cache for our code in Flash because we do XIP here */
109         movl    $MTRR_PHYS_BASE(1), %ecx
110         xorl    %edx, %edx
111         mov     rom_mtrr_base, %eax
112         orl     $MTRR_TYPE_WRPROT, %eax
113         wrmsr
115         movl    $MTRR_PHYS_MASK(1), %ecx
116         rdmsr
117         mov     rom_mtrr_mask, %eax
118         orl     $MTRR_PHYS_MASK_VALID, %eax
119         wrmsr
121         post_code(POSTCODE_SOC_ENABLE_MTRRS)
123         /* Enable MTRR. */
124         movl    $MTRR_DEF_TYPE_MSR, %ecx
125         rdmsr
126         orl     $MTRR_DEF_TYPE_EN, %eax
127         wrmsr
129 #if CONFIG(CPU_HAS_L2_ENABLE_MSR)
130         /*
131          * Enable the L2 cache. Currently this assumes that this
132          * only affect socketed CPU's for which this is always valid,
133          * hence the static preprocesser.
134          */
135         movl    $BBL_CR_CTL3_MSR, %ecx
136         rdmsr
137         orl     $0x100, %eax
138         wrmsr
139 #endif
141         /* Enable cache (CR0.CD = 0, CR0.NW = 0). */
142         movl    %cr0, %eax
143         andl    $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
144         invd
145         movl    %eax, %cr0
147 #if CONFIG(MICROCODE_UPDATE_PRE_RAM)
148 update_microcode:
149         /* put the return address in %esp */
150         movl    $end_microcode_update, %esp
151         jmp     update_bsp_microcode
152 end_microcode_update:
153 #endif
154         /* Disable caching to change MTRR's. */
155         movl    %cr0, %eax
156         orl     $CR0_CacheDisable, %eax
157         movl    %eax, %cr0
159         /* Clear the mask valid to disable the MTRR */
160         movl    $MTRR_PHYS_MASK(1), %ecx
161         rdmsr
162         andl    $(~MTRR_PHYS_MASK_VALID), %eax
163         wrmsr
165         /* Enable cache. */
166         movl    %cr0, %eax
167         andl    $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
168         invd
169         movl    %eax, %cr0
171         /* enable the 'no eviction' mode */
172         movl    $NoEvictMod_MSR, %ecx
173         rdmsr
174         orl     $1, %eax
175         andl    $~2, %eax
176         wrmsr
178         /* Clear the cache memory region. This will also fill up the cache. */
179         cld
180         xorl    %eax, %eax
181         movl    $_car_mtrr_start, %edi
182         movl    $_car_mtrr_size, %ecx
183         shr     $2, %ecx
184         rep     stosl
186         /* enable the 'no eviction run' state */
187         movl    $NoEvictMod_MSR, %ecx
188         rdmsr
189         orl     $3, %eax
190         wrmsr
192         post_code(POSTCODE_SOC_DISABLE_CACHE)
193         /* Enable Cache-as-RAM mode by disabling cache. */
194         movl    %cr0, %eax
195         orl     $CR0_CacheDisable, %eax
196         movl    %eax, %cr0
198         movl    $MTRR_PHYS_MASK(1), %ecx
199         rdmsr
200         orl     $MTRR_PHYS_MASK_VALID, %eax
201         wrmsr
203         post_code(POSTCODE_SOC_ENABLE_CACHE)
204         /* Enable cache. */
205         movl    %cr0, %eax
206         andl    $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
207         movl    %eax, %cr0
209         /* Setup the stack. */
210         mov     $_ecar_stack, %esp
212         /* Need to align stack to 16 bytes at call instruction. Account for
213         the pushes below. */
214         andl    $0xfffffff0, %esp
216 #if ENV_X86_64
217         setup_longmode $PM4LE
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         /* Copy .data section content to Cache-As-Ram */
237 #include <cpu/x86/copy_data_section.inc>
239 before_c_entry:
240         post_code(POSTCODE_BOOTBLOCK_BEFORE_C_ENTRY)
241         call    bootblock_c_entry_bist
243         /* Should never see this postcode */
244         post_code(POSTCODE_DEAD_CODE)
247 .Lhlt:
248         hlt
249         jmp     .Lhlt
251 fixed_mtrr_list:
252         .word   MTRR_FIX_64K_00000
253         .word   MTRR_FIX_16K_80000
254         .word   MTRR_FIX_16K_A0000
255         .word   MTRR_FIX_4K_C0000
256         .word   MTRR_FIX_4K_C8000
257         .word   MTRR_FIX_4K_D0000
258         .word   MTRR_FIX_4K_D8000
259         .word   MTRR_FIX_4K_E0000
260         .word   MTRR_FIX_4K_E8000
261         .word   MTRR_FIX_4K_F0000
262         .word   MTRR_FIX_4K_F8000
263 fixed_mtrr_list_end:
265 _cache_as_ram_setup_end: