video: tegra: hdmi: Disable HDCP for BlackMagic
Aly Hirani [Fri, 3 Feb 2017 00:06:55 +0000 (16:06 -0800)]
BlackMagic 12G has a bug where it spams us with a constant stream of
hotplugs 130 ms apart if we enable HDCP. This stream of hotplugs end up
as a "blank screen" since we are stuck in a loop of modeset and display
teardown.

Since it doesn't support HDCP, this change blacklists it from HDCP. Once
done, it never sends us a hotplug and the device works perfectly after.

Bug 1870842

Change-Id: Id93b7e9bb1e11ca0cb969c9a8179bae7b4c64072
Signed-off-by: Aly Hirani <ahirani@nvidia.com>
Reviewed-on: http://git-master/r/1298315
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Vinayak Pane <vpane@nvidia.com>
Reviewed-by: Pranami Bhattacharya <pranamib@nvidia.com>
Reviewed-by: Mitch Luban <mluban@nvidia.com>
Reviewed-by: Prafull Suryawanshi <prafulls@nvidia.com>

drivers/video/tegra/dc/edid.h
drivers/video/tegra/dc/edid_quirks.c
drivers/video/tegra/dc/hdmihdcp.c

index 7547ac3..b5b9879 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) 2010 Google, Inc.
  * Author: Erik Gilling <konkers@android.com>
  *
- * Copyright (c) 2011-2016, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2011-2017, NVIDIA CORPORATION.  All rights reserved.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -134,6 +134,8 @@ enum {
 #define TEGRA_EDID_QUIRK_NO_YUV     (1 << 0)
 /* TV needs us to delay HDCP by a few seconds */
 #define TEGRA_EDID_QUIRK_DELAY_HDCP (1 << 1)
+/* TVs that blank screen if we try to do HDCP at all */
+#define TEGRA_EDID_QUIRK_NO_HDCP    (1 << 2)
 
 struct tegra_edid {
        struct tegra_edid_pvt   *data;
index 74a6a26..9229d2c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * drivers/video/tegra/dc/edid_quirks.c
  *
- * Copyright (c) 2015, NVIDIA CORPORATION, All rights reserved.
+ * Copyright (c) 2015-2017, NVIDIA CORPORATION, All rights reserved.
  * Author: Anshuman Nath Kar <anshumank@nvidia.com>
  *
  * This software is licensed under the terms of the GNU General Public
@@ -29,6 +29,8 @@ static const struct hdmi_blacklist {
        { "VIZ", 4120, "P55-C1",    TEGRA_EDID_QUIRK_DELAY_HDCP },
        { "VIZ", 4120, "P65-C1",    TEGRA_EDID_QUIRK_DELAY_HDCP },
        { "VIZ", 4120, "P75-C1",    TEGRA_EDID_QUIRK_DELAY_HDCP },
+       /* BlackMagic 12G SDI */
+       { "BMD", 0,    "BMD HDMI",  TEGRA_EDID_QUIRK_NO_HDCP    },
 };
 
 u32 tegra_edid_lookup_quirks(const char *manufacturer, u32 model,
index ce9d45e..17d1d2a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * drivers/video/tegra/dc/hdmihdcp.c
  *
- * Copyright (c) 2014-2016, NVIDIA CORPORATION, All rights reserved.
+ * Copyright (c) 2014-2017, NVIDIA CORPORATION, All rights reserved.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -1811,7 +1811,10 @@ static int tegra_nvhdcp_on(struct tegra_nvhdcp *nvhdcp)
        nvhdcp->state = STATE_UNAUTHENTICATED;
        if (nvhdcp_is_plugged(nvhdcp) &&
                atomic_read(&nvhdcp->policy) !=
-               TEGRA_DC_HDCP_POLICY_ALWAYS_OFF) {
+               TEGRA_DC_HDCP_POLICY_ALWAYS_OFF &&
+               !(tegra_edid_get_quirks(nvhdcp->hdmi->edid) &
+                 TEGRA_EDID_QUIRK_NO_HDCP)
+               ) {
                nvhdcp->fail_count = 0;
                e = nvhdcp_i2c_read8(nvhdcp, HDCP_HDCP2_VERSION, &hdcp2version);
                if (e)