drm/radeon: make sa bo a stand alone object
authorChristian König <deathsimple@vodafone.de>
Wed, 9 May 2012 13:34:53 +0000 (15:34 +0200)
committerDave Airlie <airlied@redhat.com>
Wed, 9 May 2012 16:22:35 +0000 (17:22 +0100)
Allocating and freeing it seperately.

Signed-off-by: Christian König <deathsimple@vodafone.de>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_cs.c
drivers/gpu/drm/radeon/radeon_gart.c
drivers/gpu/drm/radeon/radeon_object.h
drivers/gpu/drm/radeon/radeon_ring.c
drivers/gpu/drm/radeon/radeon_sa.c
drivers/gpu/drm/radeon/radeon_semaphore.c

index d1c2154..9374ab1 100644 (file)
@@ -638,7 +638,7 @@ void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc);
  */
 
 struct radeon_ib {
-       struct radeon_sa_bo     sa_bo;
+       struct radeon_sa_bo     *sa_bo;
        unsigned                idx;
        uint32_t                length_dw;
        uint64_t                gpu_addr;
@@ -693,7 +693,7 @@ struct radeon_vm {
        unsigned                        last_pfn;
        u64                             pt_gpu_addr;
        u64                             *pt;
-       struct radeon_sa_bo             sa_bo;
+       struct radeon_sa_bo             *sa_bo;
        struct mutex                    mutex;
        /* last fence for cs using this vm */
        struct radeon_fence             *fence;
index b778037..5c065bf 100644 (file)
@@ -477,7 +477,7 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
                /* ib pool is bind at 0 in virtual address space to gpu_addr is the
                 * offset inside the pool bo
                 */
-               parser->const_ib->gpu_addr = parser->const_ib->sa_bo.soffset;
+               parser->const_ib->gpu_addr = parser->const_ib->sa_bo->soffset;
                r = radeon_ib_schedule(rdev, parser->const_ib);
                if (r)
                        goto out;
@@ -487,7 +487,7 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
        /* ib pool is bind at 0 in virtual address space to gpu_addr is the
         * offset inside the pool bo
         */
-       parser->ib->gpu_addr = parser->ib->sa_bo.soffset;
+       parser->ib->gpu_addr = parser->ib->sa_bo->soffset;
        parser->ib->is_const_ib = false;
        r = radeon_ib_schedule(rdev, parser->ib);
 out:
index 4a5d9d4..c5789ef 100644 (file)
@@ -404,8 +404,8 @@ retry:
                radeon_vm_unbind(rdev, vm_evict);
                goto retry;
        }
-       vm->pt = radeon_sa_bo_cpu_addr(&vm->sa_bo);
-       vm->pt_gpu_addr = radeon_sa_bo_gpu_addr(&vm->sa_bo);
+       vm->pt = radeon_sa_bo_cpu_addr(vm->sa_bo);
+       vm->pt_gpu_addr = radeon_sa_bo_gpu_addr(vm->sa_bo);
        memset(vm->pt, 0, RADEON_GPU_PAGE_ALIGN(vm->last_pfn * 8));
 
 retry_id:
index 99ab46a..4fc7f07 100644 (file)
@@ -168,10 +168,10 @@ extern int radeon_sa_bo_manager_suspend(struct radeon_device *rdev,
                                        struct radeon_sa_manager *sa_manager);
 extern int radeon_sa_bo_new(struct radeon_device *rdev,
                            struct radeon_sa_manager *sa_manager,
-                           struct radeon_sa_bo *sa_bo,
+                           struct radeon_sa_bo **sa_bo,
                            unsigned size, unsigned align);
 extern void radeon_sa_bo_free(struct radeon_device *rdev,
-                             struct radeon_sa_bo *sa_bo);
+                             struct radeon_sa_bo **sa_bo);
 #if defined(CONFIG_DEBUG_FS)
 extern void radeon_sa_bo_dump_debug_info(struct radeon_sa_manager *sa_manager,
                                         struct seq_file *m);
