Lines Matching +full:device +full:- +full:sram
1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/device.h>
7 #include <linux/fsi-sbefifo.h>
15 #include <linux/fsi-occ.h>
41 struct device *dev;
42 struct device *sbefifo;
74 struct miscdevice *mdev = file->private_data; in occ_open()
78 return -ENOMEM; in occ_open()
80 client->buffer = (u8 *)__get_free_page(GFP_KERNEL); in occ_open()
81 if (!client->buffer) { in occ_open()
83 return -ENOMEM; in occ_open()
86 client->occ = occ; in occ_open()
87 mutex_init(&client->lock); in occ_open()
88 file->private_data = client; in occ_open()
90 /* We allocate a 1-page buffer, make sure it all fits */ in occ_open()
100 struct occ_client *client = file->private_data; in occ_read()
104 return -ENODEV; in occ_read()
107 return -EINVAL; in occ_read()
109 mutex_lock(&client->lock); in occ_read()
112 if (WARN_ON_ONCE(client->read_offset > client->data_size)) { in occ_read()
113 rc = -EIO; in occ_read()
118 rc = min(len, client->data_size - client->read_offset); in occ_read()
119 if (copy_to_user(buf, client->buffer + client->read_offset, rc)) in occ_read()
120 rc = -EFAULT; in occ_read()
122 client->read_offset += rc; in occ_read()
125 mutex_unlock(&client->lock); in occ_read()
133 struct occ_client *client = file->private_data; in occ_write()
140 return -ENODEV; in occ_write()
143 return -EINVAL; in occ_write()
145 mutex_lock(&client->lock); in occ_write()
148 cmd = client->buffer; in occ_write()
157 * bytes 1-2: data length (msb first) in occ_write()
158 * bytes 3-n: data in occ_write()
161 rc = -EFAULT; in occ_write()
168 rc = -EINVAL; in occ_write()
181 rc = fsi_occ_submit(client->occ->dev, cmd, data_length + 6, cmd, in occ_write()
187 client->data_size = rlen; in occ_write()
188 client->read_offset = 0; in occ_write()
194 mutex_unlock(&client->lock); in occ_write()
201 struct occ_client *client = file->private_data; in occ_release()
203 free_page((unsigned long)client->buffer); in occ_release()
220 u16 checksum_resp = get_unaligned_be16(&resp->data[data_length]); in occ_verify_checksum()
224 checksum = resp->seq_no; in occ_verify_checksum()
225 checksum += resp->cmd_type; in occ_verify_checksum()
226 checksum += resp->return_status; in occ_verify_checksum()
230 checksum += resp->data[i]; in occ_verify_checksum()
233 return -EBADMSG; in occ_verify_checksum()
247 * specified SRAM address. in occ_getsram()
258 return -ENOMEM; in occ_getsram()
260 rc = sbefifo_submit(occ->sbefifo, cmd, 5, resp, &resp_len); in occ_getsram()
264 rc = sbefifo_parse_status(occ->sbefifo, SBEFIFO_CMD_GET_OCC_SRAM, in occ_getsram()
269 resp_data_len = be32_to_cpu(resp[resp_len - 1]); in occ_getsram()
271 dev_err(occ->dev, "SRAM read expected %d bytes got %zd\n", in occ_getsram()
273 rc = -EBADMSG; in occ_getsram()
281 dev_err(occ->dev, "SRAM read returned failure status: %08x\n", in occ_getsram()
283 rc = -EBADMSG; in occ_getsram()
307 return -ENOMEM; in occ_putsram()
311 * data to specified SRAM address. in occ_putsram()
321 rc = sbefifo_submit(occ->sbefifo, buf, cmd_len, buf, &resp_len); in occ_putsram()
325 rc = sbefifo_parse_status(occ->sbefifo, SBEFIFO_CMD_PUT_OCC_SRAM, in occ_putsram()
331 dev_err(occ->dev, "SRAM write response length invalid: %zd\n", in occ_putsram()
333 rc = -EBADMSG; in occ_putsram()
337 dev_err(occ->dev, in occ_putsram()
338 "SRAM write expected %d bytes got %zd\n", in occ_putsram()
340 rc = -EBADMSG; in occ_putsram()
347 dev_err(occ->dev, "SRAM write returned failure status: %08x\n", in occ_putsram()
349 rc = -EBADMSG; in occ_putsram()
365 buf[0] = cpu_to_be32(0x5 + 0x2); /* Chip-op length in words */ in occ_trigger_attn()
373 rc = sbefifo_submit(occ->sbefifo, buf, 7, buf, &resp_len); in occ_trigger_attn()
377 rc = sbefifo_parse_status(occ->sbefifo, SBEFIFO_CMD_PUT_OCC_SRAM, in occ_trigger_attn()
383 dev_err(occ->dev, "SRAM attn response length invalid: %zd\n", in occ_trigger_attn()
385 rc = -EBADMSG; in occ_trigger_attn()
389 dev_err(occ->dev, in occ_trigger_attn()
390 "SRAM attn expected 8 bytes got %zd\n", in occ_trigger_attn()
392 rc = -EBADMSG; in occ_trigger_attn()
399 dev_err(occ->dev, "SRAM attn returned failure status: %08x\n", in occ_trigger_attn()
401 rc = -EBADMSG; in occ_trigger_attn()
407 int fsi_occ_submit(struct device *dev, const void *request, size_t req_len, in fsi_occ_submit()
421 return -ENODEV; in fsi_occ_submit()
425 return -EINVAL; in fsi_occ_submit()
428 mutex_lock(&occ->occ_lock); in fsi_occ_submit()
447 if (resp->return_status == OCC_RESP_CMD_IN_PRG || in fsi_occ_submit()
448 resp->return_status == OCC_RESP_CRIT_INIT || in fsi_occ_submit()
449 resp->seq_no != seq_no) { in fsi_occ_submit()
450 rc = -ETIMEDOUT; in fsi_occ_submit()
453 dev_err(occ->dev, "resp timeout status=%02x " in fsi_occ_submit()
455 resp->return_status, resp->seq_no, in fsi_occ_submit()
466 resp_data_length = get_unaligned_be16(&resp->data_length); in fsi_occ_submit()
470 rc = -EMSGSIZE; in fsi_occ_submit()
475 resp->return_status, resp_data_length); in fsi_occ_submit()
481 &resp->data[3], resp_data_length - 1); in fsi_occ_submit()
490 mutex_unlock(&occ->occ_lock); in fsi_occ_submit()
496 static int occ_unregister_child(struct device *dev, void *data) in occ_unregister_child()
511 struct device *dev = &pdev->dev; in occ_probe()
514 .name = "occ-hwmon", in occ_probe()
519 return -ENOMEM; in occ_probe()
521 occ->dev = dev; in occ_probe()
522 occ->sbefifo = dev->parent; in occ_probe()
523 mutex_init(&occ->occ_lock); in occ_probe()
525 if (dev->of_node) { in occ_probe()
526 rc = of_property_read_u32(dev->of_node, "reg", ®); in occ_probe()
529 occ->idx = ida_simple_get(&occ_ida, reg, reg + 1, in occ_probe()
531 if (occ->idx < 0) in occ_probe()
532 occ->idx = ida_simple_get(&occ_ida, 1, INT_MAX, in occ_probe()
535 occ->idx = ida_simple_get(&occ_ida, 1, INT_MAX, in occ_probe()
539 occ->idx = ida_simple_get(&occ_ida, 1, INT_MAX, GFP_KERNEL); in occ_probe()
544 snprintf(occ->name, sizeof(occ->name), "occ%d", occ->idx); in occ_probe()
545 occ->mdev.fops = &occ_fops; in occ_probe()
546 occ->mdev.minor = MISC_DYNAMIC_MINOR; in occ_probe()
547 occ->mdev.name = occ->name; in occ_probe()
548 occ->mdev.parent = dev; in occ_probe()
550 rc = misc_register(&occ->mdev); in occ_probe()
553 ida_simple_remove(&occ_ida, occ->idx); in occ_probe()
557 hwmon_dev_info.id = occ->idx; in occ_probe()
560 dev_warn(dev, "failed to create hwmon device\n"); in occ_probe()
569 misc_deregister(&occ->mdev); in occ_remove()
571 device_for_each_child(&pdev->dev, NULL, occ_unregister_child); in occ_remove()
573 ida_simple_remove(&occ_ida, occ->idx); in occ_remove()
579 { .compatible = "ibm,p9-occ" },