aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_vma_snapshot.h
blob: 940581df4622b023441427e39b13ddd4d4784a23 (plain) (blame)
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* SPDX-License-Identifier: MIT */
/*
 * Copyright © 2021 Intel Corporation
 */
#ifndef _I915_VMA_SNAPSHOT_H_
#define _I915_VMA_SNAPSHOT_H_

#include <linux/kref.h>
#include <linux/slab.h>
#include <linux/types.h>

struct i915_active;
struct i915_refct_sgt;
struct i915_vma;
struct intel_memory_region;
struct sg_table;

/**
 * DOC: Simple utilities for snapshotting GPU vma metadata, later used for
 * error capture. Vi use a separate header for this to avoid issues due to
 * recursive header includes.
 */

/**
 * struct i915_vma_snapshot - Snapshot of vma metadata.
 * @size: The vma size in bytes.
 * @obj_size: The size of the underlying object in bytes.
 * @gtt_offset: The gtt offset the vma is bound to.
 * @gtt_size: The size in bytes allocated for the vma in the GTT.
 * @pages: The struct sg_table pointing to the pages bound.
 * @pages_rsgt: The refcounted sg_table holding the reference for @pages if any.
 * @mr: The memory region pointed for the pages bound.
 * @kref: Reference for this structure.
 * @vma_resource: FIXME: A means to keep the unbind fence from signaling.
 * Temporarily while we have only sync unbinds, and still use the vma
 * active, we use that. With async unbinding we need a signaling refcount
 * for the unbind fence.
 * @page_sizes: The vma GTT page sizes information.
 * @onstack: Whether the structure shouldn't be freed on final put.
 * @present: Whether the structure is present and initialized.
 */
struct i915_vma_snapshot {
	const char *name;
	size_t size;
	size_t obj_size;
	size_t gtt_offset;
	size_t gtt_size;
	struct sg_table *pages;
	struct i915_refct_sgt *pages_rsgt;
	struct intel_memory_region *mr;
	struct kref kref;
	struct i915_active *vma_resource;
	u32 page_sizes;
	bool onstack:1;
	bool present:1;
};

void i915_vma_snapshot_init(struct i915_vma_snapshot *vsnap,
			    struct i915_vma *vma,
			    const char *name);

void i915_vma_snapshot_init_onstack(struct i915_vma_snapshot *vsnap,
				    struct i915_vma *vma,
				    const char *name);

void i915_vma_snapshot_put(struct i915_vma_snapshot *vsnap);

void i915_vma_snapshot_put_onstack(struct i915_vma_snapshot *vsnap);

bool i915_vma_snapshot_resource_pin(struct i915_vma_snapshot *vsnap,
				    bool *lockdep_cookie);

void i915_vma_snapshot_resource_unpin(struct i915_vma_snapshot *vsnap,
				      bool lockdep_cookie);

/**
 * i915_vma_snapshot_alloc - Allocate a struct i915_vma_snapshot
 * @gfp: Allocation mode.
 *
 * Return: A pointer to a struct i915_vma_snapshot if successful.
 * NULL otherwise.
 */
static inline struct i915_vma_snapshot *i915_vma_snapshot_alloc(gfp_t gfp)
{
	return kmalloc(sizeof(struct i915_vma_snapshot), gfp);
}

/**
 * i915_vma_snapshot_get - Take a reference on a struct i915_vma_snapshot
 *
 * Return: A pointer to a struct i915_vma_snapshot.
 */
static inline struct i915_vma_snapshot *
i915_vma_snapshot_get(struct i915_vma_snapshot *vsnap)
{
	kref_get(&vsnap->kref);
	return vsnap;
}

/**
 * i915_vma_snapshot_present - Whether a struct i915_vma_snapshot is
 * present and initialized.
 *
 * Return: true if present and initialized; false otherwise.
 */
static inline bool
i915_vma_snapshot_present(const struct i915_vma_snapshot *vsnap)
{
	return vsnap && vsnap->present;
}

#endif