[PATCH 2/6] drm/amdgpu/sriov: Correct the setting about sdma doorbell offset of Vega10
Alex Deucher
alexdeucher at gmail.com
Thu Sep 13 01:55:42 UTC 2018
On Wed, Sep 12, 2018 at 9:45 PM Felix Kuehling <Felix.Kuehling at amd.com> wrote:
>
> From: Emily Deng <Emily.Deng at amd.com>
>
> Correct the format
>
> For vega10 sriov, the sdma doorbell must be fixed as follow to keep the
> same setting with host driver, or it will happen conflicts.
>
> Signed-off-by: Emily Deng <Emily.Deng at amd.com>
> Acked-by: Alex Deucher <alexander.deucher at amd.com>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu.h | 9 +++++++++
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 27 +++++++++++++++++++--------
> drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 12 +++++++++---
> 3 files changed, 37 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index afa9e77..e60de88 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -420,6 +420,15 @@ typedef enum _AMDGPU_DOORBELL64_ASSIGNMENT
> AMDGPU_DOORBELL64_sDMA_ENGINE1 = 0xE8,
> AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE1 = 0xE9,
>
> + /* For vega10 sriov, the sdma doorbell must be fixed as follow
> + * to keep the same setting with host driver, or it will
> + * happen conflicts
> + */
> + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 = 0xF0,
> + AMDGPU_VEGA10_DOORBELL64_sDMA_HI_PRI_ENGINE0 = 0xF1,
> + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 = 0xF2,
> + AMDGPU_VEGA10_DOORBELL64_sDMA_HI_PRI_ENGINE1 = 0xF3,
> +
> /* Interrupt handler */
> AMDGPU_DOORBELL64_IH = 0xF4, /* For legacy interrupt ring buffer */
> AMDGPU_DOORBELL64_IH_RING1 = 0xF5, /* For page migration request log */
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> index bf0b012..7a165a9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> @@ -181,14 +181,25 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
> * process in case of 64-bit doorbells so we
> * can use each doorbell assignment twice.
> */
> - gpu_resources.sdma_doorbell[0][i] =
> - AMDGPU_DOORBELL64_sDMA_ENGINE0 + (i >> 1);
> - gpu_resources.sdma_doorbell[0][i+1] =
> - AMDGPU_DOORBELL64_sDMA_ENGINE0 + 0x200 + (i >> 1);
> - gpu_resources.sdma_doorbell[1][i] =
> - AMDGPU_DOORBELL64_sDMA_ENGINE1 + (i >> 1);
> - gpu_resources.sdma_doorbell[1][i+1] =
> - AMDGPU_DOORBELL64_sDMA_ENGINE1 + 0x200 + (i >> 1);
> + if (adev->asic_type == CHIP_VEGA10) {
> + gpu_resources.sdma_doorbell[0][i] =
> + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 + (i >> 1);
> + gpu_resources.sdma_doorbell[0][i+1] =
> + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 + 0x200 + (i >> 1);
> + gpu_resources.sdma_doorbell[1][i] =
> + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 + (i >> 1);
> + gpu_resources.sdma_doorbell[1][i+1] =
> + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 + 0x200 + (i >> 1);
> + } else {
> + gpu_resources.sdma_doorbell[0][i] =
> + AMDGPU_DOORBELL64_sDMA_ENGINE0 + (i >> 1);
> + gpu_resources.sdma_doorbell[0][i+1] =
> + AMDGPU_DOORBELL64_sDMA_ENGINE0 + 0x200 + (i >> 1);
> + gpu_resources.sdma_doorbell[1][i] =
> + AMDGPU_DOORBELL64_sDMA_ENGINE1 + (i >> 1);
> + gpu_resources.sdma_doorbell[1][i+1] =
> + AMDGPU_DOORBELL64_sDMA_ENGINE1 + 0x200 + (i >> 1);
> + }
It would probably make more sense to reverse the conditions here so we
retain the old behavior for all previous non-vega20 asics rather than
just vega10. E.g.,
if (vega20) {
// use new doorbell mapping
} else {
// use the old doorbell mapping
}
Same thing below.
Alex
> }
> /* Doorbells 0x0e0-0ff and 0x2e0-2ff are reserved for
> * SDMA, IH and VCN. So don't use them for the CP.
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> index df13840..6265361 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> @@ -1299,9 +1299,15 @@ static int sdma_v4_0_sw_init(void *handle)
> DRM_INFO("use_doorbell being set to: [%s]\n",
> ring->use_doorbell?"true":"false");
>
> - ring->doorbell_index = (i == 0) ?
> - (AMDGPU_DOORBELL64_sDMA_ENGINE0 << 1) //get DWORD offset
> - : (AMDGPU_DOORBELL64_sDMA_ENGINE1 << 1); // get DWORD offset
> + if (adev->asic_type == CHIP_VEGA10)
> + ring->doorbell_index = (i == 0) ?
> + (AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 << 1) //get DWORD offset
> + : (AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 << 1); // get DWORD offset
> + else
> + ring->doorbell_index = (i == 0) ?
> + (AMDGPU_DOORBELL64_sDMA_ENGINE0 << 1) //get DWORD offset
> + : (AMDGPU_DOORBELL64_sDMA_ENGINE1 << 1); // get DWORD offset
> +
>
> sprintf(ring->name, "sdma%d", i);
> r = amdgpu_ring_init(adev, ring, 1024,
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list