/** * uvd_v6_0_enc_ring_test_ring - test if UVD ENC ring is working * * @ring: the engine to test on * */ static int uvd_v6_0_enc_ring_test_ring(struct amdgpu_ring *ring) { struct amdgpu_device *adev = ring->adev; uint32_t rptr = amdgpu_ring_get_rptr(ring); unsigned i; int r; r = amdgpu_ring_alloc(ring, 16); if (r) return r; amdgpu_ring_write(ring, HEVC_ENC_CMD_END); amdgpu_ring_commit(ring); for (i = 0; i < adev->usec_timeout; i++) { if (amdgpu_ring_get_rptr(ring) != rptr) break; DRM_UDELAY(1); } if (i >= adev->usec_timeout) r = -ETIMEDOUT; return r; }
static int amdgpu_debugfs_ring_info(struct seq_file *m, void *data) { struct drm_info_node *node = (struct drm_info_node *) m->private; struct drm_device *dev = node->minor->dev; struct amdgpu_device *adev = dev->dev_private; int roffset = (unsigned long)node->info_ent->data; struct amdgpu_ring *ring = (void *)(((uint8_t*)adev) + roffset); uint32_t rptr, wptr, rptr_next; unsigned i; wptr = amdgpu_ring_get_wptr(ring); seq_printf(m, "wptr: 0x%08x [%5d]\n", wptr, wptr); rptr = amdgpu_ring_get_rptr(ring); rptr_next = le32_to_cpu(*ring->next_rptr_cpu_addr); seq_printf(m, "rptr: 0x%08x [%5d]\n", rptr, rptr); seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n", ring->wptr, ring->wptr); if (!ring->ready) return 0; /* print 8 dw before current rptr as often it's the last executed * packet that is the root issue */ i = (rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask; while (i != rptr) { seq_printf(m, "r[%5d]=0x%08x", i, ring->ring[i]); if (i == rptr) seq_puts(m, " *"); if (i == rptr_next) seq_puts(m, " #"); seq_puts(m, "\n"); i = (i + 1) & ring->ptr_mask; } while (i != wptr) { seq_printf(m, "r[%5d]=0x%08x", i, ring->ring[i]); if (i == rptr) seq_puts(m, " *"); if (i == rptr_next) seq_puts(m, " #"); seq_puts(m, "\n"); i = (i + 1) & ring->ptr_mask; } return 0; }
/* Layout of file is 12 bytes consisting of * - rptr * - wptr * - driver's copy of wptr * * followed by n-words of ring data */ static ssize_t amdgpu_debugfs_ring_read(struct file *f, char __user *buf, size_t size, loff_t *pos) { struct amdgpu_ring *ring = (struct amdgpu_ring*)f->f_inode->i_private; int r, i; uint32_t value, result, early[3]; if (*pos & 3 || size & 3) return -EINVAL; result = 0; if (*pos < 12) { early[0] = amdgpu_ring_get_rptr(ring); early[1] = amdgpu_ring_get_wptr(ring); early[2] = ring->wptr; for (i = *pos / 4; i < 3 && size; i++) { r = put_user(early[i], (uint32_t *)buf); if (r) return r; buf += 4; result += 4; size -= 4; *pos += 4; } } while (size) { if (*pos >= (ring->ring_size + 12)) return result; value = ring->ring[(*pos - 12)/4]; r = put_user(value, (uint32_t*)buf); if (r) return r; buf += 4; result += 4; size -= 4; *pos += 4; } return result; }