bus.c 27.5 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
 * Copyright (c) 2012-2019, Intel Corporation. All rights reserved.
4 5 6 7 8 9
 * Intel Management Engine Interface (Intel MEI) Linux driver
 */

#include <linux/module.h>
#include <linux/device.h>
#include <linux/kernel.h>
10
#include <linux/sched/signal.h>
11 12 13 14 15 16 17 18
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/mutex.h>
#include <linux/interrupt.h>
#include <linux/mei_cl_bus.h>

#include "mei_dev.h"
19
#include "client.h"
20 21 22

#define to_mei_cl_driver(d) container_of(d, struct mei_cl_driver, driver)

23 24 25 26 27 28
/**
 * __mei_cl_send - internal client send (write)
 *
 * @cl: host client
 * @buf: buffer to send
 * @length: buffer length
29
 * @vtag: virtual tag
30
 * @mode: sending mode
31 32 33
 *
 * Return: written size bytes or < 0 on error
 */
34
ssize_t __mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length, u8 vtag,
35
		      unsigned int mode)
36
{
37
	struct mei_device *bus;
38
	struct mei_cl_cb *cb;
39
	ssize_t rets;
40

41 42
	if (WARN_ON(!cl || !cl->dev))
		return -ENODEV;
43

44
	bus = cl->dev;
45

46
	mutex_lock(&bus->device_lock);
47 48
	if (bus->dev_state != MEI_DEV_ENABLED &&
	    bus->dev_state != MEI_DEV_POWERING_DOWN) {
49 50 51 52
		rets = -ENODEV;
		goto out;
	}

53 54 55 56
	if (!mei_cl_is_connected(cl)) {
		rets = -ENODEV;
		goto out;
	}
57

58 59 60 61 62
	/* Check if we have an ME client device */
	if (!mei_me_cl_is_active(cl->me_cl)) {
		rets = -ENOTTY;
		goto out;
	}
63

64 65 66 67 68 69 70
	if (vtag) {
		/* Check if vtag is supported by client */
		rets = mei_cl_vt_support_check(cl);
		if (rets)
			goto out;
	}

71 72 73 74
	if (length > mei_cl_mtu(cl)) {
		rets = -EFBIG;
		goto out;
	}
75

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
	while (cl->tx_cb_queued >= bus->tx_queue_limit) {
		mutex_unlock(&bus->device_lock);
		rets = wait_event_interruptible(cl->tx_wait,
				cl->writing_state == MEI_WRITE_COMPLETE ||
				(!mei_cl_is_connected(cl)));
		mutex_lock(&bus->device_lock);
		if (rets) {
			if (signal_pending(current))
				rets = -EINTR;
			goto out;
		}
		if (!mei_cl_is_connected(cl)) {
			rets = -ENODEV;
			goto out;
		}
	}

93 94 95 96
	cb = mei_cl_alloc_cb(cl, length, MEI_FOP_WRITE, NULL);
	if (!cb) {
		rets = -ENOMEM;
		goto out;
97
	}
98
	cb->vtag = vtag;
99

100 101
	cb->internal = !!(mode & MEI_CL_IO_TX_INTERNAL);
	cb->blocking = !!(mode & MEI_CL_IO_TX_BLOCKING);
102 103
	memcpy(cb->buf.data, buf, length);

104
	rets = mei_cl_write(cl, cb);
105 106 107 108 109

out:
	mutex_unlock(&bus->device_lock);

	return rets;
110 111
}

112 113 114 115
/**
 * __mei_cl_recv - internal client receive (read)
 *
 * @cl: host client
116
 * @buf: buffer to receive
117
 * @length: buffer length
118
 * @mode: io mode
119
 * @vtag: virtual tag
120
 * @timeout: recv timeout, 0 for infinite timeout
121 122 123
 *
 * Return: read size in bytes of < 0 on error
 */
124
ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length, u8 *vtag,
125
		      unsigned int mode, unsigned long timeout)
