/linux-4.4.14/drivers/media/platform/s5p-g2d/ |
H A D | Makefile | 1 s5p-g2d-objs := g2d.o g2d-hw.o 3 obj-$(CONFIG_VIDEO_SAMSUNG_S5P_G2D) += s5p-g2d.o
|
H A D | g2d-hw.c | 15 #include "g2d.h" 16 #include "g2d-regs.h" 21 /* g2d_reset clears all g2d registers */ g2d_reset()
|
H A D | g2d.c | 29 #include "g2d.h" 30 #include "g2d-regs.h" 645 dev_err(&pdev->dev, "failed to get g2d clock\n"); g2d_probe() 651 dev_err(&pdev->dev, "failed to prepare g2d clock\n"); g2d_probe() 657 dev_err(&pdev->dev, "failed to get g2d clock gate\n"); g2d_probe() 664 dev_err(&pdev->dev, "failed to prepare g2d clock gate\n"); g2d_probe() 781 .compatible = "samsung,s5pv210-g2d", 784 .compatible = "samsung,exynos4212-g2d", 793 .name = "s5p-g2d", 796 .name = "s5p-g2d-v4x",
|
H A D | g2d.h | 17 #define G2D_NAME "s5p-g2d"
|
/linux-4.4.14/drivers/gpu/drm/exynos/ |
H A D | exynos_drm_g2d.c | 250 static int g2d_init_cmdlist(struct g2d_data *g2d) g2d_init_cmdlist() argument 252 struct device *dev = g2d->dev; g2d_init_cmdlist() 253 struct g2d_cmdlist_node *node = g2d->cmdlist_node; g2d_init_cmdlist() 254 struct exynos_drm_subdrv *subdrv = &g2d->subdrv; g2d_init_cmdlist() 259 init_dma_attrs(&g2d->cmdlist_dma_attrs); g2d_init_cmdlist() 260 dma_set_attr(DMA_ATTR_WRITE_COMBINE, &g2d->cmdlist_dma_attrs); g2d_init_cmdlist() 262 g2d->cmdlist_pool_virt = dma_alloc_attrs(subdrv->drm_dev->dev, g2d_init_cmdlist() 264 &g2d->cmdlist_pool, GFP_KERNEL, g2d_init_cmdlist() 265 &g2d->cmdlist_dma_attrs); g2d_init_cmdlist() 266 if (!g2d->cmdlist_pool_virt) { g2d_init_cmdlist() 282 g2d->cmdlist_pool_virt + nr * G2D_CMDLIST_SIZE; g2d_init_cmdlist() 284 g2d->cmdlist_pool + nr * G2D_CMDLIST_SIZE; g2d_init_cmdlist() 290 list_add_tail(&node[nr].list, &g2d->free_cmdlist); g2d_init_cmdlist() 297 g2d->cmdlist_pool_virt, g2d_init_cmdlist() 298 g2d->cmdlist_pool, &g2d->cmdlist_dma_attrs); g2d_init_cmdlist() 302 static void g2d_fini_cmdlist(struct g2d_data *g2d) g2d_fini_cmdlist() argument 304 struct exynos_drm_subdrv *subdrv = &g2d->subdrv; g2d_fini_cmdlist() 306 kfree(g2d->cmdlist_node); g2d_fini_cmdlist() 308 if (g2d->cmdlist_pool_virt && g2d->cmdlist_pool) { g2d_fini_cmdlist() 310 g2d->cmdlist_pool_virt, g2d_fini_cmdlist() 311 g2d->cmdlist_pool, &g2d->cmdlist_dma_attrs); g2d_fini_cmdlist() 315 static struct g2d_cmdlist_node *g2d_get_cmdlist(struct g2d_data *g2d) g2d_get_cmdlist() argument 317 struct device *dev = g2d->dev; g2d_get_cmdlist() 320 mutex_lock(&g2d->cmdlist_mutex); g2d_get_cmdlist() 321 if (list_empty(&g2d->free_cmdlist)) { g2d_get_cmdlist() 323 mutex_unlock(&g2d->cmdlist_mutex); g2d_get_cmdlist() 327 node = list_first_entry(&g2d->free_cmdlist, struct g2d_cmdlist_node, g2d_get_cmdlist() 330 mutex_unlock(&g2d->cmdlist_mutex); g2d_get_cmdlist() 335 static void g2d_put_cmdlist(struct g2d_data *g2d, struct g2d_cmdlist_node *node) g2d_put_cmdlist() argument 337 mutex_lock(&g2d->cmdlist_mutex); g2d_put_cmdlist() 338 list_move_tail(&node->list, &g2d->free_cmdlist); g2d_put_cmdlist() 339 mutex_unlock(&g2d->cmdlist_mutex); g2d_put_cmdlist() 415 struct g2d_data *g2d; g2d_userptr_get_dma_addr() local 426 g2d = dev_get_drvdata(g2d_priv->dev); g2d_userptr_get_dma_addr() 443 * at this moment, maybe g2d dma is accessing this g2d_userptr_get_dma_addr() 515 if (g2d->current_pool + (npages << PAGE_SHIFT) < g2d->max_pool) { g2d_userptr_get_dma_addr() 516 g2d->current_pool += npages << PAGE_SHIFT; g2d_userptr_get_dma_addr() 543 struct g2d_data *g2d, g2d_userptr_free_all() 556 g2d->current_pool = 0; g2d_userptr_free_all() 677 static int g2d_map_cmdlist_gem(struct g2d_data *g2d, g2d_map_cmdlist_gem() argument 767 static void g2d_unmap_cmdlist_gem(struct g2d_data *g2d, g2d_unmap_cmdlist_gem() argument 771 struct exynos_drm_subdrv *subdrv = &g2d->subdrv; g2d_unmap_cmdlist_gem() 801 static void g2d_dma_start(struct g2d_data *g2d, g2d_dma_start() argument 809 ret = pm_runtime_get_sync(g2d->dev); g2d_dma_start() 813 writel_relaxed(node->dma_addr, g2d->regs + G2D_DMA_SFR_BASE_ADDR); g2d_dma_start() 814 writel_relaxed(G2D_DMA_START, g2d->regs + G2D_DMA_COMMAND); g2d_dma_start() 817 static struct g2d_runqueue_node *g2d_get_runqueue_node(struct g2d_data *g2d) g2d_get_runqueue_node() argument 821 if (list_empty(&g2d->runqueue)) g2d_get_runqueue_node() 824 runqueue_node = list_first_entry(&g2d->runqueue, g2d_get_runqueue_node() 830 static void g2d_free_runqueue_node(struct g2d_data *g2d, g2d_free_runqueue_node() argument 838 mutex_lock(&g2d->cmdlist_mutex); g2d_free_runqueue_node() 844 g2d_unmap_cmdlist_gem(g2d, node, runqueue_node->filp); g2d_free_runqueue_node() 845 list_splice_tail_init(&runqueue_node->run_cmdlist, &g2d->free_cmdlist); g2d_free_runqueue_node() 846 mutex_unlock(&g2d->cmdlist_mutex); g2d_free_runqueue_node() 848 kmem_cache_free(g2d->runqueue_slab, runqueue_node); g2d_free_runqueue_node() 851 static void g2d_exec_runqueue(struct g2d_data *g2d) g2d_exec_runqueue() argument 853 g2d->runqueue_node = g2d_get_runqueue_node(g2d); g2d_exec_runqueue() 854 if (g2d->runqueue_node) g2d_exec_runqueue() 855 g2d_dma_start(g2d, g2d->runqueue_node); g2d_exec_runqueue() 860 struct g2d_data *g2d = container_of(work, struct g2d_data, g2d_runqueue_worker() local 863 mutex_lock(&g2d->runqueue_mutex); g2d_runqueue_worker() 864 pm_runtime_put_sync(g2d->dev); g2d_runqueue_worker() 866 complete(&g2d->runqueue_node->complete); g2d_runqueue_worker() 867 if (g2d->runqueue_node->async) g2d_runqueue_worker() 868 g2d_free_runqueue_node(g2d, g2d->runqueue_node); g2d_runqueue_worker() 870 if (g2d->suspended) g2d_runqueue_worker() 871 g2d->runqueue_node = NULL; g2d_runqueue_worker() 873 g2d_exec_runqueue(g2d); g2d_runqueue_worker() 874 mutex_unlock(&g2d->runqueue_mutex); g2d_runqueue_worker() 877 static void g2d_finish_event(struct g2d_data *g2d, u32 cmdlist_no) g2d_finish_event() argument 879 struct drm_device *drm_dev = g2d->subdrv.drm_dev; g2d_finish_event() 880 struct g2d_runqueue_node *runqueue_node = g2d->runqueue_node; g2d_finish_event() 904 struct g2d_data *g2d = dev_id; g2d_irq_handler() local 907 pending = readl_relaxed(g2d->regs + G2D_INTC_PEND); g2d_irq_handler() 909 writel_relaxed(pending, g2d->regs + G2D_INTC_PEND); g2d_irq_handler() 912 u32 cmdlist_no = readl_relaxed(g2d->regs + G2D_DMA_STATUS); g2d_irq_handler() 917 g2d_finish_event(g2d, cmdlist_no); g2d_irq_handler() 919 writel_relaxed(0, g2d->regs + G2D_DMA_HOLD_CMD); g2d_irq_handler() 922 g2d->regs + G2D_DMA_COMMAND); g2d_irq_handler() 927 queue_work(g2d->g2d_workq, &g2d->runqueue_work); g2d_irq_handler() 1043 struct g2d_data *g2d; exynos_g2d_get_ver_ioctl() local 1053 g2d = dev_get_drvdata(dev); exynos_g2d_get_ver_ioctl() 1054 if (!g2d) exynos_g2d_get_ver_ioctl() 1069 struct g2d_data *g2d; exynos_g2d_set_cmdlist_ioctl() local 1086 g2d = dev_get_drvdata(dev); exynos_g2d_set_cmdlist_ioctl() 1087 if (!g2d) exynos_g2d_set_cmdlist_ioctl() 1090 node = g2d_get_cmdlist(g2d); exynos_g2d_set_cmdlist_ioctl() 1201 ret = g2d_map_cmdlist_gem(g2d, node, drm_dev, file); exynos_g2d_set_cmdlist_ioctl() 1220 g2d_unmap_cmdlist_gem(g2d, node, file); exynos_g2d_set_cmdlist_ioctl() 1229 g2d_put_cmdlist(g2d, node); exynos_g2d_set_cmdlist_ioctl() 1239 struct g2d_data *g2d; exynos_g2d_exec_ioctl() local 1252 g2d = dev_get_drvdata(dev); exynos_g2d_exec_ioctl() 1253 if (!g2d) exynos_g2d_exec_ioctl() 1256 runqueue_node = kmem_cache_alloc(g2d->runqueue_slab, GFP_KERNEL); exynos_g2d_exec_ioctl() 1273 kmem_cache_free(g2d->runqueue_slab, runqueue_node); exynos_g2d_exec_ioctl() 1277 mutex_lock(&g2d->runqueue_mutex); exynos_g2d_exec_ioctl() 1280 list_add_tail(&runqueue_node->list, &g2d->runqueue); exynos_g2d_exec_ioctl() 1281 if (!g2d->runqueue_node) exynos_g2d_exec_ioctl() 1282 g2d_exec_runqueue(g2d); exynos_g2d_exec_ioctl() 1283 mutex_unlock(&g2d->runqueue_mutex); exynos_g2d_exec_ioctl() 1289 g2d_free_runqueue_node(g2d, runqueue_node); exynos_g2d_exec_ioctl() 1297 struct g2d_data *g2d; g2d_subdrv_probe() local 1300 g2d = dev_get_drvdata(dev); g2d_subdrv_probe() 1301 if (!g2d) g2d_subdrv_probe() 1305 ret = g2d_init_cmdlist(g2d); g2d_subdrv_probe() 1314 g2d_fini_cmdlist(g2d); g2d_subdrv_probe() 1351 struct g2d_data *g2d; g2d_close() local 1357 g2d = dev_get_drvdata(dev); g2d_close() 1358 if (!g2d) g2d_close() 1361 mutex_lock(&g2d->cmdlist_mutex); g2d_close() 1370 g2d_unmap_cmdlist_gem(g2d, node, file); g2d_close() 1371 list_move_tail(&node->list, &g2d->free_cmdlist); g2d_close() 1373 mutex_unlock(&g2d->cmdlist_mutex); g2d_close() 1376 g2d_userptr_free_all(drm_dev, g2d, file); g2d_close() 1385 struct g2d_data *g2d; g2d_probe() local 1389 g2d = devm_kzalloc(dev, sizeof(*g2d), GFP_KERNEL); g2d_probe() 1390 if (!g2d) g2d_probe() 1393 g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab", g2d_probe() 1395 if (!g2d->runqueue_slab) g2d_probe() 1398 g2d->dev = dev; g2d_probe() 1400 g2d->g2d_workq = create_singlethread_workqueue("g2d"); g2d_probe() 1401 if (!g2d->g2d_workq) { g2d_probe() 1407 INIT_WORK(&g2d->runqueue_work, g2d_runqueue_worker); g2d_probe() 1408 INIT_LIST_HEAD(&g2d->free_cmdlist); g2d_probe() 1409 INIT_LIST_HEAD(&g2d->runqueue); g2d_probe() 1411 mutex_init(&g2d->cmdlist_mutex); g2d_probe() 1412 mutex_init(&g2d->runqueue_mutex); g2d_probe() 1414 g2d->gate_clk = devm_clk_get(dev, "fimg2d"); g2d_probe() 1415 if (IS_ERR(g2d->gate_clk)) { g2d_probe() 1417 ret = PTR_ERR(g2d->gate_clk); g2d_probe() 1425 g2d->regs = devm_ioremap_resource(dev, res); g2d_probe() 1426 if (IS_ERR(g2d->regs)) { g2d_probe() 1427 ret = PTR_ERR(g2d->regs); g2d_probe() 1431 g2d->irq = platform_get_irq(pdev, 0); g2d_probe() 1432 if (g2d->irq < 0) { g2d_probe() 1434 ret = g2d->irq; g2d_probe() 1438 ret = devm_request_irq(dev, g2d->irq, g2d_irq_handler, 0, g2d_probe() 1439 "drm_g2d", g2d); g2d_probe() 1445 g2d->max_pool = MAX_POOL; g2d_probe() 1447 platform_set_drvdata(pdev, g2d); g2d_probe() 1449 subdrv = &g2d->subdrv; g2d_probe() 1458 dev_err(dev, "failed to register drm g2d device\n"); g2d_probe() 1462 dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n", g2d_probe() 1470 destroy_workqueue(g2d->g2d_workq); g2d_probe() 1472 kmem_cache_destroy(g2d->runqueue_slab); g2d_probe() 1478 struct g2d_data *g2d = platform_get_drvdata(pdev); g2d_remove() local 1480 cancel_work_sync(&g2d->runqueue_work); g2d_remove() 1481 exynos_drm_subdrv_unregister(&g2d->subdrv); g2d_remove() 1483 while (g2d->runqueue_node) { g2d_remove() 1484 g2d_free_runqueue_node(g2d, g2d->runqueue_node); g2d_remove() 1485 g2d->runqueue_node = g2d_get_runqueue_node(g2d); g2d_remove() 1490 g2d_fini_cmdlist(g2d); g2d_remove() 1491 destroy_workqueue(g2d->g2d_workq); g2d_remove() 1492 kmem_cache_destroy(g2d->runqueue_slab); g2d_remove() 1500 struct g2d_data *g2d = dev_get_drvdata(dev); g2d_suspend() local 1502 mutex_lock(&g2d->runqueue_mutex); g2d_suspend() 1503 g2d->suspended = true; g2d_suspend() 1504 mutex_unlock(&g2d->runqueue_mutex); g2d_suspend() 1506 while (g2d->runqueue_node) g2d_suspend() 1510 flush_work(&g2d->runqueue_work); g2d_suspend() 1517 struct g2d_data *g2d = dev_get_drvdata(dev); g2d_resume() local 1519 g2d->suspended = false; g2d_resume() 1520 g2d_exec_runqueue(g2d); g2d_resume() 1529 struct g2d_data *g2d = dev_get_drvdata(dev); g2d_runtime_suspend() local 1531 clk_disable_unprepare(g2d->gate_clk); g2d_runtime_suspend() 1538 struct g2d_data *g2d = dev_get_drvdata(dev); g2d_runtime_resume() local 1541 ret = clk_prepare_enable(g2d->gate_clk); g2d_runtime_resume() 1555 { .compatible = "samsung,exynos5250-g2d" }, 1556 { .compatible = "samsung,exynos4212-g2d" }, 1565 .name = "s5p-g2d", 542 g2d_userptr_free_all(struct drm_device *drm_dev, struct g2d_data *g2d, struct drm_file *filp) g2d_userptr_free_all() argument
|
H A D | exynos_drm_drv.h | 229 /* This function would be called by non kms drivers such as g2d and ipp. */
|
/linux-4.4.14/arch/arm/mach-w90x900/ |
H A D | cpu.c | 66 static DEFINE_CLK(g2d, 10); 93 DEF_CLKLOOK(&clk_g2d, "nuc900-g2d", NULL),
|
/linux-4.4.14/include/uapi/drm/ |
H A D | exynos_drm.h | 111 /* for g2d event */
|
/linux-4.4.14/drivers/clk/samsung/ |
H A D | clk-s5pv210.c | 670 GATE(CLK_G2D, "g2d", "dout_hclkd", CLK_GATE_IP0, 12, 0, 0), 732 GATE(CLK_G2D, "g2d", "dout_hclkd", CLK_GATE_IP0, 12, 0, 0),
|
H A D | clk-exynos5250.c | 486 GATE(CLK_G2D, "g2d", "div_aclk200", GATE_IP_ACP, 3, 0, 0),
|
H A D | clk-exynos4.c | 1047 GATE(CLK_G2D, "g2d", "aclk200", E4210_GATE_IP_IMAGE, 0, 0, 0), 1186 GATE(CLK_G2D, "g2d", "aclk200", GATE_IP_DMC, 23, 0, 0),
|
H A D | clk-exynos5260.c | 596 CLK_OF_DECLARE(exynos5260_clk_g2d, "samsung,exynos5260-clock-g2d",
|
H A D | clk-exynos5420.c | 898 GATE(CLK_G2D, "g2d", "aclk333_g2d", GATE_IP_G2D, 3, 0, 0),
|
H A D | clk-exynos5433.c | 2469 CLK_OF_DECLARE(exynos5433_cmu_g2d, "samsung,exynos5433-cmu-g2d",
|