Skip to content

Commit c5e45a7

Browse files
authored
Fix SMU power off issue (#787)
* Fix SMU power off issue * Fix SMU power off issue * Fix SMU power off issue * Revert "Fix SMU power off issue" This reverts commit af1867a. * Fix SMU power off issue
1 parent ba5737b commit c5e45a7

File tree

5 files changed

+36
-8
lines changed

5 files changed

+36
-8
lines changed

src/driver/amdxdna/aie2_message.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,15 @@ bool aie2_is_supported_msg(struct amdxdna_dev_hdl *ndev, enum aie2_msg_opcode op
111111
int aie2_suspend_fw(struct amdxdna_dev_hdl *ndev)
112112
{
113113
DECLARE_AIE2_MSG(suspend, MSG_OP_SUSPEND);
114+
int ret;
114115

115-
return aie2_send_mgmt_msg_wait(ndev, &msg);
116+
ret = aie2_send_mgmt_msg_wait(ndev, &msg);
117+
if (ret) {
118+
XDNA_ERR(ndev->xdna, "Failed to suspend fw, ret %d", ret);
119+
return ret;
120+
}
121+
122+
return aie2_psp_waitmode_poll(ndev->psp_hdl);
116123
}
117124

118125
int aie2_resume_fw(struct amdxdna_dev_hdl *ndev)

src/driver/amdxdna/aie2_pci.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ enum psp_reg_idx {
116116
PSP_INTR_REG = PSP_NUM_IN_REGS,
117117
PSP_STATUS_REG,
118118
PSP_RESP_REG,
119+
PSP_PWAITMODE_REG,
119120
PSP_MAX_REGS /* Keep this at the end */
120121
};
121122

@@ -456,6 +457,7 @@ static inline bool aie2_pm_is_turbo(struct amdxdna_dev_hdl *ndev)
456457
struct psp_device *aie2m_psp_create(struct device *dev, struct psp_config *conf);
457458
int aie2_psp_start(struct psp_device *psp);
458459
void aie2_psp_stop(struct psp_device *psp);
460+
int aie2_psp_waitmode_poll(struct psp_device *psp);
459461

460462
/* aie2_debugfs.c */
461463
void aie2_debugfs_init(struct amdxdna_dev *xdna);

src/driver/amdxdna/aie2_psp.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,21 @@ static int psp_exec(struct psp_device *psp, u32 *reg_vals)
8383
return 0;
8484
}
8585

86+
int aie2_psp_waitmode_poll(struct psp_device *psp)
87+
{
88+
int mode_reg = -1, ret;
89+
90+
ret = readx_poll_timeout(readl, PSP_REG(psp, PSP_PWAITMODE_REG), mode_reg,
91+
(mode_reg & 0x1) == 1,
92+
PSP_POLL_INTERVAL, PSP_POLL_TIMEOUT);
93+
if (ret) {
94+
dev_err(psp->dev, "fw waitmode reg error, ret 0x%x", ret);
95+
return ret;
96+
}
97+
98+
return 0;
99+
}
100+
86101
void aie2_psp_stop(struct psp_device *psp)
87102
{
88103
u32 reg_vals[PSP_NUM_IN_REGS] = { PSP_RELEASE_TMR, };

src/driver/amdxdna/npu1_regs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "aie2_pci.h"
99

1010
/* Address definition from NPU1 docs */
11+
#define MPNPU_PWAITMODE 0x3010034
1112
#define MPNPU_PUB_SEC_INTR 0x3010090
1213
#define MPNPU_PUB_PWRMGMT_INTR 0x3010094
1314
#define MPNPU_PUB_SCRATCH2 0x30100A0
@@ -89,6 +90,7 @@ const struct amdxdna_dev_priv npu1_dev_priv = {
8990
DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU1_PSP, MPNPU_PUB_SEC_INTR),
9091
DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU1_PSP, MPNPU_PUB_SCRATCH2),
9192
DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU1_PSP, MPNPU_PUB_SCRATCH3),
93+
DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU1_PSP, MPNPU_PWAITMODE),
9294
},
9395
.smu_regs_off = {
9496
DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU1_SMU, MPNPU_PUB_SCRATCH5),

src/driver/amdxdna/npu4_family.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ extern const struct rt_cfg_ver npu4_rt_cfg_tbl[];
1717
extern const struct amdxdna_dev_priv npu4_dev_priv;
1818

1919
/* NPU Public Registers on MpNPUAxiXbar (refer to Diag npu_registers.h) */
20+
#define MPNPU_PWAITMODE 0x301003C
2021
#define MPNPU_PUB_SEC_INTR 0x3010060
2122
#define MPNPU_PUB_PWRMGMT_INTR 0x3010064
2223
#define MPNPU_PUB_SCRATCH0 0x301006C
@@ -83,13 +84,14 @@ extern const struct amdxdna_dev_priv npu4_dev_priv;
8384
DEFINE_BAR_OFFSET(FW_ALIVE_OFF, NPU4_SRAM, MPNPU_SRAM_X2I_MAILBOX_15), \
8485
}, \
8586
.psp_regs_off = { \
86-
DEFINE_BAR_OFFSET(PSP_CMD_REG, NPU4_PSP, MP0_C2PMSG_123), \
87-
DEFINE_BAR_OFFSET(PSP_ARG0_REG, NPU4_REG, MPNPU_PUB_SCRATCH3), \
88-
DEFINE_BAR_OFFSET(PSP_ARG1_REG, NPU4_REG, MPNPU_PUB_SCRATCH4), \
89-
DEFINE_BAR_OFFSET(PSP_ARG2_REG, NPU4_REG, MPNPU_PUB_SCRATCH9), \
90-
DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU4_PSP, MP0_C2PMSG_73), \
91-
DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU4_PSP, MP0_C2PMSG_123), \
92-
DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU4_REG, MPNPU_PUB_SCRATCH3), \
87+
DEFINE_BAR_OFFSET(PSP_CMD_REG, NPU4_PSP, MP0_C2PMSG_123), \
88+
DEFINE_BAR_OFFSET(PSP_ARG0_REG, NPU4_REG, MPNPU_PUB_SCRATCH3), \
89+
DEFINE_BAR_OFFSET(PSP_ARG1_REG, NPU4_REG, MPNPU_PUB_SCRATCH4), \
90+
DEFINE_BAR_OFFSET(PSP_ARG2_REG, NPU4_REG, MPNPU_PUB_SCRATCH9), \
91+
DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU4_PSP, MP0_C2PMSG_73), \
92+
DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU4_PSP, MP0_C2PMSG_123), \
93+
DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU4_REG, MPNPU_PUB_SCRATCH3), \
94+
DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU4_REG, MPNPU_PWAITMODE), \
9395
}, \
9496
.smu_regs_off = { \
9597
DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU4_SMU, MP1_C2PMSG_0), \

0 commit comments

Comments
 (0)