mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 12:57:06 +09:00
media_modules: encoder: fix kernel panic in encoder module [1/1]
PD#SWPL-2270 Problem: when do camera record on ampere P,platform stuck and reboot, kernel panic in encoder module Solution: change phys_to_virt to codec_mm_phys_to_virt; dma_flush to codec_mm_dma_flush Verify: verify by ampere P Change-Id: I04002587a0683473a6609d3a89176a5cebd3260e Signed-off-by: kunpeng.tang <kunpeng.tang@amlogic.com>
This commit is contained in:
committed by
Dongjin Kim
parent
3b5848f74e
commit
75ab7af1ed
@@ -762,6 +762,9 @@ static void avc_buffspec_init(struct encode_wq_s *wq)
|
||||
wq->mem.buf_start + wq->mem.bufspec.cbr_info.buf_start;
|
||||
wq->mem.cbr_info_ddr_size =
|
||||
wq->mem.bufspec.cbr_info.buf_size;
|
||||
wq->mem.cbr_info_ddr_virt_addr =
|
||||
codec_mm_vmap(wq->mem.cbr_info_ddr_start_addr,
|
||||
wq->mem.bufspec.cbr_info.buf_size);
|
||||
|
||||
wq->mem.dblk_buf_canvas =
|
||||
((ENC_CANVAS_OFFSET + 2) << 16) |
|
||||
@@ -3250,11 +3253,10 @@ static s32 encode_process_request(struct encode_manager_s *manager,
|
||||
if (request->cmd == ENCODER_IDR || request->cmd == ENCODER_NON_IDR) {
|
||||
if (request->flush_flag & AMVENC_FLUSH_FLAG_CBR
|
||||
&& get_cpu_type() >= MESON_CPU_MAJOR_ID_GXTVBB) {
|
||||
void *vaddr =
|
||||
phys_to_virt(wq->mem.cbr_info_ddr_start_addr);
|
||||
void *vaddr = wq->mem.cbr_info_ddr_virt_addr;
|
||||
ConvertTable2Risc(vaddr, 0xa00);
|
||||
buf_start = getbuffer(wq, ENCODER_BUFFER_CBR);
|
||||
dma_flush(buf_start, wq->mem.cbr_info_ddr_size);
|
||||
codec_mm_dma_flush(vaddr, wq->mem.cbr_info_ddr_size, DMA_TO_DEVICE);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -3540,6 +3542,10 @@ s32 destroy_encode_work_queue(struct encode_wq_s *encode_work_queue)
|
||||
spin_unlock(&encode_manager.event.sem_lock);
|
||||
#ifdef CONFIG_CMA
|
||||
if (encode_work_queue->mem.buf_start) {
|
||||
if (wq->mem.cbr_info_ddr_virt_addr != NULL) {
|
||||
codec_mm_unmap_phyaddr(wq->mem.cbr_info_ddr_virt_addr);
|
||||
wq->mem.cbr_info_ddr_virt_addr = NULL;
|
||||
}
|
||||
codec_mm_free_for_dma(
|
||||
ENCODE_NAME,
|
||||
encode_work_queue->mem.buf_start);
|
||||
|
||||
@@ -260,6 +260,8 @@ struct encode_meminfo_s {
|
||||
u32 cbr_info_ddr_start_addr;
|
||||
u32 cbr_info_ddr_size;
|
||||
|
||||
u32 cbr_info_ddr_virt_addr;
|
||||
|
||||
s32 dblk_buf_canvas;
|
||||
s32 ref_buf_canvas;
|
||||
struct BuffInfo_s bufspec;
|
||||
|
||||
Reference in New Issue
Block a user