hc
2025-02-14 bbb9540dc49f70f6b703d1c8d1b85fa5f602d86e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * remote processor messaging bus internals
 *
 * Copyright (c) 2020 The Linux Foundation.
 * Copyright (C) 2011 Texas Instruments, Inc.
 * Copyright (C) 2011 Google, Inc.
 *
 * Ohad Ben-Cohen <ohad@wizery.com>
 * Brian Swetland <swetland@google.com>
 */
 
#ifndef __RPMSG_INTERNAL_H__
#define __RPMSG_INTERNAL_H__
 
#include <linux/rpmsg.h>
#include <linux/poll.h>
 
#define to_rpmsg_device(d) container_of(d, struct rpmsg_device, dev)
#define to_rpmsg_driver(d) container_of(d, struct rpmsg_driver, drv)
 
/**
 * struct rpmsg_device_ops - indirection table for the rpmsg_device operations
 * @create_ept:        create backend-specific endpoint, required
 * @announce_create:    announce presence of new channel, optional
 * @announce_destroy:    announce destruction of channel, optional
 *
 * Indirection table for the operations that a rpmsg backend should implement.
 * @announce_create and @announce_destroy are optional as the backend might
 * advertise new channels implicitly by creating the endpoints.
 */
struct rpmsg_device_ops {
   struct rpmsg_endpoint *(*create_ept)(struct rpmsg_device *rpdev,
                       rpmsg_rx_cb_t cb, void *priv,
                       struct rpmsg_channel_info chinfo);
 
   int (*announce_create)(struct rpmsg_device *ept);
   int (*announce_destroy)(struct rpmsg_device *ept);
};
 
/**
 * struct rpmsg_endpoint_ops - indirection table for rpmsg_endpoint operations
 * @destroy_ept:    see @rpmsg_destroy_ept(), required
 * @send:        see @rpmsg_send(), required
 * @sendto:        see @rpmsg_sendto(), optional
 * @send_offchannel:    see @rpmsg_send_offchannel(), optional
 * @trysend:        see @rpmsg_trysend(), required
 * @trysendto:        see @rpmsg_trysendto(), optional
 * @trysend_offchannel:    see @rpmsg_trysend_offchannel(), optional
 * @poll:        see @rpmsg_poll(), optional
 * @get_signals:    see @rpmsg_get_signals(), optional
 * @set_signals:    see @rpmsg_set_signals(), optional
 *
 * Indirection table for the operations that a rpmsg backend should implement.
 * In addition to @destroy_ept, the backend must at least implement @send and
 * @trysend, while the variants sending data off-channel are optional.
 */
struct rpmsg_endpoint_ops {
   void (*destroy_ept)(struct rpmsg_endpoint *ept);
 
   int (*send)(struct rpmsg_endpoint *ept, void *data, int len);
   int (*sendto)(struct rpmsg_endpoint *ept, void *data, int len, u32 dst);
   int (*send_offchannel)(struct rpmsg_endpoint *ept, u32 src, u32 dst,
                 void *data, int len);
 
   int (*trysend)(struct rpmsg_endpoint *ept, void *data, int len);
   int (*trysendto)(struct rpmsg_endpoint *ept, void *data, int len, u32 dst);
   int (*trysend_offchannel)(struct rpmsg_endpoint *ept, u32 src, u32 dst,
                void *data, int len);
   __poll_t (*poll)(struct rpmsg_endpoint *ept, struct file *filp,
                poll_table *wait);
   int (*get_signals)(struct rpmsg_endpoint *ept);
   int (*set_signals)(struct rpmsg_endpoint *ept, u32 set, u32 clear);
};
 
int rpmsg_register_device(struct rpmsg_device *rpdev);
int rpmsg_unregister_device(struct device *parent,
               struct rpmsg_channel_info *chinfo);
 
struct device *rpmsg_find_device(struct device *parent,
                struct rpmsg_channel_info *chinfo);
 
/**
 * rpmsg_chrdev_register_device() - register chrdev device based on rpdev
 * @rpdev:    prepared rpdev to be used for creating endpoints
 *
 * This function wraps rpmsg_register_device() preparing the rpdev for use as
 * basis for the rpmsg chrdev.
 */
static inline int rpmsg_chrdev_register_device(struct rpmsg_device *rpdev)
{
   strcpy(rpdev->id.name, "rpmsg_chrdev");
   rpdev->driver_override = "rpmsg_chrdev";
 
   return rpmsg_register_device(rpdev);
}
 
#endif