126
{
127 128 129 130
	struct mei_device *bus;
	struct mei_cl_cb *cb;
	size_t r_length;
	ssize_t rets;
131
	bool nonblock = !!(mode & MEI_CL_IO_RX_NONBLOCK);
132

133
	if (WARN_ON(!cl || !cl->dev))
134 135
		return -ENODEV;

136
	bus = cl->dev;
137

138
	mutex_lock(&bus->device_lock);
139 140
	if (bus->dev_state != MEI_DEV_ENABLED &&
	    bus->dev_state != MEI_DEV_POWERING_DOWN) {
141 142 143
		rets = -ENODEV;
		goto out;
	}
144

145 146 147
	cb = mei_cl_read_cb(cl, NULL);
	if (cb)
		goto copy;
148

149 150 151
	rets = mei_cl_read_start(cl, length, NULL);
	if (rets && rets != -EBUSY)
		goto out;
152

153 154 155 156 157
	if (nonblock) {
		rets = -EAGAIN;
		goto out;
	}

158
	/* wait on event only if there is no other waiter */
159 160
	/* synchronized under device mutex */
	if (!waitqueue_active(&cl->rx_wait)) {
161

162
		mutex_unlock(&bus->device_lock);
163

164 165 166
		if (timeout) {
			rets = wait_event_interruptible_timeout
					(cl->rx_wait,
167
					mei_cl_read_cb(cl, NULL) ||
168 169 170 171 172 173 174 175 176 177 178 179
					(!mei_cl_is_connected(cl)),
					msecs_to_jiffies(timeout));
			if (rets == 0)
				return -ETIME;
			if (rets < 0) {
				if (signal_pending(current))
					return -EINTR;
				return -ERESTARTSYS;
			}
		} else {
			if (wait_event_interruptible
					(cl->rx_wait,
180
					mei_cl_read_cb(cl, NULL) ||
181 182 183 184 185
					(!mei_cl_is_connected(cl)))) {
				if (signal_pending(current))
					return -EINTR;
				return -ERESTARTSYS;
			}
186 187 188 189 190
		}

		mutex_lock(&bus->device_lock);

		if (!mei_cl_is_connected(cl)) {
191
			rets = -ENODEV;
192 193
			goto out;
		}
194 195
	}

196 197 198 199 200
	cb = mei_cl_read_cb(cl, NULL);
	if (!cb) {
		rets = 0;
		goto out;
	}
201

202 203 204 205 206
copy:
	if (cb->status) {
		rets = cb->status;
		goto free;
	}
207

208 209 210
	r_length = min_t(size_t, length, cb->buf_idx);
	memcpy(buf, cb->buf.data, r_length);
	rets = r_length;
211 212
	if (vtag)
		*vtag = cb->vtag;
213

214
free:
215
	mei_cl_del_rd_completed(cl, cb);
216 217 218 219
out:
	mutex_unlock(&bus->device_lock);

	return rets;
220 221
}

222
/**
223
 * mei_cldev_send_vtag - me device send with vtag  (write)
224 225 226 227
 *
 * @cldev: me client device
 * @buf: buffer to send
 * @length: buffer length
228
 * @vtag: virtual tag
229
 *
230 231 232
 * Return:
 *  * written size in bytes
 *  * < 0 on error
233
 */
234 235 236

ssize_t mei_cldev_send_vtag(struct mei_cl_device *cldev, u8 *buf, size_t length,
			    u8 vtag)
237
{
238
	struct mei_cl *cl = cldev->cl;
239

240
	return __mei_cl_send(cl, buf, length, vtag, MEI_CL_IO_TX_BLOCKING);
241
}
242
EXPORT_SYMBOL_GPL(mei_cldev_send_vtag);
243

244
/**
245
 * mei_cldev_recv_vtag - client receive with vtag (read)
246 247 248 249
 *
 * @cldev: me client device
 * @buf: buffer to receive
 * @length: buffer length
250
 * @vtag: virtual tag
251
 *
252 253 254
 * Return:
 * * read size in bytes
 * *  < 0 on error
255
 */
256 257 258

ssize_t mei_cldev_recv_vtag(struct mei_cl_device *cldev, u8 *buf, size_t length,
			    u8 *vtag)
259 260 261
{
	struct mei_cl *cl = cldev->cl;

262
	return __mei_cl_recv(cl, buf, length, vtag, 0, 0);
263
}
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
EXPORT_SYMBOL_GPL(mei_cldev_recv_vtag);

/**
 * mei_cldev_recv_nonblock_vtag - non block client receive with vtag (read)
 *
 * @cldev: me client device
 * @buf: buffer to receive
 * @length: buffer length
 * @vtag: virtual tag
 *
 * Return:
 * * read size in bytes
 * * -EAGAIN if function will block.
 * * < 0 on other error
 */
ssize_t mei_cldev_recv_nonblock_vtag(struct mei_cl_device *cldev, u8 *buf,
				     size_t length, u8 *vtag)
{
	struct mei_cl *cl = cldev->cl;

	return __mei_cl_recv(cl, buf, length, vtag, MEI_CL_IO_RX_NONBLOCK, 0);
}
EXPORT_SYMBOL_GPL(mei_cldev_recv_nonblock_vtag);

/**
 * mei_cldev_send - me device send  (write)
 *
 * @cldev: me client device
 * @buf: buffer to send
 * @length: buffer length
 *
 * Return:
 *  * written size in bytes
 *  * < 0 on error
 */
ssize_t mei_cldev_send(struct mei_cl_device *cldev, u8 *buf, size_t length)
{
	return mei_cldev_send_vtag(cldev, buf, length, 0);
}
EXPORT_SYMBOL_GPL(mei_cldev_send);
304

305
/**
306
 * mei_cldev_recv - client receive (read)
307 308
 *
 * @cldev: me client device
309
 * @buf: buffer to receive
310 311 312 313
 * @length: buffer length
 *
 * Return: read size in bytes of < 0 on error
 */
314
ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length)
315
{
316
	return mei_cldev_recv_vtag(cldev, buf, length, NULL);
317
}
318
EXPORT_SYMBOL_GPL(mei_cldev_recv);
319

320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336
/**
 * mei_cldev_recv_nonblock - non block client receive (read)
 *
 * @cldev: me client device
 * @buf: buffer to receive
 * @length: buffer length
 *
 * Return: read size in bytes of < 0 on error
 *         -EAGAIN if function will block.
 */
ssize_t mei_cldev_recv_nonblock(struct mei_cl_device *cldev, u8 *buf,
				size_t length)
{
	return mei_cldev_recv_nonblock_vtag(cldev, buf, length, NULL);
}
EXPORT_SYMBOL_GPL(mei_cldev_recv_nonblock);

