1 // SPDX-License-Identifier: GPL-2.0
3 // Copyright 2019 Google LLC.
5 #include <linux/kernel.h>
6 #include <linux/module.h>
8 #include <linux/platform_device.h>
9 #include <linux/remoteproc.h>
10 #include <linux/rpmsg/mtk_rpmsg.h>
11 #include <linux/slab.h>
12 #include <linux/workqueue.h>
14 #include "rpmsg_internal.h"
16 struct mtk_rpmsg_rproc_subdev
{
17 struct platform_device
*pdev
;
18 struct mtk_rpmsg_info
*info
;
19 struct rpmsg_endpoint
*ns_ept
;
20 struct rproc_subdev subdev
;
22 struct work_struct register_work
;
23 struct list_head channels
;
24 struct mutex channels_lock
;
27 #define to_mtk_subdev(d) container_of(d, struct mtk_rpmsg_rproc_subdev, subdev)
29 struct mtk_rpmsg_channel_info
{
30 struct rpmsg_channel_info info
;
32 struct list_head list
;
36 * struct rpmsg_ns_msg - dynamic name service announcement message
37 * @name: name of remote service that is published
38 * @addr: address of remote service that is published
40 * This message is sent across to publish a new service. When we receive these
41 * messages, an appropriate rpmsg channel (i.e device) is created. In turn, the
42 * ->probe() handler of the appropriate rpmsg driver will be invoked
43 * (if/as-soon-as one is registered).
46 char name
[RPMSG_NAME_SIZE
];
50 struct mtk_rpmsg_device
{
51 struct rpmsg_device rpdev
;
52 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
;
55 struct mtk_rpmsg_endpoint
{
56 struct rpmsg_endpoint ept
;
57 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
;
60 #define to_mtk_rpmsg_device(r) container_of(r, struct mtk_rpmsg_device, rpdev)
61 #define to_mtk_rpmsg_endpoint(r) container_of(r, struct mtk_rpmsg_endpoint, ept)
63 static const struct rpmsg_endpoint_ops mtk_rpmsg_endpoint_ops
;
65 static void __mtk_ept_release(struct kref
*kref
)
67 struct rpmsg_endpoint
*ept
= container_of(kref
, struct rpmsg_endpoint
,
69 kfree(to_mtk_rpmsg_endpoint(ept
));
72 static void mtk_rpmsg_ipi_handler(void *data
, unsigned int len
, void *priv
)
74 struct mtk_rpmsg_endpoint
*mept
= priv
;
75 struct rpmsg_endpoint
*ept
= &mept
->ept
;
78 ret
= (*ept
->cb
)(ept
->rpdev
, data
, len
, ept
->priv
, ept
->addr
);
80 dev_warn(&ept
->rpdev
->dev
, "rpmsg handler return error = %d",
84 static struct rpmsg_endpoint
*
85 __mtk_create_ept(struct mtk_rpmsg_rproc_subdev
*mtk_subdev
,
86 struct rpmsg_device
*rpdev
, rpmsg_rx_cb_t cb
, void *priv
,
89 struct mtk_rpmsg_endpoint
*mept
;
90 struct rpmsg_endpoint
*ept
;
91 struct platform_device
*pdev
= mtk_subdev
->pdev
;
94 mept
= kzalloc(sizeof(*mept
), GFP_KERNEL
);
97 mept
->mtk_subdev
= mtk_subdev
;
100 kref_init(&ept
->refcount
);
105 ept
->ops
= &mtk_rpmsg_endpoint_ops
;
108 ret
= mtk_subdev
->info
->register_ipi(pdev
, id
, mtk_rpmsg_ipi_handler
,
111 dev_err(&pdev
->dev
, "IPI register failed, id = %d", id
);
112 kref_put(&ept
->refcount
, __mtk_ept_release
);
119 static struct rpmsg_endpoint
*
120 mtk_rpmsg_create_ept(struct rpmsg_device
*rpdev
, rpmsg_rx_cb_t cb
, void *priv
,
121 struct rpmsg_channel_info chinfo
)
123 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
=
124 to_mtk_rpmsg_device(rpdev
)->mtk_subdev
;
126 return __mtk_create_ept(mtk_subdev
, rpdev
, cb
, priv
, chinfo
.src
);
129 static void mtk_rpmsg_destroy_ept(struct rpmsg_endpoint
*ept
)
131 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
=
132 to_mtk_rpmsg_endpoint(ept
)->mtk_subdev
;
134 mtk_subdev
->info
->unregister_ipi(mtk_subdev
->pdev
, ept
->addr
);
135 kref_put(&ept
->refcount
, __mtk_ept_release
);
138 static int mtk_rpmsg_send(struct rpmsg_endpoint
*ept
, void *data
, int len
)
140 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
=
141 to_mtk_rpmsg_endpoint(ept
)->mtk_subdev
;
143 return mtk_subdev
->info
->send_ipi(mtk_subdev
->pdev
, ept
->addr
, data
,
147 static int mtk_rpmsg_trysend(struct rpmsg_endpoint
*ept
, void *data
, int len
)
149 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
=
150 to_mtk_rpmsg_endpoint(ept
)->mtk_subdev
;
153 * TODO: This currently is same as mtk_rpmsg_send, and wait until SCP
154 * received the last command.
156 return mtk_subdev
->info
->send_ipi(mtk_subdev
->pdev
, ept
->addr
, data
,
160 static const struct rpmsg_endpoint_ops mtk_rpmsg_endpoint_ops
= {
161 .destroy_ept
= mtk_rpmsg_destroy_ept
,
162 .send
= mtk_rpmsg_send
,
163 .trysend
= mtk_rpmsg_trysend
,
166 static void mtk_rpmsg_release_device(struct device
*dev
)
168 struct rpmsg_device
*rpdev
= to_rpmsg_device(dev
);
169 struct mtk_rpmsg_device
*mdev
= to_mtk_rpmsg_device(rpdev
);
174 static const struct rpmsg_device_ops mtk_rpmsg_device_ops
= {
175 .create_ept
= mtk_rpmsg_create_ept
,
178 static struct device_node
*
179 mtk_rpmsg_match_device_subnode(struct device_node
*node
, const char *channel
)
181 struct device_node
*child
;
185 for_each_available_child_of_node(node
, child
) {
186 ret
= of_property_read_string(child
, "mtk,rpmsg-name", &name
);
190 if (strcmp(name
, channel
) == 0)
197 static int mtk_rpmsg_register_device(struct mtk_rpmsg_rproc_subdev
*mtk_subdev
,
198 struct rpmsg_channel_info
*info
)
200 struct rpmsg_device
*rpdev
;
201 struct mtk_rpmsg_device
*mdev
;
202 struct platform_device
*pdev
= mtk_subdev
->pdev
;
205 mdev
= kzalloc(sizeof(*mdev
), GFP_KERNEL
);
209 mdev
->mtk_subdev
= mtk_subdev
;
211 rpdev
= &mdev
->rpdev
;
212 rpdev
->ops
= &mtk_rpmsg_device_ops
;
213 rpdev
->src
= info
->src
;
214 rpdev
->dst
= info
->dst
;
215 strscpy(rpdev
->id
.name
, info
->name
, RPMSG_NAME_SIZE
);
218 mtk_rpmsg_match_device_subnode(pdev
->dev
.of_node
, info
->name
);
219 rpdev
->dev
.parent
= &pdev
->dev
;
220 rpdev
->dev
.release
= mtk_rpmsg_release_device
;
222 ret
= rpmsg_register_device(rpdev
);
231 static void mtk_register_device_work_function(struct work_struct
*register_work
)
233 struct mtk_rpmsg_rproc_subdev
*subdev
= container_of(
234 register_work
, struct mtk_rpmsg_rproc_subdev
, register_work
);
235 struct platform_device
*pdev
= subdev
->pdev
;
236 struct mtk_rpmsg_channel_info
*info
;
239 mutex_lock(&subdev
->channels_lock
);
240 list_for_each_entry(info
, &subdev
->channels
, list
) {
241 if (info
->registered
)
244 ret
= mtk_rpmsg_register_device(subdev
, &info
->info
);
246 dev_err(&pdev
->dev
, "Can't create rpmsg_device\n");
250 info
->registered
= true;
252 mutex_unlock(&subdev
->channels_lock
);
255 static int mtk_rpmsg_create_device(struct mtk_rpmsg_rproc_subdev
*mtk_subdev
,
256 char *name
, u32 addr
)
258 struct mtk_rpmsg_channel_info
*info
;
260 info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
264 strscpy(info
->info
.name
, name
, RPMSG_NAME_SIZE
);
265 info
->info
.src
= addr
;
266 info
->info
.dst
= RPMSG_ADDR_ANY
;
267 mutex_lock(&mtk_subdev
->channels_lock
);
268 list_add(&info
->list
, &mtk_subdev
->channels
);
269 mutex_unlock(&mtk_subdev
->channels_lock
);
271 schedule_work(&mtk_subdev
->register_work
);
275 static int mtk_rpmsg_ns_cb(struct rpmsg_device
*rpdev
, void *data
, int len
,
278 struct rpmsg_ns_msg
*msg
= data
;
279 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
= priv
;
280 struct device
*dev
= &mtk_subdev
->pdev
->dev
;
284 if (len
!= sizeof(*msg
)) {
285 dev_err(dev
, "malformed ns msg (%d)\n", len
);
290 * the name service ept does _not_ belong to a real rpmsg channel,
291 * and is handled by the rpmsg bus itself.
292 * for sanity reasons, make sure a valid rpdev has _not_ sneaked
296 dev_err(dev
, "anomaly: ns ept has an rpdev handle\n");
300 /* don't trust the remote processor for null terminating the name */
301 msg
->name
[RPMSG_NAME_SIZE
- 1] = '\0';
303 dev_info(dev
, "creating channel %s addr 0x%x\n", msg
->name
, msg
->addr
);
305 ret
= mtk_rpmsg_create_device(mtk_subdev
, msg
->name
, msg
->addr
);
307 dev_err(dev
, "create rpmsg device failed\n");
314 static int mtk_rpmsg_prepare(struct rproc_subdev
*subdev
)
316 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
= to_mtk_subdev(subdev
);
318 /* a dedicated endpoint handles the name service msgs */
319 if (mtk_subdev
->info
->ns_ipi_id
>= 0) {
321 __mtk_create_ept(mtk_subdev
, NULL
, mtk_rpmsg_ns_cb
,
323 mtk_subdev
->info
->ns_ipi_id
);
324 if (!mtk_subdev
->ns_ept
) {
325 dev_err(&mtk_subdev
->pdev
->dev
,
326 "failed to create name service endpoint\n");
334 static void mtk_rpmsg_unprepare(struct rproc_subdev
*subdev
)
336 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
= to_mtk_subdev(subdev
);
338 if (mtk_subdev
->ns_ept
) {
339 mtk_rpmsg_destroy_ept(mtk_subdev
->ns_ept
);
340 mtk_subdev
->ns_ept
= NULL
;
344 static void mtk_rpmsg_stop(struct rproc_subdev
*subdev
, bool crashed
)
346 struct mtk_rpmsg_channel_info
*info
, *next
;
347 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
= to_mtk_subdev(subdev
);
348 struct device
*dev
= &mtk_subdev
->pdev
->dev
;
351 * Destroy the name service endpoint here, to avoid new channel being
352 * created after the rpmsg_unregister_device loop below.
354 if (mtk_subdev
->ns_ept
) {
355 mtk_rpmsg_destroy_ept(mtk_subdev
->ns_ept
);
356 mtk_subdev
->ns_ept
= NULL
;
359 cancel_work_sync(&mtk_subdev
->register_work
);
361 mutex_lock(&mtk_subdev
->channels_lock
);
362 list_for_each_entry(info
, &mtk_subdev
->channels
, list
) {
363 if (!info
->registered
)
365 if (rpmsg_unregister_device(dev
, &info
->info
)) {
368 "rpmsg_unregister_device failed for %s.%d.%d\n",
369 info
->info
.name
, info
->info
.src
,
374 list_for_each_entry_safe(info
, next
,
375 &mtk_subdev
->channels
, list
) {
376 list_del(&info
->list
);
379 mutex_unlock(&mtk_subdev
->channels_lock
);
382 struct rproc_subdev
*
383 mtk_rpmsg_create_rproc_subdev(struct platform_device
*pdev
,
384 struct mtk_rpmsg_info
*info
)
386 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
;
388 mtk_subdev
= kzalloc(sizeof(*mtk_subdev
), GFP_KERNEL
);
392 mtk_subdev
->pdev
= pdev
;
393 mtk_subdev
->subdev
.prepare
= mtk_rpmsg_prepare
;
394 mtk_subdev
->subdev
.stop
= mtk_rpmsg_stop
;
395 mtk_subdev
->subdev
.unprepare
= mtk_rpmsg_unprepare
;
396 mtk_subdev
->info
= info
;
397 INIT_LIST_HEAD(&mtk_subdev
->channels
);
398 INIT_WORK(&mtk_subdev
->register_work
,
399 mtk_register_device_work_function
);
400 mutex_init(&mtk_subdev
->channels_lock
);
402 return &mtk_subdev
->subdev
;
404 EXPORT_SYMBOL_GPL(mtk_rpmsg_create_rproc_subdev
);
406 void mtk_rpmsg_destroy_rproc_subdev(struct rproc_subdev
*subdev
)
408 struct mtk_rpmsg_rproc_subdev
*mtk_subdev
= to_mtk_subdev(subdev
);
412 EXPORT_SYMBOL_GPL(mtk_rpmsg_destroy_rproc_subdev
);
414 MODULE_LICENSE("GPL v2");
415 MODULE_DESCRIPTION("MediaTek scp rpmsg driver");