]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amdgpu: fix handling of harvesting for ip_discovery firmware
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 26 Sep 2025 21:31:32 +0000 (17:31 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 Oct 2025 14:20:34 +0000 (16:20 +0200)
[ Upstream commit 357d90be2c7aaa526a840cddffd2b8d676fe75a6 ]

Chips which use the IP discovery firmware loaded by the driver
reported incorrect harvesting information in the ip discovery
table in sysfs because the driver only uses the ip discovery
firmware for populating sysfs and not for direct parsing for the
driver itself as such, the fields that are used to print the
harvesting info in sysfs report incorrect data for some IPs.  Populate
the relevant fields for this case as well.

Fixes: 514678da56da ("drm/amdgpu/discovery: fix fw based ip discovery")
Acked-by: Tom St Denis <tom.stdenis@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c

index 0f427314b2b481f5065b6c449d6b90e9c8a08916..e00b5e4542347200c6d06204fb7dcd2108759b6b 100644 (file)
@@ -1016,7 +1016,9 @@ static uint8_t amdgpu_discovery_get_harvest_info(struct amdgpu_device *adev,
        /* Until a uniform way is figured, get mask based on hwid */
        switch (hw_id) {
        case VCN_HWID:
-               harvest = ((1 << inst) & adev->vcn.inst_mask) == 0;
+               /* VCN vs UVD+VCE */
+               if (!amdgpu_ip_version(adev, VCE_HWIP, 0))
+                       harvest = ((1 << inst) & adev->vcn.inst_mask) == 0;
                break;
        case DMU_HWID:
                if (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK)
@@ -2462,7 +2464,9 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
                amdgpu_discovery_init(adev);
                vega10_reg_base_init(adev);
                adev->sdma.num_instances = 2;
+               adev->sdma.sdma_mask = 3;
                adev->gmc.num_umc = 4;
+               adev->gfx.xcc_mask = 1;
                adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 0, 0);
                adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 0, 0);
                adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 0, 0);
@@ -2489,7 +2493,9 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
                amdgpu_discovery_init(adev);
                vega10_reg_base_init(adev);
                adev->sdma.num_instances = 2;
+               adev->sdma.sdma_mask = 3;
                adev->gmc.num_umc = 4;
+               adev->gfx.xcc_mask = 1;
                adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 3, 0);
                adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 3, 0);
                adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 0, 1);
@@ -2516,8 +2522,10 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
                amdgpu_discovery_init(adev);
                vega10_reg_base_init(adev);
                adev->sdma.num_instances = 1;
+               adev->sdma.sdma_mask = 1;
                adev->vcn.num_vcn_inst = 1;
                adev->gmc.num_umc = 2;
+               adev->gfx.xcc_mask = 1;
                if (adev->apu_flags & AMD_APU_IS_RAVEN2) {
                        adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 2, 0);
                        adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 2, 0);
@@ -2560,7 +2568,9 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
                amdgpu_discovery_init(adev);
                vega20_reg_base_init(adev);
                adev->sdma.num_instances = 2;
+               adev->sdma.sdma_mask = 3;
                adev->gmc.num_umc = 8;
+               adev->gfx.xcc_mask = 1;
                adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 4, 0);
                adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 4, 0);
                adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 2, 0);
@@ -2588,8 +2598,10 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
                amdgpu_discovery_init(adev);
                arct_reg_base_init(adev);
                adev->sdma.num_instances = 8;
+               adev->sdma.sdma_mask = 0xff;
                adev->vcn.num_vcn_inst = 2;
                adev->gmc.num_umc = 8;
+               adev->gfx.xcc_mask = 1;
                adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 4, 1);
                adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 4, 1);
                adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 2, 1);
@@ -2621,8 +2633,10 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
                amdgpu_discovery_init(adev);
                aldebaran_reg_base_init(adev);
                adev->sdma.num_instances = 5;
+               adev->sdma.sdma_mask = 0x1f;
                adev->vcn.num_vcn_inst = 2;
                adev->gmc.num_umc = 4;
+               adev->gfx.xcc_mask = 1;
                adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(9, 4, 2);
                adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(9, 4, 2);
                adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(4, 4, 0);
@@ -2657,6 +2671,8 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
                } else {
                        cyan_skillfish_reg_base_init(adev);
                        adev->sdma.num_instances = 2;
+                       adev->sdma.sdma_mask = 3;
+                       adev->gfx.xcc_mask = 1;
                        adev->ip_versions[MMHUB_HWIP][0] = IP_VERSION(2, 0, 3);
                        adev->ip_versions[ATHUB_HWIP][0] = IP_VERSION(2, 0, 3);
                        adev->ip_versions[OSSSYS_HWIP][0] = IP_VERSION(5, 0, 1);