[PATCH 03/10] drm/radeon: rework ring syncing code

2012-06-01 Thread Christian König
Move inter ring syncing with semaphores into the
existing ring allocations, with that we need to
lock the ring mutex only once.

Signed-off-by: Christian K?nig 
Reviewed-by: Jerome Glisse 
---
 drivers/gpu/drm/radeon/evergreen_blit_kms.c |3 +-
 drivers/gpu/drm/radeon/r600.c   |5 +-
 drivers/gpu/drm/radeon/r600_blit_kms.c  |   24 +++--
 drivers/gpu/drm/radeon/radeon.h |6 +--
 drivers/gpu/drm/radeon/radeon_asic.h|5 +-
 drivers/gpu/drm/radeon/radeon_cs.c  |   38 +++---
 drivers/gpu/drm/radeon/radeon_ring.c|   30 +--
 drivers/gpu/drm/radeon/radeon_semaphore.c   |   71 ++-
 drivers/gpu/drm/radeon/radeon_test.c|6 +--
 drivers/gpu/drm/radeon/radeon_ttm.c |   20 
 10 files changed, 92 insertions(+), 116 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c 
b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
index 1e96bd4..e512560 100644
--- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
+++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
@@ -622,7 +622,8 @@ int evergreen_blit_init(struct radeon_device *rdev)
rdev->r600_blit.primitives.draw_auto = draw_auto;
rdev->r600_blit.primitives.set_default_state = set_default_state;

-   rdev->r600_blit.ring_size_common = 55; /* shaders + def state */
+   rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev->r600_blit.ring_size_common += 55; /* shaders + def state */
rdev->r600_blit.ring_size_common += 16; /* fence emit for VB IB */
rdev->r600_blit.ring_size_common += 5; /* done copy */
rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index e5279f9..a8d8c44 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2371,15 +2371,16 @@ int r600_copy_blit(struct radeon_device *rdev,
   unsigned num_gpu_pages,
   struct radeon_fence **fence)
 {
+   struct radeon_semaphore *sem = NULL;
struct radeon_sa_bo *vb = NULL;
int r;

-   r = r600_blit_prepare_copy(rdev, num_gpu_pages, );
+   r = r600_blit_prepare_copy(rdev, num_gpu_pages, fence, , );
if (r) {
return r;
}
r600_kms_blit_copy(rdev, src_offset, dst_offset, num_gpu_pages, vb);
-   r600_blit_done_copy(rdev, fence, vb);
+   r600_blit_done_copy(rdev, fence, vb, sem);
return 0;
 }

diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c 
b/drivers/gpu/drm/radeon/r600_blit_kms.c
index 02f4eeb..2b8d641 100644
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
@@ -512,7 +512,8 @@ int r600_blit_init(struct radeon_device *rdev)
rdev->r600_blit.primitives.draw_auto = draw_auto;
rdev->r600_blit.primitives.set_default_state = set_default_state;

-   rdev->r600_blit.ring_size_common = 40; /* shaders + def state */
+   rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev->r600_blit.ring_size_common += 40; /* shaders + def state */
rdev->r600_blit.ring_size_common += 5; /* done copy */
rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */

@@ -666,7 +667,8 @@ static unsigned r600_blit_create_rect(unsigned 
num_gpu_pages,


 int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
-  struct radeon_sa_bo **vb)
+  struct radeon_fence **fence, struct radeon_sa_bo 
**vb,
+  struct radeon_semaphore **sem)
 {
struct radeon_ring *ring = >ring[RADEON_RING_TYPE_GFX_INDEX];
int r;
@@ -689,22 +691,37 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, 
unsigned num_gpu_pages,
return r;
}

+   r = radeon_semaphore_create(rdev, sem);
+   if (r) {
+   radeon_sa_bo_free(rdev, vb, NULL);
+   return r;
+   }
+
/* calculate number of loops correctly */
ring_size = num_loops * dwords_per_loop;
ring_size += rdev->r600_blit.ring_size_common;
r = radeon_ring_lock(rdev, ring, ring_size);
if (r) {
radeon_sa_bo_free(rdev, vb, NULL);
+   radeon_semaphore_free(rdev, sem, NULL);
return r;
}

