1 /* SPDX-License-Identifier: MIT */
3 * Copyright © 2019 Intel Corporation
6 #ifndef __INTEL_MEMORY_REGION_H__
7 #define __INTEL_MEMORY_REGION_H__
9 #include <linux/kref.h>
10 #include <linux/ioport.h>
11 #include <linux/mutex.h>
12 #include <linux/io-mapping.h>
14 #include "i915_buddy.h"
16 struct drm_i915_private;
17 struct drm_i915_gem_object;
18 struct intel_memory_region;
21 #define I915_ALLOC_MIN_PAGE_SIZE BIT(0)
22 #define I915_ALLOC_CONTIGUOUS BIT(1)
24 struct intel_memory_region_ops {
27 int (*init)(struct intel_memory_region *mem);
28 void (*release)(struct intel_memory_region *mem);
30 struct drm_i915_gem_object *
31 (*create_object)(struct intel_memory_region *mem,
36 struct intel_memory_region {
37 struct drm_i915_private *i915;
39 const struct intel_memory_region_ops *ops;
41 struct io_mapping iomap;
42 struct resource region;
44 struct i915_buddy_mm mm;
49 resource_size_t io_start;
50 resource_size_t min_page_size;
53 unsigned int instance;
57 struct mutex lock; /* Protects access to objects */
58 struct list_head list;
59 struct list_head purgeable;
63 int intel_memory_region_init_buddy(struct intel_memory_region *mem);
64 void intel_memory_region_release_buddy(struct intel_memory_region *mem);
66 int __intel_memory_region_get_pages_buddy(struct intel_memory_region *mem,
69 struct list_head *blocks);
70 struct i915_buddy_block *
71 __intel_memory_region_get_block_buddy(struct intel_memory_region *mem,
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);
78 struct intel_memory_region *
79 intel_memory_region_create(struct drm_i915_private *i915,
80 resource_size_t start,
82 resource_size_t min_page_size,
83 resource_size_t io_start,
84 const struct intel_memory_region_ops *ops);
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);