コード例 #1
0
void msm_gemini_platform_p2v(struct file  *file,
				struct ion_handle **ionhandle)
{
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
    if(*ionhandle == NULL)
	    return;
	ion_unmap_iommu(gemini_client, *ionhandle, CAMERA_DOMAIN, GEN_POOL);
	ion_free(gemini_client, *ionhandle);
	*ionhandle = NULL;
#elif CONFIG_ANDROID_PMEM
	put_pmem_file(file);
#endif
}
コード例 #2
0
ファイル: msm_mem.c プロジェクト: happyhere/802Xtreem
static int __msm_pmem_table_del(struct hlist_head *ptype,
			struct msm_pmem_info *pinfo, struct ion_client *client)
{
	int rc = 0;
	struct msm_pmem_region *region;
	struct hlist_node *node, *n;

	switch (pinfo->type) {
	case MSM_PMEM_AF:
	case MSM_PMEM_AEC:
	case MSM_PMEM_AWB:
	case MSM_PMEM_RS:
	case MSM_PMEM_CS:
	case MSM_PMEM_IHIST:
	case MSM_PMEM_SKIN:
	case MSM_PMEM_AEC_AWB:
//QCT - BAYER STATS - MB
	case MSM_PMEM_BAYER_GRID:
	case MSM_PMEM_BAYER_FOCUS:
	case MSM_PMEM_BAYER_HIST:
//QCT - BAYER STATS - ME
		hlist_for_each_entry_safe(region, node, n,
				ptype, list) {

			if (pinfo->type == region->info.type &&
				pinfo->vaddr == region->info.vaddr &&
				pinfo->fd == region->info.fd) {
				hlist_del(node);
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
				ion_unmap_iommu(client, region->handle,
					CAMERA_DOMAIN, GEN_POOL);
				ion_free(client, region->handle);
#else
				put_pmem_file(region->file);
#endif
				kfree(region);
			}
		}
		break;

	default:
		rc = -EINVAL;
		break;
	}

	return rc;
}
コード例 #3
0
void videobuf2_pmem_contig_user_put(struct videobuf2_contig_pmem *mem,
				struct ion_client *client, int domain_num)
{
	if (mem->is_userptr) {
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
		ion_unmap_iommu(client, mem->ion_handle,
				domain_num, 0);
		ion_free(client, mem->ion_handle);
#elif CONFIG_ANDROID_PMEM
		put_pmem_file(mem->file);
#endif
	}
	mem->is_userptr = 0;
	mem->phyaddr = 0;
	mem->size = 0;
	mem->mapped_phyaddr = 0;
}
コード例 #4
0
void videobuf2_pmem_contig_user_put(struct videobuf2_contig_pmem *mem,
                                    struct ion_client *client)
{
    if (msm_subsystem_unmap_buffer(mem->msm_buffer) < 0)
        D("%s unmapped memory\n", __func__);
    if (mem->is_userptr) {
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
        ion_free(client, mem->ion_handle);
#elif CONFIG_ANDROID_PMEM
        put_pmem_file(mem->file);
#endif
    }
    mem->is_userptr = 0;
    mem->phyaddr = 0;
    mem->size = 0;
    mem->mapped_phyaddr = 0;
}
コード例 #5
0
void videobuf2_pmem_contig_user_put(struct videobuf2_contig_pmem *mem,
					struct ion_client *client)
{
	if (mem->is_userptr) {
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
		ion_unmap_kernel(client, mem->ion_handle);
		ion_unmap_iommu(client, mem->ion_handle,
				CAMERA_DOMAIN, GEN_POOL);
		ion_free(client, mem->ion_handle);
#elif CONFIG_ANDROID_PMEM
		put_pmem_file(mem->file);
#endif
	}
	mem->is_userptr = 0;
	mem->phyaddr = 0;
	mem->size = 0;
	mem->mapped_phyaddr = 0;
}
コード例 #6
0
static int deregister_pmem(void)
{
	int result;
	struct audproc_buffer_data buffer;

	get_audproc_buffer_data(&buffer);

	result = adm_memory_unmap_regions(buffer.phys_addr,
			buffer.buf_size, NUM_AUDPROC_BUFFERS);

	if (result < 0)
		pr_err("Audcal unmap did not work!\n");

	if (acdb_data.pmem_fd) {
		put_pmem_file(acdb_data.file);
		acdb_data.pmem_fd = 0;
	}
	return result;
}
コード例 #7
0
static int __msm_pmem_table_del(struct hlist_head *ptype,
			struct msm_pmem_info *pinfo, struct ion_client *client)
{
	int rc = 0;
	struct msm_pmem_region *region;
	struct hlist_node *node, *n;

