Lines Matching refs:hqvdp

376 static int sti_hqvdp_get_free_cmd(struct sti_hqvdp *hqvdp)  in sti_hqvdp_get_free_cmd()  argument
379 u32 cmd = hqvdp->hqvdp_cmd_paddr; in sti_hqvdp_get_free_cmd()
382 curr_cmd = readl(hqvdp->regs + HQVDP_MBX_CURRENT_CMD); in sti_hqvdp_get_free_cmd()
383 next_cmd = readl(hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_get_free_cmd()
404 static int sti_hqvdp_get_curr_cmd(struct sti_hqvdp *hqvdp) in sti_hqvdp_get_curr_cmd() argument
407 u32 cmd = hqvdp->hqvdp_cmd_paddr; in sti_hqvdp_get_curr_cmd()
410 curr_cmd = readl(hqvdp->regs + HQVDP_MBX_CURRENT_CMD); in sti_hqvdp_get_curr_cmd()
432 static int sti_hqvdp_get_next_cmd(struct sti_hqvdp *hqvdp) in sti_hqvdp_get_next_cmd() argument
435 dma_addr_t cmd = hqvdp->hqvdp_cmd_paddr; in sti_hqvdp_get_next_cmd()
438 next_cmd = readl(hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_get_next_cmd()
451 readl(hqvdp->regs + reg))
566 struct sti_hqvdp *hqvdp = (struct sti_hqvdp *)node->info_ent->data; in hqvdp_dbg_show() local
571 sti_plane_to_str(&hqvdp->plane), hqvdp->regs); in hqvdp_dbg_show()
577 infoxp70 = readl(hqvdp->regs + HQVDP_MBX_INFO_XP70); in hqvdp_dbg_show()
590 if (readl(hqvdp->regs + HQVDP_MBX_STARTUP_CTRL1) in hqvdp_dbg_show()
596 if (readl(hqvdp->regs + HQVDP_MBX_STARTUP_CTRL2) in hqvdp_dbg_show()
605 if (!(readl(hqvdp->regs + HQVDP_MBX_SOFT_VSYNC) & 3)) in hqvdp_dbg_show()
611 cmd = readl(hqvdp->regs + HQVDP_MBX_CURRENT_CMD); in hqvdp_dbg_show()
612 cmd_offset = sti_hqvdp_get_curr_cmd(hqvdp); in hqvdp_dbg_show()
616 virt = hqvdp->hqvdp_cmd + cmd_offset; in hqvdp_dbg_show()
623 cmd = readl(hqvdp->regs + HQVDP_MBX_NEXT_CMD); in hqvdp_dbg_show()
624 cmd_offset = sti_hqvdp_get_next_cmd(hqvdp); in hqvdp_dbg_show()
628 virt = hqvdp->hqvdp_cmd + cmd_offset; in hqvdp_dbg_show()
642 static void hqvdp_debugfs_init(struct sti_hqvdp *hqvdp, struct drm_minor *minor) in hqvdp_debugfs_init() argument
647 hqvdp_debugfs_files[i].data = hqvdp; in hqvdp_debugfs_init()
732 static bool sti_hqvdp_check_hw_scaling(struct sti_hqvdp *hqvdp, in sti_hqvdp_check_hw_scaling() argument
740 lfw = mode->htotal * (clk_get_rate(hqvdp->clk) / 1000000); in sti_hqvdp_check_hw_scaling()
754 static void sti_hqvdp_disable(struct sti_hqvdp *hqvdp) in sti_hqvdp_disable() argument
758 DRM_DEBUG_DRIVER("%s\n", sti_plane_to_str(&hqvdp->plane)); in sti_hqvdp_disable()
761 if (sti_vtg_unregister_client(hqvdp->vtg, &hqvdp->vtg_nb)) in sti_hqvdp_disable()
765 writel(0, hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_disable()
768 if (readl(hqvdp->regs + HQVDP_MBX_INFO_XP70) in sti_hqvdp_disable()
775 clk_disable_unprepare(hqvdp->clk_pix_main); in sti_hqvdp_disable()
780 hqvdp->plane.status = STI_PLANE_DISABLED; in sti_hqvdp_disable()
781 hqvdp->vtg_registered = false; in sti_hqvdp_disable()
797 struct sti_hqvdp *hqvdp = container_of(nb, struct sti_hqvdp, vtg_nb); in sti_hqvdp_vtg_cb() local
806 if (hqvdp->plane.status == STI_PLANE_FLUSHING) { in sti_hqvdp_vtg_cb()
809 sti_plane_to_str(&hqvdp->plane)); in sti_hqvdp_vtg_cb()
811 sti_hqvdp_disable(hqvdp); in sti_hqvdp_vtg_cb()
814 if (hqvdp->btm_field_pending) { in sti_hqvdp_vtg_cb()
816 btm_cmd_offset = sti_hqvdp_get_free_cmd(hqvdp); in sti_hqvdp_vtg_cb()
817 top_cmd_offest = sti_hqvdp_get_curr_cmd(hqvdp); in sti_hqvdp_vtg_cb()
823 btm_cmd = hqvdp->hqvdp_cmd + btm_cmd_offset; in sti_hqvdp_vtg_cb()
824 top_cmd = hqvdp->hqvdp_cmd + top_cmd_offest; in sti_hqvdp_vtg_cb()
835 writel(hqvdp->hqvdp_cmd_paddr + btm_cmd_offset, in sti_hqvdp_vtg_cb()
836 hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_vtg_cb()
838 hqvdp->btm_field_pending = false; in sti_hqvdp_vtg_cb()
840 dev_dbg(hqvdp->dev, "%s Posted command:0x%x\n", in sti_hqvdp_vtg_cb()
841 __func__, hqvdp->hqvdp_cmd_paddr); in sti_hqvdp_vtg_cb()
843 sti_plane_update_fps(&hqvdp->plane, false, true); in sti_hqvdp_vtg_cb()
849 static void sti_hqvdp_init(struct sti_hqvdp *hqvdp) in sti_hqvdp_init() argument
854 hqvdp->vtg_nb.notifier_call = sti_hqvdp_vtg_cb; in sti_hqvdp_init()
858 hqvdp->hqvdp_cmd = dma_alloc_wc(hqvdp->dev, size, in sti_hqvdp_init()
861 if (!hqvdp->hqvdp_cmd) { in sti_hqvdp_init()
866 hqvdp->hqvdp_cmd_paddr = (u32)dma_addr; in sti_hqvdp_init()
867 memset(hqvdp->hqvdp_cmd, 0, size); in sti_hqvdp_init()
870 static void sti_hqvdp_init_plugs(struct sti_hqvdp *hqvdp) in sti_hqvdp_init_plugs() argument
873 writel(PLUG_PAGE_SIZE_256, hqvdp->regs + HQVDP_RD_PLUG_PAGE_SIZE); in sti_hqvdp_init_plugs()
874 writel(PLUG_MIN_OPC_8, hqvdp->regs + HQVDP_RD_PLUG_MIN_OPC); in sti_hqvdp_init_plugs()
875 writel(PLUG_MAX_OPC_64, hqvdp->regs + HQVDP_RD_PLUG_MAX_OPC); in sti_hqvdp_init_plugs()
876 writel(PLUG_MAX_CHK_2X, hqvdp->regs + HQVDP_RD_PLUG_MAX_CHK); in sti_hqvdp_init_plugs()
877 writel(PLUG_MAX_MSG_1X, hqvdp->regs + HQVDP_RD_PLUG_MAX_MSG); in sti_hqvdp_init_plugs()
878 writel(PLUG_MIN_SPACE_1, hqvdp->regs + HQVDP_RD_PLUG_MIN_SPACE); in sti_hqvdp_init_plugs()
879 writel(PLUG_CONTROL_ENABLE, hqvdp->regs + HQVDP_RD_PLUG_CONTROL); in sti_hqvdp_init_plugs()
881 writel(PLUG_PAGE_SIZE_256, hqvdp->regs + HQVDP_WR_PLUG_PAGE_SIZE); in sti_hqvdp_init_plugs()
882 writel(PLUG_MIN_OPC_8, hqvdp->regs + HQVDP_WR_PLUG_MIN_OPC); in sti_hqvdp_init_plugs()
883 writel(PLUG_MAX_OPC_64, hqvdp->regs + HQVDP_WR_PLUG_MAX_OPC); in sti_hqvdp_init_plugs()
884 writel(PLUG_MAX_CHK_2X, hqvdp->regs + HQVDP_WR_PLUG_MAX_CHK); in sti_hqvdp_init_plugs()
885 writel(PLUG_MAX_MSG_1X, hqvdp->regs + HQVDP_WR_PLUG_MAX_MSG); in sti_hqvdp_init_plugs()
886 writel(PLUG_MIN_SPACE_1, hqvdp->regs + HQVDP_WR_PLUG_MIN_SPACE); in sti_hqvdp_init_plugs()
887 writel(PLUG_CONTROL_ENABLE, hqvdp->regs + HQVDP_WR_PLUG_CONTROL); in sti_hqvdp_init_plugs()
896 static void sti_hqvdp_start_xp70(struct sti_hqvdp *hqvdp) in sti_hqvdp_start_xp70() argument
911 if (hqvdp->xp70_initialized) { in sti_hqvdp_start_xp70()
917 if (request_firmware(&firmware, HQVDP_FMW_NAME, hqvdp->dev)) { in sti_hqvdp_start_xp70()
953 if (clk_prepare_enable(hqvdp->clk)) in sti_hqvdp_start_xp70()
957 writel(SW_RESET_CTRL_FULL, hqvdp->regs + HQVDP_MBX_SW_RESET_CTRL); in sti_hqvdp_start_xp70()
960 if (readl(hqvdp->regs + HQVDP_MBX_STARTUP_CTRL1) in sti_hqvdp_start_xp70()
967 clk_disable_unprepare(hqvdp->clk); in sti_hqvdp_start_xp70()
973 writel(fw_rd_plug[i], hqvdp->regs + HQVDP_RD_PLUG + i * 4); in sti_hqvdp_start_xp70()
975 writel(fw_wr_plug[i], hqvdp->regs + HQVDP_WR_PLUG + i * 4); in sti_hqvdp_start_xp70()
977 sti_hqvdp_init_plugs(hqvdp); in sti_hqvdp_start_xp70()
980 writel(STARTUP_CTRL1_AUTH_IDLE, hqvdp->regs + HQVDP_MBX_STARTUP_CTRL1); in sti_hqvdp_start_xp70()
983 writel(SOFT_VSYNC_SW_CTRL_IRQ, hqvdp->regs + HQVDP_MBX_SOFT_VSYNC); in sti_hqvdp_start_xp70()
984 writel(0, hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_start_xp70()
988 writel(fw_pmem[i], hqvdp->regs + HQVDP_PMEM + i * 4); in sti_hqvdp_start_xp70()
990 writel(fw_dmem[i], hqvdp->regs + HQVDP_DMEM + i * 4); in sti_hqvdp_start_xp70()
993 writel(STARTUP_CTRL2_FETCH_EN, hqvdp->regs + HQVDP_MBX_STARTUP_CTRL2); in sti_hqvdp_start_xp70()
997 if (readl(hqvdp->regs + HQVDP_MBX_INFO_XP70) in sti_hqvdp_start_xp70()
1004 clk_disable_unprepare(hqvdp->clk); in sti_hqvdp_start_xp70()
1009 writel(SOFT_VSYNC_HW, hqvdp->regs + HQVDP_MBX_SOFT_VSYNC); in sti_hqvdp_start_xp70()
1013 hqvdp->xp70_initialized = true; in sti_hqvdp_start_xp70()
1025 struct sti_hqvdp *hqvdp = to_sti_hqvdp(plane); in sti_hqvdp_atomic_check() local
1049 if (mode->clock && !sti_hqvdp_check_hw_scaling(hqvdp, mode, in sti_hqvdp_atomic_check()
1078 if (!hqvdp->xp70_initialized) in sti_hqvdp_atomic_check()
1080 sti_hqvdp_start_xp70(hqvdp); in sti_hqvdp_atomic_check()
1082 if (!hqvdp->vtg_registered) { in sti_hqvdp_atomic_check()
1084 if (clk_prepare_enable(hqvdp->clk_pix_main)) { in sti_hqvdp_atomic_check()
1090 if (sti_vtg_register_client(hqvdp->vtg, in sti_hqvdp_atomic_check()
1091 &hqvdp->vtg_nb, in sti_hqvdp_atomic_check()
1094 clk_disable_unprepare(hqvdp->clk_pix_main); in sti_hqvdp_atomic_check()
1097 hqvdp->vtg_registered = true; in sti_hqvdp_atomic_check()
1119 struct sti_hqvdp *hqvdp = to_sti_hqvdp(plane); in sti_hqvdp_atomic_update() local
1159 cmd_offset = sti_hqvdp_get_free_cmd(hqvdp); in sti_hqvdp_atomic_update()
1164 cmd = hqvdp->hqvdp_cmd + cmd_offset; in sti_hqvdp_atomic_update()
1230 writel(hqvdp->hqvdp_cmd_paddr + cmd_offset, in sti_hqvdp_atomic_update()
1231 hqvdp->regs + HQVDP_MBX_NEXT_CMD); in sti_hqvdp_atomic_update()
1235 hqvdp->btm_field_pending = true; in sti_hqvdp_atomic_update()
1237 dev_dbg(hqvdp->dev, "%s Posted command:0x%x\n", in sti_hqvdp_atomic_update()
1238 __func__, hqvdp->hqvdp_cmd_paddr + cmd_offset); in sti_hqvdp_atomic_update()
1275 struct sti_hqvdp *hqvdp = to_sti_hqvdp(plane); in sti_hqvdp_late_register() local
1277 hqvdp_debugfs_init(hqvdp, drm_plane->dev->primary); in sti_hqvdp_late_register()
1295 struct sti_hqvdp *hqvdp = dev_get_drvdata(dev); in sti_hqvdp_create() local
1298 hqvdp->plane.desc = desc; in sti_hqvdp_create()
1299 hqvdp->plane.status = STI_PLANE_DISABLED; in sti_hqvdp_create()
1301 sti_hqvdp_init(hqvdp); in sti_hqvdp_create()
1303 res = drm_universal_plane_init(drm_dev, &hqvdp->plane.drm_plane, 1, in sti_hqvdp_create()
1313 drm_plane_helper_add(&hqvdp->plane.drm_plane, &sti_hqvdp_helpers_funcs); in sti_hqvdp_create()
1315 sti_plane_init_property(&hqvdp->plane, DRM_PLANE_TYPE_OVERLAY); in sti_hqvdp_create()
1317 return &hqvdp->plane.drm_plane; in sti_hqvdp_create()
1322 struct sti_hqvdp *hqvdp = dev_get_drvdata(dev); in sti_hqvdp_bind() local
1328 hqvdp->drm_dev = drm_dev; in sti_hqvdp_bind()
1331 plane = sti_hqvdp_create(drm_dev, hqvdp->dev, STI_HQVDP_0); in sti_hqvdp_bind()
1353 struct sti_hqvdp *hqvdp; in sti_hqvdp_probe() local
1358 hqvdp = devm_kzalloc(dev, sizeof(*hqvdp), GFP_KERNEL); in sti_hqvdp_probe()
1359 if (!hqvdp) { in sti_hqvdp_probe()
1364 hqvdp->dev = dev; in sti_hqvdp_probe()
1372 hqvdp->regs = devm_ioremap(dev, res->start, resource_size(res)); in sti_hqvdp_probe()
1373 if (!hqvdp->regs) { in sti_hqvdp_probe()
1379 hqvdp->clk = devm_clk_get(dev, "hqvdp"); in sti_hqvdp_probe()
1380 hqvdp->clk_pix_main = devm_clk_get(dev, "pix_main"); in sti_hqvdp_probe()
1381 if (IS_ERR(hqvdp->clk) || IS_ERR(hqvdp->clk_pix_main)) { in sti_hqvdp_probe()
1387 hqvdp->reset = devm_reset_control_get(dev, "hqvdp"); in sti_hqvdp_probe()
1388 if (!IS_ERR(hqvdp->reset)) in sti_hqvdp_probe()
1389 reset_control_deassert(hqvdp->reset); in sti_hqvdp_probe()
1393 hqvdp->vtg = of_vtg_find(vtg_np); in sti_hqvdp_probe()
1396 platform_set_drvdata(pdev, hqvdp); in sti_hqvdp_probe()