337
/**
338
 * mei_cl_bus_rx_work - dispatch rx event for a bus device
339 340 341
 *
 * @work: work
 */
342
static void mei_cl_bus_rx_work(struct work_struct *work)
343
{
344
	struct mei_cl_device *cldev;
345
	struct mei_device *bus;
346

347
	cldev = container_of(work, struct mei_cl_device, rx_work);
348

349 350
	bus = cldev->bus;

351 352
	if (cldev->rx_cb)
		cldev->rx_cb(cldev);
353

354
	mutex_lock(&bus->device_lock);
355 356
	if (mei_cl_is_connected(cldev->cl))
		mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL);
357 358
	mutex_unlock(&bus->device_lock);
}
359

360 361 362 363 364 365 366 367 368 369 370 371 372
/**
 * mei_cl_bus_notif_work - dispatch FW notif event for a bus device
 *
 * @work: work
 */
static void mei_cl_bus_notif_work(struct work_struct *work)
{
	struct mei_cl_device *cldev;

	cldev = container_of(work, struct mei_cl_device, notif_work);

	if (cldev->notif_cb)
		cldev->notif_cb(cldev);
373 374 375 376 377 378
}

/**
 * mei_cl_bus_notify_event - schedule notify cb on bus client
 *
 * @cl: host client
379 380 381
 *
 * Return: true if event was scheduled
 *         false if the client is not waiting for event
382
 */
383
bool mei_cl_bus_notify_event(struct mei_cl *cl)
384 385 386
{
	struct mei_cl_device *cldev = cl->cldev;

387
	if (!cldev || !cldev->notif_cb)
388
		return false;
389 390

	if (!cl->notify_ev)
391
		return false;
392

393
	schedule_work(&cldev->notif_work);
394 395

	cl->notify_ev = false;
396 397

	return true;
398 399
}

400
/**
401
 * mei_cl_bus_rx_event - schedule rx event
402 403
 *
 * @cl: host client
404 405 406
 *
 * Return: true if event was scheduled
 *         false if the client is not waiting for event
407
 */
408
bool mei_cl_bus_rx_event(struct mei_cl *cl)
409
{
410
	struct mei_cl_device *cldev = cl->cldev;
411

412
	if (!cldev || !cldev->rx_cb)
413
		return false;
414

415
	schedule_work(&cldev->rx_work);
416 417

	return true;
418
}
419

420
/**
421
 * mei_cldev_register_rx_cb - register Rx event callback
422 423
 *
 * @cldev: me client devices
424
 * @rx_cb: callback function
425 426 427 428 429
 *
 * Return: 0 on success
 *         -EALREADY if an callback is already registered
 *         <0 on other errors
 */
430
int mei_cldev_register_rx_cb(struct mei_cl_device *cldev, mei_cldev_cb_t rx_cb)
431
{
432
	struct mei_device *bus = cldev->bus;
433 434
	int ret;

435 436 437
	if (!rx_cb)
		return -EINVAL;
	if (cldev->rx_cb)
438
		return -EALREADY;
439

440 441
	cldev->rx_cb = rx_cb;
	INIT_WORK(&cldev->rx_work, mei_cl_bus_rx_work);
442

443
	mutex_lock(&bus->device_lock);
444 445 446 447
	if (mei_cl_is_connected(cldev->cl))
		ret = mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL);
	else
		ret = -ENODEV;
448
	mutex_unlock(&bus->device_lock);
449 450 451
	if (ret && ret != -EBUSY) {
		cancel_work_sync(&cldev->rx_work);
		cldev->rx_cb = NULL;
452
		return ret;
453
	}
454

455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
	return 0;
}
EXPORT_SYMBOL_GPL(mei_cldev_register_rx_cb);

/**
 * mei_cldev_register_notif_cb - register FW notification event callback
 *
 * @cldev: me client devices
 * @notif_cb: callback function
 *
 * Return: 0 on success
 *         -EALREADY if an callback is already registered
 *         <0 on other errors
 */
int mei_cldev_register_notif_cb(struct mei_cl_device *cldev,
				mei_cldev_cb_t notif_cb)
{
	struct mei_device *bus = cldev->bus;
	int ret;

	if (!notif_cb)
		return -EINVAL;

	if (cldev->notif_cb)
		return -EALREADY;

	cldev->notif_cb = notif_cb;
	INIT_WORK(&cldev->notif_work, mei_cl_bus_notif_work);

	mutex_lock(&bus->device_lock);
	ret = mei_cl_notify_request(cldev->cl, NULL, 1);
	mutex_unlock(&bus->device_lock);
487 488 489
	if (ret) {
		cancel_work_sync(&cldev->notif_work);
		cldev->notif_cb = NULL;
490
		return ret;
491
	}
492

493 494
	return 0;
}
495
EXPORT_SYMBOL_GPL(mei_cldev_register_notif_cb);
496

497
/**
498
 * mei_cldev_get_drvdata - driver data getter
499 500 501 502 503
 *
 * @cldev: mei client device
 *
 * Return: driver private data
 */
