Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'rpmsg-v4.9' of git://github.com/andersson/remoteproc

Pull rpmsg updates from Bjorn Andersson:
"The bulk of these patches involve splitting the rpmsg implementation
into a framework/API part and a virtio specific backend part. It then
adds the Qualcomm Shared Memory Device (SMD) as an additional
supported wire format.

Also included is a set of code style cleanups that have been lingering
for a while"

* tag 'rpmsg-v4.9' of git://github.com/andersson/remoteproc: (26 commits)
rpmsg: smd: fix dependency on QCOM_SMD=n
rpmsg: Introduce Qualcomm SMD backend
rpmsg: Allow callback to return errors
rpmsg: Move virtio specifics from public header
rpmsg: virtio: Hide vrp pointer from the public API
rpmsg: Hide rpmsg indirection tables
rpmsg: Split rpmsg core and virtio backend
rpmsg: Split off generic tail of create_channel()
rpmsg: Move helper for finding rpmsg devices to core
rpmsg: Move endpoint related interface to rpmsg core
rpmsg: Indirection table for rpmsg_endpoint operations
rpmsg: Move rpmsg_device API to new file
rpmsg: Introduce indirection table for rpmsg_device operations
rpmsg: Clean up rpmsg device vs channel naming
rpmsg: Make rpmsg_create_ept() take channel_info struct
rpmsg: rpmsg_send() operations takes rpmsg_endpoint
rpmsg: Name rpmsg devices based on channel id
rpmsg: Enable matching devices with drivers based on DT
rpmsg: Drop prototypes for non-existing functions
samples/rpmsg: add support for multiple instances
...

