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
55 * voffset - framebuffer offset in MiB from aperture start address. In order for
59 * ---------------------------------------------
61 * ----------------------------------------------
65 * ----------------------------------------------
70 * Note, the size of the hole may change depending on how much memory you allocate to X,
90 static int i810fb_getcolreg (u8 regno, u8 *red, u8 *green, u8 *blue,
92 static int i810fb_setcolreg (unsigned regno, unsigned red, unsigned green, unsigned blue,
103 "Intel(R) 810-DC100 Framebuffer Device" ,
117 /* mvo: added i815 PCI-ID */
148 static bool sync; variable
153 /*------------------------------------------------------------*/
160 * i810_screen_off - turns off/on display
162 * @mode: on or off
177 while((i810_readw(DISP_SL, mmio) & 0xFFF) && count--); in i810_screen_off()
183 * i810_dram_off - turns off/on dram refresh
185 * @mode: on or off
202 * i810_protect_regs - allows rw/ro mode of certain VGA registers
224 * i810_load_pll - loads values for the hardware PLL clock
233 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_pll()
235 tmp1 = par->regs.M | par->regs.N << 16; in i810_load_pll()
240 tmp1 = par->regs.P; in i810_load_pll()
245 i810_writeb(MSR_WRITE, mmio, par->regs.msr | 0xC8 | 1); in i810_load_pll()
250 * i810_load_vga - load standard VGA registers
258 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_vga()
262 i810_writeb(CR_DATA_CGA, mmio, par->interlace); in i810_load_vga()
265 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr00); in i810_load_vga()
267 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr01); in i810_load_vga()
269 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr02); in i810_load_vga()
271 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr03); in i810_load_vga()
273 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr04); in i810_load_vga()
275 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr05); in i810_load_vga()
277 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr06); in i810_load_vga()
279 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr09); in i810_load_vga()
281 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr10); in i810_load_vga()
283 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr11); in i810_load_vga()
285 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr12); in i810_load_vga()
287 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr15); in i810_load_vga()
289 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr16); in i810_load_vga()
293 * i810_load_vgax - load extended VGA registers
301 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_vgax()
304 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr30); in i810_load_vgax()
306 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr31); in i810_load_vgax()
308 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr32); in i810_load_vgax()
310 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr33); in i810_load_vgax()
312 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr35); in i810_load_vgax()
314 i810_writeb(CR_DATA_CGA, mmio, par->regs.cr39); in i810_load_vgax()
318 * i810_load_2d - load grahics registers
328 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_2d()
330 i810_writel(FW_BLC, mmio, par->watermark); in i810_load_2d()
335 i810_writel(OVRACT, mmio, par->ovract); in i810_load_2d()
345 * i810_hires - enables high resolution mode
361 * i810_load_pitch - loads the characters per line of the display
371 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_pitch()
373 pitch = par->pitch >> 3; in i810_load_pitch()
393 * i810_load_color - loads the color depth of the display
401 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_color()
408 reg1 |= 0x8000 | par->pixconf; in i810_load_color()
409 reg2 |= par->bltcntl; in i810_load_color()
415 * i810_load_regs - loads all registers for the mode
423 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_regs()
431 i810_dram_off(mmio, ON); in i810_load_regs()
434 i810_screen_off(mmio, ON); in i810_load_regs()
435 i810_protect_regs(mmio, ON); in i810_load_regs()
440 static void i810_write_dac(u8 regno, u8 red, u8 green, u8 blue, in i810_write_dac() argument
445 i810_writeb(CLUT_DATA, mmio, green); in i810_write_dac()
449 static void i810_read_dac(u8 regno, u8 *red, u8 *green, u8 *blue, in i810_read_dac() argument
454 *green = i810_readb(CLUT_DATA, mmio); in i810_read_dac()
464 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_pll()
466 tmp1 = par->hw_state.dclk_2d; in i810_restore_pll()
472 tmp1 = par->hw_state.dclk_1d; in i810_restore_pll()
478 i810_writel(DCLK_0DS, mmio, par->hw_state.dclk_0ds); in i810_restore_pll()
484 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_dac()
486 tmp1 = par->hw_state.pixconf; in i810_restore_dac()
496 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_vgax()
500 i810_writeb(CR_DATA_CGA, mmio, *(&(par->hw_state.cr30) + i)); in i810_restore_vgax()
503 i810_writeb(CR_DATA_CGA, mmio, par->hw_state.cr35); in i810_restore_vgax()
505 i810_writeb(CR_DATA_CGA, mmio, par->hw_state.cr39); in i810_restore_vgax()
507 i810_writeb(CR_DATA_CGA, mmio, par->hw_state.cr39); in i810_restore_vgax()
511 i = par->hw_state.cr70; in i810_restore_vgax()
518 i810_writeb(CR_DATA_CGA, mmio, par->hw_state.cr80); in i810_restore_vgax()
519 i810_writeb(MSR_WRITE, mmio, par->hw_state.msr); in i810_restore_vgax()
521 i = (par->hw_state.sr01) & ~0xE0 ; in i810_restore_vgax()
530 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_vga()
534 i810_writeb(CR_DATA_CGA, mmio, *((&par->hw_state.cr00) + i)); in i810_restore_vga()
538 i810_writeb(CR_DATA_CGA, mmio, *((&par->hw_state.cr10) + i)); in i810_restore_vga()
545 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_addr_map()
550 tmp |= par->hw_state.gr10; in i810_restore_addr_map()
559 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_2d()
563 tmp_word |= par->hw_state.bltcntl; in i810_restore_2d()
567 i810_writel(PIXCONF, mmio, par->hw_state.pixconf); in i810_restore_2d()
568 i810_dram_off(mmio, ON); in i810_restore_2d()
572 tmp_word |= par->hw_state.hwstam; in i810_restore_2d()
577 tmp_long |= par->hw_state.fw_blc; in i810_restore_2d()
580 i810_writel(HWS_PGA, mmio, par->hw_state.hws_pga); in i810_restore_2d()
581 i810_writew(IER, mmio, par->hw_state.ier); in i810_restore_2d()
582 i810_writew(IMR, mmio, par->hw_state.imr); in i810_restore_2d()
583 i810_writel(DPLYSTAS, mmio, par->hw_state.dplystas); in i810_restore_2d()
588 u8 __iomem *mmio = par->mmio_start_virtual; in i810_restore_vga_state()
598 i810_dram_off(mmio, ON); in i810_restore_vga_state()
600 i810_screen_off(mmio, ON); in i810_restore_vga_state()
601 i810_protect_regs(mmio, ON); in i810_restore_vga_state()
611 u8 __iomem *mmio = par->mmio_start_virtual; in i810_save_vgax()
615 *(&(par->hw_state.cr30) + i) = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
618 par->hw_state.cr35 = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
620 par->hw_state.cr39 = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
622 par->hw_state.cr41 = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
624 par->hw_state.cr70 = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
625 par->hw_state.msr = i810_readb(MSR_READ, mmio); in i810_save_vgax()
627 par->hw_state.cr80 = i810_readb(CR_DATA_CGA, mmio); in i810_save_vgax()
629 par->hw_state.sr01 = i810_readb(SR_DATA, mmio); in i810_save_vgax()
635 u8 __iomem *mmio = par->mmio_start_virtual; in i810_save_vga()
639 *((&par->hw_state.cr00) + i) = i810_readb(CR_DATA_CGA, mmio); in i810_save_vga()
643 *((&par->hw_state.cr10) + i) = i810_readb(CR_DATA_CGA, mmio); in i810_save_vga()
649 u8 __iomem *mmio = par->mmio_start_virtual; in i810_save_2d()
651 par->hw_state.dclk_2d = i810_readl(DCLK_2D, mmio); in i810_save_2d()
652 par->hw_state.dclk_1d = i810_readl(DCLK_1D, mmio); in i810_save_2d()
653 par->hw_state.dclk_0ds = i810_readl(DCLK_0DS, mmio); in i810_save_2d()
654 par->hw_state.pixconf = i810_readl(PIXCONF, mmio); in i810_save_2d()
655 par->hw_state.fw_blc = i810_readl(FW_BLC, mmio); in i810_save_2d()
656 par->hw_state.bltcntl = i810_readw(BLTCNTL, mmio); in i810_save_2d()
657 par->hw_state.hwstam = i810_readw(HWSTAM, mmio); in i810_save_2d()
658 par->hw_state.hws_pga = i810_readl(HWS_PGA, mmio); in i810_save_2d()
659 par->hw_state.ier = i810_readw(IER, mmio); in i810_save_2d()
660 par->hw_state.imr = i810_readw(IMR, mmio); in i810_save_2d()
661 par->hw_state.dplystas = i810_readl(DPLYSTAS, mmio); in i810_save_2d()
675 * get_line_length - calculates buffer pitch in bytes
688 length = (length+31)&-32; in get_line_length()
694 * i810_calc_dclk - calculates the P, M, and N values of a pixelclock value
701 * Based on the formula Freq_actual = (4*M*Freq_ref)/(N^P)
737 diff = target_freq - f_out; in i810_calc_dclk()
740 diff = f_out - target_freq; in i810_calc_dclk()
755 if (m) *m = (m_best - 2) & 0x3FF; in i810_calc_dclk()
756 if (n) *n = (n_best - 2) & 0x3FF; in i810_calc_dclk()
765 * i810_enable_cursor - show or hide the hardware cursor
777 temp = (mode == ON) ? temp | CURSOR_ENABLE_MASK : in i810_enable_cursor()
785 u8 __iomem *addr = par->cursor_heap.virtual; in i810_reset_cursor_image()
788 for (i = 64; i--; ) { in i810_reset_cursor_image()
800 u8 __iomem *addr = par->cursor_heap.virtual; in i810_load_cursor_image()
806 for (i = height; i--; ) { in i810_load_cursor_image()
821 struct i810fb_par *par = info->par; in i810_load_cursor_colors()
822 u8 __iomem *mmio = par->mmio_start_virtual; in i810_load_cursor_colors()
823 u8 red, green, blue, trans, temp; in i810_load_cursor_colors() local
825 i810fb_getcolreg(bg, &red, &green, &blue, &trans, info); in i810_load_cursor_colors()
830 i810_write_dac(4, red, green, blue, mmio); in i810_load_cursor_colors()
834 i810fb_getcolreg(fg, &red, &green, &blue, &trans, info); in i810_load_cursor_colors()
838 i810_write_dac(5, red, green, blue, mmio); in i810_load_cursor_colors()
844 * i810_init_cursor - initializes the cursor
852 u8 __iomem *mmio = par->mmio_start_virtual; in i810_init_cursor()
855 i810_writel(CURBASE, mmio, par->cursor_heap.physical); in i810_init_cursor()
863 * i810_round_off - Round off values to capability of hardware
867 * @var contains user-defined information for the mode to be set.
879 xres = var->xres; in i810_round_off()
880 yres = var->yres; in i810_round_off()
881 vxres = var->xres_virtual; in i810_round_off()
882 vyres = var->yres_virtual; in i810_round_off()
884 var->bits_per_pixel += 7; in i810_round_off()
885 var->bits_per_pixel &= ~7; in i810_round_off()
887 if (var->bits_per_pixel < 8) in i810_round_off()
888 var->bits_per_pixel = 8; in i810_round_off()
889 if (var->bits_per_pixel > 32) in i810_round_off()
890 var->bits_per_pixel = 32; in i810_round_off()
911 if (var->bits_per_pixel == 32) in i810_round_off()
912 var->accel_flags = 0; in i810_round_off()
915 var->left_margin = (var->left_margin + 4) & ~7; in i810_round_off()
916 var->right_margin = (var->right_margin + 4) & ~7; in i810_round_off()
917 var->hsync_len = (var->hsync_len + 4) & ~7; in i810_round_off()
919 if (var->vmode & FB_VMODE_INTERLACED) { in i810_round_off()
920 if (!((yres + var->upper_margin + var->vsync_len + in i810_round_off()
921 var->lower_margin) & 1)) in i810_round_off()
922 var->upper_margin++; in i810_round_off()
925 var->xres = xres; in i810_round_off()
926 var->yres = yres; in i810_round_off()
927 var->xres_virtual = vxres; in i810_round_off()
928 var->yres_virtual = vyres; in i810_round_off()
932 * set_color_bitfields - sets rgba fields
937 * (red, green, blue) will be set as specified
942 switch (var->bits_per_pixel) { in set_color_bitfields()
944 var->red.offset = 0; in set_color_bitfields()
945 var->red.length = 8; in set_color_bitfields()
946 var->green.offset = 0; in set_color_bitfields()
947 var->green.length = 8; in set_color_bitfields()
948 var->blue.offset = 0; in set_color_bitfields()
949 var->blue.length = 8; in set_color_bitfields()
950 var->transp.offset = 0; in set_color_bitfields()
951 var->transp.length = 0; in set_color_bitfields()
954 var->green.length = (var->green.length == 5) ? 5 : 6; in set_color_bitfields()
955 var->red.length = 5; in set_color_bitfields()
956 var->blue.length = 5; in set_color_bitfields()
957 var->transp.length = 6 - var->green.length; in set_color_bitfields()
958 var->blue.offset = 0; in set_color_bitfields()
959 var->green.offset = 5; in set_color_bitfields()
960 var->red.offset = 5 + var->green.length; in set_color_bitfields()
961 var->transp.offset = (5 + var->red.offset) & 15; in set_color_bitfields()
965 var->red.offset = 16; in set_color_bitfields()
966 var->red.length = 8; in set_color_bitfields()
967 var->green.offset = 8; in set_color_bitfields()
968 var->green.length = 8; in set_color_bitfields()
969 var->blue.offset = 0; in set_color_bitfields()
970 var->blue.length = 8; in set_color_bitfields()
971 var->transp.length = var->bits_per_pixel - 24; in set_color_bitfields()
972 var->transp.offset = (var->transp.length) ? 24 : 0; in set_color_bitfields()
975 var->red.msb_right = 0; in set_color_bitfields()
976 var->green.msb_right = 0; in set_color_bitfields()
977 var->blue.msb_right = 0; in set_color_bitfields()
978 var->transp.msb_right = 0; in set_color_bitfields()
982 * i810_check_params - check if contents in var are valid
994 struct i810fb_par *par = info->par; in i810_check_params()
996 u32 vyres = var->yres_virtual, vxres = var->xres_virtual; in i810_check_params()
1001 line_length = get_line_length(par, vxres, var->bits_per_pixel); in i810_check_params()
1004 if (vidmem > par->fb.size) { in i810_check_params()
1005 vyres = par->fb.size/line_length; in i810_check_params()
1006 if (vyres < var->yres) { in i810_check_params()
1007 vyres = info->var.yres; in i810_check_params()
1008 vxres = par->fb.size/vyres; in i810_check_params()
1009 vxres /= var->bits_per_pixel >> 3; in i810_check_params()
1011 var->bits_per_pixel); in i810_check_params()
1012 vidmem = line_length * info->var.yres; in i810_check_params()
1013 if (vxres < var->xres) { in i810_check_params()
1015 "%d bytes, for %dx%d-%d (virtual) " in i810_check_params()
1018 var->bits_per_pixel); in i810_check_params()
1019 return -ENOMEM; in i810_check_params()
1024 var->xres_virtual = vxres; in i810_check_params()
1025 var->yres_virtual = vyres; in i810_check_params()
1030 switch (var->bits_per_pixel) { in i810_check_params()
1032 info->monspecs.dclkmax = 234000000; in i810_check_params()
1035 info->monspecs.dclkmax = 229000000; in i810_check_params()
1039 info->monspecs.dclkmax = 204000000; in i810_check_params()
1043 info->monspecs.dclkmin = 15000000; in i810_check_params()
1049 if (!mode_valid && info->monspecs.gtf && in i810_check_params()
1053 if (!mode_valid && info->monspecs.modedb_len) { in i810_check_params()
1056 mode = fb_find_best_mode(var, &info->modelist); in i810_check_params()
1063 if (!mode_valid && info->monspecs.modedb_len == 0) { in i810_check_params()
1065 int default_sync = (info->monspecs.hfmin-HFMIN) in i810_check_params()
1066 |(info->monspecs.hfmax-HFMAX) in i810_check_params()
1067 |(info->monspecs.vfmin-VFMIN) in i810_check_params()
1068 |(info->monspecs.vfmax-VFMAX); in i810_check_params()
1072 retval = -EINVAL; in i810_check_params()
1080 * encode_fix - fill up fb_fix_screeninfo structure
1089 struct i810fb_par *par = info->par; in encode_fix()
1093 strcpy(fix->id, "I810"); in encode_fix()
1094 mutex_lock(&info->mm_lock); in encode_fix()
1095 fix->smem_start = par->fb.physical; in encode_fix()
1096 fix->smem_len = par->fb.size; in encode_fix()
1097 mutex_unlock(&info->mm_lock); in encode_fix()
1098 fix->type = FB_TYPE_PACKED_PIXELS; in encode_fix()
1099 fix->type_aux = 0; in encode_fix()
1100 fix->xpanstep = 8; in encode_fix()
1101 fix->ypanstep = 1; in encode_fix()
1103 switch (info->var.bits_per_pixel) { in encode_fix()
1105 fix->visual = FB_VISUAL_PSEUDOCOLOR; in encode_fix()
1110 if (info->var.nonstd) in encode_fix()
1111 fix->visual = FB_VISUAL_DIRECTCOLOR; in encode_fix()
1113 fix->visual = FB_VISUAL_TRUECOLOR; in encode_fix()
1116 return -EINVAL; in encode_fix()
1118 fix->ywrapstep = 0; in encode_fix()
1119 fix->line_length = par->pitch; in encode_fix()
1120 fix->mmio_start = par->mmio_start_phys; in encode_fix()
1121 fix->mmio_len = MMIO_SIZE; in encode_fix()
1122 fix->accel = FB_ACCEL_I810; in encode_fix()
1128 * decode_var - modify par according to contents of var
1133 * Based on the contents of @var, @par will be dynamically filled up.
1141 xres = var->xres; in decode_var()
1142 yres = var->yres; in decode_var()
1143 vxres = var->xres_virtual; in decode_var()
1144 vyres = var->yres_virtual; in decode_var()
1146 switch (var->bits_per_pixel) { in decode_var()
1148 par->pixconf = PIXCONF8; in decode_var()
1149 par->bltcntl = 0; in decode_var()
1150 par->depth = 1; in decode_var()
1151 par->blit_bpp = BPP8; in decode_var()
1154 if (var->green.length == 5) in decode_var()
1155 par->pixconf = PIXCONF15; in decode_var()
1157 par->pixconf = PIXCONF16; in decode_var()
1158 par->bltcntl = 16; in decode_var()
1159 par->depth = 2; in decode_var()
1160 par->blit_bpp = BPP16; in decode_var()
1163 par->pixconf = PIXCONF24; in decode_var()
1164 par->bltcntl = 32; in decode_var()
1165 par->depth = 3; in decode_var()
1166 par->blit_bpp = BPP24; in decode_var()
1169 par->pixconf = PIXCONF32; in decode_var()
1170 par->bltcntl = 0; in decode_var()
1171 par->depth = 4; in decode_var()
1172 par->blit_bpp = 3 << 24; in decode_var()
1175 if (var->nonstd && var->bits_per_pixel != 8) in decode_var()
1176 par->pixconf |= 1 << 27; in decode_var()
1178 i810_calc_dclk(var->pixclock, &par->regs.M, in decode_var()
1179 &par->regs.N, &par->regs.P); in decode_var()
1182 par->watermark = i810_get_watermark(var, par); in decode_var()
1183 par->pitch = get_line_length(par, vxres, var->bits_per_pixel); in decode_var()
1187 * i810fb_getcolreg - gets red, green and blue values of the hardware DAC
1190 * @green: green
1196 * Gets the red, green and blue values of the hardware DAC as pointed by @regno
1197 * and writes them to @red, @green and @blue respectively
1199 static int i810fb_getcolreg(u8 regno, u8 *red, u8 *green, u8 *blue, in i810fb_getcolreg() argument
1202 struct i810fb_par *par = info->par; in i810fb_getcolreg()
1203 u8 __iomem *mmio = par->mmio_start_virtual; in i810fb_getcolreg()
1206 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) { in i810fb_getcolreg()
1207 if ((info->var.green.length == 5 && regno > 31) || in i810fb_getcolreg()
1208 (info->var.green.length == 6 && regno > 63)) in i810fb_getcolreg()
1215 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR && in i810fb_getcolreg()
1216 info->var.green.length == 5) in i810fb_getcolreg()
1217 i810_read_dac(regno * 8, red, green, blue, mmio); in i810fb_getcolreg()
1219 else if (info->fix.visual == FB_VISUAL_DIRECTCOLOR && in i810fb_getcolreg()
1220 info->var.green.length == 6) { in i810fb_getcolreg()
1224 i810_read_dac(regno * 4, &tmp, green, &tmp, mmio); in i810fb_getcolreg()
1227 i810_read_dac(regno, red, green, blue, mmio); in i810fb_getcolreg()
1236 * Framebuffer device-specific hooks *
1241 struct i810fb_par *par = info->par; in i810fb_open()
1243 mutex_lock(&par->open_lock); in i810fb_open()
1244 if (par->use_count == 0) { in i810fb_open()
1245 memset(&par->state, 0, sizeof(struct vgastate)); in i810fb_open()
1246 par->state.flags = VGA_SAVE_CMAP; in i810fb_open()
1247 par->state.vgabase = par->mmio_start_virtual; in i810fb_open()
1248 save_vga(&par->state); in i810fb_open()
1253 par->use_count++; in i810fb_open()
1254 mutex_unlock(&par->open_lock); in i810fb_open()
1261 struct i810fb_par *par = info->par; in i810fb_release()
1263 mutex_lock(&par->open_lock); in i810fb_release()
1264 if (par->use_count == 0) { in i810fb_release()
1265 mutex_unlock(&par->open_lock); in i810fb_release()
1266 return -EINVAL; in i810fb_release()
1269 if (par->use_count == 1) { in i810fb_release()
1271 restore_vga(&par->state); in i810fb_release()
1274 par->use_count--; in i810fb_release()
1275 mutex_unlock(&par->open_lock); in i810fb_release()
1281 static int i810fb_setcolreg(unsigned regno, unsigned red, unsigned green, in i810fb_setcolreg() argument
1285 struct i810fb_par *par = info->par; in i810fb_setcolreg()
1286 u8 __iomem *mmio = par->mmio_start_virtual; in i810fb_setcolreg()
1292 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) { in i810fb_setcolreg()
1293 if ((info->var.green.length == 5 && regno > 31) || in i810fb_setcolreg()
1294 (info->var.green.length == 6 && regno > 63)) in i810fb_setcolreg()
1298 if (info->var.grayscale) in i810fb_setcolreg()
1299 red = green = blue = (19595 * red + 38470 * green + in i810fb_setcolreg()
1305 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR && in i810fb_setcolreg()
1306 info->var.green.length == 5) { in i810fb_setcolreg()
1309 (u8) green, (u8) blue, mmio); in i810fb_setcolreg()
1310 } else if (info->fix.visual == FB_VISUAL_DIRECTCOLOR && in i810fb_setcolreg()
1311 info->var.green.length == 6) { in i810fb_setcolreg()
1317 (u8) red, (u8) green, in i810fb_setcolreg()
1322 i810_write_dac((u8) (regno*4) + i, r, (u8) green, in i810fb_setcolreg()
1324 } else if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) { in i810fb_setcolreg()
1325 i810_write_dac((u8) regno, (u8) red, (u8) green, in i810fb_setcolreg()
1332 switch (info->var.bits_per_pixel) { in i810fb_setcolreg()
1334 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) { in i810fb_setcolreg()
1335 if (info->var.green.length == 5) in i810fb_setcolreg()
1336 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1340 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1344 if (info->var.green.length == 5) { in i810fb_setcolreg()
1346 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1348 ((green & 0xf800) >> 6) | in i810fb_setcolreg()
1352 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1354 ((green & 0xf800) >> 5) | in i810fb_setcolreg()
1361 if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) in i810fb_setcolreg()
1362 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1366 ((u32 *)info->pseudo_palette)[regno] = in i810fb_setcolreg()
1368 (green & 0xff00) | in i810fb_setcolreg()
1379 struct i810fb_par *par = info->par; in i810fb_pan_display()
1382 total = var->xoffset * par->depth + in i810fb_pan_display()
1383 var->yoffset * info->fix.line_length; in i810fb_pan_display()
1391 struct i810fb_par *par = info->par; in i810fb_blank()
1392 u8 __iomem *mmio = par->mmio_start_virtual; in i810fb_blank()
1401 scr_off = ON; in i810fb_blank()
1424 return -EINVAL; in i810fb_blank()
1436 struct i810fb_par *par = info->par; in i810fb_set_par()
1438 decode_var(&info->var, par); in i810fb_set_par()
1441 encode_fix(&info->fix, info); in i810fb_set_par()
1443 if (info->var.accel_flags && !(par->dev_flags & LOCKUP)) { in i810fb_set_par()
1444 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN | in i810fb_set_par()
1447 info->pixmap.scan_align = 2; in i810fb_set_par()
1449 info->pixmap.scan_align = 1; in i810fb_set_par()
1450 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; in i810fb_set_par()
1461 var->vmode &= ~FB_VMODE_MASK; in i810fb_check_var()
1462 var->vmode |= FB_VMODE_NONINTERLACED; in i810fb_check_var()
1464 if (var->vmode & FB_VMODE_DOUBLE) { in i810fb_check_var()
1465 var->vmode &= ~FB_VMODE_MASK; in i810fb_check_var()
1466 var->vmode |= FB_VMODE_NONINTERLACED; in i810fb_check_var()
1480 struct i810fb_par *par = info->par; in i810fb_cursor()
1481 u8 __iomem *mmio = par->mmio_start_virtual; in i810fb_cursor()
1483 if (par->dev_flags & LOCKUP) in i810fb_cursor()
1484 return -ENXIO; in i810fb_cursor()
1486 if (cursor->image.width > 64 || cursor->image.height > 64) in i810fb_cursor()
1487 return -ENXIO; in i810fb_cursor()
1489 if ((i810_readl(CURBASE, mmio) & 0xf) != par->cursor_heap.physical) { in i810fb_cursor()
1491 cursor->set |= FB_CUR_SETALL; in i810fb_cursor()
1496 if (cursor->set & FB_CUR_SETPOS) { in i810fb_cursor()
1499 tmp = (cursor->image.dx - info->var.xoffset) & 0xffff; in i810fb_cursor()
1500 tmp |= (cursor->image.dy - info->var.yoffset) << 16; in i810fb_cursor()
1504 if (cursor->set & FB_CUR_SETSIZE) in i810fb_cursor()
1507 if (cursor->set & FB_CUR_SETCMAP) in i810fb_cursor()
1508 i810_load_cursor_colors(cursor->image.fg_color, in i810fb_cursor()
1509 cursor->image.bg_color, in i810fb_cursor()
1512 if (cursor->set & (FB_CUR_SETSHAPE | FB_CUR_SETIMAGE)) { in i810fb_cursor()
1513 int size = ((cursor->image.width + 7) >> 3) * in i810fb_cursor()
1514 cursor->image.height; in i810fb_cursor()
1519 return -ENOMEM; in i810fb_cursor()
1521 switch (cursor->rop) { in i810fb_cursor()
1524 data[i] = cursor->image.data[i] ^ cursor->mask[i]; in i810fb_cursor()
1529 data[i] = cursor->image.data[i] & cursor->mask[i]; in i810fb_cursor()
1533 i810_load_cursor_image(cursor->image.width, in i810fb_cursor()
1534 cursor->image.height, data, in i810fb_cursor()
1539 if (cursor->enable) in i810fb_cursor()
1540 i810_enable_cursor(mmio, ON); in i810fb_cursor()
1567 struct i810fb_par *par = info->par; in i810fb_suspend()
1569 par->cur_state = mesg.event; in i810fb_suspend()
1574 dev->dev.power.power_state = mesg; in i810fb_suspend()
1581 if (info->fbops->fb_sync) in i810fb_suspend()
1582 info->fbops->fb_sync(info); in i810fb_suspend()
1585 agp_unbind_memory(par->i810_gtt.i810_fb_memory); in i810fb_suspend()
1586 agp_unbind_memory(par->i810_gtt.i810_cursor_memory); in i810fb_suspend()
1599 struct i810fb_par *par = info->par; in i810fb_resume()
1600 int cur_state = par->cur_state; in i810fb_resume()
1602 par->cur_state = PM_EVENT_ON; in i810fb_resume()
1617 agp_bind_memory(par->i810_gtt.i810_fb_memory, in i810fb_resume()
1618 par->fb.offset); in i810fb_resume()
1619 agp_bind_memory(par->i810_gtt.i810_cursor_memory, in i810fb_resume()
1620 par->cursor_heap.offset); in i810fb_resume()
1623 info->fbops->fb_blank(VESA_NO_BLANKING, info); in i810fb_resume()
1634 par->fb.physical = par->aperture.physical+(par->fb.offset << 12); in i810_fix_pointers()
1635 par->fb.virtual = par->aperture.virtual+(par->fb.offset << 12); in i810_fix_pointers()
1636 par->iring.physical = par->aperture.physical + in i810_fix_pointers()
1637 (par->iring.offset << 12); in i810_fix_pointers()
1638 par->iring.virtual = par->aperture.virtual + in i810_fix_pointers()
1639 (par->iring.offset << 12); in i810_fix_pointers()
1640 par->cursor_heap.virtual = par->aperture.virtual+ in i810_fix_pointers()
1641 (par->cursor_heap.offset << 12); in i810_fix_pointers()
1646 if (vram + 1 > par->aperture.size >> 20) in i810_fix_offsets()
1647 vram = (par->aperture.size >> 20) - 1; in i810_fix_offsets()
1648 if (v_offset_default > (par->aperture.size >> 20)) in i810_fix_offsets()
1649 v_offset_default = (par->aperture.size >> 20); in i810_fix_offsets()
1650 if (vram + v_offset_default + 1 > par->aperture.size >> 20) in i810_fix_offsets()
1651 v_offset_default = (par->aperture.size >> 20) - (vram + 1); in i810_fix_offsets()
1653 par->fb.size = vram << 20; in i810_fix_offsets()
1654 par->fb.offset = v_offset_default << 20; in i810_fix_offsets()
1655 par->fb.offset >>= 12; in i810_fix_offsets()
1657 par->iring.offset = par->fb.offset + (par->fb.size >> 12); in i810_fix_offsets()
1658 par->iring.size = RINGBUFFER_SIZE; in i810_fix_offsets()
1660 par->cursor_heap.offset = par->iring.offset + (RINGBUFFER_SIZE >> 12); in i810_fix_offsets()
1661 par->cursor_heap.size = 4096; in i810_fix_offsets()
1666 struct i810fb_par *par = info->par; in i810_alloc_agp_mem()
1671 size = par->fb.size + par->iring.size; in i810_alloc_agp_mem()
1673 if (!(bridge = agp_backend_acquire(par->dev))) { in i810_alloc_agp_mem()
1675 return -ENODEV; in i810_alloc_agp_mem()
1677 if (!(par->i810_gtt.i810_fb_memory = in i810_alloc_agp_mem()
1682 return -ENOMEM; in i810_alloc_agp_mem()
1684 if (agp_bind_memory(par->i810_gtt.i810_fb_memory, in i810_alloc_agp_mem()
1685 par->fb.offset)) { in i810_alloc_agp_mem()
1688 return -EBUSY; in i810_alloc_agp_mem()
1691 if (!(par->i810_gtt.i810_cursor_memory = in i810_alloc_agp_mem()
1692 agp_allocate_memory(bridge, par->cursor_heap.size >> 12, in i810_alloc_agp_mem()
1697 return -ENOMEM; in i810_alloc_agp_mem()
1699 if (agp_bind_memory(par->i810_gtt.i810_cursor_memory, in i810_alloc_agp_mem()
1700 par->cursor_heap.offset)) { in i810_alloc_agp_mem()
1703 return -EBUSY; in i810_alloc_agp_mem()
1706 par->cursor_heap.physical = par->i810_gtt.i810_cursor_memory->physical; in i810_alloc_agp_mem()
1733 if (!info->monspecs.hfmax) in i810_init_monspecs()
1734 info->monspecs.hfmax = hsync2; in i810_init_monspecs()
1735 if (!info->monspecs.hfmin) in i810_init_monspecs()
1736 info->monspecs.hfmin = hsync1; in i810_init_monspecs()
1738 info->monspecs.hfmin = hsync2; in i810_init_monspecs()
1746 if (!info->monspecs.vfmax) in i810_init_monspecs()
1747 info->monspecs.vfmax = vsync2; in i810_init_monspecs()
1748 if (!info->monspecs.vfmin) in i810_init_monspecs()
1749 info->monspecs.vfmin = vsync1; in i810_init_monspecs()
1751 info->monspecs.vfmin = vsync2; in i810_init_monspecs()
1755 * i810_init_defaults - initializes default values to use
1761 mutex_init(&par->open_lock); in i810_init_defaults()
1765 else if (par->aperture.size > 32 * 1024 * 1024) in i810_init_defaults()
1774 par->dev_flags |= HAS_ACCELERATION; in i810_init_defaults()
1776 if (sync) in i810_init_defaults()
1777 par->dev_flags |= ALWAYS_SYNC; in i810_init_defaults()
1779 par->ddc_num = (ddc3 ? 3 : 2); in i810_init_defaults()
1784 par->i810fb_ops = i810fb_ops; in i810_init_defaults()
1787 info->var.xres = xres; in i810_init_defaults()
1789 info->var.xres = 640; in i810_init_defaults()
1792 info->var.yres = yres; in i810_init_defaults()
1794 info->var.yres = 480; in i810_init_defaults()
1797 vyres = (vram << 20)/(info->var.xres*bpp >> 3); in i810_init_defaults()
1799 info->var.yres_virtual = vyres; in i810_init_defaults()
1800 info->var.bits_per_pixel = bpp; in i810_init_defaults()
1803 info->var.nonstd = 1; in i810_init_defaults()
1805 if (par->dev_flags & HAS_ACCELERATION) in i810_init_defaults()
1806 info->var.accel_flags = 1; in i810_init_defaults()
1812 * i810_init_device - initialize device
1818 u8 __iomem *mmio = par->mmio_start_virtual; in i810_init_device()
1821 par->wc_cookie= arch_phys_wc_add((u32) par->aperture.physical, in i810_init_device()
1822 par->aperture.size); in i810_init_device()
1826 /* mvo: enable external vga-connector (for laptops) */ in i810_init_device()
1832 pci_read_config_byte(par->dev, 0x50, &reg); in i810_init_device()
1834 par->mem_freq = (reg) ? 133 : 100; in i810_init_device()
1843 if ((err = pci_enable_device(par->dev))) { in i810_allocate_pci_resource()
1847 par->res_flags |= PCI_DEVICE_ENABLED; in i810_allocate_pci_resource()
1849 if (pci_resource_len(par->dev, 0) > 512 * 1024) { in i810_allocate_pci_resource()
1850 par->aperture.physical = pci_resource_start(par->dev, 0); in i810_allocate_pci_resource()
1851 par->aperture.size = pci_resource_len(par->dev, 0); in i810_allocate_pci_resource()
1852 par->mmio_start_phys = pci_resource_start(par->dev, 1); in i810_allocate_pci_resource()
1854 par->aperture.physical = pci_resource_start(par->dev, 1); in i810_allocate_pci_resource()
1855 par->aperture.size = pci_resource_len(par->dev, 1); in i810_allocate_pci_resource()
1856 par->mmio_start_phys = pci_resource_start(par->dev, 0); in i810_allocate_pci_resource()
1858 if (!par->aperture.size) { in i810_allocate_pci_resource()
1860 return -ENOMEM; in i810_allocate_pci_resource()
1863 if (!request_mem_region(par->aperture.physical, in i810_allocate_pci_resource()
1864 par->aperture.size, in i810_allocate_pci_resource()
1865 i810_pci_list[entry->driver_data])) { in i810_allocate_pci_resource()
1867 return -ENODEV; in i810_allocate_pci_resource()
1869 par->res_flags |= FRAMEBUFFER_REQ; in i810_allocate_pci_resource()
1871 par->aperture.virtual = ioremap_wc(par->aperture.physical, in i810_allocate_pci_resource()
1872 par->aperture.size); in i810_allocate_pci_resource()
1873 if (!par->aperture.virtual) { in i810_allocate_pci_resource()
1875 return -ENODEV; in i810_allocate_pci_resource()
1878 if (!request_mem_region(par->mmio_start_phys, in i810_allocate_pci_resource()
1880 i810_pci_list[entry->driver_data])) { in i810_allocate_pci_resource()
1882 return -ENODEV; in i810_allocate_pci_resource()
1884 par->res_flags |= MMIO_REQ; in i810_allocate_pci_resource()
1886 par->mmio_start_virtual = ioremap(par->mmio_start_phys, in i810_allocate_pci_resource()
1888 if (!par->mmio_start_virtual) { in i810_allocate_pci_resource()
1890 return -ENODEV; in i810_allocate_pci_resource()
1900 struct fb_monspecs *specs = &info->monspecs; in i810fb_find_init_mode()
1905 struct i810fb_par *par = info->par; in i810fb_find_init_mode()
1908 INIT_LIST_HEAD(&info->modelist); in i810fb_find_init_mode()
1910 var = info->var; in i810fb_find_init_mode()
1914 for (i = 0; i < par->ddc_num + 1; i++) { in i810fb_find_init_mode()
1915 err = i810_probe_i2c_connector(info, &par->edid, i); in i810fb_find_init_mode()
1923 fb_edid_to_monspecs(par->edid, specs); in i810fb_find_init_mode()
1925 if (specs->modedb == NULL) in i810fb_find_init_mode()
1928 fb_videomode_to_modelist(specs->modedb, specs->modedb_len, in i810fb_find_init_mode()
1929 &info->modelist); in i810fb_find_init_mode()
1930 if (specs->modedb != NULL) { in i810fb_find_init_mode()
1934 if ((m = fb_find_best_mode(&var, &info->modelist))) { in i810fb_find_init_mode()
1941 m = fb_find_best_display(&info->monspecs, &info->modelist); in i810fb_find_init_mode()
1950 fb_find_mode(&var, info, mode_option, specs->modedb, in i810fb_find_init_mode()
1951 specs->modedb_len, (found) ? &mode : NULL, in i810fb_find_init_mode()
1952 info->var.bits_per_pixel); in i810fb_find_init_mode()
1954 info->var = var; in i810fb_find_init_mode()
1955 fb_destroy_modedb(specs->modedb); in i810fb_find_init_mode()
1956 specs->modedb = NULL; in i810fb_find_init_mode()
1974 else if (!strncmp(this_opt, "sync", 4)) in i810fb_setup()
1975 sync = true; in i810fb_setup()
2017 int err = -1, vfreq, hfreq, pixclock; in i810fb_init_pci()
2019 info = framebuffer_alloc(sizeof(struct i810fb_par), &dev->dev); in i810fb_init_pci()
2021 return -ENOMEM; in i810fb_init_pci()
2023 par = info->par; in i810fb_init_pci()
2024 par->dev = dev; in i810fb_init_pci()
2026 if (!(info->pixmap.addr = kzalloc(8*1024, GFP_KERNEL))) { in i810fb_init_pci()
2028 return -ENOMEM; in i810fb_init_pci()
2030 info->pixmap.size = 8*1024; in i810fb_init_pci()
2031 info->pixmap.buf_align = 8; in i810fb_init_pci()
2032 info->pixmap.access_align = 32; in i810fb_init_pci()
2033 info->pixmap.flags = FB_PIXMAP_SYSTEM; in i810fb_init_pci()
2049 info->screen_base = par->fb.virtual; in i810fb_init_pci()
2050 info->fbops = &par->i810fb_ops; in i810fb_init_pci()
2051 info->pseudo_palette = par->pseudo_palette; in i810fb_init_pci()
2052 fb_alloc_cmap(&info->cmap, 256, 0); in i810fb_init_pci()
2055 if ((err = info->fbops->fb_check_var(&info->var, info))) { in i810fb_init_pci()
2060 fb_var_to_videomode(&mode, &info->var); in i810fb_init_pci()
2061 fb_add_videomode(&mode, &info->modelist); in i810fb_init_pci()
2073 pixclock = 1000000000/(info->var.pixclock); in i810fb_init_pci()
2075 hfreq = pixclock/(info->var.xres + info->var.left_margin + in i810fb_init_pci()
2076 info->var.hsync_len + info->var.right_margin); in i810fb_init_pci()
2077 vfreq = hfreq/(info->var.yres + info->var.upper_margin + in i810fb_init_pci()
2078 info->var.vsync_len + info->var.lower_margin); in i810fb_init_pci()
2082 "I810FB: Monitor : H: %d-%d KHz V: %d-%d Hz\n" in i810fb_init_pci()
2083 "I810FB: Mode : %dx%d-%dbpp@%dHz\n", in i810fb_init_pci()
2084 info->node, in i810fb_init_pci()
2085 i810_pci_list[entry->driver_data], in i810fb_init_pci()
2087 (int) par->fb.size>>10, info->monspecs.hfmin/1000, in i810fb_init_pci()
2088 info->monspecs.hfmax/1000, info->monspecs.vfmin, in i810fb_init_pci()
2089 info->monspecs.vfmax, info->var.xres, in i810fb_init_pci()
2090 info->var.yres, info->var.bits_per_pixel, vfreq); in i810fb_init_pci()
2095 * De-initialization *
2101 struct gtt_data *gtt = &par->i810_gtt; in i810fb_release_resource()
2102 arch_phys_wc_del(par->wc_cookie); in i810fb_release_resource()
2106 if (par->i810_gtt.i810_cursor_memory) in i810fb_release_resource()
2107 agp_free_memory(gtt->i810_cursor_memory); in i810fb_release_resource()
2108 if (par->i810_gtt.i810_fb_memory) in i810fb_release_resource()
2109 agp_free_memory(gtt->i810_fb_memory); in i810fb_release_resource()
2111 if (par->mmio_start_virtual) in i810fb_release_resource()
2112 iounmap(par->mmio_start_virtual); in i810fb_release_resource()
2113 if (par->aperture.virtual) in i810fb_release_resource()
2114 iounmap(par->aperture.virtual); in i810fb_release_resource()
2115 kfree(par->edid); in i810fb_release_resource()
2116 if (par->res_flags & FRAMEBUFFER_REQ) in i810fb_release_resource()
2117 release_mem_region(par->aperture.physical, in i810fb_release_resource()
2118 par->aperture.size); in i810fb_release_resource()
2119 if (par->res_flags & MMIO_REQ) in i810fb_release_resource()
2120 release_mem_region(par->mmio_start_phys, MMIO_SIZE); in i810fb_release_resource()
2129 struct i810fb_par *par = info->par; in i810fb_remove_pci()
2142 return -ENODEV; in i810fb_init()
2197 module_param(sync, bool, 0);
2198 MODULE_PARM_DESC(sync, "wait for accel engine to finish drawing"