From: Christian König <deathsim...@vodafone.de>

Allocating and freeing it seperately.

Signed-off-by: Christian König <deathsim...@vodafone.de>
---
 drivers/gpu/drm/radeon/radeon.h           |    4 ++--
 drivers/gpu/drm/radeon/radeon_cs.c        |    4 ++--
 drivers/gpu/drm/radeon/radeon_gart.c      |    4 ++--
 drivers/gpu/drm/radeon/radeon_object.h    |    4 ++--
 drivers/gpu/drm/radeon/radeon_ring.c      |    6 +++---
 drivers/gpu/drm/radeon/radeon_sa.c        |   28 +++++++++++++++++++---------
 drivers/gpu/drm/radeon/radeon_semaphore.c |    4 ++--
 7 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index a90cabf..3519a52 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -629,7 +629,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;
@@ -684,7 +684,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;
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c 
b/drivers/gpu/drm/radeon/radeon_cs.c
index ac6c9e3..2aa3f89 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -470,7 +470,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;
@@ -480,7 +480,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:
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c 
b/drivers/gpu/drm/radeon/radeon_gart.c
index 4a5d9d4..c5789ef 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -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:
diff --git a/drivers/gpu/drm/radeon/radeon_object.h 
b/drivers/gpu/drm/radeon/radeon_object.h
index 99ab46a..4fc7f07 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -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);
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c 
b/drivers/gpu/drm/radeon/radeon_ring.c
index 40a8528..739554c 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -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;
diff --git a/drivers/gpu/drm/radeon/radeon_sa.c 
b/drivers/gpu/drm/radeon/radeon_sa.c
index 3bea7ba..625f2d4 100644
--- a/drivers/gpu/drm/radeon/radeon_sa.c
+++ b/drivers/gpu/drm/radeon/radeon_sa.c
@@ -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)
diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c 
b/drivers/gpu/drm/radeon/radeon_semaphore.c
index f312ba5..d518d32 100644
--- a/drivers/gpu/drm/radeon/radeon_semaphore.c
+++ b/drivers/gpu/drm/radeon/radeon_semaphore.c
@@ -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;
-- 
1.7.7.6

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to