Quoting Matthew Auld (2019-08-09 23:26:42)
From: Abdiel Janulgue abdiel.janulgue@linux.intel.com
Returns the available memory region areas supported by the HW.
And how does one use this information?
How does this relate to the information presented by Vulkan or OpenCL
Testcase: igt/...?
New uAPI should always come with a testcase.
Signed-off-by: Abdiel Janulgue abdiel.janulgue@linux.intel.com Cc: Joonas Lahtinen joonas.lahtinen@linux.intel.com
drivers/gpu/drm/i915/i915_query.c | 57 +++++++++++++++++++++++++++++++ include/uapi/drm/i915_drm.h | 39 +++++++++++++++++++++ 2 files changed, 96 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_query.c b/drivers/gpu/drm/i915/i915_query.c index ad9240a0817a..69a2a906feef 100644 --- a/drivers/gpu/drm/i915/i915_query.c +++ b/drivers/gpu/drm/i915/i915_query.c @@ -142,10 +142,67 @@ query_engine_info(struct drm_i915_private *i915, return len; }
+static int query_memregion_info(struct drm_i915_private *dev_priv,
struct drm_i915_query_item *query_item)
+{
struct drm_i915_query_memory_region_info __user *query_ptr =
u64_to_user_ptr(query_item->data_ptr);
struct drm_i915_memory_region_info __user *info_ptr =
&query_ptr->regions[0];
struct drm_i915_memory_region_info info = { };
struct drm_i915_query_memory_region_info query;
u32 total_length;
int ret, i;
if (query_item->flags != 0)
return -EINVAL;
total_length = sizeof(struct drm_i915_query_memory_region_info);
for (i = 0; i < ARRAY_SIZE(dev_priv->regions); ++i) {
struct intel_memory_region *region = dev_priv->regions[i];
if (!region)
continue;
total_length += sizeof(struct drm_i915_memory_region_info);
}
ret = copy_query_item(&query, sizeof(query), total_length,
query_item);
if (ret != 0)
return ret;
if (query.num_regions || query.rsvd[0] || query.rsvd[1] ||
query.rsvd[2])
return -EINVAL;
for (i = 0; i < ARRAY_SIZE(dev_priv->regions); ++i) {
struct intel_memory_region *region = dev_priv->regions[i];
if (!region)
continue;
info.id = region->id;
info.size = resource_size(®ion->region);
if (__copy_to_user(info_ptr, &info, sizeof(info)))
return -EFAULT;
query.num_regions++;
info_ptr++;
}
if (__copy_to_user(query_ptr, &query, sizeof(query)))
return -EFAULT;
return total_length;
+}
static int (* const i915_query_funcs[])(struct drm_i915_private *dev_priv, struct drm_i915_query_item *query_item) = { query_topology_info, query_engine_info,
query_memregion_info,
};
int i915_query_ioctl(struct drm_device *dev, void *data, struct drm_file *file) diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index 75d79c17e91b..7ef037f58e1b 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h @@ -2038,6 +2038,7 @@ struct drm_i915_query_item { __u64 query_id; #define DRM_I915_QUERY_TOPOLOGY_INFO 1 #define DRM_I915_QUERY_ENGINE_INFO 2 +#define DRM_I915_QUERY_MEMREGION_INFO 3 /* Must be kept compact -- no holes and well documented */
/*
@@ -2177,6 +2178,44 @@ struct drm_i915_query_engine_info { struct drm_i915_engine_info engines[]; };
+struct drm_i915_memory_region_info {
/** Base type of a region
*/
+#define I915_SYSTEM_MEMORY 0 +#define I915_DEVICE_MEMORY 1
/** The region id is encoded in a layout which makes it possible to
* retrieve the following information:
*
* Base type: log2(ID >> 16)
* Instance: log2(ID & 0xffff)
*/
__u32 id;
You still haven't given userspace the basics such as total size and chunk size.
/** Reserved field. MBZ */
__u32 rsvd0;
/** Unused for now. MBZ */
__u64 flags;
__u64 size;
/** Reserved fields must be cleared to zero. */
__u64 rsvd1[4];
+};
+struct drm_i915_query_memory_region_info {
/** Number of struct drm_i915_memory_region_info structs */
__u32 num_regions;
/** MBZ */
__u32 rsvd[3];
struct drm_i915_memory_region_info regions[];
+};
#if defined(__cplusplus) }
#endif
2.20.1
Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx