summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorArthur Heymans <arthur@aheymans.xyz>2023-12-27 20:54:19 +0100
committerArthur Heymans <arthur@aheymans.xyz>2024-04-05 07:10:17 +0000
commitd57d5e3b3737607e4351ba460d0248a195279f2d (patch)
tree8f6cf0b7dab07f47cf4296cd8e14fcdefd188060 /src/drivers
parentc72a65dccde199ef3e9b7ab51db86791b58e7b43 (diff)
smmstorev2: Load the communication buffer at SMM setup
This removes the runtime SMI call to set up the communication buffer for SMMSTORE in favor of setting this buffer up during the installation of the smihandler. The reason is that it's less code in the handler and a time costly SMI is also avoided in ramstage. Signed-off-by: Arthur Heymans <arthur@aheymans.xyz> Change-Id: I94dce77711f37f87033530f5ae48cb850a39341b Reviewed-on: https://review.coreboot.org/c/coreboot/+/79738 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/smmstore/ramstage.c38
-rw-r--r--src/drivers/smmstore/smi.c25
-rw-r--r--src/drivers/smmstore/store.c13
3 files changed, 17 insertions, 59 deletions
diff --git a/src/drivers/smmstore/ramstage.c b/src/drivers/smmstore/ramstage.c
index e59090dad3..e897aa2d67 100644
--- a/src/drivers/smmstore/ramstage.c
+++ b/src/drivers/smmstore/ramstage.c
@@ -10,8 +10,6 @@
#include <types.h>
#include <cbmem.h>
-static struct smmstore_params_info info;
-
void lb_smmstorev2(struct lb_header *header)
{
struct lb_record *rec;
@@ -22,6 +20,9 @@ void lb_smmstorev2(struct lb_header *header)
if (!e)
return;
+ struct smmstore_params_info info;
+ smmstore_get_info(&info);
+
rec = lb_new_record(header);
store = (struct lb_smmstorev2 *)rec;
@@ -34,36 +35,3 @@ void lb_smmstorev2(struct lb_header *header)
store->block_size = info.block_size;
store->apm_cmd = APM_CNT_SMMSTORE;
}
-
-static void init_store(void *unused)
-{
- struct smmstore_params_init args;
- uint32_t ret = ~0;
-
- if (smmstore_get_info(&info) < 0) {
- printk(BIOS_INFO, "SMMSTORE: Failed to get meta data\n");
- return;
- }
-
- void *ptr = cbmem_add(CBMEM_ID_SMM_COMBUFFER, info.block_size);
- if (!ptr) {
- printk(BIOS_ERR, "SMMSTORE: Failed to add com buffer\n");
- return;
- }
-
- args.com_buffer = (uintptr_t)ptr;
- args.com_buffer_size = info.block_size;
-
- printk(BIOS_INFO, "SMMSTORE: Setting up SMI handler\n");
-
- /* Issue SMI using APM to update the com buffer and to lock the SMMSTORE */
- ret = call_smm(APM_CNT_SMMSTORE, SMMSTORE_CMD_INIT, &args);
-
- if (ret != SMMSTORE_RET_SUCCESS) {
- printk(BIOS_ERR, "SMMSTORE: Failed to install com buffer\n");
- return;
- }
-}
-
-/* The SMI APM handler is installed at DEV_INIT phase */
-BOOT_STATE_INIT_ENTRY(BS_DEV_INIT, BS_ON_EXIT, init_store, NULL);
diff --git a/src/drivers/smmstore/smi.c b/src/drivers/smmstore/smi.c
index 6ea447ffe6..4f7b4bdac0 100644
--- a/src/drivers/smmstore/smi.c
+++ b/src/drivers/smmstore/smi.c
@@ -78,24 +78,19 @@ static uint32_t smmstorev1_exec(uint8_t command, void *param)
static uint32_t smmstorev2_exec(uint8_t command, void *param)
{
uint32_t ret = SMMSTORE_RET_FAILURE;
+ static bool initialized = false;
- switch (command) {
- case SMMSTORE_CMD_INIT: {
- printk(BIOS_DEBUG, "Init SMM store\n");
- struct smmstore_params_init *params = param;
-
- if (range_check(params, sizeof(*params)) != 0)
- break;
-
- void *buf = (void *)(uintptr_t)params->com_buffer;
+ if (!initialized) {
+ uintptr_t base;
+ size_t size;
+ smm_get_smmstore_com_buffer(&base, &size);
- if (range_check(buf, params->com_buffer_size) != 0)
- break;
-
- if (smmstore_init(buf, params->com_buffer_size) == 0)
- ret = SMMSTORE_RET_SUCCESS;
- break;
+ if (smmstore_init((void *)base, size))
+ return SMMSTORE_RET_FAILURE;
+ initialized = true;
}
+
+ switch (command) {
case SMMSTORE_CMD_RAW_READ: {
printk(BIOS_DEBUG, "Raw read from SMM store, param = %p\n", param);
struct smmstore_params_raw_read *params = param;
diff --git a/src/drivers/smmstore/store.c b/src/drivers/smmstore/store.c
index bc3dcdccac..fd9cdf596f 100644
--- a/src/drivers/smmstore/store.c
+++ b/src/drivers/smmstore/store.c
@@ -1,11 +1,12 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <boot_device.h>
-#include <fmap.h>
-#include <fmap_config.h>
#include <commonlib/helpers.h>
#include <commonlib/region.h>
#include <console/console.h>
+#include <cpu/x86/smm.h>
+#include <fmap.h>
+#include <fmap_config.h>
#include <smmstore.h>
#include <types.h>
@@ -283,14 +284,10 @@ int smmstore_clear_region(void)
/* Implementation of Version 2 */
-static bool store_initialized;
static struct region_device mdev_com_buf;
static int smmstore_rdev_chain(struct region_device *rdev)
{
- if (!store_initialized)
- return -1;
-
return rdev_chain_full(rdev, &mdev_com_buf);
}
@@ -303,13 +300,11 @@ int smmstore_init(void *buf, size_t len)
if (!buf || len < SMM_BLOCK_SIZE)
return -1;
- if (store_initialized)
+ if (smm_points_to_smram(buf, len))
return -1;
rdev_chain_mem_rw(&mdev_com_buf, buf, len);
- store_initialized = true;
-
return 0;
}