blob: 3205c7f303b1b4f4b608c923c6b6a8190613400f [file] [log] [blame]
Angel Ponsf5627e82020-04-05 15:46:52 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Lijian Zhao6cf501c2017-10-10 18:26:18 -07002
Kyösti Mälkki13f66502019-03-03 08:01:05 +02003#include <device/mmio.h>
Kyösti Mälkki32d47eb2019-09-28 00:00:30 +03004#include <intelblocks/cfg.h>
Michael Niewöhnerdce63592019-09-17 18:48:00 +02005#include <intelblocks/pmclib.h>
Subrata Banik9cd99a12018-05-28 16:12:03 +05306#include <intelpch/lockdown.h>
Lijian Zhao6cf501c2017-10-10 18:26:18 -07007#include <soc/pm.h>
Lijian Zhao6cf501c2017-10-10 18:26:18 -07008
Subrata Banik9cd99a12018-05-28 16:12:03 +05309static void pmc_lock_pmsync(void)
Lijian Zhao6cf501c2017-10-10 18:26:18 -070010{
Subrata Banik9cd99a12018-05-28 16:12:03 +053011 uint8_t *pmcbase;
12 uint32_t pmsyncreg;
Lijian Zhao6cf501c2017-10-10 18:26:18 -070013
Lijian Zhao6cf501c2017-10-10 18:26:18 -070014 pmcbase = pmc_mmio_regs();
Subrata Banik9cd99a12018-05-28 16:12:03 +053015
Lijian Zhao6cf501c2017-10-10 18:26:18 -070016 pmsyncreg = read32(pmcbase + PMSYNC_TPR_CFG);
Subrata Banikc4986eb2018-05-09 14:55:09 +053017 pmsyncreg |= PCH2CPU_TPR_CFG_LOCK;
Lijian Zhao6cf501c2017-10-10 18:26:18 -070018 write32(pmcbase + PMSYNC_TPR_CFG, pmsyncreg);
Subrata Banik9cd99a12018-05-28 16:12:03 +053019}
Lijian Zhao6cf501c2017-10-10 18:26:18 -070020
Subrata Banik9cd99a12018-05-28 16:12:03 +053021static void pmc_lock_abase(void)
22{
23 uint8_t *pmcbase;
24 uint32_t reg32;
25
26 pmcbase = pmc_mmio_regs();
27
Lijian Zhao6cf501c2017-10-10 18:26:18 -070028 reg32 = read32(pmcbase + GEN_PMCON_B);
29 reg32 |= (SLP_STR_POL_LOCK | ACPI_BASE_LOCK);
30 write32(pmcbase + GEN_PMCON_B, reg32);
Lijian Zhao6cf501c2017-10-10 18:26:18 -070031}
32
Subrata Banik9cd99a12018-05-28 16:12:03 +053033static void pmc_lock_smi(void)
Lijian Zhao6cf501c2017-10-10 18:26:18 -070034{
Subrata Banik9cd99a12018-05-28 16:12:03 +053035 uint8_t *pmcbase;
36 uint8_t reg8;
37
38 pmcbase = pmc_mmio_regs();
39
40 reg8 = read8(pmcbase + GEN_PMCON_B);
41 reg8 |= SMI_LOCK;
42 write8(pmcbase + GEN_PMCON_B, reg8);
Lijian Zhao6cf501c2017-10-10 18:26:18 -070043}
44
Subrata Banik9cd99a12018-05-28 16:12:03 +053045static void pmc_lockdown_cfg(int chipset_lockdown)
Lijian Zhao6cf501c2017-10-10 18:26:18 -070046{
Subrata Banik9cd99a12018-05-28 16:12:03 +053047 /* PMSYNC */
48 pmc_lock_pmsync();
49 /* Lock down ABASE and sleep stretching policy */
50 pmc_lock_abase();
Michael Niewöhnerdce63592019-09-17 18:48:00 +020051 /* Make sure payload/OS can't trigger global reset */
52 pmc_global_reset_disable_and_lock();
Lijian Zhao6cf501c2017-10-10 18:26:18 -070053
Subrata Banik9cd99a12018-05-28 16:12:03 +053054 if (chipset_lockdown == CHIPSET_LOCKDOWN_COREBOOT)
55 pmc_lock_smi();
Lijian Zhao6cf501c2017-10-10 18:26:18 -070056}
57
Subrata Banik9cd99a12018-05-28 16:12:03 +053058void soc_lockdown_config(int chipset_lockdown)
Lijian Zhao6cf501c2017-10-10 18:26:18 -070059{
Lijian Zhao6cf501c2017-10-10 18:26:18 -070060 /* PMC lock down configuration */
Subrata Banik9cd99a12018-05-28 16:12:03 +053061 pmc_lockdown_cfg(chipset_lockdown);
Lijian Zhao6cf501c2017-10-10 18:26:18 -070062}