Commit 9863871b authored by Dave Airlie's avatar Dave Airlie Committed by Dave Airlie

drm/radeon: fix ring free alignment calculations

fd.o bz#21849

We were aligning to +16 dwords, instead of to the next 16dword
boundary in the ring. Fix the calculation to go to the next 16dword
boundary when space checking.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent b8da7de5
...@@ -2185,9 +2185,9 @@ void radeon_commit_ring(drm_radeon_private_t *dev_priv) ...@@ -2185,9 +2185,9 @@ void radeon_commit_ring(drm_radeon_private_t *dev_priv)
/* check if the ring is padded out to 16-dword alignment */ /* check if the ring is padded out to 16-dword alignment */
tail_aligned = dev_priv->ring.tail & 0xf; tail_aligned = dev_priv->ring.tail & (RADEON_RING_ALIGN-1);
if (tail_aligned) { if (tail_aligned) {
int num_p2 = 16 - tail_aligned; int num_p2 = RADEON_RING_ALIGN - tail_aligned;
ring = dev_priv->ring.start; ring = dev_priv->ring.start;
/* pad with some CP_PACKET2 */ /* pad with some CP_PACKET2 */
......
...@@ -1964,11 +1964,14 @@ do { \ ...@@ -1964,11 +1964,14 @@ do { \
#define RING_LOCALS int write, _nr, _align_nr; unsigned int mask; u32 *ring; #define RING_LOCALS int write, _nr, _align_nr; unsigned int mask; u32 *ring;
#define RADEON_RING_ALIGN 16
#define BEGIN_RING( n ) do { \ #define BEGIN_RING( n ) do { \
if ( RADEON_VERBOSE ) { \ if ( RADEON_VERBOSE ) { \
DRM_INFO( "BEGIN_RING( %d )\n", (n)); \ DRM_INFO( "BEGIN_RING( %d )\n", (n)); \
} \ } \
_align_nr = (n + 0xf) & ~0xf; \ _align_nr = RADEON_RING_ALIGN - ((dev_priv->ring.tail + n) & (RADEON_RING_ALIGN-1)); \
_align_nr += n; \
if (dev_priv->ring.space <= (_align_nr * sizeof(u32))) { \ if (dev_priv->ring.space <= (_align_nr * sizeof(u32))) { \
COMMIT_RING(); \ COMMIT_RING(); \
radeon_wait_ring( dev_priv, _align_nr * sizeof(u32)); \ radeon_wait_ring( dev_priv, _align_nr * sizeof(u32)); \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment