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 | ||