Skip to content

Commit 6fe859e

Browse files
committed
drm/i915/dmc: improve firmware parse failure propagation
Return failures from parse_dmc_fw() instead of relying on intel_dmc_has_payload(). Handle and error report them slightly better, including a new error message for when the firmware does not contain the main program. v2: Print specific error message for payload not found (Gustavo) Reviewed-by: Gustavo Sousa <[email protected]> Acked-by: Lucas De Marchi <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/18833681978ec3ac779cce943221cc5b532c7c45.1713519628.git.jani.nikula@intel.com Signed-off-by: Jani Nikula <[email protected]>
1 parent 7de13cc commit 6fe859e

File tree

1 file changed

+24
-17
lines changed

1 file changed

+24
-17
lines changed

drivers/gpu/drm/i915/display/intel_dmc.c

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -853,7 +853,7 @@ static u32 parse_dmc_fw_css(struct intel_dmc *dmc,
853853
return sizeof(struct intel_css_header);
854854
}
855855

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)
857857
{
858858
struct drm_i915_private *i915 = dmc->i915;
859859
struct intel_css_header *css_header;
@@ -866,21 +866,21 @@ static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
866866
u32 r, offset;
867867

868868
if (!fw)
869-
return;
869+
return -EINVAL;
870870

871871
/* Extract CSS Header information */
872872
css_header = (struct intel_css_header *)fw->data;
873873
r = parse_dmc_fw_css(dmc, css_header, fw->size);
874874
if (!r)
875-
return;
875+
return -EINVAL;
876876

877877
readcount += r;
878878

879879
/* Extract Package Header information */
880880
package_header = (struct intel_package_header *)&fw->data[readcount];
881881
r = parse_dmc_fw_package(dmc, package_header, si, fw->size - readcount);
882882
if (!r)
883-
return;
883+
return -EINVAL;
884884

885885
readcount += r;
886886

@@ -897,6 +897,13 @@ static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
897897
dmc_header = (struct intel_dmc_header_base *)&fw->data[offset];
898898
parse_dmc_fw_header(dmc, dmc_header, fw->size - offset, dmc_id);
899899
}
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;
900907
}
901908

902909
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)
951958
return;
952959
}
953960

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) {
964963
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;
968967
}
969968

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:
970977
release_firmware(fw);
971978
}
972979

0 commit comments

Comments
 (0)