HuC authentication is called even if HuC firmware is not present in the
system, leading to NULL ptr dereference on not allocated gem_object.
Let's avoid trying to authenticate HuC if its firmware is not loaded
succesfully.

While I'm here let's also assert that HuC vma is placed in GuC
accessible range for consistency.

Fixes: dac84a388528 ("drm/i915/huc: Support HuC authentication")

Cc: Anusha Srivatsa <[email protected]>
Cc: Arkadiusz Hiler <[email protected]>
Cc: Chris Wilson <[email protected]>
Cc: Michal Wajdeczko <[email protected]>
Signed-off-by: Michał Winiarski <[email protected]>
---
 drivers/gpu/drm/i915/intel_guc_loader.c | 4 +++-
 drivers/gpu/drm/i915/intel_huc.c        | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c 
b/drivers/gpu/drm/i915/intel_guc_loader.c
index 2f1cf9a..777c0e0 100644
--- a/drivers/gpu/drm/i915/intel_guc_loader.c
+++ b/drivers/gpu/drm/i915/intel_guc_loader.c
@@ -443,6 +443,7 @@ static int guc_hw_reset(struct drm_i915_private *dev_priv)
 int intel_guc_setup(struct drm_i915_private *dev_priv)
 {
        struct intel_uc_fw *guc_fw = &dev_priv->guc.fw;
+       struct intel_uc_fw *huc_fw = &dev_priv->huc.fw;
        const char *fw_path = guc_fw->path;
        int retries, ret, err;
 
@@ -524,7 +525,8 @@ int intel_guc_setup(struct drm_i915_private *dev_priv)
                intel_uc_fw_status_repr(guc_fw->fetch_status),
                intel_uc_fw_status_repr(guc_fw->load_status));
 
-       intel_guc_auth_huc(dev_priv);
+       if (huc_fw->load_status == INTEL_UC_FIRMWARE_SUCCESS)
+               intel_guc_auth_huc(dev_priv);
 
        if (i915.enable_guc_submission) {
                if (i915.guc_log_level >= 0)
diff --git a/drivers/gpu/drm/i915/intel_huc.c b/drivers/gpu/drm/i915/intel_huc.c
index 897ef31..ba53ea6 100644
--- a/drivers/gpu/drm/i915/intel_huc.c
+++ b/drivers/gpu/drm/i915/intel_huc.c
@@ -309,7 +309,7 @@ void intel_guc_auth_huc(struct drm_i915_private *dev_priv)
 
        /* Specify auth action and where public signature is. */
        data[0] = INTEL_GUC_ACTION_AUTHENTICATE_HUC;
-       data[1] = i915_ggtt_offset(vma) + huc->fw.rsa_offset;
+       data[1] = guc_ggtt_offset(vma) + huc->fw.rsa_offset;
 
        ret = intel_guc_send(guc, data, ARRAY_SIZE(data));
        if (ret) {
-- 
2.9.3

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to