Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/* SPDX-License-Identifier: MIT */
  2/* Copyright © 2024 Intel Corporation */
  3
  4#ifndef __INTEL_HDCP_SHIM_H__
  5#define __INTEL_HDCP_SHIM_H__
  6
  7#include <linux/types.h>
  8
  9#include <drm/intel/i915_hdcp_interface.h>
 10
 11enum transcoder;
 12struct intel_connector;
 13struct intel_digital_port;
 14
 15enum check_link_response {
 16	HDCP_LINK_PROTECTED	= 0,
 17	HDCP_TOPOLOGY_CHANGE,
 18	HDCP_LINK_INTEGRITY_FAILURE,
 19	HDCP_REAUTH_REQUEST
 20};
 21
 22/*
 23 * This structure serves as a translation layer between the generic HDCP code
 24 * and the bus-specific code. What that means is that HDCP over HDMI differs
 25 * from HDCP over DP, so to account for these differences, we need to
 26 * communicate with the receiver through this shim.
 27 *
 28 * For completeness, the 2 buses differ in the following ways:
 29 *	- DP AUX vs. DDC
 30 *		HDCP registers on the receiver are set via DP AUX for DP, and
 31 *		they are set via DDC for HDMI.
 32 *	- Receiver register offsets
 33 *		The offsets of the registers are different for DP vs. HDMI
 34 *	- Receiver register masks/offsets
 35 *		For instance, the ready bit for the KSV fifo is in a different
 36 *		place on DP vs HDMI
 37 *	- Receiver register names
 38 *		Seriously. In the DP spec, the 16-bit register containing
 39 *		downstream information is called BINFO, on HDMI it's called
 40 *		BSTATUS. To confuse matters further, DP has a BSTATUS register
 41 *		with a completely different definition.
 42 *	- KSV FIFO
 43 *		On HDMI, the ksv fifo is read all at once, whereas on DP it must
 44 *		be read 3 keys at a time
 45 *	- Aksv output
 46 *		Since Aksv is hidden in hardware, there's different procedures
 47 *		to send it over DP AUX vs DDC
 48 */
 49struct intel_hdcp_shim {
 50	/* Outputs the transmitter's An and Aksv values to the receiver. */
 51	int (*write_an_aksv)(struct intel_digital_port *dig_port, u8 *an);
 52
 53	/* Reads the receiver's key selection vector */
 54	int (*read_bksv)(struct intel_digital_port *dig_port, u8 *bksv);
 55
 56	/*
 57	 * Reads BINFO from DP receivers and BSTATUS from HDMI receivers. The
 58	 * definitions are the same in the respective specs, but the names are
 59	 * different. Call it BSTATUS since that's the name the HDMI spec
 60	 * uses and it was there first.
 61	 */
 62	int (*read_bstatus)(struct intel_digital_port *dig_port,
 63			    u8 *bstatus);
 64
 65	/* Determines whether a repeater is present downstream */
 66	int (*repeater_present)(struct intel_digital_port *dig_port,
 67				bool *repeater_present);
 68
 69	/* Reads the receiver's Ri' value */
 70	int (*read_ri_prime)(struct intel_digital_port *dig_port, u8 *ri);
 71
 72	/* Determines if the receiver's KSV FIFO is ready for consumption */
 73	int (*read_ksv_ready)(struct intel_digital_port *dig_port,
 74			      bool *ksv_ready);
 75
 76	/* Reads the ksv fifo for num_downstream devices */
 77	int (*read_ksv_fifo)(struct intel_digital_port *dig_port,
 78			     int num_downstream, u8 *ksv_fifo);
 79
 80	/* Reads a 32-bit part of V' from the receiver */
 81	int (*read_v_prime_part)(struct intel_digital_port *dig_port,
 82				 int i, u32 *part);
 83
 84	/* Enables HDCP signalling on the port */
 85	int (*toggle_signalling)(struct intel_digital_port *dig_port,
 86				 enum transcoder cpu_transcoder,
 87				 bool enable);
 88
 89	/* Enable/Disable stream encryption on DP MST Transport Link */
 90	int (*stream_encryption)(struct intel_connector *connector,
 91				 bool enable);
 92
 93	/* Ensures the link is still protected */
 94	bool (*check_link)(struct intel_digital_port *dig_port,
 95			   struct intel_connector *connector);
 96
 97	/* Detects panel's hdcp capability. This is optional for HDMI. */
 98	int (*hdcp_get_capability)(struct intel_digital_port *dig_port,
 99				   bool *hdcp_capable);
100
101	/* HDCP adaptation(DP/HDMI) required on the port */
102	enum hdcp_wired_protocol protocol;
103
104	/* Detects whether sink is HDCP2.2 capable */
105	int (*hdcp_2_2_get_capability)(struct intel_connector *connector,
106				       bool *capable);
107
108	/* Write HDCP2.2 messages */
109	int (*write_2_2_msg)(struct intel_connector *connector,
110			     void *buf, size_t size);
111
112	/* Read HDCP2.2 messages */
113	int (*read_2_2_msg)(struct intel_connector *connector,
114			    u8 msg_id, void *buf, size_t size);
115
116	/*
117	 * Implementation of DP HDCP2.2 Errata for the communication of stream
118	 * type to Receivers. In DP HDCP2.2 Stream type is one of the input to
119	 * the HDCP2.2 Cipher for En/De-Cryption. Not applicable for HDMI.
120	 */
121	int (*config_stream_type)(struct intel_connector *connector,
122				  bool is_repeater, u8 type);
123
124	/* Enable/Disable HDCP 2.2 stream encryption on DP MST Transport Link */
125	int (*stream_2_2_encryption)(struct intel_connector *connector,
126				     bool enable);
127
128	/* HDCP2.2 Link Integrity Check */
129	int (*check_2_2_link)(struct intel_digital_port *dig_port,
130			      struct intel_connector *connector);
131
132	/* HDCP remote sink cap */
133	int (*get_remote_hdcp_capability)(struct intel_connector *connector,
134					  bool *hdcp_capable, bool *hdcp2_capable);
135};
136
137#endif /* __INTEL_HDCP_SHIM_H__ */