summaryrefslogtreecommitdiff
authorPengcheng 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)
commit4ee45c349e66d3af128643599bd4e3b82ccf5974 (patch)
treec4031d49f62344d73fc35077e2e4277ddc7cb262
parent0d4dc2ebf3b3f616424d69e7eb1b880dfbfa1ad6 (diff)
downloadsystem-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>
Diffstat
-rw-r--r--libge2d/IONmem.c3
-rw-r--r--libge2d/aml_ge2d.c33
-rw-r--r--libge2d/ge2d_port.c279
-rw-r--r--libge2d/include/ge2d_port.h3
-rw-r--r--libge2d/kernel-headers/linux/ge2d.h47
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 */