[RFC PATCH linux v6 2/9] hwmon: Add core On-Chip Controller support for POWER CPUs

Eddie James eajames.ibm at gmail.com
Thu Dec 1 02:40:35 AEDT 2016


Thanks Yi, I will add some checks for 0xFF in the next patch set.
Looks like that's the only non-zero rc that isn't an error.

On Tue, Nov 29, 2016 at 9:50 PM, Yi TZ Li <shliyi at cn.ibm.com> wrote:
> Hi Edward,
>
> I was concerned with bellow piece of code when writing P8 occ driver.
> Referring to occ spec:
> https://github.com/open-power/docs/blob/master/occ/OCC_OpenPwr_FW_Interfaces.pdf
> Section: 1.6.2 OCC Command/Response Sequence and Appendix A: Return codes.
>
> OCC responds a command with different return code. Currently, the occ driver
> regards any return code
> other than 0x0 (Succeed) as error. But we may need to handle occ return code
> properly,
> e.g: for 0xFF (command in progress), we might not regard it as an error.
>
>
>
>> +
>> +static u8 occ_send_cmd(struct occ *driver, u8 seq, u8 type, u16 length,
>> +             u8 *data, u8 *resp)
>> +{
>> +   u32 cmd1, cmd2;
>> +   u16 checksum;
>> +   int i;
>> +
>> +   length = cpu_to_le16(length);
>> +   cmd1 = (seq << 24) | (type << 16) | length;
>> +   memcpy(&cmd2, data, length);
>> +   cmd2 <<= ((4 - length) * 8);
>> +
>> +   /* checksum: sum of every bytes of cmd1, cmd2 */
>> +   checksum = 0;
>> +   for (i = 0; i < 4; i++)
>> +      checksum += (cmd1 >> (i * 8)) & 0xFF;
>> +   for (i = 0; i < 4; i++)
>> +      checksum += (cmd2 >> (i * 8)) & 0xFF;
>> +   cmd2 |= checksum << ((2 - length) * 8);
>> +
>> +   /* Init OCB */
>> +   driver->bus_ops.putscom(driver->bus, OCB_STATUS_CONTROL_OR,
>> 0x08000000,
>> +            0x00000000);
>> +   driver->bus_ops.putscom(driver->bus, OCB_STATUS_CONTROL_AND,
>> +            0xFBFFFFFF, 0xFFFFFFFF);
>> +
>> +   /* Send command */
>> +   driver->bus_ops.putscom(driver->bus, OCB_ADDRESS,
>> +            driver->config.command_addr, 0x00000000);
>> +   driver->bus_ops.putscom(driver->bus, OCB_ADDRESS,
>> +            driver->config.command_addr, 0x00000000);
>> +   driver->bus_ops.putscom(driver->bus, OCB_DATA, cmd1, cmd2);
>> +
>> +   /* Trigger attention */
>> +   driver->bus_ops.putscom(driver->bus, ATTN_DATA, 0x01010000,
>> +            0x00000000);
>> +
>> +   /* Get response data */
>> +   driver->bus_ops.putscom(driver->bus, OCB_ADDRESS,
>> +            driver->config.response_addr, 0x00000000);
>> +   driver->bus_ops.getscom(driver->bus, OCB_DATA, resp, 0);
>> +
>> +   /* return status */
>> +   return resp[2];
>> +}
>> +
>
> Thanks,
> -Yi


More information about the openbmc mailing list