+2312 -553
+2 -2
drivers/remoteproc/Kconfig
··· 17 17 select REMOTEPROC 18 18 select MAILBOX 19 19 select OMAP2PLUS_MBOX 20 - select RPMSG 20 + select RPMSG_VIRTIO 21 21 help 22 22 Say y here to support OMAP's remote processors (dual M3 23 23 and DSP on OMAP4) via the remote processor framework. ··· 59 59 depends on ARCH_DAVINCI_DA8XX 60 60 select CMA if MMU 61 61 select REMOTEPROC 62 - select RPMSG 62 + select RPMSG_VIRTIO 63 63 help 64 64 Say y here to support DA8xx/OMAP-L13x remote processors via the 65 65 remote processor framework.
+14
drivers/rpmsg/Kconfig
··· 3 3 # RPMSG always gets selected by whoever wants it 4 4 config RPMSG 5 5 tristate 6 + 7 + config RPMSG_QCOM_SMD 8 + tristate "Qualcomm Shared Memory Driver (SMD)" 9 + depends on QCOM_SMEM 10 + depends on QCOM_SMD=n 11 + select RPMSG 12 + help 13 + Say y here to enable support for the Qualcomm Shared Memory Driver 14 + providing communication channels to remote processors in Qualcomm 15 + platforms. 16 + 17 + config RPMSG_VIRTIO 18 + tristate 19 + select RPMSG 6 20 select VIRTIO 7 21 select VIRTUALIZATION 8 22
+3 -1
drivers/rpmsg/Makefile
··· 1 - obj-$(CONFIG_RPMSG) += virtio_rpmsg_bus.o 1 + obj-$(CONFIG_RPMSG) += rpmsg_core.o 2 + obj-$(CONFIG_RPMSG_QCOM_SMD) += qcom_smd.o 3 + obj-$(CONFIG_RPMSG_VIRTIO) += virtio_rpmsg_bus.o
+1434
drivers/rpmsg/qcom_smd.c
··· 1 + /* 2 + * Copyright (c) 2015, Sony Mobile Communications AB. 3 + * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. 4 + * 5 + * This program is free software; you can redistribute it and/or modify 6 + * it under the terms of the GNU General Public License version 2 and 7 + * only version 2 as published by the Free Software Foundation. 8 + * 9 + * This program is distributed in the hope that it will be useful, 10 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 + * GNU General Public License for more details. 13 + */ 14 + 15 + #include <linux/interrupt.h> 16 + #include <linux/io.h> 17 + #include <linux/mfd/syscon.h> 18 + #include <linux/module.h> 19 + #include <linux/of_irq.h> 20 + #include <linux/of_platform.h> 21 + #include <linux/platform_device.h> 22 + #include <linux/regmap.h> 23 + #include <linux/sched.h> 24 + #include <linux/slab.h> 25 + #include <linux/soc/qcom/smem.h> 26 + #include <linux/wait.h> 27 + #include <linux/rpmsg.h> 28 + 29 + #include "rpmsg_internal.h" 30 + 31 + /* 32 + * The Qualcomm Shared Memory communication solution provides point-to-point 33 + * channels for clients to send and receive streaming or packet based data. 34 + * 35 + * Each channel consists of a control item (channel info) and a ring buffer 36 + * pair. The channel info carry information related to channel state, flow 37 + * control and the offsets within the ring buffer. 38 + * 39 + * All allocated channels are listed in an allocation table, identifying the 40 + * pair of items by name, type and remote processor. 41 + * 42 + * Upon creating a new channel the remote processor allocates channel info and 43 + * ring buffer items from the smem heap and populate the allocation table. An 44 + * interrupt is sent to the other end of the channel and a scan for new 45 + * channels should be done. A channel never goes away, it will only change 46 + * state. 47 + * 48 + * The remote processor signals it intent for bring up the communication 49 + * channel by setting the state of its end of the channel to "opening" and 50 + * sends out an interrupt. We detect this change and register a smd device to 51 + * consume the channel. Upon finding a consumer we finish the handshake and the 52 + * channel is up. 53 + * 54 + * Upon closing a channel, the remote processor will update the state of its 55 + * end of the channel and signal us, we will then unregister any attached 56 + * device and close our end of the channel. 57 + * 58 + * Devices attached to a channel can use the qcom_smd_send function to push 59 + * data to the channel, this is done by copying the data into the tx ring 60 + * buffer, updating the pointers in the channel info and signaling the remote 61 + * processor. 62 + * 63 + * The remote processor does the equivalent when it transfer data and upon 64 + * receiving the interrupt we check the channel info for new data and delivers 65 + * this to the attached device. If the device is not ready to receive the data 66 + * we leave it in the ring buffer for now. 67 + */ 68 + 69 + struct smd_channel_info; 70 + struct smd_channel_info_pair; 71 + struct smd_channel_info_word; 72 + struct smd_channel_info_word_pair; 73 + 74 + static const struct rpmsg_endpoint_ops qcom_smd_endpoint_ops; 75 + 76 + #define SMD_ALLOC_TBL_COUNT 2 77 + #define SMD_ALLOC_TBL_SIZE 64 78 + 79 + /* 80 + * This lists the various smem heap items relevant for the allocation table and 81 + * smd channel entries. 82 + */ 83 + static const struct { 84 + unsigned alloc_tbl_id; 85 + unsigned info_base_id; 86 + unsigned fifo_base_id; 87 + } smem_items[SMD_ALLOC_TBL_COUNT] = { 88 + { 89 + .alloc_tbl_id = 13, 90 + .info_base_id = 14, 91 + .fifo_base_id = 338 92 + }, 93 + { 94 + .alloc_tbl_id = 266, 95 + .info_base_id = 138, 96 + .fifo_base_id = 202, 97 + }, 98 + }; 99 + 100 + /** 101 + * struct qcom_smd_edge - representing a remote processor 102 + * @of_node: of_node handle for information related to this edge 103 + * @edge_id: identifier of this edge 104 + * @remote_pid: identifier of remote processor 105 + * @irq: interrupt for signals on this edge 106 + * @ipc_regmap: regmap handle holding the outgoing ipc register 107 + * @ipc_offset: offset within @ipc_regmap of the register for ipc 108 + * @ipc_bit: bit in the register at @ipc_offset of @ipc_regmap 109 + * @channels: list of all channels detected on this edge 110 + * @channels_lock: guard for modifications of @channels 111 + * @allocated: array of bitmaps representing already allocated channels 112 + * @smem_available: last available amount of smem triggering a channel scan 113 + * @scan_work: work item for discovering new channels 114 + * @state_work: work item for edge state changes 115 + */ 116 + struct qcom_smd_edge { 117 + struct device dev; 118 + 119 + struct device_node *of_node; 120 + unsigned edge_id; 121 + unsigned remote_pid; 122 + 123 + int irq; 124 + 125 + struct regmap *ipc_regmap; 126 + int ipc_offset; 127 + int ipc_bit; 128 + 129 + struct list_head channels; 130 + spinlock_t channels_lock; 131 + 132 + DECLARE_BITMAP(allocated[SMD_ALLOC_TBL_COUNT], SMD_ALLOC_TBL_SIZE); 133 + 134 + unsigned smem_available; 135 + 136 + wait_queue_head_t new_channel_event; 137 + 138 + struct work_struct scan_work; 139 + struct work_struct state_work; 140 + }; 141 + 142 + /* 143 + * SMD channel states. 144 + */ 145 + enum smd_channel_state { 146 + SMD_CHANNEL_CLOSED, 147 + SMD_CHANNEL_OPENING, 148 + SMD_CHANNEL_OPENED, 149 + SMD_CHANNEL_FLUSHING, 150 + SMD_CHANNEL_CLOSING, 151 + SMD_CHANNEL_RESET, 152 + SMD_CHANNEL_RESET_OPENING 153 + }; 154 + 155 + struct qcom_smd_device { 156 + struct rpmsg_device rpdev; 157 + 158 + struct qcom_smd_edge *edge; 159 + }; 160 + 161 + struct qcom_smd_endpoint { 162 + struct rpmsg_endpoint ept; 163 + 164 + struct qcom_smd_channel *qsch; 165 + }; 166 + 167 + #define to_smd_device(_rpdev) container_of(_rpdev, struct qcom_smd_device, rpdev) 168 + #define to_smd_edge(d) container_of(d, struct qcom_smd_edge, dev) 169 + #define to_smd_endpoint(ept) container_of(ept, struct qcom_smd_endpoint, ept) 170 + 171 + /** 172 + * struct qcom_smd_channel - smd channel struct 173 + * @edge: qcom_smd_edge this channel is living on 174 + * @qsdev: reference to a associated smd client device 175 + * @name: name of the channel 176 + * @state: local state of the channel 177 + * @remote_state: remote state of the channel 178 + * @info: byte aligned outgoing/incoming channel info 179 + * @info_word: word aligned outgoing/incoming channel info 180 + * @tx_lock: lock to make writes to the channel mutually exclusive 181 + * @fblockread_event: wakeup event tied to tx fBLOCKREADINTR 182 + * @tx_fifo: pointer to the outgoing ring buffer 183 + * @rx_fifo: pointer to the incoming ring buffer 184 + * @fifo_size: size of each ring buffer 185 + * @bounce_buffer: bounce buffer for reading wrapped packets 186 + * @cb: callback function registered for this channel 187 + * @recv_lock: guard for rx info modifications and cb pointer 188 + * @pkt_size: size of the currently handled packet 189 + * @list: lite entry for @channels in qcom_smd_edge 190 + */ 191 + struct qcom_smd_channel { 192 + struct qcom_smd_edge *edge; 193 + 194 + struct qcom_smd_endpoint *qsept; 195 + bool registered; 196 + 197 + char *name; 198 + enum smd_channel_state state; 199 + enum smd_channel_state remote_state; 200 + 201 + struct smd_channel_info_pair *info; 202 + struct smd_channel_info_word_pair *info_word; 203 + 204 + struct mutex tx_lock; 205 + wait_queue_head_t fblockread_event; 206 + 207 + void *tx_fifo; 208 + void *rx_fifo; 209 + int fifo_size; 210 + 211 + void *bounce_buffer; 212 + 213 + spinlock_t recv_lock; 214 + 215 + int pkt_size; 216 + 217 + void *drvdata; 218 + 219 + struct list_head list; 220 + }; 221 + 222 + /* 223 + * Format of the smd_info smem items, for byte aligned channels. 224 + */ 225 + struct smd_channel_info { 226 + __le32 state; 227 + u8 fDSR; 228 + u8 fCTS; 229 + u8 fCD; 230 + u8 fRI; 231 + u8 fHEAD; 232 + u8 fTAIL; 233 + u8 fSTATE; 234 + u8 fBLOCKREADINTR; 235 + __le32 tail; 236 + __le32 head; 237 + }; 238 + 239 + struct smd_channel_info_pair { 240 + struct smd_channel_info tx; 241 + struct smd_channel_info rx; 242 + }; 243 + 244 + /* 245 + * Format of the smd_info smem items, for word aligned channels. 246 + */ 247 + struct smd_channel_info_word { 248 + __le32 state; 249 + __le32 fDSR; 250 + __le32 fCTS; 251 + __le32 fCD; 252 + __le32 fRI; 253 + __le32 fHEAD; 254 + __le32 fTAIL; 255 + __le32 fSTATE; 256 + __le32 fBLOCKREADINTR; 257 + __le32 tail; 258 + __le32 head; 259 + }; 260 + 261 + struct smd_channel_info_word_pair { 262 + struct smd_channel_info_word tx; 263 + struct smd_channel_info_word rx; 264 + }; 265 + 266 + #define GET_RX_CHANNEL_FLAG(channel, param) \ 267 + ({ \ 268 + BUILD_BUG_ON(sizeof(channel->info->rx.param) != sizeof(u8)); \ 269 + channel->info_word ? \ 270 + le32_to_cpu(channel->info_word->rx.param) : \ 271 + channel->info->rx.param; \ 272 + }) 273 + 274 + #define GET_RX_CHANNEL_INFO(channel, param) \ 275 + ({ \ 276 + BUILD_BUG_ON(sizeof(channel->info->rx.param) != sizeof(u32)); \ 277 + le32_to_cpu(channel->info_word ? \ 278 + channel->info_word->rx.param : \ 279 + channel->info->rx.param); \ 280 + }) 281 + 282 + #define SET_RX_CHANNEL_FLAG(channel, param, value) \ 283 + ({ \ 284 + BUILD_BUG_ON(sizeof(channel->info->rx.param) != sizeof(u8)); \ 285 + if (channel->info_word) \ 286 + channel->info_word->rx.param = cpu_to_le32(value); \ 287 + else \ 288 + channel->info->rx.param = value; \ 289 + }) 290 + 291 + #define SET_RX_CHANNEL_INFO(channel, param, value) \ 292 + ({ \ 293 + BUILD_BUG_ON(sizeof(channel->info->rx.param) != sizeof(u32)); \ 294 + if (channel->info_word) \ 295 + channel->info_word->rx.param = cpu_to_le32(value); \ 296 + else \ 297 + channel->info->rx.param = cpu_to_le32(value); \ 298 + }) 299 + 300 + #define GET_TX_CHANNEL_FLAG(channel, param) \ 301 + ({ \ 302 + BUILD_BUG_ON(sizeof(channel->info->tx.param) != sizeof(u8)); \ 303 + channel->info_word ? \ 304 + le32_to_cpu(channel->info_word->tx.param) : \ 305 + channel->info->tx.param; \ 306 + }) 307 + 308 + #define GET_TX_CHANNEL_INFO(channel, param) \ 309 + ({ \ 310 + BUILD_BUG_ON(sizeof(channel->info->tx.param) != sizeof(u32)); \ 311 + le32_to_cpu(channel->info_word ? \ 312 + channel->info_word->tx.param : \ 313 + channel->info->tx.param); \ 314 + }) 315 + 316 + #define SET_TX_CHANNEL_FLAG(channel, param, value) \ 317 + ({ \ 318 + BUILD_BUG_ON(sizeof(channel->info->tx.param) != sizeof(u8)); \ 319 + if (channel->info_word) \ 320 + channel->info_word->tx.param = cpu_to_le32(value); \ 321 + else \ 322 + channel->info->tx.param = value; \ 323 + }) 324 + 325 + #define SET_TX_CHANNEL_INFO(channel, param, value) \ 326 + ({ \ 327 + BUILD_BUG_ON(sizeof(channel->info->tx.param) != sizeof(u32)); \ 328 + if (channel->info_word) \ 329 + channel->info_word->tx.param = cpu_to_le32(value); \ 330 + else \ 331 + channel->info->tx.param = cpu_to_le32(value); \ 332 + }) 333 + 334 + /** 335 + * struct qcom_smd_alloc_entry - channel allocation entry 336 + * @name: channel name 337 + * @cid: channel index 338 + * @flags: channel flags and edge id 339 + * @ref_count: reference count of the channel 340 + */ 341 + struct qcom_smd_alloc_entry { 342 + u8 name[20]; 343 + __le32 cid; 344 + __le32 flags; 345 + __le32 ref_count; 346 + } __packed; 347 + 348 + #define SMD_CHANNEL_FLAGS_EDGE_MASK 0xff 349 + #define SMD_CHANNEL_FLAGS_STREAM BIT(8) 350 + #define SMD_CHANNEL_FLAGS_PACKET BIT(9) 351 + 352 + /* 353 + * Each smd packet contains a 20 byte header, with the first 4 being the length 354 + * of the packet. 355 + */ 356 + #define SMD_PACKET_HEADER_LEN 20 357 + 358 + /* 359 + * Signal the remote processor associated with 'channel'. 360 + */ 361 + static void qcom_smd_signal_channel(struct qcom_smd_channel *channel) 362 + { 363 + struct qcom_smd_edge *edge = channel->edge; 364 + 365 + regmap_write(edge->ipc_regmap, edge->ipc_offset, BIT(edge->ipc_bit)); 366 + } 367 + 368 + /* 369 + * Initialize the tx channel info 370 + */ 371 + static void qcom_smd_channel_reset(struct qcom_smd_channel *channel) 372 + { 373 + SET_TX_CHANNEL_INFO(channel, state, SMD_CHANNEL_CLOSED); 374 + SET_TX_CHANNEL_FLAG(channel, fDSR, 0); 375 + SET_TX_CHANNEL_FLAG(channel, fCTS, 0); 376 + SET_TX_CHANNEL_FLAG(channel, fCD, 0); 377 + SET_TX_CHANNEL_FLAG(channel, fRI, 0); 378 + SET_TX_CHANNEL_FLAG(channel, fHEAD, 0); 379 + SET_TX_CHANNEL_FLAG(channel, fTAIL, 0); 380 + SET_TX_CHANNEL_FLAG(channel, fSTATE, 1); 381 + SET_TX_CHANNEL_FLAG(channel, fBLOCKREADINTR, 1); 382 + SET_TX_CHANNEL_INFO(channel, head, 0); 383 + SET_RX_CHANNEL_INFO(channel, tail, 0); 384 + 385 + qcom_smd_signal_channel(channel); 386 + 387 + channel->state = SMD_CHANNEL_CLOSED; 388 + channel->pkt_size = 0; 389 + } 390 + 391 + /* 392 + * Set the callback for a channel, with appropriate locking 393 + */ 394 + static void qcom_smd_channel_set_callback(struct qcom_smd_channel *channel, 395 + rpmsg_rx_cb_t cb) 396 + { 397 + struct rpmsg_endpoint *ept = &channel->qsept->ept; 398 + unsigned long flags; 399 + 400 + spin_lock_irqsave(&channel->recv_lock, flags); 401 + ept->cb = cb; 402 + spin_unlock_irqrestore(&channel->recv_lock, flags); 403 + }; 404 + 405 + /* 406 + * Calculate the amount of data available in the rx fifo 407 + */ 408 + static size_t qcom_smd_channel_get_rx_avail(struct qcom_smd_channel *channel) 409 + { 410 + unsigned head; 411 + unsigned tail; 412 + 413 + head = GET_RX_CHANNEL_INFO(channel, head); 414 + tail = GET_RX_CHANNEL_INFO(channel, tail); 415 + 416 + return (head - tail) & (channel->fifo_size - 1); 417 + } 418 + 419 + /* 420 + * Set tx channel state and inform the remote processor 421 + */ 422 + static void qcom_smd_channel_set_state(struct qcom_smd_channel *channel, 423 + int state) 424 + { 425 + struct qcom_smd_edge *edge = channel->edge; 426 + bool is_open = state == SMD_CHANNEL_OPENED; 427 + 428 + if (channel->state == state) 429 + return; 430 + 431 + dev_dbg(&edge->dev, "set_state(%s, %d)\n", channel->name, state); 432 + 433 + SET_TX_CHANNEL_FLAG(channel, fDSR, is_open); 434 + SET_TX_CHANNEL_FLAG(channel, fCTS, is_open); 435 + SET_TX_CHANNEL_FLAG(channel, fCD, is_open); 436 + 437 + SET_TX_CHANNEL_INFO(channel, state, state); 438 + SET_TX_CHANNEL_FLAG(channel, fSTATE, 1); 439 + 440 + channel->state = state; 441 + qcom_smd_signal_channel(channel); 442 + } 443 + 444 + /* 445 + * Copy count bytes of data using 32bit accesses, if that's required. 446 + */ 447 + static void smd_copy_to_fifo(void __iomem *dst, 448 + const void *src, 449 + size_t count, 450 + bool word_aligned) 451 + { 452 + if (word_aligned) { 453 + __iowrite32_copy(dst, src, count / sizeof(u32)); 454 + } else { 455 + memcpy_toio(dst, src, count); 456 + } 457 + } 458 + 459 + /* 460 + * Copy count bytes of data using 32bit accesses, if that is required. 461 + */ 462 + static void smd_copy_from_fifo(void *dst, 463 + const void __iomem *src, 464 + size_t count, 465 + bool word_aligned) 466 + { 467 + if (word_aligned) { 468 + __ioread32_copy(dst, src, count / sizeof(u32)); 469 + } else { 470 + memcpy_fromio(dst, src, count); 471 + } 472 + } 473 + 474 + /* 475 + * Read count bytes of data from the rx fifo into buf, but don't advance the 476 + * tail. 477 + */ 478 + static size_t qcom_smd_channel_peek(struct qcom_smd_channel *channel, 479 + void *buf, size_t count) 480 + { 481 + bool word_aligned; 482 + unsigned tail; 483 + size_t len; 484 + 485 + word_aligned = channel->info_word; 486 + tail = GET_RX_CHANNEL_INFO(channel, tail); 487 + 488 + len = min_t(size_t, count, channel->fifo_size - tail); 489 + if (len) { 490 + smd_copy_from_fifo(buf, 491 + channel->rx_fifo + tail, 492 + len, 493 + word_aligned); 494 + } 495 + 496 + if (len != count) { 497 + smd_copy_from_fifo(buf + len, 498 + channel->rx_fifo, 499 + count - len, 500 + word_aligned); 501 + } 502 + 503 + return count; 504 + } 505 + 506 + /* 507 + * Advance the rx tail by count bytes. 508 + */ 509 + static void qcom_smd_channel_advance(struct qcom_smd_channel *channel, 510 + size_t count) 511 + { 512 + unsigned tail; 513 + 514 + tail = GET_RX_CHANNEL_INFO(channel, tail); 515 + tail += count; 516 + tail &= (channel->fifo_size - 1); 517 + SET_RX_CHANNEL_INFO(channel, tail, tail); 518 + } 519 + 520 + /* 521 + * Read out a single packet from the rx fifo and deliver it to the device 522 + */ 523 + static int qcom_smd_channel_recv_single(struct qcom_smd_channel *channel) 524 + { 525 + struct rpmsg_endpoint *ept = &channel->qsept->ept; 526 + unsigned tail; 527 + size_t len; 528 + void *ptr; 529 + int ret; 530 + 531 + tail = GET_RX_CHANNEL_INFO(channel, tail); 532 + 533 + /* Use bounce buffer if the data wraps */ 534 + if (tail + channel->pkt_size >= channel->fifo_size) { 535 + ptr = channel->bounce_buffer; 536 + len = qcom_smd_channel_peek(channel, ptr, channel->pkt_size); 537 + } else { 538 + ptr = channel->rx_fifo + tail; 539 + len = channel->pkt_size; 540 + } 541 + 542 + ret = ept->cb(ept->rpdev, ptr, len, ept->priv, RPMSG_ADDR_ANY); 543 + if (ret < 0) 544 + return ret; 545 + 546 + /* Only forward the tail if the client consumed the data */ 547 + qcom_smd_channel_advance(channel, len); 548 + 549 + channel->pkt_size = 0; 550 + 551 + return 0; 552 + } 553 + 554 + /* 555 + * Per channel interrupt handling 556 + */ 557 + static bool qcom_smd_channel_intr(struct qcom_smd_channel *channel) 558 + { 559 + bool need_state_scan = false; 560 + int remote_state; 561 + __le32 pktlen; 562 + int avail; 563 + int ret; 564 + 565 + /* Handle state changes */ 566 + remote_state = GET_RX_CHANNEL_INFO(channel, state); 567 + if (remote_state != channel->remote_state) { 568 + channel->remote_state = remote_state; 569 + need_state_scan = true; 570 + } 571 + /* Indicate that we have seen any state change */ 572 + SET_RX_CHANNEL_FLAG(channel, fSTATE, 0); 573 + 574 + /* Signal waiting qcom_smd_send() about the interrupt */ 575 + if (!GET_TX_CHANNEL_FLAG(channel, fBLOCKREADINTR)) 576 + wake_up_interruptible(&channel->fblockread_event); 577 + 578 + /* Don't consume any data until we've opened the channel */ 579 + if (channel->state != SMD_CHANNEL_OPENED) 580 + goto out; 581 + 582 + /* Indicate that we've seen the new data */ 583 + SET_RX_CHANNEL_FLAG(channel, fHEAD, 0); 584 + 585 + /* Consume data */ 586 + for (;;) { 587 + avail = qcom_smd_channel_get_rx_avail(channel); 588 + 589 + if (!channel->pkt_size && avail >= SMD_PACKET_HEADER_LEN) { 590 + qcom_smd_channel_peek(channel, &pktlen, sizeof(pktlen)); 591 + qcom_smd_channel_advance(channel, SMD_PACKET_HEADER_LEN); 592 + channel->pkt_size = le32_to_cpu(pktlen); 593 + } else if (channel->pkt_size && avail >= channel->pkt_size) { 594 + ret = qcom_smd_channel_recv_single(channel); 595 + if (ret) 596 + break; 597 + } else { 598 + break; 599 + } 600 + } 601 + 602 + /* Indicate that we have seen and updated tail */ 603 + SET_RX_CHANNEL_FLAG(channel, fTAIL, 1); 604 + 605 + /* Signal the remote that we've consumed the data (if requested) */ 606 + if (!GET_RX_CHANNEL_FLAG(channel, fBLOCKREADINTR)) { 607 + /* Ensure ordering of channel info updates */ 608 + wmb(); 609 + 610 + qcom_smd_signal_channel(channel); 611 + } 612 + 613 + out: 614 + return need_state_scan; 615 + } 616 + 617 + /* 618 + * The edge interrupts are triggered by the remote processor on state changes, 619 + * channel info updates or when new channels are created. 620 + */ 621 + static irqreturn_t qcom_smd_edge_intr(int irq, void *data) 622 + { 623 + struct qcom_smd_edge *edge = data; 624 + struct qcom_smd_channel *channel; 625 + unsigned available; 626 + bool kick_scanner = false; 627 + bool kick_state = false; 628 + 629 + /* 630 + * Handle state changes or data on each of the channels on this edge 631 + */ 632 + spin_lock(&edge->channels_lock); 633 + list_for_each_entry(channel, &edge->channels, list) { 634 + spin_lock(&channel->recv_lock); 635 + kick_state |= qcom_smd_channel_intr(channel); 636 + spin_unlock(&channel->recv_lock); 637 + } 638 + spin_unlock(&edge->channels_lock); 639 + 640 + /* 641 + * Creating a new channel requires allocating an smem entry, so we only 642 + * have to scan if the amount of available space in smem have changed 643 + * since last scan. 644 + */ 645 + available = qcom_smem_get_free_space(edge->remote_pid); 646 + if (available != edge->smem_available) { 647 + edge->smem_available = available; 648 + kick_scanner = true; 649 + } 650 + 651 + if (kick_scanner) 652 + schedule_work(&edge->scan_work); 653 + if (kick_state) 654 + schedule_work(&edge->state_work); 655 + 656 + return IRQ_HANDLED; 657 + } 658 + 659 + /* 660 + * Calculate how much space is available in the tx fifo. 661 + */ 662 + static size_t qcom_smd_get_tx_avail(struct qcom_smd_channel *channel) 663 + { 664 + unsigned head; 665 + unsigned tail; 666 + unsigned mask = channel->fifo_size - 1; 667 + 668 + head = GET_TX_CHANNEL_INFO(channel, head); 669 + tail = GET_TX_CHANNEL_INFO(channel, tail); 670 + 671 + return mask - ((head - tail) & mask); 672 + } 673 + 674 + /* 675 + * Write count bytes of data into channel, possibly wrapping in the ring buffer 676 + */ 677 + static int qcom_smd_write_fifo(struct qcom_smd_channel *channel, 678 + const void *data, 679 + size_t count) 680 + { 681 + bool word_aligned; 682 + unsigned head; 683 + size_t len; 684 + 685 + word_aligned = channel->info_word; 686 + head = GET_TX_CHANNEL_INFO(channel, head); 687 + 688 + len = min_t(size_t, count, channel->fifo_size - head); 689 + if (len) { 690 + smd_copy_to_fifo(channel->tx_fifo + head, 691 + data, 692 + len, 693 + word_aligned); 694 + } 695 + 696 + if (len != count) { 697 + smd_copy_to_fifo(channel->tx_fifo, 698 + data + len, 699 + count - len, 700 + word_aligned); 701 + } 702 + 703 + head += count; 704 + head &= (channel->fifo_size - 1); 705 + SET_TX_CHANNEL_INFO(channel, head, head); 706 + 707 + return count; 708 + } 709 + 710 + /** 711 + * qcom_smd_send - write data to smd channel 712 + * @channel: channel handle 713 + * @data: buffer of data to write 714 + * @len: number of bytes to write 715 + * 716 + * This is a blocking write of len bytes into the channel's tx ring buffer and 717 + * signal the remote end. It will sleep until there is enough space available 718 + * in the tx buffer, utilizing the fBLOCKREADINTR signaling mechanism to avoid 719 + * polling. 720 + */ 721 + static int __qcom_smd_send(struct qcom_smd_channel *channel, const void *data, 722 + int len, bool wait) 723 + { 724 + __le32 hdr[5] = { cpu_to_le32(len), }; 725 + int tlen = sizeof(hdr) + len; 726 + int ret; 727 + 728 + /* Word aligned channels only accept word size aligned data */ 729 + if (channel->info_word && len % 4) 730 + return -EINVAL; 731 + 732 + /* Reject packets that are too big */ 733 + if (tlen >= channel->fifo_size) 734 + return -EINVAL; 735 + 736 + ret = mutex_lock_interruptible(&channel->tx_lock); 737 + if (ret) 738 + return ret; 739 + 740 + while (qcom_smd_get_tx_avail(channel) < tlen) { 741 + if (!wait) { 742 + ret = -ENOMEM; 743 + goto out; 744 + } 745 + 746 + if (channel->state != SMD_CHANNEL_OPENED) { 747 + ret = -EPIPE; 748 + goto out; 749 + } 750 + 751 + SET_TX_CHANNEL_FLAG(channel, fBLOCKREADINTR, 0); 752 + 753 + ret = wait_event_interruptible(channel->fblockread_event, 754 + qcom_smd_get_tx_avail(channel) >= tlen || 755 + channel->state != SMD_CHANNEL_OPENED); 756 + if (ret) 757 + goto out; 758 + 759 + SET_TX_CHANNEL_FLAG(channel, fBLOCKREADINTR, 1); 760 + } 761 + 762 + SET_TX_CHANNEL_FLAG(channel, fTAIL, 0); 763 + 764 + qcom_smd_write_fifo(channel, hdr, sizeof(hdr)); 765 + qcom_smd_write_fifo(channel, data, len); 766 + 767 + SET_TX_CHANNEL_FLAG(channel, fHEAD, 1); 768 + 769 + /* Ensure ordering of channel info updates */ 770 + wmb(); 771 + 772 + qcom_smd_signal_channel(channel); 773 + 774 + out: 775 + mutex_unlock(&channel->tx_lock); 776 + 777 + return ret; 778 + } 779 + 780 + /* 781 + * Helper for opening a channel 782 + */ 783 + static int qcom_smd_channel_open(struct qcom_smd_channel *channel, 784 + rpmsg_rx_cb_t cb) 785 + { 786 + size_t bb_size; 787 + 788 + /* 789 + * Packets are maximum 4k, but reduce if the fifo is smaller 790 + */ 791 + bb_size = min(channel->fifo_size, SZ_4K); 792 + channel->bounce_buffer = kmalloc(bb_size, GFP_KERNEL); 793 + if (!channel->bounce_buffer) 794 + return -ENOMEM; 795 + 796 + qcom_smd_channel_set_callback(channel, cb); 797 + qcom_smd_channel_set_state(channel, SMD_CHANNEL_OPENING); 798 + qcom_smd_channel_set_state(channel, SMD_CHANNEL_OPENED); 799 + 800 + return 0; 801 + } 802 + 803 + /* 804 + * Helper for closing and resetting a channel 805 + */ 806 + static void qcom_smd_channel_close(struct qcom_smd_channel *channel) 807 + { 808 + qcom_smd_channel_set_callback(channel, NULL); 809 + 810 + kfree(channel->bounce_buffer); 811 + channel->bounce_buffer = NULL; 812 + 813 + qcom_smd_channel_set_state(channel, SMD_CHANNEL_CLOSED); 814 + qcom_smd_channel_reset(channel); 815 + } 816 + 817 + static struct qcom_smd_channel * 818 + qcom_smd_find_channel(struct qcom_smd_edge *edge, const char *name) 819 + { 820 + struct qcom_smd_channel *channel; 821 + struct qcom_smd_channel *ret = NULL; 822 + unsigned long flags; 823 + unsigned state; 824 + 825 + spin_lock_irqsave(&edge->channels_lock, flags); 826 + list_for_each_entry(channel, &edge->channels, list) { 827 + if (strcmp(channel->name, name)) 828 + continue; 829 + 830 + state = GET_RX_CHANNEL_INFO(channel, state); 831 + if (state != SMD_CHANNEL_OPENING && 832 + state != SMD_CHANNEL_OPENED) 833 + continue; 834 + 835 + ret = channel; 836 + break; 837 + } 838 + spin_unlock_irqrestore(&edge->channels_lock, flags); 839 + 840 + return ret; 841 + } 842 + 843 + static void __ept_release(struct kref *kref) 844 + { 845 + struct rpmsg_endpoint *ept = container_of(kref, struct rpmsg_endpoint, 846 + refcount); 847 + kfree(to_smd_endpoint(ept)); 848 + } 849 + 850 + static struct rpmsg_endpoint *qcom_smd_create_ept(struct rpmsg_device *rpdev, 851 + rpmsg_rx_cb_t cb, void *priv, 852 + struct rpmsg_channel_info chinfo) 853 + { 854 + struct qcom_smd_endpoint *qsept; 855 + struct qcom_smd_channel *channel; 856 + struct qcom_smd_device *qsdev = to_smd_device(rpdev); 857 + struct qcom_smd_edge *edge = qsdev->edge; 858 + struct rpmsg_endpoint *ept; 859 + const char *name = chinfo.name; 860 + int ret; 861 + 862 + /* Wait up to HZ for the channel to appear */ 863 + ret = wait_event_interruptible_timeout(edge->new_channel_event, 864 + (channel = qcom_smd_find_channel(edge, name)) != NULL, 865 + HZ); 866 + if (!ret) 867 + return NULL; 868 + 869 + if (channel->state != SMD_CHANNEL_CLOSED) { 870 + dev_err(&rpdev->dev, "channel %s is busy\n", channel->name); 871 + return NULL; 872 + } 873 + 874 + qsept = kzalloc(sizeof(*qsept), GFP_KERNEL); 875 + if (!qsept) 876 + return NULL; 877 + 878 + ept = &qsept->ept; 879 + 880 + kref_init(&ept->refcount); 881 + 882 + ept->rpdev = rpdev; 883 + ept->cb = cb; 884 + ept->priv = priv; 885 + ept->ops = &qcom_smd_endpoint_ops; 886 + 887 + channel->qsept = qsept; 888 + qsept->qsch = channel; 889 + 890 + ret = qcom_smd_channel_open(channel, cb); 891 + if (ret) 892 + goto free_ept; 893 + 894 + return ept; 895 + 896 + free_ept: 897 + channel->qsept = NULL; 898 + kref_put(&ept->refcount, __ept_release); 899 + return NULL; 900 + } 901 + 902 + static void qcom_smd_destroy_ept(struct rpmsg_endpoint *ept) 903 + { 904 + struct qcom_smd_endpoint *qsept = to_smd_endpoint(ept); 905 + struct qcom_smd_channel *ch = qsept->qsch; 906 + 907 + qcom_smd_channel_close(ch); 908 + ch->qsept = NULL; 909 + kref_put(&ept->refcount, __ept_release); 910 + } 911 + 912 + static int qcom_smd_send(struct rpmsg_endpoint *ept, void *data, int len) 913 + { 914 + struct qcom_smd_endpoint *qsept = to_smd_endpoint(ept); 915 + 916 + return __qcom_smd_send(qsept->qsch, data, len, true); 917 + } 918 + 919 + static int qcom_smd_trysend(struct rpmsg_endpoint *ept, void *data, int len) 920 + { 921 + struct qcom_smd_endpoint *qsept = to_smd_endpoint(ept); 922 + 923 + return __qcom_smd_send(qsept->qsch, data, len, false); 924 + } 925 + 926 + /* 927 + * Finds the device_node for the smd child interested in this channel. 928 + */ 929 + static struct device_node *qcom_smd_match_channel(struct device_node *edge_node, 930 + const char *channel) 931 + { 932 + struct device_node *child; 933 + const char *name; 934 + const char *key; 935 + int ret; 936 + 937 + for_each_available_child_of_node(edge_node, child) { 938 + key = "qcom,smd-channels"; 939 + ret = of_property_read_string(child, key, &name); 940 + if (ret) 941 + continue; 942 + 943 + if (strcmp(name, channel) == 0) 944 + return child; 945 + } 946 + 947 + return NULL; 948 + } 949 + 950 + static const struct rpmsg_device_ops qcom_smd_device_ops = { 951 + .create_ept = qcom_smd_create_ept, 952 + }; 953 + 954 + static const struct rpmsg_endpoint_ops qcom_smd_endpoint_ops = { 955 + .destroy_ept = qcom_smd_destroy_ept, 956 + .send = qcom_smd_send, 957 + .trysend = qcom_smd_trysend, 958 + }; 959 + 960 + /* 961 + * Create a smd client device for channel that is being opened. 962 + */ 963 + static int qcom_smd_create_device(struct qcom_smd_channel *channel) 964 + { 965 + struct qcom_smd_device *qsdev; 966 + struct rpmsg_device *rpdev; 967 + struct qcom_smd_edge *edge = channel->edge; 968 + 969 + dev_dbg(&edge->dev, "registering '%s'\n", channel->name); 970 + 971 + qsdev = kzalloc(sizeof(*qsdev), GFP_KERNEL); 972 + if (!qsdev) 973 + return -ENOMEM; 974 + 975 + /* Link qsdev to our SMD edge */ 976 + qsdev->edge = edge; 977 + 978 + /* Assign callbacks for rpmsg_device */ 979 + qsdev->rpdev.ops = &qcom_smd_device_ops; 980 + 981 + /* Assign public information to the rpmsg_device */ 982 + rpdev = &qsdev->rpdev; 983 + strncpy(rpdev->id.name, channel->name, RPMSG_NAME_SIZE); 984 + rpdev->src = RPMSG_ADDR_ANY; 985 + rpdev->dst = RPMSG_ADDR_ANY; 986 + 987 + rpdev->dev.of_node = qcom_smd_match_channel(edge->of_node, channel->name); 988 + rpdev->dev.parent = &edge->dev; 989 + 990 + return rpmsg_register_device(rpdev); 991 + } 992 + 993 + /* 994 + * Allocate the qcom_smd_channel object for a newly found smd channel, 995 + * retrieving and validating the smem items involved. 996 + */ 997 + static struct qcom_smd_channel *qcom_smd_create_channel(struct qcom_smd_edge *edge, 998 + unsigned smem_info_item, 999 + unsigned smem_fifo_item, 1000 + char *name) 1001 + { 1002 + struct qcom_smd_channel *channel; 1003 + size_t fifo_size; 1004 + size_t info_size; 1005 + void *fifo_base; 1006 + void *info; 1007 + int ret; 1008 + 1009 + channel = devm_kzalloc(&edge->dev, sizeof(*channel), GFP_KERNEL); 1010 + if (!channel) 1011 + return ERR_PTR(-ENOMEM); 1012 + 1013 + channel->edge = edge; 1014 + channel->name = devm_kstrdup(&edge->dev, name, GFP_KERNEL); 1015 + if (!channel->name) 1016 + return ERR_PTR(-ENOMEM); 1017 + 1018 + mutex_init(&channel->tx_lock); 1019 + spin_lock_init(&channel->recv_lock); 1020 + init_waitqueue_head(&channel->fblockread_event); 1021 + 1022 + info = qcom_smem_get(edge->remote_pid, smem_info_item, &info_size); 1023 + if (IS_ERR(info)) { 1024 + ret = PTR_ERR(info); 1025 + goto free_name_and_channel; 1026 + } 1027 + 1028 + /* 1029 + * Use the size of the item to figure out which channel info struct to 1030 + * use. 1031 + */ 1032 + if (info_size == 2 * sizeof(struct smd_channel_info_word)) { 1033 + channel->info_word = info; 1034 + } else if (info_size == 2 * sizeof(struct smd_channel_info)) { 1035 + channel->info = info; 1036 + } else { 1037 + dev_err(&edge->dev, 1038 + "channel info of size %zu not supported\n", info_size); 1039 + ret = -EINVAL; 1040 + goto free_name_and_channel; 1041 + } 1042 + 1043 + fifo_base = qcom_smem_get(edge->remote_pid, smem_fifo_item, &fifo_size); 1044 + if (IS_ERR(fifo_base)) { 1045 + ret = PTR_ERR(fifo_base); 1046 + goto free_name_and_channel; 1047 + } 1048 + 1049 + /* The channel consist of a rx and tx fifo of equal size */ 1050 + fifo_size /= 2; 1051 + 1052 + dev_dbg(&edge->dev, "new channel '%s' info-size: %zu fifo-size: %zu\n", 1053 + name, info_size, fifo_size); 1054 + 1055 + channel->tx_fifo = fifo_base; 1056 + channel->rx_fifo = fifo_base + fifo_size; 1057 + channel->fifo_size = fifo_size; 1058 + 1059 + qcom_smd_channel_reset(channel); 1060 + 1061 + return channel; 1062 + 1063 + free_name_and_channel: 1064 + devm_kfree(&edge->dev, channel->name); 1065 + devm_kfree(&edge->dev, channel); 1066 + 1067 + return ERR_PTR(ret); 1068 + } 1069 + 1070 + /* 1071 + * Scans the allocation table for any newly allocated channels, calls 1072 + * qcom_smd_create_channel() to create representations of these and add 1073 + * them to the edge's list of channels. 1074 + */ 1075 + static void qcom_channel_scan_worker(struct work_struct *work) 1076 + { 1077 + struct qcom_smd_edge *edge = container_of(work, struct qcom_smd_edge, scan_work); 1078 + struct qcom_smd_alloc_entry *alloc_tbl; 1079 + struct qcom_smd_alloc_entry *entry; 1080 + struct qcom_smd_channel *channel; 1081 + unsigned long flags; 1082 + unsigned fifo_id; 1083 + unsigned info_id; 1084 + int tbl; 1085 + int i; 1086 + u32 eflags, cid; 1087 + 1088 + for (tbl = 0; tbl < SMD_ALLOC_TBL_COUNT; tbl++) { 1089 + alloc_tbl = qcom_smem_get(edge->remote_pid, 1090 + smem_items[tbl].alloc_tbl_id, NULL); 1091 + if (IS_ERR(alloc_tbl)) 1092 + continue; 1093 + 1094 + for (i = 0; i < SMD_ALLOC_TBL_SIZE; i++) { 1095 + entry = &alloc_tbl[i]; 1096 + eflags = le32_to_cpu(entry->flags); 1097 + if (test_bit(i, edge->allocated[tbl])) 1098 + continue; 1099 + 1100 + if (entry->ref_count == 0) 1101 + continue; 1102 + 1103 + if (!entry->name[0]) 1104 + continue; 1105 + 1106 + if (!(eflags & SMD_CHANNEL_FLAGS_PACKET)) 1107 + continue; 1108 + 1109 + if ((eflags & SMD_CHANNEL_FLAGS_EDGE_MASK) != edge->edge_id) 1110 + continue; 1111 + 1112 + cid = le32_to_cpu(entry->cid); 1113 + info_id = smem_items[tbl].info_base_id + cid; 1114 + fifo_id = smem_items[tbl].fifo_base_id + cid; 1115 + 1116 + channel = qcom_smd_create_channel(edge, info_id, fifo_id, entry->name); 1117 + if (IS_ERR(channel)) 1118 + continue; 1119 + 1120 + spin_lock_irqsave(&edge->channels_lock, flags); 1121 + list_add(&channel->list, &edge->channels); 1122 + spin_unlock_irqrestore(&edge->channels_lock, flags); 1123 + 1124 + dev_dbg(&edge->dev, "new channel found: '%s'\n", channel->name); 1125 + set_bit(i, edge->allocated[tbl]); 1126 + 1127 + wake_up_interruptible(&edge->new_channel_event); 1128 + } 1129 + } 1130 + 1131 + schedule_work(&edge->state_work); 1132 + } 1133 + 1134 + /* 1135 + * This per edge worker scans smem for any new channels and register these. It 1136 + * then scans all registered channels for state changes that should be handled 1137 + * by creating or destroying smd client devices for the registered channels. 1138 + * 1139 + * LOCKING: edge->channels_lock only needs to cover the list operations, as the 1140 + * worker is killed before any channels are deallocated 1141 + */ 1142 + static void qcom_channel_state_worker(struct work_struct *work) 1143 + { 1144 + struct qcom_smd_channel *channel; 1145 + struct qcom_smd_edge *edge = container_of(work, 1146 + struct qcom_smd_edge, 1147 + state_work); 1148 + struct rpmsg_channel_info chinfo; 1149 + unsigned remote_state; 1150 + unsigned long flags; 1151 + 1152 + /* 1153 + * Register a device for any closed channel where the remote processor 1154 + * is showing interest in opening the channel. 1155 + */ 1156 + spin_lock_irqsave(&edge->channels_lock, flags); 1157 + list_for_each_entry(channel, &edge->channels, list) { 1158 + if (channel->state != SMD_CHANNEL_CLOSED) 1159 + continue; 1160 + 1161 + remote_state = GET_RX_CHANNEL_INFO(channel, state); 1162 + if (remote_state != SMD_CHANNEL_OPENING && 1163 + remote_state != SMD_CHANNEL_OPENED) 1164 + continue; 1165 + 1166 + if (channel->registered) 1167 + continue; 1168 + 1169 + spin_unlock_irqrestore(&edge->channels_lock, flags); 1170 + qcom_smd_create_device(channel); 1171 + channel->registered = true; 1172 + spin_lock_irqsave(&edge->channels_lock, flags); 1173 + 1174 + channel->registered = true; 1175 + } 1176 + 1177 + /* 1178 + * Unregister the device for any channel that is opened where the 1179 + * remote processor is closing the channel. 1180 + */ 1181 + list_for_each_entry(channel, &edge->channels, list) { 1182 + if (channel->state != SMD_CHANNEL_OPENING && 1183 + channel->state != SMD_CHANNEL_OPENED) 1184 + continue; 1185 + 1186 + remote_state = GET_RX_CHANNEL_INFO(channel, state); 1187 + if (remote_state == SMD_CHANNEL_OPENING || 1188 + remote_state == SMD_CHANNEL_OPENED) 1189 + continue; 1190 + 1191 + spin_unlock_irqrestore(&edge->channels_lock, flags); 1192 + 1193 + strncpy(chinfo.name, channel->name, sizeof(chinfo.name)); 1194 + chinfo.src = RPMSG_ADDR_ANY; 1195 + chinfo.dst = RPMSG_ADDR_ANY; 1196 + rpmsg_unregister_device(&edge->dev, &chinfo); 1197 + channel->registered = false; 1198 + spin_lock_irqsave(&edge->channels_lock, flags); 1199 + } 1200 + spin_unlock_irqrestore(&edge->channels_lock, flags); 1201 + } 1202 + 1203 + /* 1204 + * Parses an of_node describing an edge. 1205 + */ 1206 + static int qcom_smd_parse_edge(struct device *dev, 1207 + struct device_node *node, 1208 + struct qcom_smd_edge *edge) 1209 + { 1210 + struct device_node *syscon_np; 1211 + const char *key; 1212 + int irq; 1213 + int ret; 1214 + 1215 + INIT_LIST_HEAD(&edge->channels); 1216 + spin_lock_init(&edge->channels_lock); 1217 + 1218 + INIT_WORK(&edge->scan_work, qcom_channel_scan_worker); 1219 + INIT_WORK(&edge->state_work, qcom_channel_state_worker); 1220 + 1221 + edge->of_node = of_node_get(node); 1222 + 1223 + key = "qcom,smd-edge"; 1224 + ret = of_property_read_u32(node, key, &edge->edge_id); 1225 + if (ret) { 1226 + dev_err(dev, "edge missing %s property\n", key); 1227 + return -EINVAL; 1228 + } 1229 + 1230 + edge->remote_pid = QCOM_SMEM_HOST_ANY; 1231 + key = "qcom,remote-pid"; 1232 + of_property_read_u32(node, key, &edge->remote_pid); 1233 + 1234 + syscon_np = of_parse_phandle(node, "qcom,ipc", 0); 1235 + if (!syscon_np) { 1236 + dev_err(dev, "no qcom,ipc node\n"); 1237 + return -ENODEV; 1238 + } 1239 + 1240 + edge->ipc_regmap = syscon_node_to_regmap(syscon_np); 1241 + if (IS_ERR(edge->ipc_regmap)) 1242 + return PTR_ERR(edge->ipc_regmap); 1243 + 1244 + key = "qcom,ipc"; 1245 + ret = of_property_read_u32_index(node, key, 1, &edge->ipc_offset); 1246 + if (ret < 0) { 1247 + dev_err(dev, "no offset in %s\n", key); 1248 + return -EINVAL; 1249 + } 1250 + 1251 + ret = of_property_read_u32_index(node, key, 2, &edge->ipc_bit); 1252 + if (ret < 0) { 1253 + dev_err(dev, "no bit in %s\n", key); 1254 + return -EINVAL; 1255 + } 1256 + 1257 + irq = irq_of_parse_and_map(node, 0); 1258 + if (irq < 0) { 1259 + dev_err(dev, "required smd interrupt missing\n"); 1260 + return -EINVAL; 1261 + } 1262 + 1263 + ret = devm_request_irq(dev, irq, 1264 + qcom_smd_edge_intr, IRQF_TRIGGER_RISING, 1265 + node->name, edge); 1266 + if (ret) { 1267 + dev_err(dev, "failed to request smd irq\n"); 1268 + return ret; 1269 + } 1270 + 1271 + edge->irq = irq; 1272 + 1273 + return 0; 1274 + } 1275 + 1276 + /* 1277 + * Release function for an edge. 1278 + * Reset the state of each associated channel and free the edge context. 1279 + */ 1280 + static void qcom_smd_edge_release(struct device *dev) 1281 + { 1282 + struct qcom_smd_channel *channel; 1283 + struct qcom_smd_edge *edge = to_smd_edge(dev); 1284 + 1285 + list_for_each_entry(channel, &edge->channels, list) { 1286 + SET_RX_CHANNEL_INFO(channel, state, SMD_CHANNEL_CLOSED); 1287 + SET_RX_CHANNEL_INFO(channel, head, 0); 1288 + SET_RX_CHANNEL_INFO(channel, tail, 0); 1289 + } 1290 + 1291 + kfree(edge); 1292 + } 1293 + 1294 + /** 1295 + * qcom_smd_register_edge() - register an edge based on an device_node 1296 + * @parent: parent device for the edge 1297 + * @node: device_node describing the edge 1298 + * 1299 + * Returns an edge reference, or negative ERR_PTR() on failure. 1300 + */ 1301 + struct qcom_smd_edge *qcom_smd_register_edge(struct device *parent, 1302 + struct device_node *node) 1303 + { 1304 + struct qcom_smd_edge *edge; 1305 + int ret; 1306 + 1307 + edge = kzalloc(sizeof(*edge), GFP_KERNEL); 1308 + if (!edge) 1309 + return ERR_PTR(-ENOMEM); 1310 + 1311 + init_waitqueue_head(&edge->new_channel_event); 1312 + 1313 + edge->dev.parent = parent; 1314 + edge->dev.release = qcom_smd_edge_release; 1315 + dev_set_name(&edge->dev, "%s:%s", dev_name(parent), node->name); 1316 + ret = device_register(&edge->dev); 1317 + if (ret) { 1318 + pr_err("failed to register smd edge\n"); 1319 + return ERR_PTR(ret); 1320 + } 1321 + 1322 + ret = qcom_smd_parse_edge(&edge->dev, node, edge); 1323 + if (ret) { 1324 + dev_err(&edge->dev, "failed to parse smd edge\n"); 1325 + goto unregister_dev; 1326 + } 1327 + 1328 + schedule_work(&edge->scan_work); 1329 + 1330 + return edge; 1331 + 1332 + unregister_dev: 1333 + put_device(&edge->dev); 1334 + return ERR_PTR(ret); 1335 + } 1336 + EXPORT_SYMBOL(qcom_smd_register_edge); 1337 + 1338 + static int qcom_smd_remove_device(struct device *dev, void *data) 1339 + { 1340 + device_unregister(dev); 1341 + 1342 + return 0; 1343 + } 1344 + 1345 + /** 1346 + * qcom_smd_unregister_edge() - release an edge and its children 1347 + * @edge: edge reference acquired from qcom_smd_register_edge 1348 + */ 1349 + int qcom_smd_unregister_edge(struct qcom_smd_edge *edge) 1350 + { 1351 + int ret; 1352 + 1353 + disable_irq(edge->irq); 1354 + cancel_work_sync(&edge->scan_work); 1355 + cancel_work_sync(&edge->state_work); 1356 + 1357 + ret = device_for_each_child(&edge->dev, NULL, qcom_smd_remove_device); 1358 + if (ret) 1359 + dev_warn(&edge->dev, "can't remove smd device: %d\n", ret); 1360 + 1361 + device_unregister(&edge->dev); 1362 + 1363 + return 0; 1364 + } 1365 + EXPORT_SYMBOL(qcom_smd_unregister_edge); 1366 + 1367 + static int qcom_smd_probe(struct platform_device *pdev) 1368 + { 1369 + struct device_node *node; 1370 + void *p; 1371 + 1372 + /* Wait for smem */ 1373 + p = qcom_smem_get(QCOM_SMEM_HOST_ANY, smem_items[0].alloc_tbl_id, NULL); 1374 + if (PTR_ERR(p) == -EPROBE_DEFER) 1375 + return PTR_ERR(p); 1376 + 1377 + for_each_available_child_of_node(pdev->dev.of_node, node) 1378 + qcom_smd_register_edge(&pdev->dev, node); 1379 + 1380 + return 0; 1381 + } 1382 + 1383 + static int qcom_smd_remove_edge(struct device *dev, void *data) 1384 + { 1385 + struct qcom_smd_edge *edge = to_smd_edge(dev); 1386 + 1387 + return qcom_smd_unregister_edge(edge); 1388 + } 1389 + 1390 + /* 1391 + * Shut down all smd clients by making sure that each edge stops processing 1392 + * events and scanning for new channels, then call destroy on the devices. 1393 + */ 1394 + static int qcom_smd_remove(struct platform_device *pdev) 1395 + { 1396 + int ret; 1397 + 1398 + ret = device_for_each_child(&pdev->dev, NULL, qcom_smd_remove_edge); 1399 + if (ret) 1400 + dev_warn(&pdev->dev, "can't remove smd device: %d\n", ret); 1401 + 1402 + return ret; 1403 + } 1404 + 1405 + static const struct of_device_id qcom_smd_of_match[] = { 1406 + { .compatible = "qcom,smd" }, 1407 + {} 1408 + }; 1409 + MODULE_DEVICE_TABLE(of, qcom_smd_of_match); 1410 + 1411 + static struct platform_driver qcom_smd_driver = { 1412 + .probe = qcom_smd_probe, 1413 + .remove = qcom_smd_remove, 1414 + .driver = { 1415 + .name = "qcom-smd", 1416 + .of_match_table = qcom_smd_of_match, 1417 + }, 1418 + }; 1419 + 1420 + static int __init qcom_smd_init(void) 1421 + { 1422 + return platform_driver_register(&qcom_smd_driver); 1423 + } 1424 + subsys_initcall(qcom_smd_init); 1425 + 1426 + static void __exit qcom_smd_exit(void) 1427 + { 1428 + platform_driver_unregister(&qcom_smd_driver); 1429 + } 1430 + module_exit(qcom_smd_exit); 1431 + 1432 + MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>"); 1433 + MODULE_DESCRIPTION("Qualcomm Shared Memory Driver"); 1434 + MODULE_LICENSE("GPL v2");
+498
drivers/rpmsg/rpmsg_core.c
··· 1 + /* 2 + * remote processor messaging bus 3 + * 4 + * Copyright (C) 2011 Texas Instruments, Inc. 5 + * Copyright (C) 2011 Google, Inc. 6 + * 7 + * Ohad Ben-Cohen <ohad@wizery.com> 8 + * Brian Swetland <swetland@google.com> 9 + * 10 + * This software is licensed under the terms of the GNU General Public 11 + * License version 2, as published by the Free Software Foundation, and 12 + * may be copied, distributed, and modified under those terms. 13 + * 14 + * This program is distributed in the hope that it will be useful, 15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 + * GNU General Public License for more details. 18 + */ 19 + 20 + #define pr_fmt(fmt) "%s: " fmt, __func__ 21 + 22 + #include <linux/kernel.h> 23 + #include <linux/module.h> 24 + #include <linux/rpmsg.h> 25 + #include <linux/of_device.h> 26 + #include <linux/slab.h> 27 + 28 + #include "rpmsg_internal.h" 29 + 30 + /** 31 + * rpmsg_create_ept() - create a new rpmsg_endpoint 32 + * @rpdev: rpmsg channel device 33 + * @cb: rx callback handler 34 + * @priv: private data for the driver's use 35 + * @chinfo: channel_info with the local rpmsg address to bind with @cb 36 + * 37 + * Every rpmsg address in the system is bound to an rx callback (so when 38 + * inbound messages arrive, they are dispatched by the rpmsg bus using the 39 + * appropriate callback handler) by means of an rpmsg_endpoint struct. 40 + * 41 + * This function allows drivers to create such an endpoint, and by that, 42 + * bind a callback, and possibly some private data too, to an rpmsg address 43 + * (either one that is known in advance, or one that will be dynamically 44 + * assigned for them). 45 + * 46 + * Simple rpmsg drivers need not call rpmsg_create_ept, because an endpoint 47 + * is already created for them when they are probed by the rpmsg bus 48 + * (using the rx callback provided when they registered to the rpmsg bus). 49 + * 50 + * So things should just work for simple drivers: they already have an 51 + * endpoint, their rx callback is bound to their rpmsg address, and when 52 + * relevant inbound messages arrive (i.e. messages which their dst address 53 + * equals to the src address of their rpmsg channel), the driver's handler 54 + * is invoked to process it. 55 + * 56 + * That said, more complicated drivers might do need to allocate 57 + * additional rpmsg addresses, and bind them to different rx callbacks. 58 + * To accomplish that, those drivers need to call this function. 59 + * 60 + * Drivers should provide their @rpdev channel (so the new endpoint would belong 61 + * to the same remote processor their channel belongs to), an rx callback 62 + * function, an optional private data (which is provided back when the 63 + * rx callback is invoked), and an address they want to bind with the 64 + * callback. If @addr is RPMSG_ADDR_ANY, then rpmsg_create_ept will 65 + * dynamically assign them an available rpmsg address (drivers should have 66 + * a very good reason why not to always use RPMSG_ADDR_ANY here). 67 + * 68 + * Returns a pointer to the endpoint on success, or NULL on error. 69 + */ 70 + struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *rpdev, 71 + rpmsg_rx_cb_t cb, void *priv, 72 + struct rpmsg_channel_info chinfo) 73 + { 74 + return rpdev->ops->create_ept(rpdev, cb, priv, chinfo); 75 + } 76 + EXPORT_SYMBOL(rpmsg_create_ept); 77 + 78 + /** 79 + * rpmsg_destroy_ept() - destroy an existing rpmsg endpoint 80 + * @ept: endpoing to destroy 81 + * 82 + * Should be used by drivers to destroy an rpmsg endpoint previously 83 + * created with rpmsg_create_ept(). 84 + */ 85 + void rpmsg_destroy_ept(struct rpmsg_endpoint *ept) 86 + { 87 + ept->ops->destroy_ept(ept); 88 + } 89 + EXPORT_SYMBOL(rpmsg_destroy_ept); 90 + 91 + /** 92 + * rpmsg_send() - send a message across to the remote processor 93 + * @ept: the rpmsg endpoint 94 + * @data: payload of message 95 + * @len: length of payload 96 + * 97 + * This function sends @data of length @len on the @ept endpoint. 98 + * The message will be sent to the remote processor which the @ept 99 + * endpoint belongs to, using @ept's address and its associated rpmsg 100 + * device destination addresses. 101 + * In case there are no TX buffers available, the function will block until 102 + * one becomes available, or a timeout of 15 seconds elapses. When the latter 103 + * happens, -ERESTARTSYS is returned. 104 + * 105 + * Can only be called from process context (for now). 106 + * 107 + * Returns 0 on success and an appropriate error value on failure. 108 + */ 109 + int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len) 110 + { 111 + return ept->ops->send(ept, data, len); 112 + } 113 + EXPORT_SYMBOL(rpmsg_send); 114 + 115 + /** 116 + * rpmsg_sendto() - send a message across to the remote processor, specify dst 117 + * @ept: the rpmsg endpoint 118 + * @data: payload of message 119 + * @len: length of payload 120 + * @dst: destination address 121 + * 122 + * This function sends @data of length @len to the remote @dst address. 123 + * The message will be sent to the remote processor which the @ept 124 + * endpoint belongs to, using @ept's address as source. 125 + * In case there are no TX buffers available, the function will block until 126 + * one becomes available, or a timeout of 15 seconds elapses. When the latter 127 + * happens, -ERESTARTSYS is returned. 128 + * 129 + * Can only be called from process context (for now). 130 + * 131 + * Returns 0 on success and an appropriate error value on failure. 132 + */ 133 + int rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst) 134 + { 135 + return ept->ops->sendto(ept, data, len, dst); 136 + } 137 + EXPORT_SYMBOL(rpmsg_sendto); 138 + 139 + /** 140 + * rpmsg_send_offchannel() - send a message using explicit src/dst addresses 141 + * @ept: the rpmsg endpoint 142 + * @src: source address 143 + * @dst: destination address 144 + * @data: payload of message 145 + * @len: length of payload 146 + * 147 + * This function sends @data of length @len to the remote @dst address, 148 + * and uses @src as the source address. 149 + * The message will be sent to the remote processor which the @ept 150 + * endpoint belongs to. 151 + * In case there are no TX buffers available, the function will block until 152 + * one becomes available, or a timeout of 15 seconds elapses. When the latter 153 + * happens, -ERESTARTSYS is returned. 154 + * 155 + * Can only be called from process context (for now). 156 + * 157 + * Returns 0 on success and an appropriate error value on failure. 158 + */ 159 + int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst, 160 + void *data, int len) 161 + { 162 + return ept->ops->send_offchannel(ept, src, dst, data, len); 163 + } 164 + EXPORT_SYMBOL(rpmsg_send_offchannel); 165 + 166 + /** 167 + * rpmsg_send() - send a message across to the remote processor 168 + * @ept: the rpmsg endpoint 169 + * @data: payload of message 170 + * @len: length of payload 171 + * 172 + * This function sends @data of length @len on the @ept endpoint. 173 + * The message will be sent to the remote processor which the @ept 174 + * endpoint belongs to, using @ept's address as source and its associated 175 + * rpdev's address as destination. 176 + * In case there are no TX buffers available, the function will immediately 177 + * return -ENOMEM without waiting until one becomes available. 178 + * 179 + * Can only be called from process context (for now). 180 + * 181 + * Returns 0 on success and an appropriate error value on failure. 182 + */ 183 + int rpmsg_trysend(struct rpmsg_endpoint *ept, void *data, int len) 184 + { 185 + return ept->ops->trysend(ept, data, len); 186 + } 187 + EXPORT_SYMBOL(rpmsg_trysend); 188 + 189 + /** 190 + * rpmsg_sendto() - send a message across to the remote processor, specify dst 191 + * @ept: the rpmsg endpoint 192 + * @data: payload of message 193 + * @len: length of payload 194 + * @dst: destination address 195 + * 196 + * This function sends @data of length @len to the remote @dst address. 197 + * The message will be sent to the remote processor which the @ept 198 + * endpoint belongs to, using @ept's address as source. 199 + * In case there are no TX buffers available, the function will immediately 200 + * return -ENOMEM without waiting until one becomes available. 201 + * 202 + * Can only be called from process context (for now). 203 + * 204 + * Returns 0 on success and an appropriate error value on failure. 205 + */ 206 + int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst) 207 + { 208 + return ept->ops->trysendto(ept, data, len, dst); 209 + } 210 + EXPORT_SYMBOL(rpmsg_trysendto); 211 + 212 + /** 213 + * rpmsg_send_offchannel() - send a message using explicit src/dst addresses 214 + * @ept: the rpmsg endpoint 215 + * @src: source address 216 + * @dst: destination address 217 + * @data: payload of message 218 + * @len: length of payload 219 + * 220 + * This function sends @data of length @len to the remote @dst address, 221 + * and uses @src as the source address. 222 + * The message will be sent to the remote processor which the @ept 223 + * endpoint belongs to. 224 + * In case there are no TX buffers available, the function will immediately 225 + * return -ENOMEM without waiting until one becomes available. 226 + * 227 + * Can only be called from process context (for now). 228 + * 229 + * Returns 0 on success and an appropriate error value on failure. 230 + */ 231 + int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst, 232 + void *data, int len) 233 + { 234 + return ept->ops->trysend_offchannel(ept, src, dst, data, len); 235 + } 236 + EXPORT_SYMBOL(rpmsg_trysend_offchannel); 237 + 238 + /* 239 + * match an rpmsg channel with a channel info struct. 240 + * this is used to make sure we're not creating rpmsg devices for channels 241 + * that already exist. 242 + */ 243 + static int rpmsg_device_match(struct device *dev, void *data) 244 + { 245 + struct rpmsg_channel_info *chinfo = data; 246 + struct rpmsg_device *rpdev = to_rpmsg_device(dev); 247 + 248 + if (chinfo->src != RPMSG_ADDR_ANY && chinfo->src != rpdev->src) 249 + return 0; 250 + 251 + if (chinfo->dst != RPMSG_ADDR_ANY && chinfo->dst != rpdev->dst) 252 + return 0; 253 + 254 + if (strncmp(chinfo->name, rpdev->id.name, RPMSG_NAME_SIZE)) 255 + return 0; 256 + 257 + /* found a match ! */ 258 + return 1; 259 + } 260 + 261 + struct device *rpmsg_find_device(struct device *parent, 262 + struct rpmsg_channel_info *chinfo) 263 + { 264 + return device_find_child(parent, chinfo, rpmsg_device_match); 265 + 266 + } 267 + EXPORT_SYMBOL(rpmsg_find_device); 268 + 269 + /* sysfs show configuration fields */ 270 + #define rpmsg_show_attr(field, path, format_string) \ 271 + static ssize_t \ 272 + field##_show(struct device *dev, \ 273 + struct device_attribute *attr, char *buf) \ 274 + { \ 275 + struct rpmsg_device *rpdev = to_rpmsg_device(dev); \ 276 + \ 277 + return sprintf(buf, format_string, rpdev->path); \ 278 + } 279 + 280 + /* for more info, see Documentation/ABI/testing/sysfs-bus-rpmsg */ 281 + rpmsg_show_attr(name, id.name, "%s\n"); 282 + rpmsg_show_attr(src, src, "0x%x\n"); 283 + rpmsg_show_attr(dst, dst, "0x%x\n"); 284 + rpmsg_show_attr(announce, announce ? "true" : "false", "%s\n"); 285 + 286 + static ssize_t modalias_show(struct device *dev, 287 + struct device_attribute *attr, char *buf) 288 + { 289 + struct rpmsg_device *rpdev = to_rpmsg_device(dev); 290 + 291 + return sprintf(buf, RPMSG_DEVICE_MODALIAS_FMT "\n", rpdev->id.name); 292 + } 293 + 294 + static struct device_attribute rpmsg_dev_attrs[] = { 295 + __ATTR_RO(name), 296 + __ATTR_RO(modalias), 297 + __ATTR_RO(dst), 298 + __ATTR_RO(src), 299 + __ATTR_RO(announce), 300 + __ATTR_NULL 301 + }; 302 + 303 + /* rpmsg devices and drivers are matched using the service name */ 304 + static inline int rpmsg_id_match(const struct rpmsg_device *rpdev, 305 + const struct rpmsg_device_id *id) 306 + { 307 + return strncmp(id->name, rpdev->id.name, RPMSG_NAME_SIZE) == 0; 308 + } 309 + 310 + /* match rpmsg channel and rpmsg driver */ 311 + static int rpmsg_dev_match(struct device *dev, struct device_driver *drv) 312 + { 313 + struct rpmsg_device *rpdev = to_rpmsg_device(dev); 314 + struct rpmsg_driver *rpdrv = to_rpmsg_driver(drv); 315 + const struct rpmsg_device_id *ids = rpdrv->id_table; 316 + unsigned int i; 317 + 318 + if (ids) 319 + for (i = 0; ids[i].name[0]; i++) 320 + if (rpmsg_id_match(rpdev, &ids[i])) 321 + return 1; 322 + 323 + return of_driver_match_device(dev, drv); 324 + } 325 + 326 + static int rpmsg_uevent(struct device *dev, struct kobj_uevent_env *env) 327 + { 328 + struct rpmsg_device *rpdev = to_rpmsg_device(dev); 329 + 330 + return add_uevent_var(env, "MODALIAS=" RPMSG_DEVICE_MODALIAS_FMT, 331 + rpdev->id.name); 332 + } 333 + 334 + /* 335 + * when an rpmsg driver is probed with a channel, we seamlessly create 336 + * it an endpoint, binding its rx callback to a unique local rpmsg 337 + * address. 338 + * 339 + * if we need to, we also announce about this channel to the remote 340 + * processor (needed in case the driver is exposing an rpmsg service). 341 + */ 342 + static int rpmsg_dev_probe(struct device *dev) 343 + { 344 + struct rpmsg_device *rpdev = to_rpmsg_device(dev); 345 + struct rpmsg_driver *rpdrv = to_rpmsg_driver(rpdev->dev.driver); 346 + struct rpmsg_channel_info chinfo = {}; 347 + struct rpmsg_endpoint *ept; 348 + int err; 349 + 350 + strncpy(chinfo.name, rpdev->id.name, RPMSG_NAME_SIZE); 351 + chinfo.src = rpdev->src; 352 + chinfo.dst = RPMSG_ADDR_ANY; 353 + 354 + ept = rpmsg_create_ept(rpdev, rpdrv->callback, NULL, chinfo); 355 + if (!ept) { 356 + dev_err(dev, "failed to create endpoint\n"); 357 + err = -ENOMEM; 358 + goto out; 359 + } 360 + 361 + rpdev->ept = ept; 362 + rpdev->src = ept->addr; 363 + 364 + err = rpdrv->probe(rpdev); 365 + if (err) { 366 + dev_err(dev, "%s: failed: %d\n", __func__, err); 367 + rpmsg_destroy_ept(ept); 368 + goto out; 369 + } 370 + 371 + if (rpdev->ops->announce_create) 372 + err = rpdev->ops->announce_create(rpdev); 373 + out: 374 + return err; 375 + } 376 + 377 + static int rpmsg_dev_remove(struct device *dev) 378 + { 379 + struct rpmsg_device *rpdev = to_rpmsg_device(dev); 380 + struct rpmsg_driver *rpdrv = to_rpmsg_driver(rpdev->dev.driver); 381 + int err = 0; 382 + 383 + if (rpdev->ops->announce_destroy) 384 + err = rpdev->ops->announce_destroy(rpdev); 385 + 386 + rpdrv->remove(rpdev); 387 + 388 + rpmsg_destroy_ept(rpdev->ept); 389 + 390 + return err; 391 + } 392 + 393 + static struct bus_type rpmsg_bus = { 394 + .name = "rpmsg", 395 + .match = rpmsg_dev_match, 396 + .dev_attrs = rpmsg_dev_attrs, 397 + .uevent = rpmsg_uevent, 398 + .probe = rpmsg_dev_probe, 399 + .remove = rpmsg_dev_remove, 400 + }; 401 + 402 + static void rpmsg_release_device(struct device *dev) 403 + { 404 + struct rpmsg_device *rpdev = to_rpmsg_device(dev); 405 + 406 + kfree(rpdev); 407 + } 408 + 409 + int rpmsg_register_device(struct rpmsg_device *rpdev) 410 + { 411 + struct device *dev = &rpdev->dev; 412 + int ret; 413 + 414 + dev_set_name(&rpdev->dev, "%s:%s", 415 + dev_name(dev->parent), rpdev->id.name); 416 + 417 + rpdev->dev.bus = &rpmsg_bus; 418 + rpdev->dev.release = rpmsg_release_device; 419 + 420 + ret = device_register(&rpdev->dev); 421 + if (ret) { 422 + dev_err(dev, "device_register failed: %d\n", ret); 423 + put_device(&rpdev->dev); 424 + } 425 + 426 + return ret; 427 + } 428 + EXPORT_SYMBOL(rpmsg_register_device); 429 + 430 + /* 431 + * find an existing channel using its name + address properties, 432 + * and destroy it 433 + */ 434 + int rpmsg_unregister_device(struct device *parent, 435 + struct rpmsg_channel_info *chinfo) 436 + { 437 + struct device *dev; 438 + 439 + dev = rpmsg_find_device(parent, chinfo); 440 + if (!dev) 441 + return -EINVAL; 442 + 443 + device_unregister(dev); 444 + 445 + put_device(dev); 446 + 447 + return 0; 448 + } 449 + EXPORT_SYMBOL(rpmsg_unregister_device); 450 + 451 + /** 452 + * __register_rpmsg_driver() - register an rpmsg driver with the rpmsg bus 453 + * @rpdrv: pointer to a struct rpmsg_driver 454 + * @owner: owning module/driver 455 + * 456 + * Returns 0 on success, and an appropriate error value on failure. 457 + */ 458 + int __register_rpmsg_driver(struct rpmsg_driver *rpdrv, struct module *owner) 459 + { 460 + rpdrv->drv.bus = &rpmsg_bus; 461 + rpdrv->drv.owner = owner; 462 + return driver_register(&rpdrv->drv); 463 + } 464 + EXPORT_SYMBOL(__register_rpmsg_driver); 465 + 466 + /** 467 + * unregister_rpmsg_driver() - unregister an rpmsg driver from the rpmsg bus 468 + * @rpdrv: pointer to a struct rpmsg_driver 469 + * 470 + * Returns 0 on success, and an appropriate error value on failure. 471 + */ 472 + void unregister_rpmsg_driver(struct rpmsg_driver *rpdrv) 473 + { 474 + driver_unregister(&rpdrv->drv); 475 + } 476 + EXPORT_SYMBOL(unregister_rpmsg_driver); 477 + 478 + 479 + static int __init rpmsg_init(void) 480 + { 481 + int ret; 482 + 483 + ret = bus_register(&rpmsg_bus); 484 + if (ret) 485 + pr_err("failed to register rpmsg bus: %d\n", ret); 486 + 487 + return ret; 488 + } 489 + postcore_initcall(rpmsg_init); 490 + 491 + static void __exit rpmsg_fini(void) 492 + { 493 + bus_unregister(&rpmsg_bus); 494 + } 495 + module_exit(rpmsg_fini); 496 + 497 + MODULE_DESCRIPTION("remote processor messaging bus"); 498 + MODULE_LICENSE("GPL v2");
+82
drivers/rpmsg/rpmsg_internal.h
··· 1 + /* 2 + * remote processor messaging bus internals 3 + * 4 + * Copyright (C) 2011 Texas Instruments, Inc. 5 + * Copyright (C) 2011 Google, Inc. 6 + * 7 + * Ohad Ben-Cohen <ohad@wizery.com> 8 + * Brian Swetland <swetland@google.com> 9 + * 10 + * This software is licensed under the terms of the GNU General Public 11 + * License version 2, as published by the Free Software Foundation, and 12 + * may be copied, distributed, and modified under those terms. 13 + * 14 + * This program is distributed in the hope that it will be useful, 15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 + * GNU General Public License for more details. 18 + */ 19 + 20 + #ifndef __RPMSG_INTERNAL_H__ 21 + #define __RPMSG_INTERNAL_H__ 22 + 23 + #include <linux/rpmsg.h> 24 + 25 + #define to_rpmsg_device(d) container_of(d, struct rpmsg_device, dev) 26 + #define to_rpmsg_driver(d) container_of(d, struct rpmsg_driver, drv) 27 + 28 + /** 29 + * struct rpmsg_device_ops - indirection table for the rpmsg_device operations 30 + * @create_ept: create backend-specific endpoint, requried 31 + * @announce_create: announce presence of new channel, optional 32 + * @announce_destroy: announce destruction of channel, optional 33 + * 34 + * Indirection table for the operations that a rpmsg backend should implement. 35 + * @announce_create and @announce_destroy are optional as the backend might 36 + * advertise new channels implicitly by creating the endpoints. 37 + */ 38 + struct rpmsg_device_ops { 39 + struct rpmsg_endpoint *(*create_ept)(struct rpmsg_device *rpdev, 40 + rpmsg_rx_cb_t cb, void *priv, 41 + struct rpmsg_channel_info chinfo); 42 + 43 + int (*announce_create)(struct rpmsg_device *ept); 44 + int (*announce_destroy)(struct rpmsg_device *ept); 45 + }; 46 + 47 + /** 48 + * struct rpmsg_endpoint_ops - indirection table for rpmsg_endpoint operations 49 + * @destroy_ept: destroy the given endpoint, required 50 + * @send: see @rpmsg_send(), required 51 + * @sendto: see @rpmsg_sendto(), optional 52 + * @send_offchannel: see @rpmsg_send_offchannel(), optional 53 + * @trysend: see @rpmsg_trysend(), required 54 + * @trysendto: see @rpmsg_trysendto(), optional 55 + * @trysend_offchannel: see @rpmsg_trysend_offchannel(), optional 56 + * 57 + * Indirection table for the operations that a rpmsg backend should implement. 58 + * In addition to @destroy_ept, the backend must at least implement @send and 59 + * @trysend, while the variants sending data off-channel are optional. 60 + */ 61 + struct rpmsg_endpoint_ops { 62 + void (*destroy_ept)(struct rpmsg_endpoint *ept); 63 + 64 + int (*send)(struct rpmsg_endpoint *ept, void *data, int len); 65 + int (*sendto)(struct rpmsg_endpoint *ept, void *data, int len, u32 dst); 66 + int (*send_offchannel)(struct rpmsg_endpoint *ept, u32 src, u32 dst, 67 + void *data, int len); 68 + 69 + int (*trysend)(struct rpmsg_endpoint *ept, void *data, int len); 70 + int (*trysendto)(struct rpmsg_endpoint *ept, void *data, int len, u32 dst); 71 + int (*trysend_offchannel)(struct rpmsg_endpoint *ept, u32 src, u32 dst, 72 + void *data, int len); 73 + }; 74 + 75 + int rpmsg_register_device(struct rpmsg_device *rpdev); 76 + int rpmsg_unregister_device(struct device *parent, 77 + struct rpmsg_channel_info *chinfo); 78 + 79 + struct device *rpmsg_find_device(struct device *parent, 80 + struct rpmsg_channel_info *chinfo); 81 + 82 + #endif
+216 -323
drivers/rpmsg/virtio_rpmsg_bus.c
··· 33 33 #include <linux/wait.h> 34 34 #include <linux/rpmsg.h> 35 35 #include <linux/mutex.h> 36 + #include <linux/of_device.h> 37 + 38 + #include "rpmsg_internal.h" 36 39 37 40 /** 38 41 * struct virtproc_info - virtual remote processor state ··· 75 72 struct rpmsg_endpoint *ns_ept; 76 73 }; 77 74 75 + /* The feature bitmap for virtio rpmsg */ 76 + #define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */ 77 + 78 78 /** 79 - * struct rpmsg_channel_info - internal channel info representation 80 - * @name: name of service 81 - * @src: local address 79 + * struct rpmsg_hdr - common header for all rpmsg messages 80 + * @src: source address 82 81 * @dst: destination address 82 + * @reserved: reserved for future use 83 + * @len: length of payload (in bytes) 84 + * @flags: message flags 85 + * @data: @len bytes of message payload data 86 + * 87 + * Every message sent(/received) on the rpmsg bus begins with this header. 83 88 */ 84 - struct rpmsg_channel_info { 85 - char name[RPMSG_NAME_SIZE]; 89 + struct rpmsg_hdr { 86 90 u32 src; 87 91 u32 dst; 92 + u32 reserved; 93 + u16 len; 94 + u16 flags; 95 + u8 data[0]; 96 + } __packed; 97 + 98 + /** 99 + * struct rpmsg_ns_msg - dynamic name service announcement message 100 + * @name: name of remote service that is published 101 + * @addr: address of remote service that is published 102 + * @flags: indicates whether service is created or destroyed 103 + * 104 + * This message is sent across to publish a new service, or announce 105 + * about its removal. When we receive these messages, an appropriate 106 + * rpmsg channel (i.e device) is created/destroyed. In turn, the ->probe() 107 + * or ->remove() handler of the appropriate rpmsg driver will be invoked 108 + * (if/as-soon-as one is registered). 109 + */ 110 + struct rpmsg_ns_msg { 111 + char name[RPMSG_NAME_SIZE]; 112 + u32 addr; 113 + u32 flags; 114 + } __packed; 115 + 116 + /** 117 + * enum rpmsg_ns_flags - dynamic name service announcement flags 118 + * 119 + * @RPMSG_NS_CREATE: a new remote service was just created 120 + * @RPMSG_NS_DESTROY: a known remote service was just destroyed 121 + */ 122 + enum rpmsg_ns_flags { 123 + RPMSG_NS_CREATE = 0, 124 + RPMSG_NS_DESTROY = 1, 88 125 }; 89 126 90 - #define to_rpmsg_channel(d) container_of(d, struct rpmsg_channel, dev) 91 - #define to_rpmsg_driver(d) container_of(d, struct rpmsg_driver, drv) 127 + /** 128 + * @vrp: the remote processor this channel belongs to 129 + */ 130 + struct virtio_rpmsg_channel { 131 + struct rpmsg_device rpdev; 132 + 133 + struct virtproc_info *vrp; 134 + }; 135 + 136 + #define to_virtio_rpmsg_channel(_rpdev) \ 137 + container_of(_rpdev, struct virtio_rpmsg_channel, rpdev) 92 138 93 139 /* 94 140 * We're allocating buffers of 512 bytes each for communications. The ··· 170 118 /* Address 53 is reserved for advertising remote services */ 171 119 #define RPMSG_NS_ADDR (53) 172 120 173 - /* sysfs show configuration fields */ 174 - #define rpmsg_show_attr(field, path, format_string) \ 175 - static ssize_t \ 176 - field##_show(struct device *dev, \ 177 - struct device_attribute *attr, char *buf) \ 178 - { \ 179 - struct rpmsg_channel *rpdev = to_rpmsg_channel(dev); \ 180 - \ 181 - return sprintf(buf, format_string, rpdev->path); \ 182 - } 121 + static void virtio_rpmsg_destroy_ept(struct rpmsg_endpoint *ept); 122 + static int virtio_rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len); 123 + static int virtio_rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, 124 + u32 dst); 125 + static int virtio_rpmsg_send_offchannel(struct rpmsg_endpoint *ept, u32 src, 126 + u32 dst, void *data, int len); 127 + static int virtio_rpmsg_trysend(struct rpmsg_endpoint *ept, void *data, int len); 128 + static int virtio_rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, 129 + int len, u32 dst); 130 + static int virtio_rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, 131 + u32 dst, void *data, int len); 183 132 184 - /* for more info, see Documentation/ABI/testing/sysfs-bus-rpmsg */ 185 - rpmsg_show_attr(name, id.name, "%s\n"); 186 - rpmsg_show_attr(src, src, "0x%x\n"); 187 - rpmsg_show_attr(dst, dst, "0x%x\n"); 188 - rpmsg_show_attr(announce, announce ? "true" : "false", "%s\n"); 189 - 190 - /* 191 - * Unique (and free running) index for rpmsg devices. 192 - * 193 - * Yeah, we're not recycling those numbers (yet?). will be easy 194 - * to change if/when we want to. 195 - */ 196 - static unsigned int rpmsg_dev_index; 197 - 198 - static ssize_t modalias_show(struct device *dev, 199 - struct device_attribute *attr, char *buf) 200 - { 201 - struct rpmsg_channel *rpdev = to_rpmsg_channel(dev); 202 - 203 - return sprintf(buf, RPMSG_DEVICE_MODALIAS_FMT "\n", rpdev->id.name); 204 - } 205 - 206 - static struct device_attribute rpmsg_dev_attrs[] = { 207 - __ATTR_RO(name), 208 - __ATTR_RO(modalias), 209 - __ATTR_RO(dst), 210 - __ATTR_RO(src), 211 - __ATTR_RO(announce), 212 - __ATTR_NULL 133 + static const struct rpmsg_endpoint_ops virtio_endpoint_ops = { 134 + .destroy_ept = virtio_rpmsg_destroy_ept, 135 + .send = virtio_rpmsg_send, 136 + .sendto = virtio_rpmsg_sendto, 137 + .send_offchannel = virtio_rpmsg_send_offchannel, 138 + .trysend = virtio_rpmsg_trysend, 139 + .trysendto = virtio_rpmsg_trysendto, 140 + .trysend_offchannel = virtio_rpmsg_trysend_offchannel, 213 141 }; 214 - 215 - /* rpmsg devices and drivers are matched using the service name */ 216 - static inline int rpmsg_id_match(const struct rpmsg_channel *rpdev, 217 - const struct rpmsg_device_id *id) 218 - { 219 - return strncmp(id->name, rpdev->id.name, RPMSG_NAME_SIZE) == 0; 220 - } 221 - 222 - /* match rpmsg channel and rpmsg driver */ 223 - static int rpmsg_dev_match(struct device *dev, struct device_driver *drv) 224 - { 225 - struct rpmsg_channel *rpdev = to_rpmsg_channel(dev); 226 - struct rpmsg_driver *rpdrv = to_rpmsg_driver(drv); 227 - const struct rpmsg_device_id *ids = rpdrv->id_table; 228 - unsigned int i; 229 - 230 - for (i = 0; ids[i].name[0]; i++) 231 - if (rpmsg_id_match(rpdev, &ids[i])) 232 - return 1; 233 - 234 - return 0; 235 - } 236 - 237 - static int rpmsg_uevent(struct device *dev, struct kobj_uevent_env *env) 238 - { 239 - struct rpmsg_channel *rpdev = to_rpmsg_channel(dev); 240 - 241 - return add_uevent_var(env, "MODALIAS=" RPMSG_DEVICE_MODALIAS_FMT, 242 - rpdev->id.name); 243 - } 244 142 245 143 /** 246 144 * __ept_release() - deallocate an rpmsg endpoint ··· 214 212 215 213 /* for more info, see below documentation of rpmsg_create_ept() */ 216 214 static struct rpmsg_endpoint *__rpmsg_create_ept(struct virtproc_info *vrp, 217 - struct rpmsg_channel *rpdev, rpmsg_rx_cb_t cb, 218 - void *priv, u32 addr) 215 + struct rpmsg_device *rpdev, 216 + rpmsg_rx_cb_t cb, 217 + void *priv, u32 addr) 219 218 { 220 219 int id_min, id_max, id; 221 220 struct rpmsg_endpoint *ept; 222 221 struct device *dev = rpdev ? &rpdev->dev : &vrp->vdev->dev; 223 222 224 223 ept = kzalloc(sizeof(*ept), GFP_KERNEL); 225 - if (!ept) { 226 - dev_err(dev, "failed to kzalloc a new ept\n"); 224 + if (!ept) 227 225 return NULL; 228 - } 229 226 230 227 kref_init(&ept->refcount); 231 228 mutex_init(&ept->cb_lock); ··· 232 231 ept->rpdev = rpdev; 233 232 ept->cb = cb; 234 233 ept->priv = priv; 234 + ept->ops = &virtio_endpoint_ops; 235 235 236 236 /* do we need to allocate a local address ? */ 237 237 if (addr == RPMSG_ADDR_ANY) { ··· 263 261 return NULL; 264 262 } 265 263 266 - /** 267 - * rpmsg_create_ept() - create a new rpmsg_endpoint 268 - * @rpdev: rpmsg channel device 269 - * @cb: rx callback handler 270 - * @priv: private data for the driver's use 271 - * @addr: local rpmsg address to bind with @cb 272 - * 273 - * Every rpmsg address in the system is bound to an rx callback (so when 274 - * inbound messages arrive, they are dispatched by the rpmsg bus using the 275 - * appropriate callback handler) by means of an rpmsg_endpoint struct. 276 - * 277 - * This function allows drivers to create such an endpoint, and by that, 278 - * bind a callback, and possibly some private data too, to an rpmsg address 279 - * (either one that is known in advance, or one that will be dynamically 280 - * assigned for them). 281 - * 282 - * Simple rpmsg drivers need not call rpmsg_create_ept, because an endpoint 283 - * is already created for them when they are probed by the rpmsg bus 284 - * (using the rx callback provided when they registered to the rpmsg bus). 285 - * 286 - * So things should just work for simple drivers: they already have an 287 - * endpoint, their rx callback is bound to their rpmsg address, and when 288 - * relevant inbound messages arrive (i.e. messages which their dst address 289 - * equals to the src address of their rpmsg channel), the driver's handler 290 - * is invoked to process it. 291 - * 292 - * That said, more complicated drivers might do need to allocate 293 - * additional rpmsg addresses, and bind them to different rx callbacks. 294 - * To accomplish that, those drivers need to call this function. 295 - * 296 - * Drivers should provide their @rpdev channel (so the new endpoint would belong 297 - * to the same remote processor their channel belongs to), an rx callback 298 - * function, an optional private data (which is provided back when the 299 - * rx callback is invoked), and an address they want to bind with the 300 - * callback. If @addr is RPMSG_ADDR_ANY, then rpmsg_create_ept will 301 - * dynamically assign them an available rpmsg address (drivers should have 302 - * a very good reason why not to always use RPMSG_ADDR_ANY here). 303 - * 304 - * Returns a pointer to the endpoint on success, or NULL on error. 305 - */ 306 - struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_channel *rpdev, 307 - rpmsg_rx_cb_t cb, void *priv, u32 addr) 264 + static struct rpmsg_endpoint *virtio_rpmsg_create_ept(struct rpmsg_device *rpdev, 265 + rpmsg_rx_cb_t cb, 266 + void *priv, 267 + struct rpmsg_channel_info chinfo) 308 268 { 309 - return __rpmsg_create_ept(rpdev->vrp, rpdev, cb, priv, addr); 269 + struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(rpdev); 270 + 271 + return __rpmsg_create_ept(vch->vrp, rpdev, cb, priv, chinfo.src); 310 272 } 311 - EXPORT_SYMBOL(rpmsg_create_ept); 312 273 313 274 /** 314 275 * __rpmsg_destroy_ept() - destroy an existing rpmsg endpoint ··· 299 334 kref_put(&ept->refcount, __ept_release); 300 335 } 301 336 302 - /** 303 - * rpmsg_destroy_ept() - destroy an existing rpmsg endpoint 304 - * @ept: endpoing to destroy 305 - * 306 - * Should be used by drivers to destroy an rpmsg endpoint previously 307 - * created with rpmsg_create_ept(). 308 - */ 309 - void rpmsg_destroy_ept(struct rpmsg_endpoint *ept) 337 + static void virtio_rpmsg_destroy_ept(struct rpmsg_endpoint *ept) 310 338 { 311 - __rpmsg_destroy_ept(ept->rpdev->vrp, ept); 339 + struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(ept->rpdev); 340 + 341 + __rpmsg_destroy_ept(vch->vrp, ept); 312 342 } 313 - EXPORT_SYMBOL(rpmsg_destroy_ept); 314 343 315 - /* 316 - * when an rpmsg driver is probed with a channel, we seamlessly create 317 - * it an endpoint, binding its rx callback to a unique local rpmsg 318 - * address. 319 - * 320 - * if we need to, we also announce about this channel to the remote 321 - * processor (needed in case the driver is exposing an rpmsg service). 322 - */ 323 - static int rpmsg_dev_probe(struct device *dev) 344 + static int virtio_rpmsg_announce_create(struct rpmsg_device *rpdev) 324 345 { 325 - struct rpmsg_channel *rpdev = to_rpmsg_channel(dev); 326 - struct rpmsg_driver *rpdrv = to_rpmsg_driver(rpdev->dev.driver); 327 - struct virtproc_info *vrp = rpdev->vrp; 328 - struct rpmsg_endpoint *ept; 329 - int err; 330 - 331 - ept = rpmsg_create_ept(rpdev, rpdrv->callback, NULL, rpdev->src); 332 - if (!ept) { 333 - dev_err(dev, "failed to create endpoint\n"); 334 - err = -ENOMEM; 335 - goto out; 336 - } 337 - 338 - rpdev->ept = ept; 339 - rpdev->src = ept->addr; 340 - 341 - err = rpdrv->probe(rpdev); 342 - if (err) { 343 - dev_err(dev, "%s: failed: %d\n", __func__, err); 344 - rpmsg_destroy_ept(ept); 345 - goto out; 346 - } 346 + struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(rpdev); 347 + struct virtproc_info *vrp = vch->vrp; 348 + struct device *dev = &rpdev->dev; 349 + int err = 0; 347 350 348 351 /* need to tell remote processor's name service about this channel ? */ 349 352 if (rpdev->announce && 350 - virtio_has_feature(vrp->vdev, VIRTIO_RPMSG_F_NS)) { 353 + virtio_has_feature(vrp->vdev, VIRTIO_RPMSG_F_NS)) { 351 354 struct rpmsg_ns_msg nsm; 352 355 353 356 strncpy(nsm.name, rpdev->id.name, RPMSG_NAME_SIZE); 354 - nsm.addr = rpdev->src; 357 + nsm.addr = rpdev->ept->addr; 355 358 nsm.flags = RPMSG_NS_CREATE; 356 359 357 - err = rpmsg_sendto(rpdev, &nsm, sizeof(nsm), RPMSG_NS_ADDR); 360 + err = rpmsg_sendto(rpdev->ept, &nsm, sizeof(nsm), RPMSG_NS_ADDR); 358 361 if (err) 359 362 dev_err(dev, "failed to announce service %d\n", err); 360 363 } 361 364 362 - out: 363 365 return err; 364 366 } 365 367 366 - static int rpmsg_dev_remove(struct device *dev) 368 + static int virtio_rpmsg_announce_destroy(struct rpmsg_device *rpdev) 367 369 { 368 - struct rpmsg_channel *rpdev = to_rpmsg_channel(dev); 369 - struct rpmsg_driver *rpdrv = to_rpmsg_driver(rpdev->dev.driver); 370 - struct virtproc_info *vrp = rpdev->vrp; 370 + struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(rpdev); 371 + struct virtproc_info *vrp = vch->vrp; 372 + struct device *dev = &rpdev->dev; 371 373 int err = 0; 372 374 373 375 /* tell remote processor's name service we're removing this channel */ 374 376 if (rpdev->announce && 375 - virtio_has_feature(vrp->vdev, VIRTIO_RPMSG_F_NS)) { 377 + virtio_has_feature(vrp->vdev, VIRTIO_RPMSG_F_NS)) { 376 378 struct rpmsg_ns_msg nsm; 377 379 378 380 strncpy(nsm.name, rpdev->id.name, RPMSG_NAME_SIZE); 379 381 nsm.addr = rpdev->src; 380 382 nsm.flags = RPMSG_NS_DESTROY; 381 383 382 - err = rpmsg_sendto(rpdev, &nsm, sizeof(nsm), RPMSG_NS_ADDR); 384 + err = rpmsg_sendto(rpdev->ept, &nsm, sizeof(nsm), RPMSG_NS_ADDR); 383 385 if (err) 384 386 dev_err(dev, "failed to announce service %d\n", err); 385 387 } 386 388 387 - rpdrv->remove(rpdev); 388 - 389 - rpmsg_destroy_ept(rpdev->ept); 390 - 391 389 return err; 392 390 } 393 391 394 - static struct bus_type rpmsg_bus = { 395 - .name = "rpmsg", 396 - .match = rpmsg_dev_match, 397 - .dev_attrs = rpmsg_dev_attrs, 398 - .uevent = rpmsg_uevent, 399 - .probe = rpmsg_dev_probe, 400 - .remove = rpmsg_dev_remove, 392 + static const struct rpmsg_device_ops virtio_rpmsg_ops = { 393 + .create_ept = virtio_rpmsg_create_ept, 394 + .announce_create = virtio_rpmsg_announce_create, 395 + .announce_destroy = virtio_rpmsg_announce_destroy, 401 396 }; 402 - 403 - /** 404 - * __register_rpmsg_driver() - register an rpmsg driver with the rpmsg bus 405 - * @rpdrv: pointer to a struct rpmsg_driver 406 - * @owner: owning module/driver 407 - * 408 - * Returns 0 on success, and an appropriate error value on failure. 409 - */ 410 - int __register_rpmsg_driver(struct rpmsg_driver *rpdrv, struct module *owner) 411 - { 412 - rpdrv->drv.bus = &rpmsg_bus; 413 - rpdrv->drv.owner = owner; 414 - return driver_register(&rpdrv->drv); 415 - } 416 - EXPORT_SYMBOL(__register_rpmsg_driver); 417 - 418 - /** 419 - * unregister_rpmsg_driver() - unregister an rpmsg driver from the rpmsg bus 420 - * @rpdrv: pointer to a struct rpmsg_driver 421 - * 422 - * Returns 0 on success, and an appropriate error value on failure. 423 - */ 424 - void unregister_rpmsg_driver(struct rpmsg_driver *rpdrv) 425 - { 426 - driver_unregister(&rpdrv->drv); 427 - } 428 - EXPORT_SYMBOL(unregister_rpmsg_driver); 429 - 430 - static void rpmsg_release_device(struct device *dev) 431 - { 432 - struct rpmsg_channel *rpdev = to_rpmsg_channel(dev); 433 - 434 - kfree(rpdev); 435 - } 436 - 437 - /* 438 - * match an rpmsg channel with a channel info struct. 439 - * this is used to make sure we're not creating rpmsg devices for channels 440 - * that already exist. 441 - */ 442 - static int rpmsg_channel_match(struct device *dev, void *data) 443 - { 444 - struct rpmsg_channel_info *chinfo = data; 445 - struct rpmsg_channel *rpdev = to_rpmsg_channel(dev); 446 - 447 - if (chinfo->src != RPMSG_ADDR_ANY && chinfo->src != rpdev->src) 448 - return 0; 449 - 450 - if (chinfo->dst != RPMSG_ADDR_ANY && chinfo->dst != rpdev->dst) 451 - return 0; 452 - 453 - if (strncmp(chinfo->name, rpdev->id.name, RPMSG_NAME_SIZE)) 454 - return 0; 455 - 456 - /* found a match ! */ 457 - return 1; 458 - } 459 397 460 398 /* 461 399 * create an rpmsg channel using its name and address info. 462 400 * this function will be used to create both static and dynamic 463 401 * channels. 464 402 */ 465 - static struct rpmsg_channel *rpmsg_create_channel(struct virtproc_info *vrp, 466 - struct rpmsg_channel_info *chinfo) 403 + static struct rpmsg_device *rpmsg_create_channel(struct virtproc_info *vrp, 404 + struct rpmsg_channel_info *chinfo) 467 405 { 468 - struct rpmsg_channel *rpdev; 406 + struct virtio_rpmsg_channel *vch; 407 + struct rpmsg_device *rpdev; 469 408 struct device *tmp, *dev = &vrp->vdev->dev; 470 409 int ret; 471 410 472 411 /* make sure a similar channel doesn't already exist */ 473 - tmp = device_find_child(dev, chinfo, rpmsg_channel_match); 412 + tmp = rpmsg_find_device(dev, chinfo); 474 413 if (tmp) { 475 414 /* decrement the matched device's refcount back */ 476 415 put_device(tmp); ··· 383 514 return NULL; 384 515 } 385 516 386 - rpdev = kzalloc(sizeof(struct rpmsg_channel), GFP_KERNEL); 387 - if (!rpdev) { 388 - pr_err("kzalloc failed\n"); 517 + vch = kzalloc(sizeof(*vch), GFP_KERNEL); 518 + if (!vch) 389 519 return NULL; 390 - } 391 520 392 - rpdev->vrp = vrp; 521 + /* Link the channel to our vrp */ 522 + vch->vrp = vrp; 523 + 524 + /* Assign callbacks for rpmsg_channel */ 525 + vch->rpdev.ops = &virtio_rpmsg_ops; 526 + 527 + /* Assign public information to the rpmsg_device */ 528 + rpdev = &vch->rpdev; 393 529 rpdev->src = chinfo->src; 394 530 rpdev->dst = chinfo->dst; 531 + rpdev->ops = &virtio_rpmsg_ops; 395 532 396 533 /* 397 534 * rpmsg server channels has predefined local address (for now), 398 535 * and their existence needs to be announced remotely 399 536 */ 400 - rpdev->announce = rpdev->src != RPMSG_ADDR_ANY ? true : false; 537 + rpdev->announce = rpdev->src != RPMSG_ADDR_ANY; 401 538 402 539 strncpy(rpdev->id.name, chinfo->name, RPMSG_NAME_SIZE); 403 540 404 - /* very simple device indexing plumbing which is enough for now */ 405 - dev_set_name(&rpdev->dev, "rpmsg%d", rpmsg_dev_index++); 406 - 407 541 rpdev->dev.parent = &vrp->vdev->dev; 408 - rpdev->dev.bus = &rpmsg_bus; 409 - rpdev->dev.release = rpmsg_release_device; 410 - 411 - ret = device_register(&rpdev->dev); 412 - if (ret) { 413 - dev_err(dev, "device_register failed: %d\n", ret); 414 - put_device(&rpdev->dev); 542 + ret = rpmsg_register_device(rpdev); 543 + if (ret) 415 544 return NULL; 416 - } 417 545 418 546 return rpdev; 419 - } 420 - 421 - /* 422 - * find an existing channel using its name + address properties, 423 - * and destroy it 424 - */ 425 - static int rpmsg_destroy_channel(struct virtproc_info *vrp, 426 - struct rpmsg_channel_info *chinfo) 427 - { 428 - struct virtio_device *vdev = vrp->vdev; 429 - struct device *dev; 430 - 431 - dev = device_find_child(&vdev->dev, chinfo, rpmsg_channel_match); 432 - if (!dev) 433 - return -EINVAL; 434 - 435 - device_unregister(dev); 436 - 437 - put_device(dev); 438 - 439 - return 0; 440 547 } 441 548 442 549 /* super simple buffer "allocator" that is just enough for now */ ··· 529 684 * 530 685 * Returns 0 on success and an appropriate error value on failure. 531 686 */ 532 - int rpmsg_send_offchannel_raw(struct rpmsg_channel *rpdev, u32 src, u32 dst, 533 - void *data, int len, bool wait) 687 + static int rpmsg_send_offchannel_raw(struct rpmsg_device *rpdev, 688 + u32 src, u32 dst, 689 + void *data, int len, bool wait) 534 690 { 535 - struct virtproc_info *vrp = rpdev->vrp; 691 + struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(rpdev); 692 + struct virtproc_info *vrp = vch->vrp; 536 693 struct device *dev = &rpdev->dev; 537 694 struct scatterlist sg; 538 695 struct rpmsg_hdr *msg; ··· 598 751 memcpy(msg->data, data, len); 599 752 600 753 dev_dbg(dev, "TX From 0x%x, To 0x%x, Len %d, Flags %d, Reserved %d\n", 601 - msg->src, msg->dst, msg->len, 602 - msg->flags, msg->reserved); 603 - print_hex_dump(KERN_DEBUG, "rpmsg_virtio TX: ", DUMP_PREFIX_NONE, 16, 1, 604 - msg, sizeof(*msg) + msg->len, true); 754 + msg->src, msg->dst, msg->len, msg->flags, msg->reserved); 755 + #if defined(CONFIG_DYNAMIC_DEBUG) 756 + dynamic_hex_dump("rpmsg_virtio TX: ", DUMP_PREFIX_NONE, 16, 1, 757 + msg, sizeof(*msg) + msg->len, true); 758 + #endif 605 759 606 760 sg_init_one(&sg, msg, sizeof(*msg) + len); 607 761 ··· 628 780 } 629 781 EXPORT_SYMBOL(rpmsg_send_offchannel_raw); 630 782 783 + static int virtio_rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len) 784 + { 785 + struct rpmsg_device *rpdev = ept->rpdev; 786 + u32 src = ept->addr, dst = rpdev->dst; 787 + 788 + return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, true); 789 + } 790 + 791 + static int virtio_rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, 792 + u32 dst) 793 + { 794 + struct rpmsg_device *rpdev = ept->rpdev; 795 + u32 src = ept->addr; 796 + 797 + return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, true); 798 + } 799 + 800 + static int virtio_rpmsg_send_offchannel(struct rpmsg_endpoint *ept, u32 src, 801 + u32 dst, void *data, int len) 802 + { 803 + struct rpmsg_device *rpdev = ept->rpdev; 804 + 805 + return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, true); 806 + } 807 + 808 + static int virtio_rpmsg_trysend(struct rpmsg_endpoint *ept, void *data, int len) 809 + { 810 + struct rpmsg_device *rpdev = ept->rpdev; 811 + u32 src = ept->addr, dst = rpdev->dst; 812 + 813 + return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, false); 814 + } 815 + 816 + static int virtio_rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, 817 + int len, u32 dst) 818 + { 819 + struct rpmsg_device *rpdev = ept->rpdev; 820 + u32 src = ept->addr; 821 + 822 + return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, false); 823 + } 824 + 825 + static int virtio_rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, 826 + u32 dst, void *data, int len) 827 + { 828 + struct rpmsg_device *rpdev = ept->rpdev; 829 + 830 + return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, false); 831 + } 832 + 631 833 static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev, 632 834 struct rpmsg_hdr *msg, unsigned int len) 633 835 { ··· 686 788 int err; 687 789 688 790 dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, Reserved: %d\n", 689 - msg->src, msg->dst, msg->len, 690 - msg->flags, msg->reserved); 691 - print_hex_dump(KERN_DEBUG, "rpmsg_virtio RX: ", DUMP_PREFIX_NONE, 16, 1, 692 - msg, sizeof(*msg) + msg->len, true); 791 + msg->src, msg->dst, msg->len, msg->flags, msg->reserved); 792 + #if defined(CONFIG_DYNAMIC_DEBUG) 793 + dynamic_hex_dump("rpmsg_virtio RX: ", DUMP_PREFIX_NONE, 16, 1, 794 + msg, sizeof(*msg) + msg->len, true); 795 + #endif 693 796 694 797 /* 695 798 * We currently use fixed-sized buffers, so trivially sanitize 696 799 * the reported payload length. 697 800 */ 698 801 if (len > RPMSG_BUF_SIZE || 699 - msg->len > (len - sizeof(struct rpmsg_hdr))) { 802 + msg->len > (len - sizeof(struct rpmsg_hdr))) { 700 803 dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, msg->len); 701 804 return -EINVAL; 702 805 } ··· 764 865 msgs_received++; 765 866 766 867 msg = virtqueue_get_buf(rvq, &len); 767 - }; 868 + } 768 869 769 870 dev_dbg(dev, "Received %u messages\n", msgs_received); 770 871 ··· 791 892 } 792 893 793 894 /* invoked when a name service announcement arrives */ 794 - static void rpmsg_ns_cb(struct rpmsg_channel *rpdev, void *data, int len, 795 - void *priv, u32 src) 895 + static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len, 896 + void *priv, u32 src) 796 897 { 797 898 struct rpmsg_ns_msg *msg = data; 798 - struct rpmsg_channel *newch; 899 + struct rpmsg_device *newch; 799 900 struct rpmsg_channel_info chinfo; 800 901 struct virtproc_info *vrp = priv; 801 902 struct device *dev = &vrp->vdev->dev; 802 903 int ret; 803 904 804 - print_hex_dump(KERN_DEBUG, "NS announcement: ", 805 - DUMP_PREFIX_NONE, 16, 1, 806 - data, len, true); 905 + #if defined(CONFIG_DYNAMIC_DEBUG) 906 + dynamic_hex_dump("NS announcement: ", DUMP_PREFIX_NONE, 16, 1, 907 + data, len, true); 908 + #endif 807 909 808 910 if (len != sizeof(*msg)) { 809 911 dev_err(dev, "malformed ns msg (%d)\n", len); 810 - return; 912 + return -EINVAL; 811 913 } 812 914 813 915 /* ··· 819 919 */ 820 920 if (rpdev) { 821 921 dev_err(dev, "anomaly: ns ept has an rpdev handle\n"); 822 - return; 922 + return -EINVAL; 823 923 } 824 924 825 925 /* don't trust the remote processor for null terminating the name */ 826 926 msg->name[RPMSG_NAME_SIZE - 1] = '\0'; 827 927 828 928 dev_info(dev, "%sing channel %s addr 0x%x\n", 829 - msg->flags & RPMSG_NS_DESTROY ? "destroy" : "creat", 830 - msg->name, msg->addr); 929 + msg->flags & RPMSG_NS_DESTROY ? "destroy" : "creat", 930 + msg->name, msg->addr); 831 931 832 932 strncpy(chinfo.name, msg->name, sizeof(chinfo.name)); 833 933 chinfo.src = RPMSG_ADDR_ANY; 834 934 chinfo.dst = msg->addr; 835 935 836 936 if (msg->flags & RPMSG_NS_DESTROY) { 837 - ret = rpmsg_destroy_channel(vrp, &chinfo); 937 + ret = rpmsg_unregister_device(&vrp->vdev->dev, &chinfo); 838 938 if (ret) 839 939 dev_err(dev, "rpmsg_destroy_channel failed: %d\n", ret); 840 940 } else { ··· 842 942 if (!newch) 843 943 dev_err(dev, "rpmsg_create_channel failed\n"); 844 944 } 945 + 946 + return 0; 845 947 } 846 948 847 949 static int rpmsg_probe(struct virtio_device *vdev) ··· 897 995 goto vqs_del; 898 996 } 899 997 900 - dev_dbg(&vdev->dev, "buffers: va %p, dma 0x%llx\n", bufs_va, 901 - (unsigned long long)vrp->bufs_dma); 998 + dev_dbg(&vdev->dev, "buffers: va %p, dma %pad\n", 999 + bufs_va, &vrp->bufs_dma); 902 1000 903 1001 /* half of the buffers is dedicated for RX */ 904 1002 vrp->rbufs = bufs_va; ··· 914 1012 sg_init_one(&sg, cpu_addr, RPMSG_BUF_SIZE); 915 1013 916 1014 err = virtqueue_add_inbuf(vrp->rvq, &sg, 1, cpu_addr, 917 - GFP_KERNEL); 1015 + GFP_KERNEL); 918 1016 WARN_ON(err); /* sanity check; this can't really happen */ 919 1017 } 920 1018 ··· 1021 1119 { 1022 1120 int ret; 1023 1121 1024 - ret = bus_register(&rpmsg_bus); 1025 - if (ret) { 1026 - pr_err("failed to register rpmsg bus: %d\n", ret); 1027 - return ret; 1028 - } 1029 - 1030 1122 ret = register_virtio_driver(&virtio_ipc_driver); 1031 - if (ret) { 1123 + if (ret) 1032 1124 pr_err("failed to register virtio driver: %d\n", ret); 1033 - bus_unregister(&rpmsg_bus); 1034 - } 1035 1125 1036 1126 return ret; 1037 1127 } ··· 1032 1138 static void __exit rpmsg_fini(void) 1033 1139 { 1034 1140 unregister_virtio_driver(&virtio_ipc_driver); 1035 - bus_unregister(&rpmsg_bus); 1036 1141 } 1037 1142 module_exit(rpmsg_fini); 1038 1143
+40 -218
include/linux/rpmsg.h
··· 41 41 #include <linux/kref.h> 42 42 #include <linux/mutex.h> 43 43 44 - /* The feature bitmap for virtio rpmsg */ 45 - #define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */ 46 - 47 - /** 48 - * struct rpmsg_hdr - common header for all rpmsg messages 49 - * @src: source address 50 - * @dst: destination address 51 - * @reserved: reserved for future use 52 - * @len: length of payload (in bytes) 53 - * @flags: message flags 54 - * @data: @len bytes of message payload data 55 - * 56 - * Every message sent(/received) on the rpmsg bus begins with this header. 57 - */ 58 - struct rpmsg_hdr { 59 - u32 src; 60 - u32 dst; 61 - u32 reserved; 62 - u16 len; 63 - u16 flags; 64 - u8 data[0]; 65 - } __packed; 66 - 67 - /** 68 - * struct rpmsg_ns_msg - dynamic name service announcement message 69 - * @name: name of remote service that is published 70 - * @addr: address of remote service that is published 71 - * @flags: indicates whether service is created or destroyed 72 - * 73 - * This message is sent across to publish a new service, or announce 74 - * about its removal. When we receive these messages, an appropriate 75 - * rpmsg channel (i.e device) is created/destroyed. In turn, the ->probe() 76 - * or ->remove() handler of the appropriate rpmsg driver will be invoked 77 - * (if/as-soon-as one is registered). 78 - */ 79 - struct rpmsg_ns_msg { 80 - char name[RPMSG_NAME_SIZE]; 81 - u32 addr; 82 - u32 flags; 83 - } __packed; 84 - 85 - /** 86 - * enum rpmsg_ns_flags - dynamic name service announcement flags 87 - * 88 - * @RPMSG_NS_CREATE: a new remote service was just created 89 - * @RPMSG_NS_DESTROY: a known remote service was just destroyed 90 - */ 91 - enum rpmsg_ns_flags { 92 - RPMSG_NS_CREATE = 0, 93 - RPMSG_NS_DESTROY = 1, 94 - }; 95 - 96 44 #define RPMSG_ADDR_ANY 0xFFFFFFFF 97 45 98 - struct virtproc_info; 46 + struct rpmsg_device; 47 + struct rpmsg_endpoint; 48 + struct rpmsg_device_ops; 49 + struct rpmsg_endpoint_ops; 99 50 100 51 /** 101 - * rpmsg_channel - devices that belong to the rpmsg bus are called channels 102 - * @vrp: the remote processor this channel belongs to 52 + * struct rpmsg_channel_info - channel info representation 53 + * @name: name of service 54 + * @src: local address 55 + * @dst: destination address 56 + */ 57 + struct rpmsg_channel_info { 58 + char name[RPMSG_NAME_SIZE]; 59 + u32 src; 60 + u32 dst; 61 + }; 62 + 63 + /** 64 + * rpmsg_device - device that belong to the rpmsg bus 103 65 * @dev: the device struct 104 66 * @id: device id (used to match between rpmsg drivers and devices) 105 67 * @src: local address ··· 69 107 * @ept: the rpmsg endpoint of this channel 70 108 * @announce: if set, rpmsg will announce the creation/removal of this channel 71 109 */ 72 - struct rpmsg_channel { 73 - struct virtproc_info *vrp; 110 + struct rpmsg_device { 74 111 struct device dev; 75 112 struct rpmsg_device_id id; 76 113 u32 src; 77 114 u32 dst; 78 115 struct rpmsg_endpoint *ept; 79 116 bool announce; 117 + 118 + const struct rpmsg_device_ops *ops; 80 119 }; 81 120 82 - typedef void (*rpmsg_rx_cb_t)(struct rpmsg_channel *, void *, int, void *, u32); 121 + typedef int (*rpmsg_rx_cb_t)(struct rpmsg_device *, void *, int, void *, u32); 83 122 84 123 /** 85 124 * struct rpmsg_endpoint - binds a local rpmsg address to its user ··· 106 143 * create additional endpoints by themselves (see rpmsg_create_ept()). 107 144 */ 108 145 struct rpmsg_endpoint { 109 - struct rpmsg_channel *rpdev; 146 + struct rpmsg_device *rpdev; 110 147 struct kref refcount; 111 148 rpmsg_rx_cb_t cb; 112 149 struct mutex cb_lock; 113 150 u32 addr; 114 151 void *priv; 152 + 153 + const struct rpmsg_endpoint_ops *ops; 115 154 }; 116 155 117 156 /** ··· 127 162 struct rpmsg_driver { 128 163 struct device_driver drv; 129 164 const struct rpmsg_device_id *id_table; 130 - int (*probe)(struct rpmsg_channel *dev); 131 - void (*remove)(struct rpmsg_channel *dev); 132 - void (*callback)(struct rpmsg_channel *, void *, int, void *, u32); 165 + int (*probe)(struct rpmsg_device *dev); 166 + void (*remove)(struct rpmsg_device *dev); 167 + int (*callback)(struct rpmsg_device *, void *, int, void *, u32); 133 168 }; 134 169 135 - int register_rpmsg_device(struct rpmsg_channel *dev); 136 - void unregister_rpmsg_device(struct rpmsg_channel *dev); 170 + int register_rpmsg_device(struct rpmsg_device *dev); 171 + void unregister_rpmsg_device(struct rpmsg_device *dev); 137 172 int __register_rpmsg_driver(struct rpmsg_driver *drv, struct module *owner); 138 173 void unregister_rpmsg_driver(struct rpmsg_driver *drv); 139 174 void rpmsg_destroy_ept(struct rpmsg_endpoint *); 140 - struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_channel *, 141 - rpmsg_rx_cb_t cb, void *priv, u32 addr); 142 - int 143 - rpmsg_send_offchannel_raw(struct rpmsg_channel *, u32, u32, void *, int, bool); 175 + struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *, 176 + rpmsg_rx_cb_t cb, void *priv, 177 + struct rpmsg_channel_info chinfo); 144 178 145 179 /* use a macro to avoid include chaining to get THIS_MODULE */ 146 180 #define register_rpmsg_driver(drv) \ ··· 157 193 module_driver(__rpmsg_driver, register_rpmsg_driver, \ 158 194 unregister_rpmsg_driver) 159 195 160 - /** 161 - * rpmsg_send() - send a message across to the remote processor 162 - * @rpdev: the rpmsg channel 163 - * @data: payload of message 164 - * @len: length of payload 165 - * 166 - * This function sends @data of length @len on the @rpdev channel. 167 - * The message will be sent to the remote processor which the @rpdev 168 - * channel belongs to, using @rpdev's source and destination addresses. 169 - * In case there are no TX buffers available, the function will block until 170 - * one becomes available, or a timeout of 15 seconds elapses. When the latter 171 - * happens, -ERESTARTSYS is returned. 172 - * 173 - * Can only be called from process context (for now). 174 - * 175 - * Returns 0 on success and an appropriate error value on failure. 176 - */ 177 - static inline int rpmsg_send(struct rpmsg_channel *rpdev, void *data, int len) 178 - { 179 - u32 src = rpdev->src, dst = rpdev->dst; 196 + int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len); 197 + int rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst); 198 + int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst, 199 + void *data, int len); 180 200 181 - return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, true); 182 - } 183 - 184 - /** 185 - * rpmsg_sendto() - send a message across to the remote processor, specify dst 186 - * @rpdev: the rpmsg channel 187 - * @data: payload of message 188 - * @len: length of payload 189 - * @dst: destination address 190 - * 191 - * This function sends @data of length @len to the remote @dst address. 192 - * The message will be sent to the remote processor which the @rpdev 193 - * channel belongs to, using @rpdev's source address. 194 - * In case there are no TX buffers available, the function will block until 195 - * one becomes available, or a timeout of 15 seconds elapses. When the latter 196 - * happens, -ERESTARTSYS is returned. 197 - * 198 - * Can only be called from process context (for now). 199 - * 200 - * Returns 0 on success and an appropriate error value on failure. 201 - */ 202 - static inline 203 - int rpmsg_sendto(struct rpmsg_channel *rpdev, void *data, int len, u32 dst) 204 - { 205 - u32 src = rpdev->src; 206 - 207 - return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, true); 208 - } 209 - 210 - /** 211 - * rpmsg_send_offchannel() - send a message using explicit src/dst addresses 212 - * @rpdev: the rpmsg channel 213 - * @src: source address 214 - * @dst: destination address 215 - * @data: payload of message 216 - * @len: length of payload 217 - * 218 - * This function sends @data of length @len to the remote @dst address, 219 - * and uses @src as the source address. 220 - * The message will be sent to the remote processor which the @rpdev 221 - * channel belongs to. 222 - * In case there are no TX buffers available, the function will block until 223 - * one becomes available, or a timeout of 15 seconds elapses. When the latter 224 - * happens, -ERESTARTSYS is returned. 225 - * 226 - * Can only be called from process context (for now). 227 - * 228 - * Returns 0 on success and an appropriate error value on failure. 229 - */ 230 - static inline 231 - int rpmsg_send_offchannel(struct rpmsg_channel *rpdev, u32 src, u32 dst, 232 - void *data, int len) 233 - { 234 - return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, true); 235 - } 236 - 237 - /** 238 - * rpmsg_send() - send a message across to the remote processor 239 - * @rpdev: the rpmsg channel 240 - * @data: payload of message 241 - * @len: length of payload 242 - * 243 - * This function sends @data of length @len on the @rpdev channel. 244 - * The message will be sent to the remote processor which the @rpdev 245 - * channel belongs to, using @rpdev's source and destination addresses. 246 - * In case there are no TX buffers available, the function will immediately 247 - * return -ENOMEM without waiting until one becomes available. 248 - * 249 - * Can only be called from process context (for now). 250 - * 251 - * Returns 0 on success and an appropriate error value on failure. 252 - */ 253 - static inline 254 - int rpmsg_trysend(struct rpmsg_channel *rpdev, void *data, int len) 255 - { 256 - u32 src = rpdev->src, dst = rpdev->dst; 257 - 258 - return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, false); 259 - } 260 - 261 - /** 262 - * rpmsg_sendto() - send a message across to the remote processor, specify dst 263 - * @rpdev: the rpmsg channel 264 - * @data: payload of message 265 - * @len: length of payload 266 - * @dst: destination address 267 - * 268 - * This function sends @data of length @len to the remote @dst address. 269 - * The message will be sent to the remote processor which the @rpdev 270 - * channel belongs to, using @rpdev's source address. 271 - * In case there are no TX buffers available, the function will immediately 272 - * return -ENOMEM without waiting until one becomes available. 273 - * 274 - * Can only be called from process context (for now). 275 - * 276 - * Returns 0 on success and an appropriate error value on failure. 277 - */ 278 - static inline 279 - int rpmsg_trysendto(struct rpmsg_channel *rpdev, void *data, int len, u32 dst) 280 - { 281 - u32 src = rpdev->src; 282 - 283 - return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, false); 284 - } 285 - 286 - /** 287 - * rpmsg_send_offchannel() - send a message using explicit src/dst addresses 288 - * @rpdev: the rpmsg channel 289 - * @src: source address 290 - * @dst: destination address 291 - * @data: payload of message 292 - * @len: length of payload 293 - * 294 - * This function sends @data of length @len to the remote @dst address, 295 - * and uses @src as the source address. 296 - * The message will be sent to the remote processor which the @rpdev 297 - * channel belongs to. 298 - * In case there are no TX buffers available, the function will immediately 299 - * return -ENOMEM without waiting until one becomes available. 300 - * 301 - * Can only be called from process context (for now). 302 - * 303 - * Returns 0 on success and an appropriate error value on failure. 304 - */ 305 - static inline 306 - int rpmsg_trysend_offchannel(struct rpmsg_channel *rpdev, u32 src, u32 dst, 307 - void *data, int len) 308 - { 309 - return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, false); 310 - } 201 + int rpmsg_trysend(struct rpmsg_endpoint *ept, void *data, int len); 202 + int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst); 203 + int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst, 204 + void *data, int len); 311 205 312 206 #endif /* _LINUX_RPMSG_H */
+23 -9
samples/rpmsg/rpmsg_client_sample.c
··· 24 24 #define MSG "hello world!" 25 25 #define MSG_LIMIT 100 26 26 27 - static void rpmsg_sample_cb(struct rpmsg_channel *rpdev, void *data, int len, 27 + struct instance_data { 28 + int rx_count; 29 + }; 30 + 31 + static int rpmsg_sample_cb(struct rpmsg_device *rpdev, void *data, int len, 28 32 void *priv, u32 src) 29 33 { 30 34 int ret; 31 - static int rx_count; 35 + struct instance_data *idata = dev_get_drvdata(&rpdev->dev); 32 36 33 - dev_info(&rpdev->dev, "incoming msg %d (src: 0x%x)\n", ++rx_count, src); 37 + dev_info(&rpdev->dev, "incoming msg %d (src: 0x%x)\n", 38 + ++idata->rx_count, src); 34 39 35 40 print_hex_dump(KERN_DEBUG, __func__, DUMP_PREFIX_NONE, 16, 1, 36 41 data, len, true); 37 42 38 43 /* samples should not live forever */ 39 - if (rx_count >= MSG_LIMIT) { 44 + if (idata->rx_count >= MSG_LIMIT) { 40 45 dev_info(&rpdev->dev, "goodbye!\n"); 41 - return; 46 + return 0; 42 47 } 43 48 44 49 /* send a new message now */ 45 - ret = rpmsg_send(rpdev, MSG, strlen(MSG)); 50 + ret = rpmsg_send(rpdev->ept, MSG, strlen(MSG)); 46 51 if (ret) 47 52 dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret); 53 + 54 + return 0; 48 55 } 49 56 50 - static int rpmsg_sample_probe(struct rpmsg_channel *rpdev) 57 + static int rpmsg_sample_probe(struct rpmsg_device *rpdev) 51 58 { 52 59 int ret; 60 + struct instance_data *idata; 53 61 54 62 dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n", 55 63 rpdev->src, rpdev->dst); 56 64 65 + idata = devm_kzalloc(&rpdev->dev, sizeof(*idata), GFP_KERNEL); 66 + if (!idata) 67 + return -ENOMEM; 68 + 69 + dev_set_drvdata(&rpdev->dev, idata); 70 + 57 71 /* send a message to our remote processor */ 58 - ret = rpmsg_send(rpdev, MSG, strlen(MSG)); 72 + ret = rpmsg_send(rpdev->ept, MSG, strlen(MSG)); 59 73 if (ret) { 60 74 dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret); 61 75 return ret; ··· 78 64 return 0; 79 65 } 80 66 81 - static void rpmsg_sample_remove(struct rpmsg_channel *rpdev) 67 + static void rpmsg_sample_remove(struct rpmsg_device *rpdev) 82 68 { 83 69 dev_info(&rpdev->dev, "rpmsg sample client driver is removed\n"); 84 70 }