summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc
diff options
context:
space:
mode:
authorJames Zhao <jamesz@nvidia.com>2013-01-03 17:02:01 -0800
committerMandar Padmawar <mpadmawar@nvidia.com>2013-01-08 08:54:43 -0800
commit4305e7007e73e361fc351d94eb76ce52ff074ed5 (patch)
tree588a4d0b2cfef78b60770d8d45229830578b88b2 /drivers/video/tegra/dc
parent65c3cd84cd0b9488cd0b8d0857cd897bfde10aef (diff)
HDCP: export nvhdcp state using ioctl
Export nvhdcp state to user land to check hdcp link is verified before doing anything else. Change-Id: Ib647b311d58225aa52236bf73aabc0adf0e93776 Signed-off-by: James Zhao <jamesz@nvidia.com> Reviewed-on: http://git-master/r/188466 Reviewed-by: Dan Willemsen <dwillemsen@nvidia.com>
Diffstat (limited to 'drivers/video/tegra/dc')
-rw-r--r--drivers/video/tegra/dc/nvhdcp.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/video/tegra/dc/nvhdcp.c b/drivers/video/tegra/dc/nvhdcp.c
index 10c451d9ff74..261d1a877c90 100644
--- a/drivers/video/tegra/dc/nvhdcp.c
+++ b/drivers/video/tegra/dc/nvhdcp.c
@@ -470,6 +470,20 @@ static int verify_ksv(u64 k)
return (i != 20) ? -EINVAL : 0;
}
+static int get_nvhdcp_state(struct tegra_nvhdcp *nvhdcp,
+ struct tegra_nvhdcp_packet *pkt)
+{
+ mutex_lock(&nvhdcp->lock);
+ if (nvhdcp->state != STATE_LINK_VERIFY) {
+ memset(pkt, 0, sizeof *pkt);
+ pkt->packet_results = TEGRA_NVHDCP_RESULT_LINK_FAILED;
+ } else {
+ pkt->packet_results = TEGRA_NVHDCP_RESULT_SUCCESS;
+ }
+ mutex_unlock(&nvhdcp->lock);
+ return 0;
+}
+
/* get Status and Kprime signature - READ_S on TMDS0_LINK0 only */
static int get_s_prime(struct tegra_nvhdcp *nvhdcp, struct tegra_nvhdcp_packet *pkt)
{
@@ -1158,6 +1172,18 @@ static long nvhdcp_dev_ioctl(struct file *filp,
case TEGRAIO_NVHDCP_RENEGOTIATE:
e = tegra_nvhdcp_renegotiate(nvhdcp);
break;
+
+ case TEGRAIO_NVHDCP_HDCP_STATE:
+ pkt = kmalloc(sizeof(*pkt), GFP_KERNEL);
+ if (!pkt)
+ return -ENOMEM;
+ e = get_nvhdcp_state(nvhdcp, pkt);
+ if (copy_to_user((void __user *)arg, pkt, sizeof(*pkt))) {
+ e = -EFAULT;
+ goto kfree_pkt;
+ }
+ kfree(pkt);
+ return e;
}
return e;