Commit | Line | Data |
---|---|---|
c8afe684 RC |
1 | /* |
2 | * Copyright (C) 2013 Red Hat | |
3 | * Author: Rob Clark <robdclark@gmail.com> | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify it | |
6 | * under the terms of the GNU General Public License version 2 as published by | |
7 | * the Free Software Foundation. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, but WITHOUT | |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
12 | * more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License along with | |
15 | * this program. If not, see <http://www.gnu.org/licenses/>. | |
16 | */ | |
17 | ||
18 | #ifndef __MSM_GEM_H__ | |
19 | #define __MSM_GEM_H__ | |
20 | ||
7198e6b0 | 21 | #include <linux/reservation.h> |
c8afe684 RC |
22 | #include "msm_drv.h" |
23 | ||
072f1f91 RC |
24 | /* Additional internal-use only BO flags: */ |
25 | #define MSM_BO_STOLEN 0x10000000 /* try to use stolen/splash memory */ | |
26 | ||
c8afe684 RC |
27 | struct msm_gem_object { |
28 | struct drm_gem_object base; | |
29 | ||
30 | uint32_t flags; | |
31 | ||
4cd33c48 RC |
32 | /** |
33 | * Advice: are the backing pages purgeable? | |
34 | */ | |
35 | uint8_t madv; | |
36 | ||
e1e9db2c RC |
37 | /** |
38 | * count of active vmap'ing | |
39 | */ | |
40 | uint8_t vmap_count; | |
41 | ||
7198e6b0 RC |
42 | /* And object is either: |
43 | * inactive - on priv->inactive_list | |
44 | * active - on one one of the gpu's active_list.. well, at | |
45 | * least for now we don't have (I don't think) hw sync between | |
46 | * 2d and 3d one devices which have both, meaning we need to | |
47 | * block on submit if a bo is already on other ring | |
48 | * | |
49 | */ | |
c8afe684 | 50 | struct list_head mm_list; |
7198e6b0 | 51 | struct msm_gpu *gpu; /* non-null if active */ |
7198e6b0 RC |
52 | |
53 | /* Transiently in the process of submit ioctl, objects associated | |
54 | * with the submit are on submit->bo_list.. this only lasts for | |
55 | * the duration of the ioctl, so one bo can never be on multiple | |
56 | * submit lists. | |
57 | */ | |
58 | struct list_head submit_entry; | |
59 | ||
c8afe684 RC |
60 | struct page **pages; |
61 | struct sg_table *sgt; | |
62 | void *vaddr; | |
63 | ||
64 | struct { | |
65 | // XXX | |
66 | uint32_t iova; | |
67 | } domain[NUM_DOMAINS]; | |
7198e6b0 RC |
68 | |
69 | /* normally (resv == &_resv) except for imported bo's */ | |
70 | struct reservation_object *resv; | |
71 | struct reservation_object _resv; | |
871d812a RC |
72 | |
73 | /* For physically contiguous buffers. Used when we don't have | |
072f1f91 | 74 | * an IOMMU. Also used for stolen/splashscreen buffer. |
871d812a RC |
75 | */ |
76 | struct drm_mm_node *vram_node; | |
c8afe684 RC |
77 | }; |
78 | #define to_msm_bo(x) container_of(x, struct msm_gem_object, base) | |
79 | ||
7198e6b0 RC |
80 | static inline bool is_active(struct msm_gem_object *msm_obj) |
81 | { | |
82 | return msm_obj->gpu != NULL; | |
83 | } | |
84 | ||
68209390 RC |
85 | static inline bool is_purgeable(struct msm_gem_object *msm_obj) |
86 | { | |
87 | return (msm_obj->madv == MSM_MADV_DONTNEED) && msm_obj->sgt && | |
88 | !msm_obj->base.dma_buf && !msm_obj->base.import_attach; | |
89 | } | |
90 | ||
e1e9db2c RC |
91 | static inline bool is_vunmapable(struct msm_gem_object *msm_obj) |
92 | { | |
93 | return (msm_obj->vmap_count == 0) && msm_obj->vaddr; | |
94 | } | |
95 | ||
7198e6b0 RC |
96 | /* Created per submit-ioctl, to track bo's and cmdstream bufs, etc, |
97 | * associated with the cmdstream submission for synchronization (and | |
98 | * make it easier to unwind when things go wrong, etc). This only | |
99 | * lasts for the duration of the submit-ioctl. | |
100 | */ | |
101 | struct msm_gem_submit { | |
102 | struct drm_device *dev; | |
103 | struct msm_gpu *gpu; | |
1a370be9 | 104 | struct list_head node; /* node in gpu submit_list */ |
7198e6b0 RC |
105 | struct list_head bo_list; |
106 | struct ww_acquire_ctx ticket; | |
b6295f9a | 107 | struct fence *fence; |
4816b626 | 108 | struct pid *pid; /* submitting process */ |
340faef2 | 109 | bool valid; /* true if no cmdstream patching needed */ |
7198e6b0 RC |
110 | unsigned int nr_cmds; |
111 | unsigned int nr_bos; | |
112 | struct { | |
113 | uint32_t type; | |
114 | uint32_t size; /* in dwords */ | |
115 | uint32_t iova; | |
a7d3c950 | 116 | uint32_t idx; /* cmdstream buffer idx in bos[] */ |
6b597ce2 | 117 | } *cmd; /* array of size nr_cmds */ |
7198e6b0 RC |
118 | struct { |
119 | uint32_t flags; | |
120 | struct msm_gem_object *obj; | |
121 | uint32_t iova; | |
122 | } bos[0]; | |
123 | }; | |
124 | ||
c8afe684 | 125 | #endif /* __MSM_GEM_H__ */ |