From patchwork Wed Jul 12 08:29:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ramalingam C X-Patchwork-Id: 9836305 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 518FA60393 for ; Wed, 12 Jul 2017 08:31:55 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4481D2766D for ; Wed, 12 Jul 2017 08:31:55 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 396E528450; Wed, 12 Jul 2017 08:31:55 +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=ham 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 40BBA27FB3 for ; Wed, 12 Jul 2017 08:31:54 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D69B06E3EE; Wed, 12 Jul 2017 08:30:12 +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 521BA6E3ED; Wed, 12 Jul 2017 08:30:11 +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:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,349,1496127600"; d="scan'208";a="126135250" Received: from mint-dev.iind.intel.com ([10.223.25.164]) by fmsmga006.fm.intel.com with ESMTP; 12 Jul 2017 01:30:08 -0700 From: Ramalingam C To: dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, daniel.vetter@intel.com Subject: [RFC v1 20/20] drm/hdcp2.2: HDCP2.2 disable as a asynchronous work Date: Wed, 12 Jul 2017 13:59:04 +0530 Message-Id: <1499848144-8456-21-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.2 Disable might take some time to destroy the ongoing link integrity check thread, to disable the encryption and deauthenticate the port. So Just to unblock the caller like hotplug handler or IOCTL we are scheduling the HDCP2.2 disable as an asynchronous work. Once HDCP is disabled, DRM Property will be updated. Signed-off-by: Ramalingam C --- drivers/gpu/drm/drm_hdcp.c | 30 +++++++++++++++++++++++++++--- include/drm/drm_hdcp.h | 1 + 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_hdcp.c b/drivers/gpu/drm/drm_hdcp.c index 9e1b7ae..a1130d8 100644 --- a/drivers/gpu/drm/drm_hdcp.c +++ b/drivers/gpu/drm/drm_hdcp.c @@ -103,6 +103,30 @@ static int drm_hdcp_2_2_enable(struct drm_hdcp *hdcp, uint8_t stream_type) return 0; } +void hdcp_2_2_disable_work(struct work_struct *work) +{ + struct drm_hdcp *hdcp = container_of(work, struct drm_hdcp, + hdcp2_disable_work); + + mutex_lock(&hdcp->mutex); + + hdcp->req_state &= ~DRM_HDCP_ENABLE; + + /* + * TODO: Implement the HDCP2.2 Disable Sequence + */ + + drm_hdcp_update_change(hdcp, false, 0, false); + + mutex_unlock(&hdcp->mutex); +} + +void drm_hdcp_2_2_disable(struct drm_hdcp *hdcp) +{ + if (!schedule_work(&hdcp->hdcp2_disable_work)) + DRM_ERROR("Disable work is already in queue\n"); +} + int drm_hdcp_enable(struct drm_connector *connector, uint8_t stream_type) { struct drm_hdcp *hdcp = connector->hdcp; @@ -134,9 +158,8 @@ int drm_hdcp_disable(struct drm_connector *connector) return 0; } - /* - * TODO: Invoke the Version specific hdcp_disable - */ + if (hdcp->spec_ver_used & HDCP_2_2_SUPPORT) + drm_hdcp_2_2_disable(hdcp); return 0; } @@ -293,6 +316,7 @@ static inline int drm_hdcp2_init(struct drm_connector *connector, hdcp->streams[0].stream_type = HDCP_STREAM_TYPE0_CODE; INIT_WORK(&hdcp->hdcp2_enable_work, hdcp_2_2_enable_work); + INIT_WORK(&hdcp->hdcp2_disable_work, hdcp_2_2_disable_work); return 0; } diff --git a/include/drm/drm_hdcp.h b/include/drm/drm_hdcp.h index ea18bac..bff229f 100644 --- a/include/drm/drm_hdcp.h +++ b/include/drm/drm_hdcp.h @@ -382,6 +382,7 @@ struct drm_hdcp { const struct drm_hdcp2_funcs *hdcp2_funcs; struct work_struct hdcp2_enable_work; + struct work_struct hdcp2_disable_work; struct mutex mutex; };