From 932c0ce811b9bcaec097caba4ed349ead0062236 Mon Sep 17 00:00:00 2001 From: "renjiang.han" Date: Thu, 20 Dec 2018 17:23:24 +0800 Subject: [PATCH] VPU: Phys_to_virt causes boot HEVC encoding driver exception [1/1] PD#SWPL-3503 Problem: Phys_to_virt causes boot HEVC encoding driver exception. Solution: Replace Phys_to_virt with codec_mm_vmap. Verify: on U212 Change-Id: I1a38b95050dc8f3b733b458be952cb2af903f94f Signed-off-by: renjiang.han --- .../media_modules/frame_sink/encoder/h265/vpu.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/amlogic/media_modules/frame_sink/encoder/h265/vpu.c b/drivers/amlogic/media_modules/frame_sink/encoder/h265/vpu.c index ecc4ba7905a8..5bea5701284e 100644 --- a/drivers/amlogic/media_modules/frame_sink/encoder/h265/vpu.c +++ b/drivers/amlogic/media_modules/frame_sink/encoder/h265/vpu.c @@ -323,11 +323,10 @@ static s32 vpu_open(struct inode *inode, struct file *filp) s_video_memory.size = VPU_INIT_VIDEO_MEMORY_SIZE_IN_BYTE; s_video_memory.phys_addr = (ulong)codec_mm_alloc_for_dma(VPU_DEV_NAME, - VPU_INIT_VIDEO_MEMORY_SIZE_IN_BYTE >> PAGE_SHIFT, 0, - CODEC_MM_FLAGS_CPU); + VPU_INIT_VIDEO_MEMORY_SIZE_IN_BYTE >> PAGE_SHIFT, 0, 0); if (s_video_memory.phys_addr) s_video_memory.base = - (ulong)phys_to_virt(s_video_memory.phys_addr); + (ulong)codec_mm_vmap(s_video_memory.phys_addr,s_video_memory.size); else s_video_memory.base = 0; if (s_video_memory.base) { @@ -341,6 +340,8 @@ static s32 vpu_open(struct inode *inode, struct file *filp) s_video_memory.size) < 0) { enc_pr(LOG_ERROR, "fail to init vmem system\n"); r = -ENOMEM; + codec_mm_unmap_phyaddr((u8 *)s_video_memory.base); + s_video_memory.base = 0; codec_mm_free_for_dma( VPU_DEV_NAME, (u32)s_video_memory.phys_addr); @@ -1365,6 +1366,8 @@ static s32 vpu_release(struct inode *inode, struct file *filp) } if (s_video_memory.base && !use_reserve) { + codec_mm_unmap_phyaddr((u8 *)s_video_memory.base); + s_video_memory.base = 0; codec_mm_free_for_dma( VPU_DEV_NAME, (u32)s_video_memory.phys_addr); @@ -1576,7 +1579,7 @@ static s32 hevc_mem_device_init( s_video_memory.size = rmem->size; s_video_memory.phys_addr = (ulong)rmem->base; s_video_memory.base = - (ulong)phys_to_virt(s_video_memory.phys_addr); + (ulong)codec_mm_vmap(s_video_memory.phys_addr,s_video_memory.size); if (!s_video_memory.base) { enc_pr(LOG_ERROR, "fail to remap video memory "); enc_pr(LOG_ERROR, @@ -1787,10 +1790,13 @@ static s32 vpu_remove(struct platform_device *pdev) } if (s_video_memory.base) { - if (!use_reserve) + if (!use_reserve) { + codec_mm_unmap_phyaddr((u8 *)s_video_memory.base); + s_video_memory.base = 0; codec_mm_free_for_dma( VPU_DEV_NAME, (u32)s_video_memory.phys_addr); + } vmem_exit(&s_vmem); memset(&s_video_memory, 0, sizeof(struct vpudrv_buffer_t));