cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

panfrost_gem.h (2542B)


      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_locked(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__ */