mirror of
https://github.com/hardkernel/linux.git
synced 2026-04-03 11:43:03 +09:00
tvin: vdin: fix system crash when dolby vision enable [1/1]
PD#SWPL-3353 Problem: system crash when dolby vision enable Solution: 32bit kernel,phy addr to virt interface is changed Verify: Verified on txlx R311 Change-Id: Ie012bdaf7f9dc24acf7a7e03f0db056ff31e578c Signed-off-by: Xuhua Zhang <xuhua.zhang@amlogic.com>
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/amlogic/media/codec_mm/codec_mm.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/dma-contiguous.h>
|
||||
#include <linux/amlogic/media/video_sink/video.h>
|
||||
@@ -3505,6 +3506,7 @@ void vdin_force_gofiled(struct vdin_dev_s *devp)
|
||||
void vdin_dolby_addr_alloc(struct vdin_dev_s *devp, unsigned int size)
|
||||
{
|
||||
unsigned int index, alloc_size;
|
||||
int highmem_flag;
|
||||
|
||||
alloc_size = dolby_size_byte*size;
|
||||
devp->dv.dv_dma_vaddr = dma_alloc_coherent(&devp->this_pdev->dev,
|
||||
@@ -3514,21 +3516,45 @@ void vdin_dolby_addr_alloc(struct vdin_dev_s *devp, unsigned int size)
|
||||
return;
|
||||
}
|
||||
memset(devp->dv.dv_dma_vaddr, 0, alloc_size);
|
||||
if (devp->cma_config_flag & 0x100)
|
||||
highmem_flag = PageHighMem(phys_to_page(devp->vfmem_start[0]));
|
||||
else
|
||||
highmem_flag = PageHighMem(phys_to_page(devp->mem_start));
|
||||
|
||||
for (index = 0; index < size; index++) {
|
||||
devp->vfp->dv_buf_mem[index] = devp->dv.dv_dma_paddr +
|
||||
dolby_size_byte * index;
|
||||
devp->vfp->dv_buf_vmem[index] = devp->dv.dv_dma_vaddr +
|
||||
dolby_size_byte * index;
|
||||
if ((devp->cma_config_flag & 0x100) && devp->cma_config_en)
|
||||
devp->vfp->dv_buf_ori[index] =
|
||||
phys_to_virt(devp->vfmem_start[index] +
|
||||
devp->vfmem_size -
|
||||
dolby_size_byte);
|
||||
else
|
||||
devp->vfp->dv_buf_ori[index] =
|
||||
phys_to_virt(devp->mem_start + devp->mem_size -
|
||||
dolby_size_byte *
|
||||
(devp->canvas_max_num - index));
|
||||
|
||||
if (highmem_flag == 0) {
|
||||
if ((devp->cma_config_flag & 0x100)
|
||||
&& devp->cma_config_en)
|
||||
devp->vfp->dv_buf_ori[index] =
|
||||
phys_to_virt(devp->vfmem_start[index] +
|
||||
devp->vfmem_size -
|
||||
dolby_size_byte);
|
||||
else
|
||||
devp->vfp->dv_buf_ori[index] =
|
||||
phys_to_virt(devp->mem_start +
|
||||
devp->mem_size -
|
||||
dolby_size_byte *
|
||||
(devp->canvas_max_num - index));
|
||||
} else {
|
||||
if ((devp->cma_config_flag & 0x100)
|
||||
&& devp->cma_config_en)
|
||||
devp->vfp->dv_buf_ori[index] =
|
||||
codec_mm_vmap(devp->vfmem_start[index] +
|
||||
devp->vfmem_size-dolby_size_byte,
|
||||
dolby_size_byte);
|
||||
else
|
||||
devp->vfp->dv_buf_ori[index] =
|
||||
codec_mm_vmap(devp->mem_start +
|
||||
devp->mem_size -
|
||||
dolby_size_byte *
|
||||
(devp->canvas_max_num - index),
|
||||
dolby_size_byte);
|
||||
}
|
||||
pr_info("%s:dv_buf[%d]=0x%p(0x%x,0x%p)\n", __func__, index,
|
||||
devp->vfp->dv_buf_ori[index],
|
||||
devp->vfp->dv_buf_mem[index],
|
||||
@@ -3540,6 +3566,17 @@ void vdin_dolby_addr_alloc(struct vdin_dev_s *devp, unsigned int size)
|
||||
void vdin_dolby_addr_release(struct vdin_dev_s *devp, unsigned int size)
|
||||
{
|
||||
unsigned int alloc_size;
|
||||
int highmem_flag, index;
|
||||
|
||||
if (devp->cma_config_flag & 0x100)
|
||||
highmem_flag = PageHighMem(phys_to_page(devp->vfmem_start[0]));
|
||||
else
|
||||
highmem_flag = PageHighMem(phys_to_page(devp->mem_start));
|
||||
|
||||
for (index = 0; index < size; index++) {
|
||||
if (highmem_flag == 1)
|
||||
codec_mm_unmap_phyaddr(devp->vfp->dv_buf_ori[index]);
|
||||
}
|
||||
|
||||
alloc_size = dolby_size_byte*size;
|
||||
if (devp->dv.dv_dma_vaddr)
|
||||
|
||||
Reference in New Issue
Block a user