video/rockchip: rga2: Fix errors in Y4/Y400 format.

1. Modify the calculation of Y400/Y4 buffer size.
2. Add print of result and pageCount.
3. Add Y4/Y400 string name.

Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
Change-Id: Ibe26b7b900c317d28e0c4326f0c89a244a0017b0
This commit is contained in:
Yu Qiaowei
2020-11-18 16:51:17 +08:00
committed by Tao Huang
parent cbee98b758
commit d1ce375ca1
2 changed files with 26 additions and 8 deletions

View File

@@ -303,6 +303,10 @@ static const char *rga2_get_format_name(uint32_t format)
return "BPP4";
case RGA2_FORMAT_BPP_8:
return "BPP8";
case RGA2_FORMAT_YCbCr_400:
return "YCbCr400";
case RGA2_FORMAT_Y4:
return "y4";
default:
return "UNF";
}

View File

@@ -275,7 +275,6 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
break;
case RGA2_FORMAT_YCbCr_420_P :
case RGA2_FORMAT_YCrCb_420_P :
case RGA2_FORMAT_YCbCr_400 :
stride = (w + 3) & (~3);
size_yrgb = stride * h;
size_uv = ((stride >> 1) * (h >> 1));
@@ -286,14 +285,23 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
pageCount = end - start;
break;
case RGA2_FORMAT_YCbCr_400:
stride = (w + 3) & (~3);
size_yrgb = stride * h;
size_uv = 0;
size_v = 0;
start = yrgb_addr >> PAGE_SHIFT;
end = yrgb_addr + size_yrgb;
end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
pageCount = end - start;
break;
case RGA2_FORMAT_Y4:
stride = ((w + 3) & (~3) ) >> 1;
size_yrgb = stride * h;
size_uv = 0;
size_v = 0;
start = MIN(MIN(yrgb_addr, uv_addr), v_addr);
start >>= PAGE_SHIFT;
end = MAX(MAX((yrgb_addr + size_yrgb), (uv_addr + size_uv)), (v_addr + size_v));
start = yrgb_addr >> PAGE_SHIFT;
end = yrgb_addr + size_yrgb;
end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
pageCount = end - start;
break;
@@ -477,24 +485,29 @@ static int rga2_MapUserMemory(struct page **pages, uint32_t *pageTable,
for (i = 0; i < pageCount; i++) {
vma = find_vma(current->mm, (Memory + i) << PAGE_SHIFT);
if (!vma) {
pr_err("RGA2 failed to get vma, result = %d, pageCount = %d\n",
result, pageCount);
status = RGA2_OUT_OF_RESOURCES;
break;
}
pgd = pgd_offset(current->mm, (Memory + i) << PAGE_SHIFT);
if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd))) {
pr_err("RGA2 failed to get pgd\n");
pr_err("RGA2 failed to get pgd, result = %d, pageCount = %d\n",
result, pageCount);
status = RGA2_OUT_OF_RESOURCES;
break;
}
pud = pud_offset(pgd, (Memory + i) << PAGE_SHIFT);
if (pud_none(*pud) || unlikely(pud_bad(*pud))) {
pr_err("RGA2 failed to get pud\n");
pr_err("RGA2 failed to get pud, result = %d, pageCount = %d\n",
result, pageCount);
status = RGA2_OUT_OF_RESOURCES;
break;
}
pmd = pmd_offset(pud, (Memory + i) << PAGE_SHIFT);
if (pmd_none(*pmd) || unlikely(pmd_bad(*pmd))) {
pr_err("RGA2 failed to get pmd\n");
pr_err("RGA2 failed to get pmd, result = %d, pageCount = %d\n",
result, pageCount);
status = RGA2_OUT_OF_RESOURCES;
break;
}
@@ -502,7 +515,8 @@ static int rga2_MapUserMemory(struct page **pages, uint32_t *pageTable,
(Memory + i) << PAGE_SHIFT,
&ptl);
if (pte_none(*pte)) {
pr_err("RGA2 failed to get pte\n");
pr_err("RGA2 failed to get pte, result = %d, pageCount = %d\n",
result, pageCount);
pte_unmap_unlock(pte, ptl);
status = RGA2_OUT_OF_RESOURCES;
break;