Looks fine.

Applied to stage/sunxi-3.4.


tor 2014-07-03 klockan 13:28 +0200 skrev Andreas Baierl:
> G2D seems to break if a zero value of src_rect.w or src_rect.h is 
> provided to g2d_blit, g2d_fill or g2d_stretchblit.
> para.src_rect.w == 0 or para.src_rect.h == 0 results in trying to write 
> -1 toG2D_DMA0_SIZE_REG register within the mixer_* functions, e.g. here 
> https://github.com/linux-sunxi/linux-sunxi/blob/sunxi-3.4/drivers/char/sunxi_g2d/g2d_bsp.c#L682
>  
> 
> 
> The following patch catches these zero value cases.
> 
> diff --git a/drivers/char/sunxi_g2d/g2d.c b/drivers/char/sunxi_g2d/g2d.c
> index 7982a54..288685a 100644
> --- a/drivers/char/sunxi_g2d/g2d.c
> +++ b/drivers/char/sunxi_g2d/g2d.c
> @@ -138,7 +138,8 @@ int g2d_blit(g2d_blt * para)
>       __s32 err = 0;
>   
>       /* check the parameter valid */
> -    if(((para->src_rect.x < 0)&&((-para->src_rect.x) > para->src_rect.w)) ||
> +    if(para->src_rect.w == 0 || para->src_rect.h == 0 ||
> +       ((para->src_rect.x < 0)&&((-para->src_rect.x) > para->src_rect.w)) ||
>          ((para->src_rect.y < 0)&&((-para->src_rect.y) > para->src_rect.h)) ||
>          ((para->dst_x < 0)&&((-para->dst_x) > para->src_rect.w)) ||
>          ((para->dst_y < 0)&&((-para->dst_y) > para->src_rect.h)) ||
> @@ -204,7 +205,8 @@ int g2d_fill(g2d_fillrect * para)
>       __s32 err = 0;
>   
>       /* check the parameter valid */
> -     if(((para->dst_rect.x < 0)&&((-para->dst_rect.x)>para->dst_rect.w)) ||
> +     if(para->dst_rect.w == 0 || para->dst_rect.h == 0 ||
> +        ((para->dst_rect.x < 0)&&((-para->dst_rect.x)>para->dst_rect.w)) ||
>          ((para->dst_rect.y < 0)&&((-para->dst_rect.y)>para->dst_rect.h)) ||
>          ((para->dst_rect.x > 0)&&(para->dst_rect.x > para->dst_image.w - 1)) 
> ||
>          ((para->dst_rect.y > 0)&&(para->dst_rect.y > para->dst_image.h - 1)))
> @@ -245,7 +247,9 @@ int g2d_stretchblit(g2d_stretchblt * para)
>       __s32 err = 0;
>   
>       /* check the parameter valid */
> -    if(((para->src_rect.x < 0)&&((-para->src_rect.x) > para->src_rect.w)) ||
> +    if(para->src_rect.w == 0 || para->src_rect.h == 0 ||
> +       para->dst_rect.w == 0 || para->dst_rect.h == 0 ||
> +       ((para->src_rect.x < 0)&&((-para->src_rect.x) > para->src_rect.w)) ||
>          ((para->src_rect.y < 0)&&((-para->src_rect.y) > para->src_rect.h)) ||
>          ((para->dst_rect.x < 0)&&((-para->dst_rect.x) > para->dst_rect.w)) ||
>          ((para->dst_rect.y < 0)&&((-para->dst_rect.y) > para->dst_rect.h)) ||
> 
> 
> Sorry for not posting it in the right patch format, i'll do that later. 
> Thanks jemk for the hint.
> Regards
> 
> 
> Am 20.03.2014 09:58, schrieb Andreas Baierl:
> > For testing purposes, setting timeout=500 has the effect, that OSD 
> > stops flickering, but instead of the correct image, only a black area 
> > with OSD dimensions is displayed.
> > "wait g2d irq pending flag timeout" still is there.
> > I also applied 
> > https://github.com/amery/linux-sunxi/commit/7015bbb75ac57b , no 
> > knowing, what it is doing due to lack of register documentation. Has 
> > no positive effect, too.
> > So no positive feedback so far.
> >
> > Regards
> > Andreas
> >
> > Am 05.03.2014 20:32, schrieb Andreas Baierl:
> >> Am 04.03.2014 11:56, schrieb Andreas Baierl:
> >>> Hi all,
> >>> it seems, that the G2D kernel driver has some issue:
> >>>
> >>> libvdpau-sunxi uses G2D_CMD_BITBLT for creating surfaces, so at the 
> >>> end of mixer_blt, there is g2d_wait_cmd_finish() called.
> >>> As soon as (timeout==0) gets TRUE in 
> >>> https://github.com/linux-sunxi/linux-sunxi/blob/sunxi-3.4/drivers/char/sunxi_g2d/g2d.c#L120
> >>>  
> >>> , g2d stops working.
> >>> It's not possible to interact with /dev/g2d anymore until you reboot 
> >>> (or possibly un-/reload the module).
> >>>
> >>> I'm not sure how to exactly reproduce that. It mostly occurs the 
> >>> second time i start VDR with libvdpau-sunxi and OSD.
> >>>
> >>> Regards
> >>> rellla
> >>>
> >> I don't know if it's related to the above, but unloading the kernel 
> >> module g2d_23 after it stopped working with the "wait g2d irq pending 
> >> flag timeout" message shows me the following log:
> >>
> >> [  735.058259] [DISP] layer allocated: 0,102
> >> [  735.065332] [DISP] layer allocated: 0,103
> >> [  735.227857] wait g2d irq pending flag timeout
> >> [  783.215100] [DISP] layer released: 0,102
> >> [  783.222385] [DISP] layer released: 0,103
> >> [  792.500779] [DISP] layer released: 0,101
> >> [  792.541549] UMP<2>: Session closed
> >> [  795.070534] G2D: g2d_module_exit
> >> [  795.080032] G2D: Driver unloaded succesfully.
> >> [  795.092261] ------------[ cut here ]------------
> >> [  795.105471] WARNING: at drivers/base/core.c:196 
> >> device_release+0x78/0x84()
> >> [  795.122342] Device 'g2d' does not have a release() function, it is 
> >> broken and must be fixed.
> >> [  795.135209] Modules linked in: disp_ump mali_drm drm g2d_23(-) 
> >> sunxi_cedar_mod sw_ahci_platform mali ump
> >> [  795.162378] [<c0014a4c>] (unwind_backtrace+0x0/0x138) from 
> >> [<c0031e10>] (warn_slowpath_common+0x4c/0x64)
> >> [  795.183234] [<c0031e10>] (warn_slowpath_common+0x4c/0x64) from 
> >> [<c0031ebc>] (warn_slowpath_fmt+0x30/0x40)
> >> [  795.203586] [<c0031ebc>] (warn_slowpath_fmt+0x30/0x40) from 
> >> [<c0309ae0>] (device_release+0x78/0x84)
> >> [  795.223412] [<c0309ae0>] (device_release+0x78/0x84) from 
> >> [<c028ba3c>] (kobject_release+0x98/0x1bc)
> >> [  795.244079] [<c028ba3c>] (kobject_release+0x98/0x1bc) from 
> >> [<bf04f54c>] (g2d_module_exit+0x34/0x68 [g2d_23])
> >> [  795.266065] [<bf04f54c>] (g2d_module_exit+0x34/0x68 [g2d_23]) from 
> >> [<c006c00c>] (sys_delete_module+0x1ac/0x28c)
> >> [  795.287740] [<c006c00c>] (sys_delete_module+0x1ac/0x28c) from 
> >> [<c000ea80>] (ret_fast_syscall+0x0/0x30)
> >> [  795.304222] ---[ end trace ec0a564270cd7879 ]---
> >>
> >> rellla
> >>
> >
> 


-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to