blob: 133aca735056945d419bb85d88d73acbb358b84e [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"
Kerry Shefeed3292011-08-18 18:03:44 +080038#include "sb_cimx.h"
Scott Duplichana649a962011-02-24 05:00:33 +000039#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 if (!cpu_init_detectedx && boot_cpu()) {
59 post_code(0x30);
Kerry Shefeed3292011-08-18 18:03:44 +080060 sb_Poweron_Init();
Marshall Buschmanb3ee0d62011-06-04 15:44:31 +000061
Stefan Reinauer44c1d312011-06-04 10:36:21 -070062 post_code(0x31);
63 w83627hf_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);
64 console_init();
65 }
Scott Duplichana649a962011-02-24 05:00:33 +000066
Stefan Reinauer44c1d312011-06-04 10:36:21 -070067 /* Halt if there was a built in self test failure */
68 post_code(0x34);
69 report_bist_failure(bist);
Scott Duplichana649a962011-02-24 05:00:33 +000070
Stefan Reinauer44c1d312011-06-04 10:36:21 -070071 // Load MPB
72 val = cpuid_eax(1);
73 printk(BIOS_DEBUG, "BSP Family_Model: %08x \n", val);
74 printk(BIOS_DEBUG, "cpu_init_detectedx = %08lx \n", cpu_init_detectedx);
Scott Duplichana649a962011-02-24 05:00:33 +000075
Stefan Reinauer44c1d312011-06-04 10:36:21 -070076 post_code(0x35);
77 val = agesawrapper_amdinitmmio();
Scott Duplichana649a962011-02-24 05:00:33 +000078
Stefan Reinauer44c1d312011-06-04 10:36:21 -070079 post_code(0x37);
80 val = agesawrapper_amdinitreset();
81 if (val) {
82 printk(BIOS_DEBUG, "agesawrapper_amdinitreset failed: %x \n",
83 val);
84 }
Scott Duplichana649a962011-02-24 05:00:33 +000085
Stefan Reinauer44c1d312011-06-04 10:36:21 -070086 post_code(0x38);
87 printk(BIOS_DEBUG, "Got past sb800_early_setup\n");
Scott Duplichana649a962011-02-24 05:00:33 +000088
Stefan Reinauer44c1d312011-06-04 10:36:21 -070089 post_code(0x39);
90 val = agesawrapper_amdinitearly();
91 if (val) {
92 printk(BIOS_DEBUG, "agesawrapper_amdinitearly failed: %x \n",
93 val);
94 }
95 printk(BIOS_DEBUG, "Got past agesawrapper_amdinitearly\n");
Scott Duplichana649a962011-02-24 05:00:33 +000096
Stefan Reinauer44c1d312011-06-04 10:36:21 -070097 post_code(0x40);
98 val = agesawrapper_amdinitpost();
99 if (val) {
100 printk(BIOS_DEBUG, "agesawrapper_amdinitpost failed: %x \n",
101 val);
102 }
103 printk(BIOS_DEBUG, "Got past agesawrapper_amdinitpost\n");
Scott Duplichana649a962011-02-24 05:00:33 +0000104
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700105 post_code(0x41);
106 val = agesawrapper_amdinitenv();
107 if (val) {
108 printk(BIOS_DEBUG, "agesawrapper_amdinitenv failed: %x \n",
109 val);
110 }
111 printk(BIOS_DEBUG, "Got past agesawrapper_amdinitenv\n");
Scott Duplichana649a962011-02-24 05:00:33 +0000112
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700113 /* Initialize i8259 pic */
114 post_code(0x41);
115 setup_i8259();
Scott Duplichana649a962011-02-24 05:00:33 +0000116
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700117 /* Initialize i8254 timers */
118 post_code(0x42);
119 setup_i8254();
Scott Duplichana649a962011-02-24 05:00:33 +0000120
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700121 post_code(0x50);
122 copy_and_run(0);
Scott Duplichana649a962011-02-24 05:00:33 +0000123
Stefan Reinauer44c1d312011-06-04 10:36:21 -0700124 post_code(0x54); // Should never see this post code.
Scott Duplichana649a962011-02-24 05:00:33 +0000125}