brintos

brintos / linux-shallow public Read only

0
0
Text · 3.2 KiB · a42d260 Raw
125 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Copyright (C) 2015-2018 Etnaviv Project4 */5 6#ifndef __ETNAVIV_GEM_H__7#define __ETNAVIV_GEM_H__8 9#include <linux/dma-resv.h>10#include "etnaviv_cmdbuf.h"11#include "etnaviv_drv.h"12 13struct dma_fence;14struct etnaviv_gem_ops;15struct etnaviv_gem_object;16 17struct etnaviv_gem_userptr {18	uintptr_t ptr;19	struct mm_struct *mm;20	bool ro;21};22 23struct etnaviv_vram_mapping {24	struct list_head obj_node;25	struct list_head scan_node;26	struct list_head mmu_node;27	struct etnaviv_gem_object *object;28	struct etnaviv_iommu_context *context;29	struct drm_mm_node vram_node;30	unsigned int use;31	u32 iova;32};33 34struct etnaviv_gem_object {35	struct drm_gem_object base;36	const struct etnaviv_gem_ops *ops;37	struct mutex lock;38 39	u32 flags;40 41	struct list_head gem_node;42	struct etnaviv_gpu *gpu;     /* non-null if active */43	atomic_t gpu_active;44	u32 access;45 46	struct page **pages;47	struct sg_table *sgt;48	void *vaddr;49 50	struct list_head vram_list;51 52	/* cache maintenance */53	u32 last_cpu_prep_op;54 55	struct etnaviv_gem_userptr userptr;56};57 58static inline59struct etnaviv_gem_object *to_etnaviv_bo(struct drm_gem_object *obj)60{61	return container_of(obj, struct etnaviv_gem_object, base);62}63 64struct etnaviv_gem_ops {65	int (*get_pages)(struct etnaviv_gem_object *);66	void (*release)(struct etnaviv_gem_object *);67	void *(*vmap)(struct etnaviv_gem_object *);68	int (*mmap)(struct etnaviv_gem_object *, struct vm_area_struct *);69};70 71static inline bool is_active(struct etnaviv_gem_object *etnaviv_obj)72{73	return atomic_read(&etnaviv_obj->gpu_active) != 0;74}75 76#define MAX_CMDS 477 78struct etnaviv_gem_submit_bo {79	u32 flags;80	u64 va;81	struct etnaviv_gem_object *obj;82	struct etnaviv_vram_mapping *mapping;83};84 85/* Created per submit-ioctl, to track bo's and cmdstream bufs, etc,86 * associated with the cmdstream submission for synchronization (and87 * make it easier to unwind when things go wrong, etc).88 */89struct etnaviv_gem_submit {90	struct drm_sched_job sched_job;91	struct kref refcount;92	struct etnaviv_file_private *ctx;93	struct etnaviv_gpu *gpu;94	struct etnaviv_iommu_context *mmu_context, *prev_mmu_context;95	struct dma_fence *out_fence;96	int out_fence_id;97	struct list_head node; /* GPU active submit list */98	struct etnaviv_cmdbuf cmdbuf;99	struct pid *pid;       /* submitting process */100	u32 exec_state;101	u32 flags;102	unsigned int nr_pmrs;103	struct etnaviv_perfmon_request *pmrs;104	unsigned int nr_bos;105	struct etnaviv_gem_submit_bo bos[];106	/* No new members here, the previous one is variable-length! */107};108 109void etnaviv_submit_put(struct etnaviv_gem_submit * submit);110 111int etnaviv_gem_wait_bo(struct etnaviv_gpu *gpu, struct drm_gem_object *obj,112	struct drm_etnaviv_timespec *timeout);113int etnaviv_gem_new_private(struct drm_device *dev, size_t size, u32 flags,114	const struct etnaviv_gem_ops *ops, struct etnaviv_gem_object **res);115void etnaviv_gem_obj_add(struct drm_device *dev, struct drm_gem_object *obj);116struct page **etnaviv_gem_get_pages(struct etnaviv_gem_object *obj);117void etnaviv_gem_put_pages(struct etnaviv_gem_object *obj);118 119struct etnaviv_vram_mapping *etnaviv_gem_mapping_get(120	struct drm_gem_object *obj, struct etnaviv_iommu_context *mmu_context,121	u64 va);122void etnaviv_gem_mapping_unreference(struct etnaviv_vram_mapping *mapping);123 124#endif /* __ETNAVIV_GEM_H__ */125