Lines Matching +full:ecx +full:- +full:1000
2 * linux/drivers/video/neofb.c -- NeoMagic Framebuffer Driver
4 * Copyright (c) 2001-2002 Denis Oliver Kropp <dok@directfb.org>
16 * - Cosmetic changes (dok)
19 * - Toshiba Libretto support, allow modes larger than LCD size if
25 * - Porting over to new fbdev api. (jsimmons)
28 * - got rid of all floating point (dok)
31 * - added module license (dok)
34 * - hardware accelerated clear and move for 2200 and above (dok)
35 * - maximum allowed dotclock is handled now (dok)
38 * - correct panning after X usage (dok)
39 * - added module and kernel parameters (dok)
40 * - no stretching if external display is enabled (dok)
43 * - initial version (dok)
47 * - ioctl for internal/external switching
48 * - blanking
49 * - 32bit depth support, maybe impossible
50 * - disable pan-on-sync, need specs
53 * - white margin on bootup like with tdfxfb (colormap problem?)
78 /* --------------------------------------------------------------------- */
89 MODULE_AUTHOR("(c) 2001-2002 Denis Oliver Kropp <dok@convergence.de>");
104 MODULE_PARM_DESC(mode_option, "Preferred video mode ('640x480-8@60', etc)");
109 /* --------------------------------------------------------------------- */
146 writel(val, par->neo2200 + par->cursorOff + regindex); in write_le32()
183 return mode[i - 1].mode; in neoFindMode()
189 return mode[size - 1].mode; in neoFindMode()
193 * neoCalcVCLK --
215 f_diff = abs(f_out - freq); in neoCalcVCLK()
226 if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 || in neoCalcVCLK()
227 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2230 || in neoCalcVCLK()
228 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2360 || in neoCalcVCLK()
229 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2380) { in neoCalcVCLK()
232 par->VCLK3NumeratorLow = n_best; in neoCalcVCLK()
233 par->VCLK3NumeratorHigh = (f_best << 7); in neoCalcVCLK()
235 par->VCLK3NumeratorLow = n_best | (f_best << 7); in neoCalcVCLK()
237 par->VCLK3Denominator = d_best; in neoCalcVCLK()
242 par->VCLK3NumeratorLow, in neoCalcVCLK()
243 par->VCLK3NumeratorHigh, in neoCalcVCLK()
244 par->VCLK3Denominator, f_best_diff); in neoCalcVCLK()
249 * vgaHWInit --
257 int hsync_end = var->xres + var->right_margin + var->hsync_len; in vgaHWInit()
258 int htotal = (hsync_end + var->left_margin) >> 3; in vgaHWInit()
259 int vsync_start = var->yres + var->lower_margin; in vgaHWInit()
260 int vsync_end = vsync_start + var->vsync_len; in vgaHWInit()
261 int vtotal = vsync_end + var->upper_margin; in vgaHWInit()
263 par->MiscOutReg = 0x23; in vgaHWInit()
265 if (!(var->sync & FB_SYNC_HOR_HIGH_ACT)) in vgaHWInit()
266 par->MiscOutReg |= 0x40; in vgaHWInit()
268 if (!(var->sync & FB_SYNC_VERT_HIGH_ACT)) in vgaHWInit()
269 par->MiscOutReg |= 0x80; in vgaHWInit()
274 par->Sequencer[0] = 0x00; in vgaHWInit()
275 par->Sequencer[1] = 0x01; in vgaHWInit()
276 par->Sequencer[2] = 0x0F; in vgaHWInit()
277 par->Sequencer[3] = 0x00; /* Font select */ in vgaHWInit()
278 par->Sequencer[4] = 0x0E; /* Misc */ in vgaHWInit()
283 par->CRTC[0] = htotal - 5; in vgaHWInit()
284 par->CRTC[1] = (var->xres >> 3) - 1; in vgaHWInit()
285 par->CRTC[2] = (var->xres >> 3) - 1; in vgaHWInit()
286 par->CRTC[3] = ((htotal - 1) & 0x1F) | 0x80; in vgaHWInit()
287 par->CRTC[4] = ((var->xres + var->right_margin) >> 3); in vgaHWInit()
288 par->CRTC[5] = (((htotal - 1) & 0x20) << 2) in vgaHWInit()
290 par->CRTC[6] = (vtotal - 2) & 0xFF; in vgaHWInit()
291 par->CRTC[7] = (((vtotal - 2) & 0x100) >> 8) in vgaHWInit()
292 | (((var->yres - 1) & 0x100) >> 7) in vgaHWInit()
294 | (((var->yres - 1) & 0x100) >> 5) in vgaHWInit()
295 | 0x10 | (((vtotal - 2) & 0x200) >> 4) in vgaHWInit()
296 | (((var->yres - 1) & 0x200) >> 3) in vgaHWInit()
298 par->CRTC[8] = 0x00; in vgaHWInit()
299 par->CRTC[9] = (((var->yres - 1) & 0x200) >> 4) | 0x40; in vgaHWInit()
301 if (var->vmode & FB_VMODE_DOUBLE) in vgaHWInit()
302 par->CRTC[9] |= 0x80; in vgaHWInit()
304 par->CRTC[10] = 0x00; in vgaHWInit()
305 par->CRTC[11] = 0x00; in vgaHWInit()
306 par->CRTC[12] = 0x00; in vgaHWInit()
307 par->CRTC[13] = 0x00; in vgaHWInit()
308 par->CRTC[14] = 0x00; in vgaHWInit()
309 par->CRTC[15] = 0x00; in vgaHWInit()
310 par->CRTC[16] = vsync_start & 0xFF; in vgaHWInit()
311 par->CRTC[17] = (vsync_end & 0x0F) | 0x20; in vgaHWInit()
312 par->CRTC[18] = (var->yres - 1) & 0xFF; in vgaHWInit()
313 par->CRTC[19] = var->xres_virtual >> 4; in vgaHWInit()
314 par->CRTC[20] = 0x00; in vgaHWInit()
315 par->CRTC[21] = (var->yres - 1) & 0xFF; in vgaHWInit()
316 par->CRTC[22] = (vtotal - 1) & 0xFF; in vgaHWInit()
317 par->CRTC[23] = 0xC3; in vgaHWInit()
318 par->CRTC[24] = 0xFF; in vgaHWInit()
329 par->Graphics[0] = 0x00; in vgaHWInit()
330 par->Graphics[1] = 0x00; in vgaHWInit()
331 par->Graphics[2] = 0x00; in vgaHWInit()
332 par->Graphics[3] = 0x00; in vgaHWInit()
333 par->Graphics[4] = 0x00; in vgaHWInit()
334 par->Graphics[5] = 0x40; in vgaHWInit()
335 par->Graphics[6] = 0x05; /* only map 64k VGA memory !!!! */ in vgaHWInit()
336 par->Graphics[7] = 0x0F; in vgaHWInit()
337 par->Graphics[8] = 0xFF; in vgaHWInit()
340 par->Attribute[0] = 0x00; /* standard colormap translation */ in vgaHWInit()
341 par->Attribute[1] = 0x01; in vgaHWInit()
342 par->Attribute[2] = 0x02; in vgaHWInit()
343 par->Attribute[3] = 0x03; in vgaHWInit()
344 par->Attribute[4] = 0x04; in vgaHWInit()
345 par->Attribute[5] = 0x05; in vgaHWInit()
346 par->Attribute[6] = 0x06; in vgaHWInit()
347 par->Attribute[7] = 0x07; in vgaHWInit()
348 par->Attribute[8] = 0x08; in vgaHWInit()
349 par->Attribute[9] = 0x09; in vgaHWInit()
350 par->Attribute[10] = 0x0A; in vgaHWInit()
351 par->Attribute[11] = 0x0B; in vgaHWInit()
352 par->Attribute[12] = 0x0C; in vgaHWInit()
353 par->Attribute[13] = 0x0D; in vgaHWInit()
354 par->Attribute[14] = 0x0E; in vgaHWInit()
355 par->Attribute[15] = 0x0F; in vgaHWInit()
356 par->Attribute[16] = 0x41; in vgaHWInit()
357 par->Attribute[17] = 0xFF; in vgaHWInit()
358 par->Attribute[18] = 0x0F; in vgaHWInit()
359 par->Attribute[19] = 0x00; in vgaHWInit()
360 par->Attribute[20] = 0x00; in vgaHWInit()
366 /* Protect CRTC[0-7] */ in vgaHWLock()
367 vga_wcrt(state->vgabase, 0x11, vga_rcrt(state->vgabase, 0x11) | 0x80); in vgaHWLock()
372 /* Unprotect CRTC[0-7] */ in vgaHWUnlock()
378 vga_wgfx(state->vgabase, 0x09, 0x00); in neoLock()
447 vga_w(NULL, VGA_MIS_W, par->MiscOutReg); in vgaHWRestore()
450 vga_wseq(NULL, i, par->Sequencer[i]); in vgaHWRestore()
452 /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 or CRTC[17] */ in vgaHWRestore()
453 vga_wcrt(NULL, 17, par->CRTC[17] & ~0x80); in vgaHWRestore()
456 vga_wcrt(NULL, i, par->CRTC[i]); in vgaHWRestore()
459 vga_wgfx(NULL, i, par->Graphics[i]); in vgaHWRestore()
464 VGAwATTR(i, par->Attribute[i]); in vgaHWRestore()
470 /* -------------------- Hardware specific routines ------------------------- */
477 struct neofb_par *par = info->par; in neo2200_sync()
479 while (readl(&par->neo2200->bltStat) & 1) in neo2200_sync()
487 // ndev->neo.waitfifo_calls++; in neo2200_wait_fifo()
488 // ndev->neo.waitfifo_sum += requested_fifo_space; in neo2200_wait_fifo()
497 neo_fifo_space = (neo2200->bltStat >> 8); in neo2200_wait_fifo()
507 neo_fifo_space -= requested_fifo_space; in neo2200_wait_fifo()
516 struct neofb_par *par = info->par; in neo2200_accel_init()
517 Neo2200 __iomem *neo2200 = par->neo2200; in neo2200_accel_init()
522 switch (var->bits_per_pixel) { in neo2200_accel_init()
525 pitch = var->xres_virtual; in neo2200_accel_init()
530 pitch = var->xres_virtual * 2; in neo2200_accel_init()
534 pitch = var->xres_virtual * 3; in neo2200_accel_init()
542 writel(bltMod << 16, &neo2200->bltStat); in neo2200_accel_init()
543 writel((pitch << 16) | pitch, &neo2200->pitch); in neo2200_accel_init()
546 /* --------------------------------------------------------------------- */
551 struct neofb_par *par = info->par; in neofb_open()
553 if (!par->ref_count) { in neofb_open()
554 memset(&par->state, 0, sizeof(struct vgastate)); in neofb_open()
555 par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS; in neofb_open()
556 save_vga(&par->state); in neofb_open()
558 par->ref_count++; in neofb_open()
566 struct neofb_par *par = info->par; in neofb_release()
568 if (!par->ref_count) in neofb_release()
569 return -EINVAL; in neofb_release()
571 if (par->ref_count == 1) { in neofb_release()
572 restore_vga(&par->state); in neofb_release()
574 par->ref_count--; in neofb_release()
582 struct neofb_par *par = info->par; in neofb_check_var()
588 if (PICOS2KHZ(var->pixclock) > par->maxClock) in neofb_check_var()
589 return -EINVAL; in neofb_check_var()
592 if (par->internal_display && in neofb_check_var()
593 ((var->xres > par->NeoPanelWidth) || in neofb_check_var()
594 (var->yres > par->NeoPanelHeight))) { in neofb_check_var()
597 var->xres, var->yres, par->NeoPanelWidth, in neofb_check_var()
598 par->NeoPanelHeight); in neofb_check_var()
599 return -EINVAL; in neofb_check_var()
603 if (!par->internal_display) in neofb_check_var()
606 switch (var->xres) { in neofb_check_var()
608 if (var->yres == 1024) in neofb_check_var()
612 if (var->yres == 768) in neofb_check_var()
616 if (var->yres == (par->libretto ? 480 : 600)) in neofb_check_var()
620 if (var->yres == 480) in neofb_check_var()
629 var->xres, var->yres); in neofb_check_var()
630 return -EINVAL; in neofb_check_var()
633 var->red.msb_right = 0; in neofb_check_var()
634 var->green.msb_right = 0; in neofb_check_var()
635 var->blue.msb_right = 0; in neofb_check_var()
636 var->transp.msb_right = 0; in neofb_check_var()
638 var->transp.offset = 0; in neofb_check_var()
639 var->transp.length = 0; in neofb_check_var()
640 switch (var->bits_per_pixel) { in neofb_check_var()
642 var->red.offset = 0; in neofb_check_var()
643 var->red.length = 8; in neofb_check_var()
644 var->green.offset = 0; in neofb_check_var()
645 var->green.length = 8; in neofb_check_var()
646 var->blue.offset = 0; in neofb_check_var()
647 var->blue.length = 8; in neofb_check_var()
651 var->red.offset = 11; in neofb_check_var()
652 var->red.length = 5; in neofb_check_var()
653 var->green.offset = 5; in neofb_check_var()
654 var->green.length = 6; in neofb_check_var()
655 var->blue.offset = 0; in neofb_check_var()
656 var->blue.length = 5; in neofb_check_var()
660 var->red.offset = 16; in neofb_check_var()
661 var->red.length = 8; in neofb_check_var()
662 var->green.offset = 8; in neofb_check_var()
663 var->green.length = 8; in neofb_check_var()
664 var->blue.offset = 0; in neofb_check_var()
665 var->blue.length = 8; in neofb_check_var()
670 var->transp.offset = 24; in neofb_check_var()
671 var->transp.length = 8; in neofb_check_var()
672 var->red.offset = 16; in neofb_check_var()
673 var->red.length = 8; in neofb_check_var()
674 var->green.offset = 8; in neofb_check_var()
675 var->green.length = 8; in neofb_check_var()
676 var->blue.offset = 0; in neofb_check_var()
677 var->blue.length = 8; in neofb_check_var()
682 var->bits_per_pixel); in neofb_check_var()
683 return -EINVAL; in neofb_check_var()
686 vramlen = info->fix.smem_len; in neofb_check_var()
690 if (var->xres_virtual < var->xres) in neofb_check_var()
691 var->xres_virtual = var->xres; in neofb_check_var()
693 memlen = var->xres_virtual * var->bits_per_pixel * var->yres_virtual >> 3; in neofb_check_var()
696 var->yres_virtual = vramlen * 8 / (var->xres_virtual * in neofb_check_var()
697 var->bits_per_pixel); in neofb_check_var()
698 memlen = var->xres_virtual * var->bits_per_pixel * in neofb_check_var()
699 var->yres_virtual / 8; in neofb_check_var()
703 if it was possible. We should return -EINVAL, but I disagree */ in neofb_check_var()
704 if (var->yres_virtual < var->yres) in neofb_check_var()
705 var->yres = var->yres_virtual; in neofb_check_var()
706 if (var->xoffset + var->xres > var->xres_virtual) in neofb_check_var()
707 var->xoffset = var->xres_virtual - var->xres; in neofb_check_var()
708 if (var->yoffset + var->yres > var->yres_virtual) in neofb_check_var()
709 var->yoffset = var->yres_virtual - var->yres; in neofb_check_var()
711 var->nonstd = 0; in neofb_check_var()
712 var->height = -1; in neofb_check_var()
713 var->width = -1; in neofb_check_var()
715 if (var->bits_per_pixel >= 24 || !par->neo2200) in neofb_check_var()
716 var->accel_flags &= ~FB_ACCELF_TEXT; in neofb_check_var()
722 struct neofb_par *par = info->par; in neofb_set_par()
735 vsync_start = info->var.yres + info->var.lower_margin; in neofb_set_par()
736 vtotal = vsync_start + info->var.vsync_len + info->var.upper_margin; in neofb_set_par()
743 if (vgaHWInit(&info->var, par)) in neofb_set_par()
744 return -EINVAL; in neofb_set_par()
750 par->Attribute[16] = 0x01; in neofb_set_par()
752 switch (info->var.bits_per_pixel) { in neofb_set_par()
754 par->CRTC[0x13] = info->var.xres_virtual >> 3; in neofb_set_par()
755 par->ExtCRTOffset = info->var.xres_virtual >> 11; in neofb_set_par()
756 par->ExtColorModeSelect = 0x11; in neofb_set_par()
759 par->CRTC[0x13] = info->var.xres_virtual >> 2; in neofb_set_par()
760 par->ExtCRTOffset = info->var.xres_virtual >> 10; in neofb_set_par()
761 par->ExtColorModeSelect = 0x13; in neofb_set_par()
764 par->CRTC[0x13] = (info->var.xres_virtual * 3) >> 3; in neofb_set_par()
765 par->ExtCRTOffset = (info->var.xres_virtual * 3) >> 11; in neofb_set_par()
766 par->ExtColorModeSelect = 0x14; in neofb_set_par()
770 par->CRTC[0x13] = info->var.xres_virtual >> 1; in neofb_set_par()
771 par->ExtCRTOffset = info->var.xres_virtual >> 9; in neofb_set_par()
772 par->ExtColorModeSelect = 0x15; in neofb_set_par()
779 par->ExtCRTDispAddr = 0x10; in neofb_set_par()
782 par->VerticalExt = (((vtotal - 2) & 0x400) >> 10) in neofb_set_par()
783 | (((info->var.yres - 1) & 0x400) >> 9) in neofb_set_par()
788 if (par->pci_burst) in neofb_set_par()
789 par->SysIfaceCntl1 = 0x30; in neofb_set_par()
791 par->SysIfaceCntl1 = 0x00; in neofb_set_par()
793 par->SysIfaceCntl2 = 0xc0; /* VESA Bios sets this to 0x80! */ in neofb_set_par()
796 par->PanelDispCntlRegRead = 1; in neofb_set_par()
799 par->PanelDispCntlReg1 = 0x00; in neofb_set_par()
800 if (par->internal_display) in neofb_set_par()
801 par->PanelDispCntlReg1 |= 0x02; in neofb_set_par()
802 if (par->external_display) in neofb_set_par()
803 par->PanelDispCntlReg1 |= 0x01; in neofb_set_par()
806 if (par->PanelDispCntlReg1 == 0x00) { in neofb_set_par()
808 par->PanelDispCntlReg1 = vga_rgfx(NULL, 0x20) & 0x03; in neofb_set_par()
812 switch (info->var.xres) { in neofb_set_par()
814 par->PanelDispCntlReg1 |= 0x60; in neofb_set_par()
817 par->PanelDispCntlReg1 |= 0x40; in neofb_set_par()
820 par->PanelDispCntlReg1 |= 0x20; in neofb_set_par()
828 switch (par->PanelDispCntlReg1 & 0x03) { in neofb_set_par()
830 par->GeneralLockReg = 0x00; in neofb_set_par()
832 par->ProgramVCLK = 1; in neofb_set_par()
836 par->GeneralLockReg = 0x01; in neofb_set_par()
838 par->ProgramVCLK = 0; in neofb_set_par()
848 par->PanelDispCntlReg2 = 0x00; in neofb_set_par()
849 par->PanelDispCntlReg3 = 0x00; in neofb_set_par()
851 if (par->lcd_stretch && (par->PanelDispCntlReg1 == 0x02) && /* LCD only */ in neofb_set_par()
852 (info->var.xres != par->NeoPanelWidth)) { in neofb_set_par()
853 switch (info->var.xres) { in neofb_set_par()
854 case 320: /* Needs testing. KEM -- 24 May 98 */ in neofb_set_par()
855 case 400: /* Needs testing. KEM -- 24 May 98 */ in neofb_set_par()
860 par->PanelDispCntlReg2 |= 0xC6; in neofb_set_par()
873 par->PanelVertCenterReg1 = 0x00; in neofb_set_par()
874 par->PanelVertCenterReg2 = 0x00; in neofb_set_par()
875 par->PanelVertCenterReg3 = 0x00; in neofb_set_par()
876 par->PanelVertCenterReg4 = 0x00; in neofb_set_par()
877 par->PanelVertCenterReg5 = 0x00; in neofb_set_par()
878 par->PanelHorizCenterReg1 = 0x00; in neofb_set_par()
879 par->PanelHorizCenterReg2 = 0x00; in neofb_set_par()
880 par->PanelHorizCenterReg3 = 0x00; in neofb_set_par()
881 par->PanelHorizCenterReg4 = 0x00; in neofb_set_par()
882 par->PanelHorizCenterReg5 = 0x00; in neofb_set_par()
885 if (par->PanelDispCntlReg1 & 0x02) { in neofb_set_par()
886 if (info->var.xres == par->NeoPanelWidth) { in neofb_set_par()
892 par->PanelDispCntlReg2 |= 0x01; in neofb_set_par()
893 par->PanelDispCntlReg3 |= 0x10; in neofb_set_par()
898 ((par->NeoPanelWidth - in neofb_set_par()
899 info->var.xres) >> 4) - 1; in neofb_set_par()
901 ((par->NeoPanelHeight - in neofb_set_par()
902 info->var.yres) >> 1) - 2; in neofb_set_par()
909 switch (info->var.xres) { in neofb_set_par()
910 case 320: /* Needs testing. KEM -- 24 May 98 */ in neofb_set_par()
911 par->PanelHorizCenterReg3 = hoffset; in neofb_set_par()
912 par->PanelVertCenterReg2 = voffset; in neofb_set_par()
914 case 400: /* Needs testing. KEM -- 24 May 98 */ in neofb_set_par()
915 par->PanelHorizCenterReg4 = hoffset; in neofb_set_par()
916 par->PanelVertCenterReg1 = voffset; in neofb_set_par()
919 par->PanelHorizCenterReg1 = hoffset; in neofb_set_par()
920 par->PanelVertCenterReg3 = voffset; in neofb_set_par()
923 par->PanelHorizCenterReg2 = hoffset; in neofb_set_par()
924 par->PanelVertCenterReg4 = voffset; in neofb_set_par()
927 par->PanelHorizCenterReg5 = hoffset; in neofb_set_par()
928 par->PanelVertCenterReg5 = voffset; in neofb_set_par()
938 par->biosMode = in neofb_set_par()
939 neoFindMode(info->var.xres, info->var.yres, in neofb_set_par()
940 info->var.bits_per_pixel); in neofb_set_par()
946 neoCalcVCLK(info, par, PICOS2KHZ(info->var.pixclock)); in neofb_set_par()
949 par->MiscOutReg |= 0x0C; in neofb_set_par()
958 vga_wgfx(NULL, 0x0A, par->GeneralLockReg); in neofb_set_par()
968 switch (info->fix.accel) { in neofb_set_par()
971 temp |= (par->ExtColorModeSelect & ~0xF0); in neofb_set_par()
982 temp |= (par->ExtColorModeSelect & ~0x70); in neofb_set_par()
1013 switch (info->var.bits_per_pixel) { in neofb_set_par()
1016 info->fix.visual = FB_VISUAL_PSEUDOCOLOR; in neofb_set_par()
1020 info->fix.visual = FB_VISUAL_TRUECOLOR; in neofb_set_par()
1035 info->fix.visual = FB_VISUAL_TRUECOLOR; in neofb_set_par()
1047 vga_wgfx(NULL, 0x0E, par->ExtCRTDispAddr); in neofb_set_par()
1048 vga_wgfx(NULL, 0x0F, par->ExtCRTOffset); in neofb_set_par()
1051 temp |= (par->SysIfaceCntl1 & ~0x0F); /* VESA Bios sets bit 1! */ in neofb_set_par()
1054 vga_wgfx(NULL, 0x11, par->SysIfaceCntl2); in neofb_set_par()
1055 vga_wgfx(NULL, 0x15, 0 /*par->SingleAddrPage */ ); in neofb_set_par()
1056 vga_wgfx(NULL, 0x16, 0 /*par->DualAddrPage */ ); in neofb_set_par()
1059 switch (info->fix.accel) { in neofb_set_par()
1062 temp |= (par->PanelDispCntlReg1 & ~0xFC); in neofb_set_par()
1069 temp |= (par->PanelDispCntlReg1 & ~0xDC); in neofb_set_par()
1076 temp |= (par->PanelDispCntlReg1 & ~0x98); in neofb_set_par()
1083 temp |= (par->PanelDispCntlReg2 & ~0x38); in neofb_set_par()
1086 if (info->fix.accel != FB_ACCEL_NEOMAGIC_NM2070) { in neofb_set_par()
1089 temp |= (par->PanelDispCntlReg3 & ~0xEF); in neofb_set_par()
1093 vga_wgfx(NULL, 0x28, par->PanelVertCenterReg1); in neofb_set_par()
1094 vga_wgfx(NULL, 0x29, par->PanelVertCenterReg2); in neofb_set_par()
1095 vga_wgfx(NULL, 0x2a, par->PanelVertCenterReg3); in neofb_set_par()
1097 if (info->fix.accel != FB_ACCEL_NEOMAGIC_NM2070) { in neofb_set_par()
1098 vga_wgfx(NULL, 0x32, par->PanelVertCenterReg4); in neofb_set_par()
1099 vga_wgfx(NULL, 0x33, par->PanelHorizCenterReg1); in neofb_set_par()
1100 vga_wgfx(NULL, 0x34, par->PanelHorizCenterReg2); in neofb_set_par()
1101 vga_wgfx(NULL, 0x35, par->PanelHorizCenterReg3); in neofb_set_par()
1104 if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2160) in neofb_set_par()
1105 vga_wgfx(NULL, 0x36, par->PanelHorizCenterReg4); in neofb_set_par()
1107 if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 || in neofb_set_par()
1108 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2230 || in neofb_set_par()
1109 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2360 || in neofb_set_par()
1110 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2380) { in neofb_set_par()
1111 vga_wgfx(NULL, 0x36, par->PanelHorizCenterReg4); in neofb_set_par()
1112 vga_wgfx(NULL, 0x37, par->PanelVertCenterReg5); in neofb_set_par()
1113 vga_wgfx(NULL, 0x38, par->PanelHorizCenterReg5); in neofb_set_par()
1119 if (par->ProgramVCLK && ((vga_rgfx(NULL, 0x9B) != par->VCLK3NumeratorLow) in neofb_set_par()
1120 || (vga_rgfx(NULL, 0x9F) != par->VCLK3Denominator) in neofb_set_par()
1122 != (par->VCLK3NumeratorHigh & in neofb_set_par()
1124 vga_wgfx(NULL, 0x9B, par->VCLK3NumeratorLow); in neofb_set_par()
1128 temp |= (par->VCLK3NumeratorHigh & ~0x0F); in neofb_set_par()
1131 vga_wgfx(NULL, 0x9F, par->VCLK3Denominator); in neofb_set_par()
1134 if (par->biosMode) in neofb_set_par()
1135 vga_wcrt(NULL, 0x23, par->biosMode); in neofb_set_par()
1140 if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 || in neofb_set_par()
1141 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2230 || in neofb_set_par()
1142 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2360 || in neofb_set_par()
1143 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2380) { in neofb_set_par()
1144 vga_wcrt(NULL, 0x70, par->VerticalExt); in neofb_set_par()
1150 neoLock(&par->state); in neofb_set_par()
1152 info->fix.line_length = in neofb_set_par()
1153 info->var.xres_virtual * (info->var.bits_per_pixel >> 3); in neofb_set_par()
1155 switch (info->fix.accel) { in neofb_set_par()
1160 neo2200_accel_init(info, &info->var); in neofb_set_par()
1174 struct neofb_par *par = info->par; in neofb_pan_display()
1175 struct vgastate *state = &par->state; in neofb_pan_display()
1181 Base = (var->yoffset * info->var.xres_virtual + var->xoffset) >> 2; in neofb_pan_display()
1182 Base *= (info->var.bits_per_pixel + 7) / 8; in neofb_pan_display()
1189 vga_wcrt(state->vgabase, 0x0C, (Base & 0x00FF00) >> 8); in neofb_pan_display()
1190 vga_wcrt(state->vgabase, 0x0D, (Base & 0x00FF)); in neofb_pan_display()
1198 vga_wgfx(state->vgabase, 0x0E, (((Base >> 16) & 0x0f) | (oldExtCRTDispAddr & 0xf0))); in neofb_pan_display()
1208 if (regno >= fb->cmap.len || regno > 255) in neofb_setcolreg()
1209 return -EINVAL; in neofb_setcolreg()
1211 if (fb->var.bits_per_pixel <= 8) { in neofb_setcolreg()
1218 switch (fb->var.bits_per_pixel) { in neofb_setcolreg()
1220 ((u32 *) fb->pseudo_palette)[regno] = in neofb_setcolreg()
1225 ((u32 *) fb->pseudo_palette)[regno] = in neofb_setcolreg()
1231 ((u32 *) fb->pseudo_palette)[regno] = in neofb_setcolreg()
1251 * Return 0 if blanking succeeded, != 0 if un-/blanking failed due to in neofb_blank()
1261 * run "setterm -powersave powerdown" to take advantage in neofb_blank()
1263 struct neofb_par *par = info->par; in neofb_blank()
1272 neoLock(&par->state); in neofb_blank()
1275 * configuration in the driver. During un-blank, we re-apply this setting, in neofb_blank()
1278 if (par->PanelDispCntlRegRead) { in neofb_blank()
1279 par->PanelDispCntlReg1 = tmpdisp; in neofb_blank()
1281 par->PanelDispCntlRegRead = !blank_mode; in neofb_blank()
1284 case FB_BLANK_POWERDOWN: /* powerdown - both sync lines down */ in neofb_blank()
1297 regs.ecx = 0x0000; /* HCI_DISABLE */ in neofb_blank()
1319 * So here is an attempt to implement ">=" - if we are in the process in neofb_blank()
1323 lcdflags = ((par->PanelDispCntlReg1 | tmpdisp) & 0x02); /* LCD normal */ in neofb_blank()
1328 lcdflags = ((par->PanelDispCntlReg1 | tmpdisp) & 0x02); /* LCD normal */ in neofb_blank()
1332 /* attempt to re-enable backlight/external on toshiba */ in neofb_blank()
1338 regs.ecx = 0x0001; /* HCI_ENABLE */ in neofb_blank()
1355 neoLock(&par->state); in neofb_blank()
1362 struct neofb_par *par = info->par; in neo2200_fillrect()
1365 dst = rect->dx + rect->dy * info->var.xres_virtual; in neo2200_fillrect()
1366 rop = rect->rop ? 0x060000 : 0x0c0000; in neo2200_fillrect()
1375 rop, &par->neo2200->bltCntl); in neo2200_fillrect()
1377 switch (info->var.bits_per_pixel) { in neo2200_fillrect()
1379 writel(rect->color, &par->neo2200->fgColor); in neo2200_fillrect()
1383 writel(((u32 *) (info->pseudo_palette))[rect->color], in neo2200_fillrect()
1384 &par->neo2200->fgColor); in neo2200_fillrect()
1388 writel(dst * ((info->var.bits_per_pixel + 7) >> 3), in neo2200_fillrect()
1389 &par->neo2200->dstStart); in neo2200_fillrect()
1390 writel((rect->height << 16) | (rect->width & 0xffff), in neo2200_fillrect()
1391 &par->neo2200->xyExt); in neo2200_fillrect()
1397 u32 sx = area->sx, sy = area->sy, dx = area->dx, dy = area->dy; in neo2200_copyarea()
1398 struct neofb_par *par = info->par; in neo2200_copyarea()
1405 sy += (area->height - 1); in neo2200_copyarea()
1406 dy += (area->height - 1); in neo2200_copyarea()
1407 sx += (area->width - 1); in neo2200_copyarea()
1408 dx += (area->width - 1); in neo2200_copyarea()
1413 src = sx * (info->var.bits_per_pixel >> 3) + sy*info->fix.line_length; in neo2200_copyarea()
1414 dst = dx * (info->var.bits_per_pixel >> 3) + dy*info->fix.line_length; in neo2200_copyarea()
1419 writel(bltCntl, &par->neo2200->bltCntl); in neo2200_copyarea()
1421 writel(src, &par->neo2200->srcStart); in neo2200_copyarea()
1422 writel(dst, &par->neo2200->dstStart); in neo2200_copyarea()
1423 writel((area->height << 16) | (area->width & 0xffff), in neo2200_copyarea()
1424 &par->neo2200->xyExt); in neo2200_copyarea()
1430 struct neofb_par *par = info->par; in neo2200_imageblit()
1431 int s_pitch = (image->width * image->depth + 7) >> 3; in neo2200_imageblit()
1432 int scan_align = info->pixmap.scan_align - 1; in neo2200_imageblit()
1433 int buf_align = info->pixmap.buf_align - 1; in neo2200_imageblit()
1438 data_len = ((d_pitch * image->height) + buf_align) & ~buf_align; in neo2200_imageblit()
1442 if (image->depth == 1) { in neo2200_imageblit()
1443 if (info->var.bits_per_pixel == 24 && image->width < 16) { in neo2200_imageblit()
1444 /* FIXME. There is a bug with accelerated color-expanded in neo2200_imageblit()
1453 } else if (image->depth == info->var.bits_per_pixel) { in neo2200_imageblit()
1462 switch (info->var.bits_per_pixel) { in neo2200_imageblit()
1464 writel(image->fg_color, &par->neo2200->fgColor); in neo2200_imageblit()
1465 writel(image->bg_color, &par->neo2200->bgColor); in neo2200_imageblit()
1469 writel(((u32 *) (info->pseudo_palette))[image->fg_color], in neo2200_imageblit()
1470 &par->neo2200->fgColor); in neo2200_imageblit()
1471 writel(((u32 *) (info->pseudo_palette))[image->bg_color], in neo2200_imageblit()
1472 &par->neo2200->bgColor); in neo2200_imageblit()
1479 0x0c0000, &par->neo2200->bltCntl); in neo2200_imageblit()
1481 writel(0, &par->neo2200->srcStart); in neo2200_imageblit()
1482 // par->neo2200->dstStart = (image->dy << 16) | (image->dx & 0xffff); in neo2200_imageblit()
1483 writel(((image->dx & 0xffff) * (info->var.bits_per_pixel >> 3) + in neo2200_imageblit()
1484 image->dy * info->fix.line_length), &par->neo2200->dstStart); in neo2200_imageblit()
1485 writel((image->height << 16) | (image->width & 0xffff), in neo2200_imageblit()
1486 &par->neo2200->xyExt); in neo2200_imageblit()
1488 memcpy_toio(par->mmio_vbase + 0x100000, image->data, data_len); in neo2200_imageblit()
1494 switch (info->fix.accel) { in neofb_fillrect()
1510 switch (info->fix.accel) { in neofb_copyarea()
1526 switch (info->fix.accel) { in neofb_imageblit()
1542 switch (info->fix.accel) { in neofb_sync()
1559 //memset_io(info->sprite.addr, 0xff, 1);
1565 struct neofb_par *par = (struct neofb_par *) info->par;
1570 if (cursor->set & FB_CUR_SETPOS) {
1571 u32 x = cursor->image.dx;
1572 u32 y = cursor->image.dy;
1574 info->cursor.image.dx = x;
1575 info->cursor.image.dy = y;
1580 if (cursor->set & FB_CUR_SETSIZE) {
1581 info->cursor.image.height = cursor->image.height;
1582 info->cursor.image.width = cursor->image.width;
1585 if (cursor->set & FB_CUR_SETHOT)
1586 info->cursor.hot = cursor->hot;
1588 if (cursor->set & FB_CUR_SETCMAP) {
1589 if (cursor->image.depth == 1) {
1590 u32 fg = cursor->image.fg_color;
1591 u32 bg = cursor->image.bg_color;
1593 info->cursor.image.fg_color = fg;
1594 info->cursor.image.bg_color = bg;
1603 if (cursor->set & FB_CUR_SETSHAPE)
1606 if (info->cursor.enable)
1627 /* --------------------------------------------------------------------- */
1645 struct neofb_par *par = info->par; in neo_map_mmio()
1649 switch (info->fix.accel) { in neo_map_mmio()
1651 info->fix.mmio_start = pci_resource_start(dev, 0)+ in neo_map_mmio()
1656 info->fix.mmio_start = pci_resource_start(dev, 0)+ in neo_map_mmio()
1665 info->fix.mmio_start = pci_resource_start(dev, 1); in neo_map_mmio()
1668 info->fix.mmio_start = pci_resource_start(dev, 0); in neo_map_mmio()
1670 info->fix.mmio_len = MMIO_SIZE; in neo_map_mmio()
1673 (info->fix.mmio_start, MMIO_SIZE, "memory mapped I/O")) { in neo_map_mmio()
1675 return -EBUSY; in neo_map_mmio()
1678 par->mmio_vbase = ioremap(info->fix.mmio_start, MMIO_SIZE); in neo_map_mmio()
1679 if (!par->mmio_vbase) { in neo_map_mmio()
1681 release_mem_region(info->fix.mmio_start, in neo_map_mmio()
1682 info->fix.mmio_len); in neo_map_mmio()
1683 return -ENOMEM; in neo_map_mmio()
1686 par->mmio_vbase); in neo_map_mmio()
1692 struct neofb_par *par = info->par; in neo_unmap_mmio()
1696 iounmap(par->mmio_vbase); in neo_unmap_mmio()
1697 par->mmio_vbase = NULL; in neo_unmap_mmio()
1699 release_mem_region(info->fix.mmio_start, in neo_unmap_mmio()
1700 info->fix.mmio_len); in neo_unmap_mmio()
1707 struct neofb_par *par = info->par; in neo_map_video()
1711 info->fix.smem_start = pci_resource_start(dev, 0); in neo_map_video()
1712 info->fix.smem_len = video_len; in neo_map_video()
1714 if (!request_mem_region(info->fix.smem_start, info->fix.smem_len, in neo_map_video()
1717 return -EBUSY; in neo_map_video()
1720 info->screen_base = in neo_map_video()
1721 ioremap_wc(info->fix.smem_start, info->fix.smem_len); in neo_map_video()
1722 if (!info->screen_base) { in neo_map_video()
1724 release_mem_region(info->fix.smem_start, in neo_map_video()
1725 info->fix.smem_len); in neo_map_video()
1726 return -ENOMEM; in neo_map_video()
1729 info->screen_base); in neo_map_video()
1731 par->wc_cookie = arch_phys_wc_add(info->fix.smem_start, in neo_map_video()
1735 memset_io(info->screen_base, 0, info->fix.smem_len); in neo_map_video()
1738 info->fix.smem_len -= PAGE_SIZE; in neo_map_video()
1739 addr = info->fix.smem_start + info->fix.smem_len; in neo_map_video()
1742 addr = (unsigned long) info->screen_base + info->fix.smem_len; in neo_map_video()
1743 info->sprite.addr = (u8 *) addr; */ in neo_map_video()
1749 struct neofb_par *par = info->par; in neo_unmap_video()
1753 arch_phys_wc_del(par->wc_cookie); in neo_unmap_video()
1754 iounmap(info->screen_base); in neo_unmap_video()
1755 info->screen_base = NULL; in neo_unmap_video()
1757 release_mem_region(info->fix.smem_start, in neo_unmap_video()
1758 info->fix.smem_len); in neo_unmap_video()
1763 struct neofb_par *par = info->par; in neo_scan_monitor()
1768 info->monspecs.modedb = kmalloc(sizeof(struct fb_videomode), GFP_KERNEL); in neo_scan_monitor()
1769 if (!info->monspecs.modedb) in neo_scan_monitor()
1770 return -ENOMEM; in neo_scan_monitor()
1771 info->monspecs.modedb_len = 1; in neo_scan_monitor()
1777 if (!par->internal_display && !par->external_display) { in neo_scan_monitor()
1778 par->internal_display = display & 2 || !(display & 3) ? 1 : 0; in neo_scan_monitor()
1779 par->external_display = display & 1; in neo_scan_monitor()
1781 par->internal_display && par->external_display ? "simultaneous" : in neo_scan_monitor()
1782 par->internal_display ? "internal" : "external"); in neo_scan_monitor()
1785 /* Determine panel width -- used in NeoValidMode. */ in neo_scan_monitor()
1791 par->NeoPanelWidth = 640; in neo_scan_monitor()
1792 par->NeoPanelHeight = 480; in neo_scan_monitor()
1793 memcpy(info->monspecs.modedb, &vesa_modes[3], sizeof(struct fb_videomode)); in neo_scan_monitor()
1796 par->NeoPanelWidth = 800; in neo_scan_monitor()
1797 if (par->libretto) { in neo_scan_monitor()
1798 par->NeoPanelHeight = 480; in neo_scan_monitor()
1799 memcpy(info->monspecs.modedb, &mode800x480, sizeof(struct fb_videomode)); in neo_scan_monitor()
1802 par->NeoPanelHeight = 600; in neo_scan_monitor()
1803 memcpy(info->monspecs.modedb, &vesa_modes[8], sizeof(struct fb_videomode)); in neo_scan_monitor()
1808 par->NeoPanelWidth = 1024; in neo_scan_monitor()
1809 par->NeoPanelHeight = 768; in neo_scan_monitor()
1810 memcpy(info->monspecs.modedb, &vesa_modes[13], sizeof(struct fb_videomode)); in neo_scan_monitor()
1815 par->NeoPanelWidth = 1280; in neo_scan_monitor()
1816 par->NeoPanelHeight = 1024; in neo_scan_monitor()
1817 memcpy(info->monspecs.modedb, &vesa_modes[20], sizeof(struct fb_videomode)); in neo_scan_monitor()
1822 kfree(info->monspecs.modedb); in neo_scan_monitor()
1823 return -1; in neo_scan_monitor()
1827 par->NeoPanelWidth = 640; in neo_scan_monitor()
1828 par->NeoPanelHeight = 480; in neo_scan_monitor()
1829 memcpy(info->monspecs.modedb, &vesa_modes[3], sizeof(struct fb_videomode)); in neo_scan_monitor()
1834 par->NeoPanelWidth, in neo_scan_monitor()
1835 par->NeoPanelHeight, in neo_scan_monitor()
1843 struct neofb_par *par = info->par; in neo_init_hw()
1854 printk(KERN_DEBUG "--- Neo extended register dump ---\n"); in neo_init_hw()
1862 switch (info->fix.accel) { in neo_init_hw()
1894 switch (info->fix.accel) { in neo_init_hw()
1913 par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase; in neo_init_hw()
1917 info->sprite.size = CursorMem; in neo_init_hw()
1918 info->sprite.scan_align = 1; in neo_init_hw()
1919 info->sprite.buf_align = 1; in neo_init_hw()
1920 info->sprite.flags = FB_PIXMAP_IO; in neo_init_hw()
1921 info->sprite.outbuf = neofb_draw_cursor; in neo_init_hw()
1923 par->maxClock = maxClock; in neo_init_hw()
1924 par->cursorOff = CursorOff; in neo_init_hw()
1935 info = framebuffer_alloc(sizeof(struct neofb_par), &dev->dev); in neo_alloc_fb_info()
1940 par = info->par; in neo_alloc_fb_info()
1942 info->fix.accel = id->driver_data; in neo_alloc_fb_info()
1944 par->pci_burst = !nopciburst; in neo_alloc_fb_info()
1945 par->lcd_stretch = !nostretch; in neo_alloc_fb_info()
1946 par->libretto = libretto; in neo_alloc_fb_info()
1948 par->internal_display = internal; in neo_alloc_fb_info()
1949 par->external_display = external; in neo_alloc_fb_info()
1950 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; in neo_alloc_fb_info()
1952 switch (info->fix.accel) { in neo_alloc_fb_info()
1954 snprintf(info->fix.id, sizeof(info->fix.id), in neo_alloc_fb_info()
1958 snprintf(info->fix.id, sizeof(info->fix.id), in neo_alloc_fb_info()
1962 snprintf(info->fix.id, sizeof(info->fix.id), in neo_alloc_fb_info()
1966 snprintf(info->fix.id, sizeof(info->fix.id), in neo_alloc_fb_info()
1970 snprintf(info->fix.id, sizeof(info->fix.id), in neo_alloc_fb_info()
1974 snprintf(info->fix.id, sizeof(info->fix.id), in neo_alloc_fb_info()
1976 info->flags |= FBINFO_HWACCEL_IMAGEBLIT | in neo_alloc_fb_info()
1981 snprintf(info->fix.id, sizeof(info->fix.id), in neo_alloc_fb_info()
1983 info->flags |= FBINFO_HWACCEL_IMAGEBLIT | in neo_alloc_fb_info()
1988 snprintf(info->fix.id, sizeof(info->fix.id), in neo_alloc_fb_info()
1990 info->flags |= FBINFO_HWACCEL_IMAGEBLIT | in neo_alloc_fb_info()
1995 snprintf(info->fix.id, sizeof(info->fix.id), in neo_alloc_fb_info()
1997 info->flags |= FBINFO_HWACCEL_IMAGEBLIT | in neo_alloc_fb_info()
2003 info->fix.type = FB_TYPE_PACKED_PIXELS; in neo_alloc_fb_info()
2004 info->fix.type_aux = 0; in neo_alloc_fb_info()
2005 info->fix.xpanstep = 0; in neo_alloc_fb_info()
2006 info->fix.ypanstep = 4; in neo_alloc_fb_info()
2007 info->fix.ywrapstep = 0; in neo_alloc_fb_info()
2008 info->fix.accel = id->driver_data; in neo_alloc_fb_info()
2010 info->fbops = &neofb_ops; in neo_alloc_fb_info()
2011 info->pseudo_palette = par->palette; in neo_alloc_fb_info()
2021 fb_dealloc_cmap(&info->cmap); in neo_free_fb_info()
2026 /* --------------------------------------------------------------------- */
2040 err = -ENOMEM; in neofb_probe()
2063 if (!fb_find_mode(&info->var, info, mode_option, NULL, 0, in neofb_probe()
2064 info->monspecs.modedb, 16)) { in neofb_probe()
2066 err = -EINVAL; in neofb_probe()
2073 * the precision and fit the results into 32-bit registers. in neofb_probe()
2076 h_sync = 1953125000 / info->var.pixclock; in neofb_probe()
2078 h_sync * 512 / (info->var.xres + info->var.left_margin + in neofb_probe()
2079 info->var.right_margin + info->var.hsync_len); in neofb_probe()
2081 h_sync / (info->var.yres + info->var.upper_margin + in neofb_probe()
2082 info->var.lower_margin + info->var.vsync_len); in neofb_probe()
2086 info->fix.smem_len >> 10, info->var.xres, in neofb_probe()
2087 info->var.yres, h_sync / 1000, h_sync % 1000, v_sync); in neofb_probe()
2089 err = fb_alloc_cmap(&info->cmap, 256, 0); in neofb_probe()
2097 fb_info(info, "%s frame buffer device\n", info->fix.id); in neofb_probe()
2106 fb_dealloc_cmap(&info->cmap); in neofb_probe()
2110 fb_destroy_modedb(info->monspecs.modedb); in neofb_probe()
2128 fb_destroy_modedb(info->monspecs.modedb); in neofb_remove()
2174 /* ************************* init in-kernel code ************************** */
2213 return -ENODEV; in neofb_init()