summaryrefslogtreecommitdiff
path: root/src/drivers/smmstore
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/smmstore')
-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;
}