Lines Matching refs:occ

16 #include <linux/fsi-occ.h>
42 struct occ {
58 #define to_occ(x) container_of((x), struct occ, mdev)
69 struct occ *occ;
84 struct occ *occ = to_occ(mdev);
95 client->occ = occ;
98 get_device(occ->dev);
160 * Copy the user command (assume user data follows the occ command
180 rc = fsi_occ_submit(client->occ->dev, cmd, data_length + 6, cmd,
202 put_device(client->occ->dev);
217 static void occ_save_ffdc(struct occ *occ, __be32 *resp, size_t parsed_len,
225 if (ffdc_len > occ->client_buffer_size)
226 ffdc_len = occ->client_buffer_size;
228 memcpy(occ->client_buffer, ffdc, ffdc_len);
229 occ->client_response_size = ffdc_len;
233 static int occ_verify_checksum(struct occ *occ, struct occ_response *resp,
250 dev_err(occ->dev, "Bad checksum: %04x!=%04x\n", checksum,
258 static int occ_getsram(struct occ *occ, u32 offset, void *data, ssize_t len)
263 __be32 *resp = occ->buffer;
271 switch (occ->version) {
291 rc = sbefifo_submit(occ->sbefifo, cmd, cmd_len, resp, &resp_len);
295 rc = sbefifo_parse_status(occ->sbefifo, SBEFIFO_CMD_GET_OCC_SRAM,
298 dev_err(occ->dev, "SRAM read returned failure status: %08x\n",
300 occ_save_ffdc(occ, resp, parsed_len, resp_len);
308 dev_err(occ->dev, "SRAM read expected %d bytes got %zd\n",
318 static int occ_putsram(struct occ *occ, const void *data, ssize_t len,
324 __be32 *buf = occ->buffer;
328 cmd_len = (occ->version == occ_p10) ? 6 : 5;
338 switch (occ->version) {
364 rc = sbefifo_submit(occ->sbefifo, buf, cmd_len, buf, &resp_len);
368 rc = sbefifo_parse_status(occ->sbefifo, SBEFIFO_CMD_PUT_OCC_SRAM,
371 dev_err(occ->dev, "SRAM write returned failure status: %08x\n",
373 occ_save_ffdc(occ, buf, parsed_len, resp_len);
380 dev_err(occ->dev, "SRAM write response length invalid: %zd\n",
386 dev_err(occ->dev,
396 static int occ_trigger_attn(struct occ *occ)
398 __be32 *buf = occ->buffer;
403 switch (occ->version) {
425 rc = sbefifo_submit(occ->sbefifo, buf, cmd_len, buf, &resp_len);
429 rc = sbefifo_parse_status(occ->sbefifo, SBEFIFO_CMD_PUT_OCC_SRAM,
432 dev_err(occ->dev, "SRAM attn returned failure status: %08x\n",
434 occ_save_ffdc(occ, buf, parsed_len, resp_len);
441 dev_err(occ->dev, "SRAM attn response length invalid: %zd\n",
447 dev_err(occ->dev,
471 struct occ *occ = dev_get_drvdata(dev);
485 if (!occ)
499 rc = mutex_lock_interruptible(&occ->occ_lock);
503 occ->client_buffer = response;
504 occ->client_buffer_size = user_resp_len;
505 occ->client_response_size = 0;
507 if (!occ->buffer) {
520 seq_no = occ->sequence_number++;
521 if (!occ->sequence_number)
522 occ->sequence_number = 1;
525 rc = occ_putsram(occ, request, req_len, seq_no, checksum);
529 rc = occ_trigger_attn(occ);
535 /* Read occ response header */
536 rc = occ_getsram(occ, 0, resp, 8);
542 dev_err(occ->dev,
571 rc = occ_getsram(occ, 0, resp,
588 rc = occ_verify_checksum(occ, resp, resp_data_length);
592 occ->client_response_size = resp_data_length + 7;
595 *resp_len = occ->client_response_size;
596 mutex_unlock(&occ->occ_lock);
627 struct occ *occ;
633 .name = "occ-hwmon",
636 occ = devm_kzalloc(dev, sizeof(*occ), GFP_KERNEL);
637 if (!occ)
641 occ->buffer = kvmalloc(OCC_MAX_RESP_WORDS * 4, GFP_KERNEL);
642 if (!occ->buffer)
645 occ->version = (uintptr_t)of_device_get_match_data(dev);
646 occ->dev = dev;
647 occ->sbefifo = dev->parent;
652 occ->sequence_number = (u8)((jiffies % 0xff) + 1);
653 mutex_init(&occ->occ_lock);
659 occ->idx = ida_simple_get(&occ_ida, reg, reg + 1,
661 if (occ->idx < 0)
662 occ->idx = ida_simple_get(&occ_ida, 1, INT_MAX,
665 occ->idx = ida_simple_get(&occ_ida, 1, INT_MAX,
669 occ->idx = ida_simple_get(&occ_ida, 1, INT_MAX, GFP_KERNEL);
672 platform_set_drvdata(pdev, occ);
674 snprintf(occ->name, sizeof(occ->name), "occ%d", occ->idx);
675 occ->mdev.fops = &occ_fops;
676 occ->mdev.minor = MISC_DYNAMIC_MINOR;
677 occ->mdev.name = occ->name;
678 occ->mdev.parent = dev;
680 rc = misc_register(&occ->mdev);
683 ida_simple_remove(&occ_ida, occ->idx);
684 kvfree(occ->buffer);
690 snprintf(child_name, sizeof(child_name), "%s.%d", hwmon_dev_info.name, occ->idx);
696 occ->platform_hwmon = true;
697 hwmon_dev_info.id = occ->idx;
708 struct occ *occ = platform_get_drvdata(pdev);
710 misc_deregister(&occ->mdev);
712 mutex_lock(&occ->occ_lock);
713 kvfree(occ->buffer);
714 occ->buffer = NULL;
715 mutex_unlock(&occ->occ_lock);
717 if (occ->platform_hwmon)
722 ida_simple_remove(&occ_ida, occ->idx);
729 .compatible = "ibm,p9-occ",
733 .compatible = "ibm,p10-occ",
742 .name = "occ",