[PATCH 2/2] drm/radeon: allocate semaphore from the ib pool

2011-12-21 Thread alexdeuc...@gmail.com
From: Jerome Glisse 

This allow to share the ib pool with semaphore and avoid
having more bo around.

Signed-off-by: Jerome Glisse 
Signed-off-by: Alex Deucher 
---
 drivers/gpu/drm/radeon/radeon.h   |   67 -
 drivers/gpu/drm/radeon/radeon_device.c|2 +-
 drivers/gpu/drm/radeon/radeon_ring.c  |5 +-
 drivers/gpu/drm/radeon/radeon_semaphore.c |  157 -
 4 files changed, 131 insertions(+), 100 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 0301896..374f9a4 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -243,32 +243,6 @@ void radeon_fence_unref(struct radeon_fence **fence);
 int radeon_fence_count_emitted(struct radeon_device *rdev, int ring);

 /*
- * Semaphores.
- */
-struct radeon_ring;
-
-struct radeon_semaphore_driver {
-   rwlock_tlock;
-   struct list_headfree;
-};
-
-struct radeon_semaphore {
-   struct radeon_bo*robj;
-   struct list_headlist;
-   uint64_tgpu_addr;
-};
-
-void radeon_semaphore_driver_fini(struct radeon_device *rdev);
-int radeon_semaphore_create(struct radeon_device *rdev,
-   struct radeon_semaphore **semaphore);
-void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring,
- struct radeon_semaphore *semaphore);
-void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
-   struct radeon_semaphore *semaphore);
-void radeon_semaphore_free(struct radeon_device *rdev,
-  struct radeon_semaphore *semaphore);
-
-/*
  * Tiling registers
  */
 struct radeon_surface_reg {
@@ -387,6 +361,46 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv,
 uint32_t handle);

 /*
+ * Semaphores.
+ */
+struct radeon_ring;
+
+#defineRADEON_SEMAPHORE_BO_SIZE256
+
+struct radeon_semaphore_driver {
+   rwlock_tlock;
+   struct list_headbo;
+};
+
+struct radeon_semaphore_bo;
+
+/* everything here is constant */
+struct radeon_semaphore {
+   struct list_headlist;
+   uint64_tgpu_addr;
+   uint32_t*cpu_ptr;
+   struct radeon_semaphore_bo  *bo;
+};
+
+struct radeon_semaphore_bo {
+   struct list_headlist;
+   struct radeon_ib*ib;
+   struct list_headfree;
+   struct radeon_semaphore semaphores[RADEON_SEMAPHORE_BO_SIZE/8];
+   unsignednused;
+};
+
+void radeon_semaphore_driver_fini(struct radeon_device *rdev);
+int radeon_semaphore_create(struct radeon_device *rdev,
+   struct radeon_semaphore **semaphore);
+void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring,
+ struct radeon_semaphore *semaphore);
+void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
+   struct radeon_semaphore *semaphore);
+void radeon_semaphore_free(struct radeon_device *rdev,
+  struct radeon_semaphore *semaphore);
+
+/*
  * GART structures, functions & helpers
  */
 struct radeon_mc;
@@ -641,6 +655,7 @@ void r600_blit_suspend(struct radeon_device *rdev);
 int radeon_ib_get(struct radeon_device *rdev, int ring,
  struct radeon_ib **ib, unsigned size);
 void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib);
+bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib);
 int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib);
 int radeon_ib_pool_init(struct radeon_device *rdev);
 void radeon_ib_pool_fini(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_device.c 
b/drivers/gpu/drm/radeon/radeon_device.c
index e81c333..846eeb8 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -731,7 +731,7 @@ int radeon_device_init(struct radeon_device *rdev,
INIT_LIST_HEAD(&rdev->gem.objects);
init_waitqueue_head(&rdev->irq.vblank_queue);
init_waitqueue_head(&rdev->irq.idle_queue);
-   INIT_LIST_HEAD(&rdev->semaphore_drv.free);
+   INIT_LIST_HEAD(&rdev->semaphore_drv.bo);

/* Set asic functions */
r = radeon_asic_init(rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c 
b/drivers/gpu/drm/radeon/radeon_ring.c
index bc844fe..465fb34 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -77,8 +77,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v)
 /*
  * IB.
  */
-static bool radeon_ib_try_free(struct radeon_device *rdev,
-  struct radeon_ib *ib)
+bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib)
 {
 

[PATCH 2/2] drm/radeon: allocate semaphore from the ib pool

2011-12-21 Thread alexdeucher
From: Jerome Glisse 

This allow to share the ib pool with semaphore and avoid
having more bo around.

Signed-off-by: Jerome Glisse 
Signed-off-by: Alex Deucher 
---
 drivers/gpu/drm/radeon/radeon.h   |   67 -
 drivers/gpu/drm/radeon/radeon_device.c|2 +-
 drivers/gpu/drm/radeon/radeon_ring.c  |5 +-
 drivers/gpu/drm/radeon/radeon_semaphore.c |  157 -
 4 files changed, 131 insertions(+), 100 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 0301896..374f9a4 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -243,32 +243,6 @@ void radeon_fence_unref(struct radeon_fence **fence);
 int radeon_fence_count_emitted(struct radeon_device *rdev, int ring);
 
 /*
- * Semaphores.
- */
-struct radeon_ring;
-
-struct radeon_semaphore_driver {
-   rwlock_tlock;
-   struct list_headfree;
-};
-
-struct radeon_semaphore {
-   struct radeon_bo*robj;
-   struct list_headlist;
-   uint64_tgpu_addr;
-};
-
-void radeon_semaphore_driver_fini(struct radeon_device *rdev);
-int radeon_semaphore_create(struct radeon_device *rdev,
-   struct radeon_semaphore **semaphore);
-void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring,
- struct radeon_semaphore *semaphore);
-void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
-   struct radeon_semaphore *semaphore);
-void radeon_semaphore_free(struct radeon_device *rdev,
-  struct radeon_semaphore *semaphore);
-
-/*
  * Tiling registers
  */
 struct radeon_surface_reg {
@@ -387,6 +361,46 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv,
 uint32_t handle);
 
 /*
+ * Semaphores.
+ */
+struct radeon_ring;
+
+#defineRADEON_SEMAPHORE_BO_SIZE256
+
+struct radeon_semaphore_driver {
+   rwlock_tlock;
+   struct list_headbo;
+};
+
+struct radeon_semaphore_bo;
+
+/* everything here is constant */
+struct radeon_semaphore {
+   struct list_headlist;
+   uint64_tgpu_addr;
+   uint32_t*cpu_ptr;
+   struct radeon_semaphore_bo  *bo;
+};
+
+struct radeon_semaphore_bo {
+   struct list_headlist;
+   struct radeon_ib*ib;
+   struct list_headfree;
+   struct radeon_semaphore semaphores[RADEON_SEMAPHORE_BO_SIZE/8];
+   unsignednused;
+};
+
+void radeon_semaphore_driver_fini(struct radeon_device *rdev);
+int radeon_semaphore_create(struct radeon_device *rdev,
+   struct radeon_semaphore **semaphore);
+void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring,
+ struct radeon_semaphore *semaphore);
+void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
+   struct radeon_semaphore *semaphore);
+void radeon_semaphore_free(struct radeon_device *rdev,
+  struct radeon_semaphore *semaphore);
+
+/*
  * GART structures, functions & helpers
  */
 struct radeon_mc;
@@ -641,6 +655,7 @@ void r600_blit_suspend(struct radeon_device *rdev);
 int radeon_ib_get(struct radeon_device *rdev, int ring,
  struct radeon_ib **ib, unsigned size);
 void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib);
+bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib);
 int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib);
 int radeon_ib_pool_init(struct radeon_device *rdev);
 void radeon_ib_pool_fini(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_device.c 
b/drivers/gpu/drm/radeon/radeon_device.c
index e81c333..846eeb8 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -731,7 +731,7 @@ int radeon_device_init(struct radeon_device *rdev,
INIT_LIST_HEAD(&rdev->gem.objects);
init_waitqueue_head(&rdev->irq.vblank_queue);
init_waitqueue_head(&rdev->irq.idle_queue);
-   INIT_LIST_HEAD(&rdev->semaphore_drv.free);
+   INIT_LIST_HEAD(&rdev->semaphore_drv.bo);
 
/* Set asic functions */
r = radeon_asic_init(rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c 
b/drivers/gpu/drm/radeon/radeon_ring.c
index bc844fe..465fb34 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -77,8 +77,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v)
 /*
  * IB.
  */
-static bool radeon_ib_try_free(struct radeon_device *rdev,
-  struct radeon_ib *ib)
+bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib)
 

[PATCH 2/2] drm/radeon: allocate semaphore from the ib pool

2011-12-05 Thread j.gli...@gmail.com
From: Jerome Glisse 

This allow to share the ib pool with semaphore and avoid
having more bo around.

Signed-off-by: Jerome Glisse 
---
 drivers/gpu/drm/radeon/radeon.h   |   67 -
 drivers/gpu/drm/radeon/radeon_device.c|2 +-
 drivers/gpu/drm/radeon/radeon_ring.c  |5 +-
 drivers/gpu/drm/radeon/radeon_semaphore.c |  157 -
 4 files changed, 131 insertions(+), 100 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 8cb6a58..5e35423 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -247,32 +247,6 @@ void radeon_fence_unref(struct radeon_fence **fence);
 int radeon_fence_count_emitted(struct radeon_device *rdev, int ring);

 /*
- * Semaphores.
- */
-struct radeon_ring;
-
-struct radeon_semaphore_driver {
-   rwlock_tlock;
-   struct list_headfree;
-};
-
-struct radeon_semaphore {
-   struct radeon_bo*robj;
-   struct list_headlist;
-   uint64_tgpu_addr;
-};
-
-void radeon_semaphore_driver_fini(struct radeon_device *rdev);
-int radeon_semaphore_create(struct radeon_device *rdev,
-   struct radeon_semaphore **semaphore);
-void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring,
- struct radeon_semaphore *semaphore);
-void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
-   struct radeon_semaphore *semaphore);
-void radeon_semaphore_free(struct radeon_device *rdev,
-  struct radeon_semaphore *semaphore);
-
-/*
  * Tiling registers
  */
 struct radeon_surface_reg {
@@ -410,6 +384,46 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv,
 uint32_t handle);

 /*
+ * Semaphores.
+ */
+struct radeon_ring;
+
+#defineRADEON_SEMAPHORE_BO_SIZE256
+
+struct radeon_semaphore_driver {
+   rwlock_tlock;
+   struct list_headbo;
+};
+
+struct radeon_semaphore_bo;
+
+/* everything here is constant */
+struct radeon_semaphore {
+   struct list_headlist;
+   uint64_tgpu_addr;
+   uint32_t*cpu_ptr;
+   struct radeon_semaphore_bo  *bo;
+};
+
+struct radeon_semaphore_bo {
+   struct list_headlist;
+   struct radeon_ib*ib;
+   struct list_headfree;
+   struct radeon_semaphore semaphores[RADEON_SEMAPHORE_BO_SIZE/8];
+   unsignednused;
+};
+
+void radeon_semaphore_driver_fini(struct radeon_device *rdev);
+int radeon_semaphore_create(struct radeon_device *rdev,
+   struct radeon_semaphore **semaphore);
+void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring,
+ struct radeon_semaphore *semaphore);
+void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
+   struct radeon_semaphore *semaphore);
+void radeon_semaphore_free(struct radeon_device *rdev,
+  struct radeon_semaphore *semaphore);
+
+/*
  * GART structures, functions & helpers
  */
 struct radeon_mc;
@@ -716,6 +730,7 @@ void r600_blit_suspend(struct radeon_device *rdev);
 int radeon_ib_get(struct radeon_device *rdev, int ring,
  struct radeon_ib **ib, unsigned size);
 void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib);
+bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib);
 int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib);
 int radeon_ib_pool_init(struct radeon_device *rdev);
 void radeon_ib_pool_fini(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_device.c 
b/drivers/gpu/drm/radeon/radeon_device.c
index 6566860..aa9a11e 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -731,7 +731,7 @@ int radeon_device_init(struct radeon_device *rdev,
INIT_LIST_HEAD(&rdev->gem.objects);
init_waitqueue_head(&rdev->irq.vblank_queue);
init_waitqueue_head(&rdev->irq.idle_queue);
-   INIT_LIST_HEAD(&rdev->semaphore_drv.free);
+   INIT_LIST_HEAD(&rdev->semaphore_drv.bo);
/* initialize vm here */
rdev->vm_manager.use_bitmap = 1;
rdev->vm_manager.max_pfn = 1 << 20;
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c 
b/drivers/gpu/drm/radeon/radeon_ring.c
index 5f9edea..4fe320f 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -77,8 +77,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v)
 /*
  * IB.
  */
-static bool radeon_ib_try_free(struct radeon_device *rdev,
-  struct radeon_ib *ib)
+bool radeon_ib_try_free(struct radeon_device *rdev, struct 

[PATCH 2/2] drm/radeon: allocate semaphore from the ib pool

2011-12-05 Thread j . glisse
From: Jerome Glisse 

This allow to share the ib pool with semaphore and avoid
having more bo around.

Signed-off-by: Jerome Glisse 
---
 drivers/gpu/drm/radeon/radeon.h   |   67 -
 drivers/gpu/drm/radeon/radeon_device.c|2 +-
 drivers/gpu/drm/radeon/radeon_ring.c  |5 +-
 drivers/gpu/drm/radeon/radeon_semaphore.c |  157 -
 4 files changed, 131 insertions(+), 100 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 8cb6a58..5e35423 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -247,32 +247,6 @@ void radeon_fence_unref(struct radeon_fence **fence);
 int radeon_fence_count_emitted(struct radeon_device *rdev, int ring);
 
 /*
- * Semaphores.
- */
-struct radeon_ring;
-
-struct radeon_semaphore_driver {
-   rwlock_tlock;
-   struct list_headfree;
-};
-
-struct radeon_semaphore {
-   struct radeon_bo*robj;
-   struct list_headlist;
-   uint64_tgpu_addr;
-};
-
-void radeon_semaphore_driver_fini(struct radeon_device *rdev);
-int radeon_semaphore_create(struct radeon_device *rdev,
-   struct radeon_semaphore **semaphore);
-void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring,
- struct radeon_semaphore *semaphore);
-void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
-   struct radeon_semaphore *semaphore);
-void radeon_semaphore_free(struct radeon_device *rdev,
-  struct radeon_semaphore *semaphore);
-
-/*
  * Tiling registers
  */
 struct radeon_surface_reg {
@@ -410,6 +384,46 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv,
 uint32_t handle);
 
 /*
+ * Semaphores.
+ */
+struct radeon_ring;
+
+#defineRADEON_SEMAPHORE_BO_SIZE256
+
+struct radeon_semaphore_driver {
+   rwlock_tlock;
+   struct list_headbo;
+};
+
+struct radeon_semaphore_bo;
+
+/* everything here is constant */
+struct radeon_semaphore {
+   struct list_headlist;
+   uint64_tgpu_addr;
+   uint32_t*cpu_ptr;
+   struct radeon_semaphore_bo  *bo;
+};
+
+struct radeon_semaphore_bo {
+   struct list_headlist;
+   struct radeon_ib*ib;
+   struct list_headfree;
+   struct radeon_semaphore semaphores[RADEON_SEMAPHORE_BO_SIZE/8];
+   unsignednused;
+};
+
+void radeon_semaphore_driver_fini(struct radeon_device *rdev);
+int radeon_semaphore_create(struct radeon_device *rdev,
+   struct radeon_semaphore **semaphore);
+void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring,
+ struct radeon_semaphore *semaphore);
+void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
+   struct radeon_semaphore *semaphore);
+void radeon_semaphore_free(struct radeon_device *rdev,
+  struct radeon_semaphore *semaphore);
+
+/*
  * GART structures, functions & helpers
  */
 struct radeon_mc;
@@ -716,6 +730,7 @@ void r600_blit_suspend(struct radeon_device *rdev);
 int radeon_ib_get(struct radeon_device *rdev, int ring,
  struct radeon_ib **ib, unsigned size);
 void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib);
+bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib);
 int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib);
 int radeon_ib_pool_init(struct radeon_device *rdev);
 void radeon_ib_pool_fini(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_device.c 
b/drivers/gpu/drm/radeon/radeon_device.c
index 6566860..aa9a11e 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -731,7 +731,7 @@ int radeon_device_init(struct radeon_device *rdev,
INIT_LIST_HEAD(&rdev->gem.objects);
init_waitqueue_head(&rdev->irq.vblank_queue);
init_waitqueue_head(&rdev->irq.idle_queue);
-   INIT_LIST_HEAD(&rdev->semaphore_drv.free);
+   INIT_LIST_HEAD(&rdev->semaphore_drv.bo);
/* initialize vm here */
rdev->vm_manager.use_bitmap = 1;
rdev->vm_manager.max_pfn = 1 << 20;
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c 
b/drivers/gpu/drm/radeon/radeon_ring.c
index 5f9edea..4fe320f 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -77,8 +77,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v)
 /*
  * IB.
  */
-static bool radeon_ib_try_free(struct radeon_device *rdev,
-  struct radeon_ib *ib)
+bool radeon_ib_try_free(struct radeon_device *rdev, struc