116 files changed, 25845 insertions, 36303 deletions
diff --git a/drivers/frame_provider/decoder/avs/avs.c b/drivers/frame_provider/decoder/avs/avs.c index 642c3bb..b97cb33 100644 --- a/drivers/frame_provider/decoder/avs/avs.c +++ b/drivers/frame_provider/decoder/avs/avs.c @@ -151,7 +151,7 @@ static struct vframe_provider_s vavs_vf_prov; #define RV_AI_BUFF_START_ADDR 0x01a00000 #define LONG_CABAC_RV_AI_BUFF_START_ADDR 0x00000000 -static u32 vf_buf_num = 4; +static u32 vf_buf_num = 8; static u32 vf_buf_num_used; static u32 canvas_base = 128; #ifdef NV21 @@ -479,7 +479,7 @@ static void vavs_isr(void) (((reg >> 8) & 0x3) << 3) - 1) & 0x1f; else buffer_index = - ((reg & 0x7) - 1) & 3; + ((reg & 0x7) - 1) & 7; picture_type = (reg >> 3) & 7; #ifdef DEBUG_PTS @@ -644,7 +644,6 @@ static void vavs_isr(void) decoder_bmmu_box_get_mem_handle( mm_blk_handle, buffer_index); - kfifo_put(&display_q, (const struct vframe_s *)vf); ATRACE_COUNTER(MODULE_NAME, vf->pts); @@ -727,6 +726,7 @@ static void vavs_isr(void) mm_blk_handle, buffer_index); decoder_do_frame_check(NULL, vf); + kfifo_put(&display_q, (const struct vframe_s *)vf); ATRACE_COUNTER(MODULE_NAME, vf->pts); @@ -969,13 +969,14 @@ void vavs_recover(void) WRITE_VREG(DOS_SW_RESET0, (1 << 9) | (1 << 8)); WRITE_VREG(DOS_SW_RESET0, 0); - + WRITE_VREG(AV_SCRATCH_H, 0); if (firmware_sel == 1) { WRITE_VREG(POWER_CTL_VLD, 0x10); WRITE_VREG_BITS(VLD_MEM_VIFIFO_CONTROL, 2, MEM_FIFO_CNT_BIT, 2); WRITE_VREG_BITS(VLD_MEM_VIFIFO_CONTROL, 8, MEM_LEVEL_CNT_BIT, 6); + WRITE_VREG(AV_SCRATCH_H, 1); // 8 buf flag to ucode } @@ -1078,6 +1079,7 @@ static int vavs_prot_init(void) /*************************************************************/ r = vavs_canvas_init(); + WRITE_VREG(AV_SCRATCH_H, 0); #ifdef NV21 if (firmware_sel == 0) { /* fixed canvas index */ @@ -1095,12 +1097,7 @@ static int vavs_prot_init(void) << 16) ); } - /* - *WRITE_VREG(AV_SCRATCH_0, 0x010100); - *WRITE_VREG(AV_SCRATCH_1, 0x040403); - *WRITE_VREG(AV_SCRATCH_2, 0x070706); - *WRITE_VREG(AV_SCRATCH_3, 0x0a0a09); - */ + WRITE_VREG(AV_SCRATCH_H, 1); // 8 buf flag to ucode } #else /* index v << 16 | u << 8 | y */ @@ -1161,7 +1158,7 @@ static int vavs_prot_init(void) #ifdef AVSP_LONG_CABAC static unsigned char es_write_addr[MAX_CODED_FRAME_SIZE] __aligned(64); #endif -static void vavs_local_init(void) +static void vavs_local_init(bool is_reset) { int i; @@ -1180,19 +1177,23 @@ static void vavs_local_init(void) #ifdef DEBUG_PTS pts_hit = pts_missed = pts_i_hit = pts_i_missed = 0; #endif - INIT_KFIFO(display_q); - INIT_KFIFO(recycle_q); - INIT_KFIFO(newframe_q); - for (i = 0; i < VF_POOL_SIZE; i++) { - const struct vframe_s *vf = &vfpool[i]; + if (!is_reset) { + INIT_KFIFO(display_q); + INIT_KFIFO(recycle_q); + INIT_KFIFO(newframe_q); - vfpool[i].index = vf_buf_num; - vfpool[i].bufWidth = 1920; - kfifo_put(&newframe_q, vf); + for (i = 0; i < VF_POOL_SIZE; i++) { + const struct vframe_s *vf = &vfpool[i]; + + vfpool[i].index = vf_buf_num; + vfpool[i].bufWidth = 1920; + kfifo_put(&newframe_q, vf); + } + + for (i = 0; i < vf_buf_num; i++) + vfbuf_use[i] = 0; } - for (i = 0; i < vf_buf_num; i++) - vfbuf_use[i] = 0; cur_vfpool = vfpool; @@ -1232,7 +1233,7 @@ static void vavs_ppmgr_reset(void) { vf_notify_receiver(PROVIDER_NAME, VFRAME_EVENT_PROVIDER_RESET, NULL); - vavs_local_init(); + vavs_local_init(true); pr_info("vavs: vf_ppmgr_reset\n"); } @@ -1241,12 +1242,12 @@ static void vavs_ppmgr_reset(void) static void vavs_local_reset(void) { mutex_lock(&vavs_mutex); - recover_flag = 1; + //recover_flag = 1; pr_info("error, local reset\n"); amvdec_stop(); msleep(100); vf_notify_receiver(PROVIDER_NAME, VFRAME_EVENT_PROVIDER_RESET, NULL); - vavs_local_init(); + vavs_local_init(true); vavs_recover(); @@ -1283,7 +1284,7 @@ static void vavs_fatal_error_handler(struct work_struct *work) vavs_ppmgr_reset(); #else vf_light_unreg_provider(&vavs_vf_prov); - vavs_local_init(); + vavs_local_init(true); vf_reg_provider(&vavs_vf_prov); #endif vavs_recover(); @@ -1341,7 +1342,7 @@ static void vavs_put_timer_func(unsigned long arg) vavs_ppmgr_reset(); #else vf_light_unreg_provider(&vavs_vf_prov); - vavs_local_init(); + vavs_local_init(true); vf_reg_provider(&vavs_vf_prov); #endif vavs_recover(); @@ -1409,7 +1410,6 @@ static void vavs_put_timer_func(unsigned long arg) kfifo_put(&newframe_q, (const struct vframe_s *)vf); } - } if (frame_dur > 0 && saved_resolution != @@ -1548,7 +1548,7 @@ static s32 vavs_init(void) stat |= STAT_TIMER_INIT; amvdec_enable(); - vavs_local_init(); + vavs_local_init(false); if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_GXM) size = get_firmware_data(VIDEO_DEC_AVS, buf); @@ -1660,9 +1660,9 @@ static int amvdec_avs_probe(struct platform_device *pdev) firmware_sel = 1; if (firmware_sel == 1) { - vf_buf_num = 4; + vf_buf_num = 8; canvas_base = 0; - canvas_num = 3; + canvas_num = 2; } else { canvas_base = 128; |