• Home
  • Raw
  • Download

Lines Matching refs:hdev

138 static void venus_set_state(struct venus_hfi_device *hdev,  in venus_set_state()  argument
141 mutex_lock(&hdev->lock); in venus_set_state()
142 hdev->state = state; in venus_set_state()
143 mutex_unlock(&hdev->lock); in venus_set_state()
146 static bool venus_is_valid_state(struct venus_hfi_device *hdev) in venus_is_valid_state() argument
148 return hdev->state != VENUS_STATE_DEINIT; in venus_is_valid_state()
151 static void venus_dump_packet(struct venus_hfi_device *hdev, const void *packet) in venus_dump_packet() argument
162 static int venus_write_queue(struct venus_hfi_device *hdev, in venus_write_queue() argument
178 venus_dump_packet(hdev, packet); in venus_write_queue()
236 static int venus_read_queue(struct venus_hfi_device *hdev, in venus_read_queue() argument
329 venus_dump_packet(hdev, pkt); in venus_read_queue()
334 static int venus_alloc(struct venus_hfi_device *hdev, struct mem_desc *desc, in venus_alloc() argument
337 struct device *dev = hdev->core->dev; in venus_alloc()
350 static void venus_free(struct venus_hfi_device *hdev, struct mem_desc *mem) in venus_free() argument
352 struct device *dev = hdev->core->dev; in venus_free()
357 static void venus_set_registers(struct venus_hfi_device *hdev) in venus_set_registers() argument
359 const struct venus_resources *res = hdev->core->res; in venus_set_registers()
365 writel(tbl[i].value, hdev->core->base + tbl[i].reg); in venus_set_registers()
368 static void venus_soft_int(struct venus_hfi_device *hdev) in venus_soft_int() argument
370 void __iomem *cpu_ic_base = hdev->core->cpu_ic_base; in venus_soft_int()
373 if (IS_V6(hdev->core)) in venus_soft_int()
381 static int venus_iface_cmdq_write_nolock(struct venus_hfi_device *hdev, in venus_iface_cmdq_write_nolock() argument
384 struct device *dev = hdev->core->dev; in venus_iface_cmdq_write_nolock()
390 if (!venus_is_valid_state(hdev)) in venus_iface_cmdq_write_nolock()
394 hdev->last_packet_type = cmd_packet->pkt_type; in venus_iface_cmdq_write_nolock()
396 queue = &hdev->queues[IFACEQ_CMD_IDX]; in venus_iface_cmdq_write_nolock()
398 ret = venus_write_queue(hdev, queue, pkt, &rx_req); in venus_iface_cmdq_write_nolock()
409 queue = &hdev->queues[IFACEQ_MSG_IDX]; in venus_iface_cmdq_write_nolock()
416 venus_soft_int(hdev); in venus_iface_cmdq_write_nolock()
421 static int venus_iface_cmdq_write(struct venus_hfi_device *hdev, void *pkt, bool sync) in venus_iface_cmdq_write() argument
425 mutex_lock(&hdev->lock); in venus_iface_cmdq_write()
426 ret = venus_iface_cmdq_write_nolock(hdev, pkt, sync); in venus_iface_cmdq_write()
427 mutex_unlock(&hdev->lock); in venus_iface_cmdq_write()
435 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_hfi_core_set_resource() local
449 ret = venus_iface_cmdq_write(hdev, pkt, false); in venus_hfi_core_set_resource()
456 static int venus_boot_core(struct venus_hfi_device *hdev) in venus_boot_core() argument
458 struct device *dev = hdev->core->dev; in venus_boot_core()
462 void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; in venus_boot_core()
463 void __iomem *wrapper_base = hdev->core->wrapper_base; in venus_boot_core()
466 if (IS_V6(hdev->core)) { in venus_boot_core()
492 if (IS_V6(hdev->core)) { in venus_boot_core()
500 static u32 venus_hwversion(struct venus_hfi_device *hdev) in venus_hwversion() argument
502 struct device *dev = hdev->core->dev; in venus_hwversion()
503 void __iomem *wrapper_base = hdev->core->wrapper_base; in venus_hwversion()
519 static int venus_run(struct venus_hfi_device *hdev) in venus_run() argument
521 struct device *dev = hdev->core->dev; in venus_run()
522 void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; in venus_run()
529 venus_set_registers(hdev); in venus_run()
531 writel(hdev->ifaceq_table.da, cpu_cs_base + UC_REGION_ADDR); in venus_run()
533 writel(hdev->ifaceq_table.da, cpu_cs_base + CPU_CS_SCIACMDARG2); in venus_run()
535 if (hdev->sfr.da) in venus_run()
536 writel(hdev->sfr.da, cpu_cs_base + SFR_ADDR); in venus_run()
538 ret = venus_boot_core(hdev); in venus_run()
544 venus_hwversion(hdev); in venus_run()
549 static int venus_halt_axi(struct venus_hfi_device *hdev) in venus_halt_axi() argument
551 void __iomem *wrapper_base = hdev->core->wrapper_base; in venus_halt_axi()
552 void __iomem *vbif_base = hdev->core->vbif_base; in venus_halt_axi()
553 void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; in venus_halt_axi()
554 void __iomem *aon_base = hdev->core->aon_base; in venus_halt_axi()
555 struct device *dev = hdev->core->dev; in venus_halt_axi()
560 if (IS_V6(hdev->core)) { in venus_halt_axi()
589 if (IS_V4(hdev->core)) { in venus_halt_axi()
625 static int venus_power_off(struct venus_hfi_device *hdev) in venus_power_off() argument
629 if (!hdev->power_enabled) in venus_power_off()
632 ret = venus_set_hw_state_suspend(hdev->core); in venus_power_off()
636 ret = venus_halt_axi(hdev); in venus_power_off()
640 hdev->power_enabled = false; in venus_power_off()
645 static int venus_power_on(struct venus_hfi_device *hdev) in venus_power_on() argument
649 if (hdev->power_enabled) in venus_power_on()
652 ret = venus_set_hw_state_resume(hdev->core); in venus_power_on()
656 ret = venus_run(hdev); in venus_power_on()
660 hdev->power_enabled = true; in venus_power_on()
665 venus_set_hw_state_suspend(hdev->core); in venus_power_on()
667 hdev->power_enabled = false; in venus_power_on()
671 static int venus_iface_msgq_read_nolock(struct venus_hfi_device *hdev, in venus_iface_msgq_read_nolock() argument
678 if (!venus_is_valid_state(hdev)) in venus_iface_msgq_read_nolock()
681 queue = &hdev->queues[IFACEQ_MSG_IDX]; in venus_iface_msgq_read_nolock()
683 ret = venus_read_queue(hdev, queue, pkt, &tx_req); in venus_iface_msgq_read_nolock()
688 venus_soft_int(hdev); in venus_iface_msgq_read_nolock()
693 static int venus_iface_msgq_read(struct venus_hfi_device *hdev, void *pkt) in venus_iface_msgq_read() argument
697 mutex_lock(&hdev->lock); in venus_iface_msgq_read()
698 ret = venus_iface_msgq_read_nolock(hdev, pkt); in venus_iface_msgq_read()
699 mutex_unlock(&hdev->lock); in venus_iface_msgq_read()
704 static int venus_iface_dbgq_read_nolock(struct venus_hfi_device *hdev, in venus_iface_dbgq_read_nolock() argument
711 ret = venus_is_valid_state(hdev); in venus_iface_dbgq_read_nolock()
715 queue = &hdev->queues[IFACEQ_DBG_IDX]; in venus_iface_dbgq_read_nolock()
717 ret = venus_read_queue(hdev, queue, pkt, &tx_req); in venus_iface_dbgq_read_nolock()
722 venus_soft_int(hdev); in venus_iface_dbgq_read_nolock()
727 static int venus_iface_dbgq_read(struct venus_hfi_device *hdev, void *pkt) in venus_iface_dbgq_read() argument
734 mutex_lock(&hdev->lock); in venus_iface_dbgq_read()
735 ret = venus_iface_dbgq_read_nolock(hdev, pkt); in venus_iface_dbgq_read()
736 mutex_unlock(&hdev->lock); in venus_iface_dbgq_read()
757 static void venus_interface_queues_release(struct venus_hfi_device *hdev) in venus_interface_queues_release() argument
759 mutex_lock(&hdev->lock); in venus_interface_queues_release()
761 venus_free(hdev, &hdev->ifaceq_table); in venus_interface_queues_release()
762 venus_free(hdev, &hdev->sfr); in venus_interface_queues_release()
764 memset(hdev->queues, 0, sizeof(hdev->queues)); in venus_interface_queues_release()
765 memset(&hdev->ifaceq_table, 0, sizeof(hdev->ifaceq_table)); in venus_interface_queues_release()
766 memset(&hdev->sfr, 0, sizeof(hdev->sfr)); in venus_interface_queues_release()
768 mutex_unlock(&hdev->lock); in venus_interface_queues_release()
771 static int venus_interface_queues_init(struct venus_hfi_device *hdev) in venus_interface_queues_init() argument
781 ret = venus_alloc(hdev, &desc, ALIGNED_QUEUE_SIZE); in venus_interface_queues_init()
785 hdev->ifaceq_table = desc; in venus_interface_queues_init()
789 queue = &hdev->queues[i]; in venus_interface_queues_init()
795 IFACEQ_GET_QHDR_START_ADDR(hdev->ifaceq_table.kva, i); in venus_interface_queues_init()
809 tbl_hdr = hdev->ifaceq_table.kva; in venus_interface_queues_init()
821 queue = &hdev->queues[IFACEQ_DBG_IDX]; in venus_interface_queues_init()
824 ret = venus_alloc(hdev, &desc, ALIGNED_SFR_SIZE); in venus_interface_queues_init()
826 hdev->sfr.da = 0; in venus_interface_queues_init()
828 hdev->sfr = desc; in venus_interface_queues_init()
829 sfr = hdev->sfr.kva; in venus_interface_queues_init()
839 static int venus_sys_set_debug(struct venus_hfi_device *hdev, u32 debug) in venus_sys_set_debug() argument
849 ret = venus_iface_cmdq_write(hdev, pkt, false); in venus_sys_set_debug()
856 static int venus_sys_set_coverage(struct venus_hfi_device *hdev, u32 mode) in venus_sys_set_coverage() argument
866 ret = venus_iface_cmdq_write(hdev, pkt, false); in venus_sys_set_coverage()
873 static int venus_sys_set_idle_message(struct venus_hfi_device *hdev, in venus_sys_set_idle_message() argument
887 ret = venus_iface_cmdq_write(hdev, pkt, false); in venus_sys_set_idle_message()
894 static int venus_sys_set_power_control(struct venus_hfi_device *hdev, in venus_sys_set_power_control() argument
905 ret = venus_iface_cmdq_write(hdev, pkt, false); in venus_sys_set_power_control()
912 static int venus_get_queue_size(struct venus_hfi_device *hdev, in venus_get_queue_size() argument
920 qhdr = hdev->queues[index].qhdr; in venus_get_queue_size()
927 static int venus_sys_set_default_properties(struct venus_hfi_device *hdev) in venus_sys_set_default_properties() argument
929 struct device *dev = hdev->core->dev; in venus_sys_set_default_properties()
932 ret = venus_sys_set_debug(hdev, venus_fw_debug); in venus_sys_set_default_properties()
937 if (IS_V1(hdev->core)) { in venus_sys_set_default_properties()
938 ret = venus_sys_set_idle_message(hdev, false); in venus_sys_set_default_properties()
943 ret = venus_sys_set_power_control(hdev, venus_fw_low_power_mode); in venus_sys_set_default_properties()
953 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_cmd() local
958 return venus_iface_cmdq_write(hdev, &pkt, sync); in venus_session_cmd()
961 static void venus_flush_debug_queue(struct venus_hfi_device *hdev) in venus_flush_debug_queue() argument
963 struct device *dev = hdev->core->dev; in venus_flush_debug_queue()
964 void *packet = hdev->dbg_buf; in venus_flush_debug_queue()
966 while (!venus_iface_dbgq_read(hdev, packet)) { in venus_flush_debug_queue()
977 static int venus_prepare_power_collapse(struct venus_hfi_device *hdev, in venus_prepare_power_collapse() argument
984 init_completion(&hdev->pwr_collapse_prep); in venus_prepare_power_collapse()
988 ret = venus_iface_cmdq_write(hdev, &pkt, false); in venus_prepare_power_collapse()
995 ret = wait_for_completion_timeout(&hdev->pwr_collapse_prep, timeout); in venus_prepare_power_collapse()
997 venus_flush_debug_queue(hdev); in venus_prepare_power_collapse()
1004 static int venus_are_queues_empty(struct venus_hfi_device *hdev) in venus_are_queues_empty() argument
1008 ret1 = venus_get_queue_size(hdev, IFACEQ_MSG_IDX); in venus_are_queues_empty()
1012 ret2 = venus_get_queue_size(hdev, IFACEQ_CMD_IDX); in venus_are_queues_empty()
1022 static void venus_sfr_print(struct venus_hfi_device *hdev) in venus_sfr_print() argument
1024 struct device *dev = hdev->core->dev; in venus_sfr_print()
1025 struct hfi_sfr *sfr = hdev->sfr.kva; in venus_sfr_print()
1042 static void venus_process_msg_sys_error(struct venus_hfi_device *hdev, in venus_process_msg_sys_error() argument
1050 venus_set_state(hdev, VENUS_STATE_DEINIT); in venus_process_msg_sys_error()
1052 venus_sfr_print(hdev); in venus_process_msg_sys_error()
1057 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_isr_thread() local
1062 if (!hdev) in venus_isr_thread()
1065 res = hdev->core->res; in venus_isr_thread()
1066 pkt = hdev->pkt_buf; in venus_isr_thread()
1069 while (!venus_iface_msgq_read(hdev, pkt)) { in venus_isr_thread()
1073 venus_process_msg_sys_error(hdev, pkt); in venus_isr_thread()
1079 hdev); in venus_isr_thread()
1082 complete(&hdev->release_resource); in venus_isr_thread()
1085 complete(&hdev->pwr_collapse_prep); in venus_isr_thread()
1092 venus_flush_debug_queue(hdev); in venus_isr_thread()
1099 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_isr() local
1104 if (!hdev) in venus_isr()
1107 cpu_cs_base = hdev->core->cpu_cs_base; in venus_isr()
1108 wrapper_base = hdev->core->wrapper_base; in venus_isr()
1115 hdev->irq_status = status; in venus_isr()
1120 hdev->irq_status = status; in venus_isr()
1131 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_core_init() local
1139 venus_set_state(hdev, VENUS_STATE_INIT); in venus_core_init()
1141 ret = venus_iface_cmdq_write(hdev, &pkt, false); in venus_core_init()
1147 ret = venus_iface_cmdq_write(hdev, &version_pkt, false); in venus_core_init()
1151 ret = venus_sys_set_default_properties(hdev); in venus_core_init()
1160 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_core_deinit() local
1162 venus_set_state(hdev, VENUS_STATE_DEINIT); in venus_core_deinit()
1163 hdev->suspended = true; in venus_core_deinit()
1164 hdev->power_enabled = false; in venus_core_deinit()
1171 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_core_ping() local
1176 return venus_iface_cmdq_write(hdev, &pkt, false); in venus_core_ping()
1181 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_core_trigger_ssr() local
1189 return venus_iface_cmdq_write(hdev, &pkt, false); in venus_core_trigger_ssr()
1195 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_init() local
1199 ret = venus_sys_set_debug(hdev, venus_fw_debug); in venus_session_init()
1207 ret = venus_iface_cmdq_write(hdev, &pkt, true); in venus_session_init()
1214 venus_flush_debug_queue(hdev); in venus_session_init()
1220 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_end() local
1221 struct device *dev = hdev->core->dev; in venus_session_end()
1224 if (venus_sys_set_coverage(hdev, venus_fw_coverage)) in venus_session_end()
1233 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_abort() local
1235 venus_flush_debug_queue(hdev); in venus_session_abort()
1242 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_flush() local
1250 return venus_iface_cmdq_write(hdev, &pkt, true); in venus_session_flush()
1271 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_etb() local
1282 ret = venus_iface_cmdq_write(hdev, &pkt, false); in venus_session_etb()
1290 ret = venus_iface_cmdq_write(hdev, &pkt, false); in venus_session_etb()
1301 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_ftb() local
1309 return venus_iface_cmdq_write(hdev, &pkt, false); in venus_session_ftb()
1315 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_set_buffers() local
1329 return venus_iface_cmdq_write(hdev, pkt, false); in venus_session_set_buffers()
1335 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_unset_buffers() local
1349 return venus_iface_cmdq_write(hdev, pkt, true); in venus_session_unset_buffers()
1365 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_parse_seq_hdr() local
1376 ret = venus_iface_cmdq_write(hdev, pkt, false); in venus_session_parse_seq_hdr()
1386 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_get_seq_hdr() local
1397 return venus_iface_cmdq_write(hdev, pkt, false); in venus_session_get_seq_hdr()
1403 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_set_property() local
1416 return venus_iface_cmdq_write(hdev, pkt, false); in venus_session_set_property()
1421 struct venus_hfi_device *hdev = to_hfi_priv(inst->core); in venus_session_get_property() local
1429 return venus_iface_cmdq_write(hdev, &pkt, true); in venus_session_get_property()
1434 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_resume() local
1437 mutex_lock(&hdev->lock); in venus_resume()
1439 if (!hdev->suspended) in venus_resume()
1442 ret = venus_power_on(hdev); in venus_resume()
1446 hdev->suspended = false; in venus_resume()
1448 mutex_unlock(&hdev->lock); in venus_resume()
1455 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_suspend_1xx() local
1457 void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; in venus_suspend_1xx()
1461 if (!hdev->power_enabled || hdev->suspended) in venus_suspend_1xx()
1464 mutex_lock(&hdev->lock); in venus_suspend_1xx()
1465 ret = venus_is_valid_state(hdev); in venus_suspend_1xx()
1466 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1473 ret = venus_prepare_power_collapse(hdev, true); in venus_suspend_1xx()
1479 mutex_lock(&hdev->lock); in venus_suspend_1xx()
1481 if (hdev->last_packet_type != HFI_CMD_SYS_PC_PREP) { in venus_suspend_1xx()
1482 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1486 ret = venus_are_queues_empty(hdev); in venus_suspend_1xx()
1488 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1494 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1498 ret = venus_power_off(hdev); in venus_suspend_1xx()
1500 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1504 hdev->suspended = true; in venus_suspend_1xx()
1506 mutex_unlock(&hdev->lock); in venus_suspend_1xx()
1511 static bool venus_cpu_and_video_core_idle(struct venus_hfi_device *hdev) in venus_cpu_and_video_core_idle() argument
1513 void __iomem *wrapper_base = hdev->core->wrapper_base; in venus_cpu_and_video_core_idle()
1514 void __iomem *wrapper_tz_base = hdev->core->wrapper_tz_base; in venus_cpu_and_video_core_idle()
1515 void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; in venus_cpu_and_video_core_idle()
1518 if (IS_V6(hdev->core)) in venus_cpu_and_video_core_idle()
1531 static bool venus_cpu_idle_and_pc_ready(struct venus_hfi_device *hdev) in venus_cpu_idle_and_pc_ready() argument
1533 void __iomem *wrapper_base = hdev->core->wrapper_base; in venus_cpu_idle_and_pc_ready()
1534 void __iomem *wrapper_tz_base = hdev->core->wrapper_tz_base; in venus_cpu_idle_and_pc_ready()
1535 void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; in venus_cpu_idle_and_pc_ready()
1538 if (IS_V6(hdev->core)) in venus_cpu_idle_and_pc_ready()
1553 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_suspend_3xx() local
1555 void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; in venus_suspend_3xx()
1560 if (!hdev->power_enabled || hdev->suspended) in venus_suspend_3xx()
1563 mutex_lock(&hdev->lock); in venus_suspend_3xx()
1564 ret = venus_is_valid_state(hdev); in venus_suspend_3xx()
1565 mutex_unlock(&hdev->lock); in venus_suspend_3xx()
1584 ret = readx_poll_timeout(venus_cpu_and_video_core_idle, hdev, val, val, in venus_suspend_3xx()
1589 ret = venus_prepare_power_collapse(hdev, false); in venus_suspend_3xx()
1595 ret = readx_poll_timeout(venus_cpu_idle_and_pc_ready, hdev, val, val, in venus_suspend_3xx()
1601 mutex_lock(&hdev->lock); in venus_suspend_3xx()
1603 ret = venus_power_off(hdev); in venus_suspend_3xx()
1606 mutex_unlock(&hdev->lock); in venus_suspend_3xx()
1610 hdev->suspended = true; in venus_suspend_3xx()
1612 mutex_unlock(&hdev->lock); in venus_suspend_3xx()
1658 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_hfi_destroy() local
1661 venus_interface_queues_release(hdev); in venus_hfi_destroy()
1662 mutex_destroy(&hdev->lock); in venus_hfi_destroy()
1663 kfree(hdev); in venus_hfi_destroy()
1669 struct venus_hfi_device *hdev; in venus_hfi_create() local
1672 hdev = kzalloc(sizeof(*hdev), GFP_KERNEL); in venus_hfi_create()
1673 if (!hdev) in venus_hfi_create()
1676 mutex_init(&hdev->lock); in venus_hfi_create()
1678 hdev->core = core; in venus_hfi_create()
1679 hdev->suspended = true; in venus_hfi_create()
1680 core->priv = hdev; in venus_hfi_create()
1683 ret = venus_interface_queues_init(hdev); in venus_hfi_create()
1690 kfree(hdev); in venus_hfi_create()
1698 struct venus_hfi_device *hdev = to_hfi_priv(core); in venus_hfi_queues_reinit() local
1704 mutex_lock(&hdev->lock); in venus_hfi_queues_reinit()
1707 queue = &hdev->queues[i]; in venus_hfi_queues_reinit()
1709 IFACEQ_GET_QHDR_START_ADDR(hdev->ifaceq_table.kva, i); in venus_hfi_queues_reinit()
1723 tbl_hdr = hdev->ifaceq_table.kva; in venus_hfi_queues_reinit()
1735 queue = &hdev->queues[IFACEQ_DBG_IDX]; in venus_hfi_queues_reinit()
1738 sfr = hdev->sfr.kva; in venus_hfi_queues_reinit()
1744 mutex_unlock(&hdev->lock); in venus_hfi_queues_reinit()