~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to drivers/gpu/drm/radeon/radeon_object.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
55
55
        list_del_init(&bo->list);
56
56
        mutex_unlock(&bo->rdev->gem.mutex);
57
57
        radeon_bo_clear_surface_reg(bo);
 
58
        drm_gem_object_release(&bo->gem_base);
58
59
        kfree(bo);
59
60
}
60
61
 
86
87
        rbo->placement.num_busy_placement = c;
87
88
}
88
89
 
89
 
int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
 
90
int radeon_bo_create(struct radeon_device *rdev,
90
91
                     unsigned long size, int byte_align, bool kernel, u32 domain,
91
92
                     struct radeon_bo **bo_ptr)
92
93
{
96
97
        unsigned long max_size = 0;
97
98
        int r;
98
99
 
 
100
        size = ALIGN(size, PAGE_SIZE);
 
101
 
99
102
        if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) {
100
103
                rdev->mman.bdev.dev_mapping = rdev->ddev->dev_mapping;
101
104
        }
118
121
        bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
119
122
        if (bo == NULL)
120
123
                return -ENOMEM;
 
124
        r = drm_gem_object_init(rdev->ddev, &bo->gem_base, size);
 
125
        if (unlikely(r)) {
 
126
                kfree(bo);
 
127
                return r;
 
128
        }
121
129
        bo->rdev = rdev;
122
 
        bo->gobj = gobj;
 
130
        bo->gem_base.driver_private = NULL;
123
131
        bo->surface_reg = -1;
124
132
        INIT_LIST_HEAD(&bo->list);
125
133
        radeon_ttm_placement_from_domain(bo, domain);
142
150
                return r;
143
151
        }
144
152
        *bo_ptr = bo;
145
 
        if (gobj) {
146
 
                mutex_lock(&bo->rdev->gem.mutex);
147
 
                list_add_tail(&bo->list, &rdev->gem.objects);
148
 
                mutex_unlock(&bo->rdev->gem.mutex);
149
 
        }
 
153
 
150
154
        trace_radeon_bo_create(bo);
 
155
 
151
156
        return 0;
152
157
}
153
158
 
260
265
void radeon_bo_force_delete(struct radeon_device *rdev)
261
266
{
262
267
        struct radeon_bo *bo, *n;
263
 
        struct drm_gem_object *gobj;
264
268
 
265
269
        if (list_empty(&rdev->gem.objects)) {
266
270
                return;
268
272
        dev_err(rdev->dev, "Userspace still has active objects !\n");
269
273
        list_for_each_entry_safe(bo, n, &rdev->gem.objects, list) {
270
274
                mutex_lock(&rdev->ddev->struct_mutex);
271
 
                gobj = bo->gobj;
272
275
                dev_err(rdev->dev, "%p %p %lu %lu force free\n",
273
 
                        gobj, bo, (unsigned long)gobj->size,
274
 
                        *((unsigned long *)&gobj->refcount));
 
276
                        &bo->gem_base, bo, (unsigned long)bo->gem_base.size,
 
277
                        *((unsigned long *)&bo->gem_base.refcount));
275
278
                mutex_lock(&bo->rdev->gem.mutex);
276
279
                list_del_init(&bo->list);
277
280
                mutex_unlock(&bo->rdev->gem.mutex);
278
 
                radeon_bo_unref(&bo);
279
 
                gobj->driver_private = NULL;
280
 
                drm_gem_object_unreference(gobj);
 
281
                /* this should unref the ttm bo */
 
282
                drm_gem_object_unreference(&bo->gem_base);
281
283
                mutex_unlock(&rdev->ddev->struct_mutex);
282
284
        }
283
285
}