drm/amdgpu: Only clear dumb buffers if ring is enabled
authorNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Mon, 11 Mar 2019 18:16:29 +0000 (14:16 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 19 Mar 2019 20:36:57 +0000 (15:36 -0500)
The buffers should be cleared when possible but we also don't want
buffer creation to fail in the rare case where the ring isn't ready
during the call. This could happen during some suspend/resume sequences.

Cc: Christian König <ckoenig.leichtzumerken@gmail.com>
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c

index a58072bbc9b862c615212a8c5ee90bd57ce8108b..9ee8d7a3c6d490531849e8806be1bb513b2d77a2 100644 (file)
@@ -733,18 +733,25 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
        struct amdgpu_device *adev = dev->dev_private;
        struct drm_gem_object *gobj;
        uint32_t handle;
+       u64 flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
        u32 domain;
        int r;
 
+       /*
+        * The buffer returned from this function should be cleared, but
+        * it can only be done if the ring is enabled or we'll fail to
+        * create the buffer.
+        */
+       if (adev->mman.buffer_funcs_enabled)
+               flags |= AMDGPU_GEM_CREATE_VRAM_CLEARED;
+
        args->pitch = amdgpu_align_pitch(adev, args->width,
                                         DIV_ROUND_UP(args->bpp, 8), 0);
        args->size = (u64)args->pitch * args->height;
        args->size = ALIGN(args->size, PAGE_SIZE);
        domain = amdgpu_bo_get_preferred_pin_domain(adev,
                                amdgpu_display_supported_domains(adev));
-       r = amdgpu_gem_object_create(adev, args->size, 0, domain,
-                                    AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
-                                    AMDGPU_GEM_CREATE_VRAM_CLEARED,
+       r = amdgpu_gem_object_create(adev, args->size, 0, domain, flags,
                                     ttm_bo_type_device, NULL, &gobj);
        if (r)
                return -ENOMEM;