blob: e75d96d0b8779df06546628a061ae8bd2e5e8c50 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2022 Samsung Electronics Co., Ltd.
*
* Samsung DisplayPort driver.
*
* 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.
*/
#include <drm/drm_dp_helper.h>
#include <linux/kernel.h>
#include "auth22-internal.h"
#include "dpcd.h"
#include "teeif.h"
#include "hdcp-log.h"
static int do_send_ske_send_eks(struct hdcp_link_data *lk)
{
int ret;
uint8_t type = 0x00;
uint8_t edkey_ks[HDCP_AKE_MKEY_BYTE_LEN];
uint8_t riv[HDCP_RTX_BYTE_LEN];
if (lk->is_aborted)
return -ECANCELED;
ret = teei_generate_riv(riv, sizeof(riv));
if (ret) {
hdcp_err("teei_generate_riv failed (%d)\n", ret);
return -EIO;
}
ret = teei_generate_skey(HDCP_LINK_TYPE_DP, edkey_ks,
HDCP_SKE_SKEY_LEN, 0);
if (ret) {
hdcp_err("teei_generate_skey failed (%d)\n", ret);
return -EIO;
}
ret = hdcp_dplink_send(DP_HDCP_2_2_REG_EDKEY_KS_OFFSET, edkey_ks,
HDCP_AKE_MKEY_BYTE_LEN);
if (ret) {
hdcp_err("edkey_ks send fail. ret(%d)\n", ret);
return -EIO;
}
ret = hdcp_dplink_send(DP_HDCP_2_2_REG_RIV_OFFSET, riv, sizeof(riv));
if (ret) {
hdcp_err("riv send fail. ret(%x)\n", ret);
return -EIO;
}
if (lk->is_repeater)
return 0;
ret = hdcp_dplink_send(DP_HDCP_2_2_REG_STREAM_TYPE_OFFSET, &type,
sizeof(type));
if (ret) {
hdcp_err("type send fail: %x\n", ret);
return -EIO;
}
return 0;
}
int auth22_exchange_session_key(struct hdcp_link_data *lk)
{
/* Send Tx -> Rx: SKE_Send_Eks */
if (do_send_ske_send_eks(lk) < 0) {
hdcp_err("send_ske_send_eks fail\n");
return -EIO;
}
return 0;
}