From 46469f00a2e9e69aea9d313788811381c9ae3fe9 Mon Sep 17 00:00:00 2001 From: nimlgen <138685161+nimlgen@users.noreply.github.com> Date: Mon, 21 Apr 2025 11:52:02 +0300 Subject: [PATCH] am: tiny changes in psp load (#9952) --- tinygrad/runtime/support/am/ip.py | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/tinygrad/runtime/support/am/ip.py b/tinygrad/runtime/support/am/ip.py index 583cf701ba..49a5dd4900 100644 --- a/tinygrad/runtime/support/am/ip.py +++ b/tinygrad/runtime/support/am/ip.py @@ -406,8 +406,8 @@ class AM_PSP(AM_IP): def _wait_for_bootloader(self): self.adev.wait_reg(self.adev.reg(f"{self.reg_pref}_35"), mask=0x80000000, value=0x80000000) def _prep_msg1(self, data): - ctypes.memset(cpu_addr:=self.adev.paddr2cpu(self.msg1_paddr), 0, am.PSP_1_MEG) - to_mv(cpu_addr, len(data))[:] = data + to_mv(cpu_addr:=self.adev.paddr2cpu(self.msg1_paddr), len(data))[:] = data + to_mv(cpu_addr + len(data), 1)[0] = 0 self.adev.gmc.flush_hdp() def _bootloader_load_component(self, fw, compid): @@ -449,10 +449,11 @@ class AM_PSP(AM_IP): self.adev.wait_reg(self.adev.reg(f"{self.reg_pref}_64"), mask=0x8000FFFF, value=0x80000000) - def _ring_submit(self): + def _ring_submit(self, cmd): prev_wptr = self.adev.reg(f"{self.reg_pref}_67").read() ring_entry_addr = self.adev.paddr2cpu(self.ring_paddr) + prev_wptr * 4 + ctypes.memmove(self.adev.paddr2cpu(self.cmd_paddr), ctypes.addressof(cmd), ctypes.sizeof(cmd)) ctypes.memset(ring_entry_addr, 0, ctypes.sizeof(am.struct_psp_gfx_rb_frame)) write_loc = am.struct_psp_gfx_rb_frame.from_address(ring_entry_addr) write_loc.cmd_buf_addr_hi, write_loc.cmd_buf_addr_lo = data64(self.adev.paddr2mc(self.cmd_paddr)) @@ -470,36 +471,28 @@ class AM_PSP(AM_IP): return resp - def _prep_ring_cmd(self, hdr): - ctypes.memset(self.adev.paddr2cpu(self.cmd_paddr), 0, 0x1000) - cmd = am.struct_psp_gfx_cmd_resp.from_address(self.adev.paddr2cpu(self.cmd_paddr)) - cmd.cmd_id = hdr - return cmd - def _load_ip_fw_cmd(self, fw_types, fw_bytes): self._prep_msg1(fw_bytes) for fw_type in fw_types: if DEBUG >= 2: print(f"am {self.adev.devfmt}: loading fw: {am.psp_gfx_fw_type__enumvalues[fw_type]}") - cmd = self._prep_ring_cmd(am.GFX_CMD_ID_LOAD_IP_FW) + cmd = am.struct_psp_gfx_cmd_resp(cmd_id=am.GFX_CMD_ID_LOAD_IP_FW) cmd.cmd.cmd_load_ip_fw.fw_phy_addr_hi, cmd.cmd.cmd_load_ip_fw.fw_phy_addr_lo = data64(self.adev.paddr2mc(self.msg1_paddr)) cmd.cmd.cmd_load_ip_fw.fw_size = len(fw_bytes) cmd.cmd.cmd_load_ip_fw.fw_type = fw_type - self._ring_submit() + self._ring_submit(cmd) def _tmr_load_cmd(self): - cmd = self._prep_ring_cmd(am.GFX_CMD_ID_SETUP_TMR) + cmd = am.struct_psp_gfx_cmd_resp(cmd_id=am.GFX_CMD_ID_SETUP_TMR) cmd.cmd.cmd_setup_tmr.buf_phy_addr_hi, cmd.cmd.cmd_setup_tmr.buf_phy_addr_lo = data64(self.adev.paddr2mc(self.tmr_paddr)) cmd.cmd.cmd_setup_tmr.system_phy_addr_hi, cmd.cmd.cmd_setup_tmr.system_phy_addr_lo = data64(self.tmr_paddr) cmd.cmd.cmd_setup_tmr.bitfield.virt_phy_addr = 1 cmd.cmd.cmd_setup_tmr.buf_size = self.tmr_size - return self._ring_submit() + return self._ring_submit(cmd) def _load_toc_cmd(self, toc_size): - cmd = self._prep_ring_cmd(am.GFX_CMD_ID_LOAD_TOC) + cmd = am.struct_psp_gfx_cmd_resp(cmd_id=am.GFX_CMD_ID_LOAD_TOC) cmd.cmd.cmd_load_toc.toc_phy_addr_hi, cmd.cmd.cmd_load_toc.toc_phy_addr_lo = data64(self.adev.paddr2mc(self.msg1_paddr)) cmd.cmd.cmd_load_toc.toc_size = toc_size - return self._ring_submit() + return self._ring_submit(cmd) - def _rlc_autoload_cmd(self): - self._prep_ring_cmd(am.GFX_CMD_ID_AUTOLOAD_RLC) - return self._ring_submit() + def _rlc_autoload_cmd(self): return self._ring_submit(am.struct_psp_gfx_cmd_resp(cmd_id=am.GFX_CMD_ID_AUTOLOAD_RLC))