lkml.org 
[lkml]   [2005]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
SubjectRe: Console rotation problems
From
Date
Remove bogus usage of test/set_bit() from fbcon rotation code and just
manipulate the bits directly. This fixes an oops on powerpc among others
and should be faster. Seems to work fine on the G5 here.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---

And here is the fix. Tony, did I miss something ?

Index: linux-serialfix/drivers/video/console/fbcon_rotate.h
===================================================================
--- linux-serialfix.orig/drivers/video/console/fbcon_rotate.h 2005-11-23 11:07:23.000000000 +1100
+++ linux-serialfix/drivers/video/console/fbcon_rotate.h 2005-11-24 14:02:22.000000000 +1100
@@ -21,21 +21,13 @@
(s == SCROLL_REDRAW || s == SCROLL_MOVE || !(i)->fix.xpanstep) ? \
(i)->var.xres : (i)->var.xres_virtual; })

-/*
- * The bitmap is always big endian
- */
-#if defined(__LITTLE_ENDIAN)
-#define FBCON_BIT(b) (7 - (b))
-#else
-#define FBCON_BIT(b) (b)
-#endif

static inline int pattern_test_bit(u32 x, u32 y, u32 pitch, const char *pat)
{
u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8;

pat +=index;
- return (test_bit(FBCON_BIT(bit), (void *)pat));
+ return (*pat) & (0x80 >> bit);
}

static inline void pattern_set_bit(u32 x, u32 y, u32 pitch, char *pat)
@@ -43,7 +35,8 @@ static inline void pattern_set_bit(u32 x
u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8;

pat += index;
- set_bit(FBCON_BIT(bit), (void *)pat);
+
+ (*pat) |= 0x80 >> bit;
}

static inline void rotate_ud(const char *in, char *out, u32 width, u32 height)
Index: linux-serialfix/drivers/video/console/fbcon_ccw.c
===================================================================
--- linux-serialfix.orig/drivers/video/console/fbcon_ccw.c 2005-11-15 11:54:14.000000000 +1100
+++ linux-serialfix/drivers/video/console/fbcon_ccw.c 2005-11-24 14:03:48.000000000 +1100
@@ -34,7 +34,7 @@ static inline void ccw_update_attr(u8 *d
msk <<= (8 - mod);

if (offset > mod)
- set_bit(FBCON_BIT(7), (void *)&msk1);
+ msk1 |= 0x01;

for (i = 0; i < vc->vc_font.width; i++) {
for (j = 0; j < width; j++) {

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-11-24 04:12    [W:0.038 / U:1.944 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site