From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E39DB2C0F97 for ; Tue, 2 Dec 2025 17:29:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.9 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764696554; cv=none; b=Re+aMorwd/ewahbTkLIgjvS05P7iLtIOmLqaoxXm/IlIMDCHi7ABXNdriCbh/7mMhF6PcDXOP3BeURCXqrSUiOQEGEyTk9+RBdmQqyhGyAYWHYexDdkkK3B18KYcMKxqYsJpFjcJ2dHSKOea7KO0c7GnnaYmdUMr5iMJ3xjfh0Q= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764696554; c=relaxed/simple; bh=dHkUNEPsu65MQ/19CjwiBxWsGKxZBgy2yfAHQ/Kismw=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=aTrAhpuOeGTBG20cauYhCUJmt48v3IiM2xZIJAS3zZS0SQ4k3EoVXYix9D1GEBHoT+0vP/hzVpE8IsrwmIUZsS0QJNdmPk4VVJ9Owwlxk3gBnMyjxLR/GCUxR5+ybuo04/Tjx+r4w6MCK3rxcjeKiAgeRlhT49VTB/Sb6JhFOhw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=C9ZnbuQD; arc=none smtp.client-ip=198.175.65.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="C9ZnbuQD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1764696552; x=1796232552; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=dHkUNEPsu65MQ/19CjwiBxWsGKxZBgy2yfAHQ/Kismw=; b=C9ZnbuQDaS+XNYaMJ9x7Uc0hRY+3TCW4q5+mPq4vTxoQnXjRctEQ/Wpv tXb5PXmXcI4Bf7k3XKNn27xc/ghIXdUpcfrHBemUgHRXO2NOV9RQ7z3tE ApDOFFhlzUxIytOKFPcEHg23bfDT5/egnIioYElPt4YeXlCG3jiNfOEXL Dn+jPIRFYkee3QgiOROvPu1Hgrf3AopJ1n8gymniFWmUzv1/zVLIvDCCL Mfg/N4xbf86NJk1G/mTqoUiv9mJ26pkltIeKE8vYo7psgHCykbsamo/j2 x4uZjap0HQfHZ5/LMS5OziIURMv4Bak6eFRbexdGL1FGvXLb815r+i2hz A==; X-CSE-ConnectionGUID: 8mLvfEwPRWCAkmuDRiSNFQ== X-CSE-MsgGUID: webfFEJiTM+xr7JG4nIssQ== X-IronPort-AV: E=McAfee;i="6800,10657,11630"; a="89326387" X-IronPort-AV: E=Sophos;i="6.20,243,1758610800"; d="scan'208";a="89326387" Received: from fmviesa001.fm.intel.com ([10.60.135.141]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Dec 2025 09:29:12 -0800 X-CSE-ConnectionGUID: 0CXNFHskS2eKzotpUaC4KQ== X-CSE-MsgGUID: ED+BGBTQTvW9O6ryf0TL1Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.20,243,1758610800"; d="scan'208";a="225389897" Received: from mfalkows-mobl.ger.corp.intel.com (HELO [10.94.253.247]) ([10.94.253.247]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Dec 2025 09:29:08 -0800 Message-ID: Date: Tue, 2 Dec 2025 18:29:06 +0100 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH V2] accel/amdxdna: Poll MPNPU_PWAITMODE after requesting firmware suspend To: Lizhi Hou , ogabbay@kernel.org, quic_jhugo@quicinc.com, dri-devel@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org, max.zhen@amd.com, sonal.santan@amd.com, mario.limonciello@amd.com References: <20251202165427.507414-1-lizhi.hou@amd.com> Content-Language: en-US From: "Falkowski, Maciej" In-Reply-To: <20251202165427.507414-1-lizhi.hou@amd.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Reviewed-by: Maciej Falkowski On 12/2/2025 5:54 PM, Lizhi Hou wrote: > After issuing a firmware suspend request, the driver must ensure that the > suspend operation has completed before proceeding. Add polling of the > MPNPU_PWAITMODE register to confirm that the firmware has fully entered > the suspended state. This prevents race conditions where subsequent > operations assume the firmware is idle before it has actually completed > its suspend sequence. > > Signed-off-by: Lizhi Hou > --- > drivers/accel/amdxdna/aie2_message.c | 9 ++++++++- > drivers/accel/amdxdna/aie2_pci.h | 2 ++ > drivers/accel/amdxdna/aie2_psp.c | 15 +++++++++++++++ > drivers/accel/amdxdna/npu1_regs.c | 2 ++ > drivers/accel/amdxdna/npu2_regs.c | 2 ++ > drivers/accel/amdxdna/npu4_regs.c | 2 ++ > drivers/accel/amdxdna/npu5_regs.c | 2 ++ > drivers/accel/amdxdna/npu6_regs.c | 2 ++ > 8 files changed, 35 insertions(+), 1 deletion(-) > > diff --git a/drivers/accel/amdxdna/aie2_message.c b/drivers/accel/amdxdna/aie2_message.c > index d493bb1c3360..fee3b0627aba 100644 > --- a/drivers/accel/amdxdna/aie2_message.c > +++ b/drivers/accel/amdxdna/aie2_message.c > @@ -59,8 +59,15 @@ static int aie2_send_mgmt_msg_wait(struct amdxdna_dev_hdl *ndev, > int aie2_suspend_fw(struct amdxdna_dev_hdl *ndev) > { > DECLARE_AIE2_MSG(suspend, MSG_OP_SUSPEND); > + int ret; > > - return aie2_send_mgmt_msg_wait(ndev, &msg); > + ret = aie2_send_mgmt_msg_wait(ndev, &msg); > + if (ret) { > + XDNA_ERR(ndev->xdna, "Failed to suspend fw, ret %d", ret); > + return ret; > + } > + > + return aie2_psp_waitmode_poll(ndev->psp_hdl); > } > > int aie2_resume_fw(struct amdxdna_dev_hdl *ndev) > diff --git a/drivers/accel/amdxdna/aie2_pci.h b/drivers/accel/amdxdna/aie2_pci.h > index a5f9c42155d1..cc9f933f80b2 100644 > --- a/drivers/accel/amdxdna/aie2_pci.h > +++ b/drivers/accel/amdxdna/aie2_pci.h > @@ -70,6 +70,7 @@ enum psp_reg_idx { > PSP_INTR_REG = PSP_NUM_IN_REGS, > PSP_STATUS_REG, > PSP_RESP_REG, > + PSP_PWAITMODE_REG, > PSP_MAX_REGS /* Keep this at the end */ > }; > > @@ -290,6 +291,7 @@ int aie2_pm_set_mode(struct amdxdna_dev_hdl *ndev, enum amdxdna_power_mode_type > struct psp_device *aie2m_psp_create(struct drm_device *ddev, struct psp_config *conf); > int aie2_psp_start(struct psp_device *psp); > void aie2_psp_stop(struct psp_device *psp); > +int aie2_psp_waitmode_poll(struct psp_device *psp); > > /* aie2_error.c */ > int aie2_error_async_events_alloc(struct amdxdna_dev_hdl *ndev); > diff --git a/drivers/accel/amdxdna/aie2_psp.c b/drivers/accel/amdxdna/aie2_psp.c > index f28a060a8810..3a7130577e3e 100644 > --- a/drivers/accel/amdxdna/aie2_psp.c > +++ b/drivers/accel/amdxdna/aie2_psp.c > @@ -76,6 +76,21 @@ static int psp_exec(struct psp_device *psp, u32 *reg_vals) > return 0; > } > > +int aie2_psp_waitmode_poll(struct psp_device *psp) > +{ > + struct amdxdna_dev *xdna = to_xdna_dev(psp->ddev); > + u32 mode_reg; > + int ret; > + > + ret = readx_poll_timeout(readl, PSP_REG(psp, PSP_PWAITMODE_REG), mode_reg, > + (mode_reg & 0x1) == 1, > + PSP_POLL_INTERVAL, PSP_POLL_TIMEOUT); > + if (ret) > + XDNA_ERR(xdna, "fw waitmode reg error, ret %d", ret); > + > + return ret; > +} > + > void aie2_psp_stop(struct psp_device *psp) > { > u32 reg_vals[PSP_NUM_IN_REGS] = { PSP_RELEASE_TMR, }; > diff --git a/drivers/accel/amdxdna/npu1_regs.c b/drivers/accel/amdxdna/npu1_regs.c > index ec407f3b48fc..ebc6e2802297 100644 > --- a/drivers/accel/amdxdna/npu1_regs.c > +++ b/drivers/accel/amdxdna/npu1_regs.c > @@ -13,6 +13,7 @@ > #include "amdxdna_pci_drv.h" > > /* Address definition from NPU1 docs */ > +#define MPNPU_PWAITMODE 0x3010034 > #define MPNPU_PUB_SEC_INTR 0x3010090 > #define MPNPU_PUB_PWRMGMT_INTR 0x3010094 > #define MPNPU_PUB_SCRATCH2 0x30100A0 > @@ -92,6 +93,7 @@ static const struct amdxdna_dev_priv npu1_dev_priv = { > DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU1_PSP, MPNPU_PUB_SEC_INTR), > DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU1_PSP, MPNPU_PUB_SCRATCH2), > DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU1_PSP, MPNPU_PUB_SCRATCH3), > + DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU1_PSP, MPNPU_PWAITMODE), > }, > .smu_regs_off = { > DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU1_SMU, MPNPU_PUB_SCRATCH5), > diff --git a/drivers/accel/amdxdna/npu2_regs.c b/drivers/accel/amdxdna/npu2_regs.c > index 86f87d0d1354..ad0743fb06d5 100644 > --- a/drivers/accel/amdxdna/npu2_regs.c > +++ b/drivers/accel/amdxdna/npu2_regs.c > @@ -13,6 +13,7 @@ > #include "amdxdna_pci_drv.h" > > /* NPU Public Registers on MpNPUAxiXbar (refer to Diag npu_registers.h) */ > +#define MPNPU_PWAITMODE 0x301003C > #define MPNPU_PUB_SEC_INTR 0x3010060 > #define MPNPU_PUB_PWRMGMT_INTR 0x3010064 > #define MPNPU_PUB_SCRATCH0 0x301006C > @@ -85,6 +86,7 @@ static const struct amdxdna_dev_priv npu2_dev_priv = { > DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU2_PSP, MP0_C2PMSG_73), > DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU2_PSP, MP0_C2PMSG_123), > DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU2_REG, MPNPU_PUB_SCRATCH3), > + DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU2_REG, MPNPU_PWAITMODE), > }, > .smu_regs_off = { > DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU2_SMU, MP1_C2PMSG_0), > diff --git a/drivers/accel/amdxdna/npu4_regs.c b/drivers/accel/amdxdna/npu4_regs.c > index 986a5f28ba24..4ca21db70478 100644 > --- a/drivers/accel/amdxdna/npu4_regs.c > +++ b/drivers/accel/amdxdna/npu4_regs.c > @@ -13,6 +13,7 @@ > #include "amdxdna_pci_drv.h" > > /* NPU Public Registers on MpNPUAxiXbar (refer to Diag npu_registers.h) */ > +#define MPNPU_PWAITMODE 0x301003C > #define MPNPU_PUB_SEC_INTR 0x3010060 > #define MPNPU_PUB_PWRMGMT_INTR 0x3010064 > #define MPNPU_PUB_SCRATCH0 0x301006C > @@ -116,6 +117,7 @@ static const struct amdxdna_dev_priv npu4_dev_priv = { > DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU4_PSP, MP0_C2PMSG_73), > DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU4_PSP, MP0_C2PMSG_123), > DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU4_REG, MPNPU_PUB_SCRATCH3), > + DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU4_REG, MPNPU_PWAITMODE), > }, > .smu_regs_off = { > DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU4_SMU, MP1_C2PMSG_0), > diff --git a/drivers/accel/amdxdna/npu5_regs.c b/drivers/accel/amdxdna/npu5_regs.c > index 75ad97f0b937..131080652ef0 100644 > --- a/drivers/accel/amdxdna/npu5_regs.c > +++ b/drivers/accel/amdxdna/npu5_regs.c > @@ -13,6 +13,7 @@ > #include "amdxdna_pci_drv.h" > > /* NPU Public Registers on MpNPUAxiXbar (refer to Diag npu_registers.h) */ > +#define MPNPU_PWAITMODE 0x301003C > #define MPNPU_PUB_SEC_INTR 0x3010060 > #define MPNPU_PUB_PWRMGMT_INTR 0x3010064 > #define MPNPU_PUB_SCRATCH0 0x301006C > @@ -85,6 +86,7 @@ static const struct amdxdna_dev_priv npu5_dev_priv = { > DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU5_PSP, MP0_C2PMSG_73), > DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU5_PSP, MP0_C2PMSG_123), > DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU5_REG, MPNPU_PUB_SCRATCH3), > + DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU5_REG, MPNPU_PWAITMODE), > }, > .smu_regs_off = { > DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU5_SMU, MP1_C2PMSG_0), > diff --git a/drivers/accel/amdxdna/npu6_regs.c b/drivers/accel/amdxdna/npu6_regs.c > index 758dc013fe13..1f71285655b2 100644 > --- a/drivers/accel/amdxdna/npu6_regs.c > +++ b/drivers/accel/amdxdna/npu6_regs.c > @@ -13,6 +13,7 @@ > #include "amdxdna_pci_drv.h" > > /* NPU Public Registers on MpNPUAxiXbar (refer to Diag npu_registers.h) */ > +#define MPNPU_PWAITMODE 0x301003C > #define MPNPU_PUB_SEC_INTR 0x3010060 > #define MPNPU_PUB_PWRMGMT_INTR 0x3010064 > #define MPNPU_PUB_SCRATCH0 0x301006C > @@ -85,6 +86,7 @@ static const struct amdxdna_dev_priv npu6_dev_priv = { > DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU6_PSP, MP0_C2PMSG_73), > DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU6_PSP, MP0_C2PMSG_123), > DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU6_REG, MPNPU_PUB_SCRATCH3), > + DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU6_REG, MPNPU_PWAITMODE), > }, > .smu_regs_off = { > DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU6_SMU, MP1_C2PMSG_0),