Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
tools
Manage
Activity
Members
Plan
Wiki
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package Registry
Model registry
Operate
Terraform modules
Analyze
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
CodeLinaro
public-release-test-restored
platform
vendor
qcom-opensource
tools
Commits
d4c59a75
Commit
d4c59a75
authored
6 years ago
by
Linux Build Service Account
Committed by
Gerrit - the friendly Code Review server
6 years ago
Browse files
Options
Downloads
Plain Diff
Merge "lrdp-v2: add Support for parsing DRM SDE regs and EVT logs"
parents
1b0b6dc1
22204330
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
linux-ramdump-parser-v2/parsers/mdpinfo.py
+140
-27
140 additions, 27 deletions
linux-ramdump-parser-v2/parsers/mdpinfo.py
with
140 additions
and
27 deletions
linux-ramdump-parser-v2/parsers/mdpinfo.py
100755 → 100644
+
140
−
27
View file @
d4c59a75
# Copyright (c) 2016, The Linux Foundation. All rights reserved.
# Copyright (c) 2016,
2018
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
...
@@ -26,7 +26,6 @@ class MdssDbgBase(Struct):
...
@@ -26,7 +26,6 @@ class MdssDbgBase(Struct):
'
reg_dump
'
:
Struct
.
get_pointer
,
'
reg_dump
'
:
Struct
.
get_pointer
,
}
}
class
MdssDbgXlog
(
Struct
):
class
MdssDbgXlog
(
Struct
):
def
get_dbgbase_arr
(
self
,
key
):
def
get_dbgbase_arr
(
self
,
key
):
arr
=
self
.
get_array_ptrs
(
key
)
arr
=
self
.
get_array_ptrs
(
key
)
...
@@ -37,8 +36,16 @@ class MdssDbgXlog(Struct):
...
@@ -37,8 +36,16 @@ class MdssDbgXlog(Struct):
'
blk_arr
'
:
get_dbgbase_arr
,
'
blk_arr
'
:
get_dbgbase_arr
,
}
}
class
SdeDbgBase
(
Struct
):
_struct_name
=
"
struct sde_dbg_base
"
_fields
=
{
'
evtlog
'
:
Struct
.
get_pointer
,
'
reg_base_list
'
:
Struct
.
get_pointer
,
'
enable_reg_dump
'
:
Struct
.
get_u32
,
'
panic_on_err
'
:
Struct
.
get_u32
,
}
class
RangeDumpNode
(
Struct
):
class
RangeDump
Fb
Node
(
Struct
):
def
get_offset
(
self
,
key
):
def
get_offset
(
self
,
key
):
return
Struct
(
self
.
ramdump
,
self
.
get_address
(
key
),
return
Struct
(
self
.
ramdump
,
self
.
get_address
(
key
),
struct_name
=
"
struct dump_offset
"
,
struct_name
=
"
struct dump_offset
"
,
...
@@ -53,7 +60,25 @@ class RangeDumpNode(Struct):
...
@@ -53,7 +60,25 @@ class RangeDumpNode(Struct):
'
range_name
'
:
Struct
.
get_cstring
,
'
range_name
'
:
Struct
.
get_cstring
,
'
reg_dump
'
:
Struct
.
get_pointer
,
'
reg_dump
'
:
Struct
.
get_pointer
,
}
}
class
RangeDumpSdeNode
(
Struct
):
def
get_offset
(
self
,
key
):
return
Struct
(
self
.
ramdump
,
self
.
get_address
(
key
),
struct_name
=
"
struct sde_dbg_reg_offset
"
,
fields
=
{
'
start
'
:
Struct
.
get_u32
,
'
end
'
:
Struct
.
get_u32
,
})
_struct_name
=
"
struct sde_dbg_reg_range
"
_fields
=
{
'
offset
'
:
get_offset
,
'
range_name
'
:
Struct
.
get_cstring
,
'
reg_dump
'
:
Struct
.
get_pointer
,
}
def
get_u64
(
self
,
key
):
address
=
self
.
get_address
(
key
)
return
self
.
ramdump
.
read_u64
(
address
)
@register_parser
(
'
--print-mdpinfo
'
,
'
print mdp info
'
)
@register_parser
(
'
--print-mdpinfo
'
,
'
print mdp info
'
)
class
MDPinfo
(
RamParser
):
class
MDPinfo
(
RamParser
):
...
@@ -80,7 +105,7 @@ class MDPinfo(RamParser):
...
@@ -80,7 +105,7 @@ class MDPinfo(RamParser):
addr
+=
16
addr
+=
16
def
print_range
(
self
,
blk
,
node
):
def
print_range
(
self
,
blk
,
node
):
rng
=
RangeDumpNode
(
self
.
ramdump
,
node
)
rng
=
RangeDump
Fb
Node
(
self
.
ramdump
,
node
)
if
(
rng
.
offset
.
start
>
rng
.
offset
.
end
)
or
(
rng
.
offset
.
end
==
0
):
if
(
rng
.
offset
.
start
>
rng
.
offset
.
end
)
or
(
rng
.
offset
.
end
==
0
):
print_out_str
(
"
Invalid offsets (%d, %d) for range: %s
"
%
print_out_str
(
"
Invalid offsets (%d, %d) for range: %s
"
%
...
@@ -100,37 +125,125 @@ class MDPinfo(RamParser):
...
@@ -100,37 +125,125 @@ class MDPinfo(RamParser):
self
.
mdss_dump_reg
(
addr
,
length
,
rng
.
reg_dump
)
self
.
mdss_dump_reg
(
addr
,
length
,
rng
.
reg_dump
)
def
p
arse
(
self
):
def
p
rint_sderange
(
self
,
node
):
mdss_dbg
=
MdssDbgXlog
(
self
.
ramdump
,
'
mdss_dbg_xlog
'
)
rng
=
RangeDumpSdeNode
(
self
.
ramdump
,
node
)
if
mdss_dbg
.
is_empty
():
if
(
rng
.
offset
.
start
>
rng
.
offset
.
end
)
or
(
rng
.
offset
.
end
==
0
):
print_out_str
(
"
Invalid offsets (%d, %d) for range: %s
"
%
(
rng
.
offset
.
start
,
rng
.
offset
.
end
,
rng
.
range_name
))
return
return
for
blk
in
mdss_dbg
.
blk_arr
:
addr
=
node
+
rng
.
offset
.
start
if
blk
.
is_empty
():
continue
self
.
outfile
.
write
(
'
{0}: base=0x{1:x} start=0x{2:x} end=0x{3:x}
\n
'
.
format
(
rng
.
range_name
,
addr
,
rng
.
offset
.
start
,
rng
.
offset
.
end
))
self
.
outfile
.
write
(
'
start_addr:{0:x} end_addr:{1:x} reg_addr={2:x}
\n
'
.
format
(
rng
.
offset
.
start
,
rng
.
offset
.
end
,
addr
))
# Delays file creation until we have found a non-null array element
# Calculating length
if
not
self
.
outfile
:
self
.
outfile
=
self
.
ramdump
.
open_file
(
'
mdpinfo_out.txt
'
)
self
.
outfile
.
write
(
'
mdss_dump_reg_by_ranges:
'
length
=
rng
.
offset
.
end
-
rng
.
offset
.
start
'
=========%s DUMP=========
\n
'
%
blk
.
name
)
head_offset
=
self
.
ramdump
.
field_offset
(
'
struct range_dump_node
'
,
self
.
mdss_dump_reg
(
addr
,
length
,
rng
.
reg_dump
)
'
head
'
)
dump_list
=
ListWalker
(
self
.
ramdump
,
blk
.
dump_list
,
head_offset
)
def
parse
(
self
):
mdss_dbg
=
MdssDbgXlog
(
self
.
ramdump
,
'
mdss_dbg_xlog
'
)
if
mdss_dbg
.
is_empty
():
mdss_dbg
=
SdeDbgBase
(
self
.
ramdump
,
'
sde_dbg_base
'
)
if
mdss_dbg
.
is_empty
():
return
self
.
outfile
=
self
.
ramdump
.
open_file
(
'
MDPINFO_OUT.txt
'
)
dump_list
=
ListWalker
(
self
.
ramdump
,
mdss_dbg
.
reg_base_list
,
0
)
if
dump_list
.
is_empty
():
if
dump_list
.
is_empty
():
self
.
outfile
.
write
(
'
Ranges not found,
'
self
.
outfile
.
write
(
'
%s
\n
'
%
(
"
BLK DUMPLIST IS EMPTY!!!
"
))
'
will dump full registers
\n
'
)
return
self
.
outfile
.
write
(
'
base:0x%x length:%d
\n
'
%
for
blk
in
dump_list
:
(
blk
.
base
,
blk
.
max_offset
))
reg_blk
=
Struct
(
self
.
ramdump
,
blk
,
struct_name
=
"
struct sde_dbg_reg_base
"
,
fields
=
{
'
name
'
:
Struct
.
get_cstring
,
self
.
mdss_dump_reg
(
blk
.
base
,
blk
.
max_offset
,
blk
.
reg_dump
)
'
base
'
:
Struct
.
get_pointer
,
else
:
'
max_offset
'
:
Struct
.
get_u32
,
for
node
in
dump_list
:
'
sub_range_list
'
:
Struct
.
get_address
,
self
.
print_range
(
blk
,
node
)
'
reg_dump
'
:
Struct
.
get_pointer
})
if
(
reg_blk
.
base
==
0x0000
):
continue
self
.
outfile
.
write
(
'
%s %x
\n
'
%
(
"
BLK is:
"
,
blk
))
self
.
outfile
.
write
(
'
%s %s
\n
'
%
(
"
REG BLK is:
"
,
reg_blk
.
name
))
headoffset_2
=
self
.
ramdump
.
field_offset
(
'
struct sde_dbg_reg_range
'
,
'
head
'
)
sub_blk_list
=
ListWalker
(
self
.
ramdump
,
reg_blk
.
sub_range_list
,
headoffset_2
)
if
sub_blk_list
.
is_empty
():
self
.
outfile
.
write
(
'
Ranges not found,
''
will dump full registers
\n
'
)
self
.
outfile
.
write
(
'
base:0x%x length:%d
\n
'
%
(
reg_blk
.
base
,
reg_blk
.
max_offset
))
self
.
mdss_dump_reg
(
reg_blk
.
base
,
reg_blk
.
max_offset
,
reg_blk
.
reg_dump
)
else
:
for
node
in
sub_blk_list
:
self
.
print_sderange
(
node
)
# EVENT LOGS
self
.
outfile
=
self
.
ramdump
.
open_file
(
'
MDP_EVENT_LOGS.txt
'
)
evt_log
=
Struct
(
self
.
ramdump
,
mdss_dbg
.
evtlog
,
struct_name
=
"
struct sde_dbg_evtlog
"
,
fields
=
{
'
name
'
:
Struct
.
get_cstring
,
'
enable
'
:
Struct
.
get_u32
,
'
logs
'
:
Struct
.
get_address
,
'
last_dump
'
:
Struct
.
get_u32
})
SDE_EVTLOG_ENTRY
=
self
.
ramdump
.
sizeof
(
'
struct sde_dbg_evtlog
'
)
/
self
.
ramdump
.
sizeof
(
'
struct sde_dbg_evtlog_log
'
)
SDE_EVTLOG_MAX_DATA
=
self
.
ramdump
.
sizeof
(
'
(*(sde_dbg_base.evtlog)).logs[0].data
'
)
/
4
self
.
outfile
.
write
(
'
\n
%s %40s:%s %35s %10s %30s
\n
'
%
(
"
TIME
"
,
"
NAME
"
,
"
LINE
"
,
"
PID
"
,
"
DATA_CNT
"
,
"
DATA
"
))
for
i
in
range
(
SDE_EVTLOG_ENTRY
):
addr
=
evt_log
.
logs
+
self
.
ramdump
.
sizeof
(
'
struct sde_dbg_evtlog_log
'
)
*
i
log_log
=
addr
log_log
=
Struct
(
self
.
ramdump
,
log_log
,
struct_name
=
"
struct sde_dbg_evtlog_log
"
,
fields
=
{
'
name
'
:
Struct
.
get_pointer
,
'
enable
'
:
Struct
.
get_u32
,
'
line
'
:
Struct
.
get_u32
,
'
data_cnt
'
:
Struct
.
get_u32
,
'
pid
'
:
Struct
.
get_u32
,
'
data
'
:
Struct
.
get_address
,
'
time
'
:
get_u64
})
self
.
outfile
.
write
(
'
\n
'
%
())
self
.
outfile
.
write
(
'
%d
'
%
(
log_log
.
time
))
self
.
outfile
.
write
(
'
%50s:
'
%
(
self
.
ramdump
.
read_cstring
(
log_log
.
name
)))
self
.
outfile
.
write
(
'
%s%d
\t\t
'
%
(
""
,
log_log
.
line
))
self
.
outfile
.
write
(
'
%10d
'
%
(
log_log
.
pid
))
self
.
outfile
.
write
(
'
%6d
'
%
(
log_log
.
data_cnt
))
for
i
in
range
(
SDE_EVTLOG_MAX_DATA
):
self
.
outfile
.
write
(
'
%2d
'
%
(
self
.
ramdump
.
read_u32
(
log_log
.
data
+
(
i
*
4
))))
else
:
for
blk
in
mdss_dbg
.
blk_arr
:
if
blk
.
is_empty
():
continue
# Delays file creation until we have found a non-null array element
if
not
self
.
outfile
:
self
.
outfile
=
self
.
ramdump
.
open_file
(
'
mdpinfo_out.txt
'
)
self
.
outfile
.
write
(
'
mdss_dump_reg_by_ranges:
'
'
=========%s DUMP=========
\n
'
%
blk
.
name
)
head_offset
=
self
.
ramdump
.
field_offset
(
'
struct range_dump_node
'
,
'
head
'
)
dump_list
=
ListWalker
(
self
.
ramdump
,
blk
.
dump_list
,
head_offset
)
if
dump_list
.
is_empty
():
self
.
outfile
.
write
(
'
Ranges not found,
'
'
will dump full registers
\n
'
)
self
.
outfile
.
write
(
'
base:0x%x length:%d
\n
'
%
(
blk
.
base
,
blk
.
max_offset
))
self
.
mdss_dump_reg
(
blk
.
base
,
blk
.
max_offset
,
blk
.
reg_dump
)
else
:
for
node
in
dump_list
:
self
.
print_range
(
blk
,
node
)
# Close the file only if it was created
# Close the file only if it was created
if
self
.
outfile
:
if
self
.
outfile
:
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment