Lines Matching +full:simple +full:- +full:framebuffer

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2007-2011, Intel Corporation.
26 #include "framebuffer.h"
37 #define CMAP_TOHW(_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16)
43 struct psb_fbdev *fbdev = info->par; in psbfb_setcolreg()
44 struct drm_framebuffer *fb = fbdev->psb_fb_helper.fb; in psbfb_setcolreg()
48 return -ENOMEM; in psbfb_setcolreg()
53 red = CMAP_TOHW(red, info->var.red.length); in psbfb_setcolreg()
54 blue = CMAP_TOHW(blue, info->var.blue.length); in psbfb_setcolreg()
55 green = CMAP_TOHW(green, info->var.green.length); in psbfb_setcolreg()
56 transp = CMAP_TOHW(transp, info->var.transp.length); in psbfb_setcolreg()
58 v = (red << info->var.red.offset) | in psbfb_setcolreg()
59 (green << info->var.green.offset) | in psbfb_setcolreg()
60 (blue << info->var.blue.offset) | in psbfb_setcolreg()
61 (transp << info->var.transp.offset); in psbfb_setcolreg()
64 switch (fb->format->cpp[0] * 8) { in psbfb_setcolreg()
66 ((uint32_t *) info->pseudo_palette)[regno] = v; in psbfb_setcolreg()
70 ((uint32_t *) info->pseudo_palette)[regno] = v; in psbfb_setcolreg()
80 struct psb_fbdev *fbdev = info->par; in psbfb_pan()
81 struct psb_framebuffer *psbfb = &fbdev->pfb; in psbfb_pan()
82 struct drm_device *dev = psbfb->base.dev; in psbfb_pan()
83 struct gtt_range *gtt = to_gtt_range(psbfb->base.obj[0]); in psbfb_pan()
90 if (gtt->npage) { in psbfb_pan()
93 int pages = info->fix.line_length >> 12; in psbfb_pan()
94 psb_gtt_roll(dev, gtt, var->yoffset * pages); in psbfb_pan()
101 struct vm_area_struct *vma = vmf->vma; in psbfb_vm_fault()
102 struct psb_framebuffer *psbfb = vma->vm_private_data; in psbfb_vm_fault()
103 struct drm_device *dev = psbfb->base.dev; in psbfb_vm_fault()
104 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_vm_fault()
105 struct gtt_range *gtt = to_gtt_range(psbfb->base.obj[0]); in psbfb_vm_fault()
111 unsigned long phys_addr = (unsigned long)dev_priv->stolen_base + in psbfb_vm_fault()
112 gtt->offset; in psbfb_vm_fault()
115 address = vmf->address - (vmf->pgoff << PAGE_SHIFT); in psbfb_vm_fault()
117 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); in psbfb_vm_fault()
148 struct psb_fbdev *fbdev = info->par; in psbfb_mmap()
149 struct psb_framebuffer *psbfb = &fbdev->pfb; in psbfb_mmap()
151 if (vma->vm_pgoff != 0) in psbfb_mmap()
152 return -EINVAL; in psbfb_mmap()
153 if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) in psbfb_mmap()
154 return -EINVAL; in psbfb_mmap()
156 if (!psbfb->addr_space) in psbfb_mmap()
157 psbfb->addr_space = vma->vm_file->f_mapping; in psbfb_mmap()
159 * If this is a GEM object then info->screen_base is the virtual in psbfb_mmap()
163 vma->vm_ops = &psbfb_vm_ops; in psbfb_mmap()
164 vma->vm_private_data = (void *)psbfb; in psbfb_mmap()
165 vma->vm_flags |= VM_IO | VM_MIXEDMAP | VM_DONTEXPAND | VM_DONTDUMP; in psbfb_mmap()
202 * psb_framebuffer_init - initialize a framebuffer
204 * @fb: framebuffer to set up
224 if (!info || !info->depth || info->cpp[0] > 4) in psb_framebuffer_init()
225 return -EINVAL; in psb_framebuffer_init()
227 if (mode_cmd->pitches[0] & 63) in psb_framebuffer_init()
228 return -EINVAL; in psb_framebuffer_init()
230 drm_helper_mode_fill_fb_struct(dev, &fb->base, mode_cmd); in psb_framebuffer_init()
231 fb->base.obj[0] = &gt->gem; in psb_framebuffer_init()
232 ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs); in psb_framebuffer_init()
234 dev_err(dev->dev, "framebuffer init failed: %d\n", ret); in psb_framebuffer_init()
241 * psb_framebuffer_create - create a framebuffer backed by gt
246 * Create a framebuffer object backed by the gt, and fill in the
262 return ERR_PTR(-ENOMEM); in psb_framebuffer_create()
269 return &fb->base; in psb_framebuffer_create()
273 * psbfb_alloc - allocate frame buffer memory
278 * is stolen memory backed and life is simple. If there isn't sufficient
282 * Re-address this as and if the framebuffer layer grows this ability.
290 drm_gem_private_object_init(dev, &backing->gem, aligned_size); in psbfb_alloc()
297 * psbfb_create - create a framebuffer
298 * @fbdev: the framebuffer device
301 * Create a framebuffer to the specifications provided
306 struct drm_device *dev = fbdev->psb_fb_helper.dev; in psbfb_create()
307 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_create()
310 struct psb_framebuffer *psbfb = &fbdev->pfb; in psbfb_create()
319 mode_cmd.width = sizes->surface_width; in psbfb_create()
320 mode_cmd.height = sizes->surface_height; in psbfb_create()
321 bpp = sizes->surface_bpp; in psbfb_create()
322 depth = sizes->surface_depth; in psbfb_create()
367 /* Allocate the framebuffer in the GTT with stolen page backing */ in psbfb_create()
370 return -ENOMEM; in psbfb_create()
373 memset(dev_priv->vram_addr + backing->offset, 0, size); in psbfb_create()
375 info = drm_fb_helper_alloc_fbi(&fbdev->psb_fb_helper); in psbfb_create()
387 fb = &psbfb->base; in psbfb_create()
388 psbfb->fbdev = info; in psbfb_create()
390 fbdev->psb_fb_helper.fb = fb; in psbfb_create()
392 if (dev_priv->ops->accel_2d && pitch_lines > 8) /* 2D engine */ in psbfb_create()
393 info->fbops = &psbfb_ops; in psbfb_create()
395 info->fbops = &psbfb_roll_ops; in psbfb_create()
396 info->flags |= FBINFO_HWACCEL_YPAN; in psbfb_create()
398 info->fbops = &psbfb_unaccel_ops; in psbfb_create()
400 info->fix.smem_start = dev->mode_config.fb_base; in psbfb_create()
401 info->fix.smem_len = size; in psbfb_create()
402 info->fix.ywrapstep = gtt_roll; in psbfb_create()
403 info->fix.ypanstep = 0; in psbfb_create()
406 info->screen_base = dev_priv->vram_addr + backing->offset; in psbfb_create()
407 info->screen_size = size; in psbfb_create()
409 if (dev_priv->gtt.stolen_size) { in psbfb_create()
410 info->apertures->ranges[0].base = dev->mode_config.fb_base; in psbfb_create()
411 info->apertures->ranges[0].size = dev_priv->gtt.stolen_size; in psbfb_create()
414 drm_fb_helper_fill_info(info, &fbdev->psb_fb_helper, sizes); in psbfb_create()
416 info->fix.mmio_start = pci_resource_start(dev->pdev, 0); in psbfb_create()
417 info->fix.mmio_len = pci_resource_len(dev->pdev, 0); in psbfb_create()
419 /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */ in psbfb_create()
421 dev_dbg(dev->dev, "allocated %dx%d fb\n", in psbfb_create()
422 psbfb->base.width, psbfb->base.height); in psbfb_create()
431 * psb_user_framebuffer_create - create framebuffer
436 * Create a new framebuffer backed by a userspace GEM object
449 obj = drm_gem_object_lookup(filp, cmd->handles[0]); in psb_user_framebuffer_create()
451 return ERR_PTR(-ENOENT); in psb_user_framebuffer_create()
463 struct drm_device *dev = psb_fbdev->psb_fb_helper.dev; in psbfb_probe()
464 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_probe()
467 bytespp = sizes->surface_bpp / 8; in psbfb_probe()
473 allocate its own 32bit GEM framebuffer */ in psbfb_probe()
474 if (ALIGN(sizes->fb_width * bytespp, 64) * sizes->fb_height > in psbfb_probe()
475 dev_priv->vram_stolen_size) { in psbfb_probe()
476 sizes->surface_bpp = 16; in psbfb_probe()
477 sizes->surface_depth = 16; in psbfb_probe()
489 struct psb_framebuffer *psbfb = &fbdev->pfb; in psb_fbdev_destroy()
491 drm_fb_helper_unregister_fbi(&fbdev->psb_fb_helper); in psb_fbdev_destroy()
493 drm_fb_helper_fini(&fbdev->psb_fb_helper); in psb_fbdev_destroy()
494 drm_framebuffer_unregister_private(&psbfb->base); in psb_fbdev_destroy()
495 drm_framebuffer_cleanup(&psbfb->base); in psb_fbdev_destroy()
497 if (psbfb->base.obj[0]) in psb_fbdev_destroy()
498 drm_gem_object_put_unlocked(psbfb->base.obj[0]); in psb_fbdev_destroy()
505 struct drm_psb_private *dev_priv = dev->dev_private; in psb_fbdev_init()
510 dev_err(dev->dev, "no memory\n"); in psb_fbdev_init()
511 return -ENOMEM; in psb_fbdev_init()
514 dev_priv->fbdev = fbdev; in psb_fbdev_init()
516 drm_fb_helper_prepare(dev, &fbdev->psb_fb_helper, &psb_fb_helper_funcs); in psb_fbdev_init()
518 ret = drm_fb_helper_init(dev, &fbdev->psb_fb_helper, in psb_fbdev_init()
523 ret = drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper); in psb_fbdev_init()
530 ret = drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32); in psb_fbdev_init()
537 drm_fb_helper_fini(&fbdev->psb_fb_helper); in psb_fbdev_init()
545 struct drm_psb_private *dev_priv = dev->dev_private; in psb_fbdev_fini()
547 if (!dev_priv->fbdev) in psb_fbdev_fini()
550 psb_fbdev_destroy(dev, dev_priv->fbdev); in psb_fbdev_fini()
551 kfree(dev_priv->fbdev); in psb_fbdev_fini()
552 dev_priv->fbdev = NULL; in psb_fbdev_fini()
562 struct drm_psb_private *dev_priv = dev->dev_private; in psb_setup_outputs()
567 /* It is ok for this to fail - we just don't get backlight control */ in psb_setup_outputs()
568 if (!dev_priv->backlight_property) in psb_setup_outputs()
569 dev_priv->backlight_property = drm_property_create_range(dev, 0, in psb_setup_outputs()
571 dev_priv->ops->output_init(dev); in psb_setup_outputs()
573 list_for_each_entry(connector, &dev->mode_config.connector_list, in psb_setup_outputs()
576 struct drm_encoder *encoder = &gma_encoder->base; in psb_setup_outputs()
580 switch (gma_encoder->type) { in psb_setup_outputs()
586 crtc_mask = dev_priv->ops->sdvo_mask; in psb_setup_outputs()
590 crtc_mask = dev_priv->ops->lvds_mask; in psb_setup_outputs()
602 crtc_mask = dev_priv->ops->hdmi_mask; in psb_setup_outputs()
613 encoder->possible_crtcs = crtc_mask; in psb_setup_outputs()
614 encoder->possible_clones = in psb_setup_outputs()
621 struct drm_psb_private *dev_priv = dev->dev_private; in psb_modeset_init()
622 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; in psb_modeset_init()
627 dev->mode_config.min_width = 0; in psb_modeset_init()
628 dev->mode_config.min_height = 0; in psb_modeset_init()
630 dev->mode_config.funcs = &psb_mode_funcs; in psb_modeset_init()
634 pci_read_config_dword(dev->pdev, PSB_BSM, (u32 *) in psb_modeset_init()
635 &(dev->mode_config.fb_base)); in psb_modeset_init()
638 for (i = 0; i < dev_priv->num_pipe; i++) in psb_modeset_init()
641 dev->mode_config.max_width = 4096; in psb_modeset_init()
642 dev->mode_config.max_height = 4096; in psb_modeset_init()
646 if (dev_priv->ops->errata) in psb_modeset_init()
647 dev_priv->ops->errata(dev); in psb_modeset_init()
649 dev_priv->modeset = true; in psb_modeset_init()
654 struct drm_psb_private *dev_priv = dev->dev_private; in psb_modeset_cleanup()
655 if (dev_priv->modeset) { in psb_modeset_cleanup()