[PATCH 03/10] drm/radeon: rework ring syncing code
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
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
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
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
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
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
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
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);