qcom_smd.c (41971B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (c) 2015, Sony Mobile Communications AB. 4 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. 5 */ 6 7#include <linux/interrupt.h> 8#include <linux/io.h> 9#include <linux/mailbox_client.h> 10#include <linux/mfd/syscon.h> 11#include <linux/module.h> 12#include <linux/of_irq.h> 13#include <linux/of_platform.h> 14#include <linux/platform_device.h> 15#include <linux/regmap.h> 16#include <linux/sched.h> 17#include <linux/sizes.h> 18#include <linux/slab.h> 19#include <linux/soc/qcom/smem.h> 20#include <linux/wait.h> 21#include <linux/rpmsg.h> 22#include <linux/rpmsg/qcom_smd.h> 23 24#include "rpmsg_internal.h" 25 26/* 27 * The Qualcomm Shared Memory communication solution provides point-to-point 28 * channels for clients to send and receive streaming or packet based data. 29 * 30 * Each channel consists of a control item (channel info) and a ring buffer 31 * pair. The channel info carry information related to channel state, flow 32 * control and the offsets within the ring buffer. 33 * 34 * All allocated channels are listed in an allocation table, identifying the 35 * pair of items by name, type and remote processor. 36 * 37 * Upon creating a new channel the remote processor allocates channel info and 38 * ring buffer items from the smem heap and populate the allocation table. An 39 * interrupt is sent to the other end of the channel and a scan for new 40 * channels should be done. A channel never goes away, it will only change 41 * state. 42 * 43 * The remote processor signals it intent for bring up the communication 44 * channel by setting the state of its end of the channel to "opening" and 45 * sends out an interrupt. We detect this change and register a smd device to 46 * consume the channel. Upon finding a consumer we finish the handshake and the 47 * channel is up. 48 * 49 * Upon closing a channel, the remote processor will update the state of its 50 * end of the channel and signal us, we will then unregister any attached 51 * device and close our end of the channel. 52 * 53 * Devices attached to a channel can use the qcom_smd_send function to push 54 * data to the channel, this is done by copying the data into the tx ring 55 * buffer, updating the pointers in the channel info and signaling the remote 56 * processor. 57 * 58 * The remote processor does the equivalent when it transfer data and upon 59 * receiving the interrupt we check the channel info for new data and delivers 60 * this to the attached device. If the device is not ready to receive the data 61 * we leave it in the ring buffer for now. 62 */ 63 64struct smd_channel_info; 65struct smd_channel_info_pair; 66struct smd_channel_info_word; 67struct smd_channel_info_word_pair; 68 69static const struct rpmsg_endpoint_ops qcom_smd_endpoint_ops; 70 71#define SMD_ALLOC_TBL_COUNT 2 72#define SMD_ALLOC_TBL_SIZE 64 73 74/* 75 * This lists the various smem heap items relevant for the allocation table and 76 * smd channel entries. 77 */ 78static const struct { 79 unsigned alloc_tbl_id; 80 unsigned info_base_id; 81 unsigned fifo_base_id; 82} smem_items[SMD_ALLOC_TBL_COUNT] = { 83 { 84 .alloc_tbl_id = 13, 85 .info_base_id = 14, 86 .fifo_base_id = 338 87 }, 88 { 89 .alloc_tbl_id = 266, 90 .info_base_id = 138, 91 .fifo_base_id = 202, 92 }, 93}; 94 95/** 96 * struct qcom_smd_edge - representing a remote processor 97 * @dev: device associated with this edge 98 * @name: name of this edge 99 * @of_node: of_node handle for information related to this edge 100 * @edge_id: identifier of this edge 101 * @remote_pid: identifier of remote processor 102 * @irq: interrupt for signals on this edge 103 * @ipc_regmap: regmap handle holding the outgoing ipc register 104 * @ipc_offset: offset within @ipc_regmap of the register for ipc 105 * @ipc_bit: bit in the register at @ipc_offset of @ipc_regmap 106 * @mbox_client: mailbox client handle 107 * @mbox_chan: apcs ipc mailbox channel handle 108 * @channels: list of all channels detected on this edge 109 * @channels_lock: guard for modifications of @channels 110 * @allocated: array of bitmaps representing already allocated channels 111 * @smem_available: last available amount of smem triggering a channel scan 112 * @new_channel_event: wait queue for new channel events 113 * @scan_work: work item for discovering new channels 114 * @state_work: work item for edge state changes 115 */ 116struct qcom_smd_edge { 117 struct device dev; 118 119 const char *name; 120 121 struct device_node *of_node; 122 unsigned edge_id; 123 unsigned remote_pid; 124 125 int irq; 126 127 struct regmap *ipc_regmap; 128 int ipc_offset; 129 int ipc_bit; 130 131 struct mbox_client mbox_client; 132 struct mbox_chan *mbox_chan; 133 134 struct list_head channels; 135 spinlock_t channels_lock; 136 137 DECLARE_BITMAP(allocated[SMD_ALLOC_TBL_COUNT], SMD_ALLOC_TBL_SIZE); 138 139 unsigned smem_available; 140 141 wait_queue_head_t new_channel_event; 142 143 struct work_struct scan_work; 144 struct work_struct state_work; 145}; 146 147/* 148 * SMD channel states. 149 */ 150enum smd_channel_state { 151 SMD_CHANNEL_CLOSED, 152 SMD_CHANNEL_OPENING, 153 SMD_CHANNEL_OPENED, 154 SMD_CHANNEL_FLUSHING, 155 SMD_CHANNEL_CLOSING, 156 SMD_CHANNEL_RESET, 157 SMD_CHANNEL_RESET_OPENING 158}; 159 160struct qcom_smd_device { 161 struct rpmsg_device rpdev; 162 163 struct qcom_smd_edge *edge; 164}; 165 166struct qcom_smd_endpoint { 167 struct rpmsg_endpoint ept; 168 169 struct qcom_smd_channel *qsch; 170}; 171 172#define to_smd_device(r) container_of(r, struct qcom_smd_device, rpdev) 173#define to_smd_edge(d) container_of(d, struct qcom_smd_edge, dev) 174#define to_smd_endpoint(e) container_of(e, struct qcom_smd_endpoint, ept) 175 176/** 177 * struct qcom_smd_channel - smd channel struct 178 * @edge: qcom_smd_edge this channel is living on 179 * @qsept: reference to a associated smd endpoint 180 * @registered: flag to indicate if the channel is registered 181 * @name: name of the channel 182 * @state: local state of the channel 183 * @remote_state: remote state of the channel 184 * @state_change_event: state change event 185 * @info: byte aligned outgoing/incoming channel info 186 * @info_word: word aligned outgoing/incoming channel info 187 * @tx_lock: lock to make writes to the channel mutually exclusive 188 * @fblockread_event: wakeup event tied to tx fBLOCKREADINTR 189 * @tx_fifo: pointer to the outgoing ring buffer 190 * @rx_fifo: pointer to the incoming ring buffer 191 * @fifo_size: size of each ring buffer 192 * @bounce_buffer: bounce buffer for reading wrapped packets 193 * @cb: callback function registered for this channel 194 * @recv_lock: guard for rx info modifications and cb pointer 195 * @pkt_size: size of the currently handled packet 196 * @drvdata: driver private data 197 * @list: lite entry for @channels in qcom_smd_edge 198 */ 199struct qcom_smd_channel { 200 struct qcom_smd_edge *edge; 201 202 struct qcom_smd_endpoint *qsept; 203 bool registered; 204 205 char *name; 206 enum smd_channel_state state; 207 enum smd_channel_state remote_state; 208 wait_queue_head_t state_change_event; 209 210 struct smd_channel_info_pair *info; 211 struct smd_channel_info_word_pair *info_word; 212 213 spinlock_t tx_lock; 214 wait_queue_head_t fblockread_event; 215 216 void *tx_fifo; 217 void *rx_fifo; 218 int fifo_size; 219 220 void *bounce_buffer; 221 222 spinlock_t recv_lock; 223 224 int pkt_size; 225 226 void *drvdata; 227 228 struct list_head list; 229}; 230 231/* 232 * Format of the smd_info smem items, for byte aligned channels. 233 */ 234struct smd_channel_info { 235 __le32 state; 236 u8 fDSR; 237 u8 fCTS; 238 u8 fCD; 239 u8 fRI; 240 u8 fHEAD; 241 u8 fTAIL; 242 u8 fSTATE; 243 u8 fBLOCKREADINTR; 244 __le32 tail; 245 __le32 head; 246}; 247 248struct smd_channel_info_pair { 249 struct smd_channel_info tx; 250 struct smd_channel_info rx; 251}; 252 253/* 254 * Format of the smd_info smem items, for word aligned channels. 255 */ 256struct smd_channel_info_word { 257 __le32 state; 258 __le32 fDSR; 259 __le32 fCTS; 260 __le32 fCD; 261 __le32 fRI; 262 __le32 fHEAD; 263 __le32 fTAIL; 264 __le32 fSTATE; 265 __le32 fBLOCKREADINTR; 266 __le32 tail; 267 __le32 head; 268}; 269 270struct smd_channel_info_word_pair { 271 struct smd_channel_info_word tx; 272 struct smd_channel_info_word rx; 273}; 274 275#define GET_RX_CHANNEL_FLAG(channel, param) \ 276 ({ \ 277 BUILD_BUG_ON(sizeof(channel->info->rx.param) != sizeof(u8)); \ 278 channel->info_word ? \ 279 le32_to_cpu(channel->info_word->rx.param) : \ 280 channel->info->rx.param; \ 281 }) 282 283#define GET_RX_CHANNEL_INFO(channel, param) \ 284 ({ \ 285 BUILD_BUG_ON(sizeof(channel->info->rx.param) != sizeof(u32)); \ 286 le32_to_cpu(channel->info_word ? \ 287 channel->info_word->rx.param : \ 288 channel->info->rx.param); \ 289 }) 290 291#define SET_RX_CHANNEL_FLAG(channel, param, value) \ 292 ({ \ 293 BUILD_BUG_ON(sizeof(channel->info->rx.param) != sizeof(u8)); \ 294 if (channel->info_word) \ 295 channel->info_word->rx.param = cpu_to_le32(value); \ 296 else \ 297 channel->info->rx.param = value; \ 298 }) 299 300#define SET_RX_CHANNEL_INFO(channel, param, value) \ 301 ({ \ 302 BUILD_BUG_ON(sizeof(channel->info->rx.param) != sizeof(u32)); \ 303 if (channel->info_word) \ 304 channel->info_word->rx.param = cpu_to_le32(value); \ 305 else \ 306 channel->info->rx.param = cpu_to_le32(value); \ 307 }) 308 309#define GET_TX_CHANNEL_FLAG(channel, param) \ 310 ({ \ 311 BUILD_BUG_ON(sizeof(channel->info->tx.param) != sizeof(u8)); \ 312 channel->info_word ? \ 313 le32_to_cpu(channel->info_word->tx.param) : \ 314 channel->info->tx.param; \ 315 }) 316 317#define GET_TX_CHANNEL_INFO(channel, param) \ 318 ({ \ 319 BUILD_BUG_ON(sizeof(channel->info->tx.param) != sizeof(u32)); \ 320 le32_to_cpu(channel->info_word ? \ 321 channel->info_word->tx.param : \ 322 channel->info->tx.param); \ 323 }) 324 325#define SET_TX_CHANNEL_FLAG(channel, param, value) \ 326 ({ \ 327 BUILD_BUG_ON(sizeof(channel->info->tx.param) != sizeof(u8)); \ 328 if (channel->info_word) \ 329 channel->info_word->tx.param = cpu_to_le32(value); \ 330 else \ 331 channel->info->tx.param = value; \ 332 }) 333 334#define SET_TX_CHANNEL_INFO(channel, param, value) \ 335 ({ \ 336 BUILD_BUG_ON(sizeof(channel->info->tx.param) != sizeof(u32)); \ 337 if (channel->info_word) \ 338 channel->info_word->tx.param = cpu_to_le32(value); \ 339 else \ 340 channel->info->tx.param = cpu_to_le32(value); \ 341 }) 342 343/** 344 * struct qcom_smd_alloc_entry - channel allocation entry 345 * @name: channel name 346 * @cid: channel index 347 * @flags: channel flags and edge id 348 * @ref_count: reference count of the channel 349 */ 350struct qcom_smd_alloc_entry { 351 u8 name[20]; 352 __le32 cid; 353 __le32 flags; 354 __le32 ref_count; 355} __packed; 356 357#define SMD_CHANNEL_FLAGS_EDGE_MASK 0xff 358#define SMD_CHANNEL_FLAGS_STREAM BIT(8) 359#define SMD_CHANNEL_FLAGS_PACKET BIT(9) 360 361/* 362 * Each smd packet contains a 20 byte header, with the first 4 being the length 363 * of the packet. 364 */ 365#define SMD_PACKET_HEADER_LEN 20 366 367/* 368 * Signal the remote processor associated with 'channel'. 369 */ 370static void qcom_smd_signal_channel(struct qcom_smd_channel *channel) 371{ 372 struct qcom_smd_edge *edge = channel->edge; 373 374 if (edge->mbox_chan) { 375 /* 376 * We can ignore a failing mbox_send_message() as the only 377 * possible cause is that the FIFO in the framework is full of 378 * other writes to the same bit. 379 */ 380 mbox_send_message(edge->mbox_chan, NULL); 381 mbox_client_txdone(edge->mbox_chan, 0); 382 } else { 383 regmap_write(edge->ipc_regmap, edge->ipc_offset, BIT(edge->ipc_bit)); 384 } 385} 386 387/* 388 * Initialize the tx channel info 389 */ 390static void qcom_smd_channel_reset(struct qcom_smd_channel *channel) 391{ 392 SET_TX_CHANNEL_INFO(channel, state, SMD_CHANNEL_CLOSED); 393 SET_TX_CHANNEL_FLAG(channel, fDSR, 0); 394 SET_TX_CHANNEL_FLAG(channel, fCTS, 0); 395 SET_TX_CHANNEL_FLAG(channel, fCD, 0); 396 SET_TX_CHANNEL_FLAG(channel, fRI, 0); 397 SET_TX_CHANNEL_FLAG(channel, fHEAD, 0); 398 SET_TX_CHANNEL_FLAG(channel, fTAIL, 0); 399 SET_TX_CHANNEL_FLAG(channel, fSTATE, 1); 400 SET_TX_CHANNEL_FLAG(channel, fBLOCKREADINTR, 1); 401 SET_TX_CHANNEL_INFO(channel, head, 0); 402 SET_RX_CHANNEL_INFO(channel, tail, 0); 403 404 qcom_smd_signal_channel(channel); 405 406 channel->state = SMD_CHANNEL_CLOSED; 407 channel->pkt_size = 0; 408} 409 410/* 411 * Set the callback for a channel, with appropriate locking 412 */ 413static void qcom_smd_channel_set_callback(struct qcom_smd_channel *channel, 414 rpmsg_rx_cb_t cb) 415{ 416 struct rpmsg_endpoint *ept = &channel->qsept->ept; 417 unsigned long flags; 418 419 spin_lock_irqsave(&channel->recv_lock, flags); 420 ept->cb = cb; 421 spin_unlock_irqrestore(&channel->recv_lock, flags); 422}; 423 424/* 425 * Calculate the amount of data available in the rx fifo 426 */ 427static size_t qcom_smd_channel_get_rx_avail(struct qcom_smd_channel *channel) 428{ 429 unsigned head; 430 unsigned tail; 431 432 head = GET_RX_CHANNEL_INFO(channel, head); 433 tail = GET_RX_CHANNEL_INFO(channel, tail); 434 435 return (head - tail) & (channel->fifo_size - 1); 436} 437 438/* 439 * Set tx channel state and inform the remote processor 440 */ 441static void qcom_smd_channel_set_state(struct qcom_smd_channel *channel, 442 int state) 443{ 444 struct qcom_smd_edge *edge = channel->edge; 445 bool is_open = state == SMD_CHANNEL_OPENED; 446 447 if (channel->state == state) 448 return; 449 450 dev_dbg(&edge->dev, "set_state(%s, %d)\n", channel->name, state); 451 452 SET_TX_CHANNEL_FLAG(channel, fDSR, is_open); 453 SET_TX_CHANNEL_FLAG(channel, fCTS, is_open); 454 SET_TX_CHANNEL_FLAG(channel, fCD, is_open); 455 456 SET_TX_CHANNEL_INFO(channel, state, state); 457 SET_TX_CHANNEL_FLAG(channel, fSTATE, 1); 458 459 channel->state = state; 460 qcom_smd_signal_channel(channel); 461} 462 463/* 464 * Copy count bytes of data using 32bit accesses, if that's required. 465 */ 466static void smd_copy_to_fifo(void __iomem *dst, 467 const void *src, 468 size_t count, 469 bool word_aligned) 470{ 471 if (word_aligned) { 472 __iowrite32_copy(dst, src, count / sizeof(u32)); 473 } else { 474 memcpy_toio(dst, src, count); 475 } 476} 477 478/* 479 * Copy count bytes of data using 32bit accesses, if that is required. 480 */ 481static void smd_copy_from_fifo(void *dst, 482 const void __iomem *src, 483 size_t count, 484 bool word_aligned) 485{ 486 if (word_aligned) { 487 __ioread32_copy(dst, src, count / sizeof(u32)); 488 } else { 489 memcpy_fromio(dst, src, count); 490 } 491} 492 493/* 494 * Read count bytes of data from the rx fifo into buf, but don't advance the 495 * tail. 496 */ 497static size_t qcom_smd_channel_peek(struct qcom_smd_channel *channel, 498 void *buf, size_t count) 499{ 500 bool word_aligned; 501 unsigned tail; 502 size_t len; 503 504 word_aligned = channel->info_word; 505 tail = GET_RX_CHANNEL_INFO(channel, tail); 506 507 len = min_t(size_t, count, channel->fifo_size - tail); 508 if (len) { 509 smd_copy_from_fifo(buf, 510 channel->rx_fifo + tail, 511 len, 512 word_aligned); 513 } 514 515 if (len != count) { 516 smd_copy_from_fifo(buf + len, 517 channel->rx_fifo, 518 count - len, 519 word_aligned); 520 } 521 522 return count; 523} 524 525/* 526 * Advance the rx tail by count bytes. 527 */ 528static void qcom_smd_channel_advance(struct qcom_smd_channel *channel, 529 size_t count) 530{ 531 unsigned tail; 532 533 tail = GET_RX_CHANNEL_INFO(channel, tail); 534 tail += count; 535 tail &= (channel->fifo_size - 1); 536 SET_RX_CHANNEL_INFO(channel, tail, tail); 537} 538 539/* 540 * Read out a single packet from the rx fifo and deliver it to the device 541 */ 542static int qcom_smd_channel_recv_single(struct qcom_smd_channel *channel) 543{ 544 struct rpmsg_endpoint *ept = &channel->qsept->ept; 545 unsigned tail; 546 size_t len; 547 void *ptr; 548 int ret; 549 550 tail = GET_RX_CHANNEL_INFO(channel, tail); 551 552 /* Use bounce buffer if the data wraps */ 553 if (tail + channel->pkt_size >= channel->fifo_size) { 554 ptr = channel->bounce_buffer; 555 len = qcom_smd_channel_peek(channel, ptr, channel->pkt_size); 556 } else { 557 ptr = channel->rx_fifo + tail; 558 len = channel->pkt_size; 559 } 560 561 ret = ept->cb(ept->rpdev, ptr, len, ept->priv, RPMSG_ADDR_ANY); 562 if (ret < 0) 563 return ret; 564 565 /* Only forward the tail if the client consumed the data */ 566 qcom_smd_channel_advance(channel, len); 567 568 channel->pkt_size = 0; 569 570 return 0; 571} 572 573/* 574 * Per channel interrupt handling 575 */ 576static bool qcom_smd_channel_intr(struct qcom_smd_channel *channel) 577{ 578 bool need_state_scan = false; 579 int remote_state; 580 __le32 pktlen; 581 int avail; 582 int ret; 583 584 /* Handle state changes */ 585 remote_state = GET_RX_CHANNEL_INFO(channel, state); 586 if (remote_state != channel->remote_state) { 587 channel->remote_state = remote_state; 588 need_state_scan = true; 589 590 wake_up_interruptible_all(&channel->state_change_event); 591 } 592 /* Indicate that we have seen any state change */ 593 SET_RX_CHANNEL_FLAG(channel, fSTATE, 0); 594 595 /* Signal waiting qcom_smd_send() about the interrupt */ 596 if (!GET_TX_CHANNEL_FLAG(channel, fBLOCKREADINTR)) 597 wake_up_interruptible_all(&channel->fblockread_event); 598 599 /* Don't consume any data until we've opened the channel */ 600 if (channel->state != SMD_CHANNEL_OPENED) 601 goto out; 602 603 /* Indicate that we've seen the new data */ 604 SET_RX_CHANNEL_FLAG(channel, fHEAD, 0); 605 606 /* Consume data */ 607 for (;;) { 608 avail = qcom_smd_channel_get_rx_avail(channel); 609 610 if (!channel->pkt_size && avail >= SMD_PACKET_HEADER_LEN) { 611 qcom_smd_channel_peek(channel, &pktlen, sizeof(pktlen)); 612 qcom_smd_channel_advance(channel, SMD_PACKET_HEADER_LEN); 613 channel->pkt_size = le32_to_cpu(pktlen); 614 } else if (channel->pkt_size && avail >= channel->pkt_size) { 615 ret = qcom_smd_channel_recv_single(channel); 616 if (ret) 617 break; 618 } else { 619 break; 620 } 621 } 622 623 /* Indicate that we have seen and updated tail */ 624 SET_RX_CHANNEL_FLAG(channel, fTAIL, 1); 625 626 /* Signal the remote that we've consumed the data (if requested) */ 627 if (!GET_RX_CHANNEL_FLAG(channel, fBLOCKREADINTR)) { 628 /* Ensure ordering of channel info updates */ 629 wmb(); 630 631 qcom_smd_signal_channel(channel); 632 } 633 634out: 635 return need_state_scan; 636} 637 638/* 639 * The edge interrupts are triggered by the remote processor on state changes, 640 * channel info updates or when new channels are created. 641 */ 642static irqreturn_t qcom_smd_edge_intr(int irq, void *data) 643{ 644 struct qcom_smd_edge *edge = data; 645 struct qcom_smd_channel *channel; 646 unsigned available; 647 bool kick_scanner = false; 648 bool kick_state = false; 649 650 /* 651 * Handle state changes or data on each of the channels on this edge 652 */ 653 spin_lock(&edge->channels_lock); 654 list_for_each_entry(channel, &edge->channels, list) { 655 spin_lock(&channel->recv_lock); 656 kick_state |= qcom_smd_channel_intr(channel); 657 spin_unlock(&channel->recv_lock); 658 } 659 spin_unlock(&edge->channels_lock); 660 661 /* 662 * Creating a new channel requires allocating an smem entry, so we only 663 * have to scan if the amount of available space in smem have changed 664 * since last scan. 665 */ 666 available = qcom_smem_get_free_space(edge->remote_pid); 667 if (available != edge->smem_available) { 668 edge->smem_available = available; 669 kick_scanner = true; 670 } 671 672 if (kick_scanner) 673 schedule_work(&edge->scan_work); 674 if (kick_state) 675 schedule_work(&edge->state_work); 676 677 return IRQ_HANDLED; 678} 679 680/* 681 * Calculate how much space is available in the tx fifo. 682 */ 683static size_t qcom_smd_get_tx_avail(struct qcom_smd_channel *channel) 684{ 685 unsigned head; 686 unsigned tail; 687 unsigned mask = channel->fifo_size - 1; 688 689 head = GET_TX_CHANNEL_INFO(channel, head); 690 tail = GET_TX_CHANNEL_INFO(channel, tail); 691 692 return mask - ((head - tail) & mask); 693} 694 695/* 696 * Write count bytes of data into channel, possibly wrapping in the ring buffer 697 */ 698static int qcom_smd_write_fifo(struct qcom_smd_channel *channel, 699 const void *data, 700 size_t count) 701{ 702 bool word_aligned; 703 unsigned head; 704 size_t len; 705 706 word_aligned = channel->info_word; 707 head = GET_TX_CHANNEL_INFO(channel, head); 708 709 len = min_t(size_t, count, channel->fifo_size - head); 710 if (len) { 711 smd_copy_to_fifo(channel->tx_fifo + head, 712 data, 713 len, 714 word_aligned); 715 } 716 717 if (len != count) { 718 smd_copy_to_fifo(channel->tx_fifo, 719 data + len, 720 count - len, 721 word_aligned); 722 } 723 724 head += count; 725 head &= (channel->fifo_size - 1); 726 SET_TX_CHANNEL_INFO(channel, head, head); 727 728 return count; 729} 730 731/** 732 * qcom_smd_send - write data to smd channel 733 * @channel: channel handle 734 * @data: buffer of data to write 735 * @len: number of bytes to write 736 * @wait: flag to indicate if write has ca wait 737 * 738 * This is a blocking write of len bytes into the channel's tx ring buffer and 739 * signal the remote end. It will sleep until there is enough space available 740 * in the tx buffer, utilizing the fBLOCKREADINTR signaling mechanism to avoid 741 * polling. 742 */ 743static int __qcom_smd_send(struct qcom_smd_channel *channel, const void *data, 744 int len, bool wait) 745{ 746 __le32 hdr[5] = { cpu_to_le32(len), }; 747 int tlen = sizeof(hdr) + len; 748 unsigned long flags; 749 int ret; 750 751 /* Word aligned channels only accept word size aligned data */ 752 if (channel->info_word && len % 4) 753 return -EINVAL; 754 755 /* Reject packets that are too big */ 756 if (tlen >= channel->fifo_size) 757 return -EINVAL; 758 759 /* Highlight the fact that if we enter the loop below we might sleep */ 760 if (wait) 761 might_sleep(); 762 763 spin_lock_irqsave(&channel->tx_lock, flags); 764 765 while (qcom_smd_get_tx_avail(channel) < tlen && 766 channel->state == SMD_CHANNEL_OPENED) { 767 if (!wait) { 768 ret = -EAGAIN; 769 goto out_unlock; 770 } 771 772 SET_TX_CHANNEL_FLAG(channel, fBLOCKREADINTR, 0); 773 774 /* Wait without holding the tx_lock */ 775 spin_unlock_irqrestore(&channel->tx_lock, flags); 776 777 ret = wait_event_interruptible(channel->fblockread_event, 778 qcom_smd_get_tx_avail(channel) >= tlen || 779 channel->state != SMD_CHANNEL_OPENED); 780 if (ret) 781 return ret; 782 783 spin_lock_irqsave(&channel->tx_lock, flags); 784 785 SET_TX_CHANNEL_FLAG(channel, fBLOCKREADINTR, 1); 786 } 787 788 /* Fail if the channel was closed */ 789 if (channel->state != SMD_CHANNEL_OPENED) { 790 ret = -EPIPE; 791 goto out_unlock; 792 } 793 794 SET_TX_CHANNEL_FLAG(channel, fTAIL, 0); 795 796 qcom_smd_write_fifo(channel, hdr, sizeof(hdr)); 797 qcom_smd_write_fifo(channel, data, len); 798 799 SET_TX_CHANNEL_FLAG(channel, fHEAD, 1); 800 801 /* Ensure ordering of channel info updates */ 802 wmb(); 803 804 qcom_smd_signal_channel(channel); 805 806out_unlock: 807 spin_unlock_irqrestore(&channel->tx_lock, flags); 808 809 return ret; 810} 811 812/* 813 * Helper for opening a channel 814 */ 815static int qcom_smd_channel_open(struct qcom_smd_channel *channel, 816 rpmsg_rx_cb_t cb) 817{ 818 struct qcom_smd_edge *edge = channel->edge; 819 size_t bb_size; 820 int ret; 821 822 /* 823 * Packets are maximum 4k, but reduce if the fifo is smaller 824 */ 825 bb_size = min(channel->fifo_size, SZ_4K); 826 channel->bounce_buffer = kmalloc(bb_size, GFP_KERNEL); 827 if (!channel->bounce_buffer) 828 return -ENOMEM; 829 830 qcom_smd_channel_set_callback(channel, cb); 831 qcom_smd_channel_set_state(channel, SMD_CHANNEL_OPENING); 832 833 /* Wait for remote to enter opening or opened */ 834 ret = wait_event_interruptible_timeout(channel->state_change_event, 835 channel->remote_state == SMD_CHANNEL_OPENING || 836 channel->remote_state == SMD_CHANNEL_OPENED, 837 HZ); 838 if (!ret) { 839 dev_err(&edge->dev, "remote side did not enter opening state\n"); 840 goto out_close_timeout; 841 } 842 843 qcom_smd_channel_set_state(channel, SMD_CHANNEL_OPENED); 844 845 /* Wait for remote to enter opened */ 846 ret = wait_event_interruptible_timeout(channel->state_change_event, 847 channel->remote_state == SMD_CHANNEL_OPENED, 848 HZ); 849 if (!ret) { 850 dev_err(&edge->dev, "remote side did not enter open state\n"); 851 goto out_close_timeout; 852 } 853 854 return 0; 855 856out_close_timeout: 857 qcom_smd_channel_set_state(channel, SMD_CHANNEL_CLOSED); 858 return -ETIMEDOUT; 859} 860 861/* 862 * Helper for closing and resetting a channel 863 */ 864static void qcom_smd_channel_close(struct qcom_smd_channel *channel) 865{ 866 qcom_smd_channel_set_callback(channel, NULL); 867 868 kfree(channel->bounce_buffer); 869 channel->bounce_buffer = NULL; 870 871 qcom_smd_channel_set_state(channel, SMD_CHANNEL_CLOSED); 872 qcom_smd_channel_reset(channel); 873} 874 875static struct qcom_smd_channel * 876qcom_smd_find_channel(struct qcom_smd_edge *edge, const char *name) 877{ 878 struct qcom_smd_channel *channel; 879 struct qcom_smd_channel *ret = NULL; 880 unsigned long flags; 881 882 spin_lock_irqsave(&edge->channels_lock, flags); 883 list_for_each_entry(channel, &edge->channels, list) { 884 if (!strcmp(channel->name, name)) { 885 ret = channel; 886 break; 887 } 888 } 889 spin_unlock_irqrestore(&edge->channels_lock, flags); 890 891 return ret; 892} 893 894static void __ept_release(struct kref *kref) 895{ 896 struct rpmsg_endpoint *ept = container_of(kref, struct rpmsg_endpoint, 897 refcount); 898 kfree(to_smd_endpoint(ept)); 899} 900 901static struct rpmsg_endpoint *qcom_smd_create_ept(struct rpmsg_device *rpdev, 902 rpmsg_rx_cb_t cb, void *priv, 903 struct rpmsg_channel_info chinfo) 904{ 905 struct qcom_smd_endpoint *qsept; 906 struct qcom_smd_channel *channel; 907 struct qcom_smd_device *qsdev = to_smd_device(rpdev); 908 struct qcom_smd_edge *edge = qsdev->edge; 909 struct rpmsg_endpoint *ept; 910 const char *name = chinfo.name; 911 int ret; 912 913 /* Wait up to HZ for the channel to appear */ 914 ret = wait_event_interruptible_timeout(edge->new_channel_event, 915 (channel = qcom_smd_find_channel(edge, name)) != NULL, 916 HZ); 917 if (!ret) 918 return NULL; 919 920 if (channel->state != SMD_CHANNEL_CLOSED) { 921 dev_err(&rpdev->dev, "channel %s is busy\n", channel->name); 922 return NULL; 923 } 924 925 qsept = kzalloc(sizeof(*qsept), GFP_KERNEL); 926 if (!qsept) 927 return NULL; 928 929 ept = &qsept->ept; 930 931 kref_init(&ept->refcount); 932 933 ept->rpdev = rpdev; 934 ept->cb = cb; 935 ept->priv = priv; 936 ept->ops = &qcom_smd_endpoint_ops; 937 938 channel->qsept = qsept; 939 qsept->qsch = channel; 940 941 ret = qcom_smd_channel_open(channel, cb); 942 if (ret) 943 goto free_ept; 944 945 return ept; 946 947free_ept: 948 channel->qsept = NULL; 949 kref_put(&ept->refcount, __ept_release); 950 return NULL; 951} 952 953static void qcom_smd_destroy_ept(struct rpmsg_endpoint *ept) 954{ 955 struct qcom_smd_endpoint *qsept = to_smd_endpoint(ept); 956 struct qcom_smd_channel *ch = qsept->qsch; 957 958 qcom_smd_channel_close(ch); 959 ch->qsept = NULL; 960 kref_put(&ept->refcount, __ept_release); 961} 962 963static int qcom_smd_send(struct rpmsg_endpoint *ept, void *data, int len) 964{ 965 struct qcom_smd_endpoint *qsept = to_smd_endpoint(ept); 966 967 return __qcom_smd_send(qsept->qsch, data, len, true); 968} 969 970static int qcom_smd_trysend(struct rpmsg_endpoint *ept, void *data, int len) 971{ 972 struct qcom_smd_endpoint *qsept = to_smd_endpoint(ept); 973 974 return __qcom_smd_send(qsept->qsch, data, len, false); 975} 976 977static int qcom_smd_sendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst) 978{ 979 struct qcom_smd_endpoint *qsept = to_smd_endpoint(ept); 980 981 return __qcom_smd_send(qsept->qsch, data, len, true); 982} 983 984static int qcom_smd_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst) 985{ 986 struct qcom_smd_endpoint *qsept = to_smd_endpoint(ept); 987 988 return __qcom_smd_send(qsept->qsch, data, len, false); 989} 990 991static __poll_t qcom_smd_poll(struct rpmsg_endpoint *ept, 992 struct file *filp, poll_table *wait) 993{ 994 struct qcom_smd_endpoint *qsept = to_smd_endpoint(ept); 995 struct qcom_smd_channel *channel = qsept->qsch; 996 __poll_t mask = 0; 997 998 poll_wait(filp, &channel->fblockread_event, wait); 999 1000 if (qcom_smd_get_tx_avail(channel) > 20) 1001 mask |= EPOLLOUT | EPOLLWRNORM; 1002 1003 return mask; 1004} 1005 1006/* 1007 * Finds the device_node for the smd child interested in this channel. 1008 */ 1009static struct device_node *qcom_smd_match_channel(struct device_node *edge_node, 1010 const char *channel) 1011{ 1012 struct device_node *child; 1013 const char *name; 1014 const char *key; 1015 int ret; 1016 1017 for_each_available_child_of_node(edge_node, child) { 1018 key = "qcom,smd-channels"; 1019 ret = of_property_read_string(child, key, &name); 1020 if (ret) 1021 continue; 1022 1023 if (strcmp(name, channel) == 0) 1024 return child; 1025 } 1026 1027 return NULL; 1028} 1029 1030static int qcom_smd_announce_create(struct rpmsg_device *rpdev) 1031{ 1032 struct qcom_smd_endpoint *qept = to_smd_endpoint(rpdev->ept); 1033 struct qcom_smd_channel *channel = qept->qsch; 1034 unsigned long flags; 1035 bool kick_state; 1036 1037 spin_lock_irqsave(&channel->recv_lock, flags); 1038 kick_state = qcom_smd_channel_intr(channel); 1039 spin_unlock_irqrestore(&channel->recv_lock, flags); 1040 1041 if (kick_state) 1042 schedule_work(&channel->edge->state_work); 1043 1044 return 0; 1045} 1046 1047static const struct rpmsg_device_ops qcom_smd_device_ops = { 1048 .create_ept = qcom_smd_create_ept, 1049 .announce_create = qcom_smd_announce_create, 1050}; 1051 1052static const struct rpmsg_endpoint_ops qcom_smd_endpoint_ops = { 1053 .destroy_ept = qcom_smd_destroy_ept, 1054 .send = qcom_smd_send, 1055 .sendto = qcom_smd_sendto, 1056 .trysend = qcom_smd_trysend, 1057 .trysendto = qcom_smd_trysendto, 1058 .poll = qcom_smd_poll, 1059}; 1060 1061static void qcom_smd_release_device(struct device *dev) 1062{ 1063 struct rpmsg_device *rpdev = to_rpmsg_device(dev); 1064 struct qcom_smd_device *qsdev = to_smd_device(rpdev); 1065 1066 kfree(qsdev); 1067} 1068 1069/* 1070 * Create a smd client device for channel that is being opened. 1071 */ 1072static int qcom_smd_create_device(struct qcom_smd_channel *channel) 1073{ 1074 struct qcom_smd_device *qsdev; 1075 struct rpmsg_device *rpdev; 1076 struct qcom_smd_edge *edge = channel->edge; 1077 1078 dev_dbg(&edge->dev, "registering '%s'\n", channel->name); 1079 1080 qsdev = kzalloc(sizeof(*qsdev), GFP_KERNEL); 1081 if (!qsdev) 1082 return -ENOMEM; 1083 1084 /* Link qsdev to our SMD edge */ 1085 qsdev->edge = edge; 1086 1087 /* Assign callbacks for rpmsg_device */ 1088 qsdev->rpdev.ops = &qcom_smd_device_ops; 1089 1090 /* Assign public information to the rpmsg_device */ 1091 rpdev = &qsdev->rpdev; 1092 strncpy(rpdev->id.name, channel->name, RPMSG_NAME_SIZE); 1093 rpdev->src = RPMSG_ADDR_ANY; 1094 rpdev->dst = RPMSG_ADDR_ANY; 1095 1096 rpdev->dev.of_node = qcom_smd_match_channel(edge->of_node, channel->name); 1097 rpdev->dev.parent = &edge->dev; 1098 rpdev->dev.release = qcom_smd_release_device; 1099 1100 return rpmsg_register_device(rpdev); 1101} 1102 1103static int qcom_smd_create_chrdev(struct qcom_smd_edge *edge) 1104{ 1105 struct qcom_smd_device *qsdev; 1106 1107 qsdev = kzalloc(sizeof(*qsdev), GFP_KERNEL); 1108 if (!qsdev) 1109 return -ENOMEM; 1110 1111 qsdev->edge = edge; 1112 qsdev->rpdev.ops = &qcom_smd_device_ops; 1113 qsdev->rpdev.dev.parent = &edge->dev; 1114 qsdev->rpdev.dev.release = qcom_smd_release_device; 1115 1116 return rpmsg_ctrldev_register_device(&qsdev->rpdev); 1117} 1118 1119/* 1120 * Allocate the qcom_smd_channel object for a newly found smd channel, 1121 * retrieving and validating the smem items involved. 1122 */ 1123static struct qcom_smd_channel *qcom_smd_create_channel(struct qcom_smd_edge *edge, 1124 unsigned smem_info_item, 1125 unsigned smem_fifo_item, 1126 char *name) 1127{ 1128 struct qcom_smd_channel *channel; 1129 size_t fifo_size; 1130 size_t info_size; 1131 void *fifo_base; 1132 void *info; 1133 int ret; 1134 1135 channel = kzalloc(sizeof(*channel), GFP_KERNEL); 1136 if (!channel) 1137 return ERR_PTR(-ENOMEM); 1138 1139 channel->edge = edge; 1140 channel->name = kstrdup(name, GFP_KERNEL); 1141 if (!channel->name) { 1142 ret = -ENOMEM; 1143 goto free_channel; 1144 } 1145 1146 spin_lock_init(&channel->tx_lock); 1147 spin_lock_init(&channel->recv_lock); 1148 init_waitqueue_head(&channel->fblockread_event); 1149 init_waitqueue_head(&channel->state_change_event); 1150 1151 info = qcom_smem_get(edge->remote_pid, smem_info_item, &info_size); 1152 if (IS_ERR(info)) { 1153 ret = PTR_ERR(info); 1154 goto free_name_and_channel; 1155 } 1156 1157 /* 1158 * Use the size of the item to figure out which channel info struct to 1159 * use. 1160 */ 1161 if (info_size == 2 * sizeof(struct smd_channel_info_word)) { 1162 channel->info_word = info; 1163 } else if (info_size == 2 * sizeof(struct smd_channel_info)) { 1164 channel->info = info; 1165 } else { 1166 dev_err(&edge->dev, 1167 "channel info of size %zu not supported\n", info_size); 1168 ret = -EINVAL; 1169 goto free_name_and_channel; 1170 } 1171 1172 fifo_base = qcom_smem_get(edge->remote_pid, smem_fifo_item, &fifo_size); 1173 if (IS_ERR(fifo_base)) { 1174 ret = PTR_ERR(fifo_base); 1175 goto free_name_and_channel; 1176 } 1177 1178 /* The channel consist of a rx and tx fifo of equal size */ 1179 fifo_size /= 2; 1180 1181 dev_dbg(&edge->dev, "new channel '%s' info-size: %zu fifo-size: %zu\n", 1182 name, info_size, fifo_size); 1183 1184 channel->tx_fifo = fifo_base; 1185 channel->rx_fifo = fifo_base + fifo_size; 1186 channel->fifo_size = fifo_size; 1187 1188 qcom_smd_channel_reset(channel); 1189 1190 return channel; 1191 1192free_name_and_channel: 1193 kfree(channel->name); 1194free_channel: 1195 kfree(channel); 1196 1197 return ERR_PTR(ret); 1198} 1199 1200/* 1201 * Scans the allocation table for any newly allocated channels, calls 1202 * qcom_smd_create_channel() to create representations of these and add 1203 * them to the edge's list of channels. 1204 */ 1205static void qcom_channel_scan_worker(struct work_struct *work) 1206{ 1207 struct qcom_smd_edge *edge = container_of(work, struct qcom_smd_edge, scan_work); 1208 struct qcom_smd_alloc_entry *alloc_tbl; 1209 struct qcom_smd_alloc_entry *entry; 1210 struct qcom_smd_channel *channel; 1211 unsigned long flags; 1212 unsigned fifo_id; 1213 unsigned info_id; 1214 int tbl; 1215 int i; 1216 u32 eflags, cid; 1217 1218 for (tbl = 0; tbl < SMD_ALLOC_TBL_COUNT; tbl++) { 1219 alloc_tbl = qcom_smem_get(edge->remote_pid, 1220 smem_items[tbl].alloc_tbl_id, NULL); 1221 if (IS_ERR(alloc_tbl)) 1222 continue; 1223 1224 for (i = 0; i < SMD_ALLOC_TBL_SIZE; i++) { 1225 entry = &alloc_tbl[i]; 1226 eflags = le32_to_cpu(entry->flags); 1227 if (test_bit(i, edge->allocated[tbl])) 1228 continue; 1229 1230 if (entry->ref_count == 0) 1231 continue; 1232 1233 if (!entry->name[0]) 1234 continue; 1235 1236 if (!(eflags & SMD_CHANNEL_FLAGS_PACKET)) 1237 continue; 1238 1239 if ((eflags & SMD_CHANNEL_FLAGS_EDGE_MASK) != edge->edge_id) 1240 continue; 1241 1242 cid = le32_to_cpu(entry->cid); 1243 info_id = smem_items[tbl].info_base_id + cid; 1244 fifo_id = smem_items[tbl].fifo_base_id + cid; 1245 1246 channel = qcom_smd_create_channel(edge, info_id, fifo_id, entry->name); 1247 if (IS_ERR(channel)) 1248 continue; 1249 1250 spin_lock_irqsave(&edge->channels_lock, flags); 1251 list_add(&channel->list, &edge->channels); 1252 spin_unlock_irqrestore(&edge->channels_lock, flags); 1253 1254 dev_dbg(&edge->dev, "new channel found: '%s'\n", channel->name); 1255 set_bit(i, edge->allocated[tbl]); 1256 1257 wake_up_interruptible_all(&edge->new_channel_event); 1258 } 1259 } 1260 1261 schedule_work(&edge->state_work); 1262} 1263 1264/* 1265 * This per edge worker scans smem for any new channels and register these. It 1266 * then scans all registered channels for state changes that should be handled 1267 * by creating or destroying smd client devices for the registered channels. 1268 * 1269 * LOCKING: edge->channels_lock only needs to cover the list operations, as the 1270 * worker is killed before any channels are deallocated 1271 */ 1272static void qcom_channel_state_worker(struct work_struct *work) 1273{ 1274 struct qcom_smd_channel *channel; 1275 struct qcom_smd_edge *edge = container_of(work, 1276 struct qcom_smd_edge, 1277 state_work); 1278 struct rpmsg_channel_info chinfo; 1279 unsigned remote_state; 1280 unsigned long flags; 1281 1282 /* 1283 * Register a device for any closed channel where the remote processor 1284 * is showing interest in opening the channel. 1285 */ 1286 spin_lock_irqsave(&edge->channels_lock, flags); 1287 list_for_each_entry(channel, &edge->channels, list) { 1288 if (channel->state != SMD_CHANNEL_CLOSED) 1289 continue; 1290 1291 /* 1292 * Always open rpm_requests, even when already opened which is 1293 * required on some SoCs like msm8953. 1294 */ 1295 remote_state = GET_RX_CHANNEL_INFO(channel, state); 1296 if (remote_state != SMD_CHANNEL_OPENING && 1297 remote_state != SMD_CHANNEL_OPENED && 1298 strcmp(channel->name, "rpm_requests")) 1299 continue; 1300 1301 if (channel->registered) 1302 continue; 1303 1304 spin_unlock_irqrestore(&edge->channels_lock, flags); 1305 qcom_smd_create_device(channel); 1306 spin_lock_irqsave(&edge->channels_lock, flags); 1307 channel->registered = true; 1308 } 1309 1310 /* 1311 * Unregister the device for any channel that is opened where the 1312 * remote processor is closing the channel. 1313 */ 1314 list_for_each_entry(channel, &edge->channels, list) { 1315 if (channel->state != SMD_CHANNEL_OPENING && 1316 channel->state != SMD_CHANNEL_OPENED) 1317 continue; 1318 1319 remote_state = GET_RX_CHANNEL_INFO(channel, state); 1320 if (remote_state == SMD_CHANNEL_OPENING || 1321 remote_state == SMD_CHANNEL_OPENED) 1322 continue; 1323 1324 spin_unlock_irqrestore(&edge->channels_lock, flags); 1325 1326 strncpy(chinfo.name, channel->name, sizeof(chinfo.name)); 1327 chinfo.src = RPMSG_ADDR_ANY; 1328 chinfo.dst = RPMSG_ADDR_ANY; 1329 rpmsg_unregister_device(&edge->dev, &chinfo); 1330 channel->registered = false; 1331 spin_lock_irqsave(&edge->channels_lock, flags); 1332 } 1333 spin_unlock_irqrestore(&edge->channels_lock, flags); 1334} 1335 1336/* 1337 * Parses an of_node describing an edge. 1338 */ 1339static int qcom_smd_parse_edge(struct device *dev, 1340 struct device_node *node, 1341 struct qcom_smd_edge *edge) 1342{ 1343 struct device_node *syscon_np; 1344 const char *key; 1345 int irq; 1346 int ret; 1347 1348 INIT_LIST_HEAD(&edge->channels); 1349 spin_lock_init(&edge->channels_lock); 1350 1351 INIT_WORK(&edge->scan_work, qcom_channel_scan_worker); 1352 INIT_WORK(&edge->state_work, qcom_channel_state_worker); 1353 1354 edge->of_node = of_node_get(node); 1355 1356 key = "qcom,smd-edge"; 1357 ret = of_property_read_u32(node, key, &edge->edge_id); 1358 if (ret) { 1359 dev_err(dev, "edge missing %s property\n", key); 1360 goto put_node; 1361 } 1362 1363 edge->remote_pid = QCOM_SMEM_HOST_ANY; 1364 key = "qcom,remote-pid"; 1365 of_property_read_u32(node, key, &edge->remote_pid); 1366 1367 edge->mbox_client.dev = dev; 1368 edge->mbox_client.knows_txdone = true; 1369 edge->mbox_chan = mbox_request_channel(&edge->mbox_client, 0); 1370 if (IS_ERR(edge->mbox_chan)) { 1371 if (PTR_ERR(edge->mbox_chan) != -ENODEV) { 1372 ret = PTR_ERR(edge->mbox_chan); 1373 goto put_node; 1374 } 1375 1376 edge->mbox_chan = NULL; 1377 1378 syscon_np = of_parse_phandle(node, "qcom,ipc", 0); 1379 if (!syscon_np) { 1380 dev_err(dev, "no qcom,ipc node\n"); 1381 ret = -ENODEV; 1382 goto put_node; 1383 } 1384 1385 edge->ipc_regmap = syscon_node_to_regmap(syscon_np); 1386 if (IS_ERR(edge->ipc_regmap)) { 1387 ret = PTR_ERR(edge->ipc_regmap); 1388 goto put_node; 1389 } 1390 1391 key = "qcom,ipc"; 1392 ret = of_property_read_u32_index(node, key, 1, &edge->ipc_offset); 1393 if (ret < 0) { 1394 dev_err(dev, "no offset in %s\n", key); 1395 goto put_node; 1396 } 1397 1398 ret = of_property_read_u32_index(node, key, 2, &edge->ipc_bit); 1399 if (ret < 0) { 1400 dev_err(dev, "no bit in %s\n", key); 1401 goto put_node; 1402 } 1403 } 1404 1405 ret = of_property_read_string(node, "label", &edge->name); 1406 if (ret < 0) 1407 edge->name = node->name; 1408 1409 irq = irq_of_parse_and_map(node, 0); 1410 if (!irq) { 1411 dev_err(dev, "required smd interrupt missing\n"); 1412 ret = -EINVAL; 1413 goto put_node; 1414 } 1415 1416 ret = devm_request_irq(dev, irq, 1417 qcom_smd_edge_intr, IRQF_TRIGGER_RISING, 1418 node->name, edge); 1419 if (ret) { 1420 dev_err(dev, "failed to request smd irq\n"); 1421 goto put_node; 1422 } 1423 1424 edge->irq = irq; 1425 1426 return 0; 1427 1428put_node: 1429 of_node_put(node); 1430 edge->of_node = NULL; 1431 1432 return ret; 1433} 1434 1435/* 1436 * Release function for an edge. 1437 * Reset the state of each associated channel and free the edge context. 1438 */ 1439static void qcom_smd_edge_release(struct device *dev) 1440{ 1441 struct qcom_smd_channel *channel, *tmp; 1442 struct qcom_smd_edge *edge = to_smd_edge(dev); 1443 1444 list_for_each_entry_safe(channel, tmp, &edge->channels, list) { 1445 list_del(&channel->list); 1446 kfree(channel->name); 1447 kfree(channel); 1448 } 1449 1450 kfree(edge); 1451} 1452 1453static ssize_t rpmsg_name_show(struct device *dev, 1454 struct device_attribute *attr, char *buf) 1455{ 1456 struct qcom_smd_edge *edge = to_smd_edge(dev); 1457 1458 return sprintf(buf, "%s\n", edge->name); 1459} 1460static DEVICE_ATTR_RO(rpmsg_name); 1461 1462static struct attribute *qcom_smd_edge_attrs[] = { 1463 &dev_attr_rpmsg_name.attr, 1464 NULL 1465}; 1466ATTRIBUTE_GROUPS(qcom_smd_edge); 1467 1468/** 1469 * qcom_smd_register_edge() - register an edge based on an device_node 1470 * @parent: parent device for the edge 1471 * @node: device_node describing the edge 1472 * 1473 * Return: an edge reference, or negative ERR_PTR() on failure. 1474 */ 1475struct qcom_smd_edge *qcom_smd_register_edge(struct device *parent, 1476 struct device_node *node) 1477{ 1478 struct qcom_smd_edge *edge; 1479 int ret; 1480 1481 edge = kzalloc(sizeof(*edge), GFP_KERNEL); 1482 if (!edge) 1483 return ERR_PTR(-ENOMEM); 1484 1485 init_waitqueue_head(&edge->new_channel_event); 1486 1487 edge->dev.parent = parent; 1488 edge->dev.release = qcom_smd_edge_release; 1489 edge->dev.of_node = node; 1490 edge->dev.groups = qcom_smd_edge_groups; 1491 dev_set_name(&edge->dev, "%s:%pOFn", dev_name(parent), node); 1492 ret = device_register(&edge->dev); 1493 if (ret) { 1494 pr_err("failed to register smd edge\n"); 1495 put_device(&edge->dev); 1496 return ERR_PTR(ret); 1497 } 1498 1499 ret = qcom_smd_parse_edge(&edge->dev, node, edge); 1500 if (ret) { 1501 dev_err(&edge->dev, "failed to parse smd edge\n"); 1502 goto unregister_dev; 1503 } 1504 1505 ret = qcom_smd_create_chrdev(edge); 1506 if (ret) { 1507 dev_err(&edge->dev, "failed to register chrdev for edge\n"); 1508 goto unregister_dev; 1509 } 1510 1511 schedule_work(&edge->scan_work); 1512 1513 return edge; 1514 1515unregister_dev: 1516 if (!IS_ERR_OR_NULL(edge->mbox_chan)) 1517 mbox_free_channel(edge->mbox_chan); 1518 1519 device_unregister(&edge->dev); 1520 return ERR_PTR(ret); 1521} 1522EXPORT_SYMBOL(qcom_smd_register_edge); 1523 1524static int qcom_smd_remove_device(struct device *dev, void *data) 1525{ 1526 device_unregister(dev); 1527 1528 return 0; 1529} 1530 1531/** 1532 * qcom_smd_unregister_edge() - release an edge and its children 1533 * @edge: edge reference acquired from qcom_smd_register_edge 1534 */ 1535int qcom_smd_unregister_edge(struct qcom_smd_edge *edge) 1536{ 1537 int ret; 1538 1539 disable_irq(edge->irq); 1540 cancel_work_sync(&edge->scan_work); 1541 cancel_work_sync(&edge->state_work); 1542 1543 ret = device_for_each_child(&edge->dev, NULL, qcom_smd_remove_device); 1544 if (ret) 1545 dev_warn(&edge->dev, "can't remove smd device: %d\n", ret); 1546 1547 mbox_free_channel(edge->mbox_chan); 1548 device_unregister(&edge->dev); 1549 1550 return 0; 1551} 1552EXPORT_SYMBOL(qcom_smd_unregister_edge); 1553 1554static int qcom_smd_probe(struct platform_device *pdev) 1555{ 1556 struct device_node *node; 1557 void *p; 1558 1559 /* Wait for smem */ 1560 p = qcom_smem_get(QCOM_SMEM_HOST_ANY, smem_items[0].alloc_tbl_id, NULL); 1561 if (PTR_ERR(p) == -EPROBE_DEFER) 1562 return PTR_ERR(p); 1563 1564 for_each_available_child_of_node(pdev->dev.of_node, node) 1565 qcom_smd_register_edge(&pdev->dev, node); 1566 1567 return 0; 1568} 1569 1570static int qcom_smd_remove_edge(struct device *dev, void *data) 1571{ 1572 struct qcom_smd_edge *edge = to_smd_edge(dev); 1573 1574 return qcom_smd_unregister_edge(edge); 1575} 1576 1577/* 1578 * Shut down all smd clients by making sure that each edge stops processing 1579 * events and scanning for new channels, then call destroy on the devices. 1580 */ 1581static int qcom_smd_remove(struct platform_device *pdev) 1582{ 1583 int ret; 1584 1585 ret = device_for_each_child(&pdev->dev, NULL, qcom_smd_remove_edge); 1586 if (ret) 1587 dev_warn(&pdev->dev, "can't remove smd device: %d\n", ret); 1588 1589 return ret; 1590} 1591 1592static const struct of_device_id qcom_smd_of_match[] = { 1593 { .compatible = "qcom,smd" }, 1594 {} 1595}; 1596MODULE_DEVICE_TABLE(of, qcom_smd_of_match); 1597 1598static struct platform_driver qcom_smd_driver = { 1599 .probe = qcom_smd_probe, 1600 .remove = qcom_smd_remove, 1601 .driver = { 1602 .name = "qcom-smd", 1603 .of_match_table = qcom_smd_of_match, 1604 }, 1605}; 1606 1607static int __init qcom_smd_init(void) 1608{ 1609 return platform_driver_register(&qcom_smd_driver); 1610} 1611arch_initcall(qcom_smd_init); 1612 1613static void __exit qcom_smd_exit(void) 1614{ 1615 platform_driver_unregister(&qcom_smd_driver); 1616} 1617module_exit(qcom_smd_exit); 1618 1619MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>"); 1620MODULE_DESCRIPTION("Qualcomm Shared Memory Driver"); 1621MODULE_LICENSE("GPL v2");