	switch (pinfo->type) {
	case MSM_PMEM_AF:
	case MSM_PMEM_AEC:
	case MSM_PMEM_AWB:
	case MSM_PMEM_RS:
	case MSM_PMEM_CS:
	case MSM_PMEM_IHIST:
	case MSM_PMEM_SKIN:
	case MSM_PMEM_AEC_AWB:
		hlist_for_each_entry_safe(region, node, n,
				ptype, list) {

			if (pinfo->type == region->info.type &&
				pinfo->vaddr == region->info.vaddr &&
				pinfo->fd == region->info.fd) {
				hlist_del(node);
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
				ion_unmap_iommu(client, region->handle,
					CAMERA_DOMAIN, GEN_POOL);
 				pr_err("%s: IOMMU unmapping address 0x%x\n", __func__, (unsigned int)region->paddr); //QCT patch, Fix_IOMMU_and_VFE_bus_overflow, 2012-10-31, freeso.kim
				ion_free(client, region->handle);
#else
				put_pmem_file(region->file);
#endif
				kfree(region);
			}
		}
		break;

	default:
		rc = -EINVAL;
		break;
	}

	return rc;
}
コード例 #8
0
int mdss_mdp_put_img(struct mdss_mdp_img_data *data)
{
	/* only source may use frame buffer */
	if (data->flags & MDP_MEMORY_ID_TYPE_FB) {
		fput_light(data->srcp_file, data->p_need);
		return 0;
	}
	if (data->srcp_file) {
		put_pmem_file(data->srcp_file);
		data->srcp_file = NULL;
		return 0;
	}
	if (!IS_ERR_OR_NULL(data->srcp_ihdl)) {
		ion_free(data->iclient, data->srcp_ihdl);
		data->iclient = NULL;
		data->srcp_ihdl = NULL;
		return 0;
	}

	return -ENOMEM;
}
コード例 #9
0
ファイル: videobuf2-msm-mem.c プロジェクト: Arunvasu/taoshan
void videobuf2_pmem_contig_user_put(struct videobuf2_contig_pmem *mem,
				struct ion_client *client, int domain_num)
{
	if (mem->is_userptr) {
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
	if (IS_ERR_OR_NULL(mem->ion_handle)) {
		pr_err("%s ION import failed\n", __func__);
		return;
	}
		ion_unmap_iommu(client, mem->ion_handle,
				domain_num, 0);
		ion_free(client, mem->ion_handle);
#elif CONFIG_ANDROID_PMEM
		put_pmem_file(mem->file);
#endif
	}
	mem->is_userptr = 0;
	mem->phyaddr = 0;
	mem->size = 0;
	mem->mapped_phyaddr = 0;
}
コード例 #10
0
void msm_gemini_platform_p2v(struct file  *file,
#if !defined(CONFIG_MSM_IOMMU)
				struct msm_mapped_buffer **msm_buffer,
#endif
				struct ion_handle **ionhandle)
{
#if !defined(CONFIG_MSM_IOMMU)
	if (msm_subsystem_unmap_buffer(
		(struct msm_mapped_buffer *)*msm_buffer) < 0)
		pr_err("%s: umapped stat memory\n",  __func__);
	*msm_buffer = NULL;
#endif

#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
#if defined(CONFIG_MSM_IOMMU)
	ion_unmap_iommu(gemini_client, *ionhandle, CAMERA_DOMAIN, GEN_POOL);
#endif
	ion_free(gemini_client, *ionhandle);
	*ionhandle = NULL;
#elif CONFIG_ANDROID_PMEM
	put_pmem_file(file);
#endif
}
コード例 #11
0
void msm_gemini_platform_p2v(struct file  *file)
{
	put_pmem_file(file);
}
コード例 #12
0
static int msm_pmem_table_add(struct hlist_head *ptype,
	struct msm_pmem_info *info, struct ion_client *client)
{
	unsigned long paddr;
#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
	unsigned long kvstart;
	struct file *file;
#endif
	int rc = -ENOMEM;

