/* * drivers/soc/samsung/exynos-hdcp/exynos-hdcp2-tx-session.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 __HDCP_TX_SESSION_H__ #define __HDCP_TX_SESSION_H__ #include "exynos-hdcp2-protocol-msg.h" #define WRAP_SKEY_EMPTY 0 #define WRAP_SKEY_STORED 1 #define HDCP_WITHOUT_STORED_KM 0 #define HDCP_WITH_STORED_KM 1 #define MAX_IP_LEN 15 /* IP address format is "xxx.xxx.xxx.xxx" */ #define RECEIVER_ID_BYTE_LEN (40 / 8) #define HDCP_PRIVATE_DATA_LEN 16 #define HDCP_WRAPPED_HMAC_LEN 124 #define REPEATER 1 #define NO_RECEIVER 0 /** * HDCP Link state & data structure */ typedef enum hdcp_tx_hdcp_link_state { LINK_ST_INIT = 0, LINK_ST_H0_NO_RX_ATTATCHED, LINK_ST_H1_TX_LOW_VALUE_CONTENT, LINK_ST_A0_DETERMINE_RX_HDCP_CAP, LINK_ST_A1_EXCHANGE_MASTER_KEY, LINK_ST_A2_LOCALITY_CHECK, LINK_ST_A3_EXCHANGE_SESSION_KEY, LINK_ST_A4_TEST_REPEATER, LINK_ST_A5_AUTHENTICATED, LINK_ST_A6_WAIT_RECEIVER_ID_LIST, LINK_ST_A7_VERIFY_RECEIVER_ID_LIST, LINK_ST_A8_SEND_RECEIVER_ID_LIST_ACK, LINK_ST_A9_CONTENT_STREAM_MGT, LINK_ST_END } hdcp_tx_hdcp_link_state; struct hdcp_session_node { struct hdcp_session_data *ss_data; struct hdcp_session_node *next; struct hdcp_session_node *prev; }; struct hdcp_session_list { struct hdcp_session_node hdcp_session_head; struct mutex ss_mutex; }; struct hdcp_timer { struct timeval start; struct timeval end; uint32_t timeout; /* millisecond */ uint32_t elapsed_time; /* millisecond */ }; struct hdcp_link_data { uint32_t id; uint32_t state; uint8_t stored_km; uint32_t errno; /* error code */ uint32_t lk_type; /* link type */ struct hdcp_tx_ctx tx_ctx; /* Transmitter context data */ struct hdcp_rx_ctx rx_ctx; /* Receiver context data */ struct hdcp_timer timer; /* to check timeout */ struct hdcp_session_node *ss_ptr; /* session pointer link belong */ }; struct hdcp_link_node { struct hdcp_link_data *lk_data; struct hdcp_link_node *next; struct hdcp_link_node *prev; }; struct hdcp_link_list { struct hdcp_link_node hdcp_link_head; struct mutex lk_mutex; }; /** * HDCP Session status & data structure */ typedef enum hdcp_tx_ss_state { SESS_ST_INIT = 0, SESS_ST_LINK_SETUP, SESS_ST_END } hdcp_tx_ss_state; struct hdcp_session_data { uint32_t id; hdcp_tx_ss_state state; uint8_t wrap_skey_store; uint8_t riv[HDCP_AKE_RTX_BYTE_LEN]; uint8_t wrap_skey[HDCP_AKE_WKEY_BYTE_LEN]; struct hdcp_link_list ln; }; struct hdcp_session_data *hdcp_session_data_create(void); void hdcp_session_data_destroy(struct hdcp_session_data **ss_data); struct hdcp_link_data *hdcp_link_data_create(void); void hdcp_link_data_destroy(struct hdcp_link_data **lk_data); /* Session list APIs */ void hdcp_session_list_init(struct hdcp_session_list *ss_list); void hdcp_session_list_add(struct hdcp_session_node *new_ent, struct hdcp_session_list *ss_list); void hdcp_session_list_del(struct hdcp_session_node *del_ent, struct hdcp_session_list *ss_list); void hdcp_session_list_print_all(struct hdcp_session_list *ss_list); void hdcp_session_list_destroy(struct hdcp_session_list *ss_list); struct hdcp_session_node *hdcp_session_list_find(uint32_t id, struct hdcp_session_list *ss_list); /* Link list APIs */ void hdcp_link_list_init(struct hdcp_link_list *lk_list); void hdcp_link_list_add(struct hdcp_link_node *new_ent, struct hdcp_link_list *lk_list); void hdcp_link_list_del(struct hdcp_link_node *del_ent, struct hdcp_link_list *lk_list); void hdcp_link_list_print_all(struct hdcp_link_list *lk_list); void hdcp_link_list_destroy(struct hdcp_link_list *lk_list); struct hdcp_link_node *hdcp_link_list_find(uint32_t id, struct hdcp_link_list *lk_list); #endif