diff options
author | James Zhao <jamesz@nvidia.com> | 2013-01-03 17:02:01 -0800 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2013-01-08 08:54:43 -0800 |
commit | 4305e7007e73e361fc351d94eb76ce52ff074ed5 (patch) | |
tree | 588a4d0b2cfef78b60770d8d45229830578b88b2 /drivers/video/tegra/dc | |
parent | 65c3cd84cd0b9488cd0b8d0857cd897bfde10aef (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.c | 26 |
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; |