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

Eddie James eajames at linux.vnet.ibm.com
Tue May 1 07:12:12 AEST 2018



On 04/27/2018 02:56 PM, Matt Spinler wrote:
> 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.

Thanks Andrew, looks good.

Reviewed-by: Eddie James <eajames at linux.vnet.ibm.com>

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