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

Commit 65384a1d authored by Alex Deucher's avatar Alex Deucher Committed by Dave Airlie
Browse files

drm/radeon/kms: more atom parser fixes (v2)



shr/shl ops need the full dst rather than the pre-masked
version.  Fixes fdo bug 27478 and kernel bug 15738.

v2: remove some unsed vars, add comments

Signed-off-by: default avatarAlex Deucher <alexdeucher@gmail.com>
Cc: stable <stable@kernel.org>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 930b9d94
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -907,11 +907,16 @@ static void atom_op_shl(atom_exec_context *ctx, int *ptr, int arg)
	uint8_t attr = U8((*ptr)++), shift;
	uint8_t attr = U8((*ptr)++), shift;
	uint32_t saved, dst;
	uint32_t saved, dst;
	int dptr = *ptr;
	int dptr = *ptr;
	uint32_t dst_align = atom_dst_to_src[(attr >> 3) & 7][(attr >> 6) & 3];
	SDEBUG("   dst: ");
	SDEBUG("   dst: ");
	dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
	dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
	/* op needs to full dst value */
	dst = saved;
	shift = atom_get_src(ctx, attr, ptr);
	shift = atom_get_src(ctx, attr, ptr);
	SDEBUG("   shift: %d\n", shift);
	SDEBUG("   shift: %d\n", shift);
	dst <<= shift;
	dst <<= shift;
	dst &= atom_arg_mask[dst_align];
	dst >>= atom_arg_shift[dst_align];
	SDEBUG("   dst: ");
	SDEBUG("   dst: ");
	atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
	atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
}
}
@@ -921,11 +926,16 @@ static void atom_op_shr(atom_exec_context *ctx, int *ptr, int arg)
	uint8_t attr = U8((*ptr)++), shift;
	uint8_t attr = U8((*ptr)++), shift;
	uint32_t saved, dst;
	uint32_t saved, dst;
	int dptr = *ptr;
	int dptr = *ptr;
	uint32_t dst_align = atom_dst_to_src[(attr >> 3) & 7][(attr >> 6) & 3];
	SDEBUG("   dst: ");
	SDEBUG("   dst: ");
	dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
	dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
	/* op needs to full dst value */
	dst = saved;
	shift = atom_get_src(ctx, attr, ptr);
	shift = atom_get_src(ctx, attr, ptr);
	SDEBUG("   shift: %d\n", shift);
	SDEBUG("   shift: %d\n", shift);
	dst >>= shift;
	dst >>= shift;
	dst &= atom_arg_mask[dst_align];
	dst >>= atom_arg_shift[dst_align];
	SDEBUG("   dst: ");
	SDEBUG("   dst: ");
	atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
	atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
}
}