Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /* exynos_drm_gem.h
0003  *
0004  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
0005  * Authoer: Inki Dae <inki.dae@samsung.com>
0006  */
0007 
0008 #ifndef _EXYNOS_DRM_GEM_H_
0009 #define _EXYNOS_DRM_GEM_H_
0010 
0011 #include <drm/drm_gem.h>
0012 #include <linux/mm_types.h>
0013 
0014 #define to_exynos_gem(x)    container_of(x, struct exynos_drm_gem, base)
0015 
0016 #define IS_NONCONTIG_BUFFER(f)      (f & EXYNOS_BO_NONCONTIG)
0017 
0018 /*
0019  * exynos drm buffer structure.
0020  *
0021  * @base: a gem object.
0022  *  - a new handle to this gem object would be created
0023  *  by drm_gem_handle_create().
0024  * @flags: indicate memory type to allocated buffer and cache attruibute.
0025  * @size: size requested from user, in bytes and this size is aligned
0026  *  in page unit.
0027  * @cookie: cookie returned by dma_alloc_attrs
0028  * @kvaddr: kernel virtual address to allocated memory region (for fbdev)
0029  * @dma_addr: bus address(accessed by dma) to allocated memory region.
0030  *  - this address could be physical address without IOMMU and
0031  *  device address with IOMMU.
0032  * @dma_attrs: attrs passed dma mapping framework
0033  * @sgt: Imported sg_table.
0034  *
0035  * P.S. this object would be transferred to user as kms_bo.handle so
0036  *  user can access the buffer through kms_bo.handle.
0037  */
0038 struct exynos_drm_gem {
0039     struct drm_gem_object   base;
0040     unsigned int        flags;
0041     unsigned long       size;
0042     void            *cookie;
0043     void            *kvaddr;
0044     dma_addr_t      dma_addr;
0045     unsigned long       dma_attrs;
0046     struct sg_table     *sgt;
0047 };
0048 
0049 /* destroy a buffer with gem object */
0050 void exynos_drm_gem_destroy(struct exynos_drm_gem *exynos_gem);
0051 
0052 /* create a new buffer with gem object */
0053 struct exynos_drm_gem *exynos_drm_gem_create(struct drm_device *dev,
0054                          unsigned int flags,
0055                          unsigned long size,
0056                          bool kvmap);
0057 
0058 /*
0059  * request gem object creation and buffer allocation as the size
0060  * that it is calculated with framebuffer information such as width,
0061  * height and bpp.
0062  */
0063 int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data,
0064                 struct drm_file *file_priv);
0065 
0066 /* get fake-offset of gem object that can be used with mmap. */
0067 int exynos_drm_gem_map_ioctl(struct drm_device *dev, void *data,
0068                  struct drm_file *file_priv);
0069 
0070 /*
0071  * get exynos drm object from gem handle, this function could be used for
0072  * other drivers such as 2d/3d acceleration drivers.
0073  * with this function call, gem object reference count would be increased.
0074  */
0075 struct exynos_drm_gem *exynos_drm_gem_get(struct drm_file *filp,
0076                       unsigned int gem_handle);
0077 
0078 /*
0079  * put exynos drm object acquired from exynos_drm_gem_get(),
0080  * gem object reference count would be decreased.
0081  */
0082 static inline void exynos_drm_gem_put(struct exynos_drm_gem *exynos_gem)
0083 {
0084     drm_gem_object_put(&exynos_gem->base);
0085 }
0086 
0087 /* get buffer information to memory region allocated by gem. */
0088 int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data,
0089                       struct drm_file *file_priv);
0090 
0091 /* free gem object. */
0092 void exynos_drm_gem_free_object(struct drm_gem_object *obj);
0093 
0094 /* create memory region for drm framebuffer. */
0095 int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
0096                    struct drm_device *dev,
0097                    struct drm_mode_create_dumb *args);
0098 
0099 /* low-level interface prime helpers */
0100 struct drm_gem_object *exynos_drm_gem_prime_import(struct drm_device *dev,
0101                         struct dma_buf *dma_buf);
0102 struct sg_table *exynos_drm_gem_prime_get_sg_table(struct drm_gem_object *obj);
0103 struct drm_gem_object *
0104 exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,
0105                      struct dma_buf_attachment *attach,
0106                      struct sg_table *sgt);
0107 
0108 #endif