Skip to content

Commit 123fdb6

Browse files
CV-Bowenluckyyaojin
authored andcommitted
rpmsg/rpmsg_virtio: support set trace callback to trace buffer status
Signed-off-by: Bowen Wang <wangbowen6@xiaomi.com>
1 parent 4ace354 commit 123fdb6

4 files changed

Lines changed: 72 additions & 2 deletions

File tree

cmake/options.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,5 +139,10 @@ if (DEFINED RPMSG_BUFFER_SIZE)
139139
endif (DEFINED RPMSG_BUFFER_SIZE)
140140

141141
option (WITH_DOC "Build with documentation" OFF)
142+
option (WITH_RPMSG_TRACE "Enable Rpmsg Device Trace" OFF)
143+
144+
if (WITH_RPMSG_TRACE)
145+
add_definitions(-DRPMSG_TRACE)
146+
endif (WITH_RPMSG_TRACE)
142147

143148
message ("-- C_FLAGS : ${CMAKE_C_FLAGS}")

lib/include/openamp/rpmsg.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,19 @@ struct rpmsg_device_ops {
129129
int (*get_tx_buffer_size)(struct rpmsg_device *rdev);
130130
};
131131

132+
/**
133+
* struct rpmsg_device_trace - trace operation for debugging
134+
*
135+
* This structure is used by the rpmsg device to trace the various events.
136+
*
137+
* @get_tx_buffer: trace callback, called when get a tx buffer
138+
* @release_tx_buffer: trace callback, called when release a tx buffer
139+
*/
140+
struct rpmsg_device_trace {
141+
void (*get_tx_buffer)(struct rpmsg_device *rvdev, void *hdr);
142+
void (*release_tx_buffer)(struct rpmsg_device *rvdev, void *hdr);
143+
};
144+
132145
/** @brief Representation of a RPMsg device */
133146
struct rpmsg_device {
134147
/** List of endpoints */
@@ -153,6 +166,8 @@ struct rpmsg_device {
153166
/** RPMsg device operations */
154167
struct rpmsg_device_ops ops;
155168

169+
struct rpmsg_device_trace trace;
170+
156171
/** Create/destroy namespace message */
157172
bool support_ns;
158173
};

lib/rpmsg/rpmsg_internal.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,47 @@ void rpmsg_ept_incref(struct rpmsg_endpoint *ept);
133133
*/
134134
void rpmsg_ept_decref(struct rpmsg_endpoint *ept);
135135

136+
#ifdef RPMSG_TRACE
137+
/**
138+
* @internal
139+
*
140+
* @brief Trace the get tx buffer process
141+
*
142+
* This function is used to trace the get tx buffer process
143+
*
144+
* @param rdev pointer to rpmsg endpoint
145+
* @param hdr pointer to rpmsg header
146+
*
147+
*/
148+
static inline void
149+
rpmsg_device_trace_get_tx_buffer(struct rpmsg_device *rdev, void *hdr)
150+
{
151+
if (rdev->trace.get_tx_buffer && hdr)
152+
rdev->trace.get_tx_buffer(rdev, hdr);
153+
}
154+
155+
/**
156+
* @internal
157+
*
158+
* @brief Trace the release tx buffer process
159+
*
160+
* This function is used to trace the release tx buffer process
161+
*
162+
* @param rdev pointer to rpmsg endpoint
163+
* @param hdr pointer to rpmsg header
164+
*
165+
*/
166+
static inline void
167+
rpmsg_device_trace_release_tx_buffer(struct rpmsg_device *rdev, void *hdr)
168+
{
169+
if (rdev->trace.release_tx_buffer && hdr)
170+
rdev->trace.release_tx_buffer(rdev, hdr);
171+
}
172+
#else
173+
#define rpmsg_device_trace_get_tx_buffer(rdev, hdr)
174+
#define rpmsg_device_trace_release_tx_buffer(rdev, hdr)
175+
#endif
176+
136177
#if defined __cplusplus
137178
}
138179
#endif

lib/rpmsg/rpmsg_virtio.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ static int rpmsg_virtio_enqueue_buffer(struct rpmsg_virtio_device *rvdev,
148148
void *buffer, uint32_t len,
149149
uint16_t idx)
150150
{
151+
int ret;
151152
BUFFER_FLUSH(buffer, len);
152153

153154
if (VIRTIO_ROLE_IS_DRIVER(rvdev->vdev)) {
@@ -157,12 +158,17 @@ static int rpmsg_virtio_enqueue_buffer(struct rpmsg_virtio_device *rvdev,
157158
/* Initialize buffer node */
158159
vqbuf.buf = buffer;
159160
vqbuf.len = len;
160-
return virtqueue_add_buffer(rvdev->svq, &vqbuf, 1, 0, buffer);
161+
162+
ret = virtqueue_add_buffer(rvdev->svq, &vqbuf, 1, 0, buffer);
163+
rpmsg_device_trace_release_tx_buffer(&rvdev->rdev, buffer);
164+
return ret;
161165
}
162166

163167
if (VIRTIO_ROLE_IS_DEVICE(rvdev->vdev)) {
164168
(void)buffer;
165-
return virtqueue_add_consumed_buffer(rvdev->svq, idx, len);
169+
ret = virtqueue_add_consumed_buffer(rvdev->svq, idx, len);
170+
rpmsg_device_trace_release_tx_buffer(&rvdev->rdev, buffer);
171+
return ret;
166172
}
167173

168174
return 0;
@@ -210,6 +216,8 @@ static void *rpmsg_virtio_get_tx_buffer(struct rpmsg_virtio_device *rvdev,
210216
data = virtqueue_get_available_buffer(rvdev->svq, idx, len);
211217
}
212218

219+
rpmsg_device_trace_get_tx_buffer(&rvdev->rdev, data);
220+
213221
return data;
214222
}
215223

@@ -482,6 +490,7 @@ static int rpmsg_virtio_release_tx_buffer(struct rpmsg_device *rdev, void *txbuf
482490
*/
483491
r_desc->idx = RPMSG_BUF_INDEX(rp_hdr);
484492
metal_list_add_tail(&rvdev->reclaimer, &r_desc->node);
493+
rpmsg_device_trace_release_tx_buffer(&rvdev->rdev, rp_hdr);
485494
}
486495

487496
metal_mutex_release(&rdev->lock);

0 commit comments

Comments
 (0)