@@ -853,7 +853,7 @@ static u32 parse_dmc_fw_css(struct intel_dmc *dmc,
853
853
return sizeof (struct intel_css_header );
854
854
}
855
855
856
- static void parse_dmc_fw (struct intel_dmc * dmc , const struct firmware * fw )
856
+ static int parse_dmc_fw (struct intel_dmc * dmc , const struct firmware * fw )
857
857
{
858
858
struct drm_i915_private * i915 = dmc -> i915 ;
859
859
struct intel_css_header * css_header ;
@@ -866,21 +866,21 @@ static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
866
866
u32 r , offset ;
867
867
868
868
if (!fw )
869
- return ;
869
+ return - EINVAL ;
870
870
871
871
/* Extract CSS Header information */
872
872
css_header = (struct intel_css_header * )fw -> data ;
873
873
r = parse_dmc_fw_css (dmc , css_header , fw -> size );
874
874
if (!r )
875
- return ;
875
+ return - EINVAL ;
876
876
877
877
readcount += r ;
878
878
879
879
/* Extract Package Header information */
880
880
package_header = (struct intel_package_header * )& fw -> data [readcount ];
881
881
r = parse_dmc_fw_package (dmc , package_header , si , fw -> size - readcount );
882
882
if (!r )
883
- return ;
883
+ return - EINVAL ;
884
884
885
885
readcount += r ;
886
886
@@ -897,6 +897,13 @@ static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
897
897
dmc_header = (struct intel_dmc_header_base * )& fw -> data [offset ];
898
898
parse_dmc_fw_header (dmc , dmc_header , fw -> size - offset , dmc_id );
899
899
}
900
+
901
+ if (!intel_dmc_has_payload (i915 )) {
902
+ drm_err (& i915 -> drm , "DMC firmware main program not found\n" );
903
+ return - ENOENT ;
904
+ }
905
+
906
+ return 0 ;
900
907
}
901
908
902
909
static void intel_dmc_runtime_pm_get (struct drm_i915_private * i915 )
@@ -951,22 +958,22 @@ static void dmc_load_work_fn(struct work_struct *work)
951
958
return ;
952
959
}
953
960
954
- parse_dmc_fw (dmc , fw );
955
-
956
- if (intel_dmc_has_payload (i915 )) {
957
- intel_dmc_load_program (i915 );
958
- intel_dmc_runtime_pm_put (i915 );
959
-
960
- drm_info (& i915 -> drm , "Finished loading DMC firmware %s (v%u.%u)\n" ,
961
- dmc -> fw_path , DMC_VERSION_MAJOR (dmc -> version ),
962
- DMC_VERSION_MINOR (dmc -> version ));
963
- } else {
961
+ err = parse_dmc_fw (dmc , fw );
962
+ if (err ) {
964
963
drm_notice (& i915 -> drm ,
965
- "Failed to load DMC firmware %s."
966
- " Disabling runtime power management.\n" ,
967
- dmc -> fw_path ) ;
964
+ "Failed to parse DMC firmware %s (%pe). Disabling runtime power management.\n" ,
965
+ dmc -> fw_path , ERR_PTR ( err ));
966
+ goto out ;
968
967
}
969
968
969
+ intel_dmc_load_program (i915 );
970
+ intel_dmc_runtime_pm_put (i915 );
971
+
972
+ drm_info (& i915 -> drm , "Finished loading DMC firmware %s (v%u.%u)\n" ,
973
+ dmc -> fw_path , DMC_VERSION_MAJOR (dmc -> version ),
974
+ DMC_VERSION_MINOR (dmc -> version ));
975
+
976
+ out :
970
977
release_firmware (fw );
971
978
}
972
979
0 commit comments