mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 11:40:10 +01:00
The programming model matches very closely to that of NVIDIA's NVDLA. Enough is implemented to run SSDLite MobileDet with roughly the same performance as the blob (when running on a single NPU core). Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29698>
75 lines
1.9 KiB
Python
75 lines
1.9 KiB
Python
#!/usr/bin/python3
|
|
#
|
|
# Copyright © 2024-2025 Tomeu Vizoso
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import sys
|
|
import os
|
|
import argparse
|
|
import struct
|
|
from gen_parser import Parser, Reg, Enum, mask, Error
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--xml', type=str, required=True)
|
|
parser.add_argument('--dump', type=str, required=True)
|
|
|
|
args = parser.parse_args()
|
|
|
|
p = Parser()
|
|
|
|
try:
|
|
p.parse("", args.xml)
|
|
except Error as e:
|
|
print(e, file=sys.stderr)
|
|
exit(1)
|
|
|
|
regs = {}
|
|
for e in p.file:
|
|
if isinstance(e, Reg):
|
|
regs[e.offset] = e
|
|
|
|
domains = {}
|
|
for e in p.file:
|
|
if isinstance(e, Enum):
|
|
if e.name == "target":
|
|
for name, val in e.values:
|
|
domains[name] = val
|
|
|
|
f = open(args.dump, mode='rb')
|
|
for i in range(0, os.path.getsize(args.dump) // 8):
|
|
cmd = f.read(8)
|
|
(offset, value, target) = struct.unpack("<hIh", cmd)
|
|
if offset in regs.keys():
|
|
reg = regs[offset]
|
|
|
|
if (target & 0xfffffffe) != domains[reg.domain]:
|
|
print("WARNING: target 0x%x doesn't match register's domain 0x%x" % (target, domains[reg.domain]))
|
|
|
|
print("EMIT(REG_%s, " % regs[offset].full_name.upper(), end="")
|
|
first = True
|
|
if value == 0 or len(reg.bitset.fields) == 1:
|
|
print("0x%x" % value, end="")
|
|
else:
|
|
for field in reg.bitset.fields:
|
|
if field.type == "boolean":
|
|
if 1 << field.high & value:
|
|
if not first:
|
|
print(" | ", end="")
|
|
print("%s_%s" % (reg.full_name.upper(), field.name.upper()), end="")
|
|
first = False
|
|
elif field.type == "uint":
|
|
field_value = (value & mask(field.low, field.high)) >> field.low
|
|
if field_value != 0:
|
|
if not first:
|
|
print(" | ", end="")
|
|
print("%s_%s(%d)" % (reg.full_name.upper(), field.name.upper(), field_value), end="")
|
|
first = False
|
|
print(");")
|
|
else:
|
|
print("%x %x %x" % (target, offset, value))
|
|
|
|
if __name__ == '__main__':
|
|
main()
|