2 * linux/drivers/video/tgafb.c -- DEC 21030 TGA frame buffer device
4 * Copyright (C) 1995 Jay Estabrook
5 * Copyright (C) 1997 Geert Uytterhoeven
6 * Copyright (C) 1999,2000 Martin Lucina, Tom Zerucha
7 * Copyright (C) 2002 Richard Henderson
8 * Copyright (C) 2006, 2007 Maciej W. Rozycki
10 * This file is subject to the terms and conditions of the GNU General Public
11 * License. See the file COPYING in the main directory of this archive for
15 #include <linux/bitrev.h>
16 #include <linux/compiler.h>
17 #include <linux/delay.h>
18 #include <linux/device.h>
19 #include <linux/errno.h>
21 #include <linux/init.h>
22 #include <linux/ioport.h>
23 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/pci.h>
27 #include <linux/selection.h>
28 #include <linux/string.h>
33 #include <video/tgafb.h>
36 #define TGA_BUS_PCI(dev) (dev->bus == &pci_bus_type)
38 #define TGA_BUS_PCI(dev) 0
42 #define TGA_BUS_TC(dev) (dev->bus == &tc_bus_type)
44 #define TGA_BUS_TC(dev) 0
51 static int tgafb_check_var(struct fb_var_screeninfo
*, struct fb_info
*);
52 static int tgafb_set_par(struct fb_info
*);
53 static void tgafb_set_pll(struct tga_par
*, int);
54 static int tgafb_setcolreg(unsigned, unsigned, unsigned, unsigned,
55 unsigned, struct fb_info
*);
56 static int tgafb_blank(int, struct fb_info
*);
57 static void tgafb_init_fix(struct fb_info
*);
59 static void tgafb_imageblit(struct fb_info
*, const struct fb_image
*);
60 static void tgafb_fillrect(struct fb_info
*, const struct fb_fillrect
*);
61 static void tgafb_copyarea(struct fb_info
*, const struct fb_copyarea
*);
62 static int tgafb_pan_display(struct fb_var_screeninfo
*var
, struct fb_info
*info
);
64 static int __devinit
tgafb_register(struct device
*dev
);
65 static void __devexit
tgafb_unregister(struct device
*dev
);
67 static const char *mode_option
;
68 static const char *mode_option_pci
= "640x480@60";
69 static const char *mode_option_tc
= "1280x1024@72";
72 static struct pci_driver tgafb_pci_driver
;
73 static struct tc_driver tgafb_tc_driver
;
76 * Frame buffer operations
79 static struct fb_ops tgafb_ops
= {
81 .fb_check_var
= tgafb_check_var
,
82 .fb_set_par
= tgafb_set_par
,
83 .fb_setcolreg
= tgafb_setcolreg
,
84 .fb_blank
= tgafb_blank
,
85 .fb_pan_display
= tgafb_pan_display
,
86 .fb_fillrect
= tgafb_fillrect
,
87 .fb_copyarea
= tgafb_copyarea
,
88 .fb_imageblit
= tgafb_imageblit
,
94 * PCI registration operations
96 static int __devinit
tgafb_pci_register(struct pci_dev
*,
97 const struct pci_device_id
*);
98 static void __devexit
tgafb_pci_unregister(struct pci_dev
*);
100 static struct pci_device_id
const tgafb_pci_table
[] = {
101 { PCI_DEVICE(PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TGA
) },
104 MODULE_DEVICE_TABLE(pci
, tgafb_pci_table
);
106 static struct pci_driver tgafb_pci_driver
= {
108 .id_table
= tgafb_pci_table
,
109 .probe
= tgafb_pci_register
,
110 .remove
= __devexit_p(tgafb_pci_unregister
),
114 tgafb_pci_register(struct pci_dev
*pdev
, const struct pci_device_id
*ent
)
116 return tgafb_register(&pdev
->dev
);
119 static void __devexit
120 tgafb_pci_unregister(struct pci_dev
*pdev
)
122 tgafb_unregister(&pdev
->dev
);
124 #endif /* CONFIG_PCI */
128 * TC registration operations
130 static int __devinit
tgafb_tc_register(struct device
*);
131 static int __devexit
tgafb_tc_unregister(struct device
*);
133 static struct tc_device_id
const tgafb_tc_table
[] = {
134 { "DEC ", "PMAGD-AA" },
135 { "DEC ", "PMAGD " },
138 MODULE_DEVICE_TABLE(tc
, tgafb_tc_table
);
140 static struct tc_driver tgafb_tc_driver
= {
141 .id_table
= tgafb_tc_table
,
145 .probe
= tgafb_tc_register
,
146 .remove
= __devexit_p(tgafb_tc_unregister
),
151 tgafb_tc_register(struct device
*dev
)
153 int status
= tgafb_register(dev
);
160 tgafb_tc_unregister(struct device
*dev
)
163 tgafb_unregister(dev
);
166 #endif /* CONFIG_TC */
170 * tgafb_check_var - Optional function. Validates a var passed in.
171 * @var: frame buffer variable screen structure
172 * @info: frame buffer structure that represents a single frame buffer
175 tgafb_check_var(struct fb_var_screeninfo
*var
, struct fb_info
*info
)
177 struct tga_par
*par
= (struct tga_par
*)info
->par
;
179 if (par
->tga_type
== TGA_TYPE_8PLANE
) {
180 if (var
->bits_per_pixel
!= 8)
183 if (var
->bits_per_pixel
!= 32)
186 var
->red
.length
= var
->green
.length
= var
->blue
.length
= 8;
187 if (var
->bits_per_pixel
== 32) {
188 var
->red
.offset
= 16;
189 var
->green
.offset
= 8;
190 var
->blue
.offset
= 0;
193 if (var
->xres_virtual
!= var
->xres
|| var
->yres_virtual
!= var
->yres
)
197 if (1000000000 / var
->pixclock
> TGA_PLL_MAX_FREQ
)
199 if ((var
->vmode
& FB_VMODE_MASK
) != FB_VMODE_NONINTERLACED
)
202 /* Some of the acceleration routines assume the line width is
203 a multiple of 64 bytes. */
204 if (var
->xres
* (par
->tga_type
== TGA_TYPE_8PLANE
? 1 : 4) % 64)
211 * tgafb_set_par - Optional function. Alters the hardware state.
212 * @info: frame buffer structure that represents a single frame buffer
215 tgafb_set_par(struct fb_info
*info
)
217 static unsigned int const deep_presets
[4] = {
223 static unsigned int const rasterop_presets
[4] = {
229 static unsigned int const mode_presets
[4] = {
235 static unsigned int const base_addr_presets
[4] = {
242 struct tga_par
*par
= (struct tga_par
*) info
->par
;
243 int tga_bus_pci
= TGA_BUS_PCI(par
->dev
);
244 int tga_bus_tc
= TGA_BUS_TC(par
->dev
);
245 u32 htimings
, vtimings
, pll_freq
;
249 /* Encode video timings. */
250 htimings
= (((info
->var
.xres
/4) & TGA_HORIZ_ACT_LSB
)
251 | (((info
->var
.xres
/4) & 0x600 << 19) & TGA_HORIZ_ACT_MSB
));
252 vtimings
= (info
->var
.yres
& TGA_VERT_ACTIVE
);
253 htimings
|= ((info
->var
.right_margin
/4) << 9) & TGA_HORIZ_FP
;
254 vtimings
|= (info
->var
.lower_margin
<< 11) & TGA_VERT_FP
;
255 htimings
|= ((info
->var
.hsync_len
/4) << 14) & TGA_HORIZ_SYNC
;
256 vtimings
|= (info
->var
.vsync_len
<< 16) & TGA_VERT_SYNC
;
257 htimings
|= ((info
->var
.left_margin
/4) << 21) & TGA_HORIZ_BP
;
258 vtimings
|= (info
->var
.upper_margin
<< 22) & TGA_VERT_BP
;
260 if (info
->var
.sync
& FB_SYNC_HOR_HIGH_ACT
)
261 htimings
|= TGA_HORIZ_POLARITY
;
262 if (info
->var
.sync
& FB_SYNC_VERT_HIGH_ACT
)
263 vtimings
|= TGA_VERT_POLARITY
;
265 par
->htimings
= htimings
;
266 par
->vtimings
= vtimings
;
268 par
->sync_on_green
= !!(info
->var
.sync
& FB_SYNC_ON_GREEN
);
270 /* Store other useful values in par. */
271 par
->xres
= info
->var
.xres
;
272 par
->yres
= info
->var
.yres
;
273 par
->pll_freq
= pll_freq
= 1000000000 / info
->var
.pixclock
;
274 par
->bits_per_pixel
= info
->var
.bits_per_pixel
;
276 tga_type
= par
->tga_type
;
278 /* First, disable video. */
279 TGA_WRITE_REG(par
, TGA_VALID_VIDEO
| TGA_VALID_BLANK
, TGA_VALID_REG
);
281 /* Write the DEEP register. */
282 while (TGA_READ_REG(par
, TGA_CMD_STAT_REG
) & 1) /* wait for not busy */
285 TGA_WRITE_REG(par
, deep_presets
[tga_type
] |
286 (par
->sync_on_green
? 0x0 : 0x00010000),
288 while (TGA_READ_REG(par
, TGA_CMD_STAT_REG
) & 1) /* wait for not busy */
292 /* Write some more registers. */
293 TGA_WRITE_REG(par
, rasterop_presets
[tga_type
], TGA_RASTEROP_REG
);
294 TGA_WRITE_REG(par
, mode_presets
[tga_type
], TGA_MODE_REG
);
295 TGA_WRITE_REG(par
, base_addr_presets
[tga_type
], TGA_BASE_ADDR_REG
);
297 /* Calculate & write the PLL. */
298 tgafb_set_pll(par
, pll_freq
);
300 /* Write some more registers. */
301 TGA_WRITE_REG(par
, 0xffffffff, TGA_PLANEMASK_REG
);
302 TGA_WRITE_REG(par
, 0xffffffff, TGA_PIXELMASK_REG
);
304 /* Init video timing regs. */
305 TGA_WRITE_REG(par
, htimings
, TGA_HORIZ_REG
);
306 TGA_WRITE_REG(par
, vtimings
, TGA_VERT_REG
);
308 /* Initalise RAMDAC. */
309 if (tga_type
== TGA_TYPE_8PLANE
&& tga_bus_pci
) {
311 /* Init BT485 RAMDAC registers. */
312 BT485_WRITE(par
, 0xa2 | (par
->sync_on_green
? 0x8 : 0x0),
314 BT485_WRITE(par
, 0x01, BT485_ADDR_PAL_WRITE
);
315 BT485_WRITE(par
, 0x14, BT485_CMD_3
); /* cursor 64x64 */
316 BT485_WRITE(par
, 0x40, BT485_CMD_1
);
317 BT485_WRITE(par
, 0x20, BT485_CMD_2
); /* cursor off, for now */
318 BT485_WRITE(par
, 0xff, BT485_PIXEL_MASK
);
320 /* Fill palette registers. */
321 BT485_WRITE(par
, 0x00, BT485_ADDR_PAL_WRITE
);
322 TGA_WRITE_REG(par
, BT485_DATA_PAL
, TGA_RAMDAC_SETUP_REG
);
324 for (i
= 0; i
< 256 * 3; i
+= 4) {
325 TGA_WRITE_REG(par
, 0x55 | (BT485_DATA_PAL
<< 8),
327 TGA_WRITE_REG(par
, 0x00 | (BT485_DATA_PAL
<< 8),
329 TGA_WRITE_REG(par
, 0x00 | (BT485_DATA_PAL
<< 8),
331 TGA_WRITE_REG(par
, 0x00 | (BT485_DATA_PAL
<< 8),
335 } else if (tga_type
== TGA_TYPE_8PLANE
&& tga_bus_tc
) {
337 /* Init BT459 RAMDAC registers. */
338 BT459_WRITE(par
, BT459_REG_ACC
, BT459_CMD_REG_0
, 0x40);
339 BT459_WRITE(par
, BT459_REG_ACC
, BT459_CMD_REG_1
, 0x00);
340 BT459_WRITE(par
, BT459_REG_ACC
, BT459_CMD_REG_2
,
341 (par
->sync_on_green
? 0xc0 : 0x40));
343 BT459_WRITE(par
, BT459_REG_ACC
, BT459_CUR_CMD_REG
, 0x00);
345 /* Fill the palette. */
346 BT459_LOAD_ADDR(par
, 0x0000);
347 TGA_WRITE_REG(par
, BT459_PALETTE
<< 2, TGA_RAMDAC_SETUP_REG
);
349 for (i
= 0; i
< 256 * 3; i
+= 4) {
350 TGA_WRITE_REG(par
, 0x55, TGA_RAMDAC_REG
);
351 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
352 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
353 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
356 } else { /* 24-plane or 24plusZ */
358 /* Init BT463 RAMDAC registers. */
359 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_0
, 0x40);
360 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_1
, 0x08);
361 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_2
,
362 (par
->sync_on_green
? 0xc0 : 0x40));
364 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_0
, 0xff);
365 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_1
, 0xff);
366 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_2
, 0xff);
367 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_3
, 0x0f);
369 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_0
, 0x00);
370 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_1
, 0x00);
371 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_2
, 0x00);
372 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_3
, 0x00);
374 /* Fill the palette. */
375 BT463_LOAD_ADDR(par
, 0x0000);
376 TGA_WRITE_REG(par
, BT463_PALETTE
<< 2, TGA_RAMDAC_SETUP_REG
);
378 #ifdef CONFIG_HW_CONSOLE
379 for (i
= 0; i
< 16; i
++) {
380 int j
= color_table
[i
];
382 TGA_WRITE_REG(par
, default_red
[j
], TGA_RAMDAC_REG
);
383 TGA_WRITE_REG(par
, default_grn
[j
], TGA_RAMDAC_REG
);
384 TGA_WRITE_REG(par
, default_blu
[j
], TGA_RAMDAC_REG
);
386 for (i
= 0; i
< 512 * 3; i
+= 4) {
388 for (i
= 0; i
< 528 * 3; i
+= 4) {
390 TGA_WRITE_REG(par
, 0x55, TGA_RAMDAC_REG
);
391 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
392 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
393 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
396 /* Fill window type table after start of vertical retrace. */
397 while (!(TGA_READ_REG(par
, TGA_INTR_STAT_REG
) & 0x01))
399 TGA_WRITE_REG(par
, 0x01, TGA_INTR_STAT_REG
);
401 while (!(TGA_READ_REG(par
, TGA_INTR_STAT_REG
) & 0x01))
403 TGA_WRITE_REG(par
, 0x01, TGA_INTR_STAT_REG
);
405 BT463_LOAD_ADDR(par
, BT463_WINDOW_TYPE_BASE
);
406 TGA_WRITE_REG(par
, BT463_REG_ACC
<< 2, TGA_RAMDAC_SETUP_REG
);
408 for (i
= 0; i
< 16; i
++) {
409 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
410 TGA_WRITE_REG(par
, 0x01, TGA_RAMDAC_REG
);
411 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
416 /* Finally, enable video scan (and pray for the monitor... :-) */
417 TGA_WRITE_REG(par
, TGA_VALID_VIDEO
, TGA_VALID_REG
);
422 #define DIFFCHECK(X) \
425 int delta = f - (TGA_PLL_BASE_FREQ * (X)) / (r << shift); \
428 if (delta < min_diff) \
429 min_diff = delta, vm = m, va = a, vr = r; \
434 tgafb_set_pll(struct tga_par
*par
, int f
)
436 int n
, shift
, base
, min_diff
, target
;
437 int r
,a
,m
,vm
= 34, va
= 1, vr
= 30;
439 for (r
= 0 ; r
< 12 ; r
++)
440 TGA_WRITE_REG(par
, !r
, TGA_CLOCK_REG
);
442 if (f
> TGA_PLL_MAX_FREQ
)
443 f
= TGA_PLL_MAX_FREQ
;
445 if (f
>= TGA_PLL_MAX_FREQ
/ 2)
447 else if (f
>= TGA_PLL_MAX_FREQ
/ 4)
452 TGA_WRITE_REG(par
, shift
& 1, TGA_CLOCK_REG
);
453 TGA_WRITE_REG(par
, shift
>> 1, TGA_CLOCK_REG
);
455 for (r
= 0 ; r
< 10 ; r
++)
456 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
459 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
460 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
462 else if (f
<= 200000) {
463 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
464 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
467 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
468 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
471 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
472 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
473 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
474 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
475 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
476 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
478 target
= (f
<< shift
) / TGA_PLL_BASE_FREQ
;
479 min_diff
= TGA_PLL_MAX_FREQ
;
486 for (n
= base
< 7 ? 7 : base
; n
< base
+ target
&& n
< 449; n
++) {
487 m
= ((n
+ 3) / 7) - 1;
489 DIFFCHECK((m
+ 1) * 7);
491 DIFFCHECK((m
+ 1) * 7);
502 for (r
= 0; r
< 8; r
++)
503 TGA_WRITE_REG(par
, (vm
>> r
) & 1, TGA_CLOCK_REG
);
504 for (r
= 0; r
< 8 ; r
++)
505 TGA_WRITE_REG(par
, (va
>> r
) & 1, TGA_CLOCK_REG
);
506 for (r
= 0; r
< 7 ; r
++)
507 TGA_WRITE_REG(par
, (vr
>> r
) & 1, TGA_CLOCK_REG
);
508 TGA_WRITE_REG(par
, ((vr
>> 7) & 1)|2, TGA_CLOCK_REG
);
513 * tgafb_setcolreg - Optional function. Sets a color register.
514 * @regno: boolean, 0 copy local, 1 get_user() function
515 * @red: frame buffer colormap structure
516 * @green: The green value which can be up to 16 bits wide
517 * @blue: The blue value which can be up to 16 bits wide.
518 * @transp: If supported the alpha value which can be up to 16 bits wide.
519 * @info: frame buffer info structure
522 tgafb_setcolreg(unsigned regno
, unsigned red
, unsigned green
, unsigned blue
,
523 unsigned transp
, struct fb_info
*info
)
525 struct tga_par
*par
= (struct tga_par
*) info
->par
;
526 int tga_bus_pci
= TGA_BUS_PCI(par
->dev
);
527 int tga_bus_tc
= TGA_BUS_TC(par
->dev
);
535 if (par
->tga_type
== TGA_TYPE_8PLANE
&& tga_bus_pci
) {
536 BT485_WRITE(par
, regno
, BT485_ADDR_PAL_WRITE
);
537 TGA_WRITE_REG(par
, BT485_DATA_PAL
, TGA_RAMDAC_SETUP_REG
);
538 TGA_WRITE_REG(par
, red
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
539 TGA_WRITE_REG(par
, green
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
540 TGA_WRITE_REG(par
, blue
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
541 } else if (par
->tga_type
== TGA_TYPE_8PLANE
&& tga_bus_tc
) {
542 BT459_LOAD_ADDR(par
, regno
);
543 TGA_WRITE_REG(par
, BT459_PALETTE
<< 2, TGA_RAMDAC_SETUP_REG
);
544 TGA_WRITE_REG(par
, red
, TGA_RAMDAC_REG
);
545 TGA_WRITE_REG(par
, green
, TGA_RAMDAC_REG
);
546 TGA_WRITE_REG(par
, blue
, TGA_RAMDAC_REG
);
549 u32 value
= (regno
<< 16) | (regno
<< 8) | regno
;
550 ((u32
*)info
->pseudo_palette
)[regno
] = value
;
552 BT463_LOAD_ADDR(par
, regno
);
553 TGA_WRITE_REG(par
, BT463_PALETTE
<< 2, TGA_RAMDAC_SETUP_REG
);
554 TGA_WRITE_REG(par
, red
, TGA_RAMDAC_REG
);
555 TGA_WRITE_REG(par
, green
, TGA_RAMDAC_REG
);
556 TGA_WRITE_REG(par
, blue
, TGA_RAMDAC_REG
);
564 * tgafb_blank - Optional function. Blanks the display.
565 * @blank_mode: the blank mode we want.
566 * @info: frame buffer structure that represents a single frame buffer
569 tgafb_blank(int blank
, struct fb_info
*info
)
571 struct tga_par
*par
= (struct tga_par
*) info
->par
;
572 u32 vhcr
, vvcr
, vvvr
;
575 local_irq_save(flags
);
577 vhcr
= TGA_READ_REG(par
, TGA_HORIZ_REG
);
578 vvcr
= TGA_READ_REG(par
, TGA_VERT_REG
);
579 vvvr
= TGA_READ_REG(par
, TGA_VALID_REG
);
580 vvvr
&= ~(TGA_VALID_VIDEO
| TGA_VALID_BLANK
);
583 case FB_BLANK_UNBLANK
: /* Unblanking */
584 if (par
->vesa_blanked
) {
585 TGA_WRITE_REG(par
, vhcr
& 0xbfffffff, TGA_HORIZ_REG
);
586 TGA_WRITE_REG(par
, vvcr
& 0xbfffffff, TGA_VERT_REG
);
587 par
->vesa_blanked
= 0;
589 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_VIDEO
, TGA_VALID_REG
);
592 case FB_BLANK_NORMAL
: /* Normal blanking */
593 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_VIDEO
| TGA_VALID_BLANK
,
597 case FB_BLANK_VSYNC_SUSPEND
: /* VESA blank (vsync off) */
598 TGA_WRITE_REG(par
, vvcr
| 0x40000000, TGA_VERT_REG
);
599 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
600 par
->vesa_blanked
= 1;
603 case FB_BLANK_HSYNC_SUSPEND
: /* VESA blank (hsync off) */
604 TGA_WRITE_REG(par
, vhcr
| 0x40000000, TGA_HORIZ_REG
);
605 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
606 par
->vesa_blanked
= 1;
609 case FB_BLANK_POWERDOWN
: /* Poweroff */
610 TGA_WRITE_REG(par
, vhcr
| 0x40000000, TGA_HORIZ_REG
);
611 TGA_WRITE_REG(par
, vvcr
| 0x40000000, TGA_VERT_REG
);
612 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
613 par
->vesa_blanked
= 1;
617 local_irq_restore(flags
);
627 tgafb_mono_imageblit(struct fb_info
*info
, const struct fb_image
*image
)
629 struct tga_par
*par
= (struct tga_par
*) info
->par
;
630 u32 fgcolor
, bgcolor
, dx
, dy
, width
, height
, vxres
, vyres
, pixelmask
;
631 unsigned long rincr
, line_length
, shift
, pos
, is8bpp
;
633 const unsigned char *data
;
634 void __iomem
*regs_base
;
635 void __iomem
*fb_base
;
637 is8bpp
= info
->var
.bits_per_pixel
== 8;
641 width
= image
->width
;
642 height
= image
->height
;
643 vxres
= info
->var
.xres_virtual
;
644 vyres
= info
->var
.yres_virtual
;
645 line_length
= info
->fix
.line_length
;
646 rincr
= (width
+ 7) / 8;
648 /* A shift below cannot cope with. */
649 if (unlikely(width
== 0))
651 /* Crop the image to the screen. */
652 if (dx
> vxres
|| dy
> vyres
)
654 if (dx
+ width
> vxres
)
656 if (dy
+ height
> vyres
)
659 regs_base
= par
->tga_regs_base
;
660 fb_base
= par
->tga_fb_base
;
662 /* Expand the color values to fill 32-bits. */
663 /* ??? Would be nice to notice colour changes elsewhere, so
664 that we can do this only when necessary. */
665 fgcolor
= image
->fg_color
;
666 bgcolor
= image
->bg_color
;
668 fgcolor
|= fgcolor
<< 8;
669 fgcolor
|= fgcolor
<< 16;
670 bgcolor
|= bgcolor
<< 8;
671 bgcolor
|= bgcolor
<< 16;
674 fgcolor
= ((u32
*)info
->pseudo_palette
)[fgcolor
];
676 bgcolor
= ((u32
*)info
->pseudo_palette
)[bgcolor
];
678 __raw_writel(fgcolor
, regs_base
+ TGA_FOREGROUND_REG
);
679 __raw_writel(bgcolor
, regs_base
+ TGA_BACKGROUND_REG
);
681 /* Acquire proper alignment; set up the PIXELMASK register
682 so that we only write the proper character cell. */
683 pos
= dy
* line_length
;
690 shift
= (pos
& 7) >> 2;
694 data
= (const unsigned char *) image
->data
;
696 /* Enable opaque stipple mode. */
698 ? TGA_MODE_SBM_8BPP
| TGA_MODE_OPAQUE_STIPPLE
699 : TGA_MODE_SBM_24BPP
| TGA_MODE_OPAQUE_STIPPLE
),
700 regs_base
+ TGA_MODE_REG
);
702 if (width
+ shift
<= 32) {
703 unsigned long bwidth
;
705 /* Handle common case of imaging a single character, in
706 a font less than or 32 pixels wide. */
708 /* Avoid a shift by 32; width > 0 implied. */
709 pixelmask
= (2ul << (width
- 1)) - 1;
711 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
714 bwidth
= (width
+ 7) / 8;
716 for (i
= 0; i
< height
; ++i
) {
719 /* The image data is bit big endian; we need
721 for (j
= 0; j
< bwidth
; ++j
)
722 mask
|= bitrev8(data
[j
]) << (j
* 8);
724 __raw_writel(mask
<< shift
, fb_base
+ pos
);
730 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
731 } else if (shift
== 0) {
732 unsigned long pos0
= pos
;
733 const unsigned char *data0
= data
;
734 unsigned long bincr
= (is8bpp
? 8 : 8*4);
735 unsigned long bwidth
;
737 /* Handle another common case in which accel_putcs
738 generates a large bitmap, which happens to be aligned.
739 Allow the tail to be misaligned. This case is
740 interesting because we've not got to hold partial
741 bytes across the words being written. */
745 bwidth
= (width
/ 8) & -4;
746 for (i
= 0; i
< height
; ++i
) {
747 for (j
= 0; j
< bwidth
; j
+= 4) {
749 mask
|= bitrev8(data
[j
+0]) << (0 * 8);
750 mask
|= bitrev8(data
[j
+1]) << (1 * 8);
751 mask
|= bitrev8(data
[j
+2]) << (2 * 8);
752 mask
|= bitrev8(data
[j
+3]) << (3 * 8);
753 __raw_writel(mask
, fb_base
+ pos
+ j
*bincr
);
760 pixelmask
= (1ul << (width
& 31)) - 1;
762 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
765 pos
= pos0
+ bwidth
*bincr
;
766 data
= data0
+ bwidth
;
767 bwidth
= ((width
& 31) + 7) / 8;
769 for (i
= 0; i
< height
; ++i
) {
771 for (j
= 0; j
< bwidth
; ++j
)
772 mask
|= bitrev8(data
[j
]) << (j
* 8);
773 __raw_writel(mask
, fb_base
+ pos
);
778 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
781 unsigned long pos0
= pos
;
782 const unsigned char *data0
= data
;
783 unsigned long bincr
= (is8bpp
? 8 : 8*4);
784 unsigned long bwidth
;
786 /* Finally, handle the generic case of misaligned start.
787 Here we split the write into 16-bit spans. This allows
788 us to use only one pixel mask, instead of four as would
789 be required by writing 24-bit spans. */
791 pixelmask
= 0xffff << shift
;
792 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
795 bwidth
= (width
/ 8) & -2;
796 for (i
= 0; i
< height
; ++i
) {
797 for (j
= 0; j
< bwidth
; j
+= 2) {
799 mask
|= bitrev8(data
[j
+0]) << (0 * 8);
800 mask
|= bitrev8(data
[j
+1]) << (1 * 8);
802 __raw_writel(mask
, fb_base
+ pos
+ j
*bincr
);
809 pixelmask
= ((1ul << (width
& 15)) - 1) << shift
;
811 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
814 pos
= pos0
+ bwidth
*bincr
;
815 data
= data0
+ bwidth
;
816 bwidth
= (width
& 15) > 8;
818 for (i
= 0; i
< height
; ++i
) {
819 u32 mask
= bitrev8(data
[0]);
821 mask
|= bitrev8(data
[1]) << 8;
823 __raw_writel(mask
, fb_base
+ pos
);
829 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
832 /* Disable opaque stipple mode. */
834 ? TGA_MODE_SBM_8BPP
| TGA_MODE_SIMPLE
835 : TGA_MODE_SBM_24BPP
| TGA_MODE_SIMPLE
),
836 regs_base
+ TGA_MODE_REG
);
840 tgafb_clut_imageblit(struct fb_info
*info
, const struct fb_image
*image
)
842 struct tga_par
*par
= (struct tga_par
*) info
->par
;
843 u32 color
, dx
, dy
, width
, height
, vxres
, vyres
;
844 u32
*palette
= ((u32
*)info
->pseudo_palette
);
845 unsigned long pos
, line_length
, i
, j
;
846 const unsigned char *data
;
847 void __iomem
*regs_base
, *fb_base
;
851 width
= image
->width
;
852 height
= image
->height
;
853 vxres
= info
->var
.xres_virtual
;
854 vyres
= info
->var
.yres_virtual
;
855 line_length
= info
->fix
.line_length
;
857 /* Crop the image to the screen. */
858 if (dx
> vxres
|| dy
> vyres
)
860 if (dx
+ width
> vxres
)
862 if (dy
+ height
> vyres
)
865 regs_base
= par
->tga_regs_base
;
866 fb_base
= par
->tga_fb_base
;
868 pos
= dy
* line_length
+ (dx
* 4);
871 /* Now copy the image, color_expanding via the palette. */
872 for (i
= 0; i
< height
; i
++) {
873 for (j
= 0; j
< width
; j
++) {
874 color
= palette
[*data
++];
875 __raw_writel(color
, fb_base
+ pos
+ j
*4);
882 * tgafb_imageblit - REQUIRED function. Can use generic routines if
883 * non acclerated hardware and packed pixel based.
884 * Copies a image from system memory to the screen.
886 * @info: frame buffer structure that represents a single frame buffer
887 * @image: structure defining the image.
890 tgafb_imageblit(struct fb_info
*info
, const struct fb_image
*image
)
892 unsigned int is8bpp
= info
->var
.bits_per_pixel
== 8;
894 /* If a mono image, regardless of FB depth, go do it. */
895 if (image
->depth
== 1) {
896 tgafb_mono_imageblit(info
, image
);
900 /* For copies that aren't pixel expansion, there's little we
901 can do better than the generic code. */
902 /* ??? There is a DMA write mode; I wonder if that could be
903 made to pull the data from the image buffer... */
904 if (image
->depth
== info
->var
.bits_per_pixel
) {
905 cfb_imageblit(info
, image
);
909 /* If 24-plane FB and the image is 8-plane with CLUT, we can do it. */
910 if (!is8bpp
&& image
->depth
== 8) {
911 tgafb_clut_imageblit(info
, image
);
915 /* Silently return... */
919 * tgafb_fillrect - REQUIRED function. Can use generic routines if
920 * non acclerated hardware and packed pixel based.
921 * Draws a rectangle on the screen.
923 * @info: frame buffer structure that represents a single frame buffer
924 * @rect: structure defining the rectagle and operation.
927 tgafb_fillrect(struct fb_info
*info
, const struct fb_fillrect
*rect
)
929 struct tga_par
*par
= (struct tga_par
*) info
->par
;
930 int is8bpp
= info
->var
.bits_per_pixel
== 8;
931 u32 dx
, dy
, width
, height
, vxres
, vyres
, color
;
932 unsigned long pos
, align
, line_length
, i
, j
;
933 void __iomem
*regs_base
;
934 void __iomem
*fb_base
;
939 height
= rect
->height
;
940 vxres
= info
->var
.xres_virtual
;
941 vyres
= info
->var
.yres_virtual
;
942 line_length
= info
->fix
.line_length
;
943 regs_base
= par
->tga_regs_base
;
944 fb_base
= par
->tga_fb_base
;
946 /* Crop the rectangle to the screen. */
947 if (dx
> vxres
|| dy
> vyres
|| !width
|| !height
)
949 if (dx
+ width
> vxres
)
951 if (dy
+ height
> vyres
)
954 pos
= dy
* line_length
+ dx
* (is8bpp
? 1 : 4);
956 /* ??? We could implement ROP_XOR with opaque fill mode
957 and a RasterOp setting of GXxor, but as far as I can
958 tell, this mode is not actually used in the kernel.
959 Thus I am ignoring it for now. */
960 if (rect
->rop
!= ROP_COPY
) {
961 cfb_fillrect(info
, rect
);
965 /* Expand the color value to fill 8 pixels. */
969 color
|= color
<< 16;
970 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR0_REG
);
971 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR1_REG
);
974 color
= ((u32
*)info
->pseudo_palette
)[color
];
975 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR0_REG
);
976 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR1_REG
);
977 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR2_REG
);
978 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR3_REG
);
979 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR4_REG
);
980 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR5_REG
);
981 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR6_REG
);
982 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR7_REG
);
985 /* The DATA register holds the fill mask for block fill mode.
986 Since we're not stippling, this is all ones. */
987 __raw_writel(0xffffffff, regs_base
+ TGA_DATA_REG
);
989 /* Enable block fill mode. */
991 ? TGA_MODE_SBM_8BPP
| TGA_MODE_BLOCK_FILL
992 : TGA_MODE_SBM_24BPP
| TGA_MODE_BLOCK_FILL
),
993 regs_base
+ TGA_MODE_REG
);
996 /* We can fill 2k pixels per operation. Notice blocks that fit
997 the width of the screen so that we can take advantage of this
998 and fill more than one line per write. */
999 if (width
== line_length
)
1000 width
*= height
, height
= 1;
1002 /* The write into the frame buffer must be aligned to 4 bytes,
1003 but we are allowed to encode the offset within the word in
1004 the data word written. */
1005 align
= (pos
& 3) << 16;
1008 if (width
<= 2048) {
1011 data
= (width
- 1) | align
;
1013 for (i
= 0; i
< height
; ++i
) {
1014 __raw_writel(data
, fb_base
+ pos
);
1018 unsigned long Bpp
= (is8bpp
? 1 : 4);
1019 unsigned long nwidth
= width
& -2048;
1022 fdata
= (2048 - 1) | align
;
1023 ldata
= ((width
& 2047) - 1) | align
;
1025 for (i
= 0; i
< height
; ++i
) {
1026 for (j
= 0; j
< nwidth
; j
+= 2048)
1027 __raw_writel(fdata
, fb_base
+ pos
+ j
*Bpp
);
1029 __raw_writel(ldata
, fb_base
+ pos
+ j
*Bpp
);
1035 /* Disable block fill mode. */
1036 __raw_writel((is8bpp
1037 ? TGA_MODE_SBM_8BPP
| TGA_MODE_SIMPLE
1038 : TGA_MODE_SBM_24BPP
| TGA_MODE_SIMPLE
),
1039 regs_base
+ TGA_MODE_REG
);
1043 * tgafb_copyarea - REQUIRED function. Can use generic routines if
1044 * non acclerated hardware and packed pixel based.
1045 * Copies on area of the screen to another area.
1047 * @info: frame buffer structure that represents a single frame buffer
1048 * @area: structure defining the source and destination.
1051 /* Handle the special case of copying entire lines, e.g. during scrolling.
1052 We can avoid a lot of needless computation in this case. In the 8bpp
1053 case we need to use the COPY64 registers instead of mask writes into
1054 the frame buffer to achieve maximum performance. */
1057 copyarea_line_8bpp(struct fb_info
*info
, u32 dy
, u32 sy
,
1058 u32 height
, u32 width
)
1060 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1061 void __iomem
*tga_regs
= par
->tga_regs_base
;
1062 unsigned long dpos
, spos
, i
, n64
;
1064 /* Set up the MODE and PIXELSHIFT registers. */
1065 __raw_writel(TGA_MODE_SBM_8BPP
| TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1066 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
1069 n64
= (height
* width
) / 64;
1072 spos
= (sy
+ height
) * width
;
1073 dpos
= (dy
+ height
) * width
;
1075 for (i
= 0; i
< n64
; ++i
) {
1078 __raw_writel(spos
, tga_regs
+TGA_COPY64_SRC
);
1080 __raw_writel(dpos
, tga_regs
+TGA_COPY64_DST
);
1087 for (i
= 0; i
< n64
; ++i
) {
1088 __raw_writel(spos
, tga_regs
+TGA_COPY64_SRC
);
1090 __raw_writel(dpos
, tga_regs
+TGA_COPY64_DST
);
1097 /* Reset the MODE register to normal. */
1098 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1102 copyarea_line_32bpp(struct fb_info
*info
, u32 dy
, u32 sy
,
1103 u32 height
, u32 width
)
1105 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1106 void __iomem
*tga_regs
= par
->tga_regs_base
;
1107 void __iomem
*tga_fb
= par
->tga_fb_base
;
1110 unsigned long i
, n16
;
1112 /* Set up the MODE and PIXELSHIFT registers. */
1113 __raw_writel(TGA_MODE_SBM_24BPP
| TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1114 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
1117 n16
= (height
* width
) / 16;
1120 src
= tga_fb
+ (sy
+ height
) * width
* 4;
1121 dst
= tga_fb
+ (dy
+ height
) * width
* 4;
1123 for (i
= 0; i
< n16
; ++i
) {
1126 __raw_writel(0xffff, src
);
1128 __raw_writel(0xffff, dst
);
1132 src
= tga_fb
+ sy
* width
* 4;
1133 dst
= tga_fb
+ dy
* width
* 4;
1135 for (i
= 0; i
< n16
; ++i
) {
1136 __raw_writel(0xffff, src
);
1138 __raw_writel(0xffff, dst
);
1145 /* Reset the MODE register to normal. */
1146 __raw_writel(TGA_MODE_SBM_24BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1149 /* The general case of forward copy in 8bpp mode. */
1151 copyarea_foreward_8bpp(struct fb_info
*info
, u32 dx
, u32 dy
, u32 sx
, u32 sy
,
1152 u32 height
, u32 width
, u32 line_length
)
1154 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1155 unsigned long i
, copied
, left
;
1156 unsigned long dpos
, spos
, dalign
, salign
, yincr
;
1157 u32 smask_first
, dmask_first
, dmask_last
;
1158 int pixel_shift
, need_prime
, need_second
;
1159 unsigned long n64
, n32
, xincr_first
;
1160 void __iomem
*tga_regs
;
1161 void __iomem
*tga_fb
;
1163 yincr
= line_length
;
1170 /* Compute the offsets and alignments in the frame buffer.
1171 More than anything else, these control how we do copies. */
1172 dpos
= dy
* line_length
+ dx
;
1173 spos
= sy
* line_length
+ sx
;
1179 /* Compute the value for the PIXELSHIFT register. This controls
1180 both non-co-aligned source and destination and copy direction. */
1181 if (dalign
>= salign
)
1182 pixel_shift
= dalign
- salign
;
1184 pixel_shift
= 8 - (salign
- dalign
);
1186 /* Figure out if we need an additional priming step for the
1187 residue register. */
1188 need_prime
= (salign
> dalign
);
1192 /* Begin by copying the leading unaligned destination. Copy enough
1193 to make the next destination address 32-byte aligned. */
1194 copied
= 32 - (dalign
+ (dpos
& 31));
1197 xincr_first
= (copied
+ 7) & -8;
1198 smask_first
= dmask_first
= (1ul << copied
) - 1;
1199 smask_first
<<= salign
;
1200 dmask_first
<<= dalign
+ need_prime
*8;
1201 if (need_prime
&& copied
> 24)
1203 left
= width
- copied
;
1205 /* Care for small copies. */
1206 if (copied
> width
) {
1208 t
= (1ul << width
) - 1;
1209 t
<<= dalign
+ need_prime
*8;
1214 /* Attempt to use 64-byte copies. This is only possible if the
1215 source and destination are co-aligned at 64 bytes. */
1216 n64
= need_second
= 0;
1217 if ((dpos
& 63) == (spos
& 63)
1218 && (height
== 1 || line_length
% 64 == 0)) {
1219 /* We may need a 32-byte copy to ensure 64 byte alignment. */
1220 need_second
= (dpos
+ xincr_first
) & 63;
1221 if ((need_second
& 32) != need_second
)
1222 printk(KERN_ERR
"tgafb: need_second wrong\n");
1223 if (left
>= need_second
+ 64) {
1224 left
-= need_second
;
1231 /* Copy trailing full 32-byte sections. This will be the main
1232 loop if the 64 byte loop can't be used. */
1236 /* Copy the trailing unaligned destination. */
1237 dmask_last
= (1ul << left
) - 1;
1239 tga_regs
= par
->tga_regs_base
;
1240 tga_fb
= par
->tga_fb_base
;
1242 /* Set up the MODE and PIXELSHIFT registers. */
1243 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1244 __raw_writel(pixel_shift
, tga_regs
+TGA_PIXELSHIFT_REG
);
1247 for (i
= 0; i
< height
; ++i
) {
1252 sfb
= tga_fb
+ spos
;
1253 dfb
= tga_fb
+ dpos
;
1255 __raw_writel(smask_first
, sfb
);
1257 __raw_writel(dmask_first
, dfb
);
1264 __raw_writel(0xffffffff, sfb
);
1266 __raw_writel(0xffffffff, dfb
);
1272 if (n64
&& (((unsigned long)sfb
| (unsigned long)dfb
) & 63))
1274 "tgafb: misaligned copy64 (s:%p, d:%p)\n",
1277 for (j
= 0; j
< n64
; ++j
) {
1278 __raw_writel(sfb
- tga_fb
, tga_regs
+TGA_COPY64_SRC
);
1280 __raw_writel(dfb
- tga_fb
, tga_regs
+TGA_COPY64_DST
);
1286 for (j
= 0; j
< n32
; ++j
) {
1287 __raw_writel(0xffffffff, sfb
);
1289 __raw_writel(0xffffffff, dfb
);
1296 __raw_writel(0xffffffff, sfb
);
1298 __raw_writel(dmask_last
, dfb
);
1306 /* Reset the MODE register to normal. */
1307 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1310 /* The (almost) general case of backward copy in 8bpp mode. */
1312 copyarea_backward_8bpp(struct fb_info
*info
, u32 dx
, u32 dy
, u32 sx
, u32 sy
,
1313 u32 height
, u32 width
, u32 line_length
,
1314 const struct fb_copyarea
*area
)
1316 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1317 unsigned long i
, left
, yincr
;
1318 unsigned long depos
, sepos
, dealign
, sealign
;
1319 u32 mask_first
, mask_last
;
1321 void __iomem
*tga_regs
;
1322 void __iomem
*tga_fb
;
1324 yincr
= line_length
;
1331 /* Compute the offsets and alignments in the frame buffer.
1332 More than anything else, these control how we do copies. */
1333 depos
= dy
* line_length
+ dx
+ width
;
1334 sepos
= sy
* line_length
+ sx
+ width
;
1335 dealign
= depos
& 7;
1336 sealign
= sepos
& 7;
1338 /* ??? The documentation appears to be incorrect (or very
1339 misleading) wrt how pixel shifting works in backward copy
1340 mode, i.e. when PIXELSHIFT is negative. I give up for now.
1341 Do handle the common case of co-aligned backward copies,
1342 but frob everything else back on generic code. */
1343 if (dealign
!= sealign
) {
1344 cfb_copyarea(info
, area
);
1348 /* We begin the copy with the trailing pixels of the
1349 unaligned destination. */
1350 mask_first
= (1ul << dealign
) - 1;
1351 left
= width
- dealign
;
1353 /* Care for small copies. */
1354 if (dealign
> width
) {
1355 mask_first
^= (1ul << (dealign
- width
)) - 1;
1359 /* Next copy full words at a time. */
1363 /* Finally copy the unaligned head of the span. */
1364 mask_last
= -1 << (32 - left
);
1366 tga_regs
= par
->tga_regs_base
;
1367 tga_fb
= par
->tga_fb_base
;
1369 /* Set up the MODE and PIXELSHIFT registers. */
1370 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1371 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
1374 for (i
= 0; i
< height
; ++i
) {
1379 sfb
= tga_fb
+ sepos
;
1380 dfb
= tga_fb
+ depos
;
1382 __raw_writel(mask_first
, sfb
);
1384 __raw_writel(mask_first
, dfb
);
1388 for (j
= 0; j
< n32
; ++j
) {
1391 __raw_writel(0xffffffff, sfb
);
1393 __raw_writel(0xffffffff, dfb
);
1400 __raw_writel(mask_last
, sfb
);
1402 __raw_writel(mask_last
, dfb
);
1410 /* Reset the MODE register to normal. */
1411 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1415 tgafb_copyarea(struct fb_info
*info
, const struct fb_copyarea
*area
)
1417 unsigned long dx
, dy
, width
, height
, sx
, sy
, vxres
, vyres
;
1418 unsigned long line_length
, bpp
;
1422 width
= area
->width
;
1423 height
= area
->height
;
1426 vxres
= info
->var
.xres_virtual
;
1427 vyres
= info
->var
.yres_virtual
;
1428 line_length
= info
->fix
.line_length
;
1430 /* The top left corners must be in the virtual screen. */
1431 if (dx
> vxres
|| sx
> vxres
|| dy
> vyres
|| sy
> vyres
)
1434 /* Clip the destination. */
1435 if (dx
+ width
> vxres
)
1437 if (dy
+ height
> vyres
)
1438 height
= vyres
- dy
;
1440 /* The source must be completely inside the virtual screen. */
1441 if (sx
+ width
> vxres
|| sy
+ height
> vyres
)
1444 bpp
= info
->var
.bits_per_pixel
;
1446 /* Detect copies of the entire line. */
1447 if (width
* (bpp
>> 3) == line_length
) {
1449 copyarea_line_8bpp(info
, dy
, sy
, height
, width
);
1451 copyarea_line_32bpp(info
, dy
, sy
, height
, width
);
1454 /* ??? The documentation is unclear to me exactly how the pixelshift
1455 register works in 32bpp mode. Since I don't have hardware to test,
1456 give up for now and fall back on the generic routines. */
1458 cfb_copyarea(info
, area
);
1460 /* Detect overlapping source and destination that requires
1462 else if (dy
== sy
&& dx
> sx
&& dx
< sx
+ width
)
1463 copyarea_backward_8bpp(info
, dx
, dy
, sx
, sy
, height
,
1464 width
, line_length
, area
);
1466 copyarea_foreward_8bpp(info
, dx
, dy
, sx
, sy
, height
,
1467 width
, line_length
);
1476 tgafb_init_fix(struct fb_info
*info
)
1478 struct tga_par
*par
= (struct tga_par
*)info
->par
;
1479 int tga_bus_pci
= TGA_BUS_PCI(par
->dev
);
1480 int tga_bus_tc
= TGA_BUS_TC(par
->dev
);
1481 u8 tga_type
= par
->tga_type
;
1482 const char *tga_type_name
= NULL
;
1485 case TGA_TYPE_8PLANE
:
1487 tga_type_name
= "Digital ZLXp-E1";
1489 tga_type_name
= "Digital ZLX-E1";
1491 case TGA_TYPE_24PLANE
:
1493 tga_type_name
= "Digital ZLXp-E2";
1495 tga_type_name
= "Digital ZLX-E2";
1497 case TGA_TYPE_24PLUSZ
:
1499 tga_type_name
= "Digital ZLXp-E3";
1501 tga_type_name
= "Digital ZLX-E3";
1504 tga_type_name
= "Unknown";
1508 strlcpy(info
->fix
.id
, tga_type_name
, sizeof(info
->fix
.id
));
1510 info
->fix
.type
= FB_TYPE_PACKED_PIXELS
;
1511 info
->fix
.type_aux
= 0;
1512 info
->fix
.visual
= (tga_type
== TGA_TYPE_8PLANE
1513 ? FB_VISUAL_PSEUDOCOLOR
1514 : FB_VISUAL_DIRECTCOLOR
);
1516 info
->fix
.line_length
= par
->xres
* (par
->bits_per_pixel
>> 3);
1517 info
->fix
.smem_start
= (size_t) par
->tga_fb_base
;
1518 info
->fix
.smem_len
= info
->fix
.line_length
* par
->yres
;
1519 info
->fix
.mmio_start
= (size_t) par
->tga_regs_base
;
1520 info
->fix
.mmio_len
= 512;
1522 info
->fix
.xpanstep
= 0;
1523 info
->fix
.ypanstep
= 0;
1524 info
->fix
.ywrapstep
= 0;
1526 info
->fix
.accel
= FB_ACCEL_DEC_TGA
;
1529 * These are needed by fb_set_logo_truepalette(), so we
1530 * set them here for 24-plane cards.
1532 if (tga_type
!= TGA_TYPE_8PLANE
) {
1533 info
->var
.red
.length
= 8;
1534 info
->var
.green
.length
= 8;
1535 info
->var
.blue
.length
= 8;
1536 info
->var
.red
.offset
= 16;
1537 info
->var
.green
.offset
= 8;
1538 info
->var
.blue
.offset
= 0;
1542 static int tgafb_pan_display(struct fb_var_screeninfo
*var
, struct fb_info
*info
)
1544 /* We just use this to catch switches out of graphics mode. */
1545 tgafb_set_par(info
); /* A bit of overkill for BASE_ADDR reset. */
1549 static int __devinit
1550 tgafb_register(struct device
*dev
)
1552 static const struct fb_videomode modedb_tc
= {
1553 /* 1280x1024 @ 72 Hz, 76.8 kHz hsync */
1554 "1280x1024@72", 0, 1280, 1024, 7645, 224, 28, 33, 3, 160, 3,
1555 FB_SYNC_ON_GREEN
, FB_VMODE_NONINTERLACED
1558 static unsigned int const fb_offset_presets
[4] = {
1559 TGA_8PLANE_FB_OFFSET
,
1560 TGA_24PLANE_FB_OFFSET
,
1562 TGA_24PLUSZ_FB_OFFSET
1565 const struct fb_videomode
*modedb_tga
= NULL
;
1566 resource_size_t bar0_start
= 0, bar0_len
= 0;
1567 const char *mode_option_tga
= NULL
;
1568 int tga_bus_pci
= TGA_BUS_PCI(dev
);
1569 int tga_bus_tc
= TGA_BUS_TC(dev
);
1570 unsigned int modedbsize_tga
= 0;
1571 void __iomem
*mem_base
;
1572 struct fb_info
*info
;
1573 struct tga_par
*par
;
1577 /* Enable device in PCI config. */
1578 if (tga_bus_pci
&& pci_enable_device(to_pci_dev(dev
))) {
1579 printk(KERN_ERR
"tgafb: Cannot enable PCI device\n");
1583 /* Allocate the fb and par structures. */
1584 info
= framebuffer_alloc(sizeof(struct tga_par
), dev
);
1586 printk(KERN_ERR
"tgafb: Cannot allocate memory\n");
1591 dev_set_drvdata(dev
, info
);
1593 /* Request the mem regions. */
1596 bar0_start
= pci_resource_start(to_pci_dev(dev
), 0);
1597 bar0_len
= pci_resource_len(to_pci_dev(dev
), 0);
1600 bar0_start
= to_tc_dev(dev
)->resource
.start
;
1601 bar0_len
= to_tc_dev(dev
)->resource
.end
- bar0_start
+ 1;
1603 if (!request_mem_region (bar0_start
, bar0_len
, "tgafb")) {
1604 printk(KERN_ERR
"tgafb: cannot reserve FB region\n");
1608 /* Map the framebuffer. */
1609 mem_base
= ioremap_nocache(bar0_start
, bar0_len
);
1611 printk(KERN_ERR
"tgafb: Cannot map MMIO\n");
1615 /* Grab info about the card. */
1616 tga_type
= (readl(mem_base
) >> 12) & 0x0f;
1618 par
->tga_mem_base
= mem_base
;
1619 par
->tga_fb_base
= mem_base
+ fb_offset_presets
[tga_type
];
1620 par
->tga_regs_base
= mem_base
+ TGA_REGS_OFFSET
;
1621 par
->tga_type
= tga_type
;
1623 par
->tga_chip_rev
= (to_pci_dev(dev
))->revision
;
1625 par
->tga_chip_rev
= TGA_READ_REG(par
, TGA_START_REG
) & 0xff;
1627 /* Setup framebuffer. */
1628 info
->flags
= FBINFO_DEFAULT
| FBINFO_HWACCEL_COPYAREA
|
1629 FBINFO_HWACCEL_IMAGEBLIT
| FBINFO_HWACCEL_FILLRECT
;
1630 info
->fbops
= &tgafb_ops
;
1631 info
->screen_base
= par
->tga_fb_base
;
1632 info
->pseudo_palette
= par
->palette
;
1634 /* This should give a reasonable default video mode. */
1636 mode_option_tga
= mode_option_pci
;
1639 mode_option_tga
= mode_option_tc
;
1640 modedb_tga
= &modedb_tc
;
1643 ret
= fb_find_mode(&info
->var
, info
,
1644 mode_option
? mode_option
: mode_option_tga
,
1645 modedb_tga
, modedbsize_tga
, NULL
,
1646 tga_type
== TGA_TYPE_8PLANE
? 8 : 32);
1647 if (ret
== 0 || ret
== 4) {
1648 printk(KERN_ERR
"tgafb: Could not find valid video mode\n");
1653 if (fb_alloc_cmap(&info
->cmap
, 256, 0)) {
1654 printk(KERN_ERR
"tgafb: Could not allocate color map\n");
1659 tgafb_set_par(info
);
1660 tgafb_init_fix(info
);
1662 if (register_framebuffer(info
) < 0) {
1663 printk(KERN_ERR
"tgafb: Could not register framebuffer\n");
1669 pr_info("tgafb: DC21030 [TGA] detected, rev=0x%02x\n",
1671 pr_info("tgafb: at PCI bus %d, device %d, function %d\n",
1672 to_pci_dev(dev
)->bus
->number
,
1673 PCI_SLOT(to_pci_dev(dev
)->devfn
),
1674 PCI_FUNC(to_pci_dev(dev
)->devfn
));
1677 pr_info("tgafb: SFB+ detected, rev=0x%02x\n",
1679 pr_info("fb%d: %s frame buffer device at 0x%lx\n",
1680 info
->node
, info
->fix
.id
, (long)bar0_start
);
1685 fb_dealloc_cmap(&info
->cmap
);
1689 release_mem_region(bar0_start
, bar0_len
);
1691 framebuffer_release(info
);
1695 static void __devexit
1696 tgafb_unregister(struct device
*dev
)
1698 resource_size_t bar0_start
= 0, bar0_len
= 0;
1699 int tga_bus_pci
= TGA_BUS_PCI(dev
);
1700 int tga_bus_tc
= TGA_BUS_TC(dev
);
1701 struct fb_info
*info
= NULL
;
1702 struct tga_par
*par
;
1704 info
= dev_get_drvdata(dev
);
1709 unregister_framebuffer(info
);
1710 fb_dealloc_cmap(&info
->cmap
);
1711 iounmap(par
->tga_mem_base
);
1713 bar0_start
= pci_resource_start(to_pci_dev(dev
), 0);
1714 bar0_len
= pci_resource_len(to_pci_dev(dev
), 0);
1717 bar0_start
= to_tc_dev(dev
)->resource
.start
;
1718 bar0_len
= to_tc_dev(dev
)->resource
.end
- bar0_start
+ 1;
1720 release_mem_region(bar0_start
, bar0_len
);
1721 framebuffer_release(info
);
1724 static void __devexit
1727 tc_unregister_driver(&tgafb_tc_driver
);
1728 pci_unregister_driver(&tgafb_pci_driver
);
1732 static int __devinit
1733 tgafb_setup(char *arg
)
1738 while ((this_opt
= strsep(&arg
, ","))) {
1741 if (!strncmp(this_opt
, "mode:", 5))
1742 mode_option
= this_opt
+5;
1745 "tgafb: unknown parameter %s\n",
1752 #endif /* !MODULE */
1754 static int __devinit
1759 char *option
= NULL
;
1761 if (fb_get_options("tgafb", &option
))
1763 tgafb_setup(option
);
1765 status
= pci_register_driver(&tgafb_pci_driver
);
1767 status
= tc_register_driver(&tgafb_tc_driver
);
1775 module_init(tgafb_init
);
1776 module_exit(tgafb_exit
);
1778 MODULE_DESCRIPTION("Framebuffer driver for TGA/SFB+ chipset");
1779 MODULE_LICENSE("GPL");