Add support for Intel Sandybridge CPU (northbridge part)
[coreboot.git] / src / northbridge / intel / sandybridge / early_init.c
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright (C) 2007-2010 coresystems GmbH
5  * Copyright (C) 2011 Google Inc
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; version 2 of the License.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19  */
20
21 #include <stdint.h>
22 #include <stdlib.h>
23 #include <console/console.h>
24 #include <arch/io.h>
25 #include <arch/romcc_io.h>
26 #include <device/pci_def.h>
27 #include "sandybridge.h"
28 #include "pcie_config.c"
29
30 static void sandybridge_setup_bars(void)
31 {
32         /* Setting up Southbridge. In the northbridge code. */
33         printk(BIOS_DEBUG, "Setting up static southbridge registers...");
34         pci_write_config32(PCI_DEV(0, 0x1f, 0), RCBA, DEFAULT_RCBA | 1);
35
36         pci_write_config32(PCI_DEV(0, 0x1f, 0), PMBASE, DEFAULT_PMBASE | 1);
37         pci_write_config8(PCI_DEV(0, 0x1f, 0), 0x44 /* ACPI_CNTL */ , 0x80); /* Enable ACPI BAR */
38
39         printk(BIOS_DEBUG, " done.\n");
40
41         printk(BIOS_DEBUG, "Disabling Watchdog reboot...");
42         RCBA32(GCS) = RCBA32(GCS) | (1 << 5);   /* No reset */
43         outw((1 << 11), DEFAULT_PMBASE | 0x60 | 0x08);  /* halt timer */
44         printk(BIOS_DEBUG, " done.\n");
45
46         printk(BIOS_DEBUG, "Setting up static northbridge registers...");
47         /* Set up all hardcoded northbridge BARs */
48         pci_write_config32(PCI_DEV(0, 0x00, 0), EPBAR, DEFAULT_EPBAR | 1);
49         pci_write_config32(PCI_DEV(0, 0x00, 0), EPBAR + 4, (0LL+DEFAULT_EPBAR) >> 32);
50         pci_write_config32(PCI_DEV(0, 0x00, 0), MCHBAR, DEFAULT_MCHBAR | 1);
51         pci_write_config32(PCI_DEV(0, 0x00, 0), MCHBAR + 4, (0LL+DEFAULT_MCHBAR) >> 32);
52         pci_write_config32(PCI_DEV(0, 0x00, 0), PCIEXBAR, DEFAULT_PCIEXBAR | 5); /* 64MB - busses 0-63 */
53         pci_write_config32(PCI_DEV(0, 0x00, 0), PCIEXBAR + 4, (0LL+DEFAULT_PCIEXBAR) >> 32);
54         pci_write_config32(PCI_DEV(0, 0x00, 0), DMIBAR, DEFAULT_DMIBAR | 1);
55         pci_write_config32(PCI_DEV(0, 0x00, 0), DMIBAR + 4, (0LL+DEFAULT_DMIBAR) >> 32);
56
57         /* Set C0000-FFFFF to access RAM on both reads and writes */
58         pci_write_config8(PCI_DEV(0, 0x00, 0), PAM0, 0x30);
59         pci_write_config8(PCI_DEV(0, 0x00, 0), PAM1, 0x33);
60         pci_write_config8(PCI_DEV(0, 0x00, 0), PAM2, 0x33);
61         pci_write_config8(PCI_DEV(0, 0x00, 0), PAM3, 0x33);
62         pci_write_config8(PCI_DEV(0, 0x00, 0), PAM4, 0x33);
63         pci_write_config8(PCI_DEV(0, 0x00, 0), PAM5, 0x33);
64         pci_write_config8(PCI_DEV(0, 0x00, 0), PAM6, 0x33);
65
66         printk(BIOS_DEBUG, " done.\n");
67 }
68
69 static void sandybridge_setup_graphics(void)
70 {
71         u32 reg32;
72         u16 reg16;
73         u8 reg8;
74
75         reg16 = pci_read_config16(PCI_DEV(0,2,0), PCI_DEVICE_ID);
76         switch (reg16) {
77         case 0x0102: /* GT1 Desktop */
78         case 0x0106: /* GT1 Mobile */
79         case 0x010a: /* GT1 Server */
80         case 0x0112: /* GT2 Desktop */
81         case 0x0116: /* GT2 Mobile */
82         case 0x0122: /* GT2 Desktop >=1.3GHz */
83         case 0x0126: /* GT2 Mobile >=1.3GHz */
84         case 0x0166: /* IvyBridge ??? */
85                 break;
86         default:
87                 printk(BIOS_DEBUG, "Graphics not supported by this CPU/chipset.\n");
88                 return;
89         }
90
91         printk(BIOS_DEBUG, "Initializing Graphics...\n");
92
93         /* Setup IGD memory by setting GGC[7:3] = 1 for 32MB */
94         reg16 = pci_read_config16(PCI_DEV(0,0,0), GGC);
95         reg16 &= ~0x00f8;
96         reg16 |= 1 << 3;
97         /* Program GTT memory by setting GGC[9:8] = 2MB */
98         reg16 &= ~0x0300;
99         reg16 |= 2 << 8;
100         /* Enable VGA decode */
101         reg16 &= ~0x0002;
102         pci_write_config16(PCI_DEV(0,0,0), GGC, reg16);
103
104         /* Enable 256MB aperture */
105         reg8 = pci_read_config8(PCI_DEV(0, 2, 0), MSAC);
106         reg8 &= ~0x06;
107         reg8 |= 0x02;
108         pci_write_config8(PCI_DEV(0, 2, 0), MSAC, reg8);
109
110         /* Erratum workarounds */
111         MCHBAR8(0x5f10) = 0x20;
112
113         reg32 = MCHBAR32(0x5f00);
114         reg32 |= (1 << 9)|(1 << 10);
115         MCHBAR32(0x5f00) = reg32;
116
117         /* Enable SA Clock Gating */
118         reg32 = MCHBAR32(0x5f00);
119         MCHBAR32(0x5f00) = reg32 | 1;
120
121         /* GPU RC6 workaround for sighting 366252 */
122         reg32 = MCHBAR32(0x5d14);
123         reg32 |= (1 << 31);
124         MCHBAR32(0x5d14) = reg32;
125
126         /* VLW */
127         reg32 = MCHBAR32(0x6120);
128         reg32 &= ~(1 << 0);
129         MCHBAR32(0x6120) = reg32;
130
131         reg32 = MCHBAR32(0x5418);
132         reg32 |= (1 << 4) | (1 << 5);
133         MCHBAR32(0x5418) = reg32;
134 }
135
136 void sandybridge_early_initialization(int chipset_type)
137 {
138         u32 capid0_a;
139         u8 reg8;
140
141         /* Device ID Override Enable should be done very early */
142         capid0_a = pci_read_config32(PCI_DEV(0, 0, 0), 0xe4);
143         if (capid0_a & (1 << 10)) {
144                 reg8 = pci_read_config8(PCI_DEV(0, 0, 0), 0xf3);
145                 reg8 &= ~7; /* Clear 2:0 */
146
147                 if (chipset_type == SANDYBRIDGE_MOBILE)
148                         reg8 |= 1; /* Set bit 0 */
149
150                 pci_write_config8(PCI_DEV(0, 0, 0), 0xf3, reg8);
151         }
152
153         /* Setup all BARs required for early PCIe and raminit */
154         sandybridge_setup_bars();
155
156         /* Device Enable */
157         pci_write_config32(PCI_DEV(0, 0, 0), DEVEN, DEVEN_HOST | DEVEN_IGD);
158
159         sandybridge_setup_graphics();
160 }
161
162 void sandybridge_late_initialization(void)
163 {
164 }
165