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_TC(dev) (dev->bus == &tc_bus_type)
38 #define TGA_BUS_TC(dev) 0
45 static int tgafb_check_var(struct fb_var_screeninfo
*, struct fb_info
*);
46 static int tgafb_set_par(struct fb_info
*);
47 static void tgafb_set_pll(struct tga_par
*, int);
48 static int tgafb_setcolreg(unsigned, unsigned, unsigned, unsigned,
49 unsigned, struct fb_info
*);
50 static int tgafb_blank(int, struct fb_info
*);
51 static void tgafb_init_fix(struct fb_info
*);
53 static void tgafb_imageblit(struct fb_info
*, const struct fb_image
*);
54 static void tgafb_fillrect(struct fb_info
*, const struct fb_fillrect
*);
55 static void tgafb_copyarea(struct fb_info
*, const struct fb_copyarea
*);
56 static int tgafb_pan_display(struct fb_var_screeninfo
*var
, struct fb_info
*info
);
58 static int tgafb_register(struct device
*dev
);
59 static void tgafb_unregister(struct device
*dev
);
61 static const char *mode_option
;
62 static const char *mode_option_pci
= "640x480@60";
63 static const char *mode_option_tc
= "1280x1024@72";
66 static struct pci_driver tgafb_pci_driver
;
67 static struct tc_driver tgafb_tc_driver
;
70 * Frame buffer operations
73 static struct fb_ops tgafb_ops
= {
75 .fb_check_var
= tgafb_check_var
,
76 .fb_set_par
= tgafb_set_par
,
77 .fb_setcolreg
= tgafb_setcolreg
,
78 .fb_blank
= tgafb_blank
,
79 .fb_pan_display
= tgafb_pan_display
,
80 .fb_fillrect
= tgafb_fillrect
,
81 .fb_copyarea
= tgafb_copyarea
,
82 .fb_imageblit
= tgafb_imageblit
,
88 * PCI registration operations
90 static int tgafb_pci_register(struct pci_dev
*, const struct pci_device_id
*);
91 static void tgafb_pci_unregister(struct pci_dev
*);
93 static struct pci_device_id
const tgafb_pci_table
[] = {
94 { PCI_DEVICE(PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TGA
) },
97 MODULE_DEVICE_TABLE(pci
, tgafb_pci_table
);
99 static struct pci_driver tgafb_pci_driver
= {
101 .id_table
= tgafb_pci_table
,
102 .probe
= tgafb_pci_register
,
103 .remove
= tgafb_pci_unregister
,
106 static int tgafb_pci_register(struct pci_dev
*pdev
,
107 const struct pci_device_id
*ent
)
109 return tgafb_register(&pdev
->dev
);
112 static void tgafb_pci_unregister(struct pci_dev
*pdev
)
114 tgafb_unregister(&pdev
->dev
);
116 #endif /* CONFIG_PCI */
120 * TC registration operations
122 static int tgafb_tc_register(struct device
*);
123 static int tgafb_tc_unregister(struct device
*);
125 static struct tc_device_id
const tgafb_tc_table
[] = {
126 { "DEC ", "PMAGD-AA" },
127 { "DEC ", "PMAGD " },
130 MODULE_DEVICE_TABLE(tc
, tgafb_tc_table
);
132 static struct tc_driver tgafb_tc_driver
= {
133 .id_table
= tgafb_tc_table
,
137 .probe
= tgafb_tc_register
,
138 .remove
= tgafb_tc_unregister
,
142 static int tgafb_tc_register(struct device
*dev
)
144 int status
= tgafb_register(dev
);
150 static int tgafb_tc_unregister(struct device
*dev
)
153 tgafb_unregister(dev
);
156 #endif /* CONFIG_TC */
160 * tgafb_check_var - Optional function. Validates a var passed in.
161 * @var: frame buffer variable screen structure
162 * @info: frame buffer structure that represents a single frame buffer
165 tgafb_check_var(struct fb_var_screeninfo
*var
, struct fb_info
*info
)
167 struct tga_par
*par
= (struct tga_par
*)info
->par
;
169 if (par
->tga_type
== TGA_TYPE_8PLANE
) {
170 if (var
->bits_per_pixel
!= 8)
173 if (var
->bits_per_pixel
!= 32)
176 var
->red
.length
= var
->green
.length
= var
->blue
.length
= 8;
177 if (var
->bits_per_pixel
== 32) {
178 var
->red
.offset
= 16;
179 var
->green
.offset
= 8;
180 var
->blue
.offset
= 0;
183 if (var
->xres_virtual
!= var
->xres
|| var
->yres_virtual
!= var
->yres
)
187 if (1000000000 / var
->pixclock
> TGA_PLL_MAX_FREQ
)
189 if ((var
->vmode
& FB_VMODE_MASK
) != FB_VMODE_NONINTERLACED
)
192 /* Some of the acceleration routines assume the line width is
193 a multiple of 64 bytes. */
194 if (var
->xres
* (par
->tga_type
== TGA_TYPE_8PLANE
? 1 : 4) % 64)
201 * tgafb_set_par - Optional function. Alters the hardware state.
202 * @info: frame buffer structure that represents a single frame buffer
205 tgafb_set_par(struct fb_info
*info
)
207 static unsigned int const deep_presets
[4] = {
213 static unsigned int const rasterop_presets
[4] = {
219 static unsigned int const mode_presets
[4] = {
225 static unsigned int const base_addr_presets
[4] = {
232 struct tga_par
*par
= (struct tga_par
*) info
->par
;
233 int tga_bus_pci
= dev_is_pci(par
->dev
);
234 int tga_bus_tc
= TGA_BUS_TC(par
->dev
);
235 u32 htimings
, vtimings
, pll_freq
;
239 /* Encode video timings. */
240 htimings
= (((info
->var
.xres
/4) & TGA_HORIZ_ACT_LSB
)
241 | (((info
->var
.xres
/4) & 0x600 << 19) & TGA_HORIZ_ACT_MSB
));
242 vtimings
= (info
->var
.yres
& TGA_VERT_ACTIVE
);
243 htimings
|= ((info
->var
.right_margin
/4) << 9) & TGA_HORIZ_FP
;
244 vtimings
|= (info
->var
.lower_margin
<< 11) & TGA_VERT_FP
;
245 htimings
|= ((info
->var
.hsync_len
/4) << 14) & TGA_HORIZ_SYNC
;
246 vtimings
|= (info
->var
.vsync_len
<< 16) & TGA_VERT_SYNC
;
247 htimings
|= ((info
->var
.left_margin
/4) << 21) & TGA_HORIZ_BP
;
248 vtimings
|= (info
->var
.upper_margin
<< 22) & TGA_VERT_BP
;
250 if (info
->var
.sync
& FB_SYNC_HOR_HIGH_ACT
)
251 htimings
|= TGA_HORIZ_POLARITY
;
252 if (info
->var
.sync
& FB_SYNC_VERT_HIGH_ACT
)
253 vtimings
|= TGA_VERT_POLARITY
;
255 par
->htimings
= htimings
;
256 par
->vtimings
= vtimings
;
258 par
->sync_on_green
= !!(info
->var
.sync
& FB_SYNC_ON_GREEN
);
260 /* Store other useful values in par. */
261 par
->xres
= info
->var
.xres
;
262 par
->yres
= info
->var
.yres
;
263 par
->pll_freq
= pll_freq
= 1000000000 / info
->var
.pixclock
;
264 par
->bits_per_pixel
= info
->var
.bits_per_pixel
;
266 tga_type
= par
->tga_type
;
268 /* First, disable video. */
269 TGA_WRITE_REG(par
, TGA_VALID_VIDEO
| TGA_VALID_BLANK
, TGA_VALID_REG
);
271 /* Write the DEEP register. */
272 while (TGA_READ_REG(par
, TGA_CMD_STAT_REG
) & 1) /* wait for not busy */
275 TGA_WRITE_REG(par
, deep_presets
[tga_type
] |
276 (par
->sync_on_green
? 0x0 : 0x00010000),
278 while (TGA_READ_REG(par
, TGA_CMD_STAT_REG
) & 1) /* wait for not busy */
282 /* Write some more registers. */
283 TGA_WRITE_REG(par
, rasterop_presets
[tga_type
], TGA_RASTEROP_REG
);
284 TGA_WRITE_REG(par
, mode_presets
[tga_type
], TGA_MODE_REG
);
285 TGA_WRITE_REG(par
, base_addr_presets
[tga_type
], TGA_BASE_ADDR_REG
);
287 /* Calculate & write the PLL. */
288 tgafb_set_pll(par
, pll_freq
);
290 /* Write some more registers. */
291 TGA_WRITE_REG(par
, 0xffffffff, TGA_PLANEMASK_REG
);
292 TGA_WRITE_REG(par
, 0xffffffff, TGA_PIXELMASK_REG
);
294 /* Init video timing regs. */
295 TGA_WRITE_REG(par
, htimings
, TGA_HORIZ_REG
);
296 TGA_WRITE_REG(par
, vtimings
, TGA_VERT_REG
);
298 /* Initialise RAMDAC. */
299 if (tga_type
== TGA_TYPE_8PLANE
&& tga_bus_pci
) {
301 /* Init BT485 RAMDAC registers. */
302 BT485_WRITE(par
, 0xa2 | (par
->sync_on_green
? 0x8 : 0x0),
304 BT485_WRITE(par
, 0x01, BT485_ADDR_PAL_WRITE
);
305 BT485_WRITE(par
, 0x14, BT485_CMD_3
); /* cursor 64x64 */
306 BT485_WRITE(par
, 0x40, BT485_CMD_1
);
307 BT485_WRITE(par
, 0x20, BT485_CMD_2
); /* cursor off, for now */
308 BT485_WRITE(par
, 0xff, BT485_PIXEL_MASK
);
310 /* Fill palette registers. */
311 BT485_WRITE(par
, 0x00, BT485_ADDR_PAL_WRITE
);
312 TGA_WRITE_REG(par
, BT485_DATA_PAL
, TGA_RAMDAC_SETUP_REG
);
314 for (i
= 0; i
< 256 * 3; i
+= 4) {
315 TGA_WRITE_REG(par
, 0x55 | (BT485_DATA_PAL
<< 8),
317 TGA_WRITE_REG(par
, 0x00 | (BT485_DATA_PAL
<< 8),
319 TGA_WRITE_REG(par
, 0x00 | (BT485_DATA_PAL
<< 8),
321 TGA_WRITE_REG(par
, 0x00 | (BT485_DATA_PAL
<< 8),
325 } else if (tga_type
== TGA_TYPE_8PLANE
&& tga_bus_tc
) {
327 /* Init BT459 RAMDAC registers. */
328 BT459_WRITE(par
, BT459_REG_ACC
, BT459_CMD_REG_0
, 0x40);
329 BT459_WRITE(par
, BT459_REG_ACC
, BT459_CMD_REG_1
, 0x00);
330 BT459_WRITE(par
, BT459_REG_ACC
, BT459_CMD_REG_2
,
331 (par
->sync_on_green
? 0xc0 : 0x40));
333 BT459_WRITE(par
, BT459_REG_ACC
, BT459_CUR_CMD_REG
, 0x00);
335 /* Fill the palette. */
336 BT459_LOAD_ADDR(par
, 0x0000);
337 TGA_WRITE_REG(par
, BT459_PALETTE
<< 2, TGA_RAMDAC_SETUP_REG
);
339 for (i
= 0; i
< 256 * 3; i
+= 4) {
340 TGA_WRITE_REG(par
, 0x55, TGA_RAMDAC_REG
);
341 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
342 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
343 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
346 } else { /* 24-plane or 24plusZ */
348 /* Init BT463 RAMDAC registers. */
349 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_0
, 0x40);
350 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_1
, 0x08);
351 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_2
,
352 (par
->sync_on_green
? 0xc0 : 0x40));
354 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_0
, 0xff);
355 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_1
, 0xff);
356 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_2
, 0xff);
357 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_3
, 0x0f);
359 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_0
, 0x00);
360 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_1
, 0x00);
361 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_2
, 0x00);
362 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_3
, 0x00);
364 /* Fill the palette. */
365 BT463_LOAD_ADDR(par
, 0x0000);
366 TGA_WRITE_REG(par
, BT463_PALETTE
<< 2, TGA_RAMDAC_SETUP_REG
);
368 #ifdef CONFIG_HW_CONSOLE
369 for (i
= 0; i
< 16; i
++) {
370 int j
= color_table
[i
];
372 TGA_WRITE_REG(par
, default_red
[j
], TGA_RAMDAC_REG
);
373 TGA_WRITE_REG(par
, default_grn
[j
], TGA_RAMDAC_REG
);
374 TGA_WRITE_REG(par
, default_blu
[j
], TGA_RAMDAC_REG
);
376 for (i
= 0; i
< 512 * 3; i
+= 4) {
378 for (i
= 0; i
< 528 * 3; i
+= 4) {
380 TGA_WRITE_REG(par
, 0x55, TGA_RAMDAC_REG
);
381 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
382 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
383 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
386 /* Fill window type table after start of vertical retrace. */
387 while (!(TGA_READ_REG(par
, TGA_INTR_STAT_REG
) & 0x01))
389 TGA_WRITE_REG(par
, 0x01, TGA_INTR_STAT_REG
);
391 while (!(TGA_READ_REG(par
, TGA_INTR_STAT_REG
) & 0x01))
393 TGA_WRITE_REG(par
, 0x01, TGA_INTR_STAT_REG
);
395 BT463_LOAD_ADDR(par
, BT463_WINDOW_TYPE_BASE
);
396 TGA_WRITE_REG(par
, BT463_REG_ACC
<< 2, TGA_RAMDAC_SETUP_REG
);
398 for (i
= 0; i
< 16; i
++) {
399 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
400 TGA_WRITE_REG(par
, 0x01, TGA_RAMDAC_REG
);
401 TGA_WRITE_REG(par
, 0x00, TGA_RAMDAC_REG
);
406 /* Finally, enable video scan (and pray for the monitor... :-) */
407 TGA_WRITE_REG(par
, TGA_VALID_VIDEO
, TGA_VALID_REG
);
412 #define DIFFCHECK(X) \
415 int delta = f - (TGA_PLL_BASE_FREQ * (X)) / (r << shift); \
418 if (delta < min_diff) \
419 min_diff = delta, vm = m, va = a, vr = r; \
424 tgafb_set_pll(struct tga_par
*par
, int f
)
426 int n
, shift
, base
, min_diff
, target
;
427 int r
,a
,m
,vm
= 34, va
= 1, vr
= 30;
429 for (r
= 0 ; r
< 12 ; r
++)
430 TGA_WRITE_REG(par
, !r
, TGA_CLOCK_REG
);
432 if (f
> TGA_PLL_MAX_FREQ
)
433 f
= TGA_PLL_MAX_FREQ
;
435 if (f
>= TGA_PLL_MAX_FREQ
/ 2)
437 else if (f
>= TGA_PLL_MAX_FREQ
/ 4)
442 TGA_WRITE_REG(par
, shift
& 1, TGA_CLOCK_REG
);
443 TGA_WRITE_REG(par
, shift
>> 1, TGA_CLOCK_REG
);
445 for (r
= 0 ; r
< 10 ; r
++)
446 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
449 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
450 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
452 else if (f
<= 200000) {
453 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
454 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
457 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
458 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
461 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
462 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
463 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
464 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
465 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
466 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
468 target
= (f
<< shift
) / TGA_PLL_BASE_FREQ
;
469 min_diff
= TGA_PLL_MAX_FREQ
;
476 for (n
= base
< 7 ? 7 : base
; n
< base
+ target
&& n
< 449; n
++) {
477 m
= ((n
+ 3) / 7) - 1;
479 DIFFCHECK((m
+ 1) * 7);
481 DIFFCHECK((m
+ 1) * 7);
492 for (r
= 0; r
< 8; r
++)
493 TGA_WRITE_REG(par
, (vm
>> r
) & 1, TGA_CLOCK_REG
);
494 for (r
= 0; r
< 8 ; r
++)
495 TGA_WRITE_REG(par
, (va
>> r
) & 1, TGA_CLOCK_REG
);
496 for (r
= 0; r
< 7 ; r
++)
497 TGA_WRITE_REG(par
, (vr
>> r
) & 1, TGA_CLOCK_REG
);
498 TGA_WRITE_REG(par
, ((vr
>> 7) & 1)|2, TGA_CLOCK_REG
);
503 * tgafb_setcolreg - Optional function. Sets a color register.
504 * @regno: boolean, 0 copy local, 1 get_user() function
505 * @red: frame buffer colormap structure
506 * @green: The green value which can be up to 16 bits wide
507 * @blue: The blue value which can be up to 16 bits wide.
508 * @transp: If supported the alpha value which can be up to 16 bits wide.
509 * @info: frame buffer info structure
512 tgafb_setcolreg(unsigned regno
, unsigned red
, unsigned green
, unsigned blue
,
513 unsigned transp
, struct fb_info
*info
)
515 struct tga_par
*par
= (struct tga_par
*) info
->par
;
516 int tga_bus_pci
= dev_is_pci(par
->dev
);
517 int tga_bus_tc
= TGA_BUS_TC(par
->dev
);
525 if (par
->tga_type
== TGA_TYPE_8PLANE
&& tga_bus_pci
) {
526 BT485_WRITE(par
, regno
, BT485_ADDR_PAL_WRITE
);
527 TGA_WRITE_REG(par
, BT485_DATA_PAL
, TGA_RAMDAC_SETUP_REG
);
528 TGA_WRITE_REG(par
, red
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
529 TGA_WRITE_REG(par
, green
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
530 TGA_WRITE_REG(par
, blue
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
531 } else if (par
->tga_type
== TGA_TYPE_8PLANE
&& tga_bus_tc
) {
532 BT459_LOAD_ADDR(par
, regno
);
533 TGA_WRITE_REG(par
, BT459_PALETTE
<< 2, TGA_RAMDAC_SETUP_REG
);
534 TGA_WRITE_REG(par
, red
, TGA_RAMDAC_REG
);
535 TGA_WRITE_REG(par
, green
, TGA_RAMDAC_REG
);
536 TGA_WRITE_REG(par
, blue
, TGA_RAMDAC_REG
);
539 u32 value
= (regno
<< 16) | (regno
<< 8) | regno
;
540 ((u32
*)info
->pseudo_palette
)[regno
] = value
;
542 BT463_LOAD_ADDR(par
, regno
);
543 TGA_WRITE_REG(par
, BT463_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
);
554 * tgafb_blank - Optional function. Blanks the display.
555 * @blank_mode: the blank mode we want.
556 * @info: frame buffer structure that represents a single frame buffer
559 tgafb_blank(int blank
, struct fb_info
*info
)
561 struct tga_par
*par
= (struct tga_par
*) info
->par
;
562 u32 vhcr
, vvcr
, vvvr
;
565 local_irq_save(flags
);
567 vhcr
= TGA_READ_REG(par
, TGA_HORIZ_REG
);
568 vvcr
= TGA_READ_REG(par
, TGA_VERT_REG
);
569 vvvr
= TGA_READ_REG(par
, TGA_VALID_REG
);
570 vvvr
&= ~(TGA_VALID_VIDEO
| TGA_VALID_BLANK
);
573 case FB_BLANK_UNBLANK
: /* Unblanking */
574 if (par
->vesa_blanked
) {
575 TGA_WRITE_REG(par
, vhcr
& 0xbfffffff, TGA_HORIZ_REG
);
576 TGA_WRITE_REG(par
, vvcr
& 0xbfffffff, TGA_VERT_REG
);
577 par
->vesa_blanked
= 0;
579 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_VIDEO
, TGA_VALID_REG
);
582 case FB_BLANK_NORMAL
: /* Normal blanking */
583 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_VIDEO
| TGA_VALID_BLANK
,
587 case FB_BLANK_VSYNC_SUSPEND
: /* VESA blank (vsync off) */
588 TGA_WRITE_REG(par
, vvcr
| 0x40000000, TGA_VERT_REG
);
589 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
590 par
->vesa_blanked
= 1;
593 case FB_BLANK_HSYNC_SUSPEND
: /* VESA blank (hsync off) */
594 TGA_WRITE_REG(par
, vhcr
| 0x40000000, TGA_HORIZ_REG
);
595 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
596 par
->vesa_blanked
= 1;
599 case FB_BLANK_POWERDOWN
: /* Poweroff */
600 TGA_WRITE_REG(par
, vhcr
| 0x40000000, TGA_HORIZ_REG
);
601 TGA_WRITE_REG(par
, vvcr
| 0x40000000, TGA_VERT_REG
);
602 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
603 par
->vesa_blanked
= 1;
607 local_irq_restore(flags
);
617 tgafb_mono_imageblit(struct fb_info
*info
, const struct fb_image
*image
)
619 struct tga_par
*par
= (struct tga_par
*) info
->par
;
620 u32 fgcolor
, bgcolor
, dx
, dy
, width
, height
, vxres
, vyres
, pixelmask
;
621 unsigned long rincr
, line_length
, shift
, pos
, is8bpp
;
623 const unsigned char *data
;
624 void __iomem
*regs_base
;
625 void __iomem
*fb_base
;
627 is8bpp
= info
->var
.bits_per_pixel
== 8;
631 width
= image
->width
;
632 height
= image
->height
;
633 vxres
= info
->var
.xres_virtual
;
634 vyres
= info
->var
.yres_virtual
;
635 line_length
= info
->fix
.line_length
;
636 rincr
= (width
+ 7) / 8;
638 /* A shift below cannot cope with. */
639 if (unlikely(width
== 0))
641 /* Crop the image to the screen. */
642 if (dx
> vxres
|| dy
> vyres
)
644 if (dx
+ width
> vxres
)
646 if (dy
+ height
> vyres
)
649 regs_base
= par
->tga_regs_base
;
650 fb_base
= par
->tga_fb_base
;
652 /* Expand the color values to fill 32-bits. */
653 /* ??? Would be nice to notice colour changes elsewhere, so
654 that we can do this only when necessary. */
655 fgcolor
= image
->fg_color
;
656 bgcolor
= image
->bg_color
;
658 fgcolor
|= fgcolor
<< 8;
659 fgcolor
|= fgcolor
<< 16;
660 bgcolor
|= bgcolor
<< 8;
661 bgcolor
|= bgcolor
<< 16;
664 fgcolor
= ((u32
*)info
->pseudo_palette
)[fgcolor
];
666 bgcolor
= ((u32
*)info
->pseudo_palette
)[bgcolor
];
668 __raw_writel(fgcolor
, regs_base
+ TGA_FOREGROUND_REG
);
669 __raw_writel(bgcolor
, regs_base
+ TGA_BACKGROUND_REG
);
671 /* Acquire proper alignment; set up the PIXELMASK register
672 so that we only write the proper character cell. */
673 pos
= dy
* line_length
;
680 shift
= (pos
& 7) >> 2;
684 data
= (const unsigned char *) image
->data
;
686 /* Enable opaque stipple mode. */
688 ? TGA_MODE_SBM_8BPP
| TGA_MODE_OPAQUE_STIPPLE
689 : TGA_MODE_SBM_24BPP
| TGA_MODE_OPAQUE_STIPPLE
),
690 regs_base
+ TGA_MODE_REG
);
692 if (width
+ shift
<= 32) {
693 unsigned long bwidth
;
695 /* Handle common case of imaging a single character, in
696 a font less than or 32 pixels wide. */
698 /* Avoid a shift by 32; width > 0 implied. */
699 pixelmask
= (2ul << (width
- 1)) - 1;
701 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
704 bwidth
= (width
+ 7) / 8;
706 for (i
= 0; i
< height
; ++i
) {
709 /* The image data is bit big endian; we need
711 for (j
= 0; j
< bwidth
; ++j
)
712 mask
|= bitrev8(data
[j
]) << (j
* 8);
714 __raw_writel(mask
<< shift
, fb_base
+ pos
);
720 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
721 } else if (shift
== 0) {
722 unsigned long pos0
= pos
;
723 const unsigned char *data0
= data
;
724 unsigned long bincr
= (is8bpp
? 8 : 8*4);
725 unsigned long bwidth
;
727 /* Handle another common case in which accel_putcs
728 generates a large bitmap, which happens to be aligned.
729 Allow the tail to be misaligned. This case is
730 interesting because we've not got to hold partial
731 bytes across the words being written. */
735 bwidth
= (width
/ 8) & -4;
736 for (i
= 0; i
< height
; ++i
) {
737 for (j
= 0; j
< bwidth
; j
+= 4) {
739 mask
|= bitrev8(data
[j
+0]) << (0 * 8);
740 mask
|= bitrev8(data
[j
+1]) << (1 * 8);
741 mask
|= bitrev8(data
[j
+2]) << (2 * 8);
742 mask
|= bitrev8(data
[j
+3]) << (3 * 8);
743 __raw_writel(mask
, fb_base
+ pos
+ j
*bincr
);
750 pixelmask
= (1ul << (width
& 31)) - 1;
752 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
755 pos
= pos0
+ bwidth
*bincr
;
756 data
= data0
+ bwidth
;
757 bwidth
= ((width
& 31) + 7) / 8;
759 for (i
= 0; i
< height
; ++i
) {
761 for (j
= 0; j
< bwidth
; ++j
)
762 mask
|= bitrev8(data
[j
]) << (j
* 8);
763 __raw_writel(mask
, fb_base
+ pos
);
768 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
771 unsigned long pos0
= pos
;
772 const unsigned char *data0
= data
;
773 unsigned long bincr
= (is8bpp
? 8 : 8*4);
774 unsigned long bwidth
;
776 /* Finally, handle the generic case of misaligned start.
777 Here we split the write into 16-bit spans. This allows
778 us to use only one pixel mask, instead of four as would
779 be required by writing 24-bit spans. */
781 pixelmask
= 0xffff << shift
;
782 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
785 bwidth
= (width
/ 8) & -2;
786 for (i
= 0; i
< height
; ++i
) {
787 for (j
= 0; j
< bwidth
; j
+= 2) {
789 mask
|= bitrev8(data
[j
+0]) << (0 * 8);
790 mask
|= bitrev8(data
[j
+1]) << (1 * 8);
792 __raw_writel(mask
, fb_base
+ pos
+ j
*bincr
);
799 pixelmask
= ((1ul << (width
& 15)) - 1) << shift
;
801 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
804 pos
= pos0
+ bwidth
*bincr
;
805 data
= data0
+ bwidth
;
806 bwidth
= (width
& 15) > 8;
808 for (i
= 0; i
< height
; ++i
) {
809 u32 mask
= bitrev8(data
[0]);
811 mask
|= bitrev8(data
[1]) << 8;
813 __raw_writel(mask
, fb_base
+ pos
);
819 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
822 /* Disable opaque stipple mode. */
824 ? TGA_MODE_SBM_8BPP
| TGA_MODE_SIMPLE
825 : TGA_MODE_SBM_24BPP
| TGA_MODE_SIMPLE
),
826 regs_base
+ TGA_MODE_REG
);
830 tgafb_clut_imageblit(struct fb_info
*info
, const struct fb_image
*image
)
832 struct tga_par
*par
= (struct tga_par
*) info
->par
;
833 u32 color
, dx
, dy
, width
, height
, vxres
, vyres
;
834 u32
*palette
= ((u32
*)info
->pseudo_palette
);
835 unsigned long pos
, line_length
, i
, j
;
836 const unsigned char *data
;
837 void __iomem
*regs_base
, *fb_base
;
841 width
= image
->width
;
842 height
= image
->height
;
843 vxres
= info
->var
.xres_virtual
;
844 vyres
= info
->var
.yres_virtual
;
845 line_length
= info
->fix
.line_length
;
847 /* Crop the image to the screen. */
848 if (dx
> vxres
|| dy
> vyres
)
850 if (dx
+ width
> vxres
)
852 if (dy
+ height
> vyres
)
855 regs_base
= par
->tga_regs_base
;
856 fb_base
= par
->tga_fb_base
;
858 pos
= dy
* line_length
+ (dx
* 4);
861 /* Now copy the image, color_expanding via the palette. */
862 for (i
= 0; i
< height
; i
++) {
863 for (j
= 0; j
< width
; j
++) {
864 color
= palette
[*data
++];
865 __raw_writel(color
, fb_base
+ pos
+ j
*4);
872 * tgafb_imageblit - REQUIRED function. Can use generic routines if
873 * non acclerated hardware and packed pixel based.
874 * Copies a image from system memory to the screen.
876 * @info: frame buffer structure that represents a single frame buffer
877 * @image: structure defining the image.
880 tgafb_imageblit(struct fb_info
*info
, const struct fb_image
*image
)
882 unsigned int is8bpp
= info
->var
.bits_per_pixel
== 8;
884 /* If a mono image, regardless of FB depth, go do it. */
885 if (image
->depth
== 1) {
886 tgafb_mono_imageblit(info
, image
);
890 /* For copies that aren't pixel expansion, there's little we
891 can do better than the generic code. */
892 /* ??? There is a DMA write mode; I wonder if that could be
893 made to pull the data from the image buffer... */
894 if (image
->depth
== info
->var
.bits_per_pixel
) {
895 cfb_imageblit(info
, image
);
899 /* If 24-plane FB and the image is 8-plane with CLUT, we can do it. */
900 if (!is8bpp
&& image
->depth
== 8) {
901 tgafb_clut_imageblit(info
, image
);
905 /* Silently return... */
909 * tgafb_fillrect - REQUIRED function. Can use generic routines if
910 * non acclerated hardware and packed pixel based.
911 * Draws a rectangle on the screen.
913 * @info: frame buffer structure that represents a single frame buffer
914 * @rect: structure defining the rectagle and operation.
917 tgafb_fillrect(struct fb_info
*info
, const struct fb_fillrect
*rect
)
919 struct tga_par
*par
= (struct tga_par
*) info
->par
;
920 int is8bpp
= info
->var
.bits_per_pixel
== 8;
921 u32 dx
, dy
, width
, height
, vxres
, vyres
, color
;
922 unsigned long pos
, align
, line_length
, i
, j
;
923 void __iomem
*regs_base
;
924 void __iomem
*fb_base
;
929 height
= rect
->height
;
930 vxres
= info
->var
.xres_virtual
;
931 vyres
= info
->var
.yres_virtual
;
932 line_length
= info
->fix
.line_length
;
933 regs_base
= par
->tga_regs_base
;
934 fb_base
= par
->tga_fb_base
;
936 /* Crop the rectangle to the screen. */
937 if (dx
> vxres
|| dy
> vyres
|| !width
|| !height
)
939 if (dx
+ width
> vxres
)
941 if (dy
+ height
> vyres
)
944 pos
= dy
* line_length
+ dx
* (is8bpp
? 1 : 4);
946 /* ??? We could implement ROP_XOR with opaque fill mode
947 and a RasterOp setting of GXxor, but as far as I can
948 tell, this mode is not actually used in the kernel.
949 Thus I am ignoring it for now. */
950 if (rect
->rop
!= ROP_COPY
) {
951 cfb_fillrect(info
, rect
);
955 /* Expand the color value to fill 8 pixels. */
959 color
|= color
<< 16;
960 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR0_REG
);
961 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR1_REG
);
964 color
= ((u32
*)info
->pseudo_palette
)[color
];
965 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR0_REG
);
966 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR1_REG
);
967 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR2_REG
);
968 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR3_REG
);
969 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR4_REG
);
970 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR5_REG
);
971 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR6_REG
);
972 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR7_REG
);
975 /* The DATA register holds the fill mask for block fill mode.
976 Since we're not stippling, this is all ones. */
977 __raw_writel(0xffffffff, regs_base
+ TGA_DATA_REG
);
979 /* Enable block fill mode. */
981 ? TGA_MODE_SBM_8BPP
| TGA_MODE_BLOCK_FILL
982 : TGA_MODE_SBM_24BPP
| TGA_MODE_BLOCK_FILL
),
983 regs_base
+ TGA_MODE_REG
);
986 /* We can fill 2k pixels per operation. Notice blocks that fit
987 the width of the screen so that we can take advantage of this
988 and fill more than one line per write. */
989 if (width
== line_length
)
990 width
*= height
, height
= 1;
992 /* The write into the frame buffer must be aligned to 4 bytes,
993 but we are allowed to encode the offset within the word in
994 the data word written. */
995 align
= (pos
& 3) << 16;
1001 data
= (width
- 1) | align
;
1003 for (i
= 0; i
< height
; ++i
) {
1004 __raw_writel(data
, fb_base
+ pos
);
1008 unsigned long Bpp
= (is8bpp
? 1 : 4);
1009 unsigned long nwidth
= width
& -2048;
1012 fdata
= (2048 - 1) | align
;
1013 ldata
= ((width
& 2047) - 1) | align
;
1015 for (i
= 0; i
< height
; ++i
) {
1016 for (j
= 0; j
< nwidth
; j
+= 2048)
1017 __raw_writel(fdata
, fb_base
+ pos
+ j
*Bpp
);
1019 __raw_writel(ldata
, fb_base
+ pos
+ j
*Bpp
);
1025 /* Disable block fill mode. */
1026 __raw_writel((is8bpp
1027 ? TGA_MODE_SBM_8BPP
| TGA_MODE_SIMPLE
1028 : TGA_MODE_SBM_24BPP
| TGA_MODE_SIMPLE
),
1029 regs_base
+ TGA_MODE_REG
);
1033 * tgafb_copyarea - REQUIRED function. Can use generic routines if
1034 * non acclerated hardware and packed pixel based.
1035 * Copies on area of the screen to another area.
1037 * @info: frame buffer structure that represents a single frame buffer
1038 * @area: structure defining the source and destination.
1041 /* Handle the special case of copying entire lines, e.g. during scrolling.
1042 We can avoid a lot of needless computation in this case. In the 8bpp
1043 case we need to use the COPY64 registers instead of mask writes into
1044 the frame buffer to achieve maximum performance. */
1047 copyarea_line_8bpp(struct fb_info
*info
, u32 dy
, u32 sy
,
1048 u32 height
, u32 width
)
1050 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1051 void __iomem
*tga_regs
= par
->tga_regs_base
;
1052 unsigned long dpos
, spos
, i
, n64
;
1054 /* Set up the MODE and PIXELSHIFT registers. */
1055 __raw_writel(TGA_MODE_SBM_8BPP
| TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1056 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
1059 n64
= (height
* width
) / 64;
1062 spos
= (sy
+ height
) * width
;
1063 dpos
= (dy
+ height
) * width
;
1065 for (i
= 0; i
< n64
; ++i
) {
1068 __raw_writel(spos
, tga_regs
+TGA_COPY64_SRC
);
1070 __raw_writel(dpos
, tga_regs
+TGA_COPY64_DST
);
1077 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 /* Reset the MODE register to normal. */
1088 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1092 copyarea_line_32bpp(struct fb_info
*info
, u32 dy
, u32 sy
,
1093 u32 height
, u32 width
)
1095 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1096 void __iomem
*tga_regs
= par
->tga_regs_base
;
1097 void __iomem
*tga_fb
= par
->tga_fb_base
;
1100 unsigned long i
, n16
;
1102 /* Set up the MODE and PIXELSHIFT registers. */
1103 __raw_writel(TGA_MODE_SBM_24BPP
| TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1104 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
1107 n16
= (height
* width
) / 16;
1110 src
= tga_fb
+ (sy
+ height
) * width
* 4;
1111 dst
= tga_fb
+ (dy
+ height
) * width
* 4;
1113 for (i
= 0; i
< n16
; ++i
) {
1116 __raw_writel(0xffff, src
);
1118 __raw_writel(0xffff, dst
);
1122 src
= tga_fb
+ sy
* width
* 4;
1123 dst
= tga_fb
+ dy
* width
* 4;
1125 for (i
= 0; i
< n16
; ++i
) {
1126 __raw_writel(0xffff, src
);
1128 __raw_writel(0xffff, dst
);
1135 /* Reset the MODE register to normal. */
1136 __raw_writel(TGA_MODE_SBM_24BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1139 /* The general case of forward copy in 8bpp mode. */
1141 copyarea_foreward_8bpp(struct fb_info
*info
, u32 dx
, u32 dy
, u32 sx
, u32 sy
,
1142 u32 height
, u32 width
, u32 line_length
)
1144 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1145 unsigned long i
, copied
, left
;
1146 unsigned long dpos
, spos
, dalign
, salign
, yincr
;
1147 u32 smask_first
, dmask_first
, dmask_last
;
1148 int pixel_shift
, need_prime
, need_second
;
1149 unsigned long n64
, n32
, xincr_first
;
1150 void __iomem
*tga_regs
;
1151 void __iomem
*tga_fb
;
1153 yincr
= line_length
;
1160 /* Compute the offsets and alignments in the frame buffer.
1161 More than anything else, these control how we do copies. */
1162 dpos
= dy
* line_length
+ dx
;
1163 spos
= sy
* line_length
+ sx
;
1169 /* Compute the value for the PIXELSHIFT register. This controls
1170 both non-co-aligned source and destination and copy direction. */
1171 if (dalign
>= salign
)
1172 pixel_shift
= dalign
- salign
;
1174 pixel_shift
= 8 - (salign
- dalign
);
1176 /* Figure out if we need an additional priming step for the
1177 residue register. */
1178 need_prime
= (salign
> dalign
);
1182 /* Begin by copying the leading unaligned destination. Copy enough
1183 to make the next destination address 32-byte aligned. */
1184 copied
= 32 - (dalign
+ (dpos
& 31));
1187 xincr_first
= (copied
+ 7) & -8;
1188 smask_first
= dmask_first
= (1ul << copied
) - 1;
1189 smask_first
<<= salign
;
1190 dmask_first
<<= dalign
+ need_prime
*8;
1191 if (need_prime
&& copied
> 24)
1193 left
= width
- copied
;
1195 /* Care for small copies. */
1196 if (copied
> width
) {
1198 t
= (1ul << width
) - 1;
1199 t
<<= dalign
+ need_prime
*8;
1204 /* Attempt to use 64-byte copies. This is only possible if the
1205 source and destination are co-aligned at 64 bytes. */
1206 n64
= need_second
= 0;
1207 if ((dpos
& 63) == (spos
& 63)
1208 && (height
== 1 || line_length
% 64 == 0)) {
1209 /* We may need a 32-byte copy to ensure 64 byte alignment. */
1210 need_second
= (dpos
+ xincr_first
) & 63;
1211 if ((need_second
& 32) != need_second
)
1212 printk(KERN_ERR
"tgafb: need_second wrong\n");
1213 if (left
>= need_second
+ 64) {
1214 left
-= need_second
;
1221 /* Copy trailing full 32-byte sections. This will be the main
1222 loop if the 64 byte loop can't be used. */
1226 /* Copy the trailing unaligned destination. */
1227 dmask_last
= (1ul << left
) - 1;
1229 tga_regs
= par
->tga_regs_base
;
1230 tga_fb
= par
->tga_fb_base
;
1232 /* Set up the MODE and PIXELSHIFT registers. */
1233 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1234 __raw_writel(pixel_shift
, tga_regs
+TGA_PIXELSHIFT_REG
);
1237 for (i
= 0; i
< height
; ++i
) {
1242 sfb
= tga_fb
+ spos
;
1243 dfb
= tga_fb
+ dpos
;
1245 __raw_writel(smask_first
, sfb
);
1247 __raw_writel(dmask_first
, dfb
);
1254 __raw_writel(0xffffffff, sfb
);
1256 __raw_writel(0xffffffff, dfb
);
1262 if (n64
&& (((unsigned long)sfb
| (unsigned long)dfb
) & 63))
1264 "tgafb: misaligned copy64 (s:%p, d:%p)\n",
1267 for (j
= 0; j
< n64
; ++j
) {
1268 __raw_writel(sfb
- tga_fb
, tga_regs
+TGA_COPY64_SRC
);
1270 __raw_writel(dfb
- tga_fb
, tga_regs
+TGA_COPY64_DST
);
1276 for (j
= 0; j
< n32
; ++j
) {
1277 __raw_writel(0xffffffff, sfb
);
1279 __raw_writel(0xffffffff, dfb
);
1286 __raw_writel(0xffffffff, sfb
);
1288 __raw_writel(dmask_last
, dfb
);
1296 /* Reset the MODE register to normal. */
1297 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1300 /* The (almost) general case of backward copy in 8bpp mode. */
1302 copyarea_backward_8bpp(struct fb_info
*info
, u32 dx
, u32 dy
, u32 sx
, u32 sy
,
1303 u32 height
, u32 width
, u32 line_length
,
1304 const struct fb_copyarea
*area
)
1306 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1307 unsigned long i
, left
, yincr
;
1308 unsigned long depos
, sepos
, dealign
, sealign
;
1309 u32 mask_first
, mask_last
;
1311 void __iomem
*tga_regs
;
1312 void __iomem
*tga_fb
;
1314 yincr
= line_length
;
1321 /* Compute the offsets and alignments in the frame buffer.
1322 More than anything else, these control how we do copies. */
1323 depos
= dy
* line_length
+ dx
+ width
;
1324 sepos
= sy
* line_length
+ sx
+ width
;
1325 dealign
= depos
& 7;
1326 sealign
= sepos
& 7;
1328 /* ??? The documentation appears to be incorrect (or very
1329 misleading) wrt how pixel shifting works in backward copy
1330 mode, i.e. when PIXELSHIFT is negative. I give up for now.
1331 Do handle the common case of co-aligned backward copies,
1332 but frob everything else back on generic code. */
1333 if (dealign
!= sealign
) {
1334 cfb_copyarea(info
, area
);
1338 /* We begin the copy with the trailing pixels of the
1339 unaligned destination. */
1340 mask_first
= (1ul << dealign
) - 1;
1341 left
= width
- dealign
;
1343 /* Care for small copies. */
1344 if (dealign
> width
) {
1345 mask_first
^= (1ul << (dealign
- width
)) - 1;
1349 /* Next copy full words at a time. */
1353 /* Finally copy the unaligned head of the span. */
1354 mask_last
= -1 << (32 - left
);
1356 tga_regs
= par
->tga_regs_base
;
1357 tga_fb
= par
->tga_fb_base
;
1359 /* Set up the MODE and PIXELSHIFT registers. */
1360 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1361 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
1364 for (i
= 0; i
< height
; ++i
) {
1369 sfb
= tga_fb
+ sepos
;
1370 dfb
= tga_fb
+ depos
;
1372 __raw_writel(mask_first
, sfb
);
1374 __raw_writel(mask_first
, dfb
);
1378 for (j
= 0; j
< n32
; ++j
) {
1381 __raw_writel(0xffffffff, sfb
);
1383 __raw_writel(0xffffffff, dfb
);
1390 __raw_writel(mask_last
, sfb
);
1392 __raw_writel(mask_last
, dfb
);
1400 /* Reset the MODE register to normal. */
1401 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1405 tgafb_copyarea(struct fb_info
*info
, const struct fb_copyarea
*area
)
1407 unsigned long dx
, dy
, width
, height
, sx
, sy
, vxres
, vyres
;
1408 unsigned long line_length
, bpp
;
1412 width
= area
->width
;
1413 height
= area
->height
;
1416 vxres
= info
->var
.xres_virtual
;
1417 vyres
= info
->var
.yres_virtual
;
1418 line_length
= info
->fix
.line_length
;
1420 /* The top left corners must be in the virtual screen. */
1421 if (dx
> vxres
|| sx
> vxres
|| dy
> vyres
|| sy
> vyres
)
1424 /* Clip the destination. */
1425 if (dx
+ width
> vxres
)
1427 if (dy
+ height
> vyres
)
1428 height
= vyres
- dy
;
1430 /* The source must be completely inside the virtual screen. */
1431 if (sx
+ width
> vxres
|| sy
+ height
> vyres
)
1434 bpp
= info
->var
.bits_per_pixel
;
1436 /* Detect copies of the entire line. */
1437 if (width
* (bpp
>> 3) == line_length
) {
1439 copyarea_line_8bpp(info
, dy
, sy
, height
, width
);
1441 copyarea_line_32bpp(info
, dy
, sy
, height
, width
);
1444 /* ??? The documentation is unclear to me exactly how the pixelshift
1445 register works in 32bpp mode. Since I don't have hardware to test,
1446 give up for now and fall back on the generic routines. */
1448 cfb_copyarea(info
, area
);
1450 /* Detect overlapping source and destination that requires
1452 else if (dy
== sy
&& dx
> sx
&& dx
< sx
+ width
)
1453 copyarea_backward_8bpp(info
, dx
, dy
, sx
, sy
, height
,
1454 width
, line_length
, area
);
1456 copyarea_foreward_8bpp(info
, dx
, dy
, sx
, sy
, height
,
1457 width
, line_length
);
1466 tgafb_init_fix(struct fb_info
*info
)
1468 struct tga_par
*par
= (struct tga_par
*)info
->par
;
1469 int tga_bus_pci
= dev_is_pci(par
->dev
);
1470 int tga_bus_tc
= TGA_BUS_TC(par
->dev
);
1471 u8 tga_type
= par
->tga_type
;
1472 const char *tga_type_name
= NULL
;
1475 case TGA_TYPE_8PLANE
:
1477 tga_type_name
= "Digital ZLXp-E1";
1479 tga_type_name
= "Digital ZLX-E1";
1481 case TGA_TYPE_24PLANE
:
1483 tga_type_name
= "Digital ZLXp-E2";
1485 tga_type_name
= "Digital ZLX-E2";
1487 case TGA_TYPE_24PLUSZ
:
1489 tga_type_name
= "Digital ZLXp-E3";
1491 tga_type_name
= "Digital ZLX-E3";
1495 tga_type_name
= "Unknown";
1497 strlcpy(info
->fix
.id
, tga_type_name
, sizeof(info
->fix
.id
));
1499 info
->fix
.type
= FB_TYPE_PACKED_PIXELS
;
1500 info
->fix
.type_aux
= 0;
1501 info
->fix
.visual
= (tga_type
== TGA_TYPE_8PLANE
1502 ? FB_VISUAL_PSEUDOCOLOR
1503 : FB_VISUAL_DIRECTCOLOR
);
1505 info
->fix
.line_length
= par
->xres
* (par
->bits_per_pixel
>> 3);
1506 info
->fix
.smem_start
= (size_t) par
->tga_fb_base
;
1507 info
->fix
.smem_len
= info
->fix
.line_length
* par
->yres
;
1508 info
->fix
.mmio_start
= (size_t) par
->tga_regs_base
;
1509 info
->fix
.mmio_len
= 512;
1511 info
->fix
.xpanstep
= 0;
1512 info
->fix
.ypanstep
= 0;
1513 info
->fix
.ywrapstep
= 0;
1515 info
->fix
.accel
= FB_ACCEL_DEC_TGA
;
1518 * These are needed by fb_set_logo_truepalette(), so we
1519 * set them here for 24-plane cards.
1521 if (tga_type
!= TGA_TYPE_8PLANE
) {
1522 info
->var
.red
.length
= 8;
1523 info
->var
.green
.length
= 8;
1524 info
->var
.blue
.length
= 8;
1525 info
->var
.red
.offset
= 16;
1526 info
->var
.green
.offset
= 8;
1527 info
->var
.blue
.offset
= 0;
1531 static int tgafb_pan_display(struct fb_var_screeninfo
*var
, struct fb_info
*info
)
1533 /* We just use this to catch switches out of graphics mode. */
1534 tgafb_set_par(info
); /* A bit of overkill for BASE_ADDR reset. */
1538 static int tgafb_register(struct device
*dev
)
1540 static const struct fb_videomode modedb_tc
= {
1541 /* 1280x1024 @ 72 Hz, 76.8 kHz hsync */
1542 "1280x1024@72", 0, 1280, 1024, 7645, 224, 28, 33, 3, 160, 3,
1543 FB_SYNC_ON_GREEN
, FB_VMODE_NONINTERLACED
1546 static unsigned int const fb_offset_presets
[4] = {
1547 TGA_8PLANE_FB_OFFSET
,
1548 TGA_24PLANE_FB_OFFSET
,
1550 TGA_24PLUSZ_FB_OFFSET
1553 const struct fb_videomode
*modedb_tga
= NULL
;
1554 resource_size_t bar0_start
= 0, bar0_len
= 0;
1555 const char *mode_option_tga
= NULL
;
1556 int tga_bus_pci
= dev_is_pci(dev
);
1557 int tga_bus_tc
= TGA_BUS_TC(dev
);
1558 unsigned int modedbsize_tga
= 0;
1559 void __iomem
*mem_base
;
1560 struct fb_info
*info
;
1561 struct tga_par
*par
;
1565 /* Enable device in PCI config. */
1566 if (tga_bus_pci
&& pci_enable_device(to_pci_dev(dev
))) {
1567 printk(KERN_ERR
"tgafb: Cannot enable PCI device\n");
1571 /* Allocate the fb and par structures. */
1572 info
= framebuffer_alloc(sizeof(struct tga_par
), dev
);
1574 printk(KERN_ERR
"tgafb: Cannot allocate memory\n");
1579 dev_set_drvdata(dev
, info
);
1581 /* Request the mem regions. */
1584 bar0_start
= pci_resource_start(to_pci_dev(dev
), 0);
1585 bar0_len
= pci_resource_len(to_pci_dev(dev
), 0);
1588 bar0_start
= to_tc_dev(dev
)->resource
.start
;
1589 bar0_len
= to_tc_dev(dev
)->resource
.end
- bar0_start
+ 1;
1591 if (!request_mem_region (bar0_start
, bar0_len
, "tgafb")) {
1592 printk(KERN_ERR
"tgafb: cannot reserve FB region\n");
1596 /* Map the framebuffer. */
1597 mem_base
= ioremap_nocache(bar0_start
, bar0_len
);
1599 printk(KERN_ERR
"tgafb: Cannot map MMIO\n");
1603 /* Grab info about the card. */
1604 tga_type
= (readl(mem_base
) >> 12) & 0x0f;
1606 par
->tga_mem_base
= mem_base
;
1607 par
->tga_fb_base
= mem_base
+ fb_offset_presets
[tga_type
];
1608 par
->tga_regs_base
= mem_base
+ TGA_REGS_OFFSET
;
1609 par
->tga_type
= tga_type
;
1611 par
->tga_chip_rev
= (to_pci_dev(dev
))->revision
;
1613 par
->tga_chip_rev
= TGA_READ_REG(par
, TGA_START_REG
) & 0xff;
1615 /* Setup framebuffer. */
1616 info
->flags
= FBINFO_DEFAULT
| FBINFO_HWACCEL_COPYAREA
|
1617 FBINFO_HWACCEL_IMAGEBLIT
| FBINFO_HWACCEL_FILLRECT
;
1618 info
->fbops
= &tgafb_ops
;
1619 info
->screen_base
= par
->tga_fb_base
;
1620 info
->pseudo_palette
= par
->palette
;
1622 /* This should give a reasonable default video mode. */
1624 mode_option_tga
= mode_option_pci
;
1627 mode_option_tga
= mode_option_tc
;
1628 modedb_tga
= &modedb_tc
;
1631 ret
= fb_find_mode(&info
->var
, info
,
1632 mode_option
? mode_option
: mode_option_tga
,
1633 modedb_tga
, modedbsize_tga
, NULL
,
1634 tga_type
== TGA_TYPE_8PLANE
? 8 : 32);
1635 if (ret
== 0 || ret
== 4) {
1636 printk(KERN_ERR
"tgafb: Could not find valid video mode\n");
1641 if (fb_alloc_cmap(&info
->cmap
, 256, 0)) {
1642 printk(KERN_ERR
"tgafb: Could not allocate color map\n");
1647 tgafb_set_par(info
);
1648 tgafb_init_fix(info
);
1650 if (register_framebuffer(info
) < 0) {
1651 printk(KERN_ERR
"tgafb: Could not register framebuffer\n");
1657 pr_info("tgafb: DC21030 [TGA] detected, rev=0x%02x\n",
1659 pr_info("tgafb: at PCI bus %d, device %d, function %d\n",
1660 to_pci_dev(dev
)->bus
->number
,
1661 PCI_SLOT(to_pci_dev(dev
)->devfn
),
1662 PCI_FUNC(to_pci_dev(dev
)->devfn
));
1665 pr_info("tgafb: SFB+ detected, rev=0x%02x\n",
1667 fb_info(info
, "%s frame buffer device at 0x%lx\n",
1668 info
->fix
.id
, (long)bar0_start
);
1673 fb_dealloc_cmap(&info
->cmap
);
1677 release_mem_region(bar0_start
, bar0_len
);
1679 framebuffer_release(info
);
1683 static void tgafb_unregister(struct device
*dev
)
1685 resource_size_t bar0_start
= 0, bar0_len
= 0;
1686 int tga_bus_pci
= dev_is_pci(dev
);
1687 int tga_bus_tc
= TGA_BUS_TC(dev
);
1688 struct fb_info
*info
= NULL
;
1689 struct tga_par
*par
;
1691 info
= dev_get_drvdata(dev
);
1696 unregister_framebuffer(info
);
1697 fb_dealloc_cmap(&info
->cmap
);
1698 iounmap(par
->tga_mem_base
);
1700 bar0_start
= pci_resource_start(to_pci_dev(dev
), 0);
1701 bar0_len
= pci_resource_len(to_pci_dev(dev
), 0);
1704 bar0_start
= to_tc_dev(dev
)->resource
.start
;
1705 bar0_len
= to_tc_dev(dev
)->resource
.end
- bar0_start
+ 1;
1707 release_mem_region(bar0_start
, bar0_len
);
1708 framebuffer_release(info
);
1711 static void tgafb_exit(void)
1713 tc_unregister_driver(&tgafb_tc_driver
);
1714 pci_unregister_driver(&tgafb_pci_driver
);
1718 static int tgafb_setup(char *arg
)
1723 while ((this_opt
= strsep(&arg
, ","))) {
1726 if (!strncmp(this_opt
, "mode:", 5))
1727 mode_option
= this_opt
+5;
1730 "tgafb: unknown parameter %s\n",
1737 #endif /* !MODULE */
1739 static int tgafb_init(void)
1743 char *option
= NULL
;
1745 if (fb_get_options("tgafb", &option
))
1747 tgafb_setup(option
);
1749 status
= pci_register_driver(&tgafb_pci_driver
);
1751 status
= tc_register_driver(&tgafb_tc_driver
);
1759 module_init(tgafb_init
);
1760 module_exit(tgafb_exit
);
1762 MODULE_DESCRIPTION("Framebuffer driver for TGA/SFB+ chipset");
1763 MODULE_LICENSE("GPL");