Skip to content

Commit 6fca30d

Browse files
jlawrynojfvogel
authored andcommitted
accel/ivpu: Fix fw log printing
commit 4bc988b upstream. - Fix empty log detection that couldn't work without read_wrap_count - Start printing wrapped log from correct position (log_start) - Properly handle logs that are wrapped multiple times in reference to reader position - Don't add a newline when log buffer is wrapped - Always add a newline after printing a log buffer in case log does not end with one Reviewed-by: Tomasz Rusinowicz <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Jacek Lawrynowicz <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]> (cherry picked from commit 58517eae326e50ec208ffbf11a2bff90ac64a2cd) Signed-off-by: Jack Vogel <[email protected]>
1 parent 6c1a5e0 commit 6fca30d

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

drivers/accel/ivpu/ivpu_fw_log.c

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -87,31 +87,37 @@ static void fw_log_print_lines(char *buffer, u32 size, struct drm_printer *p)
8787
}
8888
line[index] = 0;
8989
if (index != 0)
90-
drm_printf(p, "%s\n", line);
90+
drm_printf(p, "%s", line);
9191
}
9292

9393
static void fw_log_print_buffer(struct vpu_tracing_buffer_header *log, const char *prefix,
9494
bool only_new_msgs, struct drm_printer *p)
9595
{
9696
char *log_data = (void *)log + log->header_size;
9797
u32 data_size = log->size - log->header_size;
98-
u32 log_start = log->read_index;
99-
u32 log_end = log->write_index;
98+
u32 log_start = only_new_msgs ? READ_ONCE(log->read_index) : 0;
99+
u32 log_end = READ_ONCE(log->write_index);
100100

101-
if (!(log->write_index || log->wrap_count) ||
102-
(log->write_index == log->read_index && only_new_msgs)) {
103-
drm_printf(p, "==== %s \"%s\" log empty ====\n", prefix, log->name);
104-
return;
101+
if (log->wrap_count == log->read_wrap_count) {
102+
if (log_end <= log_start) {
103+
drm_printf(p, "==== %s \"%s\" log empty ====\n", prefix, log->name);
104+
return;
105+
}
106+
} else if (log->wrap_count == log->read_wrap_count + 1) {
107+
if (log_end > log_start)
108+
log_start = log_end;
109+
} else {
110+
log_start = log_end;
105111
}
106112

107113
drm_printf(p, "==== %s \"%s\" log start ====\n", prefix, log->name);
108-
if (log->write_index > log->read_index) {
114+
if (log_end > log_start) {
109115
fw_log_print_lines(log_data + log_start, log_end - log_start, p);
110116
} else {
111-
fw_log_print_lines(log_data + log_end, data_size - log_end, p);
117+
fw_log_print_lines(log_data + log_start, data_size - log_start, p);
112118
fw_log_print_lines(log_data, log_end, p);
113119
}
114-
drm_printf(p, "\x1b[0m");
120+
drm_printf(p, "\n\x1b[0m"); /* add new line and clear formatting */
115121
drm_printf(p, "==== %s \"%s\" log end ====\n", prefix, log->name);
116122
}
117123

@@ -135,14 +141,19 @@ void ivpu_fw_log_print(struct ivpu_device *vdev, bool only_new_msgs, struct drm_
135141
void ivpu_fw_log_mark_read(struct ivpu_device *vdev)
136142
{
137143
struct vpu_tracing_buffer_header *log;
138-
u32 next = 0;
144+
u32 next;
139145

140-
while (fw_log_from_bo(vdev, vdev->fw->mem_log_crit, &next, &log) == 0)
141-
log->read_index = log->write_index;
146+
next = 0;
147+
while (fw_log_from_bo(vdev, vdev->fw->mem_log_crit, &next, &log) == 0) {
148+
log->read_index = READ_ONCE(log->write_index);
149+
log->read_wrap_count = READ_ONCE(log->wrap_count);
150+
}
142151

143152
next = 0;
144-
while (fw_log_from_bo(vdev, vdev->fw->mem_log_verb, &next, &log) == 0)
145-
log->read_index = log->write_index;
153+
while (fw_log_from_bo(vdev, vdev->fw->mem_log_verb, &next, &log) == 0) {
154+
log->read_index = READ_ONCE(log->write_index);
155+
log->read_wrap_count = READ_ONCE(log->wrap_count);
156+
}
146157
}
147158

148159
void ivpu_fw_log_reset(struct ivpu_device *vdev)
@@ -151,10 +162,14 @@ void ivpu_fw_log_reset(struct ivpu_device *vdev)
151162
u32 next;
152163

153164
next = 0;
154-
while (fw_log_from_bo(vdev, vdev->fw->mem_log_crit, &next, &log) == 0)
165+
while (fw_log_from_bo(vdev, vdev->fw->mem_log_crit, &next, &log) == 0) {
155166
log->read_index = 0;
167+
log->read_wrap_count = 0;
168+
}
156169

157170
next = 0;
158-
while (fw_log_from_bo(vdev, vdev->fw->mem_log_verb, &next, &log) == 0)
171+
while (fw_log_from_bo(vdev, vdev->fw->mem_log_verb, &next, &log) == 0) {
159172
log->read_index = 0;
173+
log->read_wrap_count = 0;
174+
}
160175
}

0 commit comments

Comments
 (0)