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>
29 #include <linux/selection.h>
35 static int tgafb_check_var(struct fb_var_screeninfo
*, struct fb_info
*);
36 static int tgafb_set_par(struct fb_info
*);
37 static void tgafb_set_pll(struct tga_par
*, int);
38 static int tgafb_setcolreg(unsigned, unsigned, unsigned, unsigned,
39 unsigned, struct fb_info
*);
40 static int tgafb_blank(int, struct fb_info
*);
41 static void tgafb_init_fix(struct fb_info
*);
43 static void tgafb_imageblit(struct fb_info
*, const struct fb_image
*);
44 static void tgafb_fillrect(struct fb_info
*, const struct fb_fillrect
*);
45 static void tgafb_copyarea(struct fb_info
*, const struct fb_copyarea
*);
47 static int tgafb_pci_register(struct pci_dev
*, const struct pci_device_id
*);
49 static void tgafb_pci_unregister(struct pci_dev
*);
52 static const char *mode_option
= "640x480@60";
56 * Frame buffer operations
59 static struct fb_ops tgafb_ops
= {
61 .fb_check_var
= tgafb_check_var
,
62 .fb_set_par
= tgafb_set_par
,
63 .fb_setcolreg
= tgafb_setcolreg
,
64 .fb_blank
= tgafb_blank
,
65 .fb_fillrect
= tgafb_fillrect
,
66 .fb_copyarea
= tgafb_copyarea
,
67 .fb_imageblit
= tgafb_imageblit
,
68 .fb_cursor
= soft_cursor
,
73 * PCI registration operations
76 static struct pci_device_id
const tgafb_pci_table
[] = {
77 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TGA
, PCI_ANY_ID
, PCI_ANY_ID
,
81 static struct pci_driver tgafb_driver
= {
83 .id_table
= tgafb_pci_table
,
84 .probe
= tgafb_pci_register
,
85 .remove
= __devexit_p(tgafb_pci_unregister
),
90 * tgafb_check_var - Optional function. Validates a var passed in.
91 * @var: frame buffer variable screen structure
92 * @info: frame buffer structure that represents a single frame buffer
95 tgafb_check_var(struct fb_var_screeninfo
*var
, struct fb_info
*info
)
97 struct tga_par
*par
= (struct tga_par
*)info
->par
;
99 if (par
->tga_type
== TGA_TYPE_8PLANE
) {
100 if (var
->bits_per_pixel
!= 8)
103 if (var
->bits_per_pixel
!= 32)
107 if (var
->xres_virtual
!= var
->xres
|| var
->yres_virtual
!= var
->yres
)
111 if (1000000000 / var
->pixclock
> TGA_PLL_MAX_FREQ
)
113 if ((var
->vmode
& FB_VMODE_MASK
) != FB_VMODE_NONINTERLACED
)
116 /* Some of the acceleration routines assume the line width is
117 a multiple of 64 bytes. */
118 if (var
->xres
* (par
->tga_type
== TGA_TYPE_8PLANE
? 1 : 4) % 64)
125 * tgafb_set_par - Optional function. Alters the hardware state.
126 * @info: frame buffer structure that represents a single frame buffer
129 tgafb_set_par(struct fb_info
*info
)
131 static unsigned int const deep_presets
[4] = {
137 static unsigned int const rasterop_presets
[4] = {
143 static unsigned int const mode_presets
[4] = {
149 static unsigned int const base_addr_presets
[4] = {
156 struct tga_par
*par
= (struct tga_par
*) info
->par
;
157 u32 htimings
, vtimings
, pll_freq
;
161 /* Encode video timings. */
162 htimings
= (((info
->var
.xres
/4) & TGA_HORIZ_ACT_LSB
)
163 | (((info
->var
.xres
/4) & 0x600 << 19) & TGA_HORIZ_ACT_MSB
));
164 vtimings
= (info
->var
.yres
& TGA_VERT_ACTIVE
);
165 htimings
|= ((info
->var
.right_margin
/4) << 9) & TGA_HORIZ_FP
;
166 vtimings
|= (info
->var
.lower_margin
<< 11) & TGA_VERT_FP
;
167 htimings
|= ((info
->var
.hsync_len
/4) << 14) & TGA_HORIZ_SYNC
;
168 vtimings
|= (info
->var
.vsync_len
<< 16) & TGA_VERT_SYNC
;
169 htimings
|= ((info
->var
.left_margin
/4) << 21) & TGA_HORIZ_BP
;
170 vtimings
|= (info
->var
.upper_margin
<< 22) & TGA_VERT_BP
;
172 if (info
->var
.sync
& FB_SYNC_HOR_HIGH_ACT
)
173 htimings
|= TGA_HORIZ_POLARITY
;
174 if (info
->var
.sync
& FB_SYNC_VERT_HIGH_ACT
)
175 vtimings
|= TGA_VERT_POLARITY
;
177 par
->htimings
= htimings
;
178 par
->vtimings
= vtimings
;
180 par
->sync_on_green
= !!(info
->var
.sync
& FB_SYNC_ON_GREEN
);
182 /* Store other useful values in par. */
183 par
->xres
= info
->var
.xres
;
184 par
->yres
= info
->var
.yres
;
185 par
->pll_freq
= pll_freq
= 1000000000 / info
->var
.pixclock
;
186 par
->bits_per_pixel
= info
->var
.bits_per_pixel
;
188 tga_type
= par
->tga_type
;
190 /* First, disable video. */
191 TGA_WRITE_REG(par
, TGA_VALID_VIDEO
| TGA_VALID_BLANK
, TGA_VALID_REG
);
193 /* Write the DEEP register. */
194 while (TGA_READ_REG(par
, TGA_CMD_STAT_REG
) & 1) /* wait for not busy */
197 TGA_WRITE_REG(par
, deep_presets
[tga_type
], TGA_DEEP_REG
);
198 while (TGA_READ_REG(par
, TGA_CMD_STAT_REG
) & 1) /* wait for not busy */
202 /* Write some more registers. */
203 TGA_WRITE_REG(par
, rasterop_presets
[tga_type
], TGA_RASTEROP_REG
);
204 TGA_WRITE_REG(par
, mode_presets
[tga_type
], TGA_MODE_REG
);
205 TGA_WRITE_REG(par
, base_addr_presets
[tga_type
], TGA_BASE_ADDR_REG
);
207 /* Calculate & write the PLL. */
208 tgafb_set_pll(par
, pll_freq
);
210 /* Write some more registers. */
211 TGA_WRITE_REG(par
, 0xffffffff, TGA_PLANEMASK_REG
);
212 TGA_WRITE_REG(par
, 0xffffffff, TGA_PIXELMASK_REG
);
214 /* Init video timing regs. */
215 TGA_WRITE_REG(par
, htimings
, TGA_HORIZ_REG
);
216 TGA_WRITE_REG(par
, vtimings
, TGA_VERT_REG
);
218 /* Initalise RAMDAC. */
219 if (tga_type
== TGA_TYPE_8PLANE
) {
221 /* Init BT485 RAMDAC registers. */
222 BT485_WRITE(par
, 0xa2 | (par
->sync_on_green
? 0x8 : 0x0),
224 BT485_WRITE(par
, 0x01, BT485_ADDR_PAL_WRITE
);
225 BT485_WRITE(par
, 0x14, BT485_CMD_3
); /* cursor 64x64 */
226 BT485_WRITE(par
, 0x40, BT485_CMD_1
);
227 BT485_WRITE(par
, 0x20, BT485_CMD_2
); /* cursor off, for now */
228 BT485_WRITE(par
, 0xff, BT485_PIXEL_MASK
);
230 /* Fill palette registers. */
231 BT485_WRITE(par
, 0x00, BT485_ADDR_PAL_WRITE
);
232 TGA_WRITE_REG(par
, BT485_DATA_PAL
, TGA_RAMDAC_SETUP_REG
);
234 for (i
= 0; i
< 16; i
++) {
236 TGA_WRITE_REG(par
, default_red
[j
]|(BT485_DATA_PAL
<<8),
238 TGA_WRITE_REG(par
, default_grn
[j
]|(BT485_DATA_PAL
<<8),
240 TGA_WRITE_REG(par
, default_blu
[j
]|(BT485_DATA_PAL
<<8),
243 for (i
= 0; i
< 240*3; i
+= 4) {
244 TGA_WRITE_REG(par
, 0x55|(BT485_DATA_PAL
<<8),
246 TGA_WRITE_REG(par
, 0x00|(BT485_DATA_PAL
<<8),
248 TGA_WRITE_REG(par
, 0x00|(BT485_DATA_PAL
<<8),
250 TGA_WRITE_REG(par
, 0x00|(BT485_DATA_PAL
<<8),
254 } else { /* 24-plane or 24plusZ */
256 /* Init BT463 registers. */
257 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_0
, 0x40);
258 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_1
, 0x08);
259 BT463_WRITE(par
, BT463_REG_ACC
, BT463_CMD_REG_2
,
260 (par
->sync_on_green
? 0x80 : 0x40));
262 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_0
, 0xff);
263 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_1
, 0xff);
264 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_2
, 0xff);
265 BT463_WRITE(par
, BT463_REG_ACC
, BT463_READ_MASK_3
, 0x0f);
267 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_0
, 0x00);
268 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_1
, 0x00);
269 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_2
, 0x00);
270 BT463_WRITE(par
, BT463_REG_ACC
, BT463_BLINK_MASK_3
, 0x00);
272 /* Fill the palette. */
273 BT463_LOAD_ADDR(par
, 0x0000);
274 TGA_WRITE_REG(par
, BT463_PALETTE
<<2, TGA_RAMDAC_REG
);
276 for (i
= 0; i
< 16; i
++) {
278 TGA_WRITE_REG(par
, default_red
[j
]|(BT463_PALETTE
<<10),
280 TGA_WRITE_REG(par
, default_grn
[j
]|(BT463_PALETTE
<<10),
282 TGA_WRITE_REG(par
, default_blu
[j
]|(BT463_PALETTE
<<10),
285 for (i
= 0; i
< 512*3; i
+= 4) {
286 TGA_WRITE_REG(par
, 0x55|(BT463_PALETTE
<<10),
288 TGA_WRITE_REG(par
, 0x00|(BT463_PALETTE
<<10),
290 TGA_WRITE_REG(par
, 0x00|(BT463_PALETTE
<<10),
292 TGA_WRITE_REG(par
, 0x00|(BT463_PALETTE
<<10),
296 /* Fill window type table after start of vertical retrace. */
297 while (!(TGA_READ_REG(par
, TGA_INTR_STAT_REG
) & 0x01))
299 TGA_WRITE_REG(par
, 0x01, TGA_INTR_STAT_REG
);
301 while (!(TGA_READ_REG(par
, TGA_INTR_STAT_REG
) & 0x01))
303 TGA_WRITE_REG(par
, 0x01, TGA_INTR_STAT_REG
);
305 BT463_LOAD_ADDR(par
, BT463_WINDOW_TYPE_BASE
);
306 TGA_WRITE_REG(par
, BT463_REG_ACC
<<2, TGA_RAMDAC_SETUP_REG
);
308 for (i
= 0; i
< 16; i
++) {
309 TGA_WRITE_REG(par
, 0x00|(BT463_REG_ACC
<<10),
311 TGA_WRITE_REG(par
, 0x01|(BT463_REG_ACC
<<10),
313 TGA_WRITE_REG(par
, 0x80|(BT463_REG_ACC
<<10),
319 /* Finally, enable video scan (and pray for the monitor... :-) */
320 TGA_WRITE_REG(par
, TGA_VALID_VIDEO
, TGA_VALID_REG
);
325 #define DIFFCHECK(X) \
328 int delta = f - (TGA_PLL_BASE_FREQ * (X)) / (r << shift); \
331 if (delta < min_diff) \
332 min_diff = delta, vm = m, va = a, vr = r; \
337 tgafb_set_pll(struct tga_par
*par
, int f
)
339 int n
, shift
, base
, min_diff
, target
;
340 int r
,a
,m
,vm
= 34, va
= 1, vr
= 30;
342 for (r
= 0 ; r
< 12 ; r
++)
343 TGA_WRITE_REG(par
, !r
, TGA_CLOCK_REG
);
345 if (f
> TGA_PLL_MAX_FREQ
)
346 f
= TGA_PLL_MAX_FREQ
;
348 if (f
>= TGA_PLL_MAX_FREQ
/ 2)
350 else if (f
>= TGA_PLL_MAX_FREQ
/ 4)
355 TGA_WRITE_REG(par
, shift
& 1, TGA_CLOCK_REG
);
356 TGA_WRITE_REG(par
, shift
>> 1, TGA_CLOCK_REG
);
358 for (r
= 0 ; r
< 10 ; r
++)
359 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
362 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
363 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
365 else if (f
<= 200000) {
366 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
367 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
370 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
371 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
374 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
375 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
376 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
377 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
378 TGA_WRITE_REG(par
, 0, TGA_CLOCK_REG
);
379 TGA_WRITE_REG(par
, 1, TGA_CLOCK_REG
);
381 target
= (f
<< shift
) / TGA_PLL_BASE_FREQ
;
382 min_diff
= TGA_PLL_MAX_FREQ
;
389 for (n
= base
< 7 ? 7 : base
; n
< base
+ target
&& n
< 449; n
++) {
390 m
= ((n
+ 3) / 7) - 1;
392 DIFFCHECK((m
+ 1) * 7);
394 DIFFCHECK((m
+ 1) * 7);
405 for (r
= 0; r
< 8; r
++)
406 TGA_WRITE_REG(par
, (vm
>> r
) & 1, TGA_CLOCK_REG
);
407 for (r
= 0; r
< 8 ; r
++)
408 TGA_WRITE_REG(par
, (va
>> r
) & 1, TGA_CLOCK_REG
);
409 for (r
= 0; r
< 7 ; r
++)
410 TGA_WRITE_REG(par
, (vr
>> r
) & 1, TGA_CLOCK_REG
);
411 TGA_WRITE_REG(par
, ((vr
>> 7) & 1)|2, TGA_CLOCK_REG
);
416 * tgafb_setcolreg - Optional function. Sets a color register.
417 * @regno: boolean, 0 copy local, 1 get_user() function
418 * @red: frame buffer colormap structure
419 * @green: The green value which can be up to 16 bits wide
420 * @blue: The blue value which can be up to 16 bits wide.
421 * @transp: If supported the alpha value which can be up to 16 bits wide.
422 * @info: frame buffer info structure
425 tgafb_setcolreg(unsigned regno
, unsigned red
, unsigned green
, unsigned blue
,
426 unsigned transp
, struct fb_info
*info
)
428 struct tga_par
*par
= (struct tga_par
*) info
->par
;
436 if (par
->tga_type
== TGA_TYPE_8PLANE
) {
437 BT485_WRITE(par
, regno
, BT485_ADDR_PAL_WRITE
);
438 TGA_WRITE_REG(par
, BT485_DATA_PAL
, TGA_RAMDAC_SETUP_REG
);
439 TGA_WRITE_REG(par
, red
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
440 TGA_WRITE_REG(par
, green
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
441 TGA_WRITE_REG(par
, blue
|(BT485_DATA_PAL
<<8),TGA_RAMDAC_REG
);
442 } else if (regno
< 16) {
443 u32 value
= (red
<< 16) | (green
<< 8) | blue
;
444 ((u32
*)info
->pseudo_palette
)[regno
] = value
;
452 * tgafb_blank - Optional function. Blanks the display.
453 * @blank_mode: the blank mode we want.
454 * @info: frame buffer structure that represents a single frame buffer
457 tgafb_blank(int blank
, struct fb_info
*info
)
459 struct tga_par
*par
= (struct tga_par
*) info
->par
;
460 u32 vhcr
, vvcr
, vvvr
;
463 local_irq_save(flags
);
465 vhcr
= TGA_READ_REG(par
, TGA_HORIZ_REG
);
466 vvcr
= TGA_READ_REG(par
, TGA_VERT_REG
);
467 vvvr
= TGA_READ_REG(par
, TGA_VALID_REG
);
468 vvvr
&= ~(TGA_VALID_VIDEO
| TGA_VALID_BLANK
);
471 case 0: /* Unblanking */
472 if (par
->vesa_blanked
) {
473 TGA_WRITE_REG(par
, vhcr
& 0xbfffffff, TGA_HORIZ_REG
);
474 TGA_WRITE_REG(par
, vvcr
& 0xbfffffff, TGA_VERT_REG
);
475 par
->vesa_blanked
= 0;
477 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_VIDEO
, TGA_VALID_REG
);
480 case 1: /* Normal blanking */
481 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_VIDEO
| TGA_VALID_BLANK
,
485 case 2: /* VESA blank (vsync off) */
486 TGA_WRITE_REG(par
, vvcr
| 0x40000000, TGA_VERT_REG
);
487 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
488 par
->vesa_blanked
= 1;
491 case 3: /* VESA blank (hsync off) */
492 TGA_WRITE_REG(par
, vhcr
| 0x40000000, TGA_HORIZ_REG
);
493 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
494 par
->vesa_blanked
= 1;
497 case 4: /* Poweroff */
498 TGA_WRITE_REG(par
, vhcr
| 0x40000000, TGA_HORIZ_REG
);
499 TGA_WRITE_REG(par
, vvcr
| 0x40000000, TGA_VERT_REG
);
500 TGA_WRITE_REG(par
, vvvr
| TGA_VALID_BLANK
, TGA_VALID_REG
);
501 par
->vesa_blanked
= 1;
505 local_irq_restore(flags
);
515 * tgafb_imageblit - REQUIRED function. Can use generic routines if
516 * non acclerated hardware and packed pixel based.
517 * Copies a image from system memory to the screen.
519 * @info: frame buffer structure that represents a single frame buffer
520 * @image: structure defining the image.
523 tgafb_imageblit(struct fb_info
*info
, const struct fb_image
*image
)
525 static unsigned char const bitrev
[256] = {
526 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
527 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
528 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
529 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
530 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
531 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
532 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
533 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
534 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
535 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
536 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
537 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
538 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
539 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
540 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
541 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
542 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
543 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
544 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
545 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
546 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
547 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
548 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
549 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
550 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
551 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
552 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
553 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
554 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
555 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
556 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
557 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
560 struct tga_par
*par
= (struct tga_par
*) info
->par
;
561 u32 fgcolor
, bgcolor
, dx
, dy
, width
, height
, vxres
, vyres
, pixelmask
;
562 unsigned long rincr
, line_length
, shift
, pos
, is8bpp
;
564 const unsigned char *data
;
565 void *regs_base
, *fb_base
;
569 width
= image
->width
;
570 height
= image
->height
;
571 vxres
= info
->var
.xres_virtual
;
572 vyres
= info
->var
.yres_virtual
;
573 line_length
= info
->fix
.line_length
;
574 rincr
= (width
+ 7) / 8;
576 /* Crop the image to the screen. */
577 if (dx
> vxres
|| dy
> vyres
)
579 if (dx
+ width
> vxres
)
581 if (dy
+ height
> vyres
)
584 /* For copies that aren't pixel expansion, there's little we
585 can do better than the generic code. */
586 /* ??? There is a DMA write mode; I wonder if that could be
587 made to pull the data from the image buffer... */
588 if (image
->depth
> 1) {
589 cfb_imageblit(info
, image
);
593 regs_base
= par
->tga_regs_base
;
594 fb_base
= par
->tga_fb_base
;
595 is8bpp
= info
->var
.bits_per_pixel
== 8;
597 /* Expand the color values to fill 32-bits. */
598 /* ??? Would be nice to notice colour changes elsewhere, so
599 that we can do this only when necessary. */
600 fgcolor
= image
->fg_color
;
601 bgcolor
= image
->bg_color
;
603 fgcolor
|= fgcolor
<< 8;
604 fgcolor
|= fgcolor
<< 16;
605 bgcolor
|= bgcolor
<< 8;
606 bgcolor
|= bgcolor
<< 16;
609 fgcolor
= ((u32
*)info
->pseudo_palette
)[fgcolor
];
611 bgcolor
= ((u32
*)info
->pseudo_palette
)[bgcolor
];
613 __raw_writel(fgcolor
, regs_base
+ TGA_FOREGROUND_REG
);
614 __raw_writel(bgcolor
, regs_base
+ TGA_BACKGROUND_REG
);
616 /* Acquire proper alignment; set up the PIXELMASK register
617 so that we only write the proper character cell. */
618 pos
= dy
* line_length
;
625 shift
= (pos
& 7) >> 2;
629 data
= (const unsigned char *) image
->data
;
631 /* Enable opaque stipple mode. */
633 ? TGA_MODE_SBM_8BPP
| TGA_MODE_OPAQUE_STIPPLE
634 : TGA_MODE_SBM_24BPP
| TGA_MODE_OPAQUE_STIPPLE
),
635 regs_base
+ TGA_MODE_REG
);
637 if (width
+ shift
<= 32) {
638 unsigned long bwidth
;
640 /* Handle common case of imaging a single character, in
641 a font less than 32 pixels wide. */
643 pixelmask
= (1 << width
) - 1;
645 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
648 bwidth
= (width
+ 7) / 8;
650 for (i
= 0; i
< height
; ++i
) {
653 /* The image data is bit big endian; we need
655 for (j
= 0; j
< bwidth
; ++j
)
656 mask
|= bitrev
[data
[j
]] << (j
* 8);
658 __raw_writel(mask
<< shift
, fb_base
+ pos
);
664 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
665 } else if (shift
== 0) {
666 unsigned long pos0
= pos
;
667 const unsigned char *data0
= data
;
668 unsigned long bincr
= (is8bpp
? 8 : 8*4);
669 unsigned long bwidth
;
671 /* Handle another common case in which accel_putcs
672 generates a large bitmap, which happens to be aligned.
673 Allow the tail to be misaligned. This case is
674 interesting because we've not got to hold partial
675 bytes across the words being written. */
679 bwidth
= (width
/ 8) & -4;
680 for (i
= 0; i
< height
; ++i
) {
681 for (j
= 0; j
< bwidth
; j
+= 4) {
683 mask
|= bitrev
[data
[j
+0]] << (0 * 8);
684 mask
|= bitrev
[data
[j
+1]] << (1 * 8);
685 mask
|= bitrev
[data
[j
+2]] << (2 * 8);
686 mask
|= bitrev
[data
[j
+3]] << (3 * 8);
687 __raw_writel(mask
, fb_base
+ pos
+ j
*bincr
);
694 pixelmask
= (1ul << (width
& 31)) - 1;
696 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
699 pos
= pos0
+ bwidth
*bincr
;
700 data
= data0
+ bwidth
;
701 bwidth
= ((width
& 31) + 7) / 8;
703 for (i
= 0; i
< height
; ++i
) {
705 for (j
= 0; j
< bwidth
; ++j
)
706 mask
|= bitrev
[data
[j
]] << (j
* 8);
707 __raw_writel(mask
, fb_base
+ pos
);
712 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
715 unsigned long pos0
= pos
;
716 const unsigned char *data0
= data
;
717 unsigned long bincr
= (is8bpp
? 8 : 8*4);
718 unsigned long bwidth
;
720 /* Finally, handle the generic case of misaligned start.
721 Here we split the write into 16-bit spans. This allows
722 us to use only one pixel mask, instead of four as would
723 be required by writing 24-bit spans. */
725 pixelmask
= 0xffff << shift
;
726 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
729 bwidth
= (width
/ 8) & -2;
730 for (i
= 0; i
< height
; ++i
) {
731 for (j
= 0; j
< bwidth
; j
+= 2) {
733 mask
|= bitrev
[data
[j
+0]] << (0 * 8);
734 mask
|= bitrev
[data
[j
+1]] << (1 * 8);
736 __raw_writel(mask
, fb_base
+ pos
+ j
*bincr
);
743 pixelmask
= ((1ul << (width
& 15)) - 1) << shift
;
745 __raw_writel(pixelmask
, regs_base
+ TGA_PIXELMASK_REG
);
748 pos
= pos0
+ bwidth
*bincr
;
749 data
= data0
+ bwidth
;
750 bwidth
= (width
& 15) > 8;
752 for (i
= 0; i
< height
; ++i
) {
753 u32 mask
= bitrev
[data
[0]];
755 mask
|= bitrev
[data
[1]] << 8;
757 __raw_writel(mask
, fb_base
+ pos
);
763 __raw_writel(0xffffffff, regs_base
+ TGA_PIXELMASK_REG
);
766 /* Disable opaque stipple mode. */
768 ? TGA_MODE_SBM_8BPP
| TGA_MODE_SIMPLE
769 : TGA_MODE_SBM_24BPP
| TGA_MODE_SIMPLE
),
770 regs_base
+ TGA_MODE_REG
);
774 * tgafb_fillrect - REQUIRED function. Can use generic routines if
775 * non acclerated hardware and packed pixel based.
776 * Draws a rectangle on the screen.
778 * @info: frame buffer structure that represents a single frame buffer
779 * @rect: structure defining the rectagle and operation.
782 tgafb_fillrect(struct fb_info
*info
, const struct fb_fillrect
*rect
)
784 struct tga_par
*par
= (struct tga_par
*) info
->par
;
785 int is8bpp
= info
->var
.bits_per_pixel
== 8;
786 u32 dx
, dy
, width
, height
, vxres
, vyres
, color
;
787 unsigned long pos
, align
, line_length
, i
, j
;
788 void *regs_base
, *fb_base
;
793 height
= rect
->height
;
794 vxres
= info
->var
.xres_virtual
;
795 vyres
= info
->var
.yres_virtual
;
796 line_length
= info
->fix
.line_length
;
797 regs_base
= par
->tga_regs_base
;
798 fb_base
= par
->tga_fb_base
;
800 /* Crop the rectangle to the screen. */
801 if (dx
> vxres
|| dy
> vyres
|| !width
|| !height
)
803 if (dx
+ width
> vxres
)
805 if (dy
+ height
> vyres
)
808 pos
= dy
* line_length
+ dx
* (is8bpp
? 1 : 4);
810 /* ??? We could implement ROP_XOR with opaque fill mode
811 and a RasterOp setting of GXxor, but as far as I can
812 tell, this mode is not actually used in the kernel.
813 Thus I am ignoring it for now. */
814 if (rect
->rop
!= ROP_COPY
) {
815 cfb_fillrect(info
, rect
);
819 /* Expand the color value to fill 8 pixels. */
823 color
|= color
<< 16;
824 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR0_REG
);
825 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR1_REG
);
828 color
= ((u32
*)info
->pseudo_palette
)[color
];
829 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR0_REG
);
830 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR1_REG
);
831 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR2_REG
);
832 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR3_REG
);
833 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR4_REG
);
834 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR5_REG
);
835 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR6_REG
);
836 __raw_writel(color
, regs_base
+ TGA_BLOCK_COLOR7_REG
);
839 /* The DATA register holds the fill mask for block fill mode.
840 Since we're not stippling, this is all ones. */
841 __raw_writel(0xffffffff, regs_base
+ TGA_DATA_REG
);
843 /* Enable block fill mode. */
845 ? TGA_MODE_SBM_8BPP
| TGA_MODE_BLOCK_FILL
846 : TGA_MODE_SBM_24BPP
| TGA_MODE_BLOCK_FILL
),
847 regs_base
+ TGA_MODE_REG
);
850 /* We can fill 2k pixels per operation. Notice blocks that fit
851 the width of the screen so that we can take advantage of this
852 and fill more than one line per write. */
853 if (width
== line_length
)
854 width
*= height
, height
= 1;
856 /* The write into the frame buffer must be aligned to 4 bytes,
857 but we are allowed to encode the offset within the word in
858 the data word written. */
859 align
= (pos
& 3) << 16;
865 data
= (width
- 1) | align
;
867 for (i
= 0; i
< height
; ++i
) {
868 __raw_writel(data
, fb_base
+ pos
);
872 unsigned long Bpp
= (is8bpp
? 1 : 4);
873 unsigned long nwidth
= width
& -2048;
876 fdata
= (2048 - 1) | align
;
877 ldata
= ((width
& 2047) - 1) | align
;
879 for (i
= 0; i
< height
; ++i
) {
880 for (j
= 0; j
< nwidth
; j
+= 2048)
881 __raw_writel(fdata
, fb_base
+ pos
+ j
*Bpp
);
883 __raw_writel(ldata
, fb_base
+ pos
+ j
*Bpp
);
889 /* Disable block fill mode. */
891 ? TGA_MODE_SBM_8BPP
| TGA_MODE_SIMPLE
892 : TGA_MODE_SBM_24BPP
| TGA_MODE_SIMPLE
),
893 regs_base
+ TGA_MODE_REG
);
897 * tgafb_copyarea - REQUIRED function. Can use generic routines if
898 * non acclerated hardware and packed pixel based.
899 * Copies on area of the screen to another area.
901 * @info: frame buffer structure that represents a single frame buffer
902 * @area: structure defining the source and destination.
905 /* Handle the special case of copying entire lines, e.g. during scrolling.
906 We can avoid a lot of needless computation in this case. In the 8bpp
907 case we need to use the COPY64 registers instead of mask writes into
908 the frame buffer to achieve maximum performance. */
911 copyarea_line_8bpp(struct fb_info
*info
, u32 dy
, u32 sy
,
912 u32 height
, u32 width
)
914 struct tga_par
*par
= (struct tga_par
*) info
->par
;
915 void *tga_regs
= par
->tga_regs_base
;
916 unsigned long dpos
, spos
, i
, n64
;
918 /* Set up the MODE and PIXELSHIFT registers. */
919 __raw_writel(TGA_MODE_SBM_8BPP
| TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
920 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
923 n64
= (height
* width
) / 64;
926 spos
= (sy
+ height
) * width
;
927 dpos
= (dy
+ height
) * width
;
929 for (i
= 0; i
< n64
; ++i
) {
932 __raw_writel(spos
, tga_regs
+TGA_COPY64_SRC
);
934 __raw_writel(dpos
, tga_regs
+TGA_COPY64_DST
);
941 for (i
= 0; i
< n64
; ++i
) {
942 __raw_writel(spos
, tga_regs
+TGA_COPY64_SRC
);
944 __raw_writel(dpos
, tga_regs
+TGA_COPY64_DST
);
951 /* Reset the MODE register to normal. */
952 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
956 copyarea_line_32bpp(struct fb_info
*info
, u32 dy
, u32 sy
,
957 u32 height
, u32 width
)
959 struct tga_par
*par
= (struct tga_par
*) info
->par
;
960 void *tga_regs
= par
->tga_regs_base
;
961 void *tga_fb
= par
->tga_fb_base
;
963 unsigned long i
, n16
;
965 /* Set up the MODE and PIXELSHIFT registers. */
966 __raw_writel(TGA_MODE_SBM_24BPP
| TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
967 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
970 n16
= (height
* width
) / 16;
973 src
= tga_fb
+ (sy
+ height
) * width
* 4;
974 dst
= tga_fb
+ (dy
+ height
) * width
* 4;
976 for (i
= 0; i
< n16
; ++i
) {
979 __raw_writel(0xffff, src
);
981 __raw_writel(0xffff, dst
);
985 src
= tga_fb
+ sy
* width
* 4;
986 dst
= tga_fb
+ dy
* width
* 4;
988 for (i
= 0; i
< n16
; ++i
) {
989 __raw_writel(0xffff, src
);
991 __raw_writel(0xffff, dst
);
998 /* Reset the MODE register to normal. */
999 __raw_writel(TGA_MODE_SBM_24BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1002 /* The general case of forward copy in 8bpp mode. */
1004 copyarea_foreward_8bpp(struct fb_info
*info
, u32 dx
, u32 dy
, u32 sx
, u32 sy
,
1005 u32 height
, u32 width
, u32 line_length
)
1007 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1008 unsigned long i
, copied
, left
;
1009 unsigned long dpos
, spos
, dalign
, salign
, yincr
;
1010 u32 smask_first
, dmask_first
, dmask_last
;
1011 int pixel_shift
, need_prime
, need_second
;
1012 unsigned long n64
, n32
, xincr_first
;
1013 void *tga_regs
, *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
) {
1103 sfb
= tga_fb
+ spos
;
1104 dfb
= tga_fb
+ dpos
;
1106 __raw_writel(smask_first
, sfb
);
1108 __raw_writel(dmask_first
, dfb
);
1115 __raw_writel(0xffffffff, sfb
);
1117 __raw_writel(0xffffffff, dfb
);
1123 if (n64
&& (((long)sfb
| (long)dfb
) & 63))
1125 "tgafb: misaligned copy64 (s:%p, d:%p)\n",
1128 for (j
= 0; j
< n64
; ++j
) {
1129 __raw_writel(sfb
- tga_fb
, tga_regs
+TGA_COPY64_SRC
);
1131 __raw_writel(dfb
- tga_fb
, tga_regs
+TGA_COPY64_DST
);
1137 for (j
= 0; j
< n32
; ++j
) {
1138 __raw_writel(0xffffffff, sfb
);
1140 __raw_writel(0xffffffff, dfb
);
1147 __raw_writel(0xffffffff, sfb
);
1149 __raw_writel(dmask_last
, dfb
);
1157 /* Reset the MODE register to normal. */
1158 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1161 /* The (almost) general case of backward copy in 8bpp mode. */
1163 copyarea_backward_8bpp(struct fb_info
*info
, u32 dx
, u32 dy
, u32 sx
, u32 sy
,
1164 u32 height
, u32 width
, u32 line_length
,
1165 const struct fb_copyarea
*area
)
1167 struct tga_par
*par
= (struct tga_par
*) info
->par
;
1168 unsigned long i
, left
, yincr
;
1169 unsigned long depos
, sepos
, dealign
, sealign
;
1170 u32 mask_first
, mask_last
;
1172 void *tga_regs
, *tga_fb
;
1174 yincr
= line_length
;
1181 /* Compute the offsets and alignments in the frame buffer.
1182 More than anything else, these control how we do copies. */
1183 depos
= dy
* line_length
+ dx
+ width
;
1184 sepos
= sy
* line_length
+ sx
+ width
;
1185 dealign
= depos
& 7;
1186 sealign
= sepos
& 7;
1188 /* ??? The documentation appears to be incorrect (or very
1189 misleading) wrt how pixel shifting works in backward copy
1190 mode, i.e. when PIXELSHIFT is negative. I give up for now.
1191 Do handle the common case of co-aligned backward copies,
1192 but frob everything else back on generic code. */
1193 if (dealign
!= sealign
) {
1194 cfb_copyarea(info
, area
);
1198 /* We begin the copy with the trailing pixels of the
1199 unaligned destination. */
1200 mask_first
= (1ul << dealign
) - 1;
1201 left
= width
- dealign
;
1203 /* Care for small copies. */
1204 if (dealign
> width
) {
1205 mask_first
^= (1ul << (dealign
- width
)) - 1;
1209 /* Next copy full words at a time. */
1213 /* Finally copy the unaligned head of the span. */
1214 mask_last
= -1 << (32 - left
);
1216 tga_regs
= par
->tga_regs_base
;
1217 tga_fb
= par
->tga_fb_base
;
1219 /* Set up the MODE and PIXELSHIFT registers. */
1220 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_COPY
, tga_regs
+TGA_MODE_REG
);
1221 __raw_writel(0, tga_regs
+TGA_PIXELSHIFT_REG
);
1224 for (i
= 0; i
< height
; ++i
) {
1228 sfb
= tga_fb
+ sepos
;
1229 dfb
= tga_fb
+ depos
;
1231 __raw_writel(mask_first
, sfb
);
1233 __raw_writel(mask_first
, dfb
);
1237 for (j
= 0; j
< n32
; ++j
) {
1240 __raw_writel(0xffffffff, sfb
);
1242 __raw_writel(0xffffffff, dfb
);
1249 __raw_writel(mask_last
, sfb
);
1251 __raw_writel(mask_last
, dfb
);
1259 /* Reset the MODE register to normal. */
1260 __raw_writel(TGA_MODE_SBM_8BPP
|TGA_MODE_SIMPLE
, tga_regs
+TGA_MODE_REG
);
1264 tgafb_copyarea(struct fb_info
*info
, const struct fb_copyarea
*area
)
1266 unsigned long dx
, dy
, width
, height
, sx
, sy
, vxres
, vyres
;
1267 unsigned long line_length
, bpp
;
1271 width
= area
->width
;
1272 height
= area
->height
;
1275 vxres
= info
->var
.xres_virtual
;
1276 vyres
= info
->var
.yres_virtual
;
1277 line_length
= info
->fix
.line_length
;
1279 /* The top left corners must be in the virtual screen. */
1280 if (dx
> vxres
|| sx
> vxres
|| dy
> vyres
|| sy
> vyres
)
1283 /* Clip the destination. */
1284 if (dx
+ width
> vxres
)
1286 if (dy
+ height
> vyres
)
1287 height
= vyres
- dy
;
1289 /* The source must be completely inside the virtual screen. */
1290 if (sx
+ width
> vxres
|| sy
+ height
> vyres
)
1293 bpp
= info
->var
.bits_per_pixel
;
1295 /* Detect copies of the entire line. */
1296 if (width
* (bpp
>> 3) == line_length
) {
1298 copyarea_line_8bpp(info
, dy
, sy
, height
, width
);
1300 copyarea_line_32bpp(info
, dy
, sy
, height
, width
);
1303 /* ??? The documentation is unclear to me exactly how the pixelshift
1304 register works in 32bpp mode. Since I don't have hardware to test,
1305 give up for now and fall back on the generic routines. */
1307 cfb_copyarea(info
, area
);
1309 /* Detect overlapping source and destination that requires
1311 else if (dy
== sy
&& dx
> sx
&& dx
< sx
+ width
)
1312 copyarea_backward_8bpp(info
, dx
, dy
, sx
, sy
, height
,
1313 width
, line_length
, area
);
1315 copyarea_foreward_8bpp(info
, dx
, dy
, sx
, sy
, height
,
1316 width
, line_length
);
1325 tgafb_init_fix(struct fb_info
*info
)
1327 struct tga_par
*par
= (struct tga_par
*)info
->par
;
1328 u8 tga_type
= par
->tga_type
;
1329 const char *tga_type_name
;
1332 case TGA_TYPE_8PLANE
:
1333 tga_type_name
= "Digital ZLXp-E1";
1335 case TGA_TYPE_24PLANE
:
1336 tga_type_name
= "Digital ZLXp-E2";
1338 case TGA_TYPE_24PLUSZ
:
1339 tga_type_name
= "Digital ZLXp-E3";
1342 tga_type_name
= "Unknown";
1346 strlcpy(info
->fix
.id
, tga_type_name
, sizeof(info
->fix
.id
));
1348 info
->fix
.type
= FB_TYPE_PACKED_PIXELS
;
1349 info
->fix
.type_aux
= 0;
1350 info
->fix
.visual
= (tga_type
== TGA_TYPE_8PLANE
1351 ? FB_VISUAL_PSEUDOCOLOR
1352 : FB_VISUAL_TRUECOLOR
);
1354 info
->fix
.line_length
= par
->xres
* (par
->bits_per_pixel
>> 3);
1355 info
->fix
.smem_start
= (size_t) par
->tga_fb_base
;
1356 info
->fix
.smem_len
= info
->fix
.line_length
* par
->yres
;
1357 info
->fix
.mmio_start
= (size_t) par
->tga_regs_base
;
1358 info
->fix
.mmio_len
= 512;
1360 info
->fix
.xpanstep
= 0;
1361 info
->fix
.ypanstep
= 0;
1362 info
->fix
.ywrapstep
= 0;
1364 info
->fix
.accel
= FB_ACCEL_DEC_TGA
;
1367 static __devinit
int
1368 tgafb_pci_register(struct pci_dev
*pdev
, const struct pci_device_id
*ent
)
1370 static unsigned int const fb_offset_presets
[4] = {
1371 TGA_8PLANE_FB_OFFSET
,
1372 TGA_24PLANE_FB_OFFSET
,
1374 TGA_24PLUSZ_FB_OFFSET
1378 struct fb_info info
;
1380 u32 pseudo_palette
[16];
1384 unsigned long bar0_start
, bar0_len
;
1388 /* Enable device in PCI config. */
1389 if (pci_enable_device(pdev
)) {
1390 printk(KERN_ERR
"tgafb: Cannot enable PCI device\n");
1394 /* Allocate the fb and par structures. */
1395 all
= kmalloc(sizeof(*all
), GFP_KERNEL
);
1397 printk(KERN_ERR
"tgafb: Cannot allocate memory\n");
1400 memset(all
, 0, sizeof(*all
));
1401 pci_set_drvdata(pdev
, all
);
1403 /* Request the mem regions. */
1404 bar0_start
= pci_resource_start(pdev
, 0);
1405 bar0_len
= pci_resource_len(pdev
, 0);
1407 if (!request_mem_region (bar0_start
, bar0_len
, "tgafb")) {
1408 printk(KERN_ERR
"tgafb: cannot reserve FB region\n");
1412 /* Map the framebuffer. */
1413 mem_base
= ioremap(bar0_start
, bar0_len
);
1415 printk(KERN_ERR
"tgafb: Cannot map MMIO\n");
1419 /* Grab info about the card. */
1420 tga_type
= (readl(mem_base
) >> 12) & 0x0f;
1421 all
->par
.pdev
= pdev
;
1422 all
->par
.tga_mem_base
= mem_base
;
1423 all
->par
.tga_fb_base
= mem_base
+ fb_offset_presets
[tga_type
];
1424 all
->par
.tga_regs_base
= mem_base
+ TGA_REGS_OFFSET
;
1425 all
->par
.tga_type
= tga_type
;
1426 pci_read_config_byte(pdev
, PCI_REVISION_ID
, &all
->par
.tga_chip_rev
);
1428 /* Setup framebuffer. */
1429 all
->info
.flags
= FBINFO_DEFAULT
| FBINFO_HWACCEL_COPYAREA
|
1430 FBINFO_HWACCEL_IMAGEBLIT
| FBINFO_HWACCEL_FILLRECT
;
1431 all
->info
.fbops
= &tgafb_ops
;
1432 all
->info
.screen_base
= (char *) all
->par
.tga_fb_base
;
1433 all
->info
.currcon
= -1;
1434 all
->info
.par
= &all
->par
;
1435 all
->info
.pseudo_palette
= all
->pseudo_palette
;
1437 /* This should give a reasonable default video mode. */
1439 ret
= fb_find_mode(&all
->info
.var
, &all
->info
, mode_option
,
1441 tga_type
== TGA_TYPE_8PLANE
? 8 : 32);
1442 if (ret
== 0 || ret
== 4) {
1443 printk(KERN_ERR
"tgafb: Could not find valid video mode\n");
1448 if (fb_alloc_cmap(&all
->info
.cmap
, 256, 0)) {
1449 printk(KERN_ERR
"tgafb: Could not allocate color map\n");
1454 tgafb_set_par(&all
->info
);
1455 tgafb_init_fix(&all
->info
);
1457 if (register_framebuffer(&all
->info
) < 0) {
1458 printk(KERN_ERR
"tgafb: Could not register framebuffer\n");
1463 printk(KERN_INFO
"tgafb: DC21030 [TGA] detected, rev=0x%02x\n",
1464 all
->par
.tga_chip_rev
);
1465 printk(KERN_INFO
"tgafb: at PCI bus %d, device %d, function %d\n",
1466 pdev
->bus
->number
, PCI_SLOT(pdev
->devfn
),
1467 PCI_FUNC(pdev
->devfn
));
1468 printk(KERN_INFO
"fb%d: %s frame buffer device at 0x%lx\n",
1469 all
->info
.node
, all
->info
.fix
.id
, bar0_start
);
1474 release_mem_region(bar0_start
, bar0_len
);
1482 tgafb_pci_unregister(struct pci_dev
*pdev
)
1484 struct fb_info
*info
= pci_get_drvdata(pdev
);
1485 struct tga_par
*par
= info
->par
;
1489 unregister_framebuffer(info
);
1490 iounmap(par
->tga_mem_base
);
1491 release_mem_region(pci_resource_start(pdev
, 0),
1492 pci_resource_len(pdev
, 0));
1499 pci_unregister_driver(&tgafb_driver
);
1505 tgafb_setup(char *arg
)
1510 while ((this_opt
= strsep(&arg
, ","))) {
1513 if (!strncmp(this_opt
, "mode:", 5))
1514 mode_option
= this_opt
+5;
1517 "tgafb: unknown parameter %s\n",
1524 #endif /* !MODULE */
1530 char *option
= NULL
;
1532 if (fb_get_options("tgafb", &option
))
1534 tgafb_setup(option
);
1536 return pci_module_init(&tgafb_driver
);
1543 module_init(tgafb_init
);
1546 module_exit(tgafb_exit
);
1549 MODULE_DESCRIPTION("framebuffer driver for TGA chipset");
1550 MODULE_LICENSE("GPL");