Commit 4543eda5 authored by Alex Deucher's avatar Alex Deucher

drm/radeon: fix endian bugs in hw i2c atom routines

Need to swap the data fetched over i2c properly.  This
is the same fix as the endian fix for aux channel
transactions.
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
parent 1bd4cff6
...@@ -50,7 +50,7 @@ static char *pre_emph_names[] = { ...@@ -50,7 +50,7 @@ static char *pre_emph_names[] = {
* or from atom. Note that atom operates on * or from atom. Note that atom operates on
* dw units. * dw units.
*/ */
static void radeon_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le) void radeon_atom_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le)
{ {
#ifdef __BIG_ENDIAN #ifdef __BIG_ENDIAN
u8 src_tmp[20], dst_tmp[20]; /* used for byteswapping */ u8 src_tmp[20], dst_tmp[20]; /* used for byteswapping */
...@@ -100,7 +100,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, ...@@ -100,7 +100,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan,
base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1); base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1);
radeon_copy_swap(base, send, send_bytes, true); radeon_atom_copy_swap(base, send, send_bytes, true);
args.v1.lpAuxRequest = cpu_to_le16((u16)(0 + 4)); args.v1.lpAuxRequest = cpu_to_le16((u16)(0 + 4));
args.v1.lpDataOut = cpu_to_le16((u16)(16 + 4)); args.v1.lpDataOut = cpu_to_le16((u16)(16 + 4));
...@@ -137,7 +137,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, ...@@ -137,7 +137,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan,
recv_bytes = recv_size; recv_bytes = recv_size;
if (recv && recv_size) if (recv && recv_size)
radeon_copy_swap(recv, base + 16, recv_bytes, false); radeon_atom_copy_swap(recv, base + 16, recv_bytes, false);
return recv_bytes; return recv_bytes;
} }
......
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
#include "radeon.h" #include "radeon.h"
#include "atom.h" #include "atom.h"
extern void radeon_atom_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le);
#define TARGET_HW_I2C_CLOCK 50 #define TARGET_HW_I2C_CLOCK 50
/* these are a limitation of ProcessI2cChannelTransaction not the hw */ /* these are a limitation of ProcessI2cChannelTransaction not the hw */
...@@ -77,7 +79,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan, ...@@ -77,7 +79,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan,
} }
if (!(flags & HW_I2C_WRITE)) if (!(flags & HW_I2C_WRITE))
memcpy(buf, base, num); radeon_atom_copy_swap(buf, base, num, false);
return 0; return 0;
} }
......
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