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"
38 #define CMAP_TOHW(_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16)
44 struct drm_fb_helper *fb_helper = info->par; in psbfb_setcolreg()
45 struct drm_framebuffer *fb = fb_helper->fb; in psbfb_setcolreg()
49 return -ENOMEM; in psbfb_setcolreg()
54 red = CMAP_TOHW(red, info->var.red.length); in psbfb_setcolreg()
55 blue = CMAP_TOHW(blue, info->var.blue.length); in psbfb_setcolreg()
56 green = CMAP_TOHW(green, info->var.green.length); in psbfb_setcolreg()
57 transp = CMAP_TOHW(transp, info->var.transp.length); in psbfb_setcolreg()
59 v = (red << info->var.red.offset) | in psbfb_setcolreg()
60 (green << info->var.green.offset) | in psbfb_setcolreg()
61 (blue << info->var.blue.offset) | in psbfb_setcolreg()
62 (transp << info->var.transp.offset); in psbfb_setcolreg()
65 switch (fb->format->cpp[0] * 8) { in psbfb_setcolreg()
67 ((uint32_t *) info->pseudo_palette)[regno] = v; in psbfb_setcolreg()
71 ((uint32_t *) info->pseudo_palette)[regno] = v; in psbfb_setcolreg()
81 struct vm_area_struct *vma = vmf->vma; in psbfb_vm_fault()
82 struct drm_framebuffer *fb = vma->vm_private_data; in psbfb_vm_fault()
83 struct drm_device *dev = fb->dev; in psbfb_vm_fault()
84 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_vm_fault()
85 struct gtt_range *gtt = to_gtt_range(fb->obj[0]); in psbfb_vm_fault()
91 unsigned long phys_addr = (unsigned long)dev_priv->stolen_base + in psbfb_vm_fault()
92 gtt->offset; in psbfb_vm_fault()
95 address = vmf->address - (vmf->pgoff << PAGE_SHIFT); in psbfb_vm_fault()
97 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); in psbfb_vm_fault()
128 struct drm_fb_helper *fb_helper = info->par; in psbfb_mmap()
129 struct drm_framebuffer *fb = fb_helper->fb; in psbfb_mmap()
131 if (vma->vm_pgoff != 0) in psbfb_mmap()
132 return -EINVAL; in psbfb_mmap()
133 if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) in psbfb_mmap()
134 return -EINVAL; in psbfb_mmap()
137 * If this is a GEM object then info->screen_base is the virtual in psbfb_mmap()
141 vma->vm_ops = &psbfb_vm_ops; in psbfb_mmap()
142 vma->vm_private_data = (void *)fb; in psbfb_mmap()
143 vma->vm_flags |= VM_IO | VM_MIXEDMAP | VM_DONTEXPAND | VM_DONTDUMP; in psbfb_mmap()
158 * psb_framebuffer_init - initialize a framebuffer
160 * @fb: framebuffer to set up
180 if (!info || !info->depth || info->cpp[0] > 4) in psb_framebuffer_init()
181 return -EINVAL; in psb_framebuffer_init()
183 if (mode_cmd->pitches[0] & 63) in psb_framebuffer_init()
184 return -EINVAL; in psb_framebuffer_init()
187 fb->obj[0] = obj; in psb_framebuffer_init()
190 dev_err(dev->dev, "framebuffer init failed: %d\n", ret); in psb_framebuffer_init()
197 * psb_framebuffer_create - create a framebuffer backed by gt
202 * Create a framebuffer object backed by the gt, and fill in the
218 return ERR_PTR(-ENOMEM); in psb_framebuffer_create()
229 * psbfb_alloc - allocate frame buffer memory
234 * is stolen memory backed and life is simple. If there isn't sufficient
238 * Re-address this as and if the framebuffer layer grows this ability.
246 backing->gem.funcs = &psb_gem_object_funcs; in psbfb_alloc()
247 drm_gem_private_object_init(dev, &backing->gem, aligned_size); in psbfb_alloc()
254 * psbfb_create - create a framebuffer
255 * @fb_helper: the framebuffer helper
258 * Create a framebuffer to the specifications provided
263 struct drm_device *dev = fb_helper->dev; in psbfb_create()
264 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_create()
265 struct pci_dev *pdev = to_pci_dev(dev->dev); in psbfb_create()
274 mode_cmd.width = sizes->surface_width; in psbfb_create()
275 mode_cmd.height = sizes->surface_height; in psbfb_create()
276 bpp = sizes->surface_bpp; in psbfb_create()
277 depth = sizes->surface_depth; in psbfb_create()
288 /* Allocate the framebuffer in the GTT with stolen page backing */ in psbfb_create()
291 return -ENOMEM; in psbfb_create()
293 memset(dev_priv->vram_addr + backing->offset, 0, size); in psbfb_create()
303 fb = psb_framebuffer_create(dev, &mode_cmd, &backing->gem); in psbfb_create()
309 fb_helper->fb = fb; in psbfb_create()
311 info->fbops = &psbfb_unaccel_ops; in psbfb_create()
313 info->fix.smem_start = dev->mode_config.fb_base; in psbfb_create()
314 info->fix.smem_len = size; in psbfb_create()
315 info->fix.ywrapstep = 0; in psbfb_create()
316 info->fix.ypanstep = 0; in psbfb_create()
319 info->screen_base = dev_priv->vram_addr + backing->offset; in psbfb_create()
320 info->screen_size = size; in psbfb_create()
322 if (dev_priv->gtt.stolen_size) { in psbfb_create()
323 info->apertures->ranges[0].base = dev->mode_config.fb_base; in psbfb_create()
324 info->apertures->ranges[0].size = dev_priv->gtt.stolen_size; in psbfb_create()
329 info->fix.mmio_start = pci_resource_start(pdev, 0); in psbfb_create()
330 info->fix.mmio_len = pci_resource_len(pdev, 0); in psbfb_create()
332 /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */ in psbfb_create()
334 dev_dbg(dev->dev, "allocated %dx%d fb\n", fb->width, fb->height); in psbfb_create()
343 * psb_user_framebuffer_create - create framebuffer
348 * Create a new framebuffer backed by a userspace GEM object
361 obj = drm_gem_object_lookup(filp, cmd->handles[0]); in psb_user_framebuffer_create()
363 return ERR_PTR(-ENOENT); in psb_user_framebuffer_create()
376 struct drm_device *dev = fb_helper->dev; in psbfb_probe()
377 struct drm_psb_private *dev_priv = dev->dev_private; in psbfb_probe()
381 bytespp = sizes->surface_bpp / 8; in psbfb_probe()
387 allocate its own 32bit GEM framebuffer */ in psbfb_probe()
388 fb_size = ALIGN(sizes->surface_width * bytespp, 64) * in psbfb_probe()
389 sizes->surface_height; in psbfb_probe()
392 if (fb_size > dev_priv->vram_stolen_size) { in psbfb_probe()
393 sizes->surface_bpp = 16; in psbfb_probe()
394 sizes->surface_depth = 16; in psbfb_probe()
407 struct drm_framebuffer *fb = fb_helper->fb; in psb_fbdev_destroy()
415 if (fb->obj[0]) in psb_fbdev_destroy()
416 drm_gem_object_put(fb->obj[0]); in psb_fbdev_destroy()
425 struct drm_psb_private *dev_priv = dev->dev_private; in psb_fbdev_init()
430 dev_err(dev->dev, "no memory\n"); in psb_fbdev_init()
431 return -ENOMEM; in psb_fbdev_init()
434 dev_priv->fb_helper = fb_helper; in psb_fbdev_init()
460 struct drm_psb_private *dev_priv = dev->dev_private; in psb_fbdev_fini()
462 if (!dev_priv->fb_helper) in psb_fbdev_fini()
465 psb_fbdev_destroy(dev, dev_priv->fb_helper); in psb_fbdev_fini()
466 kfree(dev_priv->fb_helper); in psb_fbdev_fini()
467 dev_priv->fb_helper = NULL; in psb_fbdev_fini()
477 struct drm_psb_private *dev_priv = dev->dev_private; in psb_setup_outputs()
482 /* It is ok for this to fail - we just don't get backlight control */ in psb_setup_outputs()
483 if (!dev_priv->backlight_property) in psb_setup_outputs()
484 dev_priv->backlight_property = drm_property_create_range(dev, 0, in psb_setup_outputs()
486 dev_priv->ops->output_init(dev); in psb_setup_outputs()
488 list_for_each_entry(connector, &dev->mode_config.connector_list, in psb_setup_outputs()
491 struct drm_encoder *encoder = &gma_encoder->base; in psb_setup_outputs()
495 switch (gma_encoder->type) { in psb_setup_outputs()
501 crtc_mask = dev_priv->ops->sdvo_mask; in psb_setup_outputs()
505 crtc_mask = dev_priv->ops->lvds_mask; in psb_setup_outputs()
517 crtc_mask = dev_priv->ops->hdmi_mask; in psb_setup_outputs()
528 encoder->possible_crtcs = crtc_mask; in psb_setup_outputs()
529 encoder->possible_clones = in psb_setup_outputs()
536 struct drm_psb_private *dev_priv = dev->dev_private; in psb_modeset_init()
537 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; in psb_modeset_init()
538 struct pci_dev *pdev = to_pci_dev(dev->dev); in psb_modeset_init()
543 dev->mode_config.min_width = 0; in psb_modeset_init()
544 dev->mode_config.min_height = 0; in psb_modeset_init()
546 dev->mode_config.funcs = &psb_mode_funcs; in psb_modeset_init()
550 pci_read_config_dword(pdev, PSB_BSM, (u32 *)&(dev->mode_config.fb_base)); in psb_modeset_init()
553 for (i = 0; i < dev_priv->num_pipe; i++) in psb_modeset_init()
556 dev->mode_config.max_width = 4096; in psb_modeset_init()
557 dev->mode_config.max_height = 4096; in psb_modeset_init()
561 if (dev_priv->ops->errata) in psb_modeset_init()
562 dev_priv->ops->errata(dev); in psb_modeset_init()
564 dev_priv->modeset = true; in psb_modeset_init()
569 struct drm_psb_private *dev_priv = dev->dev_private; in psb_modeset_cleanup()
570 if (dev_priv->modeset) { in psb_modeset_cleanup()