blob: eb670127816dfcdce81685ea89f4ec6fb7463cda [file] [log] [blame]
Andrey Petrovf35804b2017-06-05 13:22:41 -07001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2014 Google Inc.
5 * Copyright (C) 2017 Intel Corporation.
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
17#include <device/device.h>
Andrey Petrovf35804b2017-06-05 13:22:41 -070018#include <intelblocks/fast_spi.h>
Furquan Shaikh1876f3a2017-12-07 18:39:34 -080019#include <intelblocks/gspi.h>
Caveh Jalali1428f012018-01-23 22:15:24 -080020#include <intelblocks/lpc_lib.h>
Subrata Banik7837c202018-05-07 17:13:40 +053021#include <intelblocks/p2sb.h>
Andrey Petrovf35804b2017-06-05 13:22:41 -070022#include <intelblocks/pcr.h>
Lijian Zhao031020e2017-12-15 12:58:07 -080023#include <intelblocks/pmclib.h>
Subrata Banik7837c202018-05-07 17:13:40 +053024#include <intelblocks/rtc.h>
Andrey Petrovf35804b2017-06-05 13:22:41 -070025#include <intelblocks/smbus.h>
26#include <soc/bootblock.h>
27#include <soc/iomap.h>
28#include <soc/lpc.h>
29#include <soc/p2sb.h>
30#include <soc/pci_devs.h>
31#include <soc/pcr_ids.h>
Lijian Zhaob3dfcb82017-08-16 22:18:52 -070032#include <soc/pm.h>
Andrey Petrovf35804b2017-06-05 13:22:41 -070033#include <soc/smbus.h>
34
35#define PCR_PSF3_TO_SHDW_PMC_REG_BASE 0x1400
36#define PCR_PSFX_TO_SHDW_BAR0 0
37#define PCR_PSFX_TO_SHDW_BAR1 0x4
38#define PCR_PSFX_TO_SHDW_BAR2 0x8
39#define PCR_PSFX_TO_SHDW_BAR3 0xC
40#define PCR_PSFX_TO_SHDW_BAR4 0x10
41#define PCR_PSFX_TO_SHDW_PCIEN_IOEN 0x01
42#define PCR_PSFX_T0_SHDW_PCIEN 0x1C
43
Andrey Petrovf35804b2017-06-05 13:22:41 -070044#define PCR_DMI_ACPIBA 0x27B4
45#define PCR_DMI_ACPIBDID 0x27B8
46#define PCR_DMI_PMBASEA 0x27AC
47#define PCR_DMI_PMBASEC 0x27B0
48#define PCR_DMI_TCOBASE 0x2778
49#define TCOEN (1 << 1) /* Enable TCO I/O range decode. */
50
51#define PCR_DMI_LPCIOD 0x2770
52#define PCR_DMI_LPCIOE 0x2774
53
Andrey Petrovf35804b2017-06-05 13:22:41 -070054static void soc_config_pwrmbase(void)
55{
56 uint32_t reg32;
57
58 /* Assign Resources to PWRMBASE */
59 /* Clear BIT 1-2 Command Register */
60 reg32 = pci_read_config32(PCH_DEV_PMC, PCI_COMMAND);
61 reg32 &= ~(PCI_COMMAND_MEMORY);
62 pci_write_config32(PCH_DEV_PMC, PCI_COMMAND, reg32);
63
64 /* Program PWRM Base */
65 pci_write_config32(PCH_DEV_PMC, PWRMBASE, PCH_PWRM_BASE_ADDRESS);
66
67 /* Enable Bus Master and MMIO Space */
68 reg32 = pci_read_config32(PCH_DEV_PMC, PCI_COMMAND);
69 reg32 |= PCI_COMMAND_MEMORY;
70 pci_write_config32(PCH_DEV_PMC, PCI_COMMAND, reg32);
71
72 /* Enable PWRM in PMC */
73 reg32 = read32((void *)(PCH_PWRM_BASE_ADDRESS + ACTL));
74 write32((void *)(PCH_PWRM_BASE_ADDRESS + ACTL), reg32 | PWRM_EN);
75}
76
77void bootblock_pch_early_init(void)
78{
79 fast_spi_early_init(SPI_BASE_ADDRESS);
Furquan Shaikh1876f3a2017-12-07 18:39:34 -080080 gspi_early_bar_init();
Subrata Banik7837c202018-05-07 17:13:40 +053081 p2sb_enable_bar();
82 p2sb_configure_hpet();
Andrey Petrovf35804b2017-06-05 13:22:41 -070083 /*
84 * Enabling PWRM Base for accessing
85 * Global Reset Cause Register.
86 */
87 soc_config_pwrmbase();
88}
89
90
91static void soc_config_acpibase(void)
92{
93 uint32_t pmc_reg_value;
94
95 pmc_reg_value = pcr_read32(PID_PSF3, PCR_PSF3_TO_SHDW_PMC_REG_BASE +
96 PCR_PSFX_TO_SHDW_BAR4);
97
98 if (pmc_reg_value != 0xFFFFFFFF)
99 {
100 /* Disable Io Space before changing the address */
101 pcr_rmw32(PID_PSF3, PCR_PSF3_TO_SHDW_PMC_REG_BASE +
102 PCR_PSFX_T0_SHDW_PCIEN,
103 ~PCR_PSFX_TO_SHDW_PCIEN_IOEN, 0);
104 /* Program ABASE in PSF3 PMC space BAR4*/
105 pcr_write32(PID_PSF3, PCR_PSF3_TO_SHDW_PMC_REG_BASE +
106 PCR_PSFX_TO_SHDW_BAR4,
107 ACPI_BASE_ADDRESS);
108 /* Enable IO Space */
109 pcr_rmw32(PID_PSF3, PCR_PSF3_TO_SHDW_PMC_REG_BASE +
110 PCR_PSFX_T0_SHDW_PCIEN,
111 ~0, PCR_PSFX_TO_SHDW_PCIEN_IOEN);
112 }
113}
114
115static void soc_config_tco(void)
116{
117 uint32_t reg32;
118 uint16_t tcobase;
119 uint16_t tcocnt;
120
121 /* Disable TCO in SMBUS Device first before changing Base Address */
122 reg32 = pci_read_config32(PCH_DEV_SMBUS, TCOCTL);
Lijian Zhao6dc125f2017-07-13 19:11:45 -0700123 reg32 &= ~TCO_BASE_EN;
Andrey Petrovf35804b2017-06-05 13:22:41 -0700124 pci_write_config32(PCH_DEV_SMBUS, TCOCTL, reg32);
125
126 /* Program TCO Base */
127 tcobase = TCO_BASE_ADDRESS;
128 pci_write_config32(PCH_DEV_SMBUS, TCOBASE, tcobase);
129
130 /* Enable TCO in SMBUS */
131 pci_write_config32(PCH_DEV_SMBUS, TCOCTL, reg32 | TCO_BASE_EN);
132
133 /*
134 * Program "TCO Base Address" PCR[DMI] + 2778h[15:5, 1]
135 */
136 pcr_write32(PID_DMI, PCR_DMI_TCOBASE, tcobase | TCOEN);
137
138 /* Program TCO timer halt */
139 tcocnt = inw(tcobase + TCO1_CNT);
140 tcocnt |= TCO_TMR_HLT;
141 outw(tcocnt, tcobase + TCO1_CNT);
142}
143
144void pch_early_iorange_init(void)
145{
146 uint16_t dec_rng, dec_en = 0;
147
148 /* IO Decode Range */
149 if (IS_ENABLED(CONFIG_DRIVERS_UART_8250IO) &&
150 IS_ENABLED(CONFIG_UART_DEBUG)) {
151 dec_rng = COMA_RANGE | (COMB_RANGE << 4);
152 dec_en = COMA_LPC_EN | COMB_LPC_EN;
153 pci_write_config16(PCH_DEV_LPC, LPC_IO_DEC, dec_rng);
154 pcr_write16(PID_DMI, PCR_DMI_LPCIOD, dec_rng);
155 }
156
157 /* IO Decode Enable */
Lijian Zhao9b50a572017-12-21 13:40:07 -0800158 dec_en |= SE_LPC_EN | KBC_LPC_EN | MC1_LPC_EN | GAMEL_LPC_EN;
Andrey Petrovf35804b2017-06-05 13:22:41 -0700159 pci_write_config16(PCH_DEV_LPC, LPC_EN, dec_en);
160 pcr_write16(PID_DMI, PCR_DMI_LPCIOE, dec_en);
Caveh Jalali1428f012018-01-23 22:15:24 -0800161
162 /* Program generic IO Decode Range */
163 pch_enable_lpc();
Andrey Petrovf35804b2017-06-05 13:22:41 -0700164}
165
166void pch_early_init(void)
167{
168 /*
169 * Enabling ABASE for accessing PM1_STS, PM1_EN, PM1_CNT,
170 * GPE0_STS, GPE0_EN registers.
171 */
172 soc_config_acpibase();
173
174 /* Programming TCO_BASE_ADDRESS and TCO Timer Halt */
175 soc_config_tco();
176
177 /* Program SMBUS_BASE_ADDRESS and Enable it */
178 smbus_common_init();
179
Lijian Zhao031020e2017-12-15 12:58:07 -0800180 /* Set up GPE configuration */
181 pmc_gpe_init();
182
Andrey Petrovf35804b2017-06-05 13:22:41 -0700183 enable_rtc_upper_bank();
Andrey Petrovf35804b2017-06-05 13:22:41 -0700184}