Lines Matching +full:ext +full:- +full:32 +full:k

2  * linux/drivers/video/riva/fbdev.c - nVidia RIVA 128/TNT/TNT2 fb driver
6 * Copyright 1999-2000 Jeff Garzik
55 /* ------------------------------------------------------------------------- *
59 * ------------------------------------------------------------------------- */
88 #define MAX_CURS 32
90 /* ------------------------------------------------------------------------- *
94 * ------------------------------------------------------------------------- */
98 /* ------------------------------------------------------------------------- *
102 * ------------------------------------------------------------------------- */
194 /* ------------------------------------------------------------------------- *
198 * ------------------------------------------------------------------------- */
201 static int flatpanel = -1; /* Autodetect later */
202 static int forceCRTC = -1;
227 .height = -1,
228 .width = -1,
232 .upper_margin = 32,
269 #define LEVEL_STEP ((MAX_LEVEL - MIN_LEVEL) / FB_BACKLIGHT_MAX)
274 struct fb_info *info = pci_get_drvdata(par->pdev); in riva_bl_get_level_brightness()
279 nlevel = MIN_LEVEL + info->bl_curve[level] * LEVEL_STEP; in riva_bl_get_level_brightness()
297 if (bd->props.power != FB_BLANK_UNBLANK || in riva_bl_update_status()
298 bd->props.fb_blank != FB_BLANK_UNBLANK) in riva_bl_update_status()
301 level = bd->props.brightness; in riva_bl_update_status()
303 tmp_pmc = NV_RD32(par->riva.PMC, 0x10F0) & 0x0000FFFF; in riva_bl_update_status()
304 tmp_pcrt = NV_RD32(par->riva.PCRTC0, 0x081C) & 0xFFFFFFFC; in riva_bl_update_status()
310 NV_WR32(par->riva.PCRTC0, 0x081C, tmp_pcrt); in riva_bl_update_status()
311 NV_WR32(par->riva.PMC, 0x10F0, tmp_pmc); in riva_bl_update_status()
323 struct fb_info *info = pci_get_drvdata(par->pdev); in riva_bl_init()
327 if (!par->FlatPanel) in riva_bl_init()
336 snprintf(name, sizeof(name), "rivabl%d", info->node); in riva_bl_init()
340 props.max_brightness = FB_BACKLIGHT_LEVELS - 1; in riva_bl_init()
341 bd = backlight_device_register(name, info->dev, par, &riva_bl_ops, in riva_bl_init()
344 info->bl_dev = NULL; in riva_bl_init()
349 info->bl_dev = bd; in riva_bl_init()
354 bd->props.brightness = bd->props.max_brightness; in riva_bl_init()
355 bd->props.power = FB_BLANK_UNBLANK; in riva_bl_init()
368 struct backlight_device *bd = info->bl_dev; in riva_bl_exit()
378 /* ------------------------------------------------------------------------- *
382 * ------------------------------------------------------------------------- */
387 VGA_WR08(par->riva.PCIO, 0x3d4, index); in CRTCout()
388 VGA_WR08(par->riva.PCIO, 0x3d5, val); in CRTCout()
394 VGA_WR08(par->riva.PCIO, 0x3d4, index); in CRTCin()
395 return (VGA_RD08(par->riva.PCIO, 0x3d5)); in CRTCin()
401 VGA_WR08(par->riva.PVIO, 0x3ce, index); in GRAout()
402 VGA_WR08(par->riva.PVIO, 0x3cf, val); in GRAout()
408 VGA_WR08(par->riva.PVIO, 0x3ce, index); in GRAin()
409 return (VGA_RD08(par->riva.PVIO, 0x3cf)); in GRAin()
415 VGA_WR08(par->riva.PVIO, 0x3c4, index); in SEQout()
416 VGA_WR08(par->riva.PVIO, 0x3c5, val); in SEQout()
422 VGA_WR08(par->riva.PVIO, 0x3c4, index); in SEQin()
423 return (VGA_RD08(par->riva.PVIO, 0x3c5)); in SEQin()
429 VGA_WR08(par->riva.PCIO, 0x3c0, index); in ATTRout()
430 VGA_WR08(par->riva.PCIO, 0x3c0, val); in ATTRout()
436 VGA_WR08(par->riva.PCIO, 0x3c0, index); in ATTRin()
437 return (VGA_RD08(par->riva.PCIO, 0x3c1)); in ATTRin()
442 VGA_WR08(par->riva.PVIO, 0x3c2, val); in MISCout()
447 return (VGA_RD08(par->riva.PVIO, 0x3cc)); in MISCin()
459 /* ------------------------------------------------------------------------- *
463 * ------------------------------------------------------------------------- */
466 * rivafb_load_cursor_image - load cursor image to hardware
471 * @bg: background color (ARGB1555) - alpha bit determines opacity
486 int i, j, k = 0; in rivafb_load_cursor_image() local
511 writel(tmp, &par->riva.CURSOR[k++]); in rivafb_load_cursor_image()
513 k += (MAX_CURS - w)/2; in rivafb_load_cursor_image()
517 /* ------------------------------------------------------------------------- *
521 * ------------------------------------------------------------------------- */
524 * riva_wclut - set CLUT entry
541 VGA_WR08(chip->PDIO, 0x3c8, regnum); in riva_wclut()
542 VGA_WR08(chip->PDIO, 0x3c9, red); in riva_wclut()
543 VGA_WR08(chip->PDIO, 0x3c9, green); in riva_wclut()
544 VGA_WR08(chip->PDIO, 0x3c9, blue); in riva_wclut()
548 * riva_rclut - read fromCLUT register
566 VGA_WR08(chip->PDIO, 0x3c7, regnum); in riva_rclut()
567 *red = VGA_RD08(chip->PDIO, 0x3c9); in riva_rclut()
568 *green = VGA_RD08(chip->PDIO, 0x3c9); in riva_rclut()
569 *blue = VGA_RD08(chip->PDIO, 0x3c9); in riva_rclut()
573 * riva_save_state - saves current chip state
589 par->riva.LockUnlock(&par->riva, 0); in riva_save_state()
591 par->riva.UnloadStateExt(&par->riva, &regs->ext); in riva_save_state()
593 regs->misc_output = MISCin(par); in riva_save_state()
596 regs->crtc[i] = CRTCin(par, i); in riva_save_state()
599 regs->attr[i] = ATTRin(par, i); in riva_save_state()
602 regs->gra[i] = GRAin(par, i); in riva_save_state()
605 regs->seq[i] = SEQin(par, i); in riva_save_state()
610 * riva_load_state - loads current chip state
625 RIVA_HW_STATE *state = &regs->ext; in riva_load_state()
631 par->riva.LockUnlock(&par->riva, 0); in riva_load_state()
633 par->riva.LoadStateExt(&par->riva, state); in riva_load_state()
635 MISCout(par, regs->misc_output); in riva_load_state()
643 CRTCout(par, i, regs->crtc[i]); in riva_load_state()
648 ATTRout(par, i, regs->attr[i]); in riva_load_state()
651 GRAout(par, i, regs->gra[i]); in riva_load_state()
654 SEQout(par, i, regs->seq[i]); in riva_load_state()
659 * riva_load_video_mode - calculate timings
674 struct riva_par *par = info->par; in riva_load_video_mode()
681 bpp = info->var.bits_per_pixel; in riva_load_video_mode()
682 if (bpp == 16 && info->var.green.length == 5) in riva_load_video_mode()
684 width = info->var.xres_virtual; in riva_load_video_mode()
685 hDisplaySize = info->var.xres; in riva_load_video_mode()
686 hDisplay = (hDisplaySize / 8) - 1; in riva_load_video_mode()
687 hStart = (hDisplaySize + info->var.right_margin) / 8 - 1; in riva_load_video_mode()
688 hEnd = (hDisplaySize + info->var.right_margin + in riva_load_video_mode()
689 info->var.hsync_len) / 8 - 1; in riva_load_video_mode()
690 hTotal = (hDisplaySize + info->var.right_margin + in riva_load_video_mode()
691 info->var.hsync_len + info->var.left_margin) / 8 - 5; in riva_load_video_mode()
695 height = info->var.yres_virtual; in riva_load_video_mode()
696 vDisplay = info->var.yres - 1; in riva_load_video_mode()
697 vStart = info->var.yres + info->var.lower_margin - 1; in riva_load_video_mode()
698 vEnd = info->var.yres + info->var.lower_margin + in riva_load_video_mode()
699 info->var.vsync_len - 1; in riva_load_video_mode()
700 vTotal = info->var.yres + info->var.lower_margin + in riva_load_video_mode()
701 info->var.vsync_len + info->var.upper_margin + 2; in riva_load_video_mode()
704 dotClock = 1000000000 / info->var.pixclock; in riva_load_video_mode()
708 if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) in riva_load_video_mode()
711 if (par->FlatPanel) { in riva_load_video_mode()
712 vStart = vTotal - 3; in riva_load_video_mode()
713 vEnd = vTotal - 2; in riva_load_video_mode()
715 hStart = hTotal - 3; in riva_load_video_mode()
716 hEnd = hTotal - 2; in riva_load_video_mode()
746 newmode.ext.screen = SetBitField(hBlankEnd,6:6,4:4) in riva_load_video_mode()
751 newmode.ext.horiz = SetBitField(hTotal,8:8,0:0) in riva_load_video_mode()
755 newmode.ext.extra = SetBitField(vTotal,11:11,0:0) in riva_load_video_mode()
760 if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) { in riva_load_video_mode()
762 newmode.ext.interlace = Set8Bits(tmp); in riva_load_video_mode()
763 newmode.ext.horiz |= SetBitField(tmp, 8:8,4:4); in riva_load_video_mode()
765 newmode.ext.interlace = 0xff; /* interlace off */ in riva_load_video_mode()
767 if (par->riva.Architecture >= NV_ARCH_10) in riva_load_video_mode()
768 par->riva.CURSOR = (U032 __iomem *)(info->screen_base + par->riva.CursorStart); in riva_load_video_mode()
770 if (info->var.sync & FB_SYNC_HOR_HIGH_ACT) in riva_load_video_mode()
774 if (info->var.sync & FB_SYNC_VERT_HIGH_ACT) in riva_load_video_mode()
779 rc = CalcStateExt(&par->riva, &newmode.ext, par->pdev, bpp, width, in riva_load_video_mode()
784 newmode.ext.scale = NV_RD32(par->riva.PRAMDAC, 0x00000848) & in riva_load_video_mode()
786 if (par->FlatPanel == 1) { in riva_load_video_mode()
787 newmode.ext.pixel |= (1 << 7); in riva_load_video_mode()
788 newmode.ext.scale |= (1 << 8); in riva_load_video_mode()
790 if (par->SecondCRTC) { in riva_load_video_mode()
791 newmode.ext.head = NV_RD32(par->riva.PCRTC0, 0x00000860) & in riva_load_video_mode()
793 newmode.ext.head2 = NV_RD32(par->riva.PCRTC0, 0x00002860) | in riva_load_video_mode()
795 newmode.ext.crtcOwner = 3; in riva_load_video_mode()
796 newmode.ext.pllsel |= 0x20000800; in riva_load_video_mode()
797 newmode.ext.vpll2 = newmode.ext.vpll; in riva_load_video_mode()
798 } else if (par->riva.twoHeads) { in riva_load_video_mode()
799 newmode.ext.head = NV_RD32(par->riva.PCRTC0, 0x00000860) | in riva_load_video_mode()
801 newmode.ext.head2 = NV_RD32(par->riva.PCRTC0, 0x00002860) & in riva_load_video_mode()
803 newmode.ext.crtcOwner = 0; in riva_load_video_mode()
804 newmode.ext.vpll2 = NV_RD32(par->riva.PRAMDAC0, 0x00000520); in riva_load_video_mode()
806 if (par->FlatPanel == 1) { in riva_load_video_mode()
807 newmode.ext.pixel |= (1 << 7); in riva_load_video_mode()
808 newmode.ext.scale |= (1 << 8); in riva_load_video_mode()
810 newmode.ext.cursorConfig = 0x02000100; in riva_load_video_mode()
811 par->current_state = newmode; in riva_load_video_mode()
812 riva_load_state(par, &par->current_state); in riva_load_video_mode()
813 par->riva.LockUnlock(&par->riva, 0); /* important for HW cursor */ in riva_load_video_mode()
826 var->xres = var->xres_virtual = modedb->xres; in riva_update_var()
827 var->yres = modedb->yres; in riva_update_var()
828 if (var->yres_virtual < var->yres) in riva_update_var()
829 var->yres_virtual = var->yres; in riva_update_var()
830 var->xoffset = var->yoffset = 0; in riva_update_var()
831 var->pixclock = modedb->pixclock; in riva_update_var()
832 var->left_margin = modedb->left_margin; in riva_update_var()
833 var->right_margin = modedb->right_margin; in riva_update_var()
834 var->upper_margin = modedb->upper_margin; in riva_update_var()
835 var->lower_margin = modedb->lower_margin; in riva_update_var()
836 var->hsync_len = modedb->hsync_len; in riva_update_var()
837 var->vsync_len = modedb->vsync_len; in riva_update_var()
838 var->sync = modedb->sync; in riva_update_var()
839 var->vmode = modedb->vmode; in riva_update_var()
844 * rivafb_do_maximize -
854 * -EINVAL on failure, 0 on success
872 {-1, -1} in rivafb_do_maximize()
878 if (var->xres_virtual == -1 && var->yres_virtual == -1) { in rivafb_do_maximize()
881 for (i = 0; modes[i].xres != -1; i++) { in rivafb_do_maximize()
883 info->fix.smem_len) in rivafb_do_maximize()
886 if (modes[i].xres == -1) { in rivafb_do_maximize()
889 NVTRACE("EXIT - EINVAL error\n"); in rivafb_do_maximize()
890 return -EINVAL; in rivafb_do_maximize()
892 var->xres_virtual = modes[i].xres; in rivafb_do_maximize()
893 var->yres_virtual = modes[i].yres; in rivafb_do_maximize()
897 var->xres_virtual, var->yres_virtual); in rivafb_do_maximize()
898 } else if (var->xres_virtual == -1) { in rivafb_do_maximize()
899 var->xres_virtual = (info->fix.smem_len * den / in rivafb_do_maximize()
900 (nom * var->yres_virtual)) & ~15; in rivafb_do_maximize()
902 "setting virtual X resolution to %d\n", var->xres_virtual); in rivafb_do_maximize()
903 } else if (var->yres_virtual == -1) { in rivafb_do_maximize()
904 var->xres_virtual = (var->xres_virtual + 15) & ~15; in rivafb_do_maximize()
905 var->yres_virtual = info->fix.smem_len * den / in rivafb_do_maximize()
906 (nom * var->xres_virtual); in rivafb_do_maximize()
908 "setting virtual Y resolution to %d\n", var->yres_virtual); in rivafb_do_maximize()
910 var->xres_virtual = (var->xres_virtual + 15) & ~15; in rivafb_do_maximize()
911 if (var->xres_virtual * nom / den * var->yres_virtual > info->fix.smem_len) { in rivafb_do_maximize()
914 var->xres, var->yres, var->bits_per_pixel); in rivafb_do_maximize()
915 NVTRACE("EXIT - EINVAL error\n"); in rivafb_do_maximize()
916 return -EINVAL; in rivafb_do_maximize()
920 if (var->xres_virtual * nom / den >= 8192) { in rivafb_do_maximize()
923 var->xres_virtual, 8192 * den / nom - 16); in rivafb_do_maximize()
924 var->xres_virtual = 8192 * den / nom - 16; in rivafb_do_maximize()
927 if (var->xres_virtual < var->xres) { in rivafb_do_maximize()
929 "virtual X resolution (%d) is smaller than real\n", var->xres_virtual); in rivafb_do_maximize()
930 return -EINVAL; in rivafb_do_maximize()
933 if (var->yres_virtual < var->yres) { in rivafb_do_maximize()
935 "virtual Y resolution (%d) is smaller than real\n", var->yres_virtual); in rivafb_do_maximize()
936 return -EINVAL; in rivafb_do_maximize()
938 if (var->yres_virtual > 0x7fff/nom) in rivafb_do_maximize()
939 var->yres_virtual = 0x7fff/nom; in rivafb_do_maximize()
940 if (var->xres_virtual > 0x7fff/nom) in rivafb_do_maximize()
941 var->xres_virtual = 0x7fff/nom; in rivafb_do_maximize()
949 RIVA_FIFO_FREE(par->riva, Patt, 4); in riva_set_pattern()
950 NV_WR32(&par->riva.Patt->Color0, 0, clr0); in riva_set_pattern()
951 NV_WR32(&par->riva.Patt->Color1, 0, clr1); in riva_set_pattern()
952 NV_WR32(par->riva.Patt->Monochrome, 0, pat0); in riva_set_pattern()
953 NV_WR32(par->riva.Patt->Monochrome, 4, pat1); in riva_set_pattern()
959 while (par->riva.Busy(&par->riva)); in wait_for_idle()
969 RIVA_FIFO_FREE(par->riva, Rop, 1); in riva_set_rop_solid()
970 NV_WR32(&par->riva.Rop->Rop3, 0, rop); in riva_set_rop_solid()
976 struct riva_par *par = info->par; in riva_setup_accel()
978 RIVA_FIFO_FREE(par->riva, Clip, 2); in riva_setup_accel()
979 NV_WR32(&par->riva.Clip->TopLeft, 0, 0x0); in riva_setup_accel()
980 NV_WR32(&par->riva.Clip->WidthHeight, 0, in riva_setup_accel()
981 (info->var.xres_virtual & 0xffff) | in riva_setup_accel()
982 (info->var.yres_virtual << 16)); in riva_setup_accel()
988 * riva_get_cmap_len - query current color map length
1004 switch (var->green.length) { in riva_get_cmap_len()
1009 rc = 32; /* 32 entries (2^5), 16 bpp, RGB555 */ in riva_get_cmap_len()
1021 /* ------------------------------------------------------------------------- *
1025 * ------------------------------------------------------------------------- */
1029 struct riva_par *par = info->par; in rivafb_open()
1032 mutex_lock(&par->open_lock); in rivafb_open()
1033 if (!par->ref_count) { in rivafb_open()
1035 memset(&par->state, 0, sizeof(struct vgastate)); in rivafb_open()
1036 par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS; in rivafb_open()
1038 if (par->riva.Architecture == NV_ARCH_03) in rivafb_open()
1039 par->state.flags |= VGA_SAVE_CMAP; in rivafb_open()
1040 save_vga(&par->state); in rivafb_open()
1044 par->riva.LockUnlock(&par->riva, 0); in rivafb_open()
1046 riva_save_state(par, &par->initial_state); in rivafb_open()
1048 par->ref_count++; in rivafb_open()
1049 mutex_unlock(&par->open_lock); in rivafb_open()
1056 struct riva_par *par = info->par; in rivafb_release()
1059 mutex_lock(&par->open_lock); in rivafb_release()
1060 if (!par->ref_count) { in rivafb_release()
1061 mutex_unlock(&par->open_lock); in rivafb_release()
1062 return -EINVAL; in rivafb_release()
1064 if (par->ref_count == 1) { in rivafb_release()
1065 par->riva.LockUnlock(&par->riva, 0); in rivafb_release()
1066 par->riva.LoadStateExt(&par->riva, &par->initial_state.ext); in rivafb_release()
1067 riva_load_state(par, &par->initial_state); in rivafb_release()
1069 restore_vga(&par->state); in rivafb_release()
1071 par->riva.LockUnlock(&par->riva, 1); in rivafb_release()
1073 par->ref_count--; in rivafb_release()
1074 mutex_unlock(&par->open_lock); in rivafb_release()
1082 struct riva_par *par = info->par; in rivafb_check_var()
1083 int nom, den; /* translating from pixels->bytes */ in rivafb_check_var()
1087 if (!var->pixclock) in rivafb_check_var()
1088 return -EINVAL; in rivafb_check_var()
1090 switch (var->bits_per_pixel) { in rivafb_check_var()
1092 var->red.offset = var->green.offset = var->blue.offset = 0; in rivafb_check_var()
1093 var->red.length = var->green.length = var->blue.length = 8; in rivafb_check_var()
1094 var->bits_per_pixel = 8; in rivafb_check_var()
1098 var->green.length = 5; in rivafb_check_var()
1101 var->bits_per_pixel = 16; in rivafb_check_var()
1103 if (par->riva.Architecture == NV_ARCH_03) in rivafb_check_var()
1104 var->green.length = 5; in rivafb_check_var()
1105 if (var->green.length == 5) { in rivafb_check_var()
1107 var->red.offset = 10; in rivafb_check_var()
1108 var->green.offset = 5; in rivafb_check_var()
1109 var->blue.offset = 0; in rivafb_check_var()
1110 var->red.length = 5; in rivafb_check_var()
1111 var->green.length = 5; in rivafb_check_var()
1112 var->blue.length = 5; in rivafb_check_var()
1115 var->red.offset = 11; in rivafb_check_var()
1116 var->green.offset = 5; in rivafb_check_var()
1117 var->blue.offset = 0; in rivafb_check_var()
1118 var->red.length = 5; in rivafb_check_var()
1119 var->green.length = 6; in rivafb_check_var()
1120 var->blue.length = 5; in rivafb_check_var()
1125 case 17 ... 32: in rivafb_check_var()
1126 var->red.length = var->green.length = var->blue.length = 8; in rivafb_check_var()
1127 var->bits_per_pixel = 32; in rivafb_check_var()
1128 var->red.offset = 16; in rivafb_check_var()
1129 var->green.offset = 8; in rivafb_check_var()
1130 var->blue.offset = 0; in rivafb_check_var()
1137 var->xres, var->yres, var->bits_per_pixel); in rivafb_check_var()
1138 NVTRACE("EXIT, returning -EINVAL\n"); in rivafb_check_var()
1139 return -EINVAL; in rivafb_check_var()
1143 if (!info->monspecs.vfmax || !info->monspecs.hfmax || in rivafb_check_var()
1144 !info->monspecs.dclkmax || !fb_validate_mode(var, info)) in rivafb_check_var()
1149 if (!mode_valid && info->monspecs.gtf) { in rivafb_check_var()
1155 mode = fb_find_best_mode(var, &info->modelist); in rivafb_check_var()
1162 if (!mode_valid && info->monspecs.modedb_len) in rivafb_check_var()
1163 return -EINVAL; in rivafb_check_var()
1165 if (var->xres_virtual < var->xres) in rivafb_check_var()
1166 var->xres_virtual = var->xres; in rivafb_check_var()
1167 if (var->yres_virtual <= var->yres) in rivafb_check_var()
1168 var->yres_virtual = -1; in rivafb_check_var()
1170 return -EINVAL; in rivafb_check_var()
1173 if (var->xoffset > var->xres_virtual - var->xres) in rivafb_check_var()
1174 var->xoffset = var->xres_virtual - var->xres - 1; in rivafb_check_var()
1176 if (var->yoffset > var->yres_virtual - var->yres) in rivafb_check_var()
1177 var->yoffset = var->yres_virtual - var->yres - 1; in rivafb_check_var()
1179 var->red.msb_right = in rivafb_check_var()
1180 var->green.msb_right = in rivafb_check_var()
1181 var->blue.msb_right = in rivafb_check_var()
1182 var->transp.offset = var->transp.length = var->transp.msb_right = 0; in rivafb_check_var()
1189 struct riva_par *par = info->par; in rivafb_set_par()
1195 par->riva.LockUnlock(&par->riva, 0); in rivafb_set_par()
1199 if(!(info->flags & FBINFO_HWACCEL_DISABLED)) in rivafb_set_par()
1202 par->cursor_reset = 1; in rivafb_set_par()
1203 info->fix.line_length = (info->var.xres_virtual * (info->var.bits_per_pixel >> 3)); in rivafb_set_par()
1204 info->fix.visual = (info->var.bits_per_pixel == 8) ? in rivafb_set_par()
1207 if (info->flags & FBINFO_HWACCEL_DISABLED) in rivafb_set_par()
1208 info->pixmap.scan_align = 1; in rivafb_set_par()
1210 info->pixmap.scan_align = 4; in rivafb_set_par()
1225 * If the values don't fit, return -EINVAL.
1232 struct riva_par *par = info->par; in rivafb_pan_display()
1236 base = var->yoffset * info->fix.line_length + var->xoffset; in rivafb_pan_display()
1237 par->riva.SetStartAddress(&par->riva, base); in rivafb_pan_display()
1244 struct riva_par *par= info->par; in rivafb_blank()
1301 struct riva_par *par = info->par; in rivafb_setcolreg()
1302 RIVA_HW_INST *chip = &par->riva; in rivafb_setcolreg()
1305 if (regno >= riva_get_cmap_len(&info->var)) in rivafb_setcolreg()
1306 return -EINVAL; in rivafb_setcolreg()
1308 if (info->var.grayscale) { in rivafb_setcolreg()
1314 if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) { in rivafb_setcolreg()
1315 ((u32 *) info->pseudo_palette)[regno] = in rivafb_setcolreg()
1316 (regno << info->var.red.offset) | in rivafb_setcolreg()
1317 (regno << info->var.green.offset) | in rivafb_setcolreg()
1318 (regno << info->var.blue.offset); in rivafb_setcolreg()
1323 if (par->riva.Architecture == NV_ARCH_03) { in rivafb_setcolreg()
1324 switch (info->var.bits_per_pixel) { in rivafb_setcolreg()
1326 par->palette[regno] = ((red & 0xf800) >> 1) | in rivafb_setcolreg()
1330 case 32: in rivafb_setcolreg()
1331 par->palette[regno] = ((red & 0xff00) << 8) | in rivafb_setcolreg()
1339 switch (info->var.bits_per_pixel) { in rivafb_setcolreg()
1345 if (info->var.green.length == 5) { in rivafb_setcolreg()
1353 if (regno < 32) { in rivafb_setcolreg()
1366 case 32: in rivafb_setcolreg()
1377 * rivafb_fillrect - hardware accelerated color fill function
1390 struct riva_par *par = info->par; in rivafb_fillrect()
1393 if ((info->flags & FBINFO_HWACCEL_DISABLED)) { in rivafb_fillrect()
1398 if (info->var.bits_per_pixel == 8) in rivafb_fillrect()
1399 color = rect->color; in rivafb_fillrect()
1401 if (par->riva.Architecture != NV_ARCH_03) in rivafb_fillrect()
1402 color = ((u32 *)info->pseudo_palette)[rect->color]; in rivafb_fillrect()
1404 color = par->palette[rect->color]; in rivafb_fillrect()
1407 switch (rect->rop) { in rivafb_fillrect()
1419 RIVA_FIFO_FREE(par->riva, Bitmap, 1); in rivafb_fillrect()
1420 NV_WR32(&par->riva.Bitmap->Color1A, 0, color); in rivafb_fillrect()
1422 RIVA_FIFO_FREE(par->riva, Bitmap, 2); in rivafb_fillrect()
1423 NV_WR32(&par->riva.Bitmap->UnclippedRectangle[0].TopLeft, 0, in rivafb_fillrect()
1424 (rect->dx << 16) | rect->dy); in rivafb_fillrect()
1426 NV_WR32(&par->riva.Bitmap->UnclippedRectangle[0].WidthHeight, 0, in rivafb_fillrect()
1427 (rect->width << 16) | rect->height); in rivafb_fillrect()
1434 * rivafb_copyarea - hardware accelerated blit function
1446 struct riva_par *par = info->par; in rivafb_copyarea()
1448 if ((info->flags & FBINFO_HWACCEL_DISABLED)) { in rivafb_copyarea()
1453 RIVA_FIFO_FREE(par->riva, Blt, 3); in rivafb_copyarea()
1454 NV_WR32(&par->riva.Blt->TopLeftSrc, 0, in rivafb_copyarea()
1455 (region->sy << 16) | region->sx); in rivafb_copyarea()
1456 NV_WR32(&par->riva.Blt->TopLeftDst, 0, in rivafb_copyarea()
1457 (region->dy << 16) | region->dx); in rivafb_copyarea()
1459 NV_WR32(&par->riva.Blt->WidthHeight, 0, in rivafb_copyarea()
1460 (region->height << 16) | region->width); in rivafb_copyarea()
1481 * setting of the bitmap, 1 - foreground, 0 - background.
1492 struct riva_par *par = info->par; in rivafb_imageblit()
1494 u8 *cdat = (u8 *) image->data; in rivafb_imageblit()
1498 if ((info->flags & FBINFO_HWACCEL_DISABLED) || image->depth != 1) { in rivafb_imageblit()
1503 switch (info->var.bits_per_pixel) { in rivafb_imageblit()
1505 fgx = image->fg_color; in rivafb_imageblit()
1506 bgx = image->bg_color; in rivafb_imageblit()
1509 case 32: in rivafb_imageblit()
1510 if (par->riva.Architecture != NV_ARCH_03) { in rivafb_imageblit()
1511 fgx = ((u32 *)info->pseudo_palette)[image->fg_color]; in rivafb_imageblit()
1512 bgx = ((u32 *)info->pseudo_palette)[image->bg_color]; in rivafb_imageblit()
1514 fgx = par->palette[image->fg_color]; in rivafb_imageblit()
1515 bgx = par->palette[image->bg_color]; in rivafb_imageblit()
1517 if (info->var.green.length == 6) in rivafb_imageblit()
1522 RIVA_FIFO_FREE(par->riva, Bitmap, 7); in rivafb_imageblit()
1523 NV_WR32(&par->riva.Bitmap->ClipE.TopLeft, 0, in rivafb_imageblit()
1524 (image->dy << 16) | (image->dx & 0xFFFF)); in rivafb_imageblit()
1525 NV_WR32(&par->riva.Bitmap->ClipE.BottomRight, 0, in rivafb_imageblit()
1526 (((image->dy + image->height) << 16) | in rivafb_imageblit()
1527 ((image->dx + image->width) & 0xffff))); in rivafb_imageblit()
1528 NV_WR32(&par->riva.Bitmap->Color0E, 0, bgx); in rivafb_imageblit()
1529 NV_WR32(&par->riva.Bitmap->Color1E, 0, fgx); in rivafb_imageblit()
1530 NV_WR32(&par->riva.Bitmap->WidthHeightInE, 0, in rivafb_imageblit()
1531 (image->height << 16) | ((image->width + 31) & ~31)); in rivafb_imageblit()
1532 NV_WR32(&par->riva.Bitmap->WidthHeightOutE, 0, in rivafb_imageblit()
1533 (image->height << 16) | ((image->width + 31) & ~31)); in rivafb_imageblit()
1534 NV_WR32(&par->riva.Bitmap->PointE, 0, in rivafb_imageblit()
1535 (image->dy << 16) | (image->dx & 0xFFFF)); in rivafb_imageblit()
1537 d = &par->riva.Bitmap->MonochromeData01E; in rivafb_imageblit()
1539 width = (image->width + 31)/32; in rivafb_imageblit()
1540 size = width * image->height; in rivafb_imageblit()
1542 RIVA_FIFO_FREE(par->riva, Bitmap, 16); in rivafb_imageblit()
1549 size -= 16; in rivafb_imageblit()
1552 RIVA_FIFO_FREE(par->riva, Bitmap, size); in rivafb_imageblit()
1563 * rivafb_cursor - hardware cursor function
1577 struct riva_par *par = info->par; in rivafb_cursor()
1579 int i, set = cursor->set; in rivafb_cursor()
1582 if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS) in rivafb_cursor()
1583 return -ENXIO; in rivafb_cursor()
1585 par->riva.ShowHideCursor(&par->riva, 0); in rivafb_cursor()
1587 if (par->cursor_reset) { in rivafb_cursor()
1589 par->cursor_reset = 0; in rivafb_cursor()
1593 memset_io(par->riva.CURSOR, 0, MAX_CURS * MAX_CURS * 2); in rivafb_cursor()
1598 yy = cursor->image.dy - info->var.yoffset; in rivafb_cursor()
1599 xx = cursor->image.dx - info->var.xoffset; in rivafb_cursor()
1603 NV_WR32(par->riva.PRAMDAC, 0x0000300, temp); in rivafb_cursor()
1608 u32 bg_idx = cursor->image.bg_color; in rivafb_cursor()
1609 u32 fg_idx = cursor->image.fg_color; in rivafb_cursor()
1610 u32 s_pitch = (cursor->image.width+7) >> 3; in rivafb_cursor()
1612 u8 *dat = (u8 *) cursor->image.data; in rivafb_cursor()
1613 u8 *msk = (u8 *) cursor->mask; in rivafb_cursor()
1616 src = kmalloc_array(s_pitch, cursor->image.height, GFP_ATOMIC); in rivafb_cursor()
1619 switch (cursor->rop) { in rivafb_cursor()
1621 for (i = 0; i < s_pitch * cursor->image.height; i++) in rivafb_cursor()
1626 for (i = 0; i < s_pitch * cursor->image.height; i++) in rivafb_cursor()
1632 cursor->image.height); in rivafb_cursor()
1634 bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) | in rivafb_cursor()
1635 ((info->cmap.green[bg_idx] & 0xf8) << 2) | in rivafb_cursor()
1636 ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | in rivafb_cursor()
1639 fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) | in rivafb_cursor()
1640 ((info->cmap.green[fg_idx] & 0xf8) << 2) | in rivafb_cursor()
1641 ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | in rivafb_cursor()
1644 par->riva.LockUnlock(&par->riva, 0); in rivafb_cursor()
1647 cursor->image.width, in rivafb_cursor()
1648 cursor->image.height); in rivafb_cursor()
1653 if (cursor->enable) in rivafb_cursor()
1654 par->riva.ShowHideCursor(&par->riva, 1); in rivafb_cursor()
1661 struct riva_par *par = info->par; in rivafb_sync()
1667 /* ------------------------------------------------------------------------- *
1671 * ------------------------------------------------------------------------- */
1693 struct riva_par *par = info->par; in riva_set_fbinfo()
1696 info->flags = FBINFO_DEFAULT in riva_set_fbinfo()
1704 if ((par->riva.Architecture == NV_ARCH_30) || noaccel) { in riva_set_fbinfo()
1706 info->flags |= FBINFO_HWACCEL_DISABLED; in riva_set_fbinfo()
1709 info->var = rivafb_default_var; in riva_set_fbinfo()
1710 info->fix.visual = (info->var.bits_per_pixel == 8) ? in riva_set_fbinfo()
1713 info->pseudo_palette = par->pseudo_palette; in riva_set_fbinfo()
1715 cmap_len = riva_get_cmap_len(&info->var); in riva_set_fbinfo()
1716 fb_alloc_cmap(&info->cmap, cmap_len, 0); in riva_set_fbinfo()
1718 info->pixmap.size = 8 * 1024; in riva_set_fbinfo()
1719 info->pixmap.buf_align = 4; in riva_set_fbinfo()
1720 info->pixmap.access_align = 32; in riva_set_fbinfo()
1721 info->pixmap.flags = FB_PIXMAP_SYSTEM; in riva_set_fbinfo()
1722 info->var.yres_virtual = -1; in riva_set_fbinfo()
1724 return (rivafb_check_var(&info->var, info)); in riva_set_fbinfo()
1729 struct riva_par *par = info->par; in riva_get_EDID_OF()
1739 for (; dp != NULL; dp = dp->child) { in riva_get_EDID_OF()
1740 disptype = of_get_property(dp, "display-type", NULL); in riva_get_EDID_OF()
1748 par->EDID = (unsigned char *)pedid; in riva_get_EDID_OF()
1761 struct riva_par *par = info->par; in riva_get_EDID_i2c()
1766 par->riva.LockUnlock(&par->riva, 0); in riva_get_EDID_i2c()
1769 if (!par->chan[i].par) in riva_get_EDID_i2c()
1771 riva_probe_i2c_connector(par, i, &par->EDID); in riva_get_EDID_i2c()
1772 if (par->EDID && !fb_parse_edid(par->EDID, &var)) { in riva_get_EDID_i2c()
1779 return (par->EDID) ? 1 : 0; in riva_get_EDID_i2c()
1786 struct fb_monspecs *specs = &info->monspecs; in riva_update_default_var()
1793 specs->modedb, specs->modedb_len, in riva_update_default_var()
1795 } else if (specs->modedb != NULL) { in riva_update_default_var()
1797 modedb = specs->modedb[0]; in riva_update_default_var()
1799 if (info->monspecs.misc & FB_MISC_1ST_DETAIL) { in riva_update_default_var()
1802 for (i = 0; i < specs->modedb_len; i++) { in riva_update_default_var()
1803 if (specs->modedb[i].flag & FB_MODE_IS_FIRST) { in riva_update_default_var()
1804 modedb = specs->modedb[i]; in riva_update_default_var()
1809 var->bits_per_pixel = 8; in riva_update_default_var()
1836 struct riva_par *par = info->par; in riva_get_edidinfo()
1838 fb_edid_to_monspecs(par->EDID, &info->monspecs); in riva_get_edidinfo()
1839 fb_videomode_to_modelist(info->monspecs.modedb, info->monspecs.modedb_len, in riva_get_edidinfo()
1840 &info->modelist); in riva_get_edidinfo()
1844 if (info->monspecs.input & FB_DISP_DDI) in riva_get_edidinfo()
1845 par->FlatPanel = 1; in riva_get_edidinfo()
1848 /* ------------------------------------------------------------------------- *
1852 * ------------------------------------------------------------------------- */
1858 switch (pd->device & 0x0ff0) { in riva_get_arch()
1901 info = framebuffer_alloc(sizeof(struct riva_par), &pd->dev); in rivafb_probe()
1903 ret = -ENOMEM; in rivafb_probe()
1906 default_par = info->par; in rivafb_probe()
1907 default_par->pdev = pd; in rivafb_probe()
1909 info->pixmap.addr = kzalloc(8 * 1024, GFP_KERNEL); in rivafb_probe()
1910 if (info->pixmap.addr == NULL) { in rivafb_probe()
1911 ret = -ENOMEM; in rivafb_probe()
1927 mutex_init(&default_par->open_lock); in rivafb_probe()
1928 default_par->riva.Architecture = riva_get_arch(pd); in rivafb_probe()
1930 default_par->Chipset = (pd->vendor << 16) | pd->device; in rivafb_probe()
1931 printk(KERN_INFO PFX "nVidia device/chipset %X\n",default_par->Chipset); in rivafb_probe()
1933 if(default_par->riva.Architecture == 0) { in rivafb_probe()
1935 ret=-ENODEV; in rivafb_probe()
1938 if(default_par->riva.Architecture == NV_ARCH_10 || in rivafb_probe()
1939 default_par->riva.Architecture == NV_ARCH_20 || in rivafb_probe()
1940 default_par->riva.Architecture == NV_ARCH_30) { in rivafb_probe()
1941 sprintf(rivafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4); in rivafb_probe()
1943 sprintf(rivafb_fix.id, "NV%x", default_par->riva.Architecture); in rivafb_probe()
1946 default_par->FlatPanel = flatpanel; in rivafb_probe()
1949 default_par->forceCRTC = forceCRTC; in rivafb_probe()
1966 default_par->ctrl_base = ioremap(rivafb_fix.mmio_start, in rivafb_probe()
1968 if (!default_par->ctrl_base) { in rivafb_probe()
1970 ret = -EIO; in rivafb_probe()
1974 switch (default_par->riva.Architecture) { in rivafb_probe()
1980 default_par->riva.PRAMIN = ioremap(rivafb_fix.smem_start + 0x00C00000, 0x00008000); in rivafb_probe()
1981 if (!default_par->riva.PRAMIN) { in rivafb_probe()
1983 ret = -EIO; in rivafb_probe()
1991 default_par->riva.PCRTC0 = in rivafb_probe()
1992 (u32 __iomem *)(default_par->ctrl_base + 0x00600000); in rivafb_probe()
1993 default_par->riva.PRAMIN = in rivafb_probe()
1994 (u32 __iomem *)(default_par->ctrl_base + 0x00710000); in rivafb_probe()
1999 if (default_par->riva.Architecture == NV_ARCH_03) { in rivafb_probe()
2000 default_par->riva.PCRTC = default_par->riva.PCRTC0 in rivafb_probe()
2001 = default_par->riva.PGRAPH; in rivafb_probe()
2005 default_par->dclk_max = riva_get_maxdclk(default_par) * 1000; in rivafb_probe()
2006 info->screen_base = ioremap_wc(rivafb_fix.smem_start, in rivafb_probe()
2008 if (!info->screen_base) { in rivafb_probe()
2010 ret = -EIO; in rivafb_probe()
2015 default_par->wc_cookie = in rivafb_probe()
2019 info->fbops = &riva_fb_ops; in rivafb_probe()
2020 info->fix = rivafb_fix; in rivafb_probe()
2030 fb_destroy_modedb(info->monspecs.modedb); in rivafb_probe()
2031 info->monspecs.modedb = NULL; in rivafb_probe()
2036 riva_bl_init(info->par); in rivafb_probe()
2047 info->fix.id, in rivafb_probe()
2049 info->fix.smem_len / (1024 * 1024), in rivafb_probe()
2050 info->fix.smem_start); in rivafb_probe()
2057 riva_delete_i2c_busses(info->par); in rivafb_probe()
2059 iounmap(info->screen_base); in rivafb_probe()
2061 if (default_par->riva.Architecture == NV_ARCH_03) in rivafb_probe()
2062 iounmap(default_par->riva.PRAMIN); in rivafb_probe()
2064 iounmap(default_par->ctrl_base); in rivafb_probe()
2069 kfree(info->pixmap.addr); in rivafb_probe()
2079 struct riva_par *par = info->par; in rivafb_remove()
2085 kfree(par->EDID); in rivafb_remove()
2091 arch_phys_wc_del(par->wc_cookie); in rivafb_remove()
2092 iounmap(par->ctrl_base); in rivafb_remove()
2093 iounmap(info->screen_base); in rivafb_remove()
2094 if (par->riva.Architecture == NV_ARCH_03) in rivafb_remove()
2095 iounmap(par->riva.PRAMIN); in rivafb_remove()
2097 kfree(info->pixmap.addr); in rivafb_remove()
2102 /* ------------------------------------------------------------------------- *
2106 * ------------------------------------------------------------------------- */
2123 forceCRTC = *p - '0'; in rivafb_setup()
2125 forceCRTC = -1; in rivafb_setup()
2153 /* ------------------------------------------------------------------------- *
2157 * ------------------------------------------------------------------------- */
2165 return -ENODEV; in rivafb_init()