Loading msm/vidc/hfi_common.c +30 −0 Original line number Diff line number Diff line Loading @@ -1807,6 +1807,34 @@ static int venus_hfi_core_release(void *dev) return rc; } static int venus_hfi_core_ping(void *device, u32 sid) { struct hfi_cmd_sys_ping_packet pkt; int rc = 0; struct venus_hfi_device *dev; if (!device) { d_vpr_e("invalid device\n"); return -ENODEV; } dev = device; mutex_lock(&dev->lock); rc = call_hfi_pkt_op(dev, sys_ping, &pkt, sid); if (rc) { d_vpr_e("core_ping: failed to create packet\n"); goto err_create_pkt; } if (__iface_cmdq_write(dev, &pkt, sid)) rc = -ENOTEMPTY; err_create_pkt: mutex_unlock(&dev->lock); return rc; } static int venus_hfi_core_trigger_ssr(void *device, enum hal_ssr_trigger_type ssr_type, u32 sub_client_id, u32 test_addr) Loading Loading @@ -2790,6 +2818,7 @@ static int __response_handler(struct venus_hfi_device *device) case HAL_SESSION_RELEASE_BUFFER_DONE: case HAL_SESSION_RELEASE_RESOURCE_DONE: case HAL_SESSION_PROPERTY_INFO: case HAL_SYS_PING_ACK: inst_id = &info->response.cmd.inst_id; break; case HAL_SESSION_ERROR: Loading Loading @@ -4284,6 +4313,7 @@ void venus_hfi_delete_device(void *device) static void venus_init_hfi_callbacks(struct hfi_device *hdev) { hdev->core_init = venus_hfi_core_init; hdev->core_ping = venus_hfi_core_ping; hdev->core_release = venus_hfi_core_release; hdev->core_trigger_ssr = venus_hfi_core_trigger_ssr; hdev->session_init = venus_hfi_session_init; Loading msm/vidc/hfi_packetization.c +15 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,20 @@ int create_pkt_cmd_sys_init(struct hfi_cmd_sys_init_packet *pkt, return rc; } int create_pkt_cmd_sys_ping(struct hfi_cmd_sys_ping_packet *pkt, u32 sid) { int rc = 0; if (!pkt) return -EINVAL; pkt->size = sizeof(struct hfi_cmd_sys_ping_packet); pkt->packet_type = HFI_CMD_SYS_PING; pkt->sid = sid; return rc; } int create_pkt_cmd_sys_pc_prep(struct hfi_cmd_sys_pc_prep_packet *pkt) { int rc = 0; Loading Loading @@ -692,6 +706,7 @@ int create_pkt_cmd_sys_image_version( static struct hfi_packetization_ops hfi_default = { .sys_init = create_pkt_cmd_sys_init, .sys_ping = create_pkt_cmd_sys_ping, .sys_pc_prep = create_pkt_cmd_sys_pc_prep, .sys_power_control = create_pkt_cmd_sys_power_control, .sys_set_resource = create_pkt_cmd_sys_set_resource, Loading msm/vidc/hfi_packetization.h +1 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ enum hfi_packetization_type { struct hfi_packetization_ops { int (*sys_init)(struct hfi_cmd_sys_init_packet *pkt, u32 arch_type); int (*sys_ping)(struct hfi_cmd_sys_ping_packet *pkt, u32 sid); int (*sys_pc_prep)(struct hfi_cmd_sys_pc_prep_packet *pkt); int (*sys_power_control)(struct hfi_cmd_sys_set_property_packet *pkt, u32 enable); Loading msm/vidc/hfi_response_handler.c +26 −0 Original line number Diff line number Diff line Loading @@ -1079,6 +1079,29 @@ static int hfi_process_session_abort_done(u32 device_id, return 0; } static int hfi_process_sys_ping_ack(u32 device_id, void *_pkt, struct msm_vidc_cb_info *info) { struct hfi_msg_sys_ping_ack_pkt *pkt = _pkt; struct msm_vidc_cb_cmd_done cmd_done = {0}; if (!pkt || pkt->size != sizeof(struct hfi_msg_sys_ping_ack_pkt)) { d_vpr_e("%s: bad packet/packet size: %d\n", __func__, pkt ? pkt->size : 0); return -E2BIG; } s_vpr_h(pkt->sid, "RECEIVED: SYS PING ACK\n"); cmd_done.device_id = device_id; cmd_done.inst_id = (void *)(uintptr_t)pkt->sid; cmd_done.size = 0; info->response_type = HAL_SYS_PING_ACK; info->response.cmd = cmd_done; return 0; } static void hfi_process_sys_get_prop_image_version( struct hfi_msg_sys_property_info_packet *pkt) { Loading Loading @@ -1213,6 +1236,9 @@ int hfi_process_msg_packet(u32 device_id, struct vidc_hal_msg_pkt_hdr *msg_hdr, case HFI_MSG_SYS_SESSION_ABORT_DONE: pkt_func = (pkt_func_def)hfi_process_session_abort_done; break; case HFI_MSG_SYS_PING_ACK: pkt_func = (pkt_func_def)hfi_process_sys_ping_ack; break; default: d_vpr_l("Unable to parse message: %#x\n", msg_hdr->packet); break; Loading msm/vidc/msm_vidc_common.c +38 −1 Original line number Diff line number Diff line Loading @@ -1269,8 +1269,20 @@ static int wait_for_sess_signal_receipt(struct msm_vidc_inst *inst, msecs_to_jiffies( inst->core->resources.msm_vidc_hw_rsp_timeout)); if (!rc) { s_vpr_e(inst->sid, "Wait interrupted or timed out: %d\n", s_vpr_e(inst->sid, "Wait interrupted or timed out(sending ping cmd): %d\n", SESSION_MSG_INDEX(cmd)); rc = call_hfi_op(hdev, core_ping, hdev->hfi_device_data, inst->sid); rc = wait_for_completion_timeout( &inst->core->completions[SYS_MSG_INDEX(HAL_SYS_PING_ACK)], msecs_to_jiffies( inst->core->resources.msm_vidc_hw_rsp_timeout)); if (rc) { if (try_wait_for_completion(&inst->completions[SESSION_MSG_INDEX(cmd)])) { s_vpr_e(inst->sid, "Received %d response. Continue session\n", SESSION_MSG_INDEX(cmd)); return 0; } } msm_comm_kill_session(inst); rc = -EIO; } else { Loading Loading @@ -1900,6 +1912,28 @@ static void handle_stop_done(enum hal_command_response cmd, void *data) put_inst(inst); } static void handle_ping_done(enum hal_command_response cmd, void *data) { struct msm_vidc_cb_cmd_done *response = data; struct msm_vidc_inst *inst; if (!response) { d_vpr_e("Failed to get valid response for stop\n"); return; } inst = get_inst(get_vidc_core(response->device_id), response->inst_id); if (!inst) { d_vpr_e("Got a response for an inactive session\n"); return; } s_vpr_l(inst->sid, "handled: SYS_PING_DONE\n"); complete(&inst->core->completions[SYS_MSG_INDEX(HAL_SYS_PING_ACK)]); put_inst(inst); } static void handle_release_res_done(enum hal_command_response cmd, void *data) { struct msm_vidc_cb_cmd_done *response = data; Loading Loading @@ -2728,6 +2762,9 @@ void handle_cmd_response(enum hal_command_response cmd, void *data) case HAL_SESSION_ABORT_DONE: handle_session_close(cmd, data); break; case HAL_SYS_PING_ACK: handle_ping_done(cmd, data); break; case HAL_SESSION_EVENT_CHANGE: handle_event_change(cmd, data); break; Loading Loading
msm/vidc/hfi_common.c +30 −0 Original line number Diff line number Diff line Loading @@ -1807,6 +1807,34 @@ static int venus_hfi_core_release(void *dev) return rc; } static int venus_hfi_core_ping(void *device, u32 sid) { struct hfi_cmd_sys_ping_packet pkt; int rc = 0; struct venus_hfi_device *dev; if (!device) { d_vpr_e("invalid device\n"); return -ENODEV; } dev = device; mutex_lock(&dev->lock); rc = call_hfi_pkt_op(dev, sys_ping, &pkt, sid); if (rc) { d_vpr_e("core_ping: failed to create packet\n"); goto err_create_pkt; } if (__iface_cmdq_write(dev, &pkt, sid)) rc = -ENOTEMPTY; err_create_pkt: mutex_unlock(&dev->lock); return rc; } static int venus_hfi_core_trigger_ssr(void *device, enum hal_ssr_trigger_type ssr_type, u32 sub_client_id, u32 test_addr) Loading Loading @@ -2790,6 +2818,7 @@ static int __response_handler(struct venus_hfi_device *device) case HAL_SESSION_RELEASE_BUFFER_DONE: case HAL_SESSION_RELEASE_RESOURCE_DONE: case HAL_SESSION_PROPERTY_INFO: case HAL_SYS_PING_ACK: inst_id = &info->response.cmd.inst_id; break; case HAL_SESSION_ERROR: Loading Loading @@ -4284,6 +4313,7 @@ void venus_hfi_delete_device(void *device) static void venus_init_hfi_callbacks(struct hfi_device *hdev) { hdev->core_init = venus_hfi_core_init; hdev->core_ping = venus_hfi_core_ping; hdev->core_release = venus_hfi_core_release; hdev->core_trigger_ssr = venus_hfi_core_trigger_ssr; hdev->session_init = venus_hfi_session_init; Loading
msm/vidc/hfi_packetization.c +15 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,20 @@ int create_pkt_cmd_sys_init(struct hfi_cmd_sys_init_packet *pkt, return rc; } int create_pkt_cmd_sys_ping(struct hfi_cmd_sys_ping_packet *pkt, u32 sid) { int rc = 0; if (!pkt) return -EINVAL; pkt->size = sizeof(struct hfi_cmd_sys_ping_packet); pkt->packet_type = HFI_CMD_SYS_PING; pkt->sid = sid; return rc; } int create_pkt_cmd_sys_pc_prep(struct hfi_cmd_sys_pc_prep_packet *pkt) { int rc = 0; Loading Loading @@ -692,6 +706,7 @@ int create_pkt_cmd_sys_image_version( static struct hfi_packetization_ops hfi_default = { .sys_init = create_pkt_cmd_sys_init, .sys_ping = create_pkt_cmd_sys_ping, .sys_pc_prep = create_pkt_cmd_sys_pc_prep, .sys_power_control = create_pkt_cmd_sys_power_control, .sys_set_resource = create_pkt_cmd_sys_set_resource, Loading
msm/vidc/hfi_packetization.h +1 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ enum hfi_packetization_type { struct hfi_packetization_ops { int (*sys_init)(struct hfi_cmd_sys_init_packet *pkt, u32 arch_type); int (*sys_ping)(struct hfi_cmd_sys_ping_packet *pkt, u32 sid); int (*sys_pc_prep)(struct hfi_cmd_sys_pc_prep_packet *pkt); int (*sys_power_control)(struct hfi_cmd_sys_set_property_packet *pkt, u32 enable); Loading
msm/vidc/hfi_response_handler.c +26 −0 Original line number Diff line number Diff line Loading @@ -1079,6 +1079,29 @@ static int hfi_process_session_abort_done(u32 device_id, return 0; } static int hfi_process_sys_ping_ack(u32 device_id, void *_pkt, struct msm_vidc_cb_info *info) { struct hfi_msg_sys_ping_ack_pkt *pkt = _pkt; struct msm_vidc_cb_cmd_done cmd_done = {0}; if (!pkt || pkt->size != sizeof(struct hfi_msg_sys_ping_ack_pkt)) { d_vpr_e("%s: bad packet/packet size: %d\n", __func__, pkt ? pkt->size : 0); return -E2BIG; } s_vpr_h(pkt->sid, "RECEIVED: SYS PING ACK\n"); cmd_done.device_id = device_id; cmd_done.inst_id = (void *)(uintptr_t)pkt->sid; cmd_done.size = 0; info->response_type = HAL_SYS_PING_ACK; info->response.cmd = cmd_done; return 0; } static void hfi_process_sys_get_prop_image_version( struct hfi_msg_sys_property_info_packet *pkt) { Loading Loading @@ -1213,6 +1236,9 @@ int hfi_process_msg_packet(u32 device_id, struct vidc_hal_msg_pkt_hdr *msg_hdr, case HFI_MSG_SYS_SESSION_ABORT_DONE: pkt_func = (pkt_func_def)hfi_process_session_abort_done; break; case HFI_MSG_SYS_PING_ACK: pkt_func = (pkt_func_def)hfi_process_sys_ping_ack; break; default: d_vpr_l("Unable to parse message: %#x\n", msg_hdr->packet); break; Loading
msm/vidc/msm_vidc_common.c +38 −1 Original line number Diff line number Diff line Loading @@ -1269,8 +1269,20 @@ static int wait_for_sess_signal_receipt(struct msm_vidc_inst *inst, msecs_to_jiffies( inst->core->resources.msm_vidc_hw_rsp_timeout)); if (!rc) { s_vpr_e(inst->sid, "Wait interrupted or timed out: %d\n", s_vpr_e(inst->sid, "Wait interrupted or timed out(sending ping cmd): %d\n", SESSION_MSG_INDEX(cmd)); rc = call_hfi_op(hdev, core_ping, hdev->hfi_device_data, inst->sid); rc = wait_for_completion_timeout( &inst->core->completions[SYS_MSG_INDEX(HAL_SYS_PING_ACK)], msecs_to_jiffies( inst->core->resources.msm_vidc_hw_rsp_timeout)); if (rc) { if (try_wait_for_completion(&inst->completions[SESSION_MSG_INDEX(cmd)])) { s_vpr_e(inst->sid, "Received %d response. Continue session\n", SESSION_MSG_INDEX(cmd)); return 0; } } msm_comm_kill_session(inst); rc = -EIO; } else { Loading Loading @@ -1900,6 +1912,28 @@ static void handle_stop_done(enum hal_command_response cmd, void *data) put_inst(inst); } static void handle_ping_done(enum hal_command_response cmd, void *data) { struct msm_vidc_cb_cmd_done *response = data; struct msm_vidc_inst *inst; if (!response) { d_vpr_e("Failed to get valid response for stop\n"); return; } inst = get_inst(get_vidc_core(response->device_id), response->inst_id); if (!inst) { d_vpr_e("Got a response for an inactive session\n"); return; } s_vpr_l(inst->sid, "handled: SYS_PING_DONE\n"); complete(&inst->core->completions[SYS_MSG_INDEX(HAL_SYS_PING_ACK)]); put_inst(inst); } static void handle_release_res_done(enum hal_command_response cmd, void *data) { struct msm_vidc_cb_cmd_done *response = data; Loading Loading @@ -2728,6 +2762,9 @@ void handle_cmd_response(enum hal_command_response cmd, void *data) case HAL_SESSION_ABORT_DONE: handle_session_close(cmd, data); break; case HAL_SYS_PING_ACK: handle_ping_done(cmd, data); break; case HAL_SESSION_EVENT_CHANGE: handle_event_change(cmd, data); break; Loading