| 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/ioport.h> | 
|---|
| 10 | #include <linux/mutex.h> | 
|---|
| 11 | #include <linux/io-mapping.h> | 
|---|
| 12 | #include <drm/drm_mm.h> | 
|---|
| 13 | #include <uapi/drm/i915_drm.h> | 
|---|
| 14 |  | 
|---|
| 15 | struct drm_i915_private; | 
|---|
| 16 | struct drm_i915_gem_object; | 
|---|
| 17 | struct drm_printer; | 
|---|
| 18 | struct intel_memory_region; | 
|---|
| 19 | struct sg_table; | 
|---|
| 20 | struct ttm_resource; | 
|---|
| 21 |  | 
|---|
| 22 | enum intel_memory_type { | 
|---|
| 23 | INTEL_MEMORY_SYSTEM = I915_MEMORY_CLASS_SYSTEM, | 
|---|
| 24 | INTEL_MEMORY_LOCAL = I915_MEMORY_CLASS_DEVICE, | 
|---|
| 25 | INTEL_MEMORY_STOLEN_SYSTEM, | 
|---|
| 26 | INTEL_MEMORY_STOLEN_LOCAL, | 
|---|
| 27 | INTEL_MEMORY_MOCK, | 
|---|
| 28 | }; | 
|---|
| 29 |  | 
|---|
| 30 | enum intel_region_id { | 
|---|
| 31 | INTEL_REGION_SMEM = 0, | 
|---|
| 32 | INTEL_REGION_LMEM_0, | 
|---|
| 33 | INTEL_REGION_LMEM_1, | 
|---|
| 34 | INTEL_REGION_LMEM_2, | 
|---|
| 35 | INTEL_REGION_LMEM_3, | 
|---|
| 36 | INTEL_REGION_STOLEN_SMEM, | 
|---|
| 37 | INTEL_REGION_STOLEN_LMEM, | 
|---|
| 38 | INTEL_REGION_UNKNOWN, /* Should be last */ | 
|---|
| 39 | }; | 
|---|
| 40 |  | 
|---|
| 41 | #define I915_ALLOC_CONTIGUOUS     BIT(0) | 
|---|
| 42 |  | 
|---|
| 43 | #define for_each_memory_region(mr, i915, id) \ | 
|---|
| 44 | for (id = 0; id < ARRAY_SIZE((i915)->mm.regions); id++) \ | 
|---|
| 45 | for_each_if((mr) = (i915)->mm.regions[id]) | 
|---|
| 46 |  | 
|---|
| 47 | struct intel_memory_region_ops { | 
|---|
| 48 | int (*init)(struct intel_memory_region *mem); | 
|---|
| 49 | int (*release)(struct intel_memory_region *mem); | 
|---|
| 50 |  | 
|---|
| 51 | int (*init_object)(struct intel_memory_region *mem, | 
|---|
| 52 | struct drm_i915_gem_object *obj, | 
|---|
| 53 | resource_size_t offset, | 
|---|
| 54 | resource_size_t size, | 
|---|
| 55 | resource_size_t page_size, | 
|---|
| 56 | unsigned int flags); | 
|---|
| 57 | }; | 
|---|
| 58 |  | 
|---|
| 59 | struct intel_memory_region { | 
|---|
| 60 | struct drm_i915_private *i915; | 
|---|
| 61 |  | 
|---|
| 62 | const struct intel_memory_region_ops *ops; | 
|---|
| 63 |  | 
|---|
| 64 | struct io_mapping iomap; | 
|---|
| 65 | struct resource region; | 
|---|
| 66 |  | 
|---|
| 67 | struct resource io; | 
|---|
| 68 | resource_size_t min_page_size; | 
|---|
| 69 | resource_size_t total; | 
|---|
| 70 |  | 
|---|
| 71 | u16 type; | 
|---|
| 72 | u16 instance; | 
|---|
| 73 | enum intel_region_id id; | 
|---|
| 74 | char name[16]; | 
|---|
| 75 | char uabi_name[16]; | 
|---|
| 76 | bool private; /* not for userspace */ | 
|---|
| 77 |  | 
|---|
| 78 | struct { | 
|---|
| 79 | struct mutex lock; /* Protects access to objects */ | 
|---|
| 80 | struct list_head list; | 
|---|
| 81 | } objects; | 
|---|
| 82 |  | 
|---|
| 83 | bool is_range_manager; | 
|---|
| 84 |  | 
|---|
| 85 | void *region_private; | 
|---|
| 86 | }; | 
|---|
| 87 |  | 
|---|
| 88 | bool intel_memory_type_is_local(enum intel_memory_type mem_type); | 
|---|
| 89 |  | 
|---|
| 90 | struct intel_memory_region * | 
|---|
| 91 | intel_memory_region_lookup(struct drm_i915_private *i915, | 
|---|
| 92 | u16 class, u16 instance); | 
|---|
| 93 |  | 
|---|
| 94 | struct intel_memory_region * | 
|---|
| 95 | intel_memory_region_create(struct drm_i915_private *i915, | 
|---|
| 96 | resource_size_t start, | 
|---|
| 97 | resource_size_t size, | 
|---|
| 98 | resource_size_t min_page_size, | 
|---|
| 99 | resource_size_t io_start, | 
|---|
| 100 | resource_size_t io_size, | 
|---|
| 101 | u16 type, | 
|---|
| 102 | u16 instance, | 
|---|
| 103 | const struct intel_memory_region_ops *ops); | 
|---|
| 104 |  | 
|---|
| 105 | void intel_memory_region_destroy(struct intel_memory_region *mem); | 
|---|
| 106 |  | 
|---|
| 107 | int intel_memory_regions_hw_probe(struct drm_i915_private *i915); | 
|---|
| 108 | void intel_memory_regions_driver_release(struct drm_i915_private *i915); | 
|---|
| 109 | struct intel_memory_region * | 
|---|
| 110 | intel_memory_region_by_type(struct drm_i915_private *i915, | 
|---|
| 111 | enum intel_memory_type mem_type); | 
|---|
| 112 | const char *intel_memory_type_str(enum intel_memory_type type); | 
|---|
| 113 |  | 
|---|
| 114 | __printf(2, 3) void | 
|---|
| 115 | intel_memory_region_set_name(struct intel_memory_region *mem, | 
|---|
| 116 | const char *fmt, ...); | 
|---|
| 117 |  | 
|---|
| 118 | int intel_memory_region_reserve(struct intel_memory_region *mem, | 
|---|
| 119 | resource_size_t offset, | 
|---|
| 120 | resource_size_t size); | 
|---|
| 121 |  | 
|---|
| 122 | void intel_memory_region_debug(struct intel_memory_region *mr, | 
|---|
| 123 | struct drm_printer *printer); | 
|---|
| 124 |  | 
|---|
| 125 | void intel_memory_region_avail(struct intel_memory_region *mr, | 
|---|
| 126 | u64 *avail, u64 *visible_avail); | 
|---|
| 127 |  | 
|---|
| 128 | struct intel_memory_region * | 
|---|
| 129 | i915_gem_ttm_system_setup(struct drm_i915_private *i915, | 
|---|
| 130 | u16 type, u16 instance); | 
|---|
| 131 | struct intel_memory_region * | 
|---|
| 132 | i915_gem_shmem_setup(struct drm_i915_private *i915, | 
|---|
| 133 | u16 type, u16 instance); | 
|---|
| 134 |  | 
|---|
| 135 | #endif | 
|---|
| 136 |  | 
|---|