blob: 7dc1f9834f3fc59923b0b5f5d837847c72017db9 [file] [log] [blame]
Marc Jones81ef9c22021-01-21 10:53:47 -07001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <device/mmio.h>
Marc Jones4681b272021-04-06 14:29:37 -06004#include <device/pci.h>
Marc Jones81ef9c22021-01-21 10:53:47 -07005#include <intelblocks/cfg.h>
Jonathan Zhangfb2ebbc2022-10-26 16:19:40 -07006#include <intelblocks/lpc_lib.h>
Marc Jones81ef9c22021-01-21 10:53:47 -07007#include <intelblocks/pmclib.h>
8#include <intelpch/lockdown.h>
Marc Jones4681b272021-04-06 14:29:37 -06009#include <soc/pci_devs.h>
Marc Jones81ef9c22021-01-21 10:53:47 -070010#include <soc/pm.h>
11
Jonathan Zhangfb2ebbc2022-10-26 16:19:40 -070012static void lpc_lockdown_config(void)
13{
14 /* Set BIOS Interface Lock, BIOS Lock */
15 lpc_set_bios_interface_lock_down();
16
17 /* Only allow writes in SMM */
18 if (CONFIG(BOOTMEDIA_SMM_BWP)) {
19 lpc_set_eiss();
20 lpc_enable_wp();
21 }
22 lpc_set_lock_enable();
23}
24
Marc Jones65451452021-03-02 15:16:25 -070025static void pmc_lockdown_config(int chipset_lockdown)
Marc Jones81ef9c22021-01-21 10:53:47 -070026{
27 uint8_t *pmcbase;
28 u32 pmsyncreg;
29
30 /* PMSYNC */
31 pmcbase = pmc_mmio_regs();
32 pmsyncreg = read32(pmcbase + PMSYNC_TPR_CFG);
33 pmsyncreg |= PMSYNC_LOCK;
34 write32(pmcbase + PMSYNC_TPR_CFG, pmsyncreg);
35
36 /* Make sure payload/OS can't trigger global reset */
37 pmc_global_reset_disable_and_lock();
Marc Jones4681b272021-04-06 14:29:37 -060038
39 /* Lock PMC stretch policy */
40 pci_or_config32(PCH_DEV_PMC, GEN_PMCON_B, SLP_STR_POL_LOCK);
41}
42
43static void sata_lockdown_config(int chipset_lockdown)
44{
45 if (chipset_lockdown == CHIPSET_LOCKDOWN_COREBOOT) {
46 pci_or_config32(PCH_DEV_SATA, SATAGC, SATAGC_REGLOCK);
47 pci_or_config32(PCH_DEV_SSATA, SATAGC, SATAGC_REGLOCK);
48 }
Marc Jones81ef9c22021-01-21 10:53:47 -070049}
50
51void soc_lockdown_config(int chipset_lockdown)
52{
Jonathan Zhangfb2ebbc2022-10-26 16:19:40 -070053 lpc_lockdown_config();
Marc Jones65451452021-03-02 15:16:25 -070054 pmc_lockdown_config(chipset_lockdown);
Marc Jones4681b272021-04-06 14:29:37 -060055 sata_lockdown_config(chipset_lockdown);
Marc Jones81ef9c22021-01-21 10:53:47 -070056}