import struct, unittest from types import SimpleNamespace from unittest.mock import patch from tinygrad.runtime.autogen import bnxt from extra.bnxt_driver.bnxtdev import BNXT_BACKING_STORE, BNXTDev, BNXTQP, _queue, _qwrite, ipv4_to_gid class FakePCI: def __init__(self): self.next_addr, self.allocations = 0x100000, [] def alloc_sysmem(self, size, contiguous=False): pages = [self.next_addr+i*0x1000 for i in range((size+0xfff)//0x1000)] self.next_addr += len(pages)*0x1000 self.allocations.append(mem := bytearray(size)) return mem, pages class FakeDev: def __init__(self): self.pci_dev, self.calls = FakePCI(), [] def hwrm(self, name, **fields): self.calls.append((name, fields)) typ = fields.get("type", 0) return SimpleNamespace(ctx_init_value=0x5a, ctx_init_offset=4, entry_size=16 if typ == 0 else 4, subtype_valid_cnt=typ == 0, split_entry_0=2, instance_bit_map=5 if typ == 0 else 1, min_num_entries=0) class FakeRCFW: def __init__(self): self.calls, self.doorbells = [], [] def exec(self, name, **fields): self.calls.append((name, fields)) return SimpleNamespace(xid={"create_cq":77, "create_qp":88, "register_mr":0x5678}.get(name, 0)) def doorbell(self, *args, **kwargs): self.doorbells.append((args, kwargs)) class FakeQPDev: def __init__(self): self.pci_dev, self.fw, self.gid_id, self.nq_id = FakePCI(), FakeRCFW(), 9, 41 def rcfw(self, *args, **kwargs): return self.fw.exec(*args, **kwargs) def doorbell(self, *args, **kwargs): self.fw.doorbell(*args, **kwargs) class TestMemory(unittest.TestCase): def test_cmdq_and_sq_aux(self): dev = FakeDev() cmdq, sq = _queue(dev), _queue(dev, aux=True) self.assertEqual((cmdq["level"], cmdq["base"]), (0, 0x100000)) _qwrite(sq, 3, b"ABCDEFGH", aux=True) self.assertEqual(bytes(sq["mem"][0x1018:0x1020]), b"ABCDEFGH") def test_f320_backing_layout_and_final_marker(self): self.assertEqual(len(BNXT_BACKING_STORE), 9) dev = FakeDev() small = ((0, 6), (15, 0)) with patch("extra.bnxt_driver.bnxtdev.BNXT_BACKING_STORE", small): BNXTDev.setup_backing_store(dev) cfg = [fields for name, fields in dev.calls if name == "func_backing_store_cfg_v2"] self.assertEqual([(x["type"], x["instance"]) for x in cfg], [(0, 0), (0, 2), (15, 0)]) self.assertTrue(all(not x["flags"] for x in cfg[:-1])) self.assertEqual(cfg[-1]["flags"], bnxt.FUNC_BACKING_STORE_CFG_V2_REQ_FLAGS_BS_CFG_ALL_DONE) self.assertEqual((dev.pci_dev.allocations[0][4], dev.pci_dev.allocations[0][20]), (0x5a, 0x5a)) class TestRCFW(unittest.TestCase): def setUp(self): patch("extra.bnxt_driver.bnxtdev.System.memory_barrier").start() self.addCleanup(patch.stopall) def test_doorbell_encodes_xid_type_and_index(self): dev = BNXTDev.__new__(BNXTDev) dev.db, dev.db_off = [0]*1024, 0x1000 dev.doorbell(0x123456, bnxt.DBC_DBC_TYPE_CQ_ARMALL, 0x456, epoch=1) key = dev.db[0x1000//8] self.assertEqual(key >> 32, 0x123456 & bnxt.DBC_DBC_XID_MASK | bnxt.DBC_DBC_PATH_ROCE | bnxt.DBC_DBC_TYPE_CQ_ARMALL | bnxt.BNXT_QPLIB_DBR_VALID) self.assertEqual(key & 0xffffffff, 0x456 | 1<