Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.13-rc6 701 lines 18 kB view raw
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 <linux/delay.h> 7#include <linux/dma-mapping.h> 8#include <linux/idr.h> 9#include <linux/interrupt.h> 10#include <linux/list.h> 11#include <linux/kobject.h> 12#include <linux/kref.h> 13#include <linux/mhi.h> 14#include <linux/module.h> 15#include <linux/msi.h> 16#include <linux/mutex.h> 17#include <linux/pci.h> 18#include <linux/spinlock.h> 19#include <linux/workqueue.h> 20#include <linux/wait.h> 21#include <drm/drm_accel.h> 22#include <drm/drm_drv.h> 23#include <drm/drm_file.h> 24#include <drm/drm_gem.h> 25#include <drm/drm_ioctl.h> 26#include <drm/drm_managed.h> 27#include <uapi/drm/qaic_accel.h> 28 29#include "mhi_controller.h" 30#include "qaic.h" 31#include "qaic_debugfs.h" 32#include "qaic_timesync.h" 33#include "sahara.h" 34 35MODULE_IMPORT_NS("DMA_BUF"); 36 37#define PCI_DEV_AIC080 0xa080 38#define PCI_DEV_AIC100 0xa100 39#define QAIC_NAME "qaic" 40#define QAIC_DESC "Qualcomm Cloud AI Accelerators" 41#define CNTL_MAJOR 5 42#define CNTL_MINOR 0 43 44bool datapath_polling; 45module_param(datapath_polling, bool, 0400); 46MODULE_PARM_DESC(datapath_polling, "Operate the datapath in polling mode"); 47static bool link_up; 48static DEFINE_IDA(qaic_usrs); 49 50static void qaicm_wq_release(struct drm_device *dev, void *res) 51{ 52 struct workqueue_struct *wq = res; 53 54 destroy_workqueue(wq); 55} 56 57static struct workqueue_struct *qaicm_wq_init(struct drm_device *dev, const char *name) 58{ 59 struct workqueue_struct *wq; 60 int ret; 61 62 wq = alloc_workqueue("%s", WQ_UNBOUND, 0, name); 63 if (!wq) 64 return ERR_PTR(-ENOMEM); 65 ret = drmm_add_action_or_reset(dev, qaicm_wq_release, wq); 66 if (ret) 67 return ERR_PTR(ret); 68 69 return wq; 70} 71 72static void qaicm_srcu_release(struct drm_device *dev, void *res) 73{ 74 struct srcu_struct *lock = res; 75 76 cleanup_srcu_struct(lock); 77} 78 79static int qaicm_srcu_init(struct drm_device *dev, struct srcu_struct *lock) 80{ 81 int ret; 82 83 ret = init_srcu_struct(lock); 84 if (ret) 85 return ret; 86 87 return drmm_add_action_or_reset(dev, qaicm_srcu_release, lock); 88} 89 90static void qaicm_pci_release(struct drm_device *dev, void *res) 91{ 92 struct qaic_device *qdev = to_qaic_device(dev); 93 94 pci_set_drvdata(qdev->pdev, NULL); 95} 96 97static void free_usr(struct kref *kref) 98{ 99 struct qaic_user *usr = container_of(kref, struct qaic_user, ref_count); 100 101 cleanup_srcu_struct(&usr->qddev_lock); 102 ida_free(&qaic_usrs, usr->handle); 103 kfree(usr); 104} 105 106static int qaic_open(struct drm_device *dev, struct drm_file *file) 107{ 108 struct qaic_drm_device *qddev = to_qaic_drm_device(dev); 109 struct qaic_device *qdev = qddev->qdev; 110 struct qaic_user *usr; 111 int rcu_id; 112 int ret; 113 114 rcu_id = srcu_read_lock(&qdev->dev_lock); 115 if (qdev->dev_state != QAIC_ONLINE) { 116 ret = -ENODEV; 117 goto dev_unlock; 118 } 119 120 usr = kmalloc(sizeof(*usr), GFP_KERNEL); 121 if (!usr) { 122 ret = -ENOMEM; 123 goto dev_unlock; 124 } 125 126 usr->handle = ida_alloc(&qaic_usrs, GFP_KERNEL); 127 if (usr->handle < 0) { 128 ret = usr->handle; 129 goto free_usr; 130 } 131 usr->qddev = qddev; 132 atomic_set(&usr->chunk_id, 0); 133 init_srcu_struct(&usr->qddev_lock); 134 kref_init(&usr->ref_count); 135 136 ret = mutex_lock_interruptible(&qddev->users_mutex); 137 if (ret) 138 goto cleanup_usr; 139 140 list_add(&usr->node, &qddev->users); 141 mutex_unlock(&qddev->users_mutex); 142 143 file->driver_priv = usr; 144 145 srcu_read_unlock(&qdev->dev_lock, rcu_id); 146 return 0; 147 148cleanup_usr: 149 cleanup_srcu_struct(&usr->qddev_lock); 150 ida_free(&qaic_usrs, usr->handle); 151free_usr: 152 kfree(usr); 153dev_unlock: 154 srcu_read_unlock(&qdev->dev_lock, rcu_id); 155 return ret; 156} 157 158static void qaic_postclose(struct drm_device *dev, struct drm_file *file) 159{ 160 struct qaic_user *usr = file->driver_priv; 161 struct qaic_drm_device *qddev; 162 struct qaic_device *qdev; 163 int qdev_rcu_id; 164 int usr_rcu_id; 165 int i; 166 167 qddev = usr->qddev; 168 usr_rcu_id = srcu_read_lock(&usr->qddev_lock); 169 if (qddev) { 170 qdev = qddev->qdev; 171 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); 172 if (qdev->dev_state == QAIC_ONLINE) { 173 qaic_release_usr(qdev, usr); 174 for (i = 0; i < qdev->num_dbc; ++i) 175 if (qdev->dbc[i].usr && qdev->dbc[i].usr->handle == usr->handle) 176 release_dbc(qdev, i); 177 } 178 srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id); 179 180 mutex_lock(&qddev->users_mutex); 181 if (!list_empty(&usr->node)) 182 list_del_init(&usr->node); 183 mutex_unlock(&qddev->users_mutex); 184 } 185 186 srcu_read_unlock(&usr->qddev_lock, usr_rcu_id); 187 kref_put(&usr->ref_count, free_usr); 188 189 file->driver_priv = NULL; 190} 191 192DEFINE_DRM_ACCEL_FOPS(qaic_accel_fops); 193 194static const struct drm_ioctl_desc qaic_drm_ioctls[] = { 195 DRM_IOCTL_DEF_DRV(QAIC_MANAGE, qaic_manage_ioctl, 0), 196 DRM_IOCTL_DEF_DRV(QAIC_CREATE_BO, qaic_create_bo_ioctl, 0), 197 DRM_IOCTL_DEF_DRV(QAIC_MMAP_BO, qaic_mmap_bo_ioctl, 0), 198 DRM_IOCTL_DEF_DRV(QAIC_ATTACH_SLICE_BO, qaic_attach_slice_bo_ioctl, 0), 199 DRM_IOCTL_DEF_DRV(QAIC_EXECUTE_BO, qaic_execute_bo_ioctl, 0), 200 DRM_IOCTL_DEF_DRV(QAIC_PARTIAL_EXECUTE_BO, qaic_partial_execute_bo_ioctl, 0), 201 DRM_IOCTL_DEF_DRV(QAIC_WAIT_BO, qaic_wait_bo_ioctl, 0), 202 DRM_IOCTL_DEF_DRV(QAIC_PERF_STATS_BO, qaic_perf_stats_bo_ioctl, 0), 203 DRM_IOCTL_DEF_DRV(QAIC_DETACH_SLICE_BO, qaic_detach_slice_bo_ioctl, 0), 204}; 205 206static const struct drm_driver qaic_accel_driver = { 207 .driver_features = DRIVER_GEM | DRIVER_COMPUTE_ACCEL, 208 209 .name = QAIC_NAME, 210 .desc = QAIC_DESC, 211 .date = "20190618", 212 213 .fops = &qaic_accel_fops, 214 .open = qaic_open, 215 .postclose = qaic_postclose, 216 217 .ioctls = qaic_drm_ioctls, 218 .num_ioctls = ARRAY_SIZE(qaic_drm_ioctls), 219 .gem_prime_import = qaic_gem_prime_import, 220}; 221 222static int qaic_create_drm_device(struct qaic_device *qdev, s32 partition_id) 223{ 224 struct qaic_drm_device *qddev = qdev->qddev; 225 struct drm_device *drm = to_drm(qddev); 226 int ret; 227 228 /* Hold off implementing partitions until the uapi is determined */ 229 if (partition_id != QAIC_NO_PARTITION) 230 return -EINVAL; 231 232 qddev->partition_id = partition_id; 233 234 ret = drm_dev_register(drm, 0); 235 if (ret) { 236 pci_dbg(qdev->pdev, "drm_dev_register failed %d\n", ret); 237 return ret; 238 } 239 240 qaic_debugfs_init(qddev); 241 242 return ret; 243} 244 245static void qaic_destroy_drm_device(struct qaic_device *qdev, s32 partition_id) 246{ 247 struct qaic_drm_device *qddev = qdev->qddev; 248 struct drm_device *drm = to_drm(qddev); 249 struct qaic_user *usr; 250 251 drm_dev_unregister(drm); 252 qddev->partition_id = 0; 253 /* 254 * Existing users get unresolvable errors till they close FDs. 255 * Need to sync carefully with users calling close(). The 256 * list of users can be modified elsewhere when the lock isn't 257 * held here, but the sync'ing the srcu with the mutex held 258 * could deadlock. Grab the mutex so that the list will be 259 * unmodified. The user we get will exist as long as the 260 * lock is held. Signal that the qcdev is going away, and 261 * grab a reference to the user so they don't go away for 262 * synchronize_srcu(). Then release the mutex to avoid 263 * deadlock and make sure the user has observed the signal. 264 * With the lock released, we cannot maintain any state of the 265 * user list. 266 */ 267 mutex_lock(&qddev->users_mutex); 268 while (!list_empty(&qddev->users)) { 269 usr = list_first_entry(&qddev->users, struct qaic_user, node); 270 list_del_init(&usr->node); 271 kref_get(&usr->ref_count); 272 usr->qddev = NULL; 273 mutex_unlock(&qddev->users_mutex); 274 synchronize_srcu(&usr->qddev_lock); 275 kref_put(&usr->ref_count, free_usr); 276 mutex_lock(&qddev->users_mutex); 277 } 278 mutex_unlock(&qddev->users_mutex); 279} 280 281static int qaic_mhi_probe(struct mhi_device *mhi_dev, const struct mhi_device_id *id) 282{ 283 u16 major = -1, minor = -1; 284 struct qaic_device *qdev; 285 int ret; 286 287 /* 288 * Invoking this function indicates that the control channel to the 289 * device is available. We use that as a signal to indicate that 290 * the device side firmware has booted. The device side firmware 291 * manages the device resources, so we need to communicate with it 292 * via the control channel in order to utilize the device. Therefore 293 * we wait until this signal to create the drm dev that userspace will 294 * use to control the device, because without the device side firmware, 295 * userspace can't do anything useful. 296 */ 297 298 qdev = pci_get_drvdata(to_pci_dev(mhi_dev->mhi_cntrl->cntrl_dev)); 299 300 dev_set_drvdata(&mhi_dev->dev, qdev); 301 qdev->cntl_ch = mhi_dev; 302 303 ret = qaic_control_open(qdev); 304 if (ret) { 305 pci_dbg(qdev->pdev, "%s: control_open failed %d\n", __func__, ret); 306 return ret; 307 } 308 309 qdev->dev_state = QAIC_BOOT; 310 ret = get_cntl_version(qdev, NULL, &major, &minor); 311 if (ret || major != CNTL_MAJOR || minor > CNTL_MINOR) { 312 pci_err(qdev->pdev, "%s: Control protocol version (%d.%d) not supported. Supported version is (%d.%d). Ret: %d\n", 313 __func__, major, minor, CNTL_MAJOR, CNTL_MINOR, ret); 314 ret = -EINVAL; 315 goto close_control; 316 } 317 qdev->dev_state = QAIC_ONLINE; 318 kobject_uevent(&(to_accel_kdev(qdev->qddev))->kobj, KOBJ_ONLINE); 319 320 return ret; 321 322close_control: 323 qaic_control_close(qdev); 324 return ret; 325} 326 327static void qaic_mhi_remove(struct mhi_device *mhi_dev) 328{ 329/* This is redundant since we have already observed the device crash */ 330} 331 332static void qaic_notify_reset(struct qaic_device *qdev) 333{ 334 int i; 335 336 kobject_uevent(&(to_accel_kdev(qdev->qddev))->kobj, KOBJ_OFFLINE); 337 qdev->dev_state = QAIC_OFFLINE; 338 /* wake up any waiters to avoid waiting for timeouts at sync */ 339 wake_all_cntl(qdev); 340 for (i = 0; i < qdev->num_dbc; ++i) 341 wakeup_dbc(qdev, i); 342 synchronize_srcu(&qdev->dev_lock); 343} 344 345void qaic_dev_reset_clean_local_state(struct qaic_device *qdev) 346{ 347 int i; 348 349 qaic_notify_reset(qdev); 350 351 /* start tearing things down */ 352 for (i = 0; i < qdev->num_dbc; ++i) 353 release_dbc(qdev, i); 354} 355 356static struct qaic_device *create_qdev(struct pci_dev *pdev, const struct pci_device_id *id) 357{ 358 struct device *dev = &pdev->dev; 359 struct qaic_drm_device *qddev; 360 struct qaic_device *qdev; 361 struct drm_device *drm; 362 int i, ret; 363 364 qdev = devm_kzalloc(dev, sizeof(*qdev), GFP_KERNEL); 365 if (!qdev) 366 return NULL; 367 368 qdev->dev_state = QAIC_OFFLINE; 369 if (id->device == PCI_DEV_AIC080 || id->device == PCI_DEV_AIC100) { 370 qdev->num_dbc = 16; 371 qdev->dbc = devm_kcalloc(dev, qdev->num_dbc, sizeof(*qdev->dbc), GFP_KERNEL); 372 if (!qdev->dbc) 373 return NULL; 374 } 375 376 qddev = devm_drm_dev_alloc(&pdev->dev, &qaic_accel_driver, struct qaic_drm_device, drm); 377 if (IS_ERR(qddev)) 378 return NULL; 379 380 drm = to_drm(qddev); 381 pci_set_drvdata(pdev, qdev); 382 383 ret = drmm_mutex_init(drm, &qddev->users_mutex); 384 if (ret) 385 return NULL; 386 ret = drmm_add_action_or_reset(drm, qaicm_pci_release, NULL); 387 if (ret) 388 return NULL; 389 ret = drmm_mutex_init(drm, &qdev->cntl_mutex); 390 if (ret) 391 return NULL; 392 ret = drmm_mutex_init(drm, &qdev->bootlog_mutex); 393 if (ret) 394 return NULL; 395 396 qdev->cntl_wq = qaicm_wq_init(drm, "qaic_cntl"); 397 if (IS_ERR(qdev->cntl_wq)) 398 return NULL; 399 qdev->qts_wq = qaicm_wq_init(drm, "qaic_ts"); 400 if (IS_ERR(qdev->qts_wq)) 401 return NULL; 402 403 ret = qaicm_srcu_init(drm, &qdev->dev_lock); 404 if (ret) 405 return NULL; 406 407 qdev->qddev = qddev; 408 qdev->pdev = pdev; 409 qddev->qdev = qdev; 410 411 INIT_LIST_HEAD(&qdev->cntl_xfer_list); 412 INIT_LIST_HEAD(&qdev->bootlog); 413 INIT_LIST_HEAD(&qddev->users); 414 415 for (i = 0; i < qdev->num_dbc; ++i) { 416 spin_lock_init(&qdev->dbc[i].xfer_lock); 417 qdev->dbc[i].qdev = qdev; 418 qdev->dbc[i].id = i; 419 INIT_LIST_HEAD(&qdev->dbc[i].xfer_list); 420 ret = qaicm_srcu_init(drm, &qdev->dbc[i].ch_lock); 421 if (ret) 422 return NULL; 423 init_waitqueue_head(&qdev->dbc[i].dbc_release); 424 INIT_LIST_HEAD(&qdev->dbc[i].bo_lists); 425 } 426 427 return qdev; 428} 429 430static int init_pci(struct qaic_device *qdev, struct pci_dev *pdev) 431{ 432 int bars; 433 int ret; 434 435 bars = pci_select_bars(pdev, IORESOURCE_MEM); 436 437 /* make sure the device has the expected BARs */ 438 if (bars != (BIT(0) | BIT(2) | BIT(4))) { 439 pci_dbg(pdev, "%s: expected BARs 0, 2, and 4 not found in device. Found 0x%x\n", 440 __func__, bars); 441 return -EINVAL; 442 } 443 444 ret = pcim_enable_device(pdev); 445 if (ret) 446 return ret; 447 448 ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); 449 if (ret) 450 return ret; 451 dma_set_max_seg_size(&pdev->dev, UINT_MAX); 452 453 qdev->bar_0 = devm_ioremap_resource(&pdev->dev, &pdev->resource[0]); 454 if (IS_ERR(qdev->bar_0)) 455 return PTR_ERR(qdev->bar_0); 456 457 qdev->bar_2 = devm_ioremap_resource(&pdev->dev, &pdev->resource[2]); 458 if (IS_ERR(qdev->bar_2)) 459 return PTR_ERR(qdev->bar_2); 460 461 /* Managed release since we use pcim_enable_device above */ 462 pci_set_master(pdev); 463 464 return 0; 465} 466 467static int init_msi(struct qaic_device *qdev, struct pci_dev *pdev) 468{ 469 int mhi_irq; 470 int ret; 471 int i; 472 473 /* Managed release since we use pcim_enable_device */ 474 ret = pci_alloc_irq_vectors(pdev, 32, 32, PCI_IRQ_MSI); 475 if (ret == -ENOSPC) { 476 ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI); 477 if (ret < 0) 478 return ret; 479 480 /* 481 * Operate in one MSI mode. All interrupts will be directed to 482 * MSI0; every interrupt will wake up all the interrupt handlers 483 * (MHI and DBC[0-15]). Since the interrupt is now shared, it is 484 * not disabled during DBC threaded handler, but only one thread 485 * will be allowed to run per DBC, so while it can be 486 * interrupted, it shouldn't race with itself. 487 */ 488 qdev->single_msi = true; 489 pci_info(pdev, "Allocating 32 MSIs failed, operating in 1 MSI mode. Performance may be impacted.\n"); 490 } else if (ret < 0) { 491 return ret; 492 } 493 494 mhi_irq = pci_irq_vector(pdev, 0); 495 if (mhi_irq < 0) 496 return mhi_irq; 497 498 for (i = 0; i < qdev->num_dbc; ++i) { 499 ret = devm_request_threaded_irq(&pdev->dev, 500 pci_irq_vector(pdev, qdev->single_msi ? 0 : i + 1), 501 dbc_irq_handler, dbc_irq_threaded_fn, IRQF_SHARED, 502 "qaic_dbc", &qdev->dbc[i]); 503 if (ret) 504 return ret; 505 506 if (datapath_polling) { 507 qdev->dbc[i].irq = pci_irq_vector(pdev, qdev->single_msi ? 0 : i + 1); 508 if (!qdev->single_msi) 509 disable_irq_nosync(qdev->dbc[i].irq); 510 INIT_WORK(&qdev->dbc[i].poll_work, irq_polling_work); 511 } 512 } 513 514 return mhi_irq; 515} 516 517static int qaic_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) 518{ 519 struct qaic_device *qdev; 520 int mhi_irq; 521 int ret; 522 int i; 523 524 qdev = create_qdev(pdev, id); 525 if (!qdev) 526 return -ENOMEM; 527 528 ret = init_pci(qdev, pdev); 529 if (ret) 530 return ret; 531 532 for (i = 0; i < qdev->num_dbc; ++i) 533 qdev->dbc[i].dbc_base = qdev->bar_2 + QAIC_DBC_OFF(i); 534 535 mhi_irq = init_msi(qdev, pdev); 536 if (mhi_irq < 0) 537 return mhi_irq; 538 539 ret = qaic_create_drm_device(qdev, QAIC_NO_PARTITION); 540 if (ret) 541 return ret; 542 543 qdev->mhi_cntrl = qaic_mhi_register_controller(pdev, qdev->bar_0, mhi_irq, 544 qdev->single_msi); 545 if (IS_ERR(qdev->mhi_cntrl)) { 546 ret = PTR_ERR(qdev->mhi_cntrl); 547 qaic_destroy_drm_device(qdev, QAIC_NO_PARTITION); 548 return ret; 549 } 550 551 return 0; 552} 553 554static void qaic_pci_remove(struct pci_dev *pdev) 555{ 556 struct qaic_device *qdev = pci_get_drvdata(pdev); 557 558 if (!qdev) 559 return; 560 561 qaic_dev_reset_clean_local_state(qdev); 562 qaic_mhi_free_controller(qdev->mhi_cntrl, link_up); 563 qaic_destroy_drm_device(qdev, QAIC_NO_PARTITION); 564} 565 566static void qaic_pci_shutdown(struct pci_dev *pdev) 567{ 568 /* see qaic_exit for what link_up is doing */ 569 link_up = true; 570 qaic_pci_remove(pdev); 571} 572 573static pci_ers_result_t qaic_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t error) 574{ 575 return PCI_ERS_RESULT_NEED_RESET; 576} 577 578static void qaic_pci_reset_prepare(struct pci_dev *pdev) 579{ 580 struct qaic_device *qdev = pci_get_drvdata(pdev); 581 582 qaic_notify_reset(qdev); 583 qaic_mhi_start_reset(qdev->mhi_cntrl); 584 qaic_dev_reset_clean_local_state(qdev); 585} 586 587static void qaic_pci_reset_done(struct pci_dev *pdev) 588{ 589 struct qaic_device *qdev = pci_get_drvdata(pdev); 590 591 qaic_mhi_reset_done(qdev->mhi_cntrl); 592} 593 594static const struct mhi_device_id qaic_mhi_match_table[] = { 595 { .chan = "QAIC_CONTROL", }, 596 {}, 597}; 598 599static struct mhi_driver qaic_mhi_driver = { 600 .id_table = qaic_mhi_match_table, 601 .remove = qaic_mhi_remove, 602 .probe = qaic_mhi_probe, 603 .ul_xfer_cb = qaic_mhi_ul_xfer_cb, 604 .dl_xfer_cb = qaic_mhi_dl_xfer_cb, 605 .driver = { 606 .name = "qaic_mhi", 607 }, 608}; 609 610static const struct pci_device_id qaic_ids[] = { 611 { PCI_DEVICE(PCI_VENDOR_ID_QCOM, PCI_DEV_AIC080), }, 612 { PCI_DEVICE(PCI_VENDOR_ID_QCOM, PCI_DEV_AIC100), }, 613 { } 614}; 615MODULE_DEVICE_TABLE(pci, qaic_ids); 616 617static const struct pci_error_handlers qaic_pci_err_handler = { 618 .error_detected = qaic_pci_error_detected, 619 .reset_prepare = qaic_pci_reset_prepare, 620 .reset_done = qaic_pci_reset_done, 621}; 622 623static struct pci_driver qaic_pci_driver = { 624 .name = QAIC_NAME, 625 .id_table = qaic_ids, 626 .probe = qaic_pci_probe, 627 .remove = qaic_pci_remove, 628 .shutdown = qaic_pci_shutdown, 629 .err_handler = &qaic_pci_err_handler, 630}; 631 632static int __init qaic_init(void) 633{ 634 int ret; 635 636 ret = pci_register_driver(&qaic_pci_driver); 637 if (ret) { 638 pr_debug("qaic: pci_register_driver failed %d\n", ret); 639 return ret; 640 } 641 642 ret = mhi_driver_register(&qaic_mhi_driver); 643 if (ret) { 644 pr_debug("qaic: mhi_driver_register failed %d\n", ret); 645 goto free_pci; 646 } 647 648 ret = sahara_register(); 649 if (ret) { 650 pr_debug("qaic: sahara_register failed %d\n", ret); 651 goto free_mhi; 652 } 653 654 ret = qaic_timesync_init(); 655 if (ret) 656 pr_debug("qaic: qaic_timesync_init failed %d\n", ret); 657 658 ret = qaic_bootlog_register(); 659 if (ret) 660 pr_debug("qaic: qaic_bootlog_register failed %d\n", ret); 661 662 return 0; 663 664free_mhi: 665 mhi_driver_unregister(&qaic_mhi_driver); 666free_pci: 667 pci_unregister_driver(&qaic_pci_driver); 668 return ret; 669} 670 671static void __exit qaic_exit(void) 672{ 673 /* 674 * We assume that qaic_pci_remove() is called due to a hotplug event 675 * which would mean that the link is down, and thus 676 * qaic_mhi_free_controller() should not try to access the device during 677 * cleanup. 678 * We call pci_unregister_driver() below, which also triggers 679 * qaic_pci_remove(), but since this is module exit, we expect the link 680 * to the device to be up, in which case qaic_mhi_free_controller() 681 * should try to access the device during cleanup to put the device in 682 * a sane state. 683 * For that reason, we set link_up here to let qaic_mhi_free_controller 684 * know the expected link state. Since the module is going to be 685 * removed at the end of this, we don't need to worry about 686 * reinitializing the link_up state after the cleanup is done. 687 */ 688 link_up = true; 689 qaic_bootlog_unregister(); 690 qaic_timesync_deinit(); 691 sahara_unregister(); 692 mhi_driver_unregister(&qaic_mhi_driver); 693 pci_unregister_driver(&qaic_pci_driver); 694} 695 696module_init(qaic_init); 697module_exit(qaic_exit); 698 699MODULE_AUTHOR(QAIC_DESC " Kernel Driver Team"); 700MODULE_DESCRIPTION(QAIC_DESC " Accel Driver"); 701MODULE_LICENSE("GPL");