Lines Matching defs:g2d
264 static inline void g2d_hw_reset(struct g2d_data *g2d)
266 writel(G2D_R | G2D_SFRCLEAR, g2d->regs + G2D_SOFT_RESET);
267 clear_bit(G2D_BIT_ENGINE_BUSY, &g2d->flags);
270 static int g2d_init_cmdlist(struct g2d_data *g2d)
272 struct device *dev = g2d->dev;
278 g2d->cmdlist_dma_attrs = DMA_ATTR_WRITE_COMBINE;
280 g2d->cmdlist_pool_virt = dma_alloc_attrs(to_dma_dev(g2d->drm_dev),
282 &g2d->cmdlist_pool, GFP_KERNEL,
283 g2d->cmdlist_dma_attrs);
284 if (!g2d->cmdlist_pool_virt) {
299 g2d->cmdlist_pool_virt + nr * G2D_CMDLIST_SIZE;
301 g2d->cmdlist_pool + nr * G2D_CMDLIST_SIZE;
307 list_add_tail(&node[nr].list, &g2d->free_cmdlist);
313 dma_free_attrs(to_dma_dev(g2d->drm_dev), G2D_CMDLIST_POOL_SIZE,
314 g2d->cmdlist_pool_virt,
315 g2d->cmdlist_pool, g2d->cmdlist_dma_attrs);
319 static void g2d_fini_cmdlist(struct g2d_data *g2d)
321 kfree(g2d->cmdlist_node);
323 if (g2d->cmdlist_pool_virt && g2d->cmdlist_pool) {
324 dma_free_attrs(to_dma_dev(g2d->drm_dev),
326 g2d->cmdlist_pool_virt,
327 g2d->cmdlist_pool, g2d->cmdlist_dma_attrs);
331 static struct g2d_cmdlist_node *g2d_get_cmdlist(struct g2d_data *g2d)
333 struct device *dev = g2d->dev;
336 mutex_lock(&g2d->cmdlist_mutex);
337 if (list_empty(&g2d->free_cmdlist)) {
339 mutex_unlock(&g2d->cmdlist_mutex);
343 node = list_first_entry(&g2d->free_cmdlist, struct g2d_cmdlist_node,
346 mutex_unlock(&g2d->cmdlist_mutex);
351 static void g2d_put_cmdlist(struct g2d_data *g2d, struct g2d_cmdlist_node *node)
353 mutex_lock(&g2d->cmdlist_mutex);
354 list_move_tail(&node->list, &g2d->free_cmdlist);
355 mutex_unlock(&g2d->cmdlist_mutex);
378 static void g2d_userptr_put_dma_addr(struct g2d_data *g2d,
399 dma_unmap_sgtable(to_dma_dev(g2d->drm_dev), g2d_userptr->sgt,
414 static dma_addr_t *g2d_userptr_get_dma_addr(struct g2d_data *g2d,
428 DRM_DEV_ERROR(g2d->dev, "invalid userptr size.\n");
447 * at this moment, maybe g2d dma is accessing this
483 DRM_DEV_ERROR(g2d->dev,
503 DRM_DEV_ERROR(g2d->dev, "failed to get sgt from pages.\n");
509 ret = dma_map_sgtable(to_dma_dev(g2d->drm_dev), sgt,
512 DRM_DEV_ERROR(g2d->dev, "failed to map sgt with dma region.\n");
521 if (g2d->current_pool + (npages << PAGE_SHIFT) < g2d->max_pool) {
522 g2d->current_pool += npages << PAGE_SHIFT;
548 static void g2d_userptr_free_all(struct g2d_data *g2d, struct drm_file *filp)
555 g2d_userptr_put_dma_addr(g2d, g2d_userptr, true);
557 g2d->current_pool = 0;
560 static enum g2d_reg_type g2d_get_reg_type(struct g2d_data *g2d, int reg_offset)
593 DRM_DEV_ERROR(g2d->dev, "Unknown register offset![%d]\n",
628 static bool g2d_check_buf_desc_is_valid(struct g2d_data *g2d,
646 DRM_DEV_ERROR(g2d->dev, "width[%d] is out of range!\n", width);
653 DRM_DEV_ERROR(g2d->dev,
673 DRM_DEV_ERROR(g2d->dev, "last engine access position [%lu] "
681 static int g2d_map_cmdlist_gem(struct g2d_data *g2d,
704 reg_type = g2d_get_reg_type(g2d, offset);
721 if (!g2d_check_buf_desc_is_valid(g2d, buf_desc,
739 if (!g2d_check_buf_desc_is_valid(g2d, buf_desc,
746 addr = g2d_userptr_get_dma_addr(g2d,
768 static void g2d_unmap_cmdlist_gem(struct g2d_data *g2d,
788 g2d_userptr_put_dma_addr(g2d, obj, false);
799 static void g2d_dma_start(struct g2d_data *g2d,
806 set_bit(G2D_BIT_ENGINE_BUSY, &g2d->flags);
807 writel_relaxed(node->dma_addr, g2d->regs + G2D_DMA_SFR_BASE_ADDR);
808 writel_relaxed(G2D_DMA_START, g2d->regs + G2D_DMA_COMMAND);
811 static struct g2d_runqueue_node *g2d_get_runqueue_node(struct g2d_data *g2d)
815 if (list_empty(&g2d->runqueue))
818 runqueue_node = list_first_entry(&g2d->runqueue,
824 static void g2d_free_runqueue_node(struct g2d_data *g2d,
829 mutex_lock(&g2d->cmdlist_mutex);
835 g2d_unmap_cmdlist_gem(g2d, node, runqueue_node->filp);
836 list_splice_tail_init(&runqueue_node->run_cmdlist, &g2d->free_cmdlist);
837 mutex_unlock(&g2d->cmdlist_mutex);
839 kmem_cache_free(g2d->runqueue_slab, runqueue_node);
844 * @g2d: G2D state object
849 static void g2d_remove_runqueue_nodes(struct g2d_data *g2d, struct drm_file *file)
853 if (list_empty(&g2d->runqueue))
856 list_for_each_entry_safe(node, n, &g2d->runqueue, list) {
861 g2d_free_runqueue_node(g2d, node);
867 struct g2d_data *g2d = container_of(work, struct g2d_data,
875 if (test_bit(G2D_BIT_ENGINE_BUSY, &g2d->flags))
878 mutex_lock(&g2d->runqueue_mutex);
880 runqueue_node = g2d->runqueue_node;
881 g2d->runqueue_node = NULL;
884 pm_runtime_mark_last_busy(g2d->dev);
885 pm_runtime_put_autosuspend(g2d->dev);
889 g2d_free_runqueue_node(g2d, runqueue_node);
892 if (!test_bit(G2D_BIT_SUSPEND_RUNQUEUE, &g2d->flags)) {
893 g2d->runqueue_node = g2d_get_runqueue_node(g2d);
895 if (g2d->runqueue_node) {
898 ret = pm_runtime_resume_and_get(g2d->dev);
900 dev_err(g2d->dev, "failed to enable G2D device.\n");
904 g2d_dma_start(g2d, g2d->runqueue_node);
909 mutex_unlock(&g2d->runqueue_mutex);
912 static void g2d_finish_event(struct g2d_data *g2d, u32 cmdlist_no)
914 struct drm_device *drm_dev = g2d->drm_dev;
915 struct g2d_runqueue_node *runqueue_node = g2d->runqueue_node;
935 struct g2d_data *g2d = dev_id;
938 pending = readl_relaxed(g2d->regs + G2D_INTC_PEND);
940 writel_relaxed(pending, g2d->regs + G2D_INTC_PEND);
943 u32 cmdlist_no = readl_relaxed(g2d->regs + G2D_DMA_STATUS);
948 g2d_finish_event(g2d, cmdlist_no);
950 writel_relaxed(0, g2d->regs + G2D_DMA_HOLD_CMD);
953 g2d->regs + G2D_DMA_COMMAND);
958 clear_bit(G2D_BIT_ENGINE_BUSY, &g2d->flags);
959 queue_work(g2d->g2d_workq, &g2d->runqueue_work);
967 * @g2d: G2D state object
974 static void g2d_wait_finish(struct g2d_data *g2d, struct drm_file *file)
976 struct device *dev = g2d->dev;
981 mutex_lock(&g2d->runqueue_mutex);
984 if (!g2d->runqueue_node)
987 runqueue_node = g2d->runqueue_node;
993 mutex_unlock(&g2d->runqueue_mutex);
996 while (tries-- && (g2d->runqueue_node == runqueue_node))
999 mutex_lock(&g2d->runqueue_mutex);
1001 if (g2d->runqueue_node != runqueue_node)
1005 g2d_hw_reset(g2d);
1017 g2d_free_runqueue_node(g2d, runqueue_node);
1020 mutex_unlock(&g2d->runqueue_mutex);
1023 static int g2d_check_reg_offset(struct g2d_data *g2d,
1056 reg_type = g2d_get_reg_type(g2d, reg_offset);
1070 reg_type = g2d_get_reg_type(g2d, reg_offset);
1080 reg_type = g2d_get_reg_type(g2d, reg_offset);
1092 reg_type = g2d_get_reg_type(g2d, reg_offset);
1105 reg_type = g2d_get_reg_type(g2d, reg_offset);
1123 dev_err(g2d->dev, "Bad register offset: 0x%lx\n", cmdlist->data[index]);
1144 struct g2d_data *g2d = dev_get_drvdata(priv->g2d_dev);
1153 node = g2d_get_cmdlist(g2d);
1164 dev_err(g2d->dev, "number of submitted G2D commands exceeds limit\n");
1232 dev_err(g2d->dev, "cmdlist size is too big\n");
1247 ret = g2d_check_reg_offset(g2d, node, req->cmd_nr, false);
1266 ret = g2d_check_reg_offset(g2d, node, req->cmd_buf_nr, true);
1270 ret = g2d_map_cmdlist_gem(g2d, node, drm_dev, file);
1289 g2d_unmap_cmdlist_gem(g2d, node, file);
1294 g2d_put_cmdlist(g2d, node);
1303 struct g2d_data *g2d = dev_get_drvdata(priv->g2d_dev);
1309 runqueue_node = kmem_cache_alloc(g2d->runqueue_slab, GFP_KERNEL);
1324 dev_err(g2d->dev, "there is no inuse cmdlist\n");
1325 kmem_cache_free(g2d->runqueue_slab, runqueue_node);
1329 mutex_lock(&g2d->runqueue_mutex);
1332 list_add_tail(&runqueue_node->list, &g2d->runqueue);
1333 mutex_unlock(&g2d->runqueue_mutex);
1336 queue_work(g2d->g2d_workq, &g2d->runqueue_work);
1342 g2d_free_runqueue_node(g2d, runqueue_node);
1363 struct g2d_data *g2d;
1369 g2d = dev_get_drvdata(priv->g2d_dev);
1372 mutex_lock(&g2d->runqueue_mutex);
1373 g2d_remove_runqueue_nodes(g2d, file);
1374 mutex_unlock(&g2d->runqueue_mutex);
1381 g2d_wait_finish(g2d, file);
1389 mutex_lock(&g2d->cmdlist_mutex);
1391 g2d_unmap_cmdlist_gem(g2d, node, file);
1392 list_move_tail(&node->list, &g2d->free_cmdlist);
1394 mutex_unlock(&g2d->cmdlist_mutex);
1397 g2d_userptr_free_all(g2d, file);
1402 struct g2d_data *g2d = dev_get_drvdata(dev);
1407 g2d->drm_dev = drm_dev;
1410 ret = g2d_init_cmdlist(g2d);
1416 ret = exynos_drm_register_dma(drm_dev, dev, &g2d->dma_priv);
1419 g2d_fini_cmdlist(g2d);
1431 struct g2d_data *g2d = dev_get_drvdata(dev);
1436 set_bit(G2D_BIT_SUSPEND_RUNQUEUE, &g2d->flags);
1437 g2d_wait_finish(g2d, NULL);
1440 cancel_work_sync(&g2d->runqueue_work);
1441 exynos_drm_unregister_dma(g2d->drm_dev, dev, &g2d->dma_priv);
1452 struct g2d_data *g2d;
1455 g2d = devm_kzalloc(dev, sizeof(*g2d), GFP_KERNEL);
1456 if (!g2d)
1459 g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab",
1461 if (!g2d->runqueue_slab)
1464 g2d->dev = dev;
1466 g2d->g2d_workq = create_singlethread_workqueue("g2d");
1467 if (!g2d->g2d_workq) {
1473 INIT_WORK(&g2d->runqueue_work, g2d_runqueue_worker);
1474 INIT_LIST_HEAD(&g2d->free_cmdlist);
1475 INIT_LIST_HEAD(&g2d->runqueue);
1477 mutex_init(&g2d->cmdlist_mutex);
1478 mutex_init(&g2d->runqueue_mutex);
1480 g2d->gate_clk = devm_clk_get(dev, "fimg2d");
1481 if (IS_ERR(g2d->gate_clk)) {
1483 ret = PTR_ERR(g2d->gate_clk);
1490 clear_bit(G2D_BIT_SUSPEND_RUNQUEUE, &g2d->flags);
1491 clear_bit(G2D_BIT_ENGINE_BUSY, &g2d->flags);
1493 g2d->regs = devm_platform_ioremap_resource(pdev, 0);
1494 if (IS_ERR(g2d->regs)) {
1495 ret = PTR_ERR(g2d->regs);
1499 g2d->irq = platform_get_irq(pdev, 0);
1500 if (g2d->irq < 0) {
1501 ret = g2d->irq;
1505 ret = devm_request_irq(dev, g2d->irq, g2d_irq_handler, 0,
1506 "drm_g2d", g2d);
1512 g2d->max_pool = MAX_POOL;
1514 platform_set_drvdata(pdev, g2d);
1518 dev_err(dev, "failed to register drm g2d device\n");
1527 destroy_workqueue(g2d->g2d_workq);
1529 kmem_cache_destroy(g2d->runqueue_slab);
1535 struct g2d_data *g2d = platform_get_drvdata(pdev);
1540 g2d_remove_runqueue_nodes(g2d, NULL);
1545 g2d_fini_cmdlist(g2d);
1546 destroy_workqueue(g2d->g2d_workq);
1547 kmem_cache_destroy(g2d->runqueue_slab);
1552 struct g2d_data *g2d = dev_get_drvdata(dev);
1558 set_bit(G2D_BIT_SUSPEND_RUNQUEUE, &g2d->flags);
1559 g2d_wait_finish(g2d, NULL);
1560 flush_work(&g2d->runqueue_work);
1567 struct g2d_data *g2d = dev_get_drvdata(dev);
1569 clear_bit(G2D_BIT_SUSPEND_RUNQUEUE, &g2d->flags);
1570 queue_work(g2d->g2d_workq, &g2d->runqueue_work);
1577 struct g2d_data *g2d = dev_get_drvdata(dev);
1579 clk_disable_unprepare(g2d->gate_clk);
1586 struct g2d_data *g2d = dev_get_drvdata(dev);
1589 ret = clk_prepare_enable(g2d->gate_clk);
1602 { .compatible = "samsung,exynos5250-g2d" },
1603 { .compatible = "samsung,exynos4212-g2d" },
1612 .name = "exynos-drm-g2d",