blob: 7aea6b6eae0d9b79df58015943217d43cccae867 [file] [log] [blame]
Aaron Durbinf6933a62012-10-30 09:09:39 -05001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2007-2010 coresystems GmbH
5 * Copyright (C) 2011 The ChromiumOS Authors. All rights reserved.
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>
Aaron Durbinc7633f42013-06-13 17:29:36 -070022#include <stddef.h>
Aaron Durbinf6933a62012-10-30 09:09:39 -050023#include <console/console.h>
Edward O'Callaghan77757c22015-01-04 21:33:39 +110024#include <cpu/intel/haswell/haswell.h>
25#include <northbridge/intel/haswell/haswell.h>
26#include <northbridge/intel/haswell/raminit.h>
27#include <southbridge/intel/lynxpoint/pch.h>
Aaron Durbinf6933a62012-10-30 09:09:39 -050028#include "gpio.h"
Aaron Durbinf6933a62012-10-30 09:09:39 -050029
Aaron Durbin239c2e82012-12-19 11:31:17 -060030const struct rcba_config_instruction rcba_config[] = {
Aaron Durbinf6933a62012-10-30 09:09:39 -050031 /*
32 * GFX INTA -> PIRQA (MSI)
33 * D28IP_P1IP WLAN INTA -> PIRQB
34 * D28IP_P4IP ETH0 INTB -> PIRQC
35 * D29IP_E1P EHCI1 INTA -> PIRQD
36 * D26IP_E2P EHCI2 INTA -> PIRQE
37 * D31IP_SIP SATA INTA -> PIRQF (MSI)
38 * D31IP_SMIP SMBUS INTB -> PIRQG
39 * D31IP_TTIP THRT INTC -> PIRQH
40 * D27IP_ZIP HDA INTA -> PIRQG (MSI)
41 */
42
43 /* Device interrupt pin register (board specific) */
Aaron Durbin239c2e82012-12-19 11:31:17 -060044 RCBA_SET_REG_32(D31IP, (INTC << D31IP_TTIP) | (NOINT << D31IP_SIP2) |
45 (INTB << D31IP_SMIP) | (INTA << D31IP_SIP)),
46 RCBA_SET_REG_32(D30IP, (NOINT << D30IP_PIP)),
47 RCBA_SET_REG_32(D29IP, (INTA << D29IP_E1P)),
48 RCBA_SET_REG_32(D28IP, (INTA << D28IP_P1IP) | (INTC << D28IP_P3IP) |
49 (INTB << D28IP_P4IP)),
50 RCBA_SET_REG_32(D27IP, (INTA << D27IP_ZIP)),
51 RCBA_SET_REG_32(D26IP, (INTA << D26IP_E2P)),
52 RCBA_SET_REG_32(D25IP, (NOINT << D25IP_LIP)),
53 RCBA_SET_REG_32(D22IP, (NOINT << D22IP_MEI1IP)),
Aaron Durbinf6933a62012-10-30 09:09:39 -050054
55 /* Device interrupt route registers */
Aaron Durbin239c2e82012-12-19 11:31:17 -060056 RCBA_SET_REG_32(D31IR, DIR_ROUTE(PIRQF, PIRQG, PIRQH, PIRQA)),
57 RCBA_SET_REG_32(D29IR, DIR_ROUTE(PIRQD, PIRQE, PIRQF, PIRQG)),
58 RCBA_SET_REG_32(D28IR, DIR_ROUTE(PIRQB, PIRQC, PIRQD, PIRQE)),
59 RCBA_SET_REG_32(D27IR, DIR_ROUTE(PIRQG, PIRQH, PIRQA, PIRQB)),
60 RCBA_SET_REG_32(D26IR, DIR_ROUTE(PIRQE, PIRQF, PIRQG, PIRQH)),
61 RCBA_SET_REG_32(D25IR, DIR_ROUTE(PIRQA, PIRQB, PIRQC, PIRQD)),
62 RCBA_SET_REG_32(D22IR, DIR_ROUTE(PIRQA, PIRQB, PIRQC, PIRQD)),
Aaron Durbinf6933a62012-10-30 09:09:39 -050063
64 /* Disable unused devices (board specific) */
Aaron Durbin239c2e82012-12-19 11:31:17 -060065 RCBA_RMW_REG_32(FD, ~0, PCH_DISABLE_ALWAYS),
Aaron Durbinf6933a62012-10-30 09:09:39 -050066
Aaron Durbin239c2e82012-12-19 11:31:17 -060067 RCBA_END_CONFIG,
68};
Aaron Durbinf6933a62012-10-30 09:09:39 -050069
Aaron Durbina2671612013-02-06 21:41:01 -060070void mainboard_romstage_entry(unsigned long bist)
Aaron Durbinf6933a62012-10-30 09:09:39 -050071{
Aaron Durbinf6933a62012-10-30 09:09:39 -050072 struct pei_data pei_data = {
Edward O'Callaghanc686c952014-05-24 02:07:18 +100073 .pei_version = PEI_VERSION,
74 .mchbar = DEFAULT_MCHBAR,
75 .dmibar = DEFAULT_DMIBAR,
76 .epbar = DEFAULT_EPBAR,
77 .pciexbar = DEFAULT_PCIEXBAR,
78 .smbusbar = SMBUS_IO_BASE,
79 .wdbbar = 0x4000000,
80 .wdbsize = 0x1000,
81 .hpet_address = HPET_ADDR,
82 .rcba = DEFAULT_RCBA,
83 .pmbase = DEFAULT_PMBASE,
84 .gpiobase = DEFAULT_GPIOBASE,
85 .temp_mmio_base = 0xfed08000,
86 .system_type = 0, // 0 Mobile, 1 Desktop/Server
87 .tseg_size = CONFIG_SMM_TSEG_SIZE,
88 .spd_addresses = { 0xa0, 0xa2, 0xa4, 0xa6 },
89 .ec_present = 0,
Aaron Durbinf6933a62012-10-30 09:09:39 -050090 // 0 = leave channel enabled
91 // 1 = disable dimm 0 on channel
92 // 2 = disable dimm 1 on channel
93 // 3 = disable dimm 0+1 on channel
Edward O'Callaghanc686c952014-05-24 02:07:18 +100094 .dimm_channel0_disabled = 0,
95 .dimm_channel1_disabled = 0,
96 .max_ddr3_freq = 1600,
97 .usb2_ports = {
Duncan Lauriebcfcfa42013-06-03 10:41:12 -070098 /* Length, Enable, OCn#, Location */
99 { 0x0040, 1, 0, /* P0: Back USB3 port (OC0) */
100 USB_PORT_BACK_PANEL },
101 { 0x0040, 1, 0, /* P1: Back USB3 port (OC0) */
102 USB_PORT_BACK_PANEL },
103 { 0x0040, 1, 1, /* P2: Flex Port on bottom (OC1) */
104 USB_PORT_FLEX },
105 { 0x0040, 1, USB_OC_PIN_SKIP, /* P3: Dock connector */
106 USB_PORT_DOCK },
107 { 0x0040, 1, USB_OC_PIN_SKIP, /* P4: Mini PCIE */
108 USB_PORT_MINI_PCIE },
109 { 0x0040, 1, 1, /* P5: USB eSATA header (OC1) */
110 USB_PORT_FLEX },
111 { 0x0040, 1, 3, /* P6: Front Header J8H2 (OC3) */
112 USB_PORT_FRONT_PANEL },
113 { 0x0040, 1, 3, /* P7: Front Header J8H2 (OC3) */
114 USB_PORT_FRONT_PANEL },
115 { 0x0040, 1, 4, /* P8: USB/LAN Jack (OC4) */
116 USB_PORT_FRONT_PANEL },
117 { 0x0040, 1, 4, /* P9: USB/LAN Jack (OC4) */
118 USB_PORT_FRONT_PANEL },
119 { 0x0040, 1, 5, /* P10: Front Header J7H3 (OC5) */
120 USB_PORT_FRONT_PANEL },
121 { 0x0040, 1, 5, /* P11: Front Header J7H3 (OC5) */
122 USB_PORT_FRONT_PANEL },
123 { 0x0040, 1, 6, /* P12: USB/DP Jack (OC6) */
124 USB_PORT_FRONT_PANEL },
125 { 0x0040, 1, 6, /* P13: USB/DP Jack (OC6) */
126 USB_PORT_FRONT_PANEL },
Aaron Durbinb1c25e72013-05-23 15:57:46 -0500127 },
Edward O'Callaghanc686c952014-05-24 02:07:18 +1000128 .usb3_ports = {
Aaron Durbinb1c25e72013-05-23 15:57:46 -0500129 /* Enable, OCn# */
130 { 1, 0 }, /* P1; */
131 { 1, 0 }, /* P2; */
132 { 1, 0 }, /* P3; */
133 { 1, 0 }, /* P4; */
134 { 1, 0 }, /* P6; */
135 { 1, 0 }, /* P6; */
Aaron Durbinf6933a62012-10-30 09:09:39 -0500136 },
137 };
138
Aaron Durbina2671612013-02-06 21:41:01 -0600139 struct romstage_params romstage_params = {
140 .pei_data = &pei_data,
141 .gpio_map = &mainboard_gpio_map,
142 .rcba_config = &rcba_config[0],
143 .bist = bist,
Aaron Durbinc7633f42013-06-13 17:29:36 -0700144 .copy_spd = NULL,
Aaron Durbina2671612013-02-06 21:41:01 -0600145 };
Aaron Durbinf6933a62012-10-30 09:09:39 -0500146
Aaron Durbina2671612013-02-06 21:41:01 -0600147 /* Call into the real romstage main with this board's attributes. */
148 romstage_common(&romstage_params);
Aaron Durbinf6933a62012-10-30 09:09:39 -0500149}