aboutsummaryrefslogtreecommitdiff
path: root/src/soc/amd/common/block/psp/psp.c
diff options
context:
space:
mode:
authorMarshall Dawson <marshalldawson3rd@gmail.com>2017-12-13 10:24:41 -0700
committerMartin Roth <martinroth@google.com>2017-12-20 16:36:10 +0000
commit33c8773dfd4972f21e474b22d4d2c6b3c9d19f38 (patch)
tree9d9ccdff2d0ef914fca7d7a063b82004abb81371 /src/soc/amd/common/block/psp/psp.c
parent854d4dd9e2bd803a81ae0c90c26143a10f25abc4 (diff)
amd/common/psp: Assume PSP command register already set up
Remove the frequent setting/restoring of the PSP's bus-mastering and memory decoding settings. It is up to the caller to ensure it is already set properly. Change-Id: I7e29a3935df94d16de90b28ff78449d23fe01666 Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com> Reviewed-on: https://review.coreboot.org/22846 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'src/soc/amd/common/block/psp/psp.c')
-rw-r--r--src/soc/amd/common/block/psp/psp.c51
1 files changed, 16 insertions, 35 deletions
diff --git a/src/soc/amd/common/block/psp/psp.c b/src/soc/amd/common/block/psp/psp.c
index 5aedfc138f..b13aa57337 100644
--- a/src/soc/amd/common/block/psp/psp.c
+++ b/src/soc/amd/common/block/psp/psp.c
@@ -122,56 +122,37 @@ static int wait_command(struct psp_mbox *mbox)
static int send_psp_command(u32 command, void *buffer)
{
- u32 command_reg;
- int status = 0;
-
struct psp_mbox *mbox = get_mbox_address();
if (!mbox)
return -PSPSTS_NOBASE;
- command_reg = pci_read_config32(SOC_PSP_DEV, PCI_COMMAND);
- pci_write_config32(SOC_PSP_DEV, PCI_COMMAND, command_reg |
- PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
-
/* check for PSP error conditions */
- if (rd_mbox_sts(mbox) & STATUS_HALT) {
- status = -PSPSTS_HALTED;
- goto exit;
- }
- if (rd_mbox_sts(mbox) & STATUS_RECOVERY) {
- status = -PSPSTS_RECOVERY;
- goto exit;
- }
+ if (rd_mbox_sts(mbox) & STATUS_HALT)
+ return -PSPSTS_HALTED;
+
+ if (rd_mbox_sts(mbox) & STATUS_RECOVERY)
+ return -PSPSTS_RECOVERY;
/* PSP must be finished with init and ready to accept a command */
- if (wait_initialized(mbox)) {
- status = -PSPSTS_INIT_TIMEOUT;
- goto exit;
- }
- if (wait_command(mbox)) {
- status = -PSPSTS_CMD_TIMEOUT;
- goto exit;
- }
+ if (wait_initialized(mbox))
+ return -PSPSTS_INIT_TIMEOUT;
+
+ if (wait_command(mbox))
+ return -PSPSTS_CMD_TIMEOUT;
/* set address of command-response buffer and write command register */
wr_mbox_cmd_resp(mbox, buffer);
wr_mbox_cmd(mbox, command);
/* PSP clears command register when complete */
- if (wait_command(mbox)) {
- status = -PSPSTS_CMD_TIMEOUT;
- goto exit;
- }
+ if (wait_command(mbox))
+ return -PSPSTS_CMD_TIMEOUT;
/* check delivery status */
- if (rd_mbox_sts(mbox) & (STATUS_ERROR | STATUS_TERMINATED)) {
- status = -PSPSTS_SEND_ERROR;
- goto exit;
- }
-exit:
- /* restore command register to original value */
- pci_write_config32(SOC_PSP_DEV, PCI_COMMAND, command_reg);
- return status;
+ if (rd_mbox_sts(mbox) & (STATUS_ERROR | STATUS_TERMINATED))
+ return -PSPSTS_SEND_ERROR;
+
+ return 0;
}
/*