[PATCH 2/5] drm/i915/dmc: improve firmware parse failure propagation

Gustavo Sousa gustavo.sousa at intel.com
Thu Apr 18 18:53:35 UTC 2024


Quoting Jani Nikula (2024-04-18 11:39:51-03:00)
>Return failures from parse_dmc_fw() instead of relying on
>intel_dmc_has_payload(). Handle and error report them slightly better.
>
>Signed-off-by: Jani Nikula <jani.nikula at intel.com>
>---
> drivers/gpu/drm/i915/display/intel_dmc.c | 39 +++++++++++++-----------
> 1 file changed, 22 insertions(+), 17 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/display/intel_dmc.c b/drivers/gpu/drm/i915/display/intel_dmc.c
>index 65880dea9c15..ee5db1aafd50 100644
>--- a/drivers/gpu/drm/i915/display/intel_dmc.c
>+++ b/drivers/gpu/drm/i915/display/intel_dmc.c
>@@ -853,7 +853,7 @@ static u32 parse_dmc_fw_css(struct intel_dmc *dmc,
>         return sizeof(struct intel_css_header);
> }
> 
>-static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
>+static int parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
> {
>         struct drm_i915_private *i915 = dmc->i915;
>         struct intel_css_header *css_header;
>@@ -866,13 +866,13 @@ static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
>         u32 r, offset;
> 
>         if (!fw)
>-                return;
>+                return -EINVAL;
> 
>         /* Extract CSS Header information */
>         css_header = (struct intel_css_header *)fw->data;
>         r = parse_dmc_fw_css(dmc, css_header, fw->size);
>         if (!r)
>-                return;
>+                return -EINVAL;
> 
>         readcount += r;
> 
>@@ -880,7 +880,7 @@ static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
>         package_header = (struct intel_package_header *)&fw->data[readcount];
>         r = parse_dmc_fw_package(dmc, package_header, si, fw->size - readcount);
>         if (!r)
>-                return;
>+                return -EINVAL;
> 
>         readcount += r;
> 
>@@ -897,6 +897,11 @@ static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
>                 dmc_header = (struct intel_dmc_header_base *)&fw->data[offset];
>                 parse_dmc_fw_header(dmc, dmc_header, fw->size - offset, dmc_id);
>         }
>+
>+        if (!intel_dmc_has_payload(i915))
>+                return -ENOENT;

This function and also the parsing helpers (parse_dmc_fw_*) already have
the pattern of providing error messages for issues found. We could maybe
have parse_dmc_fw() simply returning -1 for errors here.

For this specific condition (!intel_dmc_has_payload(i915)), we could
complain that there the main DMC program was not found before returning.
I think ENOENT might confuse users.

--
Gustavo Sousa

>+
>+        return 0;
> }
> 
> static void intel_dmc_runtime_pm_get(struct drm_i915_private *i915)
>@@ -951,22 +956,22 @@ static void dmc_load_work_fn(struct work_struct *work)
>                 return;
>         }
> 
>-        parse_dmc_fw(dmc, fw);
>-
>-        if (intel_dmc_has_payload(i915)) {
>-                intel_dmc_load_program(i915);
>-                intel_dmc_runtime_pm_put(i915);
>-
>-                drm_info(&i915->drm, "Finished loading DMC firmware %s (v%u.%u)\n",
>-                         dmc->fw_path, DMC_VERSION_MAJOR(dmc->version),
>-                         DMC_VERSION_MINOR(dmc->version));
>-        } else {
>+        err = parse_dmc_fw(dmc, fw);
>+        if (err) {
>                 drm_notice(&i915->drm,
>-                           "Failed to load DMC firmware %s."
>-                           " Disabling runtime power management.\n",
>-                           dmc->fw_path);
>+                           "Failed to parse DMC firmware %s (%pe). Disabling runtime power management.\n",
>+                           dmc->fw_path, ERR_PTR(err));
>+                goto out;
>         }
> 
>+        intel_dmc_load_program(i915);
>+        intel_dmc_runtime_pm_put(i915);
>+
>+        drm_info(&i915->drm, "Finished loading DMC firmware %s (v%u.%u)\n",
>+                 dmc->fw_path, DMC_VERSION_MAJOR(dmc->version),
>+                 DMC_VERSION_MINOR(dmc->version));
>+
>+out:
>         release_firmware(fw);
> }
> 
>-- 
>2.39.2
>


More information about the Intel-gfx mailing list