1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * A generic kernel FIFO implementation 4 * 5 * Copyright (C) 2013 Stefani Seibold <stefani@seibold.net> 6 */ 7 8 #ifndef _LINUX_KFIFO_H 9 #define _LINUX_KFIFO_H 10 11 /* 12 * How to porting drivers to the new generic FIFO API: 13 * 14 * - Modify the declaration of the "struct kfifo *" object into a 15 * in-place "struct kfifo" object 16 * - Init the in-place object with kfifo_alloc() or kfifo_init() 17 * Note: The address of the in-place "struct kfifo" object must be 18 * passed as the first argument to this functions 19 * - Replace the use of __kfifo_put into kfifo_in and __kfifo_get 20 * into kfifo_out 21 * - Replace the use of kfifo_put into kfifo_in_spinlocked and kfifo_get 22 * into kfifo_out_spinlocked 23 * Note: the spinlock pointer formerly passed to kfifo_init/kfifo_alloc 24 * must be passed now to the kfifo_in_spinlocked and kfifo_out_spinlocked 25 * as the last parameter 26 * - The formerly __kfifo_* functions are renamed into kfifo_* 27 */ 28 29 /* 30 * Note about locking: There is no locking required until only one reader 31 * and one writer is using the fifo and no kfifo_reset() will be called. 32 * kfifo_reset_out() can be safely used, until it will be only called 33 * in the reader thread. 34 * For multiple writer and one reader there is only a need to lock the writer. 35 * And vice versa for only one writer and multiple reader there is only a need 36 * to lock the reader. 37 */ 38 39 #include <linux/array_size.h> 40 #include <linux/spinlock.h> 41 #include <linux/stddef.h> 42 #include <linux/types.h> 43 44 #include <asm/barrier.h> 45 #include <asm/errno.h> 46 47 struct scatterlist; 48 49 struct __kfifo { 50 unsigned int in; 51 unsigned int out; 52 unsigned int mask; 53 unsigned int esize; 54 void *data; 55 }; 56 57 #define __STRUCT_KFIFO_COMMON(datatype, recsize, ptrtype) \ 58 union { \ 59 struct __kfifo kfifo; \ 60 datatype *type; \ 61 const datatype *const_type; \ 62 char (*rectype)[recsize]; \ 63 ptrtype *ptr; \ 64 ptrtype const *ptr_const; \ 65 } 66 67 #define __STRUCT_KFIFO(type, size, recsize, ptrtype) \ 68 { \ 69 __STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \ 70 type buf[((size < 2) || (size & (size - 1))) ? -1 : size]; \ 71 } 72 73 #define STRUCT_KFIFO(type, size) \ 74 struct __STRUCT_KFIFO(type, size, 0, type) 75 76 #define __STRUCT_KFIFO_PTR(type, recsize, ptrtype) \ 77 { \ 78 __STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \ 79 type buf[0]; \ 80 } 81 82 #define STRUCT_KFIFO_PTR(type) \ 83 struct __STRUCT_KFIFO_PTR(type, 0, type) 84 85 /* 86 * define compatibility "struct kfifo" for dynamic allocated fifos 87 */ 88 struct kfifo __STRUCT_KFIFO_PTR(unsigned char, 0, void); 89 90 #define STRUCT_KFIFO_REC_1(size) \ 91 struct __STRUCT_KFIFO(unsigned char, size, 1, void) 92 93 #define STRUCT_KFIFO_REC_2(size) \ 94 struct __STRUCT_KFIFO(unsigned char, size, 2, void) 95 96 /* 97 * define kfifo_rec types 98 */ 99 struct kfifo_rec_ptr_1 __STRUCT_KFIFO_PTR(unsigned char, 1, void); 100 struct kfifo_rec_ptr_2 __STRUCT_KFIFO_PTR(unsigned char, 2, void); 101 102 /* 103 * helper macro to distinguish between real in place fifo where the fifo 104 * array is a part of the structure and the fifo type where the array is 105 * outside of the fifo structure. 106 */ 107 #define __is_kfifo_ptr(fifo) \ 108 (sizeof(*fifo) == sizeof(STRUCT_KFIFO_PTR(typeof(*(fifo)->type)))) 109 110 /** 111 * DECLARE_KFIFO_PTR - macro to declare a fifo pointer object 112 * @fifo: name of the declared fifo 113 * @type: type of the fifo elements 114 */ 115 #define DECLARE_KFIFO_PTR(fifo, type) STRUCT_KFIFO_PTR(type) fifo 116 117 /** 118 * DECLARE_KFIFO - macro to declare a fifo object 119 * @fifo: name of the declared fifo 120 * @type: type of the fifo elements 121 * @size: the number of elements in the fifo, this must be a power of 2 122 */ 123 #define DECLARE_KFIFO(fifo, type, size) STRUCT_KFIFO(type, size) fifo 124 125 /** 126 * INIT_KFIFO - Initialize a fifo declared by DECLARE_KFIFO 127 * @fifo: name of the declared fifo datatype 128 */ 129 #define INIT_KFIFO(fifo) \ 130 (void)({ \ 131 typeof(&(fifo)) __tmp = &(fifo); \ 132 struct __kfifo *__kfifo = &__tmp->kfifo; \ 133 __kfifo->in = 0; \ 134 __kfifo->out = 0; \ 135 __kfifo->mask = __is_kfifo_ptr(__tmp) ? 0 : ARRAY_SIZE(__tmp->buf) - 1;\ 136 __kfifo->esize = sizeof(*__tmp->buf); \ 137 __kfifo->data = __is_kfifo_ptr(__tmp) ? NULL : __tmp->buf; \ 138 }) 139 140 /** 141 * DEFINE_KFIFO - macro to define and initialize a fifo 142 * @fifo: name of the declared fifo datatype 143 * @type: type of the fifo elements 144 * @size: the number of elements in the fifo, this must be a power of 2 145 * 146 * Note: the macro can be used for global and local fifo data type variables. 147 */ 148 #define DEFINE_KFIFO(fifo, type, size) \ 149 DECLARE_KFIFO(fifo, type, size) = \ 150 (typeof(fifo)) { \ 151 { \ 152 { \ 153 .in = 0, \ 154 .out = 0, \ 155 .mask = __is_kfifo_ptr(&(fifo)) ? \ 156 0 : \ 157 ARRAY_SIZE((fifo).buf) - 1, \ 158 .esize = sizeof(*(fifo).buf), \ 159 .data = __is_kfifo_ptr(&(fifo)) ? \ 160 NULL : \ 161 (fifo).buf, \ 162 } \ 163 } \ 164 } 165 166 167 static inline unsigned int __must_check 168 __kfifo_uint_must_check_helper(unsigned int val) 169 { 170 return val; 171 } 172 173 static inline int __must_check 174 __kfifo_int_must_check_helper(int val) 175 { 176 return val; 177 } 178 179 /** 180 * kfifo_initialized - Check if the fifo is initialized 181 * @fifo: address of the fifo to check 182 * 183 * Return %true if fifo is initialized, otherwise %false. 184 * Assumes the fifo was 0 before. 185 */ 186 #define kfifo_initialized(fifo) ((fifo)->kfifo.mask) 187 188 /** 189 * kfifo_esize - returns the size of the element managed by the fifo 190 * @fifo: address of the fifo to be used 191 */ 192 #define kfifo_esize(fifo) ((fifo)->kfifo.esize) 193 194 /** 195 * kfifo_recsize - returns the size of the record length field 196 * @fifo: address of the fifo to be used 197 */ 198 #define kfifo_recsize(fifo) (sizeof(*(fifo)->rectype)) 199 200 /** 201 * kfifo_size - returns the size of the fifo in elements 202 * @fifo: address of the fifo to be used 203 */ 204 #define kfifo_size(fifo) ((fifo)->kfifo.mask + 1) 205 206 /** 207 * kfifo_reset - removes the entire fifo content 208 * @fifo: address of the fifo to be used 209 * 210 * Note: usage of kfifo_reset() is dangerous. It should be only called when the 211 * fifo is exclusived locked or when it is secured that no other thread is 212 * accessing the fifo. 213 */ 214 #define kfifo_reset(fifo) \ 215 (void)({ \ 216 typeof((fifo) + 1) __tmp = (fifo); \ 217 __tmp->kfifo.in = __tmp->kfifo.out = 0; \ 218 }) 219 220 /** 221 * kfifo_reset_out - skip fifo content 222 * @fifo: address of the fifo to be used 223 * 224 * Note: The usage of kfifo_reset_out() is safe until it will be only called 225 * from the reader thread and there is only one concurrent reader. Otherwise 226 * it is dangerous and must be handled in the same way as kfifo_reset(). 227 */ 228 #define kfifo_reset_out(fifo) \ 229 (void)({ \ 230 typeof((fifo) + 1) __tmp = (fifo); \ 231 __tmp->kfifo.out = __tmp->kfifo.in; \ 232 }) 233 234 /** 235 * kfifo_len - returns the number of used elements in the fifo 236 * @fifo: address of the fifo to be used 237 */ 238 #define kfifo_len(fifo) \ 239 ({ \ 240 typeof((fifo) + 1) __tmpl = (fifo); \ 241 __tmpl->kfifo.in - __tmpl->kfifo.out; \ 242 }) 243 244 /** 245 * kfifo_is_empty - returns true if the fifo is empty 246 * @fifo: address of the fifo to be used 247 */ 248 #define kfifo_is_empty(fifo) \ 249 ({ \ 250 typeof((fifo) + 1) __tmpq = (fifo); \ 251 __tmpq->kfifo.in == __tmpq->kfifo.out; \ 252 }) 253 254 /** 255 * kfifo_is_empty_spinlocked - returns true if the fifo is empty using 256 * a spinlock for locking 257 * @fifo: address of the fifo to be used 258 * @lock: spinlock to be used for locking 259 */ 260 #define kfifo_is_empty_spinlocked(fifo, lock) \ 261 ({ \ 262 unsigned long __flags; \ 263 bool __ret; \ 264 spin_lock_irqsave(lock, __flags); \ 265 __ret = kfifo_is_empty(fifo); \ 266 spin_unlock_irqrestore(lock, __flags); \ 267 __ret; \ 268 }) 269 270 /** 271 * kfifo_is_empty_spinlocked_noirqsave - returns true if the fifo is empty 272 * using a spinlock for locking, doesn't disable interrupts 273 * @fifo: address of the fifo to be used 274 * @lock: spinlock to be used for locking 275 */ 276 #define kfifo_is_empty_spinlocked_noirqsave(fifo, lock) \ 277 ({ \ 278 bool __ret; \ 279 spin_lock(lock); \ 280 __ret = kfifo_is_empty(fifo); \ 281 spin_unlock(lock); \ 282 __ret; \ 283 }) 284 285 /** 286 * kfifo_is_full - returns true if the fifo is full 287 * @fifo: address of the fifo to be used 288 */ 289 #define kfifo_is_full(fifo) \ 290 ({ \ 291 typeof((fifo) + 1) __tmpq = (fifo); \ 292 kfifo_len(__tmpq) > __tmpq->kfifo.mask; \ 293 }) 294 295 /** 296 * kfifo_avail - returns the number of unused elements in the fifo 297 * @fifo: address of the fifo to be used 298 */ 299 #define kfifo_avail(fifo) \ 300 __kfifo_uint_must_check_helper( \ 301 ({ \ 302 typeof((fifo) + 1) __tmpq = (fifo); \ 303 const size_t __recsize = sizeof(*__tmpq->rectype); \ 304 unsigned int __avail = kfifo_size(__tmpq) - kfifo_len(__tmpq); \ 305 (__recsize) ? ((__avail <= __recsize) ? 0 : \ 306 __kfifo_max_r(__avail - __recsize, __recsize)) : \ 307 __avail; \ 308 }) \ 309 ) 310 311 /** 312 * kfifo_skip_count - skip output data 313 * @fifo: address of the fifo to be used 314 * @count: count of data to skip 315 */ 316 #define kfifo_skip_count(fifo, count) do { \ 317 typeof((fifo) + 1) __tmp = (fifo); \ 318 const size_t __recsize = sizeof(*__tmp->rectype); \ 319 struct __kfifo *__kfifo = &__tmp->kfifo; \ 320 if (__recsize) \ 321 __kfifo_skip_r(__kfifo, __recsize); \ 322 else \ 323 __kfifo->out += (count); \ 324 } while(0) 325 326 /** 327 * kfifo_skip - skip output data 328 * @fifo: address of the fifo to be used 329 */ 330 #define kfifo_skip(fifo) kfifo_skip_count(fifo, 1) 331 332 /** 333 * kfifo_peek_len - gets the size of the next fifo record 334 * @fifo: address of the fifo to be used 335 * 336 * This function returns the size of the next fifo record in number of bytes. 337 */ 338 #define kfifo_peek_len(fifo) \ 339 __kfifo_uint_must_check_helper( \ 340 ({ \ 341 typeof((fifo) + 1) __tmp = (fifo); \ 342 const size_t __recsize = sizeof(*__tmp->rectype); \ 343 struct __kfifo *__kfifo = &__tmp->kfifo; \ 344 (!__recsize) ? kfifo_len(__tmp) * sizeof(*__tmp->type) : \ 345 __kfifo_len_r(__kfifo, __recsize); \ 346 }) \ 347 ) 348 349 /** 350 * kfifo_alloc - dynamically allocates a new fifo buffer 351 * @fifo: pointer to the fifo 352 * @size: the number of elements in the fifo, this must be a power of 2 353 * @gfp_mask: get_free_pages mask, passed to kmalloc() 354 * 355 * This macro dynamically allocates a new fifo buffer. 356 * 357 * The number of elements will be rounded-up to a power of 2. 358 * The fifo will be release with kfifo_free(). 359 * Return 0 if no error, otherwise an error code. 360 */ 361 #define kfifo_alloc(fifo, size, gfp_mask) \ 362 __kfifo_int_must_check_helper( \ 363 ({ \ 364 typeof((fifo) + 1) __tmp = (fifo); \ 365 struct __kfifo *__kfifo = &__tmp->kfifo; \ 366 __is_kfifo_ptr(__tmp) ? \ 367 __kfifo_alloc(__kfifo, size, sizeof(*__tmp->type), gfp_mask) : \ 368 -EINVAL; \ 369 }) \ 370 ) 371 372 /** 373 * kfifo_free - frees the fifo 374 * @fifo: the fifo to be freed 375 */ 376 #define kfifo_free(fifo) \ 377 ({ \ 378 typeof((fifo) + 1) __tmp = (fifo); \ 379 struct __kfifo *__kfifo = &__tmp->kfifo; \ 380 if (__is_kfifo_ptr(__tmp)) \ 381 __kfifo_free(__kfifo); \ 382 }) 383 384 /** 385 * kfifo_init - initialize a fifo using a preallocated buffer 386 * @fifo: the fifo to assign the buffer 387 * @buffer: the preallocated buffer to be used 388 * @size: the size of the internal buffer, this have to be a power of 2 389 * 390 * This macro initializes a fifo using a preallocated buffer. 391 * 392 * The number of elements will be rounded-up to a power of 2. 393 * Return 0 if no error, otherwise an error code. 394 */ 395 #define kfifo_init(fifo, buffer, size) \ 396 ({ \ 397 typeof((fifo) + 1) __tmp = (fifo); \ 398 struct __kfifo *__kfifo = &__tmp->kfifo; \ 399 __is_kfifo_ptr(__tmp) ? \ 400 __kfifo_init(__kfifo, buffer, size, sizeof(*__tmp->type)) : \ 401 -EINVAL; \ 402 }) 403 404 /** 405 * kfifo_put - put data into the fifo 406 * @fifo: address of the fifo to be used 407 * @val: the data to be added 408 * 409 * This macro copies the given value into the fifo. 410 * It returns 0 if the fifo was full. Otherwise it returns the number 411 * processed elements. 412 * 413 * Note that with only one concurrent reader and one concurrent 414 * writer, you don't need extra locking to use these macro. 415 */ 416 #define kfifo_put(fifo, val) \ 417 ({ \ 418 typeof((fifo) + 1) __tmp = (fifo); \ 419 typeof(*__tmp->const_type) __val = (val); \ 420 unsigned int __ret; \ 421 size_t __recsize = sizeof(*__tmp->rectype); \ 422 struct __kfifo *__kfifo = &__tmp->kfifo; \ 423 if (__recsize) \ 424 __ret = __kfifo_in_r(__kfifo, &__val, sizeof(__val), \ 425 __recsize); \ 426 else { \ 427 __ret = !kfifo_is_full(__tmp); \ 428 if (__ret) { \ 429 (__is_kfifo_ptr(__tmp) ? \ 430 ((typeof(__tmp->type))__kfifo->data) : \ 431 (__tmp->buf) \ 432 )[__kfifo->in & __tmp->kfifo.mask] = \ 433 *(typeof(__tmp->type))&__val; \ 434 smp_wmb(); \ 435 __kfifo->in++; \ 436 } \ 437 } \ 438 __ret; \ 439 }) 440 441 /** 442 * kfifo_get - get data from the fifo 443 * @fifo: address of the fifo to be used 444 * @val: address where to store the data 445 * 446 * This macro reads the data from the fifo. 447 * It returns 0 if the fifo was empty. Otherwise it returns the number 448 * processed elements. 449 * 450 * Note that with only one concurrent reader and one concurrent 451 * writer, you don't need extra locking to use these macro. 452 */ 453 #define kfifo_get(fifo, val) \ 454 __kfifo_uint_must_check_helper( \ 455 ({ \ 456 typeof((fifo) + 1) __tmp = (fifo); \ 457 typeof(__tmp->ptr) __val = (val); \ 458 unsigned int __ret; \ 459 const size_t __recsize = sizeof(*__tmp->rectype); \ 460 struct __kfifo *__kfifo = &__tmp->kfifo; \ 461 if (__recsize) \ 462 __ret = __kfifo_out_r(__kfifo, __val, sizeof(*__val), \ 463 __recsize); \ 464 else { \ 465 __ret = !kfifo_is_empty(__tmp); \ 466 if (__ret) { \ 467 *(typeof(__tmp->type))__val = \ 468 (__is_kfifo_ptr(__tmp) ? \ 469 ((typeof(__tmp->type))__kfifo->data) : \ 470 (__tmp->buf) \ 471 )[__kfifo->out & __tmp->kfifo.mask]; \ 472 smp_wmb(); \ 473 __kfifo->out++; \ 474 } \ 475 } \ 476 __ret; \ 477 }) \ 478 ) 479 480 /** 481 * kfifo_peek - get data from the fifo without removing 482 * @fifo: address of the fifo to be used 483 * @val: address where to store the data 484 * 485 * This reads the data from the fifo without removing it from the fifo. 486 * It returns 0 if the fifo was empty. Otherwise it returns the number 487 * processed elements. 488 * 489 * Note that with only one concurrent reader and one concurrent 490 * writer, you don't need extra locking to use these macro. 491 */ 492 #define kfifo_peek(fifo, val) \ 493 __kfifo_uint_must_check_helper( \ 494 ({ \ 495 typeof((fifo) + 1) __tmp = (fifo); \ 496 typeof(__tmp->ptr) __val = (val); \ 497 unsigned int __ret; \ 498 const size_t __recsize = sizeof(*__tmp->rectype); \ 499 struct __kfifo *__kfifo = &__tmp->kfifo; \ 500 if (__recsize) \ 501 __ret = __kfifo_out_peek_r(__kfifo, __val, sizeof(*__val), \ 502 __recsize); \ 503 else { \ 504 __ret = !kfifo_is_empty(__tmp); \ 505 if (__ret) { \ 506 *(typeof(__tmp->type))__val = \ 507 (__is_kfifo_ptr(__tmp) ? \ 508 ((typeof(__tmp->type))__kfifo->data) : \ 509 (__tmp->buf) \ 510 )[__kfifo->out & __tmp->kfifo.mask]; \ 511 smp_wmb(); \ 512 } \ 513 } \ 514 __ret; \ 515 }) \ 516 ) 517 518 /** 519 * kfifo_in - put data into the fifo 520 * @fifo: address of the fifo to be used 521 * @buf: the data to be added 522 * @n: number of elements to be added 523 * 524 * This macro copies the given buffer into the fifo and returns the 525 * number of copied elements. 526 * 527 * Note that with only one concurrent reader and one concurrent 528 * writer, you don't need extra locking to use these macro. 529 */ 530 #define kfifo_in(fifo, buf, n) \ 531 ({ \ 532 typeof((fifo) + 1) __tmp = (fifo); \ 533 typeof(__tmp->ptr_const) __buf = (buf); \ 534 unsigned long __n = (n); \ 535 const size_t __recsize = sizeof(*__tmp->rectype); \ 536 struct __kfifo *__kfifo = &__tmp->kfifo; \ 537 (__recsize) ?\ 538 __kfifo_in_r(__kfifo, __buf, __n, __recsize) : \ 539 __kfifo_in(__kfifo, __buf, __n); \ 540 }) 541 542 /** 543 * kfifo_in_spinlocked - put data into the fifo using a spinlock for locking 544 * @fifo: address of the fifo to be used 545 * @buf: the data to be added 546 * @n: number of elements to be added 547 * @lock: pointer to the spinlock to use for locking 548 * 549 * This macro copies the given values buffer into the fifo and returns the 550 * number of copied elements. 551 */ 552 #define kfifo_in_spinlocked(fifo, buf, n, lock) \ 553 ({ \ 554 unsigned long __flags; \ 555 unsigned int __ret; \ 556 spin_lock_irqsave(lock, __flags); \ 557 __ret = kfifo_in(fifo, buf, n); \ 558 spin_unlock_irqrestore(lock, __flags); \ 559 __ret; \ 560 }) 561 562 /** 563 * kfifo_in_spinlocked_noirqsave - put data into fifo using a spinlock for 564 * locking, don't disable interrupts 565 * @fifo: address of the fifo to be used 566 * @buf: the data to be added 567 * @n: number of elements to be added 568 * @lock: pointer to the spinlock to use for locking 569 * 570 * This is a variant of kfifo_in_spinlocked() but uses spin_lock/unlock() 571 * for locking and doesn't disable interrupts. 572 */ 573 #define kfifo_in_spinlocked_noirqsave(fifo, buf, n, lock) \ 574 ({ \ 575 unsigned int __ret; \ 576 spin_lock(lock); \ 577 __ret = kfifo_in(fifo, buf, n); \ 578 spin_unlock(lock); \ 579 __ret; \ 580 }) 581 582 /* alias for kfifo_in_spinlocked, will be removed in a future release */ 583 #define kfifo_in_locked(fifo, buf, n, lock) \ 584 kfifo_in_spinlocked(fifo, buf, n, lock) 585 586 /** 587 * kfifo_out - get data from the fifo 588 * @fifo: address of the fifo to be used 589 * @buf: pointer to the storage buffer 590 * @n: max. number of elements to get 591 * 592 * This macro gets some data from the fifo and returns the numbers of elements 593 * copied. 594 * 595 * Note that with only one concurrent reader and one concurrent 596 * writer, you don't need extra locking to use these macro. 597 */ 598 #define kfifo_out(fifo, buf, n) \ 599 __kfifo_uint_must_check_helper( \ 600 ({ \ 601 typeof((fifo) + 1) __tmp = (fifo); \ 602 typeof(__tmp->ptr) __buf = (buf); \ 603 unsigned long __n = (n); \ 604 const size_t __recsize = sizeof(*__tmp->rectype); \ 605 struct __kfifo *__kfifo = &__tmp->kfifo; \ 606 (__recsize) ?\ 607 __kfifo_out_r(__kfifo, __buf, __n, __recsize) : \ 608 __kfifo_out(__kfifo, __buf, __n); \ 609 }) \ 610 ) 611 612 /** 613 * kfifo_out_spinlocked - get data from the fifo using a spinlock for locking 614 * @fifo: address of the fifo to be used 615 * @buf: pointer to the storage buffer 616 * @n: max. number of elements to get 617 * @lock: pointer to the spinlock to use for locking 618 * 619 * This macro gets the data from the fifo and returns the numbers of elements 620 * copied. 621 */ 622 #define kfifo_out_spinlocked(fifo, buf, n, lock) \ 623 __kfifo_uint_must_check_helper( \ 624 ({ \ 625 unsigned long __flags; \ 626 unsigned int __ret; \ 627 spin_lock_irqsave(lock, __flags); \ 628 __ret = kfifo_out(fifo, buf, n); \ 629 spin_unlock_irqrestore(lock, __flags); \ 630 __ret; \ 631 }) \ 632 ) 633 634 /** 635 * kfifo_out_spinlocked_noirqsave - get data from the fifo using a spinlock 636 * for locking, don't disable interrupts 637 * @fifo: address of the fifo to be used 638 * @buf: pointer to the storage buffer 639 * @n: max. number of elements to get 640 * @lock: pointer to the spinlock to use for locking 641 * 642 * This is a variant of kfifo_out_spinlocked() which uses spin_lock/unlock() 643 * for locking and doesn't disable interrupts. 644 */ 645 #define kfifo_out_spinlocked_noirqsave(fifo, buf, n, lock) \ 646 __kfifo_uint_must_check_helper( \ 647 ({ \ 648 unsigned int __ret; \ 649 spin_lock(lock); \ 650 __ret = kfifo_out(fifo, buf, n); \ 651 spin_unlock(lock); \ 652 __ret; \ 653 }) \ 654 ) 655 656 /* alias for kfifo_out_spinlocked, will be removed in a future release */ 657 #define kfifo_out_locked(fifo, buf, n, lock) \ 658 kfifo_out_spinlocked(fifo, buf, n, lock) 659 660 /** 661 * kfifo_from_user - puts some data from user space into the fifo 662 * @fifo: address of the fifo to be used 663 * @from: pointer to the data to be added 664 * @len: the length of the data to be added 665 * @copied: pointer to output variable to store the number of copied bytes 666 * 667 * This macro copies at most @len bytes from the @from into the 668 * fifo, depending of the available space and returns -EFAULT/0. 669 * 670 * Note that with only one concurrent reader and one concurrent 671 * writer, you don't need extra locking to use these macro. 672 */ 673 #define kfifo_from_user(fifo, from, len, copied) \ 674 __kfifo_uint_must_check_helper( \ 675 ({ \ 676 typeof((fifo) + 1) __tmp = (fifo); \ 677 const void __user *__from = (from); \ 678 unsigned int __len = (len); \ 679 unsigned int *__copied = (copied); \ 680 const size_t __recsize = sizeof(*__tmp->rectype); \ 681 struct __kfifo *__kfifo = &__tmp->kfifo; \ 682 (__recsize) ? \ 683 __kfifo_from_user_r(__kfifo, __from, __len, __copied, __recsize) : \ 684 __kfifo_from_user(__kfifo, __from, __len, __copied); \ 685 }) \ 686 ) 687 688 /** 689 * kfifo_to_user - copies data from the fifo into user space 690 * @fifo: address of the fifo to be used 691 * @to: where the data must be copied 692 * @len: the size of the destination buffer 693 * @copied: pointer to output variable to store the number of copied bytes 694 * 695 * This macro copies at most @len bytes from the fifo into the 696 * @to buffer and returns -EFAULT/0. 697 * 698 * Note that with only one concurrent reader and one concurrent 699 * writer, you don't need extra locking to use these macro. 700 */ 701 #define kfifo_to_user(fifo, to, len, copied) \ 702 __kfifo_int_must_check_helper( \ 703 ({ \ 704 typeof((fifo) + 1) __tmp = (fifo); \ 705 void __user *__to = (to); \ 706 unsigned int __len = (len); \ 707 unsigned int *__copied = (copied); \ 708 const size_t __recsize = sizeof(*__tmp->rectype); \ 709 struct __kfifo *__kfifo = &__tmp->kfifo; \ 710 (__recsize) ? \ 711 __kfifo_to_user_r(__kfifo, __to, __len, __copied, __recsize) : \ 712 __kfifo_to_user(__kfifo, __to, __len, __copied); \ 713 }) \ 714 ) 715 716 /** 717 * kfifo_dma_in_prepare_mapped - setup a scatterlist for DMA input 718 * @fifo: address of the fifo to be used 719 * @sgl: pointer to the scatterlist array 720 * @nents: number of entries in the scatterlist array 721 * @len: number of elements to transfer 722 * @dma: mapped dma address to fill into @sgl 723 * 724 * This macro fills a scatterlist for DMA input. 725 * It returns the number entries in the scatterlist array. 726 * 727 * Note that with only one concurrent reader and one concurrent 728 * writer, you don't need extra locking to use these macros. 729 */ 730 #define kfifo_dma_in_prepare_mapped(fifo, sgl, nents, len, dma) \ 731 ({ \ 732 typeof((fifo) + 1) __tmp = (fifo); \ 733 struct scatterlist *__sgl = (sgl); \ 734 int __nents = (nents); \ 735 unsigned int __len = (len); \ 736 const size_t __recsize = sizeof(*__tmp->rectype); \ 737 struct __kfifo *__kfifo = &__tmp->kfifo; \ 738 (__recsize) ? \ 739 __kfifo_dma_in_prepare_r(__kfifo, __sgl, __nents, __len, __recsize, \ 740 dma) : \ 741 __kfifo_dma_in_prepare(__kfifo, __sgl, __nents, __len, dma); \ 742 }) 743 744 #define kfifo_dma_in_prepare(fifo, sgl, nents, len) \ 745 kfifo_dma_in_prepare_mapped(fifo, sgl, nents, len, DMA_MAPPING_ERROR) 746 747 /** 748 * kfifo_dma_in_finish - finish a DMA IN operation 749 * @fifo: address of the fifo to be used 750 * @len: number of bytes to received 751 * 752 * This macro finishes a DMA IN operation. The in counter will be updated by 753 * the len parameter. No error checking will be done. 754 * 755 * Note that with only one concurrent reader and one concurrent 756 * writer, you don't need extra locking to use these macros. 757 */ 758 #define kfifo_dma_in_finish(fifo, len) \ 759 (void)({ \ 760 typeof((fifo) + 1) __tmp = (fifo); \ 761 unsigned int __len = (len); \ 762 const size_t __recsize = sizeof(*__tmp->rectype); \ 763 struct __kfifo *__kfifo = &__tmp->kfifo; \ 764 if (__recsize) \ 765 __kfifo_dma_in_finish_r(__kfifo, __len, __recsize); \ 766 else \ 767 __kfifo->in += __len / sizeof(*__tmp->type); \ 768 }) 769 770 /** 771 * kfifo_dma_out_prepare_mapped - setup a scatterlist for DMA output 772 * @fifo: address of the fifo to be used 773 * @sgl: pointer to the scatterlist array 774 * @nents: number of entries in the scatterlist array 775 * @len: number of elements to transfer 776 * @dma: mapped dma address to fill into @sgl 777 * 778 * This macro fills a scatterlist for DMA output which at most @len bytes 779 * to transfer. 780 * It returns the number entries in the scatterlist array. 781 * A zero means there is no space available and the scatterlist is not filled. 782 * 783 * Note that with only one concurrent reader and one concurrent 784 * writer, you don't need extra locking to use these macros. 785 */ 786 #define kfifo_dma_out_prepare_mapped(fifo, sgl, nents, len, dma) \ 787 ({ \ 788 typeof((fifo) + 1) __tmp = (fifo); \ 789 struct scatterlist *__sgl = (sgl); \ 790 int __nents = (nents); \ 791 unsigned int __len = (len); \ 792 const size_t __recsize = sizeof(*__tmp->rectype); \ 793 struct __kfifo *__kfifo = &__tmp->kfifo; \ 794 (__recsize) ? \ 795 __kfifo_dma_out_prepare_r(__kfifo, __sgl, __nents, __len, __recsize, \ 796 dma) : \ 797 __kfifo_dma_out_prepare(__kfifo, __sgl, __nents, __len, dma); \ 798 }) 799 800 #define kfifo_dma_out_prepare(fifo, sgl, nents, len) \ 801 kfifo_dma_out_prepare_mapped(fifo, sgl, nents, len, DMA_MAPPING_ERROR) 802 803 /** 804 * kfifo_dma_out_finish - finish a DMA OUT operation 805 * @fifo: address of the fifo to be used 806 * @len: number of bytes transferred 807 * 808 * This macro finishes a DMA OUT operation. The out counter will be updated by 809 * the len parameter. No error checking will be done. 810 * 811 * Note that with only one concurrent reader and one concurrent 812 * writer, you don't need extra locking to use these macros. 813 */ 814 #define kfifo_dma_out_finish(fifo, len) do { \ 815 typeof((fifo) + 1) ___tmp = (fifo); \ 816 kfifo_skip_count(___tmp, (len) / sizeof(*___tmp->type)); \ 817 } while (0) 818 819 /** 820 * kfifo_out_peek - gets some data from the fifo 821 * @fifo: address of the fifo to be used 822 * @buf: pointer to the storage buffer 823 * @n: max. number of elements to get 824 * 825 * This macro gets the data from the fifo and returns the numbers of elements 826 * copied. The data is not removed from the fifo. 827 * 828 * Note that with only one concurrent reader and one concurrent 829 * writer, you don't need extra locking to use these macro. 830 */ 831 #define kfifo_out_peek(fifo, buf, n) \ 832 __kfifo_uint_must_check_helper( \ 833 ({ \ 834 typeof((fifo) + 1) __tmp = (fifo); \ 835 typeof(__tmp->ptr) __buf = (buf); \ 836 unsigned long __n = (n); \ 837 const size_t __recsize = sizeof(*__tmp->rectype); \ 838 struct __kfifo *__kfifo = &__tmp->kfifo; \ 839 (__recsize) ? \ 840 __kfifo_out_peek_r(__kfifo, __buf, __n, __recsize) : \ 841 __kfifo_out_peek(__kfifo, __buf, __n); \ 842 }) \ 843 ) 844 845 /** 846 * kfifo_out_linear - gets a tail of/offset to available data 847 * @fifo: address of the fifo to be used 848 * @tail: pointer to an unsigned int to store the value of tail 849 * @n: max. number of elements to point at 850 * 851 * This macro obtains the offset (tail) to the available data in the fifo 852 * buffer and returns the 853 * numbers of elements available. It returns the available count till the end 854 * of data or till the end of the buffer. So that it can be used for linear 855 * data processing (like memcpy() of (@fifo->data + @tail) with count 856 * returned). 857 * 858 * Note that with only one concurrent reader and one concurrent 859 * writer, you don't need extra locking to use these macro. 860 */ 861 #define kfifo_out_linear(fifo, tail, n) \ 862 __kfifo_uint_must_check_helper( \ 863 ({ \ 864 typeof((fifo) + 1) __tmp = (fifo); \ 865 unsigned int *__tail = (tail); \ 866 unsigned long __n = (n); \ 867 const size_t __recsize = sizeof(*__tmp->rectype); \ 868 struct __kfifo *__kfifo = &__tmp->kfifo; \ 869 (__recsize) ? \ 870 __kfifo_out_linear_r(__kfifo, __tail, __n, __recsize) : \ 871 __kfifo_out_linear(__kfifo, __tail, __n); \ 872 }) \ 873 ) 874 875 /** 876 * kfifo_out_linear_ptr - gets a pointer to the available data 877 * @fifo: address of the fifo to be used 878 * @ptr: pointer to data to store the pointer to tail 879 * @n: max. number of elements to point at 880 * 881 * Similarly to kfifo_out_linear(), this macro obtains the pointer to the 882 * available data in the fifo buffer and returns the numbers of elements 883 * available. It returns the available count till the end of available data or 884 * till the end of the buffer. So that it can be used for linear data 885 * processing (like memcpy() of @ptr with count returned). 886 * 887 * Note that with only one concurrent reader and one concurrent 888 * writer, you don't need extra locking to use these macro. 889 */ 890 #define kfifo_out_linear_ptr(fifo, ptr, n) \ 891 __kfifo_uint_must_check_helper( \ 892 ({ \ 893 typeof((fifo) + 1) ___tmp = (fifo); \ 894 unsigned int ___tail; \ 895 unsigned int ___n = kfifo_out_linear(___tmp, &___tail, (n)); \ 896 *(ptr) = ___tmp->kfifo.data + ___tail * kfifo_esize(___tmp); \ 897 ___n; \ 898 }) \ 899 ) 900 901 902 extern int __kfifo_alloc(struct __kfifo *fifo, unsigned int size, 903 size_t esize, gfp_t gfp_mask); 904 905 extern void __kfifo_free(struct __kfifo *fifo); 906 907 extern int __kfifo_init(struct __kfifo *fifo, void *buffer, 908 unsigned int size, size_t esize); 909 910 extern unsigned int __kfifo_in(struct __kfifo *fifo, 911 const void *buf, unsigned int len); 912 913 extern unsigned int __kfifo_out(struct __kfifo *fifo, 914 void *buf, unsigned int len); 915 916 extern int __kfifo_from_user(struct __kfifo *fifo, 917 const void __user *from, unsigned long len, unsigned int *copied); 918 919 extern int __kfifo_to_user(struct __kfifo *fifo, 920 void __user *to, unsigned long len, unsigned int *copied); 921 922 extern unsigned int __kfifo_dma_in_prepare(struct __kfifo *fifo, 923 struct scatterlist *sgl, int nents, unsigned int len, dma_addr_t dma); 924 925 extern unsigned int __kfifo_dma_out_prepare(struct __kfifo *fifo, 926 struct scatterlist *sgl, int nents, unsigned int len, dma_addr_t dma); 927 928 extern unsigned int __kfifo_out_peek(struct __kfifo *fifo, 929 void *buf, unsigned int len); 930 931 extern unsigned int __kfifo_out_linear(struct __kfifo *fifo, 932 unsigned int *tail, unsigned int n); 933 934 extern unsigned int __kfifo_in_r(struct __kfifo *fifo, 935 const void *buf, unsigned int len, size_t recsize); 936 937 extern unsigned int __kfifo_out_r(struct __kfifo *fifo, 938 void *buf, unsigned int len, size_t recsize); 939 940 extern int __kfifo_from_user_r(struct __kfifo *fifo, 941 const void __user *from, unsigned long len, unsigned int *copied, 942 size_t recsize); 943 944 extern int __kfifo_to_user_r(struct __kfifo *fifo, void __user *to, 945 unsigned long len, unsigned int *copied, size_t recsize); 946 947 extern unsigned int __kfifo_dma_in_prepare_r(struct __kfifo *fifo, 948 struct scatterlist *sgl, int nents, unsigned int len, size_t recsize, 949 dma_addr_t dma); 950 951 extern void __kfifo_dma_in_finish_r(struct __kfifo *fifo, 952 unsigned int len, size_t recsize); 953 954 extern unsigned int __kfifo_dma_out_prepare_r(struct __kfifo *fifo, 955 struct scatterlist *sgl, int nents, unsigned int len, size_t recsize, 956 dma_addr_t dma); 957 958 extern unsigned int __kfifo_len_r(struct __kfifo *fifo, size_t recsize); 959 960 extern void __kfifo_skip_r(struct __kfifo *fifo, size_t recsize); 961 962 extern unsigned int __kfifo_out_peek_r(struct __kfifo *fifo, 963 void *buf, unsigned int len, size_t recsize); 964 965 extern unsigned int __kfifo_out_linear_r(struct __kfifo *fifo, 966 unsigned int *tail, unsigned int n, size_t recsize); 967 968 extern unsigned int __kfifo_max_r(unsigned int len, size_t recsize); 969 970 #endif 971