From: Mark Yao Date: Thu, 20 Apr 2017 01:34:26 +0000 (+0800) Subject: video/rockchip: rga2: fix rga timeout when do scaling X-Git-Tag: release-20171130_firefly~4^2~764 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=744f756b0b98d43a9be5ae9bce31e8c229070f07;hp=4731c32977a5bde725f9bc9fb1042a704ea9bde2;p=firefly-linux-kernel-4.4.55.git video/rockchip: rga2: fix rga timeout when do scaling rk3368 rga sometime may timeout when do scaling, and it can't be restore until do a non-scale rga work. So hack that, if timeout with scaling work, do a tiny non-scale rga work before normal work. Change-Id: I4598741347c44a1ff3c2272270f4c6a1def36177 Signed-off-by: Mark Yao --- diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c index 850d20f33f34..2ab9d881e929 100644 --- a/drivers/video/rockchip/rga2/rga2_drv.c +++ b/drivers/video/rockchip/rga2/rga2_drv.c @@ -919,6 +919,7 @@ static int rga2_blit_async(rga2_session *session, struct rga2_req *req) static int rga2_blit_sync(rga2_session *session, struct rga2_req *req) { struct rga2_req req_bak; + int restore = 0; int try = 10; int ret = -1; int ret_timeout = 0; @@ -969,11 +970,30 @@ retry: #endif if (ret == -ETIMEDOUT && try--) { memcpy(req, &req_bak, sizeof(req_bak)); + /* + * if rga work timeout with scaling, need do a non-scale work + * first, restore hardware status, then do actually work. + */ + if (req->src.act_w != req->dst.act_w || + req->src.act_h != req->dst.act_h) { + req->src.act_w = MIN(320, MIN(req->src.act_w, + req->dst.act_w)); + req->src.act_h = MIN(240, MIN(req->src.act_h, + req->dst.act_h)); + req->dst.act_w = req->src.act_w; + req->dst.act_h = req->src.act_h; + restore = 1; + } + goto retry; + } + if (!ret && restore) { + memcpy(req, &req_bak, sizeof(req_bak)); + restore = 0; goto retry; } return ret; - } +} static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg) {