Lines Matching +full:no +full:- +full:1 +full:- +full:8 +full:- +full:v
15 * the i810/i830 XFree86 driver. The HW-specific code is covered here
22 /* $DHD: intelfb/intelfbdrv.c,v 1.20 2003/06/27 15:17:40 dawes Exp $ */
26 * 01/2003 - Initial driver (0.1.0), no mode switching, no acceleration.
28 * the vesafb driver. It must be built-in to the kernel,
32 * 01/2003 - Version 0.2.0: Mode switching added, colormap support
34 * No acceleration yet. (David Dawes)
36 * 01/2003 - Version 0.3.0: fbcon acceleration support added. Module
39 * 01/2003 - Version 0.4.0: fbcon HW cursor support added. (David Dawes)
41 * 01/2003 - Version 0.4.1: Add auto-generation of built-in modes.
44 * 02/2003 - Version 0.4.2: Add check for active non-CRT devices, and
47 * 02/2003 - Version 0.4.3: Check when the VC is in graphics mode so that
51 * 02/2003 - Version 0.4.4: Monitor DPMS support. (David Dawes)
53 * 02/2003 - Version 0.4.5: Basic XFree86 + fbdev working. (David Dawes)
55 * 02/2003 - Version 0.5.0: Modify to work with the 2.5.32 kernel as well
58 * 02/2003 - Version 0.6.0: Split out HW-specifics into a separate file.
61 * 02/2003 - Version 0.7.0: Test on 852GM/855GM. Acceleration and HW
64 * 02/2003 - Version 0.7.1: Test on 845G. Acceleration is disabled
67 * 02/2003 - Version 0.7.2: Test on 830M. Acceleration and HW
70 * 02/2003 - Version 0.7.3: Fix 8-bit modes for mobile platforms
73 * 02/2003 - Version 0.7.4: Add checks for FB and FBCON_HAS_CFB* configured
78 * 02/2003 - Version 0.7.5: Add basic package/install scripts based on the
81 * 04/2003 - Version 0.7.6: Fix typo that affects builds with SMP-enabled
84 * 06/2003 - Version 0.7.7:
86 * Fix mis-placed #endif (2.4.21 kernel).
88 * 09/2004 - Version 0.9.0 - by Sylvain Meyer
94 * 10/2004 - Version 0.9.1
98 * 11/2004 - Version 0.9.2
103 * 04/2008 - Version 0.9.5
106 * 08/2008 - Version 0.9.6
167 * Limiting the class to PCI_CLASS_DISPLAY_VGA prevents function 1 of the
171 #define INTELFB_CLASS_MASK ~0 << 8
177 … PCI_DEVICE_ID_INTEL_830M, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
178 … PCI_DEVICE_ID_INTEL_845G, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
179 …PCI_DEVICE_ID_INTEL_85XGM, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
180 … PCI_DEVICE_ID_INTEL_865G, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
181 …{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_854, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8…
182 … PCI_DEVICE_ID_INTEL_915G, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
183 …PCI_DEVICE_ID_INTEL_915GM, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
184 … PCI_DEVICE_ID_INTEL_945G, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
185 …PCI_DEVICE_ID_INTEL_945GM, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
186 …CI_DEVICE_ID_INTEL_945GME, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
187 … PCI_DEVICE_ID_INTEL_965G, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
188 …PCI_DEVICE_ID_INTEL_965GM, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK,…
229 static bool accel = 1;
232 static bool mtrr = 1;
266 "Initial video mode \"<xres>x<yres>[-<depth>][@<refresh>]\"");
270 #define OPT_INTVAL(opt, name) simple_strtoul(opt + strlen(name) + 1, NULL, 0)
283 ret = kmalloc(i + 1, GFP_KERNEL); in get_opt_string()
301 return 1; in get_opt_int()
312 *ret = simple_strtoul(this_opt + strlen(name) + 1, in get_opt_bool()
315 *ret = 1; in get_opt_bool()
317 if (OPT_EQUAL(this_opt, "no") && OPT_EQUAL(this_opt + 2, name)) in get_opt_bool()
322 return 1; in get_opt_bool()
332 DBG_MSG("no options\n"); in intelfb_setup()
338 * These are the built-in options analogous to the module parameters in intelfb_setup()
347 * video=intelfb:1024x768-16@75,accel=0 in intelfb_setup()
389 return -ENODEV; in intelfb_init()
393 return -ENODEV; in intelfb_init()
422 fb_dealloc_cmap(&dinfo->info->cmap); in cleanup()
423 kfree(dinfo->info->pixmap.addr); in cleanup()
425 if (dinfo->registered) in cleanup()
426 unregister_framebuffer(dinfo->info); in cleanup()
428 arch_phys_wc_del(dinfo->wc_cookie); in cleanup()
430 if (dinfo->fbmem_gart && dinfo->gtt_fb_mem) { in cleanup()
431 agp_unbind_memory(dinfo->gtt_fb_mem); in cleanup()
432 agp_free_memory(dinfo->gtt_fb_mem); in cleanup()
434 if (dinfo->gtt_cursor_mem) { in cleanup()
435 agp_unbind_memory(dinfo->gtt_cursor_mem); in cleanup()
436 agp_free_memory(dinfo->gtt_cursor_mem); in cleanup()
438 if (dinfo->gtt_ring_mem) { in cleanup()
439 agp_unbind_memory(dinfo->gtt_ring_mem); in cleanup()
440 agp_free_memory(dinfo->gtt_ring_mem); in cleanup()
444 /* un-register I2C bus */ in cleanup()
448 if (dinfo->mmio_base) in cleanup()
449 iounmap((void __iomem *)dinfo->mmio_base); in cleanup()
450 if (dinfo->aperture.virtual) in cleanup()
451 iounmap((void __iomem *)dinfo->aperture.virtual); in cleanup()
453 if (dinfo->flag & INTELFB_MMIO_ACQUIRED) in cleanup()
454 release_mem_region(dinfo->mmio_base_phys, INTEL_REG_SIZE); in cleanup()
455 if (dinfo->flag & INTELFB_FB_ACQUIRED) in cleanup()
456 release_mem_region(dinfo->aperture.physical, in cleanup()
457 dinfo->aperture.size); in cleanup()
458 framebuffer_release(dinfo->info); in cleanup()
465 return -ENODEV; \
481 int mmio_bar = 1; in intelfb_pci_register()
487 if (num_registered != 1) { in intelfb_pci_register()
489 "(should be only 1).\n", num_registered); in intelfb_pci_register()
490 return -ENODEV; in intelfb_pci_register()
493 info = framebuffer_alloc(sizeof(struct intelfb_info), &pdev->dev); in intelfb_pci_register()
495 return -ENOMEM; in intelfb_pci_register()
497 if (fb_alloc_cmap(&info->cmap, 256, 1) < 0) { in intelfb_pci_register()
502 dinfo = info->par; in intelfb_pci_register()
503 dinfo->info = info; in intelfb_pci_register()
504 dinfo->fbops = &intel_fb_ops; in intelfb_pci_register()
505 dinfo->pdev = pdev; in intelfb_pci_register()
508 info->pixmap.addr = kzalloc(64 * 1024, GFP_KERNEL); in intelfb_pci_register()
509 if (info->pixmap.addr == NULL) { in intelfb_pci_register()
516 dinfo->fixed_mode = fixed; in intelfb_pci_register()
522 return -ENODEV; in intelfb_pci_register()
526 if ((ent->device == PCI_DEVICE_ID_INTEL_915G) || in intelfb_pci_register()
527 (ent->device == PCI_DEVICE_ID_INTEL_915GM) || in intelfb_pci_register()
528 (ent->device == PCI_DEVICE_ID_INTEL_945G) || in intelfb_pci_register()
529 (ent->device == PCI_DEVICE_ID_INTEL_945GM) || in intelfb_pci_register()
530 (ent->device == PCI_DEVICE_ID_INTEL_945GME) || in intelfb_pci_register()
531 (ent->device == PCI_DEVICE_ID_INTEL_965G) || in intelfb_pci_register()
532 (ent->device == PCI_DEVICE_ID_INTEL_965GM)) { in intelfb_pci_register()
537 dinfo->aperture.physical = pci_resource_start(pdev, aperture_bar); in intelfb_pci_register()
538 dinfo->aperture.size = pci_resource_len(pdev, aperture_bar); in intelfb_pci_register()
539 dinfo->mmio_base_phys = pci_resource_start(pdev, mmio_bar); in intelfb_pci_register()
547 if (!request_mem_region(dinfo->aperture.physical, dinfo->aperture.size, in intelfb_pci_register()
551 return -ENODEV; in intelfb_pci_register()
554 dinfo->flag |= INTELFB_FB_ACQUIRED; in intelfb_pci_register()
556 if (!request_mem_region(dinfo->mmio_base_phys, in intelfb_pci_register()
561 return -ENODEV; in intelfb_pci_register()
564 dinfo->flag |= INTELFB_MMIO_ACQUIRED; in intelfb_pci_register()
567 dinfo->pci_chipset = pdev->device; in intelfb_pci_register()
571 return -ENODEV; in intelfb_pci_register()
576 return -ENODEV; in intelfb_pci_register()
581 pdev->bus->number, PCI_SLOT(pdev->devfn), in intelfb_pci_register()
582 PCI_FUNC(pdev->devfn), dinfo->name, in intelfb_pci_register()
586 dinfo->accel = accel; in intelfb_pci_register()
587 dinfo->hwcursor = hwcursor; in intelfb_pci_register()
589 if (NOACCEL_CHIPSET(dinfo) && dinfo->accel == 1) { in intelfb_pci_register()
591 dinfo->name); in intelfb_pci_register()
592 dinfo->accel = 0; in intelfb_pci_register()
595 /* Framebuffer parameters - Use all the stolen memory if >= vram */ in intelfb_pci_register()
597 dinfo->fb.size = ROUND_UP_TO_PAGE(stolen_size); in intelfb_pci_register()
598 dinfo->fbmem_gart = 0; in intelfb_pci_register()
600 dinfo->fb.size = MB(vram); in intelfb_pci_register()
601 dinfo->fbmem_gart = 1; in intelfb_pci_register()
605 if (dinfo->accel) { in intelfb_pci_register()
606 dinfo->ring.size = RINGBUFFER_SIZE; in intelfb_pci_register()
607 dinfo->ring_tail_mask = dinfo->ring.size - 1; in intelfb_pci_register()
609 if (dinfo->hwcursor) in intelfb_pci_register()
610 dinfo->cursor.size = HW_CURSOR_SIZE; in intelfb_pci_register()
616 return -ENODEV; in intelfb_pci_register()
624 return -ENODEV; in intelfb_pci_register()
632 /* set the mem offsets - set them after the already used pages */ in intelfb_pci_register()
633 if (dinfo->accel) in intelfb_pci_register()
634 dinfo->ring.offset = offset + gtt_info.current_memory; in intelfb_pci_register()
635 if (dinfo->hwcursor) in intelfb_pci_register()
636 dinfo->cursor.offset = offset + in intelfb_pci_register()
637 + gtt_info.current_memory + (dinfo->ring.size >> 12); in intelfb_pci_register()
638 if (dinfo->fbmem_gart) in intelfb_pci_register()
639 dinfo->fb.offset = offset + in intelfb_pci_register()
640 + gtt_info.current_memory + (dinfo->ring.size >> 12) in intelfb_pci_register()
641 + (dinfo->cursor.size >> 12); in intelfb_pci_register()
646 dinfo->aperture.virtual = (u8 __iomem *)ioremap_wc in intelfb_pci_register()
647 (dinfo->aperture.physical, ((offset + dinfo->fb.offset) << 12) in intelfb_pci_register()
648 + dinfo->fb.size); in intelfb_pci_register()
649 if (!dinfo->aperture.virtual) { in intelfb_pci_register()
653 return -ENODEV; in intelfb_pci_register()
656 dinfo->mmio_base = in intelfb_pci_register()
657 (u8 __iomem *)ioremap(dinfo->mmio_base_phys, in intelfb_pci_register()
659 if (!dinfo->mmio_base) { in intelfb_pci_register()
663 return -ENODEV; in intelfb_pci_register()
666 if (dinfo->accel) { in intelfb_pci_register()
667 if (!(dinfo->gtt_ring_mem = in intelfb_pci_register()
668 agp_allocate_memory(bridge, dinfo->ring.size >> 12, in intelfb_pci_register()
673 return -ENOMEM; in intelfb_pci_register()
675 if (agp_bind_memory(dinfo->gtt_ring_mem, in intelfb_pci_register()
676 dinfo->ring.offset)) { in intelfb_pci_register()
680 return -EBUSY; in intelfb_pci_register()
682 dinfo->ring.physical = dinfo->aperture.physical in intelfb_pci_register()
683 + (dinfo->ring.offset << 12); in intelfb_pci_register()
684 dinfo->ring.virtual = dinfo->aperture.virtual in intelfb_pci_register()
685 + (dinfo->ring.offset << 12); in intelfb_pci_register()
686 dinfo->ring_head = 0; in intelfb_pci_register()
688 if (dinfo->hwcursor) { in intelfb_pci_register()
689 agp_memtype = dinfo->mobile ? AGP_PHYSICAL_MEMORY in intelfb_pci_register()
691 if (!(dinfo->gtt_cursor_mem = in intelfb_pci_register()
692 agp_allocate_memory(bridge, dinfo->cursor.size >> 12, in intelfb_pci_register()
697 return -ENOMEM; in intelfb_pci_register()
699 if (agp_bind_memory(dinfo->gtt_cursor_mem, in intelfb_pci_register()
700 dinfo->cursor.offset)) { in intelfb_pci_register()
704 return -EBUSY; in intelfb_pci_register()
706 if (dinfo->mobile) in intelfb_pci_register()
707 dinfo->cursor.physical in intelfb_pci_register()
708 = dinfo->gtt_cursor_mem->physical; in intelfb_pci_register()
710 dinfo->cursor.physical = dinfo->aperture.physical in intelfb_pci_register()
711 + (dinfo->cursor.offset << 12); in intelfb_pci_register()
712 dinfo->cursor.virtual = dinfo->aperture.virtual in intelfb_pci_register()
713 + (dinfo->cursor.offset << 12); in intelfb_pci_register()
715 if (dinfo->fbmem_gart) { in intelfb_pci_register()
716 if (!(dinfo->gtt_fb_mem = in intelfb_pci_register()
717 agp_allocate_memory(bridge, dinfo->fb.size >> 12, in intelfb_pci_register()
719 WRN_MSG("cannot allocate framebuffer memory - use " in intelfb_pci_register()
721 dinfo->fbmem_gart = 0; in intelfb_pci_register()
723 if (agp_bind_memory(dinfo->gtt_fb_mem, in intelfb_pci_register()
724 dinfo->fb.offset)) { in intelfb_pci_register()
725 WRN_MSG("cannot bind framebuffer memory - use " in intelfb_pci_register()
727 dinfo->fbmem_gart = 0; in intelfb_pci_register()
732 if (!dinfo->fbmem_gart) in intelfb_pci_register()
733 dinfo->fb.offset = 0; /* starts at offset 0 */ in intelfb_pci_register()
734 dinfo->fb.physical = dinfo->aperture.physical in intelfb_pci_register()
735 + (dinfo->fb.offset << 12); in intelfb_pci_register()
736 dinfo->fb.virtual = dinfo->aperture.virtual + (dinfo->fb.offset << 12); in intelfb_pci_register()
737 dinfo->fb_start = dinfo->fb.offset << 12; in intelfb_pci_register()
743 dinfo->wc_cookie = arch_phys_wc_add(dinfo->aperture.physical, in intelfb_pci_register()
744 dinfo->aperture.size); in intelfb_pci_register()
747 dinfo->fb.physical, dinfo->fb.offset, dinfo->fb.size, in intelfb_pci_register()
748 dinfo->fb.virtual); in intelfb_pci_register()
750 dinfo->mmio_base_phys, INTEL_REG_SIZE, in intelfb_pci_register()
751 dinfo->mmio_base); in intelfb_pci_register()
753 dinfo->ring.physical, dinfo->ring.size, in intelfb_pci_register()
754 dinfo->ring.virtual); in intelfb_pci_register()
756 dinfo->cursor.physical, dinfo->cursor.size, in intelfb_pci_register()
757 dinfo->cursor.virtual, dinfo->cursor.offset, in intelfb_pci_register()
758 dinfo->cursor.physical); in intelfb_pci_register()
773 dinfo->fixed_mode = 1; in intelfb_pci_register()
774 WRN_MSG("Non-CRT device is enabled ( "); in intelfb_pci_register()
777 if (dvo & 1) { in intelfb_pci_register()
778 s = intelfbhw_dvo_to_string(1 << i); in intelfb_pci_register()
782 dvo >>= 1; in intelfb_pci_register()
788 if (bailearly == 1) in intelfb_pci_register()
795 return -ENODEV; in intelfb_pci_register()
810 update_dinfo(dinfo, &dinfo->initial_var); in intelfb_pci_register()
818 return -ENODEV; in intelfb_pci_register()
835 i = intelfbhw_read_hw_state(dinfo, &dinfo->save_state, in intelfb_pci_register()
836 bailearly > 6 ? bailearly - 6 : 0); in intelfb_pci_register()
842 intelfbhw_print_hw_state(dinfo, &dinfo->save_state); in intelfb_pci_register()
848 dinfo->pipe = intelfbhw_active_pipe(&dinfo->save_state); in intelfb_pci_register()
851 if (dinfo->hwcursor) { in intelfb_pci_register()
860 if (dinfo->accel) in intelfb_pci_register()
869 if (register_framebuffer(dinfo->info) < 0) { in intelfb_pci_register()
872 return -ENODEV; in intelfb_pci_register()
875 dinfo->registered = 1; in intelfb_pci_register()
876 dinfo->open = 0; in intelfb_pci_register()
878 init_waitqueue_head(&dinfo->vsync.wait); in intelfb_pci_register()
879 spin_lock_init(&dinfo->int_lock); in intelfb_pci_register()
880 dinfo->irq_flags = 0; in intelfb_pci_register()
881 dinfo->vsync.pan_display = 0; in intelfb_pci_register()
882 dinfo->vsync.pan_offset = 0; in intelfb_pci_register()
887 fb_dealloc_cmap(&info->cmap); in intelfb_pci_register()
890 return -ENODEV; in intelfb_pci_register()
912 var->bits_per_pixel, var->green.length); in intelfb_var_to_depth()
914 switch (var->bits_per_pixel) { in intelfb_var_to_depth()
916 return (var->green.length == 6) ? 16 : 15; in intelfb_var_to_depth()
920 return var->bits_per_pixel; in intelfb_var_to_depth()
927 int xtot = var->xres + var->left_margin + var->right_margin + in var_to_refresh()
928 var->hsync_len; in var_to_refresh()
929 int ytot = var->yres + var->upper_margin + var->lower_margin + in var_to_refresh()
930 var->vsync_len; in var_to_refresh()
932 return (1000000000 / var->pixclock * 1000 + 500) / xtot / ytot; in var_to_refresh()
946 dinfo->initial_vga = 1; in get_initial_mode()
947 dinfo->initial_fb_base = screen_info.lfb_base; in get_initial_mode()
948 dinfo->initial_video_ram = screen_info.lfb_size * KB(64); in get_initial_mode()
949 dinfo->initial_pitch = screen_info.lfb_linelength; in get_initial_mode()
951 var = &dinfo->initial_var; in get_initial_mode()
953 var->xres = screen_info.lfb_width; in get_initial_mode()
954 var->yres = screen_info.lfb_height; in get_initial_mode()
955 var->bits_per_pixel = screen_info.lfb_depth; in get_initial_mode()
958 var->bits_per_pixel = 16; in get_initial_mode()
961 var->bits_per_pixel = 32; in get_initial_mode()
966 dinfo->initial_fb_base, dinfo->initial_video_ram, in get_initial_mode()
967 BtoKB(dinfo->initial_video_ram)); in get_initial_mode()
969 DBG_MSG("Initial info: mode is %dx%d-%d (%d)\n", in get_initial_mode()
970 var->xres, var->yres, var->bits_per_pixel, in get_initial_mode()
971 dinfo->initial_pitch); in get_initial_mode()
974 var->left_margin = (var->xres / 8) & 0xf8; in get_initial_mode()
975 var->right_margin = 32; in get_initial_mode()
976 var->upper_margin = 16; in get_initial_mode()
977 var->lower_margin = 4; in get_initial_mode()
978 var->hsync_len = (var->xres / 8) & 0xf8; in get_initial_mode()
979 var->vsync_len = 4; in get_initial_mode()
981 xtot = var->xres + var->left_margin + in get_initial_mode()
982 var->right_margin + var->hsync_len; in get_initial_mode()
983 ytot = var->yres + var->upper_margin + in get_initial_mode()
984 var->lower_margin + var->vsync_len; in get_initial_mode()
985 var->pixclock = 10000000 / xtot * 1000 / ytot * 100 / 60; in get_initial_mode()
987 var->height = -1; in get_initial_mode()
988 var->width = -1; in get_initial_mode()
990 if (var->bits_per_pixel > 8) { in get_initial_mode()
991 var->red.offset = screen_info.red_pos; in get_initial_mode()
992 var->red.length = screen_info.red_size; in get_initial_mode()
993 var->green.offset = screen_info.green_pos; in get_initial_mode()
994 var->green.length = screen_info.green_size; in get_initial_mode()
995 var->blue.offset = screen_info.blue_pos; in get_initial_mode()
996 var->blue.length = screen_info.blue_size; in get_initial_mode()
997 var->transp.offset = screen_info.rsvd_pos; in get_initial_mode()
998 var->transp.length = screen_info.rsvd_size; in get_initial_mode()
1000 var->red.length = 8; in get_initial_mode()
1001 var->green.length = 8; in get_initial_mode()
1002 var->blue.length = 8; in get_initial_mode()
1013 var = &dinfo->info->var; in intelfb_init_var()
1015 memcpy(var, &dinfo->initial_var, in intelfb_init_var()
1019 const u8 *edid_s = fb_firmware_edid(&dinfo->pdev->dev); in intelfb_init_var()
1027 &dinfo->info->monspecs); in intelfb_init_var()
1035 msrc = fb_find_mode(var, dinfo->info, mode, in intelfb_init_var()
1036 dinfo->info->monspecs.modedb, in intelfb_init_var()
1037 dinfo->info->monspecs.modedb_len, in intelfb_init_var()
1040 if (msrc && msrc > 1) { in intelfb_init_var()
1041 printk("intelfb: No mode in private database, " in intelfb_init_var()
1044 msrc = fb_find_mode(var, dinfo->info, mode, in intelfb_init_var()
1048 msrc |= 8; in intelfb_init_var()
1054 msrc = fb_find_mode(var, dinfo->info, PREFERRED_MODE, in intelfb_init_var()
1060 return 1; in intelfb_init_var()
1063 INF_MSG("Initial video mode is %dx%d-%d@%d.\n", var->xres, var->yres, in intelfb_init_var()
1064 var->bits_per_pixel, var_to_refresh(var)); in intelfb_init_var()
1070 var->xres_virtual = var->xres; in intelfb_init_var()
1071 var->yres_virtual = in intelfb_init_var()
1072 dinfo->fb.size / 2 / (var->bits_per_pixel * var->xres); in intelfb_init_var()
1073 if (var->yres_virtual < var->yres) in intelfb_init_var()
1074 var->yres_virtual = var->yres; in intelfb_init_var()
1076 var->yres_virtual = var->yres; in intelfb_init_var()
1079 if (dinfo->accel) in intelfb_init_var()
1080 var->accel_flags |= FB_ACCELF_TEXT; in intelfb_init_var()
1082 var->accel_flags &= ~FB_ACCELF_TEXT; in intelfb_init_var()
1089 struct fb_info *info = dinfo->info; in intelfb_set_fbinfo()
1093 info->flags = FBINFO_FLAG_DEFAULT; in intelfb_set_fbinfo()
1094 info->fbops = &intel_fb_ops; in intelfb_set_fbinfo()
1095 info->pseudo_palette = dinfo->pseudo_palette; in intelfb_set_fbinfo()
1097 info->pixmap.size = 64*1024; in intelfb_set_fbinfo()
1098 info->pixmap.buf_align = 8; in intelfb_set_fbinfo()
1099 info->pixmap.access_align = 32; in intelfb_set_fbinfo()
1100 info->pixmap.flags = FB_PIXMAP_SYSTEM; in intelfb_set_fbinfo()
1103 return 1; in intelfb_set_fbinfo()
1105 info->pixmap.scan_align = 1; in intelfb_set_fbinfo()
1106 strcpy(info->fix.id, dinfo->name); in intelfb_set_fbinfo()
1107 info->fix.smem_start = dinfo->fb.physical; in intelfb_set_fbinfo()
1108 info->fix.smem_len = dinfo->fb.size; in intelfb_set_fbinfo()
1109 info->fix.type = FB_TYPE_PACKED_PIXELS; in intelfb_set_fbinfo()
1110 info->fix.type_aux = 0; in intelfb_set_fbinfo()
1111 info->fix.xpanstep = 8; in intelfb_set_fbinfo()
1112 info->fix.ypanstep = 1; in intelfb_set_fbinfo()
1113 info->fix.ywrapstep = 0; in intelfb_set_fbinfo()
1114 info->fix.mmio_start = dinfo->mmio_base_phys; in intelfb_set_fbinfo()
1115 info->fix.mmio_len = INTEL_REG_SIZE; in intelfb_set_fbinfo()
1116 info->fix.accel = FB_ACCEL_I830; in intelfb_set_fbinfo()
1117 update_dinfo(dinfo, &info->var); in intelfb_set_fbinfo()
1128 dinfo->bpp = var->bits_per_pixel; in update_dinfo()
1129 dinfo->depth = intelfb_var_to_depth(var); in update_dinfo()
1130 dinfo->xres = var->xres; in update_dinfo()
1131 dinfo->yres = var->xres; in update_dinfo()
1132 dinfo->pixclock = var->pixclock; in update_dinfo()
1134 dinfo->info->fix.visual = dinfo->visual; in update_dinfo()
1135 dinfo->info->fix.line_length = dinfo->pitch; in update_dinfo()
1137 switch (dinfo->bpp) { in update_dinfo()
1138 case 8: in update_dinfo()
1139 dinfo->visual = FB_VISUAL_PSEUDOCOLOR; in update_dinfo()
1140 dinfo->pitch = var->xres_virtual; in update_dinfo()
1143 dinfo->visual = FB_VISUAL_TRUECOLOR; in update_dinfo()
1144 dinfo->pitch = var->xres_virtual * 2; in update_dinfo()
1147 dinfo->visual = FB_VISUAL_TRUECOLOR; in update_dinfo()
1148 dinfo->pitch = var->xres_virtual * 4; in update_dinfo()
1154 dinfo->pitch = ROUND_UP_TO(dinfo->pitch, STRIDE_ALIGNMENT_I9XX); in update_dinfo()
1156 dinfo->pitch = ROUND_UP_TO(dinfo->pitch, STRIDE_ALIGNMENT); in update_dinfo()
1159 dinfo->pitch = dinfo->initial_pitch; in update_dinfo()
1161 dinfo->info->screen_base = (char __iomem *)dinfo->fb.virtual; in update_dinfo()
1162 dinfo->info->fix.line_length = dinfo->pitch; in update_dinfo()
1163 dinfo->info->fix.visual = dinfo->visual; in update_dinfo()
1177 dinfo->open++; in intelfb_open()
1187 dinfo->open--; in intelfb_release()
1188 msleep(1); in intelfb_release()
1189 if (!dinfo->open) in intelfb_release()
1200 struct fb_var_screeninfo v; in intelfb_check_var() local
1202 static int first = 1; in intelfb_check_var()
1206 128 * 8, in intelfb_check_var()
1213 DBG_MSG("intelfb_check_var: accel_flags is %d\n", var->accel_flags); in intelfb_check_var()
1219 return -EINVAL; in intelfb_check_var()
1221 v = *var; in intelfb_check_var()
1224 if (pitches[i] >= v.xres_virtual) { in intelfb_check_var()
1225 v.xres_virtual = pitches[i]; in intelfb_check_var()
1231 if (v.bits_per_pixel <= 8) in intelfb_check_var()
1232 v.bits_per_pixel = 8; in intelfb_check_var()
1233 else if (v.bits_per_pixel <= 16) { in intelfb_check_var()
1234 if (v.bits_per_pixel == 16) in intelfb_check_var()
1235 v.green.length = 6; in intelfb_check_var()
1236 v.bits_per_pixel = 16; in intelfb_check_var()
1237 } else if (v.bits_per_pixel <= 32) in intelfb_check_var()
1238 v.bits_per_pixel = 32; in intelfb_check_var()
1240 return -EINVAL; in intelfb_check_var()
1242 change_var = ((info->var.xres != var->xres) || in intelfb_check_var()
1243 (info->var.yres != var->yres) || in intelfb_check_var()
1244 (info->var.xres_virtual != var->xres_virtual) || in intelfb_check_var()
1245 (info->var.yres_virtual != var->yres_virtual) || in intelfb_check_var()
1246 (info->var.bits_per_pixel != var->bits_per_pixel) || in intelfb_check_var()
1247 memcmp(&info->var.red, &var->red, sizeof(var->red)) || in intelfb_check_var()
1248 memcmp(&info->var.green, &var->green, in intelfb_check_var()
1249 sizeof(var->green)) || in intelfb_check_var()
1250 memcmp(&info->var.blue, &var->blue, sizeof(var->blue))); in intelfb_check_var()
1254 var->yres_virtual > dinfo->initial_var.yres_virtual || in intelfb_check_var()
1255 var->yres_virtual < dinfo->initial_var.yres || in intelfb_check_var()
1256 var->xoffset || var->nonstd)) { in intelfb_check_var()
1261 return -EINVAL; in intelfb_check_var()
1264 switch (intelfb_var_to_depth(&v)) { in intelfb_check_var()
1265 case 8: in intelfb_check_var()
1266 v.red.offset = v.green.offset = v.blue.offset = 0; in intelfb_check_var()
1267 v.red.length = v.green.length = v.blue.length = 8; in intelfb_check_var()
1268 v.transp.offset = v.transp.length = 0; in intelfb_check_var()
1271 v.red.offset = 10; in intelfb_check_var()
1272 v.green.offset = 5; in intelfb_check_var()
1273 v.blue.offset = 0; in intelfb_check_var()
1274 v.red.length = v.green.length = v.blue.length = 5; in intelfb_check_var()
1275 v.transp.offset = v.transp.length = 0; in intelfb_check_var()
1278 v.red.offset = 11; in intelfb_check_var()
1279 v.green.offset = 5; in intelfb_check_var()
1280 v.blue.offset = 0; in intelfb_check_var()
1281 v.red.length = 5; in intelfb_check_var()
1282 v.green.length = 6; in intelfb_check_var()
1283 v.blue.length = 5; in intelfb_check_var()
1284 v.transp.offset = v.transp.length = 0; in intelfb_check_var()
1287 v.red.offset = 16; in intelfb_check_var()
1288 v.green.offset = 8; in intelfb_check_var()
1289 v.blue.offset = 0; in intelfb_check_var()
1290 v.red.length = v.green.length = v.blue.length = 8; in intelfb_check_var()
1291 v.transp.offset = v.transp.length = 0; in intelfb_check_var()
1294 v.red.offset = 16; in intelfb_check_var()
1295 v.green.offset = 8; in intelfb_check_var()
1296 v.blue.offset = 0; in intelfb_check_var()
1297 v.red.length = v.green.length = v.blue.length = 8; in intelfb_check_var()
1298 v.transp.offset = 24; in intelfb_check_var()
1299 v.transp.length = 8; in intelfb_check_var()
1303 if (v.xoffset > v.xres_virtual - v.xres) in intelfb_check_var()
1304 v.xoffset = v.xres_virtual - v.xres; in intelfb_check_var()
1305 if (v.yoffset > v.yres_virtual - v.yres) in intelfb_check_var()
1306 v.yoffset = v.yres_virtual - v.yres; in intelfb_check_var()
1308 v.red.msb_right = v.green.msb_right = v.blue.msb_right = in intelfb_check_var()
1309 v.transp.msb_right = 0; in intelfb_check_var()
1311 *var = v; in intelfb_check_var()
1323 return -EINVAL; in intelfb_set_par()
1328 return -ENOMEM; in intelfb_set_par()
1330 DBG_MSG("intelfb_set_par (%dx%d-%d)\n", info->var.xres, in intelfb_set_par()
1331 info->var.yres, info->var.bits_per_pixel); in intelfb_set_par()
1343 memcpy(hw, &dinfo->save_state, sizeof(*hw)); in intelfb_set_par()
1344 if (intelfbhw_mode_to_hw(dinfo, hw, &info->var)) in intelfb_set_par()
1354 update_dinfo(dinfo, &info->var); in intelfb_set_par()
1359 intelfb_pan_display(&info->var, info); in intelfb_set_par()
1364 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN | in intelfb_set_par()
1368 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; in intelfb_set_par()
1374 return -EINVAL; in intelfb_set_par()
1384 DBG_MSG("intelfb_setcolreg: regno %d, depth %d\n", regno, dinfo->depth); in intelfb_setcolreg()
1388 return 1; in intelfb_setcolreg()
1390 if (dinfo->depth == 8) { in intelfb_setcolreg()
1391 red >>= 8; in intelfb_setcolreg()
1392 green >>= 8; in intelfb_setcolreg()
1393 blue >>= 8; in intelfb_setcolreg()
1400 switch (dinfo->depth) { in intelfb_setcolreg()
1402 dinfo->pseudo_palette[regno] = ((red & 0xf800) >> 1) | in intelfb_setcolreg()
1407 dinfo->pseudo_palette[regno] = (red & 0xf800) | in intelfb_setcolreg()
1412 dinfo->pseudo_palette[regno] = ((red & 0xff00) << 8) | in intelfb_setcolreg()
1414 ((blue & 0xff00) >> 8); in intelfb_setcolreg()
1446 return -EFAULT; in intelfb_ioctl()
1467 if (!ACCEL(dinfo, info) || dinfo->depth == 4) { in intelfb_fillrect()
1472 if (rect->rop == ROP_COPY) in intelfb_fillrect()
1477 if (dinfo->depth != 8) in intelfb_fillrect()
1478 color = dinfo->pseudo_palette[rect->color]; in intelfb_fillrect()
1480 color = rect->color; in intelfb_fillrect()
1482 intelfbhw_do_fillrect(dinfo, rect->dx, rect->dy, in intelfb_fillrect()
1483 rect->width, rect->height, color, in intelfb_fillrect()
1484 dinfo->pitch, info->var.bits_per_pixel, in intelfb_fillrect()
1497 if (!ACCEL(dinfo, info) || dinfo->depth == 4) { in intelfb_copyarea()
1502 intelfbhw_do_bitblt(dinfo, region->sx, region->sy, region->dx, in intelfb_copyarea()
1503 region->dy, region->width, region->height, in intelfb_copyarea()
1504 dinfo->pitch, info->var.bits_per_pixel); in intelfb_copyarea()
1517 if (!ACCEL(dinfo, info) || dinfo->depth == 4 in intelfb_imageblit()
1518 || image->depth != 1) { in intelfb_imageblit()
1523 if (dinfo->depth != 8) { in intelfb_imageblit()
1524 fgcolor = dinfo->pseudo_palette[image->fg_color]; in intelfb_imageblit()
1525 bgcolor = dinfo->pseudo_palette[image->bg_color]; in intelfb_imageblit()
1527 fgcolor = image->fg_color; in intelfb_imageblit()
1528 bgcolor = image->bg_color; in intelfb_imageblit()
1531 if (!intelfbhw_do_drawglyph(dinfo, fgcolor, bgcolor, image->width, in intelfb_imageblit()
1532 image->height, image->data, in intelfb_imageblit()
1533 image->dx, image->dy, in intelfb_imageblit()
1534 dinfo->pitch, info->var.bits_per_pixel)) { in intelfb_imageblit()
1548 if (!dinfo->hwcursor) in intelfb_cursor()
1549 return -ENODEV; in intelfb_cursor()
1553 /* If XFree killed the cursor - restore it */ in intelfb_cursor()
1554 physical = (dinfo->mobile || IS_I9XX(dinfo)) ? dinfo->cursor.physical : in intelfb_cursor()
1555 (dinfo->cursor.offset << 12); in intelfb_cursor()
1560 DBG_MSG("the cursor was killed - restore it !!\n"); in intelfb_cursor()
1562 cursor->image.width, cursor->image.height, in intelfb_cursor()
1563 cursor->image.dx, cursor->image.dy); in intelfb_cursor()
1567 intelfbhw_cursor_setpos(dinfo, cursor->image.dx, in intelfb_cursor()
1568 cursor->image.dy); in intelfb_cursor()
1570 if (dinfo->depth != 8) { in intelfb_cursor()
1571 fg =dinfo->pseudo_palette[cursor->image.fg_color]; in intelfb_cursor()
1572 bg =dinfo->pseudo_palette[cursor->image.bg_color]; in intelfb_cursor()
1574 fg = cursor->image.fg_color; in intelfb_cursor()
1575 bg = cursor->image.bg_color; in intelfb_cursor()
1578 intelfbhw_cursor_load(dinfo, cursor->image.width, in intelfb_cursor()
1579 cursor->image.height, in intelfb_cursor()
1580 dinfo->cursor_src); in intelfb_cursor()
1582 if (cursor->enable) in intelfb_cursor()
1587 if (cursor->set & FB_CUR_SETPOS) { in intelfb_cursor()
1590 dx = cursor->image.dx - info->var.xoffset; in intelfb_cursor()
1591 dy = cursor->image.dy - info->var.yoffset; in intelfb_cursor()
1596 if (cursor->set & FB_CUR_SETSIZE) { in intelfb_cursor()
1597 if (cursor->image.width > 64 || cursor->image.height > 64) in intelfb_cursor()
1598 return -ENXIO; in intelfb_cursor()
1603 if (cursor->set & FB_CUR_SETCMAP) { in intelfb_cursor()
1606 if (dinfo->depth != 8) { in intelfb_cursor()
1607 fg = dinfo->pseudo_palette[cursor->image.fg_color]; in intelfb_cursor()
1608 bg = dinfo->pseudo_palette[cursor->image.bg_color]; in intelfb_cursor()
1610 fg = cursor->image.fg_color; in intelfb_cursor()
1611 bg = cursor->image.bg_color; in intelfb_cursor()
1617 if (cursor->set & (FB_CUR_SETSHAPE | FB_CUR_SETIMAGE)) { in intelfb_cursor()
1618 u32 s_pitch = (ROUND_UP_TO(cursor->image.width, 8) / 8); in intelfb_cursor()
1619 u32 size = s_pitch * cursor->image.height; in intelfb_cursor()
1620 u8 *dat = (u8 *) cursor->image.data; in intelfb_cursor()
1621 u8 *msk = (u8 *) cursor->mask; in intelfb_cursor()
1625 if (cursor->image.depth != 1) in intelfb_cursor()
1626 return -ENXIO; in intelfb_cursor()
1628 switch (cursor->rop) { in intelfb_cursor()
1642 memcpy(dinfo->cursor_src, src, size); in intelfb_cursor()
1644 intelfbhw_cursor_load(dinfo, cursor->image.width, in intelfb_cursor()
1645 cursor->image.height, src); in intelfb_cursor()
1648 if (cursor->enable) in intelfb_cursor()
1662 if (dinfo->ring_lockup) in intelfb_sync()