blob: 171d92e9cd4bfdd2d4014d472ae8de54160b9932 [file] [log] [blame]
Lee Leahyb0005132015-05-12 18:19:47 -07001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2014 Google Inc.
Lee Leahy1d14b3e2015-05-12 18:23:27 -07005 * Copyright (C) 2015 Intel Corporation.
Lee Leahyb0005132015-05-12 18:19:47 -07006 *
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.
Lee Leahyb0005132015-05-12 18:19:47 -070015 */
16
17#include <arch/io.h>
18#include <bootstate.h>
Rizwan Qureshie64f7942015-11-19 16:01:54 +053019#include <chip.h>
Lee Leahyb0005132015-05-12 18:19:47 -070020#include <console/console.h>
21#include <console/post_codes.h>
22#include <cpu/x86/smm.h>
Subrata Banike7ceae72017-03-08 17:59:40 +053023#include <device/pci.h>
Barnali Sarkar71464452017-03-31 18:11:49 +053024#include <intelblocks/fast_spi.h>
Subrata Banike7ceae72017-03-08 17:59:40 +053025#include <intelblocks/pcr.h>
Lee Leahyb0005132015-05-12 18:19:47 -070026#include <reg_script.h>
27#include <spi-generic.h>
Rizwan Qureshie64f7942015-11-19 16:01:54 +053028#include <soc/lpc.h>
Dhaval Sharma9dca83c2016-01-18 17:28:20 +053029#include <soc/me.h>
Rizwan Qureshicf73c132016-08-04 20:01:12 +053030#include <soc/p2sb.h>
Lee Leahyb0005132015-05-12 18:19:47 -070031#include <soc/pci_devs.h>
Subrata Banike7ceae72017-03-08 17:59:40 +053032#include <soc/pcr_ids.h>
Lee Leahy1d14b3e2015-05-12 18:23:27 -070033#include <soc/pm.h>
Barnali Sarkar0dddcd72016-08-02 17:49:56 +053034#include <soc/smbus.h>
Lee Leahyb0005132015-05-12 18:19:47 -070035#include <soc/systemagent.h>
Barnali Sarkar71464452017-03-31 18:11:49 +053036#include <stdlib.h>
Subrata Banike7ceae72017-03-08 17:59:40 +053037
38#define PCR_DMI_GCS 0x274C
39#define PCR_DMI_GCS_BILD (1 << 0)
40#define PSF_BASE_ADDRESS 0xA00
41#define PCR_PSFX_T0_SHDW_PCIEN 0x1C
42#define PCR_PSFX_T0_SHDW_PCIEN_FUNDIS (1 << 8)
Archana Patni7846e342015-11-11 01:29:23 +053043
Archana Patni7846e342015-11-11 01:29:23 +053044static void pch_configure_endpoints(device_t dev, int epmask_id, uint32_t mask)
45{
46 uint32_t reg32;
47
48 reg32 = pci_read_config32(dev, PCH_P2SB_EPMASK(epmask_id));
49 pci_write_config32(dev, PCH_P2SB_EPMASK(epmask_id), reg32 | mask);
50}
51
52static void pch_disable_heci(void)
53{
54 device_t dev;
55 u8 reg8;
56 uint32_t mask;
57
58 dev = PCH_DEV_P2SB;
59
60 /*
61 * if p2sb device 1f.1 is not present or hidden in devicetree
62 * p2sb device becomes NULL
63 */
64 if (!dev)
65 return;
66
67 /* unhide p2sb device */
68 pci_write_config8(dev, PCH_P2SB_E0 + 1, 0);
69
70 /* disable heci */
Subrata Banike7ceae72017-03-08 17:59:40 +053071 pcr_or32(PID_PSF1, PSF_BASE_ADDRESS + PCR_PSFX_T0_SHDW_PCIEN,
72 PCR_PSFX_T0_SHDW_PCIEN_FUNDIS);
Archana Patni7846e342015-11-11 01:29:23 +053073
74 /* Remove the host accessing right to PSF register range. */
75 /* Set p2sb PCI offset EPMASK5 C4h [29, 28, 27, 26] to [1, 1, 1, 1] */
76 mask = (1 << 29) | (1 << 28) | (1 << 27) | (1 << 26);
77 pch_configure_endpoints(dev, 5, mask);
78
79 /* Set the "Endpoint Mask Lock!", P2SB PCI offset E2h bit[1] to 1. */
80 reg8 = pci_read_config8(dev, PCH_P2SB_E0 + 2);
81 pci_write_config8(dev, PCH_P2SB_E0 + 2, reg8 | (1 << 1));
82
83 /* hide p2sb device */
84 pci_write_config8(dev, PCH_P2SB_E0 + 1, 1);
85}
Lee Leahyb0005132015-05-12 18:19:47 -070086
Lee Leahy1d14b3e2015-05-12 18:23:27 -070087static void pch_finalize_script(void)
88{
89 device_t dev;
Barnali Sarkar71464452017-03-31 18:11:49 +053090 uint32_t reg32;
Lee Leahy1d14b3e2015-05-12 18:23:27 -070091 u16 tcobase;
92 u16 tcocnt;
93 uint8_t *pmcbase;
Archana Patni7846e342015-11-11 01:29:23 +053094 config_t *config;
Lee Leahy1d14b3e2015-05-12 18:23:27 -070095 u32 pmsyncreg;
Archana Patni6c1bf272015-12-18 23:38:21 +053096 u8 reg8;
Lee Leahyb0005132015-05-12 18:19:47 -070097
Barnali Sarkar71464452017-03-31 18:11:49 +053098 /* Set FAST_SPI opcode menu */
99 fast_spi_set_opcode_menu();
100
101 /* Lock FAST_SPIBAR */
102 fast_spi_lock_bar();
Lee Leahyb0005132015-05-12 18:19:47 -0700103
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530104 /*TCO Lock down */
Barnali Sarkar49eca132016-08-12 00:05:27 +0530105 tcobase = smbus_tco_regs();
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700106 tcocnt = inw(tcobase + TCO1_CNT);
107 tcocnt |= TCO_LOCK;
108 outw(tcocnt, tcobase + TCO1_CNT);
Lee Leahyb0005132015-05-12 18:19:47 -0700109
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700110 /* Lock down ABASE and sleep stretching policy */
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530111 dev = PCH_DEV_PMC;
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700112 reg32 = pci_read_config32(dev, GEN_PMCON_B);
113 reg32 |= (SLP_STR_POL_LOCK | ACPI_BASE_LOCK);
114 pci_write_config32(dev, GEN_PMCON_B, reg32);
Lee Leahyb0005132015-05-12 18:19:47 -0700115
116 /* PMSYNC */
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700117 pmcbase = pmc_mmio_regs();
118 pmsyncreg = read32(pmcbase + PMSYNC_TPR_CFG);
119 pmsyncreg |= PMSYNC_LOCK;
120 write32(pmcbase + PMSYNC_TPR_CFG, pmsyncreg);
Archana Patni7846e342015-11-11 01:29:23 +0530121
Dhaval Sharma9dca83c2016-01-18 17:28:20 +0530122 /* Display me status before we hide it */
123 intel_me_status();
124
Archana Patni7846e342015-11-11 01:29:23 +0530125 /* we should disable Heci1 based on the devicetree policy */
126 config = dev->chip_info;
Archana Patni6c1bf272015-12-18 23:38:21 +0530127
128 /*
129 * Disable ACPI PM timer based on dt policy
130 *
131 * Disabling ACPI PM timer is necessary for XTAL OSC shutdown.
132 * Disabling ACPI PM timer also switches off TCO
133 */
134
135 if (config->PmTimerDisabled) {
136 reg8 = read8(pmcbase + PCH_PWRM_ACPI_TMR_CTL);
137 reg8 |= (1 << 1);
138 write8(pmcbase + PCH_PWRM_ACPI_TMR_CTL, reg8);
139 }
140
Naresh G Solankic261c4b2017-04-25 12:09:07 +0530141 /* Disable XTAL shutdown qualification for low power idle. */
142 if (config->s0ix_enable) {
143 reg32 = read32(pmcbase + CIR31C);
144 reg32 |= XTALSDQDIS;
145 write32(pmcbase + CIR31C, reg32);
146 }
147
Archana Patni6c1bf272015-12-18 23:38:21 +0530148 /* we should disable Heci1 based on the devicetree policy */
Archana Patni7846e342015-11-11 01:29:23 +0530149 if (config->HeciEnabled == 0)
150 pch_disable_heci();
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700151}
Lee Leahyb0005132015-05-12 18:19:47 -0700152
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530153static void soc_lockdown(void)
154{
155 u8 reg8;
156 device_t dev;
157 const struct device *dev1 = dev_find_slot(0, PCH_DEVFN_LPC);
158 const struct soc_intel_skylake_config *config = dev1->chip_info;
159
160 /* Global SMI Lock */
161 if (config->LockDownConfigGlobalSmi == 0) {
162 dev = PCH_DEV_PMC;
163 reg8 = pci_read_config8(dev, GEN_PMCON_A);
164 reg8 |= SMI_LOCK;
165 pci_write_config8(dev, GEN_PMCON_A, reg8);
166 }
167
168 /* Bios Interface Lock */
169 if (config->LockDownConfigBiosInterface == 0) {
170 pci_write_config8(PCH_DEV_LPC, BIOS_CNTL,
171 pci_read_config8(PCH_DEV_LPC,
172 BIOS_CNTL) | LPC_BC_BILD);
173 /* Reads back for posted write to take effect */
174 pci_read_config8(PCH_DEV_LPC, BIOS_CNTL);
Barnali Sarkar71464452017-03-31 18:11:49 +0530175
176 fast_spi_set_bios_interface_lock_down();
177
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530178 /* GCS reg of DMI */
Subrata Banike7ceae72017-03-08 17:59:40 +0530179 pcr_or8(PID_DMI, PCR_DMI_GCS, PCR_DMI_GCS_BILD);
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530180 }
181
182 /* Bios Lock */
183 if (config->LockDownConfigBiosLock == 0) {
184 pci_write_config8(PCH_DEV_LPC, BIOS_CNTL,
185 pci_read_config8(PCH_DEV_LPC,
186 BIOS_CNTL) | LPC_BC_LE);
Barnali Sarkar71464452017-03-31 18:11:49 +0530187
188 fast_spi_set_lock_enable();
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530189 }
190
191 /* SPIEiss */
192 if (config->LockDownConfigSpiEiss == 0) {
193 pci_write_config8(PCH_DEV_LPC, BIOS_CNTL,
194 pci_read_config8(PCH_DEV_LPC,
195 BIOS_CNTL) | LPC_BC_EISS);
Barnali Sarkar71464452017-03-31 18:11:49 +0530196
197 fast_spi_set_eiss();
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530198 }
199}
200
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700201static void soc_finalize(void *unused)
Lee Leahyb0005132015-05-12 18:19:47 -0700202{
203 printk(BIOS_DEBUG, "Finalizing chipset.\n");
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530204
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700205 pch_finalize_script();
Lee Leahyb0005132015-05-12 18:19:47 -0700206
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530207 soc_lockdown();
208
Duncan Laurie6f0e6fa2016-02-09 09:40:39 -0800209 printk(BIOS_DEBUG, "Finalizing SMM.\n");
210 outb(APM_CNT_FINALIZE, APM_CNT);
211
Lee Leahyb0005132015-05-12 18:19:47 -0700212 /* Indicate finalize step with post code */
213 post_code(POST_OS_BOOT);
214}
215
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700216BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, soc_finalize, NULL);
217BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_LOAD, BS_ON_EXIT, soc_finalize, NULL);