|
|
|
|
@@ -15,7 +15,7 @@ class AM_SOC(AM_IP):
|
|
|
|
|
def init_sw(self): self.module = import_soc(self.adev.ip_ver[am.GC_HWIP])
|
|
|
|
|
|
|
|
|
|
def init_hw(self):
|
|
|
|
|
if self.adev.ip_ver[am.NBIO_HWIP] == (7,9,0):
|
|
|
|
|
if self.adev.ip_ver[am.NBIO_HWIP] in {(7,9,0), (7,9,1)}:
|
|
|
|
|
self.adev.regXCC_DOORBELL_FENCE.write(0x0)
|
|
|
|
|
self.adev.regBIFC_GFX_INT_MONITOR_MASK.write(0x7ff)
|
|
|
|
|
self.adev.regBIFC_DOORBELL_ACCESS_EN_PF.write(0xfffff)
|
|
|
|
|
@@ -29,7 +29,7 @@ class AM_SOC(AM_IP):
|
|
|
|
|
val = reg.encode(**{f"s2a_doorbell_port{port}_enable":1, f"s2a_doorbell_port{port}_awid":awid, f"s2a_doorbell_port{port}_range_size":size,
|
|
|
|
|
f"s2a_doorbell_port{port}_awaddr_31_28_value":awaddr_31_28_value, f"s2a_doorbell_port{port}_range_offset":offset})
|
|
|
|
|
|
|
|
|
|
if self.adev.ip_ver[am.NBIO_HWIP] == (7,9,0): self.adev.indirect_wreg_pcie(reg.addr[0], val)
|
|
|
|
|
if self.adev.ip_ver[am.NBIO_HWIP] in {(7,9,0), (7,9,1)}: self.adev.indirect_wreg_pcie(reg.addr[0], val)
|
|
|
|
|
else: reg.write(val)
|
|
|
|
|
|
|
|
|
|
class AM_GMC(AM_IP):
|
|
|
|
|
@@ -178,7 +178,7 @@ class AM_SMU(AM_IP):
|
|
|
|
|
def mode1_reset(self):
|
|
|
|
|
if DEBUG >= 2: print(f"am {self.adev.devfmt}: mode1 reset")
|
|
|
|
|
if self.adev.ip_ver[am.MP0_HWIP] >= (14,0,0): self._send_msg(__DEBUGSMC_MSG_Mode1Reset:=2, 0, debug=True)
|
|
|
|
|
elif self.adev.ip_ver[am.MP0_HWIP] == (13,0,6): self._send_msg(self.smu_mod.PPSMC_MSG_GfxDriverReset, 1)
|
|
|
|
|
elif self.adev.ip_ver[am.MP0_HWIP] in {(13,0,6), (13,0,12)}: self._send_msg(self.smu_mod.PPSMC_MSG_GfxDriverReset, 1)
|
|
|
|
|
else: self._send_msg(self.smu_mod.PPSMC_MSG_Mode1Reset, 0)
|
|
|
|
|
time.sleep(0.5) # 500ms
|
|
|
|
|
|
|
|
|
|
@@ -188,7 +188,7 @@ class AM_SMU(AM_IP):
|
|
|
|
|
def read_metrics(self): return self.read_table(self.smu_mod.SmuMetricsExternal_t, self.smu_mod.TABLE_SMU_METRICS)
|
|
|
|
|
|
|
|
|
|
def set_clocks(self, level):
|
|
|
|
|
if self.adev.ip_ver[am.MP0_HWIP] == (13,0,6): return # TODO
|
|
|
|
|
if self.adev.ip_ver[am.MP0_HWIP] in {(13,0,6), (13,0,12)}: return # TODO
|
|
|
|
|
|
|
|
|
|
if not hasattr(self, 'clcks'):
|
|
|
|
|
self.clcks = {}
|
|
|
|
|
@@ -230,13 +230,13 @@ class AM_GFX(AM_IP):
|
|
|
|
|
|
|
|
|
|
for xcc in range(self.xccs): self.adev.regRLC_SPM_MC_CNTL.write(0xf, inst=xcc)
|
|
|
|
|
|
|
|
|
|
if self.adev.ip_ver[am.NBIO_HWIP] != (7,9,0):
|
|
|
|
|
if self.adev.ip_ver[am.NBIO_HWIP][:2] != (7,9):
|
|
|
|
|
self.adev.soc.doorbell_enable(port=0, awid=0x3, awaddr_31_28_value=0x3)
|
|
|
|
|
self.adev.soc.doorbell_enable(port=3, awid=0x6, awaddr_31_28_value=0x3)
|
|
|
|
|
|
|
|
|
|
for xcc in range(self.xccs):
|
|
|
|
|
if self.adev.ip_ver[am.GC_HWIP] == (9,4,3):
|
|
|
|
|
self.adev.regGB_ADDR_CONFIG.write(0x2a114042, inst=xcc) # Golden value for mi300
|
|
|
|
|
if self.adev.ip_ver[am.GC_HWIP] in {(9,4,3), (9,5,0)}:
|
|
|
|
|
self.adev.regGB_ADDR_CONFIG.write(0x2a114042, inst=xcc) # Golden value for mi300/mi350
|
|
|
|
|
self.adev.regTCP_UTCL1_CNTL2.update(spare=1, inst=xcc)
|
|
|
|
|
|
|
|
|
|
self.adev.regGRBM_CNTL.update(read_timeout=0xff, inst=xcc)
|
|
|
|
|
@@ -380,7 +380,7 @@ class AM_IH(AM_IP):
|
|
|
|
|
for _, rwptr_vm, suf, ring_id in self.rings:
|
|
|
|
|
self.adev.reg(f"regIH_RB_CNTL{suf}").update(rb_enable=1, **({'enable_intr': 1} if ring_id == 0 else {}))
|
|
|
|
|
|
|
|
|
|
if self.adev.ip_ver[am.NBIO_HWIP] != (7,9,0):
|
|
|
|
|
if self.adev.ip_ver[am.NBIO_HWIP][:2] != (7,9):
|
|
|
|
|
self.adev.soc.doorbell_enable(port=1, awid=0x0, awaddr_31_28_value=0x0, offset=am.AMDGPU_NAVI10_DOORBELL_IH*2, size=2)
|
|
|
|
|
|
|
|
|
|
def interrupt_handler(self):
|
|
|
|
|
@@ -410,14 +410,14 @@ class AM_SDMA(AM_IP):
|
|
|
|
|
self.adev.reg(f"regSDMA{pipe}_CNTL").update(ctxempty_int_enable=1, trap_enable=1,
|
|
|
|
|
**({'utc_l1_enable':1} if self.adev.ip_ver[am.SDMA0_HWIP] <= (5,2,0) else {}))
|
|
|
|
|
|
|
|
|
|
if self.adev.ip_ver[am.NBIO_HWIP] == (7,9,0):
|
|
|
|
|
if self.adev.ip_ver[am.NBIO_HWIP] in {(7,9,0), (7,9,1)}:
|
|
|
|
|
self.adev.regDOORBELL0_CTRL_ENTRY_1.write(bif_doorbell1_range_offset_entry=am.AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE0*2,
|
|
|
|
|
bif_doorbell1_range_size_entry=4)
|
|
|
|
|
self.adev.soc.doorbell_enable(port=2, awid=0xe, awaddr_31_28_value=0x1, offset=0xe, size=4)
|
|
|
|
|
else: self.adev.soc.doorbell_enable(port=2, awid=0xe, awaddr_31_28_value=0x3, offset=am.AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE0*2, size=4)
|
|
|
|
|
|
|
|
|
|
def fini_hw(self):
|
|
|
|
|
reg, inst = ("regSDMA_GFX", 0) if self.adev.ip_ver[am.SDMA0_HWIP] == (4,4,2) else ("regSDMA0_QUEUE0", 0)
|
|
|
|
|
reg, inst = ("regSDMA_GFX", 0) if self.adev.ip_ver[am.SDMA0_HWIP][:2] == (4,4) else ("regSDMA0_QUEUE0", 0)
|
|
|
|
|
|
|
|
|
|
self.adev.reg(f"{reg}_RB_CNTL").update(rb_enable=0, inst=inst)
|
|
|
|
|
self.adev.reg(f"{reg}_IB_CNTL").update(ib_enable=0, inst=inst)
|
|
|
|
|
@@ -428,7 +428,7 @@ class AM_SDMA(AM_IP):
|
|
|
|
|
|
|
|
|
|
def setup_ring(self, ring_addr:int, ring_size:int, rptr_addr:int, wptr_addr:int, doorbell:int, pipe:int, queue:int) -> int:
|
|
|
|
|
# Setup the ring
|
|
|
|
|
reg, inst = ("regSDMA_GFX", pipe*4+queue) if self.adev.ip_ver[am.SDMA0_HWIP] == (4,4,2) else (f"regSDMA{pipe}_QUEUE{queue}", 0)
|
|
|
|
|
reg, inst = ("regSDMA_GFX", pipe*4+queue) if self.adev.ip_ver[am.SDMA0_HWIP][:2] == (4,4) else (f"regSDMA{pipe}_QUEUE{queue}", 0)
|
|
|
|
|
|
|
|
|
|
self.adev.reg(f"{reg}_MINOR_PTR_UPDATE").write(0x1, inst=inst)
|
|
|
|
|
self.adev.wreg_pair(f"{reg}_RB_RPTR", "", "_HI", 0, inst=inst)
|
|
|
|
|
@@ -439,7 +439,7 @@ class AM_SDMA(AM_IP):
|
|
|
|
|
self.adev.reg(f"{reg}_DOORBELL_OFFSET").update(offset=doorbell * 2, inst=inst)
|
|
|
|
|
self.adev.reg(f"{reg}_DOORBELL").update(enable=1, inst=inst)
|
|
|
|
|
self.adev.reg(f"{reg}_MINOR_PTR_UPDATE").write(0x0, inst=inst)
|
|
|
|
|
self.adev.reg(f"{reg}_RB_CNTL").write(**({f'{self.sdma_name.lower()}_wptr_poll_enable':1} if self.adev.ip_ver[am.SDMA0_HWIP] != (4,4,2) else {}),
|
|
|
|
|
self.adev.reg(f"{reg}_RB_CNTL").write(**({f'{self.sdma_name.lower()}_wptr_poll_enable':1} if self.adev.ip_ver[am.SDMA0_HWIP][:2]!=(4,4) else {}),
|
|
|
|
|
rb_vmid=0, rptr_writeback_enable=1, rptr_writeback_timer=4, rb_enable=1, rb_priv=1, rb_size=(ring_size//4).bit_length()-1, inst=inst)
|
|
|
|
|
self.adev.reg(f"{reg}_IB_CNTL").update(ib_enable=1, inst=inst)
|
|
|
|
|
return self.adev.reg(f"{reg}_RB_WPTR").read() | (self.adev.reg(f"{reg}_RB_WPTR_HI").read() << 32)
|
|
|
|
|
|