]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
Merge tag 'for-v5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power...
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_gem.c
index d21dd2f369daa06f55f97fa9dbce2740e9f57511..d4fcf5475464645f0661f4aea7c69e69b5dd96df 100644 (file)
@@ -31,6 +31,7 @@
 #include <drm/amdgpu_drm.h>
 #include "amdgpu.h"
 #include "amdgpu_display.h"
+#include "amdgpu_xgmi.h"
 
 void amdgpu_gem_object_free(struct drm_gem_object *gobj)
 {
@@ -627,11 +628,6 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
 
        switch (args->operation) {
        case AMDGPU_VA_OP_MAP:
-               r = amdgpu_vm_alloc_pts(adev, bo_va->base.vm, args->va_address,
-                                       args->map_size);
-               if (r)
-                       goto error_backoff;
-
                va_flags = amdgpu_gmc_get_pte_flags(adev, args->flags);
                r = amdgpu_vm_bo_map(adev, bo_va, args->va_address,
                                     args->offset_in_bo, args->map_size,
@@ -647,11 +643,6 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
                                                args->map_size);
                break;
        case AMDGPU_VA_OP_REPLACE:
-               r = amdgpu_vm_alloc_pts(adev, bo_va->base.vm, args->va_address,
-                                       args->map_size);
-               if (r)
-                       goto error_backoff;
-
                va_flags = amdgpu_gmc_get_pte_flags(adev, args->flags);
                r = amdgpu_vm_bo_replace_map(adev, bo_va, args->va_address,
                                             args->offset_in_bo, args->map_size,
@@ -678,6 +669,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
        struct amdgpu_device *adev = dev->dev_private;
        struct drm_amdgpu_gem_op *args = data;
        struct drm_gem_object *gobj;
+       struct amdgpu_vm_bo_base *base;
        struct amdgpu_bo *robj;
        int r;
 
@@ -716,6 +708,15 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
                        amdgpu_bo_unreserve(robj);
                        break;
                }
+               for (base = robj->vm_bo; base; base = base->next)
+                       if (amdgpu_xgmi_same_hive(amdgpu_ttm_adev(robj->tbo.bdev),
+                               amdgpu_ttm_adev(base->vm->root.base.bo->tbo.bdev))) {
+                               r = -EINVAL;
+                               amdgpu_bo_unreserve(robj);
+                               goto out;
+                       }
+
+
                robj->preferred_domains = args->value & (AMDGPU_GEM_DOMAIN_VRAM |
                                                        AMDGPU_GEM_DOMAIN_GTT |
                                                        AMDGPU_GEM_DOMAIN_CPU);
@@ -745,17 +746,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,
+       r = amdgpu_gem_object_create(adev, args->size, 0, domain, flags,
                                     ttm_bo_type_device, NULL, &gobj);
        if (r)
                return -ENOMEM;
This page took 0.039138 seconds and 4 git commands to generate.