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 drm_fb_helper *fb_helper = info->par; in psbfb_setcolreg()
44 struct drm_framebuffer *fb = 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 drm_fb_helper *fb_helper = info->par; in psbfb_pan()
81 struct drm_framebuffer *fb = fb_helper->fb; in psbfb_pan()
82 struct drm_device *dev = fb->dev; in psbfb_pan()
83 struct gtt_range *gtt = to_gtt_range(fb->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 drm_framebuffer *fb = vma->vm_private_data; in psbfb_vm_fault()
103 struct drm_device *dev = fb->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(fb->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 drm_fb_helper *fb_helper = info->par; in psbfb_mmap()
149 struct drm_framebuffer *fb = fb_helper->fb; 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()
157 * If this is a GEM object then info->screen_base is the virtual in psbfb_mmap()
161 vma->vm_ops = &psbfb_vm_ops; in psbfb_mmap()
162 vma->vm_private_data = (void *)fb; in psbfb_mmap()
163 vma->vm_flags |= VM_IO | VM_MIXEDMAP | VM_DONTEXPAND | VM_DONTDUMP; in psbfb_mmap()
200 * psb_framebuffer_init - initialize a framebuffer
202 * @fb: framebuffer to set up
222 if (!info || !info->depth || info->cpp[0] > 4) in psb_framebuffer_init()
223 return -EINVAL; in psb_framebuffer_init()
225 if (mode_cmd->pitches[0] & 63) in psb_framebuffer_init()
226 return -EINVAL; in psb_framebuffer_init()
229 fb->obj[0] = obj; in psb_framebuffer_init()
232 dev_err(dev->dev, "framebuffer init failed: %d\n", ret); in psb_framebuffer_init()
239 * psb_framebuffer_create - create a framebuffer backed by gt
244 * Create a framebuffer object backed by the gt, and fill in the
260 return ERR_PTR(-ENOMEM); in psb_framebuffer_create()
271 * psbfb_alloc - allocate frame buffer memory
276 * is stolen memory backed and life is simple. If there isn't sufficient
280 * Re-address this as and if the framebuffer layer grows this ability.
288 drm_gem_private_object_init(dev, &backing->gem, aligned_size); in psbfb_alloc()
295 * psbfb_create - create a framebuffer
296 * @fbdev: the framebuffer device
299 * Create a framebuffer to the specifications provided
304 struct drm_device *dev = fb_helper->dev; in psbfb_create()
305 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_create()
316 mode_cmd.width = sizes->surface_width; in psbfb_create()
317 mode_cmd.height = sizes->surface_height; in psbfb_create()
318 bpp = sizes->surface_bpp; in psbfb_create()
319 depth = sizes->surface_depth; in psbfb_create()
364 /* Allocate the framebuffer in the GTT with stolen page backing */ in psbfb_create()
367 return -ENOMEM; in psbfb_create()
370 memset(dev_priv->vram_addr + backing->offset, 0, size); in psbfb_create()
380 fb = psb_framebuffer_create(dev, &mode_cmd, &backing->gem); in psbfb_create()
386 fb_helper->fb = fb; in psbfb_create()
388 if (dev_priv->ops->accel_2d && pitch_lines > 8) /* 2D engine */ in psbfb_create()
389 info->fbops = &psbfb_ops; in psbfb_create()
391 info->fbops = &psbfb_roll_ops; in psbfb_create()
392 info->flags |= FBINFO_HWACCEL_YPAN; in psbfb_create()
394 info->fbops = &psbfb_unaccel_ops; in psbfb_create()
396 info->fix.smem_start = dev->mode_config.fb_base; in psbfb_create()
397 info->fix.smem_len = size; in psbfb_create()
398 info->fix.ywrapstep = gtt_roll; in psbfb_create()
399 info->fix.ypanstep = 0; in psbfb_create()
402 info->screen_base = dev_priv->vram_addr + backing->offset; in psbfb_create()
403 info->screen_size = size; in psbfb_create()
405 if (dev_priv->gtt.stolen_size) { in psbfb_create()
406 info->apertures->ranges[0].base = dev->mode_config.fb_base; in psbfb_create()
407 info->apertures->ranges[0].size = dev_priv->gtt.stolen_size; in psbfb_create()
412 info->fix.mmio_start = pci_resource_start(dev->pdev, 0); in psbfb_create()
413 info->fix.mmio_len = pci_resource_len(dev->pdev, 0); in psbfb_create()
415 /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */ in psbfb_create()
417 dev_dbg(dev->dev, "allocated %dx%d fb\n", fb->width, fb->height); in psbfb_create()
426 * psb_user_framebuffer_create - create framebuffer
431 * Create a new framebuffer backed by a userspace GEM object
443 obj = drm_gem_object_lookup(filp, cmd->handles[0]); in psb_user_framebuffer_create()
445 return ERR_PTR(-ENOENT); in psb_user_framebuffer_create()
454 struct drm_device *dev = fb_helper->dev; in psbfb_probe()
455 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_probe()
459 bytespp = sizes->surface_bpp / 8; in psbfb_probe()
465 allocate its own 32bit GEM framebuffer */ in psbfb_probe()
466 fb_size = ALIGN(sizes->surface_width * bytespp, 64) * in psbfb_probe()
467 sizes->surface_height; in psbfb_probe()
470 if (fb_size > dev_priv->vram_stolen_size) { in psbfb_probe()
471 sizes->surface_bpp = 16; in psbfb_probe()
472 sizes->surface_depth = 16; in psbfb_probe()
485 struct drm_framebuffer *fb = fb_helper->fb; in psb_fbdev_destroy()
493 if (fb->obj[0]) in psb_fbdev_destroy()
494 drm_gem_object_put(fb->obj[0]); in psb_fbdev_destroy()
503 struct drm_psb_private *dev_priv = dev->dev_private; in psb_fbdev_init()
508 dev_err(dev->dev, "no memory\n"); in psb_fbdev_init()
509 return -ENOMEM; in psb_fbdev_init()
512 dev_priv->fb_helper = fb_helper; in psb_fbdev_init()
538 struct drm_psb_private *dev_priv = dev->dev_private; in psb_fbdev_fini()
540 if (!dev_priv->fb_helper) in psb_fbdev_fini()
543 psb_fbdev_destroy(dev, dev_priv->fb_helper); in psb_fbdev_fini()
544 kfree(dev_priv->fb_helper); in psb_fbdev_fini()
545 dev_priv->fb_helper = NULL; in psb_fbdev_fini()
555 struct drm_psb_private *dev_priv = dev->dev_private; in psb_setup_outputs()
560 /* It is ok for this to fail - we just don't get backlight control */ in psb_setup_outputs()
561 if (!dev_priv->backlight_property) in psb_setup_outputs()
562 dev_priv->backlight_property = drm_property_create_range(dev, 0, in psb_setup_outputs()
564 dev_priv->ops->output_init(dev); in psb_setup_outputs()
566 list_for_each_entry(connector, &dev->mode_config.connector_list, in psb_setup_outputs()
569 struct drm_encoder *encoder = &gma_encoder->base; in psb_setup_outputs()
573 switch (gma_encoder->type) { in psb_setup_outputs()
579 crtc_mask = dev_priv->ops->sdvo_mask; in psb_setup_outputs()
583 crtc_mask = dev_priv->ops->lvds_mask; in psb_setup_outputs()
595 crtc_mask = dev_priv->ops->hdmi_mask; in psb_setup_outputs()
606 encoder->possible_crtcs = crtc_mask; in psb_setup_outputs()
607 encoder->possible_clones = in psb_setup_outputs()
614 struct drm_psb_private *dev_priv = dev->dev_private; in psb_modeset_init()
615 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; in psb_modeset_init()
620 dev->mode_config.min_width = 0; in psb_modeset_init()
621 dev->mode_config.min_height = 0; in psb_modeset_init()
623 dev->mode_config.funcs = &psb_mode_funcs; in psb_modeset_init()
627 pci_read_config_dword(dev->pdev, PSB_BSM, (u32 *) in psb_modeset_init()
628 &(dev->mode_config.fb_base)); in psb_modeset_init()
631 for (i = 0; i < dev_priv->num_pipe; i++) in psb_modeset_init()
634 dev->mode_config.max_width = 4096; in psb_modeset_init()
635 dev->mode_config.max_height = 4096; in psb_modeset_init()
639 if (dev_priv->ops->errata) in psb_modeset_init()
640 dev_priv->ops->errata(dev); in psb_modeset_init()
642 dev_priv->modeset = true; in psb_modeset_init()
647 struct drm_psb_private *dev_priv = dev->dev_private; in psb_modeset_cleanup()
648 if (dev_priv->modeset) { in psb_modeset_cleanup()