Skip to content

Commit cfae058

Browse files
committed
proxyclient: Add support for /arm-io/pmgr with 8-bit IDs
Add support for /arm-io/pmgr with 8-bit IDs, as seen on A7-A11, T2 SoCs. Signed-off-by: Nick Chan <towinchenmi@gmail.com>
1 parent b2b0c51 commit cfae058

File tree

5 files changed

+52
-20
lines changed

5 files changed

+52
-20
lines changed

proxyclient/experiments/mmio_sweep.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
print(dev.name)
2323
sys.exit(0)
2424

25-
granule = 0x4000
25+
if chip_id in (0x8960, 0x7000, 0x7001):
26+
granule = 0x1000
27+
else:
28+
granule = 0x4000
2629

2730
lp = LinkedProgram(u)
2831
lp.load_inline_c(f'''
@@ -96,7 +99,7 @@ def describe_mask(mask, maskrange):
9699

97100
pd_did_enable = set()
98101
pmgr = u.adt["/arm-io/pmgr"]
99-
ps_dev_by_id = {dev.id: dev for dev in pmgr.devices}
102+
ps_dev_by_id = {u.adt.pmgr_dev_get_id(dev): dev for dev in pmgr.devices}
100103
ps_deps = dict()
101104
ps_addrs = dict()
102105

@@ -110,7 +113,7 @@ def describe_mask(mask, maskrange):
110113
ps_addrs[dev.name] = addr
111114
ps_deps[dev.name] = [
112115
ps_dev_by_id[idx].name for idx
113-
in dev.parents if idx in ps_dev_by_id
116+
in u.adt.pmgr_dev_get_parents(dev) if idx in ps_dev_by_id
114117
]
115118

116119
if lp.is_t6000():

proxyclient/m1n1/adt.py

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,27 @@
8585
"flags" / PMGRDeviceFlags,
8686
"unk1_0" / Int8ul,
8787
"unk1_1" / Int8ul,
88-
"unk1_2" / Int8ul,
89-
"parents" / Array(2, Int16ul),
88+
"id1" / Int8ul,
89+
"parents_un" / Union (0,
90+
"u8id" / Struct(
91+
"parents" / Array(2, Int8ul),
92+
"unk_u8id" / Array(2, Int8ul),
93+
),
94+
"u16id" / Struct (
95+
"parents" / Array(2, Int16ul),
96+
),
97+
),
9098
"perf_idx" / Int8ul,
9199
"perf_block" / Int8ul,
92100
"psidx" / Int8ul,
93101
"psreg" / Int8ul,
94102
"unk2_0" / Int16ul,
95103
"pd" / Int8ul,
96104
"ps_cfg16" / Int8ul,
97-
Const(0, Int32ul),
98-
Const(0, Int32ul),
105+
"unk2_1" / Int32ul,
106+
"unk2_2" / Int32ul,
99107
"unk2_3" / Int16ul,
100-
"id" / Int16ul,
108+
"id2" / Int16ul,
101109
"unk3" / Int32ul,
102110
"name" / PaddedString(16, "ascii")
103111
))
@@ -801,8 +809,25 @@ def create_node(self, name):
801809
self[name] = node
802810
return node
803811

812+
def pmgr_init(self):
813+
self.pmgr_u8id = (self["/arm-io/pmgr"].devices[0].id1 != self["/arm-io/pmgr"].devices[1].id1)
814+
815+
def pmgr_dev_get_id(self, dev):
816+
if self.pmgr_u8id:
817+
return dev.id1
818+
else:
819+
return dev.id2
820+
821+
def pmgr_dev_get_parents(self, dev):
822+
if self.pmgr_u8id:
823+
return dev.parents_un.u8id.parents
824+
else:
825+
return dev.parents_un.u16id.parents
826+
804827
def load_adt(data):
805-
return ADTNode(ADTNodeStruct.parse(data))
828+
node = ADTNode(ADTNodeStruct.parse(data))
829+
node.pmgr_init()
830+
return node
806831

807832
if __name__ == "__main__":
808833
import sys, argparse, pathlib

proxyclient/m1n1/hv/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,7 +1482,7 @@ def rh(base, off, width):
14821482

14831483
pmgr = self.adt["/arm-io/pmgr"]
14841484
dev_by_name = {dev.name: dev for dev in pmgr.devices}
1485-
dev_by_id = {dev.id: dev for dev in pmgr.devices}
1485+
dev_by_id = {self.adt.pmgr_dev_get_id(dev): dev for dev in pmgr.devices}
14861486

14871487
pmgr_hooks = []
14881488

@@ -1491,7 +1491,7 @@ def hook_pmgr_dev(dev):
14911491
if dev.psidx or dev.psreg:
14921492
addr = pmgr.get_reg(ps.reg)[0] + ps.offset + dev.psidx * 8
14931493
pmgr_hooks.append(addr)
1494-
for idx in dev.parents:
1494+
for idx in self.adt.pmgr_dev_get_parents(dev):
14951495
if idx in dev_by_id:
14961496
hook_pmgr_dev(dev_by_id[idx])
14971497

proxyclient/tools/dump_pmgr.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
pmgr = dt["/arm-io/pmgr"]
1313

14-
dev_by_id = {dev.id: dev for dev in pmgr.devices}
14+
dev_by_id = {dt.pmgr_dev_get_id(dev): dev for dev in pmgr.devices}
1515
pd_by_id = {pd.id: pd for pd in pmgr.power_domains}
1616
clk_by_id = {clk.id: clk for clk in pmgr.clocks}
1717

@@ -47,8 +47,8 @@
4747
print("=== Devices ===")
4848
for i, dev in enumerate(pmgr.devices):
4949
flags = ", ".join(k for k in dev.flags if k[0] != "_" and dev.flags[k])
50-
s = f" #{i:3d} {dev.name:20s} id: {dev.id:3d} psreg: {dev.psreg:2d}:{dev.psidx:2d} "
51-
s += f" flags: {flags:24s} unk1_0: {dev.unk1_0} unk1_1: {dev.unk1_1} unk1_2: {dev.unk1_2} "
50+
s = f" #{i:3d} {dev.name:20s} id: {u.adt.pmgr_dev_get_id(dev):3d} psreg: {dev.psreg:2d}:{dev.psidx:2d} "
51+
s += f" flags: {flags:24s} unk1_0: {dev.unk1_0} unk1_1: {dev.unk1_1} id1: {dev.id1} "
5252
s += f" perf_reg: {dev.perf_block}:{dev.perf_idx:#04x} unk3: {dev.unk3:3d} {dev.unk2_0:2d} {dev.ps_cfg16:2d} {dev.unk2_3:3d}"
5353

5454
if not dev.flags.no_ps:
@@ -63,10 +63,10 @@
6363
s += f" pd: {pd.name:20s}"
6464
else:
6565
s += " "
66-
if any(dev.parents):
67-
s += " parents: " + ", ".join(dev_by_id[idx].name if idx in dev_by_id else f"#{idx}" for idx in dev.parents if idx)
66+
if any(dt.pmgr_dev_get_parents(dev)):
67+
s += " parents: " + ", ".join(dev_by_id[idx].name if idx in dev_by_id else f"#{idx}" for idx in dt.pmgr_dev_get_parents(dev) if idx)
6868
print(s)
69-
for i in dev_users.get(dev.id, []):
69+
for i in dev_users.get(dt.pmgr_dev_get_id(dev), []):
7070
print(f" User: {i}")
7171

7272
print()
@@ -107,6 +107,10 @@
107107
print(f" User: {j}")
108108

109109
print()
110+
111+
if chip_id in (0x8960, 0x7000, 0x7001, 0x8000, 0x8001, 0x8003, 0x8010, 0x8012, 0x8015):
112+
exit(0)
113+
110114
print("=== Boot clocks ===")
111115
for i, (freq, reg, nclk) in enumerate(zip(arm_io.clock_frequencies,
112116
arm_io.clock_frequencies_regs,

proxyclient/tools/pmgr_adt2dt.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
pmgr = dt["/arm-io/pmgr"]
2020

21-
dev_by_id = {dev.id: dev for dev in pmgr.devices}
21+
dev_by_id = {dt.pmgr_dev_get_id(dev): dev for dev in pmgr.devices}
2222

2323
blocks = {}
2424
maxaddr = {}
@@ -83,8 +83,8 @@ def die_label(s):
8383
if dev.flags.critical:
8484
print("\t\tapple,always-on;")
8585

86-
if any(dev.parents):
87-
domains = [f"<&{die_node('ps_'+dev_by_id[idx].name.lower())}>" for idx in dev.parents if idx]
86+
if any(dt.pmgr_dev_get_parents(dev)):
87+
domains = [f"<&{die_node('ps_'+dev_by_id[idx].name.lower())}>" for idx in dt.pmgr_dev_get_parents(dev) if idx]
8888
print(f"\t\tpower-domains = {', '.join(domains)};")
8989

9090
print( "\t};")

0 commit comments

Comments
 (0)