i915_vma.h 14.0 KB
Newer Older
J
Joonas Lahtinen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * Copyright © 2016 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 *
 */

#ifndef __I915_VMA_H__
#define __I915_VMA_H__

#include <linux/io-mapping.h>
29
#include <linux/rbtree.h>
J
Joonas Lahtinen 已提交
30 31 32 33 34

#include <drm/drm_mm.h>

#include "i915_gem_gtt.h"
#include "i915_gem_fence_reg.h"
35
#include "gem/i915_gem_object.h"
J
Joonas Lahtinen 已提交
36

37
#include "i915_active.h"
38
#include "i915_request.h"
J
Joonas Lahtinen 已提交
39 40 41 42

enum i915_cache_level;

/**
43 44
 * DOC: Virtual Memory Address
 *
J
Joonas Lahtinen 已提交
45 46 47 48 49 50 51 52 53 54 55
 * A VMA represents a GEM BO that is bound into an address space. Therefore, a
 * VMA's presence cannot be guaranteed before binding, or after unbinding the
 * object into/from the address space.
 *
 * To make things as simple as possible (ie. no refcounting), a VMA's lifetime
 * will always be <= an objects lifetime. So object refcounting should cover us.
 */
struct i915_vma {
	struct drm_mm_node node;
	struct drm_i915_gem_object *obj;
	struct i915_address_space *vm;
56
	const struct i915_vma_ops *ops;
57
	struct i915_fence_reg *fence;
58
	struct dma_resv *resv; /** Alias of obj->resv */
J
Joonas Lahtinen 已提交
59 60
	struct sg_table *pages;
	void __iomem *iomap;
61
	void *private; /* owned by creator */
J
Joonas Lahtinen 已提交
62 63
	u64 size;
	u64 display_alignment;
64
	struct i915_page_sizes page_sizes;
J
Joonas Lahtinen 已提交
65

66 67 68
	u32 fence_size;
	u32 fence_alignment;

69 70 71 72 73
	/**
	 * Count of the number of times this vma has been opened by different
	 * handles (but same file) for execbuf, i.e. the number of aliases
	 * that exist in the ctx->handle_vmas LUT for this vma.
	 */
74
	atomic_t open_count;
75
	unsigned long flags;
J
Joonas Lahtinen 已提交
76
	/**
C
Chris Wilson 已提交
77
	 * How many users have pinned this object in GTT space.
J
Joonas Lahtinen 已提交
78
	 *
C
Chris Wilson 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
	 * This is a tightly bound, fairly small number of users, so we
	 * stuff inside the flags field so that we can both check for overflow
	 * and detect a no-op i915_vma_pin() in a single check, while also
	 * pinning the vma.
	 *
	 * The worst case display setup would have the same vma pinned for
	 * use on each plane on each crtc, while also building the next atomic
	 * state and holding a pin for the length of the cleanup queue. In the
	 * future, the flip queue may be increased from 1.
	 * Estimated worst case: 3 [qlen] * 4 [max crtcs] * 7 [max planes] = 84
	 *
	 * For GEM, the number of concurrent users for pwrite/pread is
	 * unbounded. For execbuffer, it is currently one but will in future
	 * be extended to allow multiple clients to pin vma concurrently.
	 *
	 * We also use suballocated pages, with each suballocation claiming
	 * its own pin on the shared vma. At present, this is limited to
	 * exclusive cachelines of a single page, so a maximum of 64 possible
	 * users.
J
Joonas Lahtinen 已提交
98
	 */
C
Chris Wilson 已提交
99 100
#define I915_VMA_PIN_MASK 0xff
#define I915_VMA_PIN_OVERFLOW	BIT(8)
J
Joonas Lahtinen 已提交
101 102

