Move the initialization of non-GPU resources out of
the full GPU access region during AMDGPU device initialization

Signed-off-by: chong li <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 82 ++++++++++++++++------
 1 file changed, 59 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 5442a1fc1c37..63d81936bd7b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1932,6 +1932,51 @@ static struct pci_dev *amdgpu_device_find_parent(struct 
amdgpu_device *adev)
        return parent;
 }
 
+static bool amdgpu_device_early_init_ip_block(struct amdgpu_device *adev, int 
i)
+{
+       struct amdgpu_ip_block *ip_block = &adev->ip_blocks[i];
+       int r;
+
+       if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
+               dev_warn(adev->dev, "disabled ip block: %d <%s>\n", i,
+                       adev->ip_blocks[i].version->funcs->name);
+               adev->ip_blocks[i].status.valid = false;
+       } else if (ip_block->version->funcs->early_init) {
+               r = ip_block->version->funcs->early_init(ip_block);
+               if (r == -ENOENT) {
+                       adev->ip_blocks[i].status.valid = false;
+               } else if (r) {
+                       dev_err(adev->dev,
+                               "early_init of IP block <%s> failed %d\n",
+                               adev->ip_blocks[i].version->funcs->name,
+                               r);
+                       return false;
+               } else {
+                       adev->ip_blocks[i].status.valid = true;
+               }
+       } else {
+               adev->ip_blocks[i].status.valid = true;
+       }
+
+       return true;
+}
+
+static bool amdgpu_init_non_gpu_resources(struct amdgpu_device *adev)
+{
+       int i;
+       bool total = true;
+
+       for (i = 0; i < adev->num_ip_blocks; i++) {
+               if (adev->ip_blocks[i].version->type == 
AMD_IP_BLOCK_TYPE_COMMON) {
+                       continue;
+               }
+
+               if (!amdgpu_device_early_init_ip_block(adev, i))
+                       total = false;
+       }
+       return total;
+}
+
 /**
  * amdgpu_device_ip_early_init - run early init for hardware IPs
  *
@@ -2051,32 +2096,10 @@ static int amdgpu_device_ip_early_init(struct 
amdgpu_device *adev)
                        amdgpu_ip_version((adev), GC_HWIP, 0) == IP_VERSION(9, 
4, 4);
        }
 
-       total = true;
        for (i = 0; i < adev->num_ip_blocks; i++) {
-               ip_block = &adev->ip_blocks[i];
-
-               if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
-                       dev_warn(adev->dev, "disabled ip block: %d <%s>\n", i,
-                                adev->ip_blocks[i].version->funcs->name);
-                       adev->ip_blocks[i].status.valid = false;
-               } else if (ip_block->version->funcs->early_init) {
-                       r = ip_block->version->funcs->early_init(ip_block);
-                       if (r == -ENOENT) {
-                               adev->ip_blocks[i].status.valid = false;
-                       } else if (r) {
-                               dev_err(adev->dev,
-                                       "early_init of IP block <%s> failed 
%d\n",
-                                       adev->ip_blocks[i].version->funcs->name,
-                                       r);
-                               total = false;
-                       } else {
-                               adev->ip_blocks[i].status.valid = true;
-                       }
-               } else {
-                       adev->ip_blocks[i].status.valid = true;
-               }
                /* get the vbios after the asic_funcs are set up */
                if (adev->ip_blocks[i].version->type == 
AMD_IP_BLOCK_TYPE_COMMON) {
+                       total = amdgpu_device_early_init_ip_block(adev, i);
                        r = amdgpu_device_parse_gpu_info_fw(adev);
                        if (r)
                                return r;
@@ -2115,6 +2138,19 @@ static int amdgpu_device_ip_early_init(struct 
amdgpu_device *adev)
 
                }
        }
+
+       if (amdgpu_sriov_vf(adev)) {
+               amdgpu_virt_release_full_gpu(adev, true);
+       }
+
+       total = total & amdgpu_init_non_gpu_resources(adev);
+
+       if (amdgpu_sriov_vf(adev)) {
+               r = amdgpu_virt_request_full_gpu(adev, true);
+               if (r)
+                       return r;
+       }
+
        if (!total)
                return -ENODEV;
 
-- 
2.48.1

Reply via email to