Skip to content
Snippets Groups Projects
Commit 6cc9f38c authored by Satyajit Desai's avatar Satyajit Desai
Browse files

dcc_parser: Add suppport for version 2 of DCC driver

This change adds support for version 2 of the DCC driver. Added
a new option '--v2' to identify the driver version used to
collect the trace data.

Change-Id: Ia39109051c6f12a64495cb6f07cdd990bac62859
parent c4771750
No related branches found
No related tags found
No related merge requests found
# Copyright (c) 2015, The Linux Foundation. All rights reserved. # Copyright (c) 2015, 2017, The Linux Foundation. All rights reserved.
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 and # it under the terms of the GNU General Public License version 2 and
...@@ -44,6 +44,12 @@ def add_addr(base, offset, length): ...@@ -44,6 +44,12 @@ def add_addr(base, offset, length):
address.append(addr) address.append(addr)
def add_loop_addr(loop_nr, loop_count):
for i in range(0, loop_count):
for j in range(len(address) - loop_nr, len(address)):
address.append(address[j])
def read_data(data_pt): def read_data(data_pt):
nr = count nr = count
while nr > 0: while nr > 0:
...@@ -59,9 +65,28 @@ def read_data(data_pt): ...@@ -59,9 +65,28 @@ def read_data(data_pt):
def read_config(config_pt): def read_config(config_pt):
nr = 0 list_nr = []
list_nr.append(0)
offset = 0 offset = 0
base = 0 base = 0
if options.version is None:
address_descriptor = 0x1 << 31
link_descriptor = 0
loop_descriptor = None
rd_mod_wr_descriptor = None
link_second_arg = 8
# We return zero and fail
on_zero_link_len = 0
else:
address_descriptor = 0
link_descriptor = 0x3 << 30
loop_descriptor = 0x1 << 30
rd_mod_wr_descriptor = 0x1 << 31
link_second_arg = 7
#indicates end of list
on_zero_link_len = -1
while True: while True:
word = config_pt.read(4) word = config_pt.read(4)
if len(word) != 4: if len(word) != 4:
...@@ -72,27 +97,61 @@ def read_config(config_pt): ...@@ -72,27 +97,61 @@ def read_config(config_pt):
if val == 0: if val == 0:
break break
if val & (1 << 31): descriptor = val & (0x3 << 30)
if descriptor == address_descriptor:
base = ((val & 0x0FFFFFFF) << 4) base = ((val & 0x0FFFFFFF) << 4)
offset = 0 offset = 0
else: elif descriptor == link_descriptor:
for i in range(0, 2): for i in range(0, 2):
offset = offset + (val & 0xFF) * 4 offset = offset + (val & 0xFF) * 4
val = val >> 8 val = val >> 8
length = (val & 0x7f) length = (val & 0x7f)
val = val >> 8 val = val >> link_second_arg
if length != 0: if length != 0:
nr += length list_nr.append(length + list_nr[- 1])
add_addr(base, offset, length) add_addr(base, offset, length)
else: else:
if (i == 0): if (i == 0 ):
log.error("Error! Found zero length!") return list_nr[on_zero_link_len]
return 0
else: else:
offset = 0 offset = 0
return nr elif descriptor == loop_descriptor:
loop_offset = val & 0x1FFF
loop_count = (val & 0xFFFE000) >> 13
if loop_offset == 0:
continue
loop_nr = list_nr[-1] - list_nr[-loop_offset]
list_nr.append(loop_nr * loop_count + list_nr[-1])
add_loop_addr(loop_nr, loop_count)
elif descriptor == rd_mod_wr_descriptor:
'''
Skip over mask and value of rd_mod_wr.
There is no gaurantee of this being actually written
and we never read the value back to confirm.
'''
config_pt.seek(8, 1)
return list_nr[-1]
def new_linked_list(config_pt):
word = config_pt.read(4)
if len(word)!= 4:
return False
else:
val = struct.unpack('<L', word)[0]
if val != 0:
config_pt.seek(-4, 1)
return True
else:
return False
def dump_regs_json(options): def dump_regs_json(options):
...@@ -128,11 +187,16 @@ def dump_regs_xml(options): ...@@ -128,11 +187,16 @@ def dump_regs_xml(options):
def dump_regs(options): def dump_regs(options):
if not address:
log.error('No configuration found in SRAM!!')
sys.exit(1)
if options.json is True: if options.json is True:
dump_regs_json(options) dump_regs_json(options)
else: else:
dump_regs_xml(options) dump_regs_xml(options)
if __name__ == '__main__': if __name__ == '__main__':
usage = 'usage: %prog [options to print]. Run with --help for more details' usage = 'usage: %prog [options to print]. Run with --help for more details'
parser = OptionParser(usage) parser = OptionParser(usage)
...@@ -148,6 +212,8 @@ if __name__ == '__main__': ...@@ -148,6 +212,8 @@ if __name__ == '__main__':
parser.add_option('', '--chip-name', dest='chipname', help='chip name') parser.add_option('', '--chip-name', dest='chipname', help='chip name')
parser.add_option('', '--chip-version', dest='chipversion', parser.add_option('', '--chip-version', dest='chipversion',
help='chip version') help='chip version')
parser.add_option('--v2', dest='version', action="store_const", const='2',
help='DCC driver version 2')
(options, args) = parser.parse_args() (options, args) = parser.parse_args()
...@@ -199,18 +265,20 @@ if __name__ == '__main__': ...@@ -199,18 +265,20 @@ if __name__ == '__main__':
sys.exit(1) sys.exit(1)
count = 0 count = 0
count = read_config(sram_file) while True:
if options.atbfile is None: count = read_config(sram_file)
atb_file = sram_file
if count == 0:
log.error('No configuration found in SRAM!!')
sys.exit(1)
if read_data(atb_file): if options.atbfile is None:
log.error('Couldn\'t read complete data.') atb_file = sram_file
else:
parsed_data = log_init('PARSED_DATA', options.outdir, options.outfile) if read_data(sram_file):
dump_regs(options) log.error('Couldn\'t read complete data.')
break
if new_linked_list(sram_file) is False:
parsed_data = log_init('PARSED_DATA', options.outdir, options.outfile)
dump_regs(options)
break
sram_file.close() sram_file.close()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment