@@ -87,31 +87,37 @@ static void fw_log_print_lines(char *buffer, u32 size, struct drm_printer *p)
87
87
}
88
88
line [index ] = 0 ;
89
89
if (index != 0 )
90
- drm_printf (p , "%s\n " , line );
90
+ drm_printf (p , "%s" , line );
91
91
}
92
92
93
93
static void fw_log_print_buffer (struct vpu_tracing_buffer_header * log , const char * prefix ,
94
94
bool only_new_msgs , struct drm_printer * p )
95
95
{
96
96
char * log_data = (void * )log + log -> header_size ;
97
97
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 ) ;
100
100
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 ;
105
111
}
106
112
107
113
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 ) {
109
115
fw_log_print_lines (log_data + log_start , log_end - log_start , p );
110
116
} 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 );
112
118
fw_log_print_lines (log_data , log_end , p );
113
119
}
114
- drm_printf (p , "\x1b[0m" );
120
+ drm_printf (p , "\n\ x1b[0m" ); /* add new line and clear formatting */
115
121
drm_printf (p , "==== %s \"%s\" log end ====\n" , prefix , log -> name );
116
122
}
117
123
@@ -135,14 +141,19 @@ void ivpu_fw_log_print(struct ivpu_device *vdev, bool only_new_msgs, struct drm_
135
141
void ivpu_fw_log_mark_read (struct ivpu_device * vdev )
136
142
{
137
143
struct vpu_tracing_buffer_header * log ;
138
- u32 next = 0 ;
144
+ u32 next ;
139
145
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
+ }
142
151
143
152
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
+ }
146
157
}
147
158
148
159
void ivpu_fw_log_reset (struct ivpu_device * vdev )
@@ -151,10 +162,14 @@ void ivpu_fw_log_reset(struct ivpu_device *vdev)
151
162
u32 next ;
152
163
153
164
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 ) {
155
166
log -> read_index = 0 ;
167
+ log -> read_wrap_count = 0 ;
168
+ }
156
169
157
170
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 ) {
159
172
log -> read_index = 0 ;
173
+ log -> read_wrap_count = 0 ;
174
+ }
160
175
}
0 commit comments