/* driver/soc/samsung/exynos-hdcp/exynos-hdcp2.h * * Copyright (c) 2016 Samsung Electronics Co., Ltd. * http://www.samsung.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef __EXYNOS_HDCP2_H__ #define __EXYNOS_HDCP2_H__ #include #include #include #include #include "exynos-hdcp2-session.h" #define HDCP_CMD_SESSION_OPEN 0x0001 #define HDCP_CMD_SESSION_CLOSE 0x0002 #define HDCP_CMD_LINK_OPEN 0x0003 #define HDCP_CMD_LINK_CLOSE 0x0004 #define HDCP_CMD_LINK_AUTH 0x0005 #define HDCP_CMD_LINK_ENC 0x0006 /* todo: define max message length based on HDCP spec */ #define HDCP_PROTO_MSG_LEN_MAX 1024 /* HDCP Link types */ #define HDCP_LINK_TYPE_IIA 0 #define HDCP_LINK_TYPE_DP 1 #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #define TEMP_ERROR -ENOTTY #define UPDATE_SESSION_STATE(sess, st) do { \ printk("[HDCP2]HDCP Session(%d): %s -> %s\n", sess->id, hdcp_session_st_str[sess->state], hdcp_session_st_str[st]); \ sess->state = st; \ } while (0) #define UPDATE_LINK_STATE(link, st) do { \ printk("[HDCP2]HDCP Link(%d): %s -> %s\n", link->id, hdcp_link_st_str[link->state], hdcp_link_st_str[st]); \ link->state = st; \ } while (0) #define UPDATE_STEP_STATE(step, st) do { \ printk("[HDCP2]HDCP STEP(%d): %s -> %s\n", st, hdcp_msgid_str[step], hdcp_msgid_str[st]); \ step = st; \ } while (0) enum { SEND_MSG = 0, RECIEVE_MSG = 1, RP_SEND_MSG = 2, RP_RECIEVE_MSG = 3, ST_SEND_MSG = 4, ST_RECIEVE_MSG = 5, DONE = 6, AUTH_FINISHED = 7, RP_FINISHED = 8, WAIT_STATE = 100 }; enum { TX_AUTH_SUCCESS = 0, TX_AUTH_ERROR_CONNECT_TEE, TX_AUTH_ERROR_MAKE_PROTO_MSG, TX_AUTH_ERROR_SEND_PROTO_MSG, TX_AUTH_ERROR_RECV_PROTO_MSG, TX_AUTH_ERROR_TIME_EXCEED, TX_AUTH_ERROR_NET_TIMEOUT, TX_AUTH_ERROR_NET_CONN_CLOSED, TX_AUTH_ERROR_CRYPTO, TX_AUTH_ERROR_WRONG_MSG_ID, TX_AUTH_ERROR_WRONG_MSG, TX_AUTH_ERROR_WRONG_MSG_SIZE, TX_AUTH_ERROR_STORE_SKEY, TX_AUTH_ERRRO_RESTORE_SKEY, TX_AUTH_ERROR_BUFFER_OVERFLLOW, TX_AUTH_ERROR_RETRYCOUNT_EXCEED, TX_AUTH_ERROR_ABORT, }; typedef enum hdcp_result { HDCP_SUCCESS = 0, HDCP_ERROR_INIT_FAILED, HDCP_ERROR_TERMINATE_FAILED, HDCP_ERROR_SESSION_OPEN_FAILED, HDCP_ERROR_SESSION_CLOSE_FAILED, HDCP_ERROR_LINK_OPEN_FAILED, HDCP_ERROR_LINK_CLOSE_FAILED, HDCP_ERROR_LINK_STREAM_FAILED, HDCP_ERROR_AUTHENTICATE_FAILED, HDCP_ERROR_COPY_TO_USER_FAILED, HDCP_ERROR_COPY_FROM_USER_FAILED, HDCP_ERROR_USER_FAILED, HDCP_ERROR_RX_NOT_HDCP_CAPABLE, HDCP_ERROR_EXCHANGE_KM, HDCP_ERROR_LOCALITY_CHECK, HDCP_ERROR_EXCHANGE_KS, HDCP_ERROR_WAIT_RECEIVER_ID_LIST, HDCP_ERROR_VERIFY_RECEIVER_ID_LIST, HDCP_ERROR_WAIT_AKE_INIT, HDCP_ERROR_MALLOC_FAILED = 0x1000, HDCP_ERROR_INVALID_HANDLE, HDCP_ERROR_INVALID_INPUT, HDCP_ERROR_INVALID_STATE, HDCP_ERROR_NET_UNREACHABLE, HDCP_ERROR_NET_CLOSED, HDCP_ERROR_ENCRYPTION, HDCP_ERROR_DECRYPTION, HDCP_ERROR_STREAM_MANAGE, HDCP_ERROR_WRAP_FAIL, HDCP_ERROR_UNWRAP_FAIL, HDCP_ERROR_WRONG_SIZE, HDCP_ERROR_DO_NOT_SUPPORT_YET, HDCP_ERROR_IOCTL_OPEN, HDCP_ERROR_END } hdcp_result; enum { HDCP_ERROR_INVALID_SESSION_HANDLE = 0x2000, HDCP_ERROR_INVALID_SESSION_STATE, HDCP_ERROR_INVALID_STREAM_LEN, }; struct hdcp_info { struct device *dev; struct hdcp_session_list ss_list; }; struct hdcp_sess_info { uint32_t ss_id; uint8_t wkey[HDCP_WRAP_MAX_SIZE]; }; struct hdcp_link_info { uint32_t ss_id; uint32_t lk_id; }; struct hdcp_link_auth { uint32_t ss_id; uint32_t lk_id; }; struct hdcp_link_enc { uint32_t ss_id; uint32_t lk_id; }; struct hdcp_msg_info { uint32_t ss_handle; uint32_t lk_id; uint8_t msg[1024]; uint32_t msg_len; uint32_t next_step; }; struct hdcp_stream_info { uint32_t ss_id; uint32_t lk_id; uint32_t num; uint8_t type; uint16_t stream_pid; uint32_t stream_ctr; uint8_t msg[1024]; uint32_t msg_len; uint32_t next_step; }; struct hdcp_enc_info { uint32_t id; uint8_t pes_private[16]; uint32_t priv_len; uint8_t str_ctr[4]; uint8_t input_ctr[8]; uint64_t input; unsigned long input_phys; uint32_t input_len; uint64_t output; unsigned long output_phys; uint32_t output_len; }; struct hdcp_wrapped_key { uint8_t key[16]; uint8_t enc_key[128]; uint32_t wrapped; uint32_t key_len; }; #define HDCP_IOC_SESSION_OPEN _IOWR('S', 1, struct hdcp_sess_info) #define HDCP_IOC_SESSION_CLOSE _IOWR('S', 2, struct hdcp_sess_info) #define HDCP_IOC_LINK_OPEN _IOWR('S', 3, struct hdcp_link_info) #define HDCP_IOC_LINK_CLOSE _IOWR('S', 4, struct hdcp_link_info) #define HDCP_IOC_LINK_AUTH _IOWR('S', 5, struct hdcp_msg_info) #define HDCP_IOC_LINK_ENC _IOWR('S', 6, struct hdcp_enc_info) #define HDCP_IOC_RESERVED_0 _IO('S', 7) #define HDCP_IOC_STREAM_MANAGE _IOWR('S', 8, struct hdcp_stream_info) #define HDCP_IOC_IIA_TX_SELFTEST _IOWR('S', 90, int) #define HDCP_IOC_DPLINK_TX_AUTH _IOWR('S', 100, int) #define HDCP_IOC_DPLINK_TX_EMUL _IOWR('S', 110, int) #define HDCP_IOC_DPLINK_TX_SELFTEST _IOWR('S', 120, int) #define HDCP_IOC_WRAP_KEY _IOWR('S', 200, struct hdcp_wrapped_key) typedef struct hdcp_tx_link_handle { uint32_t ss_handle; uint32_t lk_id; } hdcp_tx_link_handle_t; enum hdcp_result hdcp_session_open(struct hdcp_sess_info *ss_info); enum hdcp_result hdcp_session_close(struct hdcp_sess_info *ss_info); enum hdcp_result hdcp_link_open(struct hdcp_link_info *link_info, uint32_t lk_type); enum hdcp_result hdcp_link_close(struct hdcp_link_info *link_info); enum hdcp_result hdcp_link_authenticate(struct hdcp_msg_info *msg_info); enum hdcp_result hdcp_link_stream_manage(struct hdcp_stream_info *stream_info); enum hdcp_result hdcp_wrap_key(struct hdcp_wrapped_key *key_info); enum hdcp_result hdcp_unwrap_key(char *wkey); #endif