1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Stream data over Thunderbolt/USB4 cable
4 *
5 * Copyright (C) 2026, Intel Corporation
6 * Authors: Alan Borzeszkowski <alan.borzeszkowski@linux.intel.com>
7 * Mika Westerberg <mika.westerberg@linux.intel.com>
8 */
9
10 #define pr_fmt(fmt) "tbstream: " fmt
11
12 #include <linux/configfs.h>
13 #include <linux/file.h>
14 #include <linux/fs.h>
15 #include <linux/idr.h>
16 #include <linux/miscdevice.h>
17 #include <linux/module.h>
18 #include <linux/mutex.h>
19 #include <linux/poll.h>
20 #include <linux/sizes.h>
21 #include <linux/thunderbolt.h>
22 #include <linux/uaccess.h>
23 #include <linux/uio.h>
24 #include <linux/uuid.h>
25 #include <linux/wait.h>
26
27 /*
28 * USB4STREAM - Stream data directly over Thunderbolt/USB4 cable
29 *
30 * HopIDs are configured by the user. In Linux this is done through
31 * ConfigFS. Once that is done paths are be established the first time
32 * the stream is opened. Typically the read side is opened first to make
33 * sure all the data will be received.
34 *
35 * End-to-end flow control is mandatory on both sides.
36 *
37 * Data is sent to the other side as tunneled DATA packets. All the data
38 * is owned by the user and passed as-is from the writer to the reader.
39 *
40 * Once the stream device is closed, a CLOSE packet is sent to the peer
41 * so it can take the necessary action. On Linux this typically results
42 * in EOF being returned to the reader.
43 *
44 * Tunneled packet types:
45 *
46 * +-------+---------+------------------+
47 * | PDF | Type | Payload size |
48 * +-------+---------+------------------+
49 * | 2 | DATA | up to 4 KiB |
50 * | 3 | CLOSE | up to 256 bytes |
51 * +-------+---------+------------------+
52 *
53 * Each stream can optionally publish configuration values under its own
54 * XDomain property directory. The name of the directory is the name of
55 * the stream in question and the UUID is up to the stream. For example
56 * if the stream exposes video output then the directory name could be
57 * "video".
58 *
59 * Below values are reserved and can be used by the stream:
60 *
61 * +----------+-----------+-------------------------+
62 * | Key | Type | Contents |
63 * +----------+-----------+-------------------------+
64 * | inhopid | IMMEDIATE | Configured input HopID |
65 * | outhopid | IMMEDIATE | Configured output HopID |
66 * +----------+-----------+-------------------------+
67 *
68 * It is allowed to add more stream specific properties as well if the
69 * above are not enough.
70 */
71
72 #define TBSTREAM_DEV_RING_SIZE 256
73 #define TBSTREAM_DEV_MIN_RING_SIZE 32
74 #define TBSTREAM_DEV_MAX_RING_SIZE 4096
75 #define TBSTREAM_DEV_THROTTLING 8192
76 #define TBSTREAM_DEV_MAX_THROTTLING 16776960
77
78 /**
79 * enum tbstream_frame_pdf - PDF numbers for tunneled frames
80 * @TBSTREAM_FRAME_START: PDF of the start of the frame
81 * @TBSTREAM_DATA: PDF of the DATA frame
82 * @TBSTREAM_CLOSE: PDF of the CLOSE frame
83 */
84 enum tbstream_frame_pdf {
85 TBSTREAM_FRAME_START = 1,
86 TBSTREAM_DATA,
87 TBSTREAM_CLOSE,
88 };
89
90 /**
91 * struct tbstream_frame - Frame submitted to/from the rings
92 * @sdev: Pointer to the stream device
93 * @page: Page holding the packet
94 * @offset: Offset inside @page if partial read is done
95 * @completed: %true if the RX frame is completed
96 * @frame: Underlying frame structure
97 */
98 struct tbstream_frame {
99 struct tbstream_dev *sdev;
100 struct page *page;
101 unsigned int offset;
102 bool completed;
103 struct ring_frame frame;
104 };
105
106 /**
107 * struct tbstream_ring - Stream RX/TX ring structure
108 * @ring: Pointer to the API ring
109 * @prod: Current value of producer
110 * @cons: Current value of consumer
111 * @frames: Holds the ring frames
112 */
113 struct tbstream_ring {
114 struct tb_ring *ring;
115 unsigned long prod;
116 unsigned long cons;
117 struct tbstream_frame *frames;
118 };
119
120 /**
121 * struct tbstream_dev - Stream character device
122 * @group: ConfigFS group for this device
123 * @stream: Pointer to the stream if it is attached (%NULL otherwise)
124 * @misc: Character device used for tunneling
125 * @kref: Reference count
126 * @index: Unique identifier for the character device
127 * @in_hopid: In HopID
128 * @out_hopid: Out HopID
129 * @ring_size: Size of the rings
130 * @throttling: Interrupt throttling rate in ns
131 * @users: Number of times @cdev has been opened
132 * @closed: CLOSE packet was received
133 * @removed: Userspace removed the ConfigFS group underneath.
134 * @wait: Waitqueue for open, read and write
135 * @lock: Lock protecting this structure
136 * @tx_ring: Transmit ring
137 * @rx_ring: Receive ring
138 * @list: Stream devices are linked through this
139 */
140 struct tbstream_dev {
141 struct config_group group;
142 struct tbstream *stream;
143 struct miscdevice misc;
144 struct kref kref;
145 int index;
146 int in_hopid;
147 int out_hopid;
148 unsigned int ring_size;
149 unsigned int throttling;
150 int users;
151 bool closed;
152 bool removed;
153 wait_queue_head_t wait;
154 struct mutex lock;
155 struct tbstream_ring tx_ring;
156 struct tbstream_ring rx_ring;
157 struct list_head list;
158 };
159
160 /**
161 * struct tbstream_group - Config group for stream
162 * @group: ConfigFS group for @stream
163 * @stream: Stream the ConfigFS group is attached to. %NULL if there is
164 * no stream attached.
165 * @lock: Lock protecting this structure
166 * @dev_list: List of stream devices
167 *
168 * This is the ConfigFS directory for one connection to another host.
169 * There can be several &struct stream_dev linked through @dev_list of
170 * this structure. Reference count managed through @group.
171 */
172 struct tbstream_group {
173 struct config_group group;
174 struct tbstream *stream;
175 struct mutex lock;
176 struct list_head dev_list;
177 };
178
179 /**
180 * struct tbstream - Stream service private data
181 * @kref: Reference count
182 * @svc: Pointer to the service device
183 * @list: Streams are linked through this in @stream_list
184 *
185 * This represents the actual physical connection between two hosts.
186 */
187 struct tbstream {
188 struct kref kref;
189 struct tb_service *svc;
190 struct list_head list;
191 };
192
193 static DEFINE_IDA(tbstream_indices);
194
195 /* Protects tbstream_list */
196 static DEFINE_MUTEX(tbstream_lock);
197 static LIST_HEAD(tbstream_list);
198
199 /* Serializes tbstream_get()/put() */
200 static DEFINE_MUTEX(tbstream_kref_lock);
201
202 /* Serializes tbstream_dev_get()/put() */
203 static DEFINE_MUTEX(tbstream_dev_kref_lock);
204
205 /* Stream property directory UUID: 3a1cb984-c4d9-4469-a277-ce2fdfd11f0d */
206 static const uuid_t tbstream_dir_uuid =
207 UUID_INIT(0x3a1cb984, 0xc4d9, 0x4469,
208 0xa2, 0x77, 0xce, 0x2f, 0xdf, 0xd1, 0x1f, 0x0d);
209
210 static struct tb_property_dir *tbstream_dir;
211
tbstream_release(struct kref * kref)212 static void tbstream_release(struct kref *kref)
213 {
214 struct tbstream *stream = container_of(kref, typeof(*stream), kref);
215
216 tb_service_put(stream->svc);
217 kfree(stream);
218 }
219
tbstream_put(struct tbstream * stream)220 static void tbstream_put(struct tbstream *stream)
221 {
222 if (stream) {
223 guard(mutex)(&tbstream_kref_lock);
224 kref_put(&stream->kref, tbstream_release);
225 }
226 }
227
tbstream_get(struct tbstream * stream)228 static struct tbstream *tbstream_get(struct tbstream *stream)
229 {
230 if (stream) {
231 guard(mutex)(&tbstream_kref_lock);
232 kref_get(&stream->kref);
233 }
234 return stream;
235 }
236
tbstream_valid(const struct tbstream * stream)237 static inline bool tbstream_valid(const struct tbstream *stream)
238 {
239 if (stream)
240 return !tb_service_parent(stream->svc)->is_unplugged;
241 return false;
242 }
243
tbstream_ring_free(struct tbstream_ring * ring)244 static void tbstream_ring_free(struct tbstream_ring *ring)
245 {
246 struct device *dma_dev = tb_ring_dma_device(ring->ring);
247 enum dma_data_direction dir;
248 int i;
249
250 if (ring->ring->is_tx)
251 dir = DMA_TO_DEVICE;
252 else
253 dir = DMA_FROM_DEVICE;
254
255 for (i = 0; i < tb_ring_size(ring->ring); i++) {
256 struct tbstream_frame *sf = &ring->frames[i];
257
258 if (sf->frame.buffer_phy)
259 dma_unmap_page(dma_dev, sf->frame.buffer_phy,
260 TB_MAX_FRAME_SIZE, dir);
261 sf->frame.buffer_phy = 0;
262 if (sf->page)
263 __free_page(sf->page);
264 sf->page = NULL;
265 }
266
267 ring->prod = 0;
268 ring->cons = 0;
269 kfree(ring->frames);
270 }
271
tbstream_ring_available(const struct tbstream_ring * ring)272 static inline bool tbstream_ring_available(const struct tbstream_ring *ring)
273 {
274 return ring->prod > ring->cons;
275 }
276
tbstream_dev_xdomain(struct tbstream_dev * sdev)277 static inline struct tb_xdomain *tbstream_dev_xdomain(struct tbstream_dev *sdev)
278 {
279 if (sdev->stream)
280 return tb_service_parent(sdev->stream->svc);
281 return NULL;
282 }
283
tbstream_dev_release(struct kref * kref)284 static void tbstream_dev_release(struct kref *kref)
285 {
286 struct tbstream_dev *sdev = container_of(kref, struct tbstream_dev, kref);
287
288 if (sdev->stream) {
289 struct tb_xdomain *xd = tbstream_dev_xdomain(sdev);
290
291 if (sdev->out_hopid > 0)
292 tb_xdomain_release_out_hopid(xd, sdev->out_hopid);
293 if (sdev->in_hopid > 0)
294 tb_xdomain_release_in_hopid(xd, sdev->in_hopid);
295
296 tbstream_put(sdev->stream);
297 }
298 ida_free(&tbstream_indices, sdev->index);
299 kfree(sdev->misc.name);
300 kfree(sdev);
301 }
302
tbstream_dev_put(struct tbstream_dev * sdev)303 static inline void tbstream_dev_put(struct tbstream_dev *sdev)
304 {
305 guard(mutex)(&tbstream_dev_kref_lock);
306 kref_put(&sdev->kref, tbstream_dev_release);
307 }
308
tbstream_dev_get(struct tbstream_dev * sdev)309 static inline struct tbstream_dev *tbstream_dev_get(struct tbstream_dev *sdev)
310 {
311 guard(mutex)(&tbstream_dev_kref_lock);
312 kref_get(&sdev->kref);
313 return sdev;
314 }
315
to_tbstream_dev(struct miscdevice * misc)316 static inline struct tbstream_dev *to_tbstream_dev(struct miscdevice *misc)
317 {
318 return container_of(misc, struct tbstream_dev, misc);
319 }
320
tbstream_dev_valid(const struct tbstream_dev * sdev)321 static inline int tbstream_dev_valid(const struct tbstream_dev *sdev)
322 {
323 const struct tbstream *stream = sdev->stream;
324
325 if (!tbstream_valid(stream))
326 return -ENXIO;
327 if (sdev->in_hopid <= 0 || sdev->out_hopid <= 0)
328 return -EINVAL;
329 return 0;
330 }
331
tbstream_dev_removed(const struct tbstream_dev * sdev)332 static inline bool tbstream_dev_removed(const struct tbstream_dev *sdev)
333 {
334 return sdev->removed;
335 }
336
tbstream_dev_closed(const struct tbstream_dev * sdev)337 static inline bool tbstream_dev_closed(const struct tbstream_dev *sdev)
338 {
339 return sdev->closed;
340 }
341
342 static void
tbstream_dev_rx_callback(struct tb_ring * ring,struct ring_frame * frame,bool canceled)343 tbstream_dev_rx_callback(struct tb_ring *ring, struct ring_frame *frame,
344 bool canceled)
345 {
346 struct tbstream_frame *sf = container_of(frame, typeof(*sf), frame);
347 struct tbstream_dev *sdev = sf->sdev;
348
349 if (canceled)
350 return;
351
352 sf->completed = true;
353 sdev->rx_ring.prod++;
354
355 if (sf->frame.flags & RING_DESC_CRC_ERROR)
356 pr_warn("RX CRC error\n");
357 else if (sf->frame.flags & RING_DESC_BUFFER_OVERRUN)
358 pr_warn("RX buffer overrun\n");
359 else
360 wake_up_interruptible_poll(&sdev->wait, EPOLLIN | EPOLLRDNORM);
361 }
362
363 static struct tbstream_frame *
tbstream_dev_completed_rx(struct tbstream_dev * sdev)364 tbstream_dev_completed_rx(struct tbstream_dev *sdev)
365 {
366 struct device *dma_dev = tb_ring_dma_device(sdev->rx_ring.ring);
367 struct tbstream_frame *sf;
368 int index;
369
370 index = sdev->rx_ring.cons % tb_ring_size(sdev->rx_ring.ring);
371 sf = &sdev->rx_ring.frames[index];
372 if (!sf->completed)
373 return NULL;
374
375 dma_sync_single_for_cpu(dma_dev, sf->frame.buffer_phy,
376 tb_ring_frame_size(&sf->frame),
377 DMA_FROM_DEVICE);
378 return sf;
379 }
380
tbstream_dev_consume_rx(struct tbstream_dev * sdev)381 static int tbstream_dev_consume_rx(struct tbstream_dev *sdev)
382 {
383 struct device *dma_dev = tb_ring_dma_device(sdev->rx_ring.ring);
384 struct tbstream_frame *sf;
385 int index;
386
387 index = sdev->rx_ring.cons % tb_ring_size(sdev->rx_ring.ring);
388 sdev->rx_ring.cons++;
389
390 sf = &sdev->rx_ring.frames[index];
391 sf->completed = false;
392 sf->offset = 0;
393 sf->frame.size = 0;
394
395 dma_sync_single_for_device(dma_dev, sf->frame.buffer_phy,
396 tb_ring_frame_size(&sf->frame),
397 DMA_FROM_DEVICE);
398
399 return tb_ring_rx(sdev->rx_ring.ring, &sf->frame);
400 }
401
tbstream_dev_alloc_rx_buffers(struct tbstream_dev * sdev)402 static int tbstream_dev_alloc_rx_buffers(struct tbstream_dev *sdev)
403 {
404 size_t ring_size = tb_ring_size(sdev->rx_ring.ring);
405 int i;
406
407 sdev->rx_ring.frames = kcalloc(ring_size, sizeof(struct tbstream_frame),
408 GFP_KERNEL);
409 if (!sdev->rx_ring.frames)
410 return -ENOMEM;
411
412 for (i = 0; i < ring_size; i++) {
413 struct device *dma_dev = tb_ring_dma_device(sdev->rx_ring.ring);
414 struct tbstream_frame *sf = &sdev->rx_ring.frames[i];
415 dma_addr_t dma_addr;
416
417 sf->page = alloc_page(GFP_KERNEL);
418 if (!sf->page)
419 return -ENOMEM;
420
421 dma_addr = dma_map_page(dma_dev, sf->page, 0, TB_MAX_FRAME_SIZE,
422 DMA_FROM_DEVICE);
423 if (dma_mapping_error(dma_dev, dma_addr)) {
424 __free_page(sf->page);
425 sf->page = NULL;
426 return -ENOMEM;
427 }
428
429 sf->sdev = sdev;
430 sf->frame.callback = tbstream_dev_rx_callback;
431 sf->frame.buffer_phy = dma_addr;
432
433 tb_ring_rx(sdev->rx_ring.ring, &sf->frame);
434 }
435
436 sdev->rx_ring.cons = 0;
437 sdev->rx_ring.prod = 0;
438 return 0;
439 }
440
441 static void
tbstream_dev_tx_callback(struct tb_ring * ring,struct ring_frame * frame,bool canceled)442 tbstream_dev_tx_callback(struct tb_ring *ring, struct ring_frame *frame,
443 bool canceled)
444 {
445 struct tbstream_frame *sf = container_of(frame, typeof(*sf), frame);
446 struct tbstream_dev *sdev = sf->sdev;
447
448 if (canceled)
449 return;
450
451 sdev->tx_ring.prod++;
452 if (sf->frame.eof == TBSTREAM_DATA)
453 wake_up_interruptible_poll(&sdev->wait, EPOLLOUT | EPOLLWRNORM);
454 }
455
tbstream_dev_alloc_tx_buffers(struct tbstream_dev * sdev)456 static int tbstream_dev_alloc_tx_buffers(struct tbstream_dev *sdev)
457 {
458 struct device *dma_dev = tb_ring_dma_device(sdev->tx_ring.ring);
459 size_t ring_size = tb_ring_size(sdev->tx_ring.ring);
460 int i;
461
462 sdev->tx_ring.frames = kcalloc(ring_size, sizeof(struct tbstream_frame),
463 GFP_KERNEL);
464 if (!sdev->tx_ring.frames)
465 return -ENOMEM;
466
467 for (i = 0; i < ring_size; i++) {
468 struct tbstream_frame *sf = &sdev->tx_ring.frames[i];
469 dma_addr_t dma_addr;
470
471 sf->page = alloc_page(GFP_KERNEL);
472 if (!sf->page)
473 return -ENOMEM;
474
475 dma_addr = dma_map_page(dma_dev, sf->page, 0, TB_MAX_FRAME_SIZE,
476 DMA_TO_DEVICE);
477 if (dma_mapping_error(dma_dev, dma_addr)) {
478 __free_page(sf->page);
479 sf->page = NULL;
480 return -ENOMEM;
481 }
482
483 sf->sdev = sdev;
484 sf->frame.callback = tbstream_dev_tx_callback;
485 sf->frame.buffer_phy = dma_addr;
486 sf->frame.sof = TBSTREAM_FRAME_START;
487 }
488
489 sdev->tx_ring.cons = 0;
490 sdev->tx_ring.prod = ring_size - 1;
491 return 0;
492 }
493
494 static struct tbstream_frame *
tbstream_dev_alloc_tx(struct tbstream_dev * sdev,enum tbstream_frame_pdf pdf,struct iov_iter * from,size_t size)495 tbstream_dev_alloc_tx(struct tbstream_dev *sdev, enum tbstream_frame_pdf pdf,
496 struct iov_iter *from, size_t size)
497 {
498 struct device *dma_dev = tb_ring_dma_device(sdev->tx_ring.ring);
499 struct tbstream_frame *sf;
500 int index;
501
502 if (!tbstream_ring_available(&sdev->tx_ring))
503 return ERR_PTR(-ENOBUFS);
504
505 index = sdev->tx_ring.cons % tb_ring_size(sdev->tx_ring.ring);
506 sdev->tx_ring.cons++;
507
508 sf = &sdev->tx_ring.frames[index];
509 sf->frame.size = size < TB_MAX_FRAME_SIZE ? size : 0;
510 sf->frame.eof = pdf;
511
512 dma_sync_single_for_cpu(dma_dev, sf->frame.buffer_phy, size,
513 DMA_TO_DEVICE);
514 if (pdf == TBSTREAM_DATA) {
515 if (copy_page_from_iter(sf->page, 0, size, from) != size)
516 return ERR_PTR(-EFAULT);
517 } else {
518 memset(page_address(sf->page), 0, size);
519 }
520 dma_sync_single_for_device(dma_dev, sf->frame.buffer_phy, size,
521 DMA_TO_DEVICE);
522 return sf;
523 }
524
525 static int
tbstream_dev_send_data(struct tbstream_dev * sdev,struct iov_iter * from,size_t size)526 tbstream_dev_send_data(struct tbstream_dev *sdev, struct iov_iter *from,
527 size_t size)
528 {
529 struct tbstream_frame *sf;
530
531 sf = tbstream_dev_alloc_tx(sdev, TBSTREAM_DATA, from, size);
532 if (IS_ERR(sf))
533 return PTR_ERR(sf);
534 return tb_ring_tx(sdev->tx_ring.ring, &sf->frame);
535 }
536
tbstream_dev_send_close(struct tbstream_dev * sdev)537 static int tbstream_dev_send_close(struct tbstream_dev *sdev)
538 {
539 struct tbstream_frame *sf;
540
541 sf = tbstream_dev_alloc_tx(sdev, TBSTREAM_CLOSE, NULL, SZ_256);
542 if (IS_ERR(sf))
543 return PTR_ERR(sf);
544 return tb_ring_tx(sdev->tx_ring.ring, &sf->frame);
545 }
546
tbstream_dev_start(struct tbstream_dev * sdev)547 static int tbstream_dev_start(struct tbstream_dev *sdev)
548 {
549 struct tb_xdomain *xd = tbstream_dev_xdomain(sdev);
550 u16 sof_mask, eof_mask;
551 struct tb_ring *ring;
552 int ret, e2e_tx_hop;
553
554 ring = tb_ring_alloc_tx(xd->tb->nhi, -1, sdev->ring_size,
555 RING_FLAG_FRAME | RING_FLAG_E2E);
556 if (!ring)
557 return -ENOMEM;
558 sdev->tx_ring.ring = ring;
559
560 ret = tbstream_dev_alloc_tx_buffers(sdev);
561 if (ret)
562 goto err_free_tx;
563
564 e2e_tx_hop = ring->hop;
565 sof_mask = BIT(TBSTREAM_FRAME_START);
566 eof_mask = BIT(TBSTREAM_DATA) | BIT(TBSTREAM_CLOSE);
567
568 ring = tb_ring_alloc_rx(xd->tb->nhi, -1, sdev->ring_size,
569 RING_FLAG_FRAME | RING_FLAG_E2E, e2e_tx_hop,
570 sof_mask, eof_mask, NULL, NULL);
571 if (!ring) {
572 ret = -ENOMEM;
573 goto err_free_tx_buffers;
574 }
575 sdev->rx_ring.ring = ring;
576
577 ret = tb_xdomain_enable_paths(xd, sdev->out_hopid,
578 sdev->tx_ring.ring->hop,
579 sdev->in_hopid,
580 sdev->rx_ring.ring->hop);
581 if (ret)
582 goto err_free_rx;
583
584 tb_ring_throttling(sdev->tx_ring.ring, sdev->throttling);
585 tb_ring_throttling(sdev->rx_ring.ring, sdev->throttling);
586
587 tb_ring_start(sdev->tx_ring.ring);
588 tb_ring_start(sdev->rx_ring.ring);
589
590 ret = tbstream_dev_alloc_rx_buffers(sdev);
591 if (ret)
592 goto err_stop;
593 return 0;
594
595 err_stop:
596 tb_ring_stop(sdev->rx_ring.ring);
597 tb_ring_stop(sdev->tx_ring.ring);
598 err_free_rx:
599 tb_ring_free(sdev->rx_ring.ring);
600 err_free_tx_buffers:
601 tbstream_ring_free(&sdev->tx_ring);
602 err_free_tx:
603 tb_ring_free(sdev->tx_ring.ring);
604
605 return ret;
606 }
607
tbstream_dev_stop(struct tbstream_dev * sdev)608 static void tbstream_dev_stop(struct tbstream_dev *sdev)
609 {
610 struct tb_xdomain *xd;
611
612 /* Wait for the ring to complete any outstanding frames */
613 tb_ring_flush(sdev->tx_ring.ring, 500);
614 tb_ring_stop(sdev->tx_ring.ring);
615 tb_ring_flush(sdev->rx_ring.ring, 500);
616 tb_ring_stop(sdev->rx_ring.ring);
617
618 xd = tbstream_dev_xdomain(sdev);
619 if (xd) {
620 tb_xdomain_disable_paths(xd, sdev->out_hopid,
621 sdev->tx_ring.ring->hop,
622 sdev->in_hopid,
623 sdev->rx_ring.ring->hop);
624 }
625
626 tbstream_ring_free(&sdev->rx_ring);
627 tb_ring_free(sdev->rx_ring.ring);
628 sdev->rx_ring.ring = NULL;
629 tbstream_ring_free(&sdev->tx_ring);
630 tb_ring_free(sdev->tx_ring.ring);
631 sdev->tx_ring.ring = NULL;
632 }
633
634 static ssize_t
tbstream_dev_fops_read_iter(struct kiocb * kiocb,struct iov_iter * to)635 tbstream_dev_fops_read_iter(struct kiocb *kiocb, struct iov_iter *to)
636 {
637 struct file *file = kiocb->ki_filp;
638 struct tbstream_dev *sdev = to_tbstream_dev(file->private_data);
639 size_t nbytes;
640 int ret;
641
642 ret = tbstream_dev_valid(sdev);
643 if (ret)
644 return ret;
645
646 if (mutex_lock_interruptible(&sdev->lock))
647 return -ERESTARTSYS;
648
649 while (!tbstream_ring_available(&sdev->rx_ring)) {
650 mutex_unlock(&sdev->lock);
651
652 if (file->f_flags & O_NONBLOCK)
653 return -EAGAIN;
654 ret = wait_event_interruptible(sdev->wait,
655 tbstream_ring_available(&sdev->rx_ring) ||
656 tbstream_dev_valid(sdev) != 0 ||
657 tbstream_dev_closed(sdev) ||
658 tbstream_dev_removed(sdev));
659 if (ret)
660 return ret;
661
662 ret = tbstream_dev_valid(sdev);
663 if (ret)
664 return ret;
665
666 if (tbstream_dev_closed(sdev) || tbstream_dev_removed(sdev))
667 return 0;
668
669 if (mutex_lock_interruptible(&sdev->lock))
670 return -ERESTARTSYS;
671 }
672
673 nbytes = 0;
674 while (nbytes < iov_iter_count(to)) {
675 struct tbstream_frame *sf;
676 size_t size, sf_size;
677
678 sf = tbstream_dev_completed_rx(sdev);
679 if (!sf)
680 break;
681 /*
682 * CLOSE tunneled packet. If userspace already read
683 * something then we stop processing now and return
684 * those bytes. Next time the first frame will be CLOSE
685 * in which case we return EOF to the user.
686 */
687 if (sf->frame.eof == TBSTREAM_CLOSE) {
688 if (!nbytes) {
689 tbstream_dev_consume_rx(sdev);
690 sdev->closed = true;
691 }
692 break;
693 }
694
695 sf_size = tb_ring_frame_size(&sf->frame);
696 size = min(iov_iter_count(to) - nbytes, sf_size);
697
698 if (copy_page_to_iter(sf->page, sf->offset, size, to) != size) {
699 ret = -EFAULT;
700 break;
701 }
702
703 /*
704 * If not all data from the frame is read so leave it in
705 * place and update the offset accordingly so next read
706 * gets the rest.
707 */
708 if (size < sf_size) {
709 sf->offset += size;
710 sf->frame.size = sf_size - size;
711 } else {
712 ret = tbstream_dev_consume_rx(sdev);
713 if (ret)
714 break;
715 }
716
717 nbytes += size;
718 }
719
720 mutex_unlock(&sdev->lock);
721 if (ret)
722 return ret;
723 return nbytes;
724 }
725
726 static ssize_t
tbstream_dev_fops_write_iter(struct kiocb * kiocb,struct iov_iter * from)727 tbstream_dev_fops_write_iter(struct kiocb *kiocb, struct iov_iter *from)
728 {
729 struct file *file = kiocb->ki_filp;
730 struct tbstream_dev *sdev = to_tbstream_dev(file->private_data);
731 size_t nbytes;
732 int ret;
733
734 ret = tbstream_dev_valid(sdev);
735 if (ret)
736 return ret;
737
738 if (mutex_lock_interruptible(&sdev->lock))
739 return -ERESTARTSYS;
740
741 while (!tbstream_ring_available(&sdev->tx_ring)) {
742 mutex_unlock(&sdev->lock);
743
744 if (file->f_flags & O_NONBLOCK)
745 return -EAGAIN;
746 ret = wait_event_interruptible(sdev->wait,
747 tbstream_ring_available(&sdev->tx_ring) ||
748 tbstream_dev_valid(sdev) != 0 ||
749 tbstream_dev_closed(sdev) ||
750 tbstream_dev_removed(sdev));
751 if (ret)
752 return ret;
753
754 ret = tbstream_dev_valid(sdev);
755 if (ret)
756 return ret;
757
758 if (tbstream_dev_closed(sdev) || tbstream_dev_removed(sdev))
759 return -ENXIO;
760
761 if (mutex_lock_interruptible(&sdev->lock))
762 return -ERESTARTSYS;
763 }
764
765 nbytes = 0;
766 while (nbytes < iov_iter_count(from)) {
767 size_t size;
768
769 size = min(iov_iter_count(from) - nbytes, TB_MAX_FRAME_SIZE);
770 ret = tbstream_dev_send_data(sdev, from, size);
771 if (ret) {
772 /*
773 * If there are no more buffers we are done for
774 * this write.
775 */
776 if (ret == -ENOBUFS)
777 ret = 0;
778 break;
779 }
780
781 nbytes += size;
782 }
783
784 mutex_unlock(&sdev->lock);
785 if (ret)
786 return ret;
787 return nbytes;
788 }
789
790 static __poll_t
tbstream_dev_fops_poll(struct file * file,struct poll_table_struct * wait)791 tbstream_dev_fops_poll(struct file *file, struct poll_table_struct *wait)
792 {
793 struct tbstream_dev *sdev = to_tbstream_dev(file->private_data);
794 __poll_t mask = 0;
795
796 poll_wait(file, &sdev->wait, wait);
797 guard(mutex)(&sdev->lock);
798 if (tbstream_dev_valid(sdev) != 0) {
799 mask |= EPOLLHUP | EPOLLERR;
800 } else {
801 if (tbstream_ring_available(&sdev->tx_ring))
802 mask |= EPOLLOUT | EPOLLWRNORM;
803 if (tbstream_ring_available(&sdev->rx_ring))
804 mask |= EPOLLIN | EPOLLRDNORM;
805 }
806 return mask;
807 }
808
tbstream_dev_fops_open(struct inode * inode,struct file * file)809 static int tbstream_dev_fops_open(struct inode *inode, struct file *file)
810 {
811 struct tbstream_dev *sdev = to_tbstream_dev(file->private_data);
812 int ret;
813
814 tbstream_dev_get(sdev);
815
816 if (mutex_lock_interruptible(&sdev->lock)) {
817 tbstream_dev_put(sdev);
818 return -ERESTARTSYS;
819 }
820
821 /*
822 * If there is no stream attached yet, block until it appears
823 * unless this is opened in non-blocking mode.
824 */
825 while ((ret = tbstream_dev_valid(sdev))) {
826 mutex_unlock(&sdev->lock);
827
828 if (ret != -ENXIO || (file->f_flags & O_NONBLOCK))
829 goto err_put;
830
831 ret = wait_event_interruptible(sdev->wait,
832 tbstream_dev_valid(sdev) == 0 ||
833 tbstream_dev_removed(sdev));
834 if (ret)
835 goto err_put;
836
837 if (tbstream_dev_removed(sdev)) {
838 ret = -ENXIO;
839 goto err_put;
840 }
841
842 if (mutex_lock_interruptible(&sdev->lock)) {
843 ret = -ERESTARTSYS;
844 goto err_put;
845 }
846 }
847
848 /* Only on first open we allocate rings and enable paths */
849 if (!sdev->users++) {
850 ret = tbstream_dev_start(sdev);
851 if (ret) {
852 sdev->users--;
853 goto err_unlock;
854 }
855 sdev->closed = false;
856 }
857
858 mutex_unlock(&sdev->lock);
859 return 0;
860
861 err_unlock:
862 mutex_unlock(&sdev->lock);
863 err_put:
864 tbstream_dev_put(sdev);
865
866 return ret;
867 }
868
tbstream_dev_fops_release(struct inode * inode,struct file * file)869 static int tbstream_dev_fops_release(struct inode *inode, struct file *file)
870 {
871 struct tbstream_dev *sdev = to_tbstream_dev(file->private_data);
872
873 mutex_lock(&sdev->lock);
874 if (--sdev->users == 0) {
875 /*
876 * Send CLOSE tunneled packet to notify the other end
877 * that we are closing the file. We do this twice if the
878 * first one fails.
879 */
880 tbstream_dev_send_close(sdev);
881 tbstream_dev_stop(sdev);
882 }
883 mutex_unlock(&sdev->lock);
884
885 tbstream_dev_put(sdev);
886 return 0;
887 }
888
889 static const struct file_operations tbstream_dev_fops = {
890 .owner = THIS_MODULE,
891 .llseek = noop_llseek,
892 .read_iter = tbstream_dev_fops_read_iter,
893 .write_iter = tbstream_dev_fops_write_iter,
894 .poll = tbstream_dev_fops_poll,
895 .open = tbstream_dev_fops_open,
896 .release = tbstream_dev_fops_release,
897 };
898
899 static inline struct tbstream_dev *
tbstream_dev_from_group(struct config_group * group)900 tbstream_dev_from_group(struct config_group *group)
901 {
902 return container_of(group, struct tbstream_dev, group);
903 }
904
tbstream_dev_index_show(struct config_item * item,char * buf)905 static ssize_t tbstream_dev_index_show(struct config_item *item, char *buf)
906 {
907 struct config_group *group = to_config_group(item);
908 struct tbstream_dev *sdev = tbstream_dev_from_group(group);
909
910 return sysfs_emit(buf, "%d\n", sdev->index);
911 }
912 CONFIGFS_ATTR_RO(tbstream_dev_, index);
913
tbstream_dev_in_hopid_show(struct config_item * item,char * buf)914 static ssize_t tbstream_dev_in_hopid_show(struct config_item *item, char *buf)
915 {
916 struct config_group *group = to_config_group(item);
917 struct tbstream_dev *sdev = tbstream_dev_from_group(group);
918
919 return sysfs_emit(buf, "%d\n", sdev->in_hopid);
920 }
921
922 /* svc->lock must be held */
service_remove_properties(struct tb_service * svc,const char * name)923 static void service_remove_properties(struct tb_service *svc, const char *name)
924 {
925 struct tb_property *p;
926
927 if (!svc->local_properties)
928 return;
929
930 p = tb_property_find(svc->local_properties, name,
931 TB_PROPERTY_TYPE_DIRECTORY);
932 if (p) {
933 tb_property_free_dir(p->value.dir);
934 tb_property_remove(p);
935
936 dev_dbg(&svc->dev, "removed local directory %s\n", name);
937
938 /*
939 * Is the service directory empty already? If it is then
940 * we can release it as well.
941 */
942 tb_property_for_each(svc->local_properties, p) {
943 if (p->type == TB_PROPERTY_TYPE_DIRECTORY)
944 return;
945 }
946
947 tb_property_free_dir(svc->local_properties);
948 svc->local_properties = NULL;
949 }
950 }
951
service_update_properties(struct tb_service * svc,const char * name,int in_hopid,int out_hopid)952 static int service_update_properties(struct tb_service *svc, const char *name,
953 int in_hopid, int out_hopid)
954 {
955 struct tb_property_dir *dir;
956 struct tb_property *p;
957
958 guard(mutex)(&svc->lock);
959
960 if (in_hopid < 8 || out_hopid < 8) {
961 service_remove_properties(svc, name);
962 return 0;
963 }
964
965 if (!svc->local_properties) {
966 /*
967 * Add the service directory first time we
968 * populate the entries.
969 */
970 svc->local_properties = tb_property_copy_dir(tbstream_dir);
971 if (!svc->local_properties)
972 return -ENOMEM;
973 }
974
975 p = tb_property_find(svc->local_properties, name,
976 TB_PROPERTY_TYPE_DIRECTORY);
977 if (p) {
978 dir = p->value.dir;
979
980 p = tb_property_find(dir, "inhopid", TB_PROPERTY_TYPE_VALUE);
981 if (p && p->value.immediate != in_hopid)
982 p->value.immediate = in_hopid;
983 p = tb_property_find(dir, "outhopid", TB_PROPERTY_TYPE_VALUE);
984 if (p && p->value.immediate != out_hopid)
985 p->value.immediate = out_hopid;
986
987 dev_dbg(&svc->dev,
988 "updated local directory %s: in HopID %d, out HopID %d\n",
989 name, in_hopid, out_hopid);
990 } else {
991 uuid_t uuid;
992 int ret;
993
994 uuid_gen(&uuid);
995 dir = tb_property_create_dir(&uuid);
996 if (!dir)
997 return -ENOMEM;
998
999 tb_property_add_immediate(dir, "inhopid", in_hopid);
1000 tb_property_add_immediate(dir, "outhopid", out_hopid);
1001
1002 ret = tb_property_add_dir(svc->local_properties, name, dir);
1003 if (ret) {
1004 tb_property_free_dir(dir);
1005 return ret;
1006 }
1007
1008 dev_dbg(&svc->dev,
1009 "added local directory %s: in HopID %d, out HopID %d\n",
1010 name, in_hopid, out_hopid);
1011 }
1012
1013 return 0;
1014 }
1015
tbstream_dev_update_properties(struct tbstream_dev * sdev)1016 static int tbstream_dev_update_properties(struct tbstream_dev *sdev)
1017 {
1018 struct tbstream *stream;
1019 int ret;
1020
1021 stream = tbstream_get(sdev->stream);
1022 if (!stream)
1023 return 0;
1024
1025 ret = service_update_properties(stream->svc,
1026 config_item_name(&sdev->group.cg_item),
1027 sdev->in_hopid, sdev->out_hopid);
1028 if (!ret)
1029 tb_service_properties_changed(stream->svc);
1030
1031 tbstream_put(stream);
1032 return ret;
1033 }
1034
tbstream_dev_alloc_in_hopid(struct tbstream_dev * sdev,int hopid)1035 static int tbstream_dev_alloc_in_hopid(struct tbstream_dev *sdev, int hopid)
1036 {
1037 struct tb_xdomain *xd = tbstream_dev_xdomain(sdev);
1038 int ret;
1039
1040 if (sdev->in_hopid > 0 && sdev->in_hopid != hopid)
1041 tb_xdomain_release_in_hopid(xd, sdev->in_hopid);
1042 if (!hopid) {
1043 sdev->in_hopid = hopid;
1044 return 0;
1045 }
1046 ret = tb_xdomain_alloc_in_hopid(xd, hopid);
1047 if (ret < 0)
1048 return ret;
1049 /*
1050 * If specific HopID was asked by the user and we did not get
1051 * that one then release and return error instead.
1052 */
1053 if (hopid > 0 && hopid != ret) {
1054 tb_xdomain_release_in_hopid(xd, ret);
1055 return -EBUSY;
1056 }
1057 sdev->in_hopid = ret;
1058 return 0;
1059 }
1060
tbstream_dev_alloc_out_hopid(struct tbstream_dev * sdev,int hopid)1061 static int tbstream_dev_alloc_out_hopid(struct tbstream_dev *sdev, int hopid)
1062 {
1063 struct tb_xdomain *xd = tbstream_dev_xdomain(sdev);
1064 int ret;
1065
1066 if (sdev->out_hopid > 0 && sdev->out_hopid != hopid)
1067 tb_xdomain_release_out_hopid(xd, sdev->out_hopid);
1068 if (!hopid) {
1069 sdev->out_hopid = hopid;
1070 return 0;
1071 }
1072 ret = tb_xdomain_alloc_out_hopid(xd, hopid);
1073 if (ret < 0)
1074 return ret;
1075 if (hopid > 0 && hopid != ret) {
1076 tb_xdomain_release_out_hopid(xd, ret);
1077 return -EBUSY;
1078 }
1079 sdev->out_hopid = ret;
1080 return 0;
1081 }
1082
1083 static ssize_t
tbstream_dev_in_hopid_store(struct config_item * item,const char * buf,size_t count)1084 tbstream_dev_in_hopid_store(struct config_item *item, const char *buf,
1085 size_t count)
1086 {
1087 struct config_group *group = to_config_group(item);
1088 struct tbstream_dev *sdev = tbstream_dev_from_group(group);
1089 int ret, in_hopid;
1090
1091 ret = kstrtoint(buf, 0, &in_hopid);
1092 if (ret)
1093 return ret;
1094
1095 guard(mutex)(&sdev->lock);
1096 if (sdev->users)
1097 return -EBUSY;
1098 if (sdev->stream) {
1099 ret = tbstream_dev_alloc_in_hopid(sdev, in_hopid);
1100 if (ret)
1101 return ret;
1102 ret = tbstream_dev_update_properties(sdev);
1103 } else {
1104 sdev->in_hopid = in_hopid;
1105 }
1106 return ret ? ret : count;
1107 }
1108 CONFIGFS_ATTR(tbstream_dev_, in_hopid);
1109
tbstream_dev_out_hopid_show(struct config_item * item,char * buf)1110 static ssize_t tbstream_dev_out_hopid_show(struct config_item *item, char *buf)
1111 {
1112 struct config_group *group = to_config_group(item);
1113 struct tbstream_dev *sdev = tbstream_dev_from_group(group);
1114
1115 return sysfs_emit(buf, "%d\n", sdev->out_hopid);
1116 }
1117
1118 static ssize_t
tbstream_dev_out_hopid_store(struct config_item * item,const char * buf,size_t count)1119 tbstream_dev_out_hopid_store(struct config_item *item, const char *buf,
1120 size_t count)
1121 {
1122 struct config_group *group = to_config_group(item);
1123 struct tbstream_dev *sdev = tbstream_dev_from_group(group);
1124 int ret, out_hopid;
1125
1126 ret = kstrtoint(buf, 0, &out_hopid);
1127 if (ret)
1128 return ret;
1129
1130 guard(mutex)(&sdev->lock);
1131 if (sdev->users)
1132 return -EBUSY;
1133 if (sdev->stream) {
1134 ret = tbstream_dev_alloc_out_hopid(sdev, out_hopid);
1135 if (ret)
1136 return ret;
1137 ret = tbstream_dev_update_properties(sdev);
1138 } else {
1139 sdev->out_hopid = out_hopid;
1140 }
1141 return ret ? ret : count;
1142 }
1143 CONFIGFS_ATTR(tbstream_dev_, out_hopid);
1144
tbstream_dev_ring_size_show(struct config_item * item,char * buf)1145 static ssize_t tbstream_dev_ring_size_show(struct config_item *item, char *buf)
1146 {
1147 struct config_group *group = to_config_group(item);
1148 struct tbstream_dev *sdev = tbstream_dev_from_group(group);
1149
1150 return sysfs_emit(buf, "%u\n", sdev->ring_size);
1151 }
1152
1153 static ssize_t
tbstream_dev_ring_size_store(struct config_item * item,const char * buf,size_t count)1154 tbstream_dev_ring_size_store(struct config_item *item, const char *buf,
1155 size_t count)
1156 {
1157 struct config_group *group = to_config_group(item);
1158 struct tbstream_dev *sdev = tbstream_dev_from_group(group);
1159 unsigned int ring_size;
1160 int ret;
1161
1162 ret = kstrtouint(buf, 0, &ring_size);
1163 if (ret)
1164 return ret;
1165
1166 if (ring_size < TBSTREAM_DEV_MIN_RING_SIZE ||
1167 ring_size > TBSTREAM_DEV_MAX_RING_SIZE)
1168 return -EINVAL;
1169
1170 guard(mutex)(&sdev->lock);
1171 if (sdev->users)
1172 return -EBUSY;
1173 sdev->ring_size = ring_size;
1174 return count;
1175 }
1176 CONFIGFS_ATTR(tbstream_dev_, ring_size);
1177
tbstream_dev_throttling_show(struct config_item * item,char * buf)1178 static ssize_t tbstream_dev_throttling_show(struct config_item *item, char *buf)
1179 {
1180 struct config_group *group = to_config_group(item);
1181 struct tbstream_dev *sdev = tbstream_dev_from_group(group);
1182
1183 return sysfs_emit(buf, "%u\n", sdev->throttling);
1184 }
1185
1186 static ssize_t
tbstream_dev_throttling_store(struct config_item * item,const char * buf,size_t count)1187 tbstream_dev_throttling_store(struct config_item *item, const char *buf,
1188 size_t count)
1189 {
1190 struct config_group *group = to_config_group(item);
1191 struct tbstream_dev *sdev = tbstream_dev_from_group(group);
1192 unsigned int throttling;
1193 int ret;
1194
1195 ret = kstrtouint(buf, 0, &throttling);
1196 if (ret)
1197 return ret;
1198
1199 if (throttling > TBSTREAM_DEV_MAX_THROTTLING)
1200 return -EINVAL;
1201
1202 guard(mutex)(&sdev->lock);
1203 if (sdev->users)
1204 return -EBUSY;
1205 sdev->throttling = throttling;
1206 return count;
1207 }
1208 CONFIGFS_ATTR(tbstream_dev_, throttling);
1209
1210 static struct configfs_attribute *tbstream_dev_attrs[] = {
1211 &tbstream_dev_attr_index,
1212 &tbstream_dev_attr_in_hopid,
1213 &tbstream_dev_attr_out_hopid,
1214 &tbstream_dev_attr_ring_size,
1215 &tbstream_dev_attr_throttling,
1216 NULL,
1217 };
1218
tbstream_dev_item_release(struct config_item * item)1219 static void tbstream_dev_item_release(struct config_item *item)
1220 {
1221 struct config_group *group = to_config_group(item);
1222 struct tbstream_dev *sdev = tbstream_dev_from_group(group);
1223
1224 misc_deregister(&sdev->misc);
1225 tbstream_dev_put(sdev);
1226 }
1227
1228 static struct configfs_item_operations tbstream_dev_item_ops = {
1229 .release = tbstream_dev_item_release,
1230 };
1231
1232 static const struct config_item_type tbstream_dev_type = {
1233 .ct_owner = THIS_MODULE,
1234 .ct_item_ops = &tbstream_dev_item_ops,
1235 .ct_attrs = tbstream_dev_attrs,
1236 };
1237
service_get_hopids(struct tb_service * svc,const char * name,int * in_hopid,int * out_hopid)1238 static void service_get_hopids(struct tb_service *svc, const char *name,
1239 int *in_hopid, int *out_hopid)
1240 {
1241 struct tb_property_dir *dir;
1242 struct tb_property *p;
1243
1244 guard(mutex)(&svc->lock);
1245
1246 /* See if we have directory entry with the matching name */
1247 p = tb_property_find(svc->remote_properties, name,
1248 TB_PROPERTY_TYPE_DIRECTORY);
1249 if (!p)
1250 return;
1251
1252 dir = p->value.dir;
1253
1254 /*
1255 * We need to reverse the HopIDs on our end so that in becomes
1256 * out and vice versa.
1257 */
1258 p = tb_property_find(dir, "inhopid", TB_PROPERTY_TYPE_VALUE);
1259 if (p && p->value.immediate >= 8)
1260 *out_hopid = p->value.immediate;
1261 p = tb_property_find(dir, "outhopid", TB_PROPERTY_TYPE_VALUE);
1262 if (p && p->value.immediate >= 8)
1263 *in_hopid = p->value.immediate;
1264 }
1265
1266 static void
tbstream_dev_attach_stream(struct tbstream_dev * sdev,struct tbstream_group * sg)1267 tbstream_dev_attach_stream(struct tbstream_dev *sdev, struct tbstream_group *sg)
1268 {
1269 const char *name = config_item_name(&sdev->group.cg_item);
1270 struct tbstream *stream;
1271
1272 stream = tbstream_get(sg->stream);
1273 if (!stream)
1274 return;
1275
1276 scoped_guard(mutex, &sdev->lock) {
1277 sdev->stream = stream;
1278 /*
1279 * If there is no existing configuration (or automatic
1280 * configuration is being used) check if the other side
1281 * has configuration for this and use it.
1282 */
1283 if (sdev->in_hopid <= 0 && sdev->out_hopid <= 0)
1284 service_get_hopids(stream->svc, name, &sdev->in_hopid,
1285 &sdev->out_hopid);
1286 if (sdev->in_hopid)
1287 tbstream_dev_alloc_in_hopid(sdev, sdev->in_hopid);
1288 if (sdev->out_hopid)
1289 tbstream_dev_alloc_out_hopid(sdev, sdev->out_hopid);
1290 }
1291
1292 service_update_properties(stream->svc, name, sdev->in_hopid,
1293 sdev->out_hopid);
1294 tb_service_properties_changed(stream->svc);
1295
1296 /* Notify any openerers that the stream is now attached */
1297 wake_up_interruptible(&sdev->wait);
1298 }
1299
tbstream_dev_detach_stream(struct tbstream_dev * sdev)1300 static void tbstream_dev_detach_stream(struct tbstream_dev *sdev)
1301 {
1302 const char *name = config_item_name(&sdev->group.cg_item);
1303 struct tbstream *stream;
1304 struct tb_xdomain *xd;
1305
1306 scoped_guard(mutex, &sdev->lock) {
1307 stream = sdev->stream;
1308 if (!stream)
1309 return;
1310 sdev->stream = NULL;
1311 xd = tb_service_parent(stream->svc);
1312 if (sdev->out_hopid > 0)
1313 tb_xdomain_release_out_hopid(xd, sdev->out_hopid);
1314 if (sdev->in_hopid > 0)
1315 tb_xdomain_release_in_hopid(xd, sdev->in_hopid);
1316 }
1317
1318 service_update_properties(stream->svc, name, 0, 0);
1319 tb_service_properties_changed(stream->svc);
1320
1321 tbstream_put(stream);
1322
1323 /* Notify any task that the stream is not valid anymore */
1324 wake_up_interruptible_poll(&sdev->wait, EPOLLHUP | EPOLLERR);
1325 }
1326
1327 static inline struct tbstream_group *
to_tbstream_group(struct config_group * group)1328 to_tbstream_group(struct config_group *group)
1329 {
1330 return container_of(group, struct tbstream_group, group);
1331 }
1332
1333 static struct config_group *
tbstream_dev_make_group(struct config_group * group,const char * name)1334 tbstream_dev_make_group(struct config_group *group, const char *name)
1335 {
1336 struct tbstream_group *sg = to_tbstream_group(group);
1337 struct tbstream_dev *sdev;
1338 int ret, index;
1339
1340 /*
1341 * We want the names to be suitable for passing as property
1342 * directory names.
1343 */
1344 if (strlen(name) > TB_PROPERTY_KEY_SIZE)
1345 return ERR_PTR(-ENAMETOOLONG);
1346
1347 sdev = kzalloc_obj(*sdev, GFP_KERNEL);
1348 if (!sdev)
1349 return ERR_PTR(-ENOMEM);
1350
1351 index = ida_alloc(&tbstream_indices, GFP_KERNEL);
1352 if (index < 0) {
1353 kfree(sdev);
1354 return ERR_PTR(index);
1355 }
1356
1357 sdev->index = index;
1358 sdev->ring_size = TBSTREAM_DEV_RING_SIZE;
1359 sdev->throttling = TBSTREAM_DEV_THROTTLING;
1360 mutex_init(&sdev->lock);
1361 init_waitqueue_head(&sdev->wait);
1362 INIT_LIST_HEAD(&sdev->list);
1363 /* This point forward tbstream_dev_put() must be used to release sdev */
1364 kref_init(&sdev->kref);
1365
1366 config_group_init_type_name(&sdev->group, name, &tbstream_dev_type);
1367
1368 scoped_guard(mutex, &sg->lock)
1369 list_add_tail(&sdev->list, &sg->dev_list);
1370
1371 tbstream_dev_attach_stream(sdev, sg);
1372
1373 sdev->misc.name = kasprintf(GFP_KERNEL, "tbstream%d", index);
1374 sdev->misc.minor = MISC_DYNAMIC_MINOR;
1375 sdev->misc.fops = &tbstream_dev_fops;
1376
1377 ret = misc_register(&sdev->misc);
1378 if (ret) {
1379 tbstream_dev_detach_stream(sdev);
1380 scoped_guard(mutex, &sg->lock)
1381 list_del(&sdev->list);
1382 /* Calls tbstream_dev_put() */
1383 config_group_put(&sdev->group);
1384 return ERR_PTR(ret);
1385 }
1386
1387 return &sdev->group;
1388 }
1389
1390 static void
tbstream_dev_drop_item(struct config_group * group,struct config_item * item)1391 tbstream_dev_drop_item(struct config_group *group, struct config_item *item)
1392 {
1393 struct config_group *sdev_group = to_config_group(item);
1394 struct tbstream_dev *sdev = tbstream_dev_from_group(sdev_group);
1395 struct tbstream_group *sg = to_tbstream_group(group);
1396
1397 scoped_guard(mutex, &sg->lock)
1398 list_del(&sdev->list);
1399 /* Notify any task that the underlying group was removed */
1400 sdev->removed = true;
1401 wake_up_interruptible_poll(&sdev->wait, EPOLLHUP | EPOLLERR);
1402 config_item_put(item);
1403 }
1404
1405 static struct configfs_group_operations tbstream_dev_group_ops = {
1406 .make_group = tbstream_dev_make_group,
1407 .drop_item = tbstream_dev_drop_item,
1408 };
1409
tbstream_item_release(struct config_item * item)1410 static void tbstream_item_release(struct config_item *item)
1411 {
1412 struct config_group *group = to_config_group(item);
1413 struct tbstream_group *sg = to_tbstream_group(group);
1414
1415 tbstream_put(sg->stream);
1416 kfree(sg);
1417 }
1418
1419 static struct configfs_item_operations tbstream_item_ops = {
1420 .release = tbstream_item_release,
1421 };
1422
1423 static const struct config_item_type tbstream_dev_group_type = {
1424 .ct_owner = THIS_MODULE,
1425 .ct_group_ops = &tbstream_dev_group_ops,
1426 .ct_item_ops = &tbstream_item_ops,
1427 };
1428
1429 static struct config_group *
tbstream_make_group(struct config_group * group,const char * name)1430 tbstream_make_group(struct config_group *group, const char *name)
1431 {
1432 struct tbstream_group *sg;
1433 struct tbstream *stream;
1434 int domain, index;
1435 u64 route;
1436
1437 /* Make sure the format is correct */
1438 if (sscanf(name, "%u-%llx.%u", &domain, &route, &index) != 3)
1439 return ERR_PTR(-EINVAL);
1440
1441 sg = kzalloc_obj(*sg, GFP_KERNEL);
1442 if (!sg)
1443 return ERR_PTR(-ENOMEM);
1444
1445 mutex_init(&sg->lock);
1446 INIT_LIST_HEAD(&sg->dev_list);
1447
1448 guard(mutex)(&tbstream_lock);
1449 list_for_each_entry(stream, &tbstream_list, list) {
1450 tbstream_get(stream);
1451 if (sysfs_streq(name, dev_name(&stream->svc->dev))) {
1452 sg->stream = stream;
1453 break;
1454 }
1455 tbstream_put(stream);
1456 }
1457
1458 config_group_init_type_name(&sg->group, name, &tbstream_dev_group_type);
1459 return &sg->group;
1460 }
1461
1462 static struct configfs_group_operations tbstream_group_ops = {
1463 .make_group = tbstream_make_group,
1464 };
1465
1466 static const struct config_item_type tbstream_group_type = {
1467 .ct_owner = THIS_MODULE,
1468 .ct_group_ops = &tbstream_group_ops,
1469 };
1470
1471 static struct config_group tbstream_group = {
1472 .cg_item = {
1473 .ci_namebuf = "stream",
1474 .ci_type = &tbstream_group_type,
1475 },
1476 };
1477
1478 /* Returns reference count increased */
tbstream_group_find(struct tbstream * stream)1479 static struct tbstream_group *tbstream_group_find(struct tbstream *stream)
1480 {
1481 const char *name = dev_name(&stream->svc->dev);
1482 struct config_item *item;
1483
1484 guard(mutex)(&tbstream_group.cg_subsys->su_mutex);
1485 item = config_group_find_item(&tbstream_group, name);
1486 if (!item)
1487 return NULL;
1488 return to_tbstream_group(to_config_group(item));
1489 }
1490
tbstream_group_attach_stream(struct tbstream * stream)1491 static void tbstream_group_attach_stream(struct tbstream *stream)
1492 {
1493 struct tbstream_group *sg;
1494 struct tbstream_dev *sdev;
1495
1496 sg = tbstream_group_find(stream);
1497 if (!sg)
1498 return;
1499
1500 guard(mutex)(&sg->lock);
1501 if (WARN_ON(sg->stream)) {
1502 config_group_put(&sg->group);
1503 return;
1504 }
1505 sg->stream = tbstream_get(stream);
1506 /*
1507 * If there are existing stream devices, attach the stream to
1508 * them now.
1509 */
1510 list_for_each_entry(sdev, &sg->dev_list, list) {
1511 tbstream_dev_get(sdev);
1512 tbstream_dev_attach_stream(sdev, sg);
1513 tbstream_dev_put(sdev);
1514 }
1515
1516 config_group_put(&sg->group);
1517 }
1518
tbstream_group_detach_stream(struct tbstream * stream)1519 static void tbstream_group_detach_stream(struct tbstream *stream)
1520 {
1521 struct tbstream_group *sg;
1522 struct tbstream_dev *sdev;
1523
1524 sg = tbstream_group_find(stream);
1525 if (!sg)
1526 return;
1527
1528 guard(mutex)(&sg->lock);
1529 if (sg->stream) {
1530 /* Detach this stream from the stream devices */
1531 list_for_each_entry_reverse(sdev, &sg->dev_list, list) {
1532 tbstream_dev_get(sdev);
1533 tbstream_dev_detach_stream(sdev);
1534 tbstream_dev_put(sdev);
1535 }
1536 tbstream_put(sg->stream);
1537 sg->stream = NULL;
1538 }
1539
1540 config_group_put(&sg->group);
1541 }
1542
tbstream_probe(struct tb_service * svc,const struct tb_service_id * id)1543 static int tbstream_probe(struct tb_service *svc, const struct tb_service_id *id)
1544 {
1545 struct tbstream *stream;
1546
1547 stream = kzalloc_obj(*stream, GFP_KERNEL);
1548 if (!stream)
1549 return -ENOMEM;
1550
1551 /* After this point, release stream by calling tbstream_put() */
1552 kref_init(&stream->kref);
1553 stream->svc = tb_service_get(svc);
1554 INIT_LIST_HEAD(&stream->list);
1555
1556 scoped_guard(mutex, &tbstream_lock)
1557 list_add_tail(&stream->list, &tbstream_list);
1558
1559 tbstream_group_attach_stream(stream);
1560 tb_service_set_drvdata(svc, stream);
1561 return 0;
1562 }
1563
tbstream_remove(struct tb_service * svc)1564 static void tbstream_remove(struct tb_service *svc)
1565 {
1566 struct tbstream *stream = tb_service_get_drvdata(svc);
1567
1568 tbstream_group_detach_stream(stream);
1569 scoped_guard(mutex, &tbstream_lock)
1570 list_del(&stream->list);
1571 tbstream_put(stream);
1572 }
1573
tbstream_suspend(struct device * dev)1574 static int __maybe_unused tbstream_suspend(struct device *dev)
1575 {
1576 struct tb_service *svc = tb_to_service(dev);
1577 struct tbstream *stream = tb_service_get_drvdata(svc);
1578 struct tbstream_group *sg;
1579 struct tbstream_dev *sdev;
1580
1581 sg = tbstream_group_find(stream);
1582 if (!sg)
1583 return 0;
1584
1585 list_for_each_entry_reverse(sdev, &sg->dev_list, list) {
1586 tbstream_dev_get(sdev);
1587 /* Stop the stream (if it was open) */
1588 if (sdev->users)
1589 tbstream_dev_stop(sdev);
1590 tbstream_dev_put(sdev);
1591 }
1592
1593 config_group_put(&sg->group);
1594 return 0;
1595 }
1596
tbstream_resume(struct device * dev)1597 static int __maybe_unused tbstream_resume(struct device *dev)
1598 {
1599 struct tb_service *svc = tb_to_service(dev);
1600 struct tbstream *stream = tb_service_get_drvdata(svc);
1601 struct tbstream_group *sg;
1602 struct tbstream_dev *sdev;
1603
1604 sg = tbstream_group_find(stream);
1605 if (!sg)
1606 return 0;
1607
1608 list_for_each_entry(sdev, &sg->dev_list, list) {
1609 tbstream_dev_get(sdev);
1610 if (sdev->users) {
1611 int ret;
1612
1613 ret = tbstream_dev_start(sdev);
1614 if (ret) {
1615 tbstream_dev_put(sdev);
1616 config_group_put(&sg->group);
1617 return ret;
1618 }
1619 }
1620 tbstream_dev_put(sdev);
1621 }
1622
1623 config_group_put(&sg->group);
1624 return 0;
1625 }
1626
1627 static const struct dev_pm_ops tbstream_pm_ops = {
1628 SET_SYSTEM_SLEEP_PM_OPS(tbstream_suspend, tbstream_resume)
1629 };
1630
1631 static const struct tb_service_id tbstream_ids[] = {
1632 { TB_SERVICE("stream", 1) },
1633 { },
1634 };
1635 MODULE_DEVICE_TABLE(tbsvc, tbstream_ids);
1636
1637 static struct tb_service_driver tbstream_driver = {
1638 .driver = {
1639 .owner = THIS_MODULE,
1640 .name = "thunderbolt_stream",
1641 .pm = &tbstream_pm_ops,
1642 },
1643 .probe = tbstream_probe,
1644 .remove = tbstream_remove,
1645 .id_table = tbstream_ids,
1646 };
1647
tbstream_init(void)1648 static int __init tbstream_init(void)
1649 {
1650 int ret;
1651
1652 tbstream_dir = tb_property_create_dir(&tbstream_dir_uuid);
1653 if (!tbstream_dir)
1654 return -ENOMEM;
1655
1656 tb_property_add_immediate(tbstream_dir, "prtcid", 1);
1657 tb_property_add_immediate(tbstream_dir, "prtcvers", 1);
1658 tb_property_add_immediate(tbstream_dir, "prtcrevs", 0);
1659 tb_property_add_immediate(tbstream_dir, "prtcstns", 0);
1660
1661 ret = tb_register_property_dir("stream", tbstream_dir);
1662 if (ret)
1663 goto err_free_dir;
1664
1665 config_group_init(&tbstream_group);
1666 ret = tb_configfs_register_group(&tbstream_group);
1667 if (ret)
1668 goto err_unregister_dir;
1669
1670 ret = tb_register_service_driver(&tbstream_driver);
1671 if (ret)
1672 goto err_unregister_group;
1673 return 0;
1674
1675 err_unregister_group:
1676 tb_configfs_unregister_group(&tbstream_group);
1677 err_unregister_dir:
1678 tb_unregister_property_dir("stream", tbstream_dir);
1679 err_free_dir:
1680 tb_property_free_dir(tbstream_dir);
1681 return ret;
1682 }
1683 module_init(tbstream_init);
1684
tbstream_exit(void)1685 static void __exit tbstream_exit(void)
1686 {
1687 tb_unregister_service_driver(&tbstream_driver);
1688 tb_configfs_unregister_group(&tbstream_group);
1689 tb_unregister_property_dir("stream", tbstream_dir);
1690 tb_property_free_dir(tbstream_dir);
1691 ida_destroy(&tbstream_indices);
1692 }
1693 module_exit(tbstream_exit);
1694
1695 MODULE_AUTHOR("Alan Borzeszkowski <alan.borzeszkowski@linux.intel.com>");
1696 MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
1697 MODULE_DESCRIPTION("Stream data over Thunderbolt/USB4 cable");
1698 MODULE_LICENSE("GPL");
1699