Patches for endianess problems in atyfb
Christian Bauer
Christian.Bauer at uni-mainz.de
Sat May 8 17:43:24 EST 1999
Hi!
The following patches cure some of the problems I had with the atyfb
on my PowerMac clone with onboard ATI 264VT2:
- corrected false colors and unstable picture in X11 15 and 32 bit depths
- the display no longer depends on what color depth was selected in MacOS
I didn't have any other ATI chips to test it with, so all changes are
protected by a check of the chip ID.
I'm unsure of the "i |= 0x08000000" that is done in the setup of MEM_CNTL.
Can someone with an ATI data book verify is this bit really has something
to do with frame buffer endianess?
--- atyfb.c.orig Sat May 8 19:32:31 1999
+++ atyfb.c.new Sat May 8 19:31:47 1999
@@ -1118,25 +1118,44 @@
if (bpp <= 8) {
bpp = 8;
pix_width = CRTC_PIX_WIDTH_8BPP;
- dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP | BYTE_ORDER_LSB_TO_MSB;
+ dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP;
dp_chain_mask = 0x8080;
+ if (Gx == VT_CHIP_ID) {
+ pix_width |= 0x00040000; // FIFO setup
+ }
+#ifdef __LITTLE_ENDIAN
+ dp_pix_width |= BYTE_ORDER_LSB_TO_MSB;
+#endif
} else if (bpp <= 16) {
bpp = 16;
pix_width = CRTC_PIX_WIDTH_15BPP;
- dp_pix_width = HOST_15BPP | SRC_15BPP | DST_15BPP |
- BYTE_ORDER_LSB_TO_MSB;
+ dp_pix_width = HOST_15BPP | SRC_15BPP | DST_15BPP;
dp_chain_mask = 0x4210;
+ if (Gx == VT_CHIP_ID) {
+ pix_width |= 0x00068000; // FIFO setup
+ }
+#ifdef __LITTLE_ENDIAN
+ dp_pix_width |= BYTE_ORDER_LSB_TO_MSB;
+#endif
} else if ((bpp <= 24) && (Gx != GX_CHIP_ID) && (Gx != CX_CHIP_ID)) {
bpp = 24;
pix_width = CRTC_PIX_WIDTH_24BPP;
- dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP | BYTE_ORDER_LSB_TO_MSB;
+ dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP;
dp_chain_mask = 0x8080;
+#ifdef __LITTLE_ENDIAN
+ dp_pix_width |= BYTE_ORDER_LSB_TO_MSB;
+#endif
} else if (bpp <= 32) {
bpp = 32;
pix_width = CRTC_PIX_WIDTH_32BPP;
- dp_pix_width = HOST_32BPP | SRC_32BPP | DST_32BPP |
- BYTE_ORDER_LSB_TO_MSB;
+ dp_pix_width = HOST_32BPP | SRC_32BPP | DST_32BPP;
dp_chain_mask = 0x8080;
+ if (Gx == VT_CHIP_ID) {
+ pix_width |= 0x000dc000; // FIFO setup
+ }
+#ifdef __LITTLE_ENDIAN
+ dp_pix_width |= BYTE_ORDER_LSB_TO_MSB;
+#endif
} else
FAIL("invalid bpp");
@@ -1161,7 +1180,7 @@
crtc->off_pitch = ((yoffset*vxres+xoffset)*bpp/64) | (vxres<<19);
crtc->gen_cntl = pix_width | c_sync | CRTC_EXT_DISP_EN | CRTC_ENABLE;
if ((Gx == CT_CHIP_ID) || (Gx == ET_CHIP_ID) ||
- ((Gx == VT_CHIP_ID || Gx == GT_CHIP_ID) && !(Rev & 0x07))) {
+ ((Gx == GT_CHIP_ID) && !(Rev & 0x07))) {
/* Not VTB/GTB */
/* FIXME: magic FIFO values */
crtc->gen_cntl |= aty_ld_le32(CRTC_GEN_CNTL, info) & 0x000e0000;
@@ -1743,17 +1762,36 @@
i = aty_ld_le32(MEM_CNTL, info) & 0xf30fffff;
if (!(Gx == VT_CHIP_ID && (Rev == 0x40 || Rev == 0x48)))
i |= info->mem_refresh_rate << 20;
- switch (par->crtc.bpp) {
- case 8:
- case 24:
- i |= 0x00000000;
- break;
- case 16:
- i |= 0x04000000;
- break;
- case 32:
- i |= 0x08000000;
- break;
+ if (Gx == VT_CHIP_ID) {
+ i &= 0xf0ffffff;
+ switch (par->crtc.bpp) {
+ case 8:
+ case 24:
+ i |= 0x02000000;
+ break;
+ case 16:
+ i |= 0x03000000;
+ break;
+ case 32:
+ i |= 0x06000000;
+ break;
+ }
+#ifdef __BIG_ENDIAN
+ i |= 0x08000000;
+#endif
+ } else {
+ switch (par->crtc.bpp) {
+ case 8:
+ case 24:
+ i |= 0x00000000;
+ break;
+ case 16:
+ i |= 0x04000000;
+ break;
+ case 32:
+ i |= 0x08000000;
+ break;
+ }
}
if ((Gx == CT_CHIP_ID) || (Gx == ET_CHIP_ID)) {
aty_st_le32(DAC_CNTL, 0x87010184, info);
Bye,
Christian
--
/ Coding on PowerPC and proud of it
\/ http://www.uni-mainz.de/~bauec002/
[[ This message was sent via the linuxppc-dev mailing list. Replies are ]]
[[ not forced back to the list, so be sure to Cc linuxppc-dev if your ]]
[[ reply is of general interest. Please check http://lists.linuxppc.org/ ]]
[[ and http://www.linuxppc.org/ for useful information before posting. ]]
More information about the Linuxppc-dev
mailing list