From: Lizhi Hou <lizhi.hou@amd.com>
To: David Zhang <yidong.zhang@amd.com>, <quic_jhugo@quicinc.com>,
<karol.wachowski@linux.intel.com>, <max.zhen@amd.com>,
<ogabbay@kernel.org>, <dri-devel@lists.freedesktop.org>,
<linux-kernel@vger.kernel.org>
Cc: <sonal.santan@amd.com>, <mario.limonciello@amd.com>
Subject: Re: [PATCH V4 18/19] accel/amdxdna: Implement AIE4 suspend and resume
Date: Wed, 14 Oct 2026 11:28:04 -0700 [thread overview]
Message-ID: <4054232d-41aa-8e7b-b55f-c550a072c66f@amd.com> (raw)
In-Reply-To: <20261009225343.3079074-19-yidong.zhang@amd.com>
On 10/9/26 15:53, David Zhang wrote:
> Implement suspend and resume callbacks for AIE4 Physical Function (PF),
> Virtual Function (VF), and Classic device types:
> - Implement aie4_hwctx_suspend_all() to destroy or drain contexts across
> all registered clients and wait for in-flight jobs.
> - Implement aie4_hwctx_resume_all() to recreate firmware contexts and
> kick doorbells via aie4_hwctx_resume_jobs() to resume hardware queue
> consumption.
> - Guard firmware destroy message in aie4_hwctx_destroy() when context
> ID is invalid.
> - Restore SR-IOV virtual functions on PF resume via aie4_restore_sriov().
> - Link each VF to the PF with a stateless device link when SR-IOV is
> enabled, so system suspend handles VFs before the PF and resume
> handles the PF before VFs. The link survives VF driver rebind and is
> removed before SR-IOV is disabled.
>
> Signed-off-by: David Zhang <yidong.zhang@amd.com>
> ---
> drivers/accel/amdxdna/aie4_ctx.c | 18 +-
> drivers/accel/amdxdna/aie4_pci.c | 251 ++++++++++++++++++++++++
> drivers/accel/amdxdna/aie4_pci.h | 11 ++
> drivers/accel/amdxdna/aie4_sriov.c | 66 ++++++-
> drivers/accel/amdxdna/amdxdna_pci_drv.h | 3 +
> 5 files changed, 347 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/accel/amdxdna/aie4_ctx.c b/drivers/accel/amdxdna/aie4_ctx.c
> index 43d26454be6c..a2b6b0fa2934 100644
> --- a/drivers/accel/amdxdna/aie4_ctx.c
> +++ b/drivers/accel/amdxdna/aie4_ctx.c
> @@ -255,7 +255,7 @@ void aie4_hwctx_destroy(struct amdxdna_hwctx *hwctx, enum aie4_hwctx_flags flags
> if (has_error)
> wake_up_all(&priv->job_list_wq);
>
> - if (flags != AIE4_HWCTX_DISCONNECT)
> + if (flags != AIE4_HWCTX_DISCONNECT && priv->hw_ctx_id != CTX_INVALID_ID)
> aie4_msg_destroy_context(ndev, priv->hw_ctx_id);
>
> if (cert_comp)
> @@ -363,6 +363,7 @@ int aie4_hwctx_init(struct amdxdna_hwctx *hwctx)
> return -ENOMEM;
> hwctx->priv = priv;
> priv->hwctx = hwctx;
> + priv->hw_ctx_id = CTX_INVALID_ID;
>
> /* Initialize io_lock guarding cert_comp binding. */
> mutex_init(&priv->io_lock);
> @@ -951,6 +952,21 @@ int aie4_hwctx_wait_for_running(struct amdxdna_hwctx *hwctx)
> return ret;
> }
>
> +void aie4_hwctx_resume_jobs(struct amdxdna_hwctx *hwctx)
> +{
> + struct amdxdna_hwctx_priv *priv = hwctx->priv;
> +
> + mutex_lock(&priv->io_lock);
> + if (list_empty(&priv->running_job_list)) {
> + mutex_unlock(&priv->io_lock);
> + return;
> + }
> + aie4_doorbell_ring(hwctx);
> + mutex_unlock(&priv->io_lock);
> +
> + queue_work(priv->job_work_q, &priv->job_work);
> +}
> +
> static void put_cmd_bos(struct amdxdna_sched_job *job)
> {
> u32 i;
> diff --git a/drivers/accel/amdxdna/aie4_pci.c b/drivers/accel/amdxdna/aie4_pci.c
> index e09d24d85cdf..70a052ab5f77 100644
> --- a/drivers/accel/amdxdna/aie4_pci.c
> +++ b/drivers/accel/amdxdna/aie4_pci.c
> @@ -1126,11 +1126,258 @@ static void aie4_debugfs_init(struct amdxdna_dev *xdna)
> &aie4_ctx_hysteresis_fops);
> }
>
> +void aie4_hwctx_suspend_all(struct amdxdna_dev_hdl *ndev, int clean_jobs)
> +{
> + struct amdxdna_dev *xdna = ndev->aie.xdna;
> + struct amdxdna_client *client;
> + struct amdxdna_hwctx *hwctx;
> + unsigned long hwctx_id;
> + int idx;
> +
> + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
> +
> + amdxdna_for_each_client(xdna, client) {
> + idx = srcu_read_lock(&client->hwctx_srcu);
> + amdxdna_for_each_hwctx(client, hwctx_id, hwctx) {
> + /* clean up workers and drain running jobs */
> + if (clean_jobs) {
> + int ret;
> +
> + aie4_hwctx_destroy(hwctx, AIE4_HWCTX_ERROR);
> + ret = aie4_hwctx_wait_for_running(hwctx);
> + if (ret)
> + XDNA_WARN(xdna, "hwctx %s wait for running failed %d",
> + hwctx->name, ret);
> + } else {
> + aie4_hwctx_destroy(hwctx, AIE4_HWCTX_NORMAL);
> + }
> + }
> + srcu_read_unlock(&client->hwctx_srcu, idx);
> + }
> +
> + XDNA_DBG(xdna, "Finished hwctx suspend");
> +}
> +
> +int aie4_hwctx_resume_all(struct amdxdna_dev_hdl *ndev)
> +{
> + struct amdxdna_dev *xdna = ndev->aie.xdna;
> + struct amdxdna_client *client;
> + struct amdxdna_hwctx *hwctx;
> + unsigned long hwctx_id;
> + int ret, idx;
> +
> + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
> +
> + amdxdna_for_each_client(xdna, client) {
> + idx = srcu_read_lock(&client->hwctx_srcu);
> + amdxdna_for_each_hwctx(client, hwctx_id, hwctx) {
> + ret = aie4_hwctx_create(hwctx);
> + if (ret)
> + goto error;
> + aie4_hwctx_resume_jobs(hwctx);
> + }
> + srcu_read_unlock(&client->hwctx_srcu, idx);
> + }
> +
> + XDNA_DBG(xdna, "Finished hwctx resume");
> + return 0;
> +error:
> + srcu_read_unlock(&client->hwctx_srcu, idx);
> + XDNA_DBG(xdna, "Failed hwctx resume");
> + return ret;
> +}
> +
> +static int aie4_restore_sriov(struct amdxdna_dev_hdl *ndev)
> +{
> + struct amdxdna_dev *xdna = ndev->aie.xdna;
> + struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
> + int ret;
> +
> + if (ndev->num_vfs) {
> + if (pci_num_vf(pdev) != ndev->num_vfs) {
> + XDNA_ERR(xdna, "inconsistent vf number");
> + return -EINVAL;
> + }
> + ret = aie4_create_vfs(ndev, ndev->num_vfs);
> + if (ret) {
> + XDNA_ERR(xdna, "create vfs failed, %d", ret);
> + return ret;
> + }
> + XDNA_DBG(xdna, "restored num_vfs %d", ndev->num_vfs);
> + }
> +
> + return 0;
> +}
> +
> +static int aie4_pf_suspend(struct amdxdna_dev *xdna)
> +{
> + struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
> + struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
> +
> + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
> + aie4_pf_hw_stop(ndev);
> + pci_disable_device(pdev);
> +
> + XDNA_DBG(xdna, "pf suspend done");
> + return 0;
> +}
> +
> +static int aie4_pf_resume(struct amdxdna_dev *xdna)
> +{
> + struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
> + struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
> + int ret;
> +
> + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
> +
> + ret = pci_enable_device(pdev);
> + if (ret) {
> + XDNA_ERR(xdna, "enable pci device failed %d", ret);
> + return ret;
> + }
> + pci_set_master(pdev);
> +
> + ret = aie4_pf_hw_start(ndev);
> + if (ret) {
> + XDNA_ERR(xdna, "hw_start failed %d", ret);
> + goto pci_disable;
> + }
> +
> + ret = aie4_restore_sriov(ndev);
> + if (ret)
> + goto hw_stop;
> +
> + XDNA_DBG(xdna, "pf resume done");
> + return 0;
> +hw_stop:
> + aie4_pf_hw_stop(ndev);
> +pci_disable:
> + pci_disable_device(pdev);
> + return ret;
> +}
> +
> +static int aie4_vf_suspend(struct amdxdna_dev *xdna)
> +{
> + struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
> + struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
> +
> + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
> + aie4_hwctx_suspend_all(ndev, false);
> + /*
> + * partition_fini and mailbox messages should not be called here
> + * because PF suspend will do the cleanup for all VFs.
> + */
> + aie4_mailbox_fini(ndev);
> + pci_disable_device(pdev);
> +
> + XDNA_DBG(xdna, "vf suspend done");
> + return 0;
> +}
> +
> +static int aie4_vf_resume(struct amdxdna_dev *xdna)
> +{
> + struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
> + struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
> + int ret;
> +
> + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
> +
> + ret = pci_enable_device(pdev);
> + if (ret) {
> + XDNA_ERR(xdna, "enable pci device failed %d", ret);
> + /* Contexts cannot reconnect; fail waiters and abort running jobs. */
> + aie4_hwctx_suspend_all(ndev, true);
> + return ret;
> + }
> + pci_set_master(pdev);
> +
> + ret = aie4_vf_hw_start(ndev);
> + if (ret) {
> + XDNA_ERR(xdna, "hw_start failed %d", ret);
> + /* Contexts cannot reconnect; fail waiters and abort running jobs. */
> + aie4_hwctx_suspend_all(ndev, true);
> + goto pci_disable;
> + }
> +
> + ret = aie4_hwctx_resume_all(ndev);
> + if (ret) {
> + XDNA_ERR(xdna, "hwctx_resume failed %d", ret);
> + goto hw_clear;
> + }
> +
> + XDNA_DBG(xdna, "vf resume done");
> + return 0;
> +
> +hw_clear:
> + aie4_hwctx_suspend_all(ndev, true);
> + aie4_vf_hw_stop(ndev);
> +pci_disable:
> + pci_disable_device(pdev);
> + return ret;
> +}
> +
> +static int aie4_classic_suspend(struct amdxdna_dev *xdna)
> +{
> + struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
> + struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
> +
> + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
> + aie4_hwctx_suspend_all(ndev, false);
> + aie4_classic_hw_stop(ndev);
> + pci_disable_device(pdev);
> +
> + XDNA_DBG(xdna, "classic suspend done");
> + return 0;
> +}
> +
> +static int aie4_classic_resume(struct amdxdna_dev *xdna)
> +{
> + struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
> + struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
> + int ret;
> +
> + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
> +
> + ret = pci_enable_device(pdev);
> + if (ret) {
> + XDNA_ERR(xdna, "enable pci device failed %d", ret);
> + /* Contexts cannot reconnect; fail waiters and abort running jobs. */
> + aie4_hwctx_suspend_all(ndev, true);
> + return ret;
> + }
> + pci_set_master(pdev);
> +
> + ret = aie4_classic_hw_start(ndev);
> + if (ret) {
> + XDNA_ERR(xdna, "hw_start failed %d", ret);
> + /* Contexts cannot reconnect; fail waiters and abort running jobs. */
> + aie4_hwctx_suspend_all(ndev, true);
> + goto pci_disable;
> + }
> +
> + ret = aie4_hwctx_resume_all(ndev);
> + if (ret) {
> + XDNA_ERR(xdna, "hwctx_resume failed %d", ret);
> + goto hw_clear;
> + }
> +
> + XDNA_DBG(xdna, "classic resume done");
> + return 0;
> +hw_clear:
> + aie4_hwctx_suspend_all(ndev, true);
> + aie4_classic_hw_stop(ndev);
> +pci_disable:
> + pci_disable_device(pdev);
> + return ret;
> +}
> +
> const struct amdxdna_dev_ops aie4_pf_ops = {
> .init = aie4_pf_init,
> .fini = aie4_pf_fini,
> .debugfs_init = aie4_debugfs_init,
> .sriov_configure = aie4_sriov_configure,
> + .resume = pm_ptr(aie4_pf_resume),
> + .suspend = pm_ptr(aie4_pf_suspend),
> };
>
> const struct amdxdna_dev_ops aie4_vf_ops = {
> @@ -1144,6 +1391,8 @@ const struct amdxdna_dev_ops aie4_vf_ops = {
> .cmd_wait = aie4_cmd_wait,
> .get_aie_info = aie4_get_info,
> .set_aie_state = aie4_set_state,
> + .resume = pm_ptr(aie4_vf_resume),
> + .suspend = pm_ptr(aie4_vf_suspend),
> };
>
> const struct amdxdna_dev_ops aie4_classic_ops = {
> @@ -1157,4 +1406,6 @@ const struct amdxdna_dev_ops aie4_classic_ops = {
> .cmd_wait = aie4_cmd_wait,
> .get_aie_info = aie4_get_info,
> .set_aie_state = aie4_set_state,
> + .resume = pm_ptr(aie4_classic_resume),
> + .suspend = pm_ptr(aie4_classic_suspend),
> };
> diff --git a/drivers/accel/amdxdna/aie4_pci.h b/drivers/accel/amdxdna/aie4_pci.h
> index 4b7367af7cf1..fdc55e498246 100644
> --- a/drivers/accel/amdxdna/aie4_pci.h
> +++ b/drivers/accel/amdxdna/aie4_pci.h
> @@ -95,6 +95,7 @@ struct amdxdna_dev_hdl {
> u32 total_col;
> u32 max_aieclk_level;
> u32 max_npuhclk_level;
> + u32 num_vfs;
>
> struct dpm_clk_freq dpm_clk_tbl[AIE4_MAX_DPM_LEVEL_COUNT];
>
> @@ -159,8 +160,11 @@ int aie4_cmd_submit(struct amdxdna_hwctx *hwctx, struct amdxdna_sched_job *job,
> int aie4_hwctx_create(struct amdxdna_hwctx *hwctx);
> void aie4_hwctx_destroy(struct amdxdna_hwctx *hwctx, enum aie4_hwctx_flags);
> int aie4_hwctx_wait_for_running(struct amdxdna_hwctx *hwctx);
> +void aie4_hwctx_resume_jobs(struct amdxdna_hwctx *hwctx);
>
> /* aie4_pci.c */
> +void aie4_hwctx_suspend_all(struct amdxdna_dev_hdl *ndev, int clean_jobs);
> +int aie4_hwctx_resume_all(struct amdxdna_dev_hdl *ndev);
> int aie4_restore_power_mode(struct amdxdna_dev_hdl *ndev);
>
> /*
> @@ -176,10 +180,17 @@ void aie4_free_notification(struct cert_comp *comp);
>
> /* aie4_sriov.c */
> #if IS_ENABLED(CONFIG_PCI_IOV)
> +int aie4_create_vfs(struct amdxdna_dev_hdl *ndev, int num_vfs);
> int aie4_sriov_configure(struct amdxdna_dev *xdna, int num_vfs);
> int aie4_sriov_stop(struct amdxdna_dev_hdl *ndev);
> #else
> +static inline int aie4_create_vfs(struct amdxdna_dev_hdl *ndev, int num_vfs)
> +{
> + return 0;
> +}
> +
> #define aie4_sriov_configure NULL
> +
> static inline int aie4_sriov_stop(struct amdxdna_dev_hdl *ndev)
> {
> return 0;
> diff --git a/drivers/accel/amdxdna/aie4_sriov.c b/drivers/accel/amdxdna/aie4_sriov.c
> index e1ce633768a5..d3df36644914 100644
> --- a/drivers/accel/amdxdna/aie4_sriov.c
> +++ b/drivers/accel/amdxdna/aie4_sriov.c
> @@ -26,7 +26,7 @@ static int aie4_destroy_vfs(struct amdxdna_dev_hdl *ndev)
> return ret;
> }
>
> -static int aie4_create_vfs(struct amdxdna_dev_hdl *ndev, int num_vfs)
> +int aie4_create_vfs(struct amdxdna_dev_hdl *ndev, int num_vfs)
> {
> DECLARE_AIE_MSG(aie4_msg_create_vfs, AIE4_MSG_OP_CREATE_VFS);
> int ret;
> @@ -39,6 +39,59 @@ static int aie4_create_vfs(struct amdxdna_dev_hdl *ndev, int num_vfs)
> return ret;
> }
>
> +static int aie4_for_each_vfs(struct amdxdna_dev *xdna,
> + int (*cb)(struct amdxdna_dev *, struct pci_dev *))
> +{
> + struct pci_dev *pdev_pf = to_pci_dev(xdna->ddev.dev);
> + struct pci_dev *pdev_vf;
> + int pos, ret;
> + u16 vf_did;
> +
> + pos = pci_find_ext_capability(pdev_pf, PCI_EXT_CAP_ID_SRIOV);
> + if (!pos)
> + return 0;
> + ret = pci_read_config_word(pdev_pf, pos + PCI_SRIOV_VF_DID, &vf_did);
> + if (ret) {
> + XDNA_ERR(xdna, "read VF Device ID failed %d", ret);
> + return -ENODEV;
> + }
> +
> + for (pdev_vf = pci_get_device(pdev_pf->vendor, vf_did, NULL);
> + pdev_vf;
> + pdev_vf = pci_get_device(pdev_pf->vendor, vf_did, pdev_vf)) {
> + if (!pdev_vf->is_virtfn || pdev_vf->physfn != pdev_pf)
> + continue;
> +
> + ret = cb(xdna, pdev_vf);
> + if (ret) {
> + /* Release reference on early return. */
> + pci_dev_put(pdev_vf);
> + return ret;
> + }
> + }
> +
> + return 0;
> +}
> +
> +static int aie4_link_vf(struct amdxdna_dev *xdna, struct pci_dev *pdev_vf)
> +{
> + struct pci_dev *pdev_pf = to_pci_dev(xdna->ddev.dev);
> +
> + /* Stateless so the link survives VF driver rebind. */
> + if (!device_link_add(&pdev_vf->dev, &pdev_pf->dev, DL_FLAG_STATELESS)) {
> + XDNA_ERR(xdna, "Failed to link VF %s", pci_name(pdev_vf));
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static int aie4_unlink_vf(struct amdxdna_dev *xdna, struct pci_dev *pdev_vf)
> +{
> + device_link_remove(&pdev_vf->dev, xdna->ddev.dev);
> + return 0;
> +}
> +
> int aie4_sriov_stop(struct amdxdna_dev_hdl *ndev)
> {
> struct amdxdna_dev *xdna = ndev->aie.xdna;
> @@ -54,7 +107,9 @@ int aie4_sriov_stop(struct amdxdna_dev_hdl *ndev)
> return -EPERM;
> }
>
> + aie4_for_each_vfs(xdna, aie4_unlink_vf);
> pci_disable_sriov(pdev);
> + ndev->num_vfs = 0;
> return aie4_destroy_vfs(ndev);
> }
>
> @@ -75,6 +130,15 @@ static int aie4_sriov_start(struct amdxdna_dev_hdl *ndev, int num_vfs)
> return ret;
> }
>
> + ret = aie4_for_each_vfs(xdna, aie4_link_vf);
> + if (ret) {
> + aie4_for_each_vfs(xdna, aie4_unlink_vf);
> + pci_disable_sriov(pdev);
> + aie4_destroy_vfs(ndev);
> + return ret;
> + }
> +
> + ndev->num_vfs = num_vfs;
> return num_vfs;
> }
>
> diff --git a/drivers/accel/amdxdna/amdxdna_pci_drv.h b/drivers/accel/amdxdna/amdxdna_pci_drv.h
> index eccb461d32bc..505477b4a292 100644
> --- a/drivers/accel/amdxdna/amdxdna_pci_drv.h
> +++ b/drivers/accel/amdxdna/amdxdna_pci_drv.h
> @@ -168,6 +168,9 @@ struct amdxdna_client {
> #define amdxdna_for_each_hwctx(client, hwctx_id, entry) \
> xa_for_each(&(client)->hwctx_xa, hwctx_id, entry)
>
> +#define amdxdna_for_each_client(xdna, client) \
> + list_for_each_entry(client, &(xdna)->client_list, node)
> +
Reviewed-by: Lizhi Hou <lizhi.hou@amd.com>
> /* Add device info below */
> extern const struct amdxdna_dev_info dev_npu1_info;
> extern const struct amdxdna_dev_info dev_npu3_classic_info;
next prev parent reply other threads:[~2026-10-14 18:28 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-09 22:53 [PATCH V4 00/19] accel/amdxdna: Kernel submission and PM for AIE4 David Zhang
2026-10-09 22:53 ` [PATCH V4 01/19] accel/amdxdna: Rename NPU3 firmware files David Zhang
2026-10-09 22:53 ` [PATCH V4 02/19] accel/amdxdna: Remove mmap for doorbell David Zhang
2026-10-12 20:37 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 03/19] accel/amdxdna: Add CERT firmware version support David Zhang
2026-10-12 20:39 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 04/19] accel/amdxdna: Support firmware 6.0 David Zhang
2026-10-12 20:41 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 05/19] accel/amdxdna: Add NPU3 classic device support David Zhang
2026-10-12 20:41 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 06/19] accel/amdxdna: Add AIE version query to aie4_get_info David Zhang
2026-10-12 20:55 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 07/19] accel/amdxdna: Add get and set power_mode for AIE4 David Zhang
2026-10-12 21:29 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 08/19] accel/amdxdna: Add clock, DPM frequency, and resource info queries " David Zhang
2026-10-12 22:58 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 09/19] accel/amdxdna: Add context switch hysteresis with debugfs control David Zhang
2026-10-13 18:29 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 10/19] accel/amdxdna: Refactor AIE4 hardware initialization sequence David Zhang
2026-10-13 18:33 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 11/19] accel/amdxdna: Decouple AIE4 doorbell and MSI-X notify transport hooks David Zhang
2026-10-13 18:38 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 12/19] accel/amdxdna: Implement AIE4 kernel queue lifecycle and memory layout David Zhang
2026-10-13 18:41 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 13/19] accel/amdxdna: Prepare for AIE4 command submission David Zhang
2026-10-13 18:42 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 14/19] accel/amdxdna: Move HMM invalidate wait into common GEM code David Zhang
2026-10-13 18:45 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 15/19] accel/amdxdna: Make populate_range common for AIE2 and AIE4 David Zhang
2026-10-14 18:10 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 16/19] accel/amdxdna: Implement AIE4 command packet building and submission David Zhang
2026-10-14 18:15 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 17/19] accel/amdxdna: Enable AIE4 firmware logging to DRAM David Zhang
2026-10-14 18:24 ` Lizhi Hou
2026-10-09 22:53 ` [PATCH V4 18/19] accel/amdxdna: Implement AIE4 suspend and resume David Zhang
2026-10-14 18:28 ` Lizhi Hou [this message]
2026-10-09 22:53 ` [PATCH V4 19/19] accel/amdxdna: Implement runtime suspend and resume support David Zhang
2026-10-14 18:36 ` Lizhi Hou
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4054232d-41aa-8e7b-b55f-c550a072c66f@amd.com \
--to=lizhi.hou@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=karol.wachowski@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mario.limonciello@amd.com \
--cc=max.zhen@amd.com \
--cc=ogabbay@kernel.org \
--cc=quic_jhugo@quicinc.com \
--cc=sonal.santan@amd.com \
--cc=yidong.zhang@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®