1 | /* SPDX-License-Identifier: GPL-2.0 OR MIT */ |
2 | /************************************************************************** |
3 | * |
4 | * Copyright 2012-2014 VMware, Inc., Palo Alto, CA., USA |
5 | * |
6 | * Permission is hereby granted, free of charge, to any person obtaining a |
7 | * copy of this software and associated documentation files (the |
8 | * "Software"), to deal in the Software without restriction, including |
9 | * without limitation the rights to use, copy, modify, merge, publish, |
10 | * distribute, sub license, and/or sell copies of the Software, and to |
11 | * permit persons to whom the Software is furnished to do so, subject to |
12 | * the following conditions: |
13 | * |
14 | * The above copyright notice and this permission notice (including the |
15 | * next paragraph) shall be included in all copies or substantial portions |
16 | * of the Software. |
17 | * |
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
20 | * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL |
21 | * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, |
22 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
23 | * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
24 | * USE OR OTHER DEALINGS IN THE SOFTWARE. |
25 | * |
26 | **************************************************************************/ |
27 | |
28 | #ifndef _VMWGFX_RESOURCE_PRIV_H_ |
29 | #define _VMWGFX_RESOURCE_PRIV_H_ |
30 | |
31 | #include "vmwgfx_drv.h" |
32 | |
33 | /* |
34 | * Extra memory required by the resource id's ida storage, which is allocated |
35 | * separately from the base object itself. We estimate an on-average 128 bytes |
36 | * per ida. |
37 | */ |
38 | #define VMW_IDA_ACC_SIZE 128 |
39 | |
40 | enum vmw_cmdbuf_res_state { |
41 | VMW_CMDBUF_RES_COMMITTED, |
42 | VMW_CMDBUF_RES_ADD, |
43 | VMW_CMDBUF_RES_DEL |
44 | }; |
45 | |
46 | /** |
47 | * struct vmw_user_resource_conv - Identify a derived user-exported resource |
48 | * type and provide a function to convert its ttm_base_object pointer to |
49 | * a struct vmw_resource |
50 | */ |
51 | struct vmw_user_resource_conv { |
52 | enum ttm_object_type object_type; |
53 | struct vmw_resource *(*base_obj_to_res)(struct ttm_base_object *base); |
54 | void (*res_free) (struct vmw_resource *res); |
55 | }; |
56 | |
57 | /** |
58 | * struct vmw_res_func - members and functions common for a resource type |
59 | * |
60 | * @res_type: Enum that identifies the lru list to use for eviction. |
61 | * @needs_guest_memory:Whether the resource is guest-backed and needs |
62 | * persistent buffer storage. |
63 | * @type_name: String that identifies the resource type. |
64 | * @domain: TTM placement for guest memory buffers. |
65 | * @busy_domain: TTM busy placement for guest memory buffers. |
66 | * @may_evict Whether the resource may be evicted. |
67 | * @create: Create a hardware resource. |
68 | * @destroy: Destroy a hardware resource. |
69 | * @bind: Bind a hardware resource to persistent buffer storage. |
70 | * @unbind: Unbind a hardware resource from persistent |
71 | * buffer storage. |
72 | * @commit_notify: If the resource is a command buffer managed resource, |
73 | * callback to notify that a define or remove command |
74 | * has been committed to the device. |
75 | * @dirty_alloc: Allocate a dirty tracker. NULL if dirty-tracking is not |
76 | * supported. |
77 | * @dirty_free: Free the dirty tracker. |
78 | * @dirty_sync: Upload the dirty mob contents to the resource. |
79 | * @dirty_add_range: Add a sequential dirty range to the resource |
80 | * dirty tracker. |
81 | * @clean: Clean the resource. |
82 | */ |
83 | struct vmw_res_func { |
84 | enum vmw_res_type res_type; |
85 | bool needs_guest_memory; |
86 | const char *type_name; |
87 | u32 domain; |
88 | u32 busy_domain; |
89 | bool may_evict; |
90 | u32 prio; |
91 | u32 dirty_prio; |
92 | |
93 | int (*create) (struct vmw_resource *res); |
94 | int (*destroy) (struct vmw_resource *res); |
95 | int (*bind) (struct vmw_resource *res, |
96 | struct ttm_validate_buffer *val_buf); |
97 | int (*unbind) (struct vmw_resource *res, |
98 | bool readback, |
99 | struct ttm_validate_buffer *val_buf); |
100 | void (*commit_notify)(struct vmw_resource *res, |
101 | enum vmw_cmdbuf_res_state state); |
102 | int (*dirty_alloc)(struct vmw_resource *res); |
103 | void (*dirty_free)(struct vmw_resource *res); |
104 | int (*dirty_sync)(struct vmw_resource *res); |
105 | void (*dirty_range_add)(struct vmw_resource *res, size_t start, |
106 | size_t end); |
107 | int (*clean)(struct vmw_resource *res); |
108 | }; |
109 | |
110 | /** |
111 | * struct vmw_simple_resource_func - members and functions common for the |
112 | * simple resource helpers. |
113 | * @res_func: struct vmw_res_func as described above. |
114 | * @ttm_res_type: TTM resource type used for handle recognition. |
115 | * @size: Size of the simple resource information struct. |
116 | * @init: Initialize the simple resource information. |
117 | * @hw_destroy: A resource hw_destroy function. |
118 | * @set_arg_handle: Set the handle output argument of the ioctl create struct. |
119 | */ |
120 | struct vmw_simple_resource_func { |
121 | const struct vmw_res_func res_func; |
122 | int ttm_res_type; |
123 | size_t size; |
124 | int (*init)(struct vmw_resource *res, void *data); |
125 | void (*hw_destroy)(struct vmw_resource *res); |
126 | void (*set_arg_handle)(void *data, u32 handle); |
127 | }; |
128 | |
129 | /** |
130 | * struct vmw_simple_resource - Kernel only side simple resource |
131 | * @res: The resource we derive from. |
132 | * @func: The method and member virtual table. |
133 | */ |
134 | struct vmw_simple_resource { |
135 | struct vmw_resource res; |
136 | const struct vmw_simple_resource_func *func; |
137 | }; |
138 | |
139 | int vmw_resource_alloc_id(struct vmw_resource *res); |
140 | void vmw_resource_release_id(struct vmw_resource *res); |
141 | int vmw_resource_init(struct vmw_private *dev_priv, struct vmw_resource *res, |
142 | bool delay_id, |
143 | void (*res_free) (struct vmw_resource *res), |
144 | const struct vmw_res_func *func); |
145 | int |
146 | vmw_simple_resource_create_ioctl(struct drm_device *dev, |
147 | void *data, |
148 | struct drm_file *file_priv, |
149 | const struct vmw_simple_resource_func *func); |
150 | struct vmw_resource * |
151 | vmw_simple_resource_lookup(struct ttm_object_file *tfile, |
152 | uint32_t handle, |
153 | const struct vmw_simple_resource_func *func); |
154 | #endif |
155 | |