Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c585c9cb authored by Linux Build Service Account's avatar Linux Build Service Account
Browse files

Merge 667025ee on remote branch

Change-Id: Ibada0c2e29744bbb2e515d40cadfad25464586ed
parents 83cf2396 667025ee
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -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)
@@ -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:
@@ -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;
+15 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -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);
+26 −0
Original line number Diff line number Diff line
@@ -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)
{
@@ -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;
+38 −1
Original line number Diff line number Diff line
@@ -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 {
@@ -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;
@@ -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