int radeon_ib_get(struct radeon_device *rdev, int ring, struct radeon_ib *ib, unsigned size) { int r; r = radeon_sa_bo_new(rdev, &rdev->ring_tmp_bo, &ib->sa_bo, size, 256, true); if (r) { 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->ptr = radeon_sa_bo_cpu_addr(ib->sa_bo); ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo); ib->vm_id = 0; ib->is_const_ib = false; ib->semaphore = NULL; return 0; }
/* * IB. */ bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib) { bool done = false; /* only free ib which have been emited */ if (ib->fence && ib->fence->emitted) { if (radeon_fence_signaled(ib->fence)) { radeon_fence_unref(&ib->fence); radeon_sa_bo_free(rdev, &ib->sa_bo); done = true; } } return done; }
void radeon_semaphore_free(struct radeon_device *rdev, struct radeon_semaphore **semaphore, struct radeon_fence *fence) { if (semaphore == NULL || *semaphore == NULL) { return; } if ((*semaphore)->waiters > 0) { dev_err(rdev->dev, "semaphore %p has more waiters than signalers," " hardware lockup imminent!\n", *semaphore); } radeon_sa_bo_free(rdev, &(*semaphore)->sa_bo, fence); free(*semaphore, DRM_MEM_DRIVER); *semaphore = NULL; }
/** * radeon_ib_free - free an IB (Indirect Buffer) * * @rdev: radeon_device pointer * @ib: IB object to free * * Free an IB (all asics). */ void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib) { radeon_semaphore_free(rdev, &ib->semaphore, ib->fence); radeon_sa_bo_free(rdev, &ib->sa_bo, ib->fence); radeon_fence_unref(&ib->fence); }