diff options
author | Marshall Dawson <marshalldawson3rd@gmail.com> | 2017-12-13 10:24:41 -0700 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2017-12-20 16:36:10 +0000 |
commit | 33c8773dfd4972f21e474b22d4d2c6b3c9d19f38 (patch) | |
tree | 9d9ccdff2d0ef914fca7d7a063b82004abb81371 /src/soc/amd/common/block | |
parent | 854d4dd9e2bd803a81ae0c90c26143a10f25abc4 (diff) | |
download | coreboot-33c8773dfd4972f21e474b22d4d2c6b3c9d19f38.tar.xz |
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')
-rw-r--r-- | src/soc/amd/common/block/psp/psp.c | 51 |
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; } /* |