soc/amd/common/psp/psp_smi_flash: factor out generation-specific code

Factor out the code to access the request buffer into PSP generation
specific file. This is a preparation for adding PSP SMI flash access
support for the PSP generation 1 which has a slightly different request
buffer layout.

Signed-off-by: Felix Held <felix-coreboot@felixheld.de>
Change-Id: I8e18f7ea53592d9fd413ad56e8d137cfc13ad5d4
Reviewed-on: https://review.coreboot.org/c/coreboot/+/84062
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Matt DeVillier <matt.devillier@amd.corp-partner.google.com>
Reviewed-by: Marshall Dawson <marshalldawson3rd@gmail.com>
This commit is contained in:
Felix Held 2024-08-23 23:39:30 +02:00
commit 84db1745e6
4 changed files with 116 additions and 94 deletions

View file

@ -29,6 +29,7 @@ ramstage-$(CONFIG_PSP_PLATFORM_SECURE_BOOT) += psb.c
ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_I2C3_TPM_SHARED_WITH_PSP) += tpm.c
smm-y += psp_gen2.c
smm-$(CONFIG_SOC_AMD_COMMON_BLOCK_PSP_SMI) += psp_smi_flash_gen2.c
smm-y += psp_smm_gen2.c
ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_PSP_SPL) += spl_fuse.c

View file

@ -9,100 +9,7 @@
#include <spi_flash.h>
#include <types.h>
#include "psp_def.h"
enum psp_spi_id_type {
SMI_TARGET_NVRAM = 0,
SMI_TARGET_RPMC_NVRAM = 5,
};
struct pspv2_spi_info_request {
u64 target_nv_id;
u64 lba;
u64 block_size;
u64 num_blocks;
} __packed;
struct mbox_pspv2_cmd_spi_info {
struct mbox_buffer_header header;
struct pspv2_spi_info_request req;
} __packed;
struct pspv2_spi_read_write_request {
u64 target_nv_id;
u64 lba;
u64 offset;
u64 num_bytes;
u8 buffer[];
} __packed;
struct mbox_pspv2_cmd_spi_read_write {
struct mbox_buffer_header header;
struct pspv2_spi_read_write_request req;
} __packed;
struct pspv2_spi_erase_request {
u64 target_nv_id;
u64 lba;
u64 num_blocks;
} __packed;
struct mbox_pspv2_cmd_spi_erase {
struct mbox_buffer_header header;
struct pspv2_spi_erase_request req;
} __packed;
static bool is_valid_psp_spi_id(u64 target_nv_id)
{
return target_nv_id == SMI_TARGET_NVRAM ||
target_nv_id == SMI_TARGET_RPMC_NVRAM;
}
static bool is_valid_psp_spi_info(struct mbox_pspv2_cmd_spi_info *cmd_buf)
{
return is_valid_psp_spi_id(read64(&cmd_buf->req.target_nv_id));
}
static bool is_valid_psp_spi_read_write(struct mbox_pspv2_cmd_spi_read_write *cmd_buf)
{
return is_valid_psp_spi_id(read64(&cmd_buf->req.target_nv_id));
}
static bool is_valid_psp_spi_erase(struct mbox_pspv2_cmd_spi_erase *cmd_buf)
{
return is_valid_psp_spi_id(read64(&cmd_buf->req.target_nv_id));
}
static u64 get_psp_spi_info_id(struct mbox_pspv2_cmd_spi_info *cmd_buf)
{
return read64(&cmd_buf->req.target_nv_id);
}
static void set_psp_spi_info(struct mbox_pspv2_cmd_spi_info *cmd_buf,
u64 lba, u64 block_size, u64 num_blocks)
{
write64(&cmd_buf->req.lba, lba);
write64(&cmd_buf->req.block_size, block_size);
write64(&cmd_buf->req.num_blocks, num_blocks);
}
static void get_psp_spi_read_write(struct mbox_pspv2_cmd_spi_read_write *cmd_buf,
u64 *target_nv_id, u64 *lba, u64 *offset,
u64 *num_bytes, u8 **data)
{
*target_nv_id = read64(&cmd_buf->req.target_nv_id);
*lba = read64(&cmd_buf->req.lba);
*offset = read64(&cmd_buf->req.offset);
*num_bytes = read64(&cmd_buf->req.num_bytes);
*data = cmd_buf->req.buffer;
}
static void get_psp_spi_erase(struct mbox_pspv2_cmd_spi_erase *cmd_buf,
u64 *target_nv_id, u64 *lba, u64 *num_blocks)
{
*target_nv_id = read64(&cmd_buf->req.target_nv_id);
*lba = read64(&cmd_buf->req.lba);
*num_blocks = read64(&cmd_buf->req.num_blocks);
}
#include "psp_smi_flash.h"
static bool is_valid_rw_byte_count(struct mbox_pspv2_cmd_spi_read_write *cmd_buf,
u64 num_bytes)

