diff mbox

[09/43] misc/mei/hdcp: Define ME FW interface for HDCP2.2

Message ID 1518617638-21684-10-git-send-email-ramalingam.c@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ramalingam C Feb. 14, 2018, 2:13 p.m. UTC
Defines the HDCP specific ME FW interfaces such as Request CMDs,
payload structure for CMDs and their response status codes.

This patch defines payload size(Excluding the Header)for each WIRED
HDCP2.2 CMDs.

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
 drivers/misc/mei/mei_hdcp.h | 525 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 525 insertions(+)
diff mbox

Patch

diff --git a/drivers/misc/mei/mei_hdcp.h b/drivers/misc/mei/mei_hdcp.h
index 7d792b5ad703..2bf720e20476 100644
--- a/drivers/misc/mei/mei_hdcp.h
+++ b/drivers/misc/mei/mei_hdcp.h
@@ -24,6 +24,8 @@ 
 #define __MEI_HDCP_H__
 
 #include <linux/mei_cl_bus.h>
+#include <linux/mei_hdcp.h>
+#include <drm/drm_hdcp.h>
 
 struct mei_hdcp {
 	struct mei_cl_device *cldev;
@@ -38,4 +40,527 @@  struct mei_hdcp {
 	int ref_cnt;
 };
 
+/**
+ * @enum me_status: Enumeration of all HDCP Status Codes
+ */
+enum me_status {
+	ME_HDCP_STATUS_SUCCESS			= 0x0000,
+
+	/* WiDi Generic Status Codes */
+	ME_HDCP_STATUS_INTERNAL_ERROR		= 0x1000,
+	ME_HDCP_STATUS_UNKNOWN_ERROR		= 0x1001,
+	ME_HDCP_STATUS_INCORRECT_API_VERSION	= 0x1002,
+	ME_HDCP_STATUS_INVALID_FUNCTION		= 0x1003,
+	ME_HDCP_STATUS_INVALID_BUFFER_LENGTH	= 0x1004,
+	ME_HDCP_STATUS_INVALID_PARAMS		= 0x1005,
+	ME_HDCP_STATUS_AUTHENTICATION_FAILED	= 0x1006,
+
+	/* WiDi Status Codes */
+	ME_HDCP_INVALID_SESSION_STATE		= 0x6000,
+	ME_HDCP_SRM_FRAGMENT_UNEXPECTED		= 0x6001,
+	ME_HDCP_SRM_INVALID_LENGTH		= 0x6002,
+	ME_HDCP_SRM_FRAGMENT_OFFSET_INVALID	= 0x6003,
+	ME_HDCP_SRM_VERIFICATION_FAILED		= 0x6004,
+	ME_HDCP_SRM_VERSION_TOO_OLD		= 0x6005,
+	ME_HDCP_RX_CERT_VERIFICATION_FAILED	= 0x6006,
+	ME_HDCP_RX_REVOKED			= 0x6007,
+	ME_HDCP_H_VERIFICATION_FAILED		= 0x6008,
+	ME_HDCP_REPEATER_CHECK_UNEXPECTED	= 0x6009,
+	ME_HDCP_TOPOLOGY_MAX_EXCEEDED		= 0x600A,
+	ME_HDCP_V_VERIFICATION_FAILED		= 0x600B,
+	ME_HDCP_L_VERIFICATION_FAILED		= 0x600C,
+	ME_HDCP_STREAM_KEY_ALLOC_FAILED		= 0x600D,
+	ME_HDCP_BASE_KEY_RESET_FAILED		= 0x600E,
+	ME_HDCP_NONCE_GENERATION_FAILED		= 0x600F,
+	ME_HDCP_STATUS_INVALID_E_KEY_STATE	= 0x6010,
+	ME_HDCP_STATUS_INVALID_CS_ICV		= 0x6011,
+	ME_HDCP_STATUS_INVALID_KB_KEY_STATE	= 0x6012,
+	ME_HDCP_STATUS_INVALID_PAVP_MODE_ICV	= 0x6013,
+	ME_HDCP_STATUS_INVALID_PAVP_MODE	= 0x6014,
+	ME_HDCP_STATUS_LC_MAX_ATTEMPTS		= 0x6015,
+
+	/* New status for HDCP 2.1 */
+	ME_HDCP_STATUS_MISMATCH_IN_M		= 0x6016,
+
+	/* New status code for HDCP 2.2 Rx */
+	ME_HDCP_STATUS_RX_PROV_NOT_ALLOWED	= 0x6017,
+	ME_HDCP_STATUS_RX_PROV_WRONG_SUBJECT	= 0x6018,
+	ME_HDCP_RX_NEEDS_PROVISIONING		= 0x6019,
+	ME_HDCP_BKSV_ICV_AUTH_FAILED		= 0x6020,
+	ME_HDCP_STATUS_INVALID_STREAM_ID	= 0x6021,
+	ME_HDCP_STATUS_CHAIN_NOT_INITIALIZED	= 0x6022,
+	ME_HDCP_FAIL_NOT_EXPECTED		= 0x6023,
+	ME_HDCP_FAIL_HDCP_OFF			= 0x6024,
+	ME_HDCP_FAIL_INVALID_PAVP_MEMORY_MODE	= 0x6025,
+	ME_HDCP_FAIL_AES_ECB_FAILURE		= 0x6026,
+	ME_HDCP_FEATURE_NOT_SUPPORTED		= 0x6027,
+	ME_HDCP_DMA_READ_ERROR			= 0x6028,
+	ME_HDCP_DMA_WRITE_ERROR			= 0x6029,
+	ME_HDCP_FAIL_INVALID_PACKET_SIZE	= 0x6030,
+	ME_HDCP_H264_PARSING_ERROR		= 0x6031,
+	ME_HDCP_HDCP2_ERRATA_VIDEO_VIOLATION	= 0x6032,
+	ME_HDCP_HDCP2_ERRATA_AUDIO_VIOLATION	= 0x6033,
+	ME_HDCP_TX_ACTIVE_ERROR			= 0x6034,
+	ME_HDCP_MODE_CHANGE_ERROR		= 0x6035,
+	ME_HDCP_STREAM_TYPE_ERROR		= 0x6036,
+	ME_HDCP_STREAM_MANAGE_NOT_POSSIBLE	= 0x6037,
+
+	ME_HDCP_STATUS_PORT_INVALID_COMMAND	= 0x6038,
+	ME_HDCP_STATUS_UNSUPPORTED_PROTOCOL	= 0x6039,
+	ME_HDCP_STATUS_INVALID_PORT_INDEX	= 0x603a,
+	ME_HDCP_STATUS_TX_AUTH_NEEDED		= 0x603b,
+	ME_HDCP_STATUS_NOT_INTEGRATED_PORT	= 0x603c,
+	ME_HDCP_STATUS_SESSION_MAX_REACHED	= 0x603d,
+
+	/* hdcp capable bit is not set in rx_caps(error is unique to DP) */
+	ME_HDCP_STATUS_NOT_HDCP_CAPABLE		= 0x6041,
+
+	ME_HDCP_STATUS_INVALID_STREAM_COUNT	= 0x6042,
+};
+
+#define HDCP_API_VERSION				0x00010000
+
+#define HDCP_M_LEN					16
+#define HDCP_KH_LEN					16
+
+/*
+ * Payload Buffer size(Excluding Header) for each CMD and corresponding response
+ */
+/* Wired_Tx_AKE  */
+#define	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN	(4 + 1)
+#define	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_OUT	(4 + 8 + 3)
+
+#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN	(4 + 522 + 8 + 3)
+#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_MIN_OUT	(4 + 1 + 3 + 16 + 16)
+#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_MAX_OUT	(4 + 1 + 3 + 128)
+
+#define	WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN		(4 + 32)
+#define	WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_OUT		(4)
+
+#define	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN		(4 + 16)
+#define	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_OUT		(4)
+
+#define	WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN		(4)
+#define	WIRED_CMD_BUF_LEN_CLOSE_SESSION_OUT		(4)
+
+/* Wired_Tx_LC */
+#define	WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN	(4)
+#define	WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_OUT	(4 + 8)
+
+#define	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN		(4 + 32)
+#define	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_OUT		(4)
+
+/* Wired_Tx_SKE */
+#define	WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN		(4)
+#define	WIRED_CMD_BUF_LEN_GET_SESSION_KEY_OUT		(4 + 16 + 8)
+
+/* Wired_Tx_SKE */
+#define	WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN		(4 + 1)
+#define	WIRED_CMD_BUF_LEN_ENABLE_AUTH_OUT		(4)
+
+/* Wired_Tx_Repeater */
+#define	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN		(4 + 2 + 3 + 16 + 155)
+#define	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_OUT		(4 + 1 + 16)
+
+#define	WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_MIN_IN	(4 + 3 + \
+								32 + 2 + 2)
+
+#define	WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_OUT		(4)
+
+
+/**
+ * @enum hdcp_command_id Enumeration of all WIRED HDCP Command IDs
+ */
+enum hdcp_command_id {
+	_WIDI_COMMAND_BASE		= 0x00030000,
+	WIDI_INITIATE_HDCP2_SESSION	= _WIDI_COMMAND_BASE,
+	HDCP_GET_SRM_STATUS,
+	HDCP_SEND_SRM_FRAGMENT,
+
+	/* The wired HDCP Tx commands */
+	_WIRED_COMMAND_BASE		= 0x00031000,
+	WIRED_INITIATE_HDCP2_SESSION	= _WIRED_COMMAND_BASE,
+	WIRED_VERIFY_RECEIVER_CERT,
+	WIRED_AKE_SEND_HPRIME,
+	WIRED_AKE_SEND_PAIRING_INFO,
+	WIRED_INIT_LOCALITY_CHECK,
+	WIRED_VALIDATE_LOCALITY,
+	WIRED_GET_SESSION_KEY,
+	WIRED_ENABLE_AUTH,
+	WIRED_VERIFY_REPEATER,
+	WIRED_REPEATER_AUTH_STREAM_REQ,
+	WIRED_CLOSE_SESSION,
+
+	_WIRED_COMMANDS_COUNT,
+};
+
+union encrypted_buff {
+	uint8_t		e_kpub_km[HDCP_E_KPUB_KM_LEN];
+	uint8_t		e_kh_km_m[HDCP_E_KH_KM_M_LEN];
+	struct {
+		uint8_t e_kh_km[HDCP_KH_LEN];
+		uint8_t m[HDCP_M_LEN];
+	} __packed;
+};
+
+/**
+ * @brief HDCP HECI message header.
+ * @note All header values are little endian.
+ */
+struct hdcp_cmd_header {
+	uint32_t	api_version;
+	uint32_t	command_id;
+	enum me_status	status;
+	/* Length of the HECI message (excluding the header) */
+	uint32_t	buffer_len;
+} __packed;
+
+/* @brief Empty command request or response. No data follows the header. */
+struct hdcp_cmd_no_data {
+	struct hdcp_cmd_header header;
+} __packed;
+
+/*
+ * @brief Uniquely identifies the hdcp port being
+ * addressed for a given command.
+ */
+struct hdcp_port_id {
+	uint8_t		integrated_port_type;
+	uint8_t		physical_port;
+	uint16_t	reserved;
+} __packed;
+
+
+/** --------------------------------------------------------------
+ * Data structures for integrated wired HDCP2 Tx in
+ * support of the AKE protocol
+ */
+
+/**
+ * HECI Integrated wired HDCP Tx session initiation command
+ *
+ * The command below is in support of Initiating an integrated
+ * wired HDCP Tx session.
+ *	command ID: WIRED_INITIATE_HDCP2_SESSION
+ *
+ * Corresponds to the AKE_Init from the HDCP DP, HDMI specs.
+ *
+ * return:
+ *	HDCP_STATUS_SUCCESS - Command completed correctly.
+ *	HDCP_INVALID_SESSION_STATE - This command can not be called
+ *					during an active session.
+ *	A call to WIRED_CMD_CLOSE_SESSION_IN must be made to destroy
+ *	an old HDCP Tx session.
+ */
+
+/**
+ * HECI Input struct for integrated wired HDCP Tx session initiation.
+ */
+struct wired_cmd_initiate_hdcp2_session_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t			protocol; /* for HDMI vs DP */
+} __packed;
+
+struct wired_cmd_initiate_hdcp2_session_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t			r_tx[HDCP_RTX_LEN];
+	struct hdcp2_tx_caps	tx_caps;
+} __packed;
+
+/**
+ * HECI Integrated wired HDCP Tx, close session command
+ *
+ * The command below is in support of ending an integrated
+ * wired HDCP Tx session.
+ *	command ID: WIRED_CLOSE_SESSION
+ *
+ * return:
+ *	HDCP_STATUS_SUCCESS - Command completed correctly.
+ */
+
+/**
+ * HECI struct for ending an integrated wired HDCP Tx session.
+ */
+struct wired_cmd_close_session_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+struct wired_cmd_close_session_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+/**
+ * HECI Integrated wired HDCP Tx verify receiver certificates command
+ *
+ * The command below is in support of verifying a Rx in an
+ * integrated wired HDCP Tx session.
+ *	command ID: WIRED_VERIFY_RECEIVER_CERT
+ *
+ * Corresponds to the AKE_Send_Cert from the HDCP DP, HDMI specs.
+ * return:
+ *	HDCP_STATUS_SUCCESS - Command completed correctly.
+ */
+
+/**
+ * HECI Input struct for integrated wired HDCP Tx Rx verification.
+ */
+struct wired_cmd_verify_receiver_cert_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	struct hdcp2_cert_rx	cert_rx;
+	uint8_t			r_rx[HDCP_RRX_LEN];
+	union hdcp2_rx_caps		rx_caps;
+} __packed;
+
+struct wired_cmd_verify_receiver_cert_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t			km_stored;
+	uint8_t			reserved[3];
+	union encrypted_buff		ekm_buff;
+} __packed;
+
+/**
+ * HECI Integrated wired HDCP Tx, verify Rx's Hprime command
+ *
+ * The command below is in support of verifying an Hprime value
+ * generated by the Rx in an integrated wired HDCP Tx session.
+ *	command ID: WIRED_AKE_SEND_HPRIME
+ *
+ * Corresponds to the AKE_Send_H_prime message from the HDCP DP, HDMI specs.
+ *
+ * return:
+ *	HDCP_STATUS_SUCCESS - Command completed correctly.
+ */
+
+/**
+ * HECI struct for verification of Rx's Hprime in a HDCP Tx session
+ */
+struct wired_cmd_ake_send_hprime_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t			h_prime[HDCP_H_PRIME_LEN];
+} __packed;
+
+struct wired_cmd_ake_send_hprime_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+/**
+ * HECI Integrated wired HDCP Tx, send AKE pairing data command
+ *
+ * The command below is in support of sending in AKE pairing data generated
+ * by the Rx in an integrated wired HDCP Tx session.
+ *	command ID: WIRED_AKE_SEND_PAIRING_INFO
+ *
+ * Corresponds to the AKE_Send_H_prime message from the HDCP DP, HDMI specs.
+ *
+ * return:
+ *	HDCP_STATUS_SUCCESS - Command completed correctly.
+ */
+
+/**
+ * HECI struct for sending in AKE pairing data generated by the Rx in an
+ * integrated wired HDCP Tx session.
+ */
+struct wired_cmd_ake_send_pairing_info_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t			e_kh_km[HDCP_E_KH_KM_LEN];
+} __packed;
+
+struct wired_cmd_ake_send_pairing_info_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+
+/** --------------------------------------------------------------
+ * Data structures for integrated wired HDCP2 Tx in support of the LC protocol
+ */
+
+/**
+ * HECI Integrated wired HDCP Tx, initiate locality check
+ *
+ * The command below is in support of initiating locality check with an
+ * integrated wired HDCP Tx session.
+ *	command ID: WIRED_INIT_LOCALITY_CHECK
+ *
+ * Corresponds to the LC_Init message from the HDCP DP, HDMI specs.
+ *
+ * return: HDCP_STATUS_SUCCESS - Command completed correctly.
+ */
+
+/**
+ * HECI struct for initiating locality check with an
+ * integrated wired HDCP Tx session.
+ */
+struct wired_cmd_init_locality_check_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+struct wired_cmd_init_locality_check_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t			r_n[HDCP_RN_LEN];
+} __packed;
+
+/**
+ * HECI Integrated wired HDCP Tx, validate locality check
+ *
+ * The command below is in support of validating an Rx's LPrime value
+ * in an integrated wired HDCP Tx session.
+ *	command ID: WIRED_VALIDATE_LOCALITY
+ *
+ * Corresponds to the LC_Send_L_prime message from the HDCP DP, HDMI specs.
+ *
+ * return: HDCP_STATUS_SUCCESS - Command completed correctly.
+ */
+
+/**
+ * HECI struct for validating an Rx's LPrime value in an
+ * integrated wired HDCP Tx session.
+ */
+struct wired_cmd_validate_locality_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t			l_prime[HDCP_L_PRIME_LEN];
+} __packed;
+
+struct wired_cmd_validate_locality_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+/** --------------------------------------------------------------
+ * Data structures for integrated wired HDCP2 Tx in support of the SKE protocol
+ */
+
+/**
+ * HECI Integrated wired HDCP Tx, create session key command
+ *
+ * The command below is in support generating the session key
+ * in an integrated wired HDCP Tx session.
+ *	command ID: WIRED_GET_SESSION_KEY
+ *
+ * Corresponds to the SKE_Send_Eks message from the HDCP DP, HDMI specs.
+ *
+ * return: HDCP_STATUS_SUCCESS - Command completed correctly.
+ */
+
+/**
+ * HECI struct for create session key command
+ */
+struct wired_cmd_get_session_key_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+struct wired_cmd_get_session_key_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t		e_dkey_ks[HDCP_E_DKEY_KS_LEN];
+	uint8_t		r_iv[HDCP_RIV_LEN];
+} __packed;
+
+/**
+ * HECI Integrated wired HDCP Tx, enable authentication command
+ *
+ * The command below is in support of assigning type 0, type 1
+ * values to a non-repeater downstream Tx port and marking Authentication
+ * complete
+ *	command ID: WIRED_ENABLE_AUTH
+ *
+ * return: HDCP_STATUS_SUCCESS - Command completed correctly.
+ */
+
+/**
+ * HECI struct for the Tx enable authentication command
+ */
+struct wired_cmd_enable_auth_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t		stream_type;
+} __packed;
+
+struct wired_cmd_enable_auth_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+/** --------------------------------------------------------------
+ * Data structures for integrated wired HDCP2 Tx in support of
+ * the repeater protocols
+ */
+
+/**
+ * HECI Integrated wired HDCP Tx, verify downstream topology command
+ *
+ * The command below is in support verifying the downstream repeater's
+ * HDCP topology in an integrated wired HDCP Tx session.
+ *	command ID: WIRED_VERIFY_REPEATER
+ *
+ * Corresponds to the RepeaterAuth_Send_ReceiverId_List message
+ * from the HDCP DP, HDMI specs.
+ *
+ * return: HDCP_STATUS_SUCCESS - Command completed correctly.
+ */
+
+/**
+ * HECI struct for verifying the downstream repeater's HDCP topology in an
+ * integrated wired HDCP Tx session.
+ */
+struct wired_cmd_verify_repeater_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	union hdcp2_rx_info		rx_info;
+	uint8_t			seq_num_v[HDCP_SEQ_NUM_LEN];
+	uint8_t			v_prime[HDCP_LPRIME_HALF_SIZE];
+	uint8_t			receiver_ids[HDCP_RECEIVER_IDS_MAX_LEN];
+} __packed;
+
+struct wired_cmd_verify_repeater_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t			content_type_supported;
+	uint8_t			v[HDCP_LPRIME_HALF_SIZE];
+} __packed;
+
+/**
+ * HECI Integrated wired HDCP Tx, stream management command
+ *
+ * The command below is in support of stream management in an
+ * integrated wired HDCP Tx session.
+ *	command ID: WIRED_REPEATER_AUTH_STREAM_REQ
+ *
+ * Corresponds to the RepeaterAuth_Stream_Ready message from
+ * the HDCP DP, HDMI specs.
+ *
+ * return: HDCP_STATUS_SUCCESS - Command completed correctly.
+ */
+
+/**
+ * HECI struct in support of stream management in an
+ * integrated wired HDCP Tx session.
+ */
+struct wired_cmd_repeater_auth_stream_req_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	uint8_t			seq_num_m[HDCP_SEQ_NUM_LEN];
+	uint8_t			m_prime[HDCP_MPRIME_LEN];
+	uint16_t		k;
+	struct hdcp2_streamid_type streams[1];
+} __packed;
+
+struct wired_cmd_repeater_auth_stream_req_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
 #endif /* __MEI_HDCP_H__ */