Lines Matching refs:g2d

248 static int g2d_init_cmdlist(struct g2d_data *g2d)  in g2d_init_cmdlist()  argument
250 struct device *dev = g2d->dev; in g2d_init_cmdlist()
251 struct g2d_cmdlist_node *node = g2d->cmdlist_node; in g2d_init_cmdlist()
252 struct exynos_drm_subdrv *subdrv = &g2d->subdrv; in g2d_init_cmdlist()
257 init_dma_attrs(&g2d->cmdlist_dma_attrs); in g2d_init_cmdlist()
258 dma_set_attr(DMA_ATTR_WRITE_COMBINE, &g2d->cmdlist_dma_attrs); in g2d_init_cmdlist()
260 g2d->cmdlist_pool_virt = dma_alloc_attrs(subdrv->drm_dev->dev, in g2d_init_cmdlist()
262 &g2d->cmdlist_pool, GFP_KERNEL, in g2d_init_cmdlist()
263 &g2d->cmdlist_dma_attrs); in g2d_init_cmdlist()
264 if (!g2d->cmdlist_pool_virt) { in g2d_init_cmdlist()
280 g2d->cmdlist_pool_virt + nr * G2D_CMDLIST_SIZE; in g2d_init_cmdlist()
282 g2d->cmdlist_pool + nr * G2D_CMDLIST_SIZE; in g2d_init_cmdlist()
288 list_add_tail(&node[nr].list, &g2d->free_cmdlist); in g2d_init_cmdlist()
295 g2d->cmdlist_pool_virt, in g2d_init_cmdlist()
296 g2d->cmdlist_pool, &g2d->cmdlist_dma_attrs); in g2d_init_cmdlist()
300 static void g2d_fini_cmdlist(struct g2d_data *g2d) in g2d_fini_cmdlist() argument
302 struct exynos_drm_subdrv *subdrv = &g2d->subdrv; in g2d_fini_cmdlist()
304 kfree(g2d->cmdlist_node); in g2d_fini_cmdlist()
306 if (g2d->cmdlist_pool_virt && g2d->cmdlist_pool) { in g2d_fini_cmdlist()
308 g2d->cmdlist_pool_virt, in g2d_fini_cmdlist()
309 g2d->cmdlist_pool, &g2d->cmdlist_dma_attrs); in g2d_fini_cmdlist()
313 static struct g2d_cmdlist_node *g2d_get_cmdlist(struct g2d_data *g2d) in g2d_get_cmdlist() argument
315 struct device *dev = g2d->dev; in g2d_get_cmdlist()
318 mutex_lock(&g2d->cmdlist_mutex); in g2d_get_cmdlist()
319 if (list_empty(&g2d->free_cmdlist)) { in g2d_get_cmdlist()
321 mutex_unlock(&g2d->cmdlist_mutex); in g2d_get_cmdlist()
325 node = list_first_entry(&g2d->free_cmdlist, struct g2d_cmdlist_node, in g2d_get_cmdlist()
328 mutex_unlock(&g2d->cmdlist_mutex); in g2d_get_cmdlist()
333 static void g2d_put_cmdlist(struct g2d_data *g2d, struct g2d_cmdlist_node *node) in g2d_put_cmdlist() argument
335 mutex_lock(&g2d->cmdlist_mutex); in g2d_put_cmdlist()
336 list_move_tail(&node->list, &g2d->free_cmdlist); in g2d_put_cmdlist()
337 mutex_unlock(&g2d->cmdlist_mutex); in g2d_put_cmdlist()
410 struct g2d_data *g2d; in g2d_userptr_get_dma_addr() local
423 g2d = dev_get_drvdata(g2d_priv->dev); in g2d_userptr_get_dma_addr()
537 if (g2d->current_pool + (npages << PAGE_SHIFT) < g2d->max_pool) { in g2d_userptr_get_dma_addr()
538 g2d->current_pool += npages << PAGE_SHIFT; in g2d_userptr_get_dma_addr()
570 struct g2d_data *g2d, in g2d_userptr_free_all() argument
583 g2d->current_pool = 0; in g2d_userptr_free_all()
687 static int g2d_map_cmdlist_gem(struct g2d_data *g2d, in g2d_map_cmdlist_gem() argument
777 static void g2d_unmap_cmdlist_gem(struct g2d_data *g2d, in g2d_unmap_cmdlist_gem() argument
781 struct exynos_drm_subdrv *subdrv = &g2d->subdrv; in g2d_unmap_cmdlist_gem()
811 static void g2d_dma_start(struct g2d_data *g2d, in g2d_dma_start() argument
819 ret = pm_runtime_get_sync(g2d->dev); in g2d_dma_start()
823 writel_relaxed(node->dma_addr, g2d->regs + G2D_DMA_SFR_BASE_ADDR); in g2d_dma_start()
824 writel_relaxed(G2D_DMA_START, g2d->regs + G2D_DMA_COMMAND); in g2d_dma_start()
827 static struct g2d_runqueue_node *g2d_get_runqueue_node(struct g2d_data *g2d) in g2d_get_runqueue_node() argument
831 if (list_empty(&g2d->runqueue)) in g2d_get_runqueue_node()
834 runqueue_node = list_first_entry(&g2d->runqueue, in g2d_get_runqueue_node()
840 static void g2d_free_runqueue_node(struct g2d_data *g2d, in g2d_free_runqueue_node() argument
848 mutex_lock(&g2d->cmdlist_mutex); in g2d_free_runqueue_node()
854 g2d_unmap_cmdlist_gem(g2d, node, runqueue_node->filp); in g2d_free_runqueue_node()
855 list_splice_tail_init(&runqueue_node->run_cmdlist, &g2d->free_cmdlist); in g2d_free_runqueue_node()
856 mutex_unlock(&g2d->cmdlist_mutex); in g2d_free_runqueue_node()
858 kmem_cache_free(g2d->runqueue_slab, runqueue_node); in g2d_free_runqueue_node()
861 static void g2d_exec_runqueue(struct g2d_data *g2d) in g2d_exec_runqueue() argument
863 g2d->runqueue_node = g2d_get_runqueue_node(g2d); in g2d_exec_runqueue()
864 if (g2d->runqueue_node) in g2d_exec_runqueue()
865 g2d_dma_start(g2d, g2d->runqueue_node); in g2d_exec_runqueue()
870 struct g2d_data *g2d = container_of(work, struct g2d_data, in g2d_runqueue_worker() local
873 mutex_lock(&g2d->runqueue_mutex); in g2d_runqueue_worker()
874 pm_runtime_put_sync(g2d->dev); in g2d_runqueue_worker()
876 complete(&g2d->runqueue_node->complete); in g2d_runqueue_worker()
877 if (g2d->runqueue_node->async) in g2d_runqueue_worker()
878 g2d_free_runqueue_node(g2d, g2d->runqueue_node); in g2d_runqueue_worker()
880 if (g2d->suspended) in g2d_runqueue_worker()
881 g2d->runqueue_node = NULL; in g2d_runqueue_worker()
883 g2d_exec_runqueue(g2d); in g2d_runqueue_worker()
884 mutex_unlock(&g2d->runqueue_mutex); in g2d_runqueue_worker()
887 static void g2d_finish_event(struct g2d_data *g2d, u32 cmdlist_no) in g2d_finish_event() argument
889 struct drm_device *drm_dev = g2d->subdrv.drm_dev; in g2d_finish_event()
890 struct g2d_runqueue_node *runqueue_node = g2d->runqueue_node; in g2d_finish_event()
914 struct g2d_data *g2d = dev_id; in g2d_irq_handler() local
917 pending = readl_relaxed(g2d->regs + G2D_INTC_PEND); in g2d_irq_handler()
919 writel_relaxed(pending, g2d->regs + G2D_INTC_PEND); in g2d_irq_handler()
922 u32 cmdlist_no = readl_relaxed(g2d->regs + G2D_DMA_STATUS); in g2d_irq_handler()
927 g2d_finish_event(g2d, cmdlist_no); in g2d_irq_handler()
929 writel_relaxed(0, g2d->regs + G2D_DMA_HOLD_CMD); in g2d_irq_handler()
932 g2d->regs + G2D_DMA_COMMAND); in g2d_irq_handler()
937 queue_work(g2d->g2d_workq, &g2d->runqueue_work); in g2d_irq_handler()
1051 struct g2d_data *g2d; in exynos_g2d_get_ver_ioctl() local
1061 g2d = dev_get_drvdata(dev); in exynos_g2d_get_ver_ioctl()
1062 if (!g2d) in exynos_g2d_get_ver_ioctl()
1078 struct g2d_data *g2d; in exynos_g2d_set_cmdlist_ioctl() local
1095 g2d = dev_get_drvdata(dev); in exynos_g2d_set_cmdlist_ioctl()
1096 if (!g2d) in exynos_g2d_set_cmdlist_ioctl()
1099 node = g2d_get_cmdlist(g2d); in exynos_g2d_set_cmdlist_ioctl()
1210 ret = g2d_map_cmdlist_gem(g2d, node, drm_dev, file); in exynos_g2d_set_cmdlist_ioctl()
1229 g2d_unmap_cmdlist_gem(g2d, node, file); in exynos_g2d_set_cmdlist_ioctl()
1238 g2d_put_cmdlist(g2d, node); in exynos_g2d_set_cmdlist_ioctl()
1249 struct g2d_data *g2d; in exynos_g2d_exec_ioctl() local
1262 g2d = dev_get_drvdata(dev); in exynos_g2d_exec_ioctl()
1263 if (!g2d) in exynos_g2d_exec_ioctl()
1266 runqueue_node = kmem_cache_alloc(g2d->runqueue_slab, GFP_KERNEL); in exynos_g2d_exec_ioctl()
1283 kmem_cache_free(g2d->runqueue_slab, runqueue_node); in exynos_g2d_exec_ioctl()
1287 mutex_lock(&g2d->runqueue_mutex); in exynos_g2d_exec_ioctl()
1290 list_add_tail(&runqueue_node->list, &g2d->runqueue); in exynos_g2d_exec_ioctl()
1291 if (!g2d->runqueue_node) in exynos_g2d_exec_ioctl()
1292 g2d_exec_runqueue(g2d); in exynos_g2d_exec_ioctl()
1293 mutex_unlock(&g2d->runqueue_mutex); in exynos_g2d_exec_ioctl()
1299 g2d_free_runqueue_node(g2d, runqueue_node); in exynos_g2d_exec_ioctl()
1308 struct g2d_data *g2d; in g2d_subdrv_probe() local
1311 g2d = dev_get_drvdata(dev); in g2d_subdrv_probe()
1312 if (!g2d) in g2d_subdrv_probe()
1316 ret = g2d_init_cmdlist(g2d); in g2d_subdrv_probe()
1328 g2d_fini_cmdlist(g2d); in g2d_subdrv_probe()
1368 struct g2d_data *g2d; in g2d_close() local
1374 g2d = dev_get_drvdata(dev); in g2d_close()
1375 if (!g2d) in g2d_close()
1378 mutex_lock(&g2d->cmdlist_mutex); in g2d_close()
1387 g2d_unmap_cmdlist_gem(g2d, node, file); in g2d_close()
1388 list_move_tail(&node->list, &g2d->free_cmdlist); in g2d_close()
1390 mutex_unlock(&g2d->cmdlist_mutex); in g2d_close()
1393 g2d_userptr_free_all(drm_dev, g2d, file); in g2d_close()
1402 struct g2d_data *g2d; in g2d_probe() local
1406 g2d = devm_kzalloc(dev, sizeof(*g2d), GFP_KERNEL); in g2d_probe()
1407 if (!g2d) in g2d_probe()
1410 g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab", in g2d_probe()
1412 if (!g2d->runqueue_slab) in g2d_probe()
1415 g2d->dev = dev; in g2d_probe()
1417 g2d->g2d_workq = create_singlethread_workqueue("g2d"); in g2d_probe()
1418 if (!g2d->g2d_workq) { in g2d_probe()
1424 INIT_WORK(&g2d->runqueue_work, g2d_runqueue_worker); in g2d_probe()
1425 INIT_LIST_HEAD(&g2d->free_cmdlist); in g2d_probe()
1426 INIT_LIST_HEAD(&g2d->runqueue); in g2d_probe()
1428 mutex_init(&g2d->cmdlist_mutex); in g2d_probe()
1429 mutex_init(&g2d->runqueue_mutex); in g2d_probe()
1431 g2d->gate_clk = devm_clk_get(dev, "fimg2d"); in g2d_probe()
1432 if (IS_ERR(g2d->gate_clk)) { in g2d_probe()
1434 ret = PTR_ERR(g2d->gate_clk); in g2d_probe()
1442 g2d->regs = devm_ioremap_resource(dev, res); in g2d_probe()
1443 if (IS_ERR(g2d->regs)) { in g2d_probe()
1444 ret = PTR_ERR(g2d->regs); in g2d_probe()
1448 g2d->irq = platform_get_irq(pdev, 0); in g2d_probe()
1449 if (g2d->irq < 0) { in g2d_probe()
1451 ret = g2d->irq; in g2d_probe()
1455 ret = devm_request_irq(dev, g2d->irq, g2d_irq_handler, 0, in g2d_probe()
1456 "drm_g2d", g2d); in g2d_probe()
1462 g2d->max_pool = MAX_POOL; in g2d_probe()
1464 platform_set_drvdata(pdev, g2d); in g2d_probe()
1466 subdrv = &g2d->subdrv; in g2d_probe()
1487 destroy_workqueue(g2d->g2d_workq); in g2d_probe()
1489 kmem_cache_destroy(g2d->runqueue_slab); in g2d_probe()
1495 struct g2d_data *g2d = platform_get_drvdata(pdev); in g2d_remove() local
1497 cancel_work_sync(&g2d->runqueue_work); in g2d_remove()
1498 exynos_drm_subdrv_unregister(&g2d->subdrv); in g2d_remove()
1500 while (g2d->runqueue_node) { in g2d_remove()
1501 g2d_free_runqueue_node(g2d, g2d->runqueue_node); in g2d_remove()
1502 g2d->runqueue_node = g2d_get_runqueue_node(g2d); in g2d_remove()
1507 g2d_fini_cmdlist(g2d); in g2d_remove()
1508 destroy_workqueue(g2d->g2d_workq); in g2d_remove()
1509 kmem_cache_destroy(g2d->runqueue_slab); in g2d_remove()
1517 struct g2d_data *g2d = dev_get_drvdata(dev); in g2d_suspend() local
1519 mutex_lock(&g2d->runqueue_mutex); in g2d_suspend()
1520 g2d->suspended = true; in g2d_suspend()
1521 mutex_unlock(&g2d->runqueue_mutex); in g2d_suspend()
1523 while (g2d->runqueue_node) in g2d_suspend()
1527 flush_work(&g2d->runqueue_work); in g2d_suspend()
1534 struct g2d_data *g2d = dev_get_drvdata(dev); in g2d_resume() local
1536 g2d->suspended = false; in g2d_resume()
1537 g2d_exec_runqueue(g2d); in g2d_resume()
1546 struct g2d_data *g2d = dev_get_drvdata(dev); in g2d_runtime_suspend() local
1548 clk_disable_unprepare(g2d->gate_clk); in g2d_runtime_suspend()
1555 struct g2d_data *g2d = dev_get_drvdata(dev); in g2d_runtime_resume() local
1558 ret = clk_prepare_enable(g2d->gate_clk); in g2d_runtime_resume()