0001
0002
0003
0004
0005
0006 #ifndef __INTEL_MEMORY_REGION_H__
0007 #define __INTEL_MEMORY_REGION_H__
0008
0009 #include <linux/ioport.h>
0010 #include <linux/mutex.h>
0011 #include <linux/io-mapping.h>
0012 #include <drm/drm_mm.h>
0013 #include <uapi/drm/i915_drm.h>
0014
0015 struct drm_i915_private;
0016 struct drm_i915_gem_object;
0017 struct drm_printer;
0018 struct intel_memory_region;
0019 struct sg_table;
0020 struct ttm_resource;
0021
0022 enum intel_memory_type {
0023 INTEL_MEMORY_SYSTEM = I915_MEMORY_CLASS_SYSTEM,
0024 INTEL_MEMORY_LOCAL = I915_MEMORY_CLASS_DEVICE,
0025 INTEL_MEMORY_STOLEN_SYSTEM,
0026 INTEL_MEMORY_STOLEN_LOCAL,
0027 INTEL_MEMORY_MOCK,
0028 };
0029
0030 enum intel_region_id {
0031 INTEL_REGION_SMEM = 0,
0032 INTEL_REGION_LMEM_0,
0033 INTEL_REGION_LMEM_1,
0034 INTEL_REGION_LMEM_2,
0035 INTEL_REGION_LMEM_3,
0036 INTEL_REGION_STOLEN_SMEM,
0037 INTEL_REGION_STOLEN_LMEM,
0038 INTEL_REGION_UNKNOWN,
0039 };
0040
0041 #define REGION_SMEM BIT(INTEL_REGION_SMEM)
0042 #define REGION_LMEM BIT(INTEL_REGION_LMEM_0)
0043 #define REGION_STOLEN_SMEM BIT(INTEL_REGION_STOLEN_SMEM)
0044 #define REGION_STOLEN_LMEM BIT(INTEL_REGION_STOLEN_LMEM)
0045
0046 #define I915_ALLOC_CONTIGUOUS BIT(0)
0047
0048 #define for_each_memory_region(mr, i915, id) \
0049 for (id = 0; id < ARRAY_SIZE((i915)->mm.regions); id++) \
0050 for_each_if((mr) = (i915)->mm.regions[id])
0051
0052 struct intel_memory_region_ops {
0053 unsigned int flags;
0054
0055 int (*init)(struct intel_memory_region *mem);
0056 int (*release)(struct intel_memory_region *mem);
0057
0058 int (*init_object)(struct intel_memory_region *mem,
0059 struct drm_i915_gem_object *obj,
0060 resource_size_t offset,
0061 resource_size_t size,
0062 resource_size_t page_size,
0063 unsigned int flags);
0064 };
0065
0066 struct intel_memory_region {
0067 struct drm_i915_private *i915;
0068
0069 const struct intel_memory_region_ops *ops;
0070
0071 struct io_mapping iomap;
0072 struct resource region;
0073
0074 resource_size_t io_start;
0075 resource_size_t io_size;
0076 resource_size_t min_page_size;
0077 resource_size_t total;
0078
0079 u16 type;
0080 u16 instance;
0081 enum intel_region_id id;
0082 char name[16];
0083 bool private;
0084
0085 struct {
0086 struct mutex lock;
0087 struct list_head list;
0088 } objects;
0089
0090 bool is_range_manager;
0091
0092 void *region_private;
0093 };
0094
0095 struct intel_memory_region *
0096 intel_memory_region_lookup(struct drm_i915_private *i915,
0097 u16 class, u16 instance);
0098
0099 struct intel_memory_region *
0100 intel_memory_region_create(struct drm_i915_private *i915,
0101 resource_size_t start,
0102 resource_size_t size,
0103 resource_size_t min_page_size,
0104 resource_size_t io_start,
0105 resource_size_t io_size,
0106 u16 type,
0107 u16 instance,
0108 const struct intel_memory_region_ops *ops);
0109
0110 void intel_memory_region_destroy(struct intel_memory_region *mem);
0111
0112 int intel_memory_regions_hw_probe(struct drm_i915_private *i915);
0113 void intel_memory_regions_driver_release(struct drm_i915_private *i915);
0114 struct intel_memory_region *
0115 intel_memory_region_by_type(struct drm_i915_private *i915,
0116 enum intel_memory_type mem_type);
0117
0118 __printf(2, 3) void
0119 intel_memory_region_set_name(struct intel_memory_region *mem,
0120 const char *fmt, ...);
0121
0122 int intel_memory_region_reserve(struct intel_memory_region *mem,
0123 resource_size_t offset,
0124 resource_size_t size);
0125
0126 void intel_memory_region_debug(struct intel_memory_region *mr,
0127 struct drm_printer *printer);
0128
0129 void intel_memory_region_avail(struct intel_memory_region *mr,
0130 u64 *avail, u64 *visible_avail);
0131
0132 struct intel_memory_region *
0133 i915_gem_ttm_system_setup(struct drm_i915_private *i915,
0134 u16 type, u16 instance);
0135 struct intel_memory_region *
0136 i915_gem_shmem_setup(struct drm_i915_private *i915,
0137 u16 type, u16 instance);
0138
0139 #endif