Received: by 2002:a05:6358:11c7:b0:104:8066:f915 with SMTP id i7csp374551rwl; Wed, 29 Mar 2023 03:13:31 -0700 (PDT) X-Google-Smtp-Source: AKy350aSwPdnvjHbQ5BkCg4lIixhgV/NmqZweeQ4DpcBB8VvkMAdiueqfZhCtytUDZ42+WC8uFvJ X-Received: by 2002:a17:90a:1042:b0:23f:e165:3452 with SMTP id y2-20020a17090a104200b0023fe1653452mr21058316pjd.0.1680084811437; Wed, 29 Mar 2023 03:13:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680084811; cv=none; d=google.com; s=arc-20160816; b=Sg/y3G2VRPBKX+yd3eMx8zMyZ5XO/rPjfu8+HKsJ3NpWroCcPQp0T+s7BuqCctHi/C DFnJRbEbjkR459PyojvcKPcy/YRM+QOjQSQALSdrDpSjzGaAM1OTxRX9EsiaHJO6CO4S L3Devvs0LCZmvmbbrIYK6rczL9PCQDDgTNZlizY76jzmHMufZOiiEzYjvcqSdwhj8pWW 2v0kMJU6nowMmh2vkmGP/Ky/dAWMd2I/KhufcUWAfbpxv9odvNrUKaFNqZO48WzlY+MM hLX56l3fq/eOFAWeBR8Dy9AGt9ZVsYEfwC4GQpLALmBVFm24QSiEcGGfEmr7JQtGSpYG rdRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=X736Xo2cMDDW60Y3vTbzigd2Xc6Dr2xSpP9bWqw8uGc=; b=afr/dFTNXd5XjD5tNTWMzseSf13u8NDInupZH1SZHun8nNydcDddLroU8pzu1EtnR/ PBjV6YT/+MqiwkBl/JwdfNiKm+ATQ7wgkqE14rk0kfAXrJET+2mzGJlnu6dAvAwy4O+q B3SIEuNyKdUVSPBndPGAP3eAp/gAeB5tfwrbssOhSlaoo3mwp5AY5zCFwQwZHMRV1uWB bx/fZ3m2kitrCOgte73eca7vVE97HcNNbdm5uy7QgubozHJY/gK34kTU1DzKff22+9tk psuKcozF0ICbq3yOkv+8tmYfJyYag+Ofo+ckfDzPDs++OZn4xyPldD84eGMaWVYPXQ1U sWsg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@canonical.com header.s=20210705 header.b=BofD7a6V; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id c6-20020a170903234600b001a1f8e130f9si16213568plh.472.2023.03.29.03.13.19; Wed, 29 Mar 2023 03:13:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@canonical.com header.s=20210705 header.b=BofD7a6V; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231179AbjC2KAh (ORCPT + 99 others); Wed, 29 Mar 2023 06:00:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35000 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230095AbjC2KAg (ORCPT ); Wed, 29 Mar 2023 06:00:36 -0400 Received: from smtp-relay-canonical-0.canonical.com (smtp-relay-canonical-0.canonical.com [185.125.188.120]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8CF4019A for ; Wed, 29 Mar 2023 03:00:34 -0700 (PDT) Received: from localhost.localdomain (unknown [10.101.196.174]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-canonical-0.canonical.com (Postfix) with ESMTPSA id 9D3493F326; Wed, 29 Mar 2023 10:00:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1680084032; bh=X736Xo2cMDDW60Y3vTbzigd2Xc6Dr2xSpP9bWqw8uGc=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=BofD7a6Vm5hTCXvD6Qwb7kJmA/nDRL7QMu2lsS9dynDzisMxrRiO/8CeNWiUhUkoE rJB19HbYNUdJxfYNmQKyUq4geowyOwQNQQPICNEX65CFUHDPSNHtdT71U5pHFjlBRf aOqXnJzD2CN/RS7Vy145g5BIL9Wj/yErU00fopXZ/QsHOaDXoROHJmjGZQGLsOJn1L HZtYQVctKfWrnslEL+jFO5sh0nnnX5eRrA6YBzvnJ/wRdsPLh5HVMKsmYwC5wr35+Z UXD+LP4o4mGVK7n0yA7ML5ChhCclQVzzBUz/uAnM8Wo3bmNSjHCFoMbC+gFUadGTW+ Ea17loXeZ68Dw== From: Kai-Heng Feng To: alexander.deucher@amd.com, christian.koenig@amd.com, Xinhui.Pan@amd.com Cc: Kai-Heng Feng , David Airlie , Daniel Vetter , Mario Limonciello , Bokun Zhang , Maxime Ripard , Tim Huang , Jingyu Wang , "Rafael J. Wysocki" , Hans de Goede , Hawking Zhang , Lijo Lazar , Andrey Grodzovsky , YiPeng Chai , Somalapuram Amaranath , Evan Quan , Guchun Chen , =?UTF-8?q?Michel=20D=C3=A4nzer?= , Kenneth Feng , Jiansong Chen , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/2] drm/amdgpu: Reset GPU on S0ix when device supports BOCO Date: Wed, 29 Mar 2023 17:59:29 +0800 Message-Id: <20230329095933.1203559-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.5 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When the power is lost due to ACPI power resources being turned off, the driver should reset the GPU so it can work anew. First, _PR3 support of the hierarchy needs to be found correctly. Since the GPU on some discrete GFX cards is behind a PCIe switch, checking the _PR3 on downstream port alone is not enough, as the _PR3 can associate to the root port above the PCIe switch. Once the _PR3 is found and BOCO support is correctly marked, use that information to inform the GPU should be reset. This solves an issue that system freeze on a Intel ADL desktop that uses S0ix for sleep and D3cold is supported for the GFX slot. Fixes: 0064b0ce85bb ("drm/amd/pm: enable ASPM by default") Link: https://gitlab.freedesktop.org/drm/amd/-/issues/1885 Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2458 Signed-off-by: Kai-Heng Feng --- drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 3 +++ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 7 ++++++- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 12 +++++------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c index 60b1857f469e..407456ac0e84 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c @@ -987,6 +987,9 @@ bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) if (amdgpu_sriov_vf(adev)) return false; + if (amdgpu_device_supports_boco(adev_to_drm(adev))) + return true; + #if IS_ENABLED(CONFIG_SUSPEND) return pm_suspend_target_state != PM_SUSPEND_TO_IDLE; #else diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index f5658359ff5c..d56b7a2bafa6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2181,7 +2181,12 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev) if (!(adev->flags & AMD_IS_APU)) { parent = pci_upstream_bridge(adev->pdev); - adev->has_pr3 = parent ? pci_pr3_present(parent) : false; + do { + if (pci_pr3_present(parent)) { + adev->has_pr3 = true; + break; + } + } while ((parent = pci_upstream_bridge(parent))); } amdgpu_amdkfd_device_probe(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index ba5def374368..5d81fcac4b0a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -2415,10 +2415,11 @@ static int amdgpu_pmops_suspend(struct device *dev) struct drm_device *drm_dev = dev_get_drvdata(dev); struct amdgpu_device *adev = drm_to_adev(drm_dev); - if (amdgpu_acpi_is_s0ix_active(adev)) - adev->in_s0ix = true; - else if (amdgpu_acpi_is_s3_active(adev)) + if (amdgpu_acpi_is_s3_active(adev) || + amdgpu_device_supports_boco(drm_dev)) adev->in_s3 = true; + else if (amdgpu_acpi_is_s0ix_active(adev)) + adev->in_s0ix = true; if (!adev->in_s0ix && !adev->in_s3) return 0; return amdgpu_device_suspend(drm_dev, true); @@ -2449,10 +2450,7 @@ static int amdgpu_pmops_resume(struct device *dev) adev->no_hw_access = true; r = amdgpu_device_resume(drm_dev, true); - if (amdgpu_acpi_is_s0ix_active(adev)) - adev->in_s0ix = false; - else - adev->in_s3 = false; + adev->in_s0ix = adev->in_s3 = false; return r; } -- 2.34.1