	unsigned long len;
	struct msm_pmem_region *region;

	region = kmalloc(sizeof(struct msm_pmem_region), GFP_KERNEL);
	if (!region)
		goto out;
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
	region->handle = ion_import_fd(client, info->fd);
	if (IS_ERR_OR_NULL(region->handle))
		goto out1;
	if (ion_map_iommu(client, region->handle, CAMERA_DOMAIN, GEN_POOL,
				  SZ_4K, 0, &paddr, &len, UNCACHED, 0) < 0)
		goto out2;
#elif CONFIG_ANDROID_PMEM
	rc = get_pmem_file(info->fd, &paddr, &kvstart, &len, &file);
	if (rc < 0) {
		pr_err("%s: get_pmem_file fd %d error %d\n",
				__func__, info->fd, rc);
		goto out1;
	}
	region->file = file;
#else
	paddr = 0;
	file = NULL;
	kvstart = 0;
#endif
	if (!info->len)
		info->len = len;
	rc = check_pmem_info(info, len);
	if (rc < 0)
		goto out3;
	paddr += info->offset;
	len = info->len;

	if (check_overlap(ptype, paddr, len) < 0) {
		rc = -EINVAL;
		goto out3;
	}

	CDBG("%s: type %d, active flag %d, paddr 0x%lx, vaddr 0x%lx\n",
		__func__, info->type, info->active, paddr,
		(unsigned long)info->vaddr);

	INIT_HLIST_NODE(&region->list);
	region->paddr = paddr;
	region->len = len;
	memcpy(&region->info, info, sizeof(region->info));
	D("%s Adding region to list with type %d\n", __func__,
						region->info.type);
	D("%s pmem_stats address is 0x%p\n", __func__, ptype);
	hlist_add_head(&(region->list), ptype);

	return 0;
out3:
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
	ion_unmap_iommu(client, region->handle, CAMERA_DOMAIN, GEN_POOL);
#endif
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
out2:
	ion_free(client, region->handle);
#elif CONFIG_ANDROID_PMEM
	put_pmem_file(region->file);
#endif
out1:
	kfree(region);
out:
	return rc;
}
コード例 #13
0
ファイル: vdec.c プロジェクト: Amieow98/nAa-kernel-ics
static u32 vid_dec_set_buffer(struct video_client_ctx *client_ctx,
			      struct vdec_setbuffer_cmd *buffer_info)
{
	enum vcd_buffer_type buffer_type;
	enum buffer_dir dir_buffer = BUFFER_TYPE_INPUT;
	u32 vcd_status = VCD_ERR_FAIL;
	unsigned long user_vaddr, kernel_vaddr, phy_addr, len;
	int pmem_fd;
	struct file *file;
	struct buf_addr_table *buf_addr_table;
	s32 buffer_index = -1;

	if (!client_ctx || !buffer_info)
		return FALSE;

	user_vaddr = (unsigned long)buffer_info->buffer.bufferaddr;

	if (buffer_info->buffer_type == VDEC_BUFFER_TYPE_OUTPUT)
		dir_buffer = BUFFER_TYPE_OUTPUT;

	/*If buffer already set, ignore */
	if (vid_c_lookup_addr_table(client_ctx, dir_buffer,
				      TRUE, &user_vaddr, &kernel_vaddr,
				      &phy_addr, &pmem_fd, &file,
				      &buffer_index)) {
		DBG("%s() : user_virt_addr = 0x%08lx is alreday set.",
		    __func__, user_vaddr);
		return TRUE;
	}

