[PATCH v3] drm/amdgpu: set vm_update_mode=0 as default for Sienna Cichlid in SRIOV case
Felix Kuehling
felix.kuehling at amd.com
Wed Oct 12 18:40:29 UTC 2022
Am 2022-10-12 um 09:20 schrieb Danijel Slivka:
> For asic with VF MMIO access protection avoid using CPU for VM table updates.
> CPU pagetable updates have issues with HDP flush as VF MMIO access protection
> blocks write to mmBIF_BX_DEV0_EPF0_VF0_HDP_MEM_COHERENCY_FLUSH_CNTL register
> during sriov runtime.
>
> v3: introduce virtualization capability flag AMDGPU_VF_MMIO_ACCESS_PROTECT
> which indicates that VF MMIO write access is not allowed in sriov runtime
>
> Signed-off-by: Danijel Slivka <danijel.slivka at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 6 ++++++
> drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 5 +++++
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 6 +++++-
> 3 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> index e4af40b9a8aa..9c765b04aae3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> @@ -726,6 +726,12 @@ void amdgpu_detect_virtualization(struct amdgpu_device *adev)
> adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
> }
>
> + if (amdgpu_sriov_vf(adev) && adev->asic_type == CHIP_SIENNA_CICHLID)
> + /* VF MMIO access (except mailbox range) from CPU
> + * will be blocked during sriov runtime
> + */
> + adev->virt.caps |= AMDGPU_VF_MMIO_ACCESS_PROTECT;
> +
> /* we have the ability to check now */
> if (amdgpu_sriov_vf(adev)) {
> switch (adev->asic_type) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
> index d94c31e68a14..fffc224ff03d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
> @@ -31,6 +31,7 @@
> #define AMDGPU_SRIOV_CAPS_IS_VF (1 << 2) /* this GPU is a virtual function */
> #define AMDGPU_PASSTHROUGH_MODE (1 << 3) /* thw whole GPU is pass through for VM */
> #define AMDGPU_SRIOV_CAPS_RUNTIME (1 << 4) /* is out of full access mode */
> +#define AMDGPU_VF_MMIO_ACCESS_PROTECT (1 << 5) /* MMIO write access is not allowed in sriov runtime */
>
> /* flags for indirect register access path supported by rlcg for sriov */
> #define AMDGPU_RLCG_GC_WRITE_LEGACY (0x8 << 28)
> @@ -297,6 +298,10 @@ struct amdgpu_video_codec_info;
> #define amdgpu_passthrough(adev) \
> ((adev)->virt.caps & AMDGPU_PASSTHROUGH_MODE)
>
> +#define amdgpu_sriov_vf_mmio_access_protection(adev) \
> +(amdgpu_sriov_vf((adev)) && \
> + ((adev)->virt.caps & AMDGPU_VF_MMIO_ACCESS_PROTECT))
The ACCESS_PROTECT flag is only set for VFs in
amdgpu_detect_virtualization. So I think you can remove amdgpu_sriov_vf
check here. With that fixed, the patch is
Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
> +
> static inline bool is_virtual_machine(void)
> {
> #if defined(CONFIG_X86)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 83b0c5d86e48..2291aa14d888 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -2338,7 +2338,11 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev)
> */
> #ifdef CONFIG_X86_64
> if (amdgpu_vm_update_mode == -1) {
> - if (amdgpu_gmc_vram_full_visible(&adev->gmc))
> + /* For asic with VF MMIO access protection
> + * avoid using CPU for VM table updates
> + */
> + if (amdgpu_gmc_vram_full_visible(&adev->gmc) &&
> + !amdgpu_sriov_vf_mmio_access_protection(adev))
> adev->vm_manager.vm_update_mode =
> AMDGPU_VM_USE_CPU_FOR_COMPUTE;
> else
More information about the amd-gfx
mailing list