[PATCH 3/3] drm/amdgpu:invoke CSA functions
Christian König
deathsimple at vodafone.de
Wed Jan 11 12:54:32 UTC 2017
Am 11.01.2017 um 11:43 schrieb Monk Liu:
> Change-Id: I528c2f324830aaa21ab8d8250bc80a2a6bab33bd
> Signed-off-by: Monk Liu <Monk.Liu at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 14 ++++++++++++++
> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 12 ++++++++++++
> drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 14 ++++++++++++++
> drivers/gpu/drm/amd/amdgpu/vi.c | 3 +++
> 4 files changed, 43 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index 6159afc..328f1c7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -771,6 +771,20 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p,
> if (r)
> return r;
>
> + if (amdgpu_sriov_vf(adev)) {
> + struct fence *f;
A new line between declaration and code.
> + bo_va = vm->csa_bo_va;
> + BUG_ON(!bo_va);
> + r = amdgpu_vm_bo_update(adev, bo_va, false);
> + if (r)
> + return r;
> +
> + f = bo_va->last_pt_update;
> + r = amdgpu_sync_fence(adev, &p->job->sync, f);
> + if (r)
> + return r;
> + }
> +
> if (p->bo_list) {
> for (i = 0; i < p->bo_list->num_entries; i++) {
> struct fence *f;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index f82919d..7c73dee 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1384,6 +1384,15 @@ static int amdgpu_init(struct amdgpu_device *adev)
> return r;
> }
> adev->ip_blocks[i].status.hw = true;
> +
> + /* right after GMC hw init, we create CSA */
> + if (amdgpu_sriov_vf(adev)) {
> + r = amdgpu_allocate_static_csa(adev);
> + if (r) {
> + DRM_ERROR("allocate CSA failed %d\n", r);
> + return r;
> + }
> + }
We sooner or later need to fix those extras in the init order, but that
is clearly not topic of this patch.
> }
> }
>
> @@ -1517,6 +1526,9 @@ static int amdgpu_fini(struct amdgpu_device *adev)
> adev->ip_blocks[i].status.late_initialized = false;
> }
>
> + if (amdgpu_sriov_vf(adev))
> + amdgpu_bo_free_kernel(&adev->virt.csa_obj, &adev->virt.csa_vmid0_addr, NULL);
> +
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> index 47bc8e1..1421a9d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> @@ -650,6 +650,12 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
> goto out_suspend;
> }
>
> + if (amdgpu_sriov_vf(adev)) {
> + r = amdgpu_map_static_csa(adev, &fpriv->vm);
> + if (r)
> + goto out_suspend;
> + }
> +
> mutex_init(&fpriv->bo_list_lock);
> idr_init(&fpriv->bo_list_handles);
>
> @@ -688,6 +694,14 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
> amdgpu_uvd_free_handles(adev, file_priv);
> amdgpu_vce_free_handles(adev, file_priv);
>
> + if (amdgpu_sriov_vf(adev)) {
> + /* TODO: how to handle reserve failure */
> + BUG_ON(amdgpu_bo_reserve(adev->virt.csa_obj, false));
Reservation should never fail as long as you don't set the interruptible
paramter to true, so using BUG_ON() should be ok here.
But I'm not 100% sure if BUG_ON() doesn't works like assert(), e.g. on a
not debug build the compiler could optimize the call to
amdgpu_bo_reserve away.
So better do:
r = amdgpu_bo_reserve(adev->virt.csa_obj, false);
BUG_ON(!r);
With that fixed the patch is Reviewed-by: Christian König
<christian.koenig at amd.com>.
Regards,
Christian.
> + amdgpu_vm_bo_rmv(adev, fpriv->vm.csa_bo_va);
> + fpriv->vm.csa_bo_va = NULL;
> + amdgpu_bo_unreserve(adev->virt.csa_obj);
> + }
> +
> amdgpu_vm_fini(adev, &fpriv->vm);
>
> idr_for_each_entry(&fpriv->bo_list_handles, list, handle)
> diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c
> index 7350a8f..1f307c3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vi.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vi.c
> @@ -455,6 +455,9 @@ static void vi_detect_hw_virtualization(struct amdgpu_device *adev)
> if (is_virtual_machine()) /* passthrough mode exclus sr-iov mode */
> adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
> }
> +
> + if (amdgpu_sriov_vf(adev))
> + adev->virt.csa_size = AMDGPU_CSA_SIZE; /* two page now for VI and AI */
> }
>
> static const struct amdgpu_allowed_register_entry tonga_allowed_read_registers[] = {
More information about the amd-gfx
mailing list