Esempio n. 1
0
void drm_dp_link_train_channel_eq_delay(u8 dpcd[DP_RECEIVER_CAP_SIZE]) {
	if (dpcd[DP_TRAINING_AUX_RD_INTERVAL] == 0)
		DRM_UDELAY(400);
	else
		DRM_MDELAY(dpcd[DP_TRAINING_AUX_RD_INTERVAL] * 4);
}
Esempio n. 2
0
static void radeon_test_ring_sync2(struct radeon_device *rdev,
                                   struct radeon_ring *ringA,
                                   struct radeon_ring *ringB,
                                   struct radeon_ring *ringC)
{
    struct radeon_fence *fenceA = NULL, *fenceB = NULL;
    struct radeon_semaphore *semaphore = NULL;
    bool sigA, sigB;
    int i, r;

    r = radeon_semaphore_create(rdev, &semaphore);
    if (r) {
        DRM_ERROR("Failed to create semaphore\n");
        goto out_cleanup;
    }

    r = radeon_ring_lock(rdev, ringA, 64);
    if (r) {
        DRM_ERROR("Failed to lock ring A %d\n", ringA->idx);
        goto out_cleanup;
    }
    radeon_semaphore_emit_wait(rdev, ringA->idx, semaphore);
    r = radeon_fence_emit(rdev, &fenceA, ringA->idx);
    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);
    if (r) {
        DRM_ERROR("Failed to lock ring B %d\n", ringB->idx);
        goto out_cleanup;
    }
    radeon_semaphore_emit_wait(rdev, ringB->idx, semaphore);
    r = radeon_fence_emit(rdev, &fenceB, ringB->idx);
    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);

    DRM_MDELAY(1000);

    if (radeon_fence_signaled(fenceA)) {
        DRM_ERROR("Fence A signaled without waiting for semaphore.\n");
        goto out_cleanup;
    }
    if (radeon_fence_signaled(fenceB)) {
        DRM_ERROR("Fence A signaled without waiting for semaphore.\n");
        goto out_cleanup;
    }

    r = radeon_ring_lock(rdev, ringC, 64);
    if (r) {
        DRM_ERROR("Failed to lock ring B %p\n", ringC);
        goto out_cleanup;
    }
    radeon_semaphore_emit_signal(rdev, ringC->idx, semaphore);
    radeon_ring_unlock_commit(rdev, ringC);

    for (i = 0; i < 30; ++i) {
        DRM_MDELAY(100);
        sigA = radeon_fence_signaled(fenceA);
        sigB = radeon_fence_signaled(fenceB);
        if (sigA || sigB)
            break;
    }

    if (!sigA && !sigB) {
        DRM_ERROR("Neither fence A nor B has been signaled\n");
        goto out_cleanup;
    } else if (sigA && sigB) {
        DRM_ERROR("Both fence A and B has been signaled\n");
        goto out_cleanup;
    }

    DRM_INFO("Fence %c was first signaled\n", sigA ? 'A' : 'B');

    r = radeon_ring_lock(rdev, ringC, 64);
    if (r) {
        DRM_ERROR("Failed to lock ring B %p\n", ringC);
        goto out_cleanup;
    }
    radeon_semaphore_emit_signal(rdev, ringC->idx, semaphore);
    radeon_ring_unlock_commit(rdev, ringC);

    DRM_MDELAY(1000);

    r = radeon_fence_wait(fenceA, false);
    if (r) {
        DRM_ERROR("Failed to wait for sync fence A\n");
        goto out_cleanup;
    }
    r = radeon_fence_wait(fenceB, false);
    if (r) {
        DRM_ERROR("Failed to wait for sync fence B\n");
        goto out_cleanup;
    }

out_cleanup:
    radeon_semaphore_free(rdev, &semaphore, NULL);

    if (fenceA)
        radeon_fence_unref(&fenceA);

    if (fenceB)
        radeon_fence_unref(&fenceB);

    if (r)
        DRM_ERROR("Error while testing ring sync (%d).\n", r);
}
Esempio n. 3
0
void drm_dp_link_train_clock_recovery_delay(u8 dpcd[DP_RECEIVER_CAP_SIZE]) {
	if (dpcd[DP_TRAINING_AUX_RD_INTERVAL] == 0)
		DRM_UDELAY(100);
	else
		DRM_MDELAY(dpcd[DP_TRAINING_AUX_RD_INTERVAL] * 4);
}
Esempio n. 4
0
void radeon_test_ring_sync(struct radeon_device *rdev,
                           struct radeon_ring *ringA,
                           struct radeon_ring *ringB)
{
    struct radeon_fence *fence1 = NULL, *fence2 = NULL;
    struct radeon_semaphore *semaphore = NULL;
    int r;

    r = radeon_semaphore_create(rdev, &semaphore);
    if (r) {
        DRM_ERROR("Failed to create semaphore\n");
        goto out_cleanup;
    }

    r = radeon_ring_lock(rdev, ringA, 64);
    if (r) {
        DRM_ERROR("Failed to lock ring A %d\n", ringA->idx);
        goto out_cleanup;
    }
    radeon_semaphore_emit_wait(rdev, ringA->idx, semaphore);
    r = radeon_fence_emit(rdev, &fence1, ringA->idx);
    if (r) {
        DRM_ERROR("Failed to emit fence 1\n");
        radeon_ring_unlock_undo(rdev, ringA);
        goto out_cleanup;
    }
    radeon_semaphore_emit_wait(rdev, ringA->idx, semaphore);
    r = radeon_fence_emit(rdev, &fence2, ringA->idx);
    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);

    DRM_MDELAY(1000);

    if (radeon_fence_signaled(fence1)) {
        DRM_ERROR("Fence 1 signaled without waiting for semaphore.\n");
        goto out_cleanup;
    }

    r = radeon_ring_lock(rdev, ringB, 64);
    if (r) {
        DRM_ERROR("Failed to lock ring B %p\n", ringB);
        goto out_cleanup;
    }
    radeon_semaphore_emit_signal(rdev, ringB->idx, semaphore);
    radeon_ring_unlock_commit(rdev, ringB);

    r = radeon_fence_wait(fence1, false);
    if (r) {
        DRM_ERROR("Failed to wait for sync fence 1\n");
        goto out_cleanup;
    }

    DRM_MDELAY(1000);

    if (radeon_fence_signaled(fence2)) {
        DRM_ERROR("Fence 2 signaled without waiting for semaphore.\n");
        goto out_cleanup;
    }

    r = radeon_ring_lock(rdev, ringB, 64);
    if (r) {
        DRM_ERROR("Failed to lock ring B %p\n", ringB);
        goto out_cleanup;
    }
    radeon_semaphore_emit_signal(rdev, ringB->idx, semaphore);
    radeon_ring_unlock_commit(rdev, ringB);

    r = radeon_fence_wait(fence2, false);
    if (r) {
        DRM_ERROR("Failed to wait for sync fence 1\n");
        goto out_cleanup;
    }

out_cleanup:
    radeon_semaphore_free(rdev, &semaphore, NULL);

    if (fence1)
        radeon_fence_unref(&fence1);

    if (fence2)
        radeon_fence_unref(&fence2);

    if (r)
        DRM_ERROR("Error while testing ring sync (%d).\n", r);
}