diff -ur linux-2.4.32/drivers/video/cgsixfb.c linux-2.4.33/drivers/video/cgsixfb.c --- linux-2.4.32/drivers/video/cgsixfb.c 2001-10-17 23:16:39.000000000 +0200 +++ linux-2.4.33/drivers/video/cgsixfb.c 2006-05-26 16:52:19.000000000 +0200 @@ -42,30 +42,30 @@ #define CG6_RAM_OFFSET 0x800000UL /* FHC definitions */ -#define CG6_FHC_FBID_SHIFT 24 -#define CG6_FHC_FBID_MASK 255 -#define CG6_FHC_REV_SHIFT 20 -#define CG6_FHC_REV_MASK 15 -#define CG6_FHC_FROP_DISABLE (1 << 19) -#define CG6_FHC_ROW_DISABLE (1 << 18) -#define CG6_FHC_SRC_DISABLE (1 << 17) -#define CG6_FHC_DST_DISABLE (1 << 16) -#define CG6_FHC_RESET (1 << 15) -#define CG6_FHC_LITTLE_ENDIAN (1 << 13) -#define CG6_FHC_RES_MASK (3 << 11) -#define CG6_FHC_1024 (0 << 11) -#define CG6_FHC_1152 (1 << 11) -#define CG6_FHC_1280 (2 << 11) -#define CG6_FHC_1600 (3 << 11) -#define CG6_FHC_CPU_MASK (3 << 9) -#define CG6_FHC_CPU_SPARC (0 << 9) -#define CG6_FHC_CPU_68020 (1 << 9) -#define CG6_FHC_CPU_386 (2 << 9) -#define CG6_FHC_TEST (1 << 8) -#define CG6_FHC_TEST_X_SHIFT 4 -#define CG6_FHC_TEST_X_MASK 15 -#define CG6_FHC_TEST_Y_SHIFT 0 -#define CG6_FHC_TEST_Y_MASK 15 +#define CG6_FHC_FBID_SHIFT 24 +#define CG6_FHC_FBID_MASK 255 +#define CG6_FHC_REV_SHIFT 20 +#define CG6_FHC_REV_MASK 15 +#define CG6_FHC_FROP_DISABLE (1 << 19) +#define CG6_FHC_ROW_DISABLE (1 << 18) +#define CG6_FHC_SRC_DISABLE (1 << 17) +#define CG6_FHC_DST_DISABLE (1 << 16) +#define CG6_FHC_RESET (1 << 15) +#define CG6_FHC_LITTLE_ENDIAN (1 << 13) +#define CG6_FHC_RES_MASK (3 << 11) +#define CG6_FHC_1024 (0 << 11) +#define CG6_FHC_1152 (1 << 11) +#define CG6_FHC_1280 (2 << 11) +#define CG6_FHC_1600 (3 << 11) +#define CG6_FHC_CPU_MASK (3 << 9) +#define CG6_FHC_CPU_SPARC (0 << 9) +#define CG6_FHC_CPU_68020 (1 << 9) +#define CG6_FHC_CPU_386 (2 << 9) +#define CG6_FHC_TEST (1 << 8) +#define CG6_FHC_TEST_X_SHIFT 4 +#define CG6_FHC_TEST_X_MASK 15 +#define CG6_FHC_TEST_Y_SHIFT 0 +#define CG6_FHC_TEST_Y_MASK 15 /* FBC mode definitions */ #define CG6_FBC_BLIT_IGNORE 0x00000000 @@ -116,17 +116,17 @@ #define CG6_FBC_INDEX_MASK 0x00000030 /* THC definitions */ -#define CG6_THC_MISC_REV_SHIFT 16 -#define CG6_THC_MISC_REV_MASK 15 -#define CG6_THC_MISC_RESET (1 << 12) -#define CG6_THC_MISC_VIDEO (1 << 10) -#define CG6_THC_MISC_SYNC (1 << 9) -#define CG6_THC_MISC_VSYNC (1 << 8) -#define CG6_THC_MISC_SYNC_ENAB (1 << 7) -#define CG6_THC_MISC_CURS_RES (1 << 6) -#define CG6_THC_MISC_INT_ENAB (1 << 5) -#define CG6_THC_MISC_INT (1 << 4) -#define CG6_THC_MISC_INIT 0x9f +#define CG6_THC_MISC_REV_SHIFT 16 +#define CG6_THC_MISC_REV_MASK 15 +#define CG6_THC_MISC_RESET (1 << 12) +#define CG6_THC_MISC_VIDEO (1 << 10) +#define CG6_THC_MISC_SYNC (1 << 9) +#define CG6_THC_MISC_VSYNC (1 << 8) +#define CG6_THC_MISC_SYNC_ENAB (1 << 7) +#define CG6_THC_MISC_CURS_RES (1 << 6) +#define CG6_THC_MISC_INT_ENAB (1 << 5) +#define CG6_THC_MISC_INT (1 << 4) +#define CG6_THC_MISC_INIT 0x9f MODULE_LICENSE("GPL"); @@ -138,7 +138,7 @@ }; struct cg6_thc { - uint thc_pad0[512]; + uint thc_pad0[512]; volatile uint thc_hs; /* hsync timing */ volatile uint thc_hsdvs; volatile uint thc_hd; @@ -156,7 +156,7 @@ u32 xxx0[1]; volatile u32 mode; volatile u32 clip; - u32 xxx1[1]; + u32 xxx1[1]; volatile u32 s; volatile u32 draw; volatile u32 blit; @@ -211,15 +211,15 @@ }; static struct sbus_mmap_map cg6_mmap_map[] = { - { CG6_FBC, CG6_FBC_OFFSET, PAGE_SIZE }, - { CG6_TEC, CG6_TEC_OFFSET, PAGE_SIZE }, - { CG6_BTREGS, CG6_BROOKTREE_OFFSET, PAGE_SIZE }, - { CG6_FHC, CG6_FHC_OFFSET, PAGE_SIZE }, - { CG6_THC, CG6_THC_OFFSET, PAGE_SIZE }, - { CG6_ROM, CG6_ROM_OFFSET, 0x10000 }, - { CG6_RAM, CG6_RAM_OFFSET, SBUS_MMAP_FBSIZE(1) }, - { CG6_DHC, CG6_DHC_OFFSET, 0x40000 }, - { 0, 0, 0 } + { CG6_FBC, CG6_FBC_OFFSET, PAGE_SIZE }, + { CG6_TEC, CG6_TEC_OFFSET, PAGE_SIZE }, + { CG6_BTREGS, CG6_BROOKTREE_OFFSET, PAGE_SIZE }, + { CG6_FHC, CG6_FHC_OFFSET, PAGE_SIZE }, + { CG6_THC, CG6_THC_OFFSET, PAGE_SIZE }, + { CG6_ROM, CG6_ROM_OFFSET, 0x10000 }, + { CG6_RAM, CG6_RAM_OFFSET, SBUS_MMAP_FBSIZE(1) }, + { CG6_DHC, CG6_DHC_OFFSET, 0x40000 }, + { 0, 0, 0 } }; static void cg6_setup(struct display *p) @@ -228,6 +228,54 @@ p->next_plane = 0; } +static void cg6_bmove(struct display *p, int sy, int sx, int dy, int dx, + int height, int width) +{ + struct fb_info_sbusfb *fb = (struct fb_info_sbusfb *)p->fb_info; + register struct cg6_fbc *fbc = fb->s.cg6.fbc; + int x1, y1, x2, y2, w, h; + unsigned long flags; + int i; + + if (fontheightlog(p)) { + y1 = sy << fontheightlog(p); y2 = dy << fontheightlog(p); h = height << fontheightlog(p); + } else { + y1 = sy * fontheight(p); y2 = dy * fontheight(p); h = height * fontheight(p); + } + if (fontwidthlog(p)) { + x1 = sx << fontwidthlog(p); x2 = dx << fontwidthlog(p); w = width << fontwidthlog(p); + } else { + x1 = sx * fontwidth(p); x2 = dx * fontwidth(p); w = width * fontwidth(p); + } + y1 += fb->y_margin; + y2 += fb->y_margin; + x1 += fb->x_margin; + x2 += fb->x_margin; + spin_lock_irqsave(&fb->lock, flags); + do { + i = sbus_readl(&fbc->s); + } while (i & 0x10000000); + sbus_writel(0xff, &fbc->fg); + sbus_writel(0x00, &fbc->bg); + sbus_writel(~0, &fbc->pixelm); + sbus_writel(0xe880cccc, &fbc->alu); + sbus_writel(0, &fbc->s); + sbus_writel(0, &fbc->clip); + + sbus_writel(y1, &fbc->y0); + sbus_writel(x1, &fbc->x0); + sbus_writel(y1 + h - 1, &fbc->y1); + sbus_writel(x1 + w - 1, &fbc->x1); + sbus_writel(y2, &fbc->y2); + sbus_writel(x2, &fbc->x2); + sbus_writel(y2 + h - 1, &fbc->y3); + sbus_writel(x2 + w - 1, &fbc->x3); + do { + i = sbus_readl(&fbc->blit); + } while (i < 0 && (i & 0x20000000)); + spin_unlock_irqrestore(&fb->lock, flags); +} + static void cg6_clear(struct vc_data *conp, struct display *p, int sy, int sx, int height, int width) { @@ -236,7 +284,7 @@ unsigned long flags; int x, y, w, h; int i; - + spin_lock_irqsave(&fb->lock, flags); do { i = sbus_readl(&fbc->s); @@ -249,7 +297,7 @@ sbus_writel(0, &fbc->clip); sbus_writel(~0, &fbc->pm); - if (fontheightlog(p)) { + if (fontheightlog(p)) { y = sy << fontheightlog(p); h = height << fontheightlog(p); } else { y = sy * fontheight(p); h = height * fontheight(p); @@ -275,7 +323,7 @@ int i; register struct cg6_fbc *fbc = fb->s.cg6.fbc; unsigned long flags; - + spin_lock_irqsave(&fb->lock, flags); do { i = sbus_readl(&fbc->s); @@ -422,7 +470,7 @@ u32 val = (((u32)*fd4++) | ((((u32)*fd3++) | ((((u32)*fd2++) | - (((u32)*fd1++) + (((u32)*fd1++) << fontwidth(p))) << fontwidth(p))) << fontwidth(p))) << @@ -493,7 +541,7 @@ struct bt_regs *bt = fb->s.cg6.bt; unsigned long flags; int i; - + spin_lock_irqsave(&fb->lock, flags); sbus_writel(index << 24, &bt->addr); for (i = index; count--; i++){ @@ -511,7 +559,7 @@ { struct bt_regs *bt = fb->s.cg6.bt; unsigned long flags; - + spin_lock_irqsave(&fb->lock, flags); sbus_writel(0, &bt->addr); sbus_writel(0xffffffff, &bt->color_map); @@ -522,19 +570,19 @@ static struct display_switch cg6_dispsw __initdata = { setup: cg6_setup, - bmove: fbcon_redraw_bmove, + bmove: cg6_bmove, clear: cg6_clear, putc: cg6_putc, putcs: cg6_putcs, - revc: cg6_revc, + revc: cg6_revc, fontwidthmask: FONTWIDTHRANGE(1,16) /* Allow fontwidths up to 16 */ }; static void cg6_setcursormap (struct fb_info_sbusfb *fb, u8 *red, u8 *green, u8 *blue) { - struct bt_regs *bt = fb->s.cg6.bt; + struct bt_regs *bt = fb->s.cg6.bt; unsigned long flags; - + spin_lock_irqsave(&fb->lock, flags); sbus_writel(1 << 24, &bt->addr); sbus_writel(red[0] << 24, &bt->cursor); @@ -614,7 +662,7 @@ unsigned long flags; u32 mode, tmp; int i; - + spin_lock_irqsave(&fb->lock, flags); /* Turn off stuff in the Transform Engine. */ @@ -679,7 +727,7 @@ struct fb_info_sbusfb *fb = sbusfbinfo(info); register struct cg6_fbc *fbc = fb->s.cg6.fbc; int i; - + do { i = sbus_readl(&fbc->s); } while (i & 0x10000000); @@ -705,11 +753,11 @@ fbops = kmalloc(sizeof(*fbops), GFP_KERNEL); if (fbops == NULL) return NULL; - + *fbops = *fb->info.fbops; fbops->fb_rasterimg = cg6_rasterimg; fb->info.fbops = fbops; - + if (prom_getbool (fb->prom_node, "dblbuf")) { type->fb_size *= 4; fix->smem_len *= 4; @@ -717,9 +765,9 @@ fix->line_length = fb->var.xres_virtual; fix->accel = FB_ACCEL_SUN_CGSIX; - + var->accel_flags = FB_ACCELF_TEXT; - + disp->scrollmode = SCROLL_YREDRAW; if (!disp->screen_base) { disp->screen_base = (char *) @@ -767,20 +815,20 @@ fb->blank = cg6_blank; fb->unblank = cg6_unblank; fb->reset = cg6_reset; - + fb->physbase = phys; fb->mmap_map = cg6_mmap_map; - + /* Initialize Brooktree DAC */ - sbus_writel(0x04 << 24, &bt->addr); /* color planes */ + sbus_writel(0x04 << 24, &bt->addr); /* color planes */ sbus_writel(0xff << 24, &bt->control); sbus_writel(0x05 << 24, &bt->addr); sbus_writel(0x00 << 24, &bt->control); - sbus_writel(0x06 << 24, &bt->addr); /* overlay plane */ + sbus_writel(0x06 << 24, &bt->addr); /* overlay plane */ sbus_writel(0x73 << 24, &bt->control); sbus_writel(0x07 << 24, &bt->addr); sbus_writel(0x00 << 24, &bt->control); - + conf = sbus_readl(fb->s.cg6.fhc); switch(conf & CG6_FHC_CPU_MASK) { case CG6_FHC_CPU_SPARC: p = "sparc"; break; @@ -801,13 +849,13 @@ cardtype = "GX+"; } } - - sprintf(idstring, + + sprintf(idstring, #ifdef __sparc_v9__ "cgsix at %016lx TEC Rev %x CPU %s Rev %x [%s]", phys, -#else +#else "cgsix at %x.%08lx TEC Rev %x CPU %s Rev %x [%s]", - fb->iospace, phys, + fb->iospace, phys, #endif ((sbus_readl(&fb->s.cg6.thc->thc_misc) >> CG6_THC_MISC_REV_SHIFT) & CG6_THC_MISC_REV_MASK), @@ -815,8 +863,8 @@ sprintf(fb->info.modename, "CGsix [%s]", cardtype); sprintf(fix->id, "CGsix [%s]", cardtype); - + cg6_reset(fb); - + return idstring; }