[PATCH] Fix matroxfb on big-endian hardware

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 <p2@mind.be>
Signed-off-by: Petr Vandrovec <vandrove@vc.cvut.cz>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Chris Wright <chrisw@osdl.org>
This commit is contained in:
vandrove@vc.cvut.cz 2005-03-31 08:48:52 -08:00 committed by
parent 2a678e09a9
commit de116e6f64
2 changed files with 13 additions and 5 deletions

View file

@ -438,13 +438,21 @@ static void matroxfb_1bpp_imageblit(WPMINFO u_int32_t fgx, u_int32_t bgx,
} else if (step == 1) { } else if (step == 1) {
/* Special case for 1..8bit widths */ /* Special case for 1..8bit widths */
while (height--) { 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++; chardata++;
} }
} else if (step == 2) { } else if (step == 2) {
/* Special case for 9..15bit widths */ /* Special case for 9..15bit widths */
while (height--) { 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; chardata += 2;
} }
} else { } else {
@ -454,7 +462,7 @@ static void matroxfb_1bpp_imageblit(WPMINFO u_int32_t fgx, u_int32_t bgx,
for (i = 0; i < step; i += 4) { for (i = 0; i < step; i += 4) {
/* Hope that there are at least three readable bytes beyond the end of bitmap */ /* 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; chardata += step;
} }

View file

@ -170,14 +170,14 @@ static inline void mga_memcpy_toio(vaddr_t va, const void* src, int len) {
if ((unsigned long)src & 3) { if ((unsigned long)src & 3) {
while (len >= 4) { while (len >= 4) {
writel(get_unaligned((u32 *)src), addr); fb_writel(get_unaligned((u32 *)src), addr);
addr++; addr++;
len -= 4; len -= 4;
src += 4; src += 4;
} }
} else { } else {
while (len >= 4) { while (len >= 4) {
writel(*(u32 *)src, addr); fb_writel(*(u32 *)src, addr);
addr++; addr++;
len -= 4; len -= 4;
src += 4; src += 4;