View file

@ -0,0 +1,56 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <types.h>
#include "psp_def.h"
enum psp_spi_id_type {
SMI_TARGET_NVRAM = 0,
SMI_TARGET_RPMC_NVRAM = 5,
};
struct pspv2_spi_info_request {
u64 target_nv_id;
u64 lba;
u64 block_size;
u64 num_blocks;
} __packed;
struct mbox_pspv2_cmd_spi_info {
struct mbox_buffer_header header;
struct pspv2_spi_info_request req;
} __packed;
struct pspv2_spi_read_write_request {
u64 target_nv_id;
u64 lba;
u64 offset;
u64 num_bytes;
u8 buffer[];
} __packed;
struct mbox_pspv2_cmd_spi_read_write {
struct mbox_buffer_header header;
struct pspv2_spi_read_write_request req;
} __packed;
struct pspv2_spi_erase_request {
u64 target_nv_id;
u64 lba;
u64 num_blocks;
} __packed;
struct mbox_pspv2_cmd_spi_erase {
struct mbox_buffer_header header;
struct pspv2_spi_erase_request req;
} __packed;
bool is_valid_psp_spi_info(struct mbox_pspv2_cmd_spi_info *cmd_buf);
bool is_valid_psp_spi_read_write(struct mbox_pspv2_cmd_spi_read_write *cmd_buf);
bool is_valid_psp_spi_erase(struct mbox_pspv2_cmd_spi_erase *cmd_buf);
u64 get_psp_spi_info_id(struct mbox_pspv2_cmd_spi_info *cmd_buf);
void set_psp_spi_info(struct mbox_pspv2_cmd_spi_info *cmd_buf, u64 lba, u64 block_size,
u64 num_blocks);
void get_psp_spi_read_write(struct mbox_pspv2_cmd_spi_read_write *cmd_buf, u64 *target_nv_id,
u64 *lba, u64 *offset, u64 *num_bytes, u8 **data);
void get_psp_spi_erase(struct mbox_pspv2_cmd_spi_erase *cmd_buf, u64 *target_nv_id, u64 *lba,
u64 *num_blocks);

View file

@ -0,0 +1,58 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <device/mmio.h>
#include <types.h>
#include "psp_def.h"
#include "psp_smi_flash.h"
static bool is_valid_psp_spi_id(u64 target_nv_id)
{
return target_nv_id == SMI_TARGET_NVRAM ||
target_nv_id == SMI_TARGET_RPMC_NVRAM;
}
bool is_valid_psp_spi_info(struct mbox_pspv2_cmd_spi_info *cmd_buf)
{
return is_valid_psp_spi_id(read64(&cmd_buf->req.target_nv_id));
}
bool is_valid_psp_spi_read_write(struct mbox_pspv2_cmd_spi_read_write *cmd_buf)
{
return is_valid_psp_spi_id(read64(&cmd_buf->req.target_nv_id));
}
bool is_valid_psp_spi_erase(struct mbox_pspv2_cmd_spi_erase *cmd_buf)
{
return is_valid_psp_spi_id(read64(&cmd_buf->req.target_nv_id));
}
u64 get_psp_spi_info_id(struct mbox_pspv2_cmd_spi_info *cmd_buf)
{
return read64(&cmd_buf->req.target_nv_id);
}
void set_psp_spi_info(struct mbox_pspv2_cmd_spi_info *cmd_buf, u64 lba, u64 block_size,
u64 num_blocks)
{
write64(&cmd_buf->req.lba, lba);
write64(&cmd_buf->req.block_size, block_size);
write64(&cmd_buf->req.num_blocks, num_blocks);
}
void get_psp_spi_read_write(struct mbox_pspv2_cmd_spi_read_write *cmd_buf, u64 *target_nv_id,
u64 *lba, u64 *offset, u64 *num_bytes, u8 **data)
{
*target_nv_id = read64(&cmd_buf->req.target_nv_id);
*lba = read64(&cmd_buf->req.lba);
*offset = read64(&cmd_buf->req.offset);
*num_bytes = read64(&cmd_buf->req.num_bytes);
*data = cmd_buf->req.buffer;
}
void get_psp_spi_erase(struct mbox_pspv2_cmd_spi_erase *cmd_buf, u64 *target_nv_id, u64 *lba,
u64 *num_blocks)
{
*target_nv_id = read64(&cmd_buf->req.target_nv_id);
*lba = read64(&cmd_buf->req.lba);
*num_blocks = read64(&cmd_buf->req.num_blocks);
}