]> git.hungrycats.org Git - linux/commitdiff
[FBDEV] Made the upper layer code always use the cursor mask of struct fb_cursor...
authorJames Simmons <jsimmons@maxwell.earthlink.net>
Thu, 10 Apr 2003 01:48:22 +0000 (18:48 -0700)
committerJames Simmons <jsimmons@maxwell.earthlink.net>
Thu, 10 Apr 2003 01:48:22 +0000 (18:48 -0700)
[RADEON FBDEV] Updates for the Radeon 9100.

drivers/video/console/fbcon.c
drivers/video/i810/i810.h
drivers/video/i810/i810_main.c
drivers/video/radeonfb.c
drivers/video/riva/fbdev.c
drivers/video/softcursor.c

index 3620335ada195775288baaa30af7e022ee7802c2..905f2d3aa1b84041353ca4522bc0cc70e3a90f2d 100644 (file)
@@ -992,7 +992,6 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
        int w = (vc->vc_font.width + 7) >> 3, c;
        int y = real_y(p, vc->vc_y);
        struct fb_cursor cursor;
-       char *mask = NULL;
        
        if (mode & CM_SOFTBACK) {
                mode &= ~CM_SOFTBACK;
@@ -1045,11 +1044,15 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
                }
 
                if ((cursor.set & FB_CUR_SETSIZE) || ((vc->vc_cursor_type & 0x0f) != p->cursor_shape)) {
+                       char *mask = kmalloc(w*vc->vc_font.height, GFP_ATOMIC);
                        int cur_height, size, i = 0;
 
-                       mask = kmalloc(w*vc->vc_font.height, GFP_ATOMIC);
                        if (!mask)      return; 
-                       
+               
+                       if (info->cursor.mask)
+                               kfree(info->cursor.mask);
+                       info->cursor.mask = mask;
+       
                        p->cursor_shape = vc->vc_cursor_type & 0x0f;
                        cursor.set |= FB_CUR_SETSHAPE;
 
@@ -1080,13 +1083,9 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
                        size = cur_height * w;
                        while (size--)
                                mask[i++] = 0xff;
-                       cursor.mask = mask;
                }
                info->cursor.rop = ROP_XOR;
-
                info->fbops->fb_cursor(info, &cursor);
-               if (mask)       
-                       kfree(mask);
                vbl_cursor_cnt = CURSOR_DRAW_DELAY;
                break;
        }
