> -----Original Message----- > From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of > Yang, Philip > Sent: Monday, November 19, 2018 3:20 PM > To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx > Cc: Yang, Philip <Philip.Yang@xxxxxxx> > Subject: [PATCH 3/3] drm/amdgpu: enable paging queue based on FW > version > > Based SDMA fw version to enable has_page_queue support. Have to move > sdma_v4_0_init_microcode from sw_init to early_init, to load firmware and > init fw_version before set_ring/buffer/vm_pte_funcs use it. > > Change-Id: Ife5d4659d28bc2a7012b48947b27e929749d87c1 > Signed-off-by: Philip Yang <Philip.Yang@xxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 46 +++++++++++++++++---- > ----- > 1 file changed, 30 insertions(+), 16 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c > b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c > index 4d873fd3242c..0a3b68dd49a0 100644 > --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c > @@ -1447,23 +1447,44 @@ static void > sdma_v4_0_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg, > sdma_v4_0_wait_reg_mem(ring, 0, 0, reg, 0, val, mask, 10); } > > +static bool sdma_v4_0_fw_support_paging_queue(struct amdgpu_device > +*adev) { > + uint fw_version = adev->sdma.instance[0].fw_version; > + > + switch (adev->asic_type) { > + case CHIP_VEGA10: > + return fw_version >= 430; > + case CHIP_VEGA12: > + return fw_version >= 31; > + case CHIP_VEGA20: > + return fw_version >= 115; > + default: > + return false; > + } > +} > + > static int sdma_v4_0_early_init(void *handle) { > struct amdgpu_device *adev = (struct amdgpu_device *)handle; > + int r; > > - if (adev->asic_type == CHIP_RAVEN) { > + if (adev->asic_type == CHIP_RAVEN) > adev->sdma.num_instances = 1; > - adev->sdma.has_page_queue = false; > - } else { > + else > adev->sdma.num_instances = 2; > - /* TODO: Page queue breaks driver reload under SRIOV */ > - if ((adev->asic_type == CHIP_VEGA10) && > amdgpu_sriov_vf((adev))) > - adev->sdma.has_page_queue = false; > - else if (adev->asic_type != CHIP_VEGA20 && > - adev->asic_type != CHIP_VEGA12) > - adev->sdma.has_page_queue = true; > + > + r = sdma_v4_0_init_microcode(adev); > + if (r) { > + DRM_ERROR("Failed to load sdma firmware!\n"); > + return r; I think this should be ok. As long as you've verified that sdam_v4_0_init_microcode() doesn't depend on any other init from another module like psp. I took a quick look at the code and it seems like we should be ok. Acked-by: Alex Deucher <alexander.deucher@xxxxxxx> > } > > + /* TODO: Page queue breaks driver reload under SRIOV */ > + if ((adev->asic_type == CHIP_VEGA10) && > amdgpu_sriov_vf((adev))) > + adev->sdma.has_page_queue = false; > + else if (sdma_v4_0_fw_support_paging_queue(adev)) > + adev->sdma.has_page_queue = true; > + > sdma_v4_0_set_ring_funcs(adev); > sdma_v4_0_set_buffer_funcs(adev); > sdma_v4_0_set_vm_pte_funcs(adev); > @@ -1472,7 +1493,6 @@ static int sdma_v4_0_early_init(void *handle) > return 0; > } > > - > static int sdma_v4_0_sw_init(void *handle) { > struct amdgpu_ring *ring; > @@ -1491,12 +1511,6 @@ static int sdma_v4_0_sw_init(void *handle) > if (r) > return r; > > - r = sdma_v4_0_init_microcode(adev); > - if (r) { > - DRM_ERROR("Failed to load sdma firmware!\n"); > - return r; > - } > - > for (i = 0; i < adev->sdma.num_instances; i++) { > ring = &adev->sdma.instance[i].ring; > ring->ring_obj = NULL; > -- > 2.17.1 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx