soc/intel/common/cse: Rework heci_disable function
This patch provides the possible options for SoC users to choose the applicable interface to make HECI1 function disable at pre-boot. `SOC_INTEL_COMMON_BLOCK_HECI_DISABLE_USING_SBI` config is used for disabling heci1 using non-posted sideband write (inside SMM) after FSP-S sets the postboot_sai attribute. Applicable from CNL PCH onwards. `SOC_INTEL_COMMON_BLOCK_HECI_DISABLE_USING_PMC_IPC` config is used for disabling heci1 using PMC IPC command `0xA9`. Applicable from TGL PCH onwards. `SOC_INTEL_COMMON_BLOCK_HECI_DISABLE_USING_PCR` config is used for disabling heci1 using private configuration register (PCR) write. Applicable for SoC platform prior to CNL PCH. Additionally, add PID_CSME0 macro for SKL, Xeon_SP and APL to fix the compilation failure. Finally, rename heci_disable() function to heci1_disable() to make it more meaningful. BUG=none TEST=Able to build and boot brya. Signed-off-by: Subrata Banik <subratabanik@google.com> Change-Id: I7e0bab0004013b999ec1e054310763427d7b9348 Reviewed-on: https://review.coreboot.org/c/coreboot/+/61431 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Werner Zeh <werner.zeh@siemens.com> Reviewed-by: EricR Lai <ericr_lai@compal.corp-partner.google.com>
This commit is contained in:
parent
736f9cced0
commit
32e0673232
|
@ -20,7 +20,7 @@ void smihandler_soc_at_finalize(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT))
|
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT))
|
||||||
heci_disable();
|
heci1_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
int smihandler_soc_disable_busmaster(pci_devfn_t dev)
|
int smihandler_soc_disable_busmaster(pci_devfn_t dev)
|
||||||
|
|
|
@ -27,5 +27,6 @@
|
||||||
|
|
||||||
#define PID_PSF3 0xC6
|
#define PID_PSF3 0xC6
|
||||||
#define PID_DMI 0x00 /* Reserved */
|
#define PID_DMI 0x00 /* Reserved */
|
||||||
|
#define PID_CSME0 0x9A /* Reserved */
|
||||||
|
|
||||||
#endif /* SOC_INTEL_APL_PCR_H */
|
#endif /* SOC_INTEL_APL_PCR_H */
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
void smihandler_soc_at_finalize(void)
|
void smihandler_soc_at_finalize(void)
|
||||||
{
|
{
|
||||||
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT) && CONFIG(HECI_DISABLE_USING_SMM))
|
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT) && CONFIG(HECI_DISABLE_USING_SMM))
|
||||||
heci_disable();
|
heci1_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
const smi_handler_t southbridge_smi[SMI_STS_BITS] = {
|
const smi_handler_t southbridge_smi[SMI_STS_BITS] = {
|
||||||
|
|
|
@ -14,13 +14,32 @@ config DISABLE_HECI1_AT_PRE_BOOT
|
||||||
Mainboard users to select this config to make HECI1 `function disable`
|
Mainboard users to select this config to make HECI1 `function disable`
|
||||||
prior to handing off to payload.
|
prior to handing off to payload.
|
||||||
|
|
||||||
config SOC_INTEL_COMMON_BLOCK_HECI_DISABLE_IN_SMM
|
config SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_SBI
|
||||||
bool
|
bool
|
||||||
default y if HECI_DISABLE_USING_SMM
|
default y if HECI_DISABLE_USING_SMM
|
||||||
select SOC_INTEL_COMMON_BLOCK_P2SB
|
select SOC_INTEL_COMMON_BLOCK_P2SB
|
||||||
help
|
help
|
||||||
Use this config to include common CSE block to make HECI function
|
Use this config to allow common CSE block to make HECI1 function disable
|
||||||
disable in SMM mode
|
in the SMM mode. From CNL PCH onwards,`HECI1` disabling can only be done
|
||||||
|
using the non-posted sideband write after FSP-S sets the postboot_sai
|
||||||
|
attribute.
|
||||||
|
|
||||||
|
config SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
select SOC_INTEL_COMMON_BLOCK_PMC
|
||||||
|
help
|
||||||
|
Use this config to allow common CSE block to make HECI1 function disable
|
||||||
|
using PMC IPC command `0xA9`. From TGL PCH onwards, disabling heci1
|
||||||
|
device using PMC IPC doesn't required to run the operation in SMM.
|
||||||
|
|
||||||
|
config SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PCR
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
select SOC_INTEL_COMMON_BLOCK_PCR
|
||||||
|
help
|
||||||
|
Use this config for SoC platform prior to CNL PCH (with postboot_sai implemented)
|
||||||
|
to make `HECI1` device disable using private configuration register (PCR) write.
|
||||||
|
|
||||||
config SOC_INTEL_CSE_LITE_SKU
|
config SOC_INTEL_CSE_LITE_SKU
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -2,7 +2,8 @@ romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_CSE) += cse.c
|
||||||
ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_CSE) += cse.c
|
ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_CSE) += cse.c
|
||||||
romstage-$(CONFIG_SOC_INTEL_CSE_LITE_SKU) += cse_lite.c
|
romstage-$(CONFIG_SOC_INTEL_CSE_LITE_SKU) += cse_lite.c
|
||||||
ramstage-$(CONFIG_SOC_INTEL_CSE_LITE_SKU) += cse_lite.c
|
ramstage-$(CONFIG_SOC_INTEL_CSE_LITE_SKU) += cse_lite.c
|
||||||
smm-$(CONFIG_SOC_INTEL_COMMON_BLOCK_HECI_DISABLE_IN_SMM) += disable_heci.c
|
ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_CSE) += disable_heci.c
|
||||||
|
smm-$(CONFIG_SOC_INTEL_COMMON_BLOCK_CSE) += disable_heci.c
|
||||||
|
|
||||||
ramstage-$(CONFIG_SOC_INTEL_CSE_SET_EOP) += cse_eop.c
|
ramstage-$(CONFIG_SOC_INTEL_CSE_SET_EOP) += cse_eop.c
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
#define __SIMPLE_DEVICE__
|
||||||
|
|
||||||
#include <commonlib/helpers.h>
|
#include <commonlib/helpers.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <device/pci.h>
|
#include <device/pci.h>
|
||||||
|
@ -15,8 +17,20 @@
|
||||||
#define CSME0_BAR 0x0
|
#define CSME0_BAR 0x0
|
||||||
#define CSME0_FID 0xb0
|
#define CSME0_FID 0xb0
|
||||||
|
|
||||||
|
/* Disable HECI using PCR */
|
||||||
|
static void heci1_disable_using_pcr(void)
|
||||||
|
{
|
||||||
|
soc_disable_heci1_using_pcr();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable HECI using PMC IPC communication */
|
||||||
|
static void heci1_disable_using_pmc(void)
|
||||||
|
{
|
||||||
|
cse_disable_mei_devices();
|
||||||
|
}
|
||||||
|
|
||||||
/* Disable HECI using Sideband interface communication */
|
/* Disable HECI using Sideband interface communication */
|
||||||
void heci_disable(void)
|
static void heci1_disable_using_sbi(void)
|
||||||
{
|
{
|
||||||
struct pcr_sbi_msg msg = {
|
struct pcr_sbi_msg msg = {
|
||||||
.pid = PID_CSME0,
|
.pid = PID_CSME0,
|
||||||
|
@ -46,3 +60,23 @@ void heci_disable(void)
|
||||||
/* hide p2sb device */
|
/* hide p2sb device */
|
||||||
p2sb_hide();
|
p2sb_hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void heci1_disable(void)
|
||||||
|
{
|
||||||
|
if (!CONFIG(DISABLE_HECI1_AT_PRE_BOOT))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ENV_SMM && CONFIG(SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_SBI)) {
|
||||||
|
printk(BIOS_INFO, "Disabling Heci using SBI in SMM mode\n");
|
||||||
|
return heci1_disable_using_sbi();
|
||||||
|
} else if (!ENV_SMM && CONFIG(SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC)) {
|
||||||
|
printk(BIOS_INFO, "Disabling Heci using PMC IPC\n");
|
||||||
|
return heci1_disable_using_pmc();
|
||||||
|
} else if (!ENV_SMM && CONFIG(SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PCR)) {
|
||||||
|
printk(BIOS_INFO, "Disabling Heci using PCR\n");
|
||||||
|
return heci1_disable_using_pcr();
|
||||||
|
} else {
|
||||||
|
printk(BIOS_ERR, "%s Error: Unable to make HECI1 function disable!\n",
|
||||||
|
__func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -311,8 +311,8 @@ int heci_send_receive(const void *snd_msg, size_t snd_sz, void *rcv_msg, size_t
|
||||||
* Returns 0 on failure and 1 on success.
|
* Returns 0 on failure and 1 on success.
|
||||||
*/
|
*/
|
||||||
int heci_reset(void);
|
int heci_reset(void);
|
||||||
/* Disable HECI using Sideband interface communication */
|
/* Disable HECI1 using Sideband interface communication */
|
||||||
void heci_disable(void);
|
void heci1_disable(void);
|
||||||
|
|
||||||
/* Reads config value from a specified offset in the CSE PCI Config space. */
|
/* Reads config value from a specified offset in the CSE PCI Config space. */
|
||||||
uint32_t me_read_config32(int offset);
|
uint32_t me_read_config32(int offset);
|
||||||
|
@ -489,4 +489,12 @@ bool cse_get_boot_performance_data(struct cse_boot_perf_rsp *boot_perf);
|
||||||
/* Function to make cse disable using PMC IPC */
|
/* Function to make cse disable using PMC IPC */
|
||||||
bool cse_disable_mei_devices(void);
|
bool cse_disable_mei_devices(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SoC override API to make heci1 disable using PCR.
|
||||||
|
*
|
||||||
|
* Allow SoC to implement heci1 disable override due to PSF registers being
|
||||||
|
* different across SoC generation.
|
||||||
|
*/
|
||||||
|
void soc_disable_heci1_using_pcr(void);
|
||||||
|
|
||||||
#endif // SOC_INTEL_COMMON_CSE_H
|
#endif // SOC_INTEL_COMMON_CSE_H
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
void smihandler_soc_at_finalize(void)
|
void smihandler_soc_at_finalize(void)
|
||||||
{
|
{
|
||||||
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT))
|
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT))
|
||||||
heci_disable();
|
heci1_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
const smi_handler_t southbridge_smi[SMI_STS_BITS] = {
|
const smi_handler_t southbridge_smi[SMI_STS_BITS] = {
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
void smihandler_soc_at_finalize(void)
|
void smihandler_soc_at_finalize(void)
|
||||||
{
|
{
|
||||||
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT))
|
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT))
|
||||||
heci_disable();
|
heci1_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
const smi_handler_t southbridge_smi[SMI_STS_BITS] = {
|
const smi_handler_t southbridge_smi[SMI_STS_BITS] = {
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
void smihandler_soc_at_finalize(void)
|
void smihandler_soc_at_finalize(void)
|
||||||
{
|
{
|
||||||
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT) && CONFIG(HECI_DISABLE_USING_SMM))
|
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT) && CONFIG(HECI_DISABLE_USING_SMM))
|
||||||
heci_disable();
|
heci1_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
int smihandler_soc_disable_busmaster(pci_devfn_t dev)
|
int smihandler_soc_disable_busmaster(pci_devfn_t dev)
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
* Port ids
|
* Port ids
|
||||||
*/
|
*/
|
||||||
#define PID_PSTH 0x89
|
#define PID_PSTH 0x89
|
||||||
|
#define PID_CSME0 0x90
|
||||||
#define PID_GPIOCOM3 0xAC
|
#define PID_GPIOCOM3 0xAC
|
||||||
#define PID_GPIOCOM2 0xAD
|
#define PID_GPIOCOM2 0xAD
|
||||||
#define PID_GPIOCOM1 0xAE
|
#define PID_GPIOCOM1 0xAE
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
void smihandler_soc_at_finalize(void)
|
void smihandler_soc_at_finalize(void)
|
||||||
{
|
{
|
||||||
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT) && CONFIG(HECI_DISABLE_USING_SMM))
|
if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT) && CONFIG(HECI_DISABLE_USING_SMM))
|
||||||
heci_disable();
|
heci1_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
int smihandler_soc_disable_busmaster(pci_devfn_t dev)
|
int smihandler_soc_disable_busmaster(pci_devfn_t dev)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#ifndef _PCR_IDS_H_
|
#ifndef _PCR_IDS_H_
|
||||||
#define _PCR_IDS_H_
|
#define _PCR_IDS_H_
|
||||||
|
|
||||||
|
#define PID_CSME0 0x90
|
||||||
#define PID_ITSS 0xC4
|
#define PID_ITSS 0xC4
|
||||||
#define PID_RTC 0xC3
|
#define PID_RTC 0xC3
|
||||||
#define PID_DMI 0xEF
|
#define PID_DMI 0xEF
|
||||||
|
|
Loading…
Reference in New Issue