]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/hdcp: split HDCP GSC message alloc/save responsibilities
authorJani Nikula <jani.nikula@intel.com>
Thu, 24 Apr 2025 20:01:35 +0000 (23:01 +0300)
committerJani Nikula <jani.nikula@intel.com>
Fri, 2 May 2025 10:26:19 +0000 (13:26 +0300)
Allocate and initialize the HDCP GSC message in
intel_hdcp_gsc_hdcp2_init() as before, but store the pointer to
display->hdcp.hdcp_message in the caller. Similarly, pass in the pointer
to intel_hdcp_gsc_free_message().

Cc: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Link: https://lore.kernel.org/r/a74fcc941126bf92d12115b5faf4f75099e26242.1745524803.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c
drivers/gpu/drm/xe/display/xe_hdcp_gsc.c

index 92a3ad2166f6468c4af05e65f60beecd57a5050c..68d912dbd658dc2256015eda80b782a34629f4c3 100644 (file)
@@ -90,37 +90,35 @@ out_unpin:
        return err;
 }
 
-int intel_hdcp_gsc_hdcp2_init(struct intel_display *display)
+struct intel_hdcp_gsc_message *intel_hdcp_gsc_hdcp2_init(struct intel_display *display)
 {
        struct drm_i915_private *i915 = to_i915(display->drm);
        struct intel_hdcp_gsc_message *hdcp_message;
        int ret;
 
        hdcp_message = kzalloc(sizeof(*hdcp_message), GFP_KERNEL);
-
        if (!hdcp_message)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
        /*
         * NOTE: No need to lock the comp mutex here as it is already
         * going to be taken before this function called
         */
-       display->hdcp.hdcp_message = hdcp_message;
        ret = intel_hdcp_gsc_initialize_message(i915, hdcp_message);
-
-       if (ret)
+       if (ret) {
                drm_err(display->drm, "Could not initialize hdcp_message\n");
+               kfree(hdcp_message);
+               hdcp_message = ERR_PTR(ret);
+       }
 
-       return ret;
+       return hdcp_message;
 }
 
-void intel_hdcp_gsc_free_message(struct intel_display *display)
+void intel_hdcp_gsc_free_message(struct intel_hdcp_gsc_message *hdcp_message)
 {
-       struct intel_hdcp_gsc_message *hdcp_message =
-                                       display->hdcp.hdcp_message;
+       if (!hdcp_message)
+               return;
 
-       hdcp_message->hdcp_cmd_in = NULL;
-       hdcp_message->hdcp_cmd_out = NULL;
        i915_vma_unpin_and_release(&hdcp_message->vma, I915_VMA_RELEASE_MAP);
        kfree(hdcp_message);
 }
index ad41e7e800955a4da9265feda3b8d1a4c4902b9e..f3362720d7428619f6ccd845f6fca0ee5d89f501 100644 (file)
@@ -19,7 +19,7 @@ ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
                                size_t msg_out_len);
 bool intel_hdcp_gsc_check_status(struct intel_display *display);
 
-int intel_hdcp_gsc_hdcp2_init(struct intel_display *display);
-void intel_hdcp_gsc_free_message(struct intel_display *display);
+struct intel_hdcp_gsc_message *intel_hdcp_gsc_hdcp2_init(struct intel_display *display);
+void intel_hdcp_gsc_free_message(struct intel_hdcp_gsc_message *hdcp_message);
 
 #endif /* __INTEL_HDCP_GCS_H__ */
index 8e2aafff71d5a26def8e02840a51aa75c80d45fd..11aa6772f27207cbb6375dd66b26deaf39a56798 100644 (file)
@@ -633,8 +633,9 @@ static const struct i915_hdcp_ops gsc_hdcp_ops = {
 
 int intel_hdcp_gsc_init(struct intel_display *display)
 {
+       struct intel_hdcp_gsc_message *hdcp_message;
        struct i915_hdcp_arbiter *arbiter;
-       int ret;
+       int ret = 0;
 
        arbiter = kzalloc(sizeof(*arbiter), GFP_KERNEL);
        if (!arbiter)
@@ -642,8 +643,9 @@ int intel_hdcp_gsc_init(struct intel_display *display)
 
        mutex_lock(&display->hdcp.hdcp_mutex);
 
-       ret = intel_hdcp_gsc_hdcp2_init(display);
-       if (ret) {
+       hdcp_message = intel_hdcp_gsc_hdcp2_init(display);
+       if (IS_ERR(hdcp_message)) {
+               ret = PTR_ERR(hdcp_message);
                kfree(arbiter);
                goto out;
        }
@@ -651,6 +653,7 @@ int intel_hdcp_gsc_init(struct intel_display *display)
        display->hdcp.arbiter = arbiter;
        display->hdcp.arbiter->hdcp_dev = display->drm->dev;
        display->hdcp.arbiter->ops = &gsc_hdcp_ops;
+       display->hdcp.hdcp_message = hdcp_message;
 
 out:
        mutex_unlock(&display->hdcp.hdcp_mutex);
@@ -660,7 +663,8 @@ out:
 
 void intel_hdcp_gsc_fini(struct intel_display *display)
 {
-       intel_hdcp_gsc_free_message(display);
+       intel_hdcp_gsc_free_message(display->hdcp.hdcp_message);
+       display->hdcp.hdcp_message = NULL;
        kfree(display->hdcp.arbiter);
        display->hdcp.arbiter = NULL;
 }
index 21cfecf077bffde85f34ba6ad6f9fac174f11783..d15565bf2f9ff417890ec3a88bd3c264ac7dbc98 100644 (file)
@@ -99,15 +99,14 @@ out:
        return ret;
 }
 
-int intel_hdcp_gsc_hdcp2_init(struct intel_display *display)
+struct intel_hdcp_gsc_message *intel_hdcp_gsc_hdcp2_init(struct intel_display *display)
 {
        struct intel_hdcp_gsc_message *hdcp_message;
        int ret;
 
        hdcp_message = kzalloc(sizeof(*hdcp_message), GFP_KERNEL);
-
        if (!hdcp_message)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
        /*
         * NOTE: No need to lock the comp mutex here as it is already
@@ -117,22 +116,19 @@ int intel_hdcp_gsc_hdcp2_init(struct intel_display *display)
        if (ret) {
                drm_err(display->drm, "Could not initialize hdcp_message\n");
                kfree(hdcp_message);
-               return ret;
+               hdcp_message = ERR_PTR(ret);
        }
 
-       display->hdcp.hdcp_message = hdcp_message;
-       return ret;
+       return hdcp_message;
 }
 
-void intel_hdcp_gsc_free_message(struct intel_display *display)
+void intel_hdcp_gsc_free_message(struct intel_hdcp_gsc_message *hdcp_message)
 {
-       struct intel_hdcp_gsc_message *hdcp_message = display->hdcp.hdcp_message;
+       if (!hdcp_message)
+               return;
 
-       if (hdcp_message) {
-               xe_bo_unpin_map_no_vm(hdcp_message->hdcp_bo);
-               kfree(hdcp_message);
-               display->hdcp.hdcp_message = NULL;
-       }
+       xe_bo_unpin_map_no_vm(hdcp_message->hdcp_bo);
+       kfree(hdcp_message);
 }
 
 static int xe_gsc_send_sync(struct xe_device *xe,