index f49c9c0..45adb37 100644 (file)
@@ -127,8 +127,8 @@ retry:
                                             size, 256);
                        if (!r) {
                                *ib = &rdev->ib_pool.ibs[idx];
-                               (*ib)->ptr = radeon_sa_bo_cpu_addr(&(*ib)->sa_bo);
-                               (*ib)->gpu_addr = radeon_sa_bo_gpu_addr(&(*ib)->sa_bo);
+                               (*ib)->ptr = radeon_sa_bo_cpu_addr((*ib)->sa_bo);
+                               (*ib)->gpu_addr = radeon_sa_bo_gpu_addr((*ib)->sa_bo);
                                (*ib)->fence = fence;
                                (*ib)->vm_id = 0;
                                (*ib)->is_const_ib = false;
@@ -227,7 +227,7 @@ int radeon_ib_pool_init(struct radeon_device *rdev)
                rdev->ib_pool.ibs[i].fence = NULL;
                rdev->ib_pool.ibs[i].idx = i;
                rdev->ib_pool.ibs[i].length_dw = 0;
-               INIT_LIST_HEAD(&rdev->ib_pool.ibs[i].sa_bo.list);
+               rdev->ib_pool.ibs[i].sa_bo = NULL;
        }
        rdev->ib_pool.head_id = 0;
        rdev->ib_pool.ready = true;
index 3bea7ba..625f2d4 100644 (file)
@@ -131,7 +131,7 @@ int radeon_sa_bo_manager_suspend(struct radeon_device *rdev,
  */
 int radeon_sa_bo_new(struct radeon_device *rdev,
                     struct radeon_sa_manager *sa_manager,
-                    struct radeon_sa_bo *sa_bo,
+                    struct radeon_sa_bo **sa_bo,
                     unsigned size, unsigned align)
 {
        struct radeon_sa_bo *tmp;
@@ -140,6 +140,9 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
 
        BUG_ON(align > RADEON_GPU_PAGE_SIZE);
        BUG_ON(size > sa_manager->size);
+
+       *sa_bo = kmalloc(sizeof(struct radeon_sa_bo), GFP_KERNEL);
+
        spin_lock(&sa_manager->lock);
 
        /* no one ? */
@@ -175,23 +178,30 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
        if ((sa_manager->size - offset) < size) {
                /* failed to find somethings big enough */
                spin_unlock(&sa_manager->lock);
+               kfree(*sa_bo);
+               *sa_bo = NULL;
                return -ENOMEM;
        }
 
 out:
-       sa_bo->manager = sa_manager;
-       sa_bo->soffset = offset;
-       sa_bo->eoffset = offset + size;
-       list_add(&sa_bo->list, head);
+       (*sa_bo)->manager = sa_manager;
+       (*sa_bo)->soffset = offset;
+       (*sa_bo)->eoffset = offset + size;
+       list_add(&(*sa_bo)->list, head);
        spin_unlock(&sa_manager->lock);
        return 0;
 }
 
-void radeon_sa_bo_free(struct radeon_device *rdev, struct radeon_sa_bo *sa_bo)
+void radeon_sa_bo_free(struct radeon_device *rdev, struct radeon_sa_bo **sa_bo)
 {
-       spin_lock(&sa_bo->manager->lock);
-       list_del_init(&sa_bo->list);
-       spin_unlock(&sa_bo->manager->lock);
+       if (!sa_bo || !*sa_bo)
+               return;
+
+       spin_lock(&(*sa_bo)->manager->lock);
+       list_del_init(&(*sa_bo)->list);
+       spin_unlock(&(*sa_bo)->manager->lock);
+       kfree(*sa_bo);
+       *sa_bo = NULL;
 }
 
 #if defined(CONFIG_DEBUG_FS)
index f312ba5..d518d32 100644 (file)
@@ -53,8 +53,8 @@ static int radeon_semaphore_add_bo(struct radeon_device *rdev)
                kfree(bo);
                return r;
        }
-       gpu_addr = radeon_sa_bo_gpu_addr(&bo->ib->sa_bo);
-       cpu_ptr = radeon_sa_bo_cpu_addr(&bo->ib->sa_bo);
+       gpu_addr = radeon_sa_bo_gpu_addr(bo->ib->sa_bo);
+       cpu_ptr = radeon_sa_bo_cpu_addr(bo->ib->sa_bo);
        for (i = 0; i < (RADEON_SEMAPHORE_BO_SIZE/8); i++) {
                bo->semaphores[i].gpu_addr = gpu_addr;
                bo->semaphores[i].cpu_ptr = cpu_ptr;