hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/rpmsg/rockchip_rpmsg.c
similarity index 78%copy from kernel/drivers/rpmsg/rockchip_rpmsg.ccopy to kernel/drivers/rpmsg/rockchip_rpmsg_softirq.c
....@@ -2,17 +2,18 @@
22 /*
33 * Rockchip Remote Processors Messaging Platform Support.
44 *
5
- * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
6
- * Author: Steven Liu <steven.liu@rock-chips.com>
5
+ * Copyright (c) 2023 Rockchip Electronics Co. Ltd.
6
+ * Author: Hongming Zou <hongming.zou@rock-chips.com>
77 */
88
99 #include <linux/delay.h>
1010 #include <linux/err.h>
1111 #include <linux/init.h>
1212 #include <linux/interrupt.h>
13
+#include <linux/irq.h>
14
+#include <linux/irqreturn.h>
15
+#include <linux/of_irq.h>
1316 #include <linux/kernel.h>
14
-#include <linux/mailbox_client.h>
15
-#include <linux/mailbox_controller.h>
1617 #include <linux/module.h>
1718 #include <linux/of_device.h>
1819 #include <linux/of_reserved_mem.h>
....@@ -22,7 +23,6 @@
2223 #include <linux/virtio_config.h>
2324 #include <linux/virtio_ids.h>
2425 #include <linux/virtio_ring.h>
25
-#include <soc/rockchip/rockchip-mailbox.h>
2626
2727 #include "rpmsg_internal.h"
2828
....@@ -35,6 +35,11 @@
3535 struct rk_rpmsg_dev *rpdev;
3636 };
3737
38
+struct rk_rpmsg_irqs {
39
+ int irq_tx;
40
+ int irq_rx;
41
+};
42
+
3843 #define to_rk_rpvdev(vd) container_of(vd, struct rk_virtio_dev, vdev)
3944
4045 struct rk_rpmsg_dev {
....@@ -43,10 +48,8 @@
4348 unsigned int link_id;
4449 int first_notify;
4550 u32 flags;
46
- struct mbox_client mbox_cl;
47
- struct mbox_chan *mbox_rx_chan;
48
- struct mbox_chan *mbox_tx_chan;
4951 struct rk_virtio_dev *rpvdev[RPMSG_MAX_INSTANCE_NUM];
52
+ struct rk_rpmsg_irqs irqs;
5053 };
5154
5255 struct rk_rpmsg_vq_info {
....@@ -55,26 +58,21 @@
5558 struct rk_rpmsg_dev *rpdev;
5659 };
5760
58
-static void rk_rpmsg_rx_callback(struct mbox_client *client, void *message)
61
+static irqreturn_t rk_rpmsg_rx_callback(int irq, void *_pdev)
5962 {
6063 u32 link_id;
64
+ struct platform_device *pdev = _pdev;
6165 struct rk_virtio_dev *rpvdev;
62
- struct rk_rpmsg_dev *rpdev = container_of(client, struct rk_rpmsg_dev, mbox_cl);
63
- struct platform_device *pdev = rpdev->pdev;
66
+ struct rk_rpmsg_dev *rpdev = platform_get_drvdata(pdev);
6467 struct device *dev = &pdev->dev;
65
- struct rockchip_mbox_msg *rx_msg;
6668
67
- rx_msg = message;
68
- dev_dbg(dev, "rpmsg master: receive cmd=0x%x data=0x%x\n",
69
- rx_msg->cmd, rx_msg->data);
70
- if (rx_msg->data != RPMSG_MBOX_MAGIC)
71
- dev_err(dev, "rpmsg master: mailbox data error!\n");
72
- link_id = rx_msg->cmd & 0xFFU;
73
- /* TODO: only support one remote core now */
69
+ link_id = rpdev->link_id;
7470 rpvdev = rpdev->rpvdev[0];
7571 rpdev->flags |= RPMSG_REMOTE_IS_READY;
7672 dev_dbg(dev, "rpmsg master: rx link_id=0x%x flag=0x%x\n", link_id, rpdev->flags);
7773 vring_interrupt(0, rpvdev->vq[0]);
74
+
75
+ return IRQ_HANDLED;
7876 }
7977
8078 static bool rk_rpmsg_notify(struct virtqueue *vq)
....@@ -83,17 +81,12 @@
8381 struct rk_rpmsg_dev *rpdev = rpvq->rpdev;
8482 struct platform_device *pdev = rpdev->pdev;
8583 struct device *dev = &pdev->dev;
86
- u32 link_id;
87
- int ret;
88
- struct rockchip_mbox_msg tx_msg;
84
+ struct irq_chip *chip;
8985
90
- memset(&tx_msg, 0, sizeof(tx_msg));
86
+ chip = irq_get_chip(rpdev->irqs.irq_tx);
87
+
9188 dev_dbg(dev, "queue_id-0x%x virt_vring_addr 0x%p\n",
9289 rpvq->queue_id, rpvq->vring_addr);
93
-
94
- link_id = rpdev->link_id;
95
- tx_msg.cmd = link_id & 0xFFU;
96
- tx_msg.data = RPMSG_MBOX_MAGIC;
9790
9891 if ((rpdev->first_notify == 0) && (rpvq->queue_id % 2 == 0)) {
9992 /* first_notify is used in the master init handshake phase. */
....@@ -103,11 +96,9 @@
10396 /* tx done is not supported, so ignored */
10497 return true;
10598 }
106
- ret = mbox_send_message(rpdev->mbox_tx_chan, &tx_msg);
107
- if (ret < 0) {
108
- dev_err(dev, "mbox send failed!\n");
109
- return false;
110
- }
99
+
100
+ if (chip && chip->irq_retrigger)
101
+ chip->irq_retrigger(irq_get_irq_data(rpdev->irqs.irq_tx));
111102
112103 return true;
113104 }
....@@ -292,7 +283,7 @@
292283 {
293284 struct device *dev = &pdev->dev;
294285 struct rk_rpmsg_dev *rpdev = NULL;
295
- struct mbox_client *cl;
286
+
296287 int i, ret = 0;
297288
298289 rpdev = devm_kzalloc(dev, sizeof(*rpdev), GFP_KERNEL);
....@@ -303,44 +294,46 @@
303294 rpdev->pdev = pdev;
304295 rpdev->first_notify = 0;
305296
306
- cl = &rpdev->mbox_cl;
307
- cl->dev = dev;
308
- cl->rx_callback = rk_rpmsg_rx_callback;
309
-
310
- rpdev->mbox_rx_chan = mbox_request_channel_byname(cl, "rpmsg-rx");
311
- if (IS_ERR(rpdev->mbox_rx_chan)) {
312
- ret = PTR_ERR(rpdev->mbox_rx_chan);
313
- dev_err(dev, "failed to request mbox rx chan, ret %d\n", ret);
314
- return ret;
315
- }
316
- rpdev->mbox_tx_chan = mbox_request_channel_byname(cl, "rpmsg-tx");
317
- if (IS_ERR(rpdev->mbox_tx_chan)) {
318
- ret = PTR_ERR(rpdev->mbox_tx_chan);
319
- dev_err(dev, "failed to request mbox tx chan, ret %d\n", ret);
320
- return ret;
321
- }
322
-
323297 ret = device_property_read_u32(dev, "rockchip,link-id", &rpdev->link_id);
324298 if (ret) {
325299 dev_err(dev, "failed to get link_id, ret %d\n", ret);
326
- goto free_channel;
300
+
301
+ return ret;
327302 }
328303 ret = device_property_read_u32(dev, "rockchip,vdev-nums", &rpdev->vdev_nums);
329304 if (ret) {
330305 dev_info(dev, "vdev-nums default 1\n");
331306 rpdev->vdev_nums = 1;
307
+
308
+ return ret;
332309 }
333310 if (rpdev->vdev_nums > RPMSG_MAX_INSTANCE_NUM) {
334311 dev_err(dev, "vdev-nums exceed the max %d\n", RPMSG_MAX_INSTANCE_NUM);
335
- ret = -EINVAL;
336
- goto free_channel;
312
+
313
+ return -EINVAL;
314
+ }
315
+
316
+ rpdev->irqs.irq_tx = platform_get_irq(pdev, 0);
317
+ if (rpdev->irqs.irq_tx < 0)
318
+ return rpdev->irqs.irq_tx;
319
+
320
+ rpdev->irqs.irq_rx = platform_get_irq(pdev, 1);
321
+ if (rpdev->irqs.irq_rx < 0)
322
+ return rpdev->irqs.irq_rx;
323
+
324
+ ret = devm_request_threaded_irq(&pdev->dev, rpdev->irqs.irq_rx, NULL, rk_rpmsg_rx_callback,
325
+ IRQF_ONESHOT, "rockchip-rpmsg", pdev);
326
+ if (ret) {
327
+ dev_err(dev, "could not install irq");
328
+
329
+ return ret;
337330 }
338331
339332 ret = rk_set_vring_phy_buf(pdev, rpdev, rpdev->vdev_nums);
340333 if (ret) {
341334 dev_err(dev, "No vring buffer.\n");
342
- ret = -ENOMEM;
343
- goto free_channel;
335
+
336
+ return -EINVAL;
344337 }
345338 if (of_reserved_mem_device_init(dev)) {
346339 dev_info(dev, "No shared DMA pool.\n");
....@@ -374,41 +367,41 @@
374367 if (rpdev->flags & RPMSG_SHARED_DMA_POOL)
375368 of_reserved_mem_device_release(dev);
376369
377
-free_channel:
378
- mbox_free_channel(rpdev->mbox_rx_chan);
379
- mbox_free_channel(rpdev->mbox_tx_chan);
380
-
381370 return ret;
382371 }
383372
384373 static int rockchip_rpmsg_remove(struct platform_device *pdev)
385374 {
375
+ struct device *dev = &pdev->dev;
386376 struct rk_rpmsg_dev *rpdev = platform_get_drvdata(pdev);
387377
388
- mbox_free_channel(rpdev->mbox_rx_chan);
389
- mbox_free_channel(rpdev->mbox_tx_chan);
378
+ int i;
379
+
380
+ for (i = 0; i < rpdev->vdev_nums; i++)
381
+ unregister_virtio_device(&rpdev->rpvdev[i]->vdev);
382
+
383
+ of_reserved_mem_device_release(dev);
390384
391385 return 0;
392386 }
393387
394388 static const struct of_device_id rockchip_rpmsg_match[] = {
395
- { .compatible = "rockchip,rpmsg", },
389
+ { .compatible = "rockchip,rpmsg-softirq", },
396390 { /* sentinel */ },
397391 };
398392
399393 MODULE_DEVICE_TABLE(of, rockchip_rpmsg_match);
400394
401
-static struct platform_driver rockchip_rpmsg_driver = {
395
+static struct platform_driver rockchip_rpmsg_softirq_driver = {
402396 .probe = rockchip_rpmsg_probe,
403397 .remove = rockchip_rpmsg_remove,
404398 .driver = {
405
- .name = "rockchip-rpmsg",
399
+ .name = "rockchip-rpmsg-softirq",
406400 .of_match_table = rockchip_rpmsg_match,
407401 },
408402 };
409
-module_platform_driver(rockchip_rpmsg_driver);
403
+module_platform_driver(rockchip_rpmsg_softirq_driver);
410404
411405 MODULE_LICENSE("GPL");
412
-MODULE_DESCRIPTION("Rockchip Remote Processors Messaging Platform Support");
413
-MODULE_AUTHOR("Steven Liu <steven.liu@rock-chips.com>");
414
-
406
+MODULE_DESCRIPTION("Rockchip Using Softirq Mode Remote Processors Messaging Platform Support");
407
+MODULE_AUTHOR("Hongming Zou <hongming.zou@rock-chips.com>");