diff --git a/driver/platform/cliffs/src/msm_vidc_cliffs.c b/driver/platform/cliffs/src/msm_vidc_cliffs.c index b5a95d1b05..cc92e3ea98 100644 --- a/driver/platform/cliffs/src/msm_vidc_cliffs.c +++ b/driver/platform/cliffs/src/msm_vidc_cliffs.c @@ -5108,6 +5108,7 @@ static const struct msm_vidc_platform_data cliffs_data_v0 = { .fwname = "vpu30_2v", .pas_id = 9, .supports_mmrm = 1, + .vpu_ver = VPU_VERSION_IRIS33_2P, /* caps related resorces */ .core_data = core_data_cliffs_v0, @@ -5194,6 +5195,7 @@ static const struct msm_vidc_platform_data cliffs_data_v1 = { .csc_data.vpe_csc_custom_limit_coeff = vpe_csc_custom_limit_coeff, .ubwc_config = ubwc_config_cliffs, .format_data = &format_data_cliffs_v1, + .vpu_ver = VPU_VERSION_IRIS33_2P, /* decoder properties related*/ .psc_avc_tbl = cliffs_vdec_psc_avc, diff --git a/driver/platform/common/inc/msm_vidc_platform.h b/driver/platform/common/inc/msm_vidc_platform.h index ec3c5e59fe..9cd4c38669 100644 --- a/driver/platform/common/inc/msm_vidc_platform.h +++ b/driver/platform/common/inc/msm_vidc_platform.h @@ -198,6 +198,11 @@ struct msm_vidc_format_capability { u32 matrix_coeff_info_size; }; +enum vpu_version { + VPU_VERSION_IRIS33 = 1, + VPU_VERSION_IRIS33_2P, // IRIS3 2 PIPE +}; + struct msm_vidc_platform_data { const struct bw_table *bw_tbl; unsigned int bw_tbl_size; @@ -235,6 +240,7 @@ struct msm_vidc_platform_data { struct msm_vidc_efuse_data *efuse_data; unsigned int efuse_data_size; unsigned int sku_version; + unsigned int vpu_ver; struct msm_vidc_format_capability *format_data; const u32 *psc_avc_tbl; unsigned int psc_avc_tbl_size; diff --git a/driver/platform/pineapple/src/msm_vidc_pineapple.c b/driver/platform/pineapple/src/msm_vidc_pineapple.c index 65e9ae520e..c739455db9 100644 --- a/driver/platform/pineapple/src/msm_vidc_pineapple.c +++ b/driver/platform/pineapple/src/msm_vidc_pineapple.c @@ -2905,6 +2905,7 @@ static const struct msm_vidc_platform_data pineapple_data = { .fwname = "vpu33_4v", .pas_id = 9, .supports_mmrm = 1, + .vpu_ver = VPU_VERSION_IRIS33, /* caps related resorces */ .core_data = core_data_pineapple, diff --git a/driver/variant/iris33/src/msm_vidc_clock_iris33.c b/driver/variant/iris33/src/msm_vidc_clock_iris33.c index 02ed8d8864..ebef355079 100644 --- a/driver/variant/iris33/src/msm_vidc_clock_iris33.c +++ b/driver/variant/iris33/src/msm_vidc_clock_iris33.c @@ -22,6 +22,7 @@ static u32 frequency_table_iris33[2][6] = { {840, 720, 652, 570, 450, 294}, }; + /* * TODO Move to pineapple.c * TODO Replace hardcoded values with diff --git a/driver/variant/iris33/src/msm_vidc_iris33.c b/driver/variant/iris33/src/msm_vidc_iris33.c index b24c95b7bd..7a4bf68b8a 100644 --- a/driver/variant/iris33/src/msm_vidc_iris33.c +++ b/driver/variant/iris33/src/msm_vidc_iris33.c @@ -122,17 +122,30 @@ typedef enum { * -------------------------------------------------------------------------- */ #define NOC_BASE_OFFS 0x00010000 -#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_MAINCTL_LOW (NOC_BASE_OFFS + 0xA008) -#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRCLR_LOW (NOC_BASE_OFFS + 0xA018) -#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_LOW (NOC_BASE_OFFS + 0xA020) -#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_HIGH (NOC_BASE_OFFS + 0xA024) -#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_LOW (NOC_BASE_OFFS + 0xA028) -#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_HIGH (NOC_BASE_OFFS + 0xA02C) -#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_LOW (NOC_BASE_OFFS + 0xA030) -#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_HIGH (NOC_BASE_OFFS + 0xA034) -#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_LOW (NOC_BASE_OFFS + 0xA038) -#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_HIGH (NOC_BASE_OFFS + 0xA03C) -#define NOC_SIDEBANDMANAGER_MAIN_SIDEBANDMANAGER_FAULTINEN0_LOW (NOC_BASE_OFFS + 0x7040) + +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_MAINCTL_LOW_IRIS33 (NOC_BASE_OFFS + 0xA008) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRCLR_LOW_IRIS33 (NOC_BASE_OFFS + 0xA018) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_LOW_IRIS33 (NOC_BASE_OFFS + 0xA020) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_HIGH_IRIS33 (NOC_BASE_OFFS + 0xA024) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_LOW_IRIS33 (NOC_BASE_OFFS + 0xA028) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_HIGH_IRIS33 (NOC_BASE_OFFS + 0xA02C) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_LOW_IRIS33 (NOC_BASE_OFFS + 0xA030) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_HIGH_IRIS33 (NOC_BASE_OFFS + 0xA034) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_LOW_IRIS33 (NOC_BASE_OFFS + 0xA038) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_HIGH_IRIS33 (NOC_BASE_OFFS + 0xA03C) +#define NOC_SIDEBANDMANAGER_MAIN_SIDEBANDMANAGER_FAULTINEN0_LOW_IRIS33 (NOC_BASE_OFFS + 0x7040) + +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_MAINCTL_LOW_IRIS33_2P (NOC_BASE_OFFS + 0x3508) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRCLR_LOW_IRIS33_2P (NOC_BASE_OFFS + 0x3518) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_LOW_IRIS33_2P (NOC_BASE_OFFS + 0x3520) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_HIGH_IRIS33_2P (NOC_BASE_OFFS + 0x3524) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_LOW_IRIS33_2P (NOC_BASE_OFFS + 0x3528) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_HIGH_IRIS33_2P (NOC_BASE_OFFS + 0x352C) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_LOW_IRIS33_2P (NOC_BASE_OFFS + 0x3530) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_HIGH_IRIS33_2P (NOC_BASE_OFFS + 0x3534) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_LOW_IRIS33_2P (NOC_BASE_OFFS + 0x3538) +#define NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_HIGH_IRIS33_2P (NOC_BASE_OFFS + 0x353C) +#define NOC_SIDEBANDMANAGER_MAIN_SIDEBANDMANAGER_FAULTINEN0_LOW_IRIS33_2P (NOC_BASE_OFFS + 0x3240) static int __interrupt_init_iris33(struct msm_vidc_core *core) { @@ -739,30 +752,60 @@ static int __power_on_iris33(struct msm_vidc_core *core) * Programm NOC error registers before releasing xo reset * Clear error logger registers and then enable StallEn */ - rc = __write_register(core, - NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRCLR_LOW, 0x1); - if (rc) { - d_vpr_e( - "%s: error clearing NOC_MAIN_ERRORLOGGER_ERRCLR_LOW\n", - __func__); - goto fail_program_noc_regs; - } + if (core->platform->data.vpu_ver == VPU_VERSION_IRIS33) { + rc = __write_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRCLR_LOW_IRIS33, 0x1); + if (rc) { + d_vpr_e( + "%s: error clearing NOC_MAIN_ERRORLOGGER_ERRCLR_LOW\n", + __func__); + goto fail_program_noc_regs; + } - rc = __write_register(core, - NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_MAINCTL_LOW, 0x3); - if (rc) { - d_vpr_e( - "%s: failed to set NOC_ERL_MAIN_ERRORLOGGER_MAINCTL_LOW\n", - __func__); - goto fail_program_noc_regs; - } - rc = __write_register(core, - NOC_SIDEBANDMANAGER_MAIN_SIDEBANDMANAGER_FAULTINEN0_LOW, 0x1); - if (rc) { - d_vpr_e( - "%s: failed to set NOC_SIDEBANDMANAGER_FAULTINEN0_LOW\n", - __func__); - goto fail_program_noc_regs; + rc = __write_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_MAINCTL_LOW_IRIS33, 0x3); + if (rc) { + d_vpr_e( + "%s: failed to set NOC_ERL_MAIN_ERRORLOGGER_MAINCTL_LOW\n", + __func__); + goto fail_program_noc_regs; + } + rc = __write_register(core, + NOC_SIDEBANDMANAGER_MAIN_SIDEBANDMANAGER_FAULTINEN0_LOW_IRIS33, + 0x1); + if (rc) { + d_vpr_e( + "%s: failed to set NOC_SIDEBANDMANAGER_FAULTINEN0_LOW\n", + __func__); + goto fail_program_noc_regs; + } + } else if (core->platform->data.vpu_ver == VPU_VERSION_IRIS33_2P) { + rc = __write_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRCLR_LOW_IRIS33_2P, 0x1); + if (rc) { + d_vpr_e( + "%s: error clearing NOC_MAIN_ERRORLOGGER_ERRCLR_LOW\n", + __func__); + goto fail_program_noc_regs; + } + + rc = __write_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_MAINCTL_LOW_IRIS33_2P, 0x3); + if (rc) { + d_vpr_e( + "%s: failed to set NOC_ERL_MAIN_ERRORLOGGER_MAINCTL_LOW\n", + __func__); + goto fail_program_noc_regs; + } + rc = __write_register(core, + NOC_SIDEBANDMANAGER_MAIN_SIDEBANDMANAGER_FAULTINEN0_LOW_IRIS33_2P, + 0x1); + if (rc) { + d_vpr_e( + "%s: failed to set NOC_SIDEBANDMANAGER_FAULTINEN0_LOW\n", + __func__); + goto fail_program_noc_regs; + } } /* release reset control for other consumers */ @@ -877,9 +920,107 @@ static int __watchdog_iris33(struct msm_vidc_core *core, u32 intr_status) return rc; } +static int __read_noc_err_register_iris33(struct msm_vidc_core *core) +{ + int rc = 0; + u32 value; + + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_LOW_IRIS33, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_LOW: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_HIGH_IRIS33, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_HIGH: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_LOW_IRIS33, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_LOW: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_HIGH_IRIS33, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_HIGH: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_LOW_IRIS33, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_LOW: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_HIGH_IRIS33, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_HIGH: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_LOW_IRIS33, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_LOW: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_HIGH_IRIS33, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_HIGH: %#x\n", + __func__, value); + + return rc; +} + +static int __read_noc_err_register_iris33_2p(struct msm_vidc_core *core) +{ + int rc = 0; + u32 value; + + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_LOW_IRIS33_2P, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_LOW: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_HIGH_IRIS33_2P, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_HIGH: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_LOW_IRIS33_2P, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_LOW: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_HIGH_IRIS33_2P, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_HIGH: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_LOW_IRIS33_2P, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_LOW: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_HIGH_IRIS33_2P, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_HIGH: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_LOW_IRIS33_2P, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_LOW: %#x\n", + __func__, value); + rc = __read_register(core, + NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_HIGH_IRIS33_2P, &value); + if (!rc) + d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_HIGH: %#x\n", + __func__, value); + + return rc; +} + static int __noc_error_info_iris33(struct msm_vidc_core *core) { - u32 value, count = 0; + u32 count = 0; int rc = 0; /* @@ -947,46 +1088,11 @@ static int __noc_error_info_iris33(struct msm_vidc_core *core) goto fail_assert_xo_reset; } - rc = __read_register(core, - NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_LOW, &value); - if (!rc) - d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_LOW: %#x\n", - __func__, value); - rc = __read_register(core, - NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_HIGH, &value); - if (!rc) - d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG0_HIGH: %#x\n", - __func__, value); - rc = __read_register(core, - NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_LOW, &value); - if (!rc) - d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_LOW: %#x\n", - __func__, value); - rc = __read_register(core, - NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_HIGH, &value); - if (!rc) - d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG1_HIGH: %#x\n", - __func__, value); - rc = __read_register(core, - NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_LOW, &value); - if (!rc) - d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_LOW: %#x\n", - __func__, value); - rc = __read_register(core, - NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_HIGH, &value); - if (!rc) - d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG2_HIGH: %#x\n", - __func__, value); - rc = __read_register(core, - NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_LOW, &value); - if (!rc) - d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_LOW: %#x\n", - __func__, value); - rc = __read_register(core, - NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_HIGH, &value); - if (!rc) - d_vpr_e("%s: NOC_ERL_ERRORLOGGER_MAIN_ERRORLOGGER_ERRLOG3_HIGH: %#x\n", - __func__, value); + if (core->platform->data.vpu_ver == VPU_VERSION_IRIS33) + rc = __read_noc_err_register_iris33(core); + else if (core->platform->data.vpu_ver == VPU_VERSION_IRIS33_2P) + rc = __read_noc_err_register_iris33_2p(core); + /* release reset control for other consumers */ rc = call_res_op(core, reset_control_release, core, "video_xo_reset"); if (rc) {