504
void *mei_cldev_get_drvdata(const struct mei_cl_device *cldev)
505 506
{
	return dev_get_drvdata(&cldev->dev);
507
}
508
EXPORT_SYMBOL_GPL(mei_cldev_get_drvdata);
509

510
/**
511
 * mei_cldev_set_drvdata - driver data setter
512 513 514 515
 *
 * @cldev: mei client device
 * @data: data to store
 */
516
void mei_cldev_set_drvdata(struct mei_cl_device *cldev, void *data)
517
{
518
	dev_set_drvdata(&cldev->dev, data);
519
}
520
EXPORT_SYMBOL_GPL(mei_cldev_set_drvdata);
521

522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
/**
 * mei_cldev_uuid - return uuid of the underlying me client
 *
 * @cldev: mei client device
 *
 * Return: me client uuid
 */
const uuid_le *mei_cldev_uuid(const struct mei_cl_device *cldev)
{
	return mei_me_cl_uuid(cldev->me_cl);
}
EXPORT_SYMBOL_GPL(mei_cldev_uuid);

/**
 * mei_cldev_ver - return protocol version of the underlying me client
 *
 * @cldev: mei client device
 *
 * Return: me client protocol version
 */
u8 mei_cldev_ver(const struct mei_cl_device *cldev)
{
	return mei_me_cl_ver(cldev->me_cl);
}
EXPORT_SYMBOL_GPL(mei_cldev_ver);

548 549 550 551 552 553 554 555 556
/**
 * mei_cldev_enabled - check whether the device is enabled
 *
 * @cldev: mei client device
 *
 * Return: true if me client is initialized and connected
 */
bool mei_cldev_enabled(struct mei_cl_device *cldev)
{
557
	return mei_cl_is_connected(cldev->cl);
558 559 560
}
EXPORT_SYMBOL_GPL(mei_cldev_enabled);

561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
/**
 * mei_cl_bus_module_get - acquire module of the underlying
 *    hw driver.
 *
 * @cldev: mei client device
 *
 * Return: true on success; false if the module was removed.
 */
static bool mei_cl_bus_module_get(struct mei_cl_device *cldev)
{
	return try_module_get(cldev->bus->dev->driver->owner);
}

/**
 * mei_cl_bus_module_put -  release the underlying hw module.
 *
 * @cldev: mei client device
 */
static void mei_cl_bus_module_put(struct mei_cl_device *cldev)
{
	module_put(cldev->bus->dev->driver->owner);
}

584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
/**
 * mei_cl_bus_vtag - get bus vtag entry wrapper
 *     The tag for bus client is always first.
 *
 * @cl: host client
 *
 * Return: bus vtag or NULL
 */
static inline struct mei_cl_vtag *mei_cl_bus_vtag(struct mei_cl *cl)
{
	return list_first_entry_or_null(&cl->vtag_map,
					struct mei_cl_vtag, list);
}

/**
 * mei_cl_bus_vtag_alloc - add bus client entry to vtag map
 *
 * @cldev: me client device
 *
 * Return:
 * * 0 on success
 * * -ENOMEM if memory allocation failed
 */
static int mei_cl_bus_vtag_alloc(struct mei_cl_device *cldev)
{
	struct mei_cl *cl = cldev->cl;
	struct mei_cl_vtag *cl_vtag;

	/*
	 * Bail out if the client does not supports vtags
	 * or has already allocated one
	 */
	if (mei_cl_vt_support_check(cl) || mei_cl_bus_vtag(cl))
		return 0;

	cl_vtag = mei_cl_vtag_alloc(NULL, 0);
	if (IS_ERR(cl_vtag))
		return -ENOMEM;

	list_add_tail(&cl_vtag->list, &cl->vtag_map);

	return 0;
}

/**
 * mei_cl_bus_vtag_free - remove the bus entry from vtag map
 *
 * @cldev: me client device
 */
static void mei_cl_bus_vtag_free(struct mei_cl_device *cldev)
{
	struct mei_cl *cl = cldev->cl;
	struct mei_cl_vtag *cl_vtag;

	cl_vtag = mei_cl_bus_vtag(cl);
	if (!cl_vtag)
		return;

	list_del(&cl_vtag->list);
	kfree(cl_vtag);
}

646
/**
647
 * mei_cldev_enable - enable me client device
648 649 650 651 652 653
 *     create connection with me client
 *
 * @cldev: me client device
 *
 * Return: 0 on success and < 0 on error
 */
654
int mei_cldev_enable(struct mei_cl_device *cldev)
655
{
656 657 658
	struct mei_device *bus = cldev->bus;
	struct mei_cl *cl;
	int ret;
659

660
	cl = cldev->cl;
661

662
	mutex_lock(&bus->device_lock);
663 664 665
	if (cl->state == MEI_FILE_UNINITIALIZED) {
		ret = mei_cl_link(cl);
		if (ret)
666
			goto out;
667 668 669
		/* update pointers */
		cl->cldev = cldev;
	}
670

671
	if (mei_cl_is_connected(cl)) {
672 673
		ret = 0;
		goto out;
674
	}
675

676 677 678 679
	if (!mei_me_cl_is_active(cldev->me_cl)) {
		dev_err(&cldev->dev, "me client is not active\n");
		ret = -ENOTTY;
		goto out;
680 681
	}

682 683 684 685
	ret = mei_cl_bus_vtag_alloc(cldev);
	if (ret)
		goto out;

686
	ret = mei_cl_connect(cl, cldev->me_cl, NULL);
687
	if (ret < 0) {
688
		dev_err(&cldev->dev, "cannot connect\n");
689 690
		mei_cl_bus_vtag_free(cldev);
	}
691 692

out:
693 694
	mutex_unlock(&bus->device_lock);

695
	return ret;
696
}
697
EXPORT_SYMBOL_GPL(mei_cldev_enable);
698

