aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/amd/agesa/cache_as_ram.S
blob: e3e5735c3b7bb92423207e563c1470cdcbf65c9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
 * This file is part of the coreboot project.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

/******************************************************************************
 * AMD Generic Encapsulated Software Architecture
 *
 * $Workfile:: cache_as_ram.S
 *
 * Description: cache_as_ram.S - AGESA Module Entry Point for GCC complier
 *
 ******************************************************************************
 */

#include "gcccar.inc"
#include <cpu/x86/cache.h>
#include <cpu/x86/post_code.h>

.code32
.globl _cache_as_ram_setup, _cache_as_ram_setup_end

_cache_as_ram_setup:

	/* Preserve BIST. */
	movd	%eax, %mm0

	post_code(0xa0)

	/* enable SSE2 128bit instructions */
	/* Turn on OSFXSR [BIT9] and OSXMMEXCPT [BIT10] onto CR4 register */

	movl	%cr4, %eax
	orl	$(3 << 9), %eax
	movl	%eax, %cr4

	post_code(0xa1)

	AMD_ENABLE_STACK

	/* Align the stack. */
	and	$0xFFFFFFF0, %esp

#ifdef __x86_64__
	/* switch to 64 bit long mode */
	mov	%esi, %ecx
	add	$0, %ecx # core number
	xor	%eax, %eax
	lea	(0x1000+0x23)(%ecx), %edi
	mov	%edi, (%ecx)
	mov	%eax, 4(%ecx)

	lea	0x1000(%ecx), %edi
	movl	$0x000000e3, 0x00(%edi)
	movl	%eax, 0x04(%edi)
	movl	$0x400000e3, 0x08(%edi)
	movl	%eax, 0x0c(%edi)
	movl	$0x800000e3, 0x10(%edi)
	movl	%eax, 0x14(%edi)
	movl	$0xc00000e3, 0x18(%edi)
	movl	%eax, 0x1c(%edi)

	# load ROM based identity mapped page tables
	mov	%ecx, %eax
	mov	%eax, %cr3

	# enable PAE
	mov	%cr4, %eax
	bts	$5, %eax
	mov	%eax, %cr4

	# enable long mode
	mov	$0xC0000080, %ecx
	rdmsr
	bts	$8, %eax
	wrmsr

	# enable paging
	mov	%cr0, %eax
	bts	$31, %eax
	mov	%eax, %cr0

	# use call far to switch to 64-bit code segment
	ljmp	$0x18, $1f
1:

#endif

	/* Must maintain 16-byte stack alignment here. */
	pushl	$0x0
	pushl	$0x0
	pushl	$0x0
	movd	%mm0, %eax		/* bist */
	pushl	%eax
	call	romstage_main

	/* Should never see this postcode */
	post_code(0xae)

stop:
	hlt
	jmp	stop

_cache_as_ram_setup_end: