# SPDX-License-Identifier: MIT import struct from ..utils import * from .asc import StandardASC from .asc.base import * class PMPMessage(Register64): TYPE = 56, 44 class PMP_Startup(PMPMessage): TYPE = 56, 44, Constant(0x00) class PMP_Configure(PMPMessage): TYPE = 56, 44, Constant(0x10) DVA = 47, 0 class PMP_Configure_Ack(PMPMessage): TYPE = 56, 44, Constant(0x20) UNK = 47, 0 class PMP_Init1(PMPMessage): TYPE = 56, 44, Constant(0x200) UNK1 = 43, 16 UNK2 = 15, 0 class PMP_Init1_Ack(PMPMessage): TYPE = 56, 44, Constant(0x201) UNK1 = 43, 16 UNK2 = 15, 0 class PMP_Init2(PMPMessage): TYPE = 56, 44, Constant(0x202) UNK1 = 43, 16 UNK2 = 15, 0 class PMP_Init2_Ack(PMPMessage): TYPE = 56, 44, Constant(0x203) UNK1 = 43, 16 UNK2 = 15, 0 class PMP_Unk(PMPMessage): TYPE = 56, 44, Constant(0x100) UNK1 = 43, 16 UNK2 = 15, 0 class PMP_Unk_Ack(PMPMessage): TYPE = 56, 44, Constant(0x110) UNK1 = 43, 16 UNK2 = 15, 0 class PMP_DevPwr(PMPMessage): TYPE = 56, 44, Constant(0x20e) DEV = 31, 16 STATE = 15, 0 class PMP_DevPwr_Sync(PMPMessage): TYPE = 56, 44, Constant(0x208) DEV = 31, 16 STATE = 15, 0 class PMP_DevPwr_Ack(PMPMessage): TYPE = 56, 44, Constant(0x209) DEV = 31, 16 STATE = 15, 0 class PMPEndpoint(ASCBaseEndpoint): BASE_MESSAGE = PMPMessage SHORT = "pmpep" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.shmem = self.shmem_dva = None self.init_complete = False self.init1_acked = False self.init2_acked = False self.unk_acked = False @msg_handler(0x00, PMP_Startup) def Startup(self, msg): self.log("Starting up") self.shmem, self.shmem_dva = self.asc.ioalloc(0x10000) self.send_init_config() return True def send_init_config(self): self.asc.p.memset32(self.shmem, 0, 0x10000) dram_config = self.asc.u.adt["arm-io/pmp/iop-pmp-nub"].energy_model_dram_configs self.asc.iface.writemem(self.shmem + 0x2000, dram_config) node = self.asc.u.adt["arm-io/pmp"] maps = [] dva = 0xc0000000 for i in range(3, len(node.reg)): addr, size = node.get_reg(i) if size == 0: maps.append(struct.pack(" {dva:#x} [{size:#x}]") maps.append(struct.pack("