cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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");