Pulled file from sun7i allwinner sources and merged in mixer_simple_blt
from existing code base.
Signed-off-by: Patrick Wood <
patric...@gmail.com>
---
drivers/char/sunxi_g2d/g2d_bsp.c | 159 ++++++++++++++++++++++++++++++--------
1 file changed, 127 insertions(+), 32 deletions(-)
diff --git a/drivers/char/sunxi_g2d/g2d_bsp.c b/drivers/char/sunxi_g2d/g2d_bsp.c
index f0c1d3a..def6073 100644
--- a/drivers/char/sunxi_g2d/g2d_bsp.c
+++ b/drivers/char/sunxi_g2d/g2d_bsp.c
@@ -110,6 +110,7 @@ __u32 mixer_reg_init(void){
for(i=0;i<=0x120;i+=4)
write_wvalue(i, 0);
+ write_wvalue(G2D_SCAN_ORDER_REG,0x15FF0000);//DMA MBUS Length
/* initial the color space converter parameter */
csc_coeff_set();
@@ -812,7 +813,11 @@ __s32 mixer_blt(g2d_blt *para){
reg_val |= mixer_set_rotate_reg(para->flag);
write_wvalue(G2D_DMA1_CONTROL_REG, reg_val);
}
+ write_wvalue(G2D_DMA1_FILLCOLOR_REG, 0xFFFFFFFF);
+ write_wvalue(G2D_DMA2_FILLCOLOR_REG, 0xFFFFFFFF);
+if((para->flag & G2D_BLT_PIXEL_ALPHA)||(para->flag & G2D_BLT_PLANE_ALPHA)||(para->flag & G2D_BLT_MULTI_ALPHA)||(para->flag & G2D_BLT_SRC_COLORKEY)||(para->flag & G2D_BLT_DST_COLORKEY))
+{
/* pyuv422/420/411uvc */
if((para->dst_image.format>0x16)&&(para->dst_image.format<0x1A))
{
@@ -832,8 +837,6 @@ __s32 mixer_blt(g2d_blt *para){
reg_val |= (5<<8) | G2D_IDMA_ENABLE;
write_wvalue(G2D_DMA2_CONTROL_REG, reg_val);
}
- write_wvalue(G2D_DMA1_FILLCOLOR_REG, 0xFFFFFFFF);
- write_wvalue(G2D_DMA2_FILLCOLOR_REG, 0xFFFFFFFF);
/* channel3 is dst surface */
addr_val = mixer_get_addr(para->dst_image.addr[0],para->dst_image.format,para->dst_image.w,para->dst_x,para->dst_y);
@@ -855,6 +858,7 @@ __s32 mixer_blt(g2d_blt *para){
reg_val |= (0xFF<<24)|0x4;
}
write_wvalue(G2D_DMA3_CONTROL_REG, reg_val);
+}
/* colorkey */
if (para->flag & G2D_BLT_SRC_COLORKEY)
@@ -892,11 +896,12 @@ __s32 mixer_blt(g2d_blt *para){
reg_val = mixer_out_fmtseq_set(para->dst_image.format,para->dst_image.pixel_seq);
write_wvalue(G2D_OUTPUT_CONTROL_REG, reg_val);
- if((para->dst_image.format>0x16)&&(para->dst_image.format<0x1A))
+ if((para->dst_image.format>0x16)&&(para->dst_image.format<0x1D))
{
- if(para->dst_image.format == G2D_FMT_PYUV411UVC) bppnum = 4;
+ if((para->dst_image.format == G2D_FMT_PYUV411UVC)||(para->dst_image.format == G2D_FMT_PYUV422)||(para->dst_image.format == G2D_FMT_PYUV420)) bppnum = 4;
+ else if(para->dst_image.format == G2D_FMT_PYUV411) bppnum = 2;
else bppnum = 8;
- if(para->dst_image.format == G2D_FMT_PYUV420UVC)
+ if((para->dst_image.format == G2D_FMT_PYUV420UVC)||(para->dst_image.format == G2D_FMT_PYUV420))
addr_val = (__u64)(para->dst_image.addr[1]-0x40000000)*8+(__u64)((para->dst_image.w*(para->dst_y/2)+para->dst_x)*bppnum);
else addr_val = (__u64)(para->dst_image.addr[1]-0x40000000)*8+(__u64)((para->dst_image.w*para->dst_y+para->dst_x)*bppnum);
reg_val = read_wvalue(G2D_OUTPUT_HADDR_REG);
@@ -905,6 +910,17 @@ __s32 mixer_blt(g2d_blt *para){
reg_val = addr_val&0xFFFFFFFF;/* low addr in bits */
write_wvalue(G2D_OUTPUT1_LADDR_REG, reg_val);
write_wvalue(G2D_OUTPUT1_STRIDE_REG, para->dst_image.w*bppnum);
+ if(para->dst_image.format == G2D_FMT_PYUV420)
+ addr_val = (__u64)(para->dst_image.addr[2]-0x40000000)*8+(__u64)((para->dst_image.w*(para->dst_y/2)+para->dst_x)*bppnum);
+ else if((para->dst_image.format == G2D_FMT_PYUV422)||(para->dst_image.format == G2D_FMT_PYUV411))
+ addr_val = (__u64)(para->dst_image.addr[2]-0x40000000)*8+(__u64)((para->dst_image.w*para->dst_y+para->dst_x)*bppnum);
+ else addr_val = 0;
+ reg_val = read_wvalue(G2D_OUTPUT_HADDR_REG);
+ reg_val |= ((addr_val>>32)&0xF);/* high addr in bits */
+ write_wvalue(G2D_OUTPUT_HADDR_REG, reg_val);
+ reg_val = addr_val&0xFFFFFFFF;/* low addr in bits */
+ write_wvalue(G2D_OUTPUT2_LADDR_REG, reg_val);
+ write_wvalue(G2D_OUTPUT2_STRIDE_REG, para->dst_image.w*bppnum);
write_wvalue(G2D_CSC2_CONTROL_REG, 0x1);
}
if((para->dst_image.format>0x11)&&(para->dst_image.format<0x1D))write_wvalue(G2D_CSC2_CONTROL_REG, 0x1);
@@ -924,7 +940,7 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
__u32 reg_val = 0;
__u32 reg_tmp = 0;
__u64 addr_val;
- __u32 cnt,sinw,soutw,scaler_inx,scaler_outx,scaler_outy,i;
+ __u32 cnt,sinw,soutw,scaler_inx,scaler_iny,scaler_outx,scaler_outy,i;
__s32 result = 0;
mixer_reg_init();/* initial mixer register */
@@ -973,7 +989,9 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
/* channel3 is dst surface */
write_wvalue(G2D_DMA3_STRIDE_REG, para->dst_image.w*mixer_bpp_count(para->dst_image.format));
reg_val = read_wvalue(G2D_DMA3_CONTROL_REG);
- reg_val |= mixer_in_fmtseq_set(para->dst_image.format,para->dst_image.pixel_seq) | G2D_IDMA_ENABLE;
+ reg_val |= mixer_in_fmtseq_set(para->dst_image.format,para->dst_image.pixel_seq);
+ if((para->flag & G2D_BLT_PIXEL_ALPHA)||(para->flag & G2D_BLT_PLANE_ALPHA)||(para->flag & G2D_BLT_MULTI_ALPHA)||(para->flag & G2D_BLT_SRC_COLORKEY)||(para->flag & G2D_BLT_DST_COLORKEY))
+ reg_val |=G2D_IDMA_ENABLE;
/* rgbx/bgrx/xrgb/xbgr format */
if((para->src_image.format>0x03)&&(para->src_image.format<0x08))
@@ -1014,11 +1032,15 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
cnt = (para->dst_rect.w%1024)?cnt:cnt-1;
sinw = (para->src_rect.w/para->dst_rect.w)<<10;
sinw |= ((para->src_rect.w%para->dst_rect.w)<<10)/para->dst_rect.w;
+ if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
+ {
+ sinw = (para->src_rect.h/para->dst_rect.w)<<10;
+ sinw |= ((para->src_rect.h%para->dst_rect.w)<<10)/para->dst_rect.w;
+ }
scaler_inx = para->src_rect.x;
+ scaler_iny = para->src_rect.y;
scaler_outx = para->dst_rect.x;
- if((para->flag & G2D_BLT_ROTATE90))
- scaler_outy = para->dst_rect.y + para->dst_rect.w - 0x401;
- else scaler_outy = para->dst_rect.y;
+ scaler_outy = para->dst_rect.y;
for(i = 0; i<cnt; i++)
{
/* DMA0 */
@@ -1029,6 +1051,8 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
write_wvalue(G2D_DMA0_LADDR_REG, reg_val);
if(sinw<1)sinw = 1;
write_wvalue(G2D_DMA0_SIZE_REG, (sinw -1) | ((para->src_rect.h -1)<<16));
+ if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
+ write_wvalue(G2D_DMA0_SIZE_REG, (para->src_rect.w -1) | ((sinw -1)<<16));
/* DMA1 pyuv422/420/411uvc */
if((para->src_image.format>0x16)&&(para->src_image.format<0x1A))
@@ -1055,6 +1079,20 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
}
/* scaler setting */
+ if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
+ {
+ write_wvalue(G2D_SCALER_SIZE_REG,(para->dst_rect.h - 1) | ((0x400 - 1)<<16));
+ reg_val = (para->src_rect.w/para->dst_rect.h)<<16;
+ reg_tmp = (para->src_rect.w%para->dst_rect.h);
+ reg_val |= (reg_tmp<<16)/para->dst_rect.h;
+ write_wvalue(G2D_SCALER_HFACTOR_REG,reg_val);
+ reg_val = (sinw/0x400)<<16;
+ reg_tmp = (sinw%0x400);
+ reg_val |= (reg_tmp<<16)/0x400;
+ write_wvalue(G2D_SCALER_VFACTOR_REG,reg_val);
+ }
+ else
+ {
write_wvalue(G2D_SCALER_SIZE_REG,(0x400 - 1) | ((para->dst_rect.h - 1)<<16));
reg_val = (sinw/0x400)<<16;
reg_tmp = (sinw%0x400);
@@ -1065,7 +1103,9 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
reg_tmp = (para->src_rect.h%para->dst_rect.h);
reg_val |= (reg_tmp<<16)/para->dst_rect.h;
write_wvalue(G2D_SCALER_VFACTOR_REG,reg_val);
-
+ }
+ if((para->flag & G2D_BLT_PIXEL_ALPHA)||(para->flag & G2D_BLT_PLANE_ALPHA)||(para->flag & G2D_BLT_MULTI_ALPHA)||(para->flag & G2D_BLT_SRC_COLORKEY)||(para->flag & G2D_BLT_DST_COLORKEY))
+ {
/* DMA2 pyuv422/420/411uvc */
if((para->dst_image.format>0x16)&&(para->dst_image.format<0x1A))
{
@@ -1095,12 +1135,14 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
reg_val = addr_val&0xFFFFFFFF;/* low addr in bits */
write_wvalue(G2D_DMA3_LADDR_REG, reg_val);
write_wvalue(G2D_DMA3_SIZE_REG, (0x400 -1) | ((para->dst_rect.h -1)<<16));
-
+ }
/* OUT */
- if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
- write_wvalue(G2D_OUTPUT_SIZE_REG, (para->dst_rect.h -1) | ((0x400 -1)<<16));
- else write_wvalue(G2D_OUTPUT_SIZE_REG, (0x400 -1) | ((para->dst_rect.h -1)<<16));
+ write_wvalue(G2D_OUTPUT_SIZE_REG, (0x400 -1) | ((para->dst_rect.h -1)<<16));
+ if((para->flag & G2D_BLT_ROTATE180))
+ scaler_outx = para->dst_rect.w - 0x400;
addr_val = mixer_get_addr(para->dst_image.addr[0],para->dst_image.format,para->dst_image.w,scaler_outx,scaler_outy);
+ if((para->flag & G2D_BLT_ROTATE270))
+ addr_val = mixer_get_addr(para->dst_image.addr[0],para->dst_image.format,para->dst_image.w,scaler_outx-0x400,scaler_outy);
reg_val = (addr_val>>32)&0xF;/* high addr in bits */
write_wvalue(G2D_OUTPUT_HADDR_REG, reg_val);
reg_val = addr_val&0xFFFFFFFF;/* low addr in bits */
@@ -1127,13 +1169,20 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
scaler_inx +=sinw;
if((para->flag & G2D_BLT_ROTATE90))
{
- scaler_outy -=0x400;
- scaler_outx = para->dst_rect.x;
+ scaler_outx += 0x400;
+ scaler_iny +=sinw;
+ scaler_inx = para->src_rect.x;
}
else if((para->flag & G2D_BLT_ROTATE270))
{
- scaler_outy +=0x400;
scaler_outx = para->dst_rect.x;
+ scaler_iny +=sinw;
+ scaler_inx = para->src_rect.x;
+ }
+ else if((para->flag & G2D_BLT_ROTATE180))
+ {
+ scaler_outy = para->dst_rect.y;
+ scaler_outx =para->dst_rect.x-para->dst_image.w;
}
else
{
@@ -1150,15 +1199,22 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
/* last block */
soutw = para->dst_rect.w - 0x400*cnt;
+ if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
+ sinw = para->src_rect.h - sinw*cnt;
+ else
sinw = para->src_rect.w - sinw*cnt;
/* DMA0 */
addr_val = mixer_get_addr(para->src_image.addr[0],para->src_image.format,para->src_image.w,scaler_inx,para->src_rect.y);
+ if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
+ addr_val = mixer_get_addr(para->src_image.addr[0],para->src_image.format,para->src_image.w,scaler_inx,scaler_iny);
reg_val = (addr_val>>32)&0xF;/* high addr in bits */
write_wvalue(G2D_DMA_HADDR_REG, reg_val);
reg_val = addr_val&0xFFFFFFFF;/* low addr in bits */
write_wvalue(G2D_DMA0_LADDR_REG, reg_val);
write_wvalue(G2D_DMA0_SIZE_REG, (sinw -1) | ((para->src_rect.h -1)<<16));
+ if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
+ write_wvalue(G2D_DMA0_SIZE_REG, (para->src_rect.w -1) | ((sinw -1)<<16));
/* DMA1 pyuv422/420/411uvc */
if((para->src_image.format>0x16)&&(para->src_image.format<0x1A))
@@ -1186,6 +1242,20 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
/* scaler setting */
if(soutw<1)soutw = 1;
+ if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
+ {
+ write_wvalue(G2D_SCALER_SIZE_REG,(para->dst_rect.h - 1) | ((soutw - 1)<<16));
+ reg_val = (para->src_rect.w/para->dst_rect.h)<<16;
+ reg_tmp = (para->src_rect.w%para->dst_rect.h);
+ reg_val |= (reg_tmp<<16)/para->dst_rect.h;
+ write_wvalue(G2D_SCALER_HFACTOR_REG,reg_val);
+ reg_val = (sinw/soutw)<<16;
+ reg_tmp = (sinw%soutw);
+ reg_val |= (reg_tmp<<16)/soutw;
+ write_wvalue(G2D_SCALER_VFACTOR_REG,reg_val);
+ }
+ else
+ {
write_wvalue(G2D_SCALER_SIZE_REG,(soutw- 1) | ((para->dst_rect.h - 1)<<16));
reg_val = (sinw/soutw)<<16;
reg_tmp = (sinw%soutw);
@@ -1196,7 +1266,9 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
reg_tmp = (para->src_rect.h%para->dst_rect.h);
reg_val |= (reg_tmp<<16)/para->dst_rect.h;
write_wvalue(G2D_SCALER_VFACTOR_REG,reg_val);
-
+ }
+ if((para->flag & G2D_BLT_PIXEL_ALPHA)||(para->flag & G2D_BLT_PLANE_ALPHA)||(para->flag & G2D_BLT_MULTI_ALPHA)||(para->flag & G2D_BLT_SRC_COLORKEY)||(para->flag & G2D_BLT_DST_COLORKEY))
+ {
/* DMA2 pyuv422/420/411uvc */
if((para->dst_image.format>0x16)&&(para->dst_image.format<0x1A))
{
@@ -1227,12 +1299,10 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
reg_val = addr_val&0xFFFFFFFF;/* low addr in bits */
write_wvalue(G2D_DMA3_LADDR_REG, reg_val);
write_wvalue(G2D_DMA3_SIZE_REG, (soutw - 1) | ((para->dst_rect.h -1)<<16));
-
+ }
/* OUT */
+ write_wvalue(G2D_OUTPUT_SIZE_REG, (soutw - 1) | ((para->dst_rect.h -1)<<16));
if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
- write_wvalue(G2D_OUTPUT_SIZE_REG, (para->dst_rect.h -1) | ((soutw - 1)<<16));
- else write_wvalue(G2D_OUTPUT_SIZE_REG, (soutw - 1) | ((para->dst_rect.h -1)<<16));
- if((para->flag & G2D_BLT_ROTATE270))
addr_val = mixer_get_addr(para->dst_image.addr[0],para->dst_image.format,para->dst_image.w,scaler_outx,scaler_outy);
else addr_val = mixer_get_addr(para->dst_image.addr[0],para->dst_image.format,para->dst_image.w,scaler_outx,para->dst_rect.y);
reg_val = (addr_val>>32)&0xF;/* high addr in bits */
@@ -1274,6 +1344,20 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
write_wvalue(G2D_DMA0_LADDR_REG, reg_val);
write_wvalue(G2D_DMA0_SIZE_REG, (para->src_rect.w -1) | ((para->src_rect.h -1)<<16));
+ if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
+ {
+ write_wvalue(G2D_SCALER_SIZE_REG,(para->dst_rect.h - 1) | ((para->dst_rect.w -1)<<16));
+ reg_val = (para->src_rect.w/para->dst_rect.h)<<16;
+ reg_tmp = (para->src_rect.w%para->dst_rect.h);
+ reg_val |= (reg_tmp<<16)/para->dst_rect.h;
+ write_wvalue(G2D_SCALER_HFACTOR_REG,reg_val);
+ reg_val = (para->src_rect.h/para->dst_rect.w)<<16;
+ reg_tmp = (para->src_rect.h%para->dst_rect.w);
+ reg_val |= (reg_tmp<<16)/para->dst_rect.w;
+ write_wvalue(G2D_SCALER_VFACTOR_REG,reg_val);
+ }
+ else
+ {
write_wvalue(G2D_SCALER_SIZE_REG,(para->dst_rect.w - 1) | ((para->dst_rect.h -1)<<16));
reg_val = (para->src_rect.w/para->dst_rect.w)<<16;
reg_tmp = (para->src_rect.w%para->dst_rect.w);
@@ -1283,7 +1367,7 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
reg_tmp = (para->src_rect.h%para->dst_rect.h);
reg_val |= (reg_tmp<<16)/para->dst_rect.h;
write_wvalue(G2D_SCALER_VFACTOR_REG,reg_val);
-
+ }
/* pyuv422/420/411uvc */
if((para->src_image.format>0x16)&&(para->src_image.format<0x1A))
{
@@ -1303,7 +1387,8 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
reg_val |= (5<<8) | G2D_IDMA_ENABLE;
write_wvalue(G2D_DMA1_CONTROL_REG, reg_val);
}
-
+ if((para->flag & G2D_BLT_PIXEL_ALPHA)||(para->flag & G2D_BLT_PLANE_ALPHA)||(para->flag & G2D_BLT_MULTI_ALPHA)||(para->flag & G2D_BLT_SRC_COLORKEY)||(para->flag & G2D_BLT_DST_COLORKEY))
+ {
/* pyuv422/420/411uvc */
if((para->dst_image.format>0x16)&&(para->dst_image.format<0x1A))
{
@@ -1331,22 +1416,21 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
reg_val = addr_val&0xFFFFFFFF;/* low addr in bits */
write_wvalue(G2D_DMA3_LADDR_REG, reg_val);
write_wvalue(G2D_DMA3_SIZE_REG, (para->dst_rect.w -1) | ((para->dst_rect.h -1)<<16));
-
+ }
/* output surface is the dst surface */
- if((para->flag & G2D_BLT_ROTATE90) || (para->flag & G2D_BLT_ROTATE270))
- write_wvalue(G2D_OUTPUT_SIZE_REG, (para->dst_rect.h -1) | ((para->dst_rect.w -1)<<16));
- else write_wvalue(G2D_OUTPUT_SIZE_REG, (para->dst_rect.w -1) | ((para->dst_rect.h -1)<<16));
+ write_wvalue(G2D_OUTPUT_SIZE_REG, (para->dst_rect.w -1) | ((para->dst_rect.h -1)<<16));
addr_val = mixer_get_addr(para->dst_image.addr[0],para->dst_image.format,para->dst_image.w,para->dst_rect.x,para->dst_rect.y);
reg_val = (addr_val>>32)&0xF;/* high addr in bits */
write_wvalue(G2D_OUTPUT_HADDR_REG, reg_val);
reg_val = addr_val&0xFFFFFFFF;/* low addr in bits */
write_wvalue(G2D_OUTPUT0_LADDR_REG, reg_val);
- if((para->dst_image.format>0x16)&&(para->dst_image.format<0x1A))
+ if((para->dst_image.format>0x16)&&(para->dst_image.format<0x1D))
{
- if(para->dst_image.format == G2D_FMT_PYUV411UVC) bppnum = 4;
+ if((para->dst_image.format == G2D_FMT_PYUV411UVC)||(para->dst_image.format == G2D_FMT_PYUV422)||(para->dst_image.format == G2D_FMT_PYUV420)) bppnum = 4;
+ else if(para->dst_image.format == G2D_FMT_PYUV411) bppnum = 2;
else bppnum = 8;
- if(para->dst_image.format == G2D_FMT_PYUV420UVC)
+ if((para->dst_image.format == G2D_FMT_PYUV420UVC)||(para->dst_image.format == G2D_FMT_PYUV420))
addr_val = (__u64)(para->dst_image.addr[1]-0x40000000)*8+(__u64)((para->dst_image.w*(para->dst_rect.y/2)+para->dst_rect.x)*bppnum);
else addr_val = (__u64)(para->dst_image.addr[1]-0x40000000)*8+(__u64)((para->dst_image.w*para->dst_rect.y+para->dst_rect.x)*bppnum);
reg_val = read_wvalue(G2D_OUTPUT_HADDR_REG);
@@ -1355,6 +1439,17 @@ __s32 mixer_stretchblt(g2d_stretchblt *para){
reg_val = addr_val&0xFFFFFFFF;/* low addr in bits */
write_wvalue(G2D_OUTPUT1_LADDR_REG, reg_val);
write_wvalue(G2D_OUTPUT1_STRIDE_REG, para->dst_image.w*bppnum);
+ if(para->dst_image.format == G2D_FMT_PYUV420)
+ addr_val = (__u64)(para->dst_image.addr[2]-0x40000000)*8+(__u64)((para->dst_image.w*(para->dst_rect.y/2)+para->dst_rect.x)*bppnum);
+ else if((para->dst_image.format == G2D_FMT_PYUV422)||(para->dst_image.format == G2D_FMT_PYUV411))
+ addr_val = (__u64)(para->dst_image.addr[2]-0x40000000)*8+(__u64)((para->dst_image.w*para->dst_rect.y+para->dst_rect.x)*bppnum);
+ else addr_val = 0;
+ reg_val = read_wvalue(G2D_OUTPUT_HADDR_REG);
+ reg_val |= ((addr_val>>32)&0xF);/* high addr in bits */
+ write_wvalue(G2D_OUTPUT_HADDR_REG, reg_val);
+ reg_val = addr_val&0xFFFFFFFF;/* low addr in bits */
+ write_wvalue(G2D_OUTPUT2_LADDR_REG, reg_val);
+ write_wvalue(G2D_OUTPUT2_STRIDE_REG, para->dst_image.w*bppnum);
write_wvalue(G2D_CSC2_CONTROL_REG, 0x1);
}
if((para->dst_image.format>0x11)&&(para->dst_image.format<0x1D))write_wvalue(G2D_CSC2_CONTROL_REG, 0x1);
--
1.7.9.5