Lines Matching +full:sync +full:- +full:on +full:- +full:green

1  /*-*- linux-c -*-
2 * linux/drivers/video/i810_main.c -- Intel 810 frame buffer device
8 * Michael Vogt <mvogt@acm.org> - added support for Intel 815 chipsets
9 * and enabling the power-on state of
13 * Fredrik Andersson <krueger@shell.linux.se> - alpha testing of
16 * Brad Corrion <bcorrion@web-co.com> - alpha testing of customized
20 * DotClock and PLL calculations are partly based on i810_driver.c
22 * Watermark calculation and tables are based on i810_wmark.c
56 * voffset - framebuffer offset in MiB from aperture start address. In order for
60 * ---------------------------------------------
62 * ----------------------------------------------
66 * ----------------------------------------------
71 * Note, the size of the hole may change depending on how much memory you allocate to X,
91 static int i810fb_getcolreg (u8 regno, u8 *red, u8 *green, u8 *blue,
93 static int i810fb_setcolreg (unsigned regno, unsigned red, unsigned green, unsigned blue,
104 "Intel(R) 810-DC100 Framebuffer Device" ,
118 /* mvo: added i815 PCI-ID */
149 static bool sync; variable
154 /*------------------------------------------------------------*/
161 * i810_screen_off - turns off/on display
163 * @mode: on or off
178 while((i810_readw(DISP_SL, mmio) & 0xFFF) && count--); in i810_screen_off()
184 * i810_dram_off - turns off/on dram refresh
186 * @mode: on or off
203 * i810_protect_regs - allows rw/ro mode of certain VGA registers
225 * i810_load_pll - loads values for the hardware PLL clock
234 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_pll()
236 tmp1 = par->regs.M | par->regs.N << 16; in i810_load_pll()
241 tmp1 = par->regs.P; in i810_load_pll()
246 i810_writeb(MSR_WRITE, mmio, par->regs.msr | 0xC8 | 1); in i810_load_pll()
251 * i810_load_vga - load standard VGA registers
259 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_vga()
263 i810_writeb(CR_DATA_CGA, mmio, par->interlace); in i810_load_vga()
266 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr00); in i810_load_vga()
268 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr01); in i810_load_vga()
270 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr02); in i810_load_vga()
272 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr03); in i810_load_vga()
274 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr04); in i810_load_vga()
276 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr05); in i810_load_vga()
278 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr06); in i810_load_vga()
280 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr09); in i810_load_vga()
282 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr10); in i810_load_vga()
284 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr11); in i810_load_vga()
286 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr12); in i810_load_vga()
288 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr15); in i810_load_vga()
290 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr16); in i810_load_vga()
294 * i810_load_vgax - load extended VGA registers
302 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_vgax()
305 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr30); in i810_load_vgax()
307 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr31); in i810_load_vgax()
309 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr32); in i810_load_vgax()
311 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr33); in i810_load_vgax()
313 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr35); in i810_load_vgax()
315 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr39); in i810_load_vgax()
319 * i810_load_2d - load grahics registers
329 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_2d()
331 i810_writel(FW_BLC, mmio, par->watermark); in i810_load_2d()
336 i810_writel(OVRACT, mmio, par->ovract); in i810_load_2d()
346 * i810_hires - enables high resolution mode
362 * i810_load_pitch - loads the characters per line of the display
372 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_pitch()
374 pitch = par->pitch >> 3; in i810_load_pitch()
394 * i810_load_color - loads the color depth of the display
402 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_color()
409 reg1 |= 0x8000 | par->pixconf; in i810_load_color()
410 reg2 |= par->bltcntl; in i810_load_color()
416 * i810_load_regs - loads all registers for the mode
424 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_regs()
432 i810_dram_off(mmio, ON); in i810_load_regs()
435 i810_screen_off(mmio, ON); in i810_load_regs()
436 i810_protect_regs(mmio, ON); in i810_load_regs()
441 static void i810_write_dac(u8 regno, u8 red, u8 green, u8 blue, in i810_write_dac() argument
446 i810_writeb(CLUT_DATA, mmio, green); in i810_write_dac()
450 static void i810_read_dac(u8 regno, u8 *red, u8 *green, u8 *blue, in i810_read_dac() argument
455 *green = i810_readb(CLUT_DATA, mmio); in i810_read_dac()
465 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_pll()
467 tmp1 = par->hw_state.dclk_2d; in i810_restore_pll()
473 tmp1 = par->hw_state.dclk_1d; in i810_restore_pll()
479 i810_writel(DCLK_0DS, mmio, par->hw_state.dclk_0ds); in i810_restore_pll()
485 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_dac()
487 tmp1 = par->hw_state.pixconf; in i810_restore_dac()
497 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_vgax()
501 i810_writeb(CR_DATA_CGA, mmio, *(&(par->hw_state.cr30) + i)); in i810_restore_vgax()
504 i810_writeb(CR_DATA_CGA, mmio, par->hw_state.cr35); in i810_restore_vgax()
506 i810_writeb(CR_DATA_CGA, mmio, par->hw_state.cr39); in i810_restore_vgax()
508 i810_writeb(CR_DATA_CGA, mmio, par->hw_state.cr39); in i810_restore_vgax()
512 i = par->hw_state.cr70; in i810_restore_vgax()
519 i810_writeb(CR_DATA_CGA, mmio, par->hw_state.cr80); in i810_restore_vgax()
520 i810_writeb(MSR_WRITE, mmio, par->hw_state.msr); in i810_restore_vgax()
522 i = (par->hw_state.sr01) & ~0xE0 ; in i810_restore_vgax()
531 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_vga()
535 i810_writeb(CR_DATA_CGA, mmio, *((&par->hw_state.cr00) + i)); in i810_restore_vga()
539 i810_writeb(CR_DATA_CGA, mmio, *((&par->hw_state.cr10) + i)); in i810_restore_vga()
546 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_addr_map()
551 tmp |= par->hw_state.gr10; in i810_restore_addr_map()
560 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_2d()
564 tmp_word |= par->hw_state.bltcntl; in i810_restore_2d()
568 i810_writel(PIXCONF, mmio, par->hw_state.pixconf); in i810_restore_2d()
569 i810_dram_off(mmio, ON); in i810_restore_2d()
573 tmp_word |= par->hw_state.hwstam; in i810_restore_2d()
578 tmp_long |= par->hw_state.fw_blc; in i810_restore_2d()
581 i810_writel(HWS_PGA, mmio, par->hw_state.hws_pga); in i810_restore_2d()
582 i810_writew(IER, mmio, par->hw_state.ier); in i810_restore_2d()
583 i810_writew(IMR, mmio, par->hw_state.imr); in i810_restore_2d()
584 i810_writel(DPLYSTAS, mmio, par->hw_state.dplystas); in i810_restore_2d()
589 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_vga_state()
599 i810_dram_off(mmio, ON); in i810_restore_vga_state()
601 i810_screen_off(mmio, ON); in i810_restore_vga_state()
602 i810_protect_regs(mmio, ON); in i810_restore_vga_state()
612 u8 __iomem *mmio = par->mmio_start_virtual; in i810_save_vgax()
616 *(&(par->hw_state.cr30) + i) = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
619 par->hw_state.cr35 = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
621 par->hw_state.cr39 = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
623 par->hw_state.cr41 = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
625 par->hw_state.cr70 = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
626 par->hw_state.msr = i810_readb(MSR_READ, mmio); in i810_save_vgax()
628 par->hw_state.cr80 = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
630 par->hw_state.sr01 = i810_readb(SR_DATA, mmio); in i810_save_vgax()
636 u8 __iomem *mmio = par->mmio_start_virtual; in i810_save_vga()
640 *((&par->hw_state.cr00) + i) = i810_readb(CR_DATA_CGA, mmio); in i810_save_vga()
644 *((&par->hw_state.cr10) + i) = i810_readb(CR_DATA_CGA, mmio); in i810_save_vga()
650 u8 __iomem *mmio = par->mmio_start_virtual; in i810_save_2d()
652 par->hw_state.dclk_2d = i810_readl(DCLK_2D, mmio); in i810_save_2d()
653 par->hw_state.dclk_1d = i810_readl(DCLK_1D, mmio); in i810_save_2d()
654 par->hw_state.dclk_0ds = i810_readl(DCLK_0DS, mmio); in i810_save_2d()
655 par->hw_state.pixconf = i810_readl(PIXCONF, mmio); in i810_save_2d()
656 par->hw_state.fw_blc = i810_readl(FW_BLC, mmio); in i810_save_2d()
657 par->hw_state.bltcntl = i810_readw(BLTCNTL, mmio); in i810_save_2d()
658 par->hw_state.hwstam = i810_readw(HWSTAM, mmio); in i810_save_2d()
659 par->hw_state.hws_pga = i810_readl(HWS_PGA, mmio); in i810_save_2d()
660 par->hw_state.ier = i810_readw(IER, mmio); in i810_save_2d()
661 par->hw_state.imr = i810_readw(IMR, mmio); in i810_save_2d()
662 par->hw_state.dplystas = i810_readl(DPLYSTAS, mmio); in i810_save_2d()
676 * get_line_length - calculates buffer pitch in bytes
689 length = (length+31)&-32; in get_line_length()
695 * i810_calc_dclk - calculates the P, M, and N values of a pixelclock value
702 * Based on the formula Freq_actual = (4*M*Freq_ref)/(N^P)
738 diff = target_freq - f_out; in i810_calc_dclk()
741 diff = f_out - target_freq; in i810_calc_dclk()
756 if (m) *m = (m_best - 2) & 0x3FF; in i810_calc_dclk()
757 if (n) *n = (n_best - 2) & 0x3FF; in i810_calc_dclk()
766 * i810_enable_cursor - show or hide the hardware cursor
778 temp = (mode == ON) ? temp | CURSOR_ENABLE_MASK : in i810_enable_cursor()
786 u8 __iomem *addr = par->cursor_heap.virtual; in i810_reset_cursor_image()
789 for (i = 64; i--; ) { in i810_reset_cursor_image()
801 u8 __iomem *addr = par->cursor_heap.virtual; in i810_load_cursor_image()
807 for (i = height; i--; ) { in i810_load_cursor_image()
822 struct i810fb_par *par = info->par; in i810_load_cursor_colors()
823 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_cursor_colors()
824 u8 red, green, blue, trans, temp; in i810_load_cursor_colors() local
826 i810fb_getcolreg(bg, &red, &green, &blue, &trans, info); in i810_load_cursor_colors()
831 i810_write_dac(4, red, green, blue, mmio); in i810_load_cursor_colors()
835 i810fb_getcolreg(fg, &red, &green, &blue, &trans, info); in i810_load_cursor_colors()
839 i810_write_dac(5, red, green, blue, mmio); in i810_load_cursor_colors()
845 * i810_init_cursor - initializes the cursor
853 u8 __iomem *mmio = par->mmio_start_virtual; in i810_init_cursor()
856 i810_writel(CURBASE, mmio, par->cursor_heap.physical); in i810_init_cursor()
864 * i810_round_off - Round off values to capability of hardware
868 * @var contains user-defined information for the mode to be set.
880 xres = var->xres; in i810_round_off()
881 yres = var->yres; in i810_round_off()
882 vxres = var->xres_virtual; in i810_round_off()
883 vyres = var->yres_virtual; in i810_round_off()
885 var->bits_per_pixel += 7; in i810_round_off()
886 var->bits_per_pixel &= ~7; in i810_round_off()
888 if (var->bits_per_pixel < 8) in i810_round_off()
889 var->bits_per_pixel = 8; in i810_round_off()
890 if (var->bits_per_pixel > 32) in i810_round_off()
891 var->bits_per_pixel = 32; in i810_round_off()
912 if (var->bits_per_pixel == 32) in i810_round_off()
913 var->accel_flags = 0; in i810_round_off()
916 var->left_margin = (var->left_margin + 4) & ~7; in i810_round_off()
917 var->right_margin = (var->right_margin + 4) & ~7; in i810_round_off()
918 var->hsync_len = (var->hsync_len + 4) & ~7; in i810_round_off()
920 if (var->vmode & FB_VMODE_INTERLACED) { in i810_round_off()
921 if (!((yres + var->upper_margin + var->vsync_len + in i810_round_off()
922 var->lower_margin) & 1)) in i810_round_off()
923 var->upper_margin++; in i810_round_off()
926 var->xres = xres; in i810_round_off()
927 var->yres = yres; in i810_round_off()
928 var->xres_virtual = vxres; in i810_round_off()
929 var->yres_virtual = vyres; in i810_round_off()
933 * set_color_bitfields - sets rgba fields
938 * (red, green, blue) will be set as specified
943 switch (var->bits_per_pixel) { in set_color_bitfields()
945 var->red.offset = 0; in set_color_bitfields()
946 var->red.length = 8; in set_color_bitfields()
947 var->green.offset = 0; in set_color_bitfields()
948 var->green.length = 8; in set_color_bitfields()
949 var->blue.offset = 0; in set_color_bitfields()
950 var->blue.length = 8; in set_color_bitfields()
951 var->transp.offset = 0; in set_color_bitfields()
952 var->transp.length = 0; in set_color_bitfields()
955 var->green.length = (var->green.length == 5) ? 5 : 6; in set_color_bitfields()
956 var->red.length = 5; in set_color_bitfields()
957 var->blue.length = 5; in set_color_bitfields()
958 var->transp.length = 6 - var->green.length; in set_color_bitfields()
959 var->blue.offset = 0; in set_color_bitfields()
960 var->green.offset = 5; in set_color_bitfields()
961 var->red.offset = 5 + var->green.length; in set_color_bitfields()
962 var->transp.offset = (5 + var->red.offset) & 15; in set_color_bitfields()
966 var->red.offset = 16; in set_color_bitfields()
967 var->red.length = 8; in set_color_bitfields()
968 var->green.offset = 8; in set_color_bitfields()
969 var->green.length = 8; in set_color_bitfields()
970 var->blue.offset = 0; in set_color_bitfields()
971 var->blue.length = 8; in set_color_bitfields()
972 var->transp.length = var->bits_per_pixel - 24; in set_color_bitfields()
973 var->transp.offset = (var->transp.length) ? 24 : 0; in set_color_bitfields()
976 var->red.msb_right = 0; in set_color_bitfields()
977 var->green.msb_right = 0; in set_color_bitfields()
978 var->blue.msb_right = 0; in set_color_bitfields()
979 var->transp.msb_right = 0; in set_color_bitfields()
983 * i810_check_params - check if contents in var are valid
995 struct i810fb_par *par = info->par; in i810_check_params()
997 u32 vyres = var->yres_virtual, vxres = var->xres_virtual; in i810_check_params()
1002 line_length = get_line_length(par, vxres, var->bits_per_pixel); in i810_check_params()
1005 if (vidmem > par->fb.size) { in i810_check_params()
1006 vyres = par->fb.size/line_length; in i810_check_params()
1007 if (vyres < var->yres) { in i810_check_params()
1008 vyres = info->var.yres; in i810_check_params()
1009 vxres = par->fb.size/vyres; in i810_check_params()
1010 vxres /= var->bits_per_pixel >> 3; in i810_check_params()
1012 var->bits_per_pixel); in i810_check_params()
1013 vidmem = line_length * info->var.yres; in i810_check_params()
1014 if (vxres < var->xres) { in i810_check_params()
1016 "%d bytes, for %dx%d-%d (virtual) " in i810_check_params()
1019 var->bits_per_pixel); in i810_check_params()
1020 return -ENOMEM; in i810_check_params()
1025 var->xres_virtual = vxres; in i810_check_params()
1026 var->yres_virtual = vyres; in i810_check_params()
1031 switch (var->bits_per_pixel) { in i810_check_params()
1033 info->monspecs.dclkmax = 234000000; in i810_check_params()
1036 info->monspecs.dclkmax = 229000000; in i810_check_params()
1040 info->monspecs.dclkmax = 204000000; in i810_check_params()
1044 info->monspecs.dclkmin = 15000000; in i810_check_params()
1050 if (!mode_valid && info->monspecs.gtf && in i810_check_params()
1054 if (!mode_valid && info->monspecs.modedb_len) { in i810_check_params()
1057 mode = fb_find_best_mode(var, &info->modelist); in i810_check_params()
1064 if (!mode_valid && info->monspecs.modedb_len == 0) { in i810_check_params()
1066 int default_sync = (info->monspecs.hfmin-HFMIN) in i810_check_params()
1067 |(info->monspecs.hfmax-HFMAX) in i810_check_params()
1068 |(info->monspecs.vfmin-VFMIN) in i810_check_params()
1069 |(info->monspecs.vfmax-VFMAX); in i810_check_params()
1073 retval = -EINVAL; in i810_check_params()
1081 * encode_fix - fill up fb_fix_screeninfo structure
1090 struct i810fb_par *par = info->par; in encode_fix()
1094 strcpy(fix->id, "I810"); in encode_fix()
1095 mutex_lock(&info->mm_lock); in encode_fix()
1096 fix->smem_start = par->fb.physical; in encode_fix()
1097 fix->smem_len = par->fb.size; in encode_fix()
1098 mutex_unlock(&info->mm_lock); in encode_fix()
1099 fix->type = FB_TYPE_PACKED_PIXELS; in encode_fix()
1100 fix->type_aux = 0; in encode_fix()
1101 fix->xpanstep = 8; in encode_fix()
1102 fix->ypanstep = 1; in encode_fix()
1104 switch (info->var.bits_per_pixel) { in encode_fix()
1106 fix->visual = FB_VISUAL_PSEUDOCOLOR; in encode_fix()
1111 if (info->var.nonstd) in encode_fix()
1112 fix->visual = FB_VISUAL_DIRECTCOLOR; in encode_fix()
1114 fix->visual = FB_VISUAL_TRUECOLOR; in encode_fix()
1117 return -EINVAL; in encode_fix()
1119 fix->ywrapstep = 0; in encode_fix()
1120 fix->line_length = par->pitch; in encode_fix()
1121 fix->mmio_start = par->mmio_start_phys; in encode_fix()
1122 fix->mmio_len = MMIO_SIZE; in encode_fix()
1123 fix->accel = FB_ACCEL_I810; in encode_fix()
1129 * decode_var - modify par according to contents of var
1134 * Based on the contents of @var, @par will be dynamically filled up.
1142 xres = var->xres; in decode_var()
1143 yres = var->yres; in decode_var()
1144 vxres = var->xres_virtual; in decode_var()
1145 vyres = var->yres_virtual; in decode_var()
1147 switch (var->bits_per_pixel) { in decode_var()
1149 par->pixconf = PIXCONF8; in decode_var()
1150 par->bltcntl = 0; in decode_var()
1151 par->depth = 1; in decode_var()
1152 par->blit_bpp = BPP8; in decode_var()
1155 if (var->green.length == 5) in decode_var()
1156 par->pixconf = PIXCONF15; in decode_var()
1158 par->pixconf = PIXCONF16; in decode_var()
1159 par->bltcntl = 16; in decode_var()
1160 par->depth = 2; in decode_var()
1161 par->blit_bpp = BPP16; in decode_var()
1164 par->pixconf = PIXCONF24; in decode_var()
1165 par->bltcntl = 32; in decode_var()
1166 par->depth = 3; in decode_var()
1167 par->blit_bpp = BPP24; in decode_var()
1170 par->pixconf = PIXCONF32; in decode_var()
1171 par->bltcntl = 0; in decode_var()
1172 par->depth = 4; in decode_var()
1173 par->blit_bpp = 3 << 24; in decode_var()
1176 if (var->nonstd && var->bits_per_pixel != 8) in decode_var()
1177 par->pixconf |= 1 << 27; in decode_var()
1179 i810_calc_dclk(var->pixclock, &par->regs.M, in decode_var()
1180 &par->regs.N, &par->regs.P); in decode_var()
1183 par->watermark = i810_get_watermark(var, par); in decode_var()
1184 par->pitch = get_line_length(par, vxres, var->bits_per_pixel); in decode_var()
1188 * i810fb_getcolreg - gets red, green and blue values of the hardware DAC
1191 * @green: green
1197 * Gets the red, green and blue values of the hardware DAC as pointed by @regno
1198 * and writes them to @red, @green and @blue respectively
1200 static int i810fb_getcolreg(u8 regno, u8 *red, u8 *green, u8 *blue, in i810fb_getcolreg() argument
1203 struct i810fb_par *par = info->par; in i810fb_getcolreg()
1204 u8 __iomem *mmio = par->mmio_start_virtual; in i810fb_getcolreg()
1207 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) { in i810fb_getcolreg()
1208 if ((info->var.green.length == 5 && regno > 31) || in i810fb_getcolreg()
1209 (info->var.green.length == 6 && regno > 63)) in i810fb_getcolreg()
1216 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR && in i810fb_getcolreg()
1217 info->var.green.length == 5) in i810fb_getcolreg()
1218 i810_read_dac(regno * 8, red, green, blue, mmio); in i810fb_getcolreg()
1220 else if (info->fix.visual == FB_VISUAL_DIRECTCOLOR && in i810fb_getcolreg()
1221 info->var.green.length == 6) { in i810fb_getcolreg()
1225 i810_read_dac(regno * 4, &tmp, green, &tmp, mmio); in i810fb_getcolreg()
1228 i810_read_dac(regno, red, green, blue, mmio); in i810fb_getcolreg()
1237 * Framebuffer device-specific hooks *
1242 struct i810fb_par *par = info->par; in i810fb_open()
1244 mutex_lock(&par->open_lock); in i810fb_open()
1245 if (par->use_count == 0) { in i810fb_open()
1246 memset(&par->state, 0, sizeof(struct vgastate)); in i810fb_open()
1247 par->state.flags = VGA_SAVE_CMAP; in i810fb_open()
1248 par->state.vgabase = par->mmio_start_virtual; in i810fb_open()
1249 save_vga(&par->state); in i810fb_open()
1254 par->use_count++; in i810fb_open()
1255 mutex_unlock(&par->open_lock); in i810fb_open()
1262 struct i810fb_par *par = info->par; in i810fb_release()
1264 mutex_lock(&par->open_lock); in i810fb_release()
1265 if (par->use_count == 0) { in i810fb_release()
1266 mutex_unlock(&par->open_lock); in i810fb_release()
1267 return -EINVAL; in i810fb_release()
1270 if (par->use_count == 1) { in i810fb_release()
1272 restore_vga(&par->state); in i810fb_release()
1275 par->use_count--; in i810fb_release()
1276 mutex_unlock(&par->open_lock); in i810fb_release()
1282 static int i810fb_setcolreg(unsigned regno, unsigned red, unsigned green, in i810fb_setcolreg() argument
1286 struct i810fb_par *par = info->par; in i810fb_setcolreg()
1287 u8 __iomem *mmio = par->mmio_start_virtual; in i810fb_setcolreg()
1293 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) { in i810fb_setcolreg()
1294 if ((info->var.green.length == 5 && regno > 31) || in i810fb_setcolreg()
1295 (info->var.green.length == 6 && regno > 63)) in i810fb_setcolreg()
1299 if (info->var.grayscale) in i810fb_setcolreg()
1300 red = green = blue = (19595 * red + 38470 * green + in i810fb_setcolreg()
1306 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR && in i810fb_setcolreg()
1307 info->var.green.length == 5) { in i810fb_setcolreg()
1310 (u8) green, (u8) blue, mmio); in i810fb_setcolreg()
1311 } else if (info->fix.visual == FB_VISUAL_DIRECTCOLOR && in i810fb_setcolreg()
1312 info->var.green.length == 6) { in i810fb_setcolreg()
1318 (u8) red, (u8) green, in i810fb_setcolreg()
1323 i810_write_dac((u8) (regno*4) + i, r, (u8) green, in i810fb_setcolreg()
1325 } else if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) { in i810fb_setcolreg()
1326 i810_write_dac((u8) regno, (u8) red, (u8) green, in i810fb_setcolreg()
1333 switch (info->var.bits_per_pixel) { in i810fb_setcolreg()
1335 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) { in i810fb_setcolreg()
1336 if (info->var.green.length == 5) in i810fb_setcolreg()
1337 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1341 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1345 if (info->var.green.length == 5) { in i810fb_setcolreg()
1347 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1349 ((green & 0xf800) >> 6) | in i810fb_setcolreg()
1353 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1355 ((green & 0xf800) >> 5) | in i810fb_setcolreg()
1362 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) in i810fb_setcolreg()
1363 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1367 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1369 (green & 0xff00) | in i810fb_setcolreg()
1380 struct i810fb_par *par = info->par; in i810fb_pan_display()
1383 total = var->xoffset * par->depth + in i810fb_pan_display()
1384 var->yoffset * info->fix.line_length; in i810fb_pan_display()
1392 struct i810fb_par *par = info->par; in i810fb_blank()
1393 u8 __iomem *mmio = par->mmio_start_virtual; in i810fb_blank()
1402 scr_off = ON; in i810fb_blank()
1425 return -EINVAL; in i810fb_blank()
1437 struct i810fb_par *par = info->par; in i810fb_set_par()
1439 decode_var(&info->var, par); in i810fb_set_par()
1442 encode_fix(&info->fix, info); in i810fb_set_par()
1444 if (info->var.accel_flags && !(par->dev_flags & LOCKUP)) { in i810fb_set_par()
1445 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN | in i810fb_set_par()
1448 info->pixmap.scan_align = 2; in i810fb_set_par()
1450 info->pixmap.scan_align = 1; in i810fb_set_par()
1451 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; in i810fb_set_par()
1462 var->vmode &= ~FB_VMODE_MASK; in i810fb_check_var()
1463 var->vmode |= FB_VMODE_NONINTERLACED; in i810fb_check_var()
1465 if (var->vmode & FB_VMODE_DOUBLE) { in i810fb_check_var()
1466 var->vmode &= ~FB_VMODE_MASK; in i810fb_check_var()
1467 var->vmode |= FB_VMODE_NONINTERLACED; in i810fb_check_var()
1481 struct i810fb_par *par = info->par; in i810fb_cursor()
1482 u8 __iomem *mmio = par->mmio_start_virtual; in i810fb_cursor()
1484 if (par->dev_flags & LOCKUP) in i810fb_cursor()
1485 return -ENXIO; in i810fb_cursor()
1487 if (cursor->image.width > 64 || cursor->image.height > 64) in i810fb_cursor()
1488 return -ENXIO; in i810fb_cursor()
1490 if ((i810_readl(CURBASE, mmio) & 0xf) != par->cursor_heap.physical) { in i810fb_cursor()
1492 cursor->set |= FB_CUR_SETALL; in i810fb_cursor()
1497 if (cursor->set & FB_CUR_SETPOS) { in i810fb_cursor()
1500 tmp = (cursor->image.dx - info->var.xoffset) & 0xffff; in i810fb_cursor()
1501 tmp |= (cursor->image.dy - info->var.yoffset) << 16; in i810fb_cursor()
1505 if (cursor->set & FB_CUR_SETSIZE) in i810fb_cursor()
1508 if (cursor->set & FB_CUR_SETCMAP) in i810fb_cursor()
1509 i810_load_cursor_colors(cursor->image.fg_color, in i810fb_cursor()
1510 cursor->image.bg_color, in i810fb_cursor()
1513 if (cursor->set & (FB_CUR_SETSHAPE | FB_CUR_SETIMAGE)) { in i810fb_cursor()
1514 int size = ((cursor->image.width + 7) >> 3) * in i810fb_cursor()
1515 cursor->image.height; in i810fb_cursor()
1520 return -ENOMEM; in i810fb_cursor()
1522 switch (cursor->rop) { in i810fb_cursor()
1525 data[i] = cursor->image.data[i] ^ cursor->mask[i]; in i810fb_cursor()
1530 data[i] = cursor->image.data[i] & cursor->mask[i]; in i810fb_cursor()
1534 i810_load_cursor_image(cursor->image.width, in i810fb_cursor()
1535 cursor->image.height, data, in i810fb_cursor()
1540 if (cursor->enable) in i810fb_cursor()
1541 i810_enable_cursor(mmio, ON); in i810fb_cursor()
1568 struct i810fb_par *par = info->par; in i810fb_suspend()
1570 par->cur_state = mesg.event; in i810fb_suspend()
1575 dev->dev.power.power_state = mesg; in i810fb_suspend()
1582 if (info->fbops->fb_sync) in i810fb_suspend()
1583 info->fbops->fb_sync(info); in i810fb_suspend()
1586 agp_unbind_memory(par->i810_gtt.i810_fb_memory); in i810fb_suspend()
1587 agp_unbind_memory(par->i810_gtt.i810_cursor_memory); in i810fb_suspend()
1600 struct i810fb_par *par = info->par; in i810fb_resume()
1601 int cur_state = par->cur_state; in i810fb_resume()
1603 par->cur_state = PM_EVENT_ON; in i810fb_resume()
1618 agp_bind_memory(par->i810_gtt.i810_fb_memory, in i810fb_resume()
1619 par->fb.offset); in i810fb_resume()
1620 agp_bind_memory(par->i810_gtt.i810_cursor_memory, in i810fb_resume()
1621 par->cursor_heap.offset); in i810fb_resume()
1624 info->fbops->fb_blank(VESA_NO_BLANKING, info); in i810fb_resume()
1635 par->fb.physical = par->aperture.physical+(par->fb.offset << 12); in i810_fix_pointers()
1636 par->fb.virtual = par->aperture.virtual+(par->fb.offset << 12); in i810_fix_pointers()
1637 par->iring.physical = par->aperture.physical + in i810_fix_pointers()
1638 (par->iring.offset << 12); in i810_fix_pointers()
1639 par->iring.virtual = par->aperture.virtual + in i810_fix_pointers()
1640 (par->iring.offset << 12); in i810_fix_pointers()
1641 par->cursor_heap.virtual = par->aperture.virtual+ in i810_fix_pointers()
1642 (par->cursor_heap.offset << 12); in i810_fix_pointers()
1647 if (vram + 1 > par->aperture.size >> 20) in i810_fix_offsets()
1648 vram = (par->aperture.size >> 20) - 1; in i810_fix_offsets()
1649 if (v_offset_default > (par->aperture.size >> 20)) in i810_fix_offsets()
1650 v_offset_default = (par->aperture.size >> 20); in i810_fix_offsets()
1651 if (vram + v_offset_default + 1 > par->aperture.size >> 20) in i810_fix_offsets()
1652 v_offset_default = (par->aperture.size >> 20) - (vram + 1); in i810_fix_offsets()
1654 par->fb.size = vram << 20; in i810_fix_offsets()
1655 par->fb.offset = v_offset_default << 20; in i810_fix_offsets()
1656 par->fb.offset >>= 12; in i810_fix_offsets()
1658 par->iring.offset = par->fb.offset + (par->fb.size >> 12); in i810_fix_offsets()
1659 par->iring.size = RINGBUFFER_SIZE; in i810_fix_offsets()
1661 par->cursor_heap.offset = par->iring.offset + (RINGBUFFER_SIZE >> 12); in i810_fix_offsets()
1662 par->cursor_heap.size = 4096; in i810_fix_offsets()
1667 struct i810fb_par *par = info->par; in i810_alloc_agp_mem()
1672 size = par->fb.size + par->iring.size; in i810_alloc_agp_mem()
1674 if (!(bridge = agp_backend_acquire(par->dev))) { in i810_alloc_agp_mem()
1676 return -ENODEV; in i810_alloc_agp_mem()
1678 if (!(par->i810_gtt.i810_fb_memory = in i810_alloc_agp_mem()
1683 return -ENOMEM; in i810_alloc_agp_mem()
1685 if (agp_bind_memory(par->i810_gtt.i810_fb_memory, in i810_alloc_agp_mem()
1686 par->fb.offset)) { in i810_alloc_agp_mem()
1689 return -EBUSY; in i810_alloc_agp_mem()
1692 if (!(par->i810_gtt.i810_cursor_memory = in i810_alloc_agp_mem()
1693 agp_allocate_memory(bridge, par->cursor_heap.size >> 12, in i810_alloc_agp_mem()
1698 return -ENOMEM; in i810_alloc_agp_mem()
1700 if (agp_bind_memory(par->i810_gtt.i810_cursor_memory, in i810_alloc_agp_mem()
1701 par->cursor_heap.offset)) { in i810_alloc_agp_mem()
1704 return -EBUSY; in i810_alloc_agp_mem()
1707 par->cursor_heap.physical = par->i810_gtt.i810_cursor_memory->physical; in i810_alloc_agp_mem()
1734 if (!info->monspecs.hfmax) in i810_init_monspecs()
1735 info->monspecs.hfmax = hsync2; in i810_init_monspecs()
1736 if (!info->monspecs.hfmin) in i810_init_monspecs()
1737 info->monspecs.hfmin = hsync1; in i810_init_monspecs()
1739 info->monspecs.hfmin = hsync2; in i810_init_monspecs()
1747 if (!info->monspecs.vfmax) in i810_init_monspecs()
1748 info->monspecs.vfmax = vsync2; in i810_init_monspecs()
1749 if (!info->monspecs.vfmin) in i810_init_monspecs()
1750 info->monspecs.vfmin = vsync1; in i810_init_monspecs()
1752 info->monspecs.vfmin = vsync2; in i810_init_monspecs()
1756 * i810_init_defaults - initializes default values to use
1762 mutex_init(&par->open_lock); in i810_init_defaults()
1766 else if (par->aperture.size > 32 * 1024 * 1024) in i810_init_defaults()
1775 par->dev_flags |= HAS_ACCELERATION; in i810_init_defaults()
1777 if (sync) in i810_init_defaults()
1778 par->dev_flags |= ALWAYS_SYNC; in i810_init_defaults()
1780 par->ddc_num = (ddc3 ? 3 : 2); in i810_init_defaults()
1785 par->i810fb_ops = i810fb_ops; in i810_init_defaults()
1788 info->var.xres = xres; in i810_init_defaults()
1790 info->var.xres = 640; in i810_init_defaults()
1793 info->var.yres = yres; in i810_init_defaults()
1795 info->var.yres = 480; in i810_init_defaults()
1798 vyres = (vram << 20)/(info->var.xres*bpp >> 3); in i810_init_defaults()
1800 info->var.yres_virtual = vyres; in i810_init_defaults()
1801 info->var.bits_per_pixel = bpp; in i810_init_defaults()
1804 info->var.nonstd = 1; in i810_init_defaults()
1806 if (par->dev_flags & HAS_ACCELERATION) in i810_init_defaults()
1807 info->var.accel_flags = 1; in i810_init_defaults()
1813 * i810_init_device - initialize device
1819 u8 __iomem *mmio = par->mmio_start_virtual; in i810_init_device()
1822 par->wc_cookie= arch_phys_wc_add((u32) par->aperture.physical, in i810_init_device()
1823 par->aperture.size); in i810_init_device()
1827 /* mvo: enable external vga-connector (for laptops) */ in i810_init_device()
1833 pci_read_config_byte(par->dev, 0x50, &reg); in i810_init_device()
1835 par->mem_freq = (reg) ? 133 : 100; in i810_init_device()
1844 if ((err = pci_enable_device(par->dev))) { in i810_allocate_pci_resource()
1848 par->res_flags |= PCI_DEVICE_ENABLED; in i810_allocate_pci_resource()
1850 if (pci_resource_len(par->dev, 0) > 512 * 1024) { in i810_allocate_pci_resource()
1851 par->aperture.physical = pci_resource_start(par->dev, 0); in i810_allocate_pci_resource()
1852 par->aperture.size = pci_resource_len(par->dev, 0); in i810_allocate_pci_resource()
1853 par->mmio_start_phys = pci_resource_start(par->dev, 1); in i810_allocate_pci_resource()
1855 par->aperture.physical = pci_resource_start(par->dev, 1); in i810_allocate_pci_resource()
1856 par->aperture.size = pci_resource_len(par->dev, 1); in i810_allocate_pci_resource()
1857 par->mmio_start_phys = pci_resource_start(par->dev, 0); in i810_allocate_pci_resource()
1859 if (!par->aperture.size) { in i810_allocate_pci_resource()
1861 return -ENOMEM; in i810_allocate_pci_resource()
1864 if (!request_mem_region(par->aperture.physical, in i810_allocate_pci_resource()
1865 par->aperture.size, in i810_allocate_pci_resource()
1866 i810_pci_list[entry->driver_data])) { in i810_allocate_pci_resource()
1868 return -ENODEV; in i810_allocate_pci_resource()
1870 par->res_flags |= FRAMEBUFFER_REQ; in i810_allocate_pci_resource()
1872 par->aperture.virtual = ioremap_wc(par->aperture.physical, in i810_allocate_pci_resource()
1873 par->aperture.size); in i810_allocate_pci_resource()
1874 if (!par->aperture.virtual) { in i810_allocate_pci_resource()
1876 return -ENODEV; in i810_allocate_pci_resource()
1879 if (!request_mem_region(par->mmio_start_phys, in i810_allocate_pci_resource()
1881 i810_pci_list[entry->driver_data])) { in i810_allocate_pci_resource()
1883 return -ENODEV; in i810_allocate_pci_resource()
1885 par->res_flags |= MMIO_REQ; in i810_allocate_pci_resource()
1887 par->mmio_start_virtual = ioremap(par->mmio_start_phys, in i810_allocate_pci_resource()
1889 if (!par->mmio_start_virtual) { in i810_allocate_pci_resource()
1891 return -ENODEV; in i810_allocate_pci_resource()
1901 struct fb_monspecs *specs = &info->monspecs; in i810fb_find_init_mode()
1906 struct i810fb_par *par = info->par; in i810fb_find_init_mode()
1909 INIT_LIST_HEAD(&info->modelist); in i810fb_find_init_mode()
1911 var = info->var; in i810fb_find_init_mode()
1915 for (i = 0; i < par->ddc_num + 1; i++) { in i810fb_find_init_mode()
1916 err = i810_probe_i2c_connector(info, &par->edid, i); in i810fb_find_init_mode()
1924 fb_edid_to_monspecs(par->edid, specs); in i810fb_find_init_mode()
1926 if (specs->modedb == NULL) in i810fb_find_init_mode()
1929 fb_videomode_to_modelist(specs->modedb, specs->modedb_len, in i810fb_find_init_mode()
1930 &info->modelist); in i810fb_find_init_mode()
1931 if (specs->modedb != NULL) { in i810fb_find_init_mode()
1935 if ((m = fb_find_best_mode(&var, &info->modelist))) { in i810fb_find_init_mode()
1942 m = fb_find_best_display(&info->monspecs, &info->modelist); in i810fb_find_init_mode()
1951 fb_find_mode(&var, info, mode_option, specs->modedb, in i810fb_find_init_mode()
1952 specs->modedb_len, (found) ? &mode : NULL, in i810fb_find_init_mode()
1953 info->var.bits_per_pixel); in i810fb_find_init_mode()
1955 info->var = var; in i810fb_find_init_mode()
1956 fb_destroy_modedb(specs->modedb); in i810fb_find_init_mode()
1957 specs->modedb = NULL; in i810fb_find_init_mode()
1975 else if (!strncmp(this_opt, "sync", 4)) in i810fb_setup()
1976 sync = true; in i810fb_setup()
2018 int err = -1, vfreq, hfreq, pixclock; in i810fb_init_pci()
2024 info = framebuffer_alloc(sizeof(struct i810fb_par), &dev->dev); in i810fb_init_pci()
2026 return -ENOMEM; in i810fb_init_pci()
2028 par = info->par; in i810fb_init_pci()
2029 par->dev = dev; in i810fb_init_pci()
2031 if (!(info->pixmap.addr = kzalloc(8*1024, GFP_KERNEL))) { in i810fb_init_pci()
2033 return -ENOMEM; in i810fb_init_pci()
2035 info->pixmap.size = 8*1024; in i810fb_init_pci()
2036 info->pixmap.buf_align = 8; in i810fb_init_pci()
2037 info->pixmap.access_align = 32; in i810fb_init_pci()
2038 info->pixmap.flags = FB_PIXMAP_SYSTEM; in i810fb_init_pci()
2054 info->screen_base = par->fb.virtual; in i810fb_init_pci()
2055 info->fbops = &par->i810fb_ops; in i810fb_init_pci()
2056 info->pseudo_palette = par->pseudo_palette; in i810fb_init_pci()
2057 fb_alloc_cmap(&info->cmap, 256, 0); in i810fb_init_pci()
2060 if ((err = info->fbops->fb_check_var(&info->var, info))) { in i810fb_init_pci()
2065 fb_var_to_videomode(&mode, &info->var); in i810fb_init_pci()
2066 fb_add_videomode(&mode, &info->modelist); in i810fb_init_pci()
2078 pixclock = 1000000000/(info->var.pixclock); in i810fb_init_pci()
2080 hfreq = pixclock/(info->var.xres + info->var.left_margin + in i810fb_init_pci()
2081 info->var.hsync_len + info->var.right_margin); in i810fb_init_pci()
2082 vfreq = hfreq/(info->var.yres + info->var.upper_margin + in i810fb_init_pci()
2083 info->var.vsync_len + info->var.lower_margin); in i810fb_init_pci()
2087 "I810FB: Monitor : H: %d-%d KHz V: %d-%d Hz\n" in i810fb_init_pci()
2088 "I810FB: Mode : %dx%d-%dbpp@%dHz\n", in i810fb_init_pci()
2089 info->node, in i810fb_init_pci()
2090 i810_pci_list[entry->driver_data], in i810fb_init_pci()
2092 (int) par->fb.size>>10, info->monspecs.hfmin/1000, in i810fb_init_pci()
2093 info->monspecs.hfmax/1000, info->monspecs.vfmin, in i810fb_init_pci()
2094 info->monspecs.vfmax, info->var.xres, in i810fb_init_pci()
2095 info->var.yres, info->var.bits_per_pixel, vfreq); in i810fb_init_pci()
2100 * De-initialization *
2106 struct gtt_data *gtt = &par->i810_gtt; in i810fb_release_resource()
2107 arch_phys_wc_del(par->wc_cookie); in i810fb_release_resource()
2111 if (par->i810_gtt.i810_cursor_memory) in i810fb_release_resource()
2112 agp_free_memory(gtt->i810_cursor_memory); in i810fb_release_resource()
2113 if (par->i810_gtt.i810_fb_memory) in i810fb_release_resource()
2114 agp_free_memory(gtt->i810_fb_memory); in i810fb_release_resource()
2116 if (par->mmio_start_virtual) in i810fb_release_resource()
2117 iounmap(par->mmio_start_virtual); in i810fb_release_resource()
2118 if (par->aperture.virtual) in i810fb_release_resource()
2119 iounmap(par->aperture.virtual); in i810fb_release_resource()
2120 kfree(par->edid); in i810fb_release_resource()
2121 if (par->res_flags & FRAMEBUFFER_REQ) in i810fb_release_resource()
2122 release_mem_region(par->aperture.physical, in i810fb_release_resource()
2123 par->aperture.size); in i810fb_release_resource()
2124 if (par->res_flags & MMIO_REQ) in i810fb_release_resource()
2125 release_mem_region(par->mmio_start_phys, MMIO_SIZE); in i810fb_release_resource()
2134 struct i810fb_par *par = info->par; in i810fb_remove_pci()
2147 return -ENODEV; in i810fb_init()
2202 module_param(sync, bool, 0);
2203 MODULE_PARM_DESC(sync, "wait for accel engine to finish drawing"