[PATCH linux dev-4.13 v2] fsi: occ: Use PutOCCSRAM in circular mode for OCC attention

Matt Spinler mspinler at linux.vnet.ibm.com
Fri Apr 27 23:54:54 AEST 2018


On 4/26/2018 11:55 PM, 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
> using PutOCCSRAM's circular buffer mode to write to the necessary 
> address.

The address is ignored for the circular buffer

> 
> 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>
> ---
> 
> 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..037df79be83a 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(0x6D035);          /* Address */

The address is ignored, so should probably make this be zero so it 
doesn't mislead

> +	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