Commit 6c3c5593 authored by Philip Yang's avatar Philip Yang Committed by Alex Deucher

drm/amdgpu: enable paging queue based on FW version (v2)

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.

v2: don't enable on vega12, 20 until confirmed
Signed-off-by: default avatarPhilip Yang <Philip.Yang@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ec3db8a6
...@@ -1447,23 +1447,46 @@ static void sdma_v4_0_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg, ...@@ -1447,23 +1447,46 @@ 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); 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;*/
return false;
case CHIP_VEGA20:
/*return fw_version >= 115;*/
return false;
default:
return false;
}
}
static int sdma_v4_0_early_init(void *handle) static int sdma_v4_0_early_init(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)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.num_instances = 1;
adev->sdma.has_page_queue = false; else
} else {
adev->sdma.num_instances = 2; adev->sdma.num_instances = 2;
/* TODO: Page queue breaks driver reload under SRIOV */
if ((adev->asic_type == CHIP_VEGA10) && amdgpu_sriov_vf((adev))) r = sdma_v4_0_init_microcode(adev);
adev->sdma.has_page_queue = false; if (r) {
else if (adev->asic_type != CHIP_VEGA20 && DRM_ERROR("Failed to load sdma firmware!\n");
adev->asic_type != CHIP_VEGA12) return r;
adev->sdma.has_page_queue = true;
} }
/* 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_ring_funcs(adev);
sdma_v4_0_set_buffer_funcs(adev); sdma_v4_0_set_buffer_funcs(adev);
sdma_v4_0_set_vm_pte_funcs(adev); sdma_v4_0_set_vm_pte_funcs(adev);
...@@ -1472,7 +1495,6 @@ static int sdma_v4_0_early_init(void *handle) ...@@ -1472,7 +1495,6 @@ static int sdma_v4_0_early_init(void *handle)
return 0; return 0;
} }
static int sdma_v4_0_sw_init(void *handle) static int sdma_v4_0_sw_init(void *handle)
{ {
struct amdgpu_ring *ring; struct amdgpu_ring *ring;
...@@ -1491,12 +1513,6 @@ static int sdma_v4_0_sw_init(void *handle) ...@@ -1491,12 +1513,6 @@ static int sdma_v4_0_sw_init(void *handle)
if (r) if (r)
return 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++) { for (i = 0; i < adev->sdma.num_instances; i++) {
ring = &adev->sdma.instance[i].ring; ring = &adev->sdma.instance[i].ring;
ring->ring_obj = NULL; ring->ring_obj = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment