blob: c79f2acfbd3af9221c97050daf4c8005f0c7b4ad [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
Barnali Sarkarfbf10182017-08-11 18:38:38 +053052static void disable_sideband_access(void)
Archana Patni7846e342015-11-11 01:29:23 +053053{
54 device_t dev;
55 u8 reg8;
56 uint32_t mask;
57
58 dev = PCH_DEV_P2SB;
59
60 /*
Barnali Sarkarfbf10182017-08-11 18:38:38 +053061 * Set p2sb PCI offset EPMASK5 C4h [29, 28, 27, 26] to disable Sideband
62 * access for PCI Root Bridge.
63 * Set p2sb PCI offset EPMASK5 C4h [17, 16,10, 1] to disable Sideband
64 * access for MIPI controller.
65 */
66 mask = (1 << 29) | (1 << 28) | (1 << 27) | (1 << 26) | (1 << 17) |
67 (1 << 16) | (1 << 10) | (1 << 1);
68 pch_configure_endpoints(dev, 5, mask);
69
70 /*
71 * Set p2sb PCI offset EPMASK7 CCh ports E6, E5 (bits 6, 5)
72 * to disable Sideband access for XHCI controller.
73 */
74 mask = (1 << 6) | (1 << 5);
75 pch_configure_endpoints(dev, 7, mask);
76
77 /* Set the "Endpoint Mask Lock!", P2SB PCI offset E2h bit[1] to 1. */
78 reg8 = pci_read_config8(dev, PCH_P2SB_E0 + 2);
79 pci_write_config8(dev, PCH_P2SB_E0 + 2, reg8 | (1 << 1));
80
81 /* hide p2sb device */
82 pci_write_config8(dev, PCH_P2SB_E0 + 1, 1);
83}
84
85static void pch_disable_heci(void)
86{
87 device_t dev = PCH_DEV_P2SB;
88
89 /*
Archana Patni7846e342015-11-11 01:29:23 +053090 * if p2sb device 1f.1 is not present or hidden in devicetree
91 * p2sb device becomes NULL
92 */
93 if (!dev)
94 return;
95
96 /* unhide p2sb device */
97 pci_write_config8(dev, PCH_P2SB_E0 + 1, 0);
98
99 /* disable heci */
Subrata Banike7ceae72017-03-08 17:59:40 +0530100 pcr_or32(PID_PSF1, PSF_BASE_ADDRESS + PCR_PSFX_T0_SHDW_PCIEN,
101 PCR_PSFX_T0_SHDW_PCIEN_FUNDIS);
Archana Patni7846e342015-11-11 01:29:23 +0530102
Barnali Sarkarfbf10182017-08-11 18:38:38 +0530103 disable_sideband_access();
Archana Patni7846e342015-11-11 01:29:23 +0530104}
Lee Leahyb0005132015-05-12 18:19:47 -0700105
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700106static void pch_finalize_script(void)
107{
108 device_t dev;
Barnali Sarkar71464452017-03-31 18:11:49 +0530109 uint32_t reg32;
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700110 u16 tcobase;
111 u16 tcocnt;
112 uint8_t *pmcbase;
Archana Patni7846e342015-11-11 01:29:23 +0530113 config_t *config;
Archana Patni6c1bf272015-12-18 23:38:21 +0530114 u8 reg8;
Lee Leahyb0005132015-05-12 18:19:47 -0700115
Barnali Sarkar71464452017-03-31 18:11:49 +0530116 /* Set FAST_SPI opcode menu */
117 fast_spi_set_opcode_menu();
118
119 /* Lock FAST_SPIBAR */
120 fast_spi_lock_bar();
Lee Leahyb0005132015-05-12 18:19:47 -0700121
Subrata Banik639bf8a2017-08-25 12:08:59 +0530122 /* TCO Lock down */
Barnali Sarkar49eca132016-08-12 00:05:27 +0530123 tcobase = smbus_tco_regs();
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700124 tcocnt = inw(tcobase + TCO1_CNT);
125 tcocnt |= TCO_LOCK;
126 outw(tcocnt, tcobase + TCO1_CNT);
Lee Leahyb0005132015-05-12 18:19:47 -0700127
Dhaval Sharma9dca83c2016-01-18 17:28:20 +0530128 /* Display me status before we hide it */
129 intel_me_status();
130
Subrata Banik84f428f2017-08-25 11:54:10 +0530131 dev = PCH_DEV_PMC;
Subrata Banik639bf8a2017-08-25 12:08:59 +0530132 pmcbase = pmc_mmio_regs();
Archana Patni7846e342015-11-11 01:29:23 +0530133 config = dev->chip_info;
Archana Patni6c1bf272015-12-18 23:38:21 +0530134
135 /*
136 * Disable ACPI PM timer based on dt policy
137 *
138 * Disabling ACPI PM timer is necessary for XTAL OSC shutdown.
139 * Disabling ACPI PM timer also switches off TCO
140 */
141
142 if (config->PmTimerDisabled) {
143 reg8 = read8(pmcbase + PCH_PWRM_ACPI_TMR_CTL);
144 reg8 |= (1 << 1);
145 write8(pmcbase + PCH_PWRM_ACPI_TMR_CTL, reg8);
146 }
147
Naresh G Solankic261c4b2017-04-25 12:09:07 +0530148 /* Disable XTAL shutdown qualification for low power idle. */
149 if (config->s0ix_enable) {
150 reg32 = read32(pmcbase + CIR31C);
151 reg32 |= XTALSDQDIS;
152 write32(pmcbase + CIR31C, reg32);
153 }
154
Archana Patni6c1bf272015-12-18 23:38:21 +0530155 /* we should disable Heci1 based on the devicetree policy */
Archana Patni7846e342015-11-11 01:29:23 +0530156 if (config->HeciEnabled == 0)
157 pch_disable_heci();
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700158}
Lee Leahyb0005132015-05-12 18:19:47 -0700159
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530160static void soc_lockdown(void)
161{
162 u8 reg8;
163 device_t dev;
164 const struct device *dev1 = dev_find_slot(0, PCH_DEVFN_LPC);
165 const struct soc_intel_skylake_config *config = dev1->chip_info;
166
167 /* Global SMI Lock */
168 if (config->LockDownConfigGlobalSmi == 0) {
169 dev = PCH_DEV_PMC;
170 reg8 = pci_read_config8(dev, GEN_PMCON_A);
171 reg8 |= SMI_LOCK;
172 pci_write_config8(dev, GEN_PMCON_A, reg8);
173 }
174
Subrata Banikc204aaa2017-08-17 15:49:58 +0530175 if (config->chipset_lockdown == CHIPSET_LOCKDOWN_COREBOOT) {
176 /* Bios Interface Lock */
Barnali Sarkar71464452017-03-31 18:11:49 +0530177 fast_spi_set_bios_interface_lock_down();
178
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530179 /* GCS reg of DMI */
Subrata Banike7ceae72017-03-08 17:59:40 +0530180 pcr_or8(PID_DMI, PCR_DMI_GCS, PCR_DMI_GCS_BILD);
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530181
Subrata Banikc204aaa2017-08-17 15:49:58 +0530182 /* Bios Lock */
Barnali Sarkar71464452017-03-31 18:11:49 +0530183 fast_spi_set_lock_enable();
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530184 }
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530185}
186
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700187static void soc_finalize(void *unused)
Lee Leahyb0005132015-05-12 18:19:47 -0700188{
189 printk(BIOS_DEBUG, "Finalizing chipset.\n");
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530190
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700191 pch_finalize_script();
Lee Leahyb0005132015-05-12 18:19:47 -0700192
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530193 soc_lockdown();
194
Duncan Laurie6f0e6fa2016-02-09 09:40:39 -0800195 printk(BIOS_DEBUG, "Finalizing SMM.\n");
196 outb(APM_CNT_FINALIZE, APM_CNT);
197
Lee Leahyb0005132015-05-12 18:19:47 -0700198 /* Indicate finalize step with post code */
199 post_code(POST_OS_BOOT);
200}
201
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700202BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, soc_finalize, NULL);
203BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_LOAD, BS_ON_EXIT, soc_finalize, NULL);