File Index
Files and directories
Sign in
FILE

qaic_control.c

File preview with syntax highlighting.

linux-6.19.14/drivers/accel/qaic/qaic_control.c C
   1// SPDX-License-Identifier: GPL-2.0-only
   2
   3/* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. */
   4/* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. */
   5
   6#include <asm/byteorder.h>
   7#include <linux/completion.h>
   8#include <linux/crc32.h>
   9#include <linux/delay.h>
  10#include <linux/dma-mapping.h>
  11#include <linux/kref.h>
  12#include <linux/list.h>
  13#include <linux/mhi.h>
  14#include <linux/mm.h>
  15#include <linux/moduleparam.h>
  16#include <linux/mutex.h>
  17#include <linux/overflow.h>
  18#include <linux/pci.h>
  19#include <linux/scatterlist.h>
  20#include <linux/sched/signal.h>
  21#include <linux/types.h>
  22#include <linux/uaccess.h>
  23#include <linux/workqueue.h>
  24#include <linux/wait.h>
  25#include <drm/drm_device.h>
  26#include <drm/drm_file.h>
  27#include <uapi/drm/qaic_accel.h>
  28
  29#include "qaic.h"
  30
  31#define MANAGE_MAGIC_NUMBER		((__force __le32)0x43494151) /* "QAIC" in little endian */
  32#define QAIC_DBC_Q_GAP			SZ_256
  33#define QAIC_DBC_Q_BUF_ALIGN		SZ_4K
  34#define QAIC_MANAGE_WIRE_MSG_LENGTH	SZ_64K /* Max DMA message length */
  35#define QAIC_WRAPPER_MAX_SIZE		SZ_4K
  36#define QAIC_MHI_RETRY_WAIT_MS		100
  37#define QAIC_MHI_RETRY_MAX		20
  38
  39static unsigned int control_resp_timeout_s = 60; /* 60 sec default */
  40module_param(control_resp_timeout_s, uint, 0600);
  41MODULE_PARM_DESC(control_resp_timeout_s, "Timeout for NNC responses from QSM");
  42
  43struct manage_msg {
  44	u32 len;
  45	u32 count;
  46	u8 data[];
  47};
  48
  49/*
  50 * wire encoding structures for the manage protocol.
  51 * All fields are little endian on the wire
  52 */
  53struct wire_msg_hdr {
  54	__le32 crc32; /* crc of everything following this field in the message */
  55	__le32 magic_number;
  56	__le32 sequence_number;
  57	__le32 len; /* length of this message */
  58	__le32 count; /* number of transactions in this message */
  59	__le32 handle; /* unique id to track the resources consumed */
  60	__le32 partition_id; /* partition id for the request (signed) */
  61	__le32 padding; /* must be 0 */
  62} __packed;
  63
  64struct wire_msg {
  65	struct wire_msg_hdr hdr;
  66	u8 data[];
  67} __packed;
  68
  69struct wire_trans_hdr {
  70	__le32 type;
  71	__le32 len;
  72} __packed;
  73
  74/* Each message sent from driver to device are organized in a list of wrapper_msg */
  75struct wrapper_msg {
  76	struct list_head list;
  77	struct kref ref_count;
  78	u32 len; /* length of data to transfer */
  79	struct wrapper_list *head;
  80	union {
  81		struct wire_msg msg;
  82		struct wire_trans_hdr trans;
  83	};
  84};
  85
  86struct wrapper_list {
  87	struct list_head list;
  88	spinlock_t lock; /* Protects the list state during additions and removals */
  89};
  90
  91struct wire_trans_passthrough {
  92	struct wire_trans_hdr hdr;
  93	u8 data[];
  94} __packed;
  95
  96struct wire_addr_size_pair {
  97	__le64 addr;
  98	__le64 size;
  99} __packed;
 100
 101struct wire_trans_dma_xfer {
 102	struct wire_trans_hdr hdr;
 103	__le32 tag;
 104	__le32 count;
 105	__le32 dma_chunk_id;
 106	__le32 padding;
 107	struct wire_addr_size_pair data[];
 108} __packed;
 109
 110/* Initiated by device to continue the DMA xfer of a large piece of data */
 111struct wire_trans_dma_xfer_cont {
 112	struct wire_trans_hdr hdr;
 113	__le32 dma_chunk_id;
 114	__le32 padding;
 115	__le64 xferred_size;
 116} __packed;
 117
 118struct wire_trans_activate_to_dev {
 119	struct wire_trans_hdr hdr;
 120	__le64 req_q_addr;
 121	__le64 rsp_q_addr;
 122	__le32 req_q_size;
 123	__le32 rsp_q_size;
 124	__le32 buf_len;
 125	__le32 options; /* unused, but BIT(16) has meaning to the device */
 126} __packed;
 127
 128struct wire_trans_activate_from_dev {
 129	struct wire_trans_hdr hdr;
 130	__le32 status;
 131	__le32 dbc_id;
 132	__le64 options; /* unused */
 133} __packed;
 134
 135struct wire_trans_deactivate_from_dev {
 136	struct wire_trans_hdr hdr;
 137	__le32 status;
 138	__le32 dbc_id;
 139} __packed;
 140
 141struct wire_trans_terminate_to_dev {
 142	struct wire_trans_hdr hdr;
 143	__le32 handle;
 144	__le32 padding;
 145} __packed;
 146
 147struct wire_trans_terminate_from_dev {
 148	struct wire_trans_hdr hdr;
 149	__le32 status;
 150	__le32 padding;
 151} __packed;
 152
 153struct wire_trans_status_to_dev {
 154	struct wire_trans_hdr hdr;
 155} __packed;
 156
 157struct wire_trans_status_from_dev {
 158	struct wire_trans_hdr hdr;
 159	__le16 major;
 160	__le16 minor;
 161	__le32 status;
 162	__le64 status_flags;
 163} __packed;
 164
 165struct wire_trans_validate_part_to_dev {
 166	struct wire_trans_hdr hdr;
 167	__le32 part_id;
 168	__le32 padding;
 169} __packed;
 170
 171struct wire_trans_validate_part_from_dev {
 172	struct wire_trans_hdr hdr;
 173	__le32 status;
 174	__le32 padding;
 175} __packed;
 176
 177struct xfer_queue_elem {
 178	/*
 179	 * Node in list of ongoing transfer request on control channel.
 180	 * Maintained by root device struct.
 181	 */
 182	struct list_head list;
 183	/* Sequence number of this transfer request */
 184	u32 seq_num;
 185	/* This is used to wait on until completion of transfer request */
 186	struct completion xfer_done;
 187	/* Received data from device */
 188	void *buf;
 189};
 190
 191struct dma_xfer {
 192	/* Node in list of DMA transfers which is used for cleanup */
 193	struct list_head list;
 194	/* SG table of memory used for DMA */
 195	struct sg_table *sgt;
 196	/* Array pages used for DMA */
 197	struct page **page_list;
 198	/* Number of pages used for DMA */
 199	unsigned long nr_pages;
 200};
 201
 202struct ioctl_resources {
 203	/* List of all DMA transfers which is used later for cleanup */
 204	struct list_head dma_xfers;
 205	/* Base address of request queue which belongs to a DBC */
 206	void *buf;
 207	/*
 208	 * Base bus address of request queue which belongs to a DBC. Response
 209	 * queue base bus address can be calculated by adding size of request
 210	 * queue to base bus address of request queue.
 211	 */
 212	dma_addr_t dma_addr;
 213	/* Total size of request queue and response queue in byte */
 214	u32 total_size;
 215	/* Total number of elements that can be queued in each of request and response queue */
 216	u32 nelem;
 217	/* Base address of response queue which belongs to a DBC */
 218	void *rsp_q_base;
 219	/* Status of the NNC message received */
 220	u32 status;
 221	/* DBC id of the DBC received from device */
 222	u32 dbc_id;
 223	/*
 224	 * DMA transfer request messages can be big in size and it may not be
 225	 * possible to send them in one shot. In such cases the messages are
 226	 * broken into chunks, this field stores ID of such chunks.
 227	 */
 228	u32 dma_chunk_id;
 229	/* Total number of bytes transferred for a DMA xfer request */
 230	u64 xferred_dma_size;
 231	/* Header of transaction message received from user. Used during DMA xfer request. */
 232	void *trans_hdr;
 233};
 234
 235struct resp_work {
 236	struct work_struct work;
 237	struct qaic_device *qdev;
 238	void *buf;
 239};
 240
 241/*
 242 * Since we're working with little endian messages, its useful to be able to
 243 * increment without filling a whole line with conversions back and forth just
 244 * to add one(1) to a message count.
 245 */
 246static __le32 incr_le32(__le32 val)
 247{
 248	return cpu_to_le32(le32_to_cpu(val) + 1);
 249}
 250
 251static u32 gen_crc(void *msg)
 252{
 253	struct wrapper_list *wrappers = msg;
 254	struct wrapper_msg *w;
 255	u32 crc = ~0;
 256
 257	list_for_each_entry(w, &wrappers->list, list)
 258		crc = crc32(crc, &w->msg, w->len);
 259
 260	return crc ^ ~0;
 261}
 262
 263static u32 gen_crc_stub(void *msg)
 264{
 265	return 0;
 266}
 267
 268static bool valid_crc(void *msg)
 269{
 270	struct wire_msg_hdr *hdr = msg;
 271	bool ret;
 272	u32 crc;
 273
 274	/*
 275	 * The output of this algorithm is always converted to the native
 276	 * endianness.
 277	 */
 278	crc = le32_to_cpu(hdr->crc32);
 279	hdr->crc32 = 0;
 280	ret = (crc32(~0, msg, le32_to_cpu(hdr->len)) ^ ~0) == crc;
 281	hdr->crc32 = cpu_to_le32(crc);
 282	return ret;
 283}
 284
 285static bool valid_crc_stub(void *msg)
 286{
 287	return true;
 288}
 289
 290static void free_wrapper(struct kref *ref)
 291{
 292	struct wrapper_msg *wrapper = container_of(ref, struct wrapper_msg, ref_count);
 293
 294	list_del(&wrapper->list);
 295	kfree(wrapper);
 296}
 297
 298static void save_dbc_buf(struct qaic_device *qdev, struct ioctl_resources *resources,
 299			 struct qaic_user *usr)
 300{
 301	u32 dbc_id = resources->dbc_id;
 302
 303	if (resources->buf) {
 304		wait_event_interruptible(qdev->dbc[dbc_id].dbc_release, !qdev->dbc[dbc_id].in_use);
 305		qdev->dbc[dbc_id].req_q_base = resources->buf;
 306		qdev->dbc[dbc_id].rsp_q_base = resources->rsp_q_base;
 307		qdev->dbc[dbc_id].dma_addr = resources->dma_addr;
 308		qdev->dbc[dbc_id].total_size = resources->total_size;
 309		qdev->dbc[dbc_id].nelem = resources->nelem;
 310		enable_dbc(qdev, dbc_id, usr);
 311		qdev->dbc[dbc_id].in_use = true;
 312		resources->buf = NULL;
 313		set_dbc_state(qdev, dbc_id, DBC_STATE_ASSIGNED);
 314	}
 315}
 316
 317static void free_dbc_buf(struct qaic_device *qdev, struct ioctl_resources *resources)
 318{
 319	if (resources->buf)
 320		dma_free_coherent(&qdev->pdev->dev, resources->total_size, resources->buf,
 321				  resources->dma_addr);
 322	resources->buf = NULL;
 323}
 324
 325static void free_dma_xfers(struct qaic_device *qdev, struct ioctl_resources *resources)
 326{
 327	struct dma_xfer *xfer;
 328	struct dma_xfer *x;
 329	int i;
 330
 331	list_for_each_entry_safe(xfer, x, &resources->dma_xfers, list) {
 332		dma_unmap_sgtable(&qdev->pdev->dev, xfer->sgt, DMA_TO_DEVICE, 0);
 333		sg_free_table(xfer->sgt);
 334		kfree(xfer->sgt);
 335		for (i = 0; i < xfer->nr_pages; ++i)
 336			put_page(xfer->page_list[i]);
 337		kfree(xfer->page_list);
 338		list_del(&xfer->list);
 339		kfree(xfer);
 340	}
 341}
 342
 343static struct wrapper_msg *add_wrapper(struct wrapper_list *wrappers, u32 size)
 344{
 345	struct wrapper_msg *w = kzalloc(size, GFP_KERNEL);
 346
 347	if (!w)
 348		return NULL;
 349	list_add_tail(&w->list, &wrappers->list);
 350	kref_init(&w->ref_count);
 351	w->head = wrappers;
 352	return w;
 353}
 354
 355static int encode_passthrough(struct qaic_device *qdev, void *trans, struct wrapper_list *wrappers,
 356			      u32 *user_len)
 357{
 358	struct qaic_manage_trans_passthrough *in_trans = trans;
 359	struct wire_trans_passthrough *out_trans;
 360	struct wrapper_msg *trans_wrapper;
 361	struct wrapper_msg *wrapper;
 362	struct wire_msg *msg;
 363	u32 msg_hdr_len;
 364
 365	wrapper = list_first_entry(&wrappers->list, struct wrapper_msg, list);
 366	msg = &wrapper->msg;
 367	msg_hdr_len = le32_to_cpu(msg->hdr.len);
 368
 369	if (in_trans->hdr.len % 8 != 0)
 370		return -EINVAL;
 371
 372	if (size_add(msg_hdr_len, in_trans->hdr.len) > QAIC_MANAGE_WIRE_MSG_LENGTH)
 373		return -ENOSPC;
 374
 375	trans_wrapper = add_wrapper(wrappers,
 376				    offsetof(struct wrapper_msg, trans) + in_trans->hdr.len);
 377	if (!trans_wrapper)
 378		return -ENOMEM;
 379	trans_wrapper->len = in_trans->hdr.len;
 380	out_trans = (struct wire_trans_passthrough *)&trans_wrapper->trans;
 381
 382	memcpy(out_trans->data, in_trans->data, in_trans->hdr.len - sizeof(in_trans->hdr));
 383	msg->hdr.len = cpu_to_le32(msg_hdr_len + in_trans->hdr.len);
 384	msg->hdr.count = incr_le32(msg->hdr.count);
 385	*user_len += in_trans->hdr.len;
 386	out_trans->hdr.type = cpu_to_le32(QAIC_TRANS_PASSTHROUGH_TO_DEV);
 387	out_trans->hdr.len = cpu_to_le32(in_trans->hdr.len);
 388
 389	return 0;
 390}
 391
 392/* returns error code for failure, 0 if enough pages alloc'd, 1 if dma_cont is needed */
 393static int find_and_map_user_pages(struct qaic_device *qdev,
 394				   struct qaic_manage_trans_dma_xfer *in_trans,
 395				   struct ioctl_resources *resources, struct dma_xfer *xfer)
 396{
 397	u64 xfer_start_addr, remaining, end, total;
 398	unsigned long need_pages;
 399	struct page **page_list;
 400	unsigned long nr_pages;
 401	struct sg_table *sgt;
 402	int ret;
 403	int i;
 404
 405	if (check_add_overflow(in_trans->addr, resources->xferred_dma_size, &xfer_start_addr))
 406		return -EINVAL;
 407
 408	if (in_trans->size < resources->xferred_dma_size)
 409		return -EINVAL;
 410	remaining = in_trans->size - resources->xferred_dma_size;
 411	if (remaining == 0)
 412		return -EINVAL;
 413
 414	if (check_add_overflow(xfer_start_addr, remaining, &end))
 415		return -EINVAL;
 416
 417	total = remaining + offset_in_page(xfer_start_addr);
 418	if (total >= SIZE_MAX)
 419		return -EINVAL;
 420
 421	need_pages = DIV_ROUND_UP(total, PAGE_SIZE);
 422
 423	nr_pages = need_pages;
 424
 425	while (1) {
 426		page_list = kmalloc_array(nr_pages, sizeof(*page_list), GFP_KERNEL | __GFP_NOWARN);
 427		if (!page_list) {
 428			nr_pages = nr_pages / 2;
 429			if (!nr_pages)
 430				return -ENOMEM;
 431		} else {
 432			break;
 433		}
 434	}
 435
 436	ret = get_user_pages_fast(xfer_start_addr, nr_pages, 0, page_list);
 437	if (ret < 0)
 438		goto free_page_list;
 439	if (ret != nr_pages) {
 440		nr_pages = ret;
 441		ret = -EFAULT;
 442		goto put_pages;
 443	}
 444
 445	sgt = kmalloc(sizeof(*sgt), GFP_KERNEL);
 446	if (!sgt) {
 447		ret = -ENOMEM;
 448		goto put_pages;
 449	}
 450
 451	ret = sg_alloc_table_from_pages(sgt, page_list, nr_pages,
 452					offset_in_page(xfer_start_addr),
 453					remaining, GFP_KERNEL);
 454	if (ret) {
 455		ret = -ENOMEM;
 456		goto free_sgt;
 457	}
 458
 459	ret = dma_map_sgtable(&qdev->pdev->dev, sgt, DMA_TO_DEVICE, 0);
 460	if (ret)
 461		goto free_table;
 462
 463	xfer->sgt = sgt;
 464	xfer->page_list = page_list;
 465	xfer->nr_pages = nr_pages;
 466
 467	return need_pages > nr_pages ? 1 : 0;
 468
 469free_table:
 470	sg_free_table(sgt);
 471free_sgt:
 472	kfree(sgt);
 473put_pages:
 474	for (i = 0; i < nr_pages; ++i)
 475		put_page(page_list[i]);
 476free_page_list:
 477	kfree(page_list);
 478	return ret;
 479}
 480
 481/* returns error code for failure, 0 if everything was encoded, 1 if dma_cont is needed */
 482static int encode_addr_size_pairs(struct dma_xfer *xfer, struct wrapper_list *wrappers,
 483				  struct ioctl_resources *resources, u32 msg_hdr_len, u32 *size,
 484				  struct wire_trans_dma_xfer **out_trans)
 485{
 486	struct wrapper_msg *trans_wrapper;
 487	struct sg_table *sgt = xfer->sgt;
 488	struct wire_addr_size_pair *asp;
 489	struct scatterlist *sg;
 490	struct wrapper_msg *w;
 491	unsigned int dma_len;
 492	u64 dma_chunk_len;
 493	void *boundary;
 494	int nents_dma;
 495	int nents;
 496	int i;
 497
 498	nents = sgt->nents;
 499	nents_dma = nents;
 500	*size = QAIC_MANAGE_WIRE_MSG_LENGTH - msg_hdr_len - sizeof(**out_trans);
 501	for_each_sgtable_dma_sg(sgt, sg, i) {
 502		*size -= sizeof(*asp);
 503		/* Save 1K for possible follow-up transactions. */
 504		if (*size < SZ_1K) {
 505			nents_dma = i;
 506			break;
 507		}
 508	}
 509
 510	trans_wrapper = add_wrapper(wrappers, QAIC_WRAPPER_MAX_SIZE);
 511	if (!trans_wrapper)
 512		return -ENOMEM;
 513	*out_trans = (struct wire_trans_dma_xfer *)&trans_wrapper->trans;
 514
 515	asp = (*out_trans)->data;
 516	boundary = (void *)trans_wrapper + QAIC_WRAPPER_MAX_SIZE;
 517	*size = 0;
 518
 519	dma_len = 0;
 520	w = trans_wrapper;
 521	dma_chunk_len = 0;
 522	for_each_sg(sgt->sgl, sg, nents_dma, i) {
 523		asp->size = cpu_to_le64(dma_len);
 524		dma_chunk_len += dma_len;
 525		if (dma_len) {
 526			asp++;
 527			if ((void *)asp + sizeof(*asp) > boundary) {
 528				w->len = (void *)asp - (void *)&w->msg;
 529				*size += w->len;
 530				w = add_wrapper(wrappers, QAIC_WRAPPER_MAX_SIZE);
 531				if (!w)
 532					return -ENOMEM;
 533				boundary = (void *)w + QAIC_WRAPPER_MAX_SIZE;
 534				asp = (struct wire_addr_size_pair *)&w->msg;
 535			}
 536		}
 537		asp->addr = cpu_to_le64(sg_dma_address(sg));
 538		dma_len = sg_dma_len(sg);
 539	}
 540	/* finalize the last segment */
 541	asp->size = cpu_to_le64(dma_len);
 542	w->len = (void *)asp + sizeof(*asp) - (void *)&w->msg;
 543	*size += w->len;
 544	dma_chunk_len += dma_len;
 545	resources->xferred_dma_size += dma_chunk_len;
 546
 547	return nents_dma < nents ? 1 : 0;
 548}
 549
 550static void cleanup_xfer(struct qaic_device *qdev, struct dma_xfer *xfer)
 551{
 552	int i;
 553
 554	dma_unmap_sgtable(&qdev->pdev->dev, xfer->sgt, DMA_TO_DEVICE, 0);
 555	sg_free_table(xfer->sgt);
 556	kfree(xfer->sgt);
 557	for (i = 0; i < xfer->nr_pages; ++i)
 558		put_page(xfer->page_list[i]);
 559	kfree(xfer->page_list);
 560}
 561
 562static int encode_dma(struct qaic_device *qdev, void *trans, struct wrapper_list *wrappers,
 563		      u32 *user_len, struct ioctl_resources *resources, struct qaic_user *usr)
 564{
 565	struct qaic_manage_trans_dma_xfer *in_trans = trans;
 566	struct wire_trans_dma_xfer *out_trans;
 567	struct wrapper_msg *wrapper;
 568	struct dma_xfer *xfer;
 569	struct wire_msg *msg;
 570	bool need_cont_dma;
 571	u32 msg_hdr_len;
 572	u32 size;
 573	int ret;
 574
 575	wrapper = list_first_entry(&wrappers->list, struct wrapper_msg, list);
 576	msg = &wrapper->msg;
 577	msg_hdr_len = le32_to_cpu(msg->hdr.len);
 578
 579	/* There should be enough space to hold at least one ASP entry. */
 580	if (size_add(msg_hdr_len, sizeof(*out_trans) + sizeof(struct wire_addr_size_pair)) >
 581	    QAIC_MANAGE_WIRE_MSG_LENGTH)
 582		return -ENOMEM;
 583
 584	xfer = kmalloc(sizeof(*xfer), GFP_KERNEL);
 585	if (!xfer)
 586		return -ENOMEM;
 587
 588	ret = find_and_map_user_pages(qdev, in_trans, resources, xfer);
 589	if (ret < 0)
 590		goto free_xfer;
 591
 592	need_cont_dma = (bool)ret;
 593
 594	ret = encode_addr_size_pairs(xfer, wrappers, resources, msg_hdr_len, &size, &out_trans);
 595	if (ret < 0)
 596		goto cleanup_xfer;
 597
 598	need_cont_dma = need_cont_dma || (bool)ret;
 599
 600	msg->hdr.len = cpu_to_le32(msg_hdr_len + size);
 601	msg->hdr.count = incr_le32(msg->hdr.count);
 602
 603	out_trans->hdr.type = cpu_to_le32(QAIC_TRANS_DMA_XFER_TO_DEV);
 604	out_trans->hdr.len = cpu_to_le32(size);
 605	out_trans->tag = cpu_to_le32(in_trans->tag);
 606	out_trans->count = cpu_to_le32((size - sizeof(*out_trans)) /
 607								sizeof(struct wire_addr_size_pair));
 608
 609	*user_len += in_trans->hdr.len;
 610
 611	if (resources->dma_chunk_id) {
 612		out_trans->dma_chunk_id = cpu_to_le32(resources->dma_chunk_id);
 613	} else if (need_cont_dma) {
 614		while (resources->dma_chunk_id == 0)
 615			resources->dma_chunk_id = atomic_inc_return(&usr->chunk_id);
 616
 617		out_trans->dma_chunk_id = cpu_to_le32(resources->dma_chunk_id);
 618	}
 619	resources->trans_hdr = trans;
 620
 621	list_add(&xfer->list, &resources->dma_xfers);
 622	return 0;
 623
 624cleanup_xfer:
 625	cleanup_xfer(qdev, xfer);
 626free_xfer:
 627	kfree(xfer);
 628	return ret;
 629}
 630
 631static int encode_activate(struct qaic_device *qdev, void *trans, struct wrapper_list *wrappers,
 632			   u32 *user_len, struct ioctl_resources *resources)
 633{
 634	struct qaic_manage_trans_activate_to_dev *in_trans = trans;
 635	struct wire_trans_activate_to_dev *out_trans;
 636	struct wrapper_msg *trans_wrapper;
 637	struct wrapper_msg *wrapper;
 638	struct wire_msg *msg;
 639	dma_addr_t dma_addr;
 640	u32 msg_hdr_len;
 641	void *buf;
 642	u32 nelem;
 643	u32 size;
 644	int ret;
 645
 646	wrapper = list_first_entry(&wrappers->list, struct wrapper_msg, list);
 647	msg = &wrapper->msg;
 648	msg_hdr_len = le32_to_cpu(msg->hdr.len);
 649
 650	if (size_add(msg_hdr_len, sizeof(*out_trans)) > QAIC_MANAGE_WIRE_MSG_LENGTH)
 651		return -ENOSPC;
 652
 653	if (!in_trans->queue_size)
 654		return -EINVAL;
 655
 656	if (in_trans->pad)
 657		return -EINVAL;
 658
 659	nelem = in_trans->queue_size;
 660	if (check_mul_overflow((u32)(get_dbc_req_elem_size() + get_dbc_rsp_elem_size()),
 661			       nelem,
 662			       &size))
 663		return -EINVAL;
 664
 665	if (size + QAIC_DBC_Q_GAP + QAIC_DBC_Q_BUF_ALIGN < size)
 666		return -EINVAL;
 667
 668	size = ALIGN((size + QAIC_DBC_Q_GAP), QAIC_DBC_Q_BUF_ALIGN);
 669
 670	buf = dma_alloc_coherent(&qdev->pdev->dev, size, &dma_addr, GFP_KERNEL);
 671	if (!buf)
 672		return -ENOMEM;
 673
 674	trans_wrapper = add_wrapper(wrappers,
 675				    offsetof(struct wrapper_msg, trans) + sizeof(*out_trans));
 676	if (!trans_wrapper) {
 677		ret = -ENOMEM;
 678		goto free_dma;
 679	}
 680	trans_wrapper->len = sizeof(*out_trans);
 681	out_trans = (struct wire_trans_activate_to_dev *)&trans_wrapper->trans;
 682
 683	out_trans->hdr.type = cpu_to_le32(QAIC_TRANS_ACTIVATE_TO_DEV);
 684	out_trans->hdr.len = cpu_to_le32(sizeof(*out_trans));
 685	out_trans->buf_len = cpu_to_le32(size);
 686	out_trans->req_q_addr = cpu_to_le64(dma_addr);
 687	out_trans->req_q_size = cpu_to_le32(nelem);
 688	out_trans->rsp_q_addr = cpu_to_le64(dma_addr + size - nelem * get_dbc_rsp_elem_size());
 689	out_trans->rsp_q_size = cpu_to_le32(nelem);
 690	out_trans->options = cpu_to_le32(in_trans->options);
 691
 692	*user_len += in_trans->hdr.len;
 693	msg->hdr.len = cpu_to_le32(msg_hdr_len + sizeof(*out_trans));
 694	msg->hdr.count = incr_le32(msg->hdr.count);
 695
 696	resources->buf = buf;
 697	resources->dma_addr = dma_addr;
 698	resources->total_size = size;
 699	resources->nelem = nelem;
 700	resources->rsp_q_base = buf + size - nelem * get_dbc_rsp_elem_size();
 701	return 0;
 702
 703free_dma:
 704	dma_free_coherent(&qdev->pdev->dev, size, buf, dma_addr);
 705	return ret;
 706}
 707
 708static int encode_deactivate(struct qaic_device *qdev, void *trans,
 709			     u32 *user_len, struct qaic_user *usr)
 710{
 711	struct qaic_manage_trans_deactivate *in_trans = trans;
 712
 713	if (in_trans->dbc_id >= qdev->num_dbc || in_trans->pad)
 714		return -EINVAL;
 715
 716	*user_len += in_trans->hdr.len;
 717
 718	return disable_dbc(qdev, in_trans->dbc_id, usr);
 719}
 720
 721static int encode_status(struct qaic_device *qdev, void *trans, struct wrapper_list *wrappers,
 722			 u32 *user_len)
 723{
 724	struct qaic_manage_trans_status_to_dev *in_trans = trans;
 725	struct wire_trans_status_to_dev *out_trans;
 726	struct wrapper_msg *trans_wrapper;
 727	struct wrapper_msg *wrapper;
 728	struct wire_msg *msg;
 729	u32 msg_hdr_len;
 730
 731	wrapper = list_first_entry(&wrappers->list, struct wrapper_msg, list);
 732	msg = &wrapper->msg;
 733	msg_hdr_len = le32_to_cpu(msg->hdr.len);
 734
 735	if (size_add(msg_hdr_len, in_trans->hdr.len) > QAIC_MANAGE_WIRE_MSG_LENGTH)
 736		return -ENOSPC;
 737
 738	trans_wrapper = add_wrapper(wrappers, sizeof(*trans_wrapper));
 739	if (!trans_wrapper)
 740		return -ENOMEM;
 741
 742	trans_wrapper->len = sizeof(*out_trans);
 743	out_trans = (struct wire_trans_status_to_dev *)&trans_wrapper->trans;
 744
 745	out_trans->hdr.type = cpu_to_le32(QAIC_TRANS_STATUS_TO_DEV);
 746	out_trans->hdr.len = cpu_to_le32(in_trans->hdr.len);
 747	msg->hdr.len = cpu_to_le32(msg_hdr_len + in_trans->hdr.len);
 748	msg->hdr.count = incr_le32(msg->hdr.count);
 749	*user_len += in_trans->hdr.len;
 750
 751	return 0;
 752}
 753
 754static int encode_message(struct qaic_device *qdev, struct manage_msg *user_msg,
 755			  struct wrapper_list *wrappers, struct ioctl_resources *resources,
 756			  struct qaic_user *usr)
 757{
 758	struct qaic_manage_trans_hdr *trans_hdr;
 759	struct wrapper_msg *wrapper;
 760	struct wire_msg *msg;
 761	u32 user_len = 0;
 762	int ret;
 763	int i;
 764
 765	if (!user_msg->count ||
 766	    user_msg->len < sizeof(*trans_hdr)) {
 767		ret = -EINVAL;
 768		goto out;
 769	}
 770
 771	wrapper = list_first_entry(&wrappers->list, struct wrapper_msg, list);
 772	msg = &wrapper->msg;
 773
 774	msg->hdr.len = cpu_to_le32(sizeof(msg->hdr));
 775
 776	if (resources->dma_chunk_id) {
 777		ret = encode_dma(qdev, resources->trans_hdr, wrappers, &user_len, resources, usr);
 778		msg->hdr.count = cpu_to_le32(1);
 779		goto out;
 780	}
 781
 782	for (i = 0; i < user_msg->count; ++i) {
 783		if (user_len > user_msg->len - sizeof(*trans_hdr)) {
 784			ret = -EINVAL;
 785			break;
 786		}
 787		trans_hdr = (struct qaic_manage_trans_hdr *)(user_msg->data + user_len);
 788		if (trans_hdr->len < sizeof(trans_hdr) ||
 789		    size_add(user_len, trans_hdr->len) > user_msg->len) {
 790			ret = -EINVAL;
 791			break;
 792		}
 793
 794		switch (trans_hdr->type) {
 795		case QAIC_TRANS_PASSTHROUGH_FROM_USR:
 796			ret = encode_passthrough(qdev, trans_hdr, wrappers, &user_len);
 797			break;
 798		case QAIC_TRANS_DMA_XFER_FROM_USR:
 799			ret = encode_dma(qdev, trans_hdr, wrappers, &user_len, resources, usr);
 800			break;
 801		case QAIC_TRANS_ACTIVATE_FROM_USR:
 802			ret = encode_activate(qdev, trans_hdr, wrappers, &user_len, resources);
 803			break;
 804		case QAIC_TRANS_DEACTIVATE_FROM_USR:
 805			ret = encode_deactivate(qdev, trans_hdr, &user_len, usr);
 806			break;
 807		case QAIC_TRANS_STATUS_FROM_USR:
 808			ret = encode_status(qdev, trans_hdr, wrappers, &user_len);
 809			break;
 810		default:
 811			ret = -EINVAL;
 812			break;
 813		}
 814
 815		if (ret)
 816			goto out;
 817	}
 818
 819	if (user_len != user_msg->len)
 820		ret = -EINVAL;
 821out:
 822	if (ret) {
 823		free_dma_xfers(qdev, resources);
 824		free_dbc_buf(qdev, resources);
 825		return ret;
 826	}
 827
 828	return 0;
 829}
 830
 831static int decode_passthrough(struct qaic_device *qdev, void *trans, struct manage_msg *user_msg,
 832			      u32 *msg_len)
 833{
 834	struct qaic_manage_trans_passthrough *out_trans;
 835	struct wire_trans_passthrough *in_trans = trans;
 836	u32 len;
 837
 838	out_trans = (void *)user_msg->data + user_msg->len;
 839
 840	len = le32_to_cpu(in_trans->hdr.len);
 841	if (len % 8 != 0)
 842		return -EINVAL;
 843
 844	if (user_msg->len + len > QAIC_MANAGE_MAX_MSG_LENGTH)
 845		return -ENOSPC;
 846
 847	memcpy(out_trans->data, in_trans->data, len - sizeof(in_trans->hdr));
 848	user_msg->len += len;
 849	*msg_len += len;
 850	out_trans->hdr.type = le32_to_cpu(in_trans->hdr.type);
 851	out_trans->hdr.len = len;
 852
 853	return 0;
 854}
 855
 856static int decode_activate(struct qaic_device *qdev, void *trans, struct manage_msg *user_msg,
 857			   u32 *msg_len, struct ioctl_resources *resources, struct qaic_user *usr)
 858{
 859	struct qaic_manage_trans_activate_from_dev *out_trans;
 860	struct wire_trans_activate_from_dev *in_trans = trans;
 861	u32 len;
 862
 863	out_trans = (void *)user_msg->data + user_msg->len;
 864
 865	len = le32_to_cpu(in_trans->hdr.len);
 866	if (user_msg->len + len > QAIC_MANAGE_MAX_MSG_LENGTH)
 867		return -ENOSPC;
 868
 869	user_msg->len += len;
 870	*msg_len += len;
 871	out_trans->hdr.type = le32_to_cpu(in_trans->hdr.type);
 872	out_trans->hdr.len = len;
 873	out_trans->status = le32_to_cpu(in_trans->status);
 874	out_trans->dbc_id = le32_to_cpu(in_trans->dbc_id);
 875	out_trans->options = le64_to_cpu(in_trans->options);
 876
 877	if (!resources->buf)
 878		/* how did we get an activate response without a request? */
 879		return -EINVAL;
 880
 881	if (out_trans->dbc_id >= qdev->num_dbc)
 882		/*
 883		 * The device assigned an invalid resource, which should never
 884		 * happen. Return an error so the user can try to recover.
 885		 */
 886		return -ENODEV;
 887
 888	if (out_trans->status)
 889		/*
 890		 * Allocating resources failed on device side. This is not an
 891		 * expected behaviour, user is expected to handle this situation.
 892		 */
 893		return -ECANCELED;
 894
 895	resources->status = out_trans->status;
 896	resources->dbc_id = out_trans->dbc_id;
 897	save_dbc_buf(qdev, resources, usr);
 898
 899	return 0;
 900}
 901
 902static int decode_deactivate(struct qaic_device *qdev, void *trans, u32 *msg_len,
 903			     struct qaic_user *usr)
 904{
 905	struct wire_trans_deactivate_from_dev *in_trans = trans;
 906	u32 dbc_id = le32_to_cpu(in_trans->dbc_id);
 907	u32 status = le32_to_cpu(in_trans->status);
 908
 909	if (dbc_id >= qdev->num_dbc)
 910		/*
 911		 * The device assigned an invalid resource, which should never
 912		 * happen. Inject an error so the user can try to recover.
 913		 */
 914		return -ENODEV;
 915
 916	if (usr && status) {
 917		/*
 918		 * Releasing resources failed on the device side, which puts
 919		 * us in a bind since they may still be in use, so enable the
 920		 * dbc. User is expected to retry deactivation.
 921		 */
 922		enable_dbc(qdev, dbc_id, usr);
 923		return -ECANCELED;
 924	}
 925
 926	release_dbc(qdev, dbc_id);
 927	set_dbc_state(qdev, dbc_id, DBC_STATE_IDLE);
 928	*msg_len += sizeof(*in_trans);
 929
 930	return 0;
 931}
 932
 933static int decode_status(struct qaic_device *qdev, void *trans, struct manage_msg *user_msg,
 934			 u32 *user_len, struct wire_msg *msg)
 935{
 936	struct qaic_manage_trans_status_from_dev *out_trans;
 937	struct wire_trans_status_from_dev *in_trans = trans;
 938	u32 len;
 939
 940	out_trans = (void *)user_msg->data + user_msg->len;
 941
 942	len = le32_to_cpu(in_trans->hdr.len);
 943	if (user_msg->len + len > QAIC_MANAGE_MAX_MSG_LENGTH)
 944		return -ENOSPC;
 945
 946	out_trans->hdr.type = QAIC_TRANS_STATUS_FROM_DEV;
 947	out_trans->hdr.len = len;
 948	out_trans->major = le16_to_cpu(in_trans->major);
 949	out_trans->minor = le16_to_cpu(in_trans->minor);
 950	out_trans->status_flags = le64_to_cpu(in_trans->status_flags);
 951	out_trans->status = le32_to_cpu(in_trans->status);
 952	*user_len += le32_to_cpu(in_trans->hdr.len);
 953	user_msg->len += len;
 954
 955	if (out_trans->status)
 956		return -ECANCELED;
 957	if (out_trans->status_flags & BIT(0) && !valid_crc(msg))
 958		return -EPIPE;
 959
 960	return 0;
 961}
 962
 963static int decode_message(struct qaic_device *qdev, struct manage_msg *user_msg,
 964			  struct wire_msg *msg, struct ioctl_resources *resources,
 965			  struct qaic_user *usr)
 966{
 967	u32 msg_hdr_len = le32_to_cpu(msg->hdr.len);
 968	struct wire_trans_hdr *trans_hdr;
 969	u32 msg_len = 0;
 970	int ret;
 971	int i;
 972
 973	if (msg_hdr_len < sizeof(*trans_hdr) ||
 974	    msg_hdr_len > QAIC_MANAGE_MAX_MSG_LENGTH)
 975		return -EINVAL;
 976
 977	user_msg->len = 0;
 978	user_msg->count = le32_to_cpu(msg->hdr.count);
 979
 980	for (i = 0; i < user_msg->count; ++i) {
 981		u32 hdr_len;
 982
 983		if (msg_len > msg_hdr_len - sizeof(*trans_hdr))
 984			return -EINVAL;
 985
 986		trans_hdr = (struct wire_trans_hdr *)(msg->data + msg_len);
 987		hdr_len = le32_to_cpu(trans_hdr->len);
 988		if (hdr_len < sizeof(*trans_hdr) ||
 989		    size_add(msg_len, hdr_len) > msg_hdr_len)
 990			return -EINVAL;
 991
 992		switch (le32_to_cpu(trans_hdr->type)) {
 993		case QAIC_TRANS_PASSTHROUGH_FROM_DEV:
 994			ret = decode_passthrough(qdev, trans_hdr, user_msg, &msg_len);
 995			break;
 996		case QAIC_TRANS_ACTIVATE_FROM_DEV:
 997			ret = decode_activate(qdev, trans_hdr, user_msg, &msg_len, resources, usr);
 998			break;
 999		case QAIC_TRANS_DEACTIVATE_FROM_DEV:
1000			ret = decode_deactivate(qdev, trans_hdr, &msg_len, usr);
1001			break;
1002		case QAIC_TRANS_STATUS_FROM_DEV:
1003			ret = decode_status(qdev, trans_hdr, user_msg, &msg_len, msg);
1004			break;
1005		default:
1006			return -EINVAL;
1007		}
1008
1009		if (ret)
1010			return ret;
1011	}
1012
1013	if (msg_len != (msg_hdr_len - sizeof(msg->hdr)))
1014		return -EINVAL;
1015
1016	return 0;
1017}
1018
1019static void *msg_xfer(struct qaic_device *qdev, struct wrapper_list *wrappers, u32 seq_num,
1020		      bool ignore_signal)
1021{
1022	struct xfer_queue_elem elem;
1023	struct wire_msg *out_buf;
1024	struct wrapper_msg *w;
1025	long ret = -EAGAIN;
1026	int xfer_count = 0;
1027	int retry_count;
1028
1029	/* Allow QAIC_BOOT state since we need to check control protocol version */
1030	if (qdev->dev_state == QAIC_OFFLINE) {
1031		mutex_unlock(&qdev->cntl_mutex);
1032		return ERR_PTR(-ENODEV);
1033	}
1034
1035	/* Attempt to avoid a partial commit of a message */
1036	list_for_each_entry(w, &wrappers->list, list)
1037		xfer_count++;
1038
1039	for (retry_count = 0; retry_count < QAIC_MHI_RETRY_MAX; retry_count++) {
1040		if (xfer_count <= mhi_get_free_desc_count(qdev->cntl_ch, DMA_TO_DEVICE)) {
1041			ret = 0;
1042			break;
1043		}
1044		msleep_interruptible(QAIC_MHI_RETRY_WAIT_MS);
1045		if (signal_pending(current))
1046			break;
1047	}
1048
1049	if (ret) {
1050		mutex_unlock(&qdev->cntl_mutex);
1051		return ERR_PTR(ret);
1052	}
1053
1054	elem.seq_num = seq_num;
1055	elem.buf = NULL;
1056	init_completion(&elem.xfer_done);
1057	if (likely(!qdev->cntl_lost_buf)) {
1058		/*
1059		 * The max size of request to device is QAIC_MANAGE_WIRE_MSG_LENGTH.
1060		 * The max size of response from device is QAIC_MANAGE_MAX_MSG_LENGTH.
1061		 */
1062		out_buf = kmalloc(QAIC_MANAGE_MAX_MSG_LENGTH, GFP_KERNEL);
1063		if (!out_buf) {
1064			mutex_unlock(&qdev->cntl_mutex);
1065			return ERR_PTR(-ENOMEM);
1066		}
1067
1068		ret = mhi_queue_buf(qdev->cntl_ch, DMA_FROM_DEVICE, out_buf,
1069				    QAIC_MANAGE_MAX_MSG_LENGTH, MHI_EOT);
1070		if (ret) {
1071			mutex_unlock(&qdev->cntl_mutex);
1072			return ERR_PTR(ret);
1073		}
1074	} else {
1075		/*
1076		 * we lost a buffer because we queued a recv buf, but then
1077		 * queuing the corresponding tx buf failed. To try to avoid
1078		 * a memory leak, lets reclaim it and use it for this
1079		 * transaction.
1080		 */
1081		qdev->cntl_lost_buf = false;
1082	}
1083
1084	list_for_each_entry(w, &wrappers->list, list) {
1085		kref_get(&w->ref_count);
1086		ret = mhi_queue_buf(qdev->cntl_ch, DMA_TO_DEVICE, &w->msg, w->len,
1087				    list_is_last(&w->list, &wrappers->list) ? MHI_EOT : MHI_CHAIN);
1088		if (ret) {
1089			qdev->cntl_lost_buf = true;
1090			kref_put(&w->ref_count, free_wrapper);
1091			mutex_unlock(&qdev->cntl_mutex);
1092			return ERR_PTR(ret);
1093		}
1094	}
1095
1096	list_add_tail(&elem.list, &qdev->cntl_xfer_list);
1097	mutex_unlock(&qdev->cntl_mutex);
1098
1099	if (ignore_signal)
1100		ret = wait_for_completion_timeout(&elem.xfer_done, control_resp_timeout_s * HZ);
1101	else
1102		ret = wait_for_completion_interruptible_timeout(&elem.xfer_done,
1103								control_resp_timeout_s * HZ);
1104	/*
1105	 * not using _interruptable because we have to cleanup or we'll
1106	 * likely cause memory corruption
1107	 */
1108	mutex_lock(&qdev->cntl_mutex);
1109	if (!list_empty(&elem.list))
1110		list_del(&elem.list);
1111	/* resp_worker() processed the response but the wait was interrupted */
1112	else if (ret == -ERESTARTSYS)
1113		ret = 0;
1114	if (!ret && !elem.buf)
1115		ret = -ETIMEDOUT;
1116	else if (ret > 0 && !elem.buf)
1117		ret = -EIO;
1118	mutex_unlock(&qdev->cntl_mutex);
1119
1120	if (ret < 0) {
1121		kfree(elem.buf);
1122		return ERR_PTR(ret);
1123	} else if (!qdev->valid_crc(elem.buf)) {
1124		kfree(elem.buf);
1125		return ERR_PTR(-EPIPE);
1126	}
1127
1128	return elem.buf;
1129}
1130
1131/* Add a transaction to abort the outstanding DMA continuation */
1132static int abort_dma_cont(struct qaic_device *qdev, struct wrapper_list *wrappers, u32 dma_chunk_id)
1133{
1134	struct wire_trans_dma_xfer *out_trans;
1135	u32 size = sizeof(*out_trans);
1136	struct wrapper_msg *wrapper;
1137	struct wrapper_msg *w;
1138	struct wire_msg *msg;
1139
1140	wrapper = list_first_entry(&wrappers->list, struct wrapper_msg, list);
1141	msg = &wrapper->msg;
1142
1143	/* Remove all but the first wrapper which has the msg header */
1144	list_for_each_entry_safe(wrapper, w, &wrappers->list, list)
1145		if (!list_is_first(&wrapper->list, &wrappers->list))
1146			kref_put(&wrapper->ref_count, free_wrapper);
1147
1148	wrapper = add_wrapper(wrappers, sizeof(*wrapper));
1149
1150	if (!wrapper)
1151		return -ENOMEM;
1152
1153	out_trans = (struct wire_trans_dma_xfer *)&wrapper->trans;
1154	out_trans->hdr.type = cpu_to_le32(QAIC_TRANS_DMA_XFER_TO_DEV);
1155	out_trans->hdr.len = cpu_to_le32(size);
1156	out_trans->tag = cpu_to_le32(0);
1157	out_trans->count = cpu_to_le32(0);
1158	out_trans->dma_chunk_id = cpu_to_le32(dma_chunk_id);
1159
1160	msg->hdr.len = cpu_to_le32(size + sizeof(*msg));
1161	msg->hdr.count = cpu_to_le32(1);
1162	wrapper->len = size;
1163
1164	return 0;
1165}
1166
1167static struct wrapper_list *alloc_wrapper_list(void)
1168{
1169	struct wrapper_list *wrappers;
1170
1171	wrappers = kmalloc(sizeof(*wrappers), GFP_KERNEL);
1172	if (!wrappers)
1173		return NULL;
1174	INIT_LIST_HEAD(&wrappers->list);
1175	spin_lock_init(&wrappers->lock);
1176
1177	return wrappers;
1178}
1179
1180static int qaic_manage_msg_xfer(struct qaic_device *qdev, struct qaic_user *usr,
1181				struct manage_msg *user_msg, struct ioctl_resources *resources,
1182				struct wire_msg **rsp)
1183{
1184	struct wrapper_list *wrappers;
1185	struct wrapper_msg *wrapper;
1186	struct wrapper_msg *w;
1187	bool all_done = false;
1188	struct wire_msg *msg;
1189	int ret;
1190
1191	wrappers = alloc_wrapper_list();
1192	if (!wrappers)
1193		return -ENOMEM;
1194
1195	wrapper = add_wrapper(wrappers, sizeof(*wrapper));
1196	if (!wrapper) {
1197		kfree(wrappers);
1198		return -ENOMEM;
1199	}
1200
1201	msg = &wrapper->msg;
1202	wrapper->len = sizeof(*msg);
1203
1204	ret = encode_message(qdev, user_msg, wrappers, resources, usr);
1205	if (ret && resources->dma_chunk_id)
1206		ret = abort_dma_cont(qdev, wrappers, resources->dma_chunk_id);
1207	if (ret)
1208		goto encode_failed;
1209
1210	ret = mutex_lock_interruptible(&qdev->cntl_mutex);
1211	if (ret)
1212		goto lock_failed;
1213
1214	msg->hdr.magic_number = MANAGE_MAGIC_NUMBER;
1215	msg->hdr.sequence_number = cpu_to_le32(qdev->next_seq_num++);
1216
1217	if (usr) {
1218		msg->hdr.handle = cpu_to_le32(usr->handle);
1219		msg->hdr.partition_id = cpu_to_le32(usr->qddev->partition_id);
1220	} else {
1221		msg->hdr.handle = 0;
1222		msg->hdr.partition_id = cpu_to_le32(QAIC_NO_PARTITION);
1223	}
1224
1225	msg->hdr.padding = cpu_to_le32(0);
1226	msg->hdr.crc32 = cpu_to_le32(qdev->gen_crc(wrappers));
1227
1228	/* msg_xfer releases the mutex */
1229	*rsp = msg_xfer(qdev, wrappers, qdev->next_seq_num - 1, false);
1230	if (IS_ERR(*rsp))
1231		ret = PTR_ERR(*rsp);
1232
1233lock_failed:
1234	free_dma_xfers(qdev, resources);
1235encode_failed:
1236	spin_lock(&wrappers->lock);
1237	list_for_each_entry_safe(wrapper, w, &wrappers->list, list)
1238		kref_put(&wrapper->ref_count, free_wrapper);
1239	all_done = list_empty(&wrappers->list);
1240	spin_unlock(&wrappers->lock);
1241	if (all_done)
1242		kfree(wrappers);
1243
1244	return ret;
1245}
1246
1247static int qaic_manage(struct qaic_device *qdev, struct qaic_user *usr, struct manage_msg *user_msg)
1248{
1249	struct wire_trans_dma_xfer_cont *dma_cont = NULL;
1250	struct ioctl_resources resources;
1251	struct wire_msg *rsp = NULL;
1252	int ret;
1253
1254	memset(&resources, 0, sizeof(struct ioctl_resources));
1255
1256	INIT_LIST_HEAD(&resources.dma_xfers);
1257
1258	if (user_msg->len > QAIC_MANAGE_MAX_MSG_LENGTH ||
1259	    user_msg->count > QAIC_MANAGE_MAX_MSG_LENGTH / sizeof(struct qaic_manage_trans_hdr))
1260		return -EINVAL;
1261
1262dma_xfer_continue:
1263	ret = qaic_manage_msg_xfer(qdev, usr, user_msg, &resources, &rsp);
1264	if (ret)
1265		return ret;
1266	/* dma_cont should be the only transaction if present */
1267	if (le32_to_cpu(rsp->hdr.count) == 1) {
1268		dma_cont = (struct wire_trans_dma_xfer_cont *)rsp->data;
1269		if (le32_to_cpu(dma_cont->hdr.type) != QAIC_TRANS_DMA_XFER_CONT)
1270			dma_cont = NULL;
1271	}
1272	if (dma_cont) {
1273		if (le32_to_cpu(dma_cont->dma_chunk_id) == resources.dma_chunk_id &&
1274		    le64_to_cpu(dma_cont->xferred_size) == resources.xferred_dma_size) {
1275			kfree(rsp);
1276			goto dma_xfer_continue;
1277		}
1278
1279		ret = -EINVAL;
1280		goto dma_cont_failed;
1281	}
1282
1283	ret = decode_message(qdev, user_msg, rsp, &resources, usr);
1284
1285dma_cont_failed:
1286	free_dbc_buf(qdev, &resources);
1287	kfree(rsp);
1288	return ret;
1289}
1290
1291int qaic_manage_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
1292{
1293	struct qaic_manage_msg *user_msg = data;
1294	struct qaic_device *qdev;
1295	struct manage_msg *msg;
1296	struct qaic_user *usr;
1297	u8 __user *user_data;
1298	int qdev_rcu_id;
1299	int usr_rcu_id;
1300	int ret;
1301
1302	if (user_msg->len > QAIC_MANAGE_MAX_MSG_LENGTH)
1303		return -EINVAL;
1304
1305	usr = file_priv->driver_priv;
1306
1307	usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
1308	if (!usr->qddev) {
1309		srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
1310		return -ENODEV;
1311	}
1312
1313	qdev = usr->qddev->qdev;
1314
1315	qdev_rcu_id = srcu_read_lock(&qdev->dev_lock);
1316	if (qdev->dev_state != QAIC_ONLINE) {
1317		srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
1318		srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
1319		return -ENODEV;
1320	}
1321
1322	msg = kzalloc(QAIC_MANAGE_MAX_MSG_LENGTH + sizeof(*msg), GFP_KERNEL);
1323	if (!msg) {
1324		ret = -ENOMEM;
1325		goto out;
1326	}
1327
1328	msg->len = user_msg->len;
1329	msg->count = user_msg->count;
1330
1331	user_data = u64_to_user_ptr(user_msg->data);
1332
1333	if (copy_from_user(msg->data, user_data, user_msg->len)) {
1334		ret = -EFAULT;
1335		goto free_msg;
1336	}
1337
1338	ret = qaic_manage(qdev, usr, msg);
1339
1340	/*
1341	 * If the qaic_manage() is successful then we copy the message onto
1342	 * userspace memory but we have an exception for -ECANCELED.
1343	 * For -ECANCELED, it means that device has NACKed the message with a
1344	 * status error code which userspace would like to know.
1345	 */
1346	if (ret == -ECANCELED || !ret) {
1347		if (copy_to_user(user_data, msg->data, msg->len)) {
1348			ret = -EFAULT;
1349		} else {
1350			user_msg->len = msg->len;
1351			user_msg->count = msg->count;
1352		}
1353	}
1354
1355free_msg:
1356	kfree(msg);
1357out:
1358	srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
1359	srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
1360	return ret;
1361}
1362
1363int get_cntl_version(struct qaic_device *qdev, struct qaic_user *usr, u16 *major, u16 *minor)
1364{
1365	struct qaic_manage_trans_status_from_dev *status_result;
1366	struct qaic_manage_trans_status_to_dev *status_query;
1367	struct manage_msg *user_msg;
1368	int ret;
1369
1370	user_msg = kmalloc(sizeof(*user_msg) + sizeof(*status_result), GFP_KERNEL);
1371	if (!user_msg) {
1372		ret = -ENOMEM;
1373		goto out;
1374	}
1375	user_msg->len = sizeof(*status_query);
1376	user_msg->count = 1;
1377
1378	status_query = (struct qaic_manage_trans_status_to_dev *)user_msg->data;
1379	status_query->hdr.type = QAIC_TRANS_STATUS_FROM_USR;
1380	status_query->hdr.len = sizeof(status_query->hdr);
1381
1382	ret = qaic_manage(qdev, usr, user_msg);
1383	if (ret)
1384		goto kfree_user_msg;
1385	status_result = (struct qaic_manage_trans_status_from_dev *)user_msg->data;
1386	*major = status_result->major;
1387	*minor = status_result->minor;
1388
1389	if (status_result->status_flags & BIT(0)) { /* device is using CRC */
1390		/* By default qdev->gen_crc is programmed to generate CRC */
1391		qdev->valid_crc = valid_crc;
1392	} else {
1393		/* By default qdev->valid_crc is programmed to bypass CRC */
1394		qdev->gen_crc = gen_crc_stub;
1395	}
1396
1397kfree_user_msg:
1398	kfree(user_msg);
1399out:
1400	return ret;
1401}
1402
1403static void resp_worker(struct work_struct *work)
1404{
1405	struct resp_work *resp = container_of(work, struct resp_work, work);
1406	struct qaic_device *qdev = resp->qdev;
1407	struct wire_msg *msg = resp->buf;
1408	struct xfer_queue_elem *elem;
1409	struct xfer_queue_elem *i;
1410	bool found = false;
1411
1412	mutex_lock(&qdev->cntl_mutex);
1413	list_for_each_entry_safe(elem, i, &qdev->cntl_xfer_list, list) {
1414		if (elem->seq_num == le32_to_cpu(msg->hdr.sequence_number)) {
1415			found = true;
1416			list_del_init(&elem->list);
1417			elem->buf = msg;
1418			complete_all(&elem->xfer_done);
1419			break;
1420		}
1421	}
1422	mutex_unlock(&qdev->cntl_mutex);
1423
1424	if (!found) {
1425		/*
1426		 * The user might have gone away at this point without waiting
1427		 * for QAIC_TRANS_DEACTIVATE_FROM_DEV transaction coming from
1428		 * the device. If this is not handled correctly, the host will
1429		 * not know that the DBC[n] has been freed on the device.
1430		 * Due to this failure in synchronization between the device and
1431		 * the host, if another user requests to activate a network, and
1432		 * the device assigns DBC[n] again, save_dbc_buf() will hang,
1433		 * waiting for dbc[n]->in_use to be set to false, which will not
1434		 * happen unless the qaic_dev_reset_clean_local_state() gets
1435		 * called by resetting the device (or re-inserting the module).
1436		 *
1437		 * As a solution, we look for QAIC_TRANS_DEACTIVATE_FROM_DEV
1438		 * transactions in the message before disposing of it, then
1439		 * handle releasing the DBC resources.
1440		 *
1441		 * Since the user has gone away, if the device could not
1442		 * deactivate the network (status != 0), there is no way to
1443		 * enable and reassign the DBC to the user. We can put trust in
1444		 * the device that it will release all the active DBCs in
1445		 * response to the QAIC_TRANS_TERMINATE_TO_DEV transaction,
1446		 * otherwise, the user can issue an soc_reset to the device.
1447		 */
1448		u32 msg_count = le32_to_cpu(msg->hdr.count);
1449		u32 msg_len = le32_to_cpu(msg->hdr.len);
1450		u32 len = 0;
1451		int j;
1452
1453		for (j = 0; j < msg_count && len < msg_len; ++j) {
1454			struct wire_trans_hdr *trans_hdr;
1455
1456			trans_hdr = (struct wire_trans_hdr *)(msg->data + len);
1457			if (le32_to_cpu(trans_hdr->type) == QAIC_TRANS_DEACTIVATE_FROM_DEV) {
1458				if (decode_deactivate(qdev, trans_hdr, &len, NULL))
1459					len += le32_to_cpu(trans_hdr->len);
1460			} else {
1461				len += le32_to_cpu(trans_hdr->len);
1462			}
1463		}
1464		/* request must have timed out, drop packet */
1465		kfree(msg);
1466	}
1467
1468	kfree(resp);
1469}
1470
1471static void free_wrapper_from_list(struct wrapper_list *wrappers, struct wrapper_msg *wrapper)
1472{
1473	bool all_done = false;
1474
1475	spin_lock(&wrappers->lock);
1476	kref_put(&wrapper->ref_count, free_wrapper);
1477	all_done = list_empty(&wrappers->list);
1478	spin_unlock(&wrappers->lock);
1479
1480	if (all_done)
1481		kfree(wrappers);
1482}
1483
1484void qaic_mhi_ul_xfer_cb(struct mhi_device *mhi_dev, struct mhi_result *mhi_result)
1485{
1486	struct wire_msg *msg = mhi_result->buf_addr;
1487	struct wrapper_msg *wrapper = container_of(msg, struct wrapper_msg, msg);
1488
1489	free_wrapper_from_list(wrapper->head, wrapper);
1490}
1491
1492void qaic_mhi_dl_xfer_cb(struct mhi_device *mhi_dev, struct mhi_result *mhi_result)
1493{
1494	struct qaic_device *qdev = dev_get_drvdata(&mhi_dev->dev);
1495	struct wire_msg *msg = mhi_result->buf_addr;
1496	struct resp_work *resp;
1497
1498	if (mhi_result->transaction_status || msg->hdr.magic_number != MANAGE_MAGIC_NUMBER) {
1499		kfree(msg);
1500		return;
1501	}
1502
1503	resp = kmalloc(sizeof(*resp), GFP_ATOMIC);
1504	if (!resp) {
1505		kfree(msg);
1506		return;
1507	}
1508
1509	INIT_WORK(&resp->work, resp_worker);
1510	resp->qdev = qdev;
1511	resp->buf = msg;
1512	queue_work(qdev->cntl_wq, &resp->work);
1513}
1514
1515int qaic_control_open(struct qaic_device *qdev)
1516{
1517	if (!qdev->cntl_ch)
1518		return -ENODEV;
1519
1520	qdev->cntl_lost_buf = false;
1521	/*
1522	 * By default qaic should assume that device has CRC enabled.
1523	 * Qaic comes to know if device has CRC enabled or disabled during the
1524	 * device status transaction, which is the first transaction performed
1525	 * on control channel.
1526	 *
1527	 * So CRC validation of first device status transaction response is
1528	 * ignored (by calling valid_crc_stub) and is done later during decoding
1529	 * if device has CRC enabled.
1530	 * Now that qaic knows whether device has CRC enabled or not it acts
1531	 * accordingly.
1532	 */
1533	qdev->gen_crc = gen_crc;
1534	qdev->valid_crc = valid_crc_stub;
1535
1536	return mhi_prepare_for_transfer(qdev->cntl_ch);
1537}
1538
1539void qaic_control_close(struct qaic_device *qdev)
1540{
1541	mhi_unprepare_from_transfer(qdev->cntl_ch);
1542}
1543
1544void qaic_release_usr(struct qaic_device *qdev, struct qaic_user *usr)
1545{
1546	struct wire_trans_terminate_to_dev *trans;
1547	struct wrapper_list *wrappers;
1548	struct wrapper_msg *wrapper;
1549	struct wire_msg *msg;
1550	struct wire_msg *rsp;
1551
1552	wrappers = alloc_wrapper_list();
1553	if (!wrappers)
1554		return;
1555
1556	wrapper = add_wrapper(wrappers, sizeof(*wrapper) + sizeof(*msg) + sizeof(*trans));
1557	if (!wrapper)
1558		return;
1559
1560	msg = &wrapper->msg;
1561
1562	trans = (struct wire_trans_terminate_to_dev *)msg->data;
1563
1564	trans->hdr.type = cpu_to_le32(QAIC_TRANS_TERMINATE_TO_DEV);
1565	trans->hdr.len = cpu_to_le32(sizeof(*trans));
1566	trans->handle = cpu_to_le32(usr->handle);
1567
1568	mutex_lock(&qdev->cntl_mutex);
1569	wrapper->len = sizeof(msg->hdr) + sizeof(*trans);
1570	msg->hdr.magic_number = MANAGE_MAGIC_NUMBER;
1571	msg->hdr.sequence_number = cpu_to_le32(qdev->next_seq_num++);
1572	msg->hdr.len = cpu_to_le32(wrapper->len);
1573	msg->hdr.count = cpu_to_le32(1);
1574	msg->hdr.handle = cpu_to_le32(usr->handle);
1575	msg->hdr.padding = cpu_to_le32(0);
1576	msg->hdr.crc32 = cpu_to_le32(qdev->gen_crc(wrappers));
1577
1578	/*
1579	 * msg_xfer releases the mutex
1580	 * We don't care about the return of msg_xfer since we will not do
1581	 * anything different based on what happens.
1582	 * We ignore pending signals since one will be set if the user is
1583	 * killed, and we need give the device a chance to cleanup, otherwise
1584	 * DMA may still be in progress when we return.
1585	 */
1586	rsp = msg_xfer(qdev, wrappers, qdev->next_seq_num - 1, true);
1587	if (!IS_ERR(rsp))
1588		kfree(rsp);
1589	free_wrapper_from_list(wrappers, wrapper);
1590}
1591
1592void wake_all_cntl(struct qaic_device *qdev)
1593{
1594	struct xfer_queue_elem *elem;
1595	struct xfer_queue_elem *i;
1596
1597	mutex_lock(&qdev->cntl_mutex);
1598	list_for_each_entry_safe(elem, i, &qdev->cntl_xfer_list, list) {
1599		list_del_init(&elem->list);
1600		complete_all(&elem->xfer_done);
1601	}
1602	mutex_unlock(&qdev->cntl_mutex);
1603}
~/ Read-only file preview.