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
