Commit 287c0de8 authored by Suraj Kandpal's avatar Suraj Kandpal Committed by Ankit Nautiyal

drm/i915/hdcp: Move to direct reads for HDCP

Even for MST scenarios we need to do direct reads only on the
immediate downstream device the rest of the authentication is taken
care by that device. Remote reads will only be used to check
capability of the monitors in MST topology.

--v2
-Add fixes tag [Ankit]
-Derive aux where needed rather than through a function [Ankit]

Fixes: ae4f902b ("drm/i915/hdcp: Send the correct aux for DPMST HDCP scenario")
Signed-off-by: default avatarSuraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: default avatarAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: default avatarAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240223081453.1576918-3-suraj.kandpal@intel.com
parent 20af1084
...@@ -333,23 +333,13 @@ static const struct hdcp2_dp_msg_data hdcp2_dp_msg_data[] = { ...@@ -333,23 +333,13 @@ static const struct hdcp2_dp_msg_data hdcp2_dp_msg_data[] = {
0, 0 }, 0, 0 },
}; };
static struct drm_dp_aux *
intel_dp_hdcp_get_aux(struct intel_connector *connector)
{
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
if (intel_encoder_is_mst(connector->encoder))
return &connector->port->aux;
else
return &dig_port->dp.aux;
}
static int static int
intel_dp_hdcp2_read_rx_status(struct intel_connector *connector, intel_dp_hdcp2_read_rx_status(struct intel_connector *connector,
u8 *rx_status) u8 *rx_status)
{ {
struct drm_i915_private *i915 = to_i915(connector->base.dev); struct drm_i915_private *i915 = to_i915(connector->base.dev);
struct drm_dp_aux *aux = intel_dp_hdcp_get_aux(connector); struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
struct drm_dp_aux *aux = &dig_port->dp.aux;
ssize_t ret; ssize_t ret;
ret = drm_dp_dpcd_read(aux, ret = drm_dp_dpcd_read(aux,
...@@ -458,8 +448,9 @@ int intel_dp_hdcp2_write_msg(struct intel_connector *connector, ...@@ -458,8 +448,9 @@ int intel_dp_hdcp2_write_msg(struct intel_connector *connector,
unsigned int offset; unsigned int offset;
u8 *byte = buf; u8 *byte = buf;
ssize_t ret, bytes_to_write, len; ssize_t ret, bytes_to_write, len;
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
struct drm_dp_aux *aux = &dig_port->dp.aux;
const struct hdcp2_dp_msg_data *hdcp2_msg_data; const struct hdcp2_dp_msg_data *hdcp2_msg_data;
struct drm_dp_aux *aux;
hdcp2_msg_data = get_hdcp2_dp_msg_data(*byte); hdcp2_msg_data = get_hdcp2_dp_msg_data(*byte);
if (!hdcp2_msg_data) if (!hdcp2_msg_data)
...@@ -467,8 +458,6 @@ int intel_dp_hdcp2_write_msg(struct intel_connector *connector, ...@@ -467,8 +458,6 @@ int intel_dp_hdcp2_write_msg(struct intel_connector *connector,
offset = hdcp2_msg_data->offset; offset = hdcp2_msg_data->offset;
aux = intel_dp_hdcp_get_aux(connector);
/* No msg_id in DP HDCP2.2 msgs */ /* No msg_id in DP HDCP2.2 msgs */
bytes_to_write = size - 1; bytes_to_write = size - 1;
byte++; byte++;
...@@ -494,7 +483,8 @@ static ...@@ -494,7 +483,8 @@ static
ssize_t get_receiver_id_list_rx_info(struct intel_connector *connector, ssize_t get_receiver_id_list_rx_info(struct intel_connector *connector,
u32 *dev_cnt, u8 *byte) u32 *dev_cnt, u8 *byte)
{ {
struct drm_dp_aux *aux = intel_dp_hdcp_get_aux(connector); struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
struct drm_dp_aux *aux = &dig_port->dp.aux;
ssize_t ret; ssize_t ret;
u8 *rx_info = byte; u8 *rx_info = byte;
...@@ -520,7 +510,7 @@ int intel_dp_hdcp2_read_msg(struct intel_connector *connector, ...@@ -520,7 +510,7 @@ int intel_dp_hdcp2_read_msg(struct intel_connector *connector,
struct intel_digital_port *dig_port = intel_attached_dig_port(connector); struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
struct intel_hdcp *hdcp = &connector->hdcp; struct intel_hdcp *hdcp = &connector->hdcp;
struct drm_dp_aux *aux; struct drm_dp_aux *aux = &dig_port->dp.aux;
unsigned int offset; unsigned int offset;
u8 *byte = buf; u8 *byte = buf;
ssize_t ret, bytes_to_recv, len; ssize_t ret, bytes_to_recv, len;
...@@ -534,8 +524,6 @@ int intel_dp_hdcp2_read_msg(struct intel_connector *connector, ...@@ -534,8 +524,6 @@ int intel_dp_hdcp2_read_msg(struct intel_connector *connector,
return -EINVAL; return -EINVAL;
offset = hdcp2_msg_data->offset; offset = hdcp2_msg_data->offset;
aux = intel_dp_hdcp_get_aux(connector);
ret = intel_dp_hdcp2_wait_for_msg(connector, hdcp2_msg_data); ret = intel_dp_hdcp2_wait_for_msg(connector, hdcp2_msg_data);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -655,12 +643,11 @@ static ...@@ -655,12 +643,11 @@ static
int intel_dp_hdcp2_capable(struct intel_connector *connector, int intel_dp_hdcp2_capable(struct intel_connector *connector,
bool *capable) bool *capable)
{ {
struct drm_dp_aux *aux; struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
struct drm_dp_aux *aux = &dig_port->dp.aux;
u8 rx_caps[3]; u8 rx_caps[3];
int ret; int ret;
aux = intel_dp_hdcp_get_aux(connector);
*capable = false; *capable = false;
ret = drm_dp_dpcd_read(aux, ret = drm_dp_dpcd_read(aux,
DP_HDCP_2_2_REG_RX_CAPS_OFFSET, DP_HDCP_2_2_REG_RX_CAPS_OFFSET,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment