linux/drivers/gpu/drm/panfrost/panfrost_gem.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Copyright 2019 Linaro, Ltd, Rob Herring <robh@kernel.org> */
   3
   4#ifndef __PANFROST_GEM_H__
   5#define __PANFROST_GEM_H__
   6
   7#include <drm/drm_gem_shmem_helper.h>
   8#include <drm/drm_mm.h>
   9
  10struct panfrost_mmu;
  11
  12struct panfrost_gem_object {
  13        struct drm_gem_shmem_object base;
  14        struct sg_table *sgts;
  15
  16        /*
  17         * Use a list for now. If searching a mapping ever becomes the
  18         * bottleneck, we should consider using an RB-tree, or even better,
  19         * let the core store drm_gem_object_mapping entries (where we
  20         * could place driver specific data) instead of drm_gem_object ones
  21         * in its drm_file->object_idr table.
  22         *
  23         * struct drm_gem_object_mapping {
  24         *      struct drm_gem_object *obj;
  25         *      void *driver_priv;
  26         * };
  27         */
  28        struct {
  29                struct list_head list;
  30                struct mutex lock;
  31        } mappings;
  32
  33        /*
  34         * Count the number of jobs referencing this BO so we don't let the
  35         * shrinker reclaim this object prematurely.
  36         */
  37        atomic_t gpu_usecount;
  38
  39        bool noexec             :1;
  40        bool is_heap            :1;
  41};
  42
  43struct panfrost_gem_mapping {
  44        struct list_head node;
  45        struct kref refcount;
  46        struct panfrost_gem_object *obj;
  47        struct drm_mm_node mmnode;
  48        struct panfrost_mmu *mmu;
  49        bool active             :1;
  50};
  51
  52static inline
  53struct  panfrost_gem_object *to_panfrost_bo(struct drm_gem_object *obj)
  54{
  55        return container_of(to_drm_gem_shmem_obj(obj), struct panfrost_gem_object, base);
  56}
  57
  58static inline struct panfrost_gem_mapping *
  59drm_mm_node_to_panfrost_mapping(struct drm_mm_node *node)
  60{
  61        return container_of(node, struct panfrost_gem_mapping, mmnode);
  62}
  63
  64struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t size);
  65
  66struct drm_gem_object *
  67panfrost_gem_prime_import_sg_table(struct drm_device *dev,
  68                                   struct dma_buf_attachment *attach,
  69                                   struct sg_table *sgt);
  70
  71struct panfrost_gem_object *
  72panfrost_gem_create_with_handle(struct drm_file *file_priv,
  73                                struct drm_device *dev, size_t size,
  74                                u32 flags,
  75                                uint32_t *handle);
  76
  77int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv);
  78void panfrost_gem_close(struct drm_gem_object *obj,
  79                        struct drm_file *file_priv);
  80
  81struct panfrost_gem_mapping *
  82panfrost_gem_mapping_get(struct panfrost_gem_object *bo,
  83                         struct panfrost_file_priv *priv);
  84void panfrost_gem_mapping_put(struct panfrost_gem_mapping *mapping);
  85void panfrost_gem_teardown_mappings(struct panfrost_gem_object *bo);
  86
  87void panfrost_gem_shrinker_init(struct drm_device *dev);
  88void panfrost_gem_shrinker_cleanup(struct drm_device *dev);
  89
  90#endif /* __PANFROST_GEM_H__ */
  91