From: "j.glisse" <j.glisse@gmail.com>
To: "Christian König" <deathsimple@vodafone.de>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 01/10] drm/radeon: remove radeon_fence_create
Date: Thu, 24 May 2012 11:54:20 -0400 [thread overview]
Message-ID: <20120524155419.GB3467@gmail.com> (raw)
In-Reply-To: <1337845754-3718-1-git-send-email-deathsimple@vodafone.de>
On Thu, May 24, 2012 at 09:49:05AM +0200, Christian König wrote:
> It is completely unnecessary to create fences
> before they are emitted, so remove it and a bunch
> of checks if fences are emitted or not.
>
> Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
> ---
> drivers/gpu/drm/radeon/evergreen.c | 2 +-
> drivers/gpu/drm/radeon/ni.c | 2 +-
> drivers/gpu/drm/radeon/r100.c | 4 +-
> drivers/gpu/drm/radeon/r200.c | 4 +-
> drivers/gpu/drm/radeon/r600.c | 4 +-
> drivers/gpu/drm/radeon/r600_blit_kms.c | 6 +--
> drivers/gpu/drm/radeon/radeon.h | 11 +++--
> drivers/gpu/drm/radeon/radeon_asic.h | 8 ++--
> drivers/gpu/drm/radeon/radeon_benchmark.c | 10 +----
> drivers/gpu/drm/radeon/radeon_fence.c | 42 ++++++------------
> drivers/gpu/drm/radeon/radeon_ring.c | 19 +++++----
> drivers/gpu/drm/radeon/radeon_sa.c | 2 +-
> drivers/gpu/drm/radeon/radeon_test.c | 66 ++++++++++++-----------------
> drivers/gpu/drm/radeon/radeon_ttm.c | 30 +++++--------
> drivers/gpu/drm/radeon/si.c | 6 +--
> 15 files changed, 86 insertions(+), 130 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
> index 58991af..dd3cea4 100644
> --- a/drivers/gpu/drm/radeon/evergreen.c
> +++ b/drivers/gpu/drm/radeon/evergreen.c
> @@ -1366,7 +1366,7 @@ void evergreen_mc_program(struct radeon_device *rdev)
> */
> void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
> {
> - struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
> + struct radeon_ring *ring = &rdev->ring[ib->ring];
>
> /* set to DX10/11 mode */
> radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
> diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
> index b01c2dd..9d9f5ac 100644
> --- a/drivers/gpu/drm/radeon/ni.c
> +++ b/drivers/gpu/drm/radeon/ni.c
> @@ -1127,7 +1127,7 @@ void cayman_fence_ring_emit(struct radeon_device *rdev,
>
> void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
> {
> - struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
> + struct radeon_ring *ring = &rdev->ring[ib->ring];
>
> /* set to DX10/11 mode */
> radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
> diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
> index fb44e7e..415b7d8 100644
> --- a/drivers/gpu/drm/radeon/r100.c
> +++ b/drivers/gpu/drm/radeon/r100.c
> @@ -883,7 +883,7 @@ int r100_copy_blit(struct radeon_device *rdev,
> uint64_t src_offset,
> uint64_t dst_offset,
> unsigned num_gpu_pages,
> - struct radeon_fence *fence)
> + struct radeon_fence **fence)
> {
> struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
> uint32_t cur_pages;
> @@ -947,7 +947,7 @@ int r100_copy_blit(struct radeon_device *rdev,
> RADEON_WAIT_HOST_IDLECLEAN |
> RADEON_WAIT_DMA_GUI_IDLE);
> if (fence) {
> - r = radeon_fence_emit(rdev, fence);
> + r = radeon_fence_emit(rdev, fence, RADEON_RING_TYPE_GFX_INDEX);
> }
> radeon_ring_unlock_commit(rdev, ring);
> return r;
> diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c
> index a26144d..f088925 100644
> --- a/drivers/gpu/drm/radeon/r200.c
> +++ b/drivers/gpu/drm/radeon/r200.c
> @@ -85,7 +85,7 @@ int r200_copy_dma(struct radeon_device *rdev,
> uint64_t src_offset,
> uint64_t dst_offset,
> unsigned num_gpu_pages,
> - struct radeon_fence *fence)
> + struct radeon_fence **fence)
> {
> struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
> uint32_t size;
> @@ -120,7 +120,7 @@ int r200_copy_dma(struct radeon_device *rdev,
> radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
> radeon_ring_write(ring, RADEON_WAIT_DMA_GUI_IDLE);
> if (fence) {
> - r = radeon_fence_emit(rdev, fence);
> + r = radeon_fence_emit(rdev, fence, RADEON_RING_TYPE_GFX_INDEX);
> }
> radeon_ring_unlock_commit(rdev, ring);
> return r;
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index f388a1d..e5279f9 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -2369,7 +2369,7 @@ int r600_copy_blit(struct radeon_device *rdev,
> uint64_t src_offset,
> uint64_t dst_offset,
> unsigned num_gpu_pages,
> - struct radeon_fence *fence)
> + struct radeon_fence **fence)
> {
> struct radeon_sa_bo *vb = NULL;
> int r;
> @@ -2670,7 +2670,7 @@ void r600_fini(struct radeon_device *rdev)
> */
> void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
> {
> - struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
> + struct radeon_ring *ring = &rdev->ring[ib->ring];
>
> /* FIXME: implement */
> radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
> diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
> index 03b6e0d..02f4eeb 100644
> --- a/drivers/gpu/drm/radeon/r600_blit_kms.c
> +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
> @@ -703,20 +703,20 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
> return 0;
> }
>
> -void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence *fence,
> +void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence **fence,
> struct radeon_sa_bo *vb)
> {
> struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
> int r;
>
> - r = radeon_fence_emit(rdev, fence);
> + r = radeon_fence_emit(rdev, fence, RADEON_RING_TYPE_GFX_INDEX);
> if (r) {
> radeon_ring_unlock_undo(rdev, ring);
> return;
> }
>
> radeon_ring_unlock_commit(rdev, ring);
> - radeon_sa_bo_free(rdev, &vb, fence);
> + radeon_sa_bo_free(rdev, &vb, *fence);
> }
>
> void r600_kms_blit_copy(struct radeon_device *rdev,
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 1dc3a4a..5e259b4 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -113,7 +113,6 @@ extern int radeon_lockup_timeout;
>
> /* fence seq are set to this number when signaled */
> #define RADEON_FENCE_SIGNALED_SEQ 0LL
> -#define RADEON_FENCE_NOTEMITED_SEQ (~0LL)
>
> /* internal ring indices */
> /* r1xx+ has gfx CP ring */
> @@ -277,8 +276,7 @@ struct radeon_fence {
> int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring);
> int radeon_fence_driver_init(struct radeon_device *rdev);
> void radeon_fence_driver_fini(struct radeon_device *rdev);
> -int radeon_fence_create(struct radeon_device *rdev, struct radeon_fence **fence, int ring);
> -int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence);
> +int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring);
> void radeon_fence_process(struct radeon_device *rdev, int ring);
> bool radeon_fence_signaled(struct radeon_fence *fence);
> int radeon_fence_wait(struct radeon_fence *fence, bool interruptible);
> @@ -627,6 +625,7 @@ struct radeon_ib {
> uint32_t length_dw;
> uint64_t gpu_addr;
> uint32_t *ptr;
> + int ring;
> struct radeon_fence *fence;
> unsigned vm_id;
> bool is_const_ib;
> @@ -1190,20 +1189,20 @@ struct radeon_asic {
> uint64_t src_offset,
> uint64_t dst_offset,
> unsigned num_gpu_pages,
> - struct radeon_fence *fence);
> + struct radeon_fence **fence);
> u32 blit_ring_index;
> int (*dma)(struct radeon_device *rdev,
> uint64_t src_offset,
> uint64_t dst_offset,
> unsigned num_gpu_pages,
> - struct radeon_fence *fence);
> + struct radeon_fence **fence);
> u32 dma_ring_index;
> /* method used for bo copy */
> int (*copy)(struct radeon_device *rdev,
> uint64_t src_offset,
> uint64_t dst_offset,
> unsigned num_gpu_pages,
> - struct radeon_fence *fence);
> + struct radeon_fence **fence);
> /* ring used for bo copies */
> u32 copy_ring_index;
> } copy;
> diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
> index e76a941..8cdf075 100644
> --- a/drivers/gpu/drm/radeon/radeon_asic.h
> +++ b/drivers/gpu/drm/radeon/radeon_asic.h
> @@ -79,7 +79,7 @@ int r100_copy_blit(struct radeon_device *rdev,
> uint64_t src_offset,
> uint64_t dst_offset,
> unsigned num_gpu_pages,
> - struct radeon_fence *fence);
> + struct radeon_fence **fence);
> int r100_set_surface_reg(struct radeon_device *rdev, int reg,
> uint32_t tiling_flags, uint32_t pitch,
> uint32_t offset, uint32_t obj_size);
> @@ -144,7 +144,7 @@ extern int r200_copy_dma(struct radeon_device *rdev,
> uint64_t src_offset,
> uint64_t dst_offset,
> unsigned num_gpu_pages,
> - struct radeon_fence *fence);
> + struct radeon_fence **fence);
> void r200_set_safe_registers(struct radeon_device *rdev);
>
> /*
> @@ -318,7 +318,7 @@ void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
> int r600_ring_test(struct radeon_device *rdev, struct radeon_ring *cp);
> int r600_copy_blit(struct radeon_device *rdev,
> uint64_t src_offset, uint64_t dst_offset,
> - unsigned num_gpu_pages, struct radeon_fence *fence);
> + unsigned num_gpu_pages, struct radeon_fence **fence);
> void r600_hpd_init(struct radeon_device *rdev);
> void r600_hpd_fini(struct radeon_device *rdev);
> bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd);
> @@ -364,7 +364,7 @@ void r600_hdmi_update_audio_settings(struct drm_encoder *encoder);
> /* r600 blit */
> int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
> struct radeon_sa_bo **vb);
> -void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence *fence,
> +void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence **fence,
> struct radeon_sa_bo *vb);
> void r600_kms_blit_copy(struct radeon_device *rdev,
> u64 src_gpu_addr, u64 dst_gpu_addr,
> diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
> index 364f5b1..bedda9c 100644
> --- a/drivers/gpu/drm/radeon/radeon_benchmark.c
> +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
> @@ -45,20 +45,14 @@ static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size,
> for (i = 0; i < n; i++) {
> switch (flag) {
> case RADEON_BENCHMARK_COPY_DMA:
> - r = radeon_fence_create(rdev, &fence, radeon_copy_dma_ring_index(rdev));
> - if (r)
> - return r;
> r = radeon_copy_dma(rdev, saddr, daddr,
> size / RADEON_GPU_PAGE_SIZE,
> - fence);
> + &fence);
> break;
> case RADEON_BENCHMARK_COPY_BLIT:
> - r = radeon_fence_create(rdev, &fence, radeon_copy_blit_ring_index(rdev));
> - if (r)
> - return r;
> r = radeon_copy_blit(rdev, saddr, daddr,
> size / RADEON_GPU_PAGE_SIZE,
> - fence);
> + &fence);
> break;
> default:
> DRM_ERROR("Unknown copy method\n");
> diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
> index 11f5f40..401d346 100644
> --- a/drivers/gpu/drm/radeon/radeon_fence.c
> +++ b/drivers/gpu/drm/radeon/radeon_fence.c
> @@ -61,15 +61,21 @@ static u32 radeon_fence_read(struct radeon_device *rdev, int ring)
> return seq;
> }
>
> -int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence)
> +int radeon_fence_emit(struct radeon_device *rdev,
> + struct radeon_fence **fence,
> + int ring)
> {
> /* we are protected by the ring emission mutex */
> - if (fence->seq && fence->seq < RADEON_FENCE_NOTEMITED_SEQ) {
> - return 0;
> + *fence = kmalloc(sizeof(struct radeon_fence), GFP_KERNEL);
> + if ((*fence) == NULL) {
> + return -ENOMEM;
> }
> - fence->seq = ++rdev->fence_drv[fence->ring].seq;
> - radeon_fence_ring_emit(rdev, fence->ring, fence);
> - trace_radeon_fence_emit(rdev->ddev, fence->seq);
> + kref_init(&((*fence)->kref));
> + (*fence)->rdev = rdev;
> + (*fence)->seq = ++rdev->fence_drv[ring].seq;
> + (*fence)->ring = ring;
> + radeon_fence_ring_emit(rdev, ring, *fence);
> + trace_radeon_fence_emit(rdev->ddev, (*fence)->seq);
> return 0;
> }
>
> @@ -138,25 +144,9 @@ static void radeon_fence_destroy(struct kref *kref)
> struct radeon_fence *fence;
>
> fence = container_of(kref, struct radeon_fence, kref);
> - fence->seq = RADEON_FENCE_NOTEMITED_SEQ;
> kfree(fence);
> }
>
> -int radeon_fence_create(struct radeon_device *rdev,
> - struct radeon_fence **fence,
> - int ring)
> -{
> - *fence = kmalloc(sizeof(struct radeon_fence), GFP_KERNEL);
> - if ((*fence) == NULL) {
> - return -ENOMEM;
> - }
> - kref_init(&((*fence)->kref));
> - (*fence)->rdev = rdev;
> - (*fence)->seq = RADEON_FENCE_NOTEMITED_SEQ;
> - (*fence)->ring = ring;
> - return 0;
> -}
> -
> static bool radeon_fence_seq_signaled(struct radeon_device *rdev,
> u64 seq, unsigned ring)
> {
> @@ -176,10 +166,6 @@ bool radeon_fence_signaled(struct radeon_fence *fence)
> if (!fence) {
> return true;
> }
> - if (fence->seq == RADEON_FENCE_NOTEMITED_SEQ) {
> - WARN(1, "Querying an unemitted fence : %p !\n", fence);
> - return true;
> - }
> if (fence->seq == RADEON_FENCE_SIGNALED_SEQ) {
> return true;
> }
> @@ -444,9 +430,7 @@ int radeon_fence_wait_any(struct radeon_device *rdev,
> return 0;
> }
>
> - if (fences[i]->seq < RADEON_FENCE_NOTEMITED_SEQ) {
> - seq[i] = fences[i]->seq;
> - }
> + seq[i] = fences[i]->seq;
> }
>
> r = radeon_fence_wait_any_seq(rdev, seq, intr);
> diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
> index 493a7be..a0b9970 100644
> --- a/drivers/gpu/drm/radeon/radeon_ring.c
> +++ b/drivers/gpu/drm/radeon/radeon_ring.c
> @@ -74,13 +74,9 @@ int radeon_ib_get(struct radeon_device *rdev, int ring,
> dev_err(rdev->dev, "failed to get a new IB (%d)\n", r);
> return r;
> }
> - r = radeon_fence_create(rdev, &ib->fence, ring);
> - if (r) {
> - dev_err(rdev->dev, "failed to create fence for new IB (%d)\n", r);
> - radeon_sa_bo_free(rdev, &ib->sa_bo, NULL);
> - return r;
> - }
>
> + ib->ring = ring;
> + ib->fence = NULL;
> ib->ptr = radeon_sa_bo_cpu_addr(ib->sa_bo);
> ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo);
> ib->vm_id = 0;
> @@ -99,7 +95,7 @@ void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib)
>
> int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib)
> {
> - struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
> + struct radeon_ring *ring = &rdev->ring[ib->ring];
> int r = 0;
>
> if (!ib->length_dw || !ring->ready) {
> @@ -114,8 +110,13 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib)
> dev_err(rdev->dev, "scheduling IB failed (%d).\n", r);
> return r;
> }
> - radeon_ring_ib_execute(rdev, ib->fence->ring, ib);
> - radeon_fence_emit(rdev, ib->fence);
> + radeon_ring_ib_execute(rdev, ib->ring, ib);
> + r = radeon_fence_emit(rdev, &ib->fence, ib->ring);
> + if (r) {
> + dev_err(rdev->dev, "failed to emit fence for new IB (%d)\n", r);
> + radeon_ring_unlock_undo(rdev, ring);
> + return r;
> + }
> radeon_ring_unlock_commit(rdev, ring);
> return 0;
> }
> diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
> index 32059b7..81dbb5b 100644
> --- a/drivers/gpu/drm/radeon/radeon_sa.c
> +++ b/drivers/gpu/drm/radeon/radeon_sa.c
> @@ -349,7 +349,7 @@ void radeon_sa_bo_free(struct radeon_device *rdev, struct radeon_sa_bo **sa_bo,
>
> sa_manager = (*sa_bo)->manager;
> spin_lock(&sa_manager->lock);
> - if (fence && fence->seq && fence->seq < RADEON_FENCE_NOTEMITED_SEQ) {
> + if (fence && !radeon_fence_signaled(fence)) {
> (*sa_bo)->fence = radeon_fence_ref(fence);
> list_add_tail(&(*sa_bo)->flist,
> &sa_manager->flist[fence->ring]);
> diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
> index efff929..47e1535 100644
> --- a/drivers/gpu/drm/radeon/radeon_test.c
> +++ b/drivers/gpu/drm/radeon/radeon_test.c
> @@ -106,13 +106,7 @@ void radeon_test_moves(struct radeon_device *rdev)
>
> radeon_bo_kunmap(gtt_obj[i]);
>
> - r = radeon_fence_create(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX);
> - if (r) {
> - DRM_ERROR("Failed to create GTT->VRAM fence %d\n", i);
> - goto out_cleanup;
> - }
> -
> - r = radeon_copy(rdev, gtt_addr, vram_addr, size / RADEON_GPU_PAGE_SIZE, fence);
> + r = radeon_copy(rdev, gtt_addr, vram_addr, size / RADEON_GPU_PAGE_SIZE, &fence);
> if (r) {
> DRM_ERROR("Failed GTT->VRAM copy %d\n", i);
> goto out_cleanup;
> @@ -155,13 +149,7 @@ void radeon_test_moves(struct radeon_device *rdev)
>
> radeon_bo_kunmap(vram_obj);
>
> - r = radeon_fence_create(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX);
> - if (r) {
> - DRM_ERROR("Failed to create VRAM->GTT fence %d\n", i);
> - goto out_cleanup;
> - }
> -
> - r = radeon_copy(rdev, vram_addr, gtt_addr, size / RADEON_GPU_PAGE_SIZE, fence);
> + r = radeon_copy(rdev, vram_addr, gtt_addr, size / RADEON_GPU_PAGE_SIZE, &fence);
> if (r) {
> DRM_ERROR("Failed VRAM->GTT copy %d\n", i);
> goto out_cleanup;
> @@ -245,17 +233,6 @@ void radeon_test_ring_sync(struct radeon_device *rdev,
> int ridxB = radeon_ring_index(rdev, ringB);
> int r;
>
> - r = radeon_fence_create(rdev, &fence1, ridxA);
> - if (r) {
> - DRM_ERROR("Failed to create sync fence 1\n");
> - goto out_cleanup;
> - }
> - r = radeon_fence_create(rdev, &fence2, ridxA);
> - if (r) {
> - DRM_ERROR("Failed to create sync fence 2\n");
> - goto out_cleanup;
> - }
> -
> r = radeon_semaphore_create(rdev, &semaphore);
> if (r) {
> DRM_ERROR("Failed to create semaphore\n");
> @@ -268,9 +245,19 @@ void radeon_test_ring_sync(struct radeon_device *rdev,
> goto out_cleanup;
> }
> radeon_semaphore_emit_wait(rdev, ridxA, semaphore);
> - radeon_fence_emit(rdev, fence1);
> + r = radeon_fence_emit(rdev, &fence1, ridxA);
> + if (r) {
> + DRM_ERROR("Failed to emit fence 1\n");
> + radeon_ring_unlock_undo(rdev, ringA);
> + goto out_cleanup;
> + }
> radeon_semaphore_emit_wait(rdev, ridxA, semaphore);
> - radeon_fence_emit(rdev, fence2);
> + r = radeon_fence_emit(rdev, &fence2, ridxA);
> + if (r) {
> + DRM_ERROR("Failed to emit fence 2\n");
> + radeon_ring_unlock_undo(rdev, ringA);
> + goto out_cleanup;
> + }
> radeon_ring_unlock_commit(rdev, ringA);
>
> mdelay(1000);
> @@ -342,17 +329,6 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,
> bool sigA, sigB;
> int i, r;
>
> - r = radeon_fence_create(rdev, &fenceA, ridxA);
> - if (r) {
> - DRM_ERROR("Failed to create sync fence 1\n");
> - goto out_cleanup;
> - }
> - r = radeon_fence_create(rdev, &fenceB, ridxB);
> - if (r) {
> - DRM_ERROR("Failed to create sync fence 2\n");
> - goto out_cleanup;
> - }
> -
> r = radeon_semaphore_create(rdev, &semaphore);
> if (r) {
> DRM_ERROR("Failed to create semaphore\n");
> @@ -365,7 +341,12 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,
> goto out_cleanup;
> }
> radeon_semaphore_emit_wait(rdev, ridxA, semaphore);
> - radeon_fence_emit(rdev, fenceA);
> + r = radeon_fence_emit(rdev, &fenceA, ridxA);
> + if (r) {
> + DRM_ERROR("Failed to emit sync fence 1\n");
> + radeon_ring_unlock_undo(rdev, ringA);
> + goto out_cleanup;
> + }
> radeon_ring_unlock_commit(rdev, ringA);
>
> r = radeon_ring_lock(rdev, ringB, 64);
> @@ -374,7 +355,12 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,
> goto out_cleanup;
> }
> radeon_semaphore_emit_wait(rdev, ridxB, semaphore);
> - radeon_fence_emit(rdev, fenceB);
> + r = radeon_fence_emit(rdev, &fenceB, ridxB);
> + if (r) {
> + DRM_ERROR("Failed to create sync fence 2\n");
> + radeon_ring_unlock_undo(rdev, ringB);
> + goto out_cleanup;
> + }
> radeon_ring_unlock_commit(rdev, ringB);
>
> mdelay(1000);
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index c94a225..2d36bdd 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -222,15 +222,12 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
> {
> struct radeon_device *rdev;
> uint64_t old_start, new_start;
> - struct radeon_fence *fence, *old_fence;
> + struct radeon_fence *fence;
> struct radeon_semaphore *sem = NULL;
> - int r;
> + int r, ridx;
>
> rdev = radeon_get_rdev(bo->bdev);
> - r = radeon_fence_create(rdev, &fence, radeon_copy_ring_index(rdev));
> - if (unlikely(r)) {
> - return r;
> - }
> + ridx = radeon_copy_ring_index(rdev);
> old_start = old_mem->start << PAGE_SHIFT;
> new_start = new_mem->start << PAGE_SHIFT;
>
> @@ -243,7 +240,6 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
> break;
> default:
> DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
> - radeon_fence_unref(&fence);
> return -EINVAL;
> }
> switch (new_mem->mem_type) {
> @@ -255,42 +251,38 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
> break;
> default:
> DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
> - radeon_fence_unref(&fence);
> return -EINVAL;
> }
> - if (!rdev->ring[radeon_copy_ring_index(rdev)].ready) {
> + if (!rdev->ring[ridx].ready) {
> DRM_ERROR("Trying to move memory with ring turned off.\n");
> - radeon_fence_unref(&fence);
> return -EINVAL;
> }
>
> BUILD_BUG_ON((PAGE_SIZE % RADEON_GPU_PAGE_SIZE) != 0);
>
> /* sync other rings */
> - old_fence = bo->sync_obj;
> - if (old_fence && old_fence->ring != fence->ring
> - && !radeon_fence_signaled(old_fence)) {
> + fence = bo->sync_obj;
> + if (fence && fence->ring != ridx
> + && !radeon_fence_signaled(fence)) {
> bool sync_to_ring[RADEON_NUM_RINGS] = { };
> - sync_to_ring[old_fence->ring] = true;
> + sync_to_ring[fence->ring] = true;
>
> r = radeon_semaphore_create(rdev, &sem);
> if (r) {
> - radeon_fence_unref(&fence);
> return r;
> }
>
> - r = radeon_semaphore_sync_rings(rdev, sem,
> - sync_to_ring, fence->ring);
> + r = radeon_semaphore_sync_rings(rdev, sem, sync_to_ring, ridx);
> if (r) {
> radeon_semaphore_free(rdev, sem, NULL);
> - radeon_fence_unref(&fence);
> return r;
> }
> }
>
> + fence = NULL;
> r = radeon_copy(rdev, old_start, new_start,
> new_mem->num_pages * (PAGE_SIZE / RADEON_GPU_PAGE_SIZE), /* GPU pages */
> - fence);
> + &fence);
> /* FIXME: handle copy error */
> r = ttm_bo_move_accel_cleanup(bo, (void *)fence, NULL,
> evict, no_wait_reserve, no_wait_gpu, new_mem);
> diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
> index 549732e..5ca8ef5 100644
> --- a/drivers/gpu/drm/radeon/si.c
> +++ b/drivers/gpu/drm/radeon/si.c
> @@ -1915,7 +1915,7 @@ void si_fence_ring_emit(struct radeon_device *rdev,
> */
> void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
> {
> - struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
> + struct radeon_ring *ring = &rdev->ring[ib->ring];
> u32 header;
>
> if (ib->is_const_ib)
> @@ -2855,7 +2855,7 @@ int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
> if (ib->is_const_ib)
> ret = si_vm_packet3_ce_check(rdev, ib->ptr, &pkt);
> else {
> - switch (ib->fence->ring) {
> + switch (ib->ring) {
> case RADEON_RING_TYPE_GFX_INDEX:
> ret = si_vm_packet3_gfx_check(rdev, ib->ptr, &pkt);
> break;
> @@ -2864,7 +2864,7 @@ int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
> ret = si_vm_packet3_compute_check(rdev, ib->ptr, &pkt);
> break;
> default:
> - dev_err(rdev->dev, "Non-PM4 ring %d !\n", ib->fence->ring);
> + dev_err(rdev->dev, "Non-PM4 ring %d !\n", ib->ring);
> ret = -EINVAL;
> break;
> }
> --
> 1.7.9.5
>
next prev parent reply other threads:[~2012-05-24 15:54 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-24 7:49 [PATCH 01/10] drm/radeon: remove radeon_fence_create Christian König
2012-05-24 7:49 ` [PATCH 02/10] drm/radeon: add infrastructure for advanced ring synchronization Christian König
2012-05-24 15:56 ` j.glisse
2012-05-24 7:49 ` [PATCH 03/10] drm/radeon: rework ring syncing code Christian König
2012-05-24 15:57 ` j.glisse
2012-05-24 7:49 ` [PATCH 04/10] drm/radeon: replace vmram_mutex with mclk_lock v2 Christian König
2012-05-24 15:57 ` j.glisse
2012-05-24 7:49 ` [PATCH 05/10] drm/radeon: remove some unneeded structure members Christian König
2012-05-24 15:58 ` j.glisse
2012-05-24 7:49 ` [PATCH 06/10] drm/radeon: fix & improve ih ring handling Christian König
2012-05-24 15:59 ` j.glisse
2012-05-24 7:49 ` [PATCH 07/10] drm/radeon: apply Murphy's law to the kms irq code Christian König
2012-05-24 15:35 ` Alex Deucher
2012-05-24 15:53 ` j.glisse
2012-05-31 18:15 ` Alex Deucher
2012-05-31 18:39 ` Jerome Glisse
2012-05-31 20:15 ` Christian König
2012-05-24 7:49 ` [PATCH 08/10] drm/radeon: replace pflip and sw_int counters with atomics Christian König
2012-05-24 11:59 ` Sylvain BERTRAND
2012-05-24 12:29 ` Koenig, Christian
2012-05-24 12:46 ` Sylvain BERTRAND
2012-05-24 12:53 ` Dave Airlie
2012-05-24 12:54 ` Dave Airlie
2012-05-24 14:23 ` Sylvain BERTRAND
2012-05-24 7:49 ` [PATCH 09/10] drm/radeon: replace cs_mutex with vm_mutex Christian König
2012-05-24 7:49 ` [PATCH 10/10] drm/radeon: work around bugs in caymans compute rings Christian König
2012-05-24 15:54 ` j.glisse [this message]
-- strict thread matches above, loose matches on Subject: below --
2012-05-31 20:15 [PATCH 01/10] drm/radeon: remove radeon_fence_create Christian König
2012-06-01 11:36 Christian König
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120524155419.GB3467@gmail.com \
--to=j.glisse@gmail.com \
--cc=deathsimple@vodafone.de \
--cc=dri-devel@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.