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