diff --git a/proxyclient/m1n1/adt.py b/proxyclient/m1n1/adt.py index 0df523b36..e6390d03c 100644 --- a/proxyclient/m1n1/adt.py +++ b/proxyclient/m1n1/adt.py @@ -102,8 +102,8 @@ "unk2_0" / Int16ul, "pd" / Int8ul, "ps_cfg16" / Int8ul, - "group" / Int8ul, "offset" / Int24ul, + "group" / Int8ul, "unk2_2" / Int32ul, "unk2_3" / Int16ul, "id2" / Int16ul, @@ -823,6 +823,7 @@ def create_node(self, name): def pmgr_init(self): self._pmgr_u8id = (self["/arm-io/pmgr"].devices[0].id1 != self["/arm-io/pmgr"].devices[1].id1) + self._pmgr_use_group_and_offset = not "ps-regs" in self["/arm-io/pmgr"]._properties def pmgr_dev_get_id(self, dev): if self._pmgr_u8id: @@ -836,6 +837,22 @@ def pmgr_dev_get_parents(self, dev): else: return dev.parents_un.u16id.parents + def pmgr_dev_get_block(self, dev): + if self._pmgr_use_group_and_offset: + reg = self["/arm-io/pmgr"].ps_groups[dev.group].reg + else: + reg = self["/arm-io/pmgr"].ps_regs[dev.psreg].reg + return self["/arm-io/pmgr"].get_reg(reg) + + def pmgr_dev_get_offset(self, dev): + if self._pmgr_use_group_and_offset: + return dev.offset + else: + return self["/arm-io/pmgr"].ps_regs[dev.psreg].offset + dev.psidx * 8 + + def pmgr_dev_get_addr(self, dev): + return self.pmgr_dev_get_block(dev)[0] + self.pmgr_dev_get_offset(dev) + def load_adt(data): node = ADTNode(ADTNodeStruct.parse(data)) node.pmgr_init() diff --git a/proxyclient/tools/dump_pmgr.py b/proxyclient/tools/dump_pmgr.py index b1f6f61bd..3521d1037 100755 --- a/proxyclient/tools/dump_pmgr.py +++ b/proxyclient/tools/dump_pmgr.py @@ -52,8 +52,7 @@ 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}" if not dev.flags.no_ps: - ps = pmgr.ps_regs[dev.psreg] - addr = pmgr.get_reg(ps.reg)[0] + ps.offset + dev.psidx * 8 + addr = dt.pmgr_dev_get_addr(dev) val = p.read32(addr) s += f" @ {addr:#x} = {val:#010x}" else: @@ -108,7 +107,7 @@ print() -if chip_id in (0x8960, 0x7000, 0x7001, 0x8000, 0x8001, 0x8003, 0x8010, 0x8012, 0x8015): +if dt["/chosen"].chip_id in (0x8960, 0x7000, 0x7001, 0x8000, 0x8001, 0x8003, 0x8010, 0x8012, 0x8015): exit(0) print("=== Boot clocks ===") diff --git a/proxyclient/tools/pmgr_adt2dt.py b/proxyclient/tools/pmgr_adt2dt.py index e9a7cea28..e826fd54e 100755 --- a/proxyclient/tools/pmgr_adt2dt.py +++ b/proxyclient/tools/pmgr_adt2dt.py @@ -39,10 +39,9 @@ def die_label(s): for i, dev in enumerate(pmgr.devices): if dev.flags.no_ps: continue - ps = pmgr.ps_regs[dev.psreg] - block = pmgr.get_reg(ps.reg) + block = dt.pmgr_dev_get_block(dev) blocks.setdefault(block, []).append(dev) - offset = ps.offset + dev.psidx * 8 + offset = dt.pmgr_dev_get_offset(dev) maxaddr[block[0]] = max(maxaddr.get(block[0], 0), offset) pmgr_compat = pmgr.compatible[0].split(",")[1] @@ -65,13 +64,11 @@ def die_label(s): for i, ((base, size), devices) in enumerate(sorted(blocks.items())): print(f"&pmgr{i} {{") - for dev in sorted(devices, key=lambda d: pmgr.ps_regs[d.psreg].offset + dev.psidx * 8): + for dev in sorted(devices, key=dt.pmgr_dev_get_addr): if dev.flags.no_ps: continue - ps = pmgr.ps_regs[dev.psreg] - offset = ps.offset + dev.psidx * 8 - addr = pmgr.get_reg(ps.reg)[0] + offset + addr = dt.pmgr_dev_get_addr(dev) assert base <= addr <= (base + size) print()