blob: 2719e337e2a20970648008eba75fc4a2eef145f6 [file] [log] [blame]
Angel Ponsd32b6de2020-04-03 01:23:13 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Stefan Reinauere1ae4b22012-04-27 23:20:58 +02002
Arthur Heymansfa5d0f82019-11-12 19:11:50 +01003#include <bootblock_common.h>
Stefan Reinauere1ae4b22012-04-27 23:20:58 +02004#include <stdint.h>
Stefan Reinauere1ae4b22012-04-27 23:20:58 +02005#include <pc80/mc146818rtc.h>
Kyösti Mälkkie3ddee02014-05-03 10:45:28 +03006#include <bootmode.h>
Edward O'Callaghan1b3acb12014-06-01 18:04:05 +10007#include <superio/ite/common/ite.h>
8#include <superio/ite/it8772f/it8772f.h>
Edward O'Callaghan77757c22015-01-04 21:33:39 +11009#include <northbridge/intel/sandybridge/sandybridge.h>
10#include <northbridge/intel/sandybridge/raminit.h>
11#include <southbridge/intel/bd82x6x/pch.h>
Patrick Rudolphe8e66f42016-02-06 17:42:42 +010012#include <southbridge/intel/common/gpio.h>
Edward O'Callaghan74834e02015-01-04 04:17:35 +110013#include <superio/smsc/lpc47n207/lpc47n207.h>
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020014
Edward O'Callaghan1b3acb12014-06-01 18:04:05 +100015#define SERIAL_DEV PNP_DEV(0x2e, IT8772F_SP1)
Joel Linnfb516612024-03-29 14:08:35 +010016#define GPIO_DEV PNP_DEV(0x2e, IT8772F_GPIO)
17#define EC_DEV PNP_DEV(0x2e, IT8772F_EC)
Edward O'Callaghan1b3acb12014-06-01 18:04:05 +100018
Arthur Heymans9c538342019-11-12 16:42:33 +010019void mainboard_late_rcba_config(void)
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020020{
Kyösti Mälkki6f499062015-06-06 11:52:24 +030021 /*
22 * GFX INTA -> PIRQA (MSI)
23 * D28IP_P1IP WLAN INTA -> PIRQB
24 * D28IP_P4IP ETH0 INTB -> PIRQC
25 * D29IP_E1P EHCI1 INTA -> PIRQD
26 * D26IP_E2P EHCI2 INTA -> PIRQE
27 * D31IP_SIP SATA INTA -> PIRQF (MSI)
28 * D31IP_SMIP SMBUS INTB -> PIRQG
29 * D31IP_TTIP THRT INTC -> PIRQH
30 * D27IP_ZIP HDA INTA -> PIRQG (MSI)
31 */
32
33 /* Device interrupt pin register (board specific) */
34 RCBA32(D31IP) = (INTC << D31IP_TTIP) | (NOINT << D31IP_SIP2) |
35 (INTB << D31IP_SMIP) | (INTA << D31IP_SIP);
36 RCBA32(D30IP) = (NOINT << D30IP_PIP);
37 RCBA32(D29IP) = (INTA << D29IP_E1P);
38 RCBA32(D28IP) = (INTA << D28IP_P1IP) | (INTC << D28IP_P3IP) |
39 (INTB << D28IP_P4IP);
40 RCBA32(D27IP) = (INTA << D27IP_ZIP);
41 RCBA32(D26IP) = (INTA << D26IP_E2P);
42 RCBA32(D25IP) = (NOINT << D25IP_LIP);
43 RCBA32(D22IP) = (NOINT << D22IP_MEI1IP);
44
45 /* Device interrupt route registers */
46 DIR_ROUTE(D31IR, PIRQF, PIRQG, PIRQH, PIRQA);
47 DIR_ROUTE(D29IR, PIRQD, PIRQE, PIRQF, PIRQG);
48 DIR_ROUTE(D28IR, PIRQB, PIRQC, PIRQD, PIRQE);
49 DIR_ROUTE(D27IR, PIRQG, PIRQH, PIRQA, PIRQB);
50 DIR_ROUTE(D26IR, PIRQE, PIRQF, PIRQG, PIRQH);
51 DIR_ROUTE(D25IR, PIRQA, PIRQB, PIRQC, PIRQD);
52 DIR_ROUTE(D22IR, PIRQA, PIRQB, PIRQC, PIRQD);
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020053}
54
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020055static void setup_sio_gpios(void)
56{
57 /*
58 * GPIO10 as USBPWRON12#
59 * GPIO12 as USBPWRON13#
60 */
Joel Linnfb516612024-03-29 14:08:35 +010061 it8772f_gpio_setup(GPIO_DEV, 1, 0x05, 0x05, 0x00, 0x05, 0x05);
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020062
63 /*
64 * GPIO22 as wake SCI#
65 */
Joel Linnfb516612024-03-29 14:08:35 +010066 it8772f_gpio_setup(GPIO_DEV, 2, 0x04, 0x04, 0x00, 0x04, 0x04);
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020067
68 /*
69 * GPIO32 as EXTSMI#
70 */
Joel Linnfb516612024-03-29 14:08:35 +010071 it8772f_gpio_setup(GPIO_DEV, 3, 0x04, 0x04, 0x00, 0x04, 0x04);
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020072
73 /*
74 * GPIO45 as LED_POWER#
75 */
Matt DeVillierffae7462016-11-07 16:43:03 -060076 it8772f_gpio_led(GPIO_DEV, 4 /* set */, (0x1 << 5) /* select */,
77 (0x1 << 5) /* polarity */, (0x1 << 5) /* 1 = pullup */,
Elyes HAOUASa5aad2e2016-09-19 09:47:16 -060078 (0x1 << 5) /* output */, (0x1 << 5) /* 1 = Simple IO function */,
david80ef7b72015-01-19 17:11:36 +080079 SIO_GPIO_BLINK_GPIO45, IT8772F_GPIO_BLINK_FREQUENCY_1_HZ);
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020080
81 /*
82 * GPIO51 as USBPWRON8#
83 * GPIO52 as USBPWRON1#
84 */
Joel Linnfb516612024-03-29 14:08:35 +010085 it8772f_gpio_setup(GPIO_DEV, 5, 0x06, 0x06, 0x00, 0x06, 0x06);
86 it8772f_gpio_setup(GPIO_DEV, 6, 0x00, 0x00, 0x00, 0x00, 0x00);
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020087}
88
Vladimir Serbinenkoffbb3c02016-02-10 01:36:25 +010089void mainboard_fill_pei_data(struct pei_data *pei_data)
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020090{
Keith Hui7039edd2023-07-21 10:12:05 -040091 /* TODO: Confirm if nortbridge_fill_pei_data() gets .system_type right (should be 0) */
Vladimir Serbinenkoffbb3c02016-02-10 01:36:25 +010092}
Stefan Reinauere1ae4b22012-04-27 23:20:58 +020093
Vladimir Serbinenkod2990c92016-02-10 02:52:42 +010094const struct southbridge_usb_port mainboard_usb_ports[] = {
Elyes HAOUAS44f558e2020-02-24 13:26:04 +010095 /* enabled power USB oc pin */
Vladimir Serbinenkod2990c92016-02-10 02:52:42 +010096 { 1, 1, 0 }, /* P0: Front port (OC0) */
97 { 1, 0, 1 }, /* P1: Back port (OC1) */
98 { 1, 0, -1 }, /* P2: MINIPCIE1 (no OC) */
99 { 1, 0, -1 }, /* P3: MMC (no OC) */
100 { 1, 1, 2 }, /* P4: Front port (OC2) */
101 { 0, 0, -1 }, /* P5: Empty */
102 { 0, 0, -1 }, /* P6: Empty */
103 { 0, 0, -1 }, /* P7: Empty */
104 { 1, 0, 4 }, /* P8: Back port (OC4) */
105 { 1, 0, -1 }, /* P9: MINIPCIE3 (no OC) */
106 { 1, 0, -1 }, /* P10: BLUETOOTH (no OC) */
107 { 0, 0, -1 }, /* P11: Empty */
108 { 1, 0, 6 }, /* P12: Back port (OC6) */
109 { 1, 0, 5 }, /* P13: Back port (OC5) */
110};
111
Arthur Heymansfa5d0f82019-11-12 19:11:50 +0100112void bootblock_mainboard_early_init(void)
Vladimir Serbinenkoffbb3c02016-02-10 01:36:25 +0100113{
Nico Huber25128a72019-11-17 01:24:44 +0100114 if (CONFIG(DRIVERS_UART_8250IO))
115 try_enabling_LPC47N207_uart();
116
Vladimir Serbinenkoffbb3c02016-02-10 01:36:25 +0100117 setup_sio_gpios();
Stefan Reinauere1ae4b22012-04-27 23:20:58 +0200118
Vladimir Serbinenkoffbb3c02016-02-10 01:36:25 +0100119 /* Early SuperIO setup */
Joel Linnfb516612024-03-29 14:08:35 +0100120 ite_ac_resume_southbridge(EC_DEV);
Vladimir Serbinenkoffbb3c02016-02-10 01:36:25 +0100121 ite_kill_watchdog(GPIO_DEV);
122 ite_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);
Stefan Reinauere1ae4b22012-04-27 23:20:58 +0200123}