	if (get_pmem_file(buffer_info->buffer.pmem_fd,
			  &phy_addr, &kernel_vaddr, &len, &file)) {
		ERR("%s(): get_pmem_file failed\n", __func__);
		return FALSE;
	}
	put_pmem_file(file);
	if (buffer_info->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
		buffer_type = VCD_BUFFER_INPUT;
		client_ctx->num_of_input_buffers++;
		if (client_ctx->num_of_input_buffers >
				MAX_VIDEO_NUM_OF_BUFF) {
			ERR("%s(): num_of_input_buffers reached max value"
			    " MAX_VIDEO_NUM_OF_BUFF \n", __func__);
			client_ctx->num_of_input_buffers--;
			return FALSE;
		}
		buffer_index = client_ctx->num_of_input_buffers - 1;
		buf_addr_table =
		    &client_ctx->input_buf_addr_table[buffer_index];
		buf_addr_table->user_vaddr =
		    (unsigned long)buffer_info->buffer.bufferaddr;
		buf_addr_table->kernel_vaddr = kernel_vaddr;
		buf_addr_table->phy_addr = phy_addr;
		buf_addr_table->pmem_fd = buffer_info->buffer.pmem_fd;
		buf_addr_table->file = file;
	} else {
		buffer_type = VCD_BUFFER_OUTPUT;
		client_ctx->num_of_output_buffers++;
		if (client_ctx->num_of_output_buffers >
				MAX_VIDEO_NUM_OF_BUFF) {
			ERR("%s(): num_of_outut_buffers reached max value"
			    " MAX_VIDEO_NUM_OF_BUFF \n", __func__);
			client_ctx->num_of_output_buffers--;
			return FALSE;
		}
		buffer_index = client_ctx->num_of_output_buffers - 1;
		buf_addr_table =
		    &client_ctx->output_buf_addr_table[buffer_index];
		kernel_vaddr += (unsigned long)buffer_info->buffer.offset;
		phy_addr += (unsigned long)buffer_info->buffer.offset;
		buf_addr_table->user_vaddr =
		    (unsigned long)buffer_info->buffer.bufferaddr;
		buf_addr_table->kernel_vaddr = kernel_vaddr;
		buf_addr_table->phy_addr = phy_addr;
		buf_addr_table->pmem_fd = buffer_info->buffer.pmem_fd;
		buf_addr_table->file = file;
	}

	vcd_status = vcd_set_buffer(client_ctx->vcd_handle,
				    buffer_type, (u8 *) kernel_vaddr,
				    buffer_info->buffer.buffer_len);

	if (!vcd_status)
		return TRUE;
	else
		return FALSE;
}
コード例 #14
0
static int q6_config_encode(struct q6venc_dev *q6venc, uint32_t type,
			    struct init_config *init_config)
{
	struct q6_init_config *q6_init_config = &init_config->q6_init_config;
	int ret;
	int i;

	mutex_lock(&q6venc->lock);

	if (q6venc->num_enc_bufs != 0) {
		pr_err("%s: multiple sessions not supported\n", __func__);
		ret = -EBUSY;
		goto err_busy;
	}

	ret = get_buf_info(&q6venc->enc_bufs[0], &init_config->ref_frame_buf1);
	if (ret) {
		pr_err("%s: can't get ref_frame_buf1\n", __func__);
		goto err_get_ref_frame_buf1;
	}

	ret = get_buf_info(&q6venc->enc_bufs[1], &init_config->ref_frame_buf2);
	if (ret) {
		pr_err("%s: can't get ref_frame_buf2\n", __func__);
		goto err_get_ref_frame_buf2;
	}

	ret = get_buf_info(&q6venc->rlc_bufs[0], &init_config->rlc_buf1);
	if (ret) {
		pr_err("%s: can't get rlc_buf1\n", __func__);
		goto err_get_rlc_buf1;
	}

	ret = get_buf_info(&q6venc->rlc_bufs[1], &init_config->rlc_buf2);
	if (ret) {
		pr_err("%s: can't get rlc_buf2\n", __func__);
		goto err_get_rlc_buf2;
	}
	q6venc->rlc_buf_len = 2 * q6_init_config->rlc_buf_length;
	q6venc->num_enc_bufs = 2;

	q6venc->enc_buf_size =
		(q6_init_config->enc_frame_width_inmb * PIXELS_PER_MACROBLOCK) *
		(q6_init_config->enc_frame_height_inmb * PIXELS_PER_MACROBLOCK) *
		BITS_PER_PIXEL / 8;

	q6_init_config->ref_frame_buf1_phy = q6venc->enc_bufs[0].paddr;
	q6_init_config->ref_frame_buf2_phy = q6venc->enc_bufs[1].paddr;
	q6_init_config->rlc_buf1_phy = q6venc->rlc_bufs[0].paddr;
	q6_init_config->rlc_buf2_phy = q6venc->rlc_bufs[1].paddr;

	// The DSP may use the rlc_bufs during initialization,
	for (i=0; i<RLC_MAX_BUF_NUM; i++)
	{
		dmac_inv_range((const void *)q6venc->rlc_bufs[i].vaddr,
			(const void *)(q6venc->rlc_bufs[i].vaddr +
				q6venc->rlc_buf_len));
	}

