1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2012-2019, Intel Corporation. All rights reserved. 4 * Intel Management Engine Interface (Intel MEI) Linux driver 5 */ 6 7 #include <linux/module.h> 8 #include <linux/device.h> 9 #include <linux/kernel.h> 10 #include <linux/sched/signal.h> 11 #include <linux/init.h> 12 #include <linux/errno.h> 13 #include <linux/slab.h> 14 #include <linux/mutex.h> 15 #include <linux/interrupt.h> 16 #include <linux/mei_cl_bus.h> 17 18 #include "mei_dev.h" 19 #include "client.h" 20 21 #define to_mei_cl_driver(d) container_of(d, struct mei_cl_driver, driver) 22 23 /** 24 * __mei_cl_send - internal client send (write) 25 * 26 * @cl: host client 27 * @buf: buffer to send 28 * @length: buffer length 29 * @vtag: virtual tag 30 * @mode: sending mode 31 * 32 * Return: written size bytes or < 0 on error 33 */ 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 if (WARN_ON(!cl || !cl->dev)) 42 return -ENODEV; 43 44 bus = cl->dev; 45 46 mutex_lock(&bus->device_lock); 47 if (bus->dev_state != MEI_DEV_ENABLED) { 48 rets = -ENODEV; 49 goto out; 50 } 51 52 if (!mei_cl_is_connected(cl)) { 53 rets = -ENODEV; 54 goto out; 55 } 56 57 /* Check if we have an ME client device */ 58 if (!mei_me_cl_is_active(cl->me_cl)) { 59 rets = -ENOTTY; 60 goto out; 61 } 62 63 if (length > mei_cl_mtu(cl)) { 64 rets = -EFBIG; 65 goto out; 66 } 67 68 while (cl->tx_cb_queued >= bus->tx_queue_limit) { 69 mutex_unlock(&bus->device_lock); 70 rets = wait_event_interruptible(cl->tx_wait, 71 cl->writing_state == MEI_WRITE_COMPLETE || 72 (!mei_cl_is_connected(cl))); 73 mutex_lock(&bus->device_lock); 74 if (rets) { 75 if (signal_pending(current)) 76 rets = -EINTR; 77 goto out; 78 } 79 if (!mei_cl_is_connected(cl)) { 80 rets = -ENODEV; 81 goto out; 82 } 83 } 84 85 cb = mei_cl_alloc_cb(cl, length, MEI_FOP_WRITE, NULL); 86 if (!cb) { 87 rets = -ENOMEM; 88 goto out; 89 } 90 cb->vtag = vtag; 91 92 cb->internal = !!(mode & MEI_CL_IO_TX_INTERNAL); 93 cb->blocking = !!(mode & MEI_CL_IO_TX_BLOCKING); 94 memcpy(cb->buf.data, buf, length); 95 96 rets = mei_cl_write(cl, cb); 97 98 out: 99 mutex_unlock(&bus->device_lock); 100 101 return rets; 102 } 103 104 /** 105 * __mei_cl_recv - internal client receive (read) 106 * 107 * @cl: host client 108 * @buf: buffer to receive 109 * @length: buffer length 110 * @mode: io mode 111 * @vtag: virtual tag 112 * @timeout: recv timeout, 0 for infinite timeout 113 * 114 * Return: read size in bytes of < 0 on error 115 */ 116 ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length, u8 *vtag, 117 unsigned int mode, unsigned long timeout) 118 { 119 struct mei_device *bus; 120 struct mei_cl_cb *cb; 121 size_t r_length; 122 ssize_t rets; 123 bool nonblock = !!(mode & MEI_CL_IO_RX_NONBLOCK); 124 125 if (WARN_ON(!cl || !cl->dev)) 126 return -ENODEV; 127 128 bus = cl->dev; 129 130 mutex_lock(&bus->device_lock); 131 if (bus->dev_state != MEI_DEV_ENABLED) { 132 rets = -ENODEV; 133 goto out; 134 } 135 136 cb = mei_cl_read_cb(cl, NULL); 137 if (cb) 138 goto copy; 139 140 rets = mei_cl_read_start(cl, length, NULL); 141 if (rets && rets != -EBUSY) 142 goto out; 143 144 if (nonblock) { 145 rets = -EAGAIN; 146 goto out; 147 } 148 149 /* wait on event only if there is no other waiter */ 150 /* synchronized under device mutex */ 151 if (!waitqueue_active(&cl->rx_wait)) { 152 153 mutex_unlock(&bus->device_lock); 154 155 if (timeout) { 156 rets = wait_event_interruptible_timeout 157 (cl->rx_wait, 158 mei_cl_read_cb(cl, NULL) || 159 (!mei_cl_is_connected(cl)), 160 msecs_to_jiffies(timeout)); 161 if (rets == 0) 162 return -ETIME; 163 if (rets < 0) { 164 if (signal_pending(current)) 165 return -EINTR; 166 return -ERESTARTSYS; 167 } 168 } else { 169 if (wait_event_interruptible 170 (cl->rx_wait, 171 mei_cl_read_cb(cl, NULL) || 172 (!mei_cl_is_connected(cl)))) { 173 if (signal_pending(current)) 174 return -EINTR; 175 return -ERESTARTSYS; 176 } 177 } 178 179 mutex_lock(&bus->device_lock); 180 181 if (!mei_cl_is_connected(cl)) { 182 rets = -ENODEV; 183 goto out; 184 } 185 } 186 187 cb = mei_cl_read_cb(cl, NULL); 188 if (!cb) { 189 rets = 0; 190 goto out; 191 } 192 193 copy: 194 if (cb->status) { 195 rets = cb->status; 196 goto free; 197 } 198 199 r_length = min_t(size_t, length, cb->buf_idx); 200 memcpy(buf, cb->buf.data, r_length); 201 rets = r_length; 202 if (vtag) 203 *vtag = cb->vtag; 204 205 free: 206 mei_cl_del_rd_completed(cl, cb); 207 out: 208 mutex_unlock(&bus->device_lock); 209 210 return rets; 211 } 212 213 /** 214 * mei_cldev_send_vtag - me device send with vtag (write) 215 * 216 * @cldev: me client device 217 * @buf: buffer to send 218 * @length: buffer length 219 * @vtag: virtual tag 220 * 221 * Return: 222 * * written size in bytes 223 * * < 0 on error 224 */ 225 226 ssize_t mei_cldev_send_vtag(struct mei_cl_device *cldev, u8 *buf, size_t length, 227 u8 vtag) 228 { 229 struct mei_cl *cl = cldev->cl; 230 231 return __mei_cl_send(cl, buf, length, vtag, MEI_CL_IO_TX_BLOCKING); 232 } 233 EXPORT_SYMBOL_GPL(mei_cldev_send_vtag); 234 235 /** 236 * mei_cldev_recv_vtag - client receive with vtag (read) 237 * 238 * @cldev: me client device 239 * @buf: buffer to receive 240 * @length: buffer length 241 * @vtag: virtual tag 242 * 243 * Return: 244 * * read size in bytes 245 * * < 0 on error 246 */ 247 248 ssize_t mei_cldev_recv_vtag(struct mei_cl_device *cldev, u8 *buf, size_t length, 249 u8 *vtag) 250 { 251 struct mei_cl *cl = cldev->cl; 252 253 return __mei_cl_recv(cl, buf, length, vtag, 0, 0); 254 } 255 EXPORT_SYMBOL_GPL(mei_cldev_recv_vtag); 256 257 /** 258 * mei_cldev_recv_nonblock_vtag - non block client receive with vtag (read) 259 * 260 * @cldev: me client device 261 * @buf: buffer to receive 262 * @length: buffer length 263 * @vtag: virtual tag 264 * 265 * Return: 266 * * read size in bytes 267 * * -EAGAIN if function will block. 268 * * < 0 on other error 269 */ 270 ssize_t mei_cldev_recv_nonblock_vtag(struct mei_cl_device *cldev, u8 *buf, 271 size_t length, u8 *vtag) 272 { 273 struct mei_cl *cl = cldev->cl; 274 275 return __mei_cl_recv(cl, buf, length, vtag, MEI_CL_IO_RX_NONBLOCK, 0); 276 } 277 EXPORT_SYMBOL_GPL(mei_cldev_recv_nonblock_vtag); 278 279 /** 280 * mei_cldev_send - me device send (write) 281 * 282 * @cldev: me client device 283 * @buf: buffer to send 284 * @length: buffer length 285 * 286 * Return: 287 * * written size in bytes 288 * * < 0 on error 289 */ 290 ssize_t mei_cldev_send(struct mei_cl_device *cldev, u8 *buf, size_t length) 291 { 292 return mei_cldev_send_vtag(cldev, buf, length, 0); 293 } 294 EXPORT_SYMBOL_GPL(mei_cldev_send); 295 296 /** 297 * mei_cldev_recv - client receive (read) 298 * 299 * @cldev: me client device 300 * @buf: buffer to receive 301 * @length: buffer length 302 * 303 * Return: read size in bytes of < 0 on error 304 */ 305 ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length) 306 { 307 return mei_cldev_recv_vtag(cldev, buf, length, NULL); 308 } 309 EXPORT_SYMBOL_GPL(mei_cldev_recv); 310 311 /** 312 * mei_cldev_recv_nonblock - non block client receive (read) 313 * 314 * @cldev: me client device 315 * @buf: buffer to receive 316 * @length: buffer length 317 * 318 * Return: read size in bytes of < 0 on error 319 * -EAGAIN if function will block. 320 */ 321 ssize_t mei_cldev_recv_nonblock(struct mei_cl_device *cldev, u8 *buf, 322 size_t length) 323 { 324 return mei_cldev_recv_nonblock_vtag(cldev, buf, length, NULL); 325 } 326 EXPORT_SYMBOL_GPL(mei_cldev_recv_nonblock); 327 328 /** 329 * mei_cl_bus_rx_work - dispatch rx event for a bus device 330 * 331 * @work: work 332 */ 333 static void mei_cl_bus_rx_work(struct work_struct *work) 334 { 335 struct mei_cl_device *cldev; 336 struct mei_device *bus; 337 338 cldev = container_of(work, struct mei_cl_device, rx_work); 339 340 bus = cldev->bus; 341 342 if (cldev->rx_cb) 343 cldev->rx_cb(cldev); 344 345 mutex_lock(&bus->device_lock); 346 if (mei_cl_is_connected(cldev->cl)) 347 mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL); 348 mutex_unlock(&bus->device_lock); 349 } 350 351 /** 352 * mei_cl_bus_notif_work - dispatch FW notif event for a bus device 353 * 354 * @work: work 355 */ 356 static void mei_cl_bus_notif_work(struct work_struct *work) 357 { 358 struct mei_cl_device *cldev; 359 360 cldev = container_of(work, struct mei_cl_device, notif_work); 361 362 if (cldev->notif_cb) 363 cldev->notif_cb(cldev); 364 } 365 366 /** 367 * mei_cl_bus_notify_event - schedule notify cb on bus client 368 * 369 * @cl: host client 370 * 371 * Return: true if event was scheduled 372 * false if the client is not waiting for event 373 */ 374 bool mei_cl_bus_notify_event(struct mei_cl *cl) 375 { 376 struct mei_cl_device *cldev = cl->cldev; 377 378 if (!cldev || !cldev->notif_cb) 379 return false; 380 381 if (!cl->notify_ev) 382 return false; 383 384 schedule_work(&cldev->notif_work); 385 386 cl->notify_ev = false; 387 388 return true; 389 } 390 391 /** 392 * mei_cl_bus_rx_event - schedule rx event 393 * 394 * @cl: host client 395 * 396 * Return: true if event was scheduled 397 * false if the client is not waiting for event 398 */ 399 bool mei_cl_bus_rx_event(struct mei_cl *cl) 400 { 401 struct mei_cl_device *cldev = cl->cldev; 402 403 if (!cldev || !cldev->rx_cb) 404 return false; 405 406 schedule_work(&cldev->rx_work); 407 408 return true; 409 } 410 411 /** 412 * mei_cldev_register_rx_cb - register Rx event callback 413 * 414 * @cldev: me client devices 415 * @rx_cb: callback function 416 * 417 * Return: 0 on success 418 * -EALREADY if an callback is already registered 419 * <0 on other errors 420 */ 421 int mei_cldev_register_rx_cb(struct mei_cl_device *cldev, mei_cldev_cb_t rx_cb) 422 { 423 struct mei_device *bus = cldev->bus; 424 int ret; 425 426 if (!rx_cb) 427 return -EINVAL; 428 if (cldev->rx_cb) 429 return -EALREADY; 430 431 cldev->rx_cb = rx_cb; 432 INIT_WORK(&cldev->rx_work, mei_cl_bus_rx_work); 433 434 mutex_lock(&bus->device_lock); 435 if (mei_cl_is_connected(cldev->cl)) 436 ret = mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL); 437 else 438 ret = -ENODEV; 439 mutex_unlock(&bus->device_lock); 440 if (ret && ret != -EBUSY) { 441 cancel_work_sync(&cldev->rx_work); 442 cldev->rx_cb = NULL; 443 return ret; 444 } 445 446 return 0; 447 } 448 EXPORT_SYMBOL_GPL(mei_cldev_register_rx_cb); 449 450 /** 451 * mei_cldev_register_notif_cb - register FW notification event callback 452 * 453 * @cldev: me client devices 454 * @notif_cb: callback function 455 * 456 * Return: 0 on success 457 * -EALREADY if an callback is already registered 458 * <0 on other errors 459 */ 460 int mei_cldev_register_notif_cb(struct mei_cl_device *cldev, 461 mei_cldev_cb_t notif_cb) 462 { 463 struct mei_device *bus = cldev->bus; 464 int ret; 465 466 if (!notif_cb) 467 return -EINVAL; 468 469 if (cldev->notif_cb) 470 return -EALREADY; 471 472 cldev->notif_cb = notif_cb; 473 INIT_WORK(&cldev->notif_work, mei_cl_bus_notif_work); 474 475 mutex_lock(&bus->device_lock); 476 ret = mei_cl_notify_request(cldev->cl, NULL, 1); 477 mutex_unlock(&bus->device_lock); 478 if (ret) { 479 cancel_work_sync(&cldev->notif_work); 480 cldev->notif_cb = NULL; 481 return ret; 482 } 483 484 return 0; 485 } 486 EXPORT_SYMBOL_GPL(mei_cldev_register_notif_cb); 487 488 /** 489 * mei_cldev_get_drvdata - driver data getter 490 * 491 * @cldev: mei client device 492 * 493 * Return: driver private data 494 */ 495 void *mei_cldev_get_drvdata(const struct mei_cl_device *cldev) 496 { 497 return dev_get_drvdata(&cldev->dev); 498 } 499 EXPORT_SYMBOL_GPL(mei_cldev_get_drvdata); 500 501 /** 502 * mei_cldev_set_drvdata - driver data setter 503 * 504 * @cldev: mei client device 505 * @data: data to store 506 */ 507 void mei_cldev_set_drvdata(struct mei_cl_device *cldev, void *data) 508 { 509 dev_set_drvdata(&cldev->dev, data); 510 } 511 EXPORT_SYMBOL_GPL(mei_cldev_set_drvdata); 512 513 /** 514 * mei_cldev_uuid - return uuid of the underlying me client 515 * 516 * @cldev: mei client device 517 * 518 * Return: me client uuid 519 */ 520 const uuid_le *mei_cldev_uuid(const struct mei_cl_device *cldev) 521 { 522 return mei_me_cl_uuid(cldev->me_cl); 523 } 524 EXPORT_SYMBOL_GPL(mei_cldev_uuid); 525 526 /** 527 * mei_cldev_ver - return protocol version of the underlying me client 528 * 529 * @cldev: mei client device 530 * 531 * Return: me client protocol version 532 */ 533 u8 mei_cldev_ver(const struct mei_cl_device *cldev) 534 { 535 return mei_me_cl_ver(cldev->me_cl); 536 } 537 EXPORT_SYMBOL_GPL(mei_cldev_ver); 538 539 /** 540 * mei_cldev_enabled - check whether the device is enabled 541 * 542 * @cldev: mei client device 543 * 544 * Return: true if me client is initialized and connected 545 */ 546 bool mei_cldev_enabled(struct mei_cl_device *cldev) 547 { 548 return mei_cl_is_connected(cldev->cl); 549 } 550 EXPORT_SYMBOL_GPL(mei_cldev_enabled); 551 552 /** 553 * mei_cl_bus_module_get - acquire module of the underlying 554 * hw driver. 555 * 556 * @cldev: mei client device 557 * 558 * Return: true on success; false if the module was removed. 559 */ 560 static bool mei_cl_bus_module_get(struct mei_cl_device *cldev) 561 { 562 return try_module_get(cldev->bus->dev->driver->owner); 563 } 564 565 /** 566 * mei_cl_bus_module_put - release the underlying hw module. 567 * 568 * @cldev: mei client device 569 */ 570 static void mei_cl_bus_module_put(struct mei_cl_device *cldev) 571 { 572 module_put(cldev->bus->dev->driver->owner); 573 } 574 575 /** 576 * mei_cl_bus_vtag - get bus vtag entry wrapper 577 * The tag for bus client is always first. 578 * 579 * @cl: host client 580 * 581 * Return: bus vtag or NULL 582 */ 583 static inline struct mei_cl_vtag *mei_cl_bus_vtag(struct mei_cl *cl) 584 { 585 return list_first_entry_or_null(&cl->vtag_map, 586 struct mei_cl_vtag, list); 587 } 588 589 /** 590 * mei_cl_bus_vtag_alloc - add bus client entry to vtag map 591 * 592 * @cldev: me client device 593 * 594 * Return: 595 * * 0 on success 596 * * -ENOMEM if memory allocation failed 597 */ 598 static int mei_cl_bus_vtag_alloc(struct mei_cl_device *cldev) 599 { 600 struct mei_cl *cl = cldev->cl; 601 struct mei_cl_vtag *cl_vtag; 602 603 /* 604 * Bail out if the client does not supports vtags 605 * or has already allocated one 606 */ 607 if (mei_cl_vt_support_check(cl) || mei_cl_bus_vtag(cl)) 608 return 0; 609 610 cl_vtag = mei_cl_vtag_alloc(NULL, 0); 611 if (IS_ERR(cl_vtag)) 612 return -ENOMEM; 613 614 list_add_tail(&cl_vtag->list, &cl->vtag_map); 615 616 return 0; 617 } 618 619 /** 620 * mei_cl_bus_vtag_free - remove the bus entry from vtag map 621 * 622 * @cldev: me client device 623 */ 624 static void mei_cl_bus_vtag_free(struct mei_cl_device *cldev) 625 { 626 struct mei_cl *cl = cldev->cl; 627 struct mei_cl_vtag *cl_vtag; 628 629 cl_vtag = mei_cl_bus_vtag(cl); 630 if (!cl_vtag) 631 return; 632 633 list_del(&cl_vtag->list); 634 kfree(cl_vtag); 635 } 636 637 /** 638 * mei_cldev_enable - enable me client device 639 * create connection with me client 640 * 641 * @cldev: me client device 642 * 643 * Return: 0 on success and < 0 on error 644 */ 645 int mei_cldev_enable(struct mei_cl_device *cldev) 646 { 647 struct mei_device *bus = cldev->bus; 648 struct mei_cl *cl; 649 int ret; 650 651 cl = cldev->cl; 652 653 mutex_lock(&bus->device_lock); 654 if (cl->state == MEI_FILE_UNINITIALIZED) { 655 ret = mei_cl_link(cl); 656 if (ret) 657 goto out; 658 /* update pointers */ 659 cl->cldev = cldev; 660 } 661 662 if (mei_cl_is_connected(cl)) { 663 ret = 0; 664 goto out; 665 } 666 667 if (!mei_me_cl_is_active(cldev->me_cl)) { 668 dev_err(&cldev->dev, "me client is not active\n"); 669 ret = -ENOTTY; 670 goto out; 671 } 672 673 ret = mei_cl_bus_vtag_alloc(cldev); 674 if (ret) 675 goto out; 676 677 ret = mei_cl_connect(cl, cldev->me_cl, NULL); 678 if (ret < 0) { 679 dev_err(&cldev->dev, "cannot connect\n"); 680 mei_cl_bus_vtag_free(cldev); 681 } 682 683 out: 684 mutex_unlock(&bus->device_lock); 685 686 return ret; 687 } 688 EXPORT_SYMBOL_GPL(mei_cldev_enable); 689 690 /** 691 * mei_cldev_unregister_callbacks - internal wrapper for unregistering 692 * callbacks. 693 * 694 * @cldev: client device 695 */ 696 static void mei_cldev_unregister_callbacks(struct mei_cl_device *cldev) 697 { 698 if (cldev->rx_cb) { 699 cancel_work_sync(&cldev->rx_work); 700 cldev->rx_cb = NULL; 701 } 702 703 if (cldev->notif_cb) { 704 cancel_work_sync(&cldev->notif_work); 705 cldev->notif_cb = NULL; 706 } 707 } 708 709 /** 710 * mei_cldev_disable - disable me client device 711 * disconnect form the me client 712 * 713 * @cldev: me client device 714 * 715 * Return: 0 on success and < 0 on error 716 */ 717 int mei_cldev_disable(struct mei_cl_device *cldev) 718 { 719 struct mei_device *bus; 720 struct mei_cl *cl; 721 int err; 722 723 if (!cldev) 724 return -ENODEV; 725 726 cl = cldev->cl; 727 728 bus = cldev->bus; 729 730 mei_cldev_unregister_callbacks(cldev); 731 732 mutex_lock(&bus->device_lock); 733 734 mei_cl_bus_vtag_free(cldev); 735 736 if (!mei_cl_is_connected(cl)) { 737 dev_dbg(bus->dev, "Already disconnected\n"); 738 err = 0; 739 goto out; 740 } 741 742 err = mei_cl_disconnect(cl); 743 if (err < 0) 744 dev_err(bus->dev, "Could not disconnect from the ME client\n"); 745 746 out: 747 /* Flush queues and remove any pending read */ 748 mei_cl_flush_queues(cl, NULL); 749 mei_cl_unlink(cl); 750 751 mutex_unlock(&bus->device_lock); 752 return err; 753 } 754 EXPORT_SYMBOL_GPL(mei_cldev_disable); 755 756 /** 757 * mei_cl_device_find - find matching entry in the driver id table 758 * 759 * @cldev: me client device 760 * @cldrv: me client driver 761 * 762 * Return: id on success; NULL if no id is matching 763 */ 764 static const 765 struct mei_cl_device_id *mei_cl_device_find(struct mei_cl_device *cldev, 766 struct mei_cl_driver *cldrv) 767 { 768 const struct mei_cl_device_id *id; 769 const uuid_le *uuid; 770 u8 version; 771 bool match; 772 773 uuid = mei_me_cl_uuid(cldev->me_cl); 774 version = mei_me_cl_ver(cldev->me_cl); 775 776 id = cldrv->id_table; 777 while (uuid_le_cmp(NULL_UUID_LE, id->uuid)) { 778 if (!uuid_le_cmp(*uuid, id->uuid)) { 779 match = true; 780 781 if (cldev->name[0]) 782 if (strncmp(cldev->name, id->name, 783 sizeof(id->name))) 784 match = false; 785 786 if (id->version != MEI_CL_VERSION_ANY) 787 if (id->version != version) 788 match = false; 789 if (match) 790 return id; 791 } 792 793 id++; 794 } 795 796 return NULL; 797 } 798 799 /** 800 * mei_cl_device_match - device match function 801 * 802 * @dev: device 803 * @drv: driver 804 * 805 * Return: 1 if matching device was found 0 otherwise 806 */ 807 static int mei_cl_device_match(struct device *dev, struct device_driver *drv) 808 { 809 struct mei_cl_device *cldev = to_mei_cl_device(dev); 810 struct mei_cl_driver *cldrv = to_mei_cl_driver(drv); 811 const struct mei_cl_device_id *found_id; 812 813 if (!cldev) 814 return 0; 815 816 if (!cldev->do_match) 817 return 0; 818 819 if (!cldrv || !cldrv->id_table) 820 return 0; 821 822 found_id = mei_cl_device_find(cldev, cldrv); 823 if (found_id) 824 return 1; 825 826 return 0; 827 } 828 829 /** 830 * mei_cl_device_probe - bus probe function 831 * 832 * @dev: device 833 * 834 * Return: 0 on success; < 0 otherwise 835 */ 836 static int mei_cl_device_probe(struct device *dev) 837 { 838 struct mei_cl_device *cldev; 839 struct mei_cl_driver *cldrv; 840 const struct mei_cl_device_id *id; 841 int ret; 842 843 cldev = to_mei_cl_device(dev); 844 cldrv = to_mei_cl_driver(dev->driver); 845 846 if (!cldev) 847 return 0; 848 849 if (!cldrv || !cldrv->probe) 850 return -ENODEV; 851 852 id = mei_cl_device_find(cldev, cldrv); 853 if (!id) 854 return -ENODEV; 855 856 if (!mei_cl_bus_module_get(cldev)) { 857 dev_err(&cldev->dev, "get hw module failed"); 858 return -ENODEV; 859 } 860 861 ret = cldrv->probe(cldev, id); 862 if (ret) { 863 mei_cl_bus_module_put(cldev); 864 return ret; 865 } 866 867 __module_get(THIS_MODULE); 868 return 0; 869 } 870 871 /** 872 * mei_cl_device_remove - remove device from the bus 873 * 874 * @dev: device 875 * 876 * Return: 0 on success; < 0 otherwise 877 */ 878 static int mei_cl_device_remove(struct device *dev) 879 { 880 struct mei_cl_device *cldev = to_mei_cl_device(dev); 881 struct mei_cl_driver *cldrv; 882 int ret = 0; 883 884 if (!cldev || !dev->driver) 885 return 0; 886 887 cldrv = to_mei_cl_driver(dev->driver); 888 if (cldrv->remove) 889 ret = cldrv->remove(cldev); 890 891 mei_cldev_unregister_callbacks(cldev); 892 893 mei_cl_bus_module_put(cldev); 894 module_put(THIS_MODULE); 895 896 return ret; 897 } 898 899 static ssize_t name_show(struct device *dev, struct device_attribute *a, 900 char *buf) 901 { 902 struct mei_cl_device *cldev = to_mei_cl_device(dev); 903 904 return scnprintf(buf, PAGE_SIZE, "%s", cldev->name); 905 } 906 static DEVICE_ATTR_RO(name); 907 908 static ssize_t uuid_show(struct device *dev, struct device_attribute *a, 909 char *buf) 910 { 911 struct mei_cl_device *cldev = to_mei_cl_device(dev); 912 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); 913 914 return sprintf(buf, "%pUl", uuid); 915 } 916 static DEVICE_ATTR_RO(uuid); 917 918 static ssize_t version_show(struct device *dev, struct device_attribute *a, 919 char *buf) 920 { 921 struct mei_cl_device *cldev = to_mei_cl_device(dev); 922 u8 version = mei_me_cl_ver(cldev->me_cl); 923 924 return sprintf(buf, "%02X", version); 925 } 926 static DEVICE_ATTR_RO(version); 927 928 static ssize_t modalias_show(struct device *dev, struct device_attribute *a, 929 char *buf) 930 { 931 struct mei_cl_device *cldev = to_mei_cl_device(dev); 932 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); 933 u8 version = mei_me_cl_ver(cldev->me_cl); 934 935 return scnprintf(buf, PAGE_SIZE, "mei:%s:%pUl:%02X:", 936 cldev->name, uuid, version); 937 } 938 static DEVICE_ATTR_RO(modalias); 939 940 static ssize_t max_conn_show(struct device *dev, struct device_attribute *a, 941 char *buf) 942 { 943 struct mei_cl_device *cldev = to_mei_cl_device(dev); 944 u8 maxconn = mei_me_cl_max_conn(cldev->me_cl); 945 946 return sprintf(buf, "%d", maxconn); 947 } 948 static DEVICE_ATTR_RO(max_conn); 949 950 static ssize_t fixed_show(struct device *dev, struct device_attribute *a, 951 char *buf) 952 { 953 struct mei_cl_device *cldev = to_mei_cl_device(dev); 954 u8 fixed = mei_me_cl_fixed(cldev->me_cl); 955 956 return sprintf(buf, "%d", fixed); 957 } 958 static DEVICE_ATTR_RO(fixed); 959 960 static ssize_t vtag_show(struct device *dev, struct device_attribute *a, 961 char *buf) 962 { 963 struct mei_cl_device *cldev = to_mei_cl_device(dev); 964 bool vt = mei_me_cl_vt(cldev->me_cl); 965 966 return sprintf(buf, "%d", vt); 967 } 968 static DEVICE_ATTR_RO(vtag); 969 970 static ssize_t max_len_show(struct device *dev, struct device_attribute *a, 971 char *buf) 972 { 973 struct mei_cl_device *cldev = to_mei_cl_device(dev); 974 u32 maxlen = mei_me_cl_max_len(cldev->me_cl); 975 976 return sprintf(buf, "%u", maxlen); 977 } 978 static DEVICE_ATTR_RO(max_len); 979 980 static struct attribute *mei_cldev_attrs[] = { 981 &dev_attr_name.attr, 982 &dev_attr_uuid.attr, 983 &dev_attr_version.attr, 984 &dev_attr_modalias.attr, 985 &dev_attr_max_conn.attr, 986 &dev_attr_fixed.attr, 987 &dev_attr_vtag.attr, 988 &dev_attr_max_len.attr, 989 NULL, 990 }; 991 ATTRIBUTE_GROUPS(mei_cldev); 992 993 /** 994 * mei_cl_device_uevent - me client bus uevent handler 995 * 996 * @dev: device 997 * @env: uevent kobject 998 * 999 * Return: 0 on success -ENOMEM on when add_uevent_var fails 1000 */ 1001 static int mei_cl_device_uevent(struct device *dev, struct kobj_uevent_env *env) 1002 { 1003 struct mei_cl_device *cldev = to_mei_cl_device(dev); 1004 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); 1005 u8 version = mei_me_cl_ver(cldev->me_cl); 1006 1007 if (add_uevent_var(env, "MEI_CL_VERSION=%d", version)) 1008 return -ENOMEM; 1009 1010 if (add_uevent_var(env, "MEI_CL_UUID=%pUl", uuid)) 1011 return -ENOMEM; 1012 1013 if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name)) 1014 return -ENOMEM; 1015 1016 if (add_uevent_var(env, "MODALIAS=mei:%s:%pUl:%02X:", 1017 cldev->name, uuid, version)) 1018 return -ENOMEM; 1019 1020 return 0; 1021 } 1022 1023 static struct bus_type mei_cl_bus_type = { 1024 .name = "mei", 1025 .dev_groups = mei_cldev_groups, 1026 .match = mei_cl_device_match, 1027 .probe = mei_cl_device_probe, 1028 .remove = mei_cl_device_remove, 1029 .uevent = mei_cl_device_uevent, 1030 }; 1031 1032 static struct mei_device *mei_dev_bus_get(struct mei_device *bus) 1033 { 1034 if (bus) 1035 get_device(bus->dev); 1036 1037 return bus; 1038 } 1039 1040 static void mei_dev_bus_put(struct mei_device *bus) 1041 { 1042 if (bus) 1043 put_device(bus->dev); 1044 } 1045 1046 static void mei_cl_bus_dev_release(struct device *dev) 1047 { 1048 struct mei_cl_device *cldev = to_mei_cl_device(dev); 1049 1050 if (!cldev) 1051 return; 1052 1053 mei_me_cl_put(cldev->me_cl); 1054 mei_dev_bus_put(cldev->bus); 1055 mei_cl_unlink(cldev->cl); 1056 kfree(cldev->cl); 1057 kfree(cldev); 1058 } 1059 1060 static const struct device_type mei_cl_device_type = { 1061 .release = mei_cl_bus_dev_release, 1062 }; 1063 1064 /** 1065 * mei_cl_bus_set_name - set device name for me client device 1066 * <controller>-<client device> 1067 * Example: 0000:00:16.0-55213584-9a29-4916-badf-0fb7ed682aeb 1068 * 1069 * @cldev: me client device 1070 */ 1071 static inline void mei_cl_bus_set_name(struct mei_cl_device *cldev) 1072 { 1073 dev_set_name(&cldev->dev, "%s-%pUl", 1074 dev_name(cldev->bus->dev), 1075 mei_me_cl_uuid(cldev->me_cl)); 1076 } 1077 1078 /** 1079 * mei_cl_bus_dev_alloc - initialize and allocate mei client device 1080 * 1081 * @bus: mei device 1082 * @me_cl: me client 1083 * 1084 * Return: allocated device structur or NULL on allocation failure 1085 */ 1086 static struct mei_cl_device *mei_cl_bus_dev_alloc(struct mei_device *bus, 1087 struct mei_me_client *me_cl) 1088 { 1089 struct mei_cl_device *cldev; 1090 struct mei_cl *cl; 1091 1092 cldev = kzalloc(sizeof(*cldev), GFP_KERNEL); 1093 if (!cldev) 1094 return NULL; 1095 1096 cl = mei_cl_allocate(bus); 1097 if (!cl) { 1098 kfree(cldev); 1099 return NULL; 1100 } 1101 1102 device_initialize(&cldev->dev); 1103 cldev->dev.parent = bus->dev; 1104 cldev->dev.bus = &mei_cl_bus_type; 1105 cldev->dev.type = &mei_cl_device_type; 1106 cldev->bus = mei_dev_bus_get(bus); 1107 cldev->me_cl = mei_me_cl_get(me_cl); 1108 cldev->cl = cl; 1109 mei_cl_bus_set_name(cldev); 1110 cldev->is_added = 0; 1111 INIT_LIST_HEAD(&cldev->bus_list); 1112 1113 return cldev; 1114 } 1115 1116 /** 1117 * mei_cl_bus_dev_setup - setup me client device 1118 * run fix up routines and set the device name 1119 * 1120 * @bus: mei device 1121 * @cldev: me client device 1122 * 1123 * Return: true if the device is eligible for enumeration 1124 */ 1125 static bool mei_cl_bus_dev_setup(struct mei_device *bus, 1126 struct mei_cl_device *cldev) 1127 { 1128 cldev->do_match = 1; 1129 mei_cl_bus_dev_fixup(cldev); 1130 1131 /* the device name can change during fix up */ 1132 if (cldev->do_match) 1133 mei_cl_bus_set_name(cldev); 1134 1135 return cldev->do_match == 1; 1136 } 1137 1138 /** 1139 * mei_cl_bus_dev_add - add me client devices 1140 * 1141 * @cldev: me client device 1142 * 1143 * Return: 0 on success; < 0 on failre 1144 */ 1145 static int mei_cl_bus_dev_add(struct mei_cl_device *cldev) 1146 { 1147 int ret; 1148 1149 dev_dbg(cldev->bus->dev, "adding %pUL:%02X\n", 1150 mei_me_cl_uuid(cldev->me_cl), 1151 mei_me_cl_ver(cldev->me_cl)); 1152 ret = device_add(&cldev->dev); 1153 if (!ret) 1154 cldev->is_added = 1; 1155 1156 return ret; 1157 } 1158 1159 /** 1160 * mei_cl_bus_dev_stop - stop the driver 1161 * 1162 * @cldev: me client device 1163 */ 1164 static void mei_cl_bus_dev_stop(struct mei_cl_device *cldev) 1165 { 1166 if (cldev->is_added) 1167 device_release_driver(&cldev->dev); 1168 } 1169 1170 /** 1171 * mei_cl_bus_dev_destroy - destroy me client devices object 1172 * 1173 * @cldev: me client device 1174 * 1175 * Locking: called under "dev->cl_bus_lock" lock 1176 */ 1177 static void mei_cl_bus_dev_destroy(struct mei_cl_device *cldev) 1178 { 1179 1180 WARN_ON(!mutex_is_locked(&cldev->bus->cl_bus_lock)); 1181 1182 if (!cldev->is_added) 1183 return; 1184 1185 device_del(&cldev->dev); 1186 1187 list_del_init(&cldev->bus_list); 1188 1189 cldev->is_added = 0; 1190 put_device(&cldev->dev); 1191 } 1192 1193 /** 1194 * mei_cl_bus_remove_device - remove a devices form the bus 1195 * 1196 * @cldev: me client device 1197 */ 1198 static void mei_cl_bus_remove_device(struct mei_cl_device *cldev) 1199 { 1200 mei_cl_bus_dev_stop(cldev); 1201 mei_cl_bus_dev_destroy(cldev); 1202 } 1203 1204 /** 1205 * mei_cl_bus_remove_devices - remove all devices form the bus 1206 * 1207 * @bus: mei device 1208 */ 1209 void mei_cl_bus_remove_devices(struct mei_device *bus) 1210 { 1211 struct mei_cl_device *cldev, *next; 1212 1213 mutex_lock(&bus->cl_bus_lock); 1214 list_for_each_entry_safe(cldev, next, &bus->device_list, bus_list) 1215 mei_cl_bus_remove_device(cldev); 1216 mutex_unlock(&bus->cl_bus_lock); 1217 } 1218 1219 1220 /** 1221 * mei_cl_bus_dev_init - allocate and initializes an mei client devices 1222 * based on me client 1223 * 1224 * @bus: mei device 1225 * @me_cl: me client 1226 * 1227 * Locking: called under "dev->cl_bus_lock" lock 1228 */ 1229 static void mei_cl_bus_dev_init(struct mei_device *bus, 1230 struct mei_me_client *me_cl) 1231 { 1232 struct mei_cl_device *cldev; 1233 1234 WARN_ON(!mutex_is_locked(&bus->cl_bus_lock)); 1235 1236 dev_dbg(bus->dev, "initializing %pUl", mei_me_cl_uuid(me_cl)); 1237 1238 if (me_cl->bus_added) 1239 return; 1240 1241 cldev = mei_cl_bus_dev_alloc(bus, me_cl); 1242 if (!cldev) 1243 return; 1244 1245 me_cl->bus_added = true; 1246 list_add_tail(&cldev->bus_list, &bus->device_list); 1247 1248 } 1249 1250 /** 1251 * mei_cl_bus_rescan - scan me clients list and add create 1252 * devices for eligible clients 1253 * 1254 * @bus: mei device 1255 */ 1256 static void mei_cl_bus_rescan(struct mei_device *bus) 1257 { 1258 struct mei_cl_device *cldev, *n; 1259 struct mei_me_client *me_cl; 1260 1261 mutex_lock(&bus->cl_bus_lock); 1262 1263 down_read(&bus->me_clients_rwsem); 1264 list_for_each_entry(me_cl, &bus->me_clients, list) 1265 mei_cl_bus_dev_init(bus, me_cl); 1266 up_read(&bus->me_clients_rwsem); 1267 1268 list_for_each_entry_safe(cldev, n, &bus->device_list, bus_list) { 1269 1270 if (!mei_me_cl_is_active(cldev->me_cl)) { 1271 mei_cl_bus_remove_device(cldev); 1272 continue; 1273 } 1274 1275 if (cldev->is_added) 1276 continue; 1277 1278 if (mei_cl_bus_dev_setup(bus, cldev)) 1279 mei_cl_bus_dev_add(cldev); 1280 else { 1281 list_del_init(&cldev->bus_list); 1282 put_device(&cldev->dev); 1283 } 1284 } 1285 mutex_unlock(&bus->cl_bus_lock); 1286 1287 dev_dbg(bus->dev, "rescan end"); 1288 } 1289 1290 void mei_cl_bus_rescan_work(struct work_struct *work) 1291 { 1292 struct mei_device *bus = 1293 container_of(work, struct mei_device, bus_rescan_work); 1294 1295 mei_cl_bus_rescan(bus); 1296 } 1297 1298 int __mei_cldev_driver_register(struct mei_cl_driver *cldrv, 1299 struct module *owner) 1300 { 1301 int err; 1302 1303 cldrv->driver.name = cldrv->name; 1304 cldrv->driver.owner = owner; 1305 cldrv->driver.bus = &mei_cl_bus_type; 1306 1307 err = driver_register(&cldrv->driver); 1308 if (err) 1309 return err; 1310 1311 pr_debug("mei: driver [%s] registered\n", cldrv->driver.name); 1312 1313 return 0; 1314 } 1315 EXPORT_SYMBOL_GPL(__mei_cldev_driver_register); 1316 1317 void mei_cldev_driver_unregister(struct mei_cl_driver *cldrv) 1318 { 1319 driver_unregister(&cldrv->driver); 1320 1321 pr_debug("mei: driver [%s] unregistered\n", cldrv->driver.name); 1322 } 1323 EXPORT_SYMBOL_GPL(mei_cldev_driver_unregister); 1324 1325 1326 int __init mei_cl_bus_init(void) 1327 { 1328 return bus_register(&mei_cl_bus_type); 1329 } 1330 1331 void __exit mei_cl_bus_exit(void) 1332 { 1333 bus_unregister(&mei_cl_bus_type); 1334 } 1335