blob: 7d25ec1d384d6017eeb1e512a5492b527307516f [file] [log] [blame]
Scott Duplichana649a962011-02-24 05:00:33 +00001/*
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.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20#include <stdint.h>
21#include <string.h>
22#include <device/pci_def.h>
23#include <device/pci_ids.h>
24#include <arch/io.h>
25#include <arch/stages.h>
26#include <device/pnp_def.h>
27#include <arch/romcc_io.h>
28#include <arch/cpu.h>
29#include <cpu/x86/lapic.h>
30#include <console/console.h>
31#include <console/loglevel.h>
32#include "agesawrapper.h"
33#include "cpu/x86/bist.h"
Scott Duplichan63896e72011-02-26 17:49:49 +000034#include "superio/winbond/w83627hf/early_serial.c"
Scott Duplichana649a962011-02-24 05:00:33 +000035#include "cpu/x86/lapic/boot_cpu.c"
36#include "pc80/i8254.c"
37#include "pc80/i8259.c"
38#include "SbEarly.h"
39#include "SBPLATFORM.h"
40
41void cache_as_ram_main(unsigned long bist, unsigned long cpu_init_detectedx);
42
Scott Duplichan63896e72011-02-26 17:49:49 +000043#define SERIAL_DEV PNP_DEV(CONFIG_SIO_PORT, W83627HF_SP1)
Scott Duplichana649a962011-02-24 05:00:33 +000044
45void cache_as_ram_main(unsigned long bist, unsigned long cpu_init_detectedx)
46{
Stefan Reinauer44c1d312011-06-04 10:36:21 -070047 u32 val;
48 u8 reg8;
Scott Duplichana649a962011-02-24 05:00:33 +000049
Stefan Reinauer44c1d312011-06-04 10:36:21 -070050 // all cores: allow caching of flash chip code and data
51 // (there are no cache-as-ram reliability concerns with family 14h)
52 __writemsr(0x20c, (0x0100000000ull - CONFIG_ROM_SIZE) | 5);
53 __writemsr(0x20d, (0x1000000000ull - CONFIG_ROM_SIZE) | 0x800);
Marshall Buschman314f4a22011-06-04 15:47:05 +000054
Stefan Reinauer44c1d312011-06-04 10:36:21 -070055 // all cores: set pstate 0 (1600 MHz) early to save a few ms of boot time
56 __writemsr(0xc0010062, 0);
Marshall Buschmanfd460e62011-06-04 15:44:54 +000057
Stefan Reinauer44c1d312011-06-04 10:36:21 -070058 // early enable of PrefetchEnSPIFromHost
59 if (boot_cpu()) {
60 __outdword(0xcf8, 0x8000a3b8);
61 __outdword(0xcfc, __indword(0xcfc) | 1 << 24);
62 }
63 // early enable of SPI 33 MHz fast mode read
64 if (boot_cpu()) {
65 volatile u32 *spiBase = (void *)0xa0000000;
66 u32 save;
67 __outdword(0xcf8, 0x8000a3a0);
68 save = __indword(0xcfc);
69 __outdword(0xcfc, (u32) spiBase | 2); // set temp MMIO base
70 spiBase[3] = (spiBase[3] & ~(3 << 14)) | (1 << 14);
71 spiBase[0] |= 1 << 18; // fast read enable
72 __outdword(0xcfc, save); // clear temp base
73 }
Marshall Buschman552ad9f2011-06-04 15:45:12 +000074
Stefan Reinauer44c1d312011-06-04 10:36:21 -070075 if (!cpu_init_detectedx && boot_cpu()) {
76 post_code(0x30);
77 sb_poweron_init();
Marshall Buschmanb3ee0d62011-06-04 15:44:31 +000078
Stefan Reinauer44c1d312011-06-04 10:36:21 -070079 post_code(0x31);
80 w83627hf_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);
81 console_init();
82 }
Scott Duplichana649a962011-02-24 05:00:33 +000083 //reg8 = pmio_read(0x24);
Stefan Reinauer44c1d312011-06-04 10:36:21 -070084 outb(0x24, 0xCD6);
85 reg8 = inb(0xCD7);
Scott Duplichana649a962011-02-24 05:00:33 +000086 reg8 |= 1;
87 reg8 &= ~(1 << 1);
88 //pmio_write(0x24, reg8);
89 outb(0x24, 0xCD6);
90 outb(reg8, 0xCD7);
91
Stefan Reinauer44c1d312011-06-04 10:36:21 -070092 *(volatile u32 *)(0xFED80000 + 0xE00 + 0x40) &= ~((1 << 0) | (1 << 2)); /* 48Mhz */
93 *(volatile u32 *)(0xFED80000 + 0xE00 + 0x40) |= 1 << 1; /* 48Mhz */
Scott Duplichana649a962011-02-24 05:00:33 +000094
Stefan Reinauer44c1d312011-06-04 10:36:21 -070095 /* Halt if there was a built in self test failure */
96 post_code(0x34);
97 report_bist_failure(bist);
Scott Duplichana649a962011-02-24 05:00:33 +000098
Stefan Reinauer44c1d312011-06-04 10:36:21 -070099 // Load MPB
100 val = cpuid_eax(1);
101 printk(BIOS_DEBUG, "BSP Family_Model: %08x \n", val);
102 printk(BIOS_DEBUG, "cpu_init_detectedx = %08lx \n", cpu_init_detectedx);
Scott Duplichana649a962011-02-24 05:00:33 +0000103
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700104 post_code(0x35);
105 val = agesawrapper_amdinitmmio();
Scott Duplichana649a962011-02-24 05:00:33 +0000106
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700107 post_code(0x37);
108 val = agesawrapper_amdinitreset();
109 if (val) {
110 printk(BIOS_DEBUG, "agesawrapper_amdinitreset failed: %x \n",
111 val);
112 }
Scott Duplichana649a962011-02-24 05:00:33 +0000113
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700114 post_code(0x38);
115 printk(BIOS_DEBUG, "Got past sb800_early_setup\n");
Scott Duplichana649a962011-02-24 05:00:33 +0000116
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700117 post_code(0x39);
118 val = agesawrapper_amdinitearly();
119 if (val) {
120 printk(BIOS_DEBUG, "agesawrapper_amdinitearly failed: %x \n",
121 val);
122 }
123 printk(BIOS_DEBUG, "Got past agesawrapper_amdinitearly\n");
Scott Duplichana649a962011-02-24 05:00:33 +0000124
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700125 post_code(0x40);
126 val = agesawrapper_amdinitpost();
127 if (val) {
128 printk(BIOS_DEBUG, "agesawrapper_amdinitpost failed: %x \n",
129 val);
130 }
131 printk(BIOS_DEBUG, "Got past agesawrapper_amdinitpost\n");
Scott Duplichana649a962011-02-24 05:00:33 +0000132
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700133 post_code(0x41);
134 val = agesawrapper_amdinitenv();
135 if (val) {
136 printk(BIOS_DEBUG, "agesawrapper_amdinitenv failed: %x \n",
137 val);
138 }
139 printk(BIOS_DEBUG, "Got past agesawrapper_amdinitenv\n");
Scott Duplichana649a962011-02-24 05:00:33 +0000140
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700141 /* Initialize i8259 pic */
142 post_code(0x41);
143 setup_i8259();
Scott Duplichana649a962011-02-24 05:00:33 +0000144
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700145 /* Initialize i8254 timers */
146 post_code(0x42);
147 setup_i8254();
Scott Duplichana649a962011-02-24 05:00:33 +0000148
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700149 post_code(0x50);
150 copy_and_run(0);
Scott Duplichana649a962011-02-24 05:00:33 +0000151
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700152 post_code(0x54); // Should never see this post code.
Scott Duplichana649a962011-02-24 05:00:33 +0000153}