+   if (radeon_fence_need_sync(*fence, RADEON_RING_TYPE_GFX_INDEX)) {
+   radeon_semaphore_sync_rings(rdev, *sem, (*fence)->ring,
+   RADEON_RING_TYPE_GFX_INDEX);
+   radeon_fence_note_sync(*fence, RADEON_RING_TYPE_GFX_INDEX);
+   } else {
+   radeon_semaphore_free(rdev, sem, NULL);
+   }
+
rdev->r600_blit.primitives.set_default_state(rdev);
rdev->r600_blit.primitives.set_shaders(rdev);
return 0;
 }

 void r600_blit_done_copy(struct radeon_device *rdev, 

[PATCH 03/10] drm/radeon: rework ring syncing code

2012-06-01 Thread Christian König
Move inter ring syncing with semaphores into the
existing ring allocations, with that we need to
lock the ring mutex only once.

Signed-off-by: Christian König deathsim...@vodafone.de
Reviewed-by: Jerome Glisse jgli...@redhat.com
---
 drivers/gpu/drm/radeon/evergreen_blit_kms.c |3 +-
 drivers/gpu/drm/radeon/r600.c   |5 +-
 drivers/gpu/drm/radeon/r600_blit_kms.c  |   24 +++--
 drivers/gpu/drm/radeon/radeon.h |6 +--
 drivers/gpu/drm/radeon/radeon_asic.h|5 +-
 drivers/gpu/drm/radeon/radeon_cs.c  |   38 +++---
 drivers/gpu/drm/radeon/radeon_ring.c|   30 +--
 drivers/gpu/drm/radeon/radeon_semaphore.c   |   71 ++-
 drivers/gpu/drm/radeon/radeon_test.c|6 +--
 drivers/gpu/drm/radeon/radeon_ttm.c |   20 
 10 files changed, 92 insertions(+), 116 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c 
b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
index 1e96bd4..e512560 100644
--- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
+++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
@@ -622,7 +622,8 @@ int evergreen_blit_init(struct radeon_device *rdev)
rdev-r600_blit.primitives.draw_auto = draw_auto;
rdev-r600_blit.primitives.set_default_state = set_default_state;
 
-   rdev-r600_blit.ring_size_common = 55; /* shaders + def state */
+   rdev-r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev-r600_blit.ring_size_common += 55; /* shaders + def state */
rdev-r600_blit.ring_size_common += 16; /* fence emit for VB IB */
rdev-r600_blit.ring_size_common += 5; /* done copy */
rdev-r600_blit.ring_size_common += 16; /* fence emit for done copy */
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index e5279f9..a8d8c44 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2371,15 +2371,16 @@ int r600_copy_blit(struct radeon_device *rdev,
   unsigned num_gpu_pages,
   struct radeon_fence **fence)
 {
+   struct radeon_semaphore *sem = NULL;
struct radeon_sa_bo *vb = NULL;
int r;
 
-   r = r600_blit_prepare_copy(rdev, num_gpu_pages, vb);
+   r = r600_blit_prepare_copy(rdev, num_gpu_pages, fence, vb, sem);
if (r) {
return r;
}
r600_kms_blit_copy(rdev, src_offset, dst_offset, num_gpu_pages, vb);
-   r600_blit_done_copy(rdev, fence, vb);
+   r600_blit_done_copy(rdev, fence, vb, sem);
return 0;
 }
 
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c 
b/drivers/gpu/drm/radeon/r600_blit_kms.c
index 02f4eeb..2b8d641 100644
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
@@ -512,7 +512,8 @@ int r600_blit_init(struct radeon_device *rdev)
rdev-r600_blit.primitives.draw_auto = draw_auto;
rdev-r600_blit.primitives.set_default_state = set_default_state;
 
-   rdev-r600_blit.ring_size_common = 40; /* shaders + def state */
+   rdev-r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev-r600_blit.ring_size_common += 40; /* shaders + def state */
rdev-r600_blit.ring_size_common += 5; /* done copy */
rdev-r600_blit.ring_size_common += 16; /* fence emit for done copy */
 
@@ -666,7 +667,8 @@ static unsigned r600_blit_create_rect(unsigned 
num_gpu_pages,
 
 
 int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
-  struct radeon_sa_bo **vb)
+  struct radeon_fence **fence, struct radeon_sa_bo 
**vb,
+  struct radeon_semaphore **sem)
 {
struct radeon_ring *ring = rdev-ring[RADEON_RING_TYPE_GFX_INDEX];
int r;
@@ -689,22 +691,37 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, 
unsigned num_gpu_pages,
return r;
}
 
+   r = radeon_semaphore_create(rdev, sem);
+   if (r) {
+   radeon_sa_bo_free(rdev, vb, NULL);
+   return r;
+   }
+
/* calculate number of loops correctly */
ring_size = num_loops * dwords_per_loop;
ring_size += rdev-r600_blit.ring_size_common;
r = radeon_ring_lock(rdev, ring, ring_size);
if (r) {
radeon_sa_bo_free(rdev, vb, NULL);
+   radeon_semaphore_free(rdev, sem, NULL);
return r;
}
 
+   if (radeon_fence_need_sync(*fence, RADEON_RING_TYPE_GFX_INDEX)) {
+   radeon_semaphore_sync_rings(rdev, *sem, (*fence)-ring,
+   RADEON_RING_TYPE_GFX_INDEX);
+   radeon_fence_note_sync(*fence, RADEON_RING_TYPE_GFX_INDEX);
+   } else {
+   radeon_semaphore_free(rdev, sem, NULL);
+   }
+
rdev-r600_blit.primitives.set_default_state(rdev);
rdev-r600_blit.primitives.set_shaders(rdev);
return 0;
 }
 
 void 

[PATCH 03/10] drm/radeon: rework ring syncing code

2012-05-31 Thread Christian König
Move inter ring syncing with semaphores into the
existing ring allocations, with that we need to
lock the ring mutex only once.

