mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 21:02:19 +00:00
c8b75bca92
This is enough for fbcon and bringing up X using xf86-video-modesetting. It doesn't support the 3D accelerator or power management yet. v2: Drop FB_HELPER select thanks to Archit's patches. Do manual init ordering instead of using the .load hook. Structure registration more like tegra's, but still using the typical "component" code. Drop no-op hooks for atomic_begin and mode_fixup() now that they're optional. Drop sentinel in Makefile. Fix minor style nits I noticed on another reread. v3: Use the new bcm2835 clk driver to manage pixel/HSM clocks instead of having a fixed video mode. Use exynos-style component driver matching instead of devicetree nodes to list the component driver instances. Rename compatibility strings to say bcm2835, and distinguish pv0/1/2. Clean up some h/vsync code, and add in interlaced mode setup. Fix up probe/bind error paths. Use bitops.h macros for vc4_regs.h v4: Include i2c.h, allow building under COMPILE_TEST, drop msleep now that other bugs have been fixed, add timeouts to cpu_relax() loops, rename hpd-gpio to hpd-gpios. Signed-off-by: Eric Anholt <eric@anholt.net> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
53 lines
1.3 KiB
C
53 lines
1.3 KiB
C
/*
|
|
* Copyright © 2015 Broadcom
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
/* DOC: VC4 GEM BO management support.
|
|
*
|
|
* The VC4 GPU architecture (both scanout and rendering) has direct
|
|
* access to system memory with no MMU in between. To support it, we
|
|
* use the GEM CMA helper functions to allocate contiguous ranges of
|
|
* physical memory for our BOs.
|
|
*/
|
|
|
|
#include "vc4_drv.h"
|
|
|
|
struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t size)
|
|
{
|
|
struct drm_gem_cma_object *cma_obj;
|
|
|
|
cma_obj = drm_gem_cma_create(dev, size);
|
|
if (IS_ERR(cma_obj))
|
|
return NULL;
|
|
else
|
|
return to_vc4_bo(&cma_obj->base);
|
|
}
|
|
|
|
int vc4_dumb_create(struct drm_file *file_priv,
|
|
struct drm_device *dev,
|
|
struct drm_mode_create_dumb *args)
|
|
{
|
|
int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
|
|
struct vc4_bo *bo = NULL;
|
|
int ret;
|
|
|
|
if (args->pitch < min_pitch)
|
|
args->pitch = min_pitch;
|
|
|
|
if (args->size < args->pitch * args->height)
|
|
args->size = args->pitch * args->height;
|
|
|
|
bo = vc4_bo_create(dev, roundup(args->size, PAGE_SIZE));
|
|
if (!bo)
|
|
return -ENOMEM;
|
|
|
|
ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
|
|
drm_gem_object_unreference_unlocked(&bo->base.base);
|
|
|
|
return ret;
|
|
}
|