@@ -57,3 +57,8 @@ void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
{
i915_debugfs_describe_obj(m, to_intel_bo(obj));
}
+
+void intel_bo_panic_map(struct drm_gem_object *obj, struct iosys_map *map)
+{
+ i915_gem_object_panic_map(to_intel_bo(obj), map);
+}
@@ -23,5 +23,6 @@ struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
struct intel_frontbuffer *front);
void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
+void intel_bo_panic_map(struct drm_gem_object *obj, struct iosys_map *map);
#endif /* __INTEL_BO__ */
@@ -692,6 +692,8 @@ i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
int i915_gem_object_truncate(struct drm_i915_gem_object *obj);
+void i915_gem_object_panic_map(struct drm_i915_gem_object *obj, struct iosys_map *map);
+
/**
* i915_gem_object_pin_map - return a contiguous mapping of the entire object
* @obj: the object to map into kernel address space
@@ -355,6 +355,35 @@ static void *i915_gem_object_map_pfn(struct drm_i915_gem_object *obj,
return vaddr ?: ERR_PTR(-ENOMEM);
}
+/* Map the current framebuffer for CPU access. Called from panic handler, so no
+ * need to pin or cleanup.
+ */
+void i915_gem_object_panic_map(struct drm_i915_gem_object *obj, struct iosys_map *map)
+{
+ enum i915_map_type has_type;
+ void *ptr;
+
+ ptr = page_unpack_bits(obj->mm.mapping, &has_type);
+
+
+ if (!ptr) {
+ if (i915_gem_object_has_struct_page(obj))
+ ptr = i915_gem_object_map_page(obj, I915_MAP_WB);
+ else
+ ptr = i915_gem_object_map_pfn(obj, I915_MAP_WB);
+
+ if (IS_ERR(ptr))
+ return;
+
+ obj->mm.mapping = page_pack_bits(ptr, I915_MAP_WB);
+ }
+
+ if (i915_gem_object_has_iomem(obj))
+ iosys_map_set_vaddr_iomem(map, (void __iomem *) ptr);
+ else
+ iosys_map_set_vaddr(map, ptr);
+}
+
/* get, pin, and map the pages of the object into kernel space */
void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
enum i915_map_type type)
@@ -59,3 +59,13 @@ void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
{
/* FIXME */
}
+
+void intel_bo_panic_map(struct drm_gem_object *obj, struct iosys_map *map)
+{
+ struct xe_bo *bo = gem_to_xe_bo(obj);
+ int ret;
+
+ ret = ttm_bo_vmap(&bo->ttm, map);
+ if (ret)
+ iosys_map_clear(map);
+}
Prepare the work for drm_panic support. This is used to map the current framebuffer, so the CPU can overwrite it with the panic message. Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com> --- v5: * Use iosys_map for intel_bo_panic_map(). drivers/gpu/drm/i915/display/intel_bo.c | 5 ++++ drivers/gpu/drm/i915/display/intel_bo.h | 1 + drivers/gpu/drm/i915/gem/i915_gem_object.h | 2 ++ drivers/gpu/drm/i915/gem/i915_gem_pages.c | 29 ++++++++++++++++++++++ drivers/gpu/drm/xe/display/intel_bo.c | 10 ++++++++ 5 files changed, 47 insertions(+)