summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Jeffery <andrew@aj.id.au>2018-04-27 17:45:59 +0300
committerJoel Stanley <joel@jms.id.au>2018-05-01 06:28:43 +0300
commitd9f9f91767d9562f43bf939b7ee7e46898e9ec4e (patch)
tree80be151dbcae6c398a701cfa2a23f4694c755fa5
parent8694f2138b3aa60311a4a1eb1b8f7d482e1b9cd3 (diff)
downloadlinux-d9f9f91767d9562f43bf939b7ee7e46898e9ec4e.tar.xz
fsi: occ: Use PutOCCSRAM in circular mode for OCC attention
We can't do SCOMs from the BMC when the host is booted in secure mode, and without triggering the attention of the OCC our commands won't be processed. Further, the SCOM operation fails, which causes the OCC driver's probe to fail, which leads the BMC to think that the OCC has failed. We have an alternative to the SCOM though: We can trigger the OCC by writing the correct attention magic in circular buffer mode. The PutOCCSRAM operation returns the written data length in the response payload before the 0xCODE word, so the condition testing the success of the operation is rearranged. OpenBMC-Staging-Count: 1 Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Reviewed-by: Matt Spinler mspinler@linux.vnet.ibm.com Reviewed-by: Eddie James <eajames@linux.vnet.ibm.com> Signed-off-by: Joel Stanley <joel@jms.id.au>
-rw-r--r--drivers/fsi/fsi-occ.c22
1 files changed, 9 insertions, 13 deletions
diff --git a/drivers/fsi/fsi-occ.c b/drivers/fsi/fsi-occ.c
index 45ae13cd7a3d..938601fd7347 100644
--- a/drivers/fsi/fsi-occ.c
+++ b/drivers/fsi/fsi-occ.c
@@ -575,19 +575,16 @@ free:
static int occ_trigger_attn(struct device *sbefifo)
{
int rc;
- __be32 buf[6];
+ __be32 buf[7];
struct sbefifo_client *client;
- /*
- * Magic sequence to do SBE putscom command. SBE will write 8 bytes to
- * specified SCOM address.
- */
- buf[0] = cpu_to_be32(0x6);
- buf[1] = cpu_to_be32(0xa202);
- buf[2] = 0;
- buf[3] = cpu_to_be32(0x6D035);
- buf[4] = cpu_to_be32(0x20010000); /* trigger occ attention */
- buf[5] = 0;
+ buf[0] = cpu_to_be32(0x5 + 0x2); /* Chip-op length in words */
+ buf[1] = cpu_to_be32(0xa404); /* PutOCCSRAM */
+ buf[2] = cpu_to_be32(0x3); /* Mode: Circular */
+ buf[3] = cpu_to_be32(0x0); /* Address: ignored in mode 3 */
+ buf[4] = cpu_to_be32(0x8); /* Data length in bytes */
+ buf[5] = cpu_to_be32(0x20010000); /* Trigger OCC attention */
+ buf[6] = 0;
client = sbefifo_drv_open(sbefifo, 0);
if (!client)
@@ -602,8 +599,7 @@ static int occ_trigger_attn(struct device *sbefifo)
goto done;
/* check for good response */
- if ((be32_to_cpu(buf[0]) != 0xC0DEA202) ||
- (be32_to_cpu(buf[1]) & 0x0FFFFFFF))
+ if ((be32_to_cpu(buf[0]) != 8) || (be32_to_cpu(buf[1]) != 0xC0DEA404))
rc = -EBADMSG;
done: