|
From: Peter H. <pd...@be...> - 2002-04-10 23:00:19
|
On Wed, Apr 10, 2002 at 03:14:38PM +0200, Geert Uytterhoeven wrote:
> On Wed, 10 Apr 2002, Peter Horton wrote:
> >
> > On a side note would you take a patch that changed the cursor xor value
> > in fbcon-cfb16/24/32 to the correct value if the display is DIRECTCOLOR
> > rather than TRUECOLOR? We could then avoid having to set spurious
> >
> > I think the correct xor values are
> >
> > depth 15 0x3DEF
> > depth 16 0x79EF
> > depth 24/32 0x000F0F0F
>
> In general, this is not correct, since no one guarantees that in e.g. depth 32
> the alpha bits are in the 8 most significant bits of the pixel value.
> But in directcolor mode XORing with the 16th entry of the pseudo palette should
> be OK. So yes, I guess we (cfr. the CC to linux-fbdev-devel) would take a
> patch for that...
>
> That's why for 2.5.x we plan to add a 17th entry to the pseudo palette, so the
> fbdev can specify the correct XOR value.
>
Good plan.
Here's the 2.4 patch ...
P.
diff -ur linux-2.4.19-pre2/drivers/video/fbcon-cfb16.c linux.pdh/drivers/video/fbcon-cfb16.c
--- linux-2.4.19-pre2/drivers/video/fbcon-cfb16.c Wed Jan 2 20:11:02 2002
+++ linux.pdh/drivers/video/fbcon-cfb16.c Wed Apr 10 23:37:46 2002
@@ -231,26 +231,31 @@
void fbcon_cfb16_revc(struct display *p, int xx, int yy)
{
u8 *dest;
+ u32 xor;
int bytes = p->next_line, rows;
+ xor = (p->visual == FB_VISUAL_DIRECTCOLOR) ?
+ ((u16 *) p->dispsw_data)[15] : 0xffff;
+ xor |= xor << 16;
+
dest = p->screen_base + yy * fontheight(p) * bytes + xx * fontwidth(p)*2;
for (rows = fontheight(p); rows--; dest += bytes) {
switch (fontwidth(p)) {
case 16:
- fb_writel(fb_readl(dest+24) ^ 0xffffffff, dest+24);
- fb_writel(fb_readl(dest+28) ^ 0xffffffff, dest+28);
+ fb_writel(fb_readl(dest+24) ^ xor, dest+24);
+ fb_writel(fb_readl(dest+28) ^ xor, dest+28);
/* FALL THROUGH */
case 12:
- fb_writel(fb_readl(dest+16) ^ 0xffffffff, dest+16);
- fb_writel(fb_readl(dest+20) ^ 0xffffffff, dest+20);
+ fb_writel(fb_readl(dest+16) ^ xor, dest+16);
+ fb_writel(fb_readl(dest+20) ^ xor, dest+20);
/* FALL THROUGH */
case 8:
- fb_writel(fb_readl(dest+8) ^ 0xffffffff, dest+8);
- fb_writel(fb_readl(dest+12) ^ 0xffffffff, dest+12);
+ fb_writel(fb_readl(dest+8) ^ xor, dest+8);
+ fb_writel(fb_readl(dest+12) ^ xor, dest+12);
/* FALL THROUGH */
case 4:
- fb_writel(fb_readl(dest+0) ^ 0xffffffff, dest+0);
- fb_writel(fb_readl(dest+4) ^ 0xffffffff, dest+4);
+ fb_writel(fb_readl(dest+0) ^ xor, dest+0);
+ fb_writel(fb_readl(dest+4) ^ xor, dest+4);
}
}
}
diff -ur linux-2.4.19-pre2/drivers/video/fbcon-cfb24.c linux.pdh/drivers/video/fbcon-cfb24.c
--- linux-2.4.19-pre2/drivers/video/fbcon-cfb24.c Sat Apr 6 16:34:39 2002
+++ linux.pdh/drivers/video/fbcon-cfb24.c Wed Apr 10 23:38:21 2002
@@ -239,30 +239,34 @@
void fbcon_cfb24_revc(struct display *p, int xx, int yy)
{
u8 *dest;
+ u32 xor;
int bytes = p->next_line, rows;
+ xor = (p->visual == FB_VISUAL_DIRECTCOLOR) ?
+ ((u32 *) p->dispsw_data)[15] : 0xffffffff;
+
dest = p->screen_base + yy * fontheight(p) * bytes + xx * fontwidth(p) * 3;
for (rows = fontheight(p); rows--; dest += bytes) {
switch (fontwidth(p)) {
case 16:
- fb_writel(fb_readl(dest+36) ^ 0xffffffff, dest+36);
- fb_writel(fb_readl(dest+40) ^ 0xffffffff, dest+40);
- fb_writel(fb_readl(dest+44) ^ 0xffffffff, dest+44);
+ fb_writel(fb_readl(dest+36) ^ xor, dest+36);
+ fb_writel(fb_readl(dest+40) ^ xor, dest+40);
+ fb_writel(fb_readl(dest+44) ^ xor, dest+44);
/* FALL THROUGH */
case 12:
- fb_writel(fb_readl(dest+24) ^ 0xffffffff, dest+24);
- fb_writel(fb_readl(dest+28) ^ 0xffffffff, dest+28);
- fb_writel(fb_readl(dest+32) ^ 0xffffffff, dest+32);
+ fb_writel(fb_readl(dest+24) ^ xor, dest+24);
+ fb_writel(fb_readl(dest+28) ^ xor, dest+28);
+ fb_writel(fb_readl(dest+32) ^ xor, dest+32);
/* FALL THROUGH */
case 8:
- fb_writel(fb_readl(dest+12) ^ 0xffffffff, dest+12);
- fb_writel(fb_readl(dest+16) ^ 0xffffffff, dest+16);
- fb_writel(fb_readl(dest+20) ^ 0xffffffff, dest+20);
+ fb_writel(fb_readl(dest+12) ^ xor, dest+12);
+ fb_writel(fb_readl(dest+16) ^ xor, dest+16);
+ fb_writel(fb_readl(dest+20) ^ xor, dest+20);
/* FALL THROUGH */
case 4:
- fb_writel(fb_readl(dest+0) ^ 0xffffffff, dest+0);
- fb_writel(fb_readl(dest+4) ^ 0xffffffff, dest+4);
- fb_writel(fb_readl(dest+8) ^ 0xffffffff, dest+8);
+ fb_writel(fb_readl(dest+0) ^ xor, dest+0);
+ fb_writel(fb_readl(dest+4) ^ xor, dest+4);
+ fb_writel(fb_readl(dest+8) ^ xor, dest+8);
}
}
}
diff -ur linux-2.4.19-pre2/drivers/video/fbcon-cfb32.c linux.pdh/drivers/video/fbcon-cfb32.c
--- linux-2.4.19-pre2/drivers/video/fbcon-cfb32.c Wed Jan 2 20:11:02 2002
+++ linux.pdh/drivers/video/fbcon-cfb32.c Wed Apr 10 23:39:55 2002
@@ -208,34 +208,38 @@
void fbcon_cfb32_revc(struct display *p, int xx, int yy)
{
u8 *dest;
+ u32 xor;
int bytes = p->next_line, rows;
+ xor = (p->visual == FB_VISUAL_DIRECTCOLOR) ?
+ ((u32 *) p->dispsw_data)[15] : 0xffffffff;
+
dest = p->screen_base + yy * fontheight(p) * bytes + xx * fontwidth(p) * 4;
for (rows = fontheight(p); rows--; dest += bytes) {
switch (fontwidth(p)) {
case 16:
- fb_writel(fb_readl(dest+(4*12)) ^ 0xffffffff, dest+(4*12));
- fb_writel(fb_readl(dest+(4*13)) ^ 0xffffffff, dest+(4*13));
- fb_writel(fb_readl(dest+(4*14)) ^ 0xffffffff, dest+(4*14));
- fb_writel(fb_readl(dest+(4*15)) ^ 0xffffffff, dest+(4*15));
+ fb_writel(fb_readl(dest+(4*12)) ^ xor, dest+(4*12));
+ fb_writel(fb_readl(dest+(4*13)) ^ xor, dest+(4*13));
+ fb_writel(fb_readl(dest+(4*14)) ^ xor, dest+(4*14));
+ fb_writel(fb_readl(dest+(4*15)) ^ xor, dest+(4*15));
/* FALL THROUGH */
case 12:
- fb_writel(fb_readl(dest+(4*8)) ^ 0xffffffff, dest+(4*8));
- fb_writel(fb_readl(dest+(4*9)) ^ 0xffffffff, dest+(4*9));
- fb_writel(fb_readl(dest+(4*10)) ^ 0xffffffff, dest+(4*10));
- fb_writel(fb_readl(dest+(4*11)) ^ 0xffffffff, dest+(4*11));
+ fb_writel(fb_readl(dest+(4*8)) ^ xor, dest+(4*8));
+ fb_writel(fb_readl(dest+(4*9)) ^ xor, dest+(4*9));
+ fb_writel(fb_readl(dest+(4*10)) ^ xor, dest+(4*10));
+ fb_writel(fb_readl(dest+(4*11)) ^ xor, dest+(4*11));
/* FALL THROUGH */
case 8:
- fb_writel(fb_readl(dest+(4*4)) ^ 0xffffffff, dest+(4*4));
- fb_writel(fb_readl(dest+(4*5)) ^ 0xffffffff, dest+(4*5));
- fb_writel(fb_readl(dest+(4*6)) ^ 0xffffffff, dest+(4*6));
- fb_writel(fb_readl(dest+(4*7)) ^ 0xffffffff, dest+(4*7));
+ fb_writel(fb_readl(dest+(4*4)) ^ xor, dest+(4*4));
+ fb_writel(fb_readl(dest+(4*5)) ^ xor, dest+(4*5));
+ fb_writel(fb_readl(dest+(4*6)) ^ xor, dest+(4*6));
+ fb_writel(fb_readl(dest+(4*7)) ^ xor, dest+(4*7));
/* FALL THROUGH */
case 4:
- fb_writel(fb_readl(dest+(4*0)) ^ 0xffffffff, dest+(4*0));
- fb_writel(fb_readl(dest+(4*1)) ^ 0xffffffff, dest+(4*1));
- fb_writel(fb_readl(dest+(4*2)) ^ 0xffffffff, dest+(4*2));
- fb_writel(fb_readl(dest+(4*3)) ^ 0xffffffff, dest+(4*3));
+ fb_writel(fb_readl(dest+(4*0)) ^ xor, dest+(4*0));
+ fb_writel(fb_readl(dest+(4*1)) ^ xor, dest+(4*1));
+ fb_writel(fb_readl(dest+(4*2)) ^ xor, dest+(4*2));
+ fb_writel(fb_readl(dest+(4*3)) ^ xor, dest+(4*3));
/* FALL THROUGH */
}
}
|