699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717
/**
 * mei_cldev_unregister_callbacks - internal wrapper for unregistering
 *  callbacks.
 *
 * @cldev: client device
 */
static void mei_cldev_unregister_callbacks(struct mei_cl_device *cldev)
{
	if (cldev->rx_cb) {
		cancel_work_sync(&cldev->rx_work);
		cldev->rx_cb = NULL;
	}

	if (cldev->notif_cb) {
		cancel_work_sync(&cldev->notif_work);
		cldev->notif_cb = NULL;
	}
}

718
/**
719
 * mei_cldev_disable - disable me client device
720 721 722 723 724 725
 *     disconnect form the me client
 *
 * @cldev: me client device
 *
 * Return: 0 on success and < 0 on error
 */
726
int mei_cldev_disable(struct mei_cl_device *cldev)
727
{
728
	struct mei_device *bus;
729 730
	struct mei_cl *cl;
	int err;
731

732
	if (!cldev)
733 734
		return -ENODEV;

735 736 737
	cl = cldev->cl;

	bus = cldev->bus;
738

739 740
	mei_cldev_unregister_callbacks(cldev);

741
	mutex_lock(&bus->device_lock);
742

743 744
	mei_cl_bus_vtag_free(cldev);

745
	if (!mei_cl_is_connected(cl)) {
746 747 748 749 750
		dev_dbg(bus->dev, "Already disconnected\n");
		err = 0;
		goto out;
	}

751
	err = mei_cl_disconnect(cl);
752
	if (err < 0)
753
		dev_err(bus->dev, "Could not disconnect from the ME client\n");
754

755
out:
756 757
	/* Flush queues and remove any pending read */
	mei_cl_flush_queues(cl, NULL);
758 759
	mei_cl_unlink(cl);

760
	mutex_unlock(&bus->device_lock);
761
	return err;
762
}
763
EXPORT_SYMBOL_GPL(mei_cldev_disable);
764

765 766 767 768 769 770 771 772 773 774 775
/**
 * mei_cl_device_find - find matching entry in the driver id table
 *
 * @cldev: me client device
 * @cldrv: me client driver
 *
 * Return: id on success; NULL if no id is matching
 */
static const
struct mei_cl_device_id *mei_cl_device_find(struct mei_cl_device *cldev,
					    struct mei_cl_driver *cldrv)
776
{
777 778
	const struct mei_cl_device_id *id;
	const uuid_le *uuid;
779 780
	u8 version;
	bool match;
781

782
	uuid = mei_me_cl_uuid(cldev->me_cl);
783
	version = mei_me_cl_ver(cldev->me_cl);
784

785 786 787
	id = cldrv->id_table;
	while (uuid_le_cmp(NULL_UUID_LE, id->uuid)) {
		if (!uuid_le_cmp(*uuid, id->uuid)) {
788
			match = true;
789

790 791 792 793
			if (cldev->name[0])
				if (strncmp(cldev->name, id->name,
					    sizeof(id->name)))
					match = false;
794

795 796 797 798
			if (id->version != MEI_CL_VERSION_ANY)
				if (id->version != version)
					match = false;
			if (match)
799
				return id;
800
		}
801

802 803
		id++;
	}
804

805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824
	return NULL;
}

/**
 * mei_cl_device_match  - device match function
 *
 * @dev: device
 * @drv: driver
 *
 * Return:  1 if matching device was found 0 otherwise
 */
static int mei_cl_device_match(struct device *dev, struct device_driver *drv)
{
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
	struct mei_cl_driver *cldrv = to_mei_cl_driver(drv);
	const struct mei_cl_device_id *found_id;

	if (!cldev)
		return 0;

825 826 827
	if (!cldev->do_match)
		return 0;

828 829 830 831 832 833 834
	if (!cldrv || !cldrv->id_table)
		return 0;

	found_id = mei_cl_device_find(cldev, cldrv);
	if (found_id)
		return 1;

835 836
	return 0;
}
837

838 839 840 841 842 843 844
/**
 * mei_cl_device_probe - bus probe function
 *
 * @dev: device
 *
 * Return:  0 on success; < 0 otherwise
 */
845 846
static int mei_cl_device_probe(struct device *dev)
{
847
	struct mei_cl_device *cldev;
848
	struct mei_cl_driver *cldrv;
849
	const struct mei_cl_device_id *id;
850
	int ret;
851 852 853

	cldev = to_mei_cl_device(dev);
	cldrv = to_mei_cl_driver(dev->driver);
854

855 856
	if (!cldev)
		return 0;
857

858 859 860
	if (!cldrv || !cldrv->probe)
		return -ENODEV;

861 862 863
	id = mei_cl_device_find(cldev, cldrv);
	if (!id)
		return -ENODEV;
864

865 866 867 868 869
	if (!mei_cl_bus_module_get(cldev)) {
		dev_err(&cldev->dev, "get hw module failed");
		return -ENODEV;
	}

870
	ret = cldrv->probe(cldev, id);
871 872
	if (ret) {
		mei_cl_bus_module_put(cldev);
873
		return ret;
874
	}
875

876 877
	__module_get(THIS_MODULE);
	return 0;
878
}
879

