drm/i915/region: support volatile objects
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / intel_memory_region.h
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Copyright © 2019 Intel Corporation
4  */
5
6 #ifndef __INTEL_MEMORY_REGION_H__
7 #define __INTEL_MEMORY_REGION_H__
8
9 #include <linux/kref.h>
10 #include <linux/ioport.h>
11 #include <linux/mutex.h>
12 #include <linux/io-mapping.h>
13
14 #include "i915_buddy.h"
15
16 struct drm_i915_private;
17 struct drm_i915_gem_object;
18 struct intel_memory_region;
19 struct sg_table;
20
21 #define I915_ALLOC_MIN_PAGE_SIZE  BIT(0)
22 #define I915_ALLOC_CONTIGUOUS     BIT(1)
23
24 struct intel_memory_region_ops {
25         unsigned int flags;
26
27         int (*init)(struct intel_memory_region *mem);
28         void (*release)(struct intel_memory_region *mem);
29
30         struct drm_i915_gem_object *
31         (*create_object)(struct intel_memory_region *mem,
32                          resource_size_t size,
33                          unsigned int flags);
34 };
35
36 struct intel_memory_region {
37         struct drm_i915_private *i915;
38
39         const struct intel_memory_region_ops *ops;
40
41         struct io_mapping iomap;
42         struct resource region;
43
44         struct i915_buddy_mm mm;
45         struct mutex mm_lock;
46
47         struct kref kref;
48
49         resource_size_t io_start;
50         resource_size_t min_page_size;
51
52         unsigned int type;
53         unsigned int instance;
54         unsigned int id;
55
56         struct {
57                 struct mutex lock; /* Protects access to objects */
58                 struct list_head list;
59                 struct list_head purgeable;
60         } objects;
61 };
62
63 int intel_memory_region_init_buddy(struct intel_memory_region *mem);
64 void intel_memory_region_release_buddy(struct intel_memory_region *mem);
65
66 int __intel_memory_region_get_pages_buddy(struct intel_memory_region *mem,
67                                           resource_size_t size,
68                                           unsigned int flags,
69                                           struct list_head *blocks);
70 struct i915_buddy_block *
71 __intel_memory_region_get_block_buddy(struct intel_memory_region *mem,
72                                       resource_size_t size,
73                                       unsigned int flags);
74 void __intel_memory_region_put_pages_buddy(struct intel_memory_region *mem,
75                                            struct list_head *blocks);
76 void __intel_memory_region_put_block_buddy(struct i915_buddy_block *block);
77
78 struct intel_memory_region *
79 intel_memory_region_create(struct drm_i915_private *i915,
80                            resource_size_t start,
81                            resource_size_t size,
82                            resource_size_t min_page_size,
83                            resource_size_t io_start,
84                            const struct intel_memory_region_ops *ops);
85
86 struct intel_memory_region *
87 intel_memory_region_get(struct intel_memory_region *mem);
88 void intel_memory_region_put(struct intel_memory_region *mem);
89
90 #endif