loopback.c (30704B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Loopback bridge driver for the Greybus loopback module. 4 * 5 * Copyright 2014 Google Inc. 6 * Copyright 2014 Linaro Ltd. 7 */ 8 9#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 10 11#include <linux/kernel.h> 12#include <linux/module.h> 13#include <linux/mutex.h> 14#include <linux/slab.h> 15#include <linux/kthread.h> 16#include <linux/delay.h> 17#include <linux/random.h> 18#include <linux/sizes.h> 19#include <linux/cdev.h> 20#include <linux/fs.h> 21#include <linux/kfifo.h> 22#include <linux/debugfs.h> 23#include <linux/list_sort.h> 24#include <linux/spinlock.h> 25#include <linux/workqueue.h> 26#include <linux/atomic.h> 27#include <linux/pm_runtime.h> 28#include <linux/greybus.h> 29#include <asm/div64.h> 30 31#define NSEC_PER_DAY 86400000000000ULL 32 33struct gb_loopback_stats { 34 u32 min; 35 u32 max; 36 u64 sum; 37 u32 count; 38}; 39 40struct gb_loopback_device { 41 struct dentry *root; 42 u32 count; 43 size_t size_max; 44 45 /* We need to take a lock in atomic context */ 46 spinlock_t lock; 47 wait_queue_head_t wq; 48}; 49 50static struct gb_loopback_device gb_dev; 51 52struct gb_loopback_async_operation { 53 struct gb_loopback *gb; 54 struct gb_operation *operation; 55 ktime_t ts; 56 int (*completion)(struct gb_loopback_async_operation *op_async); 57}; 58 59struct gb_loopback { 60 struct gb_connection *connection; 61 62 struct dentry *file; 63 struct kfifo kfifo_lat; 64 struct mutex mutex; 65 struct task_struct *task; 66 struct device *dev; 67 wait_queue_head_t wq; 68 wait_queue_head_t wq_completion; 69 atomic_t outstanding_operations; 70 71 /* Per connection stats */ 72 ktime_t ts; 73 struct gb_loopback_stats latency; 74 struct gb_loopback_stats throughput; 75 struct gb_loopback_stats requests_per_second; 76 struct gb_loopback_stats apbridge_unipro_latency; 77 struct gb_loopback_stats gbphy_firmware_latency; 78 79 int type; 80 int async; 81 int id; 82 u32 size; 83 u32 iteration_max; 84 u32 iteration_count; 85 int us_wait; 86 u32 error; 87 u32 requests_completed; 88 u32 requests_timedout; 89 u32 timeout; 90 u32 jiffy_timeout; 91 u32 timeout_min; 92 u32 timeout_max; 93 u32 outstanding_operations_max; 94 u64 elapsed_nsecs; 95 u32 apbridge_latency_ts; 96 u32 gbphy_latency_ts; 97 98 u32 send_count; 99}; 100 101static struct class loopback_class = { 102 .name = "gb_loopback", 103 .owner = THIS_MODULE, 104}; 105static DEFINE_IDA(loopback_ida); 106 107/* Min/max values in jiffies */ 108#define GB_LOOPBACK_TIMEOUT_MIN 1 109#define GB_LOOPBACK_TIMEOUT_MAX 10000 110 111#define GB_LOOPBACK_FIFO_DEFAULT 8192 112 113static unsigned int kfifo_depth = GB_LOOPBACK_FIFO_DEFAULT; 114module_param(kfifo_depth, uint, 0444); 115 116/* Maximum size of any one send data buffer we support */ 117#define MAX_PACKET_SIZE (PAGE_SIZE * 2) 118 119#define GB_LOOPBACK_US_WAIT_MAX 1000000 120 121/* interface sysfs attributes */ 122#define gb_loopback_ro_attr(field) \ 123static ssize_t field##_show(struct device *dev, \ 124 struct device_attribute *attr, \ 125 char *buf) \ 126{ \ 127 struct gb_loopback *gb = dev_get_drvdata(dev); \ 128 return sprintf(buf, "%u\n", gb->field); \ 129} \ 130static DEVICE_ATTR_RO(field) 131 132#define gb_loopback_ro_stats_attr(name, field, type) \ 133static ssize_t name##_##field##_show(struct device *dev, \ 134 struct device_attribute *attr, \ 135 char *buf) \ 136{ \ 137 struct gb_loopback *gb = dev_get_drvdata(dev); \ 138 /* Report 0 for min and max if no transfer succeeded */ \ 139 if (!gb->requests_completed) \ 140 return sprintf(buf, "0\n"); \ 141 return sprintf(buf, "%" #type "\n", gb->name.field); \ 142} \ 143static DEVICE_ATTR_RO(name##_##field) 144 145#define gb_loopback_ro_avg_attr(name) \ 146static ssize_t name##_avg_show(struct device *dev, \ 147 struct device_attribute *attr, \ 148 char *buf) \ 149{ \ 150 struct gb_loopback_stats *stats; \ 151 struct gb_loopback *gb; \ 152 u64 avg, rem; \ 153 u32 count; \ 154 gb = dev_get_drvdata(dev); \ 155 stats = &gb->name; \ 156 count = stats->count ? stats->count : 1; \ 157 avg = stats->sum + count / 2000000; /* round closest */ \ 158 rem = do_div(avg, count); \ 159 rem *= 1000000; \ 160 do_div(rem, count); \ 161 return sprintf(buf, "%llu.%06u\n", avg, (u32)rem); \ 162} \ 163static DEVICE_ATTR_RO(name##_avg) 164 165#define gb_loopback_stats_attrs(field) \ 166 gb_loopback_ro_stats_attr(field, min, u); \ 167 gb_loopback_ro_stats_attr(field, max, u); \ 168 gb_loopback_ro_avg_attr(field) 169 170#define gb_loopback_attr(field, type) \ 171static ssize_t field##_show(struct device *dev, \ 172 struct device_attribute *attr, \ 173 char *buf) \ 174{ \ 175 struct gb_loopback *gb = dev_get_drvdata(dev); \ 176 return sprintf(buf, "%" #type "\n", gb->field); \ 177} \ 178static ssize_t field##_store(struct device *dev, \ 179 struct device_attribute *attr, \ 180 const char *buf, \ 181 size_t len) \ 182{ \ 183 int ret; \ 184 struct gb_loopback *gb = dev_get_drvdata(dev); \ 185 mutex_lock(&gb->mutex); \ 186 ret = sscanf(buf, "%"#type, &gb->field); \ 187 if (ret != 1) \ 188 len = -EINVAL; \ 189 else \ 190 gb_loopback_check_attr(gb, bundle); \ 191 mutex_unlock(&gb->mutex); \ 192 return len; \ 193} \ 194static DEVICE_ATTR_RW(field) 195 196#define gb_dev_loopback_ro_attr(field, conn) \ 197static ssize_t field##_show(struct device *dev, \ 198 struct device_attribute *attr, \ 199 char *buf) \ 200{ \ 201 struct gb_loopback *gb = dev_get_drvdata(dev); \ 202 return sprintf(buf, "%u\n", gb->field); \ 203} \ 204static DEVICE_ATTR_RO(field) 205 206#define gb_dev_loopback_rw_attr(field, type) \ 207static ssize_t field##_show(struct device *dev, \ 208 struct device_attribute *attr, \ 209 char *buf) \ 210{ \ 211 struct gb_loopback *gb = dev_get_drvdata(dev); \ 212 return sprintf(buf, "%" #type "\n", gb->field); \ 213} \ 214static ssize_t field##_store(struct device *dev, \ 215 struct device_attribute *attr, \ 216 const char *buf, \ 217 size_t len) \ 218{ \ 219 int ret; \ 220 struct gb_loopback *gb = dev_get_drvdata(dev); \ 221 mutex_lock(&gb->mutex); \ 222 ret = sscanf(buf, "%"#type, &gb->field); \ 223 if (ret != 1) \ 224 len = -EINVAL; \ 225 else \ 226 gb_loopback_check_attr(gb); \ 227 mutex_unlock(&gb->mutex); \ 228 return len; \ 229} \ 230static DEVICE_ATTR_RW(field) 231 232static void gb_loopback_reset_stats(struct gb_loopback *gb); 233static void gb_loopback_check_attr(struct gb_loopback *gb) 234{ 235 if (gb->us_wait > GB_LOOPBACK_US_WAIT_MAX) 236 gb->us_wait = GB_LOOPBACK_US_WAIT_MAX; 237 if (gb->size > gb_dev.size_max) 238 gb->size = gb_dev.size_max; 239 gb->requests_timedout = 0; 240 gb->requests_completed = 0; 241 gb->iteration_count = 0; 242 gb->send_count = 0; 243 gb->error = 0; 244 245 if (kfifo_depth < gb->iteration_max) { 246 dev_warn(gb->dev, 247 "cannot log bytes %u kfifo_depth %u\n", 248 gb->iteration_max, kfifo_depth); 249 } 250 kfifo_reset_out(&gb->kfifo_lat); 251 252 switch (gb->type) { 253 case GB_LOOPBACK_TYPE_PING: 254 case GB_LOOPBACK_TYPE_TRANSFER: 255 case GB_LOOPBACK_TYPE_SINK: 256 gb->jiffy_timeout = usecs_to_jiffies(gb->timeout); 257 if (!gb->jiffy_timeout) 258 gb->jiffy_timeout = GB_LOOPBACK_TIMEOUT_MIN; 259 else if (gb->jiffy_timeout > GB_LOOPBACK_TIMEOUT_MAX) 260 gb->jiffy_timeout = GB_LOOPBACK_TIMEOUT_MAX; 261 gb_loopback_reset_stats(gb); 262 wake_up(&gb->wq); 263 break; 264 default: 265 gb->type = 0; 266 break; 267 } 268} 269 270/* Time to send and receive one message */ 271gb_loopback_stats_attrs(latency); 272/* Number of requests sent per second on this cport */ 273gb_loopback_stats_attrs(requests_per_second); 274/* Quantity of data sent and received on this cport */ 275gb_loopback_stats_attrs(throughput); 276/* Latency across the UniPro link from APBridge's perspective */ 277gb_loopback_stats_attrs(apbridge_unipro_latency); 278/* Firmware induced overhead in the GPBridge */ 279gb_loopback_stats_attrs(gbphy_firmware_latency); 280 281/* Number of errors encountered during loop */ 282gb_loopback_ro_attr(error); 283/* Number of requests successfully completed async */ 284gb_loopback_ro_attr(requests_completed); 285/* Number of requests timed out async */ 286gb_loopback_ro_attr(requests_timedout); 287/* Timeout minimum in useconds */ 288gb_loopback_ro_attr(timeout_min); 289/* Timeout minimum in useconds */ 290gb_loopback_ro_attr(timeout_max); 291 292/* 293 * Type of loopback message to send based on protocol type definitions 294 * 0 => Don't send message 295 * 2 => Send ping message continuously (message without payload) 296 * 3 => Send transfer message continuously (message with payload, 297 * payload returned in response) 298 * 4 => Send a sink message (message with payload, no payload in response) 299 */ 300gb_dev_loopback_rw_attr(type, d); 301/* Size of transfer message payload: 0-4096 bytes */ 302gb_dev_loopback_rw_attr(size, u); 303/* Time to wait between two messages: 0-1000 ms */ 304gb_dev_loopback_rw_attr(us_wait, d); 305/* Maximum iterations for a given operation: 1-(2^32-1), 0 implies infinite */ 306gb_dev_loopback_rw_attr(iteration_max, u); 307/* The current index of the for (i = 0; i < iteration_max; i++) loop */ 308gb_dev_loopback_ro_attr(iteration_count, false); 309/* A flag to indicate synchronous or asynchronous operations */ 310gb_dev_loopback_rw_attr(async, u); 311/* Timeout of an individual asynchronous request */ 312gb_dev_loopback_rw_attr(timeout, u); 313/* Maximum number of in-flight operations before back-off */ 314gb_dev_loopback_rw_attr(outstanding_operations_max, u); 315 316static struct attribute *loopback_attrs[] = { 317 &dev_attr_latency_min.attr, 318 &dev_attr_latency_max.attr, 319 &dev_attr_latency_avg.attr, 320 &dev_attr_requests_per_second_min.attr, 321 &dev_attr_requests_per_second_max.attr, 322 &dev_attr_requests_per_second_avg.attr, 323 &dev_attr_throughput_min.attr, 324 &dev_attr_throughput_max.attr, 325 &dev_attr_throughput_avg.attr, 326 &dev_attr_apbridge_unipro_latency_min.attr, 327 &dev_attr_apbridge_unipro_latency_max.attr, 328 &dev_attr_apbridge_unipro_latency_avg.attr, 329 &dev_attr_gbphy_firmware_latency_min.attr, 330 &dev_attr_gbphy_firmware_latency_max.attr, 331 &dev_attr_gbphy_firmware_latency_avg.attr, 332 &dev_attr_type.attr, 333 &dev_attr_size.attr, 334 &dev_attr_us_wait.attr, 335 &dev_attr_iteration_count.attr, 336 &dev_attr_iteration_max.attr, 337 &dev_attr_async.attr, 338 &dev_attr_error.attr, 339 &dev_attr_requests_completed.attr, 340 &dev_attr_requests_timedout.attr, 341 &dev_attr_timeout.attr, 342 &dev_attr_outstanding_operations_max.attr, 343 &dev_attr_timeout_min.attr, 344 &dev_attr_timeout_max.attr, 345 NULL, 346}; 347ATTRIBUTE_GROUPS(loopback); 348 349static void gb_loopback_calculate_stats(struct gb_loopback *gb, bool error); 350 351static u32 gb_loopback_nsec_to_usec_latency(u64 elapsed_nsecs) 352{ 353 do_div(elapsed_nsecs, NSEC_PER_USEC); 354 return elapsed_nsecs; 355} 356 357static u64 __gb_loopback_calc_latency(u64 t1, u64 t2) 358{ 359 if (t2 > t1) 360 return t2 - t1; 361 else 362 return NSEC_PER_DAY - t2 + t1; 363} 364 365static u64 gb_loopback_calc_latency(ktime_t ts, ktime_t te) 366{ 367 return __gb_loopback_calc_latency(ktime_to_ns(ts), ktime_to_ns(te)); 368} 369 370static int gb_loopback_operation_sync(struct gb_loopback *gb, int type, 371 void *request, int request_size, 372 void *response, int response_size) 373{ 374 struct gb_operation *operation; 375 ktime_t ts, te; 376 int ret; 377 378 ts = ktime_get(); 379 operation = gb_operation_create(gb->connection, type, request_size, 380 response_size, GFP_KERNEL); 381 if (!operation) 382 return -ENOMEM; 383 384 if (request_size) 385 memcpy(operation->request->payload, request, request_size); 386 387 ret = gb_operation_request_send_sync(operation); 388 if (ret) { 389 dev_err(&gb->connection->bundle->dev, 390 "synchronous operation failed: %d\n", ret); 391 goto out_put_operation; 392 } else { 393 if (response_size == operation->response->payload_size) { 394 memcpy(response, operation->response->payload, 395 response_size); 396 } else { 397 dev_err(&gb->connection->bundle->dev, 398 "response size %zu expected %d\n", 399 operation->response->payload_size, 400 response_size); 401 ret = -EINVAL; 402 goto out_put_operation; 403 } 404 } 405 406 te = ktime_get(); 407 408 /* Calculate the total time the message took */ 409 gb->elapsed_nsecs = gb_loopback_calc_latency(ts, te); 410 411out_put_operation: 412 gb_operation_put(operation); 413 414 return ret; 415} 416 417static void gb_loopback_async_wait_all(struct gb_loopback *gb) 418{ 419 wait_event(gb->wq_completion, 420 !atomic_read(&gb->outstanding_operations)); 421} 422 423static void gb_loopback_async_operation_callback(struct gb_operation *operation) 424{ 425 struct gb_loopback_async_operation *op_async; 426 struct gb_loopback *gb; 427 ktime_t te; 428 int result; 429 430 te = ktime_get(); 431 result = gb_operation_result(operation); 432 op_async = gb_operation_get_data(operation); 433 gb = op_async->gb; 434 435 mutex_lock(&gb->mutex); 436 437 if (!result && op_async->completion) 438 result = op_async->completion(op_async); 439 440 if (!result) { 441 gb->elapsed_nsecs = gb_loopback_calc_latency(op_async->ts, te); 442 } else { 443 gb->error++; 444 if (result == -ETIMEDOUT) 445 gb->requests_timedout++; 446 } 447 448 gb->iteration_count++; 449 gb_loopback_calculate_stats(gb, result); 450 451 mutex_unlock(&gb->mutex); 452 453 dev_dbg(&gb->connection->bundle->dev, "complete operation %d\n", 454 operation->id); 455 456 /* Wake up waiters */ 457 atomic_dec(&op_async->gb->outstanding_operations); 458 wake_up(&gb->wq_completion); 459 460 /* Release resources */ 461 gb_operation_put(operation); 462 kfree(op_async); 463} 464 465static int gb_loopback_async_operation(struct gb_loopback *gb, int type, 466 void *request, int request_size, 467 int response_size, 468 void *completion) 469{ 470 struct gb_loopback_async_operation *op_async; 471 struct gb_operation *operation; 472 int ret; 473 474 op_async = kzalloc(sizeof(*op_async), GFP_KERNEL); 475 if (!op_async) 476 return -ENOMEM; 477 478 operation = gb_operation_create(gb->connection, type, request_size, 479 response_size, GFP_KERNEL); 480 if (!operation) { 481 kfree(op_async); 482 return -ENOMEM; 483 } 484 485 if (request_size) 486 memcpy(operation->request->payload, request, request_size); 487 488 gb_operation_set_data(operation, op_async); 489 490 op_async->gb = gb; 491 op_async->operation = operation; 492 op_async->completion = completion; 493 494 op_async->ts = ktime_get(); 495 496 atomic_inc(&gb->outstanding_operations); 497 ret = gb_operation_request_send(operation, 498 gb_loopback_async_operation_callback, 499 jiffies_to_msecs(gb->jiffy_timeout), 500 GFP_KERNEL); 501 if (ret) { 502 atomic_dec(&gb->outstanding_operations); 503 gb_operation_put(operation); 504 kfree(op_async); 505 } 506 return ret; 507} 508 509static int gb_loopback_sync_sink(struct gb_loopback *gb, u32 len) 510{ 511 struct gb_loopback_transfer_request *request; 512 int retval; 513 514 request = kmalloc(len + sizeof(*request), GFP_KERNEL); 515 if (!request) 516 return -ENOMEM; 517 518 request->len = cpu_to_le32(len); 519 retval = gb_loopback_operation_sync(gb, GB_LOOPBACK_TYPE_SINK, 520 request, len + sizeof(*request), 521 NULL, 0); 522 kfree(request); 523 return retval; 524} 525 526static int gb_loopback_sync_transfer(struct gb_loopback *gb, u32 len) 527{ 528 struct gb_loopback_transfer_request *request; 529 struct gb_loopback_transfer_response *response; 530 int retval; 531 532 gb->apbridge_latency_ts = 0; 533 gb->gbphy_latency_ts = 0; 534 535 request = kmalloc(len + sizeof(*request), GFP_KERNEL); 536 if (!request) 537 return -ENOMEM; 538 response = kmalloc(len + sizeof(*response), GFP_KERNEL); 539 if (!response) { 540 kfree(request); 541 return -ENOMEM; 542 } 543 544 memset(request->data, 0x5A, len); 545 546 request->len = cpu_to_le32(len); 547 retval = gb_loopback_operation_sync(gb, GB_LOOPBACK_TYPE_TRANSFER, 548 request, len + sizeof(*request), 549 response, len + sizeof(*response)); 550 if (retval) 551 goto gb_error; 552 553 if (memcmp(request->data, response->data, len)) { 554 dev_err(&gb->connection->bundle->dev, 555 "Loopback Data doesn't match\n"); 556 retval = -EREMOTEIO; 557 } 558 gb->apbridge_latency_ts = (u32)__le32_to_cpu(response->reserved0); 559 gb->gbphy_latency_ts = (u32)__le32_to_cpu(response->reserved1); 560 561gb_error: 562 kfree(request); 563 kfree(response); 564 565 return retval; 566} 567 568static int gb_loopback_sync_ping(struct gb_loopback *gb) 569{ 570 return gb_loopback_operation_sync(gb, GB_LOOPBACK_TYPE_PING, 571 NULL, 0, NULL, 0); 572} 573 574static int gb_loopback_async_sink(struct gb_loopback *gb, u32 len) 575{ 576 struct gb_loopback_transfer_request *request; 577 int retval; 578 579 request = kmalloc(len + sizeof(*request), GFP_KERNEL); 580 if (!request) 581 return -ENOMEM; 582 583 request->len = cpu_to_le32(len); 584 retval = gb_loopback_async_operation(gb, GB_LOOPBACK_TYPE_SINK, 585 request, len + sizeof(*request), 586 0, NULL); 587 kfree(request); 588 return retval; 589} 590 591static int gb_loopback_async_transfer_complete( 592 struct gb_loopback_async_operation *op_async) 593{ 594 struct gb_loopback *gb; 595 struct gb_operation *operation; 596 struct gb_loopback_transfer_request *request; 597 struct gb_loopback_transfer_response *response; 598 size_t len; 599 int retval = 0; 600 601 gb = op_async->gb; 602 operation = op_async->operation; 603 request = operation->request->payload; 604 response = operation->response->payload; 605 len = le32_to_cpu(request->len); 606 607 if (memcmp(request->data, response->data, len)) { 608 dev_err(&gb->connection->bundle->dev, 609 "Loopback Data doesn't match operation id %d\n", 610 operation->id); 611 retval = -EREMOTEIO; 612 } else { 613 gb->apbridge_latency_ts = 614 (u32)__le32_to_cpu(response->reserved0); 615 gb->gbphy_latency_ts = 616 (u32)__le32_to_cpu(response->reserved1); 617 } 618 619 return retval; 620} 621 622static int gb_loopback_async_transfer(struct gb_loopback *gb, u32 len) 623{ 624 struct gb_loopback_transfer_request *request; 625 int retval, response_len; 626 627 request = kmalloc(len + sizeof(*request), GFP_KERNEL); 628 if (!request) 629 return -ENOMEM; 630 631 memset(request->data, 0x5A, len); 632 633 request->len = cpu_to_le32(len); 634 response_len = sizeof(struct gb_loopback_transfer_response); 635 retval = gb_loopback_async_operation(gb, GB_LOOPBACK_TYPE_TRANSFER, 636 request, len + sizeof(*request), 637 len + response_len, 638 gb_loopback_async_transfer_complete); 639 if (retval) 640 goto gb_error; 641 642gb_error: 643 kfree(request); 644 return retval; 645} 646 647static int gb_loopback_async_ping(struct gb_loopback *gb) 648{ 649 return gb_loopback_async_operation(gb, GB_LOOPBACK_TYPE_PING, 650 NULL, 0, 0, NULL); 651} 652 653static int gb_loopback_request_handler(struct gb_operation *operation) 654{ 655 struct gb_connection *connection = operation->connection; 656 struct gb_loopback_transfer_request *request; 657 struct gb_loopback_transfer_response *response; 658 struct device *dev = &connection->bundle->dev; 659 size_t len; 660 661 /* By convention, the AP initiates the version operation */ 662 switch (operation->type) { 663 case GB_LOOPBACK_TYPE_PING: 664 case GB_LOOPBACK_TYPE_SINK: 665 return 0; 666 case GB_LOOPBACK_TYPE_TRANSFER: 667 if (operation->request->payload_size < sizeof(*request)) { 668 dev_err(dev, "transfer request too small (%zu < %zu)\n", 669 operation->request->payload_size, 670 sizeof(*request)); 671 return -EINVAL; /* -EMSGSIZE */ 672 } 673 request = operation->request->payload; 674 len = le32_to_cpu(request->len); 675 if (len > gb_dev.size_max) { 676 dev_err(dev, "transfer request too large (%zu > %zu)\n", 677 len, gb_dev.size_max); 678 return -EINVAL; 679 } 680 681 if (!gb_operation_response_alloc(operation, 682 len + sizeof(*response), GFP_KERNEL)) { 683 dev_err(dev, "error allocating response\n"); 684 return -ENOMEM; 685 } 686 response = operation->response->payload; 687 response->len = cpu_to_le32(len); 688 if (len) 689 memcpy(response->data, request->data, len); 690 691 return 0; 692 default: 693 dev_err(dev, "unsupported request: %u\n", operation->type); 694 return -EINVAL; 695 } 696} 697 698static void gb_loopback_reset_stats(struct gb_loopback *gb) 699{ 700 struct gb_loopback_stats reset = { 701 .min = U32_MAX, 702 }; 703 704 /* Reset per-connection stats */ 705 memcpy(&gb->latency, &reset, 706 sizeof(struct gb_loopback_stats)); 707 memcpy(&gb->throughput, &reset, 708 sizeof(struct gb_loopback_stats)); 709 memcpy(&gb->requests_per_second, &reset, 710 sizeof(struct gb_loopback_stats)); 711 memcpy(&gb->apbridge_unipro_latency, &reset, 712 sizeof(struct gb_loopback_stats)); 713 memcpy(&gb->gbphy_firmware_latency, &reset, 714 sizeof(struct gb_loopback_stats)); 715 716 /* Should be initialized at least once per transaction set */ 717 gb->apbridge_latency_ts = 0; 718 gb->gbphy_latency_ts = 0; 719 gb->ts = ktime_set(0, 0); 720} 721 722static void gb_loopback_update_stats(struct gb_loopback_stats *stats, u32 val) 723{ 724 if (stats->min > val) 725 stats->min = val; 726 if (stats->max < val) 727 stats->max = val; 728 stats->sum += val; 729 stats->count++; 730} 731 732static void gb_loopback_update_stats_window(struct gb_loopback_stats *stats, 733 u64 val, u32 count) 734{ 735 stats->sum += val; 736 stats->count += count; 737 738 do_div(val, count); 739 if (stats->min > val) 740 stats->min = val; 741 if (stats->max < val) 742 stats->max = val; 743} 744 745static void gb_loopback_requests_update(struct gb_loopback *gb, u32 latency) 746{ 747 u64 req = gb->requests_completed * USEC_PER_SEC; 748 749 gb_loopback_update_stats_window(&gb->requests_per_second, req, latency); 750} 751 752static void gb_loopback_throughput_update(struct gb_loopback *gb, u32 latency) 753{ 754 u64 aggregate_size = sizeof(struct gb_operation_msg_hdr) * 2; 755 756 switch (gb->type) { 757 case GB_LOOPBACK_TYPE_PING: 758 break; 759 case GB_LOOPBACK_TYPE_SINK: 760 aggregate_size += sizeof(struct gb_loopback_transfer_request) + 761 gb->size; 762 break; 763 case GB_LOOPBACK_TYPE_TRANSFER: 764 aggregate_size += sizeof(struct gb_loopback_transfer_request) + 765 sizeof(struct gb_loopback_transfer_response) + 766 gb->size * 2; 767 break; 768 default: 769 return; 770 } 771 772 aggregate_size *= gb->requests_completed; 773 aggregate_size *= USEC_PER_SEC; 774 gb_loopback_update_stats_window(&gb->throughput, aggregate_size, 775 latency); 776} 777 778static void gb_loopback_calculate_latency_stats(struct gb_loopback *gb) 779{ 780 u32 lat; 781 782 /* Express latency in terms of microseconds */ 783 lat = gb_loopback_nsec_to_usec_latency(gb->elapsed_nsecs); 784 785 /* Log latency stastic */ 786 gb_loopback_update_stats(&gb->latency, lat); 787 788 /* Raw latency log on a per thread basis */ 789 kfifo_in(&gb->kfifo_lat, (unsigned char *)&lat, sizeof(lat)); 790 791 /* Log the firmware supplied latency values */ 792 gb_loopback_update_stats(&gb->apbridge_unipro_latency, 793 gb->apbridge_latency_ts); 794 gb_loopback_update_stats(&gb->gbphy_firmware_latency, 795 gb->gbphy_latency_ts); 796} 797 798static void gb_loopback_calculate_stats(struct gb_loopback *gb, bool error) 799{ 800 u64 nlat; 801 u32 lat; 802 ktime_t te; 803 804 if (!error) { 805 gb->requests_completed++; 806 gb_loopback_calculate_latency_stats(gb); 807 } 808 809 te = ktime_get(); 810 nlat = gb_loopback_calc_latency(gb->ts, te); 811 if (nlat >= NSEC_PER_SEC || gb->iteration_count == gb->iteration_max) { 812 lat = gb_loopback_nsec_to_usec_latency(nlat); 813 814 gb_loopback_throughput_update(gb, lat); 815 gb_loopback_requests_update(gb, lat); 816 817 if (gb->iteration_count != gb->iteration_max) { 818 gb->ts = te; 819 gb->requests_completed = 0; 820 } 821 } 822} 823 824static void gb_loopback_async_wait_to_send(struct gb_loopback *gb) 825{ 826 if (!(gb->async && gb->outstanding_operations_max)) 827 return; 828 wait_event_interruptible(gb->wq_completion, 829 (atomic_read(&gb->outstanding_operations) < 830 gb->outstanding_operations_max) || 831 kthread_should_stop()); 832} 833 834static int gb_loopback_fn(void *data) 835{ 836 int error = 0; 837 int us_wait = 0; 838 int type; 839 int ret; 840 u32 size; 841 842 struct gb_loopback *gb = data; 843 struct gb_bundle *bundle = gb->connection->bundle; 844 845 ret = gb_pm_runtime_get_sync(bundle); 846 if (ret) 847 return ret; 848 849 while (1) { 850 if (!gb->type) { 851 gb_pm_runtime_put_autosuspend(bundle); 852 wait_event_interruptible(gb->wq, gb->type || 853 kthread_should_stop()); 854 ret = gb_pm_runtime_get_sync(bundle); 855 if (ret) 856 return ret; 857 } 858 859 if (kthread_should_stop()) 860 break; 861 862 /* Limit the maximum number of in-flight async operations */ 863 gb_loopback_async_wait_to_send(gb); 864 if (kthread_should_stop()) 865 break; 866 867 mutex_lock(&gb->mutex); 868 869 /* Optionally terminate */ 870 if (gb->send_count == gb->iteration_max) { 871 mutex_unlock(&gb->mutex); 872 873 /* Wait for synchronous and asynchronus completion */ 874 gb_loopback_async_wait_all(gb); 875 876 /* Mark complete unless user-space has poked us */ 877 mutex_lock(&gb->mutex); 878 if (gb->iteration_count == gb->iteration_max) { 879 gb->type = 0; 880 gb->send_count = 0; 881 sysfs_notify(&gb->dev->kobj, NULL, 882 "iteration_count"); 883 dev_dbg(&bundle->dev, "load test complete\n"); 884 } else { 885 dev_dbg(&bundle->dev, 886 "continuing on with new test set\n"); 887 } 888 mutex_unlock(&gb->mutex); 889 continue; 890 } 891 size = gb->size; 892 us_wait = gb->us_wait; 893 type = gb->type; 894 if (ktime_to_ns(gb->ts) == 0) 895 gb->ts = ktime_get(); 896 897 /* Else operations to perform */ 898 if (gb->async) { 899 if (type == GB_LOOPBACK_TYPE_PING) 900 error = gb_loopback_async_ping(gb); 901 else if (type == GB_LOOPBACK_TYPE_TRANSFER) 902 error = gb_loopback_async_transfer(gb, size); 903 else if (type == GB_LOOPBACK_TYPE_SINK) 904 error = gb_loopback_async_sink(gb, size); 905 906 if (error) { 907 gb->error++; 908 gb->iteration_count++; 909 } 910 } else { 911 /* We are effectively single threaded here */ 912 if (type == GB_LOOPBACK_TYPE_PING) 913 error = gb_loopback_sync_ping(gb); 914 else if (type == GB_LOOPBACK_TYPE_TRANSFER) 915 error = gb_loopback_sync_transfer(gb, size); 916 else if (type == GB_LOOPBACK_TYPE_SINK) 917 error = gb_loopback_sync_sink(gb, size); 918 919 if (error) 920 gb->error++; 921 gb->iteration_count++; 922 gb_loopback_calculate_stats(gb, !!error); 923 } 924 gb->send_count++; 925 mutex_unlock(&gb->mutex); 926 927 if (us_wait) { 928 if (us_wait < 20000) 929 usleep_range(us_wait, us_wait + 100); 930 else 931 msleep(us_wait / 1000); 932 } 933 } 934 935 gb_pm_runtime_put_autosuspend(bundle); 936 937 return 0; 938} 939 940static int gb_loopback_dbgfs_latency_show_common(struct seq_file *s, 941 struct kfifo *kfifo, 942 struct mutex *mutex) 943{ 944 u32 latency; 945 int retval; 946 947 if (kfifo_len(kfifo) == 0) { 948 retval = -EAGAIN; 949 goto done; 950 } 951 952 mutex_lock(mutex); 953 retval = kfifo_out(kfifo, &latency, sizeof(latency)); 954 if (retval > 0) { 955 seq_printf(s, "%u", latency); 956 retval = 0; 957 } 958 mutex_unlock(mutex); 959done: 960 return retval; 961} 962 963static int gb_loopback_dbgfs_latency_show(struct seq_file *s, void *unused) 964{ 965 struct gb_loopback *gb = s->private; 966 967 return gb_loopback_dbgfs_latency_show_common(s, &gb->kfifo_lat, 968 &gb->mutex); 969} 970DEFINE_SHOW_ATTRIBUTE(gb_loopback_dbgfs_latency); 971 972#define DEBUGFS_NAMELEN 32 973 974static int gb_loopback_probe(struct gb_bundle *bundle, 975 const struct greybus_bundle_id *id) 976{ 977 struct greybus_descriptor_cport *cport_desc; 978 struct gb_connection *connection; 979 struct gb_loopback *gb; 980 struct device *dev; 981 int retval; 982 char name[DEBUGFS_NAMELEN]; 983 unsigned long flags; 984 985 if (bundle->num_cports != 1) 986 return -ENODEV; 987 988 cport_desc = &bundle->cport_desc[0]; 989 if (cport_desc->protocol_id != GREYBUS_PROTOCOL_LOOPBACK) 990 return -ENODEV; 991 992 gb = kzalloc(sizeof(*gb), GFP_KERNEL); 993 if (!gb) 994 return -ENOMEM; 995 996 connection = gb_connection_create(bundle, le16_to_cpu(cport_desc->id), 997 gb_loopback_request_handler); 998 if (IS_ERR(connection)) { 999 retval = PTR_ERR(connection); 1000 goto out_kzalloc; 1001 } 1002 1003 gb->connection = connection; 1004 greybus_set_drvdata(bundle, gb); 1005 1006 init_waitqueue_head(&gb->wq); 1007 init_waitqueue_head(&gb->wq_completion); 1008 atomic_set(&gb->outstanding_operations, 0); 1009 gb_loopback_reset_stats(gb); 1010 1011 /* Reported values to user-space for min/max timeouts */ 1012 gb->timeout_min = jiffies_to_usecs(GB_LOOPBACK_TIMEOUT_MIN); 1013 gb->timeout_max = jiffies_to_usecs(GB_LOOPBACK_TIMEOUT_MAX); 1014 1015 if (!gb_dev.count) { 1016 /* Calculate maximum payload */ 1017 gb_dev.size_max = gb_operation_get_payload_size_max(connection); 1018 if (gb_dev.size_max <= 1019 sizeof(struct gb_loopback_transfer_request)) { 1020 retval = -EINVAL; 1021 goto out_connection_destroy; 1022 } 1023 gb_dev.size_max -= sizeof(struct gb_loopback_transfer_request); 1024 } 1025 1026 /* Create per-connection sysfs and debugfs data-points */ 1027 snprintf(name, sizeof(name), "raw_latency_%s", 1028 dev_name(&connection->bundle->dev)); 1029 gb->file = debugfs_create_file(name, S_IFREG | 0444, gb_dev.root, gb, 1030 &gb_loopback_dbgfs_latency_fops); 1031 1032 gb->id = ida_simple_get(&loopback_ida, 0, 0, GFP_KERNEL); 1033 if (gb->id < 0) { 1034 retval = gb->id; 1035 goto out_debugfs_remove; 1036 } 1037 1038 retval = gb_connection_enable(connection); 1039 if (retval) 1040 goto out_ida_remove; 1041 1042 dev = device_create_with_groups(&loopback_class, 1043 &connection->bundle->dev, 1044 MKDEV(0, 0), gb, loopback_groups, 1045 "gb_loopback%d", gb->id); 1046 if (IS_ERR(dev)) { 1047 retval = PTR_ERR(dev); 1048 goto out_connection_disable; 1049 } 1050 gb->dev = dev; 1051 1052 /* Allocate kfifo */ 1053 if (kfifo_alloc(&gb->kfifo_lat, kfifo_depth * sizeof(u32), 1054 GFP_KERNEL)) { 1055 retval = -ENOMEM; 1056 goto out_conn; 1057 } 1058 /* Fork worker thread */ 1059 mutex_init(&gb->mutex); 1060 gb->task = kthread_run(gb_loopback_fn, gb, "gb_loopback"); 1061 if (IS_ERR(gb->task)) { 1062 retval = PTR_ERR(gb->task); 1063 goto out_kfifo; 1064 } 1065 1066 spin_lock_irqsave(&gb_dev.lock, flags); 1067 gb_dev.count++; 1068 spin_unlock_irqrestore(&gb_dev.lock, flags); 1069 1070 gb_connection_latency_tag_enable(connection); 1071 1072 gb_pm_runtime_put_autosuspend(bundle); 1073 1074 return 0; 1075 1076out_kfifo: 1077 kfifo_free(&gb->kfifo_lat); 1078out_conn: 1079 device_unregister(dev); 1080out_connection_disable: 1081 gb_connection_disable(connection); 1082out_ida_remove: 1083 ida_simple_remove(&loopback_ida, gb->id); 1084out_debugfs_remove: 1085 debugfs_remove(gb->file); 1086out_connection_destroy: 1087 gb_connection_destroy(connection); 1088out_kzalloc: 1089 kfree(gb); 1090 1091 return retval; 1092} 1093 1094static void gb_loopback_disconnect(struct gb_bundle *bundle) 1095{ 1096 struct gb_loopback *gb = greybus_get_drvdata(bundle); 1097 unsigned long flags; 1098 int ret; 1099 1100 ret = gb_pm_runtime_get_sync(bundle); 1101 if (ret) 1102 gb_pm_runtime_get_noresume(bundle); 1103 1104 gb_connection_disable(gb->connection); 1105 1106 if (!IS_ERR_OR_NULL(gb->task)) 1107 kthread_stop(gb->task); 1108 1109 kfifo_free(&gb->kfifo_lat); 1110 gb_connection_latency_tag_disable(gb->connection); 1111 debugfs_remove(gb->file); 1112 1113 /* 1114 * FIXME: gb_loopback_async_wait_all() is redundant now, as connection 1115 * is disabled at the beginning and so we can't have any more 1116 * incoming/outgoing requests. 1117 */ 1118 gb_loopback_async_wait_all(gb); 1119 1120 spin_lock_irqsave(&gb_dev.lock, flags); 1121 gb_dev.count--; 1122 spin_unlock_irqrestore(&gb_dev.lock, flags); 1123 1124 device_unregister(gb->dev); 1125 ida_simple_remove(&loopback_ida, gb->id); 1126 1127 gb_connection_destroy(gb->connection); 1128 kfree(gb); 1129} 1130 1131static const struct greybus_bundle_id gb_loopback_id_table[] = { 1132 { GREYBUS_DEVICE_CLASS(GREYBUS_CLASS_LOOPBACK) }, 1133 { } 1134}; 1135MODULE_DEVICE_TABLE(greybus, gb_loopback_id_table); 1136 1137static struct greybus_driver gb_loopback_driver = { 1138 .name = "loopback", 1139 .probe = gb_loopback_probe, 1140 .disconnect = gb_loopback_disconnect, 1141 .id_table = gb_loopback_id_table, 1142}; 1143 1144static int loopback_init(void) 1145{ 1146 int retval; 1147 1148 spin_lock_init(&gb_dev.lock); 1149 gb_dev.root = debugfs_create_dir("gb_loopback", NULL); 1150 1151 retval = class_register(&loopback_class); 1152 if (retval) 1153 goto err; 1154 1155 retval = greybus_register(&gb_loopback_driver); 1156 if (retval) 1157 goto err_unregister; 1158 1159 return 0; 1160 1161err_unregister: 1162 class_unregister(&loopback_class); 1163err: 1164 debugfs_remove_recursive(gb_dev.root); 1165 return retval; 1166} 1167module_init(loopback_init); 1168 1169static void __exit loopback_exit(void) 1170{ 1171 debugfs_remove_recursive(gb_dev.root); 1172 greybus_deregister(&gb_loopback_driver); 1173 class_unregister(&loopback_class); 1174 ida_destroy(&loopback_ida); 1175} 1176module_exit(loopback_exit); 1177 1178MODULE_LICENSE("GPL v2");