Lines Matching refs:hdev
139 static void venus_set_state(struct venus_hfi_device *hdev, in venus_set_state() argument
142 mutex_lock(&hdev->lock); in venus_set_state()
143 hdev->state = state; in venus_set_state()
144 mutex_unlock(&hdev->lock); in venus_set_state()
147 static bool venus_is_valid_state(struct venus_hfi_device *hdev) in venus_is_valid_state() argument
149 return hdev->state != VENUS_STATE_DEINIT; in venus_is_valid_state()
152 static void venus_dump_packet(struct venus_hfi_device *hdev, const void *packet) in venus_dump_packet() argument
163 static int venus_write_queue(struct venus_hfi_device *hdev, in venus_write_queue() argument
179 venus_dump_packet(hdev, packet); in venus_write_queue()
232 static int venus_read_queue(struct venus_hfi_device *hdev, in venus_read_queue() argument
320 venus_dump_packet(hdev, pkt); in venus_read_queue()
325 static int venus_alloc(struct venus_hfi_device *hdev, struct mem_desc *desc, in venus_alloc() argument
328 struct device *dev = hdev->core->dev; in venus_alloc()
341 static void venus_free(struct venus_hfi_device *hdev, struct mem_desc *mem) in venus_free() argument
343 struct device *dev = hdev->core->dev; in venus_free()
348 static void venus_writel(struct venus_hfi_device *hdev, u32 reg, u32 value) in venus_writel() argument
350 writel(value, hdev->core->base + reg); in venus_writel()
353 static u32 venus_readl(struct venus_hfi_device *hdev, u32 reg) in venus_readl() argument
355 return readl(hdev->core->base + reg); in venus_readl()
358 static void venus_set_registers(struct venus_hfi_device *hdev) in venus_set_registers() argument
360 const struct venus_resources *res = hdev->core->res; in venus_set_registers()
366 venus_writel(hdev, tbl[i].reg, tbl[i].value); in venus_set_registers()
369 static void venus_soft_int(struct venus_hfi_device *hdev) in venus_soft_int() argument
371 venus_writel(hdev, CPU_IC_SOFTINT, BIT(CPU_IC_SOFTINT_H2A_SHIFT)); in venus_soft_int()
374 static int venus_iface_cmdq_write_nolock(struct venus_hfi_device *hdev, in venus_iface_cmdq_write_nolock() argument
377 struct device *dev = hdev->core->dev; in venus_iface_cmdq_write_nolock()
383 if (!venus_is_valid_state(hdev)) in venus_iface_cmdq_write_nolock()
387 hdev->last_packet_type = cmd_packet->pkt_type; in venus_iface_cmdq_write_nolock()
389 queue = &hdev->queues[IFACEQ_CMD_IDX]; in venus_iface_cmdq_write_nolock()
391 ret = venus_write_queue(hdev, queue, pkt, &rx_req); in venus_iface_cmdq_write_nolock()
398 venus_soft_int(hdev); in venus_iface_cmdq_write_nolock()
403 static int venus_iface_cmdq_write(struct venus_hfi_device *hdev, void *pkt) in venus_iface_cmdq_write() argument
407 mutex_lock(&hdev->lock); in venus_iface_cmdq_write()
408 ret = venus_iface_cmdq_write_nolock(hdev, pkt); in venus_iface_cmdq_write()
409 mutex_unlock(&hdev->lock); in venus_iface_cmdq_write()
417 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_hfi_core_set_resource() local
431 ret = venus_iface_cmdq_write(hdev, pkt); in venus_hfi_core_set_resource()
438 static int venus_boot_core(struct venus_hfi_device *hdev) in venus_boot_core() argument
440 struct device *dev = hdev->core->dev; in venus_boot_core()
446 venus_writel(hdev, VIDC_CTRL_INIT, BIT(VIDC_CTRL_INIT_CTRL_SHIFT)); in venus_boot_core()
447 venus_writel(hdev, WRAPPER_INTR_MASK, WRAPPER_INTR_MASK_A2HVCODEC_MASK); in venus_boot_core()
448 venus_writel(hdev, CPU_CS_SCIACMDARG3, 1); in venus_boot_core()
451 ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0); in venus_boot_core()
468 static u32 venus_hwversion(struct venus_hfi_device *hdev) in venus_hwversion() argument
470 struct device *dev = hdev->core->dev; in venus_hwversion()
471 u32 ver = venus_readl(hdev, WRAPPER_HW_VERSION); in venus_hwversion()
485 static int venus_run(struct venus_hfi_device *hdev) in venus_run() argument
487 struct device *dev = hdev->core->dev; in venus_run()
494 venus_set_registers(hdev); in venus_run()
496 venus_writel(hdev, UC_REGION_ADDR, hdev->ifaceq_table.da); in venus_run()
497 venus_writel(hdev, UC_REGION_SIZE, SHARED_QSIZE); in venus_run()
498 venus_writel(hdev, CPU_CS_SCIACMDARG2, hdev->ifaceq_table.da); in venus_run()
499 venus_writel(hdev, CPU_CS_SCIACMDARG1, 0x01); in venus_run()
500 if (hdev->sfr.da) in venus_run()
501 venus_writel(hdev, SFR_ADDR, hdev->sfr.da); in venus_run()
503 ret = venus_boot_core(hdev); in venus_run()
509 venus_hwversion(hdev); in venus_run()
514 static int venus_halt_axi(struct venus_hfi_device *hdev) in venus_halt_axi() argument
516 void __iomem *base = hdev->core->base; in venus_halt_axi()
517 struct device *dev = hdev->core->dev; in venus_halt_axi()
521 if (IS_V4(hdev->core)) { in venus_halt_axi()
522 val = venus_readl(hdev, WRAPPER_CPU_AXI_HALT); in venus_halt_axi()
524 venus_writel(hdev, WRAPPER_CPU_AXI_HALT, val); in venus_halt_axi()
540 val = venus_readl(hdev, VBIF_AXI_HALT_CTRL0); in venus_halt_axi()
542 venus_writel(hdev, VBIF_AXI_HALT_CTRL0, val); in venus_halt_axi()
557 static int venus_power_off(struct venus_hfi_device *hdev) in venus_power_off() argument
561 if (!hdev->power_enabled) in venus_power_off()
564 ret = venus_set_hw_state_suspend(hdev->core); in venus_power_off()
568 ret = venus_halt_axi(hdev); in venus_power_off()
572 hdev->power_enabled = false; in venus_power_off()
577 static int venus_power_on(struct venus_hfi_device *hdev) in venus_power_on() argument
581 if (hdev->power_enabled) in venus_power_on()
584 ret = venus_set_hw_state_resume(hdev->core); in venus_power_on()
588 ret = venus_run(hdev); in venus_power_on()
592 hdev->power_enabled = true; in venus_power_on()
597 venus_set_hw_state_suspend(hdev->core); in venus_power_on()
599 hdev->power_enabled = false; in venus_power_on()
603 static int venus_iface_msgq_read_nolock(struct venus_hfi_device *hdev, in venus_iface_msgq_read_nolock() argument
610 if (!venus_is_valid_state(hdev)) in venus_iface_msgq_read_nolock()
613 queue = &hdev->queues[IFACEQ_MSG_IDX]; in venus_iface_msgq_read_nolock()
615 ret = venus_read_queue(hdev, queue, pkt, &tx_req); in venus_iface_msgq_read_nolock()
620 venus_soft_int(hdev); in venus_iface_msgq_read_nolock()
625 static int venus_iface_msgq_read(struct venus_hfi_device *hdev, void *pkt) in venus_iface_msgq_read() argument
629 mutex_lock(&hdev->lock); in venus_iface_msgq_read()
630 ret = venus_iface_msgq_read_nolock(hdev, pkt); in venus_iface_msgq_read()
631 mutex_unlock(&hdev->lock); in venus_iface_msgq_read()
636 static int venus_iface_dbgq_read_nolock(struct venus_hfi_device *hdev, in venus_iface_dbgq_read_nolock() argument
643 ret = venus_is_valid_state(hdev); in venus_iface_dbgq_read_nolock()
647 queue = &hdev->queues[IFACEQ_DBG_IDX]; in venus_iface_dbgq_read_nolock()
649 ret = venus_read_queue(hdev, queue, pkt, &tx_req); in venus_iface_dbgq_read_nolock()
654 venus_soft_int(hdev); in venus_iface_dbgq_read_nolock()
659 static int venus_iface_dbgq_read(struct venus_hfi_device *hdev, void *pkt) in venus_iface_dbgq_read() argument
666 mutex_lock(&hdev->lock); in venus_iface_dbgq_read()
667 ret = venus_iface_dbgq_read_nolock(hdev, pkt); in venus_iface_dbgq_read()
668 mutex_unlock(&hdev->lock); in venus_iface_dbgq_read()
689 static void venus_interface_queues_release(struct venus_hfi_device *hdev) in venus_interface_queues_release() argument
691 mutex_lock(&hdev->lock); in venus_interface_queues_release()
693 venus_free(hdev, &hdev->ifaceq_table); in venus_interface_queues_release()
694 venus_free(hdev, &hdev->sfr); in venus_interface_queues_release()
696 memset(hdev->queues, 0, sizeof(hdev->queues)); in venus_interface_queues_release()
697 memset(&hdev->ifaceq_table, 0, sizeof(hdev->ifaceq_table)); in venus_interface_queues_release()
698 memset(&hdev->sfr, 0, sizeof(hdev->sfr)); in venus_interface_queues_release()
700 mutex_unlock(&hdev->lock); in venus_interface_queues_release()
703 static int venus_interface_queues_init(struct venus_hfi_device *hdev) in venus_interface_queues_init() argument
713 ret = venus_alloc(hdev, &desc, ALIGNED_QUEUE_SIZE); in venus_interface_queues_init()
717 hdev->ifaceq_table = desc; in venus_interface_queues_init()
721 queue = &hdev->queues[i]; in venus_interface_queues_init()
727 IFACEQ_GET_QHDR_START_ADDR(hdev->ifaceq_table.kva, i); in venus_interface_queues_init()
741 tbl_hdr = hdev->ifaceq_table.kva; in venus_interface_queues_init()
753 queue = &hdev->queues[IFACEQ_DBG_IDX]; in venus_interface_queues_init()
756 ret = venus_alloc(hdev, &desc, ALIGNED_SFR_SIZE); in venus_interface_queues_init()
758 hdev->sfr.da = 0; in venus_interface_queues_init()
760 hdev->sfr = desc; in venus_interface_queues_init()
761 sfr = hdev->sfr.kva; in venus_interface_queues_init()
771 static int venus_sys_set_debug(struct venus_hfi_device *hdev, u32 debug) in venus_sys_set_debug() argument
781 ret = venus_iface_cmdq_write(hdev, pkt); in venus_sys_set_debug()
788 static int venus_sys_set_coverage(struct venus_hfi_device *hdev, u32 mode) in venus_sys_set_coverage() argument
798 ret = venus_iface_cmdq_write(hdev, pkt); in venus_sys_set_coverage()
805 static int venus_sys_set_idle_message(struct venus_hfi_device *hdev, in venus_sys_set_idle_message() argument
819 ret = venus_iface_cmdq_write(hdev, pkt); in venus_sys_set_idle_message()
826 static int venus_sys_set_power_control(struct venus_hfi_device *hdev, in venus_sys_set_power_control() argument
837 ret = venus_iface_cmdq_write(hdev, pkt); in venus_sys_set_power_control()
844 static int venus_get_queue_size(struct venus_hfi_device *hdev, in venus_get_queue_size() argument
852 qhdr = hdev->queues[index].qhdr; in venus_get_queue_size()
859 static int venus_sys_set_default_properties(struct venus_hfi_device *hdev) in venus_sys_set_default_properties() argument
861 struct device *dev = hdev->core->dev; in venus_sys_set_default_properties()
864 ret = venus_sys_set_debug(hdev, venus_fw_debug); in venus_sys_set_default_properties()
873 if (IS_V4(hdev->core)) in venus_sys_set_default_properties()
876 ret = venus_sys_set_idle_message(hdev, venus_sys_idle_indicator); in venus_sys_set_default_properties()
880 ret = venus_sys_set_power_control(hdev, venus_fw_low_power_mode); in venus_sys_set_default_properties()
890 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_cmd() local
895 return venus_iface_cmdq_write(hdev, &pkt); in venus_session_cmd()
898 static void venus_flush_debug_queue(struct venus_hfi_device *hdev) in venus_flush_debug_queue() argument
900 struct device *dev = hdev->core->dev; in venus_flush_debug_queue()
901 void *packet = hdev->dbg_buf; in venus_flush_debug_queue()
903 while (!venus_iface_dbgq_read(hdev, packet)) { in venus_flush_debug_queue()
914 static int venus_prepare_power_collapse(struct venus_hfi_device *hdev, in venus_prepare_power_collapse() argument
921 init_completion(&hdev->pwr_collapse_prep); in venus_prepare_power_collapse()
925 ret = venus_iface_cmdq_write(hdev, &pkt); in venus_prepare_power_collapse()
932 ret = wait_for_completion_timeout(&hdev->pwr_collapse_prep, timeout); in venus_prepare_power_collapse()
934 venus_flush_debug_queue(hdev); in venus_prepare_power_collapse()
941 static int venus_are_queues_empty(struct venus_hfi_device *hdev) in venus_are_queues_empty() argument
945 ret1 = venus_get_queue_size(hdev, IFACEQ_MSG_IDX); in venus_are_queues_empty()
949 ret2 = venus_get_queue_size(hdev, IFACEQ_CMD_IDX); in venus_are_queues_empty()
959 static void venus_sfr_print(struct venus_hfi_device *hdev) in venus_sfr_print() argument
961 struct device *dev = hdev->core->dev; in venus_sfr_print()
962 struct hfi_sfr *sfr = hdev->sfr.kva; in venus_sfr_print()
979 static void venus_process_msg_sys_error(struct venus_hfi_device *hdev, in venus_process_msg_sys_error() argument
987 venus_set_state(hdev, VENUS_STATE_DEINIT); in venus_process_msg_sys_error()
995 venus_halt_axi(hdev); in venus_process_msg_sys_error()
996 venus_sfr_print(hdev); in venus_process_msg_sys_error()
1001 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_isr_thread() local
1006 if (!hdev) in venus_isr_thread()
1009 res = hdev->core->res; in venus_isr_thread()
1010 pkt = hdev->pkt_buf; in venus_isr_thread()
1012 if (hdev->irq_status & WRAPPER_INTR_STATUS_A2HWD_MASK) { in venus_isr_thread()
1013 venus_sfr_print(hdev); in venus_isr_thread()
1017 while (!venus_iface_msgq_read(hdev, pkt)) { in venus_isr_thread()
1021 venus_process_msg_sys_error(hdev, pkt); in venus_isr_thread()
1027 hdev); in venus_isr_thread()
1030 complete(&hdev->release_resource); in venus_isr_thread()
1033 complete(&hdev->pwr_collapse_prep); in venus_isr_thread()
1040 venus_flush_debug_queue(hdev); in venus_isr_thread()
1047 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_isr() local
1050 if (!hdev) in venus_isr()
1053 status = venus_readl(hdev, WRAPPER_INTR_STATUS); in venus_isr()
1058 hdev->irq_status = status; in venus_isr()
1060 venus_writel(hdev, CPU_CS_A2HSOFTINTCLR, 1); in venus_isr()
1061 venus_writel(hdev, WRAPPER_INTR_CLEAR, status); in venus_isr()
1068 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_core_init() local
1076 venus_set_state(hdev, VENUS_STATE_INIT); in venus_core_init()
1078 ret = venus_iface_cmdq_write(hdev, &pkt); in venus_core_init()
1084 ret = venus_iface_cmdq_write(hdev, &version_pkt); in venus_core_init()
1088 ret = venus_sys_set_default_properties(hdev); in venus_core_init()
1097 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_core_deinit() local
1099 venus_set_state(hdev, VENUS_STATE_DEINIT); in venus_core_deinit()
1100 hdev->suspended = true; in venus_core_deinit()
1101 hdev->power_enabled = false; in venus_core_deinit()
1108 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_core_ping() local
1113 return venus_iface_cmdq_write(hdev, &pkt); in venus_core_ping()
1118 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_core_trigger_ssr() local
1126 return venus_iface_cmdq_write(hdev, &pkt); in venus_core_trigger_ssr()
1132 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_init() local
1140 ret = venus_iface_cmdq_write(hdev, &pkt); in venus_session_init()
1147 venus_flush_debug_queue(hdev); in venus_session_init()
1153 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_end() local
1154 struct device *dev = hdev->core->dev; in venus_session_end()
1157 if (venus_sys_set_coverage(hdev, venus_fw_coverage)) in venus_session_end()
1166 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_abort() local
1168 venus_flush_debug_queue(hdev); in venus_session_abort()
1175 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_flush() local
1183 return venus_iface_cmdq_write(hdev, &pkt); in venus_session_flush()
1204 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_etb() local
1215 ret = venus_iface_cmdq_write(hdev, &pkt); in venus_session_etb()
1223 ret = venus_iface_cmdq_write(hdev, &pkt); in venus_session_etb()
1234 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_ftb() local
1242 return venus_iface_cmdq_write(hdev, &pkt); in venus_session_ftb()
1248 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_set_buffers() local
1262 return venus_iface_cmdq_write(hdev, pkt); in venus_session_set_buffers()
1268 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_unset_buffers() local
1282 return venus_iface_cmdq_write(hdev, pkt); in venus_session_unset_buffers()
1298 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_parse_seq_hdr() local
1309 ret = venus_iface_cmdq_write(hdev, pkt); in venus_session_parse_seq_hdr()
1319 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_get_seq_hdr() local
1330 return venus_iface_cmdq_write(hdev, pkt); in venus_session_get_seq_hdr()
1336 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_set_property() local
1349 return venus_iface_cmdq_write(hdev, pkt); in venus_session_set_property()
1354 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_get_property() local
1362 return venus_iface_cmdq_write(hdev, &pkt); in venus_session_get_property()
1367 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_resume() local
1370 mutex_lock(&hdev->lock); in venus_resume()
1372 if (!hdev->suspended) in venus_resume()
1375 ret = venus_power_on(hdev); in venus_resume()
1379 hdev->suspended = false; in venus_resume()
1381 mutex_unlock(&hdev->lock); in venus_resume()
1388 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_suspend_1xx() local
1393 if (!hdev->power_enabled || hdev->suspended) in venus_suspend_1xx()
1396 mutex_lock(&hdev->lock); in venus_suspend_1xx()
1397 ret = venus_is_valid_state(hdev); in venus_suspend_1xx()
1398 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1405 ret = venus_prepare_power_collapse(hdev, true); in venus_suspend_1xx()
1411 mutex_lock(&hdev->lock); in venus_suspend_1xx()
1413 if (hdev->last_packet_type != HFI_CMD_SYS_PC_PREP) { in venus_suspend_1xx()
1414 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1418 ret = venus_are_queues_empty(hdev); in venus_suspend_1xx()
1420 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1424 ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0); in venus_suspend_1xx()
1426 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1430 ret = venus_power_off(hdev); in venus_suspend_1xx()
1432 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1436 hdev->suspended = true; in venus_suspend_1xx()
1438 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1443 static bool venus_cpu_and_video_core_idle(struct venus_hfi_device *hdev) in venus_cpu_and_video_core_idle() argument
1447 cpu_status = venus_readl(hdev, WRAPPER_CPU_STATUS); in venus_cpu_and_video_core_idle()
1448 ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0); in venus_cpu_and_video_core_idle()
1457 static bool venus_cpu_idle_and_pc_ready(struct venus_hfi_device *hdev) in venus_cpu_idle_and_pc_ready() argument
1461 cpu_status = venus_readl(hdev, WRAPPER_CPU_STATUS); in venus_cpu_idle_and_pc_ready()
1462 ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0); in venus_cpu_idle_and_pc_ready()
1473 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_suspend_3xx() local
1478 if (!hdev->power_enabled || hdev->suspended) in venus_suspend_3xx()
1481 mutex_lock(&hdev->lock); in venus_suspend_3xx()
1482 ret = venus_is_valid_state(hdev); in venus_suspend_3xx()
1483 mutex_unlock(&hdev->lock); in venus_suspend_3xx()
1498 ret = readx_poll_timeout(venus_cpu_and_video_core_idle, hdev, val, val, in venus_suspend_3xx()
1503 ret = venus_prepare_power_collapse(hdev, false); in venus_suspend_3xx()
1509 ret = readx_poll_timeout(venus_cpu_idle_and_pc_ready, hdev, val, val, in venus_suspend_3xx()
1514 mutex_lock(&hdev->lock); in venus_suspend_3xx()
1516 ret = venus_power_off(hdev); in venus_suspend_3xx()
1519 mutex_unlock(&hdev->lock); in venus_suspend_3xx()
1523 hdev->suspended = true; in venus_suspend_3xx()
1525 mutex_unlock(&hdev->lock); in venus_suspend_3xx()
1571 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_hfi_destroy() local
1573 venus_interface_queues_release(hdev); in venus_hfi_destroy()
1574 mutex_destroy(&hdev->lock); in venus_hfi_destroy()
1575 kfree(hdev); in venus_hfi_destroy()
1582 struct venus_hfi_device *hdev; in venus_hfi_create() local
1585 hdev = kzalloc(sizeof(*hdev), GFP_KERNEL); in venus_hfi_create()
1586 if (!hdev) in venus_hfi_create()
1589 mutex_init(&hdev->lock); in venus_hfi_create()
1591 hdev->core = core; in venus_hfi_create()
1592 hdev->suspended = true; in venus_hfi_create()
1593 core->priv = hdev; in venus_hfi_create()
1599 ret = venus_interface_queues_init(hdev); in venus_hfi_create()
1606 kfree(hdev); in venus_hfi_create()