Signed-off-by: Christian K?nig 
---
 drivers/gpu/drm/radeon/evergreen_blit_kms.c |3 +-
 drivers/gpu/drm/radeon/r600.c   |5 +-
 drivers/gpu/drm/radeon/r600_blit_kms.c  |   24 +++--
 drivers/gpu/drm/radeon/radeon.h |6 +--
 drivers/gpu/drm/radeon/radeon_asic.h|5 +-
 drivers/gpu/drm/radeon/radeon_cs.c  |   38 +++---
 drivers/gpu/drm/radeon/radeon_ring.c|   30 +--
 drivers/gpu/drm/radeon/radeon_semaphore.c   |   71 ++-
 drivers/gpu/drm/radeon/radeon_test.c|6 +--
 drivers/gpu/drm/radeon/radeon_ttm.c |   20 
 10 files changed, 92 insertions(+), 116 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c 
b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
index 1e96bd4..e512560 100644
--- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
+++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
@@ -622,7 +622,8 @@ int evergreen_blit_init(struct radeon_device *rdev)
rdev->r600_blit.primitives.draw_auto = draw_auto;
rdev->r600_blit.primitives.set_default_state = set_default_state;

-   rdev->r600_blit.ring_size_common = 55; /* shaders + def state */
+   rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev->r600_blit.ring_size_common += 55; /* shaders + def state */
rdev->r600_blit.ring_size_common += 16; /* fence emit for VB IB */
rdev->r600_blit.ring_size_common += 5; /* done copy */
rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index e5279f9..a8d8c44 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2371,15 +2371,16 @@ int r600_copy_blit(struct radeon_device *rdev,
   unsigned num_gpu_pages,
   struct radeon_fence **fence)
 {
+   struct radeon_semaphore *sem = NULL;
struct radeon_sa_bo *vb = NULL;
int r;

-   r = r600_blit_prepare_copy(rdev, num_gpu_pages, );
+   r = r600_blit_prepare_copy(rdev, num_gpu_pages, fence, , );
if (r) {
return r;
}
r600_kms_blit_copy(rdev, src_offset, dst_offset, num_gpu_pages, vb);
-   r600_blit_done_copy(rdev, fence, vb);
+   r600_blit_done_copy(rdev, fence, vb, sem);
return 0;
 }

diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c 
b/drivers/gpu/drm/radeon/r600_blit_kms.c
index 02f4eeb..2b8d641 100644
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
@@ -512,7 +512,8 @@ int r600_blit_init(struct radeon_device *rdev)
rdev->r600_blit.primitives.draw_auto = draw_auto;
rdev->r600_blit.primitives.set_default_state = set_default_state;

-   rdev->r600_blit.ring_size_common = 40; /* shaders + def state */
+   rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev->r600_blit.ring_size_common += 40; /* shaders + def state */
rdev->r600_blit.ring_size_common += 5; /* done copy */
rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */

@@ -666,7 +667,8 @@ static unsigned r600_blit_create_rect(unsigned 
num_gpu_pages,


 int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
-  struct radeon_sa_bo **vb)
+  struct radeon_fence **fence, struct radeon_sa_bo 
**vb,
+  struct radeon_semaphore **sem)
 {
struct radeon_ring *ring = >ring[RADEON_RING_TYPE_GFX_INDEX];
int r;
@@ -689,22 +691,37 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, 
unsigned num_gpu_pages,
return r;
}

+   r = radeon_semaphore_create(rdev, sem);
+   if (r) {
+   radeon_sa_bo_free(rdev, vb, NULL);
+   return r;
+   }
+
/* calculate number of loops correctly */
ring_size = num_loops * dwords_per_loop;
ring_size += rdev->r600_blit.ring_size_common;
r = radeon_ring_lock(rdev, ring, ring_size);
if (r) {
radeon_sa_bo_free(rdev, vb, NULL);
+   radeon_semaphore_free(rdev, sem, NULL);
return r;
}

+   if (radeon_fence_need_sync(*fence, RADEON_RING_TYPE_GFX_INDEX)) {
+   radeon_semaphore_sync_rings(rdev, *sem, (*fence)->ring,
+   RADEON_RING_TYPE_GFX_INDEX);
+   radeon_fence_note_sync(*fence, RADEON_RING_TYPE_GFX_INDEX);
+   } else {
+   radeon_semaphore_free(rdev, sem, NULL);
+   }
+
rdev->r600_blit.primitives.set_default_state(rdev);
rdev->r600_blit.primitives.set_shaders(rdev);
return 0;
 }

 void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence 
**fence,

[PATCH 03/10] drm/radeon: rework ring syncing code

2012-05-31 Thread Christian König
Move inter ring syncing with semaphores into the
existing ring allocations, with that we need to
lock the ring mutex only once.

