Lines Matching refs:hqvdp

378 static int sti_hqvdp_get_free_cmd(struct sti_hqvdp *hqvdp)  in sti_hqvdp_get_free_cmd()  argument
381 u32 cmd = hqvdp->hqvdp_cmd_paddr; in sti_hqvdp_get_free_cmd()
384 curr_cmd = readl(hqvdp->regs + HQVDP_MBX_CURRENT_CMD); in sti_hqvdp_get_free_cmd()
385 next_cmd = readl(hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_get_free_cmd()
406 static int sti_hqvdp_get_curr_cmd(struct sti_hqvdp *hqvdp) in sti_hqvdp_get_curr_cmd() argument
409 u32 cmd = hqvdp->hqvdp_cmd_paddr; in sti_hqvdp_get_curr_cmd()
412 curr_cmd = readl(hqvdp->regs + HQVDP_MBX_CURRENT_CMD); in sti_hqvdp_get_curr_cmd()
434 static int sti_hqvdp_get_next_cmd(struct sti_hqvdp *hqvdp) in sti_hqvdp_get_next_cmd() argument
437 dma_addr_t cmd = hqvdp->hqvdp_cmd_paddr; in sti_hqvdp_get_next_cmd()
440 next_cmd = readl(hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_get_next_cmd()
453 readl(hqvdp->regs + reg))
568 struct sti_hqvdp *hqvdp = (struct sti_hqvdp *)node->info_ent->data; in hqvdp_dbg_show() local
573 sti_plane_to_str(&hqvdp->plane), hqvdp->regs); in hqvdp_dbg_show()
579 infoxp70 = readl(hqvdp->regs + HQVDP_MBX_INFO_XP70); in hqvdp_dbg_show()
592 if (readl(hqvdp->regs + HQVDP_MBX_STARTUP_CTRL1) in hqvdp_dbg_show()
598 if (readl(hqvdp->regs + HQVDP_MBX_STARTUP_CTRL2) in hqvdp_dbg_show()
607 if (!(readl(hqvdp->regs + HQVDP_MBX_SOFT_VSYNC) & 3)) in hqvdp_dbg_show()
613 cmd = readl(hqvdp->regs + HQVDP_MBX_CURRENT_CMD); in hqvdp_dbg_show()
614 cmd_offset = sti_hqvdp_get_curr_cmd(hqvdp); in hqvdp_dbg_show()
618 virt = hqvdp->hqvdp_cmd + cmd_offset; in hqvdp_dbg_show()
625 cmd = readl(hqvdp->regs + HQVDP_MBX_NEXT_CMD); in hqvdp_dbg_show()
626 cmd_offset = sti_hqvdp_get_next_cmd(hqvdp); in hqvdp_dbg_show()
630 virt = hqvdp->hqvdp_cmd + cmd_offset; in hqvdp_dbg_show()
644 static void hqvdp_debugfs_init(struct sti_hqvdp *hqvdp, struct drm_minor *minor) in hqvdp_debugfs_init() argument
649 hqvdp_debugfs_files[i].data = hqvdp; in hqvdp_debugfs_init()
734 static bool sti_hqvdp_check_hw_scaling(struct sti_hqvdp *hqvdp, in sti_hqvdp_check_hw_scaling() argument
742 lfw = mode->htotal * (clk_get_rate(hqvdp->clk) / 1000000); in sti_hqvdp_check_hw_scaling()
756 static void sti_hqvdp_disable(struct sti_hqvdp *hqvdp) in sti_hqvdp_disable() argument
760 DRM_DEBUG_DRIVER("%s\n", sti_plane_to_str(&hqvdp->plane)); in sti_hqvdp_disable()
763 if (sti_vtg_unregister_client(hqvdp->vtg, &hqvdp->vtg_nb)) in sti_hqvdp_disable()
767 writel(0, hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_disable()
770 if (readl(hqvdp->regs + HQVDP_MBX_INFO_XP70) in sti_hqvdp_disable()
777 clk_disable_unprepare(hqvdp->clk_pix_main); in sti_hqvdp_disable()
782 hqvdp->plane.status = STI_PLANE_DISABLED; in sti_hqvdp_disable()
783 hqvdp->vtg_registered = false; in sti_hqvdp_disable()
799 struct sti_hqvdp *hqvdp = container_of(nb, struct sti_hqvdp, vtg_nb); in sti_hqvdp_vtg_cb() local
808 if (hqvdp->plane.status == STI_PLANE_FLUSHING) { in sti_hqvdp_vtg_cb()
811 sti_plane_to_str(&hqvdp->plane)); in sti_hqvdp_vtg_cb()
813 sti_hqvdp_disable(hqvdp); in sti_hqvdp_vtg_cb()
816 if (hqvdp->btm_field_pending) { in sti_hqvdp_vtg_cb()
818 btm_cmd_offset = sti_hqvdp_get_free_cmd(hqvdp); in sti_hqvdp_vtg_cb()
819 top_cmd_offest = sti_hqvdp_get_curr_cmd(hqvdp); in sti_hqvdp_vtg_cb()
825 btm_cmd = hqvdp->hqvdp_cmd + btm_cmd_offset; in sti_hqvdp_vtg_cb()
826 top_cmd = hqvdp->hqvdp_cmd + top_cmd_offest; in sti_hqvdp_vtg_cb()
837 writel(hqvdp->hqvdp_cmd_paddr + btm_cmd_offset, in sti_hqvdp_vtg_cb()
838 hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_vtg_cb()
840 hqvdp->btm_field_pending = false; in sti_hqvdp_vtg_cb()
842 dev_dbg(hqvdp->dev, "%s Posted command:0x%x\n", in sti_hqvdp_vtg_cb()
843 __func__, hqvdp->hqvdp_cmd_paddr); in sti_hqvdp_vtg_cb()
845 sti_plane_update_fps(&hqvdp->plane, false, true); in sti_hqvdp_vtg_cb()
851 static void sti_hqvdp_init(struct sti_hqvdp *hqvdp) in sti_hqvdp_init() argument
856 hqvdp->vtg_nb.notifier_call = sti_hqvdp_vtg_cb; in sti_hqvdp_init()
860 hqvdp->hqvdp_cmd = dma_alloc_wc(hqvdp->dev, size, in sti_hqvdp_init()
863 if (!hqvdp->hqvdp_cmd) { in sti_hqvdp_init()
868 hqvdp->hqvdp_cmd_paddr = (u32)dma_addr; in sti_hqvdp_init()
869 memset(hqvdp->hqvdp_cmd, 0, size); in sti_hqvdp_init()
872 static void sti_hqvdp_init_plugs(struct sti_hqvdp *hqvdp) in sti_hqvdp_init_plugs() argument
875 writel(PLUG_PAGE_SIZE_256, hqvdp->regs + HQVDP_RD_PLUG_PAGE_SIZE); in sti_hqvdp_init_plugs()
876 writel(PLUG_MIN_OPC_8, hqvdp->regs + HQVDP_RD_PLUG_MIN_OPC); in sti_hqvdp_init_plugs()
877 writel(PLUG_MAX_OPC_64, hqvdp->regs + HQVDP_RD_PLUG_MAX_OPC); in sti_hqvdp_init_plugs()
878 writel(PLUG_MAX_CHK_2X, hqvdp->regs + HQVDP_RD_PLUG_MAX_CHK); in sti_hqvdp_init_plugs()
879 writel(PLUG_MAX_MSG_1X, hqvdp->regs + HQVDP_RD_PLUG_MAX_MSG); in sti_hqvdp_init_plugs()
880 writel(PLUG_MIN_SPACE_1, hqvdp->regs + HQVDP_RD_PLUG_MIN_SPACE); in sti_hqvdp_init_plugs()
881 writel(PLUG_CONTROL_ENABLE, hqvdp->regs + HQVDP_RD_PLUG_CONTROL); in sti_hqvdp_init_plugs()
883 writel(PLUG_PAGE_SIZE_256, hqvdp->regs + HQVDP_WR_PLUG_PAGE_SIZE); in sti_hqvdp_init_plugs()
884 writel(PLUG_MIN_OPC_8, hqvdp->regs + HQVDP_WR_PLUG_MIN_OPC); in sti_hqvdp_init_plugs()
885 writel(PLUG_MAX_OPC_64, hqvdp->regs + HQVDP_WR_PLUG_MAX_OPC); in sti_hqvdp_init_plugs()
886 writel(PLUG_MAX_CHK_2X, hqvdp->regs + HQVDP_WR_PLUG_MAX_CHK); in sti_hqvdp_init_plugs()
887 writel(PLUG_MAX_MSG_1X, hqvdp->regs + HQVDP_WR_PLUG_MAX_MSG); in sti_hqvdp_init_plugs()
888 writel(PLUG_MIN_SPACE_1, hqvdp->regs + HQVDP_WR_PLUG_MIN_SPACE); in sti_hqvdp_init_plugs()
889 writel(PLUG_CONTROL_ENABLE, hqvdp->regs + HQVDP_WR_PLUG_CONTROL); in sti_hqvdp_init_plugs()
898 static void sti_hqvdp_start_xp70(struct sti_hqvdp *hqvdp) in sti_hqvdp_start_xp70() argument
913 if (hqvdp->xp70_initialized) { in sti_hqvdp_start_xp70()
919 if (request_firmware(&firmware, HQVDP_FMW_NAME, hqvdp->dev)) { in sti_hqvdp_start_xp70()
955 if (clk_prepare_enable(hqvdp->clk)) in sti_hqvdp_start_xp70()
959 writel(SW_RESET_CTRL_FULL, hqvdp->regs + HQVDP_MBX_SW_RESET_CTRL); in sti_hqvdp_start_xp70()
962 if (readl(hqvdp->regs + HQVDP_MBX_STARTUP_CTRL1) in sti_hqvdp_start_xp70()
969 clk_disable_unprepare(hqvdp->clk); in sti_hqvdp_start_xp70()
975 writel(fw_rd_plug[i], hqvdp->regs + HQVDP_RD_PLUG + i * 4); in sti_hqvdp_start_xp70()
977 writel(fw_wr_plug[i], hqvdp->regs + HQVDP_WR_PLUG + i * 4); in sti_hqvdp_start_xp70()
979 sti_hqvdp_init_plugs(hqvdp); in sti_hqvdp_start_xp70()
982 writel(STARTUP_CTRL1_AUTH_IDLE, hqvdp->regs + HQVDP_MBX_STARTUP_CTRL1); in sti_hqvdp_start_xp70()
985 writel(SOFT_VSYNC_SW_CTRL_IRQ, hqvdp->regs + HQVDP_MBX_SOFT_VSYNC); in sti_hqvdp_start_xp70()
986 writel(0, hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_start_xp70()
990 writel(fw_pmem[i], hqvdp->regs + HQVDP_PMEM + i * 4); in sti_hqvdp_start_xp70()
992 writel(fw_dmem[i], hqvdp->regs + HQVDP_DMEM + i * 4); in sti_hqvdp_start_xp70()
995 writel(STARTUP_CTRL2_FETCH_EN, hqvdp->regs + HQVDP_MBX_STARTUP_CTRL2); in sti_hqvdp_start_xp70()
999 if (readl(hqvdp->regs + HQVDP_MBX_INFO_XP70) in sti_hqvdp_start_xp70()
1006 clk_disable_unprepare(hqvdp->clk); in sti_hqvdp_start_xp70()
1011 writel(SOFT_VSYNC_HW, hqvdp->regs + HQVDP_MBX_SOFT_VSYNC); in sti_hqvdp_start_xp70()
1015 hqvdp->xp70_initialized = true; in sti_hqvdp_start_xp70()
1027 struct sti_hqvdp *hqvdp = to_sti_hqvdp(plane); in sti_hqvdp_atomic_check() local
1051 if (mode->clock && !sti_hqvdp_check_hw_scaling(hqvdp, mode, in sti_hqvdp_atomic_check()
1080 if (!hqvdp->xp70_initialized) in sti_hqvdp_atomic_check()
1082 sti_hqvdp_start_xp70(hqvdp); in sti_hqvdp_atomic_check()
1084 if (!hqvdp->vtg_registered) { in sti_hqvdp_atomic_check()
1086 if (clk_prepare_enable(hqvdp->clk_pix_main)) { in sti_hqvdp_atomic_check()
1092 if (sti_vtg_register_client(hqvdp->vtg, in sti_hqvdp_atomic_check()
1093 &hqvdp->vtg_nb, in sti_hqvdp_atomic_check()
1096 clk_disable_unprepare(hqvdp->clk_pix_main); in sti_hqvdp_atomic_check()
1099 hqvdp->vtg_registered = true; in sti_hqvdp_atomic_check()
1121 struct sti_hqvdp *hqvdp = to_sti_hqvdp(plane); in sti_hqvdp_atomic_update() local
1161 cmd_offset = sti_hqvdp_get_free_cmd(hqvdp); in sti_hqvdp_atomic_update()
1166 cmd = hqvdp->hqvdp_cmd + cmd_offset; in sti_hqvdp_atomic_update()
1232 writel(hqvdp->hqvdp_cmd_paddr + cmd_offset, in sti_hqvdp_atomic_update()
1233 hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_atomic_update()
1237 hqvdp->btm_field_pending = true; in sti_hqvdp_atomic_update()
1239 dev_dbg(hqvdp->dev, "%s Posted command:0x%x\n", in sti_hqvdp_atomic_update()
1240 __func__, hqvdp->hqvdp_cmd_paddr + cmd_offset); in sti_hqvdp_atomic_update()
1277 struct sti_hqvdp *hqvdp = to_sti_hqvdp(plane); in sti_hqvdp_late_register() local
1279 hqvdp_debugfs_init(hqvdp, drm_plane->dev->primary); in sti_hqvdp_late_register()
1297 struct sti_hqvdp *hqvdp = dev_get_drvdata(dev); in sti_hqvdp_create() local
1300 hqvdp->plane.desc = desc; in sti_hqvdp_create()
1301 hqvdp->plane.status = STI_PLANE_DISABLED; in sti_hqvdp_create()
1303 sti_hqvdp_init(hqvdp); in sti_hqvdp_create()
1305 res = drm_universal_plane_init(drm_dev, &hqvdp->plane.drm_plane, 1, in sti_hqvdp_create()
1315 drm_plane_helper_add(&hqvdp->plane.drm_plane, &sti_hqvdp_helpers_funcs); in sti_hqvdp_create()
1317 sti_plane_init_property(&hqvdp->plane, DRM_PLANE_TYPE_OVERLAY); in sti_hqvdp_create()
1319 return &hqvdp->plane.drm_plane; in sti_hqvdp_create()
1324 struct sti_hqvdp *hqvdp = dev_get_drvdata(dev); in sti_hqvdp_bind() local
1330 hqvdp->drm_dev = drm_dev; in sti_hqvdp_bind()
1333 plane = sti_hqvdp_create(drm_dev, hqvdp->dev, STI_HQVDP_0); in sti_hqvdp_bind()
1355 struct sti_hqvdp *hqvdp; in sti_hqvdp_probe() local
1360 hqvdp = devm_kzalloc(dev, sizeof(*hqvdp), GFP_KERNEL); in sti_hqvdp_probe()
1361 if (!hqvdp) { in sti_hqvdp_probe()
1366 hqvdp->dev = dev; in sti_hqvdp_probe()
1374 hqvdp->regs = devm_ioremap(dev, res->start, resource_size(res)); in sti_hqvdp_probe()
1375 if (!hqvdp->regs) { in sti_hqvdp_probe()
1381 hqvdp->clk = devm_clk_get(dev, "hqvdp"); in sti_hqvdp_probe()
1382 hqvdp->clk_pix_main = devm_clk_get(dev, "pix_main"); in sti_hqvdp_probe()
1383 if (IS_ERR(hqvdp->clk) || IS_ERR(hqvdp->clk_pix_main)) { in sti_hqvdp_probe()
1389 hqvdp->reset = devm_reset_control_get(dev, "hqvdp"); in sti_hqvdp_probe()
1390 if (!IS_ERR(hqvdp->reset)) in sti_hqvdp_probe()
1391 reset_control_deassert(hqvdp->reset); in sti_hqvdp_probe()
1395 hqvdp->vtg = of_vtg_find(vtg_np); in sti_hqvdp_probe()
1398 platform_set_drvdata(pdev, hqvdp); in sti_hqvdp_probe()