Lines Matching refs:dinfo

131 static void get_initial_mode(struct intelfb_info *dinfo);
132 static void update_dinfo(struct intelfb_info *dinfo,
164 static int intelfb_set_fbinfo(struct intelfb_info *dinfo);
413 static void cleanup(struct intelfb_info *dinfo)
417 if (!dinfo)
420 intelfbhw_disable_irq(dinfo);
422 fb_dealloc_cmap(&dinfo->info->cmap);
423 kfree(dinfo->info->pixmap.addr);
425 if (dinfo->registered)
426 unregister_framebuffer(dinfo->info);
428 arch_phys_wc_del(dinfo->wc_cookie);
430 if (dinfo->fbmem_gart && dinfo->gtt_fb_mem) {
431 agp_unbind_memory(dinfo->gtt_fb_mem);
432 agp_free_memory(dinfo->gtt_fb_mem);
434 if (dinfo->gtt_cursor_mem) {
435 agp_unbind_memory(dinfo->gtt_cursor_mem);
436 agp_free_memory(dinfo->gtt_cursor_mem);
438 if (dinfo->gtt_ring_mem) {
439 agp_unbind_memory(dinfo->gtt_ring_mem);
440 agp_free_memory(dinfo->gtt_ring_mem);
445 intelfb_delete_i2c_busses(dinfo);
448 if (dinfo->mmio_base)
449 iounmap((void __iomem *)dinfo->mmio_base);
450 if (dinfo->aperture.virtual)
451 iounmap((void __iomem *)dinfo->aperture.virtual);
453 if (dinfo->flag & INTELFB_MMIO_ACQUIRED)
454 release_mem_region(dinfo->mmio_base_phys, INTEL_REG_SIZE);
455 if (dinfo->flag & INTELFB_FB_ACQUIRED)
456 release_mem_region(dinfo->aperture.physical,
457 dinfo->aperture.size);
458 framebuffer_release(dinfo->info);
461 #define bailout(dinfo) do { \
463 cleanup(dinfo); \
473 struct intelfb_info *dinfo;
502 dinfo = info->par;
503 dinfo->info = info;
504 dinfo->fbops = &intel_fb_ops;
505 dinfo->pdev = pdev;
516 dinfo->fixed_mode = fixed;
521 cleanup(dinfo);
537 dinfo->aperture.physical = pci_resource_start(pdev, aperture_bar);
538 dinfo->aperture.size = pci_resource_len(pdev, aperture_bar);
539 dinfo->mmio_base_phys = pci_resource_start(pdev, mmio_bar);
547 if (!request_mem_region(dinfo->aperture.physical, dinfo->aperture.size,
550 cleanup(dinfo);
554 dinfo->flag |= INTELFB_FB_ACQUIRED;
556 if (!request_mem_region(dinfo->mmio_base_phys,
560 cleanup(dinfo);
564 dinfo->flag |= INTELFB_MMIO_ACQUIRED;
567 dinfo->pci_chipset = pdev->device;
569 if (intelfbhw_get_chipset(pdev, dinfo)) {
570 cleanup(dinfo);
575 cleanup(dinfo);
582 PCI_FUNC(pdev->devfn), dinfo->name,
586 dinfo->accel = accel;
587 dinfo->hwcursor = hwcursor;
589 if (NOACCEL_CHIPSET(dinfo) && dinfo->accel == 1) {
591 dinfo->name);
592 dinfo->accel = 0;
597 dinfo->fb.size = ROUND_UP_TO_PAGE(stolen_size);
598 dinfo->fbmem_gart = 0;
600 dinfo->fb.size = MB(vram);
601 dinfo->fbmem_gart = 1;
605 if (dinfo->accel) {
606 dinfo->ring.size = RINGBUFFER_SIZE;
607 dinfo->ring_tail_mask = dinfo->ring.size - 1;
609 if (dinfo->hwcursor)
610 dinfo->cursor.size = HW_CURSOR_SIZE;
615 cleanup(dinfo);
623 cleanup(dinfo);
633 if (dinfo->accel)
634 dinfo->ring.offset = offset + gtt_info.current_memory;
635 if (dinfo->hwcursor)
636 dinfo->cursor.offset = offset +
637 + gtt_info.current_memory + (dinfo->ring.size >> 12);
638 if (dinfo->fbmem_gart)
639 dinfo->fb.offset = offset +
640 + gtt_info.current_memory + (dinfo->ring.size >> 12)
641 + (dinfo->cursor.size >> 12);
646 dinfo->aperture.virtual = (u8 __iomem *)ioremap_wc
647 (dinfo->aperture.physical, ((offset + dinfo->fb.offset) << 12)
648 + dinfo->fb.size);
649 if (!dinfo->aperture.virtual) {
652 cleanup(dinfo);
656 dinfo->mmio_base =
657 (u8 __iomem *)ioremap(dinfo->mmio_base_phys,
659 if (!dinfo->mmio_base) {
662 cleanup(dinfo);
666 if (dinfo->accel) {
667 if (!(dinfo->gtt_ring_mem =
668 agp_allocate_memory(bridge, dinfo->ring.size >> 12,
672 cleanup(dinfo);
675 if (agp_bind_memory(dinfo->gtt_ring_mem,
676 dinfo->ring.offset)) {
679 cleanup(dinfo);
682 dinfo->ring.physical = dinfo->aperture.physical
683 + (dinfo->ring.offset << 12);
684 dinfo->ring.virtual = dinfo->aperture.virtual
685 + (dinfo->ring.offset << 12);
686 dinfo->ring_head = 0;
688 if (dinfo->hwcursor) {
689 agp_memtype = dinfo->mobile ? AGP_PHYSICAL_MEMORY
691 if (!(dinfo->gtt_cursor_mem =
692 agp_allocate_memory(bridge, dinfo->cursor.size >> 12,
696 cleanup(dinfo);
699 if (agp_bind_memory(dinfo->gtt_cursor_mem,
700 dinfo->cursor.offset)) {
703 cleanup(dinfo);
706 if (dinfo->mobile)
707 dinfo->cursor.physical
708 = dinfo->gtt_cursor_mem->physical;
710 dinfo->cursor.physical = dinfo->aperture.physical
711 + (dinfo->cursor.offset << 12);
712 dinfo->cursor.virtual = dinfo->aperture.virtual
713 + (dinfo->cursor.offset << 12);
715 if (dinfo->fbmem_gart) {
716 if (!(dinfo->gtt_fb_mem =
717 agp_allocate_memory(bridge, dinfo->fb.size >> 12,
721 dinfo->fbmem_gart = 0;
723 if (agp_bind_memory(dinfo->gtt_fb_mem,
724 dinfo->fb.offset)) {
727 dinfo->fbmem_gart = 0;
732 if (!dinfo->fbmem_gart)
733 dinfo->fb.offset = 0; /* starts at offset 0 */
734 dinfo->fb.physical = dinfo->aperture.physical
735 + (dinfo->fb.offset << 12);
736 dinfo->fb.virtual = dinfo->aperture.virtual + (dinfo->fb.offset << 12);
737 dinfo->fb_start = dinfo->fb.offset << 12;
743 dinfo->wc_cookie = arch_phys_wc_add(dinfo->aperture.physical,
744 dinfo->aperture.size);
747 dinfo->fb.physical, dinfo->fb.offset, dinfo->fb.size,
748 dinfo->fb.virtual);
750 dinfo->mmio_base_phys, INTEL_REG_SIZE,
751 dinfo->mmio_base);
753 dinfo->ring.physical, dinfo->ring.size,
754 dinfo->ring.virtual);
756 dinfo->cursor.physical, dinfo->cursor.size,
757 dinfo->cursor.virtual, dinfo->cursor.offset,
758 dinfo->cursor.physical);
765 bailout(dinfo);
771 dvo = intelfbhw_check_non_crt(dinfo);
773 dinfo->fixed_mode = 1;
789 bailout(dinfo);
791 if (FIXED_MODE(dinfo) &&
794 cleanup(dinfo);
799 bailout(dinfo);
801 /* Initialise dinfo and related data. */
804 get_initial_mode(dinfo);
807 bailout(dinfo);
809 if (FIXED_MODE(dinfo)) /* remap fb address */
810 update_dinfo(dinfo, &dinfo->initial_var);
813 bailout(dinfo);
816 if (intelfb_set_fbinfo(dinfo)) {
817 cleanup(dinfo);
822 bailout(dinfo);
826 intelfb_create_i2c_busses(dinfo);
830 bailout(dinfo);
832 pci_set_drvdata(pdev, dinfo);
835 i = intelfbhw_read_hw_state(dinfo, &dinfo->save_state,
839 bailout(dinfo);
842 intelfbhw_print_hw_state(dinfo, &dinfo->save_state);
845 bailout(dinfo);
848 dinfo->pipe = intelfbhw_active_pipe(&dinfo->save_state);
851 if (dinfo->hwcursor) {
852 intelfbhw_cursor_init(dinfo);
853 intelfbhw_cursor_reset(dinfo);
857 bailout(dinfo);
860 if (dinfo->accel)
861 intelfbhw_2d_start(dinfo);
864 bailout(dinfo);
867 bailout(dinfo);
869 if (register_framebuffer(dinfo->info) < 0) {
871 cleanup(dinfo);
875 dinfo->registered = 1;
876 dinfo->open = 0;
878 init_waitqueue_head(&dinfo->vsync.wait);
879 spin_lock_init(&dinfo->int_lock);
880 dinfo->irq_flags = 0;
881 dinfo->vsync.pan_display = 0;
882 dinfo->vsync.pan_offset = 0;
895 struct intelfb_info *dinfo = pci_get_drvdata(pdev);
899 if (!dinfo)
902 cleanup(dinfo);
939 static void get_initial_mode(struct intelfb_info *dinfo)
946 dinfo->initial_vga = 1;
947 dinfo->initial_fb_base = screen_info.lfb_base;
948 dinfo->initial_video_ram = screen_info.lfb_size * KB(64);
949 dinfo->initial_pitch = screen_info.lfb_linelength;
951 var = &dinfo->initial_var;
966 dinfo->initial_fb_base, dinfo->initial_video_ram,
967 BtoKB(dinfo->initial_video_ram));
971 dinfo->initial_pitch);
1006 static int intelfb_init_var(struct intelfb_info *dinfo)
1013 var = &dinfo->info->var;
1014 if (FIXED_MODE(dinfo)) {
1015 memcpy(var, &dinfo->initial_var,
1019 const u8 *edid_s = fb_firmware_edid(&dinfo->pdev->dev);
1027 &dinfo->info->monspecs);
1035 msrc = fb_find_mode(var, dinfo->info, mode,
1036 dinfo->info->monspecs.modedb,
1037 dinfo->info->monspecs.modedb_len,
1044 msrc = fb_find_mode(var, dinfo->info, mode,
1054 msrc = fb_find_mode(var, dinfo->info, PREFERRED_MODE,
1072 dinfo->fb.size / 2 / (var->bits_per_pixel * var->xres);
1079 if (dinfo->accel)
1087 static int intelfb_set_fbinfo(struct intelfb_info *dinfo)
1089 struct fb_info *info = dinfo->info;
1095 info->pseudo_palette = dinfo->pseudo_palette;
1102 if (intelfb_init_var(dinfo))
1106 strcpy(info->fix.id, dinfo->name);
1107 info->fix.smem_start = dinfo->fb.physical;
1108 info->fix.smem_len = dinfo->fb.size;
1114 info->fix.mmio_start = dinfo->mmio_base_phys;
1117 update_dinfo(dinfo, &info->var);
1122 /* Update dinfo to match the active video mode. */
1123 static void update_dinfo(struct intelfb_info *dinfo,
1128 dinfo->bpp = var->bits_per_pixel;
1129 dinfo->depth = intelfb_var_to_depth(var);
1130 dinfo->xres = var->xres;
1131 dinfo->yres = var->xres;
1132 dinfo->pixclock = var->pixclock;
1134 dinfo->info->fix.visual = dinfo->visual;
1135 dinfo->info->fix.line_length = dinfo->pitch;
1137 switch (dinfo->bpp) {
1139 dinfo->visual = FB_VISUAL_PSEUDOCOLOR;
1140 dinfo->pitch = var->xres_virtual;
1143 dinfo->visual = FB_VISUAL_TRUECOLOR;
1144 dinfo->pitch = var->xres_virtual * 2;
1147 dinfo->visual = FB_VISUAL_TRUECOLOR;
1148 dinfo->pitch = var->xres_virtual * 4;
1153 if (IS_I9XX(dinfo))
1154 dinfo->pitch = ROUND_UP_TO(dinfo->pitch, STRIDE_ALIGNMENT_I9XX);
1156 dinfo->pitch = ROUND_UP_TO(dinfo->pitch, STRIDE_ALIGNMENT);
1158 if (FIXED_MODE(dinfo))
1159 dinfo->pitch = dinfo->initial_pitch;
1161 dinfo->info->screen_base = (char __iomem *)dinfo->fb.virtual;
1162 dinfo->info->fix.line_length = dinfo->pitch;
1163 dinfo->info->fix.visual = dinfo->visual;
1174 struct intelfb_info *dinfo = GET_DINFO(info);
1177 dinfo->open++;
1184 struct intelfb_info *dinfo = GET_DINFO(info);
1187 dinfo->open--;
1189 if (!dinfo->open)
1190 intelfbhw_disable_irq(dinfo);
1201 struct intelfb_info *dinfo;
1215 dinfo = GET_DINFO(info);
1221 if (intelfbhw_validate_mode(dinfo, var) != 0)
1255 if (FIXED_MODE(dinfo) &&
1257 var->yres_virtual > dinfo->initial_var.yres_virtual ||
1258 var->yres_virtual < dinfo->initial_var.yres ||
1322 struct intelfb_info *dinfo = GET_DINFO(info);
1324 if (FIXED_MODE(dinfo)) {
1343 if (ACCEL(dinfo, info))
1344 intelfbhw_2d_stop(dinfo);
1346 memcpy(hw, &dinfo->save_state, sizeof(*hw));
1347 if (intelfbhw_mode_to_hw(dinfo, hw, &info->var))
1349 if (intelfbhw_program_mode(dinfo, hw, 0))
1353 intelfbhw_read_hw_state(dinfo, hw, 0);
1354 intelfbhw_print_hw_state(dinfo, hw);
1357 update_dinfo(dinfo, &info->var);
1359 if (ACCEL(dinfo, info))
1360 intelfbhw_2d_start(dinfo);
1366 if (ACCEL(dinfo, info)) {
1384 struct intelfb_info *dinfo = GET_DINFO(info);
1387 DBG_MSG("intelfb_setcolreg: regno %d, depth %d\n", regno, dinfo->depth);
1393 if (dinfo->depth == 8) {
1398 intelfbhw_setcolreg(dinfo, regno, red, green, blue,
1403 switch (dinfo->depth) {
1405 dinfo->pseudo_palette[regno] = ((red & 0xf800) >> 1) |
1410 dinfo->pseudo_palette[regno] = (red & 0xf800) |
1415 dinfo->pseudo_palette[regno] = ((red & 0xff00) << 8) |
1443 struct intelfb_info *dinfo = GET_DINFO(info);
1451 retval = intelfbhw_wait_for_vsync(dinfo, pipe);
1463 struct intelfb_info *dinfo = GET_DINFO(info);
1470 if (!ACCEL(dinfo, info) || dinfo->depth == 4) {
1480 if (dinfo->depth != 8)
1481 color = dinfo->pseudo_palette[rect->color];
1485 intelfbhw_do_fillrect(dinfo, rect->dx, rect->dy,
1487 dinfo->pitch, info->var.bits_per_pixel,
1494 struct intelfb_info *dinfo = GET_DINFO(info);
1500 if (!ACCEL(dinfo, info) || dinfo->depth == 4) {
1505 intelfbhw_do_bitblt(dinfo, region->sx, region->sy, region->dx,
1507 dinfo->pitch, info->var.bits_per_pixel);
1513 struct intelfb_info *dinfo = GET_DINFO(info);
1520 if (!ACCEL(dinfo, info) || dinfo->depth == 4
1526 if (dinfo->depth != 8) {
1527 fgcolor = dinfo->pseudo_palette[image->fg_color];
1528 bgcolor = dinfo->pseudo_palette[image->bg_color];
1534 if (!intelfbhw_do_drawglyph(dinfo, fgcolor, bgcolor, image->width,
1537 dinfo->pitch, info->var.bits_per_pixel)) {
1545 struct intelfb_info *dinfo = GET_DINFO(info);
1551 if (!dinfo->hwcursor)
1554 intelfbhw_cursor_hide(dinfo);
1557 physical = (dinfo->mobile || IS_I9XX(dinfo)) ? dinfo->cursor.physical :
1558 (dinfo->cursor.offset << 12);
1568 intelfbhw_cursor_init(dinfo);
1569 intelfbhw_cursor_reset(dinfo);
1570 intelfbhw_cursor_setpos(dinfo, cursor->image.dx,
1573 if (dinfo->depth != 8) {
1574 fg =dinfo->pseudo_palette[cursor->image.fg_color];
1575 bg =dinfo->pseudo_palette[cursor->image.bg_color];
1580 intelfbhw_cursor_setcolor(dinfo, bg, fg);
1581 intelfbhw_cursor_load(dinfo, cursor->image.width,
1583 dinfo->cursor_src);
1586 intelfbhw_cursor_show(dinfo);
1596 intelfbhw_cursor_setpos(dinfo, dx, dy);
1603 intelfbhw_cursor_reset(dinfo);
1609 if (dinfo->depth != 8) {
1610 fg = dinfo->pseudo_palette[cursor->image.fg_color];
1611 bg = dinfo->pseudo_palette[cursor->image.bg_color];
1617 intelfbhw_cursor_setcolor(dinfo, bg, fg);
1645 memcpy(dinfo->cursor_src, src, size);
1647 intelfbhw_cursor_load(dinfo, cursor->image.width,
1652 intelfbhw_cursor_show(dinfo);
1659 struct intelfb_info *dinfo = GET_DINFO(info);
1665 if (dinfo->ring_lockup)
1668 intelfbhw_do_sync(dinfo);