Signed-off-by: Christian König deathsim...@vodafone.de
---
 drivers/gpu/drm/radeon/evergreen_blit_kms.c |3 +-
 drivers/gpu/drm/radeon/r600.c   |5 +-
 drivers/gpu/drm/radeon/r600_blit_kms.c  |   24 +++--
 drivers/gpu/drm/radeon/radeon.h |6 +--
 drivers/gpu/drm/radeon/radeon_asic.h|5 +-
 drivers/gpu/drm/radeon/radeon_cs.c  |   38 +++---
 drivers/gpu/drm/radeon/radeon_ring.c|   30 +--
 drivers/gpu/drm/radeon/radeon_semaphore.c   |   71 ++-
 drivers/gpu/drm/radeon/radeon_test.c|6 +--
 drivers/gpu/drm/radeon/radeon_ttm.c |   20 
 10 files changed, 92 insertions(+), 116 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c 
b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
index 1e96bd4..e512560 100644
--- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
+++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
@@ -622,7 +622,8 @@ int evergreen_blit_init(struct radeon_device *rdev)
rdev-r600_blit.primitives.draw_auto = draw_auto;
rdev-r600_blit.primitives.set_default_state = set_default_state;
 
-   rdev-r600_blit.ring_size_common = 55; /* shaders + def state */
+   rdev-r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev-r600_blit.ring_size_common += 55; /* shaders + def state */
rdev-r600_blit.ring_size_common += 16; /* fence emit for VB IB */
rdev-r600_blit.ring_size_common += 5; /* done copy */
rdev-r600_blit.ring_size_common += 16; /* fence emit for done copy */
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index e5279f9..a8d8c44 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2371,15 +2371,16 @@ int r600_copy_blit(struct radeon_device *rdev,
   unsigned num_gpu_pages,
   struct radeon_fence **fence)
 {
+   struct radeon_semaphore *sem = NULL;
struct radeon_sa_bo *vb = NULL;
int r;
 
-   r = r600_blit_prepare_copy(rdev, num_gpu_pages, vb);
+   r = r600_blit_prepare_copy(rdev, num_gpu_pages, fence, vb, sem);
if (r) {
return r;
}
r600_kms_blit_copy(rdev, src_offset, dst_offset, num_gpu_pages, vb);
-   r600_blit_done_copy(rdev, fence, vb);
+   r600_blit_done_copy(rdev, fence, vb, sem);
return 0;
 }
 
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c 
b/drivers/gpu/drm/radeon/r600_blit_kms.c
index 02f4eeb..2b8d641 100644
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
@@ -512,7 +512,8 @@ int r600_blit_init(struct radeon_device *rdev)
rdev-r600_blit.primitives.draw_auto = draw_auto;
rdev-r600_blit.primitives.set_default_state = set_default_state;
 
-   rdev-r600_blit.ring_size_common = 40; /* shaders + def state */
+   rdev-r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev-r600_blit.ring_size_common += 40; /* shaders + def state */
rdev-r600_blit.ring_size_common += 5; /* done copy */
rdev-r600_blit.ring_size_common += 16; /* fence emit for done copy */
 
@@ -666,7 +667,8 @@ static unsigned r600_blit_create_rect(unsigned 
num_gpu_pages,
 
 
 int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
-  struct radeon_sa_bo **vb)
+  struct radeon_fence **fence, struct radeon_sa_bo 
**vb,
+  struct radeon_semaphore **sem)
 {
struct radeon_ring *ring = rdev-ring[RADEON_RING_TYPE_GFX_INDEX];
int r;
@@ -689,22 +691,37 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, 
unsigned num_gpu_pages,
return r;
}
 
+   r = radeon_semaphore_create(rdev, sem);
+   if (r) {
+   radeon_sa_bo_free(rdev, vb, NULL);
+   return r;
+   }
+
/* calculate number of loops correctly */
ring_size = num_loops * dwords_per_loop;
ring_size += rdev-r600_blit.ring_size_common;
r = radeon_ring_lock(rdev, ring, ring_size);
if (r) {
radeon_sa_bo_free(rdev, vb, NULL);
+   radeon_semaphore_free(rdev, sem, NULL);
return r;
}
 
+   if (radeon_fence_need_sync(*fence, RADEON_RING_TYPE_GFX_INDEX)) {
+   radeon_semaphore_sync_rings(rdev, *sem, (*fence)-ring,
+   RADEON_RING_TYPE_GFX_INDEX);
+   radeon_fence_note_sync(*fence, RADEON_RING_TYPE_GFX_INDEX);
+   } else {
+   radeon_semaphore_free(rdev, sem, NULL);
+   }
+
rdev-r600_blit.primitives.set_default_state(rdev);
rdev-r600_blit.primitives.set_shaders(rdev);
return 0;
 }
 
 void r600_blit_done_copy(struct radeon_device *rdev, 

[PATCH 03/10] drm/radeon: rework ring syncing code

2012-05-24 Thread j.glisse
On Thu, May 24, 2012 at 09:49:07AM +0200, Christian K?nig wrote:
> Move inter ring syncing with semaphores into the
> existing ring allocations, with that we need to
> lock the ring mutex only once.
> 
> Signed-off-by: Christian K?nig 

Reviewed-by: Jerome Glisse 

> ---
>  drivers/gpu/drm/radeon/evergreen_blit_kms.c |3 +-
>  drivers/gpu/drm/radeon/r600.c   |5 +-
>  drivers/gpu/drm/radeon/r600_blit_kms.c  |   24 +++--
>  drivers/gpu/drm/radeon/radeon.h |6 +--
>  drivers/gpu/drm/radeon/radeon_asic.h|5 +-
>  drivers/gpu/drm/radeon/radeon_cs.c  |   38 +++---
>  drivers/gpu/drm/radeon/radeon_ring.c|   30 +--
>  drivers/gpu/drm/radeon/radeon_semaphore.c   |   71 
> ++-
>  drivers/gpu/drm/radeon/radeon_test.c|6 +--
>  drivers/gpu/drm/radeon/radeon_ttm.c |   20 
>  10 files changed, 92 insertions(+), 116 deletions(-)
> 
> diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c 
> b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
> index 1e96bd4..e512560 100644
> --- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
> +++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
> @@ -622,7 +622,8 @@ int evergreen_blit_init(struct radeon_device *rdev)
>   rdev->r600_blit.primitives.draw_auto = draw_auto;
>   rdev->r600_blit.primitives.set_default_state = set_default_state;
>  
> - rdev->r600_blit.ring_size_common = 55; /* shaders + def state */
> + rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
> + rdev->r600_blit.ring_size_common += 55; /* shaders + def state */
>   rdev->r600_blit.ring_size_common += 16; /* fence emit for VB IB */
>   rdev->r600_blit.ring_size_common += 5; /* done copy */
>   rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index e5279f9..a8d8c44 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -2371,15 +2371,16 @@ int r600_copy_blit(struct radeon_device *rdev,
>  unsigned num_gpu_pages,
>  struct radeon_fence **fence)
>  {
> + struct radeon_semaphore *sem = NULL;
>   struct radeon_sa_bo *vb = NULL;
>   int r;
>  
> - r = r600_blit_prepare_copy(rdev, num_gpu_pages, );
> + r = r600_blit_prepare_copy(rdev, num_gpu_pages, fence, , );
>   if (r) {
>   return r;
>   }
>   r600_kms_blit_copy(rdev, src_offset, dst_offset, num_gpu_pages, vb);
> - r600_blit_done_copy(rdev, fence, vb);
> + r600_blit_done_copy(rdev, fence, vb, sem);
>   return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c 
> b/drivers/gpu/drm/radeon/r600_blit_kms.c
> index 02f4eeb..2b8d641 100644
> --- a/drivers/gpu/drm/radeon/r600_blit_kms.c
> +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
> @@ -512,7 +512,8 @@ int r600_blit_init(struct radeon_device *rdev)
>   rdev->r600_blit.primitives.draw_auto = draw_auto;
>   rdev->r600_blit.primitives.set_default_state = set_default_state;
>  
> - rdev->r600_blit.ring_size_common = 40; /* shaders + def state */
> + rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
> + rdev->r600_blit.ring_size_common += 40; /* shaders + def state */
>   rdev->r600_blit.ring_size_common += 5; /* done copy */
>   rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */
>  
> @@ -666,7 +667,8 @@ static unsigned r600_blit_create_rect(unsigned 
> num_gpu_pages,
>  
>  
>  int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned 
> num_gpu_pages,
> -struct radeon_sa_bo **vb)
> +struct radeon_fence **fence, struct radeon_sa_bo 
> **vb,
> +struct radeon_semaphore **sem)
>  {
>   struct radeon_ring *ring = >ring[RADEON_RING_TYPE_GFX_INDEX];
>   int r;
> @@ -689,22 +691,37 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, 
> unsigned num_gpu_pages,
>   return r;
>   }
>  
> + r = radeon_semaphore_create(rdev, sem);
> + if (r) {
> + radeon_sa_bo_free(rdev, vb, NULL);
> + return r;
> + }
> +
>   /* calculate number of loops correctly */
>   ring_size = num_loops * dwords_per_loop;
>   ring_size += rdev->r600_blit.ring_size_common;
>   r = radeon_ring_lock(rdev, ring, ring_size);
>   if (r) {
>   radeon_sa_bo_free(rdev, vb, NULL);
> + radeon_semaphore_free(rdev, sem, NULL);
>   return r;
>   }
>  
> + if (radeon_fence_need_sync(*fence, RADEON_RING_TYPE_GFX_INDEX)) {
> + radeon_semaphore_sync_rings(rdev, *sem, (*fence)->ring,
> + RADEON_RING_TYPE_GFX_INDEX);
> + radeon_fence_note_sync(*fence, RADEON_RING_TYPE_GFX_INDEX);
> + } else {
> + radeon_semaphore_free(rdev, sem, NULL);
> + }
> +

[PATCH 03/10] drm/radeon: rework ring syncing code

2012-05-24 Thread Christian König
Move inter ring syncing with semaphores into the
existing ring allocations, with that we need to
lock the ring mutex only once.

Signed-off-by: Christian K?nig 
---
 drivers/gpu/drm/radeon/evergreen_blit_kms.c |3 +-
 drivers/gpu/drm/radeon/r600.c   |5 +-
 drivers/gpu/drm/radeon/r600_blit_kms.c  |   24 +++--
 drivers/gpu/drm/radeon/radeon.h |6 +--
 drivers/gpu/drm/radeon/radeon_asic.h|5 +-
 drivers/gpu/drm/radeon/radeon_cs.c  |   38 +++---
 drivers/gpu/drm/radeon/radeon_ring.c|   30 +--
 drivers/gpu/drm/radeon/radeon_semaphore.c   |   71 ++-
 drivers/gpu/drm/radeon/radeon_test.c|6 +--
 drivers/gpu/drm/radeon/radeon_ttm.c |   20 
 10 files changed, 92 insertions(+), 116 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c 
b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
index 1e96bd4..e512560 100644
--- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
+++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
@@ -622,7 +622,8 @@ int evergreen_blit_init(struct radeon_device *rdev)
rdev->r600_blit.primitives.draw_auto = draw_auto;
rdev->r600_blit.primitives.set_default_state = set_default_state;

-   rdev->r600_blit.ring_size_common = 55; /* shaders + def state */
+   rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev->r600_blit.ring_size_common += 55; /* shaders + def state */
rdev->r600_blit.ring_size_common += 16; /* fence emit for VB IB */
rdev->r600_blit.ring_size_common += 5; /* done copy */
rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index e5279f9..a8d8c44 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2371,15 +2371,16 @@ int r600_copy_blit(struct radeon_device *rdev,
   unsigned num_gpu_pages,
   struct radeon_fence **fence)
 {
+   struct radeon_semaphore *sem = NULL;
struct radeon_sa_bo *vb = NULL;
int r;

-   r = r600_blit_prepare_copy(rdev, num_gpu_pages, );
+   r = r600_blit_prepare_copy(rdev, num_gpu_pages, fence, , );
if (r) {
return r;
}
r600_kms_blit_copy(rdev, src_offset, dst_offset, num_gpu_pages, vb);
-   r600_blit_done_copy(rdev, fence, vb);
+   r600_blit_done_copy(rdev, fence, vb, sem);
return 0;
 }

diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c 
b/drivers/gpu/drm/radeon/r600_blit_kms.c
index 02f4eeb..2b8d641 100644
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
@@ -512,7 +512,8 @@ int r600_blit_init(struct radeon_device *rdev)
rdev->r600_blit.primitives.draw_auto = draw_auto;
rdev->r600_blit.primitives.set_default_state = set_default_state;

-   rdev->r600_blit.ring_size_common = 40; /* shaders + def state */
+   rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev->r600_blit.ring_size_common += 40; /* shaders + def state */
rdev->r600_blit.ring_size_common += 5; /* done copy */
rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */

@@ -666,7 +667,8 @@ static unsigned r600_blit_create_rect(unsigned 
num_gpu_pages,


 int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
-  struct radeon_sa_bo **vb)
+  struct radeon_fence **fence, struct radeon_sa_bo 
**vb,
+  struct radeon_semaphore **sem)
 {
struct radeon_ring *ring = >ring[RADEON_RING_TYPE_GFX_INDEX];
int r;
@@ -689,22 +691,37 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, 
unsigned num_gpu_pages,
return r;
}

