Commit 2346eee1 authored by Alex Deucher's avatar Alex Deucher Committed by Zheng Zengkai
Browse files

drm/amdgpu: add a retry for IP discovery init

stable inclusion
from stable-v6.6.3
commit e9b8533d571746d6f4e171b13c1b46e5de2cd12b
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8LBQP

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=e9b8533d571746d6f4e171b13c1b46e5de2cd12b

--------------------------------

commit 3938eb956e383ef88b8fc7d556492336ebee52df upstream.

AMD dGPUs have integrated FW that runs as soon as the
device gets power and initializes the board (determines
the amount of memory, provides configuration details to
the driver, etc.).  For direct PCIe attached cards this
happens as soon as power is applied and normally completes
well before the OS has even started loading.  However, with
hotpluggable ports like USB4, the driver needs to wait for
this to complete before initializing the device.

This normally takes 60-100ms, but could take longer on
some older boards periodically due to memory training.

Retry for up to a second.  In the non-hotplug case, there
should be no change in behavior and this should complete
on the first try.

v2: adjust test criteria
v3: adjust checks for the masks, only enable on removable devices
v4: skip bif_fb_en check

Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2925


Reviewed-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 897240c2
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@
MODULE_FIRMWARE(FIRMWARE_IP_DISCOVERY);

#define mmRCC_CONFIG_MEMSIZE	0xde3
#define mmMP0_SMN_C2PMSG_33	0x16061
#define mmMM_INDEX		0x0
#define mmMM_INDEX_HI		0x6
#define mmMM_DATA		0x1
@@ -231,8 +232,26 @@ static int amdgpu_discovery_read_binary_from_sysmem(struct amdgpu_device *adev,
static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev,
						 uint8_t *binary)
{
	uint64_t vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20;
	int ret = 0;
	uint64_t vram_size;
	u32 msg;
	int i, ret = 0;

	/* It can take up to a second for IFWI init to complete on some dGPUs,
	 * but generally it should be in the 60-100ms range.  Normally this starts
	 * as soon as the device gets power so by the time the OS loads this has long
	 * completed.  However, when a card is hotplugged via e.g., USB4, we need to
	 * wait for this to complete.  Once the C2PMSG is updated, we can
	 * continue.
	 */
	if (dev_is_removable(&adev->pdev->dev)) {
		for (i = 0; i < 1000; i++) {
			msg = RREG32(mmMP0_SMN_C2PMSG_33);
			if (msg & 0x80000000)
				break;
			msleep(1);
		}
	}
	vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20;

	if (vram_size) {
		uint64_t pos = vram_size - DISCOVERY_TMR_OFFSET;