[PATCH linux dev-4.13 v3] fsi: occ: Use PutOCCSRAM in circular mode for OCC attention
Matt Spinler
mspinler at linux.vnet.ibm.com
Sat Apr 28 05:56:58 AEST 2018
Reviewed-by: Matt Spinler mspinler at linux.vnet.ibm.com
On 2018-04-27 09:45, Andrew Jeffery wrote:
> 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.
>
> Signed-off-by: Andrew Jeffery <andrew at aj.id.au>
> ---
>
> v3:
> * Address Matt Spinler's feedback that the address field is ignored in
> mode 3
>
> Tested on two Witherspoon systems, one with secure-boot enabled and one
> without
>
> v2:
> * Minor typo and documentation cleanups
>
> drivers/fsi/fsi-occ.c | 22 +++++++++-------------
> 1 file 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 @@ static int occ_putsram(struct device *sbefifo,
> u32 address, u8 *data,
> 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:
More information about the openbmc
mailing list