blob: 8afaf4d344fdd17e3a160e98009c3c69d504e5f8 [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.
Pratik Prajapati1b25c8e2018-05-18 18:07:25 -07005 * Copyright (C) 2015-2018 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>
Kyösti Mälkki13f66502019-03-03 08:01:05 +020018#include <device/mmio.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +020019#include <device/pci_ops.h>
Lee Leahyb0005132015-05-12 18:19:47 -070020#include <bootstate.h>
21#include <console/console.h>
22#include <console/post_codes.h>
23#include <cpu/x86/smm.h>
Subrata Banike7ceae72017-03-08 17:59:40 +053024#include <device/pci.h>
Pratik Prajapati1b25c8e2018-05-18 18:07:25 -070025#include <intelblocks/cpulib.h>
Ravi Sarawadi1483d1f2017-09-28 17:06:01 -070026#include <intelblocks/lpc_lib.h>
Subrata Banikc51df932018-05-08 11:58:01 +053027#include <intelblocks/p2sb.h>
Subrata Banike7ceae72017-03-08 17:59:40 +053028#include <intelblocks/pcr.h>
Subrata Banikc077b222019-08-01 10:50:35 +053029#include <intelblocks/thermal.h>
Lee Leahyb0005132015-05-12 18:19:47 -070030#include <reg_script.h>
31#include <spi-generic.h>
Dhaval Sharma9dca83c2016-01-18 17:28:20 +053032#include <soc/me.h>
Rizwan Qureshicf73c132016-08-04 20:01:12 +053033#include <soc/p2sb.h>
Lee Leahyb0005132015-05-12 18:19:47 -070034#include <soc/pci_devs.h>
Subrata Banike7ceae72017-03-08 17:59:40 +053035#include <soc/pcr_ids.h>
Lee Leahy1d14b3e2015-05-12 18:23:27 -070036#include <soc/pm.h>
Barnali Sarkar0dddcd72016-08-02 17:49:56 +053037#include <soc/smbus.h>
Lee Leahyb0005132015-05-12 18:19:47 -070038#include <soc/systemagent.h>
Barnali Sarkar71464452017-03-31 18:11:49 +053039#include <stdlib.h>
Pratik Prajapati1b25c8e2018-05-18 18:07:25 -070040#include <timer.h>
Subrata Banike7ceae72017-03-08 17:59:40 +053041
Elyes HAOUASc3385072019-03-21 15:38:06 +010042#include "chip.h"
43
Subrata Banike7ceae72017-03-08 17:59:40 +053044#define PSF_BASE_ADDRESS 0xA00
45#define PCR_PSFX_T0_SHDW_PCIEN 0x1C
46#define PCR_PSFX_T0_SHDW_PCIEN_FUNDIS (1 << 8)
Archana Patni7846e342015-11-11 01:29:23 +053047
Subrata Banik7837c202018-05-07 17:13:40 +053048static void disable_sideband_access(void)
Archana Patni7846e342015-11-11 01:29:23 +053049{
Subrata Banik7837c202018-05-07 17:13:40 +053050 p2sb_disable_sideband_access();
Barnali Sarkarfbf10182017-08-11 18:38:38 +053051
52 /* hide p2sb device */
Subrata Banikc51df932018-05-08 11:58:01 +053053 p2sb_hide();
Barnali Sarkarfbf10182017-08-11 18:38:38 +053054}
55
56static void pch_disable_heci(void)
57{
Archana Patni7846e342015-11-11 01:29:23 +053058 /* unhide p2sb device */
Subrata Banikc51df932018-05-08 11:58:01 +053059 p2sb_unhide();
Archana Patni7846e342015-11-11 01:29:23 +053060
61 /* disable heci */
Subrata Banike7ceae72017-03-08 17:59:40 +053062 pcr_or32(PID_PSF1, PSF_BASE_ADDRESS + PCR_PSFX_T0_SHDW_PCIEN,
63 PCR_PSFX_T0_SHDW_PCIEN_FUNDIS);
Archana Patni7846e342015-11-11 01:29:23 +053064
Subrata Banik7837c202018-05-07 17:13:40 +053065 disable_sideband_access();
Archana Patni7846e342015-11-11 01:29:23 +053066}
Lee Leahyb0005132015-05-12 18:19:47 -070067
Subrata Banikc51df932018-05-08 11:58:01 +053068static void pch_finalize_script(struct device *dev)
Lee Leahy1d14b3e2015-05-12 18:23:27 -070069{
Barnali Sarkar71464452017-03-31 18:11:49 +053070 uint32_t reg32;
Lee Leahy1d14b3e2015-05-12 18:23:27 -070071 uint8_t *pmcbase;
Archana Patni7846e342015-11-11 01:29:23 +053072 config_t *config;
Archana Patni6c1bf272015-12-18 23:38:21 +053073 u8 reg8;
Lee Leahyb0005132015-05-12 18:19:47 -070074
Dhaval Sharma9dca83c2016-01-18 17:28:20 +053075 /* Display me status before we hide it */
76 intel_me_status();
77
Subrata Banik639bf8a2017-08-25 12:08:59 +053078 pmcbase = pmc_mmio_regs();
Kyösti Mälkki8950cfb2019-07-13 22:16:25 +030079 config = config_of(dev);
Archana Patni6c1bf272015-12-18 23:38:21 +053080
81 /*
Subrata Banik771d6112017-11-29 16:17:13 +053082 * Set low maximum temp value used for dynamic thermal sensor
83 * shutdown consideration.
84 *
85 * If Dynamic Thermal Shutdown is enabled then PMC logic shuts down the
86 * thermal sensor when CPU is in a C-state and DTS Temp <= LTT.
87 */
88 pch_thermal_configuration();
89
90 /*
Archana Patni6c1bf272015-12-18 23:38:21 +053091 * Disable ACPI PM timer based on dt policy
92 *
93 * Disabling ACPI PM timer is necessary for XTAL OSC shutdown.
94 * Disabling ACPI PM timer also switches off TCO
95 */
96
97 if (config->PmTimerDisabled) {
98 reg8 = read8(pmcbase + PCH_PWRM_ACPI_TMR_CTL);
99 reg8 |= (1 << 1);
100 write8(pmcbase + PCH_PWRM_ACPI_TMR_CTL, reg8);
101 }
102
Naresh G Solankic261c4b2017-04-25 12:09:07 +0530103 /* Disable XTAL shutdown qualification for low power idle. */
104 if (config->s0ix_enable) {
105 reg32 = read32(pmcbase + CIR31C);
106 reg32 |= XTALSDQDIS;
107 write32(pmcbase + CIR31C, reg32);
108 }
109
Archana Patni6c1bf272015-12-18 23:38:21 +0530110 /* we should disable Heci1 based on the devicetree policy */
Archana Patni7846e342015-11-11 01:29:23 +0530111 if (config->HeciEnabled == 0)
112 pch_disable_heci();
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700113}
Lee Leahyb0005132015-05-12 18:19:47 -0700114
Subrata Banikc51df932018-05-08 11:58:01 +0530115static void soc_lockdown(struct device *dev)
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530116{
Barnali Sarkar0818a2a2017-08-17 11:52:39 +0530117 struct soc_intel_skylake_config *config;
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530118 u8 reg8;
Barnali Sarkar0818a2a2017-08-17 11:52:39 +0530119
Kyösti Mälkki8950cfb2019-07-13 22:16:25 +0300120 config = config_of(dev);
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530121
122 /* Global SMI Lock */
123 if (config->LockDownConfigGlobalSmi == 0) {
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530124 reg8 = pci_read_config8(dev, GEN_PMCON_A);
125 reg8 |= SMI_LOCK;
126 pci_write_config8(dev, GEN_PMCON_A, reg8);
127 }
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530128}
129
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700130static void soc_finalize(void *unused)
Lee Leahyb0005132015-05-12 18:19:47 -0700131{
Subrata Banikc51df932018-05-08 11:58:01 +0530132 struct device *dev;
133
134 dev = PCH_DEV_PMC;
135
136 /* Check if PMC is enabled, else return */
Kyösti Mälkki8950cfb2019-07-13 22:16:25 +0300137 if (dev == NULL)
Subrata Banikc51df932018-05-08 11:58:01 +0530138 return;
139
Lee Leahyb0005132015-05-12 18:19:47 -0700140 printk(BIOS_DEBUG, "Finalizing chipset.\n");
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530141
Subrata Banikc51df932018-05-08 11:58:01 +0530142 pch_finalize_script(dev);
Lee Leahyb0005132015-05-12 18:19:47 -0700143
Subrata Banikc51df932018-05-08 11:58:01 +0530144 soc_lockdown(dev);
Rizwan Qureshie64f7942015-11-19 16:01:54 +0530145
Duncan Laurie6f0e6fa2016-02-09 09:40:39 -0800146 printk(BIOS_DEBUG, "Finalizing SMM.\n");
147 outb(APM_CNT_FINALIZE, APM_CNT);
148
Lee Leahyb0005132015-05-12 18:19:47 -0700149 /* Indicate finalize step with post code */
150 post_code(POST_OS_BOOT);
151}
152
Lee Leahy1d14b3e2015-05-12 18:23:27 -0700153BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, soc_finalize, NULL);
154BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_LOAD, BS_ON_EXIT, soc_finalize, NULL);