+   r = radeon_semaphore_create(rdev, sem);
+   if (r) {
+   radeon_sa_bo_free(rdev, vb, NULL);
+   return r;
+   }
+
/* calculate number of loops correctly */
ring_size = num_loops * dwords_per_loop;
ring_size += rdev->r600_blit.ring_size_common;
r = radeon_ring_lock(rdev, ring, ring_size);
if (r) {
radeon_sa_bo_free(rdev, vb, NULL);
+   radeon_semaphore_free(rdev, sem, NULL);
return r;
}

+   if (radeon_fence_need_sync(*fence, RADEON_RING_TYPE_GFX_INDEX)) {
+   radeon_semaphore_sync_rings(rdev, *sem, (*fence)->ring,
+   RADEON_RING_TYPE_GFX_INDEX);
+   radeon_fence_note_sync(*fence, RADEON_RING_TYPE_GFX_INDEX);
+   } else {
+   radeon_semaphore_free(rdev, sem, NULL);
+   }
+
rdev->r600_blit.primitives.set_default_state(rdev);
rdev->r600_blit.primitives.set_shaders(rdev);
return 0;
 }

 void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence 
**fence,

[PATCH 03/10] drm/radeon: rework ring syncing code

2012-05-24 Thread Christian König
Move inter ring syncing with semaphores into the
existing ring allocations, with that we need to
lock the ring mutex only once.

