Message ID | 1522763873-23041-23-git-send-email-ramalingam.c@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
>-----Original Message----- >From: Intel-gfx [mailto:intel-gfx-bounces@lists.freedesktop.org] On Behalf Of >Ramalingam C >Sent: Tuesday, April 3, 2018 7:28 PM >To: intel-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org; >seanpaul@chromium.org; daniel@ffwll.ch; chris@chris-wilson.co.uk; >jani.nikula@linux.intel.com; Winkler, Tomas <tomas.winkler@intel.com>; >Usyskin, Alexander <alexander.usyskin@intel.com> >Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >Subject: [Intel-gfx] [PATCH v3 22/40] drm/i915: Wrappers for mei HDCP2.2 >services > >Adds the wrapper for all mei hdcp2.2 service functions. > >v2: > Rebased. >v3: > cldev is moved from mei_hdcp_data to hdcp. > >Signed-off-by: Ramalingam C <ramalingam.c@intel.com> >--- > drivers/gpu/drm/i915/intel_hdcp.c | 194 >++++++++++++++++++++++++++++++++++++++ > 1 file changed, 194 insertions(+) > >diff --git a/drivers/gpu/drm/i915/intel_hdcp.c >b/drivers/gpu/drm/i915/intel_hdcp.c >index 1cca4f349064..b4d56b21cf9b 100644 >--- a/drivers/gpu/drm/i915/intel_hdcp.c >+++ b/drivers/gpu/drm/i915/intel_hdcp.c >@@ -10,10 +10,13 @@ > #include <drm/drm_hdcp.h> > #include <linux/i2c.h> > #include <linux/random.h> >+#include <linux/mei_hdcp.h> > > #include "intel_drv.h" > #include "i915_reg.h" > >+#define GET_MEI_DDI_INDEX(port) (((port) == PORT_A) ? DDI_A : \ >+ (enum hdcp_physical_port) (port)) > #define KEY_LOAD_TRIES 5 > > static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port, @@ - >817,3 +820,194 @@ int intel_hdcp_check_link(struct intel_connector >*connector) > mutex_unlock(&hdcp->hdcp_mutex); > return ret; > } >+ >+static int >+hdcp2_prepare_ake_init(struct intel_hdcp *hdcp, struct hdcp2_ake_init >+*ake_data) { >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ struct intel_connector *connector = container_of(hdcp, >+ struct intel_connector, >+ hdcp); >+ >+ if (!hdcp->cldev) >+ return -EINVAL; >+ >+ if (data->port == INVALID_PORT && connector->encoder) >+ data->port = GET_MEI_DDI_INDEX(connector->encoder->port); I believe caller should provide valid port and this should fail if port received is invalid instead of retrieving it here. >+ >+ /* Clear ME FW instance for the port, just incase */ >+ mei_close_hdcp_session(hdcp->cldev, data); >+ >+ return mei_initiate_hdcp2_session(hdcp->cldev, data, ake_data); } >+ >+static int hdcp2_close_mei_session(struct intel_hdcp *hdcp) { >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ >+ if (!hdcp->cldev || data->port == INVALID_PORT) This is what I was saying for above. >+ return -EINVAL; >+ >+ return mei_close_hdcp_session(hdcp->cldev, data); } >+ >+static int >+hdcp2_verify_rx_cert_prepare_km(struct intel_hdcp *hdcp, >+ struct hdcp2_ake_send_cert *rx_cert, >+ bool *paired, >+ struct hdcp2_ake_no_stored_km *ek_pub_km, >+ size_t *msg_sz) >+{ >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ int ret; >+ >+ if (!hdcp->cldev) >+ return -EINVAL; >+ >+ ret = mei_verify_receiver_cert_prepare_km(hdcp->cldev, data, rx_cert, >+ paired, ek_pub_km, msg_sz); >+ if (ret < 0) >+ mei_close_hdcp_session(hdcp->cldev, data); >+ >+ return ret; >+} >+ >+static int hdcp2_verify_hprime(struct intel_hdcp *hdcp, >+ struct hdcp2_ake_send_hprime *rx_hprime) { >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ int ret; >+ >+ if (!hdcp->cldev) >+ return -EINVAL; >+ >+ ret = mei_verify_hprime(hdcp->cldev, data, rx_hprime); >+ if (ret < 0) >+ mei_close_hdcp_session(hdcp->cldev, data); >+ >+ return ret; >+} >+ >+static int >+hdcp2_store_paring_info(struct intel_hdcp *hdcp, >+ struct hdcp2_ake_send_pairing_info *pairing_info) { >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ int ret; >+ >+ if (!hdcp->cldev) >+ return -EINVAL; >+ >+ ret = mei_store_pairing_info(hdcp->cldev, data, pairing_info); >+ if (ret < 0) >+ mei_close_hdcp_session(hdcp->cldev, data); >+ >+ return ret; >+} >+ >+static int >+hdcp2_prepare_lc_init(struct intel_hdcp *hdcp, struct hdcp2_lc_init >+*lc_init) { >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ int ret; >+ >+ if (!hdcp->cldev) >+ return -EINVAL; >+ >+ ret = mei_initiate_locality_check(hdcp->cldev, data, lc_init); >+ if (ret < 0) >+ mei_close_hdcp_session(hdcp->cldev, data); >+ >+ return ret; >+} >+ >+static int >+hdcp2_verify_lprime(struct intel_hdcp *hdcp, >+ struct hdcp2_lc_send_lprime *rx_lprime) { >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ int ret; >+ >+ if (!hdcp->cldev) >+ return -EINVAL; >+ >+ ret = mei_verify_lprime(hdcp->cldev, data, rx_lprime); >+ if (ret < 0) >+ mei_close_hdcp_session(hdcp->cldev, data); >+ >+ return ret; >+} >+ >+static int hdcp2_prepare_skey(struct intel_hdcp *hdcp, >+ struct hdcp2_ske_send_eks *ske_data) { >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ int ret; >+ >+ if (!hdcp->cldev) >+ return -EINVAL; >+ >+ ret = mei_get_session_key(hdcp->cldev, data, ske_data); >+ if (ret < 0) >+ mei_close_hdcp_session(hdcp->cldev, data); >+ >+ return ret; >+} >+ >+static int >+hdcp2_verify_rep_topology_prepare_ack( >+ struct intel_hdcp *hdcp, >+ struct hdcp2_rep_send_receiverid_list *rep_topology, >+ struct hdcp2_rep_send_ack *rep_send_ack) { >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ int ret; >+ >+ if (!hdcp->cldev) >+ return -EINVAL; >+ >+ ret = mei_repeater_check_flow_prepare_ack(hdcp->cldev, data, >+ rep_topology, rep_send_ack); >+ if (ret < 0) >+ mei_close_hdcp_session(hdcp->cldev, data); >+ >+ return ret; >+} >+ >+static int >+hdcp2_verify_mprime(struct intel_hdcp *hdcp, >+ struct hdcp2_rep_stream_ready *stream_ready) { >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ int ret; >+ >+ if (!hdcp->cldev) >+ return -EINVAL; >+ >+ ret = mei_verify_mprime(hdcp->cldev, data, stream_ready); >+ if (ret < 0) >+ mei_close_hdcp_session(hdcp->cldev, data); >+ >+ return ret; >+} >+ >+ >+static int hdcp2_authenticate_port(struct intel_hdcp *hdcp) { >+ struct mei_hdcp_data *data = &hdcp->mei_data; >+ int ret; >+ >+ if (!hdcp->cldev) >+ return -EINVAL; >+ >+ ret = mei_enable_hdcp_authentication(hdcp->cldev, data); >+ if (ret < 0) >+ mei_close_hdcp_session(hdcp->cldev, data); >+ >+ return ret; >+} >+ >+static inline int hdcp2_deauthenticate_port(struct intel_hdcp *hdcp) { >+ return hdcp2_close_mei_session(hdcp); >+} >-- >2.7.4 > >_______________________________________________ >Intel-gfx mailing list >Intel-gfx@lists.freedesktop.org >https://lists.freedesktop.org/mailman/listinfo/intel-gfx
On Wednesday 09 May 2018 08:40 PM, Shankar, Uma wrote: > >> -----Original Message----- >> From: Intel-gfx [mailto:intel-gfx-bounces@lists.freedesktop.org] On Behalf Of >> Ramalingam C >> Sent: Tuesday, April 3, 2018 7:28 PM >> To: intel-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org; >> seanpaul@chromium.org; daniel@ffwll.ch; chris@chris-wilson.co.uk; >> jani.nikula@linux.intel.com; Winkler, Tomas <tomas.winkler@intel.com>; >> Usyskin, Alexander <alexander.usyskin@intel.com> >> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >> Subject: [Intel-gfx] [PATCH v3 22/40] drm/i915: Wrappers for mei HDCP2.2 >> services >> >> Adds the wrapper for all mei hdcp2.2 service functions. >> >> v2: >> Rebased. >> v3: >> cldev is moved from mei_hdcp_data to hdcp. >> >> Signed-off-by: Ramalingam C <ramalingam.c@intel.com> >> --- >> drivers/gpu/drm/i915/intel_hdcp.c | 194 >> ++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 194 insertions(+) >> >> diff --git a/drivers/gpu/drm/i915/intel_hdcp.c >> b/drivers/gpu/drm/i915/intel_hdcp.c >> index 1cca4f349064..b4d56b21cf9b 100644 >> --- a/drivers/gpu/drm/i915/intel_hdcp.c >> +++ b/drivers/gpu/drm/i915/intel_hdcp.c >> @@ -10,10 +10,13 @@ >> #include <drm/drm_hdcp.h> >> #include <linux/i2c.h> >> #include <linux/random.h> >> +#include <linux/mei_hdcp.h> >> >> #include "intel_drv.h" >> #include "i915_reg.h" >> >> +#define GET_MEI_DDI_INDEX(port) (((port) == PORT_A) ? DDI_A : \ >> + (enum hdcp_physical_port) (port)) >> #define KEY_LOAD_TRIES 5 >> >> static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port, @@ - >> 817,3 +820,194 @@ int intel_hdcp_check_link(struct intel_connector >> *connector) >> mutex_unlock(&hdcp->hdcp_mutex); >> return ret; >> } >> + >> +static int >> +hdcp2_prepare_ake_init(struct intel_hdcp *hdcp, struct hdcp2_ake_init >> +*ake_data) { >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + struct intel_connector *connector = container_of(hdcp, >> + struct intel_connector, >> + hdcp); >> + >> + if (!hdcp->cldev) >> + return -EINVAL; >> + >> + if (data->port == INVALID_PORT && connector->encoder) >> + data->port = GET_MEI_DDI_INDEX(connector->encoder->port); > I believe caller should provide valid port and this should fail if port received is invalid instead of > retrieving it here. Agreed. But at the initialization of mei_hdcp_data, if the encoder is not initialized, data->port will be uninitialized (invalid). So in that case at the start of the hdcp authentication we initialize the port. May be I am bit paranoid here! But on all other wrappers port needs to be valid. --Ram >> + >> + /* Clear ME FW instance for the port, just incase */ >> + mei_close_hdcp_session(hdcp->cldev, data); >> + >> + return mei_initiate_hdcp2_session(hdcp->cldev, data, ake_data); } >> + >> +static int hdcp2_close_mei_session(struct intel_hdcp *hdcp) { >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + >> + if (!hdcp->cldev || data->port == INVALID_PORT) > This is what I was saying for above. > >> + return -EINVAL; >> + >> + return mei_close_hdcp_session(hdcp->cldev, data); } >> + >> +static int >> +hdcp2_verify_rx_cert_prepare_km(struct intel_hdcp *hdcp, >> + struct hdcp2_ake_send_cert *rx_cert, >> + bool *paired, >> + struct hdcp2_ake_no_stored_km *ek_pub_km, >> + size_t *msg_sz) >> +{ >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + int ret; >> + >> + if (!hdcp->cldev) >> + return -EINVAL; >> + >> + ret = mei_verify_receiver_cert_prepare_km(hdcp->cldev, data, rx_cert, >> + paired, ek_pub_km, msg_sz); >> + if (ret < 0) >> + mei_close_hdcp_session(hdcp->cldev, data); >> + >> + return ret; >> +} >> + >> +static int hdcp2_verify_hprime(struct intel_hdcp *hdcp, >> + struct hdcp2_ake_send_hprime *rx_hprime) { >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + int ret; >> + >> + if (!hdcp->cldev) >> + return -EINVAL; >> + >> + ret = mei_verify_hprime(hdcp->cldev, data, rx_hprime); >> + if (ret < 0) >> + mei_close_hdcp_session(hdcp->cldev, data); >> + >> + return ret; >> +} >> + >> +static int >> +hdcp2_store_paring_info(struct intel_hdcp *hdcp, >> + struct hdcp2_ake_send_pairing_info *pairing_info) { >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + int ret; >> + >> + if (!hdcp->cldev) >> + return -EINVAL; >> + >> + ret = mei_store_pairing_info(hdcp->cldev, data, pairing_info); >> + if (ret < 0) >> + mei_close_hdcp_session(hdcp->cldev, data); >> + >> + return ret; >> +} >> + >> +static int >> +hdcp2_prepare_lc_init(struct intel_hdcp *hdcp, struct hdcp2_lc_init >> +*lc_init) { >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + int ret; >> + >> + if (!hdcp->cldev) >> + return -EINVAL; >> + >> + ret = mei_initiate_locality_check(hdcp->cldev, data, lc_init); >> + if (ret < 0) >> + mei_close_hdcp_session(hdcp->cldev, data); >> + >> + return ret; >> +} >> + >> +static int >> +hdcp2_verify_lprime(struct intel_hdcp *hdcp, >> + struct hdcp2_lc_send_lprime *rx_lprime) { >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + int ret; >> + >> + if (!hdcp->cldev) >> + return -EINVAL; >> + >> + ret = mei_verify_lprime(hdcp->cldev, data, rx_lprime); >> + if (ret < 0) >> + mei_close_hdcp_session(hdcp->cldev, data); >> + >> + return ret; >> +} >> + >> +static int hdcp2_prepare_skey(struct intel_hdcp *hdcp, >> + struct hdcp2_ske_send_eks *ske_data) { >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + int ret; >> + >> + if (!hdcp->cldev) >> + return -EINVAL; >> + >> + ret = mei_get_session_key(hdcp->cldev, data, ske_data); >> + if (ret < 0) >> + mei_close_hdcp_session(hdcp->cldev, data); >> + >> + return ret; >> +} >> + >> +static int >> +hdcp2_verify_rep_topology_prepare_ack( >> + struct intel_hdcp *hdcp, >> + struct hdcp2_rep_send_receiverid_list *rep_topology, >> + struct hdcp2_rep_send_ack *rep_send_ack) { >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + int ret; >> + >> + if (!hdcp->cldev) >> + return -EINVAL; >> + >> + ret = mei_repeater_check_flow_prepare_ack(hdcp->cldev, data, >> + rep_topology, rep_send_ack); >> + if (ret < 0) >> + mei_close_hdcp_session(hdcp->cldev, data); >> + >> + return ret; >> +} >> + >> +static int >> +hdcp2_verify_mprime(struct intel_hdcp *hdcp, >> + struct hdcp2_rep_stream_ready *stream_ready) { >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + int ret; >> + >> + if (!hdcp->cldev) >> + return -EINVAL; >> + >> + ret = mei_verify_mprime(hdcp->cldev, data, stream_ready); >> + if (ret < 0) >> + mei_close_hdcp_session(hdcp->cldev, data); >> + >> + return ret; >> +} >> + >> + >> +static int hdcp2_authenticate_port(struct intel_hdcp *hdcp) { >> + struct mei_hdcp_data *data = &hdcp->mei_data; >> + int ret; >> + >> + if (!hdcp->cldev) >> + return -EINVAL; >> + >> + ret = mei_enable_hdcp_authentication(hdcp->cldev, data); >> + if (ret < 0) >> + mei_close_hdcp_session(hdcp->cldev, data); >> + >> + return ret; >> +} >> + >> +static inline int hdcp2_deauthenticate_port(struct intel_hdcp *hdcp) { >> + return hdcp2_close_mei_session(hdcp); >> +} >> -- >> 2.7.4 >> >> _______________________________________________ >> Intel-gfx mailing list >> Intel-gfx@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c index 1cca4f349064..b4d56b21cf9b 100644 --- a/drivers/gpu/drm/i915/intel_hdcp.c +++ b/drivers/gpu/drm/i915/intel_hdcp.c @@ -10,10 +10,13 @@ #include <drm/drm_hdcp.h> #include <linux/i2c.h> #include <linux/random.h> +#include <linux/mei_hdcp.h> #include "intel_drv.h" #include "i915_reg.h" +#define GET_MEI_DDI_INDEX(port) (((port) == PORT_A) ? DDI_A : \ + (enum hdcp_physical_port) (port)) #define KEY_LOAD_TRIES 5 static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port, @@ -817,3 +820,194 @@ int intel_hdcp_check_link(struct intel_connector *connector) mutex_unlock(&hdcp->hdcp_mutex); return ret; } + +static int +hdcp2_prepare_ake_init(struct intel_hdcp *hdcp, struct hdcp2_ake_init *ake_data) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + struct intel_connector *connector = container_of(hdcp, + struct intel_connector, + hdcp); + + if (!hdcp->cldev) + return -EINVAL; + + if (data->port == INVALID_PORT && connector->encoder) + data->port = GET_MEI_DDI_INDEX(connector->encoder->port); + + /* Clear ME FW instance for the port, just incase */ + mei_close_hdcp_session(hdcp->cldev, data); + + return mei_initiate_hdcp2_session(hdcp->cldev, data, ake_data); +} + +static int hdcp2_close_mei_session(struct intel_hdcp *hdcp) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + + if (!hdcp->cldev || data->port == INVALID_PORT) + return -EINVAL; + + return mei_close_hdcp_session(hdcp->cldev, data); +} + +static int +hdcp2_verify_rx_cert_prepare_km(struct intel_hdcp *hdcp, + struct hdcp2_ake_send_cert *rx_cert, + bool *paired, + struct hdcp2_ake_no_stored_km *ek_pub_km, + size_t *msg_sz) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + int ret; + + if (!hdcp->cldev) + return -EINVAL; + + ret = mei_verify_receiver_cert_prepare_km(hdcp->cldev, data, rx_cert, + paired, ek_pub_km, msg_sz); + if (ret < 0) + mei_close_hdcp_session(hdcp->cldev, data); + + return ret; +} + +static int hdcp2_verify_hprime(struct intel_hdcp *hdcp, + struct hdcp2_ake_send_hprime *rx_hprime) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + int ret; + + if (!hdcp->cldev) + return -EINVAL; + + ret = mei_verify_hprime(hdcp->cldev, data, rx_hprime); + if (ret < 0) + mei_close_hdcp_session(hdcp->cldev, data); + + return ret; +} + +static int +hdcp2_store_paring_info(struct intel_hdcp *hdcp, + struct hdcp2_ake_send_pairing_info *pairing_info) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + int ret; + + if (!hdcp->cldev) + return -EINVAL; + + ret = mei_store_pairing_info(hdcp->cldev, data, pairing_info); + if (ret < 0) + mei_close_hdcp_session(hdcp->cldev, data); + + return ret; +} + +static int +hdcp2_prepare_lc_init(struct intel_hdcp *hdcp, struct hdcp2_lc_init *lc_init) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + int ret; + + if (!hdcp->cldev) + return -EINVAL; + + ret = mei_initiate_locality_check(hdcp->cldev, data, lc_init); + if (ret < 0) + mei_close_hdcp_session(hdcp->cldev, data); + + return ret; +} + +static int +hdcp2_verify_lprime(struct intel_hdcp *hdcp, + struct hdcp2_lc_send_lprime *rx_lprime) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + int ret; + + if (!hdcp->cldev) + return -EINVAL; + + ret = mei_verify_lprime(hdcp->cldev, data, rx_lprime); + if (ret < 0) + mei_close_hdcp_session(hdcp->cldev, data); + + return ret; +} + +static int hdcp2_prepare_skey(struct intel_hdcp *hdcp, + struct hdcp2_ske_send_eks *ske_data) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + int ret; + + if (!hdcp->cldev) + return -EINVAL; + + ret = mei_get_session_key(hdcp->cldev, data, ske_data); + if (ret < 0) + mei_close_hdcp_session(hdcp->cldev, data); + + return ret; +} + +static int +hdcp2_verify_rep_topology_prepare_ack( + struct intel_hdcp *hdcp, + struct hdcp2_rep_send_receiverid_list *rep_topology, + struct hdcp2_rep_send_ack *rep_send_ack) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + int ret; + + if (!hdcp->cldev) + return -EINVAL; + + ret = mei_repeater_check_flow_prepare_ack(hdcp->cldev, data, + rep_topology, rep_send_ack); + if (ret < 0) + mei_close_hdcp_session(hdcp->cldev, data); + + return ret; +} + +static int +hdcp2_verify_mprime(struct intel_hdcp *hdcp, + struct hdcp2_rep_stream_ready *stream_ready) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + int ret; + + if (!hdcp->cldev) + return -EINVAL; + + ret = mei_verify_mprime(hdcp->cldev, data, stream_ready); + if (ret < 0) + mei_close_hdcp_session(hdcp->cldev, data); + + return ret; +} + + +static int hdcp2_authenticate_port(struct intel_hdcp *hdcp) +{ + struct mei_hdcp_data *data = &hdcp->mei_data; + int ret; + + if (!hdcp->cldev) + return -EINVAL; + + ret = mei_enable_hdcp_authentication(hdcp->cldev, data); + if (ret < 0) + mei_close_hdcp_session(hdcp->cldev, data); + + return ret; +} + +static inline int hdcp2_deauthenticate_port(struct intel_hdcp *hdcp) +{ + return hdcp2_close_mei_session(hdcp); +}
Adds the wrapper for all mei hdcp2.2 service functions. v2: Rebased. v3: cldev is moved from mei_hdcp_data to hdcp. Signed-off-by: Ramalingam C <ramalingam.c@intel.com> --- drivers/gpu/drm/i915/intel_hdcp.c | 194 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+)