880 881 882 883 884 885 886
/**
 * mei_cl_device_remove - remove device from the bus
 *
 * @dev: device
 *
 * Return:  0 on success; < 0 otherwise
 */
887 888 889
static int mei_cl_device_remove(struct device *dev)
{
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
890
	struct mei_cl_driver *cldrv = to_mei_cl_driver(dev->driver);
891

892
	if (cldrv->remove)
893
		cldrv->remove(cldev);
894

895
	mei_cldev_unregister_callbacks(cldev);
896

897
	mei_cl_bus_module_put(cldev);
898
	module_put(THIS_MODULE);
899

900
	return 0;
901 902
}

903 904
static ssize_t name_show(struct device *dev, struct device_attribute *a,
			     char *buf)
905
{
906
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
907

908
	return scnprintf(buf, PAGE_SIZE, "%s", cldev->name);
909
}
910
static DEVICE_ATTR_RO(name);
911

912 913
static ssize_t uuid_show(struct device *dev, struct device_attribute *a,
			     char *buf)
914
{
915 916
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
	const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
917

918
	return sprintf(buf, "%pUl", uuid);
919
}
920
static DEVICE_ATTR_RO(uuid);
921

922 923 924 925 926 927
static ssize_t version_show(struct device *dev, struct device_attribute *a,
			     char *buf)
{
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
	u8 version = mei_me_cl_ver(cldev->me_cl);

928
	return sprintf(buf, "%02X", version);
929 930 931
}
static DEVICE_ATTR_RO(version);

932 933
static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
			     char *buf)
934
{
935 936
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
	const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
937
	u8 version = mei_me_cl_ver(cldev->me_cl);
938

939 940
	return scnprintf(buf, PAGE_SIZE, "mei:%s:%pUl:%02X:",
			 cldev->name, uuid, version);
941
}
942
static DEVICE_ATTR_RO(modalias);
943

944 945 946 947 948 949
static ssize_t max_conn_show(struct device *dev, struct device_attribute *a,
			     char *buf)
{
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
	u8 maxconn = mei_me_cl_max_conn(cldev->me_cl);

950
	return sprintf(buf, "%d", maxconn);
951 952 953 954 955 956 957 958 959
}
static DEVICE_ATTR_RO(max_conn);

static ssize_t fixed_show(struct device *dev, struct device_attribute *a,
			  char *buf)
{
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
	u8 fixed = mei_me_cl_fixed(cldev->me_cl);

960
	return sprintf(buf, "%d", fixed);
961 962 963
}
static DEVICE_ATTR_RO(fixed);

964 965 966 967 968 969 970 971 972 973
static ssize_t vtag_show(struct device *dev, struct device_attribute *a,
			 char *buf)
{
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
	bool vt = mei_me_cl_vt(cldev->me_cl);

	return sprintf(buf, "%d", vt);
}
static DEVICE_ATTR_RO(vtag);

974 975 976 977 978 979
static ssize_t max_len_show(struct device *dev, struct device_attribute *a,
			    char *buf)
{
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
	u32 maxlen = mei_me_cl_max_len(cldev->me_cl);

980
	return sprintf(buf, "%u", maxlen);
981 982 983
}
static DEVICE_ATTR_RO(max_len);

984
static struct attribute *mei_cldev_attrs[] = {
985 986
	&dev_attr_name.attr,
	&dev_attr_uuid.attr,
987
	&dev_attr_version.attr,
988
	&dev_attr_modalias.attr,
989 990
	&dev_attr_max_conn.attr,
	&dev_attr_fixed.attr,
991
	&dev_attr_vtag.attr,
992
	&dev_attr_max_len.attr,
993 994
	NULL,
};
995
ATTRIBUTE_GROUPS(mei_cldev);
996

997 998 999 1000 1001 1002 1003 1004 1005
/**
 * mei_cl_device_uevent - me client bus uevent handler
 *
 * @dev: device
 * @env: uevent kobject
 *
 * Return: 0 on success -ENOMEM on when add_uevent_var fails
 */
static int mei_cl_device_uevent(struct device *dev, struct kobj_uevent_env *env)
1006
{
1007 1008
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
	const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
1009 1010 1011 1012
	u8 version = mei_me_cl_ver(cldev->me_cl);

	if (add_uevent_var(env, "MEI_CL_VERSION=%d", version))
		return -ENOMEM;
1013

1014 1015
	if (add_uevent_var(env, "MEI_CL_UUID=%pUl", uuid))
		return -ENOMEM;
1016

1017 1018 1019
	if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name))
		return -ENOMEM;

1020 1021
	if (add_uevent_var(env, "MODALIAS=mei:%s:%pUl:%02X:",
			   cldev->name, uuid, version))
1022
		return -ENOMEM;
1023 1024 1025

	return 0;
}
1026

