[PATCH 02/10] drm/i915/hdcp: deduplicate and refactor HDCP GSC ops initialization
Kandpal, Suraj
suraj.kandpal at intel.com
Fri May 2 03:33:21 UTC 2025
> -----Original Message-----
> From: Nikula, Jani <jani.nikula at intel.com>
> Sent: Friday, April 25, 2025 1:32 AM
> To: intel-gfx at lists.freedesktop.org; intel-xe at lists.freedesktop.org
> Cc: Nikula, Jani <jani.nikula at intel.com>; Kandpal, Suraj
> <suraj.kandpal at intel.com>
> Subject: [PATCH 02/10] drm/i915/hdcp: deduplicate and refactor HDCP GSC ops
> initialization
>
> The gsc_hdcp_ops is duplicated and initialized exactly the same way in two
> different places (for i915 and xe), and requires forward declarations for all the
> hooks. Deduplicate, and make the functions static.
>
> There are slight differences in the i915 and xe implementations of
> intel_hdcp_gsc_init() and intel_hdcp_gsc_fini(). Take the best of both, and
> improve.
>
> We need to expose intel_hdcp_gsc_hdcp2_init() and
> intel_hdcp_gsc_free_message() for this, and create the latter for xe.
>
> Cc: Suraj Kandpal <suraj.kandpal at intel.com>
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
LGTM,
Reviewed-by: Suraj Kandpal <suraj.kandpal at intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_hdcp.c | 1 +
> drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 46 +---------
> drivers/gpu/drm/i915/display/intel_hdcp_gsc.h | 5 +-
> .../drm/i915/display/intel_hdcp_gsc_message.c | 84 +++++++++++++++----
> .../drm/i915/display/intel_hdcp_gsc_message.h | 58 +------------
> drivers/gpu/drm/xe/display/xe_hdcp_gsc.c | 50 +----------
> 6 files changed, 79 insertions(+), 165 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> b/drivers/gpu/drm/i915/display/intel_hdcp.c
> index 411f17655f89..4857685c4020 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> @@ -27,6 +27,7 @@
> #include "intel_dp_mst.h"
> #include "intel_hdcp.h"
> #include "intel_hdcp_gsc.h"
> +#include "intel_hdcp_gsc_message.h"
> #include "intel_hdcp_regs.h"
> #include "intel_hdcp_shim.h"
> #include "intel_pcode.h"
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> index 55965844d829..92a3ad2166f6 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> @@ -11,7 +11,6 @@
> #include "i915_drv.h"
> #include "i915_utils.h"
> #include "intel_hdcp_gsc.h"
> -#include "intel_hdcp_gsc_message.h"
>
> struct intel_hdcp_gsc_message {
> struct i915_vma *vma;
> @@ -91,23 +90,7 @@ static int intel_hdcp_gsc_initialize_message(struct
> drm_i915_private *i915,
> return err;
> }
>
> -static const struct i915_hdcp_ops gsc_hdcp_ops = {
> - .initiate_hdcp2_session = intel_hdcp_gsc_initiate_session,
> - .verify_receiver_cert_prepare_km =
> -
> intel_hdcp_gsc_verify_receiver_cert_prepare_km,
> - .verify_hprime = intel_hdcp_gsc_verify_hprime,
> - .store_pairing_info = intel_hdcp_gsc_store_pairing_info,
> - .initiate_locality_check = intel_hdcp_gsc_initiate_locality_check,
> - .verify_lprime = intel_hdcp_gsc_verify_lprime,
> - .get_session_key = intel_hdcp_gsc_get_session_key,
> - .repeater_check_flow_prepare_ack =
> -
> intel_hdcp_gsc_repeater_check_flow_prepare_ack,
> - .verify_mprime = intel_hdcp_gsc_verify_mprime,
> - .enable_hdcp_authentication =
> intel_hdcp_gsc_enable_authentication,
> - .close_hdcp_session = intel_hdcp_gsc_close_session,
> -};
> -
> -static int intel_hdcp_gsc_hdcp2_init(struct intel_display *display)
> +int 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; @@ -131,7 +114,7
> @@ static int intel_hdcp_gsc_hdcp2_init(struct intel_display *display)
> return ret;
> }
>
> -static void intel_hdcp_gsc_free_message(struct intel_display *display)
> +void intel_hdcp_gsc_free_message(struct intel_display *display)
> {
> struct intel_hdcp_gsc_message *hdcp_message =
> display->hdcp.hdcp_message;
> @@ -142,31 +125,6 @@ static void intel_hdcp_gsc_free_message(struct
> intel_display *display)
> kfree(hdcp_message);
> }
>
> -int intel_hdcp_gsc_init(struct intel_display *display) -{
> - struct i915_hdcp_arbiter *data;
> - int ret;
> -
> - data = kzalloc(sizeof(struct i915_hdcp_arbiter), GFP_KERNEL);
> - if (!data)
> - return -ENOMEM;
> -
> - mutex_lock(&display->hdcp.hdcp_mutex);
> - display->hdcp.arbiter = data;
> - display->hdcp.arbiter->hdcp_dev = display->drm->dev;
> - display->hdcp.arbiter->ops = &gsc_hdcp_ops;
> - ret = intel_hdcp_gsc_hdcp2_init(display);
> - mutex_unlock(&display->hdcp.hdcp_mutex);
> -
> - return ret;
> -}
> -
> -void intel_hdcp_gsc_fini(struct intel_display *display) -{
> - intel_hdcp_gsc_free_message(display);
> - kfree(display->hdcp.arbiter);
> -}
> -
> static int intel_gsc_send_sync(struct drm_i915_private *i915,
> struct intel_gsc_mtl_header *header_in,
> struct intel_gsc_mtl_header *header_out, diff --git
> a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> index 5695a5e4f609..ad41e7e80095 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> @@ -17,8 +17,9 @@ bool intel_hdcp_gsc_cs_required(struct intel_display
> *display); ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8
> *msg_in,
> size_t msg_in_len, u8 *msg_out,
> size_t msg_out_len);
> -int intel_hdcp_gsc_init(struct intel_display *display); -void
> intel_hdcp_gsc_fini(struct intel_display *display); 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);
> +
> #endif /* __INTEL_HDCP_GCS_H__ */
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c
> b/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c
> index d4620b54beba..8e2aafff71d5 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c
> @@ -11,7 +11,7 @@
> #include "intel_hdcp_gsc.h"
> #include "intel_hdcp_gsc_message.h"
>
> -int
> +static int
> intel_hdcp_gsc_initiate_session(struct device *dev, struct hdcp_port_data
> *data,
> struct hdcp2_ake_init *ake_data)
> {
> @@ -65,7 +65,7 @@ intel_hdcp_gsc_initiate_session(struct device *dev, struct
> hdcp_port_data *data,
> return 0;
> }
>
> -int
> +static int
> intel_hdcp_gsc_verify_receiver_cert_prepare_km(struct device *dev,
> struct hdcp_port_data *data,
> struct hdcp2_ake_send_cert
> *rx_cert, @@ -135,7 +135,7 @@
> intel_hdcp_gsc_verify_receiver_cert_prepare_km(struct device *dev,
> return 0;
> }
>
> -int
> +static int
> intel_hdcp_gsc_verify_hprime(struct device *dev, struct hdcp_port_data
> *data,
> struct hdcp2_ake_send_hprime *rx_hprime) { @@ -
> 185,7 +185,7 @@ intel_hdcp_gsc_verify_hprime(struct device *dev, struct
> hdcp_port_data *data,
> return 0;
> }
>
> -int
> +static int
> intel_hdcp_gsc_store_pairing_info(struct device *dev, struct hdcp_port_data
> *data,
> struct hdcp2_ake_send_pairing_info
> *pairing_info) { @@ -237,7 +237,7 @@
> intel_hdcp_gsc_store_pairing_info(struct device *dev, struct hdcp_port_data
> *dat
> return 0;
> }
>
> -int
> +static int
> intel_hdcp_gsc_initiate_locality_check(struct device *dev,
> struct hdcp_port_data *data,
> struct hdcp2_lc_init *lc_init_data) @@ -
> 286,7 +286,7 @@ intel_hdcp_gsc_initiate_locality_check(struct device *dev,
> return 0;
> }
>
> -int
> +static int
> intel_hdcp_gsc_verify_lprime(struct device *dev, struct hdcp_port_data *data,
> struct hdcp2_lc_send_lprime *rx_lprime) { @@ -
> 338,9 +338,10 @@ intel_hdcp_gsc_verify_lprime(struct device *dev, struct
> hdcp_port_data *data,
> return 0;
> }
>
> -int intel_hdcp_gsc_get_session_key(struct device *dev,
> - struct hdcp_port_data *data,
> - struct hdcp2_ske_send_eks *ske_data)
> +static int
> +intel_hdcp_gsc_get_session_key(struct device *dev,
> + struct hdcp_port_data *data,
> + struct hdcp2_ske_send_eks *ske_data)
> {
> struct wired_cmd_get_session_key_in get_skey_in = {};
> struct wired_cmd_get_session_key_out get_skey_out = {}; @@ -388,7
> +389,7 @@ int intel_hdcp_gsc_get_session_key(struct device *dev,
> return 0;
> }
>
> -int
> +static int
> intel_hdcp_gsc_repeater_check_flow_prepare_ack(struct device *dev,
> struct hdcp_port_data *data,
> struct
> hdcp2_rep_send_receiverid_list @@ -454,9 +455,10 @@
> intel_hdcp_gsc_repeater_check_flow_prepare_ack(struct device *dev,
> return 0;
> }
>
> -int intel_hdcp_gsc_verify_mprime(struct device *dev,
> - struct hdcp_port_data *data,
> - struct hdcp2_rep_stream_ready
> *stream_ready)
> +static int
> +intel_hdcp_gsc_verify_mprime(struct device *dev,
> + struct hdcp_port_data *data,
> + struct hdcp2_rep_stream_ready *stream_ready)
> {
> struct wired_cmd_repeater_auth_stream_req_in *verify_mprime_in;
> struct wired_cmd_repeater_auth_stream_req_out verify_mprime_out
> = {}; @@ -519,8 +521,8 @@ int intel_hdcp_gsc_verify_mprime(struct device
> *dev,
> return 0;
> }
>
> -int intel_hdcp_gsc_enable_authentication(struct device *dev,
> - struct hdcp_port_data *data)
> +static int intel_hdcp_gsc_enable_authentication(struct device *dev,
> + struct hdcp_port_data *data)
> {
> struct wired_cmd_enable_auth_in enable_auth_in = {};
> struct wired_cmd_enable_auth_out enable_auth_out = {}; @@ -566,7
> +568,7 @@ int intel_hdcp_gsc_enable_authentication(struct device *dev,
> return 0;
> }
>
> -int
> +static int
> intel_hdcp_gsc_close_session(struct device *dev, struct hdcp_port_data
> *data) {
> struct wired_cmd_close_session_in session_close_in = {}; @@ -612,3
> +614,53 @@ intel_hdcp_gsc_close_session(struct device *dev, struct
> hdcp_port_data *data)
>
> return 0;
> }
> +
> +static const struct i915_hdcp_ops gsc_hdcp_ops = {
> + .initiate_hdcp2_session = intel_hdcp_gsc_initiate_session,
> + .verify_receiver_cert_prepare_km =
> +
> intel_hdcp_gsc_verify_receiver_cert_prepare_km,
> + .verify_hprime = intel_hdcp_gsc_verify_hprime,
> + .store_pairing_info = intel_hdcp_gsc_store_pairing_info,
> + .initiate_locality_check = intel_hdcp_gsc_initiate_locality_check,
> + .verify_lprime = intel_hdcp_gsc_verify_lprime,
> + .get_session_key = intel_hdcp_gsc_get_session_key,
> + .repeater_check_flow_prepare_ack =
> +
> intel_hdcp_gsc_repeater_check_flow_prepare_ack,
> + .verify_mprime = intel_hdcp_gsc_verify_mprime,
> + .enable_hdcp_authentication =
> intel_hdcp_gsc_enable_authentication,
> + .close_hdcp_session = intel_hdcp_gsc_close_session, };
> +
> +int intel_hdcp_gsc_init(struct intel_display *display) {
> + struct i915_hdcp_arbiter *arbiter;
> + int ret;
> +
> + arbiter = kzalloc(sizeof(*arbiter), GFP_KERNEL);
> + if (!arbiter)
> + return -ENOMEM;
> +
> + mutex_lock(&display->hdcp.hdcp_mutex);
> +
> + ret = intel_hdcp_gsc_hdcp2_init(display);
> + if (ret) {
> + kfree(arbiter);
> + goto out;
> + }
> +
> + display->hdcp.arbiter = arbiter;
> + display->hdcp.arbiter->hdcp_dev = display->drm->dev;
> + display->hdcp.arbiter->ops = &gsc_hdcp_ops;
> +
> +out:
> + mutex_unlock(&display->hdcp.hdcp_mutex);
> +
> + return ret;
> +}
> +
> +void intel_hdcp_gsc_fini(struct intel_display *display) {
> + intel_hdcp_gsc_free_message(display);
> + kfree(display->hdcp.arbiter);
> + display->hdcp.arbiter = NULL;
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.h
> b/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.h
> index 1af2f7c745fd..9f54157a4a3e 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.h
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.h
> @@ -6,63 +6,9 @@
> #ifndef __INTEL_HDCP_GSC_MESSAGE_H__
> #define __INTEL_HDCP_GSC_MESSAGE_H__
>
> -#include <linux/types.h>
> -
> -struct device;
> -struct hdcp_port_data;
> -struct hdcp2_ake_init;
> -struct hdcp2_ake_send_cert;
> -struct hdcp2_ake_no_stored_km;
> -struct hdcp2_ake_send_hprime;
> -struct hdcp2_ake_send_pairing_info;
> -struct hdcp2_lc_init;
> -struct hdcp2_lc_send_lprime;
> -struct hdcp2_ske_send_eks;
> -struct hdcp2_rep_send_receiverid_list;
> -struct hdcp2_rep_send_ack;
> -struct hdcp2_rep_stream_ready;
> struct intel_display;
>
> -int
> -intel_hdcp_gsc_initiate_session(struct device *dev, struct hdcp_port_data
> *data,
> - struct hdcp2_ake_init *ake_data);
> -int
> -intel_hdcp_gsc_verify_receiver_cert_prepare_km(struct device *dev,
> - struct hdcp_port_data *data,
> - struct hdcp2_ake_send_cert
> *rx_cert,
> - bool *km_stored,
> - struct hdcp2_ake_no_stored_km
> - *ek_pub_km,
> - size_t *msg_sz);
> -int
> -intel_hdcp_gsc_verify_hprime(struct device *dev, struct hdcp_port_data
> *data,
> - struct hdcp2_ake_send_hprime *rx_hprime);
> -int
> -intel_hdcp_gsc_store_pairing_info(struct device *dev, struct hdcp_port_data
> *data,
> - struct hdcp2_ake_send_pairing_info
> *pairing_info);
> -int
> -intel_hdcp_gsc_initiate_locality_check(struct device *dev,
> - struct hdcp_port_data *data,
> - struct hdcp2_lc_init *lc_init_data);
> -int
> -intel_hdcp_gsc_verify_lprime(struct device *dev, struct hdcp_port_data
> *data,
> - struct hdcp2_lc_send_lprime *rx_lprime);
> -int intel_hdcp_gsc_get_session_key(struct device *dev,
> - struct hdcp_port_data *data,
> - struct hdcp2_ske_send_eks *ske_data);
> -int
> -intel_hdcp_gsc_repeater_check_flow_prepare_ack(struct device *dev,
> - struct hdcp_port_data *data,
> - struct
> hdcp2_rep_send_receiverid_list
> - *rep_topology,
> - struct hdcp2_rep_send_ack
> - *rep_send_ack);
> -int intel_hdcp_gsc_verify_mprime(struct device *dev,
> - struct hdcp_port_data *data,
> - struct hdcp2_rep_stream_ready
> *stream_ready);
> -int intel_hdcp_gsc_enable_authentication(struct device *dev,
> - struct hdcp_port_data *data);
> -int
> -intel_hdcp_gsc_close_session(struct device *dev, struct hdcp_port_data
> *data);
> +int intel_hdcp_gsc_init(struct intel_display *display); void
> +intel_hdcp_gsc_fini(struct intel_display *display);
>
> #endif /* __INTEL_HDCP_GSC_MESSAGE_H__ */ diff --git
> a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c
> b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c
> index 7c02323e9531..21cfecf077bf 100644
> --- a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c
> +++ b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c
> @@ -9,7 +9,6 @@
>
> #include "abi/gsc_command_header_abi.h"
> #include "intel_hdcp_gsc.h"
> -#include "intel_hdcp_gsc_message.h"
> #include "xe_bo.h"
> #include "xe_device.h"
> #include "xe_device_types.h"
> @@ -100,7 +99,7 @@ static int intel_hdcp_gsc_initialize_message(struct
> intel_display *display,
> return ret;
> }
>
> -static int intel_hdcp_gsc_hdcp2_init(struct intel_display *display)
> +int intel_hdcp_gsc_hdcp2_init(struct intel_display *display)
> {
> struct intel_hdcp_gsc_message *hdcp_message;
> int ret;
> @@ -125,58 +124,15 @@ static int intel_hdcp_gsc_hdcp2_init(struct
> intel_display *display)
> return ret;
> }
>
> -static const struct i915_hdcp_ops gsc_hdcp_ops = {
> - .initiate_hdcp2_session = intel_hdcp_gsc_initiate_session,
> - .verify_receiver_cert_prepare_km =
> -
> intel_hdcp_gsc_verify_receiver_cert_prepare_km,
> - .verify_hprime = intel_hdcp_gsc_verify_hprime,
> - .store_pairing_info = intel_hdcp_gsc_store_pairing_info,
> - .initiate_locality_check = intel_hdcp_gsc_initiate_locality_check,
> - .verify_lprime = intel_hdcp_gsc_verify_lprime,
> - .get_session_key = intel_hdcp_gsc_get_session_key,
> - .repeater_check_flow_prepare_ack =
> -
> intel_hdcp_gsc_repeater_check_flow_prepare_ack,
> - .verify_mprime = intel_hdcp_gsc_verify_mprime,
> - .enable_hdcp_authentication =
> intel_hdcp_gsc_enable_authentication,
> - .close_hdcp_session = intel_hdcp_gsc_close_session,
> -};
> -
> -int intel_hdcp_gsc_init(struct intel_display *display) -{
> - struct i915_hdcp_arbiter *data;
> - int ret;
> -
> - data = kzalloc(sizeof(*data), GFP_KERNEL);
> - if (!data)
> - return -ENOMEM;
> -
> - mutex_lock(&display->hdcp.hdcp_mutex);
> - display->hdcp.arbiter = data;
> - display->hdcp.arbiter->hdcp_dev = display->drm->dev;
> - display->hdcp.arbiter->ops = &gsc_hdcp_ops;
> - ret = intel_hdcp_gsc_hdcp2_init(display);
> - if (ret)
> - kfree(data);
> -
> - mutex_unlock(&display->hdcp.hdcp_mutex);
> -
> - return ret;
> -}
> -
> -void intel_hdcp_gsc_fini(struct intel_display *display)
> +void intel_hdcp_gsc_free_message(struct intel_display *display)
> {
> - struct intel_hdcp_gsc_message *hdcp_message =
> - display->hdcp.hdcp_message;
> - struct i915_hdcp_arbiter *arb = display->hdcp.arbiter;
> + struct intel_hdcp_gsc_message *hdcp_message =
> +display->hdcp.hdcp_message;
>
> if (hdcp_message) {
> xe_bo_unpin_map_no_vm(hdcp_message->hdcp_bo);
> kfree(hdcp_message);
> display->hdcp.hdcp_message = NULL;
> }
> -
> - kfree(arb);
> - display->hdcp.arbiter = NULL;
> }
>
> static int xe_gsc_send_sync(struct xe_device *xe,
> --
> 2.39.5
More information about the Intel-xe
mailing list