drm/amdgpu: be explicit about cpu vram access for driver BOs (v2)
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_device.c
index 99f158e1baffa711073d1251d6d05c72cb68976e..6ff6ae945794a24167d6403a48bb8aa57d2fa4a2 100644 (file)
@@ -55,6 +55,7 @@ static const char *amdgpu_asic_name[] = {
        "MULLINS",
        "TOPAZ",
        "TONGA",
+       "FIJI",
        "CARRIZO",
        "LAST",
 };
@@ -63,7 +64,7 @@ bool amdgpu_device_is_px(struct drm_device *dev)
 {
        struct amdgpu_device *adev = dev->dev_private;
 
-       if (adev->flags & AMDGPU_IS_PX)
+       if (adev->flags & AMD_IS_PX)
                return true;
        return false;
 }
@@ -243,7 +244,8 @@ static int amdgpu_vram_scratch_init(struct amdgpu_device *adev)
 
        if (adev->vram_scratch.robj == NULL) {
                r = amdgpu_bo_create(adev, AMDGPU_GPU_PAGE_SIZE,
-                                    PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, 0,
+                                    PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM,
+                                    AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
                                     NULL, &adev->vram_scratch.robj);
                if (r) {
                        return r;
@@ -1160,6 +1162,7 @@ static int amdgpu_early_init(struct amdgpu_device *adev)
        switch (adev->asic_type) {
        case CHIP_TOPAZ:
        case CHIP_TONGA:
+       case CHIP_FIJI:
        case CHIP_CARRIZO:
                if (adev->asic_type == CHIP_CARRIZO)
                        adev->family = AMDGPU_FAMILY_CZ;
@@ -1377,7 +1380,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
        adev->ddev = ddev;
        adev->pdev = pdev;
        adev->flags = flags;
-       adev->asic_type = flags & AMDGPU_ASIC_MASK;
+       adev->asic_type = flags & AMD_ASIC_MASK;
        adev->is_atom_bios = false;
        adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT;
        adev->mc.gtt_size = 512 * 1024 * 1024;
@@ -1523,6 +1526,11 @@ int amdgpu_device_init(struct amdgpu_device *adev,
                return r;
        }
 
+       r = amdgpu_ctx_init(adev, true, &adev->kernel_ctx);
+       if (r) {
+               dev_err(adev->dev, "failed to create kernel context (%d).\n", r);
+               return r;
+       }
        r = amdgpu_ib_ring_tests(adev);
        if (r)
                DRM_ERROR("ib ring test failed (%d).\n", r);
@@ -1584,6 +1592,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
        adev->shutdown = true;
        /* evict vram memory */
        amdgpu_bo_evict_vram(adev);
+       amdgpu_ctx_fini(&adev->kernel_ctx);
        amdgpu_ib_pool_fini(adev);
        amdgpu_fence_driver_fini(adev);
        amdgpu_fbdev_fini(adev);
@@ -1627,8 +1636,7 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
        struct amdgpu_device *adev;
        struct drm_crtc *crtc;
        struct drm_connector *connector;
-       int i, r;
-       bool force_completion = false;
+       int r;
 
        if (dev == NULL || dev->dev_private == NULL) {
                return -ENODEV;
@@ -1667,21 +1675,7 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
        /* evict vram memory */
        amdgpu_bo_evict_vram(adev);
 
-       /* wait for gpu to finish processing current batch */
-       for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
-               struct amdgpu_ring *ring = adev->rings[i];
-               if (!ring)
-                       continue;
-
-               r = amdgpu_fence_wait_empty(ring);
-               if (r) {
-                       /* delay GPU reset to resume */
-                       force_completion = true;
-               }
-       }
-       if (force_completion) {
-               amdgpu_fence_driver_force_completion(adev);
-       }
+       amdgpu_fence_driver_suspend(adev);
 
        r = amdgpu_suspend(adev);
 
@@ -1739,6 +1733,8 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
 
        r = amdgpu_resume(adev);
 
+       amdgpu_fence_driver_resume(adev);
+
        r = amdgpu_ib_ring_tests(adev);
        if (r)
                DRM_ERROR("ib ring test failed (%d).\n", r);