Lines Matching refs:qdev

44 static int qaic_create_drm_device(struct qaic_device *qdev, s32 partition_id);
45 static void qaic_destroy_drm_device(struct qaic_device *qdev, s32 partition_id);
59 struct qaic_device *qdev = qddev->qdev; in qaic_open() local
64 rcu_id = srcu_read_lock(&qdev->dev_lock); in qaic_open()
65 if (qdev->in_reset) { in qaic_open()
95 srcu_read_unlock(&qdev->dev_lock, rcu_id); in qaic_open()
104 srcu_read_unlock(&qdev->dev_lock, rcu_id); in qaic_open()
112 struct qaic_device *qdev; in qaic_postclose() local
120 qdev = qddev->qdev; in qaic_postclose()
121 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); in qaic_postclose()
122 if (!qdev->in_reset) { in qaic_postclose()
123 qaic_release_usr(qdev, usr); in qaic_postclose()
124 for (i = 0; i < qdev->num_dbc; ++i) in qaic_postclose()
125 if (qdev->dbc[i].usr && qdev->dbc[i].usr->handle == usr->handle) in qaic_postclose()
126 release_dbc(qdev, i); in qaic_postclose()
128 srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id); in qaic_postclose()
171 static int qaic_create_drm_device(struct qaic_device *qdev, s32 partition_id) in qaic_create_drm_device() argument
182 pdev = &qdev->pdev->dev; in qaic_create_drm_device()
197 qddev->qdev = qdev; in qaic_create_drm_device()
202 qdev->qddev = qddev; in qaic_create_drm_device()
206 pci_dbg(qdev->pdev, "%s: drm_dev_register failed %d\n", __func__, ret); in qaic_create_drm_device()
214 qdev->qddev = NULL; in qaic_create_drm_device()
221 static void qaic_destroy_drm_device(struct qaic_device *qdev, s32 partition_id) in qaic_destroy_drm_device() argument
226 qddev = qdev->qddev; in qaic_destroy_drm_device()
227 qdev->qddev = NULL; in qaic_destroy_drm_device()
269 struct qaic_device *qdev; in qaic_mhi_probe() local
283 qdev = pci_get_drvdata(to_pci_dev(mhi_dev->mhi_cntrl->cntrl_dev)); in qaic_mhi_probe()
285 qdev->in_reset = false; in qaic_mhi_probe()
287 dev_set_drvdata(&mhi_dev->dev, qdev); in qaic_mhi_probe()
288 qdev->cntl_ch = mhi_dev; in qaic_mhi_probe()
290 ret = qaic_control_open(qdev); in qaic_mhi_probe()
292 pci_dbg(qdev->pdev, "%s: control_open failed %d\n", __func__, ret); in qaic_mhi_probe()
296 ret = get_cntl_version(qdev, NULL, &major, &minor); in qaic_mhi_probe()
298 …pci_err(qdev->pdev, "%s: Control protocol version (%d.%d) not supported. Supported version is (%d.… in qaic_mhi_probe()
304 ret = qaic_create_drm_device(qdev, QAIC_NO_PARTITION); in qaic_mhi_probe()
309 qaic_control_close(qdev); in qaic_mhi_probe()
318 static void qaic_notify_reset(struct qaic_device *qdev) in qaic_notify_reset() argument
322 qdev->in_reset = true; in qaic_notify_reset()
324 wake_all_cntl(qdev); in qaic_notify_reset()
325 for (i = 0; i < qdev->num_dbc; ++i) in qaic_notify_reset()
326 wakeup_dbc(qdev, i); in qaic_notify_reset()
327 synchronize_srcu(&qdev->dev_lock); in qaic_notify_reset()
330 void qaic_dev_reset_clean_local_state(struct qaic_device *qdev, bool exit_reset) in qaic_dev_reset_clean_local_state() argument
334 qaic_notify_reset(qdev); in qaic_dev_reset_clean_local_state()
337 qaic_destroy_drm_device(qdev, QAIC_NO_PARTITION); in qaic_dev_reset_clean_local_state()
340 for (i = 0; i < qdev->num_dbc; ++i) in qaic_dev_reset_clean_local_state()
341 release_dbc(qdev, i); in qaic_dev_reset_clean_local_state()
344 qdev->in_reset = false; in qaic_dev_reset_clean_local_state()
349 struct qaic_device *qdev; in create_qdev() local
352 qdev = devm_kzalloc(&pdev->dev, sizeof(*qdev), GFP_KERNEL); in create_qdev()
353 if (!qdev) in create_qdev()
357 qdev->num_dbc = 16; in create_qdev()
358 qdev->dbc = devm_kcalloc(&pdev->dev, qdev->num_dbc, sizeof(*qdev->dbc), GFP_KERNEL); in create_qdev()
359 if (!qdev->dbc) in create_qdev()
363 qdev->cntl_wq = alloc_workqueue("qaic_cntl", WQ_UNBOUND, 0); in create_qdev()
364 if (!qdev->cntl_wq) in create_qdev()
367 pci_set_drvdata(pdev, qdev); in create_qdev()
368 qdev->pdev = pdev; in create_qdev()
370 mutex_init(&qdev->cntl_mutex); in create_qdev()
371 INIT_LIST_HEAD(&qdev->cntl_xfer_list); in create_qdev()
372 init_srcu_struct(&qdev->dev_lock); in create_qdev()
374 for (i = 0; i < qdev->num_dbc; ++i) { in create_qdev()
375 spin_lock_init(&qdev->dbc[i].xfer_lock); in create_qdev()
376 qdev->dbc[i].qdev = qdev; in create_qdev()
377 qdev->dbc[i].id = i; in create_qdev()
378 INIT_LIST_HEAD(&qdev->dbc[i].xfer_list); in create_qdev()
379 init_srcu_struct(&qdev->dbc[i].ch_lock); in create_qdev()
380 init_waitqueue_head(&qdev->dbc[i].dbc_release); in create_qdev()
381 INIT_LIST_HEAD(&qdev->dbc[i].bo_lists); in create_qdev()
384 return qdev; in create_qdev()
387 static void cleanup_qdev(struct qaic_device *qdev) in cleanup_qdev() argument
391 for (i = 0; i < qdev->num_dbc; ++i) in cleanup_qdev()
392 cleanup_srcu_struct(&qdev->dbc[i].ch_lock); in cleanup_qdev()
393 cleanup_srcu_struct(&qdev->dev_lock); in cleanup_qdev()
394 pci_set_drvdata(qdev->pdev, NULL); in cleanup_qdev()
395 destroy_workqueue(qdev->cntl_wq); in cleanup_qdev()
398 static int init_pci(struct qaic_device *qdev, struct pci_dev *pdev) in init_pci() argument
423 qdev->bar_0 = devm_ioremap_resource(&pdev->dev, &pdev->resource[0]); in init_pci()
424 if (IS_ERR(qdev->bar_0)) in init_pci()
425 return PTR_ERR(qdev->bar_0); in init_pci()
427 qdev->bar_2 = devm_ioremap_resource(&pdev->dev, &pdev->resource[2]); in init_pci()
428 if (IS_ERR(qdev->bar_2)) in init_pci()
429 return PTR_ERR(qdev->bar_2); in init_pci()
437 static int init_msi(struct qaic_device *qdev, struct pci_dev *pdev) in init_msi() argument
458 for (i = 0; i < qdev->num_dbc; ++i) { in init_msi()
461 "qaic_dbc", &qdev->dbc[i]); in init_msi()
466 qdev->dbc[i].irq = pci_irq_vector(pdev, i + 1); in init_msi()
467 disable_irq_nosync(qdev->dbc[i].irq); in init_msi()
468 INIT_WORK(&qdev->dbc[i].poll_work, irq_polling_work); in init_msi()
477 struct qaic_device *qdev; in qaic_pci_probe() local
482 qdev = create_qdev(pdev, id); in qaic_pci_probe()
483 if (!qdev) in qaic_pci_probe()
486 ret = init_pci(qdev, pdev); in qaic_pci_probe()
490 for (i = 0; i < qdev->num_dbc; ++i) in qaic_pci_probe()
491 qdev->dbc[i].dbc_base = qdev->bar_2 + QAIC_DBC_OFF(i); in qaic_pci_probe()
493 mhi_irq = init_msi(qdev, pdev); in qaic_pci_probe()
499 qdev->mhi_cntrl = qaic_mhi_register_controller(pdev, qdev->bar_0, mhi_irq); in qaic_pci_probe()
500 if (IS_ERR(qdev->mhi_cntrl)) { in qaic_pci_probe()
501 ret = PTR_ERR(qdev->mhi_cntrl); in qaic_pci_probe()
508 cleanup_qdev(qdev); in qaic_pci_probe()
514 struct qaic_device *qdev = pci_get_drvdata(pdev); in qaic_pci_remove() local
516 if (!qdev) in qaic_pci_remove()
519 qaic_dev_reset_clean_local_state(qdev, false); in qaic_pci_remove()
520 qaic_mhi_free_controller(qdev->mhi_cntrl, link_up); in qaic_pci_remove()
521 cleanup_qdev(qdev); in qaic_pci_remove()
538 struct qaic_device *qdev = pci_get_drvdata(pdev); in qaic_pci_reset_prepare() local
540 qaic_notify_reset(qdev); in qaic_pci_reset_prepare()
541 qaic_mhi_start_reset(qdev->mhi_cntrl); in qaic_pci_reset_prepare()
542 qaic_dev_reset_clean_local_state(qdev, false); in qaic_pci_reset_prepare()
547 struct qaic_device *qdev = pci_get_drvdata(pdev); in qaic_pci_reset_done() local
549 qdev->in_reset = false; in qaic_pci_reset_done()
550 qaic_mhi_reset_done(qdev->mhi_cntrl); in qaic_pci_reset_done()