ChromeOS Commit Bot merged this change.
CHROMIUM: drm/rockchip: Make hdcp enable/disable less racy
A couple of things to reduce the races during hdcp enable/disable:
- Cancel any active workers currently transition
- Hold lock while disabling hdcp
BUG=b:64438996
TEST=Run the following script, ensure sequencing is correct:
attr=/sys/class/drm/card1-DP-1/content_protection
printf "Testing HDCP...\n"
while [ 1 ]; do
printf "\rSetting state to desired... "
echo "Desired" > $attr
sleep $(perl -e 'printf("%.1f\n", rand() * 3)')
printf "\rSetting state to undesired..."
echo "Undesired" > $attr
sleep $(perl -e 'printf("%.1f\n", rand() * 3)')
done
Change-Id: I535b23ffb22eba251a595dcdc4c204de80765414
Signed-off-by: Sean Paul <sean...@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/657938
Commit-Ready: Sean Paul <sean...@google.com>
Tested-by: Sean Paul <sean...@google.com>
Reviewed-by: Kristian H. Kristensen <hoeg...@chromium.org>
(cherry picked from commit 81b97e30d758d1083021e0def1817fe5f8ee9d0e)
Reviewed-on: https://chromium-review.googlesource.com/729349
Reviewed-by: Douglas Anderson <dian...@chromium.org>
Tested-by: Douglas Anderson <dian...@chromium.org>
(cherry picked from commit c2d8f1f5e9c86e786c56f411421c7852e4ed5473)
Reviewed-on: https://chromium-review.googlesource.com/741362
Reviewed-by: Philip Chen <phili...@chromium.org>
Commit-Queue: Philip Chen <phili...@chromium.org>
Tested-by: Philip Chen <phili...@chromium.org>
---
M drivers/gpu/drm/rockchip/cdn-dp-core.c
1 file changed, 17 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c
index 201f782..784e2c0 100644
--- a/drivers/gpu/drm/rockchip/cdn-dp-core.c
+++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c
@@ -205,18 +205,16 @@
struct arm_smccc_res res;
uint64_t *buf;
- mutex_lock(&dp->lock);
if (!dp->active) {
dev_err(dp->dev, "firmware is not active\n");
- goto out;
+ return 0;
}
arm_smccc_smc(RK_SIP_HDCP_CONTROL, HDCP_KEY_DATA_START_TRANSFER,
0, 0, 0, 0, 0, 0, &res);
if (res.a0) {
dev_err(dp->dev, "start hdcp transfer failed: %#lx\n", res.a0);
- ret = -EIO;
- goto out;
+ return -EIO;
}
buf = (uint64_t *)&dp->key;
@@ -228,8 +226,7 @@
if (res.a0) {
dev_err(dp->dev, "send hdcp keys failed: %#lx\n", res.a0);
- ret = -EIO;
- goto out;
+ return -EIO;
}
arm_smccc_smc(RK_SIP_HDCP_CONTROL, HDCP_KEY_DATA_START_DECRYPT,
0, 0, 0, 0, 0, 0, &res);
@@ -237,14 +234,12 @@
ret = cdn_dp_hdcp_tx_configuration(dp, HDCP_TX_1, true);
if (ret) {
dev_err(dp->dev, "start hdcp authentication failed: %d\n", ret);
- goto out;
+ return ret;
}
schedule_delayed_work(&dp->hdcp_event_work,
msecs_to_jiffies(HDCP_AUTHENTICATE_DELAY_MS));
-out:
- mutex_unlock(&dp->lock);
return ret;
}
@@ -322,18 +317,22 @@
{
int ret;
- switch (val) {
- case DRM_MODE_CONTENT_PROTECTION_UNDESIRED:
- ret = cdn_dp_hdcp_tx_configuration(dp, HDCP_TX_1, false);
- break;
+ /* Only the driver can set to enabled */
+ if (val == DRM_MODE_CONTENT_PROTECTION_ENABLED)
+ return -EINVAL;
- case DRM_MODE_CONTENT_PROTECTION_DESIRED:
+ /* If we're in a state transition already, wait for it to finish */
+ cancel_delayed_work_sync(&dp->hdcp_event_work);
+
+ mutex_lock(&dp->lock);
+
+ if (val == DRM_MODE_CONTENT_PROTECTION_DESIRED)
ret = cdn_dp_start_hdcp1x_auth(dp);
- break;
+ else
+ ret = cdn_dp_hdcp_tx_configuration(dp, HDCP_TX_1, false);
- case DRM_MODE_CONTENT_PROTECTION_ENABLED:
- ret = -EINVAL;
- }
+ mutex_unlock(&dp->lock);
+
return ret;
}
To view, visit change 741362. To unsubscribe, or for help writing mail filters, visit settings.