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

Commit e8cae6fe authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: cvp: Add support of new session control commands"

parents 16bf82e5 05c9b8f7
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@

#define HFI_CMD_SYS_OX_START		\
(HFI_DOMAIN_BASE_COMMON + HFI_ARCH_OX_OFFSET + HFI_CMD_START_OFFSET + 0x0000)
#define HFI_CMD_SYS_SESSION_ABORT	(HFI_CMD_SYS_OX_START + 0x001)
#define HFI_CMD_SYS_PING		(HFI_CMD_SYS_OX_START + 0x002)

#define HFI_CMD_SESSION_OX_START	\
@@ -149,7 +148,6 @@
#define HFI_MSG_SYS_OX_START			\
(HFI_DOMAIN_BASE_COMMON + HFI_ARCH_OX_OFFSET + HFI_MSG_START_OFFSET + 0x0000)
#define HFI_MSG_SYS_PING_ACK	(HFI_MSG_SYS_OX_START + 0x2)
#define HFI_MSG_SYS_SESSION_ABORT_DONE	(HFI_MSG_SYS_OX_START + 0x4)

#define HFI_MSG_SESSION_OX_START		\
(HFI_DOMAIN_BASE_COMMON + HFI_ARCH_OX_OFFSET + HFI_MSG_START_OFFSET + 0x1000)
+2 −0
Original line number Diff line number Diff line
@@ -413,6 +413,7 @@ struct cvp_hfi_resource_syscache_info_type {
#define HFI_CMD_SYS_SESSION_INIT	(HFI_CMD_SYS_COMMON_START + 0x007)
#define HFI_CMD_SYS_SESSION_END		(HFI_CMD_SYS_COMMON_START + 0x008)
#define HFI_CMD_SYS_SET_BUFFERS		(HFI_CMD_SYS_COMMON_START + 0x009)
#define HFI_CMD_SYS_SESSION_ABORT	(HFI_CMD_SYS_COMMON_START + 0x00A)
#define HFI_CMD_SYS_TEST_START		(HFI_CMD_SYS_COMMON_START + 0x100)

#define HFI_CMD_SESSION_COMMON_START		\
@@ -437,6 +438,7 @@ struct cvp_hfi_resource_syscache_info_type {
#define HFI_MSG_SYS_IDLE		(HFI_MSG_SYS_COMMON_START + 0x8)
#define HFI_MSG_SYS_COV                 (HFI_MSG_SYS_COMMON_START + 0x9)
#define HFI_MSG_SYS_PROPERTY_INFO	(HFI_MSG_SYS_COMMON_START + 0xA)
#define HFI_MSG_SYS_SESSION_ABORT_DONE	(HFI_MSG_SYS_COMMON_START + 0xC)
#define HFI_MSG_SESSION_SYNC_DONE      (HFI_MSG_SESSION_OX_START + 0xD)

#define HFI_MSG_SESSION_COMMON_START		\
+26 −13
Original line number Diff line number Diff line
@@ -189,19 +189,32 @@
#define CVP_NOC_ERR_ERRLOG3_HIGH_OFFS	(CVP_NOC_BASE_OFFS + 0xBC)

#define CVP_NOC_CORE_BASE_OFFS			0x00010000
#define CVP_NOC_CORE_ERR_SWID_LOW_OFFS		(CVP_NOC_CORE_BASE_OFFS + 0x80)
#define CVP_NOC_CORE_ERR_SWID_HIGH_OFFS		(CVP_NOC_CORE_BASE_OFFS + 0x84)
#define CVP_NOC_CORE_ERR_MAINCTL_LOW_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0x88)
#define CVP_NOC_CORE_ERR_ERRVLD_LOW_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0x90)
#define CVP_NOC_CORE_ERR_ERRCLR_LOW_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0x98)
#define CVP_NOC_CORE_ERR_ERRLOG0_LOW_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0xA0)
#define CVP_NOC_CORE_ERR_ERRLOG0_HIGH_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0xA4)
#define CVP_NOC_CORE_ERR_ERRLOG1_LOW_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0xA8)
#define CVP_NOC_CORE_ERR_ERRLOG1_HIGH_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0xAC)
#define CVP_NOC_CORE_ERR_ERRLOG2_LOW_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0xB0)
#define CVP_NOC_CORE_ERR_ERRLOG2_HIGH_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0xB4)
#define CVP_NOC_CORE_ERR_ERRLOG3_LOW_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0xB8)
#define CVP_NOC_CORE_ERR_ERRLOG3_HIGH_OFFS	(CVP_NOC_CORE_BASE_OFFS + 0xBC)
#define CVP_NOC_CORE_ERR_SWID_LOW_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1200)
#define CVP_NOC_CORE_ERR_SWID_HIGH_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1204)
#define CVP_NOC_CORE_ERR_MAINCTL_LOW_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1208)
#define CVP_NOC_CORE_ERR_ERRVLD_LOW_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1210)
#define CVP_NOC_CORE_ERR_ERRCLR_LOW_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1218)
#define CVP_NOC_CORE_ERR_ERRLOG0_LOW_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1220)
#define CVP_NOC_CORE_ERR_ERRLOG0_HIGH_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1224)
#define CVP_NOC_CORE_ERR_ERRLOG1_LOW_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1228)
#define CVP_NOC_CORE_ERR_ERRLOG1_HIGH_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x122C)
#define CVP_NOC_CORE_ERR_ERRLOG2_LOW_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1230)
#define CVP_NOC_CORE_ERR_ERRLOG2_HIGH_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1234)
#define CVP_NOC_CORE_ERR_ERRLOG3_LOW_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x1238)
#define CVP_NOC_CORE_ERR_ERRLOG3_HIGH_OFFS \
		(CVP_NOC_CORE_BASE_OFFS + 0x123C)


#define CVP_AON_WRAPPER_MVP_NOC_LPI_CONTROL	(CVP_AON_BASE_OFFS)
+7 −6
Original line number Diff line number Diff line
@@ -201,18 +201,19 @@ inline int cvp_create_pkt_cmd_sys_session_init(
		struct cvp_hal_session *session)
{
	int rc = 0;
	struct msm_cvp_inst *inst = session->session_id;

	if (!pkt)
	if (!pkt || !inst)
		return -EINVAL;

	pkt->size = sizeof(struct cvp_hfi_cmd_sys_session_init_packet);
	pkt->packet_type = HFI_CMD_SYS_SESSION_INIT;
	pkt->session_id = hash32_ptr(session);
	pkt->session_kmask = 0xFFFFFFFF;
	pkt->session_type = HFI_SESSION_CV;
	pkt->session_prio = 0;
	pkt->is_secure = 0;
	pkt->dsp_ac_mask = 0;
	pkt->session_type = inst->prop.type;
	pkt->session_kmask = inst->prop.kernel_mask;
	pkt->session_prio = inst->prop.priority;
	pkt->is_secure = inst->prop.is_secure;
	pkt->dsp_ac_mask = inst->prop.dsp_mask;

	return rc;
}
+167 −16
Original line number Diff line number Diff line
@@ -16,15 +16,6 @@
#define MAX_CVP_ISE_CYCLES		(MSM_CVP_NOMINAL_CYCLES - \
		MSM_CVP_UHD60E_ISE_CYCLES)

struct msm_cvp_fence_thread_data {
	struct msm_cvp_inst *inst;
	unsigned int device_id;
	struct cvp_kmd_hfi_fence_packet in_fence_pkt;
	unsigned int arg_type;
};

static struct msm_cvp_fence_thread_data fence_thread_data;

void print_cvp_internal_buffer(u32 tag, const char *str,
		struct msm_cvp_inst *inst, struct msm_cvp_internal_buffer *cbuf)
{
@@ -614,7 +605,7 @@ static int msm_cvp_thread_fence_run(void *data)
	if (!inst) {
		dprintk(CVP_ERR, "%s Wrong inst %pK\n", __func__, inst);
		rc = -EINVAL;
		goto exit;
		return rc;
	}
	in_fence_pkt = (struct cvp_kmd_hfi_fence_packet *)
					&fence_thread_data->in_fence_pkt;
@@ -823,6 +814,7 @@ static int msm_cvp_thread_fence_run(void *data)
	}

exit:
	kmem_cache_free(inst->fence_data_cache, fence_thread_data);
	cvp_put_inst(inst);
	do_exit(rc);
}
@@ -839,6 +831,7 @@ static int msm_cvp_session_process_hfi_fence(
	struct cvp_kmd_hfi_packet *in_pkt;
	unsigned int signal, offset, buf_num, in_offset, in_buf_num;
	struct msm_cvp_inst *s;
	struct msm_cvp_fence_thread_data *fence_thread_data;

	dprintk(CVP_DBG, "%s: Enter inst = %#x", __func__, inst);

@@ -851,6 +844,14 @@ static int msm_cvp_session_process_hfi_fence(
	if (!s)
		return -ECONNRESET;

	fence_thread_data = kmem_cache_alloc(inst->fence_data_cache,
			GFP_KERNEL);
	if (!fence_thread_data) {
		dprintk(CVP_ERR, "%s: fence_thread_data alloc failed\n",
				__func__);
		return -ENOMEM;
	}

	in_offset = arg->buf_offset;
	in_buf_num = arg->buf_num;
	in_pkt = (struct cvp_kmd_hfi_packet *)&arg->data.hfi_pkt;
@@ -878,15 +879,17 @@ static int msm_cvp_session_process_hfi_fence(
		goto exit;

	thread_num = thread_num + 1;
	fence_thread_data.inst = inst;
	fence_thread_data.device_id = (unsigned int)inst->core->id;
	memcpy(&fence_thread_data.in_fence_pkt, &arg->data.hfi_fence_pkt,
	fence_thread_data->inst = inst;
	fence_thread_data->device_id = (unsigned int)inst->core->id;
	memcpy(&fence_thread_data->in_fence_pkt, &arg->data.hfi_fence_pkt,
				sizeof(struct cvp_kmd_hfi_fence_packet));
	fence_thread_data.arg_type = arg->type;
	fence_thread_data->arg_type = arg->type;
	snprintf(thread_fence_name, sizeof(thread_fence_name),
				"thread_fence_%d", thread_num);
	thread = kthread_run(msm_cvp_thread_fence_run,
			&fence_thread_data, thread_fence_name);
			fence_thread_data, thread_fence_name);
	if (!thread)
		kmem_cache_free(inst->fence_data_cache, fence_thread_data);

exit:
	cvp_put_inst(s);
@@ -1145,6 +1148,49 @@ static int msm_cvp_unregister_buffer(struct msm_cvp_inst *inst,
	return rc;
}

static int msm_cvp_session_create(struct msm_cvp_inst *inst)
{
	int rc = 0;

	if (!inst || !inst->core)
		return -EINVAL;

	if (inst->state != MSM_CVP_CORE_INIT_DONE ||
		inst->state > MSM_CVP_OPEN_DONE) {
		dprintk(CVP_ERR, "not ready create instance %d\n", inst->state);
		return -EINVAL;
	}

	rc = msm_cvp_comm_try_state(inst, MSM_CVP_OPEN_DONE);
	if (rc) {
		dprintk(CVP_ERR,
				"Failed to move instance to open done state\n");
		goto fail_init;
	}

	rc = cvp_comm_set_arp_buffers(inst);
	if (rc) {
		dprintk(CVP_ERR,
				"Failed to set ARP buffers\n");
		goto fail_init;
	}

fail_init:
	return rc;
}

static int session_state_check_init(struct msm_cvp_inst *inst)
{
	mutex_lock(&inst->lock);
	if (inst->state >= MSM_CVP_OPEN && inst->state < MSM_CVP_STOP) {
		mutex_unlock(&inst->lock);
		return 0;
	}
	mutex_unlock(&inst->lock);

	return msm_cvp_session_create(inst);
}

static int msm_cvp_session_start(struct msm_cvp_inst *inst,
		struct cvp_kmd_arg *arg)
{
@@ -1210,7 +1256,9 @@ static int msm_cvp_session_ctrl(struct msm_cvp_inst *inst,
		rc = msm_cvp_session_start(inst, arg);
		break;
	case SESSION_CREATE:
		rc = msm_cvp_session_create(inst);
	case SESSION_DELETE:
		break;
	case SESSION_INFO:
	default:
		dprintk(CVP_ERR, "%s Unsupported session ctrl%d\n",
@@ -1237,7 +1285,7 @@ static int msm_cvp_get_sysprop(struct msm_cvp_inst *inst,
	hfi = hdev->hfi_device_data;

	switch (props->prop_data.prop_type) {
	case CVP_HFI_VERSION:
	case CVP_KMD_PROP_HFI_VERSION:
	{
		props->prop_data.data = hfi->version;
		break;
@@ -1250,6 +1298,49 @@ static int msm_cvp_get_sysprop(struct msm_cvp_inst *inst,
	return rc;
}

static int msm_cvp_set_sysprop(struct msm_cvp_inst *inst,
		struct cvp_kmd_arg *arg)
{
	struct cvp_kmd_sys_properties *props = &arg->data.sys_properties;
	struct cvp_kmd_sys_property *prop_array;
	struct cvp_session_prop *session_prop;
	int i, rc = 0;

	if (!inst) {
		dprintk(CVP_ERR, "%s: invalid params\n", __func__);
		return -EINVAL;
	}

	prop_array = &arg->data.sys_properties.prop_data;
	session_prop = &inst->prop;

	for (i = 0; i < props->prop_num; i++) {
		switch (prop_array[i].prop_type) {
		case CVP_KMD_PROP_SESSION_TYPE:
			session_prop->type = prop_array[i].data;
			break;
		case CVP_KMD_PROP_SESSION_KERNELMASK:
			session_prop->kernel_mask = prop_array[i].data;
			break;
		case CVP_KMD_PROP_SESSION_PRIORITY:
			session_prop->priority = prop_array[i].data;
			break;
		case CVP_KMD_PROP_SESSION_SECURITY:
			session_prop->is_secure = prop_array[i].data;
			break;
		case CVP_KMD_PROP_SESSION_DSPMASK:
			session_prop->dsp_mask = prop_array[i].data;
			break;
		default:
			dprintk(CVP_ERR,
				"unrecognized sys property to set %d\n",
				prop_array[i].prop_type);
			rc = -EFAULT;
		}
	}
	return rc;
}

int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg)
{
	int rc = 0;
@@ -1260,6 +1351,18 @@ int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg)
	}
	dprintk(CVP_DBG, "%s: arg->type = %x", __func__, arg->type);

	if (arg->type != CVP_KMD_SESSION_CONTROL &&
		arg->type != CVP_KMD_SET_SYS_PROPERTY &&
		arg->type != CVP_KMD_GET_SYS_PROPERTY) {

		rc = session_state_check_init(inst);
		if (rc) {
			dprintk(CVP_ERR, "session not ready for commands %d",
					arg->type);
			return rc;
		}
	}

	switch (arg->type) {
	case CVP_KMD_GET_SESSION_INFO:
	{
@@ -1358,6 +1461,9 @@ int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg)
	case CVP_KMD_GET_SYS_PROPERTY:
		rc = msm_cvp_get_sysprop(inst, arg);
		break;
	case CVP_KMD_SET_SYS_PROPERTY:
		rc = msm_cvp_set_sysprop(inst, arg);
		break;
	default:
		dprintk(CVP_DBG, "%s: unknown arg type %#x\n",
				__func__, arg->type);
@@ -1371,6 +1477,8 @@ int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg)
int msm_cvp_session_deinit(struct msm_cvp_inst *inst)
{
	int rc = 0;
	struct cvp_hal_session *session;
	struct msm_cvp_internal_buffer *cbuf, *dummy;

	if (!inst || !inst->core) {
		dprintk(CVP_ERR, "%s: invalid params\n", __func__);
@@ -1379,6 +1487,12 @@ int msm_cvp_session_deinit(struct msm_cvp_inst *inst)
	dprintk(CVP_DBG, "%s: inst %pK (%#x)\n", __func__,
		inst, hash32_ptr(inst->session));

	session = (struct cvp_hal_session *)inst->session;
	if (!session) {
		dprintk(CVP_ERR, "%s: invalid session\n", __func__);
		return -EINVAL;
	}

	rc = msm_cvp_comm_try_state(inst, MSM_CVP_CLOSE_DONE);
	if (rc)
		dprintk(CVP_ERR, "%s: close failed\n", __func__);
@@ -1391,6 +1505,37 @@ int msm_cvp_session_deinit(struct msm_cvp_inst *inst)
		dprintk(CVP_ERR, "%s: failed to scale_clocks_and_bus\n",
			__func__);

	mutex_lock(&inst->cvpcpubufs.lock);
	list_for_each_entry_safe(cbuf, dummy, &inst->cvpcpubufs.list,
			list) {
		print_client_buffer(CVP_DBG, "remove from cvpcpubufs",
				inst, &cbuf->buf);
		msm_cvp_smem_unmap_dma_buf(inst, &cbuf->smem);
		list_del(&cbuf->list);
	}
	mutex_unlock(&inst->cvpcpubufs.lock);

	mutex_lock(&inst->cvpdspbufs.lock);
	list_for_each_entry_safe(cbuf, dummy, &inst->cvpdspbufs.list,
			list) {
		print_client_buffer(CVP_DBG, "remove from cvpdspbufs",
				inst, &cbuf->buf);
		rc = cvp_dsp_deregister_buffer(
			(uint32_t)cbuf->smem.device_addr,
			cbuf->buf.index, cbuf->buf.size,
			hash32_ptr(session));
		if (rc)
			dprintk(CVP_ERR,
				"%s: failed dsp deregistration fd=%d rc=%d",
				__func__, cbuf->buf.fd, rc);

		msm_cvp_smem_unmap_dma_buf(inst, &cbuf->smem);
		list_del(&cbuf->list);
	}
	mutex_unlock(&inst->cvpdspbufs.lock);

	msm_cvp_comm_free_freq_table(inst);

	return rc;
}

@@ -1412,5 +1557,11 @@ int msm_cvp_session_init(struct msm_cvp_inst *inst)
	inst->clk_data.ddr_bw = 1000;
	inst->clk_data.sys_cache_bw = 1000;

	inst->prop.type = HFI_SESSION_CV;
	inst->prop.kernel_mask = 0xFFFFFFFF;
	inst->prop.priority = 0;
	inst->prop.is_secure = 0;
	inst->prop.dsp_mask = 0;

	return rc;
}
Loading