	/** Flags and address space this VMA is bound to */
C
Chris Wilson 已提交
103 104
#define I915_VMA_GLOBAL_BIND	BIT(9)
#define I915_VMA_LOCAL_BIND	BIT(10)
J
Joonas Lahtinen 已提交
105 106
#define I915_VMA_BIND_MASK (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND | I915_VMA_PIN_OVERFLOW)

C
Chris Wilson 已提交
107 108
#define I915_VMA_GGTT		BIT(11)
#define I915_VMA_CAN_FENCE	BIT(12)
109
#define I915_VMA_USERFAULT_BIT	13
110
#define I915_VMA_USERFAULT	BIT(I915_VMA_USERFAULT_BIT)
111
#define I915_VMA_GGTT_WRITE	BIT(14)
J
Joonas Lahtinen 已提交
112

113
	struct i915_active active;
J
Joonas Lahtinen 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128

	/**
	 * Support different GGTT views into the same object.
	 * This means there can be multiple VMA mappings per object and per VM.
	 * i915_ggtt_view_type is used to distinguish between those entries.
	 * The default one of zero (I915_GGTT_VIEW_NORMAL) is default and also
	 * assumed in GEM functions which take no ggtt view parameter.
	 */
	struct i915_ggtt_view ggtt_view;

	/** This object's place on the active/inactive lists */
	struct list_head vm_link;

	struct list_head obj_link; /* Link in the object's VMA list */
	struct rb_node obj_node;
129
	struct hlist_node obj_hash;
J
Joonas Lahtinen 已提交
130

131 132
	/** This vma's place in the execbuf reservation list */
	struct list_head exec_link;
133
	struct list_head reloc_link;
134 135 136

	/** This vma's place in the eviction list */
	struct list_head evict_link;
J
Joonas Lahtinen 已提交
137

138 139
	struct list_head closed_link;

J
Joonas Lahtinen 已提交
140 141 142
	/**
	 * Used for performing relocations during execbuffer insertion.
	 */
143
	unsigned int *exec_flags;
144
	struct hlist_node exec_node;
145
	u32 exec_handle;
J
Joonas Lahtinen 已提交
146 147
};

148 149 150 151 152
struct i915_vma *
i915_vma_instance(struct drm_i915_gem_object *obj,
		  struct i915_address_space *vm,
		  const struct i915_ggtt_view *view);

153 154
void i915_vma_unpin_and_release(struct i915_vma **p_vma, unsigned int flags);
#define I915_VMA_RELEASE_MAP BIT(0)
J
Joonas Lahtinen 已提交
155

156
static inline bool i915_vma_is_active(const struct i915_vma *vma)
157
{
158
	return !i915_active_is_idle(&vma->active);
159 160 161 162 163 164
}

int __must_check i915_vma_move_to_active(struct i915_vma *vma,
					 struct i915_request *rq,
					 unsigned int flags);

J
Joonas Lahtinen 已提交
165 166 167 168 169
static inline bool i915_vma_is_ggtt(const struct i915_vma *vma)
{
	return vma->flags & I915_VMA_GGTT;
}

170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
static inline bool i915_vma_has_ggtt_write(const struct i915_vma *vma)
{
	return vma->flags & I915_VMA_GGTT_WRITE;
}

static inline void i915_vma_set_ggtt_write(struct i915_vma *vma)
{
	GEM_BUG_ON(!i915_vma_is_ggtt(vma));
	vma->flags |= I915_VMA_GGTT_WRITE;
}

static inline void i915_vma_unset_ggtt_write(struct i915_vma *vma)
{
	vma->flags &= ~I915_VMA_GGTT_WRITE;
}

void i915_vma_flush_writes(struct i915_vma *vma);

J
Joonas Lahtinen 已提交
188 189 190 191 192
static inline bool i915_vma_is_map_and_fenceable(const struct i915_vma *vma)
{
	return vma->flags & I915_VMA_CAN_FENCE;
}

193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
static inline bool i915_vma_set_userfault(struct i915_vma *vma)
{
	GEM_BUG_ON(!i915_vma_is_map_and_fenceable(vma));
	return __test_and_set_bit(I915_VMA_USERFAULT_BIT, &vma->flags);
}

static inline void i915_vma_unset_userfault(struct i915_vma *vma)
{
	return __clear_bit(I915_VMA_USERFAULT_BIT, &vma->flags);
}

static inline bool i915_vma_has_userfault(const struct i915_vma *vma)
{
	return test_bit(I915_VMA_USERFAULT_BIT, &vma->flags);
}

209 210 211 212 213
static inline bool i915_vma_is_closed(const struct i915_vma *vma)
{
	return !list_empty(&vma->closed_link);
}

J
Joonas Lahtinen 已提交
214 215 216 217 218 219 220 221 222
static inline u32 i915_ggtt_offset(const struct i915_vma *vma)
{
	GEM_BUG_ON(!i915_vma_is_ggtt(vma));
	GEM_BUG_ON(!vma->node.allocated);
	GEM_BUG_ON(upper_32_bits(vma->node.start));
	GEM_BUG_ON(upper_32_bits(vma->node.start + vma->node.size - 1));
	return lower_32_bits(vma->node.start);
}

223 224 225 226 227
static inline u32 i915_ggtt_pin_bias(struct i915_vma *vma)
{
	return i915_vm_to_ggtt(vma->vm)->pin_bias;
}

J
Joonas Lahtinen 已提交
228 229 230 231 232 233
static inline struct i915_vma *i915_vma_get(struct i915_vma *vma)
{
	i915_gem_object_get(vma->obj);
	return vma;
}

234 235 236 237 238 239 240 241
static inline struct i915_vma *i915_vma_tryget(struct i915_vma *vma)
{
	if (likely(kref_get_unless_zero(&vma->obj->base.refcount)))
		return vma;

	return NULL;
}

J
Joonas Lahtinen 已提交
242 243 244 245 246
static inline void i915_vma_put(struct i915_vma *vma)
{
	i915_gem_object_put(vma->obj);
}

247 248 249 250 251
static __always_inline ptrdiff_t ptrdiff(const void *a, const void *b)
{
	return a - b;
}

J
Joonas Lahtinen 已提交
252 253 254 255 256
static inline long
i915_vma_compare(struct i915_vma *vma,
		 struct i915_address_space *vm,
		 const struct i915_ggtt_view *view)
{
257 258
	ptrdiff_t cmp;

259
	GEM_BUG_ON(view && !i915_is_ggtt(vm));
J
Joonas Lahtinen 已提交
260

261 262 263
	cmp = ptrdiff(vma->vm, vm);
	if (cmp)
		return cmp;
J
Joonas Lahtinen 已提交
264

265 266
	BUILD_BUG_ON(I915_GGTT_VIEW_NORMAL != 0);
	cmp = vma->ggtt_view.type;
J
Joonas Lahtinen 已提交
267
	if (!view)
268
		return cmp;
J
Joonas Lahtinen 已提交
269

270 271 272
	cmp -= view->type;
	if (cmp)
		return cmp;
J
Joonas Lahtinen 已提交
273

V
Ville Syrjälä 已提交
274 275
	assert_i915_gem_gtt_types();

276 277 278 279
	/* ggtt_view.type also encodes its size so that we both distinguish
	 * different views using it as a "type" and also use a compact (no
	 * accessing of uninitialised padding bytes) memcmp without storing
	 * an extra parameter or adding more code.
280 281 282 283 284
	 *
	 * To ensure that the memcmp is valid for all branches of the union,
	 * even though the code looks like it is just comparing one branch,
	 * we assert above that all branches have the same address, and that
	 * each branch has a unique type/size.
285 286 287
	 */
	BUILD_BUG_ON(I915_GGTT_VIEW_NORMAL >= I915_GGTT_VIEW_PARTIAL);
	BUILD_BUG_ON(I915_GGTT_VIEW_PARTIAL >= I915_GGTT_VIEW_ROTATED);
288
	BUILD_BUG_ON(I915_GGTT_VIEW_ROTATED >= I915_GGTT_VIEW_REMAPPED);
289 290
	BUILD_BUG_ON(offsetof(typeof(*view), rotated) !=
		     offsetof(typeof(*view), partial));
291 292
	BUILD_BUG_ON(offsetof(typeof(*view), rotated) !=
		     offsetof(typeof(*view), remapped));
293
	return memcmp(&vma->ggtt_view.partial, &view->partial, view->type);
J
Joonas Lahtinen 已提交
294 295 296 297 298
}

int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
		  u32 flags);
bool i915_gem_valid_gtt_space(struct i915_vma *vma, unsigned long cache_level);
299 300
bool i915_vma_misplaced(const struct i915_vma *vma,
			u64 size, u64 alignment, u64 flags);
J
Joonas Lahtinen 已提交
301
void __i915_vma_set_map_and_fenceable(struct i915_vma *vma);
302
void i915_vma_revoke_mmap(struct i915_vma *vma);
J
Joonas Lahtinen 已提交
303
int __must_check i915_vma_unbind(struct i915_vma *vma);
304
void i915_vma_unlink_ctx(struct i915_vma *vma);
J
Joonas Lahtinen 已提交
305
void i915_vma_close(struct i915_vma *vma);
306 307
void i915_vma_reopen(struct i915_vma *vma);
void i915_vma_destroy(struct i915_vma *vma);
J
Joonas Lahtinen 已提交
308

309
#define assert_vma_held(vma) dma_resv_assert_held((vma)->resv)
310 311 312

static inline void i915_vma_lock(struct i915_vma *vma)
{
313
	dma_resv_lock(vma->resv, NULL);
314 315 316 317
}

static inline void i915_vma_unlock(struct i915_vma *vma)
{
318
	dma_resv_unlock(vma->resv);
319 320
}

J
Joonas Lahtinen 已提交
321 322 323 324 325 326 327 328 329 330 331 332
int __i915_vma_do_pin(struct i915_vma *vma,
		      u64 size, u64 alignment, u64 flags);
static inline int __must_check
i915_vma_pin(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
{
	BUILD_BUG_ON(PIN_MBZ != I915_VMA_PIN_OVERFLOW);
	BUILD_BUG_ON(PIN_GLOBAL != I915_VMA_GLOBAL_BIND);
	BUILD_BUG_ON(PIN_USER != I915_VMA_LOCAL_BIND);

	/* Pin early to prevent the shrinker/eviction logic from destroying
	 * our vma as we insert and bind.
	 */
333 334 335
	if (likely(((++vma->flags ^ flags) & I915_VMA_BIND_MASK) == 0)) {
		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
		GEM_BUG_ON(i915_vma_misplaced(vma, size, alignment, flags));
J
Joonas Lahtinen 已提交
336
		return 0;
337
	}
J
Joonas Lahtinen 已提交
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364

	return __i915_vma_do_pin(vma, size, alignment, flags);
}

static inline int i915_vma_pin_count(const struct i915_vma *vma)
{
	return vma->flags & I915_VMA_PIN_MASK;
}

static inline bool i915_vma_is_pinned(const struct i915_vma *vma)
{
	return i915_vma_pin_count(vma);
}

static inline void __i915_vma_pin(struct i915_vma *vma)
{
	vma->flags++;
	GEM_BUG_ON(vma->flags & I915_VMA_PIN_OVERFLOW);
}

static inline void __i915_vma_unpin(struct i915_vma *vma)
{
	vma->flags--;
}

static inline void i915_vma_unpin(struct i915_vma *vma)
{
365
	GEM_BUG_ON(!i915_vma_is_pinned(vma));
J
Joonas Lahtinen 已提交
366 367 368 369
	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
	__i915_vma_unpin(vma);
}

370 371 372 373 374 375
static inline bool i915_vma_is_bound(const struct i915_vma *vma,
				     unsigned int where)
{
	return vma->flags & where;
}

J
Joonas Lahtinen 已提交
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
/**
 * i915_vma_pin_iomap - calls ioremap_wc to map the GGTT VMA via the aperture
 * @vma: VMA to iomap
 *
 * The passed in VMA has to be pinned in the global GTT mappable region.
 * An extra pinning of the VMA is acquired for the return iomapping,
 * the caller must call i915_vma_unpin_iomap to relinquish the pinning
 * after the iomapping is no longer required.
 *
 * Callers must hold the struct_mutex.
 *
 * Returns a valid iomapped pointer or ERR_PTR.
 */
void __iomem *i915_vma_pin_iomap(struct i915_vma *vma);
#define IO_ERR_PTR(x) ((void __iomem *)ERR_PTR(x))

/**
 * i915_vma_unpin_iomap - unpins the mapping returned from i915_vma_iomap
 * @vma: VMA to unpin
 *
 * Unpins the previously iomapped VMA from i915_vma_pin_iomap().
 *
 * Callers must hold the struct_mutex. This function is only valid to be
 * called on a VMA previously iomapped by the caller with i915_vma_pin_iomap().
 */
C
Chris Wilson 已提交
401
void i915_vma_unpin_iomap(struct i915_vma *vma);
J
Joonas Lahtinen 已提交
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423

static inline struct page *i915_vma_first_page(struct i915_vma *vma)
{
	GEM_BUG_ON(!vma->pages);
	return sg_page(vma->pages->sgl);
}

/**
 * i915_vma_pin_fence - pin fencing state
 * @vma: vma to pin fencing for
 *
 * This pins the fencing state (whether tiled or untiled) to make sure the
 * vma (and its object) is ready to be used as a scanout target. Fencing
 * status must be synchronize first by calling i915_vma_get_fence():
 *
 * The resulting fence pin reference must be released again with
 * i915_vma_unpin_fence().
 *
 * Returns:
 *
 * True if the vma has a fence, false otherwise.
 */
424 425 426 427
int i915_vma_pin_fence(struct i915_vma *vma);
int __must_check i915_vma_put_fence(struct i915_vma *vma);

static inline void __i915_vma_unpin_fence(struct i915_vma *vma)
J
Joonas Lahtinen 已提交
428
{
429 430
	GEM_BUG_ON(vma->fence->pin_count <= 0);
	vma->fence->pin_count--;
J
Joonas Lahtinen 已提交
431 432 433 434 435 436 437 438 439 440 441 442 443
}

/**
 * i915_vma_unpin_fence - unpin fencing state
 * @vma: vma to unpin fencing for
 *
 * This releases the fence pin reference acquired through
 * i915_vma_pin_fence. It will handle both objects with and without an
 * attached fence correctly, callers do not need to distinguish this.
 */
static inline void
i915_vma_unpin_fence(struct i915_vma *vma)
{
444
	/* lockdep_assert_held(&vma->vm->i915->drm.struct_mutex); */
445 446
	if (vma->fence)
		__i915_vma_unpin_fence(vma);
J
Joonas Lahtinen 已提交
447 448
}

449 450
void i915_vma_parked(struct drm_i915_private *i915);

451 452 453 454 455 456 457 458 459 460 461 462
#define for_each_until(cond) if (cond) break; else

/**
 * for_each_ggtt_vma - Iterate over the GGTT VMA belonging to an object.
 * @V: the #i915_vma iterator
 * @OBJ: the #drm_i915_gem_object
 *
 * GGTT VMA are placed at the being of the object's vma_list, see
 * vma_create(), so we can stop our walk as soon as we see a ppgtt VMA,
 * or the list is empty ofc.
 */
#define for_each_ggtt_vma(V, OBJ) \
463
	list_for_each_entry(V, &(OBJ)->vma.list, obj_link)		\
464
		for_each_until(!i915_vma_is_ggtt(V))
J
Joonas Lahtinen 已提交
465

466 467 468
struct i915_vma *i915_vma_alloc(void);
void i915_vma_free(struct i915_vma *vma);

469 470 471 472
struct i915_vma *i915_vma_make_unshrinkable(struct i915_vma *vma);
void i915_vma_make_shrinkable(struct i915_vma *vma);
void i915_vma_make_purgeable(struct i915_vma *vma);

473
#endif