mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-18 06:33:43 -04:00
Merge drm/drm-next into drm-misc-next
Required backmerge since we will be based on top of v5.11, and there has been a request to backmerge already to upstream some features. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
This commit is contained in:
@@ -456,6 +456,37 @@ int amdgpu_vcn_dec_ring_test_ring(struct amdgpu_ring *ring)
|
||||
return r;
|
||||
}
|
||||
|
||||
int amdgpu_vcn_dec_sw_ring_test_ring(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
uint32_t rptr;
|
||||
unsigned int i;
|
||||
int r;
|
||||
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
return 0;
|
||||
|
||||
r = amdgpu_ring_alloc(ring, 16);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
rptr = amdgpu_ring_get_rptr(ring);
|
||||
|
||||
amdgpu_ring_write(ring, VCN_DEC_SW_CMD_END);
|
||||
amdgpu_ring_commit(ring);
|
||||
|
||||
for (i = 0; i < adev->usec_timeout; i++) {
|
||||
if (amdgpu_ring_get_rptr(ring) != rptr)
|
||||
break;
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
if (i >= adev->usec_timeout)
|
||||
r = -ETIMEDOUT;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int amdgpu_vcn_dec_send_msg(struct amdgpu_ring *ring,
|
||||
struct amdgpu_bo *bo,
|
||||
struct dma_fence **fence)
|
||||
@@ -512,16 +543,16 @@ err:
|
||||
}
|
||||
|
||||
static int amdgpu_vcn_dec_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
|
||||
struct dma_fence **fence)
|
||||
struct amdgpu_bo **bo)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
struct amdgpu_bo *bo = NULL;
|
||||
uint32_t *msg;
|
||||
int r, i;
|
||||
|
||||
*bo = NULL;
|
||||
r = amdgpu_bo_create_reserved(adev, 1024, PAGE_SIZE,
|
||||
AMDGPU_GEM_DOMAIN_VRAM,
|
||||
&bo, NULL, (void **)&msg);
|
||||
bo, NULL, (void **)&msg);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@@ -542,20 +573,20 @@ static int amdgpu_vcn_dec_get_create_msg(struct amdgpu_ring *ring, uint32_t hand
|
||||
for (i = 14; i < 1024; ++i)
|
||||
msg[i] = cpu_to_le32(0x0);
|
||||
|
||||
return amdgpu_vcn_dec_send_msg(ring, bo, fence);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amdgpu_vcn_dec_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
|
||||
struct dma_fence **fence)
|
||||
struct amdgpu_bo **bo)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
struct amdgpu_bo *bo = NULL;
|
||||
uint32_t *msg;
|
||||
int r, i;
|
||||
|
||||
*bo = NULL;
|
||||
r = amdgpu_bo_create_reserved(adev, 1024, PAGE_SIZE,
|
||||
AMDGPU_GEM_DOMAIN_VRAM,
|
||||
&bo, NULL, (void **)&msg);
|
||||
bo, NULL, (void **)&msg);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@@ -568,19 +599,117 @@ static int amdgpu_vcn_dec_get_destroy_msg(struct amdgpu_ring *ring, uint32_t han
|
||||
for (i = 6; i < 1024; ++i)
|
||||
msg[i] = cpu_to_le32(0x0);
|
||||
|
||||
return amdgpu_vcn_dec_send_msg(ring, bo, fence);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int amdgpu_vcn_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
||||
{
|
||||
struct dma_fence *fence;
|
||||
struct dma_fence *fence = NULL;
|
||||
struct amdgpu_bo *bo;
|
||||
long r;
|
||||
|
||||
r = amdgpu_vcn_dec_get_create_msg(ring, 1, NULL);
|
||||
r = amdgpu_vcn_dec_get_create_msg(ring, 1, &bo);
|
||||
if (r)
|
||||
goto error;
|
||||
|
||||
r = amdgpu_vcn_dec_get_destroy_msg(ring, 1, &fence);
|
||||
r = amdgpu_vcn_dec_send_msg(ring, bo, NULL);
|
||||
if (r)
|
||||
goto error;
|
||||
r = amdgpu_vcn_dec_get_destroy_msg(ring, 1, &bo);
|
||||
if (r)
|
||||
goto error;
|
||||
|
||||
r = amdgpu_vcn_dec_send_msg(ring, bo, &fence);
|
||||
if (r)
|
||||
goto error;
|
||||
|
||||
r = dma_fence_wait_timeout(fence, false, timeout);
|
||||
if (r == 0)
|
||||
r = -ETIMEDOUT;
|
||||
else if (r > 0)
|
||||
r = 0;
|
||||
|
||||
dma_fence_put(fence);
|
||||
error:
|
||||
return r;
|
||||
}
|
||||
|
||||
static int amdgpu_vcn_dec_sw_send_msg(struct amdgpu_ring *ring,
|
||||
struct amdgpu_bo *bo,
|
||||
struct dma_fence **fence)
|
||||
{
|
||||
struct amdgpu_vcn_decode_buffer *decode_buffer = NULL;
|
||||
const unsigned int ib_size_dw = 64;
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
struct dma_fence *f = NULL;
|
||||
struct amdgpu_job *job;
|
||||
struct amdgpu_ib *ib;
|
||||
uint64_t addr;
|
||||
int i, r;
|
||||
|
||||
r = amdgpu_job_alloc_with_ib(adev, ib_size_dw * 4,
|
||||
AMDGPU_IB_POOL_DIRECT, &job);
|
||||
if (r)
|
||||
goto err;
|
||||
|
||||
ib = &job->ibs[0];
|
||||
addr = amdgpu_bo_gpu_offset(bo);
|
||||
ib->length_dw = 0;
|
||||
|
||||
ib->ptr[ib->length_dw++] = sizeof(struct amdgpu_vcn_decode_buffer) + 8;
|
||||
ib->ptr[ib->length_dw++] = cpu_to_le32(AMDGPU_VCN_IB_FLAG_DECODE_BUFFER);
|
||||
decode_buffer = (struct amdgpu_vcn_decode_buffer *)&(ib->ptr[ib->length_dw]);
|
||||
ib->length_dw += sizeof(struct amdgpu_vcn_decode_buffer) / 4;
|
||||
memset(decode_buffer, 0, sizeof(struct amdgpu_vcn_decode_buffer));
|
||||
|
||||
decode_buffer->valid_buf_flag |= cpu_to_le32(AMDGPU_VCN_CMD_FLAG_MSG_BUFFER);
|
||||
decode_buffer->msg_buffer_address_hi = cpu_to_le32(addr >> 32);
|
||||
decode_buffer->msg_buffer_address_lo = cpu_to_le32(addr);
|
||||
|
||||
for (i = ib->length_dw; i < ib_size_dw; ++i)
|
||||
ib->ptr[i] = 0x0;
|
||||
|
||||
r = amdgpu_job_submit_direct(job, ring, &f);
|
||||
if (r)
|
||||
goto err_free;
|
||||
|
||||
amdgpu_bo_fence(bo, f, false);
|
||||
amdgpu_bo_unreserve(bo);
|
||||
amdgpu_bo_unref(&bo);
|
||||
|
||||
if (fence)
|
||||
*fence = dma_fence_get(f);
|
||||
dma_fence_put(f);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free:
|
||||
amdgpu_job_free(job);
|
||||
|
||||
err:
|
||||
amdgpu_bo_unreserve(bo);
|
||||
amdgpu_bo_unref(&bo);
|
||||
return r;
|
||||
}
|
||||
|
||||
int amdgpu_vcn_dec_sw_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
||||
{
|
||||
struct dma_fence *fence = NULL;
|
||||
struct amdgpu_bo *bo;
|
||||
long r;
|
||||
|
||||
r = amdgpu_vcn_dec_get_create_msg(ring, 1, &bo);
|
||||
if (r)
|
||||
goto error;
|
||||
|
||||
r = amdgpu_vcn_dec_sw_send_msg(ring, bo, NULL);
|
||||
if (r)
|
||||
goto error;
|
||||
r = amdgpu_vcn_dec_get_destroy_msg(ring, 1, &bo);
|
||||
if (r)
|
||||
goto error;
|
||||
|
||||
r = amdgpu_vcn_dec_sw_send_msg(ring, bo, &fence);
|
||||
if (r)
|
||||
goto error;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user