diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c index cfc4940ee681..3c3f24c15754 100644 --- a/drivers/video/rockchip/rga2/rga2_mmu_info.c +++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c @@ -176,49 +176,65 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns stride = (w * 4 + 3) & (~3); size_yrgb = stride*h; start = yrgb_addr >> PAGE_SHIFT; - pageCount = (size_yrgb + PAGE_SIZE - 1) >> PAGE_SHIFT; + end = yrgb_addr + size_yrgb; + end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT; + pageCount = end - start; break; case RGA2_FORMAT_RGBX_8888 : stride = (w * 4 + 3) & (~3); size_yrgb = stride*h; start = yrgb_addr >> PAGE_SHIFT; - pageCount = (size_yrgb + PAGE_SIZE - 1) >> PAGE_SHIFT; + end = yrgb_addr + size_yrgb; + end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT; + pageCount = end - start; break; case RGA2_FORMAT_RGB_888 : stride = (w * 3 + 3) & (~3); size_yrgb = stride*h; start = yrgb_addr >> PAGE_SHIFT; - pageCount = (size_yrgb + PAGE_SIZE - 1) >> PAGE_SHIFT; + end = yrgb_addr + size_yrgb; + end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT; + pageCount = end - start; break; case RGA2_FORMAT_BGRA_8888 : stride = (w * 4 + 3) & (~3); size_yrgb = stride * h; start = yrgb_addr >> PAGE_SHIFT; - pageCount = (size_yrgb + PAGE_SIZE - 1) >> PAGE_SHIFT; + end = yrgb_addr + size_yrgb; + end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT; + pageCount = end - start; break; case RGA2_FORMAT_RGB_565 : stride = (w*2 + 3) & (~3); size_yrgb = stride * h; start = yrgb_addr >> PAGE_SHIFT; - pageCount = (size_yrgb + PAGE_SIZE - 1) >> PAGE_SHIFT; + end = yrgb_addr + size_yrgb; + end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT; + pageCount = end - start; break; case RGA2_FORMAT_RGBA_5551 : stride = (w*2 + 3) & (~3); size_yrgb = stride * h; start = yrgb_addr >> PAGE_SHIFT; - pageCount = (size_yrgb + PAGE_SIZE - 1) >> PAGE_SHIFT; + end = yrgb_addr + size_yrgb; + end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT; + pageCount = end - start; break; case RGA2_FORMAT_RGBA_4444 : stride = (w*2 + 3) & (~3); size_yrgb = stride * h; start = yrgb_addr >> PAGE_SHIFT; - pageCount = (size_yrgb + PAGE_SIZE - 1) >> PAGE_SHIFT; + end = yrgb_addr + size_yrgb; + end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT; + pageCount = end - start; break; case RGA2_FORMAT_BGR_888 : stride = (w*3 + 3) & (~3); size_yrgb = stride * h; start = yrgb_addr >> PAGE_SHIFT; - pageCount = (size_yrgb + PAGE_SIZE - 1) >> PAGE_SHIFT; + end = yrgb_addr + size_yrgb; + end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT; + pageCount = end - start; break; /* YUV FORMAT */ @@ -434,9 +450,6 @@ static int rga2_MapUserMemory(struct page **pages, uint32_t *pageTable, for (i = 0; i < pageCount; i++) { /* Get the physical address from page struct. */ pageTable[i] = page_to_phys(pages[i]); - /* ensure dst not flush null cache */ - if (writeFlag && i >= pageCount - 2) - break; rga2_dma_flush_page(pages[i]); } for (i = 0; i < result; i++) @@ -486,10 +499,7 @@ static int rga2_MapUserMemory(struct page **pages, uint32_t *pageTable, << PAGE_SHIFT)) & ~PAGE_MASK)); pte_unmap_unlock(pte, ptl); pageTable[i] = (uint32_t)Address; - if ( writeFlag && (i >= pageCount - 2)) - break; rga2_dma_flush_page(pfn_to_page(pfn)); - } up_read(¤t->mm->mmap_sem); return status; @@ -588,8 +598,6 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req) req->dst.vir_w, req->dst.vir_h, &DstStart); - /* if vir_address not 4k align need more page */ - DstPageCount += 2; if (DstPageCount == 0) return -EINVAL; }