tegrakernel/kernel/nvidia/drivers/video/tegra/dc/tsec_drv.h

965 lines
44 KiB
C
Raw Normal View History

2022-02-16 09:13:02 -06:00
/*
* tsec_drv.h: Functions implementing tegra hdcp interface.
*
* Copyright (c) 2014-2017, NVIDIA CORPORATION, All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef TSEC_DRV_H
#define TSEC_DRV_H
/*
CLASS NV_95A1_TSEC
===================
*/
/*
* HDCP
*
* Method parameters for HDCP 2.X methods. Also
* provides status signing, ksv list validation, srm validation and stream
* validation for HDCP 1.X. Uses HDCP2.0/HDCP2.1 spec.
* Glossary at end of the file.
*/
/* Size in bytes */
#define HDCP_SIZE_RECV_ID_8 (40/8)
#define HDCP_SIZE_RTX_8 (64/8)
#define HDCP_SIZE_RTX_64 (HDCP_SIZE_RTX_8/8)
#define HDCP_SIZE_RRX_8 (64/8)
#define HDCP_SIZE_RRX_64 (HDCP_SIZE_RRX_8/8)
#define HDCP_SIZE_RN_8 (64/8)
#define HDCP_SIZE_RN_64 (HDCP_SIZE_RTX_8/8)
#define HDCP_SIZE_RIV_8 (64/8)
#define HDCP_SIZE_RIV_64 (HDCP_SIZE_RIV_8/8)
#define HDCP_SIZE_CERT_RX_8 (4176/8)
#define HDCP_SIZE_DCP_KPUB_8 (3072/8)
#define HDCP_SIZE_DCP_KPUB_64 (HDCP_SIZE_DCP_KPUB_8/8)
#define HDCP_SIZE_RX_KPUB_8 (1048/8)
/*each receiver ID is 5 bytes long * 128 max receivers */
#define HDCP_SIZE_MAX_RECV_ID_LIST_8 640
#define HDCP_SIZE_MAX_RECV_ID_LIST_64 (HDCP_SIZE_MAX_RECV_ID_LIST_8/8)
#define HDCP_SIZE_PVT_RX_KEY_8 (340)
#define HDCP_SIZE_TMR_INFO_8 (5)
#define HDCP_SIZE_RCV_INFO_8 (5)
#define HDCP_SIZE_KM_8 (16)
#define HDCP_SIZE_DKEY_8 (16)
#define HDCP_SIZE_KD_8 (32)
#define HDCP_SIZE_KH_8 (16)
#define HDCP_SIZE_KS_8 (16)
#define HDCP_SIZE_M_8 (128/8)
#define HDCP_SIZE_M_64 (HDCP_SIZE_M_8/8)
#define HDCP_SIZE_E_KM_8 (1024/8)
#define HDCP_SIZE_E_KM_64 (HDCP_SIZE_E_KM_8/8)
#define HDCP_SIZE_EKH_KM_8 (128/8)
#define HDCP_SIZE_EKH_KM_64 (HDCP_SIZE_EKH_KM_8/8)
#define HDCP_SIZE_E_KS_8 (128/8)
#define HDCP_SIZE_E_KS_64 (HDCP_SIZE_E_KS_8/8)
/* 96 bytes, round up from 85 bytes */
#define HDCP_SIZE_EPAIR_8 96
#define HDCP_SIZE_EPAIR_64 (HDCP_SIZE_EPAIR_8/8)
#define HDCP_SIZE_EPAIR_SIGNATURE_8 (256/8)
#define HDCP_SIZE_EPAIR_SIGNATURE_64 (HDCP_SIZE_EPAIR_SIGNATURE_8/8)
#define HDCP_SIZE_HPRIME_8 (256/8)
#define HDCP_SIZE_HPRIME_64 (HDCP_SIZE_HPRIME_8/8)
#define HDCP_SIZE_LPRIME_8 (256/8)
#define HDCP_SIZE_LPRIME_64 (HDCP_SIZE_LPRIME_8/8)
#define HDCP_SIZE_MPRIME_8 (256/8)
#define HDCP_SIZE_MPRIME_64 (HDCP_SIZE_MPRIME_8/8)
#define HDCP_SIZE_VPRIME_2X_8 (256/8)
#define HDCP_SIZE_VPRIME_2X_64 (HDCP_SIZE_VPRIME_2X_8/8)
#define HDCP_SIZE_SPRIME_8 384
#define HDCP_SIZE_SPRIME_64 (HDCP_SIZE_SPRIME_8/8)
#define HDCP_SIZE_SEQ_NUM_V_8 3
#define HDCP_SIZE_SEQ_NUM_M_8 3
#define HDCP_SIZE_CONTENT_ID_8 2
#define HDCP_SIZE_CONTENT_TYPE_8 1
#define HDCP_SIZE_PES_HDR_8 (128/8)
#define HDCP_SIZE_PES_HDR_64 (HDCP_SIZE_PES_HDR_8/8)
#define HDCP_SIZE_CHIP_NAME (8)
#define HDCP_VERIFY_VPRIME_MAX_ATTEMPTS 3
/* HDCP1X uses SHA1 for VPRIME which produces 160 bits of output */
#define HDCP_SIZE_VPRIME_1X_8 (160/8)
#define HDCP_SIZE_VPRIME_1X_32 (HDCP_SIZE_VPRIME_1X_8/4)
#define HDCP_SIZE_LPRIME_1X_8 (160/8)
#define HDCP_SIZE_LPRIME_1X_32 (HDCP_SIZE_LPRIME_1X_8/4)
#define HDCP_SIZE_QID_1X_8 (64/8)
#define HDCP_SIZE_QID_1X_64 (HDCP_SIZE_QID_1X_8/8)
/* Constants
* Changing this contant will change size of certain structures below
* Please make sure they are resized accordingly.
*/
#define HDCP_MAX_STREAMS_PER_RCVR 2
/* HDCP versions */
#define HDCP_VERSION_1X (0x00000001)
#define HDCP_VERSION_20 (0x00000002)
#define HDCP_VERSION_21 (0x00000003)
#define HDCP_VERSION_22 (0x00000004)
/* COMMON ERROR CODES */
#define HDCP_ERROR_UNKNOWN (0x80000000)
#define HDCP_ERROR_NONE (0x00000000)
#define HDCP_ERROR_INVALID_SESSION (0x00000001)
#define HDCP_ERROR_SB_NOT_SET (0x00000002)
#define HDCP_ERROR_NOT_INIT (0x00000003)
#define HDCP_ERROR_INVALID_STAGE (0x00000004)
#define HDCP_ERROR_MSG_UNSUPPORTED (0x00000005)
/*
* READ_CAPS
*
* This method passes the HDCP Tsec application's capabilities back to the
* client. The capabilities include supported versions, maximum number of
* simultaneous sessions supported, exclusive dmem support, max scratch
* buffer needed etc.If DMEM carveout (exclusive DMEM) is not available for
* HDCP, then the client must allocate a scratch buffer of size 'requiredScratch
* BufferSize' in FB and pass it TSEC.
*
* Depends on: [none]
*/
struct hdcp_read_caps_param {
unsigned int supported_versions_mask; /* >>out */
unsigned int max_sessions; /* >>out */
unsigned int max_active_sessions; /* >>out */
unsigned int scratch_buffer_size; /* >>out */
unsigned int max_streams_per_receiver; /* >>out */
unsigned int current_build_mode; /* >>out */
unsigned int falcon_ip_ver; /* >>out */
unsigned char b_is_rcv_supported; /* >>out */
unsigned char reserved[3];
unsigned char chip_name[HDCP_SIZE_CHIP_NAME]; /* >>out */
unsigned char b_is_stack_track_enabled; /* >>out */
unsigned char b_is_imem_track_enabled; /* >>out */
unsigned char b_is_debug_chip; /* >>out */
unsigned char b_is_exclusive_dmem_available; /* >>out */
unsigned char b_is_status_signing_supported; /* >>out */
unsigned char b_is_stream_val_supported; /* >>out */
unsigned char b_is_ksv_list_val_supported; /* >>out */
unsigned char b_is_pre_compute_supported; /* >>out */
unsigned int ret_code; /* >>out */
};
#define HDCP_READ_CAPS_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_READ_CAPS_CURRENT_BUILD_MODE_PROD (0x00)
#define HDCP_READ_CAPS_CURRENT_BUILD_MODE_DEBUG_1 (0x01)
#define HDCP_READ_CAPS_CURRENT_BUILD_MODE_DEBUG_2 (0x02)
#define HDCP_READ_CAPS_CURRENT_BUILD_MODE_DEBUG_3 (0x03)
#define HDCP_READ_CAPS_EXCL_DMEM_AVAILABLE (0x01)
#define HDCP_READ_CAPS_EXCL_DMEM_UNAVAILABLE (0x00)
#define HDCP_READ_CAPS_STATUS_SIGNING_SUPPORTED (0x01)
#define HDCP_READ_CAPS_STATUS_SIGNING_UNSUPPORTED (0x00)
#define HDCP_READ_CAPS_STREAM_VAL_SUPPORTED (0x01)
#define HDCP_READ_CAPS_STREAM_VAL_UNSUPPORTED (0x00)
#define HDCP_READ_CAPS_KSVLIST_VAL_SUPPORTED (0x01)
#define HDCP_READ_CAPS_KSVLIST_VAL_UNSUPPORTED (0x00)
#define HDCP_READ_CAPS_PRE_COMPUTE_SUPPORTED (0x01)
#define HDCP_READ_CAPS_PRE_COMPUTE_UNSUPPORTED (0x00)
#define HDCP_READ_CAPS_DEBUG_CHIP_YES (0x01)
#define HDCP_READ_CAPS_DEBUG_CHIP_NO (0x00)
#define HDCP_READ_CAPS_RCV_SUPPORTED (0x01)
#define HDCP_READ_CAPS_RCV_UNSUPPORTED (0x00)
#define HDCP_READ_CAPS_CHIP_NAME_T114 "t114"
#define HDCP_READ_CAPS_CHIP_NAME_T148 "t148"
#define HDCP_READ_CAPS_CHIP_NAME_T124 "t124"
#define HDCP_READ_CAPS_CHIP_NAME_T132 "t132"
#define HDCP_READ_CAPS_CHIP_NAME_T210 "t210"
#define HDCP_READ_CAPS_CHIP_NAME_GM107 "gm107"
/*
* INIT
*
* This method will initialize necessary global data needed for HDCP app
* in TSEC. This includes decrypting LC128, decrypting upstream priv key
* and setting up sessions pool. If exclusibe DMEM is not available,
* SET_SCRATCH_BUFFER should precede this method and other methods as
* documented below. Size of scratch buffer is communicated to client
* through READ_CAPS method and TSEC HDCP app assumes the SB is allocated
* to that precise size aligned to 256 bytes. INIT needs to pass the chipId
* from PMC_BOOT reg.
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* Error codes:
*
* REINIT - HDCP application already initialized
* SB_NOT_SET - Scratch buffer offset not set
* INVALID_KEYS - Decrypting the confidential data failed
* UNKNOWN - Unknown errors while Initing.
*
* Flags:
*
* FORCE_INIT - Force initialization even if already initialized. Will reset
* all the sessions
*/
struct hdcp_init_param {
unsigned int flags; /* <<in */
unsigned int chip_id; /* <<in */
unsigned int ret_code; /* >>out */
};
#define HDCP_INIT_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_INIT_ERROR_REINIT (0x00000001)
#define HDCP_INIT_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_INIT_ERROR_INVALID_KEYS (0x00000003)
#define HDCP_INIT_ERROR_UNKNOWN (0x00000004)
#define HDCP_INIT_FLAG_FORCE_INIT_DISABLE 0
#define HDCP_INIT_FLAG_FORCE_INIT_ENABLE 1
/*
* CREATE_SESSION
*
* A session is synonymous to a secure channel created between the transmitter
* and receiver. Session keeps track of progress in establishing secure channel
* by storing all intermediate states. Number of simultaneous sessions will
* equal the number of wireless displays we plan to support. This method will
* fail if client tries to create more sessions than supported. Number of
* sessions is limited only due to the scratch buffer/DMEM constraint.
* Session is created for version 2.0 by default. Use Update session to
* change the version. While creating a session, the client needs to pass
* the expected number of streams used by the receiver. The number of streams
* cannot be greater than maxStreamsPerReceiver in READ_CAPS method.
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* Error codes:
*
* MAX - No free sessions available.
* SB_NOT_SET - Scratch buffer is not set.
* NOT_INIT - HDCP app not initialized yet.
* MAX_STREAMS - noOfStreams is greater than max supported.
*/
struct hdcp_create_session_param {
unsigned int no_of_streams; /* <<in */
unsigned int session_id; /* >>out */
unsigned long long rtx; /* >>out */
unsigned int ret_code; /* >>out */
/* 0 - transmitter, 1 - receiver */
unsigned char session_type; /* <<in */
/* 0 - WFD, 1 - HDMI, 2 - DP */
unsigned char display_type; /* <<in: */
unsigned char sor_num; /* <<in: */
unsigned char reserved[1]; /* <<in: */
unsigned long long rrx; /* >>out */
};
#define HDCP_CREATE_SESSION_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_CREATE_SESSION_ERROR_MAX (0x00000001)
#define HDCP_CREATE_SESSION_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_CREATE_SESSION_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_CREATE_SESSION_ERROR_INVALID_STREAMS (0x00000004)
#define HDCP_CREATE_SESSION_ERROR_INVALID_PARAMS (0x00000005)
#define HDCP_CREATE_SESSION_TYPE_TMTR (0x00)
#define HDCP_CREATE_SESSION_TYPE_RCVR (0x01)
/*
* VERIFY_CERT_RX
*
* Verifies receiver public certificate's signature using DCP's public key. If
* verification succeeds, all necessary information from the certificate are
* retained in session before returning back to client. Along with certificate,
* the client also indicates if the wireless receiver is a repeater.
*
* Depends on: [SET_SCRATCH_BUFFER, SET_CERT_RX, SET_DCP_KPUB]
*
* Error codes:
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch buffer not set
* NOT_INIT - HDCP app not initialized yet.
* INVALID_STAGE - State machine sequence is not followed
* INVALID_CERT - Cert validation failed
* CERT_NOT_SET - Certiticate offset not set
* DCP_KPUB_NOT_SET- Dcp public key not set
* DCP_KPUB_INVALID- Dcp key provided doesn't follow the standards
* - (eg: Null exponent)
*/
struct hdcp_verify_cert_rx_param {
unsigned int session_id; /* <<in */
unsigned char repeater; /* <<in */
unsigned char reserved[3];
unsigned int ret_code; /* >>out */
};
#define HDCP_VERIFY_CERT_RX_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_VERIFY_CERT_RX_ERROR_INVALID_SESSION HDCP_ERROR_INVALID_SESSION
#define HDCP_VERIFY_CERT_RX_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_VERIFY_CERT_RX_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_VERIFY_CERT_RX_ERROR_INVALID_STAGE HDCP_ERROR_INVALID_STAGE
#define HDCP_VERIFY_CERT_RX_ERROR_INVALID_CERT (0x00000005)
#define HDCP_VERIFY_CERT_RX_ERROR_CERT_NOT_SET (0x00000006)
#define HDCP_VERIFY_CERT_RX_ERROR_DCP_KPUB_NOT_SET (0x00000007)
#define HDCP_VERIFY_CERT_RX_ERROR_DCP_KPUB_INVALID (0x00000008)
/*
* GENERATE_EKM
*
* Generates 128 bit random number Km and encrypts it using receiver's public
* ID to generate 1024 bit Ekpub(Km). Km is confidential and not passed to the
* client, but is saved in session state.
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet.
* INVALID_STAGE - State machine sequence is not followed
* DUP_KM - Session already has a valid Km. Duplicate request
* RX_KPUB_NOT_SET - Receiver public key not set
*
*/
struct hdcp_generate_ekm_param {
unsigned int session_id; /* <<in */
unsigned char reserved1[4];
unsigned long long ekm[HDCP_SIZE_E_KM_64]; /* >>out */
unsigned int ret_code; /* >>out */
unsigned char reserved2[4];
};
#define HDCP_GENERATE_EKM_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_GENERATE_EKM_ERROR_INVALID_SESSION HDCP_ERROR_INVALID_SESSION
#define HDCP_GENERATE_EKM_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_GENERATE_EKM_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_GENERATE_EKM_ERROR_INVALID_STAGE HDCP_ERROR_INVALID_STAGE
#define HDCP_GENERATE_EKM_ERROR_RX_KPUB_NOT_SET (0x00000005)
/*
* REVOCATION_CHECK
*
* Validates if SRM is valid. If yes, checks if receiver ID is in revocation
* list. Client is supposed to take care of checking the version of SRM and
* invoking REVOCATION check if SRM is found to be a newer version. This method
* is applicable to both HDCP1.X and HDCP 2.0 devices. Incase of HDCP 1.X,
* TSEC will read the BKSV from the display hardware.
*
* Depends on: [SET_SCRATCH_BUFFER, SET_SRM, SET_DCP_KPUB]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet.
* INVALID_STAGE - Invalid stage
* INVALID_SRM_SIZE - Srm size is not valid
* SRM_VALD_FAILED - Srm validation failed
* RCV_ID_REVOKED - Receiver ID revoked
* SRM_NOT_SET - Srm is not set
* DCP_KPUB_NOT_SET - DCP Kpub is not set
*/
struct hdcp_revocation_check_param {
union {
unsigned int session_id;
unsigned int ap_index;
} trans_id;
unsigned char is_ver_hdcp2x; /* <<in */
unsigned char reserved[3];
unsigned int srm_size; /* <<in */
unsigned int ret_code; /* >>out */
unsigned int srm_ver; /* >>out */
unsigned int tsec_gsc_address; /* <<in */
unsigned char nonce[16]; /* <<in */
unsigned char srm_cmac[16]; /* <<in */
unsigned int port; /* <<in */
};
#define HDCP_REVOCATION_CHECK_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_REVOCATION_CHECK_ERROR_INVALID_SESSION\
HDCP_ERROR_INVALID_SESSION
#define HDCP_REVOCATION_CHECK_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_REVOCATION_CHECK_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_REVOCATION_CHECK_ERROR_INVALID_STAGE\
HDCP_ERROR_INVALID_STAGE
#define HDCP_REVOCATION_CHECK_ERROR_INVALID_SRM_SIZE (0x00000005)
#define HDCP_REVOCATION_CHECK_ERROR_SRM_VALD_FAILED (0x00000006)
#define HDCP_REVOCATION_CHECK_ERROR_RCV_ID_REVOKED (0x00000007)
#define HDCP_REVOCATION_CHECK_ERROR_SRM_NOT_SET (0x00000008)
#define HDCP_REVOCATION_CHECK_ERROR_DCP_KPUB_NOT_SET (0x00000009)
#define HDCP_REVOCATION_CHECK_ERROR_CMAC_MISMATCH (0x0000000A)
#define HDCP_REVOCATION_CHECK_ERROR_INVALID_GSC (0x0000000B)
/*
* VERIFY_HPRIME
*
* Computes H and verifies if H == HPRIME
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet.
* INVALID_STAGE - State machine sequence is not followed
* HPRIME_VALD_FAILED - Hprime validation failed
*/
struct hdcp_verify_hprime_param {
unsigned long long hprime[HDCP_SIZE_HPRIME_64]; /* <<in */
unsigned int session_id; /* <<in */
unsigned int ret_code; /* >>out */
};
#define HDCP_VERIFY_HPRIME_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_VERIFY_HPRIME_ERROR_INVALID_SESSION\
HDCP_ERROR_INVALID_SESSION
#define HDCP_VERIFY_HPRIME_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_VERIFY_HPRIME_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_VERIFY_HPRIME_ERROR_INVALID_STAGE\
HDCP_ERROR_INVALID_STAGE
#define HDCP_VERIFY_HPRIME_ERROR_HPRIME_VALD_FAILED (0x00000005)
/*
* ENCRYPT_PAIRING_INFO
*
* This encrypts Ekh(km),km and m using the secret key and sends back to client
* for persistent storage. Will be used when the same receiver is discovered
* later. Uses HMAC to produce a signature to verify the integrity.
* m = 64 0's appended to rtx and all are in big-endian format
* EPair = Eaes(rcvId||m||km||Ekh(Km)||SHA256(rcvId||m||km||Ekh(Km)))
* = (40 + 128 + 128 + 128 + 256) bits = 85 bytes round up to 96
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* INVALID_KM - Km is not initialized
* INVALID_M - m is not initialized
*/
struct hdcp_encrypt_pairing_info_param {
unsigned int session_id; /* <<in */
unsigned char reserved1[4];
unsigned long long ekhkm[HDCP_SIZE_EKH_KM_64]; /* <<in */
unsigned long long e_pair[HDCP_SIZE_EPAIR_64]; /* >>out */
unsigned int ret_code; /* >>out */
unsigned char reserved2[4];
};
#define HDCP_ENCRYPT_PAIRING_INFO_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_ENCRYPT_PAIRING_INFO_ERROR_INVALID_SESSION\
HDCP_ERROR_INVALID_SESSION
#define HDCP_ENCRYPT_PAIRING_INFO_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_ENCRYPT_PAIRING_INFO_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_ENCRYPT_PAIRING_INFO_ERROR_INVALID_KM (0x00000004)
#define HDCP_ENCRYPT_PAIRING_INFO_ERROR_INVALID_M (0x00000005)
/*
* UPDATE_SESSION
*
* Updates the session parameters which are determined during key exchange
* and after it.(like displayid-session mapping)
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* INVALID_STAGE - State machine sequence is not followed
* DUP_RRX - RRX already updated. Duplicate request.
* INVALID_UPD_MASK - Update mask is incorrect
* HDCP_VER_UNSUPPORTED - Version is not supported.
*/
struct hdcp_update_session_param {
unsigned long long rrx; /* <<in */
unsigned int session_id; /* <<in */
unsigned int head; /* <<in */
unsigned int or_index; /* <<in */
unsigned int hdcp_ver; /* <<in */
unsigned int updmask; /* <<in */
unsigned int b_recv_pre_compute_support; /* <<in */
unsigned int ret_code; /* >>out */
/* 0-tansmitter 1 - receiver */
unsigned char session_type; /* <<in: */
unsigned char reserved[3];
unsigned long long rtx; /* <<in */
};
#define HDCP_UPDATE_SESSION_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_UPDATE_SESSION_ERROR_INVALID_SESSION\
HDCP_ERROR_INVALID_SESSION
#define HDCP_UPDATE_SESSION_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_UPDATE_SESSION_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_UPDATE_SESSION_ERROR_INVALID_STAGE\
HDCP_ERROR_INVALID_STAGE
#define HDCP_UPDATE_SESSION_ERROR_DUP_RRX (0x00000005)
#define HDCP_UPDATE_SESSION_ERROR_INVALID_UPD_MASK (0x00000006)
#define HDCP_UPDATE_SESSION_ERROR_HDCP_VER_UNSUPPORTED (0x00000007)
#define HDCP_UPDATE_SESSION_MASK_HEAD_PRESENT (0x00000000)
#define HDCP_UPDATE_SESSION_MASK_ORINDEX_PRESENT (0x00000001)
#define HDCP_UPDATE_SESSION_MASK_RRX_PRESENT (0x00000002)
#define HDCP_UPDATE_SESSION_MASK_VERSION_PRESENT (0x00000003)
#define HDCP_UPDATE_SESSION_MASK_PRE_COMPUTE_PRESENT (0x00000004)
#define HDCP_UPDATE_SESSION_MASK_RTX_PRESENT (0x00000008)
#define HDCP_UPDATE_SESSION_PRE_COMPUTE_SUPPORTED (0x01)
#define HDCP_UPDATE_SESSION_PRE_COMPUTE_UNSUPPORTED (0x00)
/*
* GENERATE_LC_INIT
*
* Generates 64 bit random number rn.
* Checks for completed authentication as precondition. Completed auth
* imply non-null rrx, rtx, km.
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* INVALID_STAGE - State machine sequence is not followed or
* LC has already succeded for this receiver
*/
struct hdcp_generate_lc_init_param {
unsigned int session_id; /* <<in */
unsigned char reserved1[4];
unsigned long long rn; /* >>out */
unsigned int ret_code; /* >>out */
unsigned char reserved2[4];
};
#define HDCP_GENERATE_LC_INIT_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_GENERATE_LC_INIT_ERROR_INVALID_SESSION\
HDCP_ERROR_INVALID_SESSION
#define HDCP_GENERATE_LC_INIT_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_GENERATE_LC_INIT_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_GENERATE_LC_INIT_ERROR_INVALID_STAGE\
HDCP_ERROR_INVALID_STAGE
/*
* VERIFY_LPRIME
*
* Computes L and verifies if L == LPRIME. Incase of HDCP-2.1 receiver
* with PRE_COMPUTE support only most significant 128 bits of Lprime is used
* for comparison.
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* INVALID_STAGE - State machine sequence is not followed or
* RTT_CHALLENGE not used for HDCP2.1 receiver
* with PRE_COMPUTE support
* LPRIME_VALD_FAILED - Lprime validation failed
*/
struct hdcp_verify_lprime_param {
unsigned long long lprime[HDCP_SIZE_LPRIME_64]; /* <<in */
unsigned int session_id; /* <<in */
unsigned int ret_code; /* >>out */
};
#define HDCP_VERIFY_LPRIME_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_VERIFY_LPRIME_ERROR_INVALID_SESSION HDCP_ERROR_INVALID_SESSION
#define HDCP_VERIFY_LPRIME_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_VERIFY_LPRIME_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_VERIFY_LPRIME_ERROR_INVALID_STAGE HDCP_ERROR_INVALID_STAGE
#define HDCP_VERIFY_LPRIME_ERROR_LPRIME_VALD_FAILED (0x00000005)
/*
* GENERATE_SKE_INIT
*
* Generates 64 bit random number Riv and encrypted 128 bit session key.
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* LC_INIT_NOT_DONE - LC init phase is not completed yet
*/
struct hdcp_generate_ske_init_param {
unsigned int session_id; /* <<in */
unsigned char reserved1[4];
unsigned long long eks[HDCP_SIZE_E_KS_64]; /* >>out */
unsigned long long riv; /* >>out */
unsigned int ret_code; /* >>out */
unsigned char reserved2[4];
};
#define HDCP_GENERATE_SKE_INIT_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_GENERATE_SKE_INIT_ERROR_INVALID_SESSION\
HDCP_ERROR_INVALID_SESSION
#define HDCP_GENERATE_SKE_INIT_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_GENERATE_SKE_INIT_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_GENERATE_SKE_INIT_ERROR_INVALID_STAGE\
HDCP_ERROR_INVALID_STAGE
#define HDCP_GENERATE_SKE_INIT_ERROR_LC_INIT_NOT_DONE (0x00000005)
/*
* VERIFY_VPRIME
*
* Computes V and verifies if V == VPRIME.
* Does revocation check on the receiver ids got from the repeater along
* with bstatus checks. maxdevs exceeded and maxcascadeexceeded are considered
* false. Client should have checked for those values even before calling this
* method. Applies to both HDCP1.x and HDCP2.x spec.revoID will hold revoked
* received ID if any. Incase of HDCP-2.1 repeater, vprime holds the most
* significant 128-bits which will be compared against the most significant
* 128 bits of V. Incase of successful comparison, least-significant 128 bits
* of V is returned to the client via v128l. Client needs to populate seqNumV,
* bHasHdcp20Repeater and bHasHdcp1xDevice only if repeater supports HDCP-2.1
*
* Depends on: [SET_SCRATCH_BUFFER, SET_SRM, SET_DCP_KPUB, SET_RECEIVER_ID_LIST]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* INVALID_SRM_SIZE - Srm size not valid
* VPRIME_VALD_FAILED - Vprime validation failed
* INVALID_APINDEX - Either Head or OR is not valid
* SRM_VALD_FAILED - Srm validation failed
* RCVD_ID_REVOKED - Found a revoked receiver ID in receiver Id list
* SRM_NOT_SET - Srm not set
* DCP_KPUB_NOT_SET - DCP public key not set
* RCVD_ID_LIST_NOT_SET- Receiver ID list not set
* SEQ_NUM_V_ROLLOVER - Seq_Num_V rolled over
*/
struct hdcp_verify_vprime_param {
unsigned long long vprime[HDCP_SIZE_VPRIME_2X_64]; /* <<in */
union {
unsigned int session_id;
unsigned int ap_index;
} trans_id;
unsigned int srm_size; /* <<in */
unsigned int bstatus; /* <<in */
unsigned char is_ver_hdcp2x; /* <<in */
unsigned char depth; /* <<in */
unsigned char device_count; /* <<in */
unsigned char has_hdcp2_repeater; /* <<in */
unsigned char seqnum[HDCP_SIZE_SEQ_NUM_V_8]; /* <<in */
unsigned char has_hdcp1_device; /* <<in */
unsigned char revoID[HDCP_SIZE_RECV_ID_8]; /* >>out */
unsigned char reserved1[7];
unsigned long long v128l[HDCP_SIZE_VPRIME_2X_64/2]; /* >>out */
unsigned int ret_code; /* >>out */
unsigned char reserved2[4];
unsigned short rxinfo; /* <<in */
unsigned char reserved3[2];
unsigned int srm_ver; /* >>out */
unsigned int tsec_gsc_address; /* <<in */
unsigned char srm_cmac[16]; /* >>out */
unsigned char nonce[16]; /* <<in */
unsigned int port; /* <<in */
};
#define HDCP_VERIFY_VPRIME_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_VERIFY_VPRIME_ERROR_INVALID_SESSION\
HDCP_ERROR_INVALID_SESSION
#define HDCP_VERIFY_VPRIME_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_VERIFY_VPRIME_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_VERIFY_VPRIME_ERROR_INVALID_SRM_SIZE (0x00000004)
#define HDCP_VERIFY_VPRIME_ERROR_VPRIME_VALD_FAILED (0x00000005)
#define HDCP_VERIFY_VPRIME_ERROR_INVALID_APINDEX (0x00000006)
#define HDCP_VERIFY_VPRIME_ERROR_SRM_VALD_FAILED (0x00000007)
#define HDCP_VERIFY_VPRIME_ERROR_RCVD_ID_REVOKED (0x00000008)
#define HDCP_VERIFY_VPRIME_ERROR_SRM_NOT_SET (0x00000009)
#define HDCP_VERIFY_VPRIME_ERROR_DCP_KPUB_NOT_SET (0x0000000A)
#define HDCP_VERIFY_VPRIME_ERROR_RCVD_ID_LIST_NOT_SET (0x0000000B)
#define HDCP_VERIFY_VPRIME_ERROR_SEQ_NUM_V_ROLLOVER (0x0000000C)
#define HDCP_VERIFY_VPRIME_ERROR_ATTEMPT_MAX (0x0000000D)
#define HDCP_VERIFY_VPRIME_ERROR_CMAC_MISMATCH (0x0000000E)
/*
* GET_CURRENT_NONCE
*
* This method generates a nonce in ucode for hdcp 2.2
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
*
*/
struct hdcp_get_current_nonce_param {
unsigned int session_id; /* <<in */
unsigned char nonce[16]; /* <<in */
unsigned int ret_code; /* >>out */
};
#define NV95A1_HDCP_GET_CURRENT_NONCE_ERROR_NONE\
NV95A1_HDCP_ERROR_NONE
#define NV95A1_HDCP_GET_CURRENT_NONCE_ERROR_INVALID_SESSION\
NV95A1_HDCP_ERROR_INVALID_SESSION
#define NV95A1_HDCP_GET_CURRENT_NONCE_ERROR_SB_NOT_SET\
NV95A1_HDCP_ERROR_SB_NOT_SET
#define NV95A1_HDCP_GET_CURRENT_NONCE_NOT_INIT\
NV95A1_HDCP_ERROR_NOT_INIT
#define NV95A1_HDCP_GET_CURRENT_NONCE_FAILED (0x00000005)
/*
* ENCRYPTION_RUN_CTRL
*
* To start/stop/pause the encryption for a particular session
* Incase of HDCP1.X version, apIndex will be used to stop encryption.
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* INVALID_STATE - Invalid control state
* INVALID_APINDEX - Either Head or OR is not valid
* INVALID_FLAG - Control flag is invalid
*/
struct hdcp_encryption_run_ctrl_param {
union {
unsigned int session_id;
unsigned int ap_index;
} trans_id; /* <<in */
unsigned int ctrl_flag; /* <<in */
unsigned int ret_code; /* >>out */
};
#define HDCP_ENCRYPTION_RUN_CTRL_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_ENCRYPTION_RUN_CTRL_ERROR_INVALID_SESSION\
HDCP_ERROR_INVALID_SESSION
#define HDCP_ENCRYPTION_RUN_CTRL_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_ENCRYPTION_RUN_CTRL_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_ENCRYPTION_RUN_CTRL_ERROR_INVALID_STAGE\
HDCP_ERROR_INVALID_STAGE
#define HDCP_ENCRYPTION_RUN_CTRL_ERROR_INVALID_APINDEX (0x00000005)
#define HDCP_ENCRYPTION_RUN_CTRL_ERROR_INVALID_FLAG (0x00000006)
#define HDCP_ENCRYPTING_RUN_CTRL_FLAG_START (0x00000001)
#define HDCP_ENCRYPTING_RUN_CTRL_FLAG_STOP (0x00000002)
#define HDCP_ENCRYPTING_RUN_CTRL_FLAG_PAUSE (0x00000003)
/*
* SESSION_CTRL
*
* To activate/reset/delete a session. If deleted, Any future references
* to this session becomes illegal and this sessionID will be deleted.
* At any time there may be multiple sessions authenticated, but only
* few sessions should be activated at a time. This method will help
* the clients choose which session should be activated/deactivated.
*
* Depends on: [SET_SCRATCH_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* INVALID_STAGE - Activation failed because session is not in proper
* - stage or revocation check is not done.
* SESSION_ACTIVE - Error trying to reset or delete an active session.
* This error will also be flagged if client tries to
* activate already active session.
* SESSION_NOT_ACTIVE - Deactivating a non-active session
* SESSION_ACTIVE_MAX - Cannot activate a session. Maximum already active.
*/
struct hdcp_session_ctrl_param {
unsigned int session_id; /* <<in */
unsigned int ctrl_flag; /* <<in */
unsigned int ret_code; /* >>out */
};
#define HDCP_SESSION_CTRL_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_SESSION_CTRL_ERROR_INVALID_SESSION HDCP_ERROR_INVALID_SESSION
#define HDCP_SESSION_CTRL_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_SESSION_CTRL_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_SESSION_CTRL_ERROR_INVALID_STAGE HDCP_ERROR_INVALID_STAGE
#define HDCP_SESSION_CTRL_ERROR_SESSION_ACTIVE (0x00000005)
#define HDCP_SESSION_CTRL_ERROR_SESSION_NOT_ACTIVE (0x00000006)
#define HDCP_SESSION_CTRL_ERROR_SESSION_ACTIVE_MAX (0x00000007)
#define HDCP_SESSION_CTRL_FLAG_DELETE (0x00000001)
#define HDCP_SESSION_CTRL_FLAG_ACTIVATE (0x00000002)
#define HDCP_SESSION_CTRL_FLAG_DEACTIVATE (0x00000003)
/*
* VALIDATE_SRM
*
* Verifies SRM signature using DCP's public key.
*
* Depends on: [SET_SCRATCH_BUFFER, SET_SRM, SET_DCP_KPUB]
*
* INVALID_SRM_SIZE - Srm size invalid
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* SRM_VALD_FAILED - Srm validation failed
* SRM_NOT_SET - Srm not set
* DCP_KPUB_NOT_SET - DCP public key not set
*/
struct hdcp_validate_srm_param {
unsigned int srm_size; /* <<in */
unsigned int ret_code; /* >>out */
};
#define HDCP_VALIDATE_SRM_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_VALIDATE_SRM_ERROR_INVALID_SRM_SIZE (0x00000001)
#define HDCP_VALIDATE_SRM_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_VALIDATE_SRM_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_VALIDATE_SRM_ERROR_SRM_VALD_FAILED (0x00000004)
#define HDCP_VALIDATE_SRM_ERROR_SRM_NOT_SET (0x00000005)
#define HDCP_VALIDATE_SRM_ERROR_DCP_KPUB_NOT_SET (0x00000006)
/*
* EXCHANGE_INFO
*
* To exchange the information between tsechdcp library and TSEC for
* a particular session.
*
* Depends on: [none]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* MSG_UNSUPPORTED - Message applies only to HDCP2.2 receiver
* INVALID_FLAG - Method flag is invalid
*
*/
struct hdcp_exchange_info_param {
unsigned int session_id; /* <<in */
unsigned int method_flag; /* <<in */
unsigned int ret_code; /* >>out */
union {
struct get_tx_info {
unsigned char version; /* >>out */
unsigned char reserved;
unsigned short tmtr_caps_mask; /* >>out */
} get_tx_info;
struct set_rx_info {
unsigned char version; /* >>out */
unsigned char reserved;
unsigned short rcvr_caps_mask; /* <<in */
} set_rx_info;
struct set_tx_info {
unsigned char version; /* >>out */
unsigned char reserved;
unsigned short tmtr_caps_mask; /* <<in */
} set_tx_info;
struct get_rx_info {
unsigned char version; /* >>out */
unsigned char reserved;
unsigned short rcvr_caps_mask; /* >>out */
} get_rx_info;
} info;
};
#define HDCP_EXCHANGE_INFO_GET_TMTR_INFO (0x00000001)
#define HDCP_EXCHANGE_INFO_SET_RCVR_INFO (0x00000002)
#define HDCP_EXCHANGE_INFO_SET_TMTR_INFO (0x00000003)
#define HDCP_EXCHANGE_INFO_GET_RCVR_INFO (0x00000004)
#define HDCP_EXCHANGE_INFO_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_EXCHANGE_INFO_INVALID_SESSION HDCP_ERROR_INVALID_SESSION
#define HDCP_EXCHANGE_INFO_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_EXCHANGE_INFO_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_EXCHANGE_INFO_INVALID_METHOD_FLAG (0x00000006)
/*
* VALIDATE_DP_STREAM
*
* Validates the dp1.2 stream (lprime validation). Only applies to HDCP 1.x.
* Assumes Vprime is already validated.
*
* Depends on: [none]
*
* LPRIME_VALD_FAILED - Lprime validation failed
* INVALID_APINDEX - Either head or OR is not valid
*
* TODO Incomplete
*/
struct hdcp_validate_dp_stream_param {
unsigned long long q_id; /* <<in */
unsigned int ap_index; /* <<in */
unsigned int lprime[HDCP_SIZE_LPRIME_1X_32]; /* <<in */
unsigned int vprime[HDCP_SIZE_VPRIME_1X_32]; /* <<in */
unsigned char dp_stream_id; /* <<in */
unsigned char reserved1[3];
unsigned int ret_code; /* >>out */
unsigned char reserved2[4];
};
#define HDCP_VALIDATE_DP_STREAM_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_VALIDATE_DP_STREAM_ERROR_LPRIME_VALD_FAILED (0x00000001)
#define HDCP_VALIDATE_DP_STREAM_ERROR_INVALID_APINDEX (0x00000002)
/*
* ENCRYPT
*
* This method will be used after successfully activating an authenticated
* session which encrypts the provided plain content using HDCP2.0
* standard encryption. Method returns the input and stream counter
* used for encrypting the first block(16-bytes) in the buffer and the client
* is supposed to derive those counters for successive blocks. This method
* expects the input and output buffer to be 256 byte aligned and expects
* proper padding if size of a block in input buffer is less than 16-bytes.
*
* Depends on: [SET_SCRATCH_BUFFER, SET_ENC_INPUT_BUFFER, SET_ENC_OUTPUT_BUFFER]
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* INVALID_STAGE - State machine sequence is not followed
* SESSION_NOT_ACTIVE - Session is not active for encryption
* INPUT_BUFFER_NOT_SET - Input buffer not set
* OUPUT_BUFFER_NOT_SET - Output buffer not set
* INVALID_STREAM - Stream ID passed is invalid
* INVALID_ALIGN - Either INPUT,OUTPUT or encOffset is not in expected
* alignment
*/
struct hdcp_encrypt_param {
unsigned int session_id; /* <<in */
unsigned int no_of_input_blocks; /* <<in */
unsigned int stream_id; /* <<in */
unsigned int enc_offset; /* <<in */
unsigned int stream_ctr; /* >>out */
unsigned char reserved1[4];
unsigned long long input_ctr; /* >>out */
unsigned long long pes_priv[HDCP_SIZE_PES_HDR_64]; /* >>out */
unsigned int ret_code; /* >>out */
unsigned char reserved2[4];
};
#define HDCP_ENCRYPT_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_ENCRYPT_ERROR_INVALID_SESSION HDCP_ERROR_INVALID_SESSION
#define HDCP_ENCRYPT_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_ENCRYPT_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_ENCRYPT_ERROR_INVALID_STAGE HDCP_ERROR_INVALID_STAGE
#define HDCP_ENCRYPT_ERROR_SESSION_NOT_ACTIVE (0x00000005)
#define HDCP_ENCRYPT_ERROR_INPUT_BUFFER_NOT_SET (0x00000006)
#define HDCP_ENCRYPT_ERROR_OUTPUT_BUFFER_NOT_SET (0x00000007)
#define HDCP_ENCRYPT_ERROR_INVALID_STREAM (0x00000008)
#define HDCP_ENCRYPT_ERROR_INVALID_ALIGN (0x00000009)
/*
* STREAM_MANAGE
*
* This method works only for HDCP-2.1 receivers. Helps in Stream_Manage and
* Stream_Ready. The input contentID is expected to be in BIG-ENDIAN format.
* The number of contentIDs and strTypes equals the noOfStreams passed while
* creating the session. The output seqNumM and streamCtr will have valid
* values only from index 0 to (noOfStreams-1). Rest will be invalid values.
*
* Depends on: [SET_SCRATCH_BUFFER]
*
*
* INVALID_SESSION - Session not found
* SB_NOT_SET - Scratch Buffer not set
* NOT_INIT - HDCP app not initialized yet
* INVALID_STAGE - RTT challenge is requested in wrong stage
* MSG_UNSUPPORTED - Message applies only to HDCP2.1 receiver
* MPRIME_VALD_FAILED - Mprime validation has failed
* SEQ_NUM_M_ROLLOVER - Sequence number M has rolled over.
*
* FLAGS
*
* MANAGE - Setting this flag will let TSEC return the stream counters
* for the video and audio streams associated with session ID.
* Only input needed is the sessionID.
* READY - Synonymous to STREAM_READY message. Setting this flag will let
* TSEC compute M and compare with Mprime. The inputs needed are
* contentID, strType (streamType) and Mprime
*/
struct hdcp_stream_manage_param {
unsigned long long mprime[HDCP_SIZE_MPRIME_64]; /* <<in */
unsigned int session_id; /* <<in */
unsigned int manage_flag; /* <<in */
unsigned char content_id[HDCP_MAX_STREAMS_PER_RCVR]
[HDCP_SIZE_CONTENT_ID_8]; /* <<in */
unsigned char str_type[HDCP_MAX_STREAMS_PER_RCVR]
[HDCP_SIZE_CONTENT_TYPE_8]; /* <<in */
unsigned char seqnum_m[HDCP_SIZE_SEQ_NUM_M_8]; /* <<out */
unsigned char reserved1[7];
unsigned int stream_ctr[HDCP_MAX_STREAMS_PER_RCVR]; /* <<out */
unsigned int ret_code; /* <<out */
unsigned short streamid_type;
};
#define HDCP_STREAM_MANAGE_ERROR_NONE HDCP_ERROR_NONE
#define HDCP_STREAM_MANAGE_ERROR_INVALID_SESSION HDCP_ERROR_INVALID_SESSION
#define HDCP_STREAM_MANAGE_ERROR_SB_NOT_SET HDCP_ERROR_SB_NOT_SET
#define HDCP_STREAM_MANAGE_ERROR_NOT_INIT HDCP_ERROR_NOT_INIT
#define HDCP_STREAM_MANAGE_ERROR_INVALID_STAGE HDCP_ERROR_INVALID_STAGE
#define HDCP_STREAM_MANAGE_ERROR_MSG_UNSUPPORTED HDCP_ERROR_MSG_UNSUPPORTED
#define HDCP_STREAM_MANAGE_ERROR_MPRIME_VALD_FAILED (0x00000006)
#define HDCP_STREAM_MANAGE_ERROR_SEQ_NUM_M_ROLLOVER (0x00000007)
#define HDCP_STREAM_MANAGE_ERROR_INVALID_FLAG (0x00000008)
#define HDCP_STREAM_MANAGE_FLAG_MANAGE (0x00000001)
#define HDCP_STREAM_MANAGE_FLAG_READY (0x00000002)
/*
HDCP Glossary:
---------
HDCP Tsec Application - An application running in TSEC which will handle HDCP
related methods
Client - An UMD or KMD component sending methods to HDCP Tsec
application to perform any HDCP operation.
Exclusive Dmem - HDCP Tsec app needs to save persistent states. But
since TSEC OS is stateless, we need to wipe-out entire
DMEM before context switching to a different
application. So we either need to dump all the
persistent states to FB or request an exclusive DMEM
space that is owned only by HDCP Tsec application and
will not be wiped out at all.
Session - Synonymous to a secure channel between GPU and the
wireless display. Number of simultaneous sessioins
equals the number of hdcp supported wireless displays
discovered.
LC128 - A global constant provided by DCP LLC to all HDCP
adopters.
private key - RSA private key
public key - RSA publick key
cert - RSA certificate signed by DCP LLC
SRM - System renewability message
DCP - Digital Content Protection
SB - Scratch Buffer
*/
#endif