Commit 896f8bce authored by James Simmons's avatar James Simmons

[FBDEV] Made the upper layer code always use the cursor mask of struct...

[FBDEV] Made the upper layer code always use the cursor mask of struct fb_cursor inside struct fb_info. This moved memory management of the mask and image data to the upper layers.

[RADEON FBDEV] Updates for the Radeon 9100.
parent 64a8617f
...@@ -992,7 +992,6 @@ static void fbcon_cursor(struct vc_data *vc, int mode) ...@@ -992,7 +992,6 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
int w = (vc->vc_font.width + 7) >> 3, c; int w = (vc->vc_font.width + 7) >> 3, c;
int y = real_y(p, vc->vc_y); int y = real_y(p, vc->vc_y);
struct fb_cursor cursor; struct fb_cursor cursor;
char *mask = NULL;
if (mode & CM_SOFTBACK) { if (mode & CM_SOFTBACK) {
mode &= ~CM_SOFTBACK; mode &= ~CM_SOFTBACK;
...@@ -1045,11 +1044,15 @@ static void fbcon_cursor(struct vc_data *vc, int mode) ...@@ -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)) { 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; int cur_height, size, i = 0;
mask = kmalloc(w*vc->vc_font.height, GFP_ATOMIC);
if (!mask) return; if (!mask) return;
if (info->cursor.mask)
kfree(info->cursor.mask);
info->cursor.mask = mask;
p->cursor_shape = vc->vc_cursor_type & 0x0f; p->cursor_shape = vc->vc_cursor_type & 0x0f;
cursor.set |= FB_CUR_SETSHAPE; cursor.set |= FB_CUR_SETSHAPE;
...@@ -1080,13 +1083,9 @@ static void fbcon_cursor(struct vc_data *vc, int mode) ...@@ -1080,13 +1083,9 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
size = cur_height * w; size = cur_height * w;
while (size--) while (size--)
mask[i++] = 0xff; mask[i++] = 0xff;
cursor.mask = mask;
} }
info->cursor.rop = ROP_XOR; info->cursor.rop = ROP_XOR;
info->fbops->fb_cursor(info, &cursor); info->fbops->fb_cursor(info, &cursor);
if (mask)
kfree(mask);
vbl_cursor_cnt = CURSOR_DRAW_DELAY; vbl_cursor_cnt = CURSOR_DRAW_DELAY;
break; break;
} }
......
...@@ -257,7 +257,6 @@ struct i810fb_par { ...@@ -257,7 +257,6 @@ struct i810fb_par {
u32 pci_state[16]; u32 pci_state[16];
unsigned long mmio_start_phys; unsigned long mmio_start_phys;
u8 *mmio_start_virtual; u8 *mmio_start_virtual;
u32 cursor_reset;
u32 pitch; u32 pitch;
u32 pixconf; u32 pixconf;
u32 watermark; u32 watermark;
......
...@@ -1301,7 +1301,6 @@ static int i810fb_set_par(struct fb_info *info) ...@@ -1301,7 +1301,6 @@ static int i810fb_set_par(struct fb_info *info)
decode_var(&info->var, par); decode_var(&info->var, par);
i810_load_regs(par); i810_load_regs(par);
i810_init_cursor(par); i810_init_cursor(par);
par->cursor_reset = 1;
encode_fix(&info->fix, info); encode_fix(&info->fix, info);
...@@ -1340,24 +1339,17 @@ static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor) ...@@ -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; struct i810fb_par *par = (struct i810fb_par *)info->par;
u8 *mmio = par->mmio_start_virtual; u8 *mmio = par->mmio_start_virtual;
static u8 data[64 * 8]; u8 data[64 * 8];
if (!info->var.accel_flags || par->dev_flags & LOCKUP) if (!info->var.accel_flags || par->dev_flags & LOCKUP)
return soft_cursor(info, cursor); return soft_cursor(info, cursor);
if (cursor->image.width > 64 || cursor->image.height > 64) 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); 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); i810_enable_cursor(mmio, OFF);
if (cursor->set & FB_CUR_SETHOT) if (cursor->set & FB_CUR_SETHOT)
...@@ -1397,12 +1389,12 @@ static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor) ...@@ -1397,12 +1389,12 @@ static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
switch (info->cursor.rop) { switch (info->cursor.rop) {
case ROP_XOR: case ROP_XOR:
for (i = 0; i < size; i++) 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; break;
case ROP_COPY: case ROP_COPY:
default: default:
for (i = 0; i < size; i++) 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; break;
} }
i810_load_cursor_image(info->cursor.image.width, i810_load_cursor_image(info->cursor.image.width,
......
...@@ -121,7 +121,8 @@ enum radeon_chips { ...@@ -121,7 +121,8 @@ enum radeon_chips {
RADEON_ND, RADEON_ND,
RADEON_NE, RADEON_NE,
RADEON_NF, RADEON_NF,
RADEON_NG RADEON_NG,
RADEON_QM /* LN (my Radeon 9100) */
}; };
enum radeon_arch { enum radeon_arch {
...@@ -168,7 +169,8 @@ static struct radeon_chip_info { ...@@ -168,7 +169,8 @@ static struct radeon_chip_info {
{ "9700 ND", RADEON_R300 }, { "9700 ND", RADEON_R300 },
{ "9700 NE", RADEON_R300 }, { "9700 NE", RADEON_R300 },
{ "9700 NF", 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 = { ...@@ -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_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_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_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, } { 0, }
}; };
MODULE_DEVICE_TABLE(pci, radeonfb_pci_table); MODULE_DEVICE_TABLE(pci, radeonfb_pci_table);
...@@ -884,6 +887,16 @@ static void radeon_get_pllinfo(struct radeonfb_info *rinfo, char *bios_seg) ...@@ -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_ND:
case PCI_DEVICE_ID_ATI_RADEON_NE: case PCI_DEVICE_ID_ATI_RADEON_NE:
case PCI_DEVICE_ID_ATI_RADEON_NF: 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: case PCI_DEVICE_ID_ATI_RADEON_NG:
rinfo->pll.ppll_max = 40000; rinfo->pll.ppll_max = 40000;
rinfo->pll.ppll_min = 20000; rinfo->pll.ppll_min = 20000;
......
...@@ -297,34 +297,34 @@ static char *mode_option __initdata = NULL; ...@@ -297,34 +297,34 @@ static char *mode_option __initdata = NULL;
#endif #endif
static struct fb_fix_screeninfo rivafb_fix = { static struct fb_fix_screeninfo rivafb_fix = {
.id = "nVidia", id: "nVidia",
.type = FB_TYPE_PACKED_PIXELS, type: FB_TYPE_PACKED_PIXELS,
.xpanstep = 1, xpanstep: 1,
.ypanstep = 1, ypanstep: 1,
}; };
static struct fb_var_screeninfo rivafb_default_var = { static struct fb_var_screeninfo rivafb_default_var = {
.xres = 640, xres: 640,
.yres = 480, yres: 480,
.xres_virtual = 640, xres_virtual: 640,
.yres_virtual = 480, yres_virtual: 480,
.bits_per_pixel = 8, bits_per_pixel: 8,
.red = {0, 8, 0}, red: {0, 8, 0},
.green = {0, 8, 0}, green: {0, 8, 0},
.blue = {0, 8, 0}, blue: {0, 8, 0},
.transp = {0, 0, 0}, transp: {0, 0, 0},
.activate = FB_ACTIVATE_NOW, activate: FB_ACTIVATE_NOW,
.height = -1, height: -1,
.width = -1, width: -1,
.accel_flags = FB_ACCELF_TEXT, accel_flags: FB_ACCELF_TEXT,
.pixclock = 39721, pixclock: 39721,
.left_margin = 40, left_margin: 40,
.right_margin = 24, right_margin: 24,
.upper_margin = 32, upper_margin: 32,
.lower_margin = 11, lower_margin: 11,
.hsync_len = 96, hsync_len: 96,
.vsync_len = 2, vsync_len: 2,
.vmode = FB_VMODE_NONINTERLACED vmode: FB_VMODE_NONINTERLACED
}; };
/* from GGI */ /* from GGI */
...@@ -420,6 +420,50 @@ static inline unsigned char MISCin(struct riva_par *par) ...@@ -420,6 +420,50 @@ static inline unsigned char MISCin(struct riva_par *par)
return (VGA_RD08(par->riva.PVIO, 0x3cc)); 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 * cursor stuff
...@@ -429,7 +473,6 @@ static inline unsigned char MISCin(struct riva_par *par) ...@@ -429,7 +473,6 @@ static inline unsigned char MISCin(struct riva_par *par)
/** /**
* rivafb_load_cursor_image - load cursor image to hardware * rivafb_load_cursor_image - load cursor image to hardware
* @data: address to monochrome bitmap (1 = foreground color, 0 = background) * @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 * @par: pointer to private data
* @w: width of cursor image in pixels * @w: width of cursor image in pixels
* @h: height of cursor image in scanlines * @h: height of cursor image in scanlines
...@@ -438,44 +481,36 @@ static inline unsigned char MISCin(struct riva_par *par) ...@@ -438,44 +481,36 @@ static inline unsigned char MISCin(struct riva_par *par)
* *
* DESCRIPTiON: * DESCRIPTiON:
* Loads cursor image based on a monochrome source and mask bitmap. The * 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 * image bits determines the color of the pixel, 0 for background, 1 for
* or not. The imaage bits determines the color of the pixel, 0 for * foreground. Only the affected region (as determined by @w and @h
* background, 1 for foreground. Only the affected region (as determined * parameters) will be updated.
* by @w and @h parameters) will be updated.
* *
* CALLED FROM: * CALLED FROM:
* rivafb_cursor() * rivafb_cursor()
*/ */
static void rivafb_load_cursor_image(u8 *data, u8 *mask, struct riva_par *par, static void rivafb_load_cursor_image(struct riva_par *par, u8 *data,
int w, int h, u16 bg, u16 fg) u16 bg, u16 fg, u32 w, u32 h)
{ {
int i, j, k = 0; int i, j, k = 0;
u32 b, m, tmp; u32 b, tmp;
for (i = 0; i < h; i++) { for (i = 0; i < h; i++) {
b = *((u32 *)data)++; b = *((u32 *)data)++;
m = *((u32 *)mask)++; reverse_order(&b);
for (j = 0; j < w/2; j++) { for (j = 0; j < w/2; j++) {
tmp = 0; tmp = 0;
#if defined (__BIG_ENDIAN) #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; b <<= 1;
m <<= 1;
if (m & (1 << 31)) tmp |= (b & (1 << 31)) ? fg : bg;
tmp |= (b & (1 << 31)) ? fg : bg;
b <<= 1; b <<= 1;
m <<= 1;
#else #else
if (m & 1) tmp = (b & 1) ? fg : bg;
tmp = (b & 1) ? fg : bg;
b >>= 1; b >>= 1;
m >>= 1; tmp |= (b & 1) ? fg << 16 : bg << 16;
if (m & 1)
tmp |= (b & 1) ? fg << 16 : bg << 16;
b >>= 1; b >>= 1;
m >>= 1;
#endif #endif
writel(tmp, par->riva.CURSOR + k++); writel(tmp, par->riva.CURSOR + k++);
} }
...@@ -1104,14 +1139,6 @@ static int rivafb_pan_display(struct fb_var_screeninfo *var, ...@@ -1104,14 +1139,6 @@ static int rivafb_pan_display(struct fb_var_screeninfo *var,
par->riva.SetStartAddress(&par->riva, base); 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.xoffset = var->xoffset;
info->var.yoffset = var->yoffset; info->var.yoffset = var->yoffset;
...@@ -1311,50 +1338,6 @@ static void rivafb_copyarea(struct fb_info *info, const struct fb_copyarea *regi ...@@ -1311,50 +1338,6 @@ static void rivafb_copyarea(struct fb_info *info, const struct fb_copyarea *regi
wait_for_idle(par); 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) static inline void convert_bgcolor_16(u32 *col)
{ {
*col = ((*col & 0x00007C00) << 9) *col = ((*col & 0x00007C00) << 9)
...@@ -1463,21 +1446,18 @@ static void rivafb_imageblit(struct fb_info *info, ...@@ -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 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; struct riva_par *par = (struct riva_par *) info->par;
int i, j, d_idx = 0, s_idx = 0; int i, j, d_idx = 0, s_idx = 0;
u16 flags = cursor->set, fg, bg; u8 data[MAX_CURS * MAX_CURS/8];
u16 fg, bg, size = 0;
if (par->cursor_reset) {
flags = FB_CUR_SETALL;
par->cursor_reset = 0;
}
par->riva.ShowHideCursor(&par->riva, 0); par->riva.ShowHideCursor(&par->riva, 0);
if (flags & FB_CUR_SETPOS) { if (cursor->set & FB_CUR_SETPOS) {
u32 xx, yy, temp; 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; yy = cursor->image.dy - info->var.yoffset;
xx = cursor->image.dx - info->var.xoffset; xx = cursor->image.dx - info->var.xoffset;
temp = xx & 0xFFFF; temp = xx & 0xFFFF;
...@@ -1486,38 +1466,40 @@ static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor) ...@@ -1486,38 +1466,40 @@ static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
par->riva.PRAMDAC[0x0000300/4] = temp; par->riva.PRAMDAC[0x0000300/4] = temp;
} }
if (flags & FB_CUR_SETSIZE) { if (cursor->set & FB_CUR_SETSIZE) {
memset(data, 0, MAX_CURS * MAX_CURS/8); info->cursor.image.height = cursor->image.height;
memset(mask, 0, MAX_CURS * MAX_CURS/8); info->cursor.image.width = cursor->image.width;
memset_io(par->riva.CURSOR, 0, MAX_CURS * MAX_CURS * 2); memset_io(par->riva.CURSOR, 0, MAX_CURS * MAX_CURS * 2);
} }
if (flags & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP)) { if (cursor->set & FB_CUR_SETCMAP) {
int bg_idx = cursor->image.bg_color; info->cursor.image.bg_color = cursor->image.bg_color;
int fg_idx = cursor->image.fg_color; info->cursor.image.fg_color = cursor->image.fg_color;
int width = (cursor->image.width+7)/8; }
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 *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: 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++) { for (j = 0; j < width; j++) {
d_idx = i * MAX_CURS/8 + j; d_idx = i * MAX_CURS/8 + j;
data[d_idx] = byte_rev[dat[s_idx] ^ data[d_idx] = dat[s_idx] ^ msk[s_idx];
msk[s_idx]];
mask[d_idx] = byte_rev[msk[s_idx]];
s_idx++; s_idx++;
} }
} }
break; break;
case ROP_COPY: case ROP_COPY:
default: default:
for (i = 0; i < cursor->image.height; i++) { for (i = 0; i < info->cursor.image.height; i++) {
for (j = 0; j < width; j++) { for (j = 0; j < width; j++) {
d_idx = i * MAX_CURS/8 + j; d_idx = i * MAX_CURS/8 + j;
data[d_idx] = byte_rev[dat[s_idx]]; data[d_idx] = dat[s_idx] & msk[s_idx];
mask[d_idx] = byte_rev[msk[s_idx]];
s_idx++; s_idx++;
} }
} }
...@@ -1533,10 +1515,12 @@ static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor) ...@@ -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; ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15;
par->riva.LockUnlock(&par->riva, 0); 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); par->riva.ShowHideCursor(&par->riva, 1);
return 0; return 0;
} }
...@@ -1600,7 +1584,6 @@ static int __init riva_set_fbinfo(struct fb_info *info) ...@@ -1600,7 +1584,6 @@ static int __init riva_set_fbinfo(struct fb_info *info)
info->pixmap.buf_align = 4; info->pixmap.buf_align = 4;
info->pixmap.scan_align = 4; info->pixmap.scan_align = 4;
info->pixmap.flags = FB_PIXMAP_SYSTEM; info->pixmap.flags = FB_PIXMAP_SYSTEM;
return 0; return 0;
} }
...@@ -1975,10 +1958,10 @@ int __init rivafb_setup(char *options) ...@@ -1975,10 +1958,10 @@ int __init rivafb_setup(char *options)
#endif /* !MODULE */ #endif /* !MODULE */
static struct pci_driver rivafb_driver = { static struct pci_driver rivafb_driver = {
.name = "rivafb", name: "rivafb",
.id_table = rivafb_pci_tbl, id_table: rivafb_pci_tbl,
.probe = rivafb_probe, probe: rivafb_probe,
.remove = __exit_p(rivafb_remove), remove: __exit_p(rivafb_remove),
}; };
......
...@@ -55,17 +55,6 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor) ...@@ -55,17 +55,6 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor)
size &= ~buf_align; size &= ~buf_align;
dst = info->pixmap.addr + fb_get_buffer_offset(info, size); 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) { if (info->cursor.enable) {
switch (info->cursor.rop) { switch (info->cursor.rop) {
case ROP_XOR: case ROP_XOR:
...@@ -81,7 +70,7 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor) ...@@ -81,7 +70,7 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor)
} else } else
memcpy(src, cursor->image.data, size); 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; info->cursor.image.data = dst;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment