/** * uvd_v1_0_ib_test - test ib execution * * @rdev: radeon_device pointer * @ring: radeon_ring pointer * * Test if we can successfully execute an IB */ int uvd_v1_0_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) { struct radeon_fence *fence = NULL; int r; r = radeon_set_uvd_clocks(rdev, 53300, 40000); if (r) { DRM_ERROR("radeon: failed to raise UVD clocks (%d).\n", r); return r; } r = radeon_uvd_get_create_msg(rdev, ring->idx, 1, NULL); if (r) { DRM_ERROR("radeon: failed to get create msg (%d).\n", r); goto error; } r = radeon_uvd_get_destroy_msg(rdev, ring->idx, 1, &fence); if (r) { DRM_ERROR("radeon: failed to get destroy ib (%d).\n", r); goto error; } r = radeon_fence_wait(fence, false); if (r) { DRM_ERROR("radeon: fence wait failed (%d).\n", r); goto error; } DRM_INFO("ib test on ring %d succeeded\n", ring->idx); error: radeon_fence_unref(&fence); radeon_set_uvd_clocks(rdev, 0, 0); return r; }
/** * uvd_v1_0_init - start and test UVD block * * @rdev: radeon_device pointer * * Initialize the hardware, boot up the VCPU and do some testing */ int uvd_v1_0_init(struct radeon_device *rdev) { struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; uint32_t tmp; int r; /* raise clocks while booting up the VCPU */ if (rdev->family < CHIP_RV740) radeon_set_uvd_clocks(rdev, 10000, 10000); else radeon_set_uvd_clocks(rdev, 53300, 40000); r = uvd_v1_0_start(rdev); if (r) goto done; ring->ready = true; r = radeon_ring_test(rdev, R600_RING_TYPE_UVD_INDEX, ring); if (r) { ring->ready = false; goto done; } r = radeon_ring_lock(rdev, ring, 10); if (r) { DRM_ERROR("radeon: ring failed to lock UVD ring (%d).\n", r); goto done; } tmp = PACKET0(UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL, 0); radeon_ring_write(ring, tmp); radeon_ring_write(ring, 0xFFFFF); tmp = PACKET0(UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL, 0); radeon_ring_write(ring, tmp); radeon_ring_write(ring, 0xFFFFF); tmp = PACKET0(UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL, 0); radeon_ring_write(ring, tmp); radeon_ring_write(ring, 0xFFFFF); /* Clear timeout status bits */ radeon_ring_write(ring, PACKET0(UVD_SEMA_TIMEOUT_STATUS, 0)); radeon_ring_write(ring, 0x8); radeon_ring_write(ring, PACKET0(UVD_SEMA_CNTL, 0)); radeon_ring_write(ring, 3); radeon_ring_unlock_commit(rdev, ring); done: /* lower clocks again */ radeon_set_uvd_clocks(rdev, 0, 0); if (!r) DRM_INFO("UVD initialized successfully.\n"); return r; }