@@ -44,7 +44,7 @@ struct dma_log {
4444 uint32_t address ;
4545};
4646
47- static int fetch_entry (FILE * f_ldc , FILE * f_dma , uint32_t base_address ,
47+ static int fetch_entry (FILE * f_ldc , FILE * f_in , uint32_t base_address ,
4848 uint32_t data_offset , struct dma_log dma_log );
4949static void print_table_header (void );
5050static void print_entry_params (struct dma_log dma_log , struct ldc_entry );
@@ -95,14 +95,15 @@ static void print_entry_params(struct dma_log dma_log,
9595
9696static void usage (char * name )
9797{
98- fprintf (stdout , "Usage %s <file(s)>\n" , name );
99- fprintf (stdout , "%s:\t Parse traces logs\n" , name );
100- fprintf (stdout , "%s:\t -l *.ldc_file\t-d dma_dump_file\n" , name );
98+ fprintf (stdout , "Usage %s <option(s)> <file(s)>\n" , name );
99+ fprintf (stdout , "%s:\t \t\t\tParse traces logs\n" , name );
100+ fprintf (stdout , "%s:\t -l *.ldc_file\t-i in_file\n" , name );
101+ fprintf (stdout , "%s:\t -t\t\t\tDisplay dma trace data\n" , name );
101102 exit (0 );
102103}
103104
104105
105- static int fetch_entry (FILE * f_ldc , FILE * f_dma , uint32_t base_address ,
106+ static int fetch_entry (FILE * f_ldc , FILE * f_in , uint32_t base_address ,
106107 uint32_t data_offset , struct dma_log dma_log )
107108{
108109
@@ -176,9 +177,9 @@ static int fetch_entry(FILE *f_ldc, FILE *f_dma, uint32_t base_address,
176177 entry .params = (uint32_t * ) malloc (sizeof (uint32_t ) *
177178 entry .header .params_num );
178179 ret = fread (entry .params , sizeof (uint32_t ), entry .header .params_num ,
179- f_dma );
180+ f_in );
180181 if (ret != entry .header .params_num ) {
181- ret = - ferror (f_dma );
182+ ret = - ferror (f_in );
182183 goto out ;
183184 }
184185
@@ -198,57 +199,92 @@ static int fetch_entry(FILE *f_ldc, FILE *f_dma, uint32_t base_address,
198199 return ret ;
199200}
200201
201- int main ( int argc , char * argv [] )
202+ static int logger_read ( const char * in_file , FILE * f_ldc , struct snd_sof_logs_header * snd )
202203{
203204 struct dma_log dma_log ;
204- struct snd_sof_logs_header snd ;
205+ FILE * f_in = NULL ;
206+ int ret = 0 ;
205207
206- int ret ;
207- int opt ;
208+ f_in = fopen (in_file , "r" );
209+
210+ if (f_in == NULL ) {
211+ fprintf (stderr , "Error while opening %s. \n" , in_file );
212+ ret = errno ;
213+ goto out ;
214+ }
215+
216+ print_table_header ();
217+
218+ while (!feof (f_in )) {
219+
220+ /* getting entry parameters from dma dump */
221+ ret = fread (& dma_log , sizeof (dma_log ), 1 , f_in );
222+ if (!ret ) {
223+ ret = - ferror (f_in );
224+ goto out ;
225+ }
208226
209- const char * ldc_dir = NULL ;
210- const char * dma_dump = NULL ;
227+ /* checking log address */
228+ if ((dma_log .address < snd -> base_address ) ||
229+ (dma_log .address > (snd -> base_address + snd -> data_length )))
230+ continue ;
231+
232+ /* fetching entry from elf dump*/
233+ ret = fetch_entry (f_ldc , f_in , snd -> base_address ,
234+ snd -> data_offset , dma_log );
235+ if (ret )
236+ break ;
237+ }
238+
239+ out :
240+ if (f_ldc ) fclose (f_ldc );
241+ if (f_in ) fclose (f_in );
242+
243+ return ret ;
244+
245+ }
246+
247+ int main (int argc , char * argv [])
248+ {
249+ struct snd_sof_logs_header snd ;
250+ const char * ldc_file = NULL ;
251+ const char * in_file = NULL ;
252+ int opt , trace = 0 , ret = 0 ;
253+ FILE * f_ldc = NULL ;
211254
212- while ((opt = getopt (argc , argv , "l:d: " )) != -1 ) {
255+ while ((opt = getopt (argc , argv , "l:i:th " )) != -1 ) {
213256 switch (opt ) {
214257 case 'l' :
215- ldc_dir = optarg ;
258+ ldc_file = optarg ;
259+ break ;
260+ case 'i' :
261+ in_file = optarg ;
216262 break ;
217- case 'd ' :
218- dma_dump = optarg ;
263+ case 't ' :
264+ trace = 1 ;
219265 break ;
266+ case 'h' :
220267 default :
221268 usage (argv [0 ]);
222269 }
223270 }
224271
225- if (!ldc_dir ) {
272+ if (!ldc_file ) {
226273 fprintf (stderr , "error: invalid ldc file.\n" );
227- return - EINVAL ;
228- }
229- if (!dma_dump ) {
230- fprintf (stderr , "error: invalid dma_dump file.\n" );
274+ usage (argv [0 ]);
231275 return - EINVAL ;
232276 }
233277
234- FILE * f_ldc = fopen (ldc_dir , "r" );
235- FILE * f_dma = fopen (dma_dump , "r" );
278+ f_ldc = fopen (ldc_file , "r" );
236279
237280 if (f_ldc == NULL ) {
238- fprintf (stderr , "Error while opening %s. \n" , ldc_dir );
239- ret = errno ;
240- goto out ;
241- }
242-
243- if (f_dma == NULL ) {
244- fprintf (stderr , "Error while opening %s. \n" , dma_dump );
281+ fprintf (stderr , "Error while opening %s. \n" , ldc_file );
245282 ret = errno ;
246283 goto out ;
247284 }
248285
249286 /* set file positions to the beginning */
250287 rewind (f_ldc );
251- rewind (f_dma );
252288
253289 /* veryfing ldc signature */
254290 ret = fread (& snd , sizeof (snd ), 1 , f_ldc );
@@ -263,31 +299,17 @@ int main(int argc, char *argv[])
263299 goto out ;
264300 }
265301
266- print_table_header ();
267-
268- while (!feof (f_dma )) {
269-
270- /* getting entry parameters from dma dump */
271- ret = fread (& dma_log , sizeof (dma_log ), 1 , f_dma );
272- if (!ret ) {
273- ret = - ferror (f_dma );
274- goto out ;
275- }
302+ /* dma trace requested */
303+ if (trace )
304+ return logger_read ("/sys/kernel/debug/sof/trace" , f_ldc , & snd );
276305
277- /* checking log address */
278- if ((dma_log .address < snd .base_address ) ||
279- (dma_log .address > (snd .base_address + snd .data_length )))
280- continue ;
306+ /* default option with no infile is to dump errors/debug data */
307+ if (!in_file )
308+ return logger_read ("/sys/kernel/debug/sof/etrace" , f_ldc , & snd );
281309
282- /* fetching entry from elf dump*/
283- ret = fetch_entry (f_ldc , f_dma , snd .base_address ,
284- snd .data_offset , dma_log );
285- if (ret ) goto out ;
286- }
310+ return logger_read (in_file , f_ldc , & snd );
287311
288- ret = 0 ;
289312out :
290- if (f_dma ) fclose (f_dma );
291313 if (f_ldc ) fclose (f_ldc );
292314
293315 return ret ;
0 commit comments