Signed-off-by: Christian König deathsim...@vodafone.de
---
 drivers/gpu/drm/radeon/evergreen_blit_kms.c |3 +-
 drivers/gpu/drm/radeon/r600.c   |5 +-
 drivers/gpu/drm/radeon/r600_blit_kms.c  |   24 +++--
 drivers/gpu/drm/radeon/radeon.h |6 +--
 drivers/gpu/drm/radeon/radeon_asic.h|5 +-
 drivers/gpu/drm/radeon/radeon_cs.c  |   38 +++---
 drivers/gpu/drm/radeon/radeon_ring.c|   30 +--
 drivers/gpu/drm/radeon/radeon_semaphore.c   |   71 ++-
 drivers/gpu/drm/radeon/radeon_test.c|6 +--
 drivers/gpu/drm/radeon/radeon_ttm.c |   20 
 10 files changed, 92 insertions(+), 116 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c 
b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
index 1e96bd4..e512560 100644
--- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
+++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
@@ -622,7 +622,8 @@ int evergreen_blit_init(struct radeon_device *rdev)
rdev-r600_blit.primitives.draw_auto = draw_auto;
rdev-r600_blit.primitives.set_default_state = set_default_state;
 
-   rdev-r600_blit.ring_size_common = 55; /* shaders + def state */
+   rdev-r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev-r600_blit.ring_size_common += 55; /* shaders + def state */
rdev-r600_blit.ring_size_common += 16; /* fence emit for VB IB */
rdev-r600_blit.ring_size_common += 5; /* done copy */
rdev-r600_blit.ring_size_common += 16; /* fence emit for done copy */
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index e5279f9..a8d8c44 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2371,15 +2371,16 @@ int r600_copy_blit(struct radeon_device *rdev,
   unsigned num_gpu_pages,
   struct radeon_fence **fence)
 {
+   struct radeon_semaphore *sem = NULL;
struct radeon_sa_bo *vb = NULL;
int r;
 
-   r = r600_blit_prepare_copy(rdev, num_gpu_pages, vb);
+   r = r600_blit_prepare_copy(rdev, num_gpu_pages, fence, vb, sem);
if (r) {
return r;
}
r600_kms_blit_copy(rdev, src_offset, dst_offset, num_gpu_pages, vb);
-   r600_blit_done_copy(rdev, fence, vb);
+   r600_blit_done_copy(rdev, fence, vb, sem);
return 0;
 }
 
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c 
b/drivers/gpu/drm/radeon/r600_blit_kms.c
index 02f4eeb..2b8d641 100644
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
@@ -512,7 +512,8 @@ int r600_blit_init(struct radeon_device *rdev)
rdev-r600_blit.primitives.draw_auto = draw_auto;
rdev-r600_blit.primitives.set_default_state = set_default_state;
 
-   rdev-r600_blit.ring_size_common = 40; /* shaders + def state */
+   rdev-r600_blit.ring_size_common = 8; /* sync semaphore */
+   rdev-r600_blit.ring_size_common += 40; /* shaders + def state */
rdev-r600_blit.ring_size_common += 5; /* done copy */
rdev-r600_blit.ring_size_common += 16; /* fence emit for done copy */
 
@@ -666,7 +667,8 @@ static unsigned r600_blit_create_rect(unsigned 
num_gpu_pages,
 
 
 int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
-  struct radeon_sa_bo **vb)
+  struct radeon_fence **fence, struct radeon_sa_bo 
**vb,
+  struct radeon_semaphore **sem)
 {
struct radeon_ring *ring = rdev-ring[RADEON_RING_TYPE_GFX_INDEX];
int r;
@@ -689,22 +691,37 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, 
unsigned num_gpu_pages,
return r;
}
 
+   r = radeon_semaphore_create(rdev, sem);
+   if (r) {
+   radeon_sa_bo_free(rdev, vb, NULL);
+   return r;
+   }
+
/* calculate number of loops correctly */
ring_size = num_loops * dwords_per_loop;
ring_size += rdev-r600_blit.ring_size_common;
r = radeon_ring_lock(rdev, ring, ring_size);
if (r) {
radeon_sa_bo_free(rdev, vb, NULL);
+   radeon_semaphore_free(rdev, sem, NULL);
return r;
}
 
