Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -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 */
+4 −1
Original line number Original line Diff line number Diff line
@@ -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));	\