1027 1028
static struct bus_type mei_cl_bus_type = {
	.name		= "mei",
1029
	.dev_groups	= mei_cldev_groups,
1030 1031 1032
	.match		= mei_cl_device_match,
	.probe		= mei_cl_device_probe,
	.remove		= mei_cl_device_remove,
1033
	.uevent		= mei_cl_device_uevent,
1034 1035
};

1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
static struct mei_device *mei_dev_bus_get(struct mei_device *bus)
{
	if (bus)
		get_device(bus->dev);

	return bus;
}

static void mei_dev_bus_put(struct mei_device *bus)
{
	if (bus)
		put_device(bus->dev);
}

1050
static void mei_cl_bus_dev_release(struct device *dev)
1051
{
1052 1053 1054 1055 1056 1057
	struct mei_cl_device *cldev = to_mei_cl_device(dev);

	if (!cldev)
		return;

	mei_me_cl_put(cldev->me_cl);
1058
	mei_dev_bus_put(cldev->bus);
1059
	mei_cl_unlink(cldev->cl);
1060
	kfree(cldev->cl);
1061
	kfree(cldev);
1062 1063
}

1064
static const struct device_type mei_cl_device_type = {
1065
	.release = mei_cl_bus_dev_release,
1066 1067
};

1068 1069
/**
 * mei_cl_bus_set_name - set device name for me client device
1070 1071
 *  <controller>-<client device>
 *  Example: 0000:00:16.0-55213584-9a29-4916-badf-0fb7ed682aeb
1072 1073 1074 1075 1076
 *
 * @cldev: me client device
 */
static inline void mei_cl_bus_set_name(struct mei_cl_device *cldev)
{
1077 1078 1079
	dev_set_name(&cldev->dev, "%s-%pUl",
		     dev_name(cldev->bus->dev),
		     mei_me_cl_uuid(cldev->me_cl));
1080 1081
}

1082
/**
1083
 * mei_cl_bus_dev_alloc - initialize and allocate mei client device
1084 1085 1086 1087 1088 1089
 *
 * @bus: mei device
 * @me_cl: me client
 *
 * Return: allocated device structur or NULL on allocation failure
 */
1090 1091
static struct mei_cl_device *mei_cl_bus_dev_alloc(struct mei_device *bus,
						  struct mei_me_client *me_cl)
1092 1093
{
	struct mei_cl_device *cldev;
1094
	struct mei_cl *cl;
1095

1096
	cldev = kzalloc(sizeof(*cldev), GFP_KERNEL);
1097 1098 1099
	if (!cldev)
		return NULL;

1100 1101 1102 1103 1104 1105
	cl = mei_cl_allocate(bus);
	if (!cl) {
		kfree(cldev);
		return NULL;
	}

1106 1107 1108 1109 1110 1111
	device_initialize(&cldev->dev);
	cldev->dev.parent = bus->dev;
	cldev->dev.bus    = &mei_cl_bus_type;
	cldev->dev.type   = &mei_cl_device_type;
	cldev->bus        = mei_dev_bus_get(bus);
	cldev->me_cl      = mei_me_cl_get(me_cl);
1112
	cldev->cl         = cl;
1113
	mei_cl_bus_set_name(cldev);
1114 1115 1116 1117 1118 1119 1120
	cldev->is_added   = 0;
	INIT_LIST_HEAD(&cldev->bus_list);

	return cldev;
}

/**
1121
 * mei_cl_bus_dev_setup - setup me client device
1122 1123 1124 1125 1126 1127 1128
 *    run fix up routines and set the device name
 *
 * @bus: mei device
 * @cldev: me client device
 *
 * Return: true if the device is eligible for enumeration
 */
1129 1130
static bool mei_cl_bus_dev_setup(struct mei_device *bus,
				 struct mei_cl_device *cldev)
1131 1132
{
	cldev->do_match = 1;
1133
	mei_cl_bus_dev_fixup(cldev);
1134

1135
	/* the device name can change during fix up */
1136
	if (cldev->do_match)
1137
		mei_cl_bus_set_name(cldev);
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152

	return cldev->do_match == 1;
}

/**
 * mei_cl_bus_dev_add - add me client devices
 *
 * @cldev: me client device
 *
 * Return: 0 on success; < 0 on failre
 */
static int mei_cl_bus_dev_add(struct mei_cl_device *cldev)
{
	int ret;

1153 1154 1155
	dev_dbg(cldev->bus->dev, "adding %pUL:%02X\n",
		mei_me_cl_uuid(cldev->me_cl),
		mei_me_cl_ver(cldev->me_cl));
1156 1157 1158 1159 1160 1161 1162
	ret = device_add(&cldev->dev);
	if (!ret)
		cldev->is_added = 1;

	return ret;
}

1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177
/**
 * mei_cl_bus_dev_stop - stop the driver
 *
 * @cldev: me client device
 */
static void mei_cl_bus_dev_stop(struct mei_cl_device *cldev)
{
	if (cldev->is_added)
		device_release_driver(&cldev->dev);
}

/**
 * mei_cl_bus_dev_destroy - destroy me client devices object
 *
 * @cldev: me client device
1178 1179
 *
 * Locking: called under "dev->cl_bus_lock" lock
1180 1181 1182
 */
static void mei_cl_bus_dev_destroy(struct mei_cl_device *cldev)
{
1183 1184 1185

	WARN_ON(!mutex_is_locked(&cldev->bus->cl_bus_lock));

1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216
	if (!cldev->is_added)
		return;

	device_del(&cldev->dev);

	list_del_init(&cldev->bus_list);

	cldev->is_added = 0;
	put_device(&cldev->dev);
}

/**
 * mei_cl_bus_remove_device - remove a devices form the bus
 *
 * @cldev: me client device
 */
static void mei_cl_bus_remove_device(struct mei_cl_device *cldev)
{
	mei_cl_bus_dev_stop(cldev);
	mei_cl_bus_dev_destroy(cldev);
}

/**
 * mei_cl_bus_remove_devices - remove all devices form the bus
 *
 * @bus: mei device
 */
void mei_cl_bus_remove_devices(struct mei_device *bus)
{
	struct mei_cl_device *cldev, *next;

1217
	mutex_lock(&bus->cl_bus_lock);
1218 1219
	list_for_each_entry_safe(cldev, next, &bus->device_list, bus_list)
		mei_cl_bus_remove_device(cldev);
1220
	mutex_unlock(&bus->cl_bus_lock);
1221 1222 1223 1224
}


/**
1225
 * mei_cl_bus_dev_init - allocate and initializes an mei client devices
1226 1227 1228 1229
 *     based on me client
 *
 * @bus: mei device
 * @me_cl: me client
1230 1231
 *
 * Locking: called under "dev->cl_bus_lock" lock
1232
 */
1233 1234
static void mei_cl_bus_dev_init(struct mei_device *bus,
				struct mei_me_client *me_cl)
1235
{
1236
	struct mei_cl_device *cldev;
1237

1238 1239
	WARN_ON(!mutex_is_locked(&bus->cl_bus_lock));

1240 1241 1242 1243
	dev_dbg(bus->dev, "initializing %pUl", mei_me_cl_uuid(me_cl));

	if (me_cl->bus_added)
		return;
1244

1245
	cldev = mei_cl_bus_dev_alloc(bus, me_cl);
1246
	if (!cldev)
1247
		return;
1248

1249 1250
	me_cl->bus_added = true;
	list_add_tail(&cldev->bus_list, &bus->device_list);
1251

1252
}
1253

1254 1255 1256 1257 1258 1259
/**
 * mei_cl_bus_rescan - scan me clients list and add create
 *    devices for eligible clients
 *
 * @bus: mei device
 */
1260
static void mei_cl_bus_rescan(struct mei_device *bus)
1261 1262 1263
{
	struct mei_cl_device *cldev, *n;
	struct mei_me_client *me_cl;
1264

1265 1266
	mutex_lock(&bus->cl_bus_lock);

1267 1268
	down_read(&bus->me_clients_rwsem);
	list_for_each_entry(me_cl, &bus->me_clients, list)
1269
		mei_cl_bus_dev_init(bus, me_cl);
1270
	up_read(&bus->me_clients_rwsem);
1271

1272
	list_for_each_entry_safe(cldev, n, &bus->device_list, bus_list) {
1273

1274 1275 1276 1277
		if (!mei_me_cl_is_active(cldev->me_cl)) {
			mei_cl_bus_remove_device(cldev);
			continue;
		}
1278

1279 1280 1281
		if (cldev->is_added)
			continue;

1282
		if (mei_cl_bus_dev_setup(bus, cldev))
1283 1284 1285 1286 1287 1288 1289 1290 1291
			mei_cl_bus_dev_add(cldev);
		else {
			list_del_init(&cldev->bus_list);
			put_device(&cldev->dev);
		}
	}
	mutex_unlock(&bus->cl_bus_lock);

	dev_dbg(bus->dev, "rescan end");
1292
}
1293

1294 1295 1296 1297 1298 1299 1300 1301
void mei_cl_bus_rescan_work(struct work_struct *work)
{
	struct mei_device *bus =
		container_of(work, struct mei_device, bus_rescan_work);

	mei_cl_bus_rescan(bus);
}

1302 1303
int __mei_cldev_driver_register(struct mei_cl_driver *cldrv,
				struct module *owner)
1304 1305
{
	int err;
1306

1307 1308 1309
	cldrv->driver.name = cldrv->name;
	cldrv->driver.owner = owner;
	cldrv->driver.bus = &mei_cl_bus_type;
1310

1311 1312 1313
	err = driver_register(&cldrv->driver);
	if (err)
		return err;
1314

1315
	pr_debug("mei: driver [%s] registered\n", cldrv->driver.name);
1316

1317
	return 0;
1318
}
1319
EXPORT_SYMBOL_GPL(__mei_cldev_driver_register);
1320

1321
void mei_cldev_driver_unregister(struct mei_cl_driver *cldrv)
1322
{
1323
	driver_unregister(&cldrv->driver);
1324

1325
	pr_debug("mei: driver [%s] unregistered\n", cldrv->driver.name);
1326
}
1327
EXPORT_SYMBOL_GPL(mei_cldev_driver_unregister);
1328

1329

1330 1331 1332 1333 1334 1335 1336 1337 1338
int __init mei_cl_bus_init(void)
{
	return bus_register(&mei_cl_bus_type);
}

void __exit mei_cl_bus_exit(void)
{
	bus_unregister(&mei_cl_bus_type);
}