From: Petr Vandrovec There was too much/too few byteswapping done by driver and hardware in matroxfb on big endian hardware. Change fixes mirrored/split/corrupted letters seen on screen when using accelerated matroxfb mode. Patch was tested on Mips (by Peter) and x86-64 (by Petr). Signed-off-by: Peter 'p2' De Schrijver Signed-off-by: Petr Vandrovec Signed-off-by: Andrew Morton --- 25-akpm/drivers/video/matrox/matroxfb_accel.c | 14 +++++++++++--- 25-akpm/drivers/video/matrox/matroxfb_base.h | 4 ++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff -puN drivers/video/matrox/matroxfb_accel.c~fix-matroxfb-on-big-endian-hardware drivers/video/matrox/matroxfb_accel.c --- 25/drivers/video/matrox/matroxfb_accel.c~fix-matroxfb-on-big-endian-hardware 2005-03-28 15:50:02.000000000 -0800 +++ 25-akpm/drivers/video/matrox/matroxfb_accel.c 2005-03-28 15:50:02.000000000 -0800 @@ -438,13 +438,21 @@ static void matroxfb_1bpp_imageblit(WPMI } else if (step == 1) { /* Special case for 1..8bit widths */ while (height--) { - mga_writel(mmio, 0, *chardata); +#if defined(__BIG_ENDIAN) + fb_writel((*chardata) << 24, mmio.vaddr); +#else + fb_writel(*chardata, mmio.vaddr); +#endif chardata++; } } else if (step == 2) { /* Special case for 9..15bit widths */ while (height--) { - mga_writel(mmio, 0, *(u_int16_t*)chardata); +#if defined(__BIG_ENDIAN) + fb_writel((*(u_int16_t*)chardata) << 16, mmio.vaddr); +#else + fb_writel(*(u_int16_t*)chardata, mmio.vaddr); +#endif chardata += 2; } } else { @@ -454,7 +462,7 @@ static void matroxfb_1bpp_imageblit(WPMI for (i = 0; i < step; i += 4) { /* Hope that there are at least three readable bytes beyond the end of bitmap */ - mga_writel(mmio, 0, get_unaligned((u_int32_t*)(chardata + i))); + fb_writel(get_unaligned((u_int32_t*)(chardata + i)),mmio.vaddr); } chardata += step; } diff -puN drivers/video/matrox/matroxfb_base.h~fix-matroxfb-on-big-endian-hardware drivers/video/matrox/matroxfb_base.h --- 25/drivers/video/matrox/matroxfb_base.h~fix-matroxfb-on-big-endian-hardware 2005-03-28 15:50:02.000000000 -0800 +++ 25-akpm/drivers/video/matrox/matroxfb_base.h 2005-03-28 15:50:02.000000000 -0800 @@ -170,14 +170,14 @@ static inline void mga_memcpy_toio(vaddr if ((unsigned long)src & 3) { while (len >= 4) { - writel(get_unaligned((u32 *)src), addr); + fb_writel(get_unaligned((u32 *)src), addr); addr++; len -= 4; src += 4; } } else { while (len >= 4) { - writel(*(u32 *)src, addr); + fb_writel(*(u32 *)src, addr); addr++; len -= 4; src += 4; _