mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 13:22:57 +00:00
[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:
parent
2a678e09a9
commit
de116e6f64
2 changed files with 13 additions and 5 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue