0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifndef _VMWGFX_VALIDATION_H_
0029 #define _VMWGFX_VALIDATION_H_
0030
0031 #include <linux/list.h>
0032 #include <linux/ww_mutex.h>
0033
0034 #include <drm/ttm/ttm_execbuf_util.h>
0035
0036 #include "vmwgfx_hashtab.h"
0037
0038 #define VMW_RES_DIRTY_NONE 0
0039 #define VMW_RES_DIRTY_SET BIT(0)
0040 #define VMW_RES_DIRTY_CLEAR BIT(1)
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061 struct vmw_validation_context {
0062 struct vmwgfx_open_hash *ht;
0063 struct list_head resource_list;
0064 struct list_head resource_ctx_list;
0065 struct list_head bo_list;
0066 struct list_head page_list;
0067 struct ww_acquire_ctx ticket;
0068 struct mutex *res_mutex;
0069 unsigned int merge_dups;
0070 unsigned int mem_size_left;
0071 u8 *page_address;
0072 struct vmw_validation_mem *vm;
0073 size_t vm_size_left;
0074 size_t total_mem;
0075 };
0076
0077 struct vmw_buffer_object;
0078 struct vmw_resource;
0079 struct vmw_fence_obj;
0080
0081 #if 0
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 #endif
0092 #define DECLARE_VAL_CONTEXT(_name, _ht, _merge_dups) \
0093 struct vmw_validation_context _name = \
0094 { .ht = _ht, \
0095 .resource_list = LIST_HEAD_INIT((_name).resource_list), \
0096 .resource_ctx_list = LIST_HEAD_INIT((_name).resource_ctx_list), \
0097 .bo_list = LIST_HEAD_INIT((_name).bo_list), \
0098 .page_list = LIST_HEAD_INIT((_name).page_list), \
0099 .res_mutex = NULL, \
0100 .merge_dups = _merge_dups, \
0101 .mem_size_left = 0, \
0102 }
0103
0104
0105
0106
0107
0108
0109
0110
0111 static inline bool
0112 vmw_validation_has_bos(struct vmw_validation_context *ctx)
0113 {
0114 return !list_empty(&ctx->bo_list);
0115 }
0116
0117
0118
0119
0120
0121
0122
0123
0124 static inline void vmw_validation_set_ht(struct vmw_validation_context *ctx,
0125 struct vmwgfx_open_hash *ht)
0126 {
0127 ctx->ht = ht;
0128 }
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139 static inline int
0140 vmw_validation_bo_reserve(struct vmw_validation_context *ctx,
0141 bool intr)
0142 {
0143 return ttm_eu_reserve_buffers(&ctx->ticket, &ctx->bo_list, intr,
0144 NULL);
0145 }
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155 static inline void
0156 vmw_validation_bo_fence(struct vmw_validation_context *ctx,
0157 struct vmw_fence_obj *fence)
0158 {
0159 ttm_eu_fence_buffer_objects(&ctx->ticket, &ctx->bo_list,
0160 (void *) fence);
0161 }
0162
0163
0164
0165
0166
0167
0168
0169
0170 static inline unsigned int vmw_validation_align(unsigned int val)
0171 {
0172 return ALIGN(val, sizeof(long));
0173 }
0174
0175 int vmw_validation_add_bo(struct vmw_validation_context *ctx,
0176 struct vmw_buffer_object *vbo,
0177 bool as_mob, bool cpu_blit);
0178 int vmw_validation_bo_validate_single(struct ttm_buffer_object *bo,
0179 bool interruptible,
0180 bool validate_as_mob);
0181 int vmw_validation_bo_validate(struct vmw_validation_context *ctx, bool intr);
0182 void vmw_validation_unref_lists(struct vmw_validation_context *ctx);
0183 int vmw_validation_add_resource(struct vmw_validation_context *ctx,
0184 struct vmw_resource *res,
0185 size_t priv_size,
0186 u32 dirty,
0187 void **p_node,
0188 bool *first_usage);
0189 void vmw_validation_drop_ht(struct vmw_validation_context *ctx);
0190 int vmw_validation_res_reserve(struct vmw_validation_context *ctx,
0191 bool intr);
0192 void vmw_validation_res_unreserve(struct vmw_validation_context *ctx,
0193 bool backoff);
0194 void vmw_validation_res_switch_backup(struct vmw_validation_context *ctx,
0195 void *val_private,
0196 struct vmw_buffer_object *vbo,
0197 unsigned long backup_offset);
0198 int vmw_validation_res_validate(struct vmw_validation_context *ctx, bool intr);
0199
0200 int vmw_validation_prepare(struct vmw_validation_context *ctx,
0201 struct mutex *mutex, bool intr);
0202 void vmw_validation_revert(struct vmw_validation_context *ctx);
0203 void vmw_validation_done(struct vmw_validation_context *ctx,
0204 struct vmw_fence_obj *fence);
0205
0206 void *vmw_validation_mem_alloc(struct vmw_validation_context *ctx,
0207 unsigned int size);
0208 int vmw_validation_preload_bo(struct vmw_validation_context *ctx);
0209 int vmw_validation_preload_res(struct vmw_validation_context *ctx,
0210 unsigned int size);
0211 void vmw_validation_res_set_dirty(struct vmw_validation_context *ctx,
0212 void *val_private, u32 dirty);
0213 void vmw_validation_bo_backoff(struct vmw_validation_context *ctx);
0214
0215 #endif