+   if (radeon_fence_need_sync(*fence, RADEON_RING_TYPE_GFX_INDEX)) {
+   radeon_semaphore_sync_rings(rdev, *sem, (*fence)-ring,
+   RADEON_RING_TYPE_GFX_INDEX);
+   radeon_fence_note_sync(*fence, RADEON_RING_TYPE_GFX_INDEX);
+   } else {
+   radeon_semaphore_free(rdev, sem, NULL);
+   }
+
rdev-r600_blit.primitives.set_default_state(rdev);
rdev-r600_blit.primitives.set_shaders(rdev);
return 0;
 }
 
 void r600_blit_done_copy(struct radeon_device *rdev, 

Re: [PATCH 03/10] drm/radeon: rework ring syncing code

2012-05-24 Thread j.glisse
On Thu, May 24, 2012 at 09:49:07AM +0200, Christian König wrote:
 Move inter ring syncing with semaphores into the
 existing ring allocations, with that we need to
 lock the ring mutex only once.
 
 Signed-off-by: Christian König deathsim...@vodafone.de

Reviewed-by: Jerome Glisse jgli...@redhat.com

 ---
  drivers/gpu/drm/radeon/evergreen_blit_kms.c |3 +-
  drivers/gpu/drm/radeon/r600.c   |5 +-
  drivers/gpu/drm/radeon/r600_blit_kms.c  |   24 +++--
  drivers/gpu/drm/radeon/radeon.h |6 +--
  drivers/gpu/drm/radeon/radeon_asic.h|5 +-
  drivers/gpu/drm/radeon/radeon_cs.c  |   38 +++---
  drivers/gpu/drm/radeon/radeon_ring.c|   30 +--
  drivers/gpu/drm/radeon/radeon_semaphore.c   |   71 
 ++-
  drivers/gpu/drm/radeon/radeon_test.c|6 +--
  drivers/gpu/drm/radeon/radeon_ttm.c |   20 
  10 files changed, 92 insertions(+), 116 deletions(-)
 
 diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c 
 b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
 index 1e96bd4..e512560 100644
 --- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
 +++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
 @@ -622,7 +622,8 @@ int evergreen_blit_init(struct radeon_device *rdev)
   rdev-r600_blit.primitives.draw_auto = draw_auto;
   rdev-r600_blit.primitives.set_default_state = set_default_state;
  
 - rdev-r600_blit.ring_size_common = 55; /* shaders + def state */
 + rdev-r600_blit.ring_size_common = 8; /* sync semaphore */
 + rdev-r600_blit.ring_size_common += 55; /* shaders + def state */
   rdev-r600_blit.ring_size_common += 16; /* fence emit for VB IB */
   rdev-r600_blit.ring_size_common += 5; /* done copy */
   rdev-r600_blit.ring_size_common += 16; /* fence emit for done copy */
 diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
 index e5279f9..a8d8c44 100644
 --- a/drivers/gpu/drm/radeon/r600.c
 +++ b/drivers/gpu/drm/radeon/r600.c
 @@ -2371,15 +2371,16 @@ int r600_copy_blit(struct radeon_device *rdev,
  unsigned num_gpu_pages,
  struct radeon_fence **fence)
  {
 + struct radeon_semaphore *sem = NULL;
   struct radeon_sa_bo *vb = NULL;
   int r;
  
 - r = r600_blit_prepare_copy(rdev, num_gpu_pages, vb);
 + r = r600_blit_prepare_copy(rdev, num_gpu_pages, fence, vb, sem);
   if (r) {
   return r;
   }
   r600_kms_blit_copy(rdev, src_offset, dst_offset, num_gpu_pages, vb);
 - r600_blit_done_copy(rdev, fence, vb);
 + r600_blit_done_copy(rdev, fence, vb, sem);
   return 0;
  }
  
 diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c 
 b/drivers/gpu/drm/radeon/r600_blit_kms.c
 index 02f4eeb..2b8d641 100644
 --- a/drivers/gpu/drm/radeon/r600_blit_kms.c
 +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
 @@ -512,7 +512,8 @@ int r600_blit_init(struct radeon_device *rdev)
   rdev-r600_blit.primitives.draw_auto = draw_auto;
   rdev-r600_blit.primitives.set_default_state = set_default_state;
  
 - rdev-r600_blit.ring_size_common = 40; /* shaders + def state */
 + rdev-r600_blit.ring_size_common = 8; /* sync semaphore */
 + rdev-r600_blit.ring_size_common += 40; /* shaders + def state */
   rdev-r600_blit.ring_size_common += 5; /* done copy */
   rdev-r600_blit.ring_size_common += 16; /* fence emit for done copy */
  
 @@ -666,7 +667,8 @@ static unsigned r600_blit_create_rect(unsigned 
 num_gpu_pages,
  
  
  int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned 
 num_gpu_pages,
 -struct radeon_sa_bo **vb)
 +struct radeon_fence **fence, struct radeon_sa_bo 
 **vb,
 +struct radeon_semaphore **sem)
  {
   struct radeon_ring *ring = rdev-ring[RADEON_RING_TYPE_GFX_INDEX];
   int r;
 @@ -689,22 +691,37 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, 
 unsigned num_gpu_pages,
   return r;
   }
  
 + r = radeon_semaphore_create(rdev, sem);
 + if (r) {
 + radeon_sa_bo_free(rdev, vb, NULL);
 + return r;
 + }
 +
   /* calculate number of loops correctly */
   ring_size = num_loops * dwords_per_loop;
   ring_size += rdev-r600_blit.ring_size_common;
   r = radeon_ring_lock(rdev, ring, ring_size);
   if (r) {
   radeon_sa_bo_free(rdev, vb, NULL);
 + radeon_semaphore_free(rdev, sem, NULL);
   return r;
   }
  
 + if (radeon_fence_need_sync(*fence, RADEON_RING_TYPE_GFX_INDEX)) {
 + radeon_semaphore_sync_rings(rdev, *sem, (*fence)-ring,
 + RADEON_RING_TYPE_GFX_INDEX);
 + radeon_fence_note_sync(*fence, RADEON_RING_TYPE_GFX_INDEX);
 + } else {
 + radeon_semaphore_free(rdev, sem, NULL);
 + }
 +
   rdev-r600_blit.primitives.set_default_state(rdev);