From patchwork Tue Aug 24 15:44:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rodrigo Vivi X-Patchwork-Id: 12455369 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 17086C4338F for ; Tue, 24 Aug 2021 15:45:01 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CD8436128A for ; Tue, 24 Aug 2021 15:45:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org CD8436128A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 58755896EC; Tue, 24 Aug 2021 15:45:00 +0000 (UTC) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by gabe.freedesktop.org (Postfix) with ESMTPS id 33770896EC for ; Tue, 24 Aug 2021 15:44:59 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10086"; a="302922209" X-IronPort-AV: E=Sophos;i="5.84,347,1620716400"; d="scan'208";a="302922209" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Aug 2021 08:44:58 -0700 X-IronPort-AV: E=Sophos;i="5.84,347,1620716400"; d="scan'208";a="526671006" Received: from rekhagax-mobl1.amr.corp.intel.com (HELO rdvivi-mobl4.intel.com) ([10.255.33.223]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Aug 2021 08:44:58 -0700 From: Rodrigo Vivi To: intel-gfx@lists.freedesktop.org Cc: Rodrigo Vivi , Imre Deak , Tilak Tangudu Date: Tue, 24 Aug 2021 11:44:51 -0400 Message-Id: <20210824154452.2066678-1-rodrigo.vivi@intel.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 1/2] drm/i915/runtime_pm: Consolidate runtime_pm functions X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" No functional changes. Just revamping the functions with s/dev_priv/i915 and consolidating along with other runtime_pm functions. Cc: Imre Deak Cc: Tilak Tangudu Signed-off-by: Rodrigo Vivi --- drivers/gpu/drm/i915/i915_drv.c | 141 ++---------------------- drivers/gpu/drm/i915/intel_runtime_pm.c | 139 +++++++++++++++++++++++ drivers/gpu/drm/i915/intel_runtime_pm.h | 2 + 3 files changed, 151 insertions(+), 131 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 59fb4c710c8c..14770a404bbd 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -64,7 +64,6 @@ #include "gem/i915_gem_mman.h" #include "gem/i915_gem_pm.h" #include "gt/intel_gt.h" -#include "gt/intel_gt_pm.h" #include "gt/intel_rc6.h" #include "i915_debugfs.h" @@ -1517,144 +1516,24 @@ static int i915_pm_restore(struct device *kdev) return i915_pm_resume(kdev); } -static int intel_runtime_suspend(struct device *kdev) +static int i915_runtime_suspend(struct device *kdev) { - struct drm_i915_private *dev_priv = kdev_to_i915(kdev); - struct intel_runtime_pm *rpm = &dev_priv->runtime_pm; - int ret; + struct drm_i915_private *i915 = kdev_to_i915(kdev); - if (drm_WARN_ON_ONCE(&dev_priv->drm, !HAS_RUNTIME_PM(dev_priv))) + if (drm_WARN_ON_ONCE(&i915->drm, !HAS_RUNTIME_PM(i915))) return -ENODEV; - drm_dbg_kms(&dev_priv->drm, "Suspending device\n"); - - disable_rpm_wakeref_asserts(rpm); - - /* - * We are safe here against re-faults, since the fault handler takes - * an RPM reference. - */ - i915_gem_runtime_suspend(dev_priv); - - intel_gt_runtime_suspend(&dev_priv->gt); - - intel_runtime_pm_disable_interrupts(dev_priv); - - intel_uncore_suspend(&dev_priv->uncore); - - intel_display_power_suspend(dev_priv); - - ret = vlv_suspend_complete(dev_priv); - if (ret) { - drm_err(&dev_priv->drm, - "Runtime suspend failed, disabling it (%d)\n", ret); - intel_uncore_runtime_resume(&dev_priv->uncore); - - intel_runtime_pm_enable_interrupts(dev_priv); - - intel_gt_runtime_resume(&dev_priv->gt); - - enable_rpm_wakeref_asserts(rpm); - - return ret; - } - - enable_rpm_wakeref_asserts(rpm); - intel_runtime_pm_driver_release(rpm); - - if (intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore)) - drm_err(&dev_priv->drm, - "Unclaimed access detected prior to suspending\n"); - - rpm->suspended = true; - - /* - * FIXME: We really should find a document that references the arguments - * used below! - */ - if (IS_BROADWELL(dev_priv)) { - /* - * On Broadwell, if we use PCI_D1 the PCH DDI ports will stop - * being detected, and the call we do at intel_runtime_resume() - * won't be able to restore them. Since PCI_D3hot matches the - * actual specification and appears to be working, use it. - */ - intel_opregion_notify_adapter(dev_priv, PCI_D3hot); - } else { - /* - * current versions of firmware which depend on this opregion - * notification have repurposed the D1 definition to mean - * "runtime suspended" vs. what you would normally expect (D3) - * to distinguish it from notifications that might be sent via - * the suspend path. - */ - intel_opregion_notify_adapter(dev_priv, PCI_D1); - } - - assert_forcewakes_inactive(&dev_priv->uncore); - - if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) - intel_hpd_poll_enable(dev_priv); - - drm_dbg_kms(&dev_priv->drm, "Device suspended\n"); - return 0; + return intel_runtime_pm_suspend(&i915->runtime_pm); } -static int intel_runtime_resume(struct device *kdev) +static int i915_runtime_resume(struct device *kdev) { - struct drm_i915_private *dev_priv = kdev_to_i915(kdev); - struct intel_runtime_pm *rpm = &dev_priv->runtime_pm; - int ret; + struct drm_i915_private *i915 = kdev_to_i915(kdev); - if (drm_WARN_ON_ONCE(&dev_priv->drm, !HAS_RUNTIME_PM(dev_priv))) + if (drm_WARN_ON_ONCE(&i915->drm, !HAS_RUNTIME_PM(i915))) return -ENODEV; - drm_dbg_kms(&dev_priv->drm, "Resuming device\n"); - - drm_WARN_ON_ONCE(&dev_priv->drm, atomic_read(&rpm->wakeref_count)); - disable_rpm_wakeref_asserts(rpm); - - intel_opregion_notify_adapter(dev_priv, PCI_D0); - rpm->suspended = false; - if (intel_uncore_unclaimed_mmio(&dev_priv->uncore)) - drm_dbg(&dev_priv->drm, - "Unclaimed access during suspend, bios?\n"); - - intel_display_power_resume(dev_priv); - - ret = vlv_resume_prepare(dev_priv, true); - - intel_uncore_runtime_resume(&dev_priv->uncore); - - intel_runtime_pm_enable_interrupts(dev_priv); - - /* - * No point of rolling back things in case of an error, as the best - * we can do is to hope that things will still work (and disable RPM). - */ - intel_gt_runtime_resume(&dev_priv->gt); - - /* - * On VLV/CHV display interrupts are part of the display - * power well, so hpd is reinitialized from there. For - * everyone else do it here. - */ - if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) { - intel_hpd_init(dev_priv); - intel_hpd_poll_disable(dev_priv); - } - - intel_enable_ipc(dev_priv); - - enable_rpm_wakeref_asserts(rpm); - - if (ret) - drm_err(&dev_priv->drm, - "Runtime resume failed, disabling it (%d)\n", ret); - else - drm_dbg_kms(&dev_priv->drm, "Device resumed\n"); - - return ret; + return intel_runtime_pm_resume(&i915->runtime_pm); } const struct dev_pm_ops i915_pm_ops = { @@ -1693,8 +1572,8 @@ const struct dev_pm_ops i915_pm_ops = { .restore = i915_pm_restore, /* S0ix (via runtime suspend) event handlers */ - .runtime_suspend = intel_runtime_suspend, - .runtime_resume = intel_runtime_resume, + .runtime_suspend = i915_runtime_suspend, + .runtime_resume = i915_runtime_resume, }; static const struct file_operations i915_driver_fops = { diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index eaf7688f517d..43cdc2f3ff9e 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c @@ -32,6 +32,11 @@ #include "i915_drv.h" #include "i915_trace.h" +#include "gt/intel_gt.h" +#include "gt/intel_gt_pm.h" +#include "intel_pm.h" +#include "vlv_suspend.h" +#include "display/intel_hotplug.h" /** * DOC: runtime pm @@ -652,3 +657,137 @@ void intel_runtime_pm_init_early(struct intel_runtime_pm *rpm) init_intel_runtime_pm_wakeref(rpm); } + +int intel_runtime_pm_suspend(struct intel_runtime_pm *rpm) +{ + struct drm_i915_private *i915 = + container_of(rpm, struct drm_i915_private, runtime_pm); + int ret; + + drm_dbg_kms(&i915->drm, "Suspending device\n"); + + disable_rpm_wakeref_asserts(rpm); + + /* + * We are safe here against re-faults, since the fault handler takes + * an RPM reference. + */ + i915_gem_runtime_suspend(i915); + + intel_gt_runtime_suspend(&i915->gt); + + intel_runtime_pm_disable_interrupts(i915); + + intel_uncore_suspend(&i915->uncore); + + intel_display_power_suspend(i915); + + ret = vlv_suspend_complete(i915); + if (ret) { + drm_err(&i915->drm, + "Runtime suspend failed, disabling it (%d)\n", ret); + intel_uncore_runtime_resume(&i915->uncore); + + intel_runtime_pm_enable_interrupts(i915); + + intel_gt_runtime_resume(&i915->gt); + + enable_rpm_wakeref_asserts(rpm); + + return ret; + } + + enable_rpm_wakeref_asserts(rpm); + intel_runtime_pm_driver_release(rpm); + + if (intel_uncore_arm_unclaimed_mmio_detection(&i915->uncore)) + drm_err(&i915->drm, + "Unclaimed access detected prior to suspending\n"); + + rpm->suspended = true; + + /* + * FIXME: We really should find a document that references the arguments + * used below! + */ + if (IS_BROADWELL(i915)) { + /* + * On Broadwell, if we use PCI_D1 the PCH DDI ports will stop + * being detected, and the call we do at intel_runtime_resume() + * won't be able to restore them. Since PCI_D3hot matches the + * actual specification and appears to be working, use it. + */ + intel_opregion_notify_adapter(i915, PCI_D3hot); + } else { + /* + * current versions of firmware which depend on this opregion + * notification have repurposed the D1 definition to mean + * "runtime suspended" vs. what you would normally expect (D3) + * to distinguish it from notifications that might be sent via + * the suspend path. + */ + intel_opregion_notify_adapter(i915, PCI_D1); + } + + assert_forcewakes_inactive(&i915->uncore); + + if (!IS_VALLEYVIEW(i915) && !IS_CHERRYVIEW(i915)) + intel_hpd_poll_enable(i915); + + drm_dbg_kms(&i915->drm, "Device suspended\n"); + return 0; +} + +int intel_runtime_pm_resume(struct intel_runtime_pm *rpm) +{ + struct drm_i915_private *i915 = + container_of(rpm, struct drm_i915_private, runtime_pm); + int ret; + + drm_dbg_kms(&i915->drm, "Resuming device\n"); + + drm_WARN_ON_ONCE(&i915->drm, atomic_read(&rpm->wakeref_count)); + disable_rpm_wakeref_asserts(rpm); + + intel_opregion_notify_adapter(i915, PCI_D0); + rpm->suspended = false; + if (intel_uncore_unclaimed_mmio(&i915->uncore)) + drm_dbg(&i915->drm, + "Unclaimed access during suspend, bios?\n"); + + intel_display_power_resume(i915); + + ret = vlv_resume_prepare(i915, true); + + intel_uncore_runtime_resume(&i915->uncore); + + intel_runtime_pm_enable_interrupts(i915); + + /* + * No point of rolling back things in case of an error, as the best + * we can do is to hope that things will still work (and disable RPM). + */ + intel_gt_runtime_resume(&i915->gt); + + /* + * On VLV/CHV display interrupts are part of the display + * power well, so hpd is reinitialized from there. For + * everyone else do it here. + */ + if (!IS_VALLEYVIEW(i915) && !IS_CHERRYVIEW(i915)) { + intel_hpd_init(i915); + intel_hpd_poll_disable(i915); + } + + intel_enable_ipc(i915); + + enable_rpm_wakeref_asserts(rpm); + + if (ret) + drm_err(&i915->drm, + "Runtime resume failed, disabling it (%d)\n", ret); + else + drm_dbg_kms(&i915->drm, "Device resumed\n"); + + return ret; +} diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.h b/drivers/gpu/drm/i915/intel_runtime_pm.h index 47a85fab4130..bde26f497914 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.h +++ b/drivers/gpu/drm/i915/intel_runtime_pm.h @@ -172,6 +172,8 @@ void intel_runtime_pm_init_early(struct intel_runtime_pm *rpm); void intel_runtime_pm_enable(struct intel_runtime_pm *rpm); void intel_runtime_pm_disable(struct intel_runtime_pm *rpm); void intel_runtime_pm_driver_release(struct intel_runtime_pm *rpm); +int intel_runtime_pm_suspend(struct intel_runtime_pm *rpm); +int intel_runtime_pm_resume(struct intel_runtime_pm *rpm); intel_wakeref_t intel_runtime_pm_get(struct intel_runtime_pm *rpm); intel_wakeref_t intel_runtime_pm_get_if_in_use(struct intel_runtime_pm *rpm); From patchwork Tue Aug 24 15:44:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rodrigo Vivi X-Patchwork-Id: 12455371 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C1ED0C4338F for ; Tue, 24 Aug 2021 15:45:03 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 87E2761265 for ; Tue, 24 Aug 2021 15:45:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 87E2761265 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3A8A889904; Tue, 24 Aug 2021 15:45:01 +0000 (UTC) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by gabe.freedesktop.org (Postfix) with ESMTPS id AC622896EC for ; Tue, 24 Aug 2021 15:44:59 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10086"; a="302922210" X-IronPort-AV: E=Sophos;i="5.84,347,1620716400"; d="scan'208";a="302922210" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Aug 2021 08:44:59 -0700 X-IronPort-AV: E=Sophos;i="5.84,347,1620716400"; d="scan'208";a="526671016" Received: from rekhagax-mobl1.amr.corp.intel.com (HELO rdvivi-mobl4.intel.com) ([10.255.33.223]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Aug 2021 08:44:58 -0700 From: Rodrigo Vivi To: intel-gfx@lists.freedesktop.org Cc: Rodrigo Vivi , Imre Deak , Tilak Tangudu Date: Tue, 24 Aug 2021 11:44:52 -0400 Message-Id: <20210824154452.2066678-2-rodrigo.vivi@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210824154452.2066678-1-rodrigo.vivi@intel.com> References: <20210824154452.2066678-1-rodrigo.vivi@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 2/2] drm/i915/runtime_pm: Let's avoid the undocumented D1 opregion notification. X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" At least for newer generations, let's try to do the right thing that is to notify the opregion that we are going into D3hot. But to avoid breaking the world let's keep the older undocumented behavior in place. Cc: Imre Deak Cc: Tilak Tangudu Signed-off-by: Rodrigo Vivi --- drivers/gpu/drm/i915/intel_runtime_pm.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index 43cdc2f3ff9e..371bbc58db92 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c @@ -706,27 +706,19 @@ int intel_runtime_pm_suspend(struct intel_runtime_pm *rpm) rpm->suspended = true; - /* - * FIXME: We really should find a document that references the arguments - * used below! - */ - if (IS_BROADWELL(i915)) { - /* - * On Broadwell, if we use PCI_D1 the PCH DDI ports will stop - * being detected, and the call we do at intel_runtime_resume() - * won't be able to restore them. Since PCI_D3hot matches the - * actual specification and appears to be working, use it. - */ - intel_opregion_notify_adapter(i915, PCI_D3hot); - } else { + if (GRAPHICS_VER(i915) < 8) { /* - * current versions of firmware which depend on this opregion - * notification have repurposed the D1 definition to mean + * Some older versions of firmware which depend on this opregion + * notification had repurposed the D1 definition to mean * "runtime suspended" vs. what you would normally expect (D3) * to distinguish it from notifications that might be sent via - * the suspend path. + * the suspend path. Unfortunately there's no documentation + * available right now to justify this flow. However let's + * keep for historical reasons. */ intel_opregion_notify_adapter(i915, PCI_D1); + } else { + intel_opregion_notify_adapter(i915, PCI_D3hot); } assert_forcewakes_inactive(&i915->uncore);