Loading msm/vidc/msm_vidc_platform.c +397 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,15 @@ static struct msm_vidc_codec_data kona_codec_data[] = { CODEC_ENTRY(V4L2_PIX_FMT_VP9, MSM_VIDC_DECODER, 60, 200, 200), }; static struct msm_vidc_codec_data lagoon_codec_data[] = { CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 0, 675, 320), CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_ENCODER, 0, 675, 320), CODEC_ENTRY(V4L2_PIX_FMT_MPEG2, MSM_VIDC_DECODER, 0, 200, 200), CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_DECODER, 0, 200, 200), CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_DECODER, 0, 200, 200), CODEC_ENTRY(V4L2_PIX_FMT_VP9, MSM_VIDC_DECODER, 0, 200, 200), }; /* Update with SM6150 data */ static struct msm_vidc_codec_data sm6150_codec_data[] = { CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 125, 675, 320), Loading Loading @@ -171,6 +180,12 @@ static struct msm_vidc_codec default_codecs[] = { {ENC, H264}, {ENC, HEVC}, {ENC, VP8}, }; static struct msm_vidc_codec lagoon_codecs[] = { /* {domain, codec} */ {DEC, H264}, {DEC, HEVC}, {DEC, VP9}, {DEC, MPEG2}, {ENC, H264}, {ENC, HEVC}, }; static struct msm_vidc_codec_capability lito_capabilities_v0[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value} */ {CAP_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 96, 5760, 1, 1920}, Loading Loading @@ -363,6 +378,193 @@ static struct msm_vidc_codec_capability lito_capabilities_v1[] = { V4L2_MPEG_VIDEO_HEVC_LEVEL_5}, }; static struct msm_vidc_codec_capability lagoon_capabilities_v0[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value,} */ {CAP_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1920}, {CAP_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1080}, /* (3840 * 2176) / 256 */ {CAP_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 32640, 1, 8160}, /* ((3840 * 2176) / 256) * 30 fps */ {CAP_MBS_PER_SECOND, ENC, CODECS_ALL, 64, 979200, 1, 244800}, /* ((3840 * 2176) / 256) * 60 fps */ {CAP_MBS_PER_SECOND, DEC, CODECS_ALL, 64, 1958400, 1, 244800}, {CAP_FRAMERATE, ENC, CODECS_ALL, 1, 240, 1, 30}, {CAP_FRAMERATE, DEC, CODECS_ALL, 1, 480, 1, 30}, {CAP_OPERATINGRATE, DOMAINS_ALL, CODECS_ALL, 1, INT_MAX, 1, 30}, {CAP_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 100000000, 1, 20000000}, {CAP_CABAC_BITRATE, ENC, H264, 1, 100000000, 1, 20000000}, {CAP_SCALE_X, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, {CAP_SCALE_Y, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, {CAP_SCALE_X, DEC, CODECS_ALL, 65536, 65536, 1, 65536}, {CAP_SCALE_Y, DEC, CODECS_ALL, 65536, 65536, 1, 65536}, {CAP_BFRAME, ENC, H264|HEVC, 0, 1, 1, 0}, {CAP_HIER_P_NUM_ENH_LAYERS, ENC, H264|HEVC, 0, 6, 1, 0}, {CAP_LTR_COUNT, ENC, H264|HEVC, 0, 2, 1, 0}, /* ((1920 * 1088) / 256) * 30 fps */ {CAP_MBS_PER_SECOND_POWER_SAVE, ENC, CODECS_ALL, 0, 244800, 1, 244800}, {CAP_I_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 10}, {CAP_P_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 20}, {CAP_B_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 20}, {CAP_I_FRAME_QP, DEC, VP9, 0, 127, 1, 20}, {CAP_P_FRAME_QP, DEC, VP9, 0, 127, 1, 40}, {CAP_B_FRAME_QP, DEC, VP9, 0, 127, 1, 40}, /* 10 slices */ {CAP_SLICE_BYTE, ENC, H264|HEVC, 1, 10, 1, 10}, {CAP_SLICE_MB, ENC, H264|HEVC, 1, 10, 1, 10}, {CAP_MAX_VIDEOCORES, DOMAINS_ALL, CODECS_ALL, 0, 1, 1, 1}, /* Mpeg2 decoder specific */ {CAP_FRAME_WIDTH, DEC, MPEG2, 128, 1920, 1, 1920}, {CAP_FRAME_HEIGHT, DEC, MPEG2, 128, 1920, 1, 1088}, /* (1920 * 1088) / 256 */ {CAP_MBS_PER_FRAME, DEC, MPEG2, 64, 8160, 1, 8160}, /* ((1920 * 1088) / 256) * 30*/ {CAP_MBS_PER_SECOND, DEC, MPEG2, 64, 244800, 1, 244800}, {CAP_FRAMERATE, DEC, MPEG2, 1, 30, 1, 30}, {CAP_BITRATE, DEC, MPEG2, 1, 40000000, 1, 20000000}, /* Secure usecase specific */ {CAP_SECURE_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1920}, {CAP_SECURE_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1080}, /* (3840 * 2176) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 32640, 1, 8160}, {CAP_SECURE_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 40000000, 1, 20000000}, /* Batch Mode Decode */ {CAP_BATCH_MAX_MB_PER_FRAME, DEC, CODECS_ALL, 64, 8160, 1, 8160}, /* (1920 * 1088) / 256 */ {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}, /* (3840 * 2176) / 256 */ {CAP_LOSSLESS_MBS_PER_FRAME, ENC, H264|HEVC, 64, 32640, 1, 8160}, /* All intra encoding usecase specific */ {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, 8192, 1, 8192}, {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 1, 8192}, /* Level for AVC and HEVC encoder specific. * Default for levels is UNKNOWN value. But if we use unknown * value here to set as default, max value needs to be set to * unknown as well, which creates a problem of allowing client * to set higher level than supported */ {CAP_H264_LEVEL, ENC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0, V4L2_MPEG_VIDEO_H264_LEVEL_6_0, 1, V4L2_MPEG_VIDEO_H264_LEVEL_6_0}, {CAP_HEVC_LEVEL, ENC, HEVC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6, 1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6}, /* Level for AVC and HEVC decoder specific */ {CAP_H264_LEVEL, DEC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0, V4L2_MPEG_VIDEO_H264_LEVEL_6_1, 1, V4L2_MPEG_VIDEO_H264_LEVEL_5_0}, {CAP_HEVC_LEVEL, DEC, HEVC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1, 1, V4L2_MPEG_VIDEO_HEVC_LEVEL_5}, }; static struct msm_vidc_codec_capability lagoon_capabilities_v1[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value,} */ {CAP_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1920}, {CAP_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1080}, /* (3840 * 2176) / 256 */ {CAP_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 32640, 1, 8160}, /* ((3840 * 2176) / 256) * 30 fps */ {CAP_MBS_PER_SECOND, DOMAINS_ALL, CODECS_ALL, 64, 979200, 1, 244800}, {CAP_FRAMERATE, DOMAINS_ALL, CODECS_ALL, 1, 240, 1, 30}, {CAP_OPERATINGRATE, DOMAINS_ALL, CODECS_ALL, 1, INT_MAX, 1, 30}, {CAP_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 100000000, 1, 20000000}, {CAP_CABAC_BITRATE, ENC, H264, 1, 100000000, 1, 20000000}, {CAP_SCALE_X, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, {CAP_SCALE_Y, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, {CAP_SCALE_X, DEC, CODECS_ALL, 65536, 65536, 1, 65536}, {CAP_SCALE_Y, DEC, CODECS_ALL, 65536, 65536, 1, 65536}, {CAP_BFRAME, ENC, H264|HEVC, 0, 1, 1, 0}, {CAP_HIER_P_NUM_ENH_LAYERS, ENC, H264|HEVC, 0, 6, 1, 0}, {CAP_LTR_COUNT, ENC, H264|HEVC, 0, 2, 1, 0}, /* ((1920 * 1088) / 256) * 30 fps */ {CAP_MBS_PER_SECOND_POWER_SAVE, ENC, CODECS_ALL, 0, 244800, 1, 244800}, {CAP_I_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 10}, {CAP_P_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 20}, {CAP_B_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 20}, {CAP_I_FRAME_QP, DEC, VP9, 0, 127, 1, 20}, {CAP_P_FRAME_QP, DEC, VP9, 0, 127, 1, 40}, {CAP_B_FRAME_QP, DEC, VP9, 0, 127, 1, 40}, /* 10 slices */ {CAP_SLICE_BYTE, ENC, H264|HEVC, 1, 10, 1, 10}, {CAP_SLICE_MB, ENC, H264|HEVC, 1, 10, 1, 10}, {CAP_MAX_VIDEOCORES, DOMAINS_ALL, CODECS_ALL, 0, 1, 1, 1}, /* Mpeg2 decoder specific */ {CAP_FRAME_WIDTH, DEC, MPEG2, 128, 1920, 1, 1920}, {CAP_FRAME_HEIGHT, DEC, MPEG2, 128, 1920, 1, 1088}, /* (1920 * 1088) / 256 */ {CAP_MBS_PER_FRAME, DEC, MPEG2, 64, 8160, 1, 8160}, /* ((1920 * 1088) / 256) * 30*/ {CAP_MBS_PER_SECOND, DEC, MPEG2, 64, 244800, 1, 244800}, {CAP_FRAMERATE, DEC, MPEG2, 1, 30, 1, 30}, {CAP_BITRATE, DEC, MPEG2, 1, 40000000, 1, 20000000}, /* Secure usecase specific */ {CAP_SECURE_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1920}, {CAP_SECURE_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1080}, /* (3840 * 2176) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 32640, 1, 8160}, {CAP_SECURE_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 40000000, 1, 20000000}, /* Batch Mode Decode */ {CAP_BATCH_MAX_MB_PER_FRAME, DEC, CODECS_ALL, 64, 8160, 1, 8160}, /* (1920 * 1088) / 256 */ {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}, /* (3840 * 2176)/ 256 */ {CAP_LOSSLESS_MBS_PER_FRAME, ENC, H264|HEVC, 64, 32640, 1, 8160}, /* All intra encoding usecase specific */ {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, 8192, 1, 8192}, {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 1, 8192}, /* Level for AVC and HEVC encoder specific. * Default for levels is UNKNOWN value. But if we use unknown * value here to set as default, max value needs to be set to * unknown as well, which creates a problem of allowing client * to set higher level than supported */ {CAP_H264_LEVEL, ENC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0, V4L2_MPEG_VIDEO_H264_LEVEL_6_0, 1, V4L2_MPEG_VIDEO_H264_LEVEL_6_0}, {CAP_HEVC_LEVEL, ENC, HEVC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6, 1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6}, /* Level for AVC and HEVC decoder specific */ {CAP_H264_LEVEL, DEC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0, V4L2_MPEG_VIDEO_H264_LEVEL_6_1, 1, V4L2_MPEG_VIDEO_H264_LEVEL_5_0}, {CAP_HEVC_LEVEL, DEC, HEVC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1, 1, V4L2_MPEG_VIDEO_HEVC_LEVEL_5}, }; 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}, Loading Loading @@ -783,6 +985,165 @@ static struct msm_vidc_common_data lito_common_data_v1[] = { }, }; static struct msm_vidc_common_data lagoon_common_data_v0[] = { { .key = "qcom,never-unload-fw", .value = 1, }, { .key = "qcom,sw-power-collapse", .value = 1, }, { .key = "qcom,domain-attr-non-fatal-faults", .value = 1, }, { .key = "qcom,max-secure-instances", .value = 3, }, { .key = "qcom,max-hw-load", .value = 1958400, /* ((3840x2176)/256)@60fps decode */ /* UHD@30 decode + 1080@30 encode */ }, { .key = "qcom,max-mbpf", .value = 130560, /* ((3840x2176)/256) x 4 */ }, { .key = "qcom,max-hq-mbs-per-frame", .value = 8160, /* ((1920x1088)/256) */ }, { .key = "qcom,max-hq-mbs-per-sec", .value = 244800, /* ((1920x1088)/256)@30fps */ }, { .key = "qcom,max-b-frame-mbs-per-frame", .value = 8160, /* ((1920x1088)/256) */ }, { .key = "qcom,max-b-frame-mbs-per-sec", .value = 244800, /* ((1920x1088)/256) MBs@30fps */ }, { .key = "qcom,power-collapse-delay", .value = 1500, }, { .key = "qcom,hw-resp-timeout", .value = 1000, }, { .key = "qcom,debug-timeout", .value = 0, }, { .key = "qcom,decode-batching", .value = 1, }, { .key = "qcom,batch-timeout", .value = 200, }, { .key = "qcom,dcvs", .value = 1, }, { .key = "qcom,fw-cycles", .value = 436000, }, { .key = "qcom,fw-vpp-cycles", .value = 166667, }, { .key = "qcom,avsync-window-size", .value = 40, }, }; static struct msm_vidc_common_data lagoon_common_data_v1[] = { { .key = "qcom,never-unload-fw", .value = 1, }, { .key = "qcom,sw-power-collapse", .value = 1, }, { .key = "qcom,domain-attr-non-fatal-faults", .value = 1, }, { .key = "qcom,max-secure-instances", .value = 3, }, { .key = "qcom,max-hw-load", .value = 1224000, /* UHD@30 decode + 1080@30 encode */ }, { .key = "qcom,max-mbpf", .value = 130560, /* ((3840x2176)/256) x 4 */ }, { .key = "qcom,max-hq-mbs-per-frame", .value = 8160, /* ((1920x1088)/256) */ }, { .key = "qcom,max-hq-mbs-per-sec", .value = 244800, /* ((1920x1088)/256)@30fps */ }, { .key = "qcom,max-b-frame-mbs-per-frame", .value = 8160, /* ((1920x1088)/256) */ }, { .key = "qcom,max-b-frame-mbs-per-sec", .value = 244800, /* ((1920x1088)/256) MBs@30fps */ }, { .key = "qcom,power-collapse-delay", .value = 1500, }, { .key = "qcom,hw-resp-timeout", .value = 1000, }, { .key = "qcom,debug-timeout", .value = 0, }, { .key = "qcom,decode-batching", .value = 1, }, { .key = "qcom,batch-timeout", .value = 200, }, { .key = "qcom,dcvs", .value = 1, }, { .key = "qcom,fw-cycles", .value = 436000, }, { .key = "qcom,fw-vpp-cycles", .value = 166667, }, { .key = "qcom,avsync-window-size", .value = 40, }, }; static struct msm_vidc_common_data kona_common_data[] = { { .key = "qcom,never-unload-fw", Loading Loading @@ -1283,6 +1644,10 @@ static struct msm_vidc_efuse_data lito_efuse_data[] = { EFUSE_ENTRY(0x00786008, 4, 0x00200000, 0x15, SKU_VERSION), }; static struct msm_vidc_efuse_data lagoon_efuse_data[] = { EFUSE_ENTRY(0x007801E8, 4, 0x00004000, 0x0E, SKU_VERSION), }; static struct msm_vidc_efuse_data sdm670_efuse_data[] = { EFUSE_ENTRY(0x007801A0, 4, 0x00008000, 0x0f, SKU_VERSION), }; Loading Loading @@ -1345,6 +1710,25 @@ static struct msm_vidc_platform_data kona_data = { .codec_caps_count = ARRAY_SIZE(kona_capabilities), }; static struct msm_vidc_platform_data lagoon_data = { .codec_data = lagoon_codec_data, .codec_data_length = ARRAY_SIZE(lagoon_codec_data), .common_data = lagoon_common_data_v0, .common_data_length = ARRAY_SIZE(lagoon_common_data_v0), .csc_data.vpe_csc_custom_bias_coeff = vpe_csc_custom_bias_coeff, .csc_data.vpe_csc_custom_matrix_coeff = vpe_csc_custom_matrix_coeff, .csc_data.vpe_csc_custom_limit_coeff = vpe_csc_custom_limit_coeff, .efuse_data = lagoon_efuse_data, .efuse_data_length = ARRAY_SIZE(lagoon_efuse_data), .sku_version = 0, .vpu_ver = VPU_VERSION_IRIS2, .ubwc_config = 0x0, .codecs = lagoon_codecs, .codecs_count = ARRAY_SIZE(lagoon_codecs), .codec_caps = lagoon_capabilities_v0, .codec_caps_count = ARRAY_SIZE(lagoon_capabilities_v0), }; static struct msm_vidc_platform_data sm6150_data = { .codec_data = sm6150_codec_data, .codec_data_length = ARRAY_SIZE(sm6150_codec_data), Loading Loading @@ -1453,6 +1837,10 @@ static const struct of_device_id msm_vidc_dt_match[] = { .compatible = "qcom,bengal-vidc", .data = &bengal_data, }, { .compatible = "qcom,lagoon-vidc", .data = &lagoon_data, }, {}, }; Loading Loading @@ -1585,6 +1973,15 @@ void *vidc_get_drv_data(struct device *dev) driver_data->codec_caps_count = ARRAY_SIZE(bengal_capabilities_v1); } } else if (!strcmp(match->compatible, "qcom,lagoon-vidc")) { if (driver_data->sku_version == SKU_VERSION_1) { driver_data->common_data = lagoon_common_data_v1; driver_data->common_data_length = ARRAY_SIZE(lagoon_common_data_v1); driver_data->codec_caps = lagoon_capabilities_v1; driver_data->codec_caps_count = ARRAY_SIZE(lagoon_capabilities_v1); } } exit: Loading Loading
msm/vidc/msm_vidc_platform.c +397 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,15 @@ static struct msm_vidc_codec_data kona_codec_data[] = { CODEC_ENTRY(V4L2_PIX_FMT_VP9, MSM_VIDC_DECODER, 60, 200, 200), }; static struct msm_vidc_codec_data lagoon_codec_data[] = { CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 0, 675, 320), CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_ENCODER, 0, 675, 320), CODEC_ENTRY(V4L2_PIX_FMT_MPEG2, MSM_VIDC_DECODER, 0, 200, 200), CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_DECODER, 0, 200, 200), CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_DECODER, 0, 200, 200), CODEC_ENTRY(V4L2_PIX_FMT_VP9, MSM_VIDC_DECODER, 0, 200, 200), }; /* Update with SM6150 data */ static struct msm_vidc_codec_data sm6150_codec_data[] = { CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 125, 675, 320), Loading Loading @@ -171,6 +180,12 @@ static struct msm_vidc_codec default_codecs[] = { {ENC, H264}, {ENC, HEVC}, {ENC, VP8}, }; static struct msm_vidc_codec lagoon_codecs[] = { /* {domain, codec} */ {DEC, H264}, {DEC, HEVC}, {DEC, VP9}, {DEC, MPEG2}, {ENC, H264}, {ENC, HEVC}, }; static struct msm_vidc_codec_capability lito_capabilities_v0[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value} */ {CAP_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 96, 5760, 1, 1920}, Loading Loading @@ -363,6 +378,193 @@ static struct msm_vidc_codec_capability lito_capabilities_v1[] = { V4L2_MPEG_VIDEO_HEVC_LEVEL_5}, }; static struct msm_vidc_codec_capability lagoon_capabilities_v0[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value,} */ {CAP_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1920}, {CAP_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1080}, /* (3840 * 2176) / 256 */ {CAP_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 32640, 1, 8160}, /* ((3840 * 2176) / 256) * 30 fps */ {CAP_MBS_PER_SECOND, ENC, CODECS_ALL, 64, 979200, 1, 244800}, /* ((3840 * 2176) / 256) * 60 fps */ {CAP_MBS_PER_SECOND, DEC, CODECS_ALL, 64, 1958400, 1, 244800}, {CAP_FRAMERATE, ENC, CODECS_ALL, 1, 240, 1, 30}, {CAP_FRAMERATE, DEC, CODECS_ALL, 1, 480, 1, 30}, {CAP_OPERATINGRATE, DOMAINS_ALL, CODECS_ALL, 1, INT_MAX, 1, 30}, {CAP_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 100000000, 1, 20000000}, {CAP_CABAC_BITRATE, ENC, H264, 1, 100000000, 1, 20000000}, {CAP_SCALE_X, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, {CAP_SCALE_Y, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, {CAP_SCALE_X, DEC, CODECS_ALL, 65536, 65536, 1, 65536}, {CAP_SCALE_Y, DEC, CODECS_ALL, 65536, 65536, 1, 65536}, {CAP_BFRAME, ENC, H264|HEVC, 0, 1, 1, 0}, {CAP_HIER_P_NUM_ENH_LAYERS, ENC, H264|HEVC, 0, 6, 1, 0}, {CAP_LTR_COUNT, ENC, H264|HEVC, 0, 2, 1, 0}, /* ((1920 * 1088) / 256) * 30 fps */ {CAP_MBS_PER_SECOND_POWER_SAVE, ENC, CODECS_ALL, 0, 244800, 1, 244800}, {CAP_I_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 10}, {CAP_P_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 20}, {CAP_B_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 20}, {CAP_I_FRAME_QP, DEC, VP9, 0, 127, 1, 20}, {CAP_P_FRAME_QP, DEC, VP9, 0, 127, 1, 40}, {CAP_B_FRAME_QP, DEC, VP9, 0, 127, 1, 40}, /* 10 slices */ {CAP_SLICE_BYTE, ENC, H264|HEVC, 1, 10, 1, 10}, {CAP_SLICE_MB, ENC, H264|HEVC, 1, 10, 1, 10}, {CAP_MAX_VIDEOCORES, DOMAINS_ALL, CODECS_ALL, 0, 1, 1, 1}, /* Mpeg2 decoder specific */ {CAP_FRAME_WIDTH, DEC, MPEG2, 128, 1920, 1, 1920}, {CAP_FRAME_HEIGHT, DEC, MPEG2, 128, 1920, 1, 1088}, /* (1920 * 1088) / 256 */ {CAP_MBS_PER_FRAME, DEC, MPEG2, 64, 8160, 1, 8160}, /* ((1920 * 1088) / 256) * 30*/ {CAP_MBS_PER_SECOND, DEC, MPEG2, 64, 244800, 1, 244800}, {CAP_FRAMERATE, DEC, MPEG2, 1, 30, 1, 30}, {CAP_BITRATE, DEC, MPEG2, 1, 40000000, 1, 20000000}, /* Secure usecase specific */ {CAP_SECURE_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1920}, {CAP_SECURE_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1080}, /* (3840 * 2176) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 32640, 1, 8160}, {CAP_SECURE_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 40000000, 1, 20000000}, /* Batch Mode Decode */ {CAP_BATCH_MAX_MB_PER_FRAME, DEC, CODECS_ALL, 64, 8160, 1, 8160}, /* (1920 * 1088) / 256 */ {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}, /* (3840 * 2176) / 256 */ {CAP_LOSSLESS_MBS_PER_FRAME, ENC, H264|HEVC, 64, 32640, 1, 8160}, /* All intra encoding usecase specific */ {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, 8192, 1, 8192}, {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 1, 8192}, /* Level for AVC and HEVC encoder specific. * Default for levels is UNKNOWN value. But if we use unknown * value here to set as default, max value needs to be set to * unknown as well, which creates a problem of allowing client * to set higher level than supported */ {CAP_H264_LEVEL, ENC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0, V4L2_MPEG_VIDEO_H264_LEVEL_6_0, 1, V4L2_MPEG_VIDEO_H264_LEVEL_6_0}, {CAP_HEVC_LEVEL, ENC, HEVC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6, 1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6}, /* Level for AVC and HEVC decoder specific */ {CAP_H264_LEVEL, DEC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0, V4L2_MPEG_VIDEO_H264_LEVEL_6_1, 1, V4L2_MPEG_VIDEO_H264_LEVEL_5_0}, {CAP_HEVC_LEVEL, DEC, HEVC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1, 1, V4L2_MPEG_VIDEO_HEVC_LEVEL_5}, }; static struct msm_vidc_codec_capability lagoon_capabilities_v1[] = { /* {cap_type, domains, codecs, min, max, step_size, default_value,} */ {CAP_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1920}, {CAP_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1080}, /* (3840 * 2176) / 256 */ {CAP_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 32640, 1, 8160}, /* ((3840 * 2176) / 256) * 30 fps */ {CAP_MBS_PER_SECOND, DOMAINS_ALL, CODECS_ALL, 64, 979200, 1, 244800}, {CAP_FRAMERATE, DOMAINS_ALL, CODECS_ALL, 1, 240, 1, 30}, {CAP_OPERATINGRATE, DOMAINS_ALL, CODECS_ALL, 1, INT_MAX, 1, 30}, {CAP_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 100000000, 1, 20000000}, {CAP_CABAC_BITRATE, ENC, H264, 1, 100000000, 1, 20000000}, {CAP_SCALE_X, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, {CAP_SCALE_Y, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, {CAP_SCALE_X, DEC, CODECS_ALL, 65536, 65536, 1, 65536}, {CAP_SCALE_Y, DEC, CODECS_ALL, 65536, 65536, 1, 65536}, {CAP_BFRAME, ENC, H264|HEVC, 0, 1, 1, 0}, {CAP_HIER_P_NUM_ENH_LAYERS, ENC, H264|HEVC, 0, 6, 1, 0}, {CAP_LTR_COUNT, ENC, H264|HEVC, 0, 2, 1, 0}, /* ((1920 * 1088) / 256) * 30 fps */ {CAP_MBS_PER_SECOND_POWER_SAVE, ENC, CODECS_ALL, 0, 244800, 1, 244800}, {CAP_I_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 10}, {CAP_P_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 20}, {CAP_B_FRAME_QP, ENC, H264|HEVC, 0, 51, 1, 20}, {CAP_I_FRAME_QP, DEC, VP9, 0, 127, 1, 20}, {CAP_P_FRAME_QP, DEC, VP9, 0, 127, 1, 40}, {CAP_B_FRAME_QP, DEC, VP9, 0, 127, 1, 40}, /* 10 slices */ {CAP_SLICE_BYTE, ENC, H264|HEVC, 1, 10, 1, 10}, {CAP_SLICE_MB, ENC, H264|HEVC, 1, 10, 1, 10}, {CAP_MAX_VIDEOCORES, DOMAINS_ALL, CODECS_ALL, 0, 1, 1, 1}, /* Mpeg2 decoder specific */ {CAP_FRAME_WIDTH, DEC, MPEG2, 128, 1920, 1, 1920}, {CAP_FRAME_HEIGHT, DEC, MPEG2, 128, 1920, 1, 1088}, /* (1920 * 1088) / 256 */ {CAP_MBS_PER_FRAME, DEC, MPEG2, 64, 8160, 1, 8160}, /* ((1920 * 1088) / 256) * 30*/ {CAP_MBS_PER_SECOND, DEC, MPEG2, 64, 244800, 1, 244800}, {CAP_FRAMERATE, DEC, MPEG2, 1, 30, 1, 30}, {CAP_BITRATE, DEC, MPEG2, 1, 40000000, 1, 20000000}, /* Secure usecase specific */ {CAP_SECURE_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1920}, {CAP_SECURE_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 128, 3840, 1, 1080}, /* (3840 * 2176) / 256 */ {CAP_SECURE_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 64, 32640, 1, 8160}, {CAP_SECURE_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 40000000, 1, 20000000}, /* Batch Mode Decode */ {CAP_BATCH_MAX_MB_PER_FRAME, DEC, CODECS_ALL, 64, 8160, 1, 8160}, /* (1920 * 1088) / 256 */ {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}, /* (3840 * 2176)/ 256 */ {CAP_LOSSLESS_MBS_PER_FRAME, ENC, H264|HEVC, 64, 32640, 1, 8160}, /* All intra encoding usecase specific */ {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, 8192, 1, 8192}, {CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 1, 8192}, /* Level for AVC and HEVC encoder specific. * Default for levels is UNKNOWN value. But if we use unknown * value here to set as default, max value needs to be set to * unknown as well, which creates a problem of allowing client * to set higher level than supported */ {CAP_H264_LEVEL, ENC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0, V4L2_MPEG_VIDEO_H264_LEVEL_6_0, 1, V4L2_MPEG_VIDEO_H264_LEVEL_6_0}, {CAP_HEVC_LEVEL, ENC, HEVC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6, 1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6}, /* Level for AVC and HEVC decoder specific */ {CAP_H264_LEVEL, DEC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0, V4L2_MPEG_VIDEO_H264_LEVEL_6_1, 1, V4L2_MPEG_VIDEO_H264_LEVEL_5_0}, {CAP_HEVC_LEVEL, DEC, HEVC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1, 1, V4L2_MPEG_VIDEO_HEVC_LEVEL_5}, }; 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}, Loading Loading @@ -783,6 +985,165 @@ static struct msm_vidc_common_data lito_common_data_v1[] = { }, }; static struct msm_vidc_common_data lagoon_common_data_v0[] = { { .key = "qcom,never-unload-fw", .value = 1, }, { .key = "qcom,sw-power-collapse", .value = 1, }, { .key = "qcom,domain-attr-non-fatal-faults", .value = 1, }, { .key = "qcom,max-secure-instances", .value = 3, }, { .key = "qcom,max-hw-load", .value = 1958400, /* ((3840x2176)/256)@60fps decode */ /* UHD@30 decode + 1080@30 encode */ }, { .key = "qcom,max-mbpf", .value = 130560, /* ((3840x2176)/256) x 4 */ }, { .key = "qcom,max-hq-mbs-per-frame", .value = 8160, /* ((1920x1088)/256) */ }, { .key = "qcom,max-hq-mbs-per-sec", .value = 244800, /* ((1920x1088)/256)@30fps */ }, { .key = "qcom,max-b-frame-mbs-per-frame", .value = 8160, /* ((1920x1088)/256) */ }, { .key = "qcom,max-b-frame-mbs-per-sec", .value = 244800, /* ((1920x1088)/256) MBs@30fps */ }, { .key = "qcom,power-collapse-delay", .value = 1500, }, { .key = "qcom,hw-resp-timeout", .value = 1000, }, { .key = "qcom,debug-timeout", .value = 0, }, { .key = "qcom,decode-batching", .value = 1, }, { .key = "qcom,batch-timeout", .value = 200, }, { .key = "qcom,dcvs", .value = 1, }, { .key = "qcom,fw-cycles", .value = 436000, }, { .key = "qcom,fw-vpp-cycles", .value = 166667, }, { .key = "qcom,avsync-window-size", .value = 40, }, }; static struct msm_vidc_common_data lagoon_common_data_v1[] = { { .key = "qcom,never-unload-fw", .value = 1, }, { .key = "qcom,sw-power-collapse", .value = 1, }, { .key = "qcom,domain-attr-non-fatal-faults", .value = 1, }, { .key = "qcom,max-secure-instances", .value = 3, }, { .key = "qcom,max-hw-load", .value = 1224000, /* UHD@30 decode + 1080@30 encode */ }, { .key = "qcom,max-mbpf", .value = 130560, /* ((3840x2176)/256) x 4 */ }, { .key = "qcom,max-hq-mbs-per-frame", .value = 8160, /* ((1920x1088)/256) */ }, { .key = "qcom,max-hq-mbs-per-sec", .value = 244800, /* ((1920x1088)/256)@30fps */ }, { .key = "qcom,max-b-frame-mbs-per-frame", .value = 8160, /* ((1920x1088)/256) */ }, { .key = "qcom,max-b-frame-mbs-per-sec", .value = 244800, /* ((1920x1088)/256) MBs@30fps */ }, { .key = "qcom,power-collapse-delay", .value = 1500, }, { .key = "qcom,hw-resp-timeout", .value = 1000, }, { .key = "qcom,debug-timeout", .value = 0, }, { .key = "qcom,decode-batching", .value = 1, }, { .key = "qcom,batch-timeout", .value = 200, }, { .key = "qcom,dcvs", .value = 1, }, { .key = "qcom,fw-cycles", .value = 436000, }, { .key = "qcom,fw-vpp-cycles", .value = 166667, }, { .key = "qcom,avsync-window-size", .value = 40, }, }; static struct msm_vidc_common_data kona_common_data[] = { { .key = "qcom,never-unload-fw", Loading Loading @@ -1283,6 +1644,10 @@ static struct msm_vidc_efuse_data lito_efuse_data[] = { EFUSE_ENTRY(0x00786008, 4, 0x00200000, 0x15, SKU_VERSION), }; static struct msm_vidc_efuse_data lagoon_efuse_data[] = { EFUSE_ENTRY(0x007801E8, 4, 0x00004000, 0x0E, SKU_VERSION), }; static struct msm_vidc_efuse_data sdm670_efuse_data[] = { EFUSE_ENTRY(0x007801A0, 4, 0x00008000, 0x0f, SKU_VERSION), }; Loading Loading @@ -1345,6 +1710,25 @@ static struct msm_vidc_platform_data kona_data = { .codec_caps_count = ARRAY_SIZE(kona_capabilities), }; static struct msm_vidc_platform_data lagoon_data = { .codec_data = lagoon_codec_data, .codec_data_length = ARRAY_SIZE(lagoon_codec_data), .common_data = lagoon_common_data_v0, .common_data_length = ARRAY_SIZE(lagoon_common_data_v0), .csc_data.vpe_csc_custom_bias_coeff = vpe_csc_custom_bias_coeff, .csc_data.vpe_csc_custom_matrix_coeff = vpe_csc_custom_matrix_coeff, .csc_data.vpe_csc_custom_limit_coeff = vpe_csc_custom_limit_coeff, .efuse_data = lagoon_efuse_data, .efuse_data_length = ARRAY_SIZE(lagoon_efuse_data), .sku_version = 0, .vpu_ver = VPU_VERSION_IRIS2, .ubwc_config = 0x0, .codecs = lagoon_codecs, .codecs_count = ARRAY_SIZE(lagoon_codecs), .codec_caps = lagoon_capabilities_v0, .codec_caps_count = ARRAY_SIZE(lagoon_capabilities_v0), }; static struct msm_vidc_platform_data sm6150_data = { .codec_data = sm6150_codec_data, .codec_data_length = ARRAY_SIZE(sm6150_codec_data), Loading Loading @@ -1453,6 +1837,10 @@ static const struct of_device_id msm_vidc_dt_match[] = { .compatible = "qcom,bengal-vidc", .data = &bengal_data, }, { .compatible = "qcom,lagoon-vidc", .data = &lagoon_data, }, {}, }; Loading Loading @@ -1585,6 +1973,15 @@ void *vidc_get_drv_data(struct device *dev) driver_data->codec_caps_count = ARRAY_SIZE(bengal_capabilities_v1); } } else if (!strcmp(match->compatible, "qcom,lagoon-vidc")) { if (driver_data->sku_version == SKU_VERSION_1) { driver_data->common_data = lagoon_common_data_v1; driver_data->common_data_length = ARRAY_SIZE(lagoon_common_data_v1); driver_data->codec_caps = lagoon_capabilities_v1; driver_data->codec_caps_count = ARRAY_SIZE(lagoon_capabilities_v1); } } exit: Loading