Merge branch 'drm-next-4.6' of git://people.freedesktop.org/~agd5f/linux into drm-next
First radeon and amdgpu pull request for 4.6. Highlights: - ACP support for APUs with i2s audio - CS ioctl optimizations - GPU scheduler optimizations - GPUVM optimizations - Initial GPU reset support (not enabled yet) - New powerplay sysfs interface for manually selecting clocks - Powerplay fixes - Virtualization fixes - Removal of hw semaphore support - Lots of other misc fixes and cleanups * 'drm-next-4.6' of git://people.freedesktop.org/~agd5f/linux: (118 commits) drm/amdgpu: Don't call interval_tree_remove in amdgpu_mn_destroy drm/amdgpu: Fix race condition in amdgpu_mn_unregister drm/amdgpu: cleanup gem init/finit drm/amdgpu: rework GEM info printing drm/amdgpu: print the GPU offset as well in gem_info drm/amdgpu: optionally print the pin count in gem_info as well drm/amdgpu: print the BO size only once in amdgpu_gem_info drm/amdgpu: print pid as integer drm/amdgpu: remove page flip work queue v3 drm/amdgpu: stop blocking for page filp fences drm/amdgpu: stop calling amdgpu_gpu_reset from the flip code drm/amdgpu: remove fence reset detection leftovers drm/amdgpu: Fix race condition in MMU notifier release drm/radeon: Fix WARN_ON if DRM_DP_AUX_CHARDEV is enabled drm/amdgpu/vi: move uvd tiling config setup into uvd code drm/amdgpu/vi: move sdma tiling config setup into sdma code drm/amdgpu/cik: move uvd tiling config setup into uvd code drm/amdgpu/cik: move sdma tiling config setup into sdma code drm/amdgpu/gfx7: rework gpu_init() drm/amdgpu/gfx: clean up harvest configuration (v2) ...
This commit is contained in:
@@ -4219,13 +4219,20 @@ int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
|
||||
DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
r = radeon_fence_wait(ib.fence, false);
|
||||
if (r) {
|
||||
r = radeon_fence_wait_timeout(ib.fence, false, usecs_to_jiffies(
|
||||
RADEON_USEC_IB_TEST_TIMEOUT));
|
||||
if (r < 0) {
|
||||
DRM_ERROR("radeon: fence wait failed (%d).\n", r);
|
||||
radeon_scratch_free(rdev, scratch);
|
||||
radeon_ib_free(rdev, &ib);
|
||||
return r;
|
||||
} else if (r == 0) {
|
||||
DRM_ERROR("radeon: fence wait timed out.\n");
|
||||
radeon_scratch_free(rdev, scratch);
|
||||
radeon_ib_free(rdev, &ib);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
r = 0;
|
||||
for (i = 0; i < rdev->usec_timeout; i++) {
|
||||
tmp = RREG32(scratch);
|
||||
if (tmp == 0xDEADBEEF)
|
||||
|
@@ -737,11 +737,16 @@ int cik_sdma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
|
||||
DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
r = radeon_fence_wait(ib.fence, false);
|
||||
if (r) {
|
||||
r = radeon_fence_wait_timeout(ib.fence, false, usecs_to_jiffies(
|
||||
RADEON_USEC_IB_TEST_TIMEOUT));
|
||||
if (r < 0) {
|
||||
DRM_ERROR("radeon: fence wait failed (%d).\n", r);
|
||||
return r;
|
||||
} else if (r == 0) {
|
||||
DRM_ERROR("radeon: fence wait timed out.\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
r = 0;
|
||||
for (i = 0; i < rdev->usec_timeout; i++) {
|
||||
tmp = le32_to_cpu(rdev->wb.wb[index/4]);
|
||||
if (tmp == 0xDEADBEEF)
|
||||
|
@@ -3732,11 +3732,17 @@ int r100_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
|
||||
DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
|
||||
goto free_ib;
|
||||
}
|
||||
r = radeon_fence_wait(ib.fence, false);
|
||||
if (r) {
|
||||
r = radeon_fence_wait_timeout(ib.fence, false, usecs_to_jiffies(
|
||||
RADEON_USEC_IB_TEST_TIMEOUT));
|
||||
if (r < 0) {
|
||||
DRM_ERROR("radeon: fence wait failed (%d).\n", r);
|
||||
goto free_ib;
|
||||
} else if (r == 0) {
|
||||
DRM_ERROR("radeon: fence wait timed out.\n");
|
||||
r = -ETIMEDOUT;
|
||||
goto free_ib;
|
||||
}
|
||||
r = 0;
|
||||
for (i = 0; i < rdev->usec_timeout; i++) {
|
||||
tmp = RREG32(scratch);
|
||||
if (tmp == 0xDEADBEEF) {
|
||||
|
@@ -3381,11 +3381,17 @@ int r600_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
|
||||
DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
|
||||
goto free_ib;
|
||||
}
|
||||
r = radeon_fence_wait(ib.fence, false);
|
||||
if (r) {
|
||||
r = radeon_fence_wait_timeout(ib.fence, false, usecs_to_jiffies(
|
||||
RADEON_USEC_IB_TEST_TIMEOUT));
|
||||
if (r < 0) {
|
||||
DRM_ERROR("radeon: fence wait failed (%d).\n", r);
|
||||
goto free_ib;
|
||||
} else if (r == 0) {
|
||||
DRM_ERROR("radeon: fence wait timed out.\n");
|
||||
r = -ETIMEDOUT;
|
||||
goto free_ib;
|
||||
}
|
||||
r = 0;
|
||||
for (i = 0; i < rdev->usec_timeout; i++) {
|
||||
tmp = RREG32(scratch);
|
||||
if (tmp == 0xDEADBEEF)
|
||||
|
@@ -368,11 +368,16 @@ int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
|
||||
DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
r = radeon_fence_wait(ib.fence, false);
|
||||
if (r) {
|
||||
r = radeon_fence_wait_timeout(ib.fence, false, usecs_to_jiffies(
|
||||
RADEON_USEC_IB_TEST_TIMEOUT));
|
||||
if (r < 0) {
|
||||
DRM_ERROR("radeon: fence wait failed (%d).\n", r);
|
||||
return r;
|
||||
} else if (r == 0) {
|
||||
DRM_ERROR("radeon: fence wait timed out.\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
r = 0;
|
||||
for (i = 0; i < rdev->usec_timeout; i++) {
|
||||
tmp = le32_to_cpu(rdev->wb.wb[index/4]);
|
||||
if (tmp == 0xDEADBEEF)
|
||||
|
@@ -120,6 +120,7 @@ extern int radeon_mst;
|
||||
*/
|
||||
#define RADEON_MAX_USEC_TIMEOUT 100000 /* 100 ms */
|
||||
#define RADEON_FENCE_JIFFIES_TIMEOUT (HZ / 2)
|
||||
#define RADEON_USEC_IB_TEST_TIMEOUT 1000000 /* 1s */
|
||||
/* RADEON_IB_POOL_SIZE must be a power of 2 */
|
||||
#define RADEON_IB_POOL_SIZE 16
|
||||
#define RADEON_DEBUGFS_MAX_COMPONENTS 32
|
||||
@@ -382,6 +383,7 @@ void radeon_fence_driver_force_completion(struct radeon_device *rdev, int ring);
|
||||
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);
|
||||
long radeon_fence_wait_timeout(struct radeon_fence *fence, bool interruptible, long timeout);
|
||||
int radeon_fence_wait(struct radeon_fence *fence, bool interruptible);
|
||||
int radeon_fence_wait_next(struct radeon_device *rdev, int ring);
|
||||
int radeon_fence_wait_empty(struct radeon_device *rdev, int ring);
|
||||
|
@@ -1686,6 +1686,9 @@ void radeon_modeset_fini(struct radeon_device *rdev)
|
||||
radeon_fbdev_fini(rdev);
|
||||
kfree(rdev->mode_info.bios_hardcoded_edid);
|
||||
|
||||
/* free i2c buses */
|
||||
radeon_i2c_fini(rdev);
|
||||
|
||||
if (rdev->mode_info.mode_config_initialized) {
|
||||
radeon_afmt_fini(rdev);
|
||||
drm_kms_helper_poll_fini(rdev->ddev);
|
||||
@@ -1693,8 +1696,6 @@ void radeon_modeset_fini(struct radeon_device *rdev)
|
||||
drm_mode_config_cleanup(rdev->ddev);
|
||||
rdev->mode_info.mode_config_initialized = false;
|
||||
}
|
||||
/* free i2c buses */
|
||||
radeon_i2c_fini(rdev);
|
||||
}
|
||||
|
||||
static bool is_hdtv_mode(const struct drm_display_mode *mode)
|
||||
|
@@ -526,6 +526,46 @@ static long radeon_fence_wait_seq_timeout(struct radeon_device *rdev,
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_fence_wait_timeout - wait for a fence to signal with timeout
|
||||
*
|
||||
* @fence: radeon fence object
|
||||
* @intr: use interruptible sleep
|
||||
*
|
||||
* Wait for the requested fence to signal (all asics).
|
||||
* @intr selects whether to use interruptable (true) or non-interruptable
|
||||
* (false) sleep when waiting for the fence.
|
||||
* @timeout: maximum time to wait, or MAX_SCHEDULE_TIMEOUT for infinite wait
|
||||
* Returns remaining time if the sequence number has passed, 0 when
|
||||
* the wait timeout, or an error for all other cases.
|
||||
*/
|
||||
long radeon_fence_wait_timeout(struct radeon_fence *fence, bool intr, long timeout)
|
||||
{
|
||||
uint64_t seq[RADEON_NUM_RINGS] = {};
|
||||
long r;
|
||||
int r_sig;
|
||||
|
||||
/*
|
||||
* This function should not be called on !radeon fences.
|
||||
* If this is the case, it would mean this function can
|
||||
* also be called on radeon fences belonging to another card.
|
||||
* exclusive_lock is not held in that case.
|
||||
*/
|
||||
if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
|
||||
return fence_wait(&fence->base, intr);
|
||||
|
||||
seq[fence->ring] = fence->seq;
|
||||
r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, timeout);
|
||||
if (r <= 0) {
|
||||
return r;
|
||||
}
|
||||
|
||||
r_sig = fence_signal(&fence->base);
|
||||
if (!r_sig)
|
||||
FENCE_TRACE(&fence->base, "signaled from fence_wait\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_fence_wait - wait for a fence to signal
|
||||
*
|
||||
@@ -539,28 +579,12 @@ static long radeon_fence_wait_seq_timeout(struct radeon_device *rdev,
|
||||
*/
|
||||
int radeon_fence_wait(struct radeon_fence *fence, bool intr)
|
||||
{
|
||||
uint64_t seq[RADEON_NUM_RINGS] = {};
|
||||
long r;
|
||||
|
||||
/*
|
||||
* This function should not be called on !radeon fences.
|
||||
* If this is the case, it would mean this function can
|
||||
* also be called on radeon fences belonging to another card.
|
||||
* exclusive_lock is not held in that case.
|
||||
*/
|
||||
if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
|
||||
return fence_wait(&fence->base, intr);
|
||||
|
||||
seq[fence->ring] = fence->seq;
|
||||
r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);
|
||||
if (r < 0) {
|
||||
long r = radeon_fence_wait_timeout(fence, intr, MAX_SCHEDULE_TIMEOUT);
|
||||
if (r > 0) {
|
||||
return 0;
|
||||
} else {
|
||||
return r;
|
||||
}
|
||||
|
||||
r = fence_signal(&fence->base);
|
||||
if (!r)
|
||||
FENCE_TRACE(&fence->base, "signaled from fence_wait\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -810,11 +810,16 @@ int radeon_vce_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
|
||||
goto error;
|
||||
}
|
||||
|
||||
r = radeon_fence_wait(fence, false);
|
||||
if (r) {
|
||||
r = radeon_fence_wait_timeout(fence, false, usecs_to_jiffies(
|
||||
RADEON_USEC_IB_TEST_TIMEOUT));
|
||||
if (r < 0) {
|
||||
DRM_ERROR("radeon: fence wait failed (%d).\n", r);
|
||||
} else if (r == 0) {
|
||||
DRM_ERROR("radeon: fence wait timed out.\n");
|
||||
r = -ETIMEDOUT;
|
||||
} else {
|
||||
DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
|
||||
DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
|
||||
r = 0;
|
||||
}
|
||||
error:
|
||||
radeon_fence_unref(&fence);
|
||||
|
@@ -522,11 +522,17 @@ int uvd_v1_0_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
|
||||
goto error;
|
||||
}
|
||||
|
||||
r = radeon_fence_wait(fence, false);
|
||||
if (r) {
|
||||
r = radeon_fence_wait_timeout(fence, false, usecs_to_jiffies(
|
||||
RADEON_USEC_IB_TEST_TIMEOUT));
|
||||
if (r < 0) {
|
||||
DRM_ERROR("radeon: fence wait failed (%d).\n", r);
|
||||
goto error;
|
||||
} else if (r == 0) {
|
||||
DRM_ERROR("radeon: fence wait timed out.\n");
|
||||
r = -ETIMEDOUT;
|
||||
goto error;
|
||||
}
|
||||
r = 0;
|
||||
DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
|
||||
error:
|
||||
radeon_fence_unref(&fence);
|
||||
|
مرجع در شماره جدید
Block a user