Loading drivers/media/platform/msm/vidc/msm_vidc_common.c +23 −0 Original line number Diff line number Diff line Loading @@ -2037,6 +2037,7 @@ static void handle_sys_error(enum hal_command_response cmd, void *data) } dprintk(VIDC_WARN, "SYS_ERROR received for core %pK\n", core); msm_vidc_noc_error_info(core); call_hfi_op(hdev, flush_debug_queue, hdev->hfi_device_data); list_for_each_entry(inst, &core->instances, list) { dprintk(VIDC_WARN, Loading Loading @@ -5069,6 +5070,28 @@ enum hal_extradata_id msm_comm_get_hal_extradata_index( return ret; }; int msm_vidc_noc_error_info(struct msm_vidc_core *core) { struct hfi_device *hdev; if (!core || !core->device) { dprintk(VIDC_WARN, "%s: Invalid parameters: %pK\n", __func__, core); return -EINVAL; } if (!core->resources.non_fatal_pagefaults) return 0; if (!core->smmu_fault_handled) return 0; hdev = core->device; call_hfi_op(hdev, noc_error_info, hdev->hfi_device_data); return 0; } int msm_vidc_trigger_ssr(struct msm_vidc_core *core, enum hal_ssr_trigger_type type) { Loading drivers/media/platform/msm/vidc/msm_vidc_internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -395,6 +395,7 @@ struct msm_vidc_ctrl { void handle_cmd_response(enum hal_command_response cmd, void *data); int msm_vidc_trigger_ssr(struct msm_vidc_core *core, enum hal_ssr_trigger_type type); int msm_vidc_noc_error_info(struct msm_vidc_core *core); int msm_vidc_check_session_supported(struct msm_vidc_inst *inst); int msm_vidc_check_scaling_supported(struct msm_vidc_inst *inst); void msm_vidc_queue_v4l2_event(struct msm_vidc_inst *inst, int event_type); Loading drivers/media/platform/msm/vidc/msm_vidc_platform.c +4 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,10 @@ static struct msm_vidc_common_data sdm845_common_data[] = { .key = "qcom,sw-power-collapse", .value = 1, }, { .key = "qcom,domain-attr-non-fatal-faults", .value = 1, }, { .key = "qcom,max-secure-instances", .value = 5, Loading drivers/media/platform/msm/vidc/msm_vidc_res_parse.c +24 −1 Original line number Diff line number Diff line Loading @@ -785,6 +785,9 @@ int read_platform_resources_from_drv_data( "qcom,fw-unload-delay"); res->msm_vidc_hw_rsp_timeout = find_key_value(platform_data, "qcom,hw-resp-timeout"); res->non_fatal_pagefaults = find_key_value(platform_data, "qcom,domain-attr-non-fatal-faults"); return rc; } Loading Loading @@ -980,8 +983,13 @@ int msm_vidc_smmu_fault_handler(struct iommu_domain *domain, return -EINVAL; } if (core->smmu_fault_handled) if (core->smmu_fault_handled) { if (core->resources.non_fatal_pagefaults) { msm_vidc_noc_error_info(core); MSM_VIDC_ERROR(true); } return -ENOSYS; } dprintk(VIDC_ERR, "%s - faulting address: %lx\n", __func__, iova); Loading Loading @@ -1061,6 +1069,21 @@ static int msm_vidc_populate_context_bank(struct device *dev, goto err_setup_cb; } if (core->resources.non_fatal_pagefaults) { int data = 1; dprintk(VIDC_DBG, "set non-fatal-faults attribute on %s\n", dev_name(dev)); rc = iommu_domain_set_attr(cb->mapping->domain, DOMAIN_ATTR_NON_FATAL_FAULTS, &data); if (rc) { dprintk(VIDC_WARN, "%s: set non fatal attribute failed: %s %d\n", __func__, dev_name(dev), rc); /* ignore the error */ } } iommu_set_fault_handler(cb->mapping->domain, msm_vidc_smmu_fault_handler, (void *)core); Loading drivers/media/platform/msm/vidc/msm_vidc_resources.h +1 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,7 @@ struct msm_vidc_platform_resources { int msm_vidc_hw_rsp_timeout; int msm_vidc_firmware_unload_delay; uint32_t msm_vidc_pwr_collapse_delay; bool non_fatal_pagefaults; struct msm_vidc_codec_data *codec_data; int codec_data_count; }; Loading Loading
drivers/media/platform/msm/vidc/msm_vidc_common.c +23 −0 Original line number Diff line number Diff line Loading @@ -2037,6 +2037,7 @@ static void handle_sys_error(enum hal_command_response cmd, void *data) } dprintk(VIDC_WARN, "SYS_ERROR received for core %pK\n", core); msm_vidc_noc_error_info(core); call_hfi_op(hdev, flush_debug_queue, hdev->hfi_device_data); list_for_each_entry(inst, &core->instances, list) { dprintk(VIDC_WARN, Loading Loading @@ -5069,6 +5070,28 @@ enum hal_extradata_id msm_comm_get_hal_extradata_index( return ret; }; int msm_vidc_noc_error_info(struct msm_vidc_core *core) { struct hfi_device *hdev; if (!core || !core->device) { dprintk(VIDC_WARN, "%s: Invalid parameters: %pK\n", __func__, core); return -EINVAL; } if (!core->resources.non_fatal_pagefaults) return 0; if (!core->smmu_fault_handled) return 0; hdev = core->device; call_hfi_op(hdev, noc_error_info, hdev->hfi_device_data); return 0; } int msm_vidc_trigger_ssr(struct msm_vidc_core *core, enum hal_ssr_trigger_type type) { Loading
drivers/media/platform/msm/vidc/msm_vidc_internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -395,6 +395,7 @@ struct msm_vidc_ctrl { void handle_cmd_response(enum hal_command_response cmd, void *data); int msm_vidc_trigger_ssr(struct msm_vidc_core *core, enum hal_ssr_trigger_type type); int msm_vidc_noc_error_info(struct msm_vidc_core *core); int msm_vidc_check_session_supported(struct msm_vidc_inst *inst); int msm_vidc_check_scaling_supported(struct msm_vidc_inst *inst); void msm_vidc_queue_v4l2_event(struct msm_vidc_inst *inst, int event_type); Loading
drivers/media/platform/msm/vidc/msm_vidc_platform.c +4 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,10 @@ static struct msm_vidc_common_data sdm845_common_data[] = { .key = "qcom,sw-power-collapse", .value = 1, }, { .key = "qcom,domain-attr-non-fatal-faults", .value = 1, }, { .key = "qcom,max-secure-instances", .value = 5, Loading
drivers/media/platform/msm/vidc/msm_vidc_res_parse.c +24 −1 Original line number Diff line number Diff line Loading @@ -785,6 +785,9 @@ int read_platform_resources_from_drv_data( "qcom,fw-unload-delay"); res->msm_vidc_hw_rsp_timeout = find_key_value(platform_data, "qcom,hw-resp-timeout"); res->non_fatal_pagefaults = find_key_value(platform_data, "qcom,domain-attr-non-fatal-faults"); return rc; } Loading Loading @@ -980,8 +983,13 @@ int msm_vidc_smmu_fault_handler(struct iommu_domain *domain, return -EINVAL; } if (core->smmu_fault_handled) if (core->smmu_fault_handled) { if (core->resources.non_fatal_pagefaults) { msm_vidc_noc_error_info(core); MSM_VIDC_ERROR(true); } return -ENOSYS; } dprintk(VIDC_ERR, "%s - faulting address: %lx\n", __func__, iova); Loading Loading @@ -1061,6 +1069,21 @@ static int msm_vidc_populate_context_bank(struct device *dev, goto err_setup_cb; } if (core->resources.non_fatal_pagefaults) { int data = 1; dprintk(VIDC_DBG, "set non-fatal-faults attribute on %s\n", dev_name(dev)); rc = iommu_domain_set_attr(cb->mapping->domain, DOMAIN_ATTR_NON_FATAL_FAULTS, &data); if (rc) { dprintk(VIDC_WARN, "%s: set non fatal attribute failed: %s %d\n", __func__, dev_name(dev), rc); /* ignore the error */ } } iommu_set_fault_handler(cb->mapping->domain, msm_vidc_smmu_fault_handler, (void *)core); Loading
drivers/media/platform/msm/vidc/msm_vidc_resources.h +1 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,7 @@ struct msm_vidc_platform_resources { int msm_vidc_hw_rsp_timeout; int msm_vidc_firmware_unload_delay; uint32_t msm_vidc_pwr_collapse_delay; bool non_fatal_pagefaults; struct msm_vidc_codec_data *codec_data; int codec_data_count; }; Loading