From e1ea31bf7b99015037afda334ec401f2cc17bbd2 Mon Sep 17 00:00:00 2001 From: Ravishangar Kalyanam Date: Thu, 31 May 2012 18:02:24 -0700 Subject: [PATCH] msm: rotator: Add secure session flag to rotator start data Add flag for handling secure session to rotator data passed during start ioctl call. Change-Id: Id5db8b4be1f5058cb9cb9227963acc288eebc1dd Signed-off-by: Ravishangar Kalyanam --- drivers/char/msm_rotator.c | 90 ++++++++++++++++++++++--------------- include/linux/msm_rotator.h | 1 + 2 files changed, 54 insertions(+), 37 deletions(-) diff --git a/drivers/char/msm_rotator.c b/drivers/char/msm_rotator.c index e783a1a4ad0..4d34362b626 100644 --- a/drivers/char/msm_rotator.c +++ b/drivers/char/msm_rotator.c @@ -171,11 +171,10 @@ enum { CLK_SUSPEND, }; -int msm_rotator_iommu_map_buf(int mem_id, unsigned char src, +int msm_rotator_iommu_map_buf(int mem_id, int domain, unsigned long *start, unsigned long *len, - struct ion_handle **pihdl) + struct ion_handle **pihdl, unsigned int secure) { - int domain; if (!msm_rotator_dev->client) return -EINVAL; @@ -187,16 +186,30 @@ int msm_rotator_iommu_map_buf(int mem_id, unsigned char src, pr_debug("%s(): ion_hdl %p, ion_fd %d\n", __func__, *pihdl, ion_share_dma_buf(msm_rotator_dev->client, *pihdl)); - if (rot_iommu_split_domain) - domain = src ? ROTATOR_SRC_DOMAIN : ROTATOR_DST_DOMAIN; - else - domain = ROTATOR_SRC_DOMAIN; - - if (ion_map_iommu(msm_rotator_dev->client, - *pihdl, domain, GEN_POOL, - SZ_4K, 0, start, len, 0, ION_IOMMU_UNMAP_DELAYED)) { - pr_err("ion_map_iommu() failed\n"); - return -EINVAL; + if (rot_iommu_split_domain) { + if (secure) { + if (ion_phys(msm_rotator_dev->client, + *pihdl, start, (unsigned *)len)) { + pr_err("%s:%d: ion_phys map failed\n", + __func__, __LINE__); + return -ENOMEM; + } + } else { + if (ion_map_iommu(msm_rotator_dev->client, + *pihdl, domain, GEN_POOL, + SZ_4K, 0, start, len, 0, + ION_IOMMU_UNMAP_DELAYED)) { + pr_err("ion_map_iommu() failed\n"); + return -EINVAL; + } + } + } else { + if (ion_map_iommu(msm_rotator_dev->client, + *pihdl, ROTATOR_SRC_DOMAIN, GEN_POOL, + SZ_4K, 0, start, len, 0, ION_IOMMU_UNMAP_DELAYED)) { + pr_err("ion_map_iommu() failed\n"); + return -EINVAL; + } } pr_debug("%s(): mem_id %d, start 0x%lx, len 0x%lx\n", @@ -813,9 +826,9 @@ static int msm_rotator_rgb_types(struct msm_rotator_img_info *info, return 0; } -static int get_img(struct msmfb_data *fbd, unsigned char src, +static int get_img(struct msmfb_data *fbd, int domain, unsigned long *start, unsigned long *len, struct file **p_file, - int *p_need, struct ion_handle **p_ihdl) + int *p_need, struct ion_handle **p_ihdl, unsigned int secure) { int ret = 0; #ifdef CONFIG_FB @@ -857,8 +870,8 @@ static int get_img(struct msmfb_data *fbd, unsigned char src, #endif #ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - return msm_rotator_iommu_map_buf(fbd->memory_id, src, start, - len, p_ihdl); + return msm_rotator_iommu_map_buf(fbd->memory_id, domain, start, + len, p_ihdl, secure); #endif #ifdef CONFIG_ANDROID_PMEM if (!get_pmem_file(fbd->memory_id, start, &vstart, len, p_file)) @@ -870,7 +883,7 @@ static int get_img(struct msmfb_data *fbd, unsigned char src, } static void put_img(struct file *p_file, struct ion_handle *p_ihdl, - unsigned char src) + int domain, unsigned int secure) { #ifdef CONFIG_ANDROID_PMEM if (p_file != NULL) @@ -879,14 +892,15 @@ static void put_img(struct file *p_file, struct ion_handle *p_ihdl, #ifdef CONFIG_MSM_MULTIMEDIA_USE_ION if (!IS_ERR_OR_NULL(p_ihdl)) { - int domain; - if (rot_iommu_split_domain) - domain = src ? ROTATOR_SRC_DOMAIN : ROTATOR_DST_DOMAIN; - else - domain = ROTATOR_SRC_DOMAIN; pr_debug("%s(): p_ihdl %p\n", __func__, p_ihdl); - ion_unmap_iommu(msm_rotator_dev->client, - p_ihdl, domain, GEN_POOL); + if (rot_iommu_split_domain) { + if (!secure) + ion_unmap_iommu(msm_rotator_dev->client, + p_ihdl, domain, GEN_POOL); + } else { + ion_unmap_iommu(msm_rotator_dev->client, + p_ihdl, ROTATOR_SRC_DOMAIN, GEN_POOL); + } ion_free(msm_rotator_dev->client, p_ihdl); } @@ -953,18 +967,18 @@ static int msm_rotator_do_rotate(unsigned long arg) goto do_rotate_unlock_mutex; } - rc = get_img(&info.src, 1, (unsigned long *)&in_paddr, + rc = get_img(&info.src, ROTATOR_SRC_DOMAIN, (unsigned long *)&in_paddr, (unsigned long *)&src_len, &srcp0_file, &ps0_need, - &srcp0_ihdl); + &srcp0_ihdl, 0); if (rc) { pr_err("%s: in get_img() failed id=0x%08x\n", DRIVER_NAME, info.src.memory_id); goto do_rotate_unlock_mutex; } - rc = get_img(&info.dst, 0, (unsigned long *)&out_paddr, + rc = get_img(&info.dst, ROTATOR_DST_DOMAIN, (unsigned long *)&out_paddr, (unsigned long *)&dst_len, &dstp0_file, &p_need, - &dstp0_ihdl); + &dstp0_ihdl, img_info->secure); if (rc) { pr_err("%s: out get_img() failed id=0x%08x\n", DRIVER_NAME, info.dst.memory_id); @@ -992,20 +1006,20 @@ static int msm_rotator_do_rotate(unsigned long arg) goto do_rotate_unlock_mutex; } - rc = get_img(&info.src_chroma, 1, + rc = get_img(&info.src_chroma, ROTATOR_SRC_DOMAIN, (unsigned long *)&in_chroma_paddr, (unsigned long *)&src_len, &srcp1_file, &p_need, - &srcp1_ihdl); + &srcp1_ihdl, 0); if (rc) { pr_err("%s: in chroma get_img() failed id=0x%08x\n", DRIVER_NAME, info.src_chroma.memory_id); goto do_rotate_unlock_mutex; } - rc = get_img(&info.dst_chroma, 0, + rc = get_img(&info.dst_chroma, ROTATOR_DST_DOMAIN, (unsigned long *)&out_chroma_paddr, (unsigned long *)&dst_len, &dstp1_file, &p_need, - &dstp1_ihdl); + &dstp1_ihdl, img_info->secure); if (rc) { pr_err("%s: out chroma get_img() failed id=0x%08x\n", DRIVER_NAME, info.dst_chroma.memory_id); @@ -1176,15 +1190,17 @@ do_rotate_exit: #endif schedule_delayed_work(&msm_rotator_dev->rot_clk_work, HZ); do_rotate_unlock_mutex: - put_img(dstp1_file, dstp1_ihdl, 0); - put_img(srcp1_file, srcp1_ihdl, 1); - put_img(dstp0_file, dstp0_ihdl, 0); + put_img(dstp1_file, dstp1_ihdl, ROTATOR_DST_DOMAIN, + msm_rotator_dev->img_info[s]->secure); + put_img(srcp1_file, srcp1_ihdl, ROTATOR_SRC_DOMAIN, 0); + put_img(dstp0_file, dstp0_ihdl, ROTATOR_DST_DOMAIN, + msm_rotator_dev->img_info[s]->secure); /* only source may use frame buffer */ if (info.src.flags & MDP_MEMORY_ID_TYPE_FB) fput_light(srcp0_file, ps0_need); else - put_img(srcp0_file, srcp0_ihdl, 1); + put_img(srcp0_file, srcp0_ihdl, ROTATOR_SRC_DOMAIN, 0); mutex_unlock(&msm_rotator_dev->rotator_lock); dev_dbg(msm_rotator_dev->device, "%s() returning rc = %d\n", __func__, rc); diff --git a/include/linux/msm_rotator.h b/include/linux/msm_rotator.h index 463e5ce0ba9..17ae867e158 100644 --- a/include/linux/msm_rotator.h +++ b/include/linux/msm_rotator.h @@ -31,6 +31,7 @@ struct msm_rotator_img_info { unsigned char rotations; int enable; unsigned int downscale_ratio; + unsigned int secure; }; struct msm_rotator_data_info {