blob: 80344cea2a1a60987f76354257c8882bca8ed921 [file] [log] [blame]
efdesign987c0c64e2011-06-20 19:56:06 -07001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2011 Advanced Micro Devices, Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
efdesign987c0c64e2011-06-20 19:56:06 -070014 */
efdesign984b508342011-07-13 17:16:13 -070015
efdesign987c0c64e2011-06-20 19:56:06 -070016/******************************************************************************
17 * AMD Generic Encapsulated Software Architecture
18 *
19 * $Workfile:: cache_as_ram.inc
20 *
21 * Description: cache_as_ram.inc - AGESA Module Entry Point for GCC complier
22 *
23 ******************************************************************************
efdesign984b508342011-07-13 17:16:13 -070024 */
25
efdesign987c0c64e2011-06-20 19:56:06 -070026#include "gcccar.inc"
Patrick Georgi05e740f2012-03-31 12:52:21 +020027#include <cpu/x86/cache.h>
efdesign987c0c64e2011-06-20 19:56:06 -070028
29/*
30 * XMM map:
31 * xmm0: BIST
32 * xmm1: backup ebx -- cpu_init_detected
33 */
34
35.code32
36.globl cache_as_ram_setup, disable_cache_as_ram, cache_as_ram_setup_out
37
38cache_as_ram_setup:
efdesign984b508342011-07-13 17:16:13 -070039
efdesign987c0c64e2011-06-20 19:56:06 -070040 post_code(0xa0)
efdesign984b508342011-07-13 17:16:13 -070041
42 /* enable SSE2 128bit instructions */
efdesign987c0c64e2011-06-20 19:56:06 -070043 /* Turn on OSFXSR [BIT9] and OSXMMEXCPT [BIT10] onto CR4 register */
efdesign984b508342011-07-13 17:16:13 -070044
efdesign987c0c64e2011-06-20 19:56:06 -070045 movl %cr4, %eax
46 orl $(3<<9), %eax
efdesign984b508342011-07-13 17:16:13 -070047 movl %eax, %cr4
48
efdesign987c0c64e2011-06-20 19:56:06 -070049 /* Get the cpu_init_detected */
50 mov $1, %eax
51 cpuid
52 shr $24, %ebx
efdesign984b508342011-07-13 17:16:13 -070053
efdesign987c0c64e2011-06-20 19:56:06 -070054 /* Save the BIST result */
55 cvtsi2sd %ebp, %xmm0
efdesign984b508342011-07-13 17:16:13 -070056
efdesign987c0c64e2011-06-20 19:56:06 -070057 /* for normal part %ebx already contain cpu_init_detected from fallback call */
efdesign984b508342011-07-13 17:16:13 -070058
efdesign987c0c64e2011-06-20 19:56:06 -070059 /* Save the cpu_init_detected */
60 cvtsi2sd %ebx, %xmm1
efdesign984b508342011-07-13 17:16:13 -070061
efdesign987c0c64e2011-06-20 19:56:06 -070062 post_code(0xa1)
efdesign984b508342011-07-13 17:16:13 -070063
Stefan Reinauer67b94302015-06-18 01:14:01 -070064#ifdef __x86_64__
65 /* switch to 64 bit long mode */
Patrick Georgi4a30ab92016-01-22 12:26:52 +010066 mov %esi, %ecx
67 add $0, %ecx # core number
68 xor %eax, %eax
69 lea (0x1000+0x23)(%ecx), %edi
70 mov %edi, (%ecx)
71 mov %eax, 4(%ecx)
Stefan Reinauer67b94302015-06-18 01:14:01 -070072
Patrick Georgi4a30ab92016-01-22 12:26:52 +010073 lea 0x1000(%ecx), %edi
74 movl $0x000000e3, 0x00(%edi)
75 movl %eax, 0x04(%edi)
76 movl $0x400000e3, 0x08(%edi)
77 movl %eax, 0x0c(%edi)
78 movl $0x800000e3, 0x10(%edi)
79 movl %eax, 0x14(%edi)
80 movl $0xc00000e3, 0x18(%edi)
81 movl %eax, 0x1c(%edi)
Stefan Reinauer67b94302015-06-18 01:14:01 -070082
83 # load rom based identity mapped page tables
Patrick Georgi4a30ab92016-01-22 12:26:52 +010084 mov %ecx, %eax
85 mov %eax, %cr3
Stefan Reinauer67b94302015-06-18 01:14:01 -070086
87 # enable PAE
Patrick Georgi4a30ab92016-01-22 12:26:52 +010088 mov %cr4, %eax
89 bts $5, %eax
90 mov %eax, %cr4
Stefan Reinauer67b94302015-06-18 01:14:01 -070091
92 # enable long mode
Patrick Georgi4a30ab92016-01-22 12:26:52 +010093 mov $0xC0000080, %ecx
Stefan Reinauer67b94302015-06-18 01:14:01 -070094 rdmsr
Patrick Georgi4a30ab92016-01-22 12:26:52 +010095 bts $8, %eax
Stefan Reinauer67b94302015-06-18 01:14:01 -070096 wrmsr
97
98 # enable paging
Patrick Georgi4a30ab92016-01-22 12:26:52 +010099 mov %cr0, %eax
100 bts $31, %eax
101 mov %eax, %cr0
Stefan Reinauer67b94302015-06-18 01:14:01 -0700102
103 # use call far to switch to 64-bit code segment
Patrick Georgi4a30ab92016-01-22 12:26:52 +0100104 ljmp $0x18, $1f
1051:
Stefan Reinauer67b94302015-06-18 01:14:01 -0700106 /* Pass the BIST result */
Patrick Georgi4a30ab92016-01-22 12:26:52 +0100107 cvtsd2si %xmm1, %esi
Stefan Reinauer67b94302015-06-18 01:14:01 -0700108
109 /* Pass the cpu_init_detected */
Patrick Georgi4a30ab92016-01-22 12:26:52 +0100110 cvtsd2si %xmm0, %edi
Stefan Reinauer67b94302015-06-18 01:14:01 -0700111
112 /* align the stack */
Patrick Georgi4a30ab92016-01-22 12:26:52 +0100113 and $0xFFFFFFF0, %esp
Stefan Reinauer67b94302015-06-18 01:14:01 -0700114
115 .code64
116 call cache_as_ram_main
117 .code32
118
Stefan Reinauer67b94302015-06-18 01:14:01 -0700119#else
120 AMD_ENABLE_STACK
efdesign984b508342011-07-13 17:16:13 -0700121
efdesign987c0c64e2011-06-20 19:56:06 -0700122 /* Restore the BIST result */
123 cvtsd2si %xmm0, %edx
efdesign984b508342011-07-13 17:16:13 -0700124
efdesign987c0c64e2011-06-20 19:56:06 -0700125 /* Restore the cpu_init_detected */
126 cvtsd2si %xmm1, %ebx
efdesign984b508342011-07-13 17:16:13 -0700127
efdesign987c0c64e2011-06-20 19:56:06 -0700128 pushl %ebx /* init detected */
129 pushl %edx /* bist */
130 call cache_as_ram_main
Stefan Reinauer67b94302015-06-18 01:14:01 -0700131#endif
efdesign984b508342011-07-13 17:16:13 -0700132
133 /* Should never see this postcode */
134 post_code(0xaf)
efdesign987c0c64e2011-06-20 19:56:06 -0700135stop:
136 jmp stop
137
138disable_cache_as_ram:
139 /* Save return stack */
Bruce Griffith59c3a062013-08-12 01:53:13 -0600140 movd 0(%esp), %xmm1
efdesign984b508342011-07-13 17:16:13 -0700141 movd %esp, %xmm0
142
zbaof7223732012-04-13 13:42:15 +0800143 /* Disable cache */
144 movl %cr0, %eax
Patrick Georgi05e740f2012-03-31 12:52:21 +0200145 orl $CR0_CacheDisable, %eax
zbaof7223732012-04-13 13:42:15 +0800146 movl %eax, %cr0
147
efdesign987c0c64e2011-06-20 19:56:06 -0700148 AMD_DISABLE_STACK
efdesign984b508342011-07-13 17:16:13 -0700149
Siyuan Wangf3b86b32012-11-01 18:51:15 +0800150 /* enable cache */
151 movl %cr0, %eax
152 andl $0x9fffffff, %eax
153 movl %eax, %cr0
154 xorl %eax, %eax
155
efdesign987c0c64e2011-06-20 19:56:06 -0700156 /* Restore the return stack */
Bruce Griffith59c3a062013-08-12 01:53:13 -0600157 wbinvd
efdesign984b508342011-07-13 17:16:13 -0700158 movd %xmm0, %esp
Bruce Griffith59c3a062013-08-12 01:53:13 -0600159 movd %xmm1, (%esp)
efdesign987c0c64e2011-06-20 19:56:06 -0700160 ret
efdesign984b508342011-07-13 17:16:13 -0700161
efdesign987c0c64e2011-06-20 19:56:06 -0700162cache_as_ram_setup_out:
Stefan Reinauer67b94302015-06-18 01:14:01 -0700163#ifdef __x86_64__
164.code64
165#endif