@@ -6,9 +6,12 @@
#include "xe_guc_log.h"
#include <drm/drm_managed.h>
+#include <linux/vmalloc.h>
#include "xe_bo.h"
+#include "xe_devcoredump.h"
#include "xe_gt.h"
+#include "xe_gt_printk.h"
#include "xe_map.h"
#include "xe_module.h"
@@ -49,32 +52,35 @@ static size_t guc_log_size(void)
CAPTURE_BUFFER_SIZE;
}
+/**
+ * xe_guc_log_print - dump a copy of the GuC log to some useful location
+ * @log: GuC log structure
+ * @p: the printer object to output to
+ */
void xe_guc_log_print(struct xe_guc_log *log, struct drm_printer *p)
{
struct xe_device *xe = log_to_xe(log);
size_t size;
- int i, j;
+ void *copy;
- xe_assert(xe, log->bo);
+ if (!log->bo) {
+ drm_puts(p, "GuC log buffer not allocated");
+ return;
+ }
size = log->bo->size;
-#define DW_PER_READ 128
- xe_assert(xe, !(size % (DW_PER_READ * sizeof(u32))));
- for (i = 0; i < size / sizeof(u32); i += DW_PER_READ) {
- u32 read[DW_PER_READ];
-
- xe_map_memcpy_from(xe, read, &log->bo->vmap, i * sizeof(u32),
- DW_PER_READ * sizeof(u32));
-#define DW_PER_PRINT 4
- for (j = 0; j < DW_PER_READ / DW_PER_PRINT; ++j) {
- u32 *print = read + j * DW_PER_PRINT;
-
- drm_printf(p, "0x%08x 0x%08x 0x%08x 0x%08x\n",
- *(print + 0), *(print + 1),
- *(print + 2), *(print + 3));
- }
+ copy = vmalloc(size);
+ if (!copy) {
+ drm_printf(p, "Failed to allocate %zu", size);
+ return;
}
+
+ xe_map_memcpy_from(xe, copy, &log->bo->vmap, 0, size);
+
+ xe_print_blob_ascii85(p, "Log data", copy, 0, size);
+
+ vfree(copy);
}
int xe_guc_log_init(struct xe_guc_log *log)