Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 196520
b: refs/heads/master
c: 5876dd2
h: refs/heads/master
v: v3
  • Loading branch information
Matthew Garrett authored and Dave Airlie committed May 18, 2010
1 parent 1c7219a commit 74a2ecb
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2aba631c008e7d82e3ec45dd32bec1ea63a963cf
refs/heads/master: 5876dd249e8e47c730cac090bf6edd88e5f04327
1 change: 1 addition & 0 deletions trunk/drivers/gpu/drm/radeon/radeon.h
Original file line number Diff line number Diff line change
Expand Up @@ -1024,6 +1024,7 @@ struct radeon_device {
struct work_struct hotplug_work;
int num_crtc; /* number of crtcs */
struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */
struct mutex vram_mutex;

/* audio stuff */
struct timer_list audio_timer;
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/gpu/drm/radeon/radeon_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,6 +599,7 @@ int radeon_device_init(struct radeon_device *rdev,
spin_lock_init(&rdev->ih.lock);
mutex_init(&rdev->gem.mutex);
mutex_init(&rdev->pm.mutex);
mutex_init(&rdev->vram_mutex);
rwlock_init(&rdev->fence_drv.lock);
INIT_LIST_HEAD(&rdev->gem.objects);
init_waitqueue_head(&rdev->irq.vblank_queue);
Expand Down
4 changes: 4 additions & 0 deletions trunk/drivers/gpu/drm/radeon/radeon_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,11 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,

radeon_ttm_placement_from_domain(bo, domain);
/* Kernel allocation are uninterruptible */
mutex_lock(&rdev->vram_mutex);
r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
&bo->placement, 0, 0, !kernel, NULL, size,
&radeon_ttm_bo_destroy);
mutex_unlock(&rdev->vram_mutex);
if (unlikely(r != 0)) {
if (r != -ERESTARTSYS)
dev_err(rdev->dev,
Expand Down Expand Up @@ -170,7 +172,9 @@ void radeon_bo_unref(struct radeon_bo **bo)
if ((*bo) == NULL)
return;
tbo = &((*bo)->tbo);
mutex_lock(&(*bo)->rdev->vram_mutex);
ttm_bo_unref(&tbo);
mutex_unlock(&(*bo)->rdev->vram_mutex);
if (tbo == NULL)
*bo = NULL;
}
Expand Down
28 changes: 28 additions & 0 deletions trunk/drivers/gpu/drm/radeon/radeon_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,28 @@
static void radeon_pm_idle_work_handler(struct work_struct *work);
static int radeon_debugfs_pm_init(struct radeon_device *rdev);

static void radeon_unmap_vram_bos(struct radeon_device *rdev)
{
struct radeon_bo *bo, *n;

if (list_empty(&rdev->gem.objects))
return;

list_for_each_entry_safe(bo, n, &rdev->gem.objects, list) {
if (bo->tbo.mem.mem_type == TTM_PL_VRAM)
ttm_bo_unmap_virtual(&bo->tbo);
}

if (rdev->gart.table.vram.robj)
ttm_bo_unmap_virtual(&rdev->gart.table.vram.robj->tbo);

if (rdev->stollen_vga_memory)
ttm_bo_unmap_virtual(&rdev->stollen_vga_memory->tbo);

if (rdev->r600_blit.shader_obj)
ttm_bo_unmap_virtual(&rdev->r600_blit.shader_obj->tbo);
}

static void radeon_pm_set_clocks(struct radeon_device *rdev, int static_switch)
{
int i;
Expand All @@ -48,6 +70,10 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev, int static_switch)
rdev->irq.gui_idle = false;
radeon_irq_set(rdev);

mutex_lock(&rdev->vram_mutex);

radeon_unmap_vram_bos(rdev);

if (!static_switch) {
for (i = 0; i < rdev->num_crtc; i++) {
if (rdev->pm.active_crtcs & (1 << i)) {
Expand All @@ -67,6 +93,8 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev, int static_switch)
}
}
}

mutex_unlock(&rdev->vram_mutex);

/* update display watermarks based on new power state */
radeon_update_bandwidth_info(rdev);
Expand Down
6 changes: 5 additions & 1 deletion trunk/drivers/gpu/drm/radeon/radeon_ttm.c
Original file line number Diff line number Diff line change
Expand Up @@ -607,13 +607,17 @@ static const struct vm_operations_struct *ttm_vm_ops = NULL;
static int radeon_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
struct ttm_buffer_object *bo;
struct radeon_device *rdev;
int r;

bo = (struct ttm_buffer_object *)vma->vm_private_data;
bo = (struct ttm_buffer_object *)vma->vm_private_data;
if (bo == NULL) {
return VM_FAULT_NOPAGE;
}
rdev = radeon_get_rdev(bo->bdev);
mutex_lock(&rdev->vram_mutex);
r = ttm_vm_ops->fault(vma, vmf);
mutex_unlock(&rdev->vram_mutex);
return r;
}

Expand Down

0 comments on commit 74a2ecb

Please sign in to comment.