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
9 * This file is subject to the terms and conditions of the GNU General Public
10 * License. See the file COPYING in the main directory of this archive for
14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/sched.h>
17 #include <linux/errno.h>
18 #include <linux/string.h>
20 #include <linux/tty.h>
21 #include <linux/slab.h>
22 #include <linux/delay.h>
23 #include <linux/init.h>
25 #include <linux/pci.h>
26 #include <linux/selection.h>
28 #include <video/tgafb.h>
34 static int tgafb_check_var(struct fb_var_screeninfo
*, struct fb_info
*);
35 static int tgafb_set_par(struct fb_info
*);
36 static void tgafb_set_pll(struct tga_par
*, int);
37 static int tgafb_setcolreg(unsigned, unsigned, unsigned, unsigned,
38 unsigned, struct fb_info
*);
39 static int tgafb_blank(int, struct fb_info
*);
40 static void tgafb_init_fix(struct fb_info
*);
42 static void tgafb_imageblit(struct fb_info
*, const struct fb_image
*);
43 static void tgafb_fillrect(struct fb_info
*, const struct fb_fillrect
*);
44 static void tgafb_copyarea(struct fb_info
*, const struct fb_copyarea
*);
46 static int tgafb_pci_register(struct pci_dev
*, const struct pci_device_id
*);
47 static void tgafb_pci_unregister(struct pci_dev
*);
49 static const char *mode_option
= "640x480@60";
53 * Frame buffer operations
56 static struct fb_ops tgafb_ops
= {
58 .fb_check_var
= tgafb_check_var
,
59 .fb_set_par
= tgafb_set_par
,
60 .fb_setcolreg
= tgafb_setcolreg
,
61 .fb_blank
= tgafb_blank
,
62 .fb_fillrect
= tgafb_fillrect
,
63 .fb_copyarea
= tgafb_copyarea
,
64 .fb_imageblit
= tgafb_imageblit
,
69 * PCI registration operations
72 static struct pci_device_id
const tgafb_pci_table
[] = {
73 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TGA
, PCI_ANY_ID
, PCI_ANY_ID
,
77 static struct pci_driver tgafb_driver
= {
79 .id_table
= tgafb_pci_table
,
80 .probe
= tgafb_pci_register
,
81 .remove
= __devexit_p(tgafb_pci_unregister
),
86 * tgafb_check_var - Optional function. Validates a var passed in.
87 * @var: frame buffer variable screen structure
88 * @info: frame buffer structure that represents a single frame buffer
91 tgafb_check_var(struct fb_var_screeninfo
*var
, struct fb_info
*info
)
93 struct tga_par
*par
= (struct tga_par
*)info
->par
;
95 if (par
->tga_type
== TGA_TYPE_8PLANE
) {
96 if (var
->bits_per_pixel
!= 8)
99 if (var
->bits_per_pixel
!= 32)
103 if (var
->xres_virtual
!= var
->xres
|| var
->yres_virtual
!= var
->yres
)
107 if (1000000000 / var
->pixclock
> TGA_PLL_MAX_FREQ
)
109 if ((var
->vmode
& FB_VMODE_MASK
) != FB_VMODE_NONINTERLACED
)
112 /* Some of the acceleration routines assume the line width is
113 a multiple of 64 bytes. */
114 if (var
->xres
* (par
->tga_type
== TGA_TYPE_8PLANE
? 1 : 4) % 64)
121 * tgafb_set_par - Optional function. Alters the hardware state.
122 * @info: frame buffer structure that represents a single frame buffer
125 tgafb_set_par(struct fb_info
*info
)
127 static unsigned int const deep_presets
[4] = {
133 static unsigned int const rasterop_presets
[4] = {
139 static unsigned int const mode_presets
[4] = {
145 static unsigned int const base_addr_presets
[4] = {
152 struct tga_par
*par
= (struct tga_par
*) info
->par
;
153 u32 htimings
, vtimings
, pll_freq
;
157 /* Encode video timings. */
158 htimings
= (((info
->var
.xres
/4) & TGA_HORIZ_ACT_LSB
)
159 | (((info
->var
.xres
/4) & 0x600 << 19) & TGA_HORIZ_ACT_MSB
));
160 vtimings
= (info
->var
.yres
& TGA_VERT_ACTIVE
);
161 htimings
|= ((info
->var
.right_margin
/4) << 9) & TGA_HORIZ_FP
;
162 vtimings
|= (info
->var
.lower_margin
<< 11) & TGA_VERT_FP
;
163 htimings
|= ((info
->var
.hsync_len
/4) << 14) & TGA_HORIZ_SYNC
;
164 vtimings
|= (info
->var
.vsync_len
<< 16) & TGA_VERT_SYNC
;
165 htimings
|= ((info
->var
.left_margin
/4) << 21) & TGA_HORIZ_BP
;
166 vtimings
|= (info
->var
.upper_margin
<< 22) & TGA_VERT_BP
;
168 if (info
->var
.sync
& FB_SYNC_HOR_HIGH_ACT
)
169 htimings
|= TGA_HORIZ_POLARITY
;
170 if (info
->var
.sync
& FB_SYNC_VERT_HIGH_ACT
)
171 vtimings
|= TGA_VERT_POLARITY
;
173 par
->htimings
= htimings
;
174 par
->vtimings
= vtimings
;
176 par
->sync_on_green
= !!(info
->var
.sync
& FB_SYNC_ON_GREEN
);
178 /* Store other useful values in par. */
179 par
->xres
= info
->var
.xres
;
180 par
->yres
= info
->var
.yres
;
181 par
->pll_freq
= pll_freq
= 1000000000 / info
->var
.pixclock
;
182 par
->bits_per_pixel
= info
->var
.bits_per_pixel
;
184 tga_type
= par
->tga_type
;
186 /* First, disable video. */
187 TGA_WRITE_REG(par
, TGA_VALID_VIDEO
| TGA_VALID_BLANK
, TGA_VALID_REG
);
189 /* Write the DEEP register. */
190 while (TGA_READ_REG(par
, TGA_CMD_STAT_REG
) & 1) /* wait for not busy */
193 TGA_WRITE_REG(par
, deep_presets
[tga_type
], TGA_DEEP_REG
);
194 while (TGA_READ_REG(par
, TGA_CMD_STAT_REG
) & 1) /* wait for not busy */
198 /* Write some more registers. */
199 TGA_WRITE_REG(par
, rasterop_presets
[tga_type
], TGA_RASTEROP_REG
);
200 TGA_WRITE_REG(par
, mode_presets
[tga_type
], TGA_MODE_REG
);
201 TGA_WRITE_REG(par
, base_addr_presets
[tga_type
], TGA_BASE_ADDR_REG
);
203 /* Calculate & write the PLL. */
204 tgafb_set_pll(par
, pll_freq
);
206 /* Write some more registers. */
207 TGA_WRITE_REG(par
, 0xffffffff, TGA_PLANEMASK_REG
);
208 TGA_WRITE_REG(par
, 0xffffffff, TGA_PIXELMASK_REG
);
210 /* Init video timing regs. */
211 TGA_WRITE_REG(par
, htimings
, TGA_HORIZ_REG
);
212 TGA_WRITE_REG(par
, vtimings
, TGA_VERT_REG
);
214 /* Initalise RAMDAC. */
215 if (tga_type
== TGA_TYPE_8PLANE
) {
217 /* Init BT485 RAMDAC registers. */
218 BT485_WRITE(par
, 0xa2 | (par
->sync_on_green
? 0x8 : 0x0),
220 BT485_WRITE(par
, 0x01, BT485_ADDR_PAL_WRITE
);
221 BT485_WRITE(par
, 0x14, BT485_CMD_3
); /* cursor 64x64 */
222 BT485_WRITE(par
, 0x40, BT485_CMD_1
);
223 BT485_WRITE(par
, 0x20, BT485_CMD_2
); /* cursor off, for now */
224 BT485_WRITE(par
, 0xff, BT485_PIXEL_MASK
);
226 /* Fill palette registers. */
227 BT485_WRITE(par
, 0x00, BT485_ADDR_PAL_WRITE
);
228 TGA_WRITE_REG(par
, BT485_DATA_PAL
, TGA_RAMDAC_SETUP_REG
);
230 for (i
= 0; i
< 16; i
++) {
232 TGA_WRITE_REG(par
, default_red
[j
]|(BT485_DATA_PAL
<<8),
234 TGA_WRITE_REG(par
, default_grn
[j
]|(BT485_DATA_PAL
<<8),
236 TGA_WRITE_REG(par
, default_blu
[j
]|(BT485_DATA_PAL
<<8),
239 for (i
= 0; i
< 240*3; i
+= 4) {
240 TGA_WRITE_REG(par
, 0x55|(BT485_DATA_PAL
<<8),
242 TGA_WRITE_REG(par
, 0x00|(BT485_DATA_PAL
<<8),
244 TGA_WRITE_REG(par
, 0x00|(BT485_DATA_PAL
<<8),
246 TGA_WRITE_REG(par
, 0x00|(BT485_DATA_PAL
<<8),
250 } else { /* 24-plane or 24plusZ */
252 /* Init BT463 registers. */
253 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_0
, 0x40);
254 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_1
, 0x08);
255 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_2
,
256 (par
->sync_on_green
? 0x80 : 0x40));
258 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_0
, 0xff);
259 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_1
, 0xff);
260 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_2
, 0xff);
261 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_3
, 0x0f);
263 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_0
, 0x00);
264 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_1
, 0x00);
265 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_2
, 0x00);
266 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_3
, 0x00);
268 /* Fill the palette. */
269 BT463_LOAD_ADDR(par
, 0x0000);
270 TGA_WRITE_REG(par
, BT463_PALETTE
<<2, TGA_RAMDAC_REG
);
272 for (i
= 0; i
< 16; i
++) {
274 TGA_WRITE_REG(par
, default_red
[j
]|(BT463_PALETTE
<<10),
276 TGA_WRITE_REG(par
, default_grn
[j
]|(BT463_PALETTE
<<10),
278 TGA_WRITE_REG(par
, default_blu
[j
]|(BT463_PALETTE
<<10),
281 for (i
= 0; i
< 512*3; i
+= 4) {
282 TGA_WRITE_REG(par
, 0x55|(BT463_PALETTE
<<10),
284 TGA_WRITE_REG(par
, 0x00|(BT463_PALETTE
<<10),
286 TGA_WRITE_REG(par
, 0x00|(BT463_PALETTE
<<10),
288 TGA_WRITE_REG(par
, 0x00|(BT463_PALETTE
<<10),
292 /* Fill window type table after start of vertical retrace. */
293 while (!(TGA_READ_REG(par
, TGA_INTR_STAT_REG
) & 0x01))
295 TGA_WRITE_REG(par
, 0x01, TGA_INTR_STAT_REG
);
297 while (!(TGA_READ_REG(par
, TGA_INTR_STAT_REG
) & 0x01))
299 TGA_WRITE_REG(par
, 0x01, TGA_INTR_STAT_REG
);
301 BT463_LOAD_ADDR(par
, BT463_WINDOW_TYPE_BASE
);
302 TGA_WRITE_REG(par
, BT463_REG_ACC
<<2, TGA_RAMDAC_SETUP_REG
);
304 for (i
= 0; i
< 16; i
++) {
305 TGA_WRITE_REG(par
, 0x00|(BT463_REG_ACC
<<10),
307 TGA_WRITE_REG(par
, 0x01|(BT463_REG_ACC
<<10),
309 TGA_WRITE_REG(par
, 0x80|(BT463_REG_ACC
<<10),
315 /* Finally, enable video scan (and pray for the monitor... :-) */
316 TGA_WRITE_REG(par
, TGA_VALID_VIDEO
, TGA_VALID_REG
);
321 #define DIFFCHECK(X) \
324 int delta = f - (TGA_PLL_BASE_FREQ * (X)) / (r << shift); \
327 if (delta < min_diff) \
328 min_diff = delta, vm = m, va = a, vr = r; \
333 tgafb_set_pll(struct tga_par
*par
, int f
)
335 int n
, shift
, base
, min_diff
, target
;
336 int r
,a
,m
,vm
= 34, va
= 1, vr
= 30;
338 for (r
= 0 ; r
< 12 ; r
++)
339 TGA_WRITE_REG(par
, !r
, TGA_CLOCK_REG
);
341 if (f
> TGA_PLL_MAX_FREQ
)
342 f
= TGA_PLL_MAX_FREQ
;
344 if (f
>= TGA_PLL_MAX_FREQ
/ 2)
346 else if (f
>= TGA_PLL_MAX_FREQ
/ 4)
351 TGA_WRITE_REG(par
, shift
& 1, TGA_CLOCK_REG
);
352 TGA_WRITE_REG(par
, shift
>> 1, TGA_CLOCK_REG
);
354 for (r
= 0 ; r
< 10 ; r
++)
355 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
358 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
359 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
361 else if (f
<= 200000) {
362 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
363 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
366 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
367 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
370 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
371 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
372 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
373 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
374 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
375 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
377 target
= (f
<< shift
) / TGA_PLL_BASE_FREQ
;
378 min_diff
= TGA_PLL_MAX_FREQ
;
385 for (n
= base
< 7 ? 7 : base
; n
< base
+ target
&& n
< 449; n
++) {
386 m
= ((n
+ 3) / 7) - 1;
388 DIFFCHECK((m
+ 1) * 7);
390 DIFFCHECK((m
+ 1) * 7);
401 for (r
= 0; r
< 8; r
++)
402 TGA_WRITE_REG(par
, (vm
>> r
) & 1, TGA_CLOCK_REG
);
403 for (r
= 0; r
< 8 ; r
++)
404 TGA_WRITE_REG(par
, (va
>> r
) & 1, TGA_CLOCK_REG
);
405 for (r
= 0; r
< 7 ; r
++)
406 TGA_WRITE_REG(par
, (vr
>> r
) & 1, TGA_CLOCK_REG
);
407 TGA_WRITE_REG(par
, ((vr
>> 7) & 1)|2, TGA_CLOCK_REG
);
412 * tgafb_setcolreg - Optional function. Sets a color register.
413 * @regno: boolean, 0 copy local, 1 get_user() function
414 * @red: frame buffer colormap structure
415 * @green: The green value which can be up to 16 bits wide
416 * @blue: The blue value which can be up to 16 bits wide.
417 * @transp: If supported the alpha value which can be up to 16 bits wide.
418 * @info: frame buffer info structure
421 tgafb_setcolreg(unsigned regno
, unsigned red
, unsigned green
, unsigned blue
,
422 unsigned transp
, struct fb_info
*info
)
424 struct tga_par
*par
= (struct tga_par
*) info
->par
;
432 if (par
->tga_type
== TGA_TYPE_8PLANE
) {
433 BT485_WRITE(par
, regno
, BT485_ADDR_PAL_WRITE
);
434 TGA_WRITE_REG(par
, BT485_DATA_PAL
, TGA_RAMDAC_SETUP_REG
);
435 TGA_WRITE_REG(par
, red
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
436 TGA_WRITE_REG(par
, green
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
437 TGA_WRITE_REG(par
, blue
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
438 } else if (regno
< 16) {
439 u32 value
= (red
<< 16) | (green
<< 8) | blue
;
440 ((u32
*)info
->pseudo_palette
)[regno
] = value
;
448 * tgafb_blank - Optional function. Blanks the display.
449 * @blank_mode: the blank mode we want.
450 * @info: frame buffer structure that represents a single frame buffer
453 tgafb_blank(int blank
, struct fb_info
*info
)
455 struct tga_par
*par
= (struct tga_par
*) info
->par
;
456 u32 vhcr
, vvcr
, vvvr
;
459 local_irq_save(flags
);
461 vhcr
= TGA_READ_REG(par
, TGA_HORIZ_REG
);
462 vvcr
= TGA_READ_REG(par
, TGA_VERT_REG
);
463 vvvr
= TGA_READ_REG(par
, TGA_VALID_REG
);
464 vvvr
&= ~(TGA_VALID_VIDEO
| TGA_VALID_BLANK
);
467 case FB_BLANK_UNBLANK
: /* Unblanking */
468 if (par
->vesa_blanked
) {
469 TGA_WRITE_REG(par
, vhcr
& 0xbfffffff, TGA_HORIZ_REG
);
470 TGA_WRITE_REG(par
, vvcr
& 0xbfffffff, TGA_VERT_REG
);
471 par
->vesa_blanked
= 0;
473 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_VIDEO
, TGA_VALID_REG
);
476 case FB_BLANK_NORMAL
: /* Normal blanking */
477 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_VIDEO
| TGA_VALID_BLANK
,
481 case FB_BLANK_VSYNC_SUSPEND
: /* VESA blank (vsync off) */
482 TGA_WRITE_REG(par
, vvcr
| 0x40000000, TGA_VERT_REG
);
483 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
484 par
->vesa_blanked
= 1;
487 case FB_BLANK_HSYNC_SUSPEND
: /* VESA blank (hsync off) */
488 TGA_WRITE_REG(par
, vhcr
| 0x40000000, TGA_HORIZ_REG
);
489 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
490 par
->vesa_blanked
= 1;
493 case FB_BLANK_POWERDOWN
: /* Poweroff */
494 TGA_WRITE_REG(par
, vhcr
| 0x40000000, TGA_HORIZ_REG
);
495 TGA_WRITE_REG(par
, vvcr
| 0x40000000, TGA_VERT_REG
);
496 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
497 par
->vesa_blanked
= 1;
501 local_irq_restore(flags
);
511 * tgafb_imageblit - REQUIRED function. Can use generic routines if
512 * non acclerated hardware and packed pixel based.
513 * Copies a image from system memory to the screen.
515 * @info: frame buffer structure that represents a single frame buffer
516 * @image: structure defining the image.
519 tgafb_imageblit(struct fb_info
*info
, const struct fb_image
*image
)
521 static unsigned char const bitrev
[256] = {
522 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
523 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
524 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
525 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
526 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
527 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
528 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
529 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
530 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
531 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
532 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
533 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
534 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
535 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
536 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
537 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
538 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
539 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
540 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
541 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
542 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
543 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
544 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
545 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
546 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
547 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
548 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
549 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
550 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
551 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
552 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
553 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
556 struct tga_par
*par
= (struct tga_par
*) info
->par
;
557 u32 fgcolor
, bgcolor
, dx
, dy
, width
, height
, vxres
, vyres
, pixelmask
;
558 unsigned long rincr
, line_length
, shift
, pos
, is8bpp
;
560 const unsigned char *data
;
561 void __iomem
*regs_base
;
562 void __iomem
*fb_base
;
566 width
= image
->width
;
567 height
= image
->height
;
568 vxres
= info
->var
.xres_virtual
;
569 vyres
= info
->var
.yres_virtual
;
570 line_length
= info
->fix
.line_length
;
571 rincr
= (width
+ 7) / 8;
573 /* Crop the image to the screen. */
574 if (dx
> vxres
|| dy
> vyres
)
576 if (dx
+ width
> vxres
)
578 if (dy
+ height
> vyres
)
581 /* For copies that aren't pixel expansion, there's little we
582 can do better than the generic code. */
583 /* ??? There is a DMA write mode; I wonder if that could be
584 made to pull the data from the image buffer... */
585 if (image
->depth
> 1) {
586 cfb_imageblit(info
, image
);
590 regs_base
= par
->tga_regs_base
;
591 fb_base
= par
->tga_fb_base
;
592 is8bpp
= info
->var
.bits_per_pixel
== 8;
594 /* Expand the color values to fill 32-bits. */
595 /* ??? Would be nice to notice colour changes elsewhere, so
596 that we can do this only when necessary. */
597 fgcolor
= image
->fg_color
;
598 bgcolor
= image
->bg_color
;
600 fgcolor
|= fgcolor
<< 8;
601 fgcolor
|= fgcolor
<< 16;
602 bgcolor
|= bgcolor
<< 8;
603 bgcolor
|= bgcolor
<< 16;
606 fgcolor
= ((u32
*)info
->pseudo_palette
)[fgcolor
];
608 bgcolor
= ((u32
*)info
->pseudo_palette
)[bgcolor
];
610 __raw_writel(fgcolor
, regs_base
+ TGA_FOREGROUND_REG
);
611 __raw_writel(bgcolor
, regs_base
+ TGA_BACKGROUND_REG
);
613 /* Acquire proper alignment; set up the PIXELMASK register
614 so that we only write the proper character cell. */
615 pos
= dy
* line_length
;
622 shift
= (pos
& 7) >> 2;
626 data
= (const unsigned char *) image
->data
;
628 /* Enable opaque stipple mode. */
630 ? TGA_MODE_SBM_8BPP
| TGA_MODE_OPAQUE_STIPPLE
631 : TGA_MODE_SBM_24BPP
| TGA_MODE_OPAQUE_STIPPLE
),
632 regs_base
+ TGA_MODE_REG
);
634 if (width
+ shift
<= 32) {
635 unsigned long bwidth
;
637 /* Handle common case of imaging a single character, in
638 a font less than 32 pixels wide. */
640 pixelmask
= (1 << width
) - 1;
642 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
645 bwidth
= (width
+ 7) / 8;
647 for (i
= 0; i
< height
; ++i
) {
650 /* The image data is bit big endian; we need
652 for (j
= 0; j
< bwidth
; ++j
)
653 mask
|= bitrev
[data
[j
]] << (j
* 8);
655 __raw_writel(mask
<< shift
, fb_base
+ pos
);
661 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
662 } else if (shift
== 0) {
663 unsigned long pos0
= pos
;
664 const unsigned char *data0
= data
;
665 unsigned long bincr
= (is8bpp
? 8 : 8*4);
666 unsigned long bwidth
;
668 /* Handle another common case in which accel_putcs
669 generates a large bitmap, which happens to be aligned.
670 Allow the tail to be misaligned. This case is
671 interesting because we've not got to hold partial
672 bytes across the words being written. */
676 bwidth
= (width
/ 8) & -4;
677 for (i
= 0; i
< height
; ++i
) {
678 for (j
= 0; j
< bwidth
; j
+= 4) {
680 mask
|= bitrev
[data
[j
+0]] << (0 * 8);
681 mask
|= bitrev
[data
[j
+1]] << (1 * 8);
682 mask
|= bitrev
[data
[j
+2]] << (2 * 8);
683 mask
|= bitrev
[data
[j
+3]] << (3 * 8);
684 __raw_writel(mask
, fb_base
+ pos
+ j
*bincr
);
691 pixelmask
= (1ul << (width
& 31)) - 1;
693 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
696 pos
= pos0
+ bwidth
*bincr
;
697 data
= data0
+ bwidth
;
698 bwidth
= ((width
& 31) + 7) / 8;
700 for (i
= 0; i
< height
; ++i
) {
702 for (j
= 0; j
< bwidth
; ++j
)
703 mask
|= bitrev
[data
[j
]] << (j
* 8);
704 __raw_writel(mask
, fb_base
+ pos
);
709 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
712 unsigned long pos0
= pos
;
713 const unsigned char *data0
= data
;
714 unsigned long bincr
= (is8bpp
? 8 : 8*4);
715 unsigned long bwidth
;
717 /* Finally, handle the generic case of misaligned start.
718 Here we split the write into 16-bit spans. This allows
719 us to use only one pixel mask, instead of four as would
720 be required by writing 24-bit spans. */
722 pixelmask
= 0xffff << shift
;
723 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
726 bwidth
= (width
/ 8) & -2;
727 for (i
= 0; i
< height
; ++i
) {
728 for (j
= 0; j
< bwidth
; j
+= 2) {
730 mask
|= bitrev
[data
[j
+0]] << (0 * 8);
731 mask
|= bitrev
[data
[j
+1]] << (1 * 8);
733 __raw_writel(mask
, fb_base
+ pos
+ j
*bincr
);
740 pixelmask
= ((1ul << (width
& 15)) - 1) << shift
;
742 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
745 pos
= pos0
+ bwidth
*bincr
;
746 data
= data0
+ bwidth
;
747 bwidth
= (width
& 15) > 8;
749 for (i
= 0; i
< height
; ++i
) {
750 u32 mask
= bitrev
[data
[0]];
752 mask
|= bitrev
[data
[1]] << 8;
754 __raw_writel(mask
, fb_base
+ pos
);
760 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
763 /* Disable opaque stipple mode. */
765 ? TGA_MODE_SBM_8BPP
| TGA_MODE_SIMPLE
766 : TGA_MODE_SBM_24BPP
| TGA_MODE_SIMPLE
),
767 regs_base
+ TGA_MODE_REG
);
771 * tgafb_fillrect - REQUIRED function. Can use generic routines if
772 * non acclerated hardware and packed pixel based.
773 * Draws a rectangle on the screen.
775 * @info: frame buffer structure that represents a single frame buffer
776 * @rect: structure defining the rectagle and operation.
779 tgafb_fillrect(struct fb_info
*info
, const struct fb_fillrect
*rect
)
781 struct tga_par
*par
= (struct tga_par
*) info
->par
;
782 int is8bpp
= info
->var
.bits_per_pixel
== 8;
783 u32 dx
, dy
, width
, height
, vxres
, vyres
, color
;
784 unsigned long pos
, align
, line_length
, i
, j
;
785 void __iomem
*regs_base
;
786 void __iomem
*fb_base
;
791 height
= rect
->height
;
792 vxres
= info
->var
.xres_virtual
;
793 vyres
= info
->var
.yres_virtual
;
794 line_length
= info
->fix
.line_length
;
795 regs_base
= par
->tga_regs_base
;
796 fb_base
= par
->tga_fb_base
;
798 /* Crop the rectangle to the screen. */
799 if (dx
> vxres
|| dy
> vyres
|| !width
|| !height
)
801 if (dx
+ width
> vxres
)
803 if (dy
+ height
> vyres
)
806 pos
= dy
* line_length
+ dx
* (is8bpp
? 1 : 4);
808 /* ??? We could implement ROP_XOR with opaque fill mode
809 and a RasterOp setting of GXxor, but as far as I can
810 tell, this mode is not actually used in the kernel.
811 Thus I am ignoring it for now. */
812 if (rect
->rop
!= ROP_COPY
) {
813 cfb_fillrect(info
, rect
);
817 /* Expand the color value to fill 8 pixels. */
821 color
|= color
<< 16;
822 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR0_REG
);
823 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR1_REG
);
826 color
= ((u32
*)info
->pseudo_palette
)[color
];
827 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR0_REG
);
828 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR1_REG
);
829 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR2_REG
);
830 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR3_REG
);
831 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR4_REG
);
832 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR5_REG
);
833 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR6_REG
);
834 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR7_REG
);
837 /* The DATA register holds the fill mask for block fill mode.
838 Since we're not stippling, this is all ones. */
839 __raw_writel(0xffffffff, regs_base
+ TGA_DATA_REG
);
841 /* Enable block fill mode. */
843 ? TGA_MODE_SBM_8BPP
| TGA_MODE_BLOCK_FILL
844 : TGA_MODE_SBM_24BPP
| TGA_MODE_BLOCK_FILL
),
845 regs_base
+ TGA_MODE_REG
);
848 /* We can fill 2k pixels per operation. Notice blocks that fit
849 the width of the screen so that we can take advantage of this
850 and fill more than one line per write. */
851 if (width
== line_length
)
852 width
*= height
, height
= 1;
854 /* The write into the frame buffer must be aligned to 4 bytes,
855 but we are allowed to encode the offset within the word in
856 the data word written. */
857 align
= (pos
& 3) << 16;
863 data
= (width
- 1) | align
;
865 for (i
= 0; i
< height
; ++i
) {
866 __raw_writel(data
, fb_base
+ pos
);
870 unsigned long Bpp
= (is8bpp
? 1 : 4);
871 unsigned long nwidth
= width
& -2048;
874 fdata
= (2048 - 1) | align
;
875 ldata
= ((width
& 2047) - 1) | align
;
877 for (i
= 0; i
< height
; ++i
) {
878 for (j
= 0; j
< nwidth
; j
+= 2048)
879 __raw_writel(fdata
, fb_base
+ pos
+ j
*Bpp
);
881 __raw_writel(ldata
, fb_base
+ pos
+ j
*Bpp
);
887 /* Disable block fill mode. */
889 ? TGA_MODE_SBM_8BPP
| TGA_MODE_SIMPLE
890 : TGA_MODE_SBM_24BPP
| TGA_MODE_SIMPLE
),
891 regs_base
+ TGA_MODE_REG
);
895 * tgafb_copyarea - REQUIRED function. Can use generic routines if
896 * non acclerated hardware and packed pixel based.
897 * Copies on area of the screen to another area.
899 * @info: frame buffer structure that represents a single frame buffer
900 * @area: structure defining the source and destination.
903 /* Handle the special case of copying entire lines, e.g. during scrolling.
904 We can avoid a lot of needless computation in this case. In the 8bpp
905 case we need to use the COPY64 registers instead of mask writes into
906 the frame buffer to achieve maximum performance. */
909 copyarea_line_8bpp(struct fb_info
*info
, u32 dy
, u32 sy
,
910 u32 height
, u32 width
)
912 struct tga_par
*par
= (struct tga_par
*) info
->par
;
913 void __iomem
*tga_regs
= par
->tga_regs_base
;
914 unsigned long dpos
, spos
, i
, n64
;
916 /* Set up the MODE and PIXELSHIFT registers. */
917 __raw_writel(TGA_MODE_SBM_8BPP
| TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
918 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
921 n64
= (height
* width
) / 64;
924 spos
= (sy
+ height
) * width
;
925 dpos
= (dy
+ height
) * width
;
927 for (i
= 0; i
< n64
; ++i
) {
930 __raw_writel(spos
, tga_regs
+TGA_COPY64_SRC
);
932 __raw_writel(dpos
, tga_regs
+TGA_COPY64_DST
);
939 for (i
= 0; i
< n64
; ++i
) {
940 __raw_writel(spos
, tga_regs
+TGA_COPY64_SRC
);
942 __raw_writel(dpos
, tga_regs
+TGA_COPY64_DST
);
949 /* Reset the MODE register to normal. */
950 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
954 copyarea_line_32bpp(struct fb_info
*info
, u32 dy
, u32 sy
,
955 u32 height
, u32 width
)
957 struct tga_par
*par
= (struct tga_par
*) info
->par
;
958 void __iomem
*tga_regs
= par
->tga_regs_base
;
959 void __iomem
*tga_fb
= par
->tga_fb_base
;
962 unsigned long i
, n16
;
964 /* Set up the MODE and PIXELSHIFT registers. */
965 __raw_writel(TGA_MODE_SBM_24BPP
| TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
966 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
969 n16
= (height
* width
) / 16;
972 src
= tga_fb
+ (sy
+ height
) * width
* 4;
973 dst
= tga_fb
+ (dy
+ height
) * width
* 4;
975 for (i
= 0; i
< n16
; ++i
) {
978 __raw_writel(0xffff, src
);
980 __raw_writel(0xffff, dst
);
984 src
= tga_fb
+ sy
* width
* 4;
985 dst
= tga_fb
+ dy
* width
* 4;
987 for (i
= 0; i
< n16
; ++i
) {
988 __raw_writel(0xffff, src
);
990 __raw_writel(0xffff, dst
);
997 /* Reset the MODE register to normal. */
998 __raw_writel(TGA_MODE_SBM_24BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1001 /* The general case of forward copy in 8bpp mode. */
1003 copyarea_foreward_8bpp(struct fb_info
*info
, u32 dx
, u32 dy
, u32 sx
, u32 sy
,
1004 u32 height
, u32 width
, u32 line_length
)
1006 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1007 unsigned long i
, copied
, left
;
1008 unsigned long dpos
, spos
, dalign
, salign
, yincr
;
1009 u32 smask_first
, dmask_first
, dmask_last
;
1010 int pixel_shift
, need_prime
, need_second
;
1011 unsigned long n64
, n32
, xincr_first
;
1012 void __iomem
*tga_regs
;
1013 void __iomem
*tga_fb
;
1015 yincr
= line_length
;
1022 /* Compute the offsets and alignments in the frame buffer.
1023 More than anything else, these control how we do copies. */
1024 dpos
= dy
* line_length
+ dx
;
1025 spos
= sy
* line_length
+ sx
;
1031 /* Compute the value for the PIXELSHIFT register. This controls
1032 both non-co-aligned source and destination and copy direction. */
1033 if (dalign
>= salign
)
1034 pixel_shift
= dalign
- salign
;
1036 pixel_shift
= 8 - (salign
- dalign
);
1038 /* Figure out if we need an additional priming step for the
1039 residue register. */
1040 need_prime
= (salign
> dalign
);
1044 /* Begin by copying the leading unaligned destination. Copy enough
1045 to make the next destination address 32-byte aligned. */
1046 copied
= 32 - (dalign
+ (dpos
& 31));
1049 xincr_first
= (copied
+ 7) & -8;
1050 smask_first
= dmask_first
= (1ul << copied
) - 1;
1051 smask_first
<<= salign
;
1052 dmask_first
<<= dalign
+ need_prime
*8;
1053 if (need_prime
&& copied
> 24)
1055 left
= width
- copied
;
1057 /* Care for small copies. */
1058 if (copied
> width
) {
1060 t
= (1ul << width
) - 1;
1061 t
<<= dalign
+ need_prime
*8;
1066 /* Attempt to use 64-byte copies. This is only possible if the
1067 source and destination are co-aligned at 64 bytes. */
1068 n64
= need_second
= 0;
1069 if ((dpos
& 63) == (spos
& 63)
1070 && (height
== 1 || line_length
% 64 == 0)) {
1071 /* We may need a 32-byte copy to ensure 64 byte alignment. */
1072 need_second
= (dpos
+ xincr_first
) & 63;
1073 if ((need_second
& 32) != need_second
)
1074 printk(KERN_ERR
"tgafb: need_second wrong\n");
1075 if (left
>= need_second
+ 64) {
1076 left
-= need_second
;
1083 /* Copy trailing full 32-byte sections. This will be the main
1084 loop if the 64 byte loop can't be used. */
1088 /* Copy the trailing unaligned destination. */
1089 dmask_last
= (1ul << left
) - 1;
1091 tga_regs
= par
->tga_regs_base
;
1092 tga_fb
= par
->tga_fb_base
;
1094 /* Set up the MODE and PIXELSHIFT registers. */
1095 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1096 __raw_writel(pixel_shift
, tga_regs
+TGA_PIXELSHIFT_REG
);
1099 for (i
= 0; i
< height
; ++i
) {
1104 sfb
= tga_fb
+ spos
;
1105 dfb
= tga_fb
+ dpos
;
1107 __raw_writel(smask_first
, sfb
);
1109 __raw_writel(dmask_first
, dfb
);
1116 __raw_writel(0xffffffff, sfb
);
1118 __raw_writel(0xffffffff, dfb
);
1124 if (n64
&& (((unsigned long)sfb
| (unsigned long)dfb
) & 63))
1126 "tgafb: misaligned copy64 (s:%p, d:%p)\n",
1129 for (j
= 0; j
< n64
; ++j
) {
1130 __raw_writel(sfb
- tga_fb
, tga_regs
+TGA_COPY64_SRC
);
1132 __raw_writel(dfb
- tga_fb
, tga_regs
+TGA_COPY64_DST
);
1138 for (j
= 0; j
< n32
; ++j
) {
1139 __raw_writel(0xffffffff, sfb
);
1141 __raw_writel(0xffffffff, dfb
);
1148 __raw_writel(0xffffffff, sfb
);
1150 __raw_writel(dmask_last
, dfb
);
1158 /* Reset the MODE register to normal. */
1159 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1162 /* The (almost) general case of backward copy in 8bpp mode. */
1164 copyarea_backward_8bpp(struct fb_info
*info
, u32 dx
, u32 dy
, u32 sx
, u32 sy
,
1165 u32 height
, u32 width
, u32 line_length
,
1166 const struct fb_copyarea
*area
)
1168 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1169 unsigned long i
, left
, yincr
;
1170 unsigned long depos
, sepos
, dealign
, sealign
;
1171 u32 mask_first
, mask_last
;
1173 void __iomem
*tga_regs
;
1174 void __iomem
*tga_fb
;
1176 yincr
= line_length
;
1183 /* Compute the offsets and alignments in the frame buffer.
1184 More than anything else, these control how we do copies. */
1185 depos
= dy
* line_length
+ dx
+ width
;
1186 sepos
= sy
* line_length
+ sx
+ width
;
1187 dealign
= depos
& 7;
1188 sealign
= sepos
& 7;
1190 /* ??? The documentation appears to be incorrect (or very
1191 misleading) wrt how pixel shifting works in backward copy
1192 mode, i.e. when PIXELSHIFT is negative. I give up for now.
1193 Do handle the common case of co-aligned backward copies,
1194 but frob everything else back on generic code. */
1195 if (dealign
!= sealign
) {
1196 cfb_copyarea(info
, area
);
1200 /* We begin the copy with the trailing pixels of the
1201 unaligned destination. */
1202 mask_first
= (1ul << dealign
) - 1;
1203 left
= width
- dealign
;
1205 /* Care for small copies. */
1206 if (dealign
> width
) {
1207 mask_first
^= (1ul << (dealign
- width
)) - 1;
1211 /* Next copy full words at a time. */
1215 /* Finally copy the unaligned head of the span. */
1216 mask_last
= -1 << (32 - left
);
1218 tga_regs
= par
->tga_regs_base
;
1219 tga_fb
= par
->tga_fb_base
;
1221 /* Set up the MODE and PIXELSHIFT registers. */
1222 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1223 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
1226 for (i
= 0; i
< height
; ++i
) {
1231 sfb
= tga_fb
+ sepos
;
1232 dfb
= tga_fb
+ depos
;
1234 __raw_writel(mask_first
, sfb
);
1236 __raw_writel(mask_first
, dfb
);
1240 for (j
= 0; j
< n32
; ++j
) {
1243 __raw_writel(0xffffffff, sfb
);
1245 __raw_writel(0xffffffff, dfb
);
1252 __raw_writel(mask_last
, sfb
);
1254 __raw_writel(mask_last
, dfb
);
1262 /* Reset the MODE register to normal. */
1263 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1267 tgafb_copyarea(struct fb_info
*info
, const struct fb_copyarea
*area
)
1269 unsigned long dx
, dy
, width
, height
, sx
, sy
, vxres
, vyres
;
1270 unsigned long line_length
, bpp
;
1274 width
= area
->width
;
1275 height
= area
->height
;
1278 vxres
= info
->var
.xres_virtual
;
1279 vyres
= info
->var
.yres_virtual
;
1280 line_length
= info
->fix
.line_length
;
1282 /* The top left corners must be in the virtual screen. */
1283 if (dx
> vxres
|| sx
> vxres
|| dy
> vyres
|| sy
> vyres
)
1286 /* Clip the destination. */
1287 if (dx
+ width
> vxres
)
1289 if (dy
+ height
> vyres
)
1290 height
= vyres
- dy
;
1292 /* The source must be completely inside the virtual screen. */
1293 if (sx
+ width
> vxres
|| sy
+ height
> vyres
)
1296 bpp
= info
->var
.bits_per_pixel
;
1298 /* Detect copies of the entire line. */
1299 if (width
* (bpp
>> 3) == line_length
) {
1301 copyarea_line_8bpp(info
, dy
, sy
, height
, width
);
1303 copyarea_line_32bpp(info
, dy
, sy
, height
, width
);
1306 /* ??? The documentation is unclear to me exactly how the pixelshift
1307 register works in 32bpp mode. Since I don't have hardware to test,
1308 give up for now and fall back on the generic routines. */
1310 cfb_copyarea(info
, area
);
1312 /* Detect overlapping source and destination that requires
1314 else if (dy
== sy
&& dx
> sx
&& dx
< sx
+ width
)
1315 copyarea_backward_8bpp(info
, dx
, dy
, sx
, sy
, height
,
1316 width
, line_length
, area
);
1318 copyarea_foreward_8bpp(info
, dx
, dy
, sx
, sy
, height
,
1319 width
, line_length
);
1328 tgafb_init_fix(struct fb_info
*info
)
1330 struct tga_par
*par
= (struct tga_par
*)info
->par
;
1331 u8 tga_type
= par
->tga_type
;
1332 const char *tga_type_name
;
1335 case TGA_TYPE_8PLANE
:
1336 tga_type_name
= "Digital ZLXp-E1";
1338 case TGA_TYPE_24PLANE
:
1339 tga_type_name
= "Digital ZLXp-E2";
1341 case TGA_TYPE_24PLUSZ
:
1342 tga_type_name
= "Digital ZLXp-E3";
1345 tga_type_name
= "Unknown";
1349 strlcpy(info
->fix
.id
, tga_type_name
, sizeof(info
->fix
.id
));
1351 info
->fix
.type
= FB_TYPE_PACKED_PIXELS
;
1352 info
->fix
.type_aux
= 0;
1353 info
->fix
.visual
= (tga_type
== TGA_TYPE_8PLANE
1354 ? FB_VISUAL_PSEUDOCOLOR
1355 : FB_VISUAL_TRUECOLOR
);
1357 info
->fix
.line_length
= par
->xres
* (par
->bits_per_pixel
>> 3);
1358 info
->fix
.smem_start
= (size_t) par
->tga_fb_base
;
1359 info
->fix
.smem_len
= info
->fix
.line_length
* par
->yres
;
1360 info
->fix
.mmio_start
= (size_t) par
->tga_regs_base
;
1361 info
->fix
.mmio_len
= 512;
1363 info
->fix
.xpanstep
= 0;
1364 info
->fix
.ypanstep
= 0;
1365 info
->fix
.ywrapstep
= 0;
1367 info
->fix
.accel
= FB_ACCEL_DEC_TGA
;
1370 static __devinit
int
1371 tgafb_pci_register(struct pci_dev
*pdev
, const struct pci_device_id
*ent
)
1373 static unsigned int const fb_offset_presets
[4] = {
1374 TGA_8PLANE_FB_OFFSET
,
1375 TGA_24PLANE_FB_OFFSET
,
1377 TGA_24PLUSZ_FB_OFFSET
1381 struct fb_info info
;
1383 u32 pseudo_palette
[16];
1386 void __iomem
*mem_base
;
1387 unsigned long bar0_start
, bar0_len
;
1391 /* Enable device in PCI config. */
1392 if (pci_enable_device(pdev
)) {
1393 printk(KERN_ERR
"tgafb: Cannot enable PCI device\n");
1397 /* Allocate the fb and par structures. */
1398 all
= kmalloc(sizeof(*all
), GFP_KERNEL
);
1400 printk(KERN_ERR
"tgafb: Cannot allocate memory\n");
1403 memset(all
, 0, sizeof(*all
));
1404 pci_set_drvdata(pdev
, all
);
1406 /* Request the mem regions. */
1407 bar0_start
= pci_resource_start(pdev
, 0);
1408 bar0_len
= pci_resource_len(pdev
, 0);
1410 if (!request_mem_region (bar0_start
, bar0_len
, "tgafb")) {
1411 printk(KERN_ERR
"tgafb: cannot reserve FB region\n");
1415 /* Map the framebuffer. */
1416 mem_base
= ioremap(bar0_start
, bar0_len
);
1418 printk(KERN_ERR
"tgafb: Cannot map MMIO\n");
1422 /* Grab info about the card. */
1423 tga_type
= (readl(mem_base
) >> 12) & 0x0f;
1424 all
->par
.pdev
= pdev
;
1425 all
->par
.tga_mem_base
= mem_base
;
1426 all
->par
.tga_fb_base
= mem_base
+ fb_offset_presets
[tga_type
];
1427 all
->par
.tga_regs_base
= mem_base
+ TGA_REGS_OFFSET
;
1428 all
->par
.tga_type
= tga_type
;
1429 pci_read_config_byte(pdev
, PCI_REVISION_ID
, &all
->par
.tga_chip_rev
);
1431 /* Setup framebuffer. */
1432 all
->info
.flags
= FBINFO_DEFAULT
| FBINFO_HWACCEL_COPYAREA
|
1433 FBINFO_HWACCEL_IMAGEBLIT
| FBINFO_HWACCEL_FILLRECT
;
1434 all
->info
.fbops
= &tgafb_ops
;
1435 all
->info
.screen_base
= all
->par
.tga_fb_base
;
1436 all
->info
.par
= &all
->par
;
1437 all
->info
.pseudo_palette
= all
->pseudo_palette
;
1439 /* This should give a reasonable default video mode. */
1441 ret
= fb_find_mode(&all
->info
.var
, &all
->info
, mode_option
,
1443 tga_type
== TGA_TYPE_8PLANE
? 8 : 32);
1444 if (ret
== 0 || ret
== 4) {
1445 printk(KERN_ERR
"tgafb: Could not find valid video mode\n");
1450 if (fb_alloc_cmap(&all
->info
.cmap
, 256, 0)) {
1451 printk(KERN_ERR
"tgafb: Could not allocate color map\n");
1456 tgafb_set_par(&all
->info
);
1457 tgafb_init_fix(&all
->info
);
1459 all
->info
.device
= &pdev
->dev
;
1460 if (register_framebuffer(&all
->info
) < 0) {
1461 printk(KERN_ERR
"tgafb: Could not register framebuffer\n");
1466 printk(KERN_INFO
"tgafb: DC21030 [TGA] detected, rev=0x%02x\n",
1467 all
->par
.tga_chip_rev
);
1468 printk(KERN_INFO
"tgafb: at PCI bus %d, device %d, function %d\n",
1469 pdev
->bus
->number
, PCI_SLOT(pdev
->devfn
),
1470 PCI_FUNC(pdev
->devfn
));
1471 printk(KERN_INFO
"fb%d: %s frame buffer device at 0x%lx\n",
1472 all
->info
.node
, all
->info
.fix
.id
, bar0_start
);
1477 release_mem_region(bar0_start
, bar0_len
);
1484 tgafb_pci_unregister(struct pci_dev
*pdev
)
1486 struct fb_info
*info
= pci_get_drvdata(pdev
);
1487 struct tga_par
*par
= info
->par
;
1491 unregister_framebuffer(info
);
1492 iounmap(par
->tga_mem_base
);
1493 release_mem_region(pci_resource_start(pdev
, 0),
1494 pci_resource_len(pdev
, 0));
1502 pci_unregister_driver(&tgafb_driver
);
1508 tgafb_setup(char *arg
)
1513 while ((this_opt
= strsep(&arg
, ","))) {
1516 if (!strncmp(this_opt
, "mode:", 5))
1517 mode_option
= this_opt
+5;
1520 "tgafb: unknown parameter %s\n",
1527 #endif /* !MODULE */
1533 char *option
= NULL
;
1535 if (fb_get_options("tgafb", &option
))
1537 tgafb_setup(option
);
1539 return pci_register_driver(&tgafb_driver
);
1546 module_init(tgafb_init
);
1549 module_exit(tgafb_exit
);
1552 MODULE_DESCRIPTION("framebuffer driver for TGA chipset");
1553 MODULE_LICENSE("GPL");