Lines Matching +full:rpmsg +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0
6 * Author: Steven Liu <steven.liu@rock-chips.com>
20 #include <linux/rpmsg/rockchip_rpmsg.h>
25 #include <soc/rockchip/rockchip-mailbox.h>
69 struct platform_device *pdev = rpdev->pdev; in rk_rpmsg_rx_callback()
70 struct device *dev = &pdev->dev; in rk_rpmsg_rx_callback()
74 dev_dbg(dev, "rpmsg master: receive cmd=0x%x data=0x%x\n", in rk_rpmsg_rx_callback()
75 rx_msg->cmd, rx_msg->data); in rk_rpmsg_rx_callback()
76 if (rx_msg->data != RPMSG_MBOX_MAGIC) in rk_rpmsg_rx_callback()
77 dev_err(dev, "rpmsg master: mailbox data error!\n"); in rk_rpmsg_rx_callback()
78 link_id = rx_msg->cmd & 0xFFU; in rk_rpmsg_rx_callback()
80 rpvdev = rpdev->rpvdev[0]; in rk_rpmsg_rx_callback()
81 rpdev->flags |= RPMSG_REMOTE_IS_READY; in rk_rpmsg_rx_callback()
82 dev_dbg(dev, "rpmsg master: rx link_id=0x%x flag=0x%x\n", link_id, rpdev->flags); in rk_rpmsg_rx_callback()
83 vring_interrupt(0, rpvdev->vq[0]); in rk_rpmsg_rx_callback()
88 struct rk_rpmsg_vq_info *rpvq = vq->priv; in rk_rpmsg_notify()
89 struct rk_rpmsg_dev *rpdev = rpvq->rpdev; in rk_rpmsg_notify()
90 struct platform_device *pdev = rpdev->pdev; in rk_rpmsg_notify()
91 struct device *dev = &pdev->dev; in rk_rpmsg_notify()
97 dev_dbg(dev, "queue_id-0x%x virt_vring_addr 0x%p\n", in rk_rpmsg_notify()
98 rpvq->queue_id, rpvq->vring_addr); in rk_rpmsg_notify()
100 link_id = rpdev->link_id; in rk_rpmsg_notify()
104 if ((rpdev->first_notify == 0) && (rpvq->queue_id % 2 == 0)) { in rk_rpmsg_notify()
106 dev_dbg(dev, "rpmsg first_notify\n"); in rk_rpmsg_notify()
107 rpdev->first_notify++; in rk_rpmsg_notify()
108 } else if (rpvq->queue_id % 2 == 0) { in rk_rpmsg_notify()
112 ret = mbox_send_message(rpdev->mbox_tx_chan, &tx_msg); in rk_rpmsg_notify()
117 mbox_chan_txdone(rpdev->mbox_tx_chan, 0); in rk_rpmsg_notify()
125 const char *name, in rk_rpmsg_find_vq() argument
129 struct rk_rpmsg_dev *rpdev = rpvdev->rpdev; in rk_rpmsg_find_vq()
130 struct platform_device *pdev = rpdev->pdev; in rk_rpmsg_find_vq()
131 struct device *dev = &pdev->dev; in rk_rpmsg_find_vq()
138 return ERR_PTR(-ENOMEM); in rk_rpmsg_find_vq()
140 rpdev->flags &= (~RPMSG_CACHED_VRING); in rk_rpmsg_find_vq()
141 rpvq->vring_addr = (__force void *) ioremap(rpvdev->vring[index], RPMSG_VRING_SIZE); in rk_rpmsg_find_vq()
142 if (!rpvq->vring_addr) { in rk_rpmsg_find_vq()
143 ret = -ENOMEM; in rk_rpmsg_find_vq()
147 rpvdev->vring[index], rpvq->vring_addr); in rk_rpmsg_find_vq()
149 memset_io(rpvq->vring_addr, 0, RPMSG_VRING_SIZE); in rk_rpmsg_find_vq()
152 rpvq->vring_addr, rk_rpmsg_notify, callback, name); in rk_rpmsg_find_vq()
155 ret = -ENOMEM; in rk_rpmsg_find_vq()
159 rpvdev->vq[index] = vq; in rk_rpmsg_find_vq()
160 vq->priv = rpvq; in rk_rpmsg_find_vq()
162 rpvq->queue_id = rpvdev->base_queue_id + index; in rk_rpmsg_find_vq()
163 rpvq->rpdev = rpdev; in rk_rpmsg_find_vq()
168 iounmap((__force void __iomem *) rpvq->vring_addr); in rk_rpmsg_find_vq()
194 list_for_each_entry_safe(vq, n, &vdev->vqs, list) { in rk_rpmsg_del_vqs()
195 struct rk_rpmsg_vq_info *rpvq = vq->priv; in rk_rpmsg_del_vqs()
197 iounmap(rpvq->vring_addr); in rk_rpmsg_del_vqs()
213 /* Each rpmsg instance has two virtqueues. vqs[0] is rvq and vqs[1] is tvq */ in rk_rpmsg_find_vqs()
215 return -EINVAL; in rk_rpmsg_find_vqs()
226 rpvdev->num_of_vqs = nvqs; in rk_rpmsg_find_vqs()
265 struct device *dev = &pdev->dev; in rk_set_vring_phy_buf()
274 start = res->start; in rk_set_vring_phy_buf()
275 end = res->start + size; in rk_set_vring_phy_buf()
277 rpdev->rpvdev[i] = devm_kzalloc(dev, sizeof(struct rk_virtio_dev), in rk_set_vring_phy_buf()
279 if (!rpdev->rpvdev[i]) in rk_set_vring_phy_buf()
280 return -ENOMEM; in rk_set_vring_phy_buf()
282 rpdev->rpvdev[i]->vring[0] = start; in rk_set_vring_phy_buf()
283 rpdev->rpvdev[i]->vring[1] = start + RPMSG_VRING_SIZE; in rk_set_vring_phy_buf()
287 ret = -EINVAL; in rk_set_vring_phy_buf()
292 return -ENOMEM; in rk_set_vring_phy_buf()
300 struct device *dev = &pdev->dev; in rockchip_rpmsg_probe()
307 return -ENOMEM; in rockchip_rpmsg_probe()
309 dev_info(dev, "rockchip rpmsg platform probe.\n"); in rockchip_rpmsg_probe()
310 rpdev->pdev = pdev; in rockchip_rpmsg_probe()
311 rpdev->chip = (enum rk_rpmsg_chip)device_get_match_data(dev); in rockchip_rpmsg_probe()
312 rpdev->first_notify = 0; in rockchip_rpmsg_probe()
314 cl = &rpdev->mbox_cl; in rockchip_rpmsg_probe()
315 cl->dev = dev; in rockchip_rpmsg_probe()
316 cl->rx_callback = rk_rpmsg_rx_callback; in rockchip_rpmsg_probe()
318 rpdev->mbox_rx_chan = mbox_request_channel_byname(cl, "rpmsg-rx"); in rockchip_rpmsg_probe()
319 if (IS_ERR(rpdev->mbox_rx_chan)) { in rockchip_rpmsg_probe()
320 ret = PTR_ERR(rpdev->mbox_rx_chan); in rockchip_rpmsg_probe()
324 rpdev->mbox_tx_chan = mbox_request_channel_byname(cl, "rpmsg-tx"); in rockchip_rpmsg_probe()
325 if (IS_ERR(rpdev->mbox_tx_chan)) { in rockchip_rpmsg_probe()
326 ret = PTR_ERR(rpdev->mbox_tx_chan); in rockchip_rpmsg_probe()
331 ret = device_property_read_u32(dev, "rockchip,link-id", &rpdev->link_id); in rockchip_rpmsg_probe()
336 ret = device_property_read_u32(dev, "rockchip,vdev-nums", &rpdev->vdev_nums); in rockchip_rpmsg_probe()
338 dev_info(dev, "vdev-nums default 1\n"); in rockchip_rpmsg_probe()
339 rpdev->vdev_nums = 1; in rockchip_rpmsg_probe()
341 if (rpdev->vdev_nums > RPMSG_MAX_INSTANCE_NUM) { in rockchip_rpmsg_probe()
342 dev_err(dev, "vdev-nums exceed the max %d\n", RPMSG_MAX_INSTANCE_NUM); in rockchip_rpmsg_probe()
343 ret = -EINVAL; in rockchip_rpmsg_probe()
347 ret = rk_set_vring_phy_buf(pdev, rpdev, rpdev->vdev_nums); in rockchip_rpmsg_probe()
350 ret = -ENOMEM; in rockchip_rpmsg_probe()
355 rpdev->flags &= (~RPMSG_SHARED_DMA_POOL); in rockchip_rpmsg_probe()
357 rpdev->flags |= RPMSG_SHARED_DMA_POOL; in rockchip_rpmsg_probe()
360 for (i = 0; i < rpdev->vdev_nums; i++) { in rockchip_rpmsg_probe()
362 i, rpdev->rpvdev[i]->vring[0], rpdev->rpvdev[i]->vring[1]); in rockchip_rpmsg_probe()
363 rpdev->rpvdev[i]->vdev.id.device = VIRTIO_ID_RPMSG; in rockchip_rpmsg_probe()
364 rpdev->rpvdev[i]->vdev.config = &rk_rpmsg_config_ops; in rockchip_rpmsg_probe()
365 rpdev->rpvdev[i]->vdev.dev.parent = dev; in rockchip_rpmsg_probe()
366 rpdev->rpvdev[i]->vdev.dev.release = rk_rpmsg_vdev_release; in rockchip_rpmsg_probe()
367 rpdev->rpvdev[i]->base_queue_id = i * 2; in rockchip_rpmsg_probe()
368 rpdev->rpvdev[i]->rpdev = rpdev; in rockchip_rpmsg_probe()
370 ret = register_virtio_device(&rpdev->rpvdev[i]->vdev); in rockchip_rpmsg_probe()
382 if (rpdev->flags & RPMSG_SHARED_DMA_POOL) in rockchip_rpmsg_probe()
386 mbox_free_channel(rpdev->mbox_rx_chan); in rockchip_rpmsg_probe()
387 mbox_free_channel(rpdev->mbox_tx_chan); in rockchip_rpmsg_probe()
396 mbox_free_channel(rpdev->mbox_rx_chan); in rockchip_rpmsg_remove()
397 mbox_free_channel(rpdev->mbox_tx_chan); in rockchip_rpmsg_remove()
403 { .compatible = "rockchip,rk3562-rpmsg", .data = (void *)RK3562, },
404 { .compatible = "rockchip,rk3568-rpmsg", .data = (void *)RK3568, },
414 .name = "rockchip-rpmsg",
422 MODULE_AUTHOR("Steven Liu <steven.liu@rock-chips.com>");