From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 08:20:59 +0000 Subject: [PATCH] kernel_5.10 no rt --- kernel/drivers/gpu/drm/rockchip/dw-dp.c | 28 +++++++++++++++++++++++++--- 1 files changed, 25 insertions(+), 3 deletions(-) diff --git a/kernel/drivers/gpu/drm/rockchip/dw-dp.c b/kernel/drivers/gpu/drm/rockchip/dw-dp.c index 1f39998..31136d4 100644 --- a/kernel/drivers/gpu/drm/rockchip/dw-dp.c +++ b/kernel/drivers/gpu/drm/rockchip/dw-dp.c @@ -239,8 +239,14 @@ #define DPTX_HDCP22GPIOCHNGSTS 0x362c #define DPTX_HDCPREG_DPK_CRC 0x3630 +#define HDCP_KEY_SIZE 308 +#define HDCP_KEY_SEED_SIZE 2 + #define HDCP_DATA_SIZE 330 #define DP_HDCP1X_ID 6 + +#define HDCP_SIG_MAGIC 0x4B534541 /* "AESK" */ +#define HDCP_FLG_AES 1 #define DPTX_MAX_REGISTER DPTX_HDCPREG_DPK_CRC @@ -407,6 +413,14 @@ int color_format; }; +struct hdcp_key_data_t { + unsigned int signature; + unsigned int length; + unsigned int crc; + unsigned int flags; + unsigned char data[]; +}; + enum { DPTX_VM_RGB_6BIT, DPTX_VM_RGB_8BIT, @@ -499,6 +513,8 @@ u8 hdcp_vendor_data[HDCP_DATA_SIZE + 1]; void __iomem *base; struct arm_smccc_res res; + struct hdcp_key_data_t *key_data; + bool aes_encrypt; regmap_read(dp->regmap, DPTX_HDCPREG_RMLSTS, &val); if (FIELD_GET(IDPK_DATA_INDEX, val) == 40) { @@ -507,10 +523,16 @@ } size = rk_vendor_read(DP_HDCP1X_ID, hdcp_vendor_data, HDCP_DATA_SIZE); - if (size < HDCP_DATA_SIZE) { - dev_info(dp->dev, "HDCP: read size %d\n", size); + if (size < (HDCP_KEY_SIZE + HDCP_KEY_SEED_SIZE)) { + dev_info(dp->dev, "HDCP key read error, size: %d\n", size); return -EINVAL; } + + key_data = (struct hdcp_key_data_t *)hdcp_vendor_data; + if ((key_data->signature != HDCP_SIG_MAGIC) || !(key_data->flags & HDCP_FLG_AES)) + aes_encrypt = false; + else + aes_encrypt = true; base = sip_hdcp_request_share_memory(dp->id ? DP_TX1 : DP_TX0); if (!base) @@ -518,7 +540,7 @@ memcpy_toio(base, hdcp_vendor_data, size); - res = sip_hdcp_config(HDCP_FUNC_KEY_LOAD, dp->id ? DP_TX1 : DP_TX0, 0); + res = sip_hdcp_config(HDCP_FUNC_KEY_LOAD, dp->id ? DP_TX1 : DP_TX0, !aes_encrypt); if (IS_SIP_ERROR(res.a0)) { dev_err(dp->dev, "load hdcp key failed\n"); return -EBUSY; -- Gitblit v1.6.2