Lines Matching refs:dinfo
132 static void get_initial_mode(struct intelfb_info *dinfo);
133 static void update_dinfo(struct intelfb_info *dinfo,
165 static int intelfb_set_fbinfo(struct intelfb_info *dinfo);
417 static void cleanup(struct intelfb_info *dinfo)
421 if (!dinfo)
424 intelfbhw_disable_irq(dinfo);
426 fb_dealloc_cmap(&dinfo->info->cmap);
427 kfree(dinfo->info->pixmap.addr);
429 if (dinfo->registered)
430 unregister_framebuffer(dinfo->info);
432 arch_phys_wc_del(dinfo->wc_cookie);
434 if (dinfo->fbmem_gart && dinfo->gtt_fb_mem) {
435 agp_unbind_memory(dinfo->gtt_fb_mem);
436 agp_free_memory(dinfo->gtt_fb_mem);
438 if (dinfo->gtt_cursor_mem) {
439 agp_unbind_memory(dinfo->gtt_cursor_mem);
440 agp_free_memory(dinfo->gtt_cursor_mem);
442 if (dinfo->gtt_ring_mem) {
443 agp_unbind_memory(dinfo->gtt_ring_mem);
444 agp_free_memory(dinfo->gtt_ring_mem);
449 intelfb_delete_i2c_busses(dinfo);
452 if (dinfo->mmio_base)
453 iounmap((void __iomem *)dinfo->mmio_base);
454 if (dinfo->aperture.virtual)
455 iounmap((void __iomem *)dinfo->aperture.virtual);
457 if (dinfo->flag & INTELFB_MMIO_ACQUIRED)
458 release_mem_region(dinfo->mmio_base_phys, INTEL_REG_SIZE);
459 if (dinfo->flag & INTELFB_FB_ACQUIRED)
460 release_mem_region(dinfo->aperture.physical,
461 dinfo->aperture.size);
462 framebuffer_release(dinfo->info);
465 #define bailout(dinfo) do { \
467 cleanup(dinfo); \
477 struct intelfb_info *dinfo;
510 dinfo = info->par;
511 dinfo->info = info;
512 dinfo->fbops = &intel_fb_ops;
513 dinfo->pdev = pdev;
524 dinfo->fixed_mode = fixed;
529 cleanup(dinfo);
545 dinfo->aperture.physical = pci_resource_start(pdev, aperture_bar);
546 dinfo->aperture.size = pci_resource_len(pdev, aperture_bar);
547 dinfo->mmio_base_phys = pci_resource_start(pdev, mmio_bar);
555 if (!request_mem_region(dinfo->aperture.physical, dinfo->aperture.size,
558 cleanup(dinfo);
562 dinfo->flag |= INTELFB_FB_ACQUIRED;
564 if (!request_mem_region(dinfo->mmio_base_phys,
568 cleanup(dinfo);
572 dinfo->flag |= INTELFB_MMIO_ACQUIRED;
575 dinfo->pci_chipset = pdev->device;
577 if (intelfbhw_get_chipset(pdev, dinfo)) {
578 cleanup(dinfo);
583 cleanup(dinfo);
590 PCI_FUNC(pdev->devfn), dinfo->name,
594 dinfo->accel = accel;
595 dinfo->hwcursor = hwcursor;
597 if (NOACCEL_CHIPSET(dinfo) && dinfo->accel == 1) {
599 dinfo->name);
600 dinfo->accel = 0;
605 dinfo->fb.size = ROUND_UP_TO_PAGE(stolen_size);
606 dinfo->fbmem_gart = 0;
608 dinfo->fb.size = MB(vram);
609 dinfo->fbmem_gart = 1;
613 if (dinfo->accel) {
614 dinfo->ring.size = RINGBUFFER_SIZE;
615 dinfo->ring_tail_mask = dinfo->ring.size - 1;
617 if (dinfo->hwcursor)
618 dinfo->cursor.size = HW_CURSOR_SIZE;
623 cleanup(dinfo);
631 cleanup(dinfo);
641 if (dinfo->accel)
642 dinfo->ring.offset = offset + gtt_info.current_memory;
643 if (dinfo->hwcursor)
644 dinfo->cursor.offset = offset +
645 + gtt_info.current_memory + (dinfo->ring.size >> 12);
646 if (dinfo->fbmem_gart)
647 dinfo->fb.offset = offset +
648 + gtt_info.current_memory + (dinfo->ring.size >> 12)
649 + (dinfo->cursor.size >> 12);
654 dinfo->aperture.virtual = (u8 __iomem *)ioremap_wc
655 (dinfo->aperture.physical, ((offset + dinfo->fb.offset) << 12)
656 + dinfo->fb.size);
657 if (!dinfo->aperture.virtual) {
660 cleanup(dinfo);
664 dinfo->mmio_base =
665 (u8 __iomem *)ioremap(dinfo->mmio_base_phys,
667 if (!dinfo->mmio_base) {
670 cleanup(dinfo);
674 if (dinfo->accel) {
675 if (!(dinfo->gtt_ring_mem =
676 agp_allocate_memory(bridge, dinfo->ring.size >> 12,
680 cleanup(dinfo);
683 if (agp_bind_memory(dinfo->gtt_ring_mem,
684 dinfo->ring.offset)) {
687 cleanup(dinfo);
690 dinfo->ring.physical = dinfo->aperture.physical
691 + (dinfo->ring.offset << 12);
692 dinfo->ring.virtual = dinfo->aperture.virtual
693 + (dinfo->ring.offset << 12);
694 dinfo->ring_head = 0;
696 if (dinfo->hwcursor) {
697 agp_memtype = dinfo->mobile ? AGP_PHYSICAL_MEMORY
699 if (!(dinfo->gtt_cursor_mem =
700 agp_allocate_memory(bridge, dinfo->cursor.size >> 12,
704 cleanup(dinfo);
707 if (agp_bind_memory(dinfo->gtt_cursor_mem,
708 dinfo->cursor.offset)) {
711 cleanup(dinfo);
714 if (dinfo->mobile)
715 dinfo->cursor.physical
716 = dinfo->gtt_cursor_mem->physical;
718 dinfo->cursor.physical = dinfo->aperture.physical
719 + (dinfo->cursor.offset << 12);
720 dinfo->cursor.virtual = dinfo->aperture.virtual
721 + (dinfo->cursor.offset << 12);
723 if (dinfo->fbmem_gart) {
724 if (!(dinfo->gtt_fb_mem =
725 agp_allocate_memory(bridge, dinfo->fb.size >> 12,
729 dinfo->fbmem_gart = 0;
731 if (agp_bind_memory(dinfo->gtt_fb_mem,
732 dinfo->fb.offset)) {
735 dinfo->fbmem_gart = 0;
740 if (!dinfo->fbmem_gart)
741 dinfo->fb.offset = 0; /* starts at offset 0 */
742 dinfo->fb.physical = dinfo->aperture.physical
743 + (dinfo->fb.offset << 12);
744 dinfo->fb.virtual = dinfo->aperture.virtual + (dinfo->fb.offset << 12);
745 dinfo->fb_start = dinfo->fb.offset << 12;
751 dinfo->wc_cookie = arch_phys_wc_add(dinfo->aperture.physical,
752 dinfo->aperture.size);
755 dinfo->fb.physical, dinfo->fb.offset, dinfo->fb.size,
756 dinfo->fb.virtual);
758 dinfo->mmio_base_phys, INTEL_REG_SIZE,
759 dinfo->mmio_base);
761 dinfo->ring.physical, dinfo->ring.size,
762 dinfo->ring.virtual);
764 dinfo->cursor.physical, dinfo->cursor.size,
765 dinfo->cursor.virtual, dinfo->cursor.offset,
766 dinfo->cursor.physical);
773 bailout(dinfo);
779 dvo = intelfbhw_check_non_crt(dinfo);
781 dinfo->fixed_mode = 1;
797 bailout(dinfo);
799 if (FIXED_MODE(dinfo) &&
802 cleanup(dinfo);
807 bailout(dinfo);
809 /* Initialise dinfo and related data. */
812 get_initial_mode(dinfo);
815 bailout(dinfo);
817 if (FIXED_MODE(dinfo)) /* remap fb address */
818 update_dinfo(dinfo, &dinfo->initial_var);
821 bailout(dinfo);
824 if (intelfb_set_fbinfo(dinfo)) {
825 cleanup(dinfo);
830 bailout(dinfo);
834 intelfb_create_i2c_busses(dinfo);
838 bailout(dinfo);
840 pci_set_drvdata(pdev, dinfo);
843 i = intelfbhw_read_hw_state(dinfo, &dinfo->save_state,
847 bailout(dinfo);
850 intelfbhw_print_hw_state(dinfo, &dinfo->save_state);
853 bailout(dinfo);
856 dinfo->pipe = intelfbhw_active_pipe(&dinfo->save_state);
859 if (dinfo->hwcursor) {
860 intelfbhw_cursor_init(dinfo);
861 intelfbhw_cursor_reset(dinfo);
865 bailout(dinfo);
868 if (dinfo->accel)
869 intelfbhw_2d_start(dinfo);
872 bailout(dinfo);
875 bailout(dinfo);
877 if (register_framebuffer(dinfo->info) < 0) {
879 cleanup(dinfo);
883 dinfo->registered = 1;
884 dinfo->open = 0;
886 init_waitqueue_head(&dinfo->vsync.wait);
887 spin_lock_init(&dinfo->int_lock);
888 dinfo->irq_flags = 0;
889 dinfo->vsync.pan_display = 0;
890 dinfo->vsync.pan_offset = 0;
903 struct intelfb_info *dinfo = pci_get_drvdata(pdev);
907 if (!dinfo)
910 cleanup(dinfo);
947 static void get_initial_mode(struct intelfb_info *dinfo)
954 dinfo->initial_vga = 1;
955 dinfo->initial_fb_base = screen_info.lfb_base;
956 dinfo->initial_video_ram = screen_info.lfb_size * KB(64);
957 dinfo->initial_pitch = screen_info.lfb_linelength;
959 var = &dinfo->initial_var;
974 dinfo->initial_fb_base, dinfo->initial_video_ram,
975 BtoKB(dinfo->initial_video_ram));
979 dinfo->initial_pitch);
1014 static int intelfb_init_var(struct intelfb_info *dinfo)
1021 var = &dinfo->info->var;
1022 if (FIXED_MODE(dinfo)) {
1023 memcpy(var, &dinfo->initial_var,
1027 const u8 *edid_s = fb_firmware_edid(&dinfo->pdev->dev);
1035 &dinfo->info->monspecs);
1043 msrc = fb_find_mode(var, dinfo->info, mode,
1044 dinfo->info->monspecs.modedb,
1045 dinfo->info->monspecs.modedb_len,
1052 msrc = fb_find_mode(var, dinfo->info, mode,
1062 msrc = fb_find_mode(var, dinfo->info, PREFERRED_MODE,
1080 dinfo->fb.size / 2 / (var->bits_per_pixel * var->xres);
1087 if (dinfo->accel)
1095 static int intelfb_set_fbinfo(struct intelfb_info *dinfo)
1097 struct fb_info *info = dinfo->info;
1102 info->pseudo_palette = dinfo->pseudo_palette;
1109 if (intelfb_init_var(dinfo))
1113 strcpy(info->fix.id, dinfo->name);
1114 info->fix.smem_start = dinfo->fb.physical;
1115 info->fix.smem_len = dinfo->fb.size;
1121 info->fix.mmio_start = dinfo->mmio_base_phys;
1124 update_dinfo(dinfo, &info->var);
1129 /* Update dinfo to match the active video mode. */
1130 static void update_dinfo(struct intelfb_info *dinfo,
1135 dinfo->bpp = var->bits_per_pixel;
1136 dinfo->depth = intelfb_var_to_depth(var);
1137 dinfo->xres = var->xres;
1138 dinfo->yres = var->xres;
1139 dinfo->pixclock = var->pixclock;
1141 dinfo->info->fix.visual = dinfo->visual;
1142 dinfo->info->fix.line_length = dinfo->pitch;
1144 switch (dinfo->bpp) {
1146 dinfo->visual = FB_VISUAL_PSEUDOCOLOR;
1147 dinfo->pitch = var->xres_virtual;
1150 dinfo->visual = FB_VISUAL_TRUECOLOR;
1151 dinfo->pitch = var->xres_virtual * 2;
1154 dinfo->visual = FB_VISUAL_TRUECOLOR;
1155 dinfo->pitch = var->xres_virtual * 4;
1160 if (IS_I9XX(dinfo))
1161 dinfo->pitch = ROUND_UP_TO(dinfo->pitch, STRIDE_ALIGNMENT_I9XX);
1163 dinfo->pitch = ROUND_UP_TO(dinfo->pitch, STRIDE_ALIGNMENT);
1165 if (FIXED_MODE(dinfo))
1166 dinfo->pitch = dinfo->initial_pitch;
1168 dinfo->info->screen_base = (char __iomem *)dinfo->fb.virtual;
1169 dinfo->info->fix.line_length = dinfo->pitch;
1170 dinfo->info->fix.visual = dinfo->visual;
1181 struct intelfb_info *dinfo = GET_DINFO(info);
1184 dinfo->open++;
1191 struct intelfb_info *dinfo = GET_DINFO(info);
1194 dinfo->open--;
1196 if (!dinfo->open)
1197 intelfbhw_disable_irq(dinfo);
1208 struct intelfb_info *dinfo;
1222 dinfo = GET_DINFO(info);
1228 if (intelfbhw_validate_mode(dinfo, var) != 0)
1262 if (FIXED_MODE(dinfo) &&
1264 var->yres_virtual > dinfo->initial_var.yres_virtual ||
1265 var->yres_virtual < dinfo->initial_var.yres ||
1329 struct intelfb_info *dinfo = GET_DINFO(info);
1331 if (FIXED_MODE(dinfo)) {
1350 if (ACCEL(dinfo, info))
1351 intelfbhw_2d_stop(dinfo);
1353 memcpy(hw, &dinfo->save_state, sizeof(*hw));
1354 if (intelfbhw_mode_to_hw(dinfo, hw, &info->var))
1356 if (intelfbhw_program_mode(dinfo, hw, 0))
1360 intelfbhw_read_hw_state(dinfo, hw, 0);
1361 intelfbhw_print_hw_state(dinfo, hw);
1364 update_dinfo(dinfo, &info->var);
1366 if (ACCEL(dinfo, info))
1367 intelfbhw_2d_start(dinfo);
1373 if (ACCEL(dinfo, info)) {
1391 struct intelfb_info *dinfo = GET_DINFO(info);
1394 DBG_MSG("intelfb_setcolreg: regno %d, depth %d\n", regno, dinfo->depth);
1400 if (dinfo->depth == 8) {
1405 intelfbhw_setcolreg(dinfo, regno, red, green, blue,
1410 switch (dinfo->depth) {
1412 dinfo->pseudo_palette[regno] = ((red & 0xf800) >> 1) |
1417 dinfo->pseudo_palette[regno] = (red & 0xf800) |
1422 dinfo->pseudo_palette[regno] = ((red & 0xff00) << 8) |
1450 struct intelfb_info *dinfo = GET_DINFO(info);
1458 retval = intelfbhw_wait_for_vsync(dinfo, pipe);
1470 struct intelfb_info *dinfo = GET_DINFO(info);
1477 if (!ACCEL(dinfo, info) || dinfo->depth == 4) {
1487 if (dinfo->depth != 8)
1488 color = dinfo->pseudo_palette[rect->color];
1492 intelfbhw_do_fillrect(dinfo, rect->dx, rect->dy,
1494 dinfo->pitch, info->var.bits_per_pixel,
1501 struct intelfb_info *dinfo = GET_DINFO(info);
1507 if (!ACCEL(dinfo, info) || dinfo->depth == 4) {
1512 intelfbhw_do_bitblt(dinfo, region->sx, region->sy, region->dx,
1514 dinfo->pitch, info->var.bits_per_pixel);
1520 struct intelfb_info *dinfo = GET_DINFO(info);
1527 if (!ACCEL(dinfo, info) || dinfo->depth == 4
1533 if (dinfo->depth != 8) {
1534 fgcolor = dinfo->pseudo_palette[image->fg_color];
1535 bgcolor = dinfo->pseudo_palette[image->bg_color];
1541 if (!intelfbhw_do_drawglyph(dinfo, fgcolor, bgcolor, image->width,
1544 dinfo->pitch, info->var.bits_per_pixel)) {
1552 struct intelfb_info *dinfo = GET_DINFO(info);
1558 if (!dinfo->hwcursor)
1561 intelfbhw_cursor_hide(dinfo);
1564 physical = (dinfo->mobile || IS_I9XX(dinfo)) ? dinfo->cursor.physical :
1565 (dinfo->cursor.offset << 12);
1575 intelfbhw_cursor_init(dinfo);
1576 intelfbhw_cursor_reset(dinfo);
1577 intelfbhw_cursor_setpos(dinfo, cursor->image.dx,
1580 if (dinfo->depth != 8) {
1581 fg =dinfo->pseudo_palette[cursor->image.fg_color];
1582 bg =dinfo->pseudo_palette[cursor->image.bg_color];
1587 intelfbhw_cursor_setcolor(dinfo, bg, fg);
1588 intelfbhw_cursor_load(dinfo, cursor->image.width,
1590 dinfo->cursor_src);
1593 intelfbhw_cursor_show(dinfo);
1603 intelfbhw_cursor_setpos(dinfo, dx, dy);
1610 intelfbhw_cursor_reset(dinfo);
1616 if (dinfo->depth != 8) {
1617 fg = dinfo->pseudo_palette[cursor->image.fg_color];
1618 bg = dinfo->pseudo_palette[cursor->image.bg_color];
1624 intelfbhw_cursor_setcolor(dinfo, bg, fg);
1652 memcpy(dinfo->cursor_src, src, size);
1654 intelfbhw_cursor_load(dinfo, cursor->image.width,
1659 intelfbhw_cursor_show(dinfo);
1666 struct intelfb_info *dinfo = GET_DINFO(info);
1672 if (dinfo->ring_lockup)
1675 intelfbhw_do_sync(dinfo);