qaic_drv.c 22 KB

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