	ret = dal_call_f5(q6venc->venc, type, q6_init_config,
			  sizeof(struct q6_init_config));
	if (ret) {
		pr_err("%s: rpc failed \n", __func__);
		goto err_dal_rpc_init;
	}
	mutex_unlock(&q6venc->lock);
	return 0;

err_dal_rpc_init:
	q6venc->num_enc_bufs = 0;
	put_pmem_file(q6venc->rlc_bufs[1].file);
err_get_rlc_buf2:
	put_pmem_file(q6venc->rlc_bufs[0].file);
err_get_rlc_buf1:
	put_pmem_file(q6venc->enc_bufs[1].file);
err_get_ref_frame_buf2:
	put_pmem_file(q6venc->enc_bufs[0].file);
err_get_ref_frame_buf1:
err_busy:
	mutex_unlock(&q6venc->lock);
	return ret;
}
コード例 #15
0
ファイル: videobuf2-msm-mem.c プロジェクト: LeeDroid-/ville_u
/**
 * videobuf_pmem_contig_user_get() - setup user space memory pointer
 * @mem: per-buffer private videobuf-contig-pmem data
 * @vb: video buffer to map
 *
 * This function validates and sets up a pointer to user space memory.
 * Only physically contiguous pfn-mapped memory is accepted.
 *
 * Returns 0 if successful.
 */
int videobuf2_pmem_contig_user_get(struct videobuf2_contig_pmem *mem,
					struct videobuf2_msm_offset *offset,
					enum videobuf2_buffer_type buffer_type,
					uint32_t addr_offset, int path,
					struct ion_client *client)
{
	unsigned long len;
	int rc = 0;
#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
	unsigned long kvstart;
#endif
	unsigned int flags = 0;
	unsigned long paddr = 0;
	if (mem->phyaddr != 0)
		return 0;
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
	mem->ion_handle = ion_import_fd(client, (int)mem->vaddr);
	if (IS_ERR_OR_NULL(mem->ion_handle)) {
		pr_err("%s ION import failed\n", __func__);
		return PTR_ERR(mem->ion_handle);
	}
	rc = ion_phys(client, mem->ion_handle, (ion_phys_addr_t *)&mem->phyaddr,
			 (size_t *)&len);
	rc = ion_handle_get_flags(client, mem->ion_handle, &mem->ion_flags);
	mem->kernel_vaddr = ion_map_kernel(client,
		mem->ion_handle, mem->ion_flags);
#elif CONFIG_ANDROID_PMEM
	rc = get_pmem_file((int)mem->vaddr, (unsigned long *)&mem->phyaddr,
					&kvstart, &len, &mem->file);
	if (rc < 0) {
		pr_err("%s: get_pmem_file fd %d error %d\n",
					__func__, (int)mem->vaddr, rc);
		return rc;
	}
#else
	paddr = 0;
	kvstart = 0;
#endif
	if (offset)
		mem->offset = *offset;
	else
		memset(&mem->offset, 0, sizeof(struct videobuf2_msm_offset));
	mem->path = path;
	mem->buffer_type = buffer_type;
	paddr = mem->phyaddr;
	flags = MSM_SUBSYSTEM_MAP_IOVA;
	mem->subsys_id = MSM_SUBSYSTEM_CAMERA;
	mem->msm_buffer = msm_subsystem_map_buffer(mem->phyaddr, len,
					flags, &(mem->subsys_id), 1);
	if (IS_ERR((void *)mem->msm_buffer)) {
		pr_err("%s: msm_subsystem_map_buffer failed\n", __func__);
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
		ion_unmap_kernel(client, mem->ion_handle);
		ion_free(client, mem->ion_handle);
#elif CONFIG_ANDROID_PMEM
		put_pmem_file(mem->file);
#endif
		return PTR_ERR((void *)mem->msm_buffer);
	}
	paddr = mem->msm_buffer->iova[0];
	mem->mapped_phyaddr = paddr + addr_offset;
	mem->addr_offset = addr_offset;
	return rc;
}
コード例 #16
0
void msm_gemini_platform_p2v(struct file  *file)
{
#ifdef CONFIG_ANDROID_PMEM
	put_pmem_file(file);
#endif
}