> From: Nikula, Jani <[email protected]> > Sent: Tuesday, November 25, 2025 10:48 PM > To: [email protected]; [email protected] > Cc: Nikula, Jani <[email protected]>; Kandpal, Suraj > <[email protected]> > Subject: [PATCH 2/2] drm/{i915,xe}/hdcp: use parent interface for HDCP GSC > calls > > The HDCP GSC implementation is different for both i915 and xe. Add it to the > display parent interface, and call the hooks via the parent interface. > > Signed-off-by: Jani Nikula <[email protected]>
LGTM, Reviewed-by: Suraj Kandpal <[email protected]> > --- > drivers/gpu/drm/i915/display/intel_hdcp.c | 4 +- > drivers/gpu/drm/i915/display/intel_hdcp_gsc.h | 22 ------ > .../drm/i915/display/intel_hdcp_gsc_message.c | 78 +++++++++---------- > drivers/gpu/drm/i915/display/intel_parent.c | 24 ++++++ > drivers/gpu/drm/i915/display/intel_parent.h | 10 +++ > drivers/gpu/drm/i915/i915_driver.c | 2 + > drivers/gpu/drm/i915/i915_hdcp_gsc.c | 22 ++++-- > drivers/gpu/drm/i915/i915_hdcp_gsc.h | 9 +++ > drivers/gpu/drm/xe/display/xe_display.c | 2 + > drivers/gpu/drm/xe/display/xe_hdcp_gsc.c | 25 ++++-- > drivers/gpu/drm/xe/display/xe_hdcp_gsc.h | 9 +++ > include/drm/intel/display_parent_interface.h | 13 ++++ > 12 files changed, 139 insertions(+), 81 deletions(-) delete mode 100644 > drivers/gpu/drm/i915/display/intel_hdcp_gsc.h > create mode 100644 drivers/gpu/drm/i915/i915_hdcp_gsc.h > create mode 100644 drivers/gpu/drm/xe/display/xe_hdcp_gsc.h > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c > b/drivers/gpu/drm/i915/display/intel_hdcp.c > index 5e1a96223a9c..7114fc405c29 100644 > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c > @@ -29,10 +29,10 @@ > #include "intel_display_types.h" > #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_parent.h" > #include "intel_pcode.h" > #include "intel_step.h" > > @@ -258,7 +258,7 @@ static bool intel_hdcp2_prerequisite(struct > intel_connector *connector) > > /* If MTL+ make sure gsc is loaded and proxy is setup */ > if (USE_HDCP_GSC(display)) { > - if (!intel_hdcp_gsc_check_status(display->drm)) > + if (!intel_parent_hdcp_gsc_check_status(display)) > return false; > } > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h > deleted file mode 100644 > index 9305c14aaffe..000000000000 > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h > +++ /dev/null > @@ -1,22 +0,0 @@ > -/* SPDX-License-Identifier: MIT */ > -/* > - * Copyright © 2023 Intel Corporation > - */ > - > -#ifndef __INTEL_HDCP_GSC_H__ > -#define __INTEL_HDCP_GSC_H__ > - > -#include <linux/types.h> > - > -struct drm_device; > -struct intel_hdcp_gsc_context; > - > -ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context, > - void *msg_in, size_t msg_in_len, > - void *msg_out, size_t msg_out_len); > -bool intel_hdcp_gsc_check_status(struct drm_device *drm); > - > -struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct > drm_device *drm); -void intel_hdcp_gsc_context_free(struct > intel_hdcp_gsc_context *gsc_context); > - > -#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 98967bb148e3..781667b710b4 100644 > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c > @@ -10,8 +10,8 @@ > > #include "intel_display_core.h" > #include "intel_display_types.h" > -#include "intel_hdcp_gsc.h" > #include "intel_hdcp_gsc_message.h" > +#include "intel_parent.h" > > static int > intel_hdcp_gsc_initiate_session(struct device *dev, struct hdcp_port_data > *data, @@ -44,10 +44,9 @@ intel_hdcp_gsc_initiate_session(struct device > *dev, struct hdcp_port_data *data, > session_init_in.port.attached_transcoder = (u8)data- > >hdcp_transcoder; > session_init_in.protocol = data->protocol; > > - byte = intel_hdcp_gsc_msg_send(gsc_context, &session_init_in, > - sizeof(session_init_in), > - &session_init_out, > - sizeof(session_init_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + &session_init_in, > sizeof(session_init_in), > + &session_init_out, > sizeof(session_init_out)); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. > %zd\n", byte); > return byte; > @@ -106,10 +105,9 @@ > intel_hdcp_gsc_verify_receiver_cert_prepare_km(struct device *dev, > memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN); > memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps, > HDCP_2_2_RXCAPS_LEN); > > - byte = intel_hdcp_gsc_msg_send(gsc_context, &verify_rxcert_in, > - sizeof(verify_rxcert_in), > - &verify_rxcert_out, > - sizeof(verify_rxcert_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + &verify_rxcert_in, > sizeof(verify_rxcert_in), > + &verify_rxcert_out, > sizeof(verify_rxcert_out)); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed: > %zd\n", byte); > return byte; > @@ -169,10 +167,9 @@ intel_hdcp_gsc_verify_hprime(struct device *dev, > struct hdcp_port_data *data, > memcpy(send_hprime_in.h_prime, rx_hprime->h_prime, > HDCP_2_2_H_PRIME_LEN); > > - byte = intel_hdcp_gsc_msg_send(gsc_context, &send_hprime_in, > - sizeof(send_hprime_in), > - &send_hprime_out, > - sizeof(send_hprime_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + &send_hprime_in, > sizeof(send_hprime_in), > + &send_hprime_out, > sizeof(send_hprime_out)); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. > %zd\n", byte); > return byte; > @@ -220,10 +217,9 @@ intel_hdcp_gsc_store_pairing_info(struct device *dev, > struct hdcp_port_data *dat > memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km, > HDCP_2_2_E_KH_KM_LEN); > > - byte = intel_hdcp_gsc_msg_send(gsc_context, &pairing_info_in, > - sizeof(pairing_info_in), > - &pairing_info_out, > - sizeof(pairing_info_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + &pairing_info_in, > sizeof(pairing_info_in), > + &pairing_info_out, > sizeof(pairing_info_out)); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. > %zd\n", byte); > return byte; > @@ -269,8 +265,9 @@ intel_hdcp_gsc_initiate_locality_check(struct device > *dev, > lc_init_in.port.physical_port = (u8)data->hdcp_ddi; > lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder; > > - byte = intel_hdcp_gsc_msg_send(gsc_context, &lc_init_in, > sizeof(lc_init_in), > - &lc_init_out, sizeof(lc_init_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + &lc_init_in, sizeof(lc_init_in), > + &lc_init_out, > sizeof(lc_init_out)); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. > %zd\n", byte); > return byte; > @@ -321,10 +318,9 @@ intel_hdcp_gsc_verify_lprime(struct device *dev, > struct hdcp_port_data *data, > memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime, > HDCP_2_2_L_PRIME_LEN); > > - byte = intel_hdcp_gsc_msg_send(gsc_context, &verify_lprime_in, > - sizeof(verify_lprime_in), > - &verify_lprime_out, > - sizeof(verify_lprime_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + &verify_lprime_in, > sizeof(verify_lprime_in), > + &verify_lprime_out, > sizeof(verify_lprime_out)); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. > %zd\n", byte); > return byte; > @@ -370,8 +366,9 @@ intel_hdcp_gsc_get_session_key(struct device *dev, > get_skey_in.port.physical_port = (u8)data->hdcp_ddi; > get_skey_in.port.attached_transcoder = (u8)data->hdcp_transcoder; > > - byte = intel_hdcp_gsc_msg_send(gsc_context, &get_skey_in, > sizeof(get_skey_in), > - &get_skey_out, sizeof(get_skey_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + &get_skey_in, sizeof(get_skey_in), > + &get_skey_out, > sizeof(get_skey_out)); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. > %zd\n", byte); > return byte; > @@ -434,10 +431,9 @@ > intel_hdcp_gsc_repeater_check_flow_prepare_ack(struct device *dev, > memcpy(verify_repeater_in.receiver_ids, rep_topology->receiver_ids, > HDCP_2_2_RECEIVER_IDS_MAX_LEN); > > - byte = intel_hdcp_gsc_msg_send(gsc_context, &verify_repeater_in, > - sizeof(verify_repeater_in), > - &verify_repeater_out, > - sizeof(verify_repeater_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + &verify_repeater_in, > sizeof(verify_repeater_in), > + &verify_repeater_out, > sizeof(verify_repeater_out)); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. > %zd\n", byte); > return byte; > @@ -504,9 +500,9 @@ intel_hdcp_gsc_verify_mprime(struct device *dev, > > verify_mprime_in->k = cpu_to_be16(data->k); > > - byte = intel_hdcp_gsc_msg_send(gsc_context, verify_mprime_in, > cmd_size, > - &verify_mprime_out, > - sizeof(verify_mprime_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + verify_mprime_in, cmd_size, > + &verify_mprime_out, > sizeof(verify_mprime_out)); > kfree(verify_mprime_in); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. > %zd\n", byte); @@ -552,10 +548,9 @@ static int > intel_hdcp_gsc_enable_authentication(struct device *dev, > enable_auth_in.port.attached_transcoder = (u8)data- > >hdcp_transcoder; > enable_auth_in.stream_type = data->streams[0].stream_type; > > - byte = intel_hdcp_gsc_msg_send(gsc_context, &enable_auth_in, > - sizeof(enable_auth_in), > - &enable_auth_out, > - sizeof(enable_auth_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + &enable_auth_in, > sizeof(enable_auth_in), > + &enable_auth_out, > sizeof(enable_auth_out)); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. > %zd\n", byte); > return byte; > @@ -599,10 +594,9 @@ intel_hdcp_gsc_close_session(struct device *dev, > struct hdcp_port_data *data) > session_close_in.port.physical_port = (u8)data->hdcp_ddi; > session_close_in.port.attached_transcoder = (u8)data- > >hdcp_transcoder; > > - byte = intel_hdcp_gsc_msg_send(gsc_context, &session_close_in, > - sizeof(session_close_in), > - &session_close_out, > - sizeof(session_close_out)); > + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, > + &session_close_in, > sizeof(session_close_in), > + &session_close_out, > sizeof(session_close_out)); > if (byte < 0) { > drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. > %zd\n", byte); > return byte; > @@ -645,7 +639,7 @@ int intel_hdcp_gsc_init(struct intel_display *display) > > mutex_lock(&display->hdcp.hdcp_mutex); > > - gsc_context = intel_hdcp_gsc_context_alloc(display->drm); > + gsc_context = intel_parent_hdcp_gsc_context_alloc(display); > if (IS_ERR(gsc_context)) { > ret = PTR_ERR(gsc_context); > kfree(arbiter); > @@ -665,7 +659,7 @@ int intel_hdcp_gsc_init(struct intel_display *display) > > void intel_hdcp_gsc_fini(struct intel_display *display) { > - intel_hdcp_gsc_context_free(display->hdcp.gsc_context); > + intel_parent_hdcp_gsc_context_free(display, > +display->hdcp.gsc_context); > display->hdcp.gsc_context = NULL; > kfree(display->hdcp.arbiter); > display->hdcp.arbiter = NULL; > diff --git a/drivers/gpu/drm/i915/display/intel_parent.c > b/drivers/gpu/drm/i915/display/intel_parent.c > index 27c7ef34ce48..2ea310cc3509 100644 > --- a/drivers/gpu/drm/i915/display/intel_parent.c > +++ b/drivers/gpu/drm/i915/display/intel_parent.c > @@ -22,6 +22,30 @@ > #include "intel_display_core.h" > #include "intel_parent.h" > > +ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display, > + struct intel_hdcp_gsc_context > *gsc_context, > + void *msg_in, size_t msg_in_len, > + void *msg_out, size_t msg_out_len) { > + return display->parent->hdcp->gsc_msg_send(gsc_context, msg_in, > +msg_in_len, msg_out, msg_out_len); } > + > +bool intel_parent_hdcp_gsc_check_status(struct intel_display *display) > +{ > + return display->parent->hdcp->gsc_check_status(display->drm); > +} > + > +struct intel_hdcp_gsc_context > +*intel_parent_hdcp_gsc_context_alloc(struct intel_display *display) { > + return display->parent->hdcp->gsc_context_alloc(display->drm); > +} > + > +void intel_parent_hdcp_gsc_context_free(struct intel_display *display, > + struct intel_hdcp_gsc_context > *gsc_context) { > + display->parent->hdcp->gsc_context_free(gsc_context); > +} > + > bool intel_parent_irq_enabled(struct intel_display *display) { > return display->parent->irq->enabled(display->drm); > diff --git a/drivers/gpu/drm/i915/display/intel_parent.h > b/drivers/gpu/drm/i915/display/intel_parent.h > index a8ca40b57ea9..8f91a6f75c53 100644 > --- a/drivers/gpu/drm/i915/display/intel_parent.h > +++ b/drivers/gpu/drm/i915/display/intel_parent.h > @@ -8,6 +8,16 @@ > > struct dma_fence; > struct intel_display; > +struct intel_hdcp_gsc_context; > + > +ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display, > + struct intel_hdcp_gsc_context > *gsc_context, > + void *msg_in, size_t msg_in_len, > + void *msg_out, size_t msg_out_len); bool > +intel_parent_hdcp_gsc_check_status(struct intel_display *display); > +struct intel_hdcp_gsc_context > +*intel_parent_hdcp_gsc_context_alloc(struct intel_display *display); void > intel_parent_hdcp_gsc_context_free(struct intel_display *display, > + struct intel_hdcp_gsc_context > *gsc_context); > > bool intel_parent_irq_enabled(struct intel_display *display); void > intel_parent_irq_synchronize(struct intel_display *display); diff --git > a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c > index db0dd25f734d..d98839427ef9 100644 > --- a/drivers/gpu/drm/i915/i915_driver.c > +++ b/drivers/gpu/drm/i915/i915_driver.c > @@ -96,6 +96,7 @@ > #include "i915_file_private.h" > #include "i915_getparam.h" > #include "i915_gmch.h" > +#include "i915_hdcp_gsc.h" > #include "i915_hwmon.h" > #include "i915_ioc32.h" > #include "i915_ioctl.h" > @@ -757,6 +758,7 @@ static void fence_priority_display(struct dma_fence > *fence) } > > static const struct intel_display_parent_interface parent = { > + .hdcp = &i915_display_hdcp_interface, > .rpm = &i915_display_rpm_interface, > .irq = &i915_display_irq_interface, > .rps = &i915_display_rps_interface, > diff --git a/drivers/gpu/drm/i915/i915_hdcp_gsc.c > b/drivers/gpu/drm/i915/i915_hdcp_gsc.c > index 38df5318e13a..9906da2aef1c 100644 > --- a/drivers/gpu/drm/i915/i915_hdcp_gsc.c > +++ b/drivers/gpu/drm/i915/i915_hdcp_gsc.c > @@ -4,13 +4,14 @@ > */ > > #include <drm/drm_print.h> > +#include <drm/intel/display_parent_interface.h> > #include <drm/intel/i915_hdcp_interface.h> > > -#include "display/intel_hdcp_gsc.h" > #include "gem/i915_gem_region.h" > #include "gt/intel_gt.h" > #include "gt/uc/intel_gsc_uc_heci_cmd_submit.h" > #include "i915_drv.h" > +#include "i915_hdcp_gsc.h" > > struct intel_hdcp_gsc_context { > struct drm_i915_private *i915; > @@ -19,7 +20,7 @@ struct intel_hdcp_gsc_context { > void *hdcp_cmd_out; > }; > > -bool intel_hdcp_gsc_check_status(struct drm_device *drm) > +static bool intel_hdcp_gsc_check_status(struct drm_device *drm) > { > struct drm_i915_private *i915 = to_i915(drm); > struct intel_gt *gt = i915->media_gt; > @@ -87,7 +88,7 @@ static int intel_hdcp_gsc_initialize_message(struct > drm_i915_private *i915, > return err; > } > > -struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct > drm_device *drm) > +static struct intel_hdcp_gsc_context > +*intel_hdcp_gsc_context_alloc(struct drm_device *drm) > { > struct drm_i915_private *i915 = to_i915(drm); > struct intel_hdcp_gsc_context *gsc_context; @@ -111,7 +112,7 @@ > struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct > drm_device *d > return gsc_context; > } > > -void intel_hdcp_gsc_context_free(struct intel_hdcp_gsc_context *gsc_context) > +static void intel_hdcp_gsc_context_free(struct intel_hdcp_gsc_context > +*gsc_context) > { > if (!gsc_context) > return; > @@ -168,9 +169,9 @@ static int intel_gsc_send_sync(struct drm_i915_private > *i915, > * gsc cs memory header as stated in specs after which the normal HDCP > payload > * will follow > */ > -ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context, > - void *msg_in, size_t msg_in_len, > - void *msg_out, size_t msg_out_len) > +static ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context > *gsc_context, > + void *msg_in, size_t msg_in_len, > + void *msg_out, size_t msg_out_len) > { > struct drm_i915_private *i915 = gsc_context->i915; > struct intel_gt *gt = i915->media_gt; > @@ -237,3 +238,10 @@ ssize_t intel_hdcp_gsc_msg_send(struct > intel_hdcp_gsc_context *gsc_context, > err: > return ret; > } > + > +const struct intel_display_hdcp_interface i915_display_hdcp_interface = { > + .gsc_msg_send = intel_hdcp_gsc_msg_send, > + .gsc_check_status = intel_hdcp_gsc_check_status, > + .gsc_context_alloc = intel_hdcp_gsc_context_alloc, > + .gsc_context_free = intel_hdcp_gsc_context_free, }; > diff --git a/drivers/gpu/drm/i915/i915_hdcp_gsc.h > b/drivers/gpu/drm/i915/i915_hdcp_gsc.h > new file mode 100644 > index 000000000000..e0b562cfcde3 > --- /dev/null > +++ b/drivers/gpu/drm/i915/i915_hdcp_gsc.h > @@ -0,0 +1,9 @@ > +/* SPDX-License-Identifier: MIT */ > +/* Copyright © 2025 Intel Corporation */ > + > +#ifndef __I915_HDCP_GSC_H__ > +#define __I915_HDCP_GSC_H__ > + > +extern const struct intel_display_hdcp_interface > +i915_display_hdcp_interface; > + > +#endif /* __I915_HDCP_GSC_H__ */ > diff --git a/drivers/gpu/drm/xe/display/xe_display.c > b/drivers/gpu/drm/xe/display/xe_display.c > index 793115077615..9d2aa69ea428 100644 > --- a/drivers/gpu/drm/xe/display/xe_display.c > +++ b/drivers/gpu/drm/xe/display/xe_display.c > @@ -37,6 +37,7 @@ > #include "skl_watermark.h" > #include "xe_display_rpm.h" > #include "xe_module.h" > +#include "xe_hdcp_gsc.h" > > /* Ensure drm and display members are placed properly. */ > INTEL_DISPLAY_MEMBER_STATIC_ASSERT(struct xe_device, drm, display); @@ > -534,6 +535,7 @@ static const struct intel_display_irq_interface > xe_display_irq_interface = { }; > > static const struct intel_display_parent_interface parent = { > + .hdcp = &xe_display_hdcp_interface, > .rpm = &xe_display_rpm_interface, > .irq = &xe_display_irq_interface, > }; > diff --git a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c > b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c > index 71d21fde1736..07acae121aa7 100644 > --- a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c > +++ b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c > @@ -3,18 +3,20 @@ > * Copyright 2023, Intel Corporation. > */ > > +#include <linux/delay.h> > + > #include <drm/drm_print.h> > +#include <drm/intel/display_parent_interface.h> > #include <drm/intel/i915_hdcp_interface.h> -#include <linux/delay.h> > > #include "abi/gsc_command_header_abi.h" > -#include "intel_hdcp_gsc.h" > #include "xe_bo.h" > #include "xe_device.h" > #include "xe_device_types.h" > #include "xe_force_wake.h" > #include "xe_gsc_proxy.h" > #include "xe_gsc_submit.h" > +#include "xe_hdcp_gsc.h" > #include "xe_map.h" > #include "xe_pm.h" > #include "xe_uc_fw.h" > @@ -30,7 +32,7 @@ struct intel_hdcp_gsc_context { > > #define HDCP_GSC_HEADER_SIZE sizeof(struct intel_gsc_mtl_header) > > -bool intel_hdcp_gsc_check_status(struct drm_device *drm) > +static bool intel_hdcp_gsc_check_status(struct drm_device *drm) > { > struct xe_device *xe = to_xe_device(drm); > struct xe_tile *tile = xe_device_get_root_tile(xe); @@ -87,7 +89,7 @@ > static int intel_hdcp_gsc_initialize_message(struct xe_device *xe, > return ret; > } > > -struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct > drm_device *drm) > +static struct intel_hdcp_gsc_context > +*intel_hdcp_gsc_context_alloc(struct drm_device *drm) > { > struct xe_device *xe = to_xe_device(drm); > struct intel_hdcp_gsc_context *gsc_context; @@ -111,7 +113,7 @@ > struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct > drm_device *d > return gsc_context; > } > > -void intel_hdcp_gsc_context_free(struct intel_hdcp_gsc_context *gsc_context) > +static void intel_hdcp_gsc_context_free(struct intel_hdcp_gsc_context > +*gsc_context) > { > if (!gsc_context) > return; > @@ -146,9 +148,9 @@ static int xe_gsc_send_sync(struct xe_device *xe, > return ret; > } > > -ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context, > - void *msg_in, size_t msg_in_len, > - void *msg_out, size_t msg_out_len) > +static ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context > *gsc_context, > + void *msg_in, size_t msg_in_len, > + void *msg_out, size_t msg_out_len) > { > struct xe_device *xe = gsc_context->xe; > const size_t max_msg_size = PAGE_SIZE - HDCP_GSC_HEADER_SIZE; > @@ -198,3 +200,10 @@ ssize_t intel_hdcp_gsc_msg_send(struct > intel_hdcp_gsc_context *gsc_context, > > return ret; > } > + > +const struct intel_display_hdcp_interface xe_display_hdcp_interface = { > + .gsc_msg_send = intel_hdcp_gsc_msg_send, > + .gsc_check_status = intel_hdcp_gsc_check_status, > + .gsc_context_alloc = intel_hdcp_gsc_context_alloc, > + .gsc_context_free = intel_hdcp_gsc_context_free, }; > diff --git a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.h > b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.h > new file mode 100644 > index 000000000000..c1062e4b62f7 > --- /dev/null > +++ b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.h > @@ -0,0 +1,9 @@ > +/* SPDX-License-Identifier: MIT */ > +/* Copyright © 2025 Intel Corporation */ > + > +#ifndef __XE_HDCP_GSC_H__ > +#define __XE_HDCP_GSC_H__ > + > +extern const struct intel_display_hdcp_interface > +xe_display_hdcp_interface; > + > +#endif > diff --git a/include/drm/intel/display_parent_interface.h > b/include/drm/intel/display_parent_interface.h > index 4135d1e1a67e..61d1b22adc83 100644 > --- a/include/drm/intel/display_parent_interface.h > +++ b/include/drm/intel/display_parent_interface.h > @@ -8,6 +8,7 @@ > > struct dma_fence; > struct drm_device; > +struct intel_hdcp_gsc_context; > struct ref_tracker; > > struct intel_display_rpm_interface { > @@ -26,6 +27,15 @@ struct intel_display_rpm_interface { > void (*assert_unblock)(const struct drm_device *drm); }; > > +struct intel_display_hdcp_interface { > + ssize_t (*gsc_msg_send)(struct intel_hdcp_gsc_context *gsc_context, > + void *msg_in, size_t msg_in_len, > + void *msg_out, size_t msg_out_len); > + bool (*gsc_check_status)(struct drm_device *drm); > + struct intel_hdcp_gsc_context *(*gsc_context_alloc)(struct drm_device > *drm); > + void (*gsc_context_free)(struct intel_hdcp_gsc_context *gsc_context); > +}; > + > struct intel_display_irq_interface { > bool (*enabled)(struct drm_device *drm); > void (*synchronize)(struct drm_device *drm); @@ -50,6 +60,9 @@ > struct intel_display_rps_interface { > * check the optional pointers. > */ > struct intel_display_parent_interface { > + /** @hdcp: HDCP GSC interface */ > + const struct intel_display_hdcp_interface *hdcp; > + > /** @rpm: Runtime PM functions */ > const struct intel_display_rpm_interface *rpm; > > -- > 2.47.3
