blob: 02cbdac2f02a847c8e2485e1e578ca5dde57b4c8 [file] [log] [blame]
/*
* 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