From patchwork Fri Jan 5 08:46:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: sagar.a.kamble@intel.com X-Patchwork-Id: 10146091 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 8D83060244 for ; Fri, 5 Jan 2018 08:43:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8555F288A1 for ; Fri, 5 Jan 2018 08:43:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7A785288A7; Fri, 5 Jan 2018 08:43:44 +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 D8D82288A1 for ; Fri, 5 Jan 2018 08:43:43 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6EC2A6E2F2; Fri, 5 Jan 2018 08:43:43 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5F3016E2F1 for ; Fri, 5 Jan 2018 08:43:42 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jan 2018 00:43:42 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,317,1511856000"; d="scan'208";a="192452332" Received: from sakamble-desktop.iind.intel.com ([10.223.26.10]) by fmsmga005.fm.intel.com with ESMTP; 05 Jan 2018 00:43:40 -0800 From: Sagar Arun Kamble To: intel-gfx@lists.freedesktop.org Date: Fri, 5 Jan 2018 14:16:58 +0530 Message-Id: <1515142021-24232-7-git-send-email-sagar.a.kamble@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1515142021-24232-1-git-send-email-sagar.a.kamble@intel.com> References: <1515142021-24232-1-git-send-email-sagar.a.kamble@intel.com> Subject: [Intel-gfx] [PATCH v4 6/9] drm/i915/guc: Make GuC log related functions depend only on log level X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP With GuC log level set properly only for cases where GuC is loaded we can remove the GuC submission checks from flush_guc_logs and guc_log_register, unregister and uc_fini_hw functions. It is important to note that GuC log runtime data has to be freed during driver unregister. Freeing of that data can't be gated by guc_log_level check because if we free GuC log runtime only when log level >=0 then it will not be destroyed when logging is disabled after enabling before driver unload. Also, with this patch GuC interrupts are enabled first after GuC load if logging is enabled. GuC to Host interrupts will be needed for GuC CTB mechanism and hence we will be adding client support to control the interrupt for Log and CTB feature in next patch. To prepare for that all interrupt updates are now gated by GuC log level checks through new functions intel_guc_log_*_interrupts. v2: Rebase. Updated check in i915_guc_log_unregister to be based on guc_log_level. (Michal Wajdeczko) v3: Rebase. Made all GuC log related functions depend only log level. Updated uC init w.r.t enabling of GuC interrupts. Commit message update. Rebase w.r.t guc_log_level immutable changes. (Tvrtko) v4: Rebase. Prepared new functions intel_guc_log_*_interrupts to reduce log level checks. (Michal) Added HAS_GUC checks to i915_guc_log_register/unregister as the parameter is not sanitized. (Sagar) Signed-off-by: Sagar Arun Kamble Cc: Michal Wajdeczko Cc: Daniele Ceraolo Spurio Cc: Tvrtko Ursulin Cc: Chris Wilson Cc: Joonas Lahtinen --- drivers/gpu/drm/i915/intel_guc.c | 5 ++--- drivers/gpu/drm/i915/intel_guc_log.c | 29 +++++++++++++++++++++-------- drivers/gpu/drm/i915/intel_guc_log.h | 2 ++ drivers/gpu/drm/i915/intel_uc.c | 13 ++++++------- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_guc.c b/drivers/gpu/drm/i915/intel_guc.c index 710b4c4..7b06c7b 100644 --- a/drivers/gpu/drm/i915/intel_guc.c +++ b/drivers/gpu/drm/i915/intel_guc.c @@ -406,7 +406,7 @@ int intel_guc_suspend(struct drm_i915_private *dev_priv) if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS) return 0; - intel_guc_disable_interrupts(guc); + intel_guc_log_disable_interrupts(guc); data[0] = INTEL_GUC_ACTION_ENTER_S_STATE; /* any value greater than GUC_POWER_D0 */ @@ -451,8 +451,7 @@ int intel_guc_resume(struct drm_i915_private *dev_priv) if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS) return 0; - if (guc->log.level >= 0) - intel_guc_enable_interrupts(guc); + intel_guc_log_enable_interrupts(guc); data[0] = INTEL_GUC_ACTION_EXIT_S_STATE; data[1] = GUC_POWER_D0; diff --git a/drivers/gpu/drm/i915/intel_guc_log.c b/drivers/gpu/drm/i915/intel_guc_log.c index aa6434a..1e535e6 100644 --- a/drivers/gpu/drm/i915/intel_guc_log.c +++ b/drivers/gpu/drm/i915/intel_guc_log.c @@ -483,12 +483,11 @@ static void guc_log_capture_logs(struct intel_guc *guc) static void guc_flush_logs(struct intel_guc *guc) { - if (!USES_GUC_SUBMISSION(dev_priv) || - guc->log.level < 0) + if (guc->log.level < 0) return; /* First disable the interrupts, will be renabled afterwards */ - intel_guc_disable_interrupts(guc); + intel_guc_log_disable_interrupts(guc); /* Before initiating the forceful flush, wait for any pending/ongoing * flush to complete otherwise forceful flush may not actually happen. @@ -594,7 +593,7 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val) } /* GuC logging is currently the only user of Guc2Host interrupts */ - intel_guc_enable_interrupts(guc); + intel_guc_log_enable_interrupts(guc); } else { /* Once logging is disabled, GuC won't generate logs & send an * interrupt. But there could be some data in the log buffer @@ -612,8 +611,10 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val) void i915_guc_log_register(struct drm_i915_private *dev_priv) { - if (!USES_GUC_SUBMISSION(dev_priv) || - dev_priv->guc.log.level < 0) + if (!HAS_GUC(dev_priv)) + return; + + if (dev_priv->guc.log.level < 0) return; mutex_lock(&dev_priv->drm.struct_mutex); @@ -623,15 +624,27 @@ void i915_guc_log_register(struct drm_i915_private *dev_priv) void i915_guc_log_unregister(struct drm_i915_private *dev_priv) { - if (!USES_GUC_SUBMISSION(dev_priv)) + if (!HAS_GUC(dev_priv)) return; mutex_lock(&dev_priv->drm.struct_mutex); /* GuC logging is currently the only user of Guc2Host interrupts */ intel_runtime_pm_get(dev_priv); - intel_guc_disable_interrupts(&dev_priv->guc); + intel_guc_log_disable_interrupts(&dev_priv->guc); intel_runtime_pm_put(dev_priv); intel_guc_log_runtime_destroy(&dev_priv->guc); mutex_unlock(&dev_priv->drm.struct_mutex); } + +void intel_guc_log_enable_interrupts(struct intel_guc *guc) +{ + if (guc->log.level >= 0) + intel_guc_enable_interrupts(guc); +} + +void intel_guc_log_disable_interrupts(struct intel_guc *guc) +{ + if (guc->log.level >= 0) + intel_guc_disable_interrupts(guc); +} diff --git a/drivers/gpu/drm/i915/intel_guc_log.h b/drivers/gpu/drm/i915/intel_guc_log.h index 362bbef..fbb6cf1 100644 --- a/drivers/gpu/drm/i915/intel_guc_log.h +++ b/drivers/gpu/drm/i915/intel_guc_log.h @@ -63,5 +63,7 @@ struct intel_guc_log { int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val); void i915_guc_log_register(struct drm_i915_private *dev_priv); void i915_guc_log_unregister(struct drm_i915_private *dev_priv); +void intel_guc_log_enable_interrupts(struct intel_guc *guc); +void intel_guc_log_disable_interrupts(struct intel_guc *guc); #endif diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c index 4d9031d..86e04c2 100644 --- a/drivers/gpu/drm/i915/intel_uc.c +++ b/drivers/gpu/drm/i915/intel_uc.c @@ -318,9 +318,11 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv) if (ret) goto err_log_capture; + intel_guc_log_enable_interrupts(guc); + ret = guc_enable_communication(guc); if (ret) - goto err_log_capture; + goto err_log_interrupts; if (USES_HUC(dev_priv)) { ret = intel_huc_auth(huc); @@ -329,12 +331,9 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv) } if (USES_GUC_SUBMISSION(dev_priv)) { - if (guc->log.level >= 0) - intel_guc_enable_interrupts(guc); - ret = intel_guc_submission_enable(guc); if (ret) - goto err_interrupts; + goto err_communication; } dev_info(dev_priv->drm.dev, "GuC firmware version %u.%u\n", @@ -349,10 +348,10 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv) /* * We've failed to load the firmware :( */ -err_interrupts: - intel_guc_disable_interrupts(guc); err_communication: guc_disable_communication(guc); +err_log_interrupts: + intel_guc_log_disable_interrupts(guc); err_log_capture: guc_capture_load_err_log(guc); err_out: