mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +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/delay.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/amlogic/media/codec_mm/codec_mm.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/dma-contiguous.h>
|
#include <linux/dma-contiguous.h>
|
||||||
#include <linux/amlogic/media/video_sink/video.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)
|
void vdin_dolby_addr_alloc(struct vdin_dev_s *devp, unsigned int size)
|
||||||
{
|
{
|
||||||
unsigned int index, alloc_size;
|
unsigned int index, alloc_size;
|
||||||
|
int highmem_flag;
|
||||||
|
|
||||||
alloc_size = dolby_size_byte*size;
|
alloc_size = dolby_size_byte*size;
|
||||||
devp->dv.dv_dma_vaddr = dma_alloc_coherent(&devp->this_pdev->dev,
|
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;
|
return;
|
||||||
}
|
}
|
||||||
memset(devp->dv.dv_dma_vaddr, 0, alloc_size);
|
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++) {
|
for (index = 0; index < size; index++) {
|
||||||
devp->vfp->dv_buf_mem[index] = devp->dv.dv_dma_paddr +
|
devp->vfp->dv_buf_mem[index] = devp->dv.dv_dma_paddr +
|
||||||
dolby_size_byte * index;
|
dolby_size_byte * index;
|
||||||
devp->vfp->dv_buf_vmem[index] = devp->dv.dv_dma_vaddr +
|
devp->vfp->dv_buf_vmem[index] = devp->dv.dv_dma_vaddr +
|
||||||
dolby_size_byte * index;
|
dolby_size_byte * index;
|
||||||
if ((devp->cma_config_flag & 0x100) && devp->cma_config_en)
|
|
||||||
devp->vfp->dv_buf_ori[index] =
|
if (highmem_flag == 0) {
|
||||||
phys_to_virt(devp->vfmem_start[index] +
|
if ((devp->cma_config_flag & 0x100)
|
||||||
devp->vfmem_size -
|
&& devp->cma_config_en)
|
||||||
dolby_size_byte);
|
devp->vfp->dv_buf_ori[index] =
|
||||||
else
|
phys_to_virt(devp->vfmem_start[index] +
|
||||||
devp->vfp->dv_buf_ori[index] =
|
devp->vfmem_size -
|
||||||
phys_to_virt(devp->mem_start + devp->mem_size -
|
dolby_size_byte);
|
||||||
dolby_size_byte *
|
else
|
||||||
(devp->canvas_max_num - index));
|
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,
|
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_ori[index],
|
||||||
devp->vfp->dv_buf_mem[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)
|
void vdin_dolby_addr_release(struct vdin_dev_s *devp, unsigned int size)
|
||||||
{
|
{
|
||||||
unsigned int alloc_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;
|
alloc_size = dolby_size_byte*size;
|
||||||
if (devp->dv.dv_dma_vaddr)
|
if (devp->dv.dv_dma_vaddr)
|
||||||
|
|||||||
Reference in New Issue
Block a user