Exemplo n.º 1
0
static int mdss_mdp_overlay_play(struct msm_fb_data_type *mfd,
                                 struct msmfb_overlay_data *req)
{
    struct mdss_mdp_data src_data;
    int ret = 0;

    if (mfd == NULL)
        return -ENODEV;

    pr_debug("play req id=%x\n", req->id);

    memset(&src_data, 0, sizeof(src_data));
    mdss_mdp_get_img(mfd->iclient, &req->data, &src_data.p[0]);
    if (src_data.p[0].len == 0) {
        pr_err("src data pmem error\n");
        return -ENOMEM;
    }
    src_data.num_planes = 1;

    if (req->id & MDSS_MDP_ROT_SESSION_MASK) {
        struct mdss_mdp_data dst_data;
        memset(&dst_data, 0, sizeof(dst_data));

        mdss_mdp_get_img(mfd->iclient, &req->dst_data, &dst_data.p[0]);
        if (dst_data.p[0].len == 0) {
            pr_err("dst data pmem error\n");
            return -ENOMEM;
        }
        dst_data.num_planes = 1;

        ret = mdss_mdp_overlay_rotate(req, &src_data, &dst_data);

        mdss_mdp_put_img(&dst_data.p[0]);
    } else {
        ret = mdss_mdp_overlay_queue(req, &src_data);
    }

    mdss_mdp_put_img(&src_data.p[0]);

    return ret;
}
int mdss_mdp_get_img(struct ion_client *iclient, struct msmfb_data *img,
		     struct mdss_mdp_img_data *data)
{
	struct file *file;
	int ret = -EINVAL;
	int fb_num;
	unsigned long *start, *len;

	start = (unsigned long *) &data->addr;
	len = (unsigned long *) &data->len;
	data->flags = img->flags;
	data->p_need = 0;

	if (img->flags & MDP_BLIT_SRC_GEM) {
		data->srcp_file = NULL;
		ret = kgsl_gem_obj_addr(img->memory_id, (int) img->priv,
					start, len);
	} else if (img->flags & MDP_MEMORY_ID_TYPE_FB) {
		file = fget_light(img->memory_id, &data->p_need);
		if (file && FB_MAJOR ==
				MAJOR(file->f_dentry->d_inode->i_rdev)) {
			data->srcp_file = file;
			fb_num = MINOR(file->f_dentry->d_inode->i_rdev);
			ret = mdss_fb_get_phys_info(start, len, fb_num);
		}
	} else if (iclient) {
		data->iclient = iclient;
		data->srcp_ihdl = ion_import_dma_buf(iclient, img->memory_id);
		if (IS_ERR_OR_NULL(data->srcp_ihdl))
			return PTR_ERR(data->srcp_ihdl);
		ret = ion_phys(iclient, data->srcp_ihdl,
			       start, (size_t *) len);
	} else {
		unsigned long vstart;
		ret = get_pmem_file(img->memory_id, start, &vstart, len,
				    &data->srcp_file);
	}

	if (!ret && (img->offset < data->len)) {
		data->addr += img->offset;
		data->len -= img->offset;
	} else {
		mdss_mdp_put_img(data);
		ret = -EINVAL;
	}

	return ret;
}