From patchwork Wed Jul 12 08:29:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ramalingam C X-Patchwork-Id: 9836303 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 0022860393 for ; Wed, 12 Jul 2017 08:31:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E6D612766D for ; Wed, 12 Jul 2017 08:31:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DB6DB28450; Wed, 12 Jul 2017 08:31:48 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 96CB42766D for ; Wed, 12 Jul 2017 08:31:48 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 069246E3EA; Wed, 12 Jul 2017 08:30:10 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id A78026E3E3; Wed, 12 Jul 2017 08:30:08 +0000 (UTC) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Jul 2017 01:30:08 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,349,1496127600"; d="scan'208";a="126135237" Received: from mint-dev.iind.intel.com ([10.223.25.164]) by fmsmga006.fm.intel.com with ESMTP; 12 Jul 2017 01:30:06 -0700 From: Ramalingam C To: dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, daniel.vetter@intel.com Subject: [RFC v1 19/20] drm/hdcp2.2: HDCP2.2 enable as a asynchronous work Date: Wed, 12 Jul 2017 13:59:03 +0530 Message-Id: <1499848144-8456-20-git-send-email-ramalingam.c@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1499848144-8456-1-git-send-email-ramalingam.c@intel.com> References: <1499848144-8456-1-git-send-email-ramalingam.c@intel.com> Cc: Ramalingam C , uma.shankar@intel.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP HDCP2 Authentication might take more then 5Secs based on the downstream topology. So when atomic property set ioctl requests for HDCP enable, We schedule the HDCP2 enbale as a asynchronous work by not blocking the ioctl call. The Result of the work will be updated to the DRM Property. Signed-off-by: Ramalingam C --- drivers/gpu/drm/drm_hdcp.c | 40 +++++++++++++++++++++++++++++++++++++--- include/drm/drm_hdcp.h | 8 ++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_hdcp.c b/drivers/gpu/drm/drm_hdcp.c index cb20cc9..9e1b7ae 100644 --- a/drivers/gpu/drm/drm_hdcp.c +++ b/drivers/gpu/drm/drm_hdcp.c @@ -69,6 +69,39 @@ static void drm_hdcp_update_change(struct drm_hdcp *hdcp, bool enabled, } } +static void hdcp_2_2_enable_work(struct work_struct *work) +{ + struct drm_hdcp *hdcp = container_of(work, struct drm_hdcp, + hdcp2_enable_work); + + mutex_lock(&hdcp->mutex); + + /* Marking it as WIP */ + drm_hdcp_update_change(hdcp, false, DRM_HDCP_WIP, true); + hdcp->spec_ver_used = HDCP_2_2_SUPPORT; + + /* + * TODO: Implement the HDCP2.2 authentication and Encryption Enable + */ + mutex_unlock(&hdcp->mutex); +} + +static int drm_hdcp_2_2_enable(struct drm_hdcp *hdcp, uint8_t stream_type) +{ + mutex_lock(&hdcp->mutex); + + /* Set the stream type */ + hdcp->streams[0].stream_type = stream_type; + + hdcp->req_state &= ~(DRM_HDCP_ENABLE | DRM_HDCP_TYPE_MASK); + hdcp->req_state = DRM_HDCP_ENABLE | + (stream_type << DRM_HDCP_TYPE_SHIFT); + + schedule_work(&hdcp->hdcp2_enable_work); + + mutex_unlock(&hdcp->mutex); + return 0; +} int drm_hdcp_enable(struct drm_connector *connector, uint8_t stream_type) { @@ -83,9 +116,8 @@ int drm_hdcp_enable(struct drm_connector *connector, uint8_t stream_type) return ret; } - /* - * TODO: Invoke the Version specific hdcp_enable - */ + if (connector->hdcp_state & DRM_HDCP2_SUPPORTED) + return drm_hdcp_2_2_enable(hdcp, stream_type); return 0; } @@ -260,6 +292,8 @@ static inline int drm_hdcp2_init(struct drm_connector *connector, /* Setting it to Type 0 by default */ hdcp->streams[0].stream_type = HDCP_STREAM_TYPE0_CODE; + INIT_WORK(&hdcp->hdcp2_enable_work, hdcp_2_2_enable_work); + return 0; } diff --git a/include/drm/drm_hdcp.h b/include/drm/drm_hdcp.h index dac9831..ea18bac 100644 --- a/include/drm/drm_hdcp.h +++ b/include/drm/drm_hdcp.h @@ -366,6 +366,12 @@ struct drm_hdcp { uint32_t ver_support_on_plat; uint32_t ver_support_on_panel; + /* + * HDCP ver last used for Enable. Will help to choose the + * corresponding Version's disable. + */ + uint32_t spec_ver_used; + /* HDCP requested state and also the current state */ uint64_t req_state; @@ -375,6 +381,8 @@ struct drm_hdcp { const struct drm_hdcp_funcs *hdcp_funcs; const struct drm_hdcp2_funcs *hdcp2_funcs; + struct work_struct hdcp2_enable_work; + struct mutex mutex; };