index d242710bdc85dfd2000a7c5b9d5dce81b1a02cd2..381b43663e49f659f11ae35449fb1152356c47a2 100644 (file)
@@ -257,7 +257,6 @@ struct i810fb_par {
        u32 pci_state[16];
        unsigned long mmio_start_phys;
        u8 *mmio_start_virtual;
-       u32 cursor_reset;
        u32 pitch;
        u32 pixconf;
        u32 watermark;
index b8e5e8cbfc325ce039c3c8cccc353b1929a40a56..97ed0193a954135e58c33fcb77ee0a822f9640f9 100644 (file)
@@ -1301,7 +1301,6 @@ static int i810fb_set_par(struct fb_info *info)
        decode_var(&info->var, par);
        i810_load_regs(par);
        i810_init_cursor(par);
-       par->cursor_reset = 1;
 
        encode_fix(&info->fix, info);
 
@@ -1340,24 +1339,17 @@ static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
 {
        struct i810fb_par *par = (struct i810fb_par *)info->par;
        u8 *mmio = par->mmio_start_virtual;     
-       static u8 data[64 * 8];
+       u8 data[64 * 8];
        
        if (!info->var.accel_flags || par->dev_flags & LOCKUP) 
                return soft_cursor(info, cursor);
 
        if (cursor->image.width > 64 || cursor->image.height > 64)
-               return 1;
+               return -ENXIO;
 
-       if ((i810_readl(CURBASE, mmio) & 0xf) != par->cursor_heap.physical) {
+       if ((i810_readl(CURBASE, mmio) & 0xf) != par->cursor_heap.physical)
                i810_init_cursor(par);
-               par->cursor_reset = 1;
-       }
 
-       if (par->cursor_reset) {
-               cursor->set = FB_CUR_SETALL;
-               par->cursor_reset = 0;
-       }
-       
        i810_enable_cursor(mmio, OFF);
 
        if (cursor->set & FB_CUR_SETHOT)
@@ -1397,12 +1389,12 @@ static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
                switch (info->cursor.rop) {
                case ROP_XOR:
                        for (i = 0; i < size; i++)
-                               data[i] = cursor->image.data[i] ^ cursor->mask[i]; 
+                               data[i] = cursor->image.data[i] ^ info->cursor.mask[i]; 
                        break;
                case ROP_COPY:
                default:
                        for (i = 0; i < size; i++)
-                               data[i] = cursor->image.data[i] & cursor->mask[i]; 
+                               data[i] = cursor->image.data[i] & info->cursor.mask[i]; 
                        break;
                }
                i810_load_cursor_image(info->cursor.image.width, 
index bfeb2390d1f0e86d7aa603c922e52eb1835817ce..a6491cfda2e3e814d306d085f911e80c181411a9 100644 (file)
@@ -121,7 +121,8 @@ enum radeon_chips {
        RADEON_ND,
        RADEON_NE,
        RADEON_NF,
-       RADEON_NG
+       RADEON_NG,
+       RADEON_QM       /* LN (my Radeon 9100) */
 };
 
 enum radeon_arch {
@@ -168,7 +169,8 @@ static struct radeon_chip_info {
        { "9700 ND", RADEON_R300 },
        { "9700 NE", RADEON_R300 },
        { "9700 NF", RADEON_R300 },
-       { "9700 NG", RADEON_R300 }
+       { "9700 NG", RADEON_R300 },
+       { "9100 QM", RADEON_R200 } /* LN (my Radeon 9100) */
 };
 
 
@@ -213,6 +215,7 @@ static struct pci_device_id radeonfb_pci_table[] __devinitdata = {
        { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_NE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RADEON_NE},
        { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_NF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RADEON_NF},
        { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_NG, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RADEON_NG},
+       { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_QM, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RADEON_QM}, /* LN (my Radeon 9100) */
        { 0, }
 };
 MODULE_DEVICE_TABLE(pci, radeonfb_pci_table);
@@ -884,6 +887,16 @@ static void radeon_get_pllinfo(struct radeonfb_info *rinfo, char *bios_seg)
                        case PCI_DEVICE_ID_ATI_RADEON_ND:
                        case PCI_DEVICE_ID_ATI_RADEON_NE:
                        case PCI_DEVICE_ID_ATI_RADEON_NF:
+                       case PCI_DEVICE_ID_ATI_RADEON_NG:
+                               rinfo->pll.ppll_max = 40000;
+                               rinfo->pll.ppll_min = 20000;
+                               rinfo->pll.xclk = 27000;
+                               rinfo->pll.ref_div = 12;
+                               rinfo->pll.ref_clk = 2700;
+                               break;
+                       case PCI_DEVICE_ID_ATI_RADEON_ND:
+                       case PCI_DEVICE_ID_ATI_RADEON_NE:
+                       case PCI_DEVICE_ID_ATI_RADEON_NF:
                        case PCI_DEVICE_ID_ATI_RADEON_NG:
                                rinfo->pll.ppll_max = 40000;
                                rinfo->pll.ppll_min = 20000;
index f873334046d384459a1eccccaac7fe16fe670808..d6676ae5fc705408321df63ec60c6dc2598b9fae 100644 (file)
@@ -297,34 +297,34 @@ static char *mode_option __initdata = NULL;
 #endif
 
 static struct fb_fix_screeninfo rivafb_fix = {
-       .id             = "nVidia",
-       .type           = FB_TYPE_PACKED_PIXELS,
-       .xpanstep       = 1,
-       .ypanstep       = 1,
+       id:             "nVidia",
+       type:           FB_TYPE_PACKED_PIXELS,
+       xpanstep:       1,
+       ypanstep:       1,
 };
 
 static struct fb_var_screeninfo rivafb_default_var = {
-       .xres           = 640,
-       .yres           = 480,
-       .xres_virtual   = 640,
-       .yres_virtual   = 480,
-       .bits_per_pixel = 8,
-       .red            = {0, 8, 0},
-       .green          = {0, 8, 0},
-       .blue           = {0, 8, 0},
-       .transp         = {0, 0, 0},
-       .activate       = FB_ACTIVATE_NOW,
-       .height         = -1,
-       .width          = -1,
-       .accel_flags    = FB_ACCELF_TEXT,
-       .pixclock       = 39721,
-       .left_margin    = 40,
-       .right_margin   = 24,
-       .upper_margin   = 32,
-       .lower_margin   = 11,
-       .hsync_len      = 96,
-       .vsync_len      = 2,
-       .vmode          = FB_VMODE_NONINTERLACED
+       xres:           640,
+       yres:           480,
+       xres_virtual:   640,
+       yres_virtual:   480,
+       bits_per_pixel: 8,
+       red:            {0, 8, 0},
+       green:          {0, 8, 0},
+       blue:           {0, 8, 0},
+       transp:         {0, 0, 0},
+       activate:       FB_ACTIVATE_NOW,
+       height:         -1,
+       width:          -1,
+       accel_flags:    FB_ACCELF_TEXT,
+       pixclock:       39721,
+       left_margin:    40,
+       right_margin:   24,
+       upper_margin:   32,
+       lower_margin:   11,
+       hsync_len:      96,
+       vsync_len:      2,
+       vmode:          FB_VMODE_NONINTERLACED
 };
 
 /* from GGI */
@@ -420,6 +420,50 @@ static inline unsigned char MISCin(struct riva_par *par)
        return (VGA_RD08(par->riva.PVIO, 0x3cc));
 }
 
+static u8 byte_rev[256] = {
+       0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+       0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+       0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+       0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+       0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+       0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+       0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+       0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+       0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+       0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+       0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+       0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+       0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+       0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+       0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+       0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+       0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+       0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+       0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+       0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+       0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+       0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+       0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+       0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+       0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+       0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+       0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+       0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+       0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+       0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+       0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+       0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
+};
+
+static inline void reverse_order(u32 *l)
+{
+       u8 *a = (u8 *)l;
+       *a = byte_rev[*a], a++;
+       *a = byte_rev[*a], a++;
+       *a = byte_rev[*a], a++;
+       *a = byte_rev[*a];
+}
+
 /* ------------------------------------------------------------------------- *
  *
  * cursor stuff
@@ -429,7 +473,6 @@ static inline unsigned char MISCin(struct riva_par *par)
 /**
  * rivafb_load_cursor_image - load cursor image to hardware
  * @data: address to monochrome bitmap (1 = foreground color, 0 = background)
- * @mask: address to mask (1 = write image pixel, 0 = do not write pixel)
  * @par:  pointer to private data
  * @w:    width of cursor image in pixels
  * @h:    height of cursor image in scanlines
@@ -438,44 +481,36 @@ static inline unsigned char MISCin(struct riva_par *par)
  *
  * DESCRIPTiON:
  * Loads cursor image based on a monochrome source and mask bitmap.  The
- * mask bit determines if the image pixel is to be written to the framebuffer
- * or not.  The imaage bits determines the color of the pixel, 0 for
- * background, 1 for foreground.  Only the affected region (as determined
- * by @w and @h parameters) will be updated.
+ * image bits determines the color of the pixel, 0 for background, 1 for
+ * foreground.  Only the affected region (as determined by @w and @h 
+ * parameters) will be updated.
  *
  * CALLED FROM:
  * rivafb_cursor()
  */
-static void rivafb_load_cursor_image(u8 *data, u8 *mask, struct riva_par *par,
-                                     int w, int h, u16 bg, u16 fg)
+static void rivafb_load_cursor_image(struct riva_par *par, u8 *data, 
+                                    u16 bg, u16 fg, u32 w, u32 h)
 {
        int i, j, k = 0;
-       u32 b, m, tmp;
+       u32 b, tmp;
 
        for (i = 0; i < h; i++) {
                b = *((u32 *)data)++;
-               m = *((u32 *)mask)++;
+               reverse_order(&b);
+               
                for (j = 0; j < w/2; j++) {
                        tmp = 0;
 #if defined (__BIG_ENDIAN)
-                       if (m & (1 << 31))
-                               tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
+                       tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
                        b <<= 1;
-                       m <<= 1;
 
-                       if (m & (1 << 31))
-                               tmp |= (b & (1 << 31)) ? fg : bg;
+                       tmp |= (b & (1 << 31)) ? fg : bg;
                        b <<= 1;
-                       m <<= 1;
 #else
-                       if (m & 1)
-                               tmp = (b & 1) ? fg : bg;
+                       tmp = (b & 1) ? fg : bg;
                        b >>= 1;
-                       m >>= 1;
-                       if (m & 1)
-                               tmp |= (b & 1) ? fg << 16 : bg << 16;
+                       tmp |= (b & 1) ? fg << 16 : bg << 16;
                        b >>= 1;
-                       m >>= 1;
 #endif
                        writel(tmp, par->riva.CURSOR + k++);
                }
@@ -1104,14 +1139,6 @@ static int rivafb_pan_display(struct fb_var_screeninfo *var,
 
        par->riva.SetStartAddress(&par->riva, base);
 
-       /*
-        * HACK: The hardware cursor occasionally disappears during fast scrolling.
-        *       We just reset the cursor each time we change the start address.
-        *       This also has a beneficial side effect of restoring the cursor
-        *       image when switching from X.
-        */
-       par->cursor_reset = 1;
-
        info->var.xoffset = var->xoffset;
        info->var.yoffset = var->yoffset;
 
@@ -1311,50 +1338,6 @@ static void rivafb_copyarea(struct fb_info *info, const struct fb_copyarea *regi
        wait_for_idle(par);
 }
 
-static u8 byte_rev[256] = {
-       0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
-       0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
-       0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
-       0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
-       0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
-       0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
-       0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
-       0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
-       0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
-       0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
-       0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
-       0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
-       0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
-       0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
-       0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
-       0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
-       0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
-       0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
-       0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
-       0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
-       0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
-       0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
-       0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
-       0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
-       0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
-       0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
-       0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
-       0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
-       0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
-       0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
-       0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
-       0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
-};
-
-static inline void reverse_order(u32 *l)
-{
-       u8 *a = (u8 *)l;
-       *a = byte_rev[*a], a++;
-       *a = byte_rev[*a], a++;
-       *a = byte_rev[*a], a++;
-       *a = byte_rev[*a];
-}
-
 static inline void convert_bgcolor_16(u32 *col)
 {
        *col = ((*col & 0x00007C00) << 9)
@@ -1463,21 +1446,18 @@ static void rivafb_imageblit(struct fb_info *info,
  */
 static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
 {
-       static u8 data[MAX_CURS*MAX_CURS/8], mask[MAX_CURS*MAX_CURS/8];
        struct riva_par *par = (struct riva_par *) info->par;
        int i, j, d_idx = 0, s_idx = 0;
-       u16 flags = cursor->set, fg, bg;
-
-       if (par->cursor_reset) {
-               flags = FB_CUR_SETALL;
-               par->cursor_reset = 0;
-       }
+       u8 data[MAX_CURS * MAX_CURS/8];
+       u16 fg, bg, size = 0;
 
        par->riva.ShowHideCursor(&par->riva, 0);
 
-       if (flags & FB_CUR_SETPOS) {
+       if (cursor->set & FB_CUR_SETPOS) {
                u32 xx, yy, temp;
 
+               info->cursor.image.dx = cursor->image.dx;
+               info->cursor.image.dy = cursor->image.dy;
                yy = cursor->image.dy - info->var.yoffset;
                xx = cursor->image.dx - info->var.xoffset;
                temp = xx & 0xFFFF;
@@ -1486,38 +1466,40 @@ static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
                par->riva.PRAMDAC[0x0000300/4] = temp;
        }
 
-       if (flags & FB_CUR_SETSIZE) {
-               memset(data, 0, MAX_CURS * MAX_CURS/8);
-               memset(mask, 0, MAX_CURS * MAX_CURS/8);
+       if (cursor->set & FB_CUR_SETSIZE) {
+               info->cursor.image.height = cursor->image.height;
+               info->cursor.image.width = cursor->image.width;
                memset_io(par->riva.CURSOR, 0, MAX_CURS * MAX_CURS * 2);
        }
 
-       if (flags & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP)) {
-               int bg_idx = cursor->image.bg_color;
-               int fg_idx = cursor->image.fg_color;
-               int width = (cursor->image.width+7)/8;
+       if (cursor->set & FB_CUR_SETCMAP) {
+               info->cursor.image.bg_color = cursor->image.bg_color;
+               info->cursor.image.fg_color = cursor->image.fg_color;
+       }
+
+       if (cursor->set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP)) {
+               u32 bg_idx = info->cursor.image.bg_color;
+               u32 fg_idx = info->cursor.image.fg_color;
+               u32 width = (info->cursor.image.width+7) >> 3;
                u8 *dat = (u8 *) cursor->image.data;
-               u8 *msk = (u8 *) cursor->mask;
+               u8 *msk = (u8 *) info->cursor.mask;
 
-               switch (cursor->rop) {
+               switch (info->cursor.rop) {
                case ROP_XOR:
-                       for (i = 0; i < cursor->image.height; i++) {
+                       for (i = 0; i < info->cursor.image.height; i++) {
                                for (j = 0; j < width; j++) {
                                        d_idx = i * MAX_CURS/8  + j;
-                                       data[d_idx] =  byte_rev[dat[s_idx] ^ 
-                                                               msk[s_idx]];
-                                       mask[d_idx] = byte_rev[msk[s_idx]];
+                                       data[d_idx] = dat[s_idx] ^ msk[s_idx];
                                        s_idx++;
                                }
                        }
                        break;
                case ROP_COPY:
                default:
-                       for (i = 0; i < cursor->image.height; i++) {
+                       for (i = 0; i < info->cursor.image.height; i++) {
                                for (j = 0; j < width; j++) {
                                        d_idx = i * MAX_CURS/8 + j;
-                                       data[d_idx] = byte_rev[dat[s_idx]];
-                                       mask[d_idx] = byte_rev[msk[s_idx]];
+                                       data[d_idx] = dat[s_idx] & msk[s_idx];
                                        s_idx++;
                                }
                        }
@@ -1533,10 +1515,12 @@ static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
                     ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15;
 
                par->riva.LockUnlock(&par->riva, 0);
-               rivafb_load_cursor_image(data, mask, par, cursor->image.width,
-               cursor->image.height, bg, fg);
+
+               rivafb_load_cursor_image(par, data, bg, fg,
+                                        info->cursor.image.width, 
+                                        info->cursor.image.height);
        }
-       if (cursor->enable)
+       if (info->cursor.enable)
                par->riva.ShowHideCursor(&par->riva, 1);
        return 0;
 }
@@ -1600,7 +1584,6 @@ static int __init riva_set_fbinfo(struct fb_info *info)
        info->pixmap.buf_align = 4;
        info->pixmap.scan_align = 4;
        info->pixmap.flags = FB_PIXMAP_SYSTEM;
-
        return 0;
 }
 
@@ -1975,10 +1958,10 @@ int __init rivafb_setup(char *options)
 #endif /* !MODULE */
 
 static struct pci_driver rivafb_driver = {
-       .name           = "rivafb",
-       .id_table       = rivafb_pci_tbl,
-       .probe          = rivafb_probe,
-       .remove         = __exit_p(rivafb_remove),
+       name:           "rivafb",
+       id_table:       rivafb_pci_tbl,
+       probe:          rivafb_probe,
+       remove:         __exit_p(rivafb_remove),
 };
 
 
index 78ddba021f7b53b5e4e4d3d63a23773c559dd93c..a71e1d841a0777f5c54a6c186ef3e38c27be3122 100644 (file)
@@ -55,17 +55,6 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor)
        size &= ~buf_align;
        dst = info->pixmap.addr + fb_get_buffer_offset(info, size);
 
-       if (cursor->set & FB_CUR_SETSHAPE) {
-               if (cursor->set & FB_CUR_SETSIZE) {
-                       if (info->cursor.mask)
-                               kfree(info->cursor.mask);
-                       info->cursor.mask = kmalloc(dsize, GFP_ATOMIC);
-                       if (!info->cursor.mask)
-                               return -ENOMEM;
-               }
-               memcpy(info->cursor.mask, cursor->mask, dsize);                 
-       }
-       
        if (info->cursor.enable) {
                switch (info->cursor.rop) {
                case ROP_XOR:
@@ -81,7 +70,7 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor)
        } else 
                memcpy(src, cursor->image.data, size);
        
-       move_buf_aligned(info, dst, src, d_pitch, s_pitch,info->cursor.image.height);
+       move_buf_aligned(info, dst, src, d_pitch, s_pitch, info->cursor.image.height);
        
        info->cursor.image.data = dst;