diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 28 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_ttm.c | 6 |
5 files changed, 39 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index cdcf5eaf6714..bed84b316bba 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -1024,6 +1024,7 @@ struct radeon_device { | |||
| 1024 | struct work_struct hotplug_work; | 1024 | struct work_struct hotplug_work; |
| 1025 | int num_crtc; /* number of crtcs */ | 1025 | int num_crtc; /* number of crtcs */ |
| 1026 | struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */ | 1026 | struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */ |
| 1027 | struct mutex vram_mutex; | ||
| 1027 | 1028 | ||
| 1028 | /* audio stuff */ | 1029 | /* audio stuff */ |
| 1029 | struct timer_list audio_timer; | 1030 | struct timer_list audio_timer; |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 53a2c27dd8fa..0372ec96020f 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -599,6 +599,7 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 599 | spin_lock_init(&rdev->ih.lock); | 599 | spin_lock_init(&rdev->ih.lock); |
| 600 | mutex_init(&rdev->gem.mutex); | 600 | mutex_init(&rdev->gem.mutex); |
| 601 | mutex_init(&rdev->pm.mutex); | 601 | mutex_init(&rdev->pm.mutex); |
| 602 | mutex_init(&rdev->vram_mutex); | ||
| 602 | rwlock_init(&rdev->fence_drv.lock); | 603 | rwlock_init(&rdev->fence_drv.lock); |
| 603 | INIT_LIST_HEAD(&rdev->gem.objects); | 604 | INIT_LIST_HEAD(&rdev->gem.objects); |
| 604 | init_waitqueue_head(&rdev->irq.vblank_queue); | 605 | init_waitqueue_head(&rdev->irq.vblank_queue); |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 6a8617bac142..06def708b014 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
| @@ -112,9 +112,11 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj, | |||
| 112 | 112 | ||
| 113 | radeon_ttm_placement_from_domain(bo, domain); | 113 | radeon_ttm_placement_from_domain(bo, domain); |
| 114 | /* Kernel allocation are uninterruptible */ | 114 | /* Kernel allocation are uninterruptible */ |
| 115 | mutex_lock(&rdev->vram_mutex); | ||
| 115 | r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type, | 116 | r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type, |
| 116 | &bo->placement, 0, 0, !kernel, NULL, size, | 117 | &bo->placement, 0, 0, !kernel, NULL, size, |
| 117 | &radeon_ttm_bo_destroy); | 118 | &radeon_ttm_bo_destroy); |
| 119 | mutex_unlock(&rdev->vram_mutex); | ||
| 118 | if (unlikely(r != 0)) { | 120 | if (unlikely(r != 0)) { |
| 119 | if (r != -ERESTARTSYS) | 121 | if (r != -ERESTARTSYS) |
| 120 | dev_err(rdev->dev, | 122 | dev_err(rdev->dev, |
| @@ -170,7 +172,9 @@ void radeon_bo_unref(struct radeon_bo **bo) | |||
| 170 | if ((*bo) == NULL) | 172 | if ((*bo) == NULL) |
| 171 | return; | 173 | return; |
| 172 | tbo = &((*bo)->tbo); | 174 | tbo = &((*bo)->tbo); |
| 175 | mutex_lock(&(*bo)->rdev->vram_mutex); | ||
| 173 | ttm_bo_unref(&tbo); | 176 | ttm_bo_unref(&tbo); |
| 177 | mutex_unlock(&(*bo)->rdev->vram_mutex); | ||
| 174 | if (tbo == NULL) | 178 | if (tbo == NULL) |
| 175 | *bo = NULL; | 179 | *bo = NULL; |
| 176 | } | 180 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index a61de1f9ff64..da35bd7f38dc 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -32,6 +32,28 @@ | |||
| 32 | static void radeon_pm_idle_work_handler(struct work_struct *work); | 32 | static void radeon_pm_idle_work_handler(struct work_struct *work); |
| 33 | static int radeon_debugfs_pm_init(struct radeon_device *rdev); | 33 | static int radeon_debugfs_pm_init(struct radeon_device *rdev); |
| 34 | 34 | ||
| 35 | static void radeon_unmap_vram_bos(struct radeon_device *rdev) | ||
| 36 | { | ||
| 37 | struct radeon_bo *bo, *n; | ||
| 38 | |||
| 39 | if (list_empty(&rdev->gem.objects)) | ||
| 40 | return; | ||
| 41 | |||
| 42 | list_for_each_entry_safe(bo, n, &rdev->gem.objects, list) { | ||
| 43 | if (bo->tbo.mem.mem_type == TTM_PL_VRAM) | ||
| 44 | ttm_bo_unmap_virtual(&bo->tbo); | ||
| 45 | } | ||
| 46 | |||
| 47 | if (rdev->gart.table.vram.robj) | ||
| 48 | ttm_bo_unmap_virtual(&rdev->gart.table.vram.robj->tbo); | ||
| 49 | |||
| 50 | if (rdev->stollen_vga_memory) | ||
| 51 | ttm_bo_unmap_virtual(&rdev->stollen_vga_memory->tbo); | ||
| 52 | |||
| 53 | if (rdev->r600_blit.shader_obj) | ||
| 54 | ttm_bo_unmap_virtual(&rdev->r600_blit.shader_obj->tbo); | ||
| 55 | } | ||
| 56 | |||
| 35 | static void radeon_pm_set_clocks(struct radeon_device *rdev, int static_switch) | 57 | static void radeon_pm_set_clocks(struct radeon_device *rdev, int static_switch) |
| 36 | { | 58 | { |
| 37 | int i; | 59 | int i; |
| @@ -48,6 +70,10 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev, int static_switch) | |||
| 48 | rdev->irq.gui_idle = false; | 70 | rdev->irq.gui_idle = false; |
| 49 | radeon_irq_set(rdev); | 71 | radeon_irq_set(rdev); |
| 50 | 72 | ||
| 73 | mutex_lock(&rdev->vram_mutex); | ||
| 74 | |||
| 75 | radeon_unmap_vram_bos(rdev); | ||
| 76 | |||
| 51 | if (!static_switch) { | 77 | if (!static_switch) { |
| 52 | for (i = 0; i < rdev->num_crtc; i++) { | 78 | for (i = 0; i < rdev->num_crtc; i++) { |
| 53 | if (rdev->pm.active_crtcs & (1 << i)) { | 79 | if (rdev->pm.active_crtcs & (1 << i)) { |
| @@ -67,6 +93,8 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev, int static_switch) | |||
| 67 | } | 93 | } |
| 68 | } | 94 | } |
| 69 | } | 95 | } |
| 96 | |||
| 97 | mutex_unlock(&rdev->vram_mutex); | ||
| 70 | 98 | ||
| 71 | /* update display watermarks based on new power state */ | 99 | /* update display watermarks based on new power state */ |
| 72 | radeon_update_bandwidth_info(rdev); | 100 | radeon_update_bandwidth_info(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index af98f45954b3..3aa3a65800ab 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
| @@ -607,13 +607,17 @@ static const struct vm_operations_struct *ttm_vm_ops = NULL; | |||
| 607 | static int radeon_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 607 | static int radeon_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
| 608 | { | 608 | { |
| 609 | struct ttm_buffer_object *bo; | 609 | struct ttm_buffer_object *bo; |
| 610 | struct radeon_device *rdev; | ||
| 610 | int r; | 611 | int r; |
| 611 | 612 | ||
| 612 | bo = (struct ttm_buffer_object *)vma->vm_private_data; | 613 | bo = (struct ttm_buffer_object *)vma->vm_private_data; |
| 613 | if (bo == NULL) { | 614 | if (bo == NULL) { |
| 614 | return VM_FAULT_NOPAGE; | 615 | return VM_FAULT_NOPAGE; |
| 615 | } | 616 | } |
| 617 | rdev = radeon_get_rdev(bo->bdev); | ||
| 618 | mutex_lock(&rdev->vram_mutex); | ||
| 616 | r = ttm_vm_ops->fault(vma, vmf); | 619 | r = ttm_vm_ops->fault(vma, vmf); |
| 620 | mutex_unlock(&rdev->vram_mutex); | ||
| 617 | return r; | 621 | return r; |
| 618 | } | 622 | } |
| 619 | 623 | ||
