From af73385543f01925b21a1f2f5ce0e5648a4d2ed1 Mon Sep 17 00:00:00 2001 From: Qiwei Liu Date: Tue, 3 Nov 2020 13:27:13 +0800 Subject: [PATCH 01/12] msm: vidc: fix BW overvote due to wrong worst_cf in fbd For worst complexity factor received in fbd, also need to divide it by frame_size, otherwise will cause bus BW overvote. Change-Id: Ibb20103c4ab8e3830eea8cf8a04b32f421b60362 Signed-off-by: Qiwei Liu --- msm/vidc/msm_vidc_common.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index 8add4f9684a2..fba98b0e548d 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -2652,6 +2652,9 @@ static void handle_fbd(enum hal_command_response cmd, void *data) } if (inst->core->resources.ubwc_stats_in_fbd == 1) { + u32 frame_size = + (msm_vidc_get_mbs_per_frame(inst) / (32 * 8) * 3) / 2; + mutex_lock(&inst->ubwc_stats_lock); inst->ubwc_stats.is_valid = fill_buf_done->ubwc_cr_stat.is_valid; @@ -2659,6 +2662,8 @@ static void handle_fbd(enum hal_command_response cmd, void *data) fill_buf_done->ubwc_cr_stat.worst_cr; inst->ubwc_stats.worst_cf = fill_buf_done->ubwc_cr_stat.worst_cf; + if (frame_size) + inst->ubwc_stats.worst_cf /= frame_size; mutex_unlock(&inst->ubwc_stats_lock); } From d427f1ffdebba6a8fbb70b8624d7d9b96bbea64d Mon Sep 17 00:00:00 2001 From: Uma Mehta Date: Thu, 1 Oct 2020 17:25:42 +0530 Subject: [PATCH 02/12] msm: vidc: change default step size change default step size for encoders on different targets to 2. Change-Id: I0db827920f6c452154296b79e8641e1aba0b03ab Signed-off-by: Uma Mehta --- msm/vidc/msm_vidc_platform.c | 136 ++++++++++++++++++----------------- 1 file changed, 72 insertions(+), 64 deletions(-) diff --git a/msm/vidc/msm_vidc_platform.c b/msm/vidc/msm_vidc_platform.c index fa2e214f4ef7..7c5f1a2b1ce5 100644 --- a/msm/vidc/msm_vidc_platform.c +++ b/msm/vidc/msm_vidc_platform.c @@ -124,8 +124,10 @@ static struct msm_vidc_codec default_codecs[] = { static struct msm_vidc_codec_capability bengal_capabilities_v0[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value} */ - {CAP_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 1920, 1, 1920}, - {CAP_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 1920, 1, 1080}, + {CAP_FRAME_WIDTH, DEC, CODECS_ALL, 128, 1920, 1, 1920}, + {CAP_FRAME_HEIGHT, DEC, CODECS_ALL, 128, 1920, 1, 1080}, + {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 1920, 2, 1920}, + {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 1920, 2, 1080}, /* ((1920 * 1088) / 256) */ {CAP_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 8160, 1, 8160}, /* 1080@30 decode + 1080@30 encode */ @@ -148,17 +150,19 @@ static struct msm_vidc_codec_capability bengal_capabilities_v0[] = { {CAP_MAX_VIDEOCORES, DOMAINS_ALL, CODECS_ALL, 0, 1, 1, 1}, /* Secure usecase specific */ - {CAP_SECURE_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 1920, 1, 1920}, - {CAP_SECURE_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 1920, 1, 1080}, + {CAP_SECURE_FRAME_WIDTH, DEC, CODECS_ALL, 128, 1920, 1, 1920}, + {CAP_SECURE_FRAME_HEIGHT, DEC, CODECS_ALL, 128, 1920, 1, 1080}, + {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 1920, 2, 1920}, + {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 1920, 2, 1080}, /* (1920 * 1088) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 8160, 1, 8160}, {CAP_SECURE_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 35000000, 1, 20000000}, /* Image specific */ - {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 8192, 1, 8192}, - {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 1, 8192}, + {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 8192, 2, 8192}, + {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 2, 8192}, /* Level for AVC and HEVC encoder specific. * Default for levels is UNKNOWN value. But if we use unknown @@ -184,8 +188,10 @@ static struct msm_vidc_codec_capability bengal_capabilities_v0[] = { static struct msm_vidc_codec_capability bengal_capabilities_v1[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value} */ - {CAP_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 1920, 1, 1920}, - {CAP_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 1920, 1, 1080}, + {CAP_FRAME_WIDTH, DEC, CODECS_ALL, 128, 1920, 1, 1920}, + {CAP_FRAME_HEIGHT, DEC, CODECS_ALL, 128, 1920, 1, 1080}, + {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 1920, 2, 1920}, + {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 1920, 2, 1080}, /* ((1920 * 1088) / 256) */ {CAP_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 8160, 1, 8160}, /* 1920*1088 @30fps */ @@ -208,17 +214,19 @@ static struct msm_vidc_codec_capability bengal_capabilities_v1[] = { {CAP_MAX_VIDEOCORES, DOMAINS_ALL, CODECS_ALL, 0, 1, 1, 1}, /* Secure usecase specific */ - {CAP_SECURE_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 1920, 1, 1920}, - {CAP_SECURE_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 1920, 1, 1080}, + {CAP_SECURE_FRAME_WIDTH, DEC, CODECS_ALL, 128, 1920, 1, 1920}, + {CAP_SECURE_FRAME_HEIGHT, DEC, CODECS_ALL, 128, 1920, 1, 1080}, + {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 1920, 2, 1920}, + {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 1920, 2, 1080}, /* (1920 * 1088) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 8160, 1, 8160}, {CAP_SECURE_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 35000000, 1, 20000000}, /* Image specific */ - {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 8192, 1, 8192}, - {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 1, 8192}, + {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 8192, 2, 8192}, + {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 2, 8192}, /* Level for AVC and HEVC encoder specific. * Default for levels is UNKNOWN value. But if we use unknown @@ -246,8 +254,8 @@ static struct msm_vidc_codec_capability holi_capabilities[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value} */ {CAP_FRAME_WIDTH, DEC, CODECS_ALL, 96, 1920, 1, 1920}, {CAP_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 1920, 1, 1080}, - {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 1920, 1, 1920}, - {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 1920, 1, 1080}, + {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 1920, 2, 1920}, + {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 1920, 2, 1080}, /* ((1920 * 1088) / 256) */ {CAP_MBS_PER_FRAME, DEC, CODECS_ALL, 36, 8160, 1, 8160}, {CAP_MBS_PER_FRAME, ENC, CODECS_ALL, 64, 8160, 1, 8160}, @@ -274,8 +282,8 @@ static struct msm_vidc_codec_capability holi_capabilities[] = { /* Secure usecase specific */ {CAP_SECURE_FRAME_WIDTH, DEC, CODECS_ALL, 96, 1920, 1, 1920}, {CAP_SECURE_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 1920, 1, 1080}, - {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 1920, 1, 1920}, - {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 1920, 1, 1080}, + {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 1920, 2, 1920}, + {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 1920, 2, 1080}, /* (1920 * 1088) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 8160, 1, 8160}, {CAP_SECURE_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 35000000, 1, 20000000}, @@ -284,10 +292,10 @@ static struct msm_vidc_codec_capability holi_capabilities[] = { {CAP_ALLINTRA_MAX_FPS, ENC, H264|HEVC, 1, 30, 1, 30}, /* Image specific */ - {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 8192, 1, 8192}, - {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 1, 8192}, + {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 8192, 2, 8192}, + {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 2, 8192}, /* Level for AVC and HEVC encoder specific. * Default for levels is UNKNOWN value. But if we use unknown @@ -315,8 +323,8 @@ static struct msm_vidc_codec_capability lahaina_capabilities[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value,} */ {CAP_FRAME_WIDTH, DEC, CODECS_ALL, 96, 8192, 1, 1920}, {CAP_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 8192, 1, 1080}, - {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 8192, 1, 1920}, - {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 8192, 1, 1080}, + {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 8192, 2, 1920}, + {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 8192, 2, 1080}, /* (8192 * 4320) / 256 */ {CAP_MBS_PER_FRAME, DEC, CODECS_ALL, 36, 138240, 1, 138240}, {CAP_MBS_PER_FRAME, ENC, CODECS_ALL, 64, 138240, 1, 138240}, @@ -371,8 +379,8 @@ static struct msm_vidc_codec_capability lahaina_capabilities[] = { /* Secure usecase specific */ {CAP_SECURE_FRAME_WIDTH, DEC, CODECS_ALL, 96, 4096, 1, 1920}, {CAP_SECURE_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 4096, 1, 1080}, - {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 1, 1920}, - {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 1, 1080}, + {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 2, 1920}, + {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 2, 1080}, /* (4096 * 2304) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DEC, CODECS_ALL, 36, 36864, 1, 36864}, {CAP_SECURE_MBS_PER_FRAME, ENC, CODECS_ALL, 64, 36864, 1, 36864}, @@ -384,8 +392,8 @@ static struct msm_vidc_codec_capability lahaina_capabilities[] = { {CAP_BATCH_MAX_FPS, DEC, CODECS_ALL, 1, 120, 1, 120}, /* Lossless encoding usecase specific */ - {CAP_LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920}, - {CAP_LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 1, 1080}, + {CAP_LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 2, 1920}, + {CAP_LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 2, 1080}, /* (4096 * 2304) / 256 */ {CAP_LOSSLESS_MBS_PER_FRAME, ENC, H264|HEVC, 64, 36864, 1, 36864}, @@ -393,10 +401,10 @@ static struct msm_vidc_codec_capability lahaina_capabilities[] = { {CAP_ALLINTRA_MAX_FPS, ENC, H264|HEVC, 1, 240, 1, 30}, /* Image specific */ - {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 16384, 1, 16384}, - {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 16384, 1, 16384}, + {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 16384, 2, 16384}, + {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 16384, 2, 16384}, /* * Level for AVC and HEVC encoder specific. @@ -425,8 +433,8 @@ static struct msm_vidc_codec_capability shima_capabilities_v0[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value,} */ {CAP_FRAME_WIDTH, DEC, CODECS_ALL, 96, 8192, 1, 1920}, {CAP_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 8192, 1, 1080}, - {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 1, 1920}, - {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 1, 1080}, + {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 2, 1920}, + {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 2, 1080}, /* (8192 * 4320) / 256 */ {CAP_MBS_PER_FRAME, DEC, CODECS_ALL, 36, 138240, 1, 138240}, /* (4096 * 2176) / 256 */ @@ -484,8 +492,8 @@ static struct msm_vidc_codec_capability shima_capabilities_v0[] = { /* Secure usecase specific */ {CAP_SECURE_FRAME_WIDTH, DEC, CODECS_ALL, 96, 4096, 1, 1920}, {CAP_SECURE_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 4096, 1, 1080}, - {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 1, 1920}, - {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 1, 1080}, + {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 2, 1920}, + {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 2, 1080}, /* (3840 * 2176) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DEC, CODECS_ALL, 36, 34816, 1, 8160}, {CAP_SECURE_MBS_PER_FRAME, ENC, CODECS_ALL, 64, 34816, 1, 8160}, @@ -497,8 +505,8 @@ static struct msm_vidc_codec_capability shima_capabilities_v0[] = { {CAP_BATCH_MAX_FPS, DEC, CODECS_ALL, 1, 60, 1, 60}, /* Lossless encoding usecase specific */ - {CAP_LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920}, - {CAP_LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 1, 1080}, + {CAP_LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 2, 1920}, + {CAP_LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 2, 1080}, /* (4096 * 2176) / 256 */ {CAP_LOSSLESS_MBS_PER_FRAME, ENC, H264|HEVC, 64, 34816, 1, 8160}, @@ -506,10 +514,10 @@ static struct msm_vidc_codec_capability shima_capabilities_v0[] = { {CAP_ALLINTRA_MAX_FPS, ENC, H264|HEVC, 1, 120, 1, 30}, /* Image specific */ - {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 16384, 1, 16384}, - {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 16384, 1, 16384}, + {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 16384, 2, 16384}, + {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 16384, 2, 16384}, /* * Level for AVC and HEVC encoder specific. @@ -538,8 +546,8 @@ static struct msm_vidc_codec_capability shima_capabilities_v1[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value,} */ {CAP_FRAME_WIDTH, DEC, CODECS_ALL, 96, 4096, 1, 1920}, {CAP_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 4096, 1, 1080}, - {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 1, 1920}, - {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 1, 1080}, + {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 2, 1920}, + {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 2, 1080}, /* ((4096 * 2176) / 256) */ {CAP_MBS_PER_FRAME, DEC, CODECS_ALL, 36, 34816, 1, 8160}, {CAP_MBS_PER_FRAME, ENC, CODECS_ALL, 64, 34816, 1, 8160}, @@ -591,8 +599,8 @@ static struct msm_vidc_codec_capability shima_capabilities_v1[] = { /* Secure usecase specific */ {CAP_SECURE_FRAME_WIDTH, DEC, CODECS_ALL, 96, 4096, 1, 1920}, {CAP_SECURE_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 4096, 1, 1080}, - {CAP_SECURE_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 4096, 1, 1920}, - {CAP_SECURE_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 4096, 1, 1080}, + {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 2, 1920}, + {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 2, 1080}, /* (4096 * 2176) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DEC, CODECS_ALL, 36, 34816, 1, 8160}, {CAP_SECURE_MBS_PER_FRAME, ENC, CODECS_ALL, 64, 34816, 1, 8160}, @@ -604,8 +612,8 @@ static struct msm_vidc_codec_capability shima_capabilities_v1[] = { {CAP_BATCH_MAX_FPS, DEC, CODECS_ALL, 1, 30, 1, 30}, /* Lossless encoding usecase specific */ - {CAP_LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 3840, 1, 1920}, - {CAP_LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 3840, 1, 1080}, + {CAP_LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 3840, 2, 1920}, + {CAP_LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 3840, 2, 1080}, /* (3840 * 2176) / 256 */ {CAP_LOSSLESS_MBS_PER_FRAME, ENC, H264|HEVC, 64, 32640, 1, 8160}, @@ -613,10 +621,10 @@ static struct msm_vidc_codec_capability shima_capabilities_v1[] = { {CAP_ALLINTRA_MAX_FPS, ENC, H264|HEVC, 1, 120, 1, 30}, /* Image specific */ - {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 16384, 1, 16384}, - {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 16384, 1, 16384}, + {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 16384, 2, 16384}, + {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 16384, 2, 16384}, /* * Level for AVC and HEVC encoder specific. @@ -645,8 +653,8 @@ static struct msm_vidc_codec_capability shima_capabilities_v2[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value,} */ {CAP_FRAME_WIDTH, DEC, CODECS_ALL, 96, 4096, 1, 1920}, {CAP_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 4096, 1, 1080}, - {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 1, 1920}, - {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 1, 1080}, + {CAP_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 2, 1920}, + {CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 2, 1080}, /* (4096 * 2176) / 256 */ {CAP_MBS_PER_FRAME, DEC, CODECS_ALL, 36, 34816, 1, 8160}, {CAP_MBS_PER_FRAME, ENC, CODECS_ALL, 64, 34816, 1, 8160}, @@ -697,8 +705,8 @@ static struct msm_vidc_codec_capability shima_capabilities_v2[] = { /* Secure usecase specific */ {CAP_SECURE_FRAME_WIDTH, DEC, CODECS_ALL, 96, 4096, 1, 1920}, {CAP_SECURE_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 4096, 1, 1080}, - {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 1, 1920}, - {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 1, 1080}, + {CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 128, 4096, 2, 1920}, + {CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 128, 4096, 2, 1080}, /* (4096 * 2176) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DEC, CODECS_ALL, 36, 34816, 1, 8160}, {CAP_SECURE_MBS_PER_FRAME, ENC, CODECS_ALL, 64, 34816, 1, 8160}, @@ -710,8 +718,8 @@ static struct msm_vidc_codec_capability shima_capabilities_v2[] = { {CAP_BATCH_MAX_FPS, DEC, CODECS_ALL, 1, 30, 1, 30}, /* Lossless encoding usecase specific */ - {CAP_LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920}, - {CAP_LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 1, 1080}, + {CAP_LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 2, 1920}, + {CAP_LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 2, 1080}, /* (4096 * 2176) / 256 */ {CAP_LOSSLESS_MBS_PER_FRAME, ENC, H264|HEVC, 64, 34816, 1, 8160}, @@ -719,10 +727,10 @@ static struct msm_vidc_codec_capability shima_capabilities_v2[] = { {CAP_ALLINTRA_MAX_FPS, ENC, H264|HEVC, 1, 120, 1, 30}, /* Image specific */ - {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512}, - {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 16384, 1, 16384}, - {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 16384, 1, 16384}, + {CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 2, 512}, + {CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 16384, 2, 16384}, + {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 16384, 2, 16384}, /* * Level for AVC and HEVC encoder specific. From 92828b48eec7afb1f8deef37ebd85d0afd6c155b Mon Sep 17 00:00:00 2001 From: Qiwei Liu Date: Tue, 3 Nov 2020 23:27:52 +0800 Subject: [PATCH 03/12] msm: vidc: fix ctrl limits update for MENU type When update limits for MENU type controls, should keep original menu_skip_mask, shouldn't replace it with step_size. Change-Id: I9706f139fd299f7ca931d812e1a95017606a2267 Signed-off-by: Qiwei Liu --- msm/vidc/msm_vidc_common.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index fba98b0e548d..cfeeb7dfe0de 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -1345,6 +1345,10 @@ static int msm_vidc_comm_update_ctrl(struct msm_vidc_inst *inst, return -EINVAL; } + /* For menu type, keep original menu_skip_mask(step) */ + if (ctrl->type == V4L2_CTRL_TYPE_MENU) + cap->step_size = (u32)ctrl->step; + rc = v4l2_ctrl_modify_range(ctrl, cap->min, cap->max, cap->step_size, cap->default_value); if (rc) { From cc97f61b4b346af0363dcee45882f8a76326a304 Mon Sep 17 00:00:00 2001 From: Vikash Garodia Date: Thu, 22 Oct 2020 02:09:48 +0530 Subject: [PATCH 04/12] msm: venc: add support for boost for holi For holi, boost is set as 15%. With the change, a level of 15% can be set to video firmware. Also ensure that the boost is set only when client has set the boost control. CRs-Fixed: 2810440 Change-Id: Ib4e4c5511c57daa78b405f8a92c2ee924b1cc1bd Signed-off-by: Vikash Garodia --- msm/vidc/msm_venc.c | 19 ++++++++++++++++--- msm/vidc/msm_vidc_internal.h | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/msm/vidc/msm_venc.c b/msm/vidc/msm_venc.c index a1c1b1021839..55e05e41e5a6 100644 --- a/msm/vidc/msm_venc.c +++ b/msm/vidc/msm_venc.c @@ -1970,6 +1970,9 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE: inst->full_range = ctrl->val; break; + case V4L2_CID_MPEG_VIDC_VENC_BITRATE_BOOST: + inst->boost_enabled = true; + break; case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE: inst->entropy_mode = msm_comm_v4l2_to_hfi( V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE, @@ -2010,7 +2013,6 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_VBV_DELAY: case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET: case V4L2_CID_MPEG_VIDC_VENC_BITRATE_SAVINGS: - case V4L2_CID_MPEG_VIDC_VENC_BITRATE_BOOST: case V4L2_CID_MPEG_VIDC_VENC_QPRANGE_BOOST: case V4L2_CID_MPEG_VIDC_SUPERFRAME: s_vpr_h(sid, "Control set: ID : 0x%x Val : %d\n", @@ -3493,12 +3495,14 @@ int msm_venc_set_bitrate_boost_margin(struct msm_vidc_inst *inst, u32 enable) struct v4l2_ctrl *ctrl = NULL; struct hfi_bitrate_boost_margin boost_margin; int minqp, maxqp; + uint32_t vpu; if (!inst || !inst->core) { d_vpr_e("%s: invalid params %pK\n", __func__, inst); return -EINVAL; } hdev = inst->core->device; + vpu = inst->core->platform_data->vpu_ver; if (!enable) { boost_margin.margin = 0; @@ -3507,11 +3511,20 @@ int msm_venc_set_bitrate_boost_margin(struct msm_vidc_inst *inst, u32 enable) ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_VENC_BITRATE_BOOST); - /* Mapped value to 0, 25 or 50*/ + /* + * For certain SOC, default value should be 0 unless client enabled + */ + if (!inst->boost_enabled && vpu == VPU_VERSION_AR50_LITE) { + ctrl->val = 0; + update_ctrl(ctrl, 0, inst->sid); + } + /* Mapped value to 0, 15, 25 or 50*/ if (ctrl->val >= 50) boost_margin.margin = 50; - else + else if (ctrl->val >= 25) boost_margin.margin = (u32)(ctrl->val/25) * 25; + else + boost_margin.margin = (u32)(ctrl->val/15) * 15; setprop: s_vpr_h(inst->sid, "%s: %d\n", __func__, boost_margin.margin); diff --git a/msm/vidc/msm_vidc_internal.h b/msm/vidc/msm_vidc_internal.h index 2c1d1c4c7d41..b85e43d1b270 100644 --- a/msm/vidc/msm_vidc_internal.h +++ b/msm/vidc/msm_vidc_internal.h @@ -589,6 +589,7 @@ struct msm_vidc_inst { u64 last_qbuf_time_ns; bool active; bool has_bframe; + bool boost_enabled; bool boost_qp_enabled; u32 boost_min_qp; u32 boost_max_qp; From 9e9322b41d26810df966f45fd7fa7f216f045677 Mon Sep 17 00:00:00 2001 From: Uma Mehta Date: Wed, 21 Oct 2020 23:49:21 +0530 Subject: [PATCH 05/12] msm: vidc: Enable Average QP extradata Enabling Average QP extradata Change-Id: I94edb55f57ee0c88554a98688665bf2eb805045e Signed-off-by: Uma Mehta --- include/uapi/vidc/media/msm_vidc_utils.h | 1 + msm/vidc/msm_venc.c | 10 ++++++++-- msm/vidc/msm_vidc_buffer_calculations.c | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/uapi/vidc/media/msm_vidc_utils.h b/include/uapi/vidc/media/msm_vidc_utils.h index 4108ed84b036..e45ffa06f231 100644 --- a/include/uapi/vidc/media/msm_vidc_utils.h +++ b/include/uapi/vidc/media/msm_vidc_utils.h @@ -116,6 +116,7 @@ enum v4l2_mpeg_vidc_extradata { EXTRADATA_ENC_INPUT_ROI = 4, EXTRADATA_ENC_INPUT_HDR10PLUS = 8, EXTRADATA_ENC_INPUT_CVP = 16, + EXTRADATA_ENC_FRAME_QP = 32, }; #define V4L2_CID_MPEG_VIDC_VIDEO_VUI_TIMING_INFO \ (V4L2_CID_MPEG_MSM_VIDC_BASE + 19) diff --git a/msm/vidc/msm_venc.c b/msm/vidc/msm_venc.c index 55e05e41e5a6..10477853cfde 100644 --- a/msm/vidc/msm_venc.c +++ b/msm/vidc/msm_venc.c @@ -522,7 +522,7 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .minimum = EXTRADATA_NONE, .maximum = EXTRADATA_ADVANCED | EXTRADATA_ENC_INPUT_ROI | EXTRADATA_ENC_INPUT_HDR10PLUS | - EXTRADATA_ENC_INPUT_CVP, + EXTRADATA_ENC_INPUT_CVP | EXTRADATA_ENC_FRAME_QP, .default_value = EXTRADATA_NONE, .menu_skip_mask = 0, .qmenu = NULL, @@ -1782,7 +1782,8 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) msm_vidc_calculate_enc_input_extra_size(inst); } - if (inst->prop.extradata_ctrls & EXTRADATA_ADVANCED) { + if ((inst->prop.extradata_ctrls & EXTRADATA_ADVANCED) || + (inst->prop.extradata_ctrls & EXTRADATA_ENC_FRAME_QP)) { f = &inst->fmts[OUTPUT_PORT].v4l2_fmt; f->fmt.pix_mp.num_planes = 2; f->fmt.pix_mp.plane_fmt[1].sizeimage = @@ -4604,6 +4605,11 @@ int msm_venc_set_extradata(struct msm_vidc_inst *inst) msm_comm_set_extradata(inst, HFI_PROPERTY_PARAM_VENC_LTR_INFO, 0x1); + if (inst->prop.extradata_ctrls & EXTRADATA_ENC_FRAME_QP) + // Enable AvgQP Extradata + msm_comm_set_extradata(inst, + HFI_PROPERTY_PARAM_VENC_FRAME_QP_EXTRADATA, 0x1); + if (inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_ROI) // Enable ROIQP Extradata msm_comm_set_extradata(inst, diff --git a/msm/vidc/msm_vidc_buffer_calculations.c b/msm/vidc/msm_vidc_buffer_calculations.c index 0d63bca7395d..f09cb898b6f2 100644 --- a/msm/vidc/msm_vidc_buffer_calculations.c +++ b/msm/vidc/msm_vidc_buffer_calculations.c @@ -1076,6 +1076,9 @@ u32 msm_vidc_calculate_enc_output_extra_size(struct msm_vidc_inst *inst) if (inst->prop.extradata_ctrls & EXTRADATA_ADVANCED) size += sizeof(struct msm_vidc_metadata_ltr_payload); + if (inst->prop.extradata_ctrls & EXTRADATA_ENC_FRAME_QP) + size += sizeof(struct msm_vidc_frame_qp_payload); + /* Add size for extradata none */ if (size) size += sizeof(struct msm_vidc_extradata_header); From fe6842e2747845aca6b74191c8f7717f156d6127 Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Fri, 6 Nov 2020 11:15:36 +0530 Subject: [PATCH 06/12] msm: vidc: fix format string mismatch Some debug prints doesn't contain proper args. So added proper args. Change-Id: I36fe3e967b3bf600b3a948cb88f556a4d93c02d1 Signed-off-by: Govindaraj Rajagopal --- msm/vidc/msm_venc.c | 8 ++++---- msm/vidc/msm_vidc_clocks.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/msm/vidc/msm_venc.c b/msm/vidc/msm_venc.c index 55e05e41e5a6..fe2da7816dac 100644 --- a/msm/vidc/msm_venc.c +++ b/msm/vidc/msm_venc.c @@ -1555,7 +1555,7 @@ static int msm_venc_update_bitrate(struct msm_vidc_inst *inst) u32 cabac_max_bitrate = 0; if (!inst) { - d_vpr_e("%s: invalid params %pK\n", __func__); + d_vpr_e("%s: invalid params\n", __func__); return -EINVAL; } @@ -1908,17 +1908,17 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) } } else if (inst->state == MSM_VIDC_START_DONE) { if (!inst->external_blur) { - s_vpr_e(sid, "external blur not enabled"); + s_vpr_e(sid, "%s: external blur not enabled", __func__); break; } if (ctrl->val == MSM_VIDC_BLUR_EXTERNAL_DYNAMIC) { s_vpr_h(sid, - "external blur setting already enabled\n", + "%s: external blur setting already enabled\n", __func__); break; } else if (ctrl->val == MSM_VIDC_BLUR_INTERNAL) { s_vpr_e(sid, - "cannot change to internal blur config dynamically\n", + "%s: cannot change to internal blur config dynamically\n", __func__); break; } else { diff --git a/msm/vidc/msm_vidc_clocks.c b/msm/vidc/msm_vidc_clocks.c index 4185500e5bdd..aa8825caa007 100644 --- a/msm/vidc/msm_vidc_clocks.c +++ b/msm/vidc/msm_vidc_clocks.c @@ -1444,7 +1444,7 @@ static inline int msm_vidc_power_save_mode_enable(struct msm_vidc_inst *inst, sizeof(hfi_perf_mode)); if (rc) { s_vpr_e(inst->sid, "%s: Failed to set power save mode\n", - __func__, inst); + __func__); return rc; } inst->flags = enable ? From 90477015a6d4c2cf5068e63c3afc37b5269d1edb Mon Sep 17 00:00:00 2001 From: Priyanka Gujjula Date: Mon, 2 Nov 2020 16:02:39 +0530 Subject: [PATCH 07/12] msm: vidc: optimize HEIC output buffer calc for encoder For HEIC encode, output buffer dimension is 512 x 512. Updating total output buffer size as twice the frame size of 512 x 512 for image sessions. Change-Id: I69311b485072ef7f43afd23da690e77eecee180d Signed-off-by: Vikash Garodia --- msm/vidc/msm_vidc_buffer_calculations.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/msm/vidc/msm_vidc_buffer_calculations.c b/msm/vidc/msm_vidc_buffer_calculations.c index 0d63bca7395d..8cd29bb19eeb 100644 --- a/msm/vidc/msm_vidc_buffer_calculations.c +++ b/msm/vidc/msm_vidc_buffer_calculations.c @@ -982,6 +982,7 @@ u32 msm_vidc_calculate_enc_output_frame_size(struct msm_vidc_inst *inst) f = &inst->fmts[OUTPUT_PORT].v4l2_fmt; /* * Encoder output size calculation: 32 Align width/height + * For CQ or heic session : YUVsize * 2 * For resolution < 720p : YUVsize * 4 * For resolution > 720p & <= 4K : YUVsize / 2 * For resolution > 4k : YUVsize / 4 @@ -996,6 +997,10 @@ u32 msm_vidc_calculate_enc_output_frame_size(struct msm_vidc_inst *inst) mbs_per_frame = NUM_MBS_PER_FRAME(width, height); frame_size = (width * height * 3); + if (inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ || + is_grid_session(inst) || is_image_session(inst)) + goto calc_done; + if (mbs_per_frame < NUM_MBS_720P) frame_size = frame_size << 1; else if (mbs_per_frame <= NUM_MBS_4k) @@ -1003,17 +1008,19 @@ u32 msm_vidc_calculate_enc_output_frame_size(struct msm_vidc_inst *inst) else frame_size = frame_size >> 3; - if ((inst->rc_type == RATE_CONTROL_OFF) || - (inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ)) + if (inst->rc_type == RATE_CONTROL_OFF) frame_size = frame_size << 1; if (inst->rc_type == RATE_CONTROL_LOSSLESS) frame_size = (width * height * 9) >> 2; /* multiply by 10/8 (1.25) to get size for 10 bit case */ - if (f->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_HEVC) + if (inst->core->platform_data->vpu_ver != VPU_VERSION_AR50_LITE && + f->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_HEVC) { frame_size = frame_size + (frame_size >> 2); + } +calc_done: return ALIGN(frame_size, SZ_4K); } From f607704b4476b70290c8d2992be4a61d39edfb77 Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Fri, 6 Nov 2020 12:30:03 +0530 Subject: [PATCH 08/12] msm: vidc: fix msm_vidc_err_recovery_disable for non_noc_err disable error_recovery for non-NOC error if VIDC_DISABLE_NON_NOC_ERR_RECOV is set. but error_recovery is getting disabled even for type NOC error when VIDC_DISABLE_NON_NOC_ERR_RECOV is set. [1] Only NOC error adb shell "echo 1 > /d/msm_vidc/disable_err_recovery" [2] Only non-NOC error adb shell "echo 2 > /d/msm_vidc/disable_err_recovery" [3] Both NOC & non-NOC error adb shell "echo 3 > /d/msm_vidc/disable_err_recovery" Change-Id: Ia09ca23708d41a77f1d77cf6ed57506a16b32c73 Signed-off-by: Govindaraj Rajagopal --- msm/vidc/msm_vidc_common.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index cfeeb7dfe0de..dbbff4d938be 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -2168,6 +2168,7 @@ static void handle_sys_error(enum hal_command_response cmd, void *data) struct hfi_device *hdev = NULL; struct msm_vidc_inst *inst = NULL; int rc = 0; + bool panic = false; subsystem_crashed("venus"); if (!response) { @@ -2203,12 +2204,11 @@ static void handle_sys_error(enum hal_command_response cmd, void *data) } /* handle the hw error before core released to get full debug info */ - msm_vidc_handle_hw_error(core); - if ((response->status == VIDC_ERR_NOC_ERROR && - (msm_vidc_err_recovery_disable & - VIDC_DISABLE_NOC_ERR_RECOV)) || - (msm_vidc_err_recovery_disable & - VIDC_DISABLE_NON_NOC_ERR_RECOV)) { + if (response->status == VIDC_ERR_NOC_ERROR) + panic = !!(msm_vidc_err_recovery_disable & VIDC_DISABLE_NOC_ERR_RECOV); + else + panic = !!(msm_vidc_err_recovery_disable & VIDC_DISABLE_NON_NOC_ERR_RECOV); + if (panic) { d_vpr_e("Got unrecoverable video fw error"); MSM_VIDC_ERROR(true); } From 66e18fb51eb97b20530f54bc9118525d21426ad5 Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Sat, 24 Oct 2020 02:58:31 +0530 Subject: [PATCH 09/12] msm: vidc: print inode and refcount for all dma_buffers Print dma_buffer inode and file refcount details for all dma buffers including dpb and driver internal buffers. Change-Id: I3c22ccc1aaba555a3748d4607617737bd24adb12 Signed-off-by: Govindaraj Rajagopal --- msm/vidc/msm_smem.c | 23 +++++++++++------- msm/vidc/msm_vidc_common.c | 49 ++++++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/msm/vidc/msm_smem.c b/msm/vidc/msm_smem.c index 4d3454ebc46b..5dfa1e70a089 100644 --- a/msm/vidc/msm_smem.c +++ b/msm/vidc/msm_smem.c @@ -440,8 +440,9 @@ static int alloc_dma_mem(size_t size, u32 align, u32 flags, } s_vpr_h(sid, - "%s: dma_buf = %pK, device_addr = %x, size = %d, kvaddr = %pK, buffer_type = %#x, flags = %#lx\n", - __func__, mem->dma_buf, mem->device_addr, mem->size, + "%s: dma_buf = %pK, inode = %lu, ref = %ld, device_addr = %x, size = %d, kvaddr = %pK, buffer_type = %#x, flags = %#lx\n", + __func__, mem->dma_buf, (dbuf ? file_inode(dbuf->file)->i_ino : -1), + (dbuf ? file_count(dbuf->file) : -1), mem->device_addr, mem->size, mem->kvaddr, mem->buffer_type, mem->flags); return rc; @@ -456,10 +457,14 @@ fail_shared_mem_alloc: static int free_dma_mem(struct msm_smem *mem, u32 sid) { + struct dma_buf *dbuf = NULL; + + dbuf = (struct dma_buf *)mem->dma_buf; s_vpr_h(sid, - "%s: dma_buf = %pK, device_addr = %x, size = %d, kvaddr = %pK, buffer_type = %#x\n", - __func__, mem->dma_buf, mem->device_addr, mem->size, - mem->kvaddr, mem->buffer_type); + "%s: dma_buf = %pK, inode = %lu, ref = %ld, device_addr = %x, size = %d, kvaddr = %pK, buffer_type = %#x\n", + __func__, dbuf, (dbuf ? file_inode(dbuf->file)->i_ino : -1), + (dbuf ? file_count(dbuf->file) : -1), mem->device_addr, + mem->size, mem->kvaddr, mem->buffer_type); if (mem->device_addr) { msm_dma_put_device_address(mem->flags, @@ -468,16 +473,16 @@ static int free_dma_mem(struct msm_smem *mem, u32 sid) } if (mem->kvaddr) { - dma_buf_vunmap(mem->dma_buf, mem->kvaddr); + dma_buf_vunmap(dbuf, mem->kvaddr); mem->kvaddr = NULL; - dma_buf_end_cpu_access(mem->dma_buf, DMA_BIDIRECTIONAL); + dma_buf_end_cpu_access(dbuf, DMA_BIDIRECTIONAL); } - if (mem->dma_buf) { + if (dbuf) { trace_msm_smem_buffer_dma_op_start("FREE", (u32)mem->buffer_type, -1, mem->size, -1, mem->flags, -1); - dma_buf_put(mem->dma_buf); + dma_buf_put(dbuf); mem->dma_buf = NULL; trace_msm_smem_buffer_dma_op_end("FREE", (u32)mem->buffer_type, -1, mem->size, -1, mem->flags, -1); diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index cfeeb7dfe0de..8104f60fd5de 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -6372,6 +6372,7 @@ int msm_comm_set_color_format(struct msm_vidc_inst *inst, void msm_comm_print_inst_info(struct msm_vidc_inst *inst) { struct msm_vidc_buffer *mbuf; + struct dma_buf *dbuf; struct internal_buf *buf; bool is_decode = false; enum vidc_ports port; @@ -6405,26 +6406,35 @@ void msm_comm_print_inst_info(struct msm_vidc_inst *inst) mutex_lock(&inst->scratchbufs.lock); s_vpr_e(inst->sid, "scratch buffer list:\n"); - list_for_each_entry(buf, &inst->scratchbufs.list, list) - s_vpr_e(inst->sid, "type: %d addr: %x size: %u\n", - buf->buffer_type, buf->smem.device_addr, - buf->smem.size); + list_for_each_entry(buf, &inst->scratchbufs.list, list) { + dbuf = (struct dma_buf *)buf->smem.dma_buf; + s_vpr_e(inst->sid, "type: %d addr: %x size: %u inode: %lu ref: %ld\n", + buf->buffer_type, buf->smem.device_addr, buf->smem.size, + (dbuf ? file_inode(dbuf->file)->i_ino : -1), + (dbuf ? file_count(dbuf->file) : -1)); + } mutex_unlock(&inst->scratchbufs.lock); mutex_lock(&inst->persistbufs.lock); s_vpr_e(inst->sid, "persist buffer list:\n"); - list_for_each_entry(buf, &inst->persistbufs.list, list) - s_vpr_e(inst->sid, "type: %d addr: %x size: %u\n", - buf->buffer_type, buf->smem.device_addr, - buf->smem.size); + list_for_each_entry(buf, &inst->persistbufs.list, list) { + dbuf = (struct dma_buf *)buf->smem.dma_buf; + s_vpr_e(inst->sid, "type: %d addr: %x size: %u inode: %lu ref: %ld\n", + buf->buffer_type, buf->smem.device_addr, buf->smem.size, + (dbuf ? file_inode(dbuf->file)->i_ino : -1), + (dbuf ? file_count(dbuf->file) : -1)); + } mutex_unlock(&inst->persistbufs.lock); mutex_lock(&inst->outputbufs.lock); s_vpr_e(inst->sid, "dpb buffer list:\n"); - list_for_each_entry(buf, &inst->outputbufs.list, list) - s_vpr_e(inst->sid, "type: %d addr: %x size: %u\n", - buf->buffer_type, buf->smem.device_addr, - buf->smem.size); + list_for_each_entry(buf, &inst->outputbufs.list, list) { + dbuf = (struct dma_buf *)buf->smem.dma_buf; + s_vpr_e(inst->sid, "type: %d addr: %x size: %u inode: %lu ref: %ld\n", + buf->buffer_type, buf->smem.device_addr, buf->smem.size, + (dbuf ? file_inode(dbuf->file)->i_ino : -1), + (dbuf ? file_count(dbuf->file) : -1)); + } mutex_unlock(&inst->outputbufs.lock); } @@ -6499,34 +6509,43 @@ void print_vidc_buffer(u32 tag, const char *str, struct msm_vidc_inst *inst, struct msm_vidc_buffer *mbuf) { struct vb2_buffer *vb2 = NULL; + struct dma_buf *dbuf[2]; if (!(tag & msm_vidc_debug) || !inst || !mbuf) return; vb2 = &mbuf->vvb.vb2_buf; + dbuf[0] = (struct dma_buf *)mbuf->smem[0].dma_buf; + dbuf[1] = (struct dma_buf *)mbuf->smem[1].dma_buf; if (vb2->num_planes == 1) dprintk(tag, inst->sid, - "%s: %s: idx %2d fd %d off %d daddr %x size %d filled %d flags 0x%x ts %lld refcnt %d mflags 0x%x\n", + "%s: %s: idx %2d fd %d off %d daddr %x inode %lu ref %ld size %d filled %d flags 0x%x ts %lld refcnt %d mflags 0x%x\n", str, vb2->type == INPUT_MPLANE ? "OUTPUT" : "CAPTURE", vb2->index, vb2->planes[0].m.fd, vb2->planes[0].data_offset, mbuf->smem[0].device_addr, + (dbuf[0] ? file_inode(dbuf[0]->file)->i_ino : -1), + (dbuf[0] ? file_count(dbuf[0]->file) : -1), vb2->planes[0].length, vb2->planes[0].bytesused, mbuf->vvb.flags, mbuf->vvb.vb2_buf.timestamp, mbuf->smem[0].refcount, mbuf->flags); else dprintk(tag, inst->sid, - "%s: %s: idx %2d fd %d off %d daddr %x size %d filled %d flags 0x%x ts %lld refcnt %d mflags 0x%x, extradata: fd %d off %d daddr %x size %d filled %d refcnt %d\n", + "%s: %s: idx %2d fd %d off %d daddr %x inode %lu ref %ld size %d filled %d flags 0x%x ts %lld refcnt %d mflags 0x%x, extradata: fd %d off %d daddr %x inode %lu ref %ld size %d filled %d refcnt %d\n", str, vb2->type == INPUT_MPLANE ? "OUTPUT" : "CAPTURE", vb2->index, vb2->planes[0].m.fd, vb2->planes[0].data_offset, mbuf->smem[0].device_addr, + (dbuf[0] ? file_inode(dbuf[0]->file)->i_ino : -1), + (dbuf[0] ? file_count(dbuf[0]->file) : -1), vb2->planes[0].length, vb2->planes[0].bytesused, mbuf->vvb.flags, mbuf->vvb.vb2_buf.timestamp, mbuf->smem[0].refcount, mbuf->flags, vb2->planes[1].m.fd, vb2->planes[1].data_offset, - mbuf->smem[1].device_addr, vb2->planes[1].length, + mbuf->smem[1].device_addr, + (dbuf[1] ? file_inode(dbuf[1]->file)->i_ino : -1), + (dbuf[1] ? file_count(dbuf[1]->file) : -1), vb2->planes[1].length, vb2->planes[1].bytesused, mbuf->smem[1].refcount); } From b689990576e846dc2dfa9af2980af5ddf476a760 Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Wed, 1 Apr 2020 13:13:42 +0530 Subject: [PATCH 10/12] msm: vidc: do not update inst state for map failure Currently for map failure inst->state updated to MSM_VIDC_CORE_INVALID. So during flush driver issues session_abort to firmware. So firmware asserts and sends sys_error back. So added change to avoid updating inst->state. Change-Id: I30f90726d21cb13bf5a27dd3d259a8d026260746 Signed-off-by: Govindaraj Rajagopal --- msm/vidc/msm_vidc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/msm/vidc/msm_vidc.c b/msm/vidc/msm_vidc.c index be9034418f9f..e5e3f4db8c26 100644 --- a/msm/vidc/msm_vidc.c +++ b/msm/vidc/msm_vidc.c @@ -1267,7 +1267,9 @@ static void msm_vidc_buf_queue(struct vb2_buffer *vb2) if (rc) { print_vb2_buffer("failed vb2-qbuf", inst, vb2); - msm_comm_generate_session_error(inst); + vb2_buffer_done(vb2, VB2_BUF_STATE_DONE); + msm_vidc_queue_v4l2_event(inst, + V4L2_EVENT_MSM_VIDC_SYS_ERROR); } } From a69feaa56883cc2946bff2354d4cc1483e6acf89 Mon Sep 17 00:00:00 2001 From: Malathi Gottam Date: Mon, 28 Sep 2020 22:19:18 +0530 Subject: [PATCH 11/12] msm: vidc: Modify allocated buffer size for lower resolution For targets that doesn't support 4k, current buffer size of 3MB is modified for FWVGA and below resolution to 6 MB. Change-Id: Id9152bf4b88a1b86d790bc061cd7265896c62a98 Signed-off-by: Malathi Gottam --- msm/vidc/msm_vidc_buffer_calculations.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/msm/vidc/msm_vidc_buffer_calculations.c b/msm/vidc/msm_vidc_buffer_calculations.c index 8b90e60b2c63..d5cb06e20b67 100644 --- a/msm/vidc/msm_vidc_buffer_calculations.c +++ b/msm/vidc/msm_vidc_buffer_calculations.c @@ -913,6 +913,8 @@ u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst, u32 buff if (inst->core->platform_data->vpu_ver == VPU_VERSION_AR50_LITE) { base_res_mbs = inst->capability.cap[CAP_MBS_PER_FRAME].max; div_factor = 1; + if (num_mbs < NUM_MBS_720P) + base_res_mbs = base_res_mbs * 2; } /* For HEIF image, use the actual resolution to calc buffer size */ if (is_heif_decoder(inst)) { From eb19e74fe05b7b7ab21fc29404447e4d9fc69d7c Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Mon, 9 Nov 2020 12:46:46 +0530 Subject: [PATCH 12/12] msm: vidc: handle qbuf failure in decode batching usecase if msm_comm_qbuf_to_hfi is failed at msm_vidc_batch_handler path, then vb2_buffer refcount is still held at v4l2 layer. So added error handling for qbuf failure at decode_batching sequence. Change-Id: Ic900ff95faec075620323c989430dea7ce34f26b Signed-off-by: Govindaraj Rajagopal --- msm/vidc/msm_vidc_common.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index c7444042ed1b..3bab57959bb5 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -4765,6 +4765,7 @@ int msm_comm_qbufs_batch(struct msm_vidc_inst *inst, { int rc = 0; struct msm_vidc_buffer *buf; + struct vb2_buffer *vb2; int do_bw_calc = 0; do_bw_calc = mbuf ? mbuf->vvb.vb2_buf.type == INPUT_MPLANE : 0; @@ -4789,6 +4790,11 @@ int msm_comm_qbufs_batch(struct msm_vidc_inst *inst, if (rc) { s_vpr_e(inst->sid, "%s: Failed batch qbuf to hfi: %d\n", __func__, rc); + if (buf != mbuf) { + vb2 = &buf->vvb.vb2_buf; + vb2_buffer_done(vb2, VB2_BUF_STATE_DONE); + msm_vidc_queue_v4l2_event(inst, V4L2_EVENT_MSM_VIDC_SYS_ERROR); + } break; } loop_end: