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

Commit 0c14239b authored by Ruofei Ma's avatar Ruofei Ma
Browse files

msm: cvp: Secure session support



Enable secure session in cvp driver to support content
protection use cases.

Change-Id: I3c1336610f8fc9333a994ea691b5ca983928ca2b
Signed-off-by: default avatarRuofei Ma <ruofeim@codeaurora.org>
parent 4a1ec086
Loading
Loading
Loading
Loading
+11 −22
Original line number Original line Diff line number Diff line
@@ -919,9 +919,8 @@ static int __read_queue(struct cvp_iface_q_info *qinfo, u8 *packet,
	return rc;
	return rc;
}
}


static int __smem_alloc(struct iris_hfi_device *dev,
static int __smem_alloc(struct iris_hfi_device *dev, struct cvp_mem_addr *mem,
			struct cvp_mem_addr *mem, u32 size, u32 align,
			u32 size, u32 align, u32 flags)
			u32 flags, u32 usage)
{
{
	struct msm_cvp_smem *alloc = &mem->mem_data;
	struct msm_cvp_smem *alloc = &mem->mem_data;
	int rc = 0;
	int rc = 0;
@@ -933,7 +932,7 @@ static int __smem_alloc(struct iris_hfi_device *dev,


	dprintk(CVP_INFO, "start to alloc size: %d, flags: %d\n", size, flags);
	dprintk(CVP_INFO, "start to alloc size: %d, flags: %d\n", size, flags);
	rc = msm_cvp_smem_alloc(
	rc = msm_cvp_smem_alloc(
		size, align, flags, usage, 1, (void *)dev->res,
		size, align, flags, 1, (void *)dev->res,
		MSM_CVP_UNKNOWN, alloc);
		MSM_CVP_UNKNOWN, alloc);
	if (rc) {
	if (rc) {
		dprintk(CVP_ERR, "Alloc failed\n");
		dprintk(CVP_ERR, "Alloc failed\n");
@@ -1722,8 +1721,7 @@ static int __interface_dsp_queues_init(struct iris_hfi_device *dev)
		dprintk(CVP_ERR, "%s: failed dma allocation\n", __func__);
		dprintk(CVP_ERR, "%s: failed dma allocation\n", __func__);
		goto fail_dma_alloc;
		goto fail_dma_alloc;
	}
	}
	cb = msm_cvp_smem_get_context_bank(MSM_CVP_UNKNOWN, 0,
	cb = msm_cvp_smem_get_context_bank(MSM_CVP_UNKNOWN, 0, dev->res, 0);
			dev->res, HAL_BUFFER_INTERNAL_CMD_QUEUE);
	if (!cb) {
	if (!cb) {
		dprintk(CVP_ERR,
		dprintk(CVP_ERR,
			"%s: failed to get context bank\n", __func__);
			"%s: failed to get context bank\n", __func__);
@@ -1744,7 +1742,7 @@ static int __interface_dsp_queues_init(struct iris_hfi_device *dev)
	mem_data->device_addr = iova;
	mem_data->device_addr = iova;
	mem_data->dma_handle = dma_handle;
	mem_data->dma_handle = dma_handle;
	mem_data->size = q_size;
	mem_data->size = q_size;
	mem_data->buffer_type = HAL_BUFFER_INTERNAL_CMD_QUEUE;
	mem_data->buffer_type = 0;
	mem_data->mapping_info.cb_info = cb;
	mem_data->mapping_info.cb_info = cb;


	if (!is_iommu_present(dev->res))
	if (!is_iommu_present(dev->res))
@@ -1833,7 +1831,7 @@ static void __interface_queues_release(struct iris_hfi_device *device)


		mem_map = (struct cvp_hfi_mem_map *)(qdss + 1);
		mem_map = (struct cvp_hfi_mem_map *)(qdss + 1);
		cb = msm_cvp_smem_get_context_bank(MSM_CVP_UNKNOWN,
		cb = msm_cvp_smem_get_context_bank(MSM_CVP_UNKNOWN,
			false, device->res, HAL_BUFFER_INTERNAL_CMD_QUEUE);
			false, device->res, 0);


		for (i = 0; cb && i < num_entries; i++) {
		for (i = 0; cb && i < num_entries; i++) {
			iommu_unmap(cb->mapping->domain,
			iommu_unmap(cb->mapping->domain,
@@ -1961,8 +1959,7 @@ static int __interface_queues_init(struct iris_hfi_device *dev)
	mem_addr = &dev->mem_addr;
	mem_addr = &dev->mem_addr;
	if (!is_iommu_present(dev->res))
	if (!is_iommu_present(dev->res))
		fw_bias = dev->cvp_hal_data->firmware_base;
		fw_bias = dev->cvp_hal_data->firmware_base;
	rc = __smem_alloc(dev, mem_addr, q_size, 1, SMEM_UNCACHED,
	rc = __smem_alloc(dev, mem_addr, q_size, 1, SMEM_UNCACHED);
			HAL_BUFFER_INTERNAL_CMD_QUEUE);
	if (rc) {
	if (rc) {
		dprintk(CVP_ERR, "iface_q_table_alloc_fail\n");
		dprintk(CVP_ERR, "iface_q_table_alloc_fail\n");
		goto fail_alloc_queue;
		goto fail_alloc_queue;
@@ -1990,9 +1987,8 @@ static int __interface_queues_init(struct iris_hfi_device *dev)
	}
	}


	if ((msm_cvp_fw_debug_mode & HFI_DEBUG_MODE_QDSS) && num_entries) {
	if ((msm_cvp_fw_debug_mode & HFI_DEBUG_MODE_QDSS) && num_entries) {
		rc = __smem_alloc(dev, mem_addr,
		rc = __smem_alloc(dev, mem_addr, ALIGNED_QDSS_SIZE, 1,
				ALIGNED_QDSS_SIZE, 1, SMEM_UNCACHED,
				SMEM_UNCACHED);
				HAL_BUFFER_INTERNAL_CMD_QUEUE);
		if (rc) {
		if (rc) {
			dprintk(CVP_WARN,
			dprintk(CVP_WARN,
				"qdss_alloc_fail: QDSS messages logging will not work\n");
				"qdss_alloc_fail: QDSS messages logging will not work\n");
@@ -2007,9 +2003,7 @@ static int __interface_queues_init(struct iris_hfi_device *dev)
		}
		}
	}
	}


	rc = __smem_alloc(dev, mem_addr,
	rc = __smem_alloc(dev, mem_addr, ALIGNED_SFR_SIZE, 1, SMEM_UNCACHED);
			ALIGNED_SFR_SIZE, 1, SMEM_UNCACHED,
			HAL_BUFFER_INTERNAL_CMD_QUEUE);
	if (rc) {
	if (rc) {
		dprintk(CVP_WARN, "sfr_alloc_fail: SFR not will work\n");
		dprintk(CVP_WARN, "sfr_alloc_fail: SFR not will work\n");
		dev->sfr.align_device_addr = 0;
		dev->sfr.align_device_addr = 0;
@@ -2063,7 +2057,7 @@ static int __interface_queues_init(struct iris_hfi_device *dev)


		mem_map = (struct cvp_hfi_mem_map *)(qdss + 1);
		mem_map = (struct cvp_hfi_mem_map *)(qdss + 1);
		cb = msm_cvp_smem_get_context_bank(MSM_CVP_UNKNOWN, false,
		cb = msm_cvp_smem_get_context_bank(MSM_CVP_UNKNOWN, false,
			dev->res, HAL_BUFFER_INTERNAL_CMD_QUEUE);
			dev->res, 0);
		if (!cb) {
		if (!cb) {
			dprintk(CVP_ERR,
			dprintk(CVP_ERR,
				"%s: failed to get context bank\n", __func__);
				"%s: failed to get context bank\n", __func__);
@@ -2739,11 +2733,6 @@ static int venus_hfi_session_release_buffers(void *sess,
		rc = -ECONNRESET;
		rc = -ECONNRESET;
		goto err_create_pkt;
		goto err_create_pkt;
	}
	}
	if (buffer_info->buffer_type != HAL_BUFFER_INTERNAL_PERSIST_1) {
		dprintk(CVP_ERR, "INTERNAL_PERSIST_1 expected\n");
		rc = -EINVAL;
		goto err_create_pkt;
	}


	rc = call_hfi_pkt_op(device, session_release_buffers,
	rc = call_hfi_pkt_op(device, session_release_buffers,
			&pkt, session, buffer_info);
			&pkt, session, buffer_info);
+1 −2
Original line number Original line Diff line number Diff line
@@ -416,8 +416,7 @@ static int msm_cvp_map_buf_cpu(struct msm_cvp_inst *inst,
	cbuf->buf.flags = in_buf->flags;
	cbuf->buf.flags = in_buf->flags;
	cbuf->buf.type = CVP_KMD_BUFTYPE_INPUT | CVP_KMD_BUFTYPE_OUTPUT;
	cbuf->buf.type = CVP_KMD_BUFTYPE_INPUT | CVP_KMD_BUFTYPE_OUTPUT;


	/* HFI doesn't have buffer type, set it as HAL_BUFFER_INPUT */
	cbuf->smem.buffer_type = in_buf->flags;
	cbuf->smem.buffer_type = HAL_BUFFER_INPUT;
	cbuf->smem.fd = cbuf->buf.fd;
	cbuf->smem.fd = cbuf->buf.fd;
	cbuf->smem.size = cbuf->buf.size;
	cbuf->smem.size = cbuf->buf.size;
	cbuf->smem.flags = 0;
	cbuf->smem.flags = 0;
+11 −47
Original line number Original line Diff line number Diff line
@@ -1484,32 +1484,6 @@ int msm_cvp_comm_kill_session(struct msm_cvp_inst *inst)
	return rc;
	return rc;
}
}


int msm_cvp_comm_smem_alloc(struct msm_cvp_inst *inst,
		size_t size, u32 align, u32 flags, enum hal_buffer buffer_type,
		int map_kernel, struct msm_cvp_smem *smem)
{
	int rc = 0;

	if (!inst || !inst->core) {
		dprintk(CVP_ERR, "%s: invalid inst: %pK\n", __func__, inst);
		return -EINVAL;
	}
	rc = msm_cvp_smem_alloc(size, align, flags, buffer_type, map_kernel,
				&(inst->core->resources), inst->session_type,
				smem);
	return rc;
}

void msm_cvp_comm_smem_free(struct msm_cvp_inst *inst, struct msm_cvp_smem *mem)
{
	if (!inst || !inst->core || !mem) {
		dprintk(CVP_ERR,
			"%s: invalid params: %pK %pK\n", __func__, inst, mem);
		return;
	}
	msm_cvp_smem_free(mem);
}

void msm_cvp_fw_unload_handler(struct work_struct *work)
void msm_cvp_fw_unload_handler(struct work_struct *work)
{
{
	struct msm_cvp_core *core = NULL;
	struct msm_cvp_core *core = NULL;
@@ -1612,7 +1586,6 @@ int msm_cvp_comm_unmap_cvp_buffer(struct msm_cvp_inst *inst,
}
}


static int set_internal_buf_on_fw(struct msm_cvp_inst *inst,
static int set_internal_buf_on_fw(struct msm_cvp_inst *inst,
				enum hal_buffer buffer_type,
				struct msm_cvp_smem *handle, bool reuse)
				struct msm_cvp_smem *handle, bool reuse)
{
{
	struct cvp_buffer_addr_info buffer_info;
	struct cvp_buffer_addr_info buffer_info;
@@ -1627,7 +1600,7 @@ static int set_internal_buf_on_fw(struct msm_cvp_inst *inst,
	hdev = inst->core->device;
	hdev = inst->core->device;


	buffer_info.buffer_size = handle->size;
	buffer_info.buffer_size = handle->size;
	buffer_info.buffer_type = buffer_type;
	buffer_info.buffer_type = 0;
	buffer_info.num_buffers = 1;
	buffer_info.num_buffers = 1;
	buffer_info.align_device_addr = handle->device_addr;
	buffer_info.align_device_addr = handle->device_addr;
	dprintk(CVP_DBG, "%s %s buffer : %x\n",
	dprintk(CVP_DBG, "%s %s buffer : %x\n",
@@ -1645,23 +1618,22 @@ static int set_internal_buf_on_fw(struct msm_cvp_inst *inst,
}
}


static int allocate_and_set_internal_bufs(struct msm_cvp_inst *inst,
static int allocate_and_set_internal_bufs(struct msm_cvp_inst *inst,
			struct cvp_hal_buffer_requirements *internal_bufreq,
			u32 buffer_size, struct msm_cvp_list *buf_list)
			struct msm_cvp_list *buf_list)
{
{
	struct cvp_internal_buf *binfo;
	struct cvp_internal_buf *binfo;
	u32 smem_flags = SMEM_UNCACHED;
	u32 smem_flags = SMEM_UNCACHED;
	int rc = 0;
	int rc = 0;


	if (!inst || !internal_bufreq || !buf_list) {
	if (!inst || !buf_list) {
		dprintk(CVP_ERR, "%s Invalid input\n", __func__);
		dprintk(CVP_ERR, "%s Invalid input\n", __func__);
		return -EINVAL;
		return -EINVAL;
	}
	}


	if (!internal_bufreq->buffer_size)
	if (!buffer_size)
		return 0;
		return 0;


	/* PERSIST buffer requires secure mapping */
	/* PERSIST buffer requires secure mapping */
	smem_flags |= SMEM_SECURE;
	smem_flags |= SMEM_SECURE | SMEM_NON_PIXEL;


	binfo = kzalloc(sizeof(*binfo), GFP_KERNEL);
	binfo = kzalloc(sizeof(*binfo), GFP_KERNEL);
	if (!binfo) {
	if (!binfo) {
@@ -1670,8 +1642,7 @@ static int allocate_and_set_internal_bufs(struct msm_cvp_inst *inst,
		goto fail_kzalloc;
		goto fail_kzalloc;
	}
	}


	rc = msm_cvp_smem_alloc(internal_bufreq->buffer_size, 1, smem_flags,
	rc = msm_cvp_smem_alloc(buffer_size, 1, smem_flags, 0,
			internal_bufreq->buffer_type, 0,
			&(inst->core->resources), inst->session_type,
			&(inst->core->resources), inst->session_type,
			&binfo->smem);
			&binfo->smem);
	if (rc) {
	if (rc) {
@@ -1679,10 +1650,9 @@ static int allocate_and_set_internal_bufs(struct msm_cvp_inst *inst,
		goto err_no_mem;
		goto err_no_mem;
	}
	}


	binfo->buffer_type = internal_bufreq->buffer_type;
	binfo->buffer_type = 0;


	rc = set_internal_buf_on_fw(inst, internal_bufreq->buffer_type,
	rc = set_internal_buf_on_fw(inst, &binfo->smem, false);
			&binfo->smem, false);
	if (rc)
	if (rc)
		goto fail_set_buffers;
		goto fail_set_buffers;


@@ -1703,21 +1673,15 @@ static int allocate_and_set_internal_bufs(struct msm_cvp_inst *inst,
/* Set ARP buffer for CVP firmware to handle concurrency */
/* Set ARP buffer for CVP firmware to handle concurrency */
int cvp_comm_set_arp_buffers(struct msm_cvp_inst *inst)
int cvp_comm_set_arp_buffers(struct msm_cvp_inst *inst)
{
{
	int rc = 0, idx = 0;
	int rc = 0;
	struct cvp_hal_buffer_requirements *cvp_internal_buf = NULL;
	struct msm_cvp_list *buf_list = &inst->persistbufs;


	if (!inst || !inst->core || !inst->core->device) {
	if (!inst || !inst->core || !inst->core->device) {
		dprintk(CVP_ERR, "%s invalid parameters\n", __func__);
		dprintk(CVP_ERR, "%s invalid parameters\n", __func__);
		return -EINVAL;
		return -EINVAL;
	}
	}


	idx = ffs(HAL_BUFFER_INTERNAL_PERSIST_1);
	rc = allocate_and_set_internal_bufs(inst, ARP_BUF_SIZE,
	cvp_internal_buf = &inst->buff_req.buffer[idx];
						&inst->persistbufs);
	cvp_internal_buf->buffer_type = HAL_BUFFER_INTERNAL_PERSIST_1;
	cvp_internal_buf->buffer_size = ARP_BUF_SIZE;

	rc = allocate_and_set_internal_bufs(inst, cvp_internal_buf, buf_list);
	if (rc)
	if (rc)
		goto error;
		goto error;


+0 −5
Original line number Original line Diff line number Diff line
@@ -32,11 +32,6 @@ void msm_cvp_comm_session_clean(struct msm_cvp_inst *inst);
int msm_cvp_comm_kill_session(struct msm_cvp_inst *inst);
int msm_cvp_comm_kill_session(struct msm_cvp_inst *inst);
void msm_cvp_comm_generate_session_error(struct msm_cvp_inst *inst);
void msm_cvp_comm_generate_session_error(struct msm_cvp_inst *inst);
void msm_cvp_comm_generate_sys_error(struct msm_cvp_inst *inst);
void msm_cvp_comm_generate_sys_error(struct msm_cvp_inst *inst);
int msm_cvp_comm_smem_alloc(struct msm_cvp_inst *inst, size_t size, u32 align,
		u32 flags, enum hal_buffer buffer_type, int map_kernel,
		struct msm_cvp_smem *smem);
void msm_cvp_comm_smem_free(struct msm_cvp_inst *inst,
				struct msm_cvp_smem *smem);
int msm_cvp_comm_smem_cache_operations(struct msm_cvp_inst *inst,
int msm_cvp_comm_smem_cache_operations(struct msm_cvp_inst *inst,
		struct msm_cvp_smem *mem, enum smem_cache_ops cache_ops);
		struct msm_cvp_smem *mem, enum smem_cache_ops cache_ops);
int msm_cvp_comm_check_core_init(struct msm_cvp_core *core);
int msm_cvp_comm_check_core_init(struct msm_cvp_core *core);
+0 −3
Original line number Original line Diff line number Diff line
@@ -391,9 +391,6 @@ static void msm_cvp_cleanup_instance(struct msm_cvp_inst *inst)
	if (cvp_comm_release_persist_buffers(inst))
	if (cvp_comm_release_persist_buffers(inst))
		dprintk(CVP_ERR,
		dprintk(CVP_ERR,
			"Failed to release persist buffers\n");
			"Failed to release persist buffers\n");

	if (inst->extradata_handle)
		msm_cvp_comm_smem_free(inst, inst->extradata_handle);
}
}


int msm_cvp_destroy(struct msm_cvp_inst *inst)
int msm_cvp_destroy(struct msm_cvp_inst *inst)
Loading