Skip to content

Commit

Permalink
tools/reset_panic_counter.py: New tool
Browse files Browse the repository at this point in the history
Also adds m1n1.hw.spmi

Signed-off-by: Asahi Lina <lina@asahilina.net>
  • Loading branch information
asahilina committed May 20, 2022
1 parent 25472a4 commit f5ba42e
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 0 deletions.
93 changes: 93 additions & 0 deletions proxyclient/m1n1/hw/spmi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# SPDX-License-Identifier: MIT
import struct

from ..utils import *

CMD_EXT_WRITE = 0x00
CMD_EXT_READ = 0x20
CMD_EXT_WRITEL = 0x30
CMD_EXT_READL = 0x38
CMD_WRITE = 0x40
CMD_READ = 0x60
CMD_ZERO_WRITE = 0x80

class R_CMD(Register32):
REG = 31, 16
ACTIVE = 15
SLAVE_ID = 14, 8
CMD = 7, 0

class R_STATUS(Register32):
RX_EMPTY = 24
TX_EMPTY = 8

class SPMIRegs(RegMap):
STATUS = 0x00, R_STATUS
CMD = 0x04, R_CMD
REPLY = 0x08, Register32

class SPMI:
def __init__(self, u, adt_path):
self.u = u
self.p = u.proxy
self.iface = u.iface
self.base = u.adt[adt_path].get_reg(0)[0]
self.regs = SPMIRegs(u, self.base)

def read(self, slave, reg, size):
while not self.regs.STATUS.reg.RX_EMPTY:
print(">", self.regs.REPLY.val)

self.regs.CMD.reg = R_CMD(REG = reg, ACTIVE=1, SLAVE_ID = slave, CMD = CMD_EXT_READL | (size - 1))

buf = b""

left = size + 4
while left > 0:
while self.regs.STATUS.reg.RX_EMPTY:
pass
v = self.regs.REPLY.val
buf += struct.pack("<I", v)
left -= 4

return buf[4:4+size]

def write(self, slave, reg, data):
while not self.regs.STATUS.reg.RX_EMPTY:
self.regs.REPLY.val

size = len(data)
self.regs.CMD.reg = R_CMD(REG = reg, ACTIVE=1, SLAVE_ID = slave, CMD = CMD_EXT_WRITEL | (size - 1))

while data:
blk = (data[:4] + b"\0\0\0")[:4]
self.regs.CMD.val = struct.unpack("<I", blk)[0]
data = data[4:]

while self.regs.STATUS.reg.RX_EMPTY:
pass
return self.regs.REPLY.val

def read8(self, slave, reg):
return struct.unpack("<B", self.read(slave, reg, 1))[0]

def read16(self, slave, reg):
return struct.unpack("<H", self.read(slave, reg, 2))[0]

def read32(self, slave, reg):
return struct.unpack("<I", self.read(slave, reg, 4))[0]

def read64(self, slave, reg):
return struct.unpack("<Q", self.read(slave, reg, 8))[0]

def write8(self, slave, reg, val):
return self.write(slave, reg, struct.pack("<B", val))

def write16(self, slave, reg, val):
return self.write(slave, reg, struct.pack("<H", val))

def write32(self, slave, reg, val):
return self.write(slave, reg, struct.pack("<I", val))

def write64(self, slave, reg, val):
return self.write(slave, reg, struct.pack("<Q", val))
9 changes: 9 additions & 0 deletions proxyclient/tools/reset_panic_counter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import sys, pathlib, time
sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))

from m1n1.setup import *
from m1n1.hw.spmi import SPMI

s = SPMI(u, "/arm-io/nub-spmi")
leg_scrpad = 0x9f00
s.write8(15, leg_scrpad + 2, 0) # error counts

0 comments on commit f5ba42e

Please sign in to comment.