author | Pengcheng Chen <pengcheng.chen@amlogic.com> | 2017-02-07 05:51:04 (GMT) |
---|---|---|
committer | Pengcheng Chen <pengcheng.chen@amlogic.com> | 2017-02-09 08:19:35 (GMT) |
commit | 4ee45c349e66d3af128643599bd4e3b82ccf5974 (patch) | |
tree | c4031d49f62344d73fc35077e2e4277ddc7cb262 | |
parent | 0d4dc2ebf3b3f616424d69e7eb1b880dfbfa1ad6 (diff) | |
download | system-4ee45c349e66d3af128643599bd4e3b82ccf5974.zip system-4ee45c349e66d3af128643599bd4e3b82ccf5974.tar.gz system-4ee45c349e66d3af128643599bd4e3b82ccf5974.tar.bz2 |
PD#138785: ge2d: used shared_fd instead of phys_addr for Security risk
ge2d: add new ioctl to support shared_fd
Change-Id: I08cf80b6f216ff7048a668488b5ed88eb570dd0f
Signed-off-by: Pengcheng Chen <pengcheng.chen@amlogic.com>
-rw-r--r-- | libge2d/IONmem.c | 3 | ||||
-rw-r--r-- | libge2d/aml_ge2d.c | 33 | ||||
-rw-r--r-- | libge2d/ge2d_port.c | 279 | ||||
-rw-r--r-- | libge2d/include/ge2d_port.h | 3 | ||||
-rw-r--r-- | libge2d/kernel-headers/linux/ge2d.h | 47 |
5 files changed, 229 insertions, 136 deletions
diff --git a/libge2d/IONmem.c b/libge2d/IONmem.c index 70c36f6..bb1c71a 100644 --- a/libge2d/IONmem.c +++ b/libge2d/IONmem.c @@ -96,6 +96,7 @@ unsigned long CMEM_alloc(size_t size, IONMEM_AllocParams *params) return -EINVAL; } + #if 0 phy_data.handle = params->mImageFd; phy_data.phys_addr = 0; phy_data.size = 0; @@ -113,6 +114,8 @@ unsigned long CMEM_alloc(size_t size, IONMEM_AllocParams *params) __D("allocate ion buffer for capture, ret=%d, bytes=%d, PysAdrr=%ld .\n", ret, size, PhyAdrr); return PhyAdrr; + #endif + return ret; } #if 0 diff --git a/libge2d/aml_ge2d.c b/libge2d/aml_ge2d.c index 2857fe3..fdf1f27 100644 --- a/libge2d/aml_ge2d.c +++ b/libge2d/aml_ge2d.c @@ -57,11 +57,11 @@ void aml_ge2d_exit(void) void aml_ge2d_mem_free(aml_ge2d_info_t *pge2dinfo) { - if (pge2dinfo->src_info[0].paddr) + if (amlge2d.src_size) CMEM_free(&cmemParm_src); - if (pge2dinfo->src_info[1].paddr) + if (amlge2d.src2_size) CMEM_free(&cmemParm_src2); - if (pge2dinfo->dst_info.paddr) + if (amlge2d.dst_size) CMEM_free(&cmemParm_dst); if (pge2dinfo->src_info[0].vaddr) @@ -153,13 +153,13 @@ int aml_ge2d_mem_alloc(aml_ge2d_info_t *pge2dinfo) } } if (amlge2d.src_size) { - pge2dinfo->src_info[0].paddr = (unsigned long)CMEM_alloc(amlge2d.src_size, &cmemParm_src); - if (!pge2dinfo->src_info[0].paddr) { + ret = CMEM_alloc(amlge2d.src_size, &cmemParm_src); + if (ret < 0) { E_GE2D("Not enough memory\n"); - if (pge2dinfo->src_info[0].paddr) - CMEM_free(&cmemParm_src); + CMEM_free(&cmemParm_src); return ge2d_fail; } + pge2dinfo->src_info[0].shared_fd = cmemParm_src.mImageFd; pge2dinfo->src_info[0].vaddr = (char*)mmap( NULL, amlge2d.src_size, PROT_READ | PROT_WRITE, MAP_SHARED, cmemParm_src.mImageFd, 0); @@ -171,13 +171,13 @@ int aml_ge2d_mem_alloc(aml_ge2d_info_t *pge2dinfo) } if (amlge2d.src2_size) { - pge2dinfo->src_info[1].paddr = (unsigned long)CMEM_alloc(amlge2d.src2_size, &cmemParm_src2); - if (!pge2dinfo->src_info[1].paddr) { + ret = CMEM_alloc(amlge2d.src2_size, &cmemParm_src2); + if (ret < 0) { E_GE2D("Not enough memory\n"); - if (pge2dinfo->src_info[1].paddr) - CMEM_free(&cmemParm_src2); + CMEM_free(&cmemParm_src2); return ge2d_fail; } + pge2dinfo->src_info[1].shared_fd = cmemParm_src2.mImageFd; pge2dinfo->src_info[1].vaddr = (char*)mmap( NULL, amlge2d.src2_size, PROT_READ | PROT_WRITE, MAP_SHARED, cmemParm_src2.mImageFd, 0); if (!pge2dinfo->src_info[1].vaddr) { @@ -188,11 +188,12 @@ int aml_ge2d_mem_alloc(aml_ge2d_info_t *pge2dinfo) if (amlge2d.dst_size) { - pge2dinfo->dst_info.paddr = (unsigned long)CMEM_alloc(amlge2d.dst_size, &cmemParm_dst); - if (!pge2dinfo->dst_info.paddr) { + ret = CMEM_alloc(amlge2d.dst_size, &cmemParm_dst); + if (ret < 0) { E_GE2D("Not enough memory\n"); goto exit; } + pge2dinfo->dst_info.shared_fd = cmemParm_dst.mImageFd; pge2dinfo->dst_info.vaddr = (char*)mmap( NULL, amlge2d.dst_size, PROT_READ | PROT_WRITE, MAP_SHARED, cmemParm_dst.mImageFd, 0); @@ -212,16 +213,16 @@ int aml_ge2d_mem_alloc(aml_ge2d_info_t *pge2dinfo) amlge2d.src_size,amlge2d.src2_size,amlge2d.dst_size); return ge2d_success; exit: - if (pge2dinfo->src_info[0].paddr) + if (amlge2d.src_size) CMEM_free(&cmemParm_src); - if (pge2dinfo->src_info[1].paddr) + if (amlge2d.src2_size) CMEM_free(&cmemParm_src2); if (pge2dinfo->src_info[0].vaddr) munmap(pge2dinfo->src_info[0].vaddr, amlge2d.src_size); if (pge2dinfo->src_info[1].vaddr) munmap(pge2dinfo->src_info[1].vaddr, amlge2d.src2_size); - if (pge2dinfo->dst_info.paddr) + if (amlge2d.dst_size) CMEM_free(&cmemParm_dst); if (pge2dinfo->dst_info.vaddr) munmap(pge2dinfo->dst_info.vaddr, amlge2d.dst_size); diff --git a/libge2d/ge2d_port.c b/libge2d/ge2d_port.c index 3edfe48..b6c46e3 100644 --- a/libge2d/ge2d_port.c +++ b/libge2d/ge2d_port.c @@ -140,11 +140,10 @@ static int is_rect_valid(buffer_info_t *pbuffer_info) return ret; } - -static int ge2d_fillrectangle_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) +static int ge2d_fillrectangle_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo) { int ret = -1; - struct config_para_ex_s ge2d_config_ex; + struct config_para_ex_ion_s ge2d_config_ex; int src_format = 0xffffffff,dst_format = 0xffffffff; int s_canvas_w = 0; int s_canvas_h = 0; @@ -155,7 +154,7 @@ static int ge2d_fillrectangle_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) buffer_info_t* input_buffer_info = &(pge2dinfo->src_info[0]); buffer_info_t* output_buffer_info = &(pge2dinfo->dst_info); - memset(&ge2d_config_ex, 0, sizeof(struct config_para_ex_s )); + memset(&ge2d_config_ex, 0, sizeof(struct config_para_ex_ion_s )); if ((CANVAS_ALLOC == output_buffer_info->memtype)) { is_rgb = pixel_to_ge2d_format(output_buffer_info->format,&dst_format,&bpp); @@ -222,39 +221,45 @@ static int ge2d_fillrectangle_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) if (CANVAS_ALLOC == output_buffer_info->memtype) { if (is_rgb == 1) { - ge2d_config_ex.dst_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; } else if (output_buffer_info->format == PIXEL_FORMAT_YCrCb_420_SP) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; - ge2d_config_ex.dst_planes[1].addr = output_buffer_info->paddr + (d_canvas_w * d_canvas_h); + ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h); ge2d_config_ex.dst_planes[1].w = d_canvas_w; ge2d_config_ex.dst_planes[1].h = d_canvas_h/2; } else if (output_buffer_info->format == PIXEL_FORMAT_Y8) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; } else if (output_buffer_info->format == PIXEL_FORMAT_YV12) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; - ge2d_config_ex.dst_planes[1].addr = output_buffer_info->paddr + (d_canvas_w * d_canvas_h); + ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h); ge2d_config_ex.dst_planes[1].w = d_canvas_w; ge2d_config_ex.dst_planes[1].h = d_canvas_h/4; - ge2d_config_ex.dst_planes[2].addr = output_buffer_info->paddr + (d_canvas_w * d_canvas_h)*5/4; + ge2d_config_ex.dst_planes[2].addr = (d_canvas_w * d_canvas_h)*5/4; ge2d_config_ex.dst_planes[2].w = d_canvas_w; ge2d_config_ex.dst_planes[2].h = d_canvas_h/4; - } else if (input_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) { - ge2d_config_ex.dst_planes[0].addr = input_buffer_info->paddr; + } else if (output_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) { + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; - ge2d_config_ex.dst_planes[1].addr = input_buffer_info->paddr + (d_canvas_w * d_canvas_h); + ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h); ge2d_config_ex.dst_planes[1].w = d_canvas_w; ge2d_config_ex.dst_planes[1].h = d_canvas_h; - } else if (input_buffer_info->format == PIXEL_FORMAT_YCbCr_422_I) { - ge2d_config_ex.dst_planes[0].addr = input_buffer_info->paddr; + } else if (output_buffer_info->format == PIXEL_FORMAT_YCbCr_422_I) { + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w*2; ge2d_config_ex.dst_planes[0].h = d_canvas_h; } @@ -263,22 +268,21 @@ static int ge2d_fillrectangle_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) return ge2d_fail; } } - ge2d_config_ex.alu_const_color = 0x00000000; - ge2d_config_ex.src1_gb_alpha = 0xff; + ge2d_config_ex.src1_gb_alpha = 0x00; - ret = ioctl(fd, GE2D_CONFIG_EX, &ge2d_config_ex); + ret = ioctl(fd, GE2D_CONFIG_EX_ION, &ge2d_config_ex); if (ret < 0) { - E_GE2D("ge2d config failed. \n"); + E_GE2D("ge2d config ex ion failed. \n"); return ge2d_fail; } return ge2d_success; } -static int ge2d_blit_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) +static int ge2d_blit_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo) { int ret = -1; - struct config_para_ex_s ge2d_config_ex; + struct config_para_ex_ion_s ge2d_config_ex; int src_format = 0xffffffff,dst_format = 0xffffffff; int s_canvas_w = 0; int s_canvas_h = 0; @@ -290,7 +294,7 @@ static int ge2d_blit_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) buffer_info_t* input_buffer_info = &(pge2dinfo->src_info[0]); buffer_info_t* output_buffer_info = &(pge2dinfo->dst_info); - memset(&ge2d_config_ex, 0, sizeof(struct config_para_ex_s )); + memset(&ge2d_config_ex, 0, sizeof(struct config_para_ex_ion_s )); if ((CANVAS_ALLOC == input_buffer_info->memtype)) { is_rgb_input = pixel_to_ge2d_format(input_buffer_info->format,&src_format,&bpp); @@ -373,39 +377,45 @@ static int ge2d_blit_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) if (CANVAS_ALLOC == input_buffer_info->memtype) { if (is_rgb_input) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w; ge2d_config_ex.src_planes[0].h = s_canvas_h; } else if (input_buffer_info->format == PIXEL_FORMAT_YCrCb_420_SP) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w; ge2d_config_ex.src_planes[0].h = s_canvas_h; - ge2d_config_ex.src_planes[1].addr = input_buffer_info->paddr + (s_canvas_w * s_canvas_h); + ge2d_config_ex.src_planes[1].addr = (s_canvas_w * s_canvas_h); ge2d_config_ex.src_planes[1].w = s_canvas_w; ge2d_config_ex.src_planes[1].h = s_canvas_h/2; } else if (input_buffer_info->format == PIXEL_FORMAT_Y8) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w; ge2d_config_ex.src_planes[0].h = s_canvas_h; } else if (input_buffer_info->format == PIXEL_FORMAT_YV12) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w; ge2d_config_ex.src_planes[0].h = s_canvas_h; - ge2d_config_ex.src_planes[1].addr = input_buffer_info->paddr + (s_canvas_w * s_canvas_h); + ge2d_config_ex.src_planes[1].addr = (s_canvas_w * s_canvas_h); ge2d_config_ex.src_planes[1].w = s_canvas_w; ge2d_config_ex.src_planes[1].h = s_canvas_h/4; - ge2d_config_ex.src_planes[2].addr = input_buffer_info->paddr + (s_canvas_w * s_canvas_h)*5/4; + ge2d_config_ex.src_planes[2].addr = (s_canvas_w * s_canvas_h)*5/4; ge2d_config_ex.src_planes[2].w = s_canvas_w; ge2d_config_ex.src_planes[2].h = s_canvas_h/4; } else if (input_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w; ge2d_config_ex.src_planes[0].h = s_canvas_h; - ge2d_config_ex.src_planes[1].addr = input_buffer_info->paddr + (s_canvas_w * s_canvas_h); + ge2d_config_ex.src_planes[1].addr = (s_canvas_w * s_canvas_h); ge2d_config_ex.src_planes[1].w = s_canvas_w; ge2d_config_ex.src_planes[1].h = s_canvas_h; } else if (input_buffer_info->format == PIXEL_FORMAT_YCbCr_422_I) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w*2; ge2d_config_ex.src_planes[0].h = s_canvas_h; } @@ -417,39 +427,45 @@ static int ge2d_blit_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) if (CANVAS_ALLOC == output_buffer_info->memtype) { if (is_rgb_output) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; } else if (output_buffer_info->format == PIXEL_FORMAT_YCrCb_420_SP) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; - ge2d_config_ex.dst_planes[1].addr = output_buffer_info->paddr + (d_canvas_w * d_canvas_h); + ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h); ge2d_config_ex.dst_planes[1].w = d_canvas_w; ge2d_config_ex.dst_planes[1].h = d_canvas_h/2; } else if (output_buffer_info->format == PIXEL_FORMAT_Y8) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; } else if (output_buffer_info->format == PIXEL_FORMAT_YV12) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; - ge2d_config_ex.dst_planes[1].addr = output_buffer_info->paddr + (d_canvas_w * d_canvas_h); + ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h); ge2d_config_ex.dst_planes[1].w = d_canvas_w; ge2d_config_ex.dst_planes[1].h = d_canvas_h/4; - ge2d_config_ex.dst_planes[2].addr = output_buffer_info->paddr + (d_canvas_w * d_canvas_h)*5/4; + ge2d_config_ex.dst_planes[2].addr = (d_canvas_w * d_canvas_h)*5/4; ge2d_config_ex.dst_planes[2].w = d_canvas_w; ge2d_config_ex.dst_planes[2].h = d_canvas_h/4; - } else if (input_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) { - ge2d_config_ex.dst_planes[0].addr = input_buffer_info->paddr; + } else if (output_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) { + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; - ge2d_config_ex.dst_planes[1].addr = input_buffer_info->paddr + (d_canvas_w * d_canvas_h); + ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h); ge2d_config_ex.dst_planes[1].w = d_canvas_w; ge2d_config_ex.dst_planes[1].h = d_canvas_h; - } else if (input_buffer_info->format == PIXEL_FORMAT_YCbCr_422_I) { - ge2d_config_ex.dst_planes[0].addr = input_buffer_info->paddr; + } else if (output_buffer_info->format == PIXEL_FORMAT_YCbCr_422_I) { + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w*2; ge2d_config_ex.dst_planes[0].h = d_canvas_h; } @@ -460,20 +476,20 @@ static int ge2d_blit_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) } ge2d_config_ex.alu_const_color = 0x00000000; - ge2d_config_ex.src1_gb_alpha = 0xff; - ret = ioctl(fd, GE2D_CONFIG_EX, &ge2d_config_ex); + ge2d_config_ex.src1_gb_alpha = 0x00; + ret = ioctl(fd, GE2D_CONFIG_EX_ION, &ge2d_config_ex); if (ret < 0) { - E_GE2D("ge2d config failed. \n"); + E_GE2D("ge2d config ex ion failed. \n"); return ge2d_fail; } return ge2d_success; } -static int ge2d_blend_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) +static int ge2d_blend_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo) { int ret = -1; - struct config_para_ex_s ge2d_config_ex; + struct config_para_ex_ion_s ge2d_config_ex; int src_format = 0xffffffff,src2_format = 0xffffffff,dst_format = 0xffffffff; int s_canvas_w = 0; int s_canvas_h = 0; @@ -498,7 +514,7 @@ static int ge2d_blend_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) else b_src_swap = 0; - memset(&ge2d_config_ex, 0, sizeof(struct config_para_ex_s )); + memset(&ge2d_config_ex, 0, sizeof(struct config_para_ex_ion_s )); if (CANVAS_ALLOC == input_buffer_info->memtype) { is_rgb_input = pixel_to_ge2d_format(input_buffer_info->format,&src_format,&bpp); @@ -617,39 +633,45 @@ static int ge2d_blend_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) if (CANVAS_ALLOC == input_buffer_info->memtype) { if (is_rgb_input) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w; ge2d_config_ex.src_planes[0].h = s_canvas_h; } else if (input_buffer_info->format == PIXEL_FORMAT_YCrCb_420_SP) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w; ge2d_config_ex.src_planes[0].h = s_canvas_h; - ge2d_config_ex.src_planes[1].addr = input_buffer_info->paddr + (s_canvas_w * s_canvas_h); + ge2d_config_ex.src_planes[1].addr = (s_canvas_w * s_canvas_h); ge2d_config_ex.src_planes[1].w = s_canvas_w; ge2d_config_ex.src_planes[1].h = s_canvas_h/2; } else if (input_buffer_info->format == PIXEL_FORMAT_Y8) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w; ge2d_config_ex.src_planes[0].h = s_canvas_h; } else if (input_buffer_info->format == PIXEL_FORMAT_YV12) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w; ge2d_config_ex.src_planes[0].h = s_canvas_h; - ge2d_config_ex.src_planes[1].addr = input_buffer_info->paddr + (s_canvas_w * s_canvas_h); + ge2d_config_ex.src_planes[1].addr = (s_canvas_w * s_canvas_h); ge2d_config_ex.src_planes[1].w = s_canvas_w; ge2d_config_ex.src_planes[1].h = s_canvas_h/4; - ge2d_config_ex.src_planes[2].addr = input_buffer_info->paddr + (s_canvas_w * s_canvas_h)*5/4; + ge2d_config_ex.src_planes[2].addr = (s_canvas_w * s_canvas_h)*5/4; ge2d_config_ex.src_planes[2].w = s_canvas_w; ge2d_config_ex.src_planes[2].h = s_canvas_h/4; } else if (input_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w; ge2d_config_ex.src_planes[0].h = s_canvas_h; - ge2d_config_ex.src_planes[1].addr = input_buffer_info->paddr + (s_canvas_w * s_canvas_h); + ge2d_config_ex.src_planes[1].addr = (s_canvas_w * s_canvas_h); ge2d_config_ex.src_planes[1].w = s_canvas_w; ge2d_config_ex.src_planes[1].h = s_canvas_h; } else if (input_buffer_info->format == PIXEL_FORMAT_YCbCr_422_I) { - ge2d_config_ex.src_planes[0].addr = input_buffer_info->paddr; + ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset; + ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd; ge2d_config_ex.src_planes[0].w = s_canvas_w*2; ge2d_config_ex.src_planes[0].h = s_canvas_h; } @@ -662,39 +684,45 @@ static int ge2d_blend_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) if (CANVAS_ALLOC == input2_buffer_info->memtype) { if (is_rgb_input2) { - ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->paddr; + ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->offset; + ge2d_config_ex.src2_planes[0].shared_fd = input2_buffer_info->shared_fd; ge2d_config_ex.src2_planes[0].w = s2_canvas_w; ge2d_config_ex.src2_planes[0].h = s2_canvas_h; } else if (input2_buffer_info->format == PIXEL_FORMAT_YCrCb_420_SP) { - ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->paddr; + ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->offset; + ge2d_config_ex.src2_planes[0].shared_fd = input2_buffer_info->shared_fd; ge2d_config_ex.src2_planes[0].w = s2_canvas_w; ge2d_config_ex.src2_planes[0].h = s2_canvas_h; - ge2d_config_ex.src2_planes[1].addr = input2_buffer_info->paddr + (s2_canvas_w * s2_canvas_h); + ge2d_config_ex.src2_planes[1].addr = (s2_canvas_w * s2_canvas_h); ge2d_config_ex.src2_planes[1].w = s2_canvas_w; ge2d_config_ex.src2_planes[1].h = s2_canvas_h/2; } else if (input2_buffer_info->format == PIXEL_FORMAT_Y8) { - ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->paddr; + ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->offset; + ge2d_config_ex.src2_planes[0].shared_fd = input2_buffer_info->shared_fd; ge2d_config_ex.src2_planes[0].w = s2_canvas_w; ge2d_config_ex.src2_planes[0].h = s2_canvas_h; } else if (input2_buffer_info->format == PIXEL_FORMAT_YV12) { - ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->paddr; + ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->offset; + ge2d_config_ex.src2_planes[0].shared_fd = input2_buffer_info->shared_fd; ge2d_config_ex.src2_planes[0].w = s2_canvas_w; ge2d_config_ex.src2_planes[0].h = s2_canvas_h; - ge2d_config_ex.src2_planes[1].addr = input2_buffer_info->paddr + (s2_canvas_w * s2_canvas_h); + ge2d_config_ex.src2_planes[1].addr = (s2_canvas_w * s2_canvas_h); ge2d_config_ex.src2_planes[1].w = s2_canvas_w; ge2d_config_ex.src2_planes[1].h = s2_canvas_h/4; - ge2d_config_ex.src2_planes[2].addr = input2_buffer_info->paddr + (s2_canvas_w * s2_canvas_h)*5/4; + ge2d_config_ex.src2_planes[2].addr = (s2_canvas_w * s2_canvas_h)*5/4; ge2d_config_ex.src2_planes[2].w = s2_canvas_w; ge2d_config_ex.src2_planes[2].h = s2_canvas_h/4; } else if (input2_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) { - ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->paddr; + ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->offset; + ge2d_config_ex.src2_planes[0].shared_fd = input2_buffer_info->shared_fd; ge2d_config_ex.src2_planes[0].w = s2_canvas_w; ge2d_config_ex.src2_planes[0].h = s2_canvas_h; - ge2d_config_ex.src2_planes[1].addr = input2_buffer_info->paddr + (s2_canvas_w * s2_canvas_h); + ge2d_config_ex.src2_planes[1].addr = (s2_canvas_w * s2_canvas_h); ge2d_config_ex.src2_planes[1].w = s2_canvas_w; ge2d_config_ex.src2_planes[1].h = s2_canvas_h; } else if (input2_buffer_info->format == PIXEL_FORMAT_YCbCr_422_I) { - ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->paddr; + ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->offset; + ge2d_config_ex.src2_planes[0].shared_fd = input2_buffer_info->shared_fd; ge2d_config_ex.src2_planes[0].w = s2_canvas_w*2; ge2d_config_ex.src2_planes[0].h = s2_canvas_h; } @@ -706,39 +734,45 @@ static int ge2d_blend_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) if (CANVAS_ALLOC == output_buffer_info->memtype) { if (is_rgb_output) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; } else if (output_buffer_info->format == PIXEL_FORMAT_YCrCb_420_SP) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; - ge2d_config_ex.dst_planes[1].addr = output_buffer_info->paddr + (d_canvas_w * d_canvas_h); + ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h); ge2d_config_ex.dst_planes[1].w = d_canvas_w; ge2d_config_ex.dst_planes[1].h = d_canvas_h/2; } else if (output_buffer_info->format == PIXEL_FORMAT_Y8) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; } else if (output_buffer_info->format == PIXEL_FORMAT_YV12) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; - ge2d_config_ex.dst_planes[1].addr = output_buffer_info->paddr + (d_canvas_w * d_canvas_h); + ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h); ge2d_config_ex.dst_planes[1].w = d_canvas_w; ge2d_config_ex.dst_planes[1].h = d_canvas_h/4; - ge2d_config_ex.dst_planes[2].addr = output_buffer_info->paddr + (d_canvas_w * d_canvas_h)*5/4; + ge2d_config_ex.dst_planes[2].addr = (d_canvas_w * d_canvas_h)*5/4; ge2d_config_ex.dst_planes[2].w = d_canvas_w; ge2d_config_ex.dst_planes[2].h = d_canvas_h/4; } else if (output_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w; ge2d_config_ex.dst_planes[0].h = d_canvas_h; - ge2d_config_ex.dst_planes[1].addr = output_buffer_info->paddr + (d_canvas_w * d_canvas_h); + ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h); ge2d_config_ex.dst_planes[1].w = d_canvas_w; ge2d_config_ex.dst_planes[1].h = d_canvas_h; } else if (output_buffer_info->format == PIXEL_FORMAT_YCbCr_422_I) { - ge2d_config_ex.dst_planes[0].addr = output_buffer_info->paddr; + ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset; + ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd; ge2d_config_ex.dst_planes[0].w = d_canvas_w*2; ge2d_config_ex.dst_planes[0].h = d_canvas_h; } @@ -748,10 +782,10 @@ static int ge2d_blend_config_ex(int fd,aml_ge2d_info_t *pge2dinfo) } } ge2d_config_ex.alu_const_color = 0x00000000; - ge2d_config_ex.src1_gb_alpha = 0xff; - ret = ioctl(fd, GE2D_CONFIG_EX, &ge2d_config_ex); + ge2d_config_ex.src1_gb_alpha = 0x00; + ret = ioctl(fd, GE2D_CONFIG_EX_ION, &ge2d_config_ex); if (ret < 0) { - E_GE2D("ge2d config ex failed. \n"); + E_GE2D("ge2d config ex ion failed. \n"); return ge2d_fail; } return ge2d_success; @@ -1103,8 +1137,6 @@ static int ge2d_blend_noalpha(int fd,rectangle_t *srect,rectangle_t *srect2,rect - - int ge2d_open(void) { int fd = -1; @@ -1131,6 +1163,8 @@ int ge2d_process(int fd,aml_ge2d_info_t *pge2dinfo) rectangle_t src_rect[2]; rectangle_t dst_rect; int dx = 0, dy = 0; + int ret = -1; + if (!pge2dinfo) { E_GE2D("pge2dinfo is NULL!\n"); return ge2d_fail; @@ -1142,9 +1176,9 @@ int ge2d_process(int fd,aml_ge2d_info_t *pge2dinfo) dst_rect.h = pge2dinfo->dst_info.rect.h; dst_rect.x = pge2dinfo->dst_info.rect.x; dst_rect.y = pge2dinfo->offset + pge2dinfo->dst_info.rect.y; - - ge2d_fillrectangle_config_ex(fd,pge2dinfo); - ge2d_fillrectangle(fd,&dst_rect,pge2dinfo->color); + ret = ge2d_fillrectangle_config_ex_ion(fd,pge2dinfo); + if (ret == ge2d_success) + ge2d_fillrectangle(fd,&dst_rect,pge2dinfo->color); break; case AML_GE2D_BLIT: if (!is_rect_valid(&pge2dinfo->src_info[0])) @@ -1154,11 +1188,13 @@ int ge2d_process(int fd,aml_ge2d_info_t *pge2dinfo) dx = pge2dinfo->dst_info.rect.x; dy = pge2dinfo->offset + pge2dinfo->dst_info.rect.y; - ge2d_blit_config_ex(fd,pge2dinfo); - if (is_no_alpha(pge2dinfo->src_info[0].format)) - ge2d_blit_noalpha(fd,&pge2dinfo->src_info[0].rect,dx,dy); - else - ge2d_blit(fd,&pge2dinfo->src_info[0].rect,dx,dy); + ret = ge2d_blit_config_ex_ion(fd,pge2dinfo); + if (ret == ge2d_success) { + if (is_no_alpha(pge2dinfo->src_info[0].format)) + ge2d_blit_noalpha(fd,&pge2dinfo->src_info[0].rect,dx,dy); + else + ge2d_blit(fd,&pge2dinfo->src_info[0].rect,dx,dy); + } break; case AML_GE2D_STRETCHBLIT: if (!is_rect_valid(&pge2dinfo->src_info[0])) @@ -1170,11 +1206,13 @@ int ge2d_process(int fd,aml_ge2d_info_t *pge2dinfo) dst_rect.h = pge2dinfo->dst_info.rect.h; dst_rect.x = pge2dinfo->dst_info.rect.x; dst_rect.y = pge2dinfo->offset + pge2dinfo->dst_info.rect.y; - ge2d_blit_config_ex(fd,pge2dinfo); - if (is_no_alpha(pge2dinfo->src_info[0].format)) - ge2d_strechblit_noalpha(fd,&pge2dinfo->src_info[0].rect,&dst_rect); - else - ge2d_strechblit(fd,&pge2dinfo->src_info[0].rect,&dst_rect); + ret = ge2d_blit_config_ex_ion(fd,pge2dinfo); + if (ret == ge2d_success) { + if (is_no_alpha(pge2dinfo->src_info[0].format)) + ge2d_strechblit_noalpha(fd,&pge2dinfo->src_info[0].rect,&dst_rect); + else + ge2d_strechblit(fd,&pge2dinfo->src_info[0].rect,&dst_rect); + } break; case AML_GE2D_BLEND: if ((pge2dinfo->dst_info.memtype == CANVAS_OSD0) && (pge2dinfo->src_info[1].memtype == CANVAS_OSD0)) { @@ -1192,32 +1230,35 @@ int ge2d_process(int fd,aml_ge2d_info_t *pge2dinfo) dst_rect.h = pge2dinfo->dst_info.rect.h; dst_rect.x = pge2dinfo->dst_info.rect.x; dst_rect.y = pge2dinfo->offset + pge2dinfo->dst_info.rect.y; - ge2d_blend_config_ex(fd,pge2dinfo); - if ((is_no_alpha(pge2dinfo->src_info[0].format)) || (is_no_alpha(pge2dinfo->src_info[1].format))) { - if (b_src_swap) - ge2d_blend_noalpha(fd,&(pge2dinfo->src_info[1].rect), - &(pge2dinfo->src_info[0].rect), - &dst_rect,pge2dinfo->blend_mode); - else - ge2d_blend_noalpha(fd,&(pge2dinfo->src_info[0].rect), - &(pge2dinfo->src_info[1].rect), - &dst_rect,pge2dinfo->blend_mode); - } - else { - if (b_src_swap) - ge2d_blend(fd,&(pge2dinfo->src_info[1].rect), - &(pge2dinfo->src_info[0].rect), - &dst_rect,pge2dinfo->blend_mode); - else - ge2d_blend(fd,&(pge2dinfo->src_info[0].rect), - &(pge2dinfo->src_info[1].rect), - &dst_rect,pge2dinfo->blend_mode); + ret = ge2d_blend_config_ex_ion(fd,pge2dinfo); + if (ret == ge2d_success) { + if ((is_no_alpha(pge2dinfo->src_info[0].format)) || (is_no_alpha(pge2dinfo->src_info[1].format))) { + if (b_src_swap) + ge2d_blend_noalpha(fd,&(pge2dinfo->src_info[1].rect), + &(pge2dinfo->src_info[0].rect), + &dst_rect,pge2dinfo->blend_mode); + else + ge2d_blend_noalpha(fd,&(pge2dinfo->src_info[0].rect), + &(pge2dinfo->src_info[1].rect), + &dst_rect,pge2dinfo->blend_mode); + } + else { + if (b_src_swap) + ge2d_blend(fd,&(pge2dinfo->src_info[1].rect), + &(pge2dinfo->src_info[0].rect), + &dst_rect,pge2dinfo->blend_mode); + else + ge2d_blend(fd,&(pge2dinfo->src_info[0].rect), + &(pge2dinfo->src_info[1].rect), + &dst_rect,pge2dinfo->blend_mode); + } } break; default: E_GE2D("ge2d(%d) opration not support!\n",pge2dinfo->ge2d_op); return ge2d_fail; } + return ge2d_success; } diff --git a/libge2d/include/ge2d_port.h b/libge2d/include/ge2d_port.h index 1a16a38..08aa2a6 100644 --- a/libge2d/include/ge2d_port.h +++ b/libge2d/include/ge2d_port.h @@ -82,12 +82,13 @@ typedef struct{ typedef struct buffer_info { unsigned int memtype; char* vaddr; - unsigned long paddr; + unsigned long offset; unsigned int canvas_w; unsigned int canvas_h; rectangle_t rect; int format; unsigned int rotation; + int shared_fd; } buffer_info_t; diff --git a/libge2d/kernel-headers/linux/ge2d.h b/libge2d/kernel-headers/linux/ge2d.h index e3e5dc0..a1e8d59 100644 --- a/libge2d/kernel-headers/linux/ge2d.h +++ b/libge2d/kernel-headers/linux/ge2d.h @@ -164,6 +164,52 @@ struct config_para_ex_s { struct config_planes_s dst_planes[4]; }; +struct config_planes_ion_s { + unsigned long addr; + unsigned int w; + unsigned int h; + int shared_fd; +}; + +struct config_para_ex_ion_s { + struct src_dst_para_ex_s src_para; + struct src_dst_para_ex_s src2_para; + struct src_dst_para_ex_s dst_para; + + /* key mask */ + struct src_key_ctrl_s src_key; + struct src_key_ctrl_s src2_key; + + int alu_const_color; + unsigned src1_gb_alpha; + unsigned op_mode; + unsigned char bitmask_en; + unsigned char bytemask_only; + unsigned int bitmask; + unsigned char dst_xy_swap; + + /* scaler and phase releated */ + unsigned hf_init_phase; + int hf_rpt_num; + unsigned hsc_start_phase_step; + int hsc_phase_slope; + unsigned vf_init_phase; + int vf_rpt_num; + unsigned vsc_start_phase_step; + int vsc_phase_slope; + unsigned char src1_vsc_phase0_always_en; + unsigned char src1_hsc_phase0_always_en; + /* 1bit, 0: using minus, 1: using repeat data */ + unsigned char src1_hsc_rpt_ctrl; + /* 1bit, 0: using minus 1: using repeat data */ + unsigned char src1_vsc_rpt_ctrl; + + /* canvas info */ + struct config_planes_ion_s src_planes[4]; + struct config_planes_ion_s src2_planes[4]; + struct config_planes_ion_s dst_planes[4]; +}; + #define GE2D_ENDIAN_SHIFT 24 #define GE2D_ENDIAN_MASK (0x1 << GE2D_ENDIAN_SHIFT) #define GE2D_BIG_ENDIAN (0 << GE2D_ENDIAN_SHIFT) @@ -285,5 +331,6 @@ struct config_para_ex_s { #define GE2D_CONFIG _IOW(GE2D_IOC_MAGIC, 0x00, struct config_para_s) #define GE2D_CONFIG_EX _IOW(GE2D_IOC_MAGIC, 0x01, struct config_para_ex_s) #define GE2D_SRCCOLORKEY _IOW(GE2D_IOC_MAGIC, 0x02, struct config_para_s) +#define GE2D_CONFIG_EX_ION _IOW(GE2D_IOC_MAGIC, 0x03, struct config_para_ex_ion_s) #endif /* GE2D_H */ |