Lines Matching +full:simple +full:- +full:framebuffer
2 * Copyright (c) 2007-2011, Intel Corporation.
16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
40 #include "framebuffer.h"
53 #define CMAP_TOHW(_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16)
59 struct psb_fbdev *fbdev = info->par; in psbfb_setcolreg()
60 struct drm_framebuffer *fb = fbdev->psb_fb_helper.fb; in psbfb_setcolreg()
64 return -ENOMEM; in psbfb_setcolreg()
69 red = CMAP_TOHW(red, info->var.red.length); in psbfb_setcolreg()
70 blue = CMAP_TOHW(blue, info->var.blue.length); in psbfb_setcolreg()
71 green = CMAP_TOHW(green, info->var.green.length); in psbfb_setcolreg()
72 transp = CMAP_TOHW(transp, info->var.transp.length); in psbfb_setcolreg()
74 v = (red << info->var.red.offset) | in psbfb_setcolreg()
75 (green << info->var.green.offset) | in psbfb_setcolreg()
76 (blue << info->var.blue.offset) | in psbfb_setcolreg()
77 (transp << info->var.transp.offset); in psbfb_setcolreg()
80 switch (fb->bits_per_pixel) { in psbfb_setcolreg()
82 ((uint32_t *) info->pseudo_palette)[regno] = v; in psbfb_setcolreg()
86 ((uint32_t *) info->pseudo_palette)[regno] = v; in psbfb_setcolreg()
96 struct psb_fbdev *fbdev = info->par; in psbfb_pan()
97 struct psb_framebuffer *psbfb = &fbdev->pfb; in psbfb_pan()
98 struct drm_device *dev = psbfb->base.dev; in psbfb_pan()
105 if (psbfb->gtt->npage) { in psbfb_pan()
108 int pages = info->fix.line_length >> 12; in psbfb_pan()
109 psb_gtt_roll(dev, psbfb->gtt, var->yoffset * pages); in psbfb_pan()
119 mutex_lock(&dev->mode_config.mutex); in psbfb_suspend()
120 list_for_each_entry(fb, &dev->mode_config.fb_list, head) { in psbfb_suspend()
122 struct fb_info *info = psbfb->fbdev; in psbfb_suspend()
126 mutex_unlock(&dev->mode_config.mutex); in psbfb_suspend()
135 mutex_lock(&dev->mode_config.mutex); in psbfb_resume()
136 list_for_each_entry(fb, &dev->mode_config.fb_list, head) { in psbfb_resume()
138 struct fb_info *info = psbfb->fbdev; in psbfb_resume()
142 mutex_unlock(&dev->mode_config.mutex); in psbfb_resume()
149 struct psb_framebuffer *psbfb = vma->vm_private_data; in psbfb_vm_fault()
150 struct drm_device *dev = psbfb->base.dev; in psbfb_vm_fault()
151 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_vm_fault()
158 unsigned long phys_addr = (unsigned long)dev_priv->stolen_base; in psbfb_vm_fault()
160 page_num = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; in psbfb_vm_fault()
161 address = (unsigned long)vmf->virtual_address; in psbfb_vm_fault()
163 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); in psbfb_vm_fault()
169 if (unlikely((ret == -EBUSY) || (ret != 0 && i > 0))) in psbfb_vm_fault()
172 ret = (ret == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS; in psbfb_vm_fault()
197 struct psb_fbdev *fbdev = info->par; in psbfb_mmap()
198 struct psb_framebuffer *psbfb = &fbdev->pfb; in psbfb_mmap()
200 if (vma->vm_pgoff != 0) in psbfb_mmap()
201 return -EINVAL; in psbfb_mmap()
202 if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) in psbfb_mmap()
203 return -EINVAL; in psbfb_mmap()
205 if (!psbfb->addr_space) in psbfb_mmap()
206 psbfb->addr_space = vma->vm_file->f_mapping; in psbfb_mmap()
208 * If this is a GEM object then info->screen_base is the virtual in psbfb_mmap()
212 vma->vm_ops = &psbfb_vm_ops; in psbfb_mmap()
213 vma->vm_private_data = (void *)psbfb; in psbfb_mmap()
214 vma->vm_flags |= VM_RESERVED | VM_IO | in psbfb_mmap()
222 return -ENOTTY; in psbfb_ioctl()
267 * psb_framebuffer_init - initialize a framebuffer
269 * @fb: framebuffer to set up
284 drm_fb_get_bpp_depth(mode_cmd->pixel_format, &depth, &bpp); in psb_framebuffer_init()
286 if (mode_cmd->pitches[0] & 63) in psb_framebuffer_init()
287 return -EINVAL; in psb_framebuffer_init()
295 return -EINVAL; in psb_framebuffer_init()
297 ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs); in psb_framebuffer_init()
299 dev_err(dev->dev, "framebuffer init failed: %d\n", ret); in psb_framebuffer_init()
302 drm_helper_mode_fill_fb_struct(&fb->base, mode_cmd); in psb_framebuffer_init()
303 fb->gtt = gt; in psb_framebuffer_init()
308 * psb_framebuffer_create - create a framebuffer backed by gt
313 * Create a framebuffer object backed by the gt, and fill in the
329 return ERR_PTR(-ENOMEM); in psb_framebuffer_create()
336 return &fb->base; in psb_framebuffer_create()
340 * psbfb_alloc - allocate frame buffer memory
346 * is stolen memory backed and life is simple. If there isn't sufficient
350 * Re-address this as and if the framebuffer layer grows this ability.
359 &backing->gem, aligned_size) == 0) in psbfb_alloc()
367 * psbfb_create - create a framebuffer
368 * @fbdev: the framebuffer device
371 * Create a framebuffer to the specifications provided
376 struct drm_device *dev = fbdev->psb_fb_helper.dev; in psbfb_create()
377 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_create()
380 struct psb_framebuffer *psbfb = &fbdev->pfb; in psbfb_create()
382 struct device *device = &dev->pdev->dev; in psbfb_create()
390 mode_cmd.width = sizes->surface_width; in psbfb_create()
391 mode_cmd.height = sizes->surface_height; in psbfb_create()
392 bpp = sizes->surface_bpp; in psbfb_create()
405 depth = sizes->surface_depth; in psbfb_create()
438 /* Allocate the framebuffer in the GTT with stolen page backing */ in psbfb_create()
441 return -ENOMEM; in psbfb_create()
444 mutex_lock(&dev->struct_mutex); in psbfb_create()
448 ret = -ENOMEM; in psbfb_create()
451 info->par = fbdev; in psbfb_create()
459 fb = &psbfb->base; in psbfb_create()
460 psbfb->fbdev = info; in psbfb_create()
462 fbdev->psb_fb_helper.fb = fb; in psbfb_create()
463 fbdev->psb_fb_helper.fbdev = info; in psbfb_create()
465 strcpy(info->fix.id, "psbfb"); in psbfb_create()
467 info->flags = FBINFO_DEFAULT; in psbfb_create()
468 if (dev_priv->ops->accel_2d && pitch_lines > 8) /* 2D engine */ in psbfb_create()
469 info->fbops = &psbfb_ops; in psbfb_create()
471 info->fbops = &psbfb_roll_ops; in psbfb_create()
472 info->flags |= FBINFO_HWACCEL_YPAN; in psbfb_create()
474 info->fbops = &psbfb_unaccel_ops; in psbfb_create()
476 ret = fb_alloc_cmap(&info->cmap, 256, 0); in psbfb_create()
478 ret = -ENOMEM; in psbfb_create()
482 info->fix.smem_start = dev->mode_config.fb_base; in psbfb_create()
483 info->fix.smem_len = size; in psbfb_create()
484 info->fix.ywrapstep = gtt_roll; in psbfb_create()
485 info->fix.ypanstep = 0; in psbfb_create()
488 info->screen_base = (char *)dev_priv->vram_addr + in psbfb_create()
489 backing->offset; in psbfb_create()
490 info->screen_size = size; in psbfb_create()
492 if (dev_priv->gtt.stolen_size) { in psbfb_create()
493 info->apertures = alloc_apertures(1); in psbfb_create()
494 if (!info->apertures) { in psbfb_create()
495 ret = -ENOMEM; in psbfb_create()
498 info->apertures->ranges[0].base = dev->mode_config.fb_base; in psbfb_create()
499 info->apertures->ranges[0].size = dev_priv->gtt.stolen_size; in psbfb_create()
502 drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth); in psbfb_create()
503 drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, in psbfb_create()
504 sizes->fb_width, sizes->fb_height); in psbfb_create()
506 info->fix.mmio_start = pci_resource_start(dev->pdev, 0); in psbfb_create()
507 info->fix.mmio_len = pci_resource_len(dev->pdev, 0); in psbfb_create()
509 info->pixmap.size = 64 * 1024; in psbfb_create()
510 info->pixmap.buf_align = 8; in psbfb_create()
511 info->pixmap.access_align = 32; in psbfb_create()
512 info->pixmap.flags = FB_PIXMAP_SYSTEM; in psbfb_create()
513 info->pixmap.scan_align = 1; in psbfb_create()
515 dev_info(dev->dev, "allocated %dx%d fb\n", in psbfb_create()
516 psbfb->base.width, psbfb->base.height); in psbfb_create()
518 mutex_unlock(&dev->struct_mutex); in psbfb_create()
521 if (backing->stolen) in psbfb_create()
524 drm_gem_object_unreference(&backing->gem); in psbfb_create()
526 mutex_unlock(&dev->struct_mutex); in psbfb_create()
532 * psb_user_framebuffer_create - create framebuffer
537 * Create a new framebuffer backed by a userspace GEM object
550 obj = drm_gem_object_lookup(dev, filp, cmd->handles[0]); in psb_user_framebuffer_create()
552 return ERR_PTR(-ENOENT); in psb_user_framebuffer_create()
576 if (!helper->fb) { in psbfb_probe()
594 struct psb_framebuffer *psbfb = &fbdev->pfb; in psb_fbdev_destroy()
596 if (fbdev->psb_fb_helper.fbdev) { in psb_fbdev_destroy()
597 info = fbdev->psb_fb_helper.fbdev; in psb_fbdev_destroy()
599 if (info->cmap.len) in psb_fbdev_destroy()
600 fb_dealloc_cmap(&info->cmap); in psb_fbdev_destroy()
603 drm_fb_helper_fini(&fbdev->psb_fb_helper); in psb_fbdev_destroy()
604 drm_framebuffer_cleanup(&psbfb->base); in psb_fbdev_destroy()
606 if (psbfb->gtt) in psb_fbdev_destroy()
607 drm_gem_object_unreference(&psbfb->gtt->gem); in psb_fbdev_destroy()
614 struct drm_psb_private *dev_priv = dev->dev_private; in psb_fbdev_init()
618 dev_err(dev->dev, "no memory\n"); in psb_fbdev_init()
619 return -ENOMEM; in psb_fbdev_init()
622 dev_priv->fbdev = fbdev; in psb_fbdev_init()
623 fbdev->psb_fb_helper.funcs = &psb_fb_helper_funcs; in psb_fbdev_init()
625 drm_fb_helper_init(dev, &fbdev->psb_fb_helper, dev_priv->ops->crtcs, in psb_fbdev_init()
628 drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper); in psb_fbdev_init()
629 drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32); in psb_fbdev_init()
635 struct drm_psb_private *dev_priv = dev->dev_private; in psb_fbdev_fini()
637 if (!dev_priv->fbdev) in psb_fbdev_fini()
640 psb_fbdev_destroy(dev, dev_priv->fbdev); in psb_fbdev_fini()
641 kfree(dev_priv->fbdev); in psb_fbdev_fini()
642 dev_priv->fbdev = NULL; in psb_fbdev_fini()
647 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_output_poll_changed()
648 struct psb_fbdev *fbdev = (struct psb_fbdev *)dev_priv->fbdev; in psbfb_output_poll_changed()
649 drm_fb_helper_hotplug_event(&fbdev->psb_fb_helper); in psbfb_output_poll_changed()
653 * psb_user_framebuffer_create_handle - add hamdle to a framebuffer
654 * @fb: framebuffer
658 * Our framebuffer object is a GTT range which also contains a GEM
667 struct gtt_range *r = psbfb->gtt; in psb_user_framebuffer_create_handle()
668 return drm_gem_handle_create(file_priv, &r->gem, handle); in psb_user_framebuffer_create_handle()
672 * psb_user_framebuffer_destroy - destruct user created fb
673 * @fb: framebuffer
681 struct gtt_range *r = psbfb->gtt; in psb_user_framebuffer_destroy()
682 struct drm_device *dev = fb->dev; in psb_user_framebuffer_destroy()
683 struct drm_psb_private *dev_priv = dev->dev_private; in psb_user_framebuffer_destroy()
684 struct psb_fbdev *fbdev = dev_priv->fbdev; in psb_user_framebuffer_destroy()
689 WARN_ON(r->stolen); in psb_user_framebuffer_destroy()
692 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) in psb_user_framebuffer_destroy()
693 if (crtc->fb == fb) in psb_user_framebuffer_destroy()
700 * we reset this framebuffer as if the user had forced a reset. in psb_user_framebuffer_destroy()
705 drm_fb_helper_restore_fbdev_mode(&fbdev->psb_fb_helper); in psb_user_framebuffer_destroy()
710 drm_gem_object_unreference_unlocked(&r->gem); in psb_user_framebuffer_destroy()
721 struct drm_psb_private *dev_priv = dev->dev_private; in psb_create_backlight_property()
724 if (dev_priv->backlight_property) in psb_create_backlight_property()
729 backlight->values[0] = 0; in psb_create_backlight_property()
730 backlight->values[1] = 100; in psb_create_backlight_property()
732 dev_priv->backlight_property = backlight; in psb_create_backlight_property()
739 struct drm_psb_private *dev_priv = dev->dev_private; in psb_setup_outputs()
745 dev_priv->ops->output_init(dev); in psb_setup_outputs()
747 list_for_each_entry(connector, &dev->mode_config.connector_list, in psb_setup_outputs()
751 struct drm_encoder *encoder = &psb_intel_encoder->base; in psb_setup_outputs()
755 switch (psb_intel_encoder->type) { in psb_setup_outputs()
787 encoder->possible_crtcs = crtc_mask; in psb_setup_outputs()
788 encoder->possible_clones = in psb_setup_outputs()
795 struct drm_psb_private *dev_priv = dev->dev_private; in psb_modeset_init()
796 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; in psb_modeset_init()
801 dev->mode_config.min_width = 0; in psb_modeset_init()
802 dev->mode_config.min_height = 0; in psb_modeset_init()
804 dev->mode_config.funcs = (void *) &psb_mode_funcs; in psb_modeset_init()
808 pci_read_config_dword(dev->pdev, PSB_BSM, (u32 *) in psb_modeset_init()
809 &(dev->mode_config.fb_base)); in psb_modeset_init()
812 for (i = 0; i < dev_priv->num_pipe; i++) in psb_modeset_init()
815 dev->mode_config.max_width = 2048; in psb_modeset_init()
816 dev->mode_config.max_height = 2048; in psb_modeset_init()
823 mutex_lock(&dev->struct_mutex); in psb_modeset_cleanup()
829 mutex_unlock(&dev